From 44208fcd0946ac6661a551bfc94d6b86350d8b3e Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Wed, 3 Jun 2026 16:11:02 -0500 Subject: [PATCH] fix(openai): disable header timeout for websockets --- packages/opencode/src/plugin/openai/codex.ts | 7 ++++++ packages/opencode/test/plugin/codex.test.ts | 24 ++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/packages/opencode/src/plugin/openai/codex.ts b/packages/opencode/src/plugin/openai/codex.ts index a577e2a82a6..ac8610f36e0 100644 --- a/packages/opencode/src/plugin/openai/codex.ts +++ b/packages/opencode/src/plugin/openai/codex.ts @@ -358,6 +358,13 @@ export async function CodexAuthPlugin(input: PluginInput, options: CodexAuthPlug const websocketFetches: Array> = [] return { + async config(config) { + if (!options.experimentalWebSockets) return + config.provider ??= {} + config.provider.openai ??= {} + config.provider.openai.options ??= {} + config.provider.openai.options.headerTimeout ??= false + }, async dispose() { for (const websocketFetch of websocketFetches) websocketFetch.close() websocketFetches.length = 0 diff --git a/packages/opencode/test/plugin/codex.test.ts b/packages/opencode/test/plugin/codex.test.ts index a375fe4ee10..0db149662a6 100644 --- a/packages/opencode/test/plugin/codex.test.ts +++ b/packages/opencode/test/plugin/codex.test.ts @@ -140,6 +140,30 @@ describe("plugin.codex", () => { await enabled.dispose?.() }) + test("disables the HTTP header timeout when websocket transport is enabled", async () => { + const disabled = await CodexAuthPlugin({} as never) + const hooks = await CodexAuthPlugin({} as never, { experimentalWebSockets: true }) + const disabledConfig = {} as Parameters>[0] + const config = {} as Parameters>[0] + + await disabled.config!(disabledConfig) + await hooks.config!(config) + + expect(disabledConfig.provider).toBeUndefined() + expect(config.provider?.openai?.options?.headerTimeout).toBe(false) + }) + + test("preserves explicit header timeout configuration when websocket transport is enabled", async () => { + const hooks = await CodexAuthPlugin({} as never, { experimentalWebSockets: true }) + const config = { provider: { openai: { options: { headerTimeout: 30_000 } } } } as Parameters< + NonNullable + >[0] + + await hooks.config!(config) + + expect(config.provider.openai.options.headerTimeout).toBe(30_000) + }) + test("deduplicates concurrent Codex token refreshes", async () => { let auth = { type: "oauth" as const,