架构主线 · 02

命令、工具与任务

slash 表、工具表以 2.1.233 制品为准。能力分三层:slash 是用户控制面,Tool 是模型行动面,Task 是长生命周期执行容器。

1. 三层边界:Command、Tool、Task#

能做事的能力分三层:

层级面向谁典型入口适合承载
Command用户显式输入/mcp/config/compact配置、查看、管理、导出、模式切换、prompt 展开
Tool模型调用ReadBashEditAgentmcp__...文件、Shell、Web、MCP、Agent、Plan、Task 等模型能力
Task运行时生命周期LocalShellTask、LocalAgentTask长任务、后台任务、远程 agent、输出落盘、kill/foreground

这三层边界很清楚:slash 命令是用户控制面,Tool 是模型行动面,Task 是长生命周期执行容器。

2. 命令系统:src/commands.ts#

src/commands.ts 是 slash 命令总注册表。它不是静态数组,而是多来源汇聚:

bundled skills
  + builtin plugin skills
  + skill dir commands
  + workflow commands
  + plugin commands
  + plugin skills
  + built-in commands
  + dynamic skills

核心函数与机制:

命令还带有明确的安全/场景过滤:

很多命令通过 feature('...')USER_TYPE 条件引入,例如 assistant、bridge、voice、workflows、ultraplan、buddy、peers、fork、subscribe-pr。同一套源码服务多种发行/实验形态。

2.1 2.1.233 的 slash 表#

制品 slash-commands.txt 从 bundle 扫出 112 个 /name。菜单里不是每一条都开着:不少带 isEnabled / feature / workspace 门。

相对 2.1.88,独立 slash 已经不在表里的包括:

旧名2.1.233 怎么走
/loop表里是 /loops。这条 local-jsx 注册目前 isEnabled 恒 false;循环调度走 CronCreate / CronList / CronDelete.claude/scheduled_tasks.json
/cost/stats/usage
/vim/config → Editor mode。Vim 输入子系统还在
/output-style/config。样式在会话开始固定
/schedule没有独立 slash;调度看 Cron 三件套
/files/debug已从 slash 表拿掉
/commit/commit-push-pr不在 slash 表;skill 名里还留着

扫表扫不到、bundle 里仍注册的:/code-review(alias reviewultra/ultrareview)。

表里新增、值得点名的:/workflows(看 feature)、/auto-mode-setup(要 workspace,且满足 auto 条件)、/artifacts/background/pause-memory/reload-skills/recap/memory(编辑 CLAUDE.md 和 memory 设置)。

3. Tool 协议:src/Tool.ts#

Tool 不是简单的 name + inputSchema + call()。它是模型 schema、运行时执行、权限安全、UI 展示、进度、结果映射的完整协议。

一个 Tool 主要包含:

ToolUseContext 也很重,里面有 commands、tools、MCP clients/resources、agent definitions、permission context、AppState getter/setter、tool JSX setter、notification、OS notification、memory attachment 状态、query tracking、file reading limits、content replacement state 等。

这意味着 Tool 在系统里既是“模型能看见的能力”,也是“UI 能展示的交互单元”,还是“权限系统能判断的动作对象”。

buildTool() 的意义

Tool.ts 末尾的 buildTool() 给常用字段填安全默认值:

这降低了每个工具实现的样板代码,同时让调用方总能面对完整 Tool 对象。

4. 工具注册表:src/tools.ts#

getAllBaseTools() 是工具集合的 source of truth。默认和条件工具包括:

工具族代表工具作用
文件FileReadToolFileEditToolFileWriteToolNotebookEditTool读写编辑文件和 Notebook
ShellBashToolPowerShellToolPowerShell:Windows 没 Git Bash 默认开,有则看 tengu_cobalt_ridge
检索GlobToolGrepToolWebSearchToolWebFetchTool本地与 Web 检索
AgentAgentToolSendMessageTool子代理、多代理。TeamCreate/TeamDelete 已在 2.1.178 移除
PlanEnterPlanModeToolExitPlanModeV2ToolAskUserQuestionTool计划模式、退出计划、澄清问题
任务清单TaskCreate / Get / Update / ListTodoWritev2 默认 Task 四件套,v1 为 TodoWrite。2.1.233 新模型两套都不给,见 Todo 门控
后台任务TaskOutputTaskStop读/停后台 agent 或 shell
MCPListMcpResourcesReadMcpResource、动态 MCP tools2.1.233 没有单独的 McpAuth
记忆 / 编排memory_list / read / writeWorkflowMonitor2.1.233 工具表里的一等公民
Worktree/技能EnterWorktreeToolExitWorktreeToolSkillTool工作树、技能调用。2.1.233 没有 Config 工具
实验/内部REPLTungsten / WebBrowser / TerminalCapture / Snip 不在 2.1.233 工具表

tools.ts 还提供几个关键过滤:

5. 工具执行编排:services/tools/*#

真正执行 Tool 的逻辑不在 query.ts 里,而在 src/services/tools

toolOrchestration.ts

runTools() 会根据 tool.isConcurrencySafe(input) 分批:

这保证读/搜类操作可以并行,写/改状态类操作不会互相踩。

toolExecution.ts

runToolUse() 是单个 tool use 的执行状态机。它负责:

StreamingToolExecutor.ts

streamingToolExecution gate 开启时,模型流式输出 tool_use block 后,工具可提前开始执行,而不是等整条 assistant message 完成。

它的策略是:

6. 权限决策链路#

权限入口在 hooks/useCanUseTool.tsx,核心规则在 utils/permissions/permissions.ts。简化后的决策顺序:

  1. 整工具 deny rule。
  2. 整工具 ask rule。
  3. 工具自己的 checkPermissions(),例如 Bash 子命令规则、文件路径安全检查。
  4. 工具明确 deny。
  5. requiresUserInteraction() 的工具即使在 bypass 相关场景也不能静默执行。
  6. 内容级 ask rule 和 safetyCheck 会优先于 bypass。
  7. bypassPermissions 或 plan+原本 bypass 可直接 allow。
  8. 整工具 allow rule。
  9. passthrough 转 ask。
  10. dontAsk 把 ask 转 deny。
  11. auto 模式走 classifier / fast path / deny tracking。
  12. headless 或 async agent 不能弹窗时,先跑 PermissionRequest hooks,再自动 deny。
  13. interactive 模式进入权限 UI,也可能同时 race bridge/channel callbacks、hooks、classifier。

Auto mode 不是简单“自动同意”。它会:

细节见 Auto Mode 深度解析

7. BashTool 为什么很重#

tools/BashTool 是最复杂的工具族之一,因为它既要执行命令,又要理解命令。相关能力包括:

这里的重点不是“能跑 shell”,而是尽量在复杂 shell 语法里保守判断风险。例如:

8. AgentTool 与多代理#

tools/AgentTool/AgentTool.tsx 说明系统已经把“代理调用代理”当作主路径。它支持:

AgentTool 与 Task 系统关系紧密:同步子代理可以直接返回结果;后台/远程子代理会注册 task,输出写文件,UI/模型再通过 task tools 查看状态。

9. 任务系统:src/Task.tssrc/tasks.ts#

Task.ts 定义任务协议:

tasks.ts 是注册表:默认有 LocalShellTaskLocalAgentTaskRemoteAgentTaskDreamTask,按 feature 可追加 LocalWorkflowTaskMonitorMcpTask

10. 阅读建议#