From 423b1cb41b4d4ba9929b44ff235f07b2fc3a4756 Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Wed, 3 Jun 2026 23:03:20 -0500 Subject: [PATCH] fix(openai): narrow timeout fetch contract --- packages/opencode/src/plugin/openai/codex.ts | 4 ++-- packages/opencode/src/plugin/openai/ws-pool.ts | 3 ++- packages/opencode/src/provider/provider.ts | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/opencode/src/plugin/openai/codex.ts b/packages/opencode/src/plugin/openai/codex.ts index 68b87f1f9a2..0ce44ab88a1 100644 --- a/packages/opencode/src/plugin/openai/codex.ts +++ b/packages/opencode/src/plugin/openai/codex.ts @@ -21,7 +21,7 @@ const HEADER_TIMEOUT = Symbol.for("opencode.provider.header-timeout") const ALLOWED_MODELS = new Set(["gpt-5.5", "gpt-5.3-codex-spark", "gpt-5.4", "gpt-5.4-mini"]) export function fetchWithHeaderTimeout( - fetch: typeof globalThis.fetch, + fetch: OpenAIWebSocketPool.Fetch, input: RequestInfo | URL, init: RequestInit | undefined, timeout: number | false, @@ -374,7 +374,7 @@ export async function CodexAuthPlugin(input: PluginInput, options: CodexAuthPlug let httpHeaderTimeout: number | false = DEFAULT_HTTP_HEADER_TIMEOUT let websocketFetchInstalled = false const websocketFetches: Array> = [] - const httpFetch: typeof globalThis.fetch = (requestInput, init) => + const httpFetch: OpenAIWebSocketPool.Fetch = (requestInput, init) => fetchWithHeaderTimeout(fetch, requestInput, init, httpHeaderTimeout) return { diff --git a/packages/opencode/src/plugin/openai/ws-pool.ts b/packages/opencode/src/plugin/openai/ws-pool.ts index 6ece4fc74d9..b9612eed5d0 100644 --- a/packages/opencode/src/plugin/openai/ws-pool.ts +++ b/packages/opencode/src/plugin/openai/ws-pool.ts @@ -5,11 +5,12 @@ import { isRecord } from "@/util/record" import { OpenAIWebSocket } from "./ws" export const TITLE_HEADER = "x-opencode-title" +export type Fetch = (input: RequestInfo | URL, init?: RequestInit) => Promise const log = Log.create({ service: "plugin.openai.ws" }) export interface CreateWebSocketFetchOptions { - httpFetch?: typeof globalThis.fetch + httpFetch?: Fetch url?: string connectTimeout?: number idleTimeout?: number diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index 5acb4c091de..f09a6d10b2b 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -38,7 +38,7 @@ const HEADER_TIMEOUT = Symbol.for("opencode.provider.header-timeout") export function headerTimeoutForFetch(fetch: unknown, timeout: number | false | undefined) { if (timeout === false) return undefined - if (typeof fetch === "function" && fetch[HEADER_TIMEOUT] === false) return undefined + if (typeof fetch === "function" && (fetch as { [HEADER_TIMEOUT]?: false })[HEADER_TIMEOUT] === false) return undefined return timeout }