import type { Tool } from '../types/index.js'; import type { ToolMetadata, ToolWithMetadata, ToolSearchResult } from './types.js'; import { searchTools } from './search.js'; /** * 工具注册中心 * 管理所有工具的注册、查询和搜索 */ class ToolRegistry { private tools: Map = new Map(); /** * 注册单个工具 */ register(tool: ToolWithMetadata): void { this.tools.set(tool.name, tool); } /** * 批量注册工具 */ registerAll(tools: ToolWithMetadata[]): void { for (const tool of tools) { this.register(tool); } } /** * 获取核心工具 (deferLoading: false) * 这些工具在会话开始时就可用 */ getCoreTools(): Tool[] { const coreTools: Tool[] = []; for (const tool of this.tools.values()) { if (!tool.metadata.deferLoading) { coreTools.push(this.toBasicTool(tool)); } } return coreTools; } /** * 获取指定工具 */ getTool(name: string): Tool | undefined { const tool = this.tools.get(name); return tool ? this.toBasicTool(tool) : undefined; } /** * 获取多个工具 */ getTools(names: string[]): Tool[] { const result: Tool[] = []; for (const name of names) { const tool = this.getTool(name); if (tool) { result.push(tool); } } return result; } /** * 搜索工具 * @param query 搜索查询 * @param limit 返回结果数量限制 * @returns 匹配的工具元数据列表 */ search(query: string, limit: number = 5): ToolSearchResult[] { const allMetadata = this.getAllMetadata(); return searchTools(query, allMetadata, limit); } /** * 获取所有工具的元数据 */ getAllMetadata(): ToolMetadata[] { return [...this.tools.values()].map((tool) => tool.metadata); } /** * 获取所有工具 (用于兼容旧代码) */ getAllTools(): Tool[] { return [...this.tools.values()].map((tool) => this.toBasicTool(tool)); } /** * 检查工具是否存在 */ has(name: string): boolean { return this.tools.has(name); } /** * 获取工具数量 */ get size(): number { return this.tools.size; } /** * 将 ToolWithMetadata 转换为基础 Tool 类型 */ private toBasicTool(tool: ToolWithMetadata): Tool { return { name: tool.name, description: tool.description, parameters: tool.parameters, execute: tool.execute, }; } } // 导出单例 export const toolRegistry = new ToolRegistry(); // 也导出类,方便测试 export { ToolRegistry };