From 60a58ad8e5107293c67d45cdec04c4ce1d704b40 Mon Sep 17 00:00:00 2001 From: DragonnZhang <731557579@qq.com> Date: Fri, 12 Dec 2025 00:57:33 +0800 Subject: [PATCH] feat: add support for the channel field to CLI parameters and configurations --- packages/cli/src/config/config.ts | 13 +++++++++++++ packages/cli/src/gemini.test.tsx | 1 + packages/core/src/config/config.ts | 7 +++++++ .../provider/dashscope.ts | 3 +++ .../openaiContentGenerator/provider/types.ts | 1 + .../src/telemetry/qwen-logger/qwen-logger.ts | 3 +++ .../src/transport/ProcessTransport.ts | 1 + .../src/services/acpConnection.ts | 18 ++++++++++++++---- 8 files changed, 43 insertions(+), 4 deletions(-) diff --git a/packages/cli/src/config/config.ts b/packages/cli/src/config/config.ts index 3212996d..ab4f087d 100755 --- a/packages/cli/src/config/config.ts +++ b/packages/cli/src/config/config.ts @@ -138,6 +138,7 @@ export interface CliArgs { coreTools: string[] | undefined; excludeTools: string[] | undefined; authType: string | undefined; + channel: string | undefined; } function normalizeOutputFormat( @@ -297,6 +298,11 @@ export async function parseArguments(settings: Settings): Promise { type: 'boolean', description: 'Starts the agent in ACP mode', }) + .option('channel', { + type: 'string', + choices: ['VSCode', 'ACP', 'SDK', 'CI'], + description: 'Channel identifier (VSCode, ACP, SDK, CI)', + }) .option('allowed-mcp-server-names', { type: 'array', string: true, @@ -559,6 +565,12 @@ export async function parseArguments(settings: Settings): Promise { // The import format is now only controlled by settings.memoryImportFormat // We no longer accept it as a CLI argument + + // Apply ACP fallback: if experimental-acp is present but no explicit --channel, treat as ACP + if (result['experimentalAcp'] && !result['channel']) { + (result as Record)['channel'] = 'ACP'; + } + return result as unknown as CliArgs; } @@ -983,6 +995,7 @@ export async function loadCliConfig( output: { format: outputSettingsFormat, }, + channel: argv.channel, }); } diff --git a/packages/cli/src/gemini.test.tsx b/packages/cli/src/gemini.test.tsx index f602d17d..205a3d88 100644 --- a/packages/cli/src/gemini.test.tsx +++ b/packages/cli/src/gemini.test.tsx @@ -485,6 +485,7 @@ describe('gemini.tsx main function kitty protocol', () => { excludeTools: undefined, authType: undefined, maxSessionTurns: undefined, + channel: undefined, }); await main(); diff --git a/packages/core/src/config/config.ts b/packages/core/src/config/config.ts index 6383cb17..d0332f27 100644 --- a/packages/core/src/config/config.ts +++ b/packages/core/src/config/config.ts @@ -349,6 +349,7 @@ export interface ConfigParameters { skipStartupContext?: boolean; sdkMode?: boolean; sessionSubagents?: SubagentConfig[]; + channel?: string; } function normalizeConfigOutputFormat( @@ -485,6 +486,7 @@ export class Config { private readonly enableToolOutputTruncation: boolean; private readonly eventEmitter?: EventEmitter; private readonly useSmartEdit: boolean; + private readonly channel: string | undefined; constructor(params: ConfigParameters) { this.sessionId = params.sessionId ?? randomUUID(); @@ -598,6 +600,7 @@ export class Config { this.enableToolOutputTruncation = params.enableToolOutputTruncation ?? true; this.useSmartEdit = params.useSmartEdit ?? false; this.extensionManagement = params.extensionManagement ?? true; + this.channel = params.channel; this.storage = new Storage(this.targetDir); this.vlmSwitchMode = params.vlmSwitchMode; this.inputFormat = params.inputFormat ?? InputFormat.TEXT; @@ -1144,6 +1147,10 @@ export class Config { return this.cliVersion; } + getChannel(): string | undefined { + return this.channel; + } + /** * Get the current FileSystemService */ diff --git a/packages/core/src/core/openaiContentGenerator/provider/dashscope.ts b/packages/core/src/core/openaiContentGenerator/provider/dashscope.ts index 2df72221..4a5b7748 100644 --- a/packages/core/src/core/openaiContentGenerator/provider/dashscope.ts +++ b/packages/core/src/core/openaiContentGenerator/provider/dashscope.ts @@ -130,10 +130,13 @@ export class DashScopeOpenAICompatibleProvider } buildMetadata(userPromptId: string): DashScopeRequestMetadata { + const channel = this.cliConfig.getChannel?.(); + return { metadata: { sessionId: this.cliConfig.getSessionId?.(), promptId: userPromptId, + ...(channel ? { channel } : {}), }, }; } diff --git a/packages/core/src/core/openaiContentGenerator/provider/types.ts b/packages/core/src/core/openaiContentGenerator/provider/types.ts index ea7c434d..362ec69a 100644 --- a/packages/core/src/core/openaiContentGenerator/provider/types.ts +++ b/packages/core/src/core/openaiContentGenerator/provider/types.ts @@ -28,5 +28,6 @@ export type DashScopeRequestMetadata = { metadata: { sessionId?: string; promptId: string; + channel?: string; }; }; diff --git a/packages/core/src/telemetry/qwen-logger/qwen-logger.ts b/packages/core/src/telemetry/qwen-logger/qwen-logger.ts index b6a97a2e..f0fb94f1 100644 --- a/packages/core/src/telemetry/qwen-logger/qwen-logger.ts +++ b/packages/core/src/telemetry/qwen-logger/qwen-logger.ts @@ -249,6 +249,9 @@ export class QwenLogger { authType === AuthType.USE_OPENAI ? this.config?.getContentGeneratorConfig().baseUrl || '' : '', + ...(this.config?.getChannel?.() + ? { channel: this.config.getChannel() } + : {}), }, _v: `qwen-code@${version}`, } as RumPayload; diff --git a/packages/sdk-typescript/src/transport/ProcessTransport.ts b/packages/sdk-typescript/src/transport/ProcessTransport.ts index c54d9104..43ff09da 100644 --- a/packages/sdk-typescript/src/transport/ProcessTransport.ts +++ b/packages/sdk-typescript/src/transport/ProcessTransport.ts @@ -139,6 +139,7 @@ export class ProcessTransport implements Transport { 'stream-json', '--output-format', 'stream-json', + '--channel=SDK', ]; if (this.options.model) { diff --git a/packages/vscode-ide-companion/src/services/acpConnection.ts b/packages/vscode-ide-companion/src/services/acpConnection.ts index 5486e14d..f4c95948 100644 --- a/packages/vscode-ide-companion/src/services/acpConnection.ts +++ b/packages/vscode-ide-companion/src/services/acpConnection.ts @@ -94,7 +94,12 @@ export class AcpConnection { if (cliPath.startsWith('npx ')) { const parts = cliPath.split(' '); spawnCommand = isWindows ? 'npx.cmd' : 'npx'; - spawnArgs = [...parts.slice(1), '--experimental-acp', ...extraArgs]; + spawnArgs = [ + ...parts.slice(1), + '--experimental-acp', + '--channel=VSCode', + ...extraArgs, + ]; } else { // For qwen CLI, ensure we use the correct Node.js version // Handle various Node.js version managers (nvm, n, manual installations) @@ -103,11 +108,16 @@ export class AcpConnection { const nodePathResult = determineNodePathForCli(cliPath); if (nodePathResult.path) { spawnCommand = nodePathResult.path; - spawnArgs = [cliPath, '--experimental-acp', ...extraArgs]; + spawnArgs = [ + cliPath, + '--experimental-acp', + '--channel=VSCode', + ...extraArgs, + ]; } else { // Fallback to direct execution spawnCommand = cliPath; - spawnArgs = ['--experimental-acp', ...extraArgs]; + spawnArgs = ['--experimental-acp', '--channel=VSCode', ...extraArgs]; // Log any error for debugging if (nodePathResult.error) { @@ -118,7 +128,7 @@ export class AcpConnection { } } else { spawnCommand = cliPath; - spawnArgs = ['--experimental-acp', ...extraArgs]; + spawnArgs = ['--experimental-acp', '--channel=VSCode', ...extraArgs]; } }