Summary
- Implement full draw offer flow: offer, receive via Jetstream, accept/decline, with PDS sync for both players
- Fix waitForOpponent Jetstream bug where creating a game as black triggered premature activation (own creation event matched the callback)
- Fix connectJetstream being unreachable if the PDS write in waitForOpponent threw -- moved connection setup before the write
- Add prominent login prompt for unauthenticated visitors on waiting games
- Hide resign/draw controls until game is active with moves played
- Remove console.log statements from production code
- Profile page now uses GameCard component with proper canonical game links
- Add try-catch to findGameRecordByParent for resilience
- Add explicit result tracking in game store for non-position outcomes (resignation, draw by agreement)