diff --git a/static/messages.js b/static/messages.js index cc3f0202..c69efea4 100644 --- a/static/messages.js +++ b/static/messages.js @@ -4202,6 +4202,9 @@ function stopApprovalPolling() { let _sessionEventSource = null; let _sessionStreamSessionId = null; let _sessionStreamReconnectTimer = null; +// Holds the session id across a hidden-tab close so the visibility handler can +// reopen the per-session SSE on re-show (stopSessionStream nulls _sessionStreamSessionId). +let _sessionStreamHiddenSid = null; function startSessionStream(sid) { if (!sid) return; @@ -4210,13 +4213,19 @@ function startSessionStream(sid) { if (_sessionStreamSessionId === sid && _sessionEventSource) return; stopSessionStream(); _sessionStreamSessionId = sid; - // Visibility hook (install once) — mirror ensureSessionEventsSSE() pattern + // Visibility hook (install once) — mirror ensureSessionEventsSSE() pattern. + // Capture the active session id into a dedicated var BEFORE closing, because + // stopSessionStream() nulls _sessionStreamSessionId — so the reopen path can't + // rely on it (that was the bug: the stream never reopened on tab re-show). if (typeof document !== 'undefined' && !document._hermesSessionStreamVisibilityHook) { document.addEventListener('visibilitychange', () => { if (document.hidden) { + _sessionStreamHiddenSid = _sessionStreamSessionId; stopSessionStream(); - } else if (_sessionStreamSessionId) { - void startSessionStream(_sessionStreamSessionId); + } else if (_sessionStreamHiddenSid) { + const resumeSid = _sessionStreamHiddenSid; + _sessionStreamHiddenSid = null; + void startSessionStream(resumeSid); } }); document._hermesSessionStreamVisibilityHook = true;