# Conflicts: # packages/client/ui-chat/src/client/chat/MessageItem.module.css # packages/client/ui-conversation/package.json # packages/client/ui-input-trigger/README.i18n.yaml # packages/client/ui-input-trigger/README.md # packages/client/ui-input-trigger/README.zh.md # packages/client/ui-reference/README.i18n.yaml # packages/client/ui-reference/README.md # packages/client/ui-reference/README.zh.md # pnpm-lock.yaml
5.1 KiB
description, kind
| description | kind |
|---|---|
| Web GUI 的输入触发流水线:光标处的 / 与 @ 检测、分组候选菜单,以及把 pick 路由到已注册 source;供斜杠命令与引用的用户与维护者阅读。 | package-reference |
@deepseek-ai/dsh-client-ui-input-trigger
English | 中文
概述
本包为 Web GUI 提供输入触发流水线:检测光标处键入的 / 与 @,显示分组候选菜单,并把 pick 路由到已注册 source。source 经 ctx.inputTriggers 注册——/ 命令 source(ui-commands)、@ 文件与会话引用 source(ui-reference),以及任何业务包——对话接线层按会话驱动这条流水线。键入触发器会 seed 为该触发器注册的所有 source;chrome launcher 也可以在当前选区上只打开一个 source。流水线仅做呈现:pick 产出命令声明或引用插入,其后果属于消费它们的宿主与输入包。
目录
使用本包
与 ui-conversation 一起挂载本插件;用户在光标处键入触发器时,菜单随即出现在输入浮层中。分组候选项渲染在标题行之下;pick 路由到 source,消费方表面应用其结果——斜杠命令打开其弹窗或执行,引用插入其行内 token。
键盘与鼠标
菜单打开期间 composer 表面保持焦点:行在 mousedown 时完成 pick,高亮由 aria-activedescendant 承载,指针落在菜单与所在 composer 卡片之外即关闭菜单。空格与回车裁决按注册序轮询可选的 matchSpace/matchEnter 钩子;第一个非 undefined 的应答胜出,source 也可以拒绝它无法整体消费的提交。声明 drill: true 的候选行在选定 pick 之外携带第二个动词:行尾的 chevron 与 Tab 键把同一行以 action: 'drill' 送入 onPick(其余路径一律报告 'pick');未声明该标记的行上 Tab 原样放行,原生焦点遍历不受影响。
理解实现
实现细节——点击展开
src/core/ 是纯内核——触发器检测、菜单归约与精确匹配,零 React/DOM/cordis——而 src/client/service.ts 把内核接到菜单快照 store、逐 hit 候选拉取(以 generation 把关、后继请求经 AbortSignal 取代、失败的 source 静默丢弃并留一条 console 记录)与 pick 路径上。每个会话 scope 各解析一个 InputTriggerController(sessionOf);对话接线层在 controller 上驱动 track/arbitrate/onSpace/adjudicate。source 会被预热进它能触达的每个会话 controller;lexicon 名录在预热后变化的 source 实现 subscribeLexicon,controller 每收到通知就重拉。MenuView 自注册进 conversation.input.overlay(列表类,会话 scope),菜单关闭期间渲染 null。overlay 的 SlotMap 合并放在本包,因为依赖方向(ui-conversation → ui-input-trigger)不允许反向的类型导入。
进一步探索
当触发流水线不够用时阅读以下页面。它们从流水线进入注册进它的 source,以及拥有输入的会话外壳。
- ui-commands——把
/命令 source 注册进本流水线并拥有命令弹窗外壳。 - ui-reference——注册
@文件与会话引用 source。 - ui-conversation——声明输入浮层槽位并拥有 composer 与输入状态机。
- Web 客户端架构——浏览器插件行如何加载并注册槽位。
模型体验
无。触发流水线只是浏览器呈现——pick 产出命令声明与引用插入,其模型可见后果由消费它们的宿主与输入状态机包负责。
KV Cache 影响
无;该包既不组装也不发送提供方请求。
已知限制与延期工作
这些限制界定了当前触发流水线。它们是当前包约束,不是通用菜单对比或任务积压。
- 只有全局 source 层——会话 scope 的 source 注册(逐会话遮蔽)已有设计但未启用;台账记录着触发条件,即真实的逐会话 source 需求。
InputTriggerCandidate.icon以文本渲染——MenuView把该字符串原样放进图标位;与设计系统图标枚举的接入将在该枚举交付后完成。- overlay 的 SlotMap 合并归属与槽位所有权分离——唯一的
conversation.input.overlay合并放在本包,而 ui-conversation 拥有其锚点、children 声明与生命周期,因为依赖方向是 ui-conversation → ui-input-trigger。
开发备注
维护者的工作上下文——点击展开
无。