diff --git a/src/plugin/chat-headers.test.ts b/src/plugin/chat-headers.test.ts index f2858605d..35de5e006 100644 --- a/src/plugin/chat-headers.test.ts +++ b/src/plugin/chat-headers.test.ts @@ -106,4 +106,41 @@ describe("createChatHeadersHandler", () => { expect(output.headers["x-initiator"]).toBeUndefined() }) + + test("skips x-initiator override when model uses @ai-sdk/github-copilot", async () => { + const handler = createChatHeadersHandler({ + ctx: { + client: { + session: { + message: async () => ({ + data: { + parts: [ + { + type: "text", + text: `notification\n${OMO_INTERNAL_INITIATOR_MARKER}`, + }, + ], + }, + }), + }, + }, + } as never, + }) + const output: { headers: Record } = { headers: {} } + + await handler( + { + sessionID: "ses_4", + provider: { id: "github-copilot" }, + model: { api: { npm: "@ai-sdk/github-copilot" } }, + message: { + id: "msg_4", + role: "user", + }, + }, + output, + ) + + expect(output.headers["x-initiator"]).toBeUndefined() + }) }) diff --git a/src/plugin/chat-headers.ts b/src/plugin/chat-headers.ts index 044ccaf28..9945ac1f1 100644 --- a/src/plugin/chat-headers.ts +++ b/src/plugin/chat-headers.ts @@ -123,6 +123,17 @@ export function createChatHeadersHandler(args: { ctx: PluginContext }): (input: if (!isChatHeadersOutput(output)) return if (!isCopilotProvider(normalizedInput.provider.id)) return + + // Do not override x-initiator when @ai-sdk/github-copilot is active. + // OpenCode's copilot fetch wrapper already sets x-initiator based on + // the actual request body content. Overriding it here causes a mismatch + // that the Copilot API rejects with "invalid initiator". + const model = isRecord(input) && isRecord((input as Record).model) + ? (input as Record).model as Record + : undefined + const api = model && isRecord(model.api) ? model.api as Record : undefined + if (api?.npm === "@ai-sdk/github-copilot") return + if (!(await isOmoInternalMessage(normalizedInput, ctx.client))) return output.headers["x-initiator"] = "agent"