fix(firehose): restore cursor, reconnection backoff, connected flag (#83) master
* fix(firehose): restore cursor, reconnection backoff, connected flag - Read saved cursor from CursorStore on startup and pass as query parameter to TapChannel URL (prevents event loss on restart) - Add exponential backoff reconnection (1s to 60s cap) when channel errors or closes unexpectedly - Defer connected=true until first event is successfully processed (was set prematurely before WebSocket established) - Graceful shutdown cancels pending reconnection timers - Guard against reconnection during shutdown with shuttingDown flag - Construct TapChannel directly to support cursor in WebSocket URL * fix(health): treat firehose startup as healthy in readiness check During startup (before the first event is processed), the firehose has connected=false and lastEventId=null. Treat this as healthy rather than unhealthy, since the service is still initializing. Only report unhealthy when the firehose was previously connected (lastEventId is set) but has since disconnected.