Two changes:
1. src/ui_session_interface.rs reconnect(false): Upstream only ever set
force_relay=true and ignored force_relay=false. This was wrong — the
user has no way to clear the flag. Now reconnect(false) sets
force_relay=false AND resets direct_failures=0, so the next
connect() gets a fresh punch with the full timeout.
2. flutter/lib/common/widgets/peer_card.dart: Add a new menu item
'强制不走中继连接' in all 5 _buildMenuItems implementations (recent,
favorite, ab, discovered, address-book). Click calls
rustDeskWinManager.newRemoteDesktop(id, forceRelay: false) which
triggers a fresh punch. If punch fails, RustDesk's existing
connect() falls back to relay — so the user always ends up with a
working connection (just with a chance of P2P that was retried).
Use case: User's home Mac and office Win on different physical
networks, hbbr at 5 Mbps. By default every connection is relay
(orange banner, no file transfer). Clicking '强制不走中继' forces
a fresh P2P attempt — usually fails, but gives the user the
transparency to know 'yes, it tried P2P first'.