@deepseek-ai/dsh-client-ui-skill 0.0.1-rc.2 → 0.0.1-rc.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.i18n.yaml CHANGED
@@ -2,5 +2,5 @@
2
2
  # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
3
  # after editing either side, bring the other along and re-record with:
4
4
  # pnpm run verify-translation-pairing --write packages/client/ui-skill/README.md
5
- README.md: f6818ae9f44a7d0a484302fe8e294ee2159890ec
6
- README.zh.md: 4b9d646fe39887e9d655b28c61c11876b55d1111
5
+ README.md: f2e2ec8a3061f2cd8617123013d63fad63abf237
6
+ README.zh.md: 0d450b224a7cddcbaef008c7639075cb9f60ece9
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  English | [中文](README.zh.md)
4
4
 
5
- Skill invocation source, browser half: registers the `/`-trigger `skill` source into `ctx.slash`. Ordinary-session candidates come from the `skill.list` RPC addressed by the per-call `ClientSessionContext` projection's `{sessionId}`, with the host resolving `cwd` from the session header. The host serves every user-invocable skill; a `modelInvocable: false` entry (a `disable-model-invocation` skill, whose only entry point is this path) wears the user-only marker as a description prefix in the active language. Catalog-addressed continuable children resolve no skill candidates locally because the existing skill RPC requires an attached session; viewing their persisted history must not activate them. Catalogs cache per ordinary session with a single-flight fetch; the scope-birth `warm` hook prewarms the session's entry, the forwarded `agent-preset/selected` owner event drops that one session's entry (the catalog belongs to the preset, and a blank session may switch after the warm), and `connection/reset` clears everything. Results filter by `startsWith(query)`.
5
+ Skill invocation source, browser half: registers the `/`-trigger `skill` source into `ctx.inputTriggers`. Ordinary-session candidates come from the `skill.list` RPC addressed by the per-call `ClientSessionContext` projection's `{sessionId}`, with the host resolving `cwd` from the session header. The host serves every user-invocable skill; a `modelInvocable: false` entry (a `disable-model-invocation` skill, whose only entry point is this path) wears the user-only marker as a description prefix in the active language. Catalog-addressed continuable children resolve no skill candidates locally because the existing skill RPC requires an attached session; viewing their persisted history must not activate them. Catalogs cache per ordinary session with a single-flight fetch; the scope-birth `warm` hook prewarms the session's entry, the forwarded `agent-preset/selected` owner event drops that one session's entry (the catalog belongs to the preset, and a blank session may switch after the warm), and `connection/reset` clears everything. Results filter by `startsWith(query)`.
6
6
 
7
7
  A pick lands the literal `/name ` text and the prompt ships the same literal ([slash-pipeline Agent Note](../../../.agents/notes/implemented/architecture/2026-07-25-web-input-machine-and-slash-pipeline.md)) — this source implements no adjudication hooks and no reference codec. Determinism lives host-side: the pre-step gesture boundary (`dsh-tool-skill`) recognizes whitespace-bounded `/name` tokens naming user-invocable skills anywhere in a user message and injects the rendered `<skill_content>` for every entry point, so a menu pick, a hand-typed token, and a TUI/ACP prompt all load the skill the same way. A name shared with a host command still resolves to the command: adjudication claims the line client-side before it ever becomes a prompt — deliberate precedence, matching peer products. The list RPC rides the plugin's root-context connection captured at registration — the source never reads services off a per-call argument; draft chip visuals derive from the `lexicon` scan.
8
8
 
package/README.zh.md CHANGED
@@ -2,17 +2,17 @@
2
2
 
3
3
  [English](README.md) | 中文
4
4
 
5
- skill(技能)调用 source 的浏览器端:把 `/` 触发的 `skill` source 注册进 `ctx.slash`。普通会话的候选来自 `skill.list` RPC,以每次调用的 `ClientSessionContext` 投影中的 `{sessionId}` 寻址,host 从会话 header 解析 `cwd`。宿主提供每一个用户可调用的 skill;`modelInvocable: false` 的条目(即 `disable-model-invocation` skill,此路径是其唯一入口)会以当前语言把仅限用户标记作为描述前缀带上。由目录寻址的可继续 subagent 在客户端解析为没有 skill 候选,因为现有 skill RPC 要求会话已挂载;查看其持久化历史不得激活它。目录按普通会话缓存,拉取走 single-flight;scope 创建时的 `warm` 钩子预热该会话的缓存项,转发的 owner 事件 `agent-preset/selected` 丢弃该会话这一项(目录属于 preset,而空会话可能在预热之后才切换),`connection/reset` 清空全部缓存。结果按 `startsWith(query)` 过滤。
5
+ skill(技能)调用 source 的浏览器端:把 `/` 触发的 `skill` source 注册进 `ctx.inputTriggers`。普通会话的候选来自 `skill.list` RPC,以每次调用的 `ClientSessionContext` 投影中的 `{sessionId}` 寻址,host 从会话 header 解析 `cwd`。宿主提供每一个用户可调用的 skill;`modelInvocable: false` 的条目(即 `disable-model-invocation` skill,此路径是其唯一入口)会以当前语言把仅限用户标记作为描述前缀带上。由目录寻址的可继续 subagent 在客户端解析为没有 skill 候选,因为现有 skill RPC 要求会话已挂载;查看其持久化历史不得激活它。目录按普通会话缓存,拉取走 single-flight;scope 创建时的 `warm` 钩子预热该会话的缓存项,转发的 owner 事件 `agent-preset/selected` 丢弃该会话这一项(目录属于 preset,而空会话可能在预热之后才切换),`connection/reset` 清空全部缓存。结果按 `startsWith(query)` 过滤。
6
6
 
7
- pick 会落下字面文本 `/name `,提示词发出的就是同一段字面文本([slash 流水线 Agent Note](../../../.agents/notes/implemented/architecture/2026-07-25-web-input-machine-and-slash-pipeline.md))——本 source 不实现任何裁决钩子,也没有引用 codec。确定性在宿主侧:pre-step 手势边界(`dsh-tool-skill`)识别用户消息中任意位置、以空白为界、指名用户可调用 skill 的 `/name` token,并为每个入口注入渲染后的 `<skill_content>`,因此菜单 pick、手动键入的 token 与 TUI/ACP(Agent Client Protocol)提示词都以同一种方式加载 skill。与宿主命令同名的名称仍解析为命令:裁决在客户端把该行认领走,它根本不会成为提示词——这是有意的优先级,与同行产品一致。列表 RPC 使用插件注册时捕获的根上下文连接——source 绝不从每次调用的参数上读取服务;草稿 chip 视觉由 `lexicon` 扫描派生。
7
+ pick 会落下字面文本 `/name `,发出的提示词中也是同一段字面文本([slash 流水线 Agent Note](../../../.agents/notes/implemented/architecture/2026-07-25-web-input-machine-and-slash-pipeline.md))——本 source 不实现任何裁决钩子,也没有引用 codec。确定性在宿主侧:pre-step 手势边界(`dsh-tool-skill`)识别用户消息中任意位置、以空白为界、指名用户可调用 skill 的 `/name` token,并为每个入口注入渲染后的 `<skill_content>`,因此菜单 pick、手动键入的 token 与 TUI/ACP(Agent Client Protocol)提示词都以同一种方式加载 skill。与宿主命令同名的名称仍解析为命令:裁决在客户端把该行认领走,它根本不会成为提示词——这是有意的优先级,与同类产品一致。列表 RPC 使用插件注册时捕获的根上下文连接——source 绝不从每次调用的参数上读取服务;草稿 chip 视觉由 `lexicon` 扫描派生。
8
8
 
9
- `skill.list` 失败时 `candidates` 抛出异常,slash 壳层记录日志并折叠为静默的菜单组丢弃——菜单只显示 pending/ready 状态。
9
+ `skill.list` 失败时 `candidates` 抛出异常,slash 壳层记录日志,并静默丢弃该菜单组——菜单只显示 pending/ready 状态。
10
10
 
11
- `/client` 导出表层只有插件主体(`apply`/`inject`);source 对象是注册 effect 的内部实现。
11
+ `/client` 导出接口只有插件主体(`apply`/`inject`);source 对象是注册 effect 的内部实现。
12
12
 
13
13
  ## skill 工具行
14
14
 
15
- 浏览器插件还会把 `skill` wire 名称注册进 `ui-tool` 的 keyed `tool.call.toolview` slot。收起的行以与 Bash 行相同的中性色层级显示 14 像素的 skill 文档与闪光组合图标、`Skill` 标题、分隔符和请求加载的 skill 名称;运行中的调用带有 transcript(文本记录)的扫光效果,失败时用错误首行替换名称,中断调用则使用警告状态。已结算的行以整行作为展开入口,展开后显示一个尺寸受限的 `Instructions` 卡片,其中原样呈现持久化的工具输出;可用时还会提供标准执行轨迹的 `Inspect` 入口。该行的名称、生命周期和正文只派生自 `ui-tool` 提供的冻结 call/result slice,绝不读取当前 skill 目录,因此即使已安装的 skill 或其描述发生变化,回放仍保持稳定。
15
+ 浏览器插件还会把 `skill` wire 名称注册进 `ui-tool` 的 keyed `tool.call.toolview` slot。收起的行以与 Bash 行相同的中性视觉层级显示 14 像素的 skill 文档与闪光组合图标、`Skill` 标题、分隔符和请求加载的 skill 名称;运行中的工具调用带有 transcript(文本记录)的扫光效果,失败时用错误首行替换名称,中断的工具调用则使用警告状态。已结算的行以整行作为展开入口,展开后显示一个尺寸受限的 `Instructions` 卡片,其中原样呈现持久化的工具输出;可用时还会提供标准执行轨迹的 `Inspect` 入口。该行的名称、生命周期和正文只派生自 `ui-tool` 提供的冻结的工具调用/工具结果切片,绝不读取当前 skill 目录,因此即使已安装的 skill 或其描述发生变化,回放仍保持稳定。
16
16
 
17
17
  ## 模型体验
18
18
 
@@ -32,6 +32,6 @@ pick 会落下字面文本 `/name `,提示词发出的就是同一段字面文
32
32
 
33
33
  ## 已知限制与暂缓事项
34
34
 
35
- - **仅含结果的 history 页使用通用行**:键控分派要求配对调用位于运行时窗口内;分页将调用留在窗口外时,结果没有工具身份。这项客户端呈现功能不会为了恢复该身份而扩展 history 协议约定。
35
+ - **仅含工具结果的 history 页使用通用行**:键控分派要求配对的工具调用位于运行时窗口内;分页将工具调用留在窗口外时,工具结果没有工具身份。这项客户端呈现功能不会为了恢复该身份而扩展 history 协议约定。
36
36
  - **文本是唯一依据**:引用是普通的草稿文本;手动键入的相同 token 就是同一个引用,宿主手势边界评判的是发出的文本,而不是菜单交互。chip 视觉由 lexicon 扫描派生;没有 occurrence 身份、位置跟踪,也没有提示词协议上的结构化引用载荷(两者都是台账事项)。
37
37
  - **预热落定之前打开的菜单**:在那次击键下不显示 skill 候选;下一次击键会重新轮询已落定的缓存。
package/lib/client.js CHANGED
@@ -18,23 +18,23 @@ window.__ModuleLoader__.load({
18
18
  document.head.appendChild(tag);
19
19
  }
20
20
  var SkillRow_module_css_default = {
21
- "row": "iWrAna_row",
22
- "chevron": "iWrAna_chevron",
23
- "summary": "iWrAna_summary",
24
- "errorSummary": "iWrAna_errorSummary",
25
- "inspectButton": "iWrAna_inspectButton",
26
- "leading": "iWrAna_leading",
27
- "title": "iWrAna_title",
28
21
  "dsh-skill-row-sweep": "iWrAna_dsh-skill-row-sweep",
29
- "instructionsHeader": "iWrAna_instructionsHeader",
22
+ "instructionsCard": "iWrAna_instructionsCard",
30
23
  "instructions": "iWrAna_instructions",
31
- "visuallyHidden": "iWrAna_visuallyHidden",
32
- "chevronHover": "iWrAna_chevronHover",
33
24
  "separator": "iWrAna_separator",
25
+ "instructionsHeader": "iWrAna_instructionsHeader",
26
+ "inspectButton": "iWrAna_inspectButton",
34
27
  "bodyWrap": "iWrAna_bodyWrap",
35
- "instructionsCard": "iWrAna_instructionsCard",
36
- "card": "iWrAna_card",
37
- "iconIdle": "iWrAna_iconIdle"
28
+ "visuallyHidden": "iWrAna_visuallyHidden",
29
+ "leading": "iWrAna_leading",
30
+ "errorSummary": "iWrAna_errorSummary",
31
+ "row": "iWrAna_row",
32
+ "iconIdle": "iWrAna_iconIdle",
33
+ "chevronHover": "iWrAna_chevronHover",
34
+ "summary": "iWrAna_summary",
35
+ "title": "iWrAna_title",
36
+ "chevron": "iWrAna_chevron",
37
+ "card": "iWrAna_card"
38
38
  };
39
39
  //#endregion
40
40
  //#region lib/types/client/SkillRow.js
@@ -208,7 +208,7 @@ window.__ModuleLoader__.load({
208
208
  //#region lib/types/client/index.js
209
209
  /** Required services: reference source faces plus the tool-row and locale registries. */
210
210
  const inject = [
211
- "slash",
211
+ "inputTriggers",
212
212
  "connection",
213
213
  "sessions",
214
214
  "slots",
@@ -306,11 +306,11 @@ window.__ModuleLoader__.load({
306
306
  return { text: `/${candidate.name} ` };
307
307
  }
308
308
  };
309
- const slash = ctx.get("slash");
309
+ const inputTriggers = ctx.get("inputTriggers");
310
310
  ctx.remote.$on("agent-preset/selected", invalidate);
311
311
  ctx.on("connection/reset", clearAll);
312
312
  ctx.effect(() => {
313
- const unregister = slash.registerSource(source);
313
+ const unregister = inputTriggers.registerSource(source);
314
314
  return () => {
315
315
  unregister();
316
316
  clearAll();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-client-ui-skill",
3
3
  "description": "Web skill references and the dedicated skill tool row",
4
- "version": "0.0.1-rc.2",
4
+ "version": "0.0.1-rc.3",
5
5
  "publishConfig": {
6
6
  "access": "restricted"
7
7
  },
@@ -35,7 +35,7 @@
35
35
  "@deepseek-ai/dsh-client-runtime",
36
36
  "@deepseek-ai/dsh-client-locale",
37
37
  "@deepseek-ai/dsh-client-ui-tool",
38
- "@deepseek-ai/dsh-client-ui-slash",
38
+ "@deepseek-ai/dsh-client-ui-input-trigger",
39
39
  "@deepseek-ai/dsh-api-remotes"
40
40
  ],
41
41
  "platform": "web"
@@ -44,15 +44,15 @@
44
44
  "license": "BSD-3-Clause",
45
45
  "peerDependencies": {
46
46
  "react": "^18.2.0",
47
- "@deepseek-ai/dsh-api-remotes": "^0.0.1-rc.2",
48
- "@deepseek-ai/dsh-client-connection": "^0.0.1-rc.2",
49
- "@deepseek-ai/dsh-client-locale": "^0.0.1-rc.2",
50
- "@deepseek-ai/dsh-client-runtime": "^0.0.1-rc.2",
51
- "@deepseek-ai/dsh-client-ui-tool": "^0.0.1-rc.2",
52
- "@deepseek-ai/dsh-client-ui-primitives": "^0.0.1-rc.2",
53
- "@deepseek-ai/dsh-client-ui-slash": "^0.0.1-rc.2",
54
- "@deepseek-ai/dsh-client-ui-slots": "^0.0.1-rc.2",
55
- "@deepseek-ai/dsh-invariants": "^0.0.1-rc.2",
47
+ "@deepseek-ai/dsh-client-locale": "^0.0.1-rc.3",
48
+ "@deepseek-ai/dsh-api-remotes": "^0.0.1-rc.3",
49
+ "@deepseek-ai/dsh-client-connection": "^0.0.1-rc.3",
50
+ "@deepseek-ai/dsh-client-runtime": "^0.0.1-rc.3",
51
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.0.1-rc.3",
52
+ "@deepseek-ai/dsh-client-ui-input-trigger": "^0.0.1-rc.3",
53
+ "@deepseek-ai/dsh-client-ui-slots": "^0.0.1-rc.3",
54
+ "@deepseek-ai/dsh-client-ui-tool": "^0.0.1-rc.3",
55
+ "@deepseek-ai/dsh-invariants": "^0.0.1-rc.3",
56
56
  "@deepseek-ai/cordis": "^4.0.1-rc.1"
57
57
  },
58
58
  "devDependencies": {
@@ -60,17 +60,17 @@
60
60
  "@types/react": "~18.3.1",
61
61
  "react": "^18.2.0",
62
62
  "react-dom": "^18.2.0",
63
- "@deepseek-ai/dsh-api-remotes": "^0.0.1-rc.2",
64
- "@deepseek-ai/dsh-client-connection": "^0.0.1-rc.2",
65
- "@deepseek-ai/dsh-client-runtime": "^0.0.1-rc.2",
66
- "@deepseek-ai/dsh-client-test-runtime": "^0.0.1-rc.2",
67
- "@deepseek-ai/dsh-client-ui-primitives": "^0.0.1-rc.2",
68
- "@deepseek-ai/dsh-client-ui-slash": "^0.0.1-rc.2",
69
- "@deepseek-ai/dsh-client-ui-slots": "^0.0.1-rc.2",
70
- "@deepseek-ai/dsh-client-locale": "^0.0.1-rc.2",
71
- "@deepseek-ai/dsh-invariants": "^0.0.1-rc.2",
72
- "@deepseek-ai/cordis": "^4.0.1-rc.1",
73
- "@deepseek-ai/dsh-client-ui-tool": "^0.0.1-rc.2"
63
+ "@deepseek-ai/dsh-client-connection": "^0.0.1-rc.3",
64
+ "@deepseek-ai/dsh-api-remotes": "^0.0.1-rc.3",
65
+ "@deepseek-ai/dsh-client-locale": "^0.0.1-rc.3",
66
+ "@deepseek-ai/dsh-client-runtime": "^0.0.1-rc.3",
67
+ "@deepseek-ai/dsh-client-test-runtime": "^0.0.1-rc.3",
68
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.0.1-rc.3",
69
+ "@deepseek-ai/dsh-client-ui-slots": "^0.0.1-rc.3",
70
+ "@deepseek-ai/dsh-client-ui-input-trigger": "^0.0.1-rc.3",
71
+ "@deepseek-ai/dsh-client-ui-tool": "^0.0.1-rc.3",
72
+ "@deepseek-ai/dsh-invariants": "^0.0.1-rc.3",
73
+ "@deepseek-ai/cordis": "^4.0.1-rc.1"
74
74
  },
75
75
  "files": [
76
76
  "lib/index.js",