diff --git a/packages/core/src/effect/app-node-platform.ts b/packages/core/src/effect/app-node-platform.ts index 2f0070cfb31..5b5aee62f6c 100644 --- a/packages/core/src/effect/app-node-platform.ts +++ b/packages/core/src/effect/app-node-platform.ts @@ -1,12 +1,26 @@ import { LLMClient, RequestExecutor } from "@opencode/ai/route" +import { Effect, Layer } from "effect" +import { FetchHttpClient, HttpClient } from "effect/http" import { Socket } from "effect/socket" import { makeGlobalNode } from "@opencode/util/effect/app-node" import { httpClient } from "@opencode/util/effect/app-node-platform" import { WebSocketConstructor } from "./websocket-constructor.js" +// Bun's fetch ends a request after five quiet minutes, before provider routes' own header and chunk timeouts. +const withoutBunTimeout = Layer.effect( + HttpClient.HttpClient, + Effect.gen(function* () { + const client = yield* HttpClient.HttpClient + return HttpClient.transformResponse( + client, + Effect.provideService(FetchHttpClient.RequestInit, { timeout: false } as BunFetchRequestInit), + ) + }), +) + export const requestExecutor = makeGlobalNode({ service: RequestExecutor.Service, - layer: RequestExecutor.layer, + layer: RequestExecutor.layer.pipe(Layer.provide(withoutBunTimeout)), deps: [httpClient], })