Skip to content

fix(core): disable Bun's fetch idle timeout for provider requests - #55007

Merged
rekram1-node merged 1 commit into
devfrom
fetch-timeout
Oct 13, 2026
Merged

rekram1-node merged 1 commit into
devfrom
fetch-timeout

Conversation

@rekram1-node

@rekram1-node rekram1-node commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Problem

Native provider routes send requests through Effect's FetchHttpClient, which calls Bun's fetch. Bun closes a connection after 300s with no data unless the request passes timeout: false. Bun only checks about once a minute, so in practice this fires between 5 and 6 minutes.

That limit sits underneath the route transport's own headerTimeout / chunkTimeout / timeout. So raising those above 5 minutes had no effect: Bun closed the connection first. The AI SDK path (packages/core/src/aisdk.ts) and the CLI event stream already pass timeout: false. The native route executor didn't.

Change

Core wires RequestExecutor to an HTTP client that gives each request FetchHttpClient.RequestInit with { timeout: false }. This is the same transformResponse pattern as packages/sdk/src/effect/opencode.ts.

The fix lives in core because the timeout belongs to the runtime core runs on. @opencode/ai itself is unchanged.

This doesn't change any limits on its own. The route's headerTimeout / chunkTimeout defaults (300s) still apply, but they're now the timeouts that actually take effect and can be raised per provider.

Verification

Ran core's requestExecutor node with BUN_CONFIG_HTTP_IDLE_TIMEOUT=2 against a server that pauses for 10s in the middle of the response body:

  • before: Bun cut the body off at 8.0s
  • after: the response completed at 10.0s

bun run check passes.

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This works as described. I ran one request through RequestExecutor.fetchLayer against a local server that takes 12s to answer, with BUN_CONFIG_HTTP_IDLE_TIMEOUT=4. On the base it failed after 8.0s with Transport error; with this change it succeeded after 12.0s. The executor tests pass and packages/ai type-checks cleanly.

The fetch client reads RequestInit from the request fiber's context, so wrapping the client with transformResponse sets timeout: false on both the plain path and the middleware path. A RequestInit from the caller still wins. The new test is small and covers the fixed behaviour.

Public API: unchanged.

No concerns.

Related: #54865

@rekram1-node rekram1-node changed the title fix(ai): disable Bun's fetch idle timeout for provider requests fix(ai): disable Bun and Node fetch timeouts for provider requests Oct 13, 2026
@rekram1-node rekram1-node changed the title fix(ai): disable Bun and Node fetch timeouts for provider requests fix(core): disable Bun's fetch idle timeout for provider requests Oct 13, 2026
@rekram1-node
rekram1-node merged commit 460c626 into dev Oct 13, 2026
6 checks passed
@rekram1-node
rekram1-node deleted the fetch-timeout branch October 13, 2026 04:12
brentyates-swx pushed a commit to swxtchio/swx-opencode-archive that referenced this pull request Nov 4, 2026
brentyates-swx added a commit to swxtchio/swx-opencode-archive that referenced this pull request Nov 6, 2026
* docs: plan transport and lifecycle backport

Implement the assigned transport and lifecycle behavior in existing fork owners.

- Pick each donor in its own -x commit; omit shell-failure UI and absent CLI/MCP payload.
- Disable Bun’s independent fetch deadline only for long network clients and native provider requests; preserve caller signals, domain deadlines, and the #303 watchdog.
- Track detached POSIX groups only while cleanup is owed, preserving #380 escalation and release of intentional descendants; route terminal SIGHUP through the TUI lifecycle.
- Add real-server and child-process regressions with removal proofs, then record donor coverage and focused checks in CHANGESET.md.

* fix(tui): keep long-pending requests past Bun's fetch deadline (anomalyco#55149)

Give the TUI client timeout: false, share the no-timeout fetch helper across run, mini and the TUI via @opencode/util/no-timeout-fetch, and surface existing-session shell failures with a toast and composer restore.

Closes anomalyco#54974

Co-authored-by: Finn763 <finn763@users.noreply.github.com>
(cherry picked from commit 52a10f5)

* fix(core): disable Bun's fetch idle timeout for provider requests (anomalyco#55007)

(cherry picked from commit 460c626)

* fix(util): kill spawned process groups when opencode exits (anomalyco#59411)

(cherry picked from commit e2bc79d)

* fix(core): type Bun fetch timeout overrides

* test(opencode): verify mini attach timeout wiring

Claude-Session: c368ed23-1e31-4f2c-b305-b84f21d79cc5

* test(core): verify abrupt owner process-group cleanup

Claude-Session: c368ed23-1e31-4f2c-b305-b84f21d79cc5

* test(tui): verify SDK long-call fetch policy

Claude-Session: c368ed23-1e31-4f2c-b305-b84f21d79cc5

* fix(tui): preserve nohup SIGHUP behavior

Claude-Session: c368ed23-1e31-4f2c-b305-b84f21d79cc5

* test(core): verify native fetch timeout override

Claude-Session: c368ed23-1e31-4f2c-b305-b84f21d79cc5

* test(core): prove native requests outlive default idle timeout

Claude-Session: c368ed23-1e31-4f2c-b305-b84f21d79cc5

* test(opencode): verify attached runs survive Bun idle timeout

Claude-Session: c368ed23-1e31-4f2c-b305-b84f21d79cc5

* docs: record transport and lifecycle backport

Claude-Session: c368ed23-1e31-4f2c-b305-b84f21d79cc5

* docs: clarify backport regression ownership

Claude-Session: c368ed23-1e31-4f2c-b305-b84f21d79cc5

* test(opencode): allow Bun 1.4.4 server startup window

Claude-Session: c368ed23-1e31-4f2c-b305-b84f21d79cc5

* test: shorten idle-timeout acceptance tests

Run the native and attached held-response witnesses in bounded Bun 1.4.4 child processes with BUN_CONFIG_HTTP_IDLE_TIMEOUT=2 so they stay out of the multi-minute range.

Claude-Session: c368ed23-1e31-4f2c-b305-b84f21d79cc5

* test(tui): prove SDK long calls survive Bun idle expiry

Exercise SDKProvider's external SDK and SSE paths with a held event stream, a real timeout control, and a completed event after the injected short idle expiry.

Claude-Session: c368ed23-1e31-4f2c-b305-b84f21d79cc5

* test(opencode): prove mini attach survives Bun idle expiry

Hold the real mini attach session response in a Bun 1.4.4 child process, observe an unmodified control fetch time out first, then release the expected 404 response.

Claude-Session: c368ed23-1e31-4f2c-b305-b84f21d79cc5

* test(tui): make SIGHUP fixture reports truthful

Keep the nohup fixture scoped to listener policy and process survival, and add a non-TTY non-nohup default-disposition witness while retaining lifecycle assertions only from the real TUI producer.

Claude-Session: c368ed23-1e31-4f2c-b305-b84f21d79cc5

* fix(tui): clean Worker-owned process groups on exit

Acknowledge Worker group ownership and release events, kill and await remaining groups before the shutdown reply, and use the recorded PGID ledger as the bounded TUI-owner backstop when shutdown is unconfirmed.

Claude-Session: c368ed23-1e31-4f2c-b305-b84f21d79cc5

* docs: finalize transport exit review coverage

Record the acknowledged TUI Worker group lifecycle, truthful SIGHUP behavior, and short Bun 1.4.4 behavioral witnesses in the backport ledger.

Claude-Session: c368ed23-1e31-4f2c-b305-b84f21d79cc5

* fix(tui): centralize Worker process-group ownership

* docs: plan transport exit review fixes

1. Make worker and parent ownership ledgers converge on each local acquire, release, and cleanup decision even when acknowledgement is rejected or delayed; validate recorded identities before parent-side signalling.
2. Add rejected/delayed acknowledgement regressions for acquire, release, cleanup announcement, and release/reacquire identity fallback.
3. Harden fixture cleanup and deadlines; add Linux-only guards; correct CHANGESET ownership and SIGHUP claims; remove only test hooks no longer needed.
4. Verify focused changed cases and then each importing test file once under checksum-verified Bun 1.4.4; commit without pushing.

* fix(core): reconcile process-group acknowledgement failures

Reconcile Worker and parent ownership ledgers on local acquire, release, and cleanup facts, independent of rejected or delayed acknowledgements. Validate recorded member identities before signalling and preserve released member identities across reacquisition.

Bound identity-owned process fixture cleanup, gate procfs child fixtures to Linux, retain portable SDK cancellation coverage, and correct the #410 SIGHUP and ownership ledger.

Claude-Session: unknown

* test(opencode): gate shell output on spawn readiness

Wait for the process spawn acknowledgement before the ShellTool first-output deadline and reap the child on readiness failure. Tighten process-group fixture types for package typecheck.

Claude-Session: unknown

* fix(core): restore cross-platform process group cleanup

Claude-Session: unavailable (OpenCode session)

* fix(core): unify process-group ownership decisions

Claude-Session: unavailable (OpenCode session)

* fix(core): publish process-group ownership updates

Claude-Session: unavailable (OpenCode session)

* test(opencode): cover cancellation-overlap ownership

Claude-Session: unavailable (OpenCode session)

* test(core): wait for process-group cleanup

Claude-Session: unavailable (OpenCode session)

* test(opencode): harden process-group test results

Claude-Session: unavailable (OpenCode session)

* test(opencode): validate cancellation result shape

Claude-Session: unavailable (OpenCode session)

* test(opencode): type fixture results as unknown

Claude-Session: unavailable (OpenCode session)

---------

Co-authored-by: Finn763 <165816600+Finn763@users.noreply.github.com>
Co-authored-by: Finn763 <finn763@users.noreply.github.com>
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant