工具注册表与内置工具
工具注册表与内置工具
相关源文件
本章引用的主要源码文件:
crates/jcode-protocol/src/notifications.rssrc/background.rssrc/bin/harness.rssrc/bus.rssrc/mcp/client.rssrc/mcp/manager.rssrc/mcp/mod.rssrc/mcp/protocol.rssrc/mcp/tool.rssrc/message/notifications.rssrc/protocol/notifications.rssrc/server/file_activity_tests.rssrc/server/state.rssrc/server/tests.rssrc/skill.rssrc/tool/agentgrep.rssrc/tool/agentgrep/args.rssrc/tool/agentgrep/context.rssrc/tool/agentgrep/render.rssrc/tool/agentgrep_tests.rssrc/tool/apply_patch.rssrc/tool/bash.rssrc/tool/bg.rssrc/tool/codesearch.rssrc/tool/conversation_search.rssrc/tool/edit.rssrc/tool/glob.rssrc/tool/grep.rssrc/tool/ls.rssrc/tool/lsp.rssrc/tool/mcp.rssrc/tool/mod.rssrc/tool/multiedit.rssrc/tool/patch.rssrc/tool/read.rssrc/tool/skill.rssrc/tool/task.rssrc/tool/tests.rssrc/tool/write.rssrc/tui/app/remote_notifications.rs
工具注册表是 jcode 智能体所有可执行能力的中央编排点。它管理着多种多样的工具集合,涵盖从本地文件系统操作、Shell 执行到复杂的多智能体协调以及模型上下文协议(MCP)集成。
注册表架构
Registry 结构体 src/tool/mod.rs:54-58 作为工具、技能和 CompactionManager 的容器。它通过 Arc 在会话间共享,同时在克隆时会创建一个新的 CompactionManager,从而为子智能体提供隔离 src/tool/mod.rs:60-70。
工具分类
注册表将工具组织为三个主要层级:
- 基础工具:无状态的共享工具(例如
read、grep、bash),它们只初始化一次并缓存在OnceLock中src/tool/mod.rs:109-112。 - 会话级工具:需要会话特定状态的工具,例如
subagent工具(实现为SubagentTool),它需要访问会话的提供者和注册表src/tool/task.rs:16-19。 - MCP 工具:由外部模型上下文协议服务器提供的动态工具。这些工具通过
McpManagementTool和McpManager集成到注册表中src/tool/mcp.rs:26-29。
工具特质
所有工具都必须实现 Tool 特质 src/tool/mod.rs:47-47,该特质定义了:
name():大语言模型(LLM)使用的标识符(例如 "bash")。parameters_schema():定义工具输入要求的 JSON Schema。execute():一个异步函数,用于处理输入并返回ToolOutputsrc/tool/mod.rs:48-48。
ToolContext 与执行安全
当工具被执行时,它会收到一个 ToolContext src/tool/mod.rs:47-47。该上下文提供了:
- 路径解析:工具会将会话工作目录的相对路径解析为绝对路径。
- 输出截断:为防止上下文窗口耗尽,工具会强制执行限制。例如,
bash工具的MAX_OUTPUT_LEN为 30,000 个字符src/tool/bash.rs:22-22。 - 进度追踪:工具可以向系统
Bus发送进度更新src/bus.rs:32-40。
工具数据流:从大语言模型到执行
下图展示了自然语言请求如何被转换为代码层面的工具执行。
工具执行管线
来源:src/tool/mod.rs:54-70, src/tool/agentgrep.rs:171-180, src/tool/task.rs:77-85
内置工具目录
jcode 包含超过 30 个内置工具。它们按功能领域进行分类。
文件系统与搜索
这些工具提供了智能体与代码库交互的主要接口。
| 工具 | 用途 | 关键逻辑 |
|---|---|---|
read | 读取文本、图像或 PDF,并显示行号。 | normalize_read_range src/tool/read.rs:59-117 |
write | 创建或覆盖文件。 | WriteTool src/tool/mod.rs:188-188 |
edit | 应用搜索/替换编辑。 | EditTool src/tool/mod.rs:130-130 |
multiedit | 跨多个文件应用多项编辑。 | MultiEditTool src/tool/mod.rs:134-135 |
ls | 列出目录内容。 | LsTool src/tool/mod.rs:146-146 |
glob | 查找匹配模式的文件。 | GlobTool src/tool/mod.rs:144-144 |
grep | 搜索文本模式。 | GrepTool src/tool/mod.rs:145-145 |
agentgrep | 结构感知搜索(grep、find、outline、trace)。 | AgentGrepTool src/tool/agentgrep.rs:163-180 |
apply_patch | 应用统一差异补丁。 | ApplyPatchTool src/tool/mod.rs:141-143 |
系统与执行
用于与宿主操作系统和后台进程交互的工具。
| 工具 | 用途 | 关键逻辑 |
|---|---|---|
bash | 执行 Shell 命令并解析进度。 | TokioCommand 和 JCODE_PROGRESS src/tool/bash.rs:19-28 |
bg | 管理后台任务(列出、等待、取消、状态)。 | BackgroundTaskManager src/tool/bg.rs:7-8 |
browser | 控制无头浏览器会话。 | BrowserTool src/tool/mod.rs:148-148 |
lsp | 查询语言服务器协议以获取符号信息。 | LspTool src/tool/mod.rs:169-169 |
websearch | 搜索网络信息。 | WebSearchTool src/tool/mod.rs:159-161 |
webfetch | 从 URL 获取内容。 | WebFetchTool src/tool/mod.rs:153-155 |
协调与记忆
用于多智能体工作流和长期知识检索的工具。
| 工具 | 用途 | 关键逻辑 |
|---|---|---|
subagent | 生成专门的子智能体(回答/压缩/完整)。 | SubagentTool::execute src/tool/task.rs:126-195 |
swarm | 与群组中的其他智能体通信。 | CommunicateTool src/tool/mod.rs:174-177 |
memory | 查询或更新语义记忆。 | MemoryTool src/tool/mod.rs:184-184 |
skill_manage | 加载、列出和重新加载"技能"(提示集)。 | SkillTool::execute src/tool/skill.rs:69-93 |
mcp | 管理 MCP 服务器连接(列出、连接、重新加载)。 | McpManagementTool src/tool/mcp.rs:88-101 |
来源:src/tool/mod.rs:116-188, src/tool/bash.rs:145-157, src/tool/task.rs:77-85, src/tool/bg.rs:125-142
智能体到系统的映射
下图将大语言模型使用的高级工具名称桥接到它们调用的具体 Rust 模块和系统实体。
工具到系统实体的映射
来源:src/tool/bash.rs:19-19, src/tool/read.rs:191-191, src/tool/task.rs:1-2, src/background.rs:36-40, src/tool/mcp.rs:3-4
后台任务管理
BackgroundTaskManager src/background.rs:36-39 允许工具异步运行。它使用基于文件的存储来实现崩溃恢复,将任务状态写入 .status.json 文件 src/background.rs:83-85。bg 工具与该管理器交互,使智能体能够等待任务完成或查看输出尾部 src/tool/bg.rs:43-98。
来源:src/background.rs:36-85, src/tool/bg.rs:125-142