From ecd276e3d27e68e34c763c0084906d385ae60c47 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Tue, 17 Feb 2026 23:08:33 +0700 Subject: [PATCH] refactor(server): route draft command listing through agent manager --- .../server/src/server/agent/agent-manager.ts | 31 +++++++++ packages/server/src/server/session.ts | 63 ++++--------------- 2 files changed, 42 insertions(+), 52 deletions(-) diff --git a/packages/server/src/server/agent/agent-manager.ts b/packages/server/src/server/agent/agent-manager.ts index 958abd824..f230e3984 100644 --- a/packages/server/src/server/agent/agent-manager.ts +++ b/packages/server/src/server/agent/agent-manager.ts @@ -11,6 +11,7 @@ import { z } from "zod"; import type { AgentCapabilityFlags, AgentClient, + AgentSlashCommand, AgentMode, AgentPermissionRequest, AgentPermissionResponse, @@ -437,6 +438,36 @@ export class AgentManager { return Promise.all(checks); } + async listDraftCommands(config: AgentSessionConfig): Promise { + const normalizedConfig = await this.normalizeConfig(config); + const client = this.requireClient(normalizedConfig.provider); + const available = await client.isAvailable(); + if (!available) { + throw new Error( + `Provider '${normalizedConfig.provider}' is not available. Please ensure the CLI is installed.` + ); + } + + const session = await client.createSession(normalizedConfig); + try { + if (!session.listCommands) { + throw new Error( + `Provider '${normalizedConfig.provider}' does not support listing commands` + ); + } + return await session.listCommands(); + } finally { + try { + await session.close(); + } catch (error) { + this.logger.warn( + { err: error, provider: normalizedConfig.provider }, + "Failed to close draft command listing session" + ); + } + } + } + getAgent(id: string): ManagedAgent | null { const agent = this.agents.get(id); return agent ? { ...agent } : null; diff --git a/packages/server/src/server/session.ts b/packages/server/src/server/session.ts index 2b048f591..6234e71bc 100644 --- a/packages/server/src/server/session.ts +++ b/packages/server/src/server/session.ts @@ -3501,24 +3501,8 @@ export class Session { } if (!agent && draftConfig) { - const provider = draftConfig.provider; - const client = this.providerRegistry[provider].createClient(this.sessionLogger); - const available = await client.isAvailable(); - if (!available) { - this.emit({ - type: "list_commands_response", - payload: { - agentId, - commands: [], - error: `Provider '${provider}' is not available`, - requestId, - }, - }); - return; - } - const sessionConfig: AgentSessionConfig = { - provider, + provider: draftConfig.provider, cwd: expandTilde(draftConfig.cwd), ...(draftConfig.modeId ? { modeId: draftConfig.modeId } : {}), ...(draftConfig.model ? { model: draftConfig.model } : {}), @@ -3527,41 +3511,16 @@ export class Session { : {}), }; - const ephemeralSession = await client.createSession(sessionConfig); - try { - if (!ephemeralSession.listCommands) { - this.emit({ - type: "list_commands_response", - payload: { - agentId, - commands: [], - error: `Provider '${provider}' does not support listing commands`, - requestId, - }, - }); - return; - } - - const commands = await ephemeralSession.listCommands(); - this.emit({ - type: "list_commands_response", - payload: { - agentId, - commands, - error: null, - requestId, - }, - }); - } finally { - try { - await ephemeralSession.close(); - } catch (closeError) { - this.sessionLogger.warn( - { err: closeError, provider, agentId }, - "Failed to close ephemeral command listing session" - ); - } - } + const commands = await this.agentManager.listDraftCommands(sessionConfig); + this.emit({ + type: "list_commands_response", + payload: { + agentId, + commands, + error: null, + requestId, + }, + }); return; }