05.1 命令分发
关注源码
src/commands.tssrc/commands/*
命令层的职责
命令层解决的是“用户怎么触发系统能力”,而不是“系统底层怎么实现能力”。
因此命令通常承担:
- 控制流切换
- settings 变更
- 打开对话框/面板
- 构造 prompt 型技能调用
- 调度已有服务或工具
命令来源
commands.ts 会把以下来源合并进统一命令池:
- 内建命令
- 技能目录命令
- 插件命令
- 动态技能
- MCP skill commands
并在 getCommands() 阶段做:
- 可用性过滤
- 去重
- 动态技能插入排序
命令类型
虽然类型定义在 types/command.ts,但从架构上可以理解为三类:
prompt: 生成一段提示词给模型local: 本地执行并返回文本结果local-jsx: 本地执行并渲染 UI
这个区分很重要,因为它直接决定:
- 是否可被模型调用
- 是否可从 bridge/remote 安全执行
- 是否需要 TUI 才能工作
命令层与工具层的分工
命令层更像控制面:
/model/permissions/theme/mcp/plugin
工具层更像能力面:
- 读写文件
- 跑 shell
- 调 agent
- 调外部系统
这保证了用户手工操作和模型自动操作不会混成一套接口。
remote / bridge 安全过滤
commands.ts 里专门维护了:
REMOTE_SAFE_COMMANDSBRIDGE_SAFE_COMMANDS
这说明命令层不是纯 UI 逻辑,而是远端运行时安全边界的一部分。
设计上的关键点
1. 命令层统一了多来源能力
插件、技能、MCP、不同行为类型最终都用同一套命令抽象暴露给用户。
2. 命令层是控制面,不污染工具契约
这使系统既支持 slash command,也支持模型直接用工具,而两者仍能复用同一运行时底座。
3. 命令层直接参与模式裁剪
remote、bridge、非交互等场景下,命令池不是原样复用,而是先按运行模式收缩。