05.1 命令分发

关注源码

  • src/commands.ts
  • src/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_COMMANDS
  • BRIDGE_SAFE_COMMANDS

这说明命令层不是纯 UI 逻辑,而是远端运行时安全边界的一部分。

设计上的关键点

1. 命令层统一了多来源能力

插件、技能、MCP、不同行为类型最终都用同一套命令抽象暴露给用户。

2. 命令层是控制面,不污染工具契约

这使系统既支持 slash command,也支持模型直接用工具,而两者仍能复用同一运行时底座。

3. 命令层直接参与模式裁剪

remote、bridge、非交互等场景下,命令池不是原样复用,而是先按运行模式收缩。