diff --git a/packages/opencode/src/plugin/openai/codex.ts b/packages/opencode/src/plugin/openai/codex.ts index d16b749565..1490755a93 100644 --- a/packages/opencode/src/plugin/openai/codex.ts +++ b/packages/opencode/src/plugin/openai/codex.ts @@ -340,6 +340,10 @@ export async function CodexAuthPlugin(input: PluginInput, options: CodexAuthPlug return { apiKey: OAUTH_DUMMY_KEY, async fetch(requestInput: RequestInfo | URL, init?: RequestInit) { + const currentAuth = await getAuth() + if (currentAuth?.type !== "oauth") + return websocketFetch ? websocketFetch(requestInput, init) : fetch(requestInput, init) + if (init?.headers) { if (init.headers instanceof Headers) { init.headers.delete("authorization") @@ -352,10 +356,6 @@ export async function CodexAuthPlugin(input: PluginInput, options: CodexAuthPlug } } - const currentAuth = await getAuth() - if (currentAuth.type !== "oauth") - return websocketFetch ? websocketFetch(requestInput, init) : fetch(requestInput, init) - const authWithAccount = currentAuth as typeof currentAuth & { accountId?: string } if (!currentAuth.access || currentAuth.expires < Date.now()) { diff --git a/packages/opencode/test/plugin/codex.test.ts b/packages/opencode/test/plugin/codex.test.ts index 1381c4ee8a..2ce9b4e17d 100644 --- a/packages/opencode/test/plugin/codex.test.ts +++ b/packages/opencode/test/plugin/codex.test.ts @@ -149,6 +149,37 @@ describe("plugin.codex", () => { await enabled.dispose?.() }) + test("passes requests through when OAuth auth is removed after loading", async () => { + let auth: + | { + type: "oauth" + refresh: string + access: string + expires: number + } + | undefined = { + type: "oauth", + refresh: "refresh", + access: "access", + expires: Date.now() + 60_000, + } + using server = Bun.serve({ + port: 0, + fetch(request) { + return Response.json({ authorization: request.headers.get("authorization") }) + }, + }) + const hooks = await CodexAuthPlugin({} as never) + const loaded = await hooks.auth!.loader!(async () => auth as never, {} as never) + auth = undefined + + const response = await loaded.fetch!(server.url, { + headers: { authorization: "Bearer current" }, + }) + + expect(await response.json()).toEqual({ authorization: "Bearer current" }) + }) + test("filters unsupported modes and uses Codex context limits for OAuth GPT models", async () => { const hooks = await CodexAuthPlugin({} as never) const limit = { context: 1_050_000, input: 922_000, output: 128_000 }