DSH plugin 用户命令怎么注册?DeepSeek Harness 的 CommandDefinition 规范
DSH plugin 想给用户加一条斜杠命令,走的是与工具完全不同的注册表:dsh-commands 提供的用户命令服务让交互式适配器发现插件拥有的命令,并针对确切的 agent 直接执行,而不创建任何模型消息**(来源)。** 本文面向 DSH插件 / DeepSeek插件 作者,讲清 CommandDefinition 的字段规范、仅日志的命令生命周期、作用域阴影与 ctx.commands 的 API;事件分发五模式见 DSH plugin 事件系统,工具的注册与契约见 工具 execute 契约。
DSH plugin 的 CommandDefinition:注册用户命令要填什么
CommandDefinition 是由插件编写的注册定义,注册表会校验并冻结一份与原始注册对象脱离的生效定义(来源)。 字段规范如下:
name— 小写命令名,不含前导斜杠。/plan注册时写plan。description— 供发现 UI 使用的人类可读摘要。input(可选) — 一个CommandInputDescriptor,目前只有hint:在用户提供自由输入前显示的占位说明,向有能力的客户端公布。命令的可用性由插件组合决定——每个消费注册表的适配器都会看到全部生效定义。recordInput(可选,默认true) — 是否让command/run记录rawInput。当命令的领域事件已经拥有该 payload 时,把它设为false,避免在会话日志里重复记录同一份 payload。handler—(invocation: CommandInvocation) => CommandResult | Promise<CommandResult>,针对接收 agent 直接执行,不把命令发给模型。
DSH plugin 用户命令的调用与结果:不经模型的直接执行
取消由适配器负责,适配器会传入确切的目标 agent;结果直接呈现给 UI,而不是工具结果或会话事件(来源)。 handler 收到的 CommandInvocation 有四个字段:
commandId— 已经写入本次调用command/run事件的配对 id。agent— 其 UI 收到该命令的确切 agent。rawInput— 紧跟注册命令名之后的原始文本,保留适配器传入的分隔符与后缀空白。signal— 由分发 UI 请求持有的取消信号。
返回的 CommandResult 是两个分支之一:{ kind: 'success', text?, sourceEventSeq? } 或 { kind: 'error', text }。其中 sourceEventSeq 是可选字段,且只用于成功结果:存在时它指向接收会话日志中更早的一条非命令事件,command/done 会持久化同一引用,让客户端能把命令生命周期与该领域投影合并,而无须解析 text 或依赖相邻行。
DSH plugin 用户命令的发现、作用域与生命周期日志
作用是分层的,生命周期是仅日志的(来源)。
- 作用域与阴影 — 普通 context 上的定义是全局的;通过注入了
commands的 agent context 子作用域注册的定义,会针对该 agent 阴影全局定义。ctx.commands.register(definition)返回精确的 effect disposer;ctx.commands.list(agent)返回按名字排序、经作用域阴影后的不可变CommandDescriptor(不含 handler);ctx.commands.find(agent, name)返回阴影或全局定义。 - 仅日志的生命周期 —
ctx.commands.execute(agent, line, signal)解析并执行已知命令:command/run在 handler 调用前追加,command/done在结算后追加(抛异常或中止的 handler 结算为kind: 'error')。两者都是直接的仅日志追加,没有轮次包裹它们,持久化在普通检查点排空。 - 准入与失败语义 — 准入未命中(语法错误或未知命令名)不记录任何东西,因为从未进入 handler;
command/run追加失败会让执行大声失败;handler 失败路径上的command/done追加失败被包含,让 handler 自身的错误保持为上报失败。 - 解析视图 —
parseCommand()在注册表解析前返回ParsedCommand,因此语法有效的输入仍可能指向一个当前不可用的命令。 - 注册表变更通知 —
commands/change是未过滤的注册表通知(全局或作用域变更可能影响任意 UI 视图),观察者失败被包含,不能否决注册表变更。
写完自检三项:name 是否小写且没有前导斜杠;领域事件已经承载 payload 时 recordInput 是否设成了 false;handler 是否直接返回 CommandResult 而没有试图把命令塞进模型轮次。想找命令类插件的社区实现,你可以在 DSH Plugin Hub 检索;命令与工具的分工判据见 功能→机制映射。
常见问题
DSH plugin 通过 dsh-commands 提供的 ctx.commands 注册表注册用户命令:调用 ctx.commands.register(definition) 传入一个 CommandDefinition,注册表会校验并冻结一份与原始对象脱离的生效定义,返回精确的 effect disposer 用于注销。交互式适配器消费注册表,发现插件拥有的命令并针对确切 agent 直接执行。
DSH plugin 的用户命令不会发给模型,而是针对接收 agent 直接执行:CommandDefinition 的 handler 在 handler(invocation) 里拿到确切目标 agent 与 signal,结果直接呈现给 UI,而不是工具结果或会话事件,也不创建任何模型消息。这与走模型轮次的工具是两条完全不同的路径。
它们是 DSH plugin 用户命令的仅日志生命周期记录:command/run 在 handler 被调用前追加,command/done 在结算后追加(抛异常或中止的 handler 结算为 kind: 'error')。两者都是直接日志追加,没有轮次包裹它们,持久化在普通检查点排空;准入未命中(语法错误或未知命令名)不记录任何东西,因为从未进入 handler。
sourceEventSeq 是 DSH plugin 成功结果上的可选字段:存在时它指向接收会话日志中更早的一条非命令事件,command/done 会持久化同一引用,让客户端能把命令生命周期与该领域投影合并,而无须解析 text 或依赖相邻行。它只用于 kind: 'success' 的结果。
DSH plugin 的命令按作用域解析:在普通 context 上注册的定义是全局的,而通过注入了 commands 的 agent context 子作用域注册的定义,会针对该 agent 阴影全局定义。ctx.commands.list(agent) 返回按名字排序、经作用域阴影后的不可变描述符,find(agent, name) 返回对应的阴影或全局定义。
相关术语
- CommandDefinition(用户命令定义)
- CommandDefinition 是 DeepSeek Harness 中由插件编写的用户命令注册定义,包含不含前导斜杠的小写 name、description、可选 input.hint、默认 true 的 recordInput 与针对接收 agent 直接执行的 handler;注册表会校验并冻结一份与原始对象脱离的生效定义。— https://deepseek-harness.github.io/deepseek-harness/reference/subsystems/commands
- CommandInvocation(命令调用)
- CommandInvocation 是传给某个已注册命令 handler 的调用对象,携带已写入本次 command/run 事件的 commandId、接收命令的确切 agent、紧跟在命令名之后的 rawInput 与由分发 UI 请求持有的 signal。— https://deepseek-harness.github.io/deepseek-harness/reference/subsystems/commands
- sourceEventSeq(源事件序号)
- sourceEventSeq 是成功命令结果上的可选字段,指向接收会话日志中更早的一条非命令事件;command/done 持久化同一引用,让客户端把命令生命周期与更丰富的领域投影合并而不必解析文本。— https://deepseek-harness.github.io/deepseek-harness/reference/subsystems/commands
- commands/change(注册表变更事件)
- commands/change 是用户命令注册表的未过滤通知事件,在命令被注册或注销时触发;因为全局或作用域变更可能影响任意 UI 视图,所以不做过滤,且观察者失败被包含、不能否决注册表变更。— https://deepseek-harness.github.io/deepseek-harness/reference/subsystems/commands
来源
- DeepSeek Harness 官方文档 - 用户命令· deepseek-ai
- DeepSeek Harness 官方文档 - 事件系统· deepseek-ai