Files
metona-ai-desktop/electron/harness/tools/registry.ts
T
thzxx f4532a2bb2 refactor: 移除多余依赖,统一 MUI 为唯一 UI 库
- 移除 radix-ui、clsx、tailwind-merge、class-variance-authority、react-router-dom

- 前后端全面适配 MUI 组件,清理残留 Tailwind 工具类引用

- 优化 Agent Loop 引擎、IPC 处理器、Provider Adapter 等后端模块

- 新增 Agent 网络工具通用设计文档 v2
2026-07-05 19:15:48 +08:00

117 lines
3.0 KiB
TypeScript

/**
* Tool Registry — 工具注册表
*
* 管理所有可用工具(内置 + MCP),提供查找、注册、注销功能。
*/
import type {
MetonaToolDef,
MetonaToolCall,
MetonaToolResult,
} from '../types';
import type { IMetonaTool, ToolRegistryEntry, ToolExecutionContext } from '../types/metona-tool';
export class ToolRegistry {
private tools = new Map<string, ToolRegistryEntry>();
private disabledTools = new Set<string>();
/** 注册内置工具 */
registerBuiltin(tool: IMetonaTool): void {
this.tools.set(tool.definition.name, {
tool,
source: 'builtin',
enabled: true,
});
}
/** 注册 MCP 工具 */
registerMCP(serverName: string, tool: IMetonaTool): void {
this.tools.set(tool.definition.name, {
tool,
source: 'mcp',
serverName,
enabled: true,
});
}
/** 注销 MCP Server 提供的所有工具 */
unregisterMCPTools(serverName: string): void {
for (const [name, entry] of this.tools) {
if (entry.source === 'mcp' && entry.serverName === serverName) {
this.tools.delete(name);
}
}
}
/** 获取工具 */
get(name: string): IMetonaTool | undefined {
const entry = this.tools.get(name);
if (!entry?.enabled) return undefined;
if (this.disabledTools.has(name)) return undefined;
return entry.tool;
}
/** 列出所有已启用工具的定义 */
listTools(): MetonaToolDef[] {
return Array.from(this.tools.values())
.filter((e) => e.enabled && !this.disabledTools.has(e.tool.definition.name))
.map((e) => e.tool.definition);
}
/** 设置工具启用/禁用状态(供 IPC tools:toggle 调用) */
setToolEnabled(name: string, enabled: boolean): void {
if (enabled) {
this.disabledTools.delete(name);
} else {
this.disabledTools.add(name);
}
}
/** 执行工具 */
async execute(
toolCall: MetonaToolCall,
context: ToolExecutionContext,
): Promise<MetonaToolResult> {
const tool = this.get(toolCall.name);
if (!tool) {
return {
toolCallId: toolCall.id,
toolName: toolCall.name,
result: null,
success: false,
error: `Unknown tool: ${toolCall.name}`,
durationMs: 0,
timestamp: Date.now(),
};
}
const startTs = Date.now();
try {
const result = await tool.execute(toolCall.args, context);
return {
toolCallId: toolCall.id,
toolName: toolCall.name,
result,
success: true,
durationMs: Date.now() - startTs,
timestamp: Date.now(),
};
} catch (error) {
return {
toolCallId: toolCall.id,
toolName: toolCall.name,
result: null,
success: false,
error: (error as Error).message,
durationMs: Date.now() - startTs,
timestamp: Date.now(),
};
}
}
/** 获取工具数量 */
get size(): number {
return Array.from(this.tools.values()).filter((e) => e.enabled && !this.disabledTools.has(e.tool.definition.name)).length;
}
}