From 82f97e942dd2b7dac58bb9960aaa05c56cfa98a7 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Sat, 18 Apr 2026 11:10:34 +0700 Subject: [PATCH] fix(server): suppress browser popups from ACP probes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pass NO_BROWSER=true when probing ACP agents for models, modes, and persisted sessions. Gemini CLI's ACP newSession handler calls refreshAuth inline and will open a Google OAuth URL in the browser when no valid cached token is present — every snapshot warm-up triggered this on navigation. Real agent sessions still use their own launchContext.env, so interactive auth continues to work when actually starting an agent. --- .../server/src/server/agent/providers/acp-agent.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/server/src/server/agent/providers/acp-agent.ts b/packages/server/src/server/agent/providers/acp-agent.ts index caff01eb0..c2090540d 100644 --- a/packages/server/src/server/agent/providers/acp-agent.ts +++ b/packages/server/src/server/agent/providers/acp-agent.ts @@ -107,6 +107,11 @@ const ACP_CLIENT_CAPABILITIES: ACPClientCapabilities = { const COPILOT_AUTOPILOT_MODE = "https://agentclientprotocol.com/protocol/session-modes#autopilot"; +// Suppress interactive auth side-effects (e.g. Gemini CLI opening a Google +// sign-in URL in the browser) when probing an ACP agent for models/modes. +// NO_BROWSER is honored by Gemini CLI; other ACP agents ignore it. +const PROBE_ENV: Record = { NO_BROWSER: "true" }; + type ACPAgentClientOptions = { provider: string; logger: Logger; @@ -391,7 +396,7 @@ export class ACPAgentClient implements AgentClient { async listModels(options?: ListModelsOptions): Promise { const cwd = options?.cwd ?? process.cwd(); - const probe = await this.spawnProcess(undefined); + const probe = await this.spawnProcess(PROBE_ENV); try { const response = await probe.connection.newSession({ cwd, @@ -411,7 +416,7 @@ export class ACPAgentClient implements AgentClient { async listModes(options?: ListModesOptions): Promise { const cwd = options?.cwd ?? process.cwd(); - const probe = await this.spawnProcess(undefined); + const probe = await this.spawnProcess(PROBE_ENV); try { const response = await probe.connection.newSession({ cwd, @@ -432,7 +437,7 @@ export class ACPAgentClient implements AgentClient { async listPersistedAgents( options?: ListPersistedAgentsOptions, ): Promise { - const probe = await this.spawnProcess(undefined); + const probe = await this.spawnProcess(PROBE_ENV); try { if (!probe.initialize.agentCapabilities?.sessionCapabilities?.list) { return [];