From 718508c5ac0113670bc7ea1da6a85fcb3d79adf0 Mon Sep 17 00:00:00 2001 From: JJ Lee Date: Fri, 7 Aug 2026 16:05:00 -0400 Subject: [PATCH] fix: resume SSE stream on pageshow regardless of persisted flag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove the event.persisted guard from resumeStreamAfterPageShow so that start() is called on every pageshow event. VS Code webview iframes never fire pageshow with persisted=true (bfcache is a browser-only concept), leaving the SSE stream permanently stopped after a pagehide. start() is idempotent (if (started) return run), so unconditional calls are safe — no risk of duplicate SSE connections. Closes #132 --- packages/app/src/context/server-sdk.test.ts | 15 +++++++++++++-- packages/app/src/context/server-sdk.tsx | 3 +-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/app/src/context/server-sdk.test.ts b/packages/app/src/context/server-sdk.test.ts index 57e1cd86f3..fea5252170 100644 --- a/packages/app/src/context/server-sdk.test.ts +++ b/packages/app/src/context/server-sdk.test.ts @@ -4,14 +4,25 @@ import type { OpenCodeEvent } from "@opencode-ai/client/promise" import type { Event } from "@opencode-ai/sdk/v2/client" describe("resumeStreamAfterPageShow", () => { - test("restarts a stream only after a back-forward cache restore", () => { + test("restarts the stream on pageshow regardless of persisted flag", () => { let starts = 0 const start = () => starts++ resumeStreamAfterPageShow({ persisted: false } as PageTransitionEvent, start) resumeStreamAfterPageShow({ persisted: true } as PageTransitionEvent, start) - expect(starts).toBe(1) + expect(starts).toBe(2) + }) + + test("is safe to call repeatedly (start is idempotent)", () => { + let starts = 0 + const start = () => starts++ + + resumeStreamAfterPageShow({ persisted: false } as PageTransitionEvent, start) + resumeStreamAfterPageShow({ persisted: false } as PageTransitionEvent, start) + resumeStreamAfterPageShow({ persisted: false } as PageTransitionEvent, start) + + expect(starts).toBe(3) }) }) diff --git a/packages/app/src/context/server-sdk.tsx b/packages/app/src/context/server-sdk.tsx index af6d5d1aee..1425a53fdf 100644 --- a/packages/app/src/context/server-sdk.tsx +++ b/packages/app/src/context/server-sdk.tsx @@ -159,8 +159,7 @@ function currentDeltaFragment(event: CurrentDelta) { return event.type === "session.compaction.delta" ? event.data.text : event.data.delta } -export function resumeStreamAfterPageShow(event: PageTransitionEvent, start: () => unknown) { - if (!event.persisted) return +export function resumeStreamAfterPageShow(_event: PageTransitionEvent, start: () => unknown) { start() }