Unit Tests / test (push) Successful in 11s
## Summary - Closes #23 - Add WebSocket reconnect with exponential backoff + jitter (capped attempts), heartbeat keepalives, and reconnect on browser visibility/`online` plus Capacitor `App`/`Network` plugins when present - Refresh JWT before reconnect (coordinates with #22) so conversation refetch after a drop still works - Mid-stream drop recovery: mark interrupted + refetch conversation; surface connecting/reconnecting/disconnected state and disable send while down ## Test plan - [x] Unit tests: `websocketReconnect` helpers + `WebSocketProvider` reconnect/resume/send (`npm run test:ci`) - [ ] Background app ~30s and ~10min, then resume — chat reconnects without reload - [ ] Airplane mode on/off and cellular↔WiFi — reconnect indicator then restored send - [ ] Drop mid-stream response — interrupted banner + conversation refetch - [ ] Confirm nginx/`/ws/` proxy idle timeout stays above heartbeat (25s) or allows ping payloadsReviewed-on: #25