Files
deepseek-harness/packages/client/ui-slash/README.zh.md
2026-07-29 15:29:38 +08:00

3.6 KiB
Raw Blame History

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

English | 中文

输入触发流水线插件:光标处的 /@ 检测(词边界 + guard tier 规则)、分组候选菜单,以及把 pick 路由到已注册 source。ctx.slash 拥有 source roster并按会话 scopesessionOf)各解析一个 SlashController;对话接线层在 controller 上驱动 trackarbitrateonSpaceadjudicate。source 每次调用收到一个 ClientSessionContext 投影——会话始终由 agent智能体支撑因此投影只含会话身份。source 在它能触达的每个会话 controller 中都会被预热scope 出生时在场的 roster 随 controller 构造预热,晚于此注册的 source 由注册动作本身预热进每个活 controller。lexicon 名录在预热后仍会变化的 source 实现 subscribeLexicon(session, listener)controller 每收到通知就重拉,并把聚合结果经其 lexicon 快照 store 发布。流水线与命令无关:空格/回车裁决按注册序轮询可选的 matchSpacematchEnter 钩子,第一个非 undefined 的应答胜出。

分层:src/core/T2是纯内核——detectTriggermenuReduceseedGroupsMENU_CLOSEDexactMatch,零 ReactDOMcordissrc/client/service.ts 是壳层,把内核接到菜单快照 store、逐 hit 候选拉取(以 generation 把关、后继请求经 AbortSignal 取代旧请求、失败的 source 静默丢弃并留一条 console 记录)和三条 pick 路径上。src/types.ts 与两个 contract.ts 文件是冻结的跨包契约(设计 v4 §5.1);变更需经主线程仲裁。

MenuView 把菜单 store 渲染进 conversation.input.overlay slot列表类会话 scope菜单关闭期间渲染 null。该 slot 由 ui-conversation 的组合器条目拥有锚点、children 声明、生命周期);其 SlotMap 类型合并放在本包的 src/client/slots.ts因为依赖方向ui-conversation → ui-slash不允许反向的类型导入。combobox 模式:焦点始终留在 textarea行在 mousedown 时完成 pick高亮由 aria-activedescendant 承载。

/client 导出表层是插件主体(applyinject)、SlashServiceMenuViewInjected 与契约类型。MenuView 本身是内部实现——slot 注册以闭包持有它。

模型体验

无。触发流水线只是浏览器呈现——pick 产出 CommandClaimReferenceInsert 数据,其模型可见后果(宿主命令执行;插入的引用文本随普通提示词发送)由消费方的 host 包与输入状态机包拥有。

KV Cache 影响

该包package既不组装也不发送提供方请求。

已知限制与暂缓事项

  • 只有全局 source 层:会话 scope 的 source 注册(逐会话遮蔽、类 ScopedLayers 机制)已有设计但未启用;台账记录着触发条件(出现真实的逐会话 source 需求)。
  • SlashCandidate.icon 以文本渲染MenuView 把该字符串原样放进图标位与设计系统图标枚举iconFile 五变体家族)的接入将在该枚举交付后完成。
  • overlay 的 SlotMap 合并归属与 slot 所有权分离conversation.input.overlay 的合并放在本包(唯一副本),而该 slot 的 owner 语义锚点、children 声明、生命周期)留在 ui-conversation依赖方向ui-conversation → ui-slash迫使这一拆分未来依赖关系调整时应重新审视。
  • 菜单组顺序即注册顺序source 之间没有显式排序 seamroster 还是 commandskill技能subagent 时可以接受,业务 source 加入后需重新审视。