From 3efb2248dd50ee731546d196171c8ad2e2088ab3 Mon Sep 17 00:00:00 2001 From: Ramesh Nethi Date: Wed, 29 Apr 2026 22:02:12 +0530 Subject: [PATCH 1/2] fix: resolve gemini api key duplication and improve error classification --- apps/web/src/app/setup/page.tsx | 3 ++- packages/agent-adapters/src/gemini.ts | 9 +++++++++ packages/shared/src/error-classifier.ts | 12 ++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/apps/web/src/app/setup/page.tsx b/apps/web/src/app/setup/page.tsx index 3993527c..631a9f56 100644 --- a/apps/web/src/app/setup/page.tsx +++ b/apps/web/src/app/setup/page.tsx @@ -1740,7 +1740,8 @@ export default function SetupPage() { setGeminiError(""); }} onPaste={(e) => { - const pasted = e.clipboardData.getData("text"); + e.preventDefault(); + const pasted = e.clipboardData.getData("text").trim(); if (pasted) { setGeminiKey(pasted); setGeminiValidated(false); diff --git a/packages/agent-adapters/src/gemini.ts b/packages/agent-adapters/src/gemini.ts index 37a7c0e5..29d40ec4 100644 --- a/packages/agent-adapters/src/gemini.ts +++ b/packages/agent-adapters/src/gemini.ts @@ -64,6 +64,8 @@ export class GeminiAdapter implements AgentAdapter { OPTIO_PROMPT: prompt, OPTIO_AGENT_TYPE: "gemini", OPTIO_BRANCH_NAME: `${TASK_BRANCH_PREFIX}${input.taskId}`, + // Ensure the CLI doesn't prompt for trust in isolated ephemeral pods + GEMINI_CLI_TRUST_WORKSPACE: "true", }; const requiredSecrets: string[] = []; @@ -164,6 +166,13 @@ export class GeminiAdapter implements AgentAdapter { let hasError = false; let lastAssistantMessage: string | undefined; + // Check for JSON error messages embedded in non-JSON output + const apiKeyErrorMatch = logs.match(/API key not valid|API_KEY_INVALID/i); + if (apiKeyErrorMatch) { + errorMessage = "API key not valid. Please pass a valid API key."; + hasError = true; + } + for (const line of logs.split("\n")) { if (!line.trim()) continue; diff --git a/packages/shared/src/error-classifier.ts b/packages/shared/src/error-classifier.ts index 4a8041e8..396c4470 100644 --- a/packages/shared/src/error-classifier.ts +++ b/packages/shared/src/error-classifier.ts @@ -234,6 +234,18 @@ const ERROR_PATTERNS: Array<{ retryable: true, }), }, + { + pattern: /API key not valid|API_KEY_INVALID/i, + classify: () => ({ + category: "auth", + title: "Invalid API key", + description: + "The provided API key is invalid. This can affect Gemini, Anthropic, or OpenAI depending on which agent was running.", + remedy: + "Go to Secrets and verify your API keys (GEMINI_API_KEY, ANTHROPIC_API_KEY, etc.) are valid and have not been revoked.", + retryable: false, + }), + }, { pattern: /exit code: (\d+)/i, classify: (match) => ({ From 3e5c366c6fd79e7f6c909b69c359ee3ef7d3c9d0 Mon Sep 17 00:00:00 2001 From: Ramesh Nethi Date: Sat, 23 May 2026 18:16:09 +0530 Subject: [PATCH 2/2] fix(gemini): remove hallucinated CLI env var and add regression test --- packages/agent-adapters/src/gemini.ts | 2 -- packages/shared/src/error-classifier.test.ts | 7 +++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/agent-adapters/src/gemini.ts b/packages/agent-adapters/src/gemini.ts index 29d40ec4..9b0ddfdb 100644 --- a/packages/agent-adapters/src/gemini.ts +++ b/packages/agent-adapters/src/gemini.ts @@ -64,8 +64,6 @@ export class GeminiAdapter implements AgentAdapter { OPTIO_PROMPT: prompt, OPTIO_AGENT_TYPE: "gemini", OPTIO_BRANCH_NAME: `${TASK_BRANCH_PREFIX}${input.taskId}`, - // Ensure the CLI doesn't prompt for trust in isolated ephemeral pods - GEMINI_CLI_TRUST_WORKSPACE: "true", }; const requiredSecrets: string[] = []; diff --git a/packages/shared/src/error-classifier.test.ts b/packages/shared/src/error-classifier.test.ts index dfc847f2..22a8d277 100644 --- a/packages/shared/src/error-classifier.test.ts +++ b/packages/shared/src/error-classifier.test.ts @@ -157,4 +157,11 @@ describe("classifyError", () => { expect(result.category).toBe("auth"); expect(result.title).toBe("Authentication token expired"); }); + + it("classifies invalid API key error", () => { + const result = classifyError("API_KEY_INVALID error from Gemini API"); + expect(result.category).toBe("auth"); + expect(result.title).toBe("Invalid API key"); + expect(result.retryable).toBe(false); + }); });