description: "dsh Web 客户端的 skill 引用与专属 skill 工具行:/ 触发的 skill source 与 skill 调用卡片。"
English | 中文
dsh-client-ui-skill 让用户通过 / 建议选择或直接键入 /name 来调用 skill(技能)。同一条字面命令可以从 Web 编辑器、TUI 和 ACP(Agent Client Protocol)一致地加载 skill;如果名称与宿主命令相同,它仍会解析为该命令。skill 调用在对话中显示为可展开的 Instructions 卡片;即使已安装的 skill 目录发生变化,卡片落定后的内容仍保持稳定。
在编辑器中输入 / 并从建议中选择 skill,或直接键入 /name;发出的消息携带字面文本,宿主对菜单 pick 与手动键入的 token 以同样方式加载 skill。与宿主命令同名的名称仍解析为命令——裁决在客户端把该行认领走,它根本不会成为提示词。
普通会话的候选来自 skills/list Remote;宿主提供每一个用户可调用的 skill,modelInvocable: false 的条目(即 disable-model-invocation skill,此路径是其唯一入口)会以当前语言把仅限用户标记作为描述前缀带上。结果经 / 菜单共享的名字排序器(ui-primitives 的 rankByName)排名:查询作为不区分大小写的有序子序列匹配 skill 名,前缀命中排最前,同分保持宿主顺序(排名决策)。skills/list 调用失败时会被记录并静默丢弃该菜单组——菜单只显示 pending/ready 状态。
收起的行显示 skill 图标、Skill 标题与请求加载的 skill 名称;运行中的调用带有 transcript(文本记录)的扫光效果,失败时用错误首行替换名称,中断的调用使用警告状态。已结算的行展开为一个尺寸受限的 Instructions 卡片,其中原样呈现持久化的工具输出;可用时还会提供标准轨迹的 Inspect 入口。该行的名称、生命周期与正文只派生自 ui-tool 提供的冻结调用/结果切片,绝不读取当前目录,因此即使已安装的 skill 或其描述发生变化,回放仍保持稳定。
鼠标移入 /name 时,背景覆盖整个引用。点击已知 skill 会在右侧栏打开提供方给出的 SKILL.md 路径,同时保留文本的可编辑性。缓存未就绪时,点击复用该 Session 的目录请求,在完成后按点击时的 Session 地址打开预览。切换预设、重置连接和插件释放会取消待处理的预览;后续点击重新获取当前目录。没有文件路径的 skill 仍可调用,但没有文件预览。
以下页面覆盖输入机制、工具行宿主与宿主侧 skill 工具。
tool.call.toolview slot 的工具调用展示层。skill 工具。用户消息原样到达模型,字面文本 /name 也包含在内。随后宿主的 pre-step 边界(dsh-tool-skill)把规范的 <skill_content> 块——与 skill 工具返回的 renderSkillContent 输出相同——作为注入的指令上下文追加在该步骤各项注入的末尾,最贴近模型的回答。加载是确定性的:模型无需被要求调用 skill 工具就能收到完整正文,目录也会告诉它不要重新加载已内联注入的 skill。
一次调用会把渲染后的 skill 正文作为注入上下文加进该轮次——成本与模型经由工具加载该 skill 相同,只是无条件支付,而非由模型自行裁量。浏览菜单和拉取候选不会增加任何模型 token。
仅追加:注入的消息落在可复用历史前缀之后。该包绝不改写较早的请求 token。
这些限制定义引用与工具行何时回退到通用行为;它们是当前包约束。
运行时不变式: 不发布伴生入口。slash source、locale dictionary 与 keyed toolview 都是由注册表持有的注册项,其释放行为已由 HMR(热模块替换)安全规范证明;它们不发出 Cordis 事件或持有跨插件可变状态。