- Extract connection logic into connectAndAuth() so it can be called
on both initial connect and reconnect
- Add ws.onclose handler: if not an intentional disconnect, clear stale
intervals and retry connectAndAuth() after 5 seconds
- Track sync, heartbeat, and tokenRenewal interval handles so they are
cleared and recreated cleanly on each reconnect
- Reset syncComplete = false on reconnect so the scheduler waits for
a fresh sync before trading
- disconnect() sets intentionalDisconnect = true and clears all intervals
to prevent reconnect loops when a client is removed
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>