Files
deepseek-harness/packages/client/ui-commands/README.zh.md
T

5.4 KiB
Raw Blame History

description, kind
description kind
Web GUI 的客户端命令 API:/ 命令 source、三类派发、会话级命令目录,以及面向业务包的 popupSelect 注册;供斜杠命令的用户与维护者阅读。 package-reference

@deepseek-ai/dsh-client-ui-commands

English | 中文

概述

在 composer 中键入 / 命令会打开匹配的表面——已注册的弹窗、宿主命令的输入或直接执行——命令行绝不会被静默降级为普通提示词。业务包经 ctx.commandUi 贡献命令表面:注册 popupSelect 贡献项(/model/permission),或用选择器装饰既有宿主命令,宿主保留其目录行与参数声明。空格与回车对照会话目录解析命令行:带 input 的宿主描述符是 leadingInput,注册了 CommandUiSpec 的是 popupSelect,其余全部是 execute

目录


使用本包

ui-input-triggerui-conversation 一起挂载本插件;/ source 随即出现在触发菜单中,业务包经 ctx.commandUi 注册自己的命令表面。键入 /model 打开已注册的弹窗;带参数声明的宿主命令打开其输入或直接执行。

种类与装饰

贡献项是客户端自有命令——与宿主命令同名会明确报错。装饰为已存在的宿主命令添加裸调用弹窗:宿主命令保留其目录行、参数声明与生命周期记账,被装饰的名字在会话目录中无宿主行时永不触发。菜单查询按顺序且不区分大小写地模糊匹配命令名的子序列;前缀排名最高。

带图提交

composer 携带图片附件提交时,只有声明了 input.images 的宿主命令继续;其余每条命令路径都会抛出本地化的 imagesUnsupported 拒绝,以瞬态 toast 呈现,草稿与图片保持原位——命令绝不消费文本却抛下图片。


理解实现

实现细节——点击展开

src/client/contract.ts 是固定的业务约定:CommandUiContract.register(name, spec)decorate(name, spec) 是业务包消费的全部内容。CommandDirectory 是唯一的 wire 派生缓存,以会话为 key:普通会话经 command.list({sessionId}) 拉取;条目由转发的 commands/change owner 事件软失效、由 connection/reset 硬失效,并以 epoch 把关,被取代的旧拉取永远无法覆盖更新的结果。matchSpace 只凭该缓存同步应答;matchEnter 在 SubmitAttempt 信号上强等缓存,预热失败即拒绝。command.execute 返回匹配结果后,浏览器发布本地 command/executed 确认;其他客户端经宿主事件流收到持久命令节点,但收不到这条确认。PopupSelectController 是不含界面的外壳状态;PopupSelectView 自注册进 conversation.input.overlay,按会话解析。决策记录:Web 命令表面笔记模糊发现笔记 说明菜单排名。


进一步探索

当命令面不够用时阅读以下页面。它们从命令 API 进入触发流水线与宿主命令注册表。


模型体验

间接影响,经由派发路径触发的宿主 command.execute RPC:每个命令 handler 的宿主包拥有任何模型可见效果(/plan 的 handler 翻转 plan 模式,其归属包注入 policy 段),而命令行、分离结果与所有菜单和 notice 渲染都留在客户端,永不进入会话日志。

KV Cache 影响

无直接影响;该包既不组装也不发送提供方请求。它触发的命令 handler 可能改变归属宿主包对下一个请求系统提示词的贡献——某个 section 的出现或消失会替换较早的请求 token,并使提供方前缀从该点起失效——但这一影响由各命令的宿主包拥有并记录。

已知限制与延期工作

这些限制界定了当前命令表面。它们是当前包约束,不是通用命令行对比或任务积压。

  • 脱离会话后,分离结果 notice 回退到 console——fire-and-forget 路径经 SessionInput.notify 把结果送到触发会话的 composer;会话销毁后,console 输出行是仅剩的呈现面。

开发备注

维护者的工作上下文——点击展开

无。