The #4151 focus hook reopened both global sidebar streams on `focus` with a bare `startGatewaySSE()`. But `startGatewaySSE()` is NOT idempotent — it begins with an unconditional `stopGatewaySSE()` (sessions.js:3778), which closes the live gateway EventSource, cancels its poll fallback (`stopGatewayPollFallback`), and resets `_gatewayProbeInFlight` / `_gatewaySSEWarningShown`. So on a transient blur shorter than the 1s debounce — where the blur-close timer is cleared on the following focus and the stream was never torn down — the focus handler still dropped and reconnected the gateway on every window-switch, cancelling its fallback and resetting probe/warning state. That is the exact thrash the debounce exists to prevent, in the multi-window PWA scenario this PR targets. (`ensureSessionEventsSSE()` is already idempotent via `if(_sessionEventsSSE) return`, so the session-events stream was unaffected; only the gateway churned. greptile P1.) Guard the reopen on the gateway actually being closed: `if(!_gatewaySSE) startGatewaySSE()`, mirroring the session-events idempotency. A sustained blur (timer fires → both streams closed) still reopens the gateway on focus; a transient blur leaves the still-open gateway untouched. Verified with a blur/focus/timer harness (transient → no teardown/reconnect; sustained → close then reopen; CLI-disabled → stays closed) and a new regression guard `test_focus_reopen_does_not_thrash_the_gateway_stream`. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| vendor | ||
| apple-touch-icon.png | ||
| assistant_turn_anchors.js | ||
| boot.js | ||
| commands.js | ||
| favicon-32.png | ||
| favicon-192.png | ||
| favicon-512.png | ||
| favicon-512.svg | ||
| favicon.ico | ||
| favicon.svg | ||
| i18n.js | ||
| icons.js | ||
| index.html | ||
| login.js | ||
| manifest.json | ||
| messages.js | ||
| onboarding.js | ||
| outline.js | ||
| panels.js | ||
| pwa-startup.js | ||
| sessions.js | ||
| style.css | ||
| sw.js | ||
| terminal.js | ||
| ui.js | ||
| workspace.js | ||