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; }