From 456eac563d214197603b0b579b8718be9a10cb98 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 25 Aug 2026 09:19:05 +0200 Subject: [PATCH 1/3] fix(provider): catch SSE reader cancel rejection When the chunk-timeout fires, the fetch-body reader is cancelled after the request signal is aborted. Under Bun 1.4 reader.cancel() then rejects, and the voided promise surfaces as an unhandled rejection that fails tests (and can crash strict runtimes). Handle the rejection explicitly. --- packages/core/src/aisdk.ts | 2 +- packages/opencode/src/provider/provider.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/aisdk.ts b/packages/core/src/aisdk.ts index b604dac664b6..a1a973b82197 100644 --- a/packages/core/src/aisdk.ts +++ b/packages/core/src/aisdk.ts @@ -35,7 +35,7 @@ function wrapSSE(res: Response, ms: number, ctl: AbortController) { const id = setTimeout(() => { const err = new Error("SSE read timed out") ctl.abort(err) - void reader.cancel(err) + reader.cancel(err).catch(() => {}) reject(err) }, ms) diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index 32e01512fbea..84174afd90eb 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -46,7 +46,7 @@ function wrapSSE(res: Response, ms: number, ctl: AbortController) { const id = setTimeout(() => { const err = new ProviderError.ResponseStreamError("SSE read timed out") ctl.abort(err) - void reader.cancel(err) + reader.cancel(err).catch(() => {}) reject(err) }, ms) From 70bf2f9261568ba70c154e08ef010e4452f59b2d Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 25 Aug 2026 09:19:05 +0200 Subject: [PATCH 2/3] test(pty): raise exit-poll deadline to 20s The 5s deadline is load-sensitive: under a fully parallel test run the PTY exit event was observed too late and the test failed even though the behaviour under test is correct. --- packages/opencode/test/server/httpapi-v2-pty.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opencode/test/server/httpapi-v2-pty.test.ts b/packages/opencode/test/server/httpapi-v2-pty.test.ts index ef05dfe1eaa1..ea4b02dc8352 100644 --- a/packages/opencode/test/server/httpapi-v2-pty.test.ts +++ b/packages/opencode/test/server/httpapi-v2-pty.test.ts @@ -81,7 +81,7 @@ describe("v2 pty HttpApi", () => { expect(body.data.title).toBe("v2") // The canonical surface keeps exited sessions observable with their exit code. - const deadline = Date.now() + 5_000 + const deadline = Date.now() + 20_000 let info: { status: string; exitCode?: number } | undefined while (Date.now() < deadline) { const found = await request(`/api/pty/${body.data.id}`, tmp.path) From f9c80c048f101d3fc5af270a396948dc78941343 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 25 Aug 2026 10:57:01 +0200 Subject: [PATCH 3/3] chore: bump embedded Bun to 1.4.0 Runtime bump only. Depends on the SSE cancel-rejection and PTY poll deadline fixes on this branch so the suite stays green under 1.4. CI (.github/actions/setup-bun) reads packageManager, so release binaries embed Bun 1.4.0 automatically. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0f11d0c3966a..7d4cd12c20ef 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "AI-powered development tool", "private": true, "type": "module", - "packageManager": "bun@1.3.14", + "packageManager": "bun@1.4.0", "scripts": { "dev": "bun run --cwd packages/opencode --conditions=browser src/index.ts", "dev:desktop": "bun --cwd packages/desktop dev",