From f4df6483a6d0b480f58d804d23b461fb0aef7845 Mon Sep 17 00:00:00 2001 From: kurihada Date: Thu, 11 Dec 2025 13:23:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20Agent=20=E6=A8=A1=E5=BC=8F=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E6=97=B6=E5=BA=94=E7=94=A8=E5=B7=A5=E5=85=B7=E8=BF=87?= =?UTF-8?q?=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 getAvailableTools() 中根据 AgentToolConfig 过滤工具 - 支持 enabled 白名单、disabled 黑名单、noTask 配置 - 切换回 default 时恢复原始 systemPrompt - /agent 命令显示当前可用工具数量 --- src/core/agent.ts | 56 ++++++++++++++++++++++++++++++++++++++++++---- src/ui/terminal.ts | 8 +++++-- 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/src/core/agent.ts b/src/core/agent.ts index bc98088..8ebbc96 100644 --- a/src/core/agent.ts +++ b/src/core/agent.ts @@ -57,8 +57,12 @@ export class Agent { // 当前 Agent 模式(null 表示默认模式) private currentAgentMode: AgentInfo | null = null; + // 原始 system prompt(用于切换回 default 时恢复) + private originalSystemPrompt: string; + constructor(config: AgentConfig, compressionConfig?: Partial) { this.config = config; + this.originalSystemPrompt = config.systemPrompt; const providerFactory = providers[config.provider]; if (!providerFactory) { @@ -119,17 +123,56 @@ export class Agent { * 获取当前可用的工具 * - 如果使用 registry 模式:返回核心工具 + 已发现的工具 * - 如果使用旧模式:返回所有注册的工具 + * - 如果当前有 Agent 模式,应用工具过滤 */ private getAvailableTools(): Tool[] { + let tools: Tool[]; + if (this.registry) { // 新模式:核心工具 + 已发现的工具 const coreTools = this.registry.getCoreTools(); const discoveredTools = this.registry.getTools([...this.discoveredTools]); - return [...coreTools, ...discoveredTools]; + tools = [...coreTools, ...discoveredTools]; } else { // 旧模式:返回所有注册的工具 - return [...this.legacyTools.values()]; + tools = [...this.legacyTools.values()]; } + + // 应用 Agent 模式的工具过滤 + if (this.currentAgentMode?.tools) { + tools = this.filterToolsByAgentConfig(tools); + } + + return tools; + } + + /** + * 根据 Agent 配置过滤工具 + */ + private filterToolsByAgentConfig(tools: Tool[]): Tool[] { + const toolConfig = this.currentAgentMode?.tools; + if (!toolConfig) return tools; + + let filteredTools = tools; + + // 如果设置了 enabled 列表,只保留这些工具 + if (toolConfig.enabled && toolConfig.enabled.length > 0) { + const enabledSet = new Set(toolConfig.enabled); + filteredTools = filteredTools.filter((t) => enabledSet.has(t.name)); + } + + // 如果设置了 disabled 列表,排除这些工具 + if (toolConfig.disabled && toolConfig.disabled.length > 0) { + const disabledSet = new Set(toolConfig.disabled); + filteredTools = filteredTools.filter((t) => !disabledSet.has(t.name)); + } + + // 如果禁止嵌套 Task,移除 task 工具 + if (toolConfig.noTask) { + filteredTools = filteredTools.filter((t) => t.name !== 'task'); + } + + return filteredTools; } /** @@ -365,13 +408,18 @@ export class Agent { setAgentMode(agent: AgentInfo | null): void { this.currentAgentMode = agent; - // 如果切换了 Agent,更新 system prompt if (agent?.prompt) { - // 追加 Agent 的 prompt 到系统 prompt + // 切换到指定 Agent,使用其 prompt this.config = { ...this.config, systemPrompt: agent.prompt, }; + } else { + // 切换回 default,恢复原始 prompt + this.config = { + ...this.config, + systemPrompt: this.originalSystemPrompt, + }; } } diff --git a/src/ui/terminal.ts b/src/ui/terminal.ts index be9dd4a..637a3b9 100644 --- a/src/ui/terminal.ts +++ b/src/ui/terminal.ts @@ -86,7 +86,9 @@ export class TerminalUI { // 切换到默认模式 if (agentName === 'default') { this.agent.setAgentMode(null); - console.log(chalk.green('\n✓ 已切换到 default (通用助手) 模式\n')); + const toolCount = this.agent.getToolCount(); + console.log(chalk.green('\n✓ 已切换到 default (通用助手) 模式')); + console.log(chalk.gray(` 可用工具: ${toolCount.total} 个\n`)); return true; } @@ -107,8 +109,10 @@ export class TerminalUI { } this.agent.setAgentMode(agent); + const toolCount = this.agent.getToolCount(); console.log(chalk.green(`\n✓ 已切换到 ${agent.name} 模式`)); - console.log(chalk.gray(` ${agent.description}\n`)); + console.log(chalk.gray(` ${agent.description}`)); + console.log(chalk.gray(` 可用工具: ${toolCount.total} 个\n`)); return true; }