From 887cf25b65259a371421a8681025db78d866940b Mon Sep 17 00:00:00 2001 From: jack Date: Tue, 10 Mar 2026 22:12:39 +0000 Subject: [PATCH 1/2] fix(google-cli): prefer OAuth projectId over client body project --- open-sse/executors/antigravity.ts | 4 +++- open-sse/executors/gemini-cli.ts | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/open-sse/executors/antigravity.ts b/open-sse/executors/antigravity.ts index 91ba8fc5fb..1a5231a2aa 100644 --- a/open-sse/executors/antigravity.ts +++ b/open-sse/executors/antigravity.ts @@ -38,7 +38,9 @@ export class AntigravityExecutor extends BaseExecutor { transformRequest(model, body, stream, credentials) { const bodyProjectId = body?.project; const credentialsProjectId = credentials?.projectId; - const projectId = bodyProjectId || credentialsProjectId; + // Prefer OAuth-stored projectId over incoming body.project to avoid stale/wrong + // client-side values causing 404/403 from Cloud Code endpoints. + const projectId = credentialsProjectId || bodyProjectId; if (!projectId) { throw new Error( diff --git a/open-sse/executors/gemini-cli.ts b/open-sse/executors/gemini-cli.ts index dabb0ee44d..52f3915a89 100644 --- a/open-sse/executors/gemini-cli.ts +++ b/open-sse/executors/gemini-cli.ts @@ -20,7 +20,9 @@ export class GeminiCLIExecutor extends BaseExecutor { } transformRequest(model, body, stream, credentials) { - if (!body.project && credentials?.projectId) { + // Always prefer OAuth-stored projectId if present. Incoming body.project can be + // stale when clients cache older Cloud Code project values. + if (credentials?.projectId) { body.project = credentials.projectId; } return body; From c949214e99dbd08877b7952a301f312f85299497 Mon Sep 17 00:00:00 2001 From: jack Date: Tue, 10 Mar 2026 22:15:26 +0000 Subject: [PATCH 2/2] feat(google-cli): add env escape hatch for body.project override --- open-sse/executors/antigravity.ts | 10 +++++++--- open-sse/executors/gemini-cli.ts | 11 +++++++++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/open-sse/executors/antigravity.ts b/open-sse/executors/antigravity.ts index 1a5231a2aa..2e18d1aa48 100644 --- a/open-sse/executors/antigravity.ts +++ b/open-sse/executors/antigravity.ts @@ -38,9 +38,13 @@ export class AntigravityExecutor extends BaseExecutor { transformRequest(model, body, stream, credentials) { const bodyProjectId = body?.project; const credentialsProjectId = credentials?.projectId; - // Prefer OAuth-stored projectId over incoming body.project to avoid stale/wrong - // client-side values causing 404/403 from Cloud Code endpoints. - const projectId = credentialsProjectId || bodyProjectId; + const allowBodyProjectOverride = process.env.OMNIROUTE_ALLOW_BODY_PROJECT_OVERRIDE === "1"; + + // Default: prefer OAuth-stored projectId over incoming body.project to avoid + // stale/wrong client-side values causing 404/403 from Cloud Code endpoints. + // Opt-in escape hatch: set OMNIROUTE_ALLOW_BODY_PROJECT_OVERRIDE=1. + const projectId = + allowBodyProjectOverride && bodyProjectId ? bodyProjectId : credentialsProjectId || bodyProjectId; if (!projectId) { throw new Error( diff --git a/open-sse/executors/gemini-cli.ts b/open-sse/executors/gemini-cli.ts index 52f3915a89..42d14c4b95 100644 --- a/open-sse/executors/gemini-cli.ts +++ b/open-sse/executors/gemini-cli.ts @@ -20,8 +20,15 @@ export class GeminiCLIExecutor extends BaseExecutor { } transformRequest(model, body, stream, credentials) { - // Always prefer OAuth-stored projectId if present. Incoming body.project can be - // stale when clients cache older Cloud Code project values. + const allowBodyProjectOverride = process.env.OMNIROUTE_ALLOW_BODY_PROJECT_OVERRIDE === "1"; + + // Default: prefer OAuth-stored projectId. Incoming body.project can be stale + // when clients cache older Cloud Code project values. + // Opt-in escape hatch: set OMNIROUTE_ALLOW_BODY_PROJECT_OVERRIDE=1. + if (allowBodyProjectOverride && body?.project) { + return body; + } + if (credentials?.projectId) { body.project = credentials.projectId; }