@hpyperry/dsh-ref-lib 0.9.0 → 0.10.0

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.md CHANGED
@@ -13,7 +13,7 @@
13
13
  | 🎨 | **可视化面板** | 基名 + 完整路径列表、用途说明、悬停高亮、危险色移除、独立的空/加载/错误态 |
14
14
  | 📂 | **三种添加方式** | 应用内目录浏览器 / 系统原生选择器(按宿主能力自动适配)/ 手动输入路径(`~` 与相对路径),可附**用途说明**(自动提取 README 标题兜底) |
15
15
  | 🧠 | **上下文注入** | 仅向配置了参考库的会话注入定稿英文规则:库清单(含用途 routing metadata)+ **强制查证流程**(先查参考库,未覆盖才外部)+ 权威性/冲突处理 + 只读约束;空列表零 token |
16
- | 🔒 | **per-session 隔离** | 每个会话独立维护,会话间互不可见;sidecar JSON 持久化,重启/恢复后仍在 |
16
+ | 🔒 | **per-session 隔离** | 每个会话独立维护,会话间互不可见;**分支会话(fork)自动继承父列表**(fork 时刻快照、条目 id 独立);sidecar JSON 持久化,重启/恢复后仍在 |
17
17
  | 📡 | **失效检测** | 每次读取实时探测库目录可用性(删除 / 被替换为文件即标记),失效库自动跳过注入并红色提示(面板状态行 + dock 失效角标 + `/ref-lib list` 标记);UI 同步**交互驱动**(命令完成 / 发消息 / 面板操作即时刷新,零后台请求) |
18
18
  | ⚡ | **静默数据通道** | client 读写走插件自注册的 `/api/ref-lib/*` HTTP 路由——不渲染命令卡片、不执行命令、不产生用户消息 |
19
19
  | 🌐 | **双语界面** | zh/en 全量本地化,随界面语言实时切换 |
@@ -52,7 +52,7 @@ dsh --profile web
52
52
  | 用途说明(note) | 添加时可选填写;未填写时自动提取目录 README 首个 H1 标题兜底(无 README 则为空)。note 作为 routing metadata 注入,帮助 agent 判断库的相关性 |
53
53
  | 目录选择后端 | 启动时自动探测:应用内目录浏览器(browse)或系统原生对话框(native);可在 profile 的 `cordis.patch.yml` 切换 `directory-picker` 行为 |
54
54
  | 上下文注入 | 仅向有参考库的会话注入(`systemPrompt.context`,空列表零 token;注入文本为定稿英文模板) |
55
- | 子会话 | 无自身配置时继承父会话的参考库列表 |
55
+ | 子会话 | 分支会话(fork)创建时**复制继承**父会话的参考库列表(fork 时刻快照、条目 id 独立);legacy 子会话(升级前创建)首次读取时同语义物化 |
56
56
 
57
57
  ## 🛡️ 安全
58
58
 
@@ -1 +1 @@
1
- {"version":3,"file":"RefLibDock.d.ts","sourceRoot":"","sources":["../../src/client/RefLibDock.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAEzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAQ7C,yCAAyC;AACzC,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;IACtD,wDAAwD;IACxD,GAAG,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACzE,8CAA8C;IAC9C,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3D,mDAAmD;IACnD,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1E,mCAAmC;IACnC,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAC3C,kDAAkD;IAClD,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAA;CAClF;AAMD,kDAAkD;AAClD,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC,yBAAyB,CAAC,GAAG,kBAAkB,GAAG,WAAW,CAAC,SAAS,CAAC,CAAA;AAuCnH;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,CAoR/D"}
1
+ {"version":3,"file":"RefLibDock.d.ts","sourceRoot":"","sources":["../../src/client/RefLibDock.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAEzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAS7C,yCAAyC;AACzC,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;IACtD,wDAAwD;IACxD,GAAG,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACzE,8CAA8C;IAC9C,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3D,mDAAmD;IACnD,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1E,mCAAmC;IACnC,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAC3C,kDAAkD;IAClD,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAA;CAClF;AAMD,kDAAkD;AAClD,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC,yBAAyB,CAAC,GAAG,kBAAkB,GAAG,WAAW,CAAC,SAAS,CAAC,CAAA;AAuCnH;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,CAuR/D"}
@@ -20,6 +20,7 @@ import { useEffect, useRef, useState } from 'react';
20
20
  import { IconFolderOpen16 } from '@deepseek-ai/dsh-client-ui-primitives';
21
21
  import { RefLibApiError } from "./data.js";
22
22
  import { RefreshGuard } from "./refresh-guard.js";
23
+ import { deriveRefreshTriggers } from "./refresh-triggers.js";
23
24
  import { RefLibBrowser } from "./RefLibBrowser.js";
24
25
  import { RefLibPanel } from "./RefLibPanel.js";
25
26
  import { ensureRefLibStyles } from "./styles.js";
@@ -170,18 +171,23 @@ export function RefLibDock(props) {
170
171
  void refresh();
171
172
  }
172
173
  }, [open]);
173
- // 发消息即刷新(交互钩子):dock owner 的 `session` 是**响应式会话快照**——用户
174
- // 发消息必然产生 user 消息节点(`kind: 'user'`),计数 +1 触发静默刷新,UI 在
175
- // 发消息后立即同步;流式 assistant 回复不改变 user 计数,不会每 token 刷新。
176
- const userMessageCount = session.nodes.filter((node) => node.kind === 'user').length;
174
+ // 发消息即刷新(交互钩子):dock owner 的 `session` 是**响应式会话快照**
175
+ // (ConversationRoot `useSession(s => s)`,每次会话 store 发布重渲染)——用户
176
+ // 发消息落盘后产生 user 消息节点(`kind: 'user'`),计数 +1 触发静默刷新;
177
+ // 流式 assistant 回复不改变 user 计数,不会每 token 刷新。
178
+ // 信号盲区(rc.7 查证,见 refresh-triggers.ts 与设计文档 §16):steer 打断消息
179
+ // 折叠为 'steering' 节点不触发;忙碌期排队消息的 user 节点在 step 领取时才落盘
180
+ // (刷新延迟);外部文件操作无会话事件(下次 GUI 交互同步)。
181
+ const { userMessageCount, refLibCommandDone } = deriveRefreshTriggers(session.nodes);
177
182
  useEffect(() => {
178
183
  void refresh(true);
179
184
  }, [userMessageCount]);
180
- // 命令执行即刷新:`/ref-lib` 命令(add/remove/note)执行必然产生
185
+ // 命令执行即刷新:`/ref-lib` 命令(add/remove/note)执行必然产生 log-only
181
186
  // `command/run` → `command/done`,会话快照中的 command 节点从 running
182
- // (outcome null)变为 settled——settled 计数 +1 触发静默刷新,命令执行后
183
- // UI 立即同步。与 userMessageCount 同模式(组件内响应式)。
184
- const refLibCommandDone = session.nodes.filter((node) => node.kind === 'command' && node.name === 'ref-lib' && node.outcome !== null).length;
187
+ // (outcome null)变为 settled——settled 计数 +1 触发静默刷新(命令 handler 先
188
+ // 落盘 sidecar 再结算,故刷新读到的必是新数据)。与其他插件命令隔离:命令名是
189
+ // typed name(无别名、重名注册 fail loud),`name === 'ref-lib'` 过滤精确。
190
+ // 盲区:command/run 落在窗口外(压缩/截断)时 name 为 null,本次完成不刷新。
185
191
  useEffect(() => {
186
192
  void refresh(true);
187
193
  }, [refLibCommandDone]);
@@ -1 +1 @@
1
- {"version":3,"file":"RefLibDock.js","sourceRoot":"","sources":["../../src/client/RefLibDock.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RefLibDock.js","sourceRoot":"","sources":["../../src/client/RefLibDock.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * 会话快照 → UI 刷新触发信号的纯函数派生(v9 交互驱动同步的信号源)。
3
+ *
4
+ * 交互驱动刷新依赖两个「从会话快照节点派生」的信号(RefLibDock 内两个 effect 的
5
+ * 依赖项):
6
+ * - `userMessageCount`:`kind: 'user'` 节点计数——普通人类消息落盘后 +1,
7
+ * 驱动「发消息即刷新」;
8
+ * - `refLibCommandDone`:`kind: 'command'` 且 `name === 'ref-lib'` 且已结算
9
+ * (`outcome !== null`)的节点计数——`/ref-lib` 命令完成后 +1,驱动「命令执行
10
+ * 即刷新」。
11
+ *
12
+ * 派生依据已在 deepseek-harness @ dsh-v0.1.0-rc.7 源码逐条查证(设计文档 §16):
13
+ * - dock 槽位 owner 的 `session` 是响应式会话快照:ConversationRoot 经
14
+ * `useSession(s => s)` 订阅会话 store,每次发布都重渲染 dock(
15
+ * `ui-conversation/src/client/skeleton/ConversationRoot.tsx`);
16
+ * - `user/message`(`source.kind === 'user'` 且未被收件箱认领)折叠为
17
+ * `kind: 'user'` 节点;goal 轮次等插件注入为 `kind: 'context'`(source 非 user),
18
+ * steer 消息为 `kind: 'steering'`——后两者不增本计数
19
+ * (`ui-conversation/src/client/conversation-nodes/message.ts`);
20
+ * - 宿主命令执行器对每个匹配命令 append log-only `command/run` → `command/done`
21
+ * 对(运行中 `outcome` 为 null,结算后置值);命令名是 typed name(无别名机制、
22
+ * 重名注册 fail loud),故 `name === 'ref-lib'` 过滤精确
23
+ * (`interaction/commands/src/index.ts` + `conversation-nodes/command.ts`)。
24
+ *
25
+ * 已知信号盲区(设计取舍,见设计文档 §14/§16):
26
+ * - steer 打断消息永不产生 `'user'` 节点 → 不触发发消息刷新(无状态变更,可接受);
27
+ * - 忙碌期排队消息的 `user/message` 在 step 领取时才落盘 → 计数延迟至消息进入步骤;
28
+ * - `command/run` 落在窗口外(压缩/截断)时节点 `name` 为 null → 不增
29
+ * `refLibCommandDone`(罕见边界);
30
+ * - 窗口长度变化(loadOlder/压缩/补拉)会增减计数 → 额外静默刷新(RefreshGuard 吸收)。
31
+ *
32
+ * 单次遍历同时派生两个计数(避免每次渲染两趟全量 filter)。
33
+ * @module @hpyperry/dsh-ref-lib/src/client/refresh-triggers
34
+ */
35
+ import type { ConversationNode } from '@deepseek-ai/dsh-client-runtime/client';
36
+ /** 一次快照派生的刷新触发计数(RefLibDock 两个 effect 的依赖值)。 */
37
+ export interface RefreshTriggerCounts {
38
+ /** `kind: 'user'` 节点数(普通人类消息;steer/context 不计)。 */
39
+ readonly userMessageCount: number;
40
+ /** 已结算(outcome 非 null)的 `ref-lib` 命令节点数;运行中不计。 */
41
+ readonly refLibCommandDone: number;
42
+ }
43
+ /**
44
+ * 从会话快照节点列表派生刷新触发计数。
45
+ * @param nodes - `session.nodes`(窗口内全部会话节点,结构子集即可)。
46
+ * @returns 两个计数;空列表返回 `{ userMessageCount: 0, refLibCommandDone: 0 }`。
47
+ */
48
+ export declare function deriveRefreshTriggers(nodes: readonly ConversationNode[]): RefreshTriggerCounts;
49
+ //# sourceMappingURL=refresh-triggers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-triggers.d.ts","sourceRoot":"","sources":["../../src/client/refresh-triggers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AAE9E,gDAAgD;AAChD,MAAM,WAAW,oBAAoB;IACnC,mDAAmD;IACnD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,kDAAkD;IAClD,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;CACnC;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,GAAG,oBAAoB,CAW9F"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * 会话快照 → UI 刷新触发信号的纯函数派生(v9 交互驱动同步的信号源)。
3
+ *
4
+ * 交互驱动刷新依赖两个「从会话快照节点派生」的信号(RefLibDock 内两个 effect 的
5
+ * 依赖项):
6
+ * - `userMessageCount`:`kind: 'user'` 节点计数——普通人类消息落盘后 +1,
7
+ * 驱动「发消息即刷新」;
8
+ * - `refLibCommandDone`:`kind: 'command'` 且 `name === 'ref-lib'` 且已结算
9
+ * (`outcome !== null`)的节点计数——`/ref-lib` 命令完成后 +1,驱动「命令执行
10
+ * 即刷新」。
11
+ *
12
+ * 派生依据已在 deepseek-harness @ dsh-v0.1.0-rc.7 源码逐条查证(设计文档 §16):
13
+ * - dock 槽位 owner 的 `session` 是响应式会话快照:ConversationRoot 经
14
+ * `useSession(s => s)` 订阅会话 store,每次发布都重渲染 dock(
15
+ * `ui-conversation/src/client/skeleton/ConversationRoot.tsx`);
16
+ * - `user/message`(`source.kind === 'user'` 且未被收件箱认领)折叠为
17
+ * `kind: 'user'` 节点;goal 轮次等插件注入为 `kind: 'context'`(source 非 user),
18
+ * steer 消息为 `kind: 'steering'`——后两者不增本计数
19
+ * (`ui-conversation/src/client/conversation-nodes/message.ts`);
20
+ * - 宿主命令执行器对每个匹配命令 append log-only `command/run` → `command/done`
21
+ * 对(运行中 `outcome` 为 null,结算后置值);命令名是 typed name(无别名机制、
22
+ * 重名注册 fail loud),故 `name === 'ref-lib'` 过滤精确
23
+ * (`interaction/commands/src/index.ts` + `conversation-nodes/command.ts`)。
24
+ *
25
+ * 已知信号盲区(设计取舍,见设计文档 §14/§16):
26
+ * - steer 打断消息永不产生 `'user'` 节点 → 不触发发消息刷新(无状态变更,可接受);
27
+ * - 忙碌期排队消息的 `user/message` 在 step 领取时才落盘 → 计数延迟至消息进入步骤;
28
+ * - `command/run` 落在窗口外(压缩/截断)时节点 `name` 为 null → 不增
29
+ * `refLibCommandDone`(罕见边界);
30
+ * - 窗口长度变化(loadOlder/压缩/补拉)会增减计数 → 额外静默刷新(RefreshGuard 吸收)。
31
+ *
32
+ * 单次遍历同时派生两个计数(避免每次渲染两趟全量 filter)。
33
+ * @module @hpyperry/dsh-ref-lib/src/client/refresh-triggers
34
+ */
35
+ /**
36
+ * 从会话快照节点列表派生刷新触发计数。
37
+ * @param nodes - `session.nodes`(窗口内全部会话节点,结构子集即可)。
38
+ * @returns 两个计数;空列表返回 `{ userMessageCount: 0, refLibCommandDone: 0 }`。
39
+ */
40
+ export function deriveRefreshTriggers(nodes) {
41
+ let userMessageCount = 0;
42
+ let refLibCommandDone = 0;
43
+ for (const node of nodes) {
44
+ if (node.kind === 'user') {
45
+ userMessageCount += 1;
46
+ }
47
+ else if (node.kind === 'command' && node.name === 'ref-lib' && node.outcome !== null) {
48
+ refLibCommandDone += 1;
49
+ }
50
+ }
51
+ return { userMessageCount, refLibCommandDone };
52
+ }
53
+ //# sourceMappingURL=refresh-triggers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-triggers.js","sourceRoot":"","sources":["../../src/client/refresh-triggers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAYH;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAkC;IACtE,IAAI,gBAAgB,GAAG,CAAC,CAAA;IACxB,IAAI,iBAAiB,GAAG,CAAC,CAAA;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,gBAAgB,IAAI,CAAC,CAAA;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACvF,iBAAiB,IAAI,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,CAAA;AAChD,CAAC"}
package/lib/client.js CHANGED
@@ -965,6 +965,23 @@ window.__ModuleLoader__.load({
965
965
  }
966
966
  };
967
967
  //#endregion
968
+ //#region src/client/refresh-triggers.ts
969
+ /**
970
+ * 从会话快照节点列表派生刷新触发计数。
971
+ * @param nodes - `session.nodes`(窗口内全部会话节点,结构子集即可)。
972
+ * @returns 两个计数;空列表返回 `{ userMessageCount: 0, refLibCommandDone: 0 }`。
973
+ */
974
+ function deriveRefreshTriggers(nodes) {
975
+ let userMessageCount = 0;
976
+ let refLibCommandDone = 0;
977
+ for (const node of nodes) if (node.kind === "user") userMessageCount += 1;
978
+ else if (node.kind === "command" && node.name === "ref-lib" && node.outcome !== null) refLibCommandDone += 1;
979
+ return {
980
+ userMessageCount,
981
+ refLibCommandDone
982
+ };
983
+ }
984
+ //#endregion
968
985
  //#region src/client/RefLibBrowser.tsx
969
986
  /**
970
987
  * 应用内目录浏览器(browse 后端可用时,「选择目录」的落地实现)。
@@ -1662,11 +1679,10 @@ window.__ModuleLoader__.load({
1662
1679
  refresh();
1663
1680
  }
1664
1681
  }, [open]);
1665
- const userMessageCount = session.nodes.filter((node) => node.kind === "user").length;
1682
+ const { userMessageCount, refLibCommandDone } = deriveRefreshTriggers(session.nodes);
1666
1683
  (0, react.useEffect)(() => {
1667
1684
  refresh(true);
1668
1685
  }, [userMessageCount]);
1669
- const refLibCommandDone = session.nodes.filter((node) => node.kind === "command" && node.name === "ref-lib" && node.outcome !== null).length;
1670
1686
  (0, react.useEffect)(() => {
1671
1687
  refresh(true);
1672
1688
  }, [refLibCommandDone]);
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["useState","IconLoadingOutline16","IconWarningOutline16","IconCheckOutline16","IconCopyOutline16","useState","useRef","Modal","IconWarningOutline16","IconChevronRightOutline14","IconEditOutline16","IconLoadingOutline16","IconFolderOpen16","IconFolderClose16","Button","useState","Modal","IconWarningOutline16","IconLoadingOutline16","IconFolderOpen16","Tooltip","IconEllipsisOutline16","IconTrashOutline16","Button","Input","IconSearchOutline16","IconPlusOutline16","useState","useRef","IconFolderOpen16"],"sources":["../src/validate.ts","../src/client/data.ts","../src/client/styles.ts","../src/client/RefLibCommandCard.tsx","../src/client/refresh-guard.ts","../src/client/RefLibBrowser.tsx","../src/client/RefLibPanel.tsx","../src/client/RefLibDock.tsx","../src/client/locales.ts","../src/client/index.ts"],"sourcesContent":["/**\n * 跨 node/client 共享的**零依赖**校验与消毒纯函数。\n *\n * node half(service/logic/render)与 client half(client/data.ts)分属两个构建\n * 产物,无法共享带 node 依赖的模块;本模块只依赖类型(spec.ts,type-only 导入\n * 在打包时被擦除),两半均可直接引用——消除 `isRefLibEntry` 在 logic.ts 与\n * client/data.ts 中的逐字重复,控制字符集合也在此统一维护。\n * @module @hpyperry/dsh-ref-lib/src/validate\n */\n\nimport type { RefLibEntry } from './spec.ts'\n\n/**\n * 不可见控制字符集合(提示词注入卫生):\n * C0(\\u0000-\\u001f)、DEL(\\u007f)、C1(\\u0080-\\u009f)、行/段分隔符\n * (\\u2028/\\u2029——旧实现遗漏,同样能破坏注入格式)。\n * 用于 add 拒绝(service.ts)与渲染层兜底消毒(render.ts)。\n */\nconst CONTROL_CHARACTERS = /[\\u0000-\\u001f\\u007f-\\u009f\\u2028\\u2029]/\nconst CONTROL_CHARACTERS_GLOBAL = /[\\u0000-\\u001f\\u007f-\\u009f\\u2028\\u2029]/g\n\n/** 文本是否含不可见控制字符。 */\nexport function hasControlCharacters(text: string): boolean {\n return CONTROL_CHARACTERS.test(text)\n}\n\n/** 把全部不可见控制字符替换为 U+FFFD(路径/备注最终会进入系统提示词,兜底消毒)。 */\nexport function sanitizeControlCharacters(text: string): string {\n return text.replace(CONTROL_CHARACTERS_GLOBAL, '\\uFFFD')\n}\n\n/** 可用性字面量集合(status 字段合法值)。 */\nconst AVAILABILITY_VALUES = new Set(['available', 'missing', 'not-directory'])\n\n/** 校验一个未知对象是否为合法条目(宽松:id/path 必填字符串,note/status/checkedAt 可选且类型正确)。 */\nexport function isRefLibEntry(value: unknown): value is RefLibEntry {\n if (typeof value !== 'object' || value === null) return false\n const { id, path, note, status, checkedAt } = value as {\n id?: unknown\n path?: unknown\n note?: unknown\n status?: unknown\n checkedAt?: unknown\n }\n if (typeof id !== 'string' || typeof path !== 'string') return false\n if (note !== undefined && typeof note !== 'string') return false\n if (status !== undefined && (typeof status !== 'string' || !AVAILABILITY_VALUES.has(status))) return false\n if (checkedAt !== undefined && (typeof checkedAt !== 'number' || !Number.isFinite(checkedAt))) return false\n return true\n}\n","/**\n * client 端数据纯函数:/api/ref-lib/* 路由响应解析、错误码解析与路径展示。\n * 独立于 React / runtime,便于单元测试。\n *\n * v5:路由错误响应新增 wire code(ref-lib/missing 等),client 据此把\n * node 端的中文错误消息映射为当前语言的本地化文案(优化点 2 的语言适配)。\n * @module @hpyperry/dsh-ref-lib/src/client/data\n */\n\nimport type { RefLibEntry } from '../spec.ts'\nimport { isRefLibEntry } from '../validate.ts'\n\n/** 路由错误载荷里的附加字段。 */\nexport interface RefLibApiErrorDetails {\n /** 出错的目录路径(missing/not-directory/unsafe)。 */\n readonly path?: string\n /** 未找到的条目 id(unknown-id)。 */\n readonly id?: string\n}\n\n/** 带 wire code 的 API 错误:code 用于本地化文案映射,message 为原始消息兜底。 */\nexport class RefLibApiError extends Error {\n /**\n * @param code - wire 错误码(如 ref-lib/missing)。\n * @param message - 服务端原始错误消息。\n * @param details - 附加字段(path/id)。\n */\n constructor(\n readonly code: string,\n message: string,\n readonly details: RefLibApiErrorDetails = {},\n ) {\n super(message)\n this.name = 'RefLibApiError'\n }\n}\n\n/**\n * 从失败的 /api/ref-lib/* 响应体解析错误码;无 code 的畸形体返回 null。\n * @param value - 非 2xx 响应体(可为任意 JSON)。\n * @returns 错误码 + 原始消息 + 附加字段;无法解析时为 null。\n */\nexport function parseApiErrorPayload(value: unknown): {\n code: string\n message: string\n details: RefLibApiErrorDetails\n} | null {\n if (typeof value !== 'object' || value === null) return null\n const { error, code, path, id } = value as {\n error?: unknown\n code?: unknown\n path?: unknown\n id?: unknown\n }\n if (typeof code !== 'string' || code === '') return null\n const details: RefLibApiErrorDetails = {\n ...(typeof path === 'string' ? { path } : {}),\n ...(typeof id === 'string' ? { id } : {}),\n }\n return { code, message: typeof error === 'string' ? error : code, details }\n}\n\n/**\n * 从 /api/ref-lib/list 路由响应({ libs: [...] })解析参考库列表;\n * 缺失/畸形返回空列表。\n * @param value - 路由响应体。\n * @returns 当前参考库列表。\n */\nexport function parseLibsPayload(value: unknown): RefLibEntry[] {\n if (typeof value !== 'object' || value === null) return []\n const libs = (value as { libs?: unknown }).libs\n if (!Array.isArray(libs)) return []\n return libs.filter(isRefLibEntry)\n}\n\n/**\n * 提取目录路径的展示用基名(列表行主行的可读标题)。\n * 兼容 POSIX 与 Windows 分隔符;去掉尾部分隔符后取最后一段;\n * 根路径(/、C:\\)原样返回。\n * @param path - 规范化绝对路径。\n * @returns 基名(如 /a/b/core → core)。\n */\nexport function libBasename(path: string): string {\n const trimmed = path.replace(/[\\\\/]+$/, '')\n if (trimmed === '') return path\n // Windows 盘符根(C:)不是基名,原样返回带分隔符的根路径(C:\\\\)。\n if (/^[A-Za-z]:$/.test(trimmed)) return path\n const idx = Math.max(trimmed.lastIndexOf('/'), trimmed.lastIndexOf('\\\\'))\n return idx === -1 ? trimmed : trimmed.slice(idx + 1)\n}\n","/**\n * ref-lib client 样式注入:在文档头挂一张本插件专属的 <style data-plugin> 标签。\n *\n * 为什么不用 CSS Modules:ref-lib 的 tsdown 配置未移植 core 的 lightningcss\n * CSS-Modules 插件(避免新增 native 依赖与构建面),而内联 style 无法表达\n * hover/媒体查询/动画。因此采用运行时注入单张样式表——与 loader 的清理契约\n * 兼容(`data-plugin` 标签在插件卸载/HMR 时由 loader 移除,重新物化时本模块\n * 重新注入,幂等)。类名统一 `reflib-` 前缀防碰撞;颜色/字号/圆角全部走\n * `--dsw-*` 设计令牌,随主题(浅色/深色)自动适配——这是\"字体显示不一致、\n * 没有设计感\"的根因修复之一(旧实现硬编码 #d33 等,不随主题变化)。\n * @module @hpyperry/dsh-ref-lib/src/client/styles\n */\n\n/** 插件 id(与 package.json 的 bundle 手递一致,loader 按它清理样式)。 */\nconst PLUGIN_ID = '@hpyperry/dsh-ref-lib'\n/** 样式标签稳定 id(幂等注入的判据)。 */\nconst STYLE_TAG_ID = '@hpyperry/dsh-ref-lib/styles'\n\nconst CSS = `\n/* ── 输入卡正上方的入口胶囊行(dock)──\n 独立一行,横跨整个 composer 列;chip 与输入卡左缘对齐——用官方设计令牌\n (--dsh-composer-side-clearance / --dsh-composer-card-max-width)纯 CSS 计算,\n 零 JS 测量(v7 起取消 hero 相位测量/绝对定位);hero 与 active 一致,\n plan/model 等工具行座位的启停不影响本行位置。 */\n.reflib-dock {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n min-width: 0;\n /* 镜像输入卡居中:chip 落在输入卡左缘之上(宽视口 = 居中余量,窄视口 = clearance) */\n padding-left: max(\n var(--dsh-composer-side-clearance, 16px),\n calc((100% - var(--dsh-composer-card-max-width, 100%)) / 2)\n );\n}\n\n.reflib-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n max-width: 100%;\n height: 30px;\n padding: 0 10px 0 8px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 15px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n line-height: 18px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 120ms ease, border-color 120ms ease;\n}\n\n.reflib-chip:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.reflib-chip:active {\n background: var(--dsw-alias-interactive-bg-active);\n}\n\n.reflib-chip[data-active='true'] {\n background: var(--dsw-alias-interactive-bg-hover);\n border-color: var(--dsw-alias-border-l2);\n color: var(--dsw-alias-label-primary);\n}\n\n.reflib-chipIcon {\n display: inline-flex;\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.reflib-chipLabel {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.reflib-chipBadge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 9px;\n background: var(--dsw-alias-state-business-tertiary);\n color: var(--dsw-alias-label-primary-bluish);\n font-size: 11px;\n line-height: 18px;\n font-weight: 500;\n}\n\n/* 失效条目计数角标(v9):红色系,与普通数量徽标区分。 */\n.reflib-chipWarn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 9px;\n background: var(--dsw-alias-state-error-primary);\n color: #fff;\n font-size: 11px;\n line-height: 18px;\n font-weight: 500;\n}\n\n/* ── 应用内目录浏览器(browse 后端)── */\n.reflib-browser {\n width: min(460px, 100%);\n}\n\n.reflib-browserPath {\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n height: 32px;\n padding: 0 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-1);\n}\n\n.reflib-browserCrumbs {\n display: flex;\n flex: 1;\n align-items: center;\n min-width: 0;\n overflow-x: auto;\n white-space: nowrap;\n scrollbar-width: none;\n}\n\n.reflib-browserCrumbs::-webkit-scrollbar {\n display: none;\n}\n\n.reflib-browserCrumb {\n display: inline-flex;\n align-items: center;\n flex: none;\n}\n\n.reflib-browserCrumbChevron {\n flex: none;\n color: var(--dsw-alias-label-caption);\n}\n\n.reflib-browserCrumbBtn {\n display: inline-flex;\n align-items: center;\n max-width: 160px;\n padding: 2px 6px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n line-height: 18px;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n}\n\n.reflib-browserCrumbBtn:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.reflib-browserCrumbBtn:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n.reflib-browserEdit {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: 24px;\n height: 24px;\n padding: 0;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n.reflib-browserEdit:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.reflib-browserEdit:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n.reflib-browserInput {\n flex: 1;\n min-width: 0;\n border: none;\n outline: none;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font-size: 12px;\n line-height: 18px;\n}\n\n.reflib-browserInput::placeholder {\n color: var(--dsw-alias-label-dimmed);\n}\n\n.reflib-browserList {\n display: flex;\n flex-direction: column;\n gap: 2px;\n max-height: 264px;\n min-height: 60px;\n overflow-y: auto;\n margin: 0 -8px;\n padding: 0 8px;\n}\n\n.reflib-browserRow {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n padding: 7px 8px;\n border: none;\n border-radius: 8px;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n line-height: 18px;\n cursor: pointer;\n text-align: left;\n}\n\n.reflib-browserRow:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.reflib-browserRow:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n.reflib-browserRowIcon {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.reflib-browserRowName {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.reflib-browserFooter {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n min-width: 0;\n}\n\n/* ── 管理面板 ── */\n.reflib-panel {\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-width: 0;\n}\n\n/* 列表:固定最大高度 + 内滚动(旧实现整个面板滚动、无设计,此处分层) */\n.reflib-list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n max-height: 264px;\n min-height: 0;\n overflow-y: auto;\n margin: 0 -8px;\n padding: 0 8px;\n}\n\n.reflib-listItem {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.reflib-row {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n padding: 7px 8px;\n border-radius: 10px;\n background: transparent;\n transition: background-color 120ms ease;\n}\n\n.reflib-row:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.reflib-listItem[data-removing='true'] {\n opacity: 0.55;\n pointer-events: none;\n}\n\n.reflib-rowIcon {\n display: inline-flex;\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n/* 失效条目行图标(v9):警示色。 */\n.reflib-rowIconWarn {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.reflib-rowBody {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: 1px;\n min-width: 0;\n}\n\n.reflib-rowName {\n overflow: hidden;\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n line-height: 18px;\n font-weight: 500;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.reflib-rowPath {\n overflow: hidden;\n color: var(--dsw-alias-label-tertiary);\n font-family: var(--ds-font-family-code);\n font-size: 11px;\n line-height: 16px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* 列表行用途说明(Description,v8):单行截断,与路径同属次行层级 */\n.reflib-rowNote {\n overflow: hidden;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n line-height: 16px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* 失效条目状态行(v9):红色警示文案,位于路径之下 */\n.reflib-rowStatus {\n overflow: hidden;\n color: var(--dsw-alias-state-error-primary);\n font-size: 12px;\n line-height: 16px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.reflib-rowRemove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n border-radius: 8px;\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n transition: background-color 120ms ease, color 120ms ease;\n}\n\n.reflib-rowRemove:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover-danger);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.reflib-rowRemove:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n/* 详情/编辑入口按钮(与移除同尺寸,非危险 hover) */\n.reflib-rowAction {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n border-radius: 8px;\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n transition: background-color 120ms ease, color 120ms ease;\n}\n\n.reflib-rowAction:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.reflib-rowAction:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n/* 条目详情展开区(ID / 路径 / 用途编辑) */\n.reflib-detail {\n display: flex;\n flex-direction: column;\n gap: 5px;\n margin: 2px 0 6px;\n padding: 8px 10px 10px;\n border-radius: 10px;\n background: var(--dsw-alias-surface-inset, var(--dsw-alias-surface-raised));\n min-width: 0;\n}\n\n.reflib-detailMeta {\n display: flex;\n align-items: baseline;\n gap: 8px;\n min-width: 0;\n}\n\n.reflib-detailKey {\n flex: none;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-caption);\n}\n\n.reflib-detailValue {\n overflow: hidden;\n min-width: 0;\n font-size: 12px;\n line-height: 16px;\n color: var(--dsw-alias-label-secondary);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.reflib-detailActions {\n display: flex;\n justify-content: flex-end;\n gap: 6px;\n margin-top: 2px;\n}\n\n/* 用途说明多行输入(添加表单 + 详情编辑共用) */\n.reflib-noteWrap {\n position: relative;\n display: flex;\n min-width: 0;\n}\n\n.reflib-noteTextarea {\n width: 100%;\n box-sizing: border-box;\n padding: 6px 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n background: var(--dsw-alias-surface-field);\n color: var(--dsw-alias-label-primary);\n font: inherit;\n font-size: 13px;\n line-height: 18px;\n resize: vertical;\n min-height: 40px;\n}\n\n.reflib-noteTextarea:focus {\n outline: 2px solid var(--dsw-alias-focus-ring, var(--dsw-alias-state-info-primary));\n outline-offset: -1px;\n}\n\n.reflib-noteTextarea:disabled {\n opacity: 0.5;\n}\n\n.reflib-noteCount {\n position: absolute;\n right: 8px;\n bottom: 6px;\n padding: 0 4px;\n border-radius: 4px;\n background: var(--dsw-alias-surface-field);\n font-size: 10px;\n line-height: 14px;\n color: var(--dsw-alias-label-caption);\n pointer-events: none;\n}\n\n/* 空态 / 加载态 / 错误态 */\n.reflib-status {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 22px 8px;\n color: var(--dsw-alias-label-caption);\n text-align: center;\n}\n\n.reflib-statusIcon {\n display: inline-flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.reflib-statusText {\n font-size: 13px;\n line-height: 18px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n.reflib-statusHint {\n max-width: 260px;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-caption);\n}\n\n.reflib-error {\n display: flex;\n align-items: flex-start;\n gap: 6px;\n padding: 6px 10px;\n border-radius: 8px;\n background: var(--dsw-alias-interactive-bg-hover-danger);\n color: var(--dsw-alias-state-error-primary);\n font-size: 12px;\n line-height: 18px;\n word-break: break-word;\n}\n\n.reflib-errorIcon {\n display: inline-flex;\n flex: none;\n margin-top: 1px;\n}\n\n.reflib-spin {\n animation: reflib-spin 800ms linear infinite;\n}\n\n@keyframes reflib-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n.reflib-divider {\n height: 1px;\n margin: 2px 0;\n background: var(--dsw-alias-border-l2);\n}\n\n/* ── 管理面板 Modal(v8 优化)──\n 宽度放宽到约 1/3 屏(上限 560px);进入动画为柔和缓出(easeOutQuint 风格:\n 280ms 浮起 + 淡入,位移 12px→0、scale 0.96→1),无回弹——更从容、高级感。 */\n.reflib-modal {\n width: min(33vw, 560px);\n animation: reflib-pop 280ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n@keyframes reflib-pop {\n 0% {\n opacity: 0;\n transform: scale(0.96) translateY(12px);\n }\n 100% {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n/* ── 添加表单 ──\n 统一表单(v8 UI 重构):路径(可输入 / 浏览填充)+ 用途(可选)同一容器,\n 同一「添加」按钮提交——用途与路径强关联,浏览不再直接添加。 */\n.reflib-add {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n}\n\n.reflib-addLabel {\n font-size: 12px;\n line-height: 16px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n.reflib-addRow {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n.reflib-addInputWrap {\n flex: 1 1 180px;\n min-width: 0;\n}\n\n/* 输入字体与面板一致(13px,同列表行名),placeholder 不再比整体大;\n 文案已缩短保证完整显示 */\n.reflib-addInputWrap > input {\n width: 100%;\n box-sizing: border-box;\n font-size: 13px;\n line-height: 18px;\n}\n\n/* 全宽「添加」主按钮 */\n.reflib-addSubmit {\n width: 100%;\n}\n\n.reflib-addHint {\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-caption);\n}\n\n/* ── /ref-lib 命令结果卡片(conversation.chat.commandview)── */\n.reflib-cmd {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n}\n\n.reflib-cmdHead {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n.reflib-cmdHeadIcon {\n flex: none;\n}\n\n.reflib-cmdName {\n flex: none;\n color: var(--dsw-alias-label-primary);\n font-size: 14px;\n line-height: 20px;\n font-weight: 500;\n}\n\n/* 摘要行 = 结果首行;过长单行省略(完整结果见下方 body) */\n.reflib-cmdSummary {\n min-width: 0;\n flex: 1 1 auto;\n overflow: hidden;\n color: var(--dsw-alias-label-tertiary);\n font-size: 13px;\n line-height: 20px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.reflib-cmdSummary[data-error] {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.reflib-cmdCopy {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n line-height: 18px;\n cursor: pointer;\n}\n\n.reflib-cmdCopy:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n/* 完整结果:默认全展开(无 max-height 截断),超宽自动换行 */\n.reflib-cmdBody {\n margin: 0;\n padding: 10px 14px;\n overflow: auto;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 10px;\n background: var(--dsw-alias-markdown-code-block);\n color: var(--dsw-alias-label-primary);\n font: var(--dsw-font-markdown-code-block-small);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.reflib-cmdBody[data-error] {\n color: var(--dsw-alias-state-error-primary);\n}\n\n/* 窄视口:路径行换行,输入框占满一行 */\n@media (max-width: 440px) {\n .reflib-addRow {\n flex-wrap: wrap;\n }\n\n .reflib-addInputWrap {\n flex: 1 1 100%;\n }\n\n .reflib-addRow > button:last-child {\n margin-left: auto;\n }\n}\n`\n\n/** 注入/确保样式表存在(幂等;HMR 重执行时旧标签已被 loader 移除,重新注入)。 */\nexport function ensureRefLibStyles(): void {\n if (typeof document === 'undefined') return\n if (document.querySelector('style[data-plugin-css=\"' + STYLE_TAG_ID + '\"]') !== null) return\n const tag = document.createElement('style')\n tag.dataset.plugin = PLUGIN_ID\n tag.dataset.pluginCss = STYLE_TAG_ID\n tag.textContent = CSS\n document.head.appendChild(tag)\n}\n","/**\n * `/ref-lib` 命令结果专属卡片(conversation.chat.commandview,key='ref-lib')。\n *\n * 背景(历史 bug):官方 `GenericCommandCard` 对命令结果折叠态 `white-space:\n * nowrap` + `text-overflow: ellipsis` 单行截断,展开态 `max-height: 260px` 内滚动\n * ——`/ref-lib list` 等多行长结果会显示不全。本卡片注册在\n * `conversation.chat.commandview`(keyed,按命令名分派)的 `ref-lib` 键上:\n * **默认全展开展示完整结果**(无高度上限)+ 一键复制按钮。只影响 `/ref-lib`,\n * 其他命令仍走官方卡片。\n * @module @hpyperry/dsh-ref-lib/src/client/RefLibCommandCard\n */\n\nimport { useState } from 'react'\nimport type { ReactElement } from 'react'\nimport type { CommandNode } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport {\n IconCheckOutline16,\n IconCopyOutline16,\n IconLoadingOutline16,\n IconWarningOutline16,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { ensureRefLibStyles } from './styles.ts'\n\n/** 完整 props:commandview 运行时套件 + owner(node)+ 本地化 seat。 */\nexport type RefLibCommandCardProps = PropsRuntime<'conversation.chat.commandview'> & {\n /** 折叠的命令生命周期节点(run + 可选 done);outcome 为 null 时仍在执行。 */\n node: CommandNode\n /** `/compact` 专用(ref-lib 不使用)。 */\n compaction?: unknown\n} & PropsLocale<'ref-lib'>\n\nensureRefLibStyles()\n\n/**\n * `/ref-lib` 命令结果卡片:完整展示 `outcome.text`(pre-wrap、无高度截断)+\n * 复制按钮。running 态显示执行中;error 态红色。\n * @param props - node(owner)与本地化 seat。\n * @returns 卡片元素。\n */\nexport function RefLibCommandCard(props: RefLibCommandCardProps): ReactElement {\n const { node, t } = props\n const [copied, setCopied] = useState(false)\n const outcome = node.outcome\n const text = outcome?.text\n const running = outcome === null\n const error = outcome?.kind === 'error'\n\n /** 复制完整结果到剪贴板;成功后短暂显示\"已复制\"(权限失败静默)。 */\n const copy = async (): Promise<void> => {\n if (text === undefined || text === '') return\n try {\n await navigator.clipboard.writeText(text)\n setCopied(true)\n window.setTimeout(() => { setCopied(false) }, 1500)\n } catch {\n /* 剪贴板不可用(权限/非安全上下文)时静默 */\n }\n }\n\n const summary = running\n ? t('command.running')\n : text !== undefined && text !== '' ? text.split('\\n')[0]! : t('command.done')\n\n return (\n <div className=\"reflib-cmd\" data-state={running ? 'running' : error ? 'error' : 'ok'}>\n <div className=\"reflib-cmdHead\">\n {running && <IconLoadingOutline16 size={14} className=\"reflib-spin reflib-cmdHeadIcon\" />}\n {!running && error && <IconWarningOutline16 size={14} className=\"reflib-cmdHeadIcon\" />}\n <span className=\"reflib-cmdName\">/ref-lib</span>\n <span className=\"reflib-cmdSummary\" data-error={error || undefined}>{summary}</span>\n {!running && text !== undefined && text !== '' && (\n <button\n type=\"button\"\n className=\"reflib-cmdCopy\"\n aria-label={t('command.copy')}\n title={t('command.copy')}\n onClick={() => { void copy() }}\n >\n {copied ? <IconCheckOutline16 size={14} /> : <IconCopyOutline16 size={14} />}\n {copied ? t('command.copied') : t('command.copy')}\n </button>\n )}\n </div>\n {!running && text !== undefined && text !== '' && (\n <pre className=\"reflib-cmdBody\" data-error={error || undefined}>{text}</pre>\n )}\n </div>\n )\n}\n","/**\n * 并发读守卫(竞态控制核心):只接受\"最后发起\"的请求结果。\n *\n * RefLibDock 有多个并发\"拉取列表\"来源——挂载预载、打开面板、30s 轮询、操作后的\n * 刷新——网络返回顺序不保证,旧快照可能覆盖新快照。守卫用递增编号标记每次发起:\n * 返回时只有仍持有**最新编号**的请求结果才被应用,其余一律丢弃。\n *\n * 为什么\"最后发起\"就代表最新:`list` 返回的是请求发起时刻的服务端快照,发起越晚\n * 快照越新,所以只信最后发起者 ≈ 只信最新快照。操作后的刷新总是最后发起(操作\n * 完成后才发起),天然胜出;响应乱序时旧号被丢弃,最终一致。\n *\n * 纯 TS、零依赖、零 DOM——node 环境可直接单元测试(tests/refresh-guard.spec.ts)。\n * @module @hpyperry/dsh-ref-lib/src/client/refresh-guard\n */\nexport class RefreshGuard {\n private seq = 0\n\n /** 发起一次请求,返回本次请求的编号。 */\n begin(): number {\n this.seq += 1\n return this.seq\n }\n\n /**\n * 该编号是否仍是最新发起者。\n * @param mine - 发起时 {@link begin} 返回的编号。\n * @returns true 表示应应用该请求的结果;false 表示期间又有新请求发起,结果已过期。\n */\n isLatest(mine: number): boolean {\n return mine === this.seq\n }\n\n /**\n * 作废所有 in-flight 请求的结果(会话切换 / 组件卸载时调用):seq 递增后,\n * 任何旧编号的 {@link isLatest} 都返回 false。\n */\n invalidate(): void {\n this.seq += 1\n }\n}\n","/**\n * 应用内目录浏览器(browse 后端可用时,「选择目录」的落地实现)。\n *\n * 为什么需要它:v6 起 profile 把 directory-picker 从 -auto(本机解析为 native,\n * OS 对话框硬编码英文且每次拉 osascript 进程)切换为 -browse 后,\n * `host.pickDirectory`(native 专用 RPC)不再可用;本组件用 `listDirectory`\n * (Node stdlib 列目录,zh/en 本地化、无 OS 进程)提供等价的目录选择:\n * 面包屑 + 路径编辑 + 子目录列表,点击下行进入,「选择此目录」把当前层级添加为\n * 参考库。简化为单列(与官方 DirectoryBrowser 的 Miller 双列相比),\n * 但覆盖添加参考库的核心路径。\n * @module @hpyperry/dsh-ref-lib/src/client/RefLibBrowser\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport {\n Button,\n IconChevronRightOutline14,\n IconEditOutline16,\n IconFolderClose16,\n IconFolderOpen16,\n IconLoadingOutline16,\n IconWarningOutline16,\n Modal,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { DirectoryEntry, DirectoryListing } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { TranslateNS } from '@deepseek-ai/dsh-client-ui-slots'\n\n/** 面板组件依赖的注入面(由 RefLibDock 提供)。 */\nexport interface RefLibBrowserProps {\n /** 对话框可见性。 */\n open: boolean\n /** 关闭(Escape / 遮罩 / 取消)。 */\n onClose: () => void\n /** 列出一层目录(缺省路径 = 宿主主目录);signal 中止被取代的扫描。 */\n listDirectory: (path?: string, signal?: AbortSignal) => Promise<DirectoryListing>\n /** 本地化取词。 */\n t: TranslateNS<'ref-lib'>\n /** 选定当前层级目录(父组件负责添加并刷新)。 */\n onOpen: (path: string) => void\n}\n\n/** 面包屑展示:主目录子树内以本地化 Home 开头;之外显示完整祖先链。 */\nfunction displayCrumbs(listing: DirectoryListing, homeLabel: string): DirectoryEntry[] {\n const homeIndex = listing.crumbs.findIndex((crumb) => crumb.path === listing.home)\n if (homeIndex === -1) return listing.crumbs\n const tail = listing.crumbs.slice(homeIndex + 1)\n return [{ name: homeLabel, path: listing.home, hidden: false }, ...tail]\n}\n\n/** 平台分隔符(由宿主主目录推断,绝不从键入文本推断)。 */\nfunction separatorOf(listing: DirectoryListing): '\\\\' | '/' {\n return listing.home.includes('\\\\') ? '\\\\' : '/'\n}\n\n/**\n * 渲染应用内目录浏览器。\n * @param props - 见 {@link RefLibBrowserProps}。\n * @returns 对话框元素(关闭时 Modal 返回 null)。\n */\nexport function RefLibBrowser(props: RefLibBrowserProps): ReactElement {\n const { open, onClose, listDirectory, t, onOpen } = props\n const [listing, setListing] = useState<DirectoryListing | null>(null)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n // 路径编辑:null = 面包屑模式;字符串 = 正在键入的草稿。\n const [pathDraft, setPathDraft] = useState<string | null>(null)\n const seq = useRef(0)\n const controller = useRef<AbortController | null>(null)\n // IME 确认(Enter 选中候选)不得提交路径。\n const composing = useRef(false)\n\n /** 新意图胜出:中止在途扫描并使旧结果失效。 */\n const navigate = (target?: string): void => {\n controller.current?.abort()\n controller.current = null\n const mine = ++seq.current\n setLoading(true)\n setError(null)\n const ctrl = new AbortController()\n controller.current = ctrl\n listDirectory(target, ctrl.signal).then(\n (next) => {\n if (mine !== seq.current) return\n setListing(next)\n setLoading(false)\n },\n (cause: unknown) => {\n if (mine !== seq.current) return\n setLoading(false)\n setError(cause instanceof Error ? cause.message : String(cause))\n },\n )\n }\n\n // 打开时列主目录;关闭时清理在途扫描。\n useEffect(() => {\n if (open) {\n navigate()\n } else {\n seq.current += 1\n controller.current?.abort()\n controller.current = null\n setPathDraft(null)\n setError(null)\n }\n }, [open])\n\n const openPathEditor = (): void => {\n if (listing === null) {\n setPathDraft('')\n return\n }\n const sep = separatorOf(listing)\n const base = listing.path\n setPathDraft(base.endsWith(sep) ? base : base + sep)\n }\n\n const commitPath = (): void => {\n const draft = pathDraft ?? ''\n if (draft.trim() === '') return\n navigate(draft)\n setPathDraft(null)\n }\n\n const crumbs = listing === null ? [] : displayCrumbs(listing, t('browser.home'))\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={t('browser.title')}\n closeLabel={t('browser.cancel')}\n className=\"reflib-browser\"\n >\n <div className=\"reflib-panel\">\n {error !== null && (\n <div className=\"reflib-error\" role=\"alert\">\n <IconWarningOutline16 size={14} className=\"reflib-errorIcon\" />\n <span>{error}</span>\n </div>\n )}\n {/* 路径条:面包屑 + 编辑路径入口 */}\n <div className=\"reflib-browserPath\">\n {pathDraft === null ? (\n <>\n <span className=\"reflib-browserCrumbs\" role=\"navigation\">\n {crumbs.map((crumb, index) => (\n <span key={crumb.path} className=\"reflib-browserCrumb\">\n {index > 0 && <IconChevronRightOutline14 size={12} className=\"reflib-browserCrumbChevron\" />}\n <button\n type=\"button\"\n className=\"reflib-browserCrumbBtn\"\n disabled={loading}\n onClick={() => {\n navigate(crumb.path)\n }}\n >\n {crumb.name}\n </button>\n </span>\n ))}\n </span>\n <button\n type=\"button\"\n className=\"reflib-browserEdit\"\n aria-label={t('browser.editPath')}\n title={t('browser.editPath')}\n disabled={loading}\n onClick={openPathEditor}\n >\n <IconEditOutline16 size={14} />\n </button>\n </>\n ) : (\n <input\n className=\"reflib-browserInput\"\n value={pathDraft}\n aria-label={t('browser.editPath')}\n placeholder={t('browser.pathPlaceholder')}\n autoFocus\n disabled={loading}\n onChange={(event) => {\n setPathDraft(event.currentTarget.value)\n }}\n onCompositionStart={() => {\n composing.current = true\n }}\n onCompositionEnd={() => {\n composing.current = false\n }}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && !composing.current) {\n event.preventDefault()\n commitPath()\n }\n if (event.key === 'Escape') {\n event.stopPropagation()\n setPathDraft(null)\n }\n }}\n />\n )}\n </div>\n {/* 目录列表 */}\n {loading ? (\n <div className=\"reflib-status\" role=\"status\">\n <IconLoadingOutline16 size={20} className=\"reflib-spin reflib-statusIcon\" />\n <span className=\"reflib-statusText\">{t('browser.loading')}</span>\n </div>\n ) : listing !== null && listing.entries.length === 0 ? (\n <div className=\"reflib-status\">\n <IconFolderOpen16 size={22} className=\"reflib-statusIcon\" />\n <span className=\"reflib-statusText\">{t('browser.empty')}</span>\n </div>\n ) : (\n listing !== null && (\n <div className=\"reflib-browserList\">\n {listing.entries.map((entry) => (\n <button\n key={entry.path}\n type=\"button\"\n className=\"reflib-browserRow\"\n aria-label={t('browser.enter.aria', { name: entry.name })}\n disabled={loading}\n onClick={() => {\n navigate(entry.path)\n }}\n >\n <IconFolderClose16 size={16} className=\"reflib-browserRowIcon\" />\n <span className=\"reflib-browserRowName\">{entry.name}</span>\n </button>\n ))}\n </div>\n )\n )}\n <div className=\"reflib-divider\" />\n {/* 底部操作 */}\n <div className=\"reflib-browserFooter\">\n <Button variant=\"outline\" size=\"sm\" disabled={loading} onClick={onClose}>\n {t('browser.cancel')}\n </Button>\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={loading || listing === null}\n aria-label={t('browser.open.aria')}\n onClick={() => {\n if (listing !== null) onOpen(listing.path)\n }}\n >\n {t('browser.open')}\n </Button>\n </div>\n </div>\n </Modal>\n )\n}\n","/**\n * 参考库管理面板(Modal):列表(基名 + 全路径、移除操作)+ 添加表单。\n *\n * 设计(优化点 1/2):全部样式走 “--dsw-*” 设计令牌(随浅/深主题适配),\n * 列表行以「基名为主行、完整路径为次行」呈现,移除为带危险 hover 的图标按钮,\n * 添加为主按钮 + 路径输入(支持直接粘贴路径,绕开卡顿的系统选择器)+ 系统选择器\n * 兜底;空态/加载态/错误态各有独立视觉。文案全部经 `t` 本地化(zh/en)。\n * 本组件为纯展示:异步操作与错误归集由 RefLibDock 持有。\n * @module @hpyperry/dsh-ref-lib/src/client/RefLibPanel\n */\n\nimport { useEffect, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport {\n Button,\n IconEllipsisOutline16,\n IconFolderOpen16,\n IconLoadingOutline16,\n IconPlusOutline16,\n IconSearchOutline16,\n IconTrashOutline16,\n IconWarningOutline16,\n Input,\n Modal,\n Tooltip,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { TranslateNS } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { RefLibEntry } from '../spec.ts'\nimport { libBasename } from './data.ts'\n\n/** 用途说明最大长度(与 node half service.NOTE_MAX_LENGTH 一致)。 */\nconst NOTE_MAX_LENGTH = 120\n\n/** 面板组件依赖的注入面(由 RefLibDock 提供)。 */\nexport interface RefLibPanelProps {\n /** 对话框可见性。 */\n open: boolean\n /** 关闭(Escape / 遮罩 / 关闭按钮)。 */\n onClose: () => void\n /** 当前参考库列表。 */\n libs: readonly RefLibEntry[]\n /** 初次加载中(列表区显示加载态)。 */\n loading: boolean\n /** 任一异步操作(添加/移除)进行中:禁用全部操作。 */\n busy: boolean\n /** 系统目录选择器已打开(禁用添加表单,防重复唤起)。 */\n picking: boolean\n /** 正在移除的条目 id(该行显示行内 spinner)。 */\n removingId: string | null\n /** 已本地化的错误文案(null 表示无错误)。 */\n error: string | null\n /** 本地化取词。 */\n t: TranslateNS<'ref-lib'>\n /** 移除一个条目(父组件执行异步并刷新)。 */\n onRemove: (id: string) => void\n /** 按输入路径添加(可带用途说明 note);失败时抛出(面板保留输入内容)。 */\n onAddPath: (path: string, note?: string) => Promise<void>\n /** 更新条目的用途说明(详情编辑保存);失败入错误槽、不抛出。 */\n onUpdateNote: (id: string, note: string) => Promise<void>\n /** 唤起目录选择(browse/native),返回选中路径或 null(取消)——由面板填入路径字段,不直接添加。 */\n onBrowse: () => Promise<string | null>\n}\n\n/**\n * 渲染参考库管理面板。\n * @param props - 见 {@link RefLibPanelProps}。\n * @returns 对话框元素(关闭时 Modal 返回 null)。\n */\nexport function RefLibPanel(props: RefLibPanelProps): ReactElement {\n const { open, onClose, libs, loading, busy, picking, removingId, error, t, onRemove, onAddPath, onUpdateNote, onBrowse } = props\n const [draft, setDraft] = useState('')\n const [noteDraft, setNoteDraft] = useState('')\n // 详情展开:正在查看/编辑的条目 id + 编辑中的用途草稿。\n const [detailId, setDetailId] = useState<string | null>(null)\n const [editNote, setEditNote] = useState('')\n\n // 面板关闭时清空输入草稿:每次打开都是干净的添加表单(失败保留输入的行为只限于面板打开期间)。\n useEffect(() => {\n if (!open) {\n setDraft('')\n setNoteDraft('')\n setDetailId(null)\n }\n }, [open])\n\n const handleSubmit = async (): Promise<void> => {\n const trimmed = draft.trim()\n if (trimmed === '') return\n try {\n const note = noteDraft.trim()\n await onAddPath(trimmed, note === '' ? undefined : note)\n setDraft('')\n setNoteDraft('')\n } catch {\n /* 错误由父组件在统一错误槽展示;输入保留以便修正 */\n }\n }\n\n /** 浏览选中目录 → 填入路径字段(不直接添加,用户可补用途后提交)。 */\n const handleBrowse = async (): Promise<void> => {\n const path = await onBrowse()\n if (path !== null) setDraft(path)\n }\n\n /** 展开/收起条目详情;展开时载入当前用途草稿。 */\n const toggleDetail = (entry: RefLibEntry): void => {\n if (detailId === entry.id) {\n setDetailId(null)\n return\n }\n setDetailId(entry.id)\n setEditNote(entry.note ?? '')\n }\n\n /** 保存详情编辑的用途说明;成功后收起详情。 */\n const handleSaveNote = async (): Promise<void> => {\n if (detailId === null) return\n await onUpdateNote(detailId, editNote)\n setDetailId(null)\n }\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={t('panel.title')}\n closeLabel={t('panel.close')}\n description={t('panel.description', { count: String(libs.length) })}\n className=\"reflib-modal\"\n >\n <div className=\"reflib-panel\">\n {error !== null && (\n <div className=\"reflib-error\" role=\"alert\">\n <IconWarningOutline16 size={14} className=\"reflib-errorIcon\" />\n <span>{error}</span>\n </div>\n )}\n {loading ? (\n <div className=\"reflib-status\" role=\"status\">\n <IconLoadingOutline16 size={20} className=\"reflib-spin reflib-statusIcon\" />\n <span className=\"reflib-statusText\">{t('list.loading')}</span>\n </div>\n ) : libs.length === 0 ? (\n <div className=\"reflib-status\">\n <IconFolderOpen16 size={22} className=\"reflib-statusIcon\" />\n <span className=\"reflib-statusText\">{t('list.empty')}</span>\n <span className=\"reflib-statusHint\">{t('list.empty.hint')}</span>\n </div>\n ) : (\n <div className=\"reflib-list\">\n {libs.map((entry) => {\n const name = libBasename(entry.path)\n const removing = removingId === entry.id\n const detailOpen = detailId === entry.id\n const unavailable = entry.status !== undefined && entry.status !== 'available'\n return (\n <div\n key={entry.id}\n className=\"reflib-listItem\"\n data-removing={removing || undefined}\n data-status={unavailable ? entry.status : undefined}\n >\n <div className=\"reflib-row\">\n {unavailable\n ? <IconWarningOutline16 size={16} className=\"reflib-rowIcon reflib-rowIconWarn\" />\n : <IconFolderOpen16 size={16} className=\"reflib-rowIcon\" />}\n <div className=\"reflib-rowBody\">\n <span className=\"reflib-rowName\" title={entry.path}>\n {name}\n </span>\n <span className=\"reflib-rowPath\" title={entry.path}>\n {entry.path}\n </span>\n {unavailable && (\n <span className=\"reflib-rowStatus\" role=\"status\">\n {t(entry.status === 'missing' ? 'status.missing' : 'status.notDirectory')}\n </span>\n )}\n {entry.note !== undefined && entry.note !== '' && (\n <span className=\"reflib-rowNote\" title={entry.note}>\n {entry.note.replace(/\\s+/g, ' ')}\n </span>\n )}\n </div>\n <Tooltip label={t('detail.open')} side=\"top\" delayMs={400}>\n <button\n type=\"button\"\n className=\"reflib-rowAction\"\n aria-label={t('detail.open.aria', { name })}\n aria-expanded={detailOpen || undefined}\n // 失效条目只允许移除:详情/用途编辑禁用(node 端 note 接口同样拒绝)。\n disabled={busy || removingId !== null || unavailable}\n onClick={() => {\n toggleDetail(entry)\n }}\n >\n <IconEllipsisOutline16 size={14} />\n </button>\n </Tooltip>\n <Tooltip label={t('list.remove')} side=\"top\" delayMs={400}>\n <button\n type=\"button\"\n className=\"reflib-rowRemove\"\n aria-label={t('list.remove.aria', { name })}\n disabled={busy || removingId !== null}\n onClick={() => {\n onRemove(entry.id)\n }}\n >\n {removing ? (\n <IconLoadingOutline16 size={14} className=\"reflib-spin\" />\n ) : (\n <IconTrashOutline16 size={14} />\n )}\n </button>\n </Tooltip>\n </div>\n {/* 失效条目不渲染详情/用途编辑区(只允许移除) */}\n {detailOpen && !unavailable && (\n <div className=\"reflib-detail\">\n <div className=\"reflib-detailMeta\">\n <span className=\"reflib-detailKey\">ID</span>\n <span className=\"reflib-detailValue\">{entry.id}</span>\n </div>\n <div className=\"reflib-detailMeta\">\n <span className=\"reflib-detailKey\">{t('detail.path')}</span>\n <span className=\"reflib-detailValue\" title={entry.path}>\n {entry.path}\n </span>\n </div>\n <span className=\"reflib-detailKey\">{t('add.note.label')}</span>\n <div className=\"reflib-noteWrap\">\n <textarea\n className=\"reflib-noteTextarea\"\n value={editNote}\n placeholder={t('add.note.placeholder')}\n aria-label={t('add.note.label')}\n disabled={busy}\n rows={3}\n maxLength={NOTE_MAX_LENGTH}\n onChange={(event) => {\n setEditNote(event.currentTarget.value)\n }}\n />\n <span className=\"reflib-noteCount\">\n {editNote.length}/{NOTE_MAX_LENGTH}\n </span>\n </div>\n <div className=\"reflib-detailActions\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={busy}\n onClick={() => {\n setDetailId(null)\n }}\n >\n {t('detail.cancel')}\n </Button>\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={busy}\n onClick={() => {\n void handleSaveNote()\n }}\n >\n {t('detail.save')}\n </Button>\n </div>\n </div>\n )}\n </div>\n )\n })}\n </div>\n )}\n <div className=\"reflib-divider\" />\n <div className=\"reflib-add\">\n <span className=\"reflib-addLabel\">{t('add.label')}</span>\n {/* 统一表单:路径(可输入 / 浏览填充)+ 用途(可选),同一「添加」提交 */}\n <div className=\"reflib-addRow\">\n <Input\n className=\"reflib-addInputWrap\"\n value={draft}\n placeholder={t('add.placeholder')}\n aria-label={t('add.label')}\n disabled={busy || picking}\n onChange={(event) => {\n setDraft(event.currentTarget.value)\n }}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && !event.nativeEvent.isComposing) {\n event.preventDefault()\n void handleSubmit()\n }\n }}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n icon={<IconSearchOutline16 size={14} />}\n disabled={busy || picking}\n onClick={() => {\n void handleBrowse()\n }}\n >\n {t('add.browse')}\n </Button>\n </div>\n <div className=\"reflib-noteWrap\">\n <textarea\n className=\"reflib-noteTextarea\"\n value={noteDraft}\n placeholder={t('add.note.placeholder')}\n aria-label={t('add.note.label')}\n disabled={busy || picking}\n rows={2}\n maxLength={NOTE_MAX_LENGTH}\n onChange={(event) => {\n setNoteDraft(event.currentTarget.value)\n }}\n />\n <span className=\"reflib-noteCount\">\n {noteDraft.length}/{NOTE_MAX_LENGTH}\n </span>\n </div>\n <Button\n variant=\"primary\"\n className=\"reflib-addSubmit\"\n icon={<IconPlusOutline16 size={14} />}\n disabled={busy || picking || draft.trim() === ''}\n onClick={() => {\n void handleSubmit()\n }}\n >\n {t('add.submit')}\n </Button>\n <span className=\"reflib-addHint\">{t('add.hint')}</span>\n </div>\n </div>\n </Modal>\n )\n}\n","/**\n * 参考库入口(conversation.input.dock,输入卡正上方)+ 面板状态持有者。\n *\n * 位置(v7):v5/v6 曾在 hero 相位把胶囊**测量定位**提入官方 hero 行(紧跟\"标准\n * 模式\"chip 之后)。该像素测量与 hero 行的异步内容存在竞态——模式 chip 的 roster\n * 经 RPC 异步挂载、Web 字体异步加载、其他插件 chip 异步加入——而重测触发面\n * (hero 行/槽位出口/栈均为固定盒或 display:contents)对\"行内内容变化\"是盲区,\n * 导致偶发与模式按钮重叠。v7 起**取消测量与绝对定位**:胶囊统一渲染在 dock 槽位\n * (输入卡正上方)的独立一行,左缘经官方设计令牌(--dsh-composer-side-clearance /\n * --dsh-composer-card-max-width)纯 CSS 与输入卡左缘对齐——hero/active 一致、\n * 零 JS 测量、零竞态;plan/model 等工具行座位的启停不影响本行位置;与其他 dock\n * 条带(todo/goal/queue)按 order 流式堆叠,天然不重叠。\n *\n * 数据(v4/v5):读/写经 /api/ref-lib/* 路由(静默、无命令卡片);\n * 目录选择走系统原生选择器,另提供路径输入直加(绕开卡顿的原生对话框)。\n * @module @hpyperry/dsh-ref-lib/src/client/RefLibDock\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { DirectoryListing, SessionId } from '@deepseek-ai/dsh-client-runtime/client'\nimport { IconFolderOpen16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { RefLibEntry } from '../spec.ts'\nimport { RefLibApiError } from './data.ts'\nimport type { RefLibKey } from './locales.ts'\nimport { RefreshGuard } from './refresh-guard.ts'\nimport { RefLibBrowser } from './RefLibBrowser.tsx'\nimport { RefLibPanel } from './RefLibPanel.tsx'\nimport { ensureRefLibStyles } from './styles.ts'\n\n/** 面板组件依赖的注入面(apply 闭包绑定 runtime 能力)。 */\nexport interface RefLibDockInjected {\n /** 读取会话的参考库列表(GET /api/ref-lib/list,静默)。 */\n load: (sessionId: SessionId) => Promise<RefLibEntry[]>\n /** 添加一个参考库目录(POST /api/ref-lib/add,静默;note 为可选用途说明)。 */\n add: (sessionId: SessionId, path: string, note?: string) => Promise<void>\n /** 移除一个参考库条目(POST /api/ref-lib/remove,静默)。 */\n remove: (sessionId: SessionId, id: string) => Promise<void>\n /** 更新一个条目的用途说明(POST /api/ref-lib/note,静默;空串清除)。 */\n setNote: (sessionId: SessionId, id: string, note: string) => Promise<void>\n /** 唤起系统原生\"选择文件夹\"对话框;取消时返回 null。 */\n pickDirectory: () => Promise<string | null>\n /** 列出一层目录(browse 后端);缺省路径 = 宿主主目录;signal 中止扫描。 */\n listDirectory: (path?: string, signal?: AbortSignal) => Promise<DirectoryListing>\n}\n\n/** 挂载预载失败重试:间隔与上限(重启后会话 live 通常 <1s,重试 1–2 次即成功)。 */\nconst MOUNT_RETRY_DELAY_MS = 800\nconst MOUNT_RETRY_MAX = 5\n\n/** 完整 props:input.dock 运行时套件 + 注入面 + 本地化 seat。 */\nexport type RefLibDockProps = PropsRuntime<'conversation.input.dock'> & RefLibDockInjected & PropsLocale<'ref-lib'>\n\n/** wire 错误码 → 本地化文案键(未知码回退原始消息)。 */\nconst ERROR_KEYS: Record<string, RefLibKey> = {\n 'ref-lib/missing': 'error.missing',\n 'ref-lib/not-directory': 'error.notDirectory',\n 'ref-lib/unsafe': 'error.unsafe',\n 'ref-lib/unknown-id': 'error.unknownId',\n 'ref-lib/unavailable': 'error.unavailable',\n}\n\n/** 把未知错误规整为可展示文案。 */\nfunction messageOf(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause)\n}\n\n/**\n * 把 API 错误本地化:已知 wire code 映射为当前语言文案(带 path/id 参数),\n * 其余错误原样展示服务端消息。\n */\nfunction formatError(cause: unknown, t: RefLibDockProps['t']): string {\n if (cause instanceof RefLibApiError) {\n const key = ERROR_KEYS[cause.code]\n if (key !== undefined) {\n const params =\n cause.details.path !== undefined\n ? { path: cause.details.path }\n : cause.details.id !== undefined\n ? { id: cause.details.id }\n : undefined\n return t(key, params)\n }\n }\n return messageOf(cause)\n}\n\n// 模块装载即注入样式(幂等);组件挂载后再兜底一次(覆盖装载早于 DOM 的情况)。\nensureRefLibStyles()\n\n/**\n * 输入卡正上方的参考库入口:胶囊按钮(图标 + 文案 + 数量徽标)唤起管理面板。\n * 位置由 .reflib-dock 的纯 CSS padding 与输入卡左缘对齐,无任何 JS 测量。\n * @param props - sessionId 与注入面。\n * @returns 胶囊入口(+ 打开时的管理面板)。\n */\nexport function RefLibDock(props: RefLibDockProps): ReactElement {\n const { sessionId, session, load, add, remove, setNote, pickDirectory, listDirectory, t } = props\n const [open, setOpen] = useState(false)\n const [libs, setLibs] = useState<RefLibEntry[]>([])\n const [loading, setLoading] = useState(false)\n const [busy, setBusy] = useState(false)\n const [picking, setPicking] = useState(false)\n const [removingId, setRemovingId] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n // 并发读守卫(竞态控制):仅采纳最新一次 refresh 的结果(挂载预载/开面板/轮询/\n // 操作后刷新可能重叠);详见 src/client/refresh-guard.ts 与 tests/refresh-guard.spec.ts。\n const guard = useRef(new RefreshGuard())\n\n // 目录选择能力(v6):browse(应用内浏览器,listDirectory)或 native(OS 对话框,\n // pickDirectory)。探测一次并缓存;host 侧能力在单次 boot 内稳定。\n const [pickerMode, setPickerMode] = useState<'browse' | 'native' | null>(null)\n const [browserOpen, setBrowserOpen] = useState(false)\n // pickPath 等待应用内浏览器选定时挂起的 resolve(取消以 null 结束)。\n const pendingPick = useRef<((path: string | null) => void) | null>(null)\n const detectPicker = async (): Promise<'browse' | 'native'> => {\n if (pickerMode !== null) return pickerMode\n let mode: 'browse' | 'native'\n try {\n await listDirectory(undefined, new AbortController().signal)\n mode = 'browse'\n } catch {\n // browse 不可用(directory-picker-unavailable)→ 回退 native 尝试;\n // pickDirectory 若也不可用,由错误槽如实展示。\n mode = 'native'\n }\n setPickerMode(mode)\n return mode\n }\n\n /**\n * 拉取会话参考库列表并更新 UI。\n * @param silent - 静默模式(轮询用):失败不写入错误槽;成功也**不碰 error/loading**\n * ——错误与加载态只由用户操作/打开面板管理,避免后台轮询吞掉操作错误提示或\n * 提前结束面板加载态(轮询仅更新 libs 数据)。\n */\n const refresh = async (silent = false): Promise<void> => {\n const mine = guard.current.begin()\n try {\n const next = await load(sessionId)\n if (!guard.current.isLatest(mine)) return\n setLibs(next)\n if (!silent) setError(null)\n } catch (cause) {\n if (!guard.current.isLatest(mine)) return\n if (!silent) setError(formatError(cause, t))\n } finally {\n if (guard.current.isLatest(mine) && !silent) setLoading(false)\n }\n }\n\n // 挂载/会话切换预载(带失败重试):重启 dsh web 后会话可能尚未 live(/list 404),\n // 首次加载失败若直接放弃,胶囊角标/列表会缺失直到用户点开面板——延迟重试直至\n // 会话就绪或达到上限,让\"刚启动\"的失效角标也能自动出现(seq 守卫防并发竞态)。\n useEffect(() => {\n ensureRefLibStyles()\n let stopped = false\n let retries = 0\n let timer: number | undefined\n const attempt = async (): Promise<void> => {\n const mine = guard.current.begin()\n try {\n const next = await load(sessionId)\n if (stopped || !guard.current.isLatest(mine)) return\n setLibs(next)\n setError(null)\n } catch (cause) {\n if (stopped || !guard.current.isLatest(mine)) return\n if (retries < MOUNT_RETRY_MAX) {\n retries += 1\n timer = window.setTimeout(() => { void attempt() }, MOUNT_RETRY_DELAY_MS)\n return\n }\n setError(formatError(cause, t))\n } finally {\n if (!stopped && guard.current.isLatest(mine)) setLoading(false)\n }\n }\n void attempt()\n return () => {\n stopped = true\n if (timer !== undefined) window.clearTimeout(timer)\n }\n }, [sessionId])\n useEffect(() => {\n if (open) {\n setLoading(true)\n void refresh()\n }\n }, [open])\n\n // 发消息即刷新(交互钩子):dock owner 的 `session` 是**响应式会话快照**——用户\n // 发消息必然产生 user 消息节点(`kind: 'user'`),计数 +1 触发静默刷新,UI 在\n // 发消息后立即同步;流式 assistant 回复不改变 user 计数,不会每 token 刷新。\n const userMessageCount = session.nodes.filter((node) => node.kind === 'user').length\n useEffect(() => {\n void refresh(true)\n }, [userMessageCount])\n\n // 命令执行即刷新:`/ref-lib` 命令(add/remove/note)执行必然产生\n // `command/run` → `command/done`,会话快照中的 command 节点从 running\n // (outcome null)变为 settled——settled 计数 +1 触发静默刷新,命令执行后\n // UI 立即同步。与 userMessageCount 同模式(组件内响应式)。\n const refLibCommandDone = session.nodes.filter(\n (node) => node.kind === 'command' && node.name === 'ref-lib' && node.outcome !== null,\n ).length\n useEffect(() => {\n void refresh(true)\n }, [refLibCommandDone])\n\n // 后台轮询已移除(2026-08-22 用户决策):UI 同步改为**交互驱动**——/ref-lib\n // 命令完成、发消息、面板操作均即时刷新;外部文件操作(删/恢复目录)在下次\n // GUI 交互时同步。注入侧不受影响:每次模型请求的注入回调仍实时探测\n // (node half list()),与 UI 刷新完全解耦。详见设计文档 §14。\n\n const handleRemove = async (id: string): Promise<void> => {\n setRemovingId(id)\n setBusy(true)\n setError(null)\n try {\n await remove(sessionId, id)\n await refresh()\n } catch (cause) {\n setError(formatError(cause, t))\n } finally {\n setRemovingId(null)\n setBusy(false)\n }\n }\n\n const handleAddPath = async (path: string, note?: string): Promise<void> => {\n setBusy(true)\n setError(null)\n try {\n await add(sessionId, path, note)\n await refresh()\n } catch (cause) {\n setError(formatError(cause, t))\n // 失败时重新抛出:让面板保留输入内容供修正\n throw cause\n } finally {\n setBusy(false)\n }\n }\n\n /** 更新条目用途说明(编辑详情保存);失败入错误槽、不抛出(编辑区保持打开)。 */\n const handleUpdateNote = async (id: string, note: string): Promise<void> => {\n setBusy(true)\n setError(null)\n try {\n await setNote(sessionId, id, note)\n await refresh()\n } catch (cause) {\n setError(formatError(cause, t))\n } finally {\n setBusy(false)\n }\n }\n\n /** 唤起目录选择(browse 应用内浏览器 / native 系统对话框)并返回选中的路径;\n * 取消或失败返回 null——**不直接添加**,由面板把路径填入表单(用户可补用途后提交)。 */\n const pickPath = async (): Promise<string | null> => {\n setError(null)\n // 探测目录选择能力:browse → 应用内目录浏览器;native → 系统 OS 对话框。\n let mode: 'browse' | 'native'\n try {\n mode = await detectPicker()\n } catch (cause) {\n setError(formatError(cause, t))\n return null\n }\n if (mode === 'browse') {\n setBrowserOpen(true)\n return await new Promise<string | null>((resolve) => {\n pendingPick.current = resolve\n })\n }\n setPicking(true)\n try {\n return await pickDirectory()\n } catch (cause) {\n setError(formatError(cause, t))\n return null\n } finally {\n setPicking(false)\n }\n }\n\n /** 应用内浏览器选定目录 → 把路径交给等待中的 pickPath 调用方并关闭浏览器。 */\n const handleBrowserPick = (path: string): void => {\n setBrowserOpen(false)\n const resolve = pendingPick.current\n pendingPick.current = null\n resolve?.(path)\n }\n\n /** 应用内浏览器取消 → 以 null 结束等待中的 pickPath。 */\n const handleBrowserClose = (): void => {\n setBrowserOpen(false)\n const resolve = pendingPick.current\n pendingPick.current = null\n resolve?.(null)\n }\n\n /**\n * 胶囊计数(v9):徽标显示**可用**数量(失效不计入),红色角标显示失效数量\n * (总数 − 可用数),仅存在失效条目时显示。注意:UI 数据只在打开面板/操作后\n * 刷新,外部变更(如删除目录)不会自动反向同步到界面(与命令修改后不刷新同属\n * 待解决的 UI 数据同步问题,见设计文档\"遗留备注\")。\n */\n const availableCount = libs.filter((entry) => entry.status === 'available').length\n const unavailableCount = libs.length - availableCount\n\n return (\n <>\n <div className=\"reflib-dock\">\n <button\n type=\"button\"\n className=\"reflib-chip\"\n data-active={open || undefined}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-label={\n unavailableCount > 0\n ? t('dock.unavailable', { count: String(unavailableCount) })\n : availableCount > 0 ? t('dock.count.aria', { count: String(availableCount) }) : t('dock.aria')\n }\n title={t('dock.aria')}\n onClick={() => {\n setOpen((value) => !value)\n }}\n >\n <span className=\"reflib-chipIcon\">\n <IconFolderOpen16 size={14} />\n </span>\n <span className=\"reflib-chipLabel\">{t('dock.label')}</span>\n {availableCount > 0 && <span className=\"reflib-chipBadge\">{availableCount}</span>}\n {unavailableCount > 0 && (\n <span className=\"reflib-chipWarn\" title={t('dock.unavailable', { count: String(unavailableCount) })}>\n {unavailableCount}\n </span>\n )}\n </button>\n </div>\n <RefLibPanel\n open={open}\n onClose={() => {\n setOpen(false)\n }}\n libs={libs}\n loading={loading}\n busy={busy}\n picking={picking}\n removingId={removingId}\n error={error}\n t={t}\n onRemove={(id) => {\n void handleRemove(id)\n }}\n onAddPath={handleAddPath}\n onUpdateNote={handleUpdateNote}\n onBrowse={pickPath}\n />\n <RefLibBrowser\n open={browserOpen}\n onClose={handleBrowserClose}\n listDirectory={listDirectory}\n t={t}\n onOpen={handleBrowserPick}\n />\n </>\n )\n}\n","/**\n * ref-lib client 本地化字典(zh 为键集唯一来源,en 与之逐键对齐)。\n *\n * 语言适配(优化点 2):面板、入口胶囊与添加表单的全部文案经\n * `ctx.locale.register(NS, { zh, en })` 注册,槽位注册声明 `locale: NS`,\n * 组件经框架注入的 `t` seat 取词(活动语言实时切换,缺省回退 zh)。\n * 键对等由 `satisfies Record<RefLibKey, string>` 在编译期强制。\n * @module @hpyperry/dsh-ref-lib/src/client/locales\n */\n\n/** 简体中文字典(键集唯一来源)。 */\nexport const zh = {\n // ── 输入框上方入口胶囊(conversation.input.dock)──\n 'dock.label': '参考库',\n 'dock.aria': '管理只读参考库',\n 'dock.count.aria': '参考库,共 {count} 个',\n 'dock.unavailable': '参考库,{count} 个失效',\n // ── 条目可用性(失效检测,v9)──\n 'status.missing': '目录已删除或不可访问',\n 'status.notDirectory': '路径不再是目录',\n // ── 管理面板 ──\n 'panel.title': '参考库',\n 'panel.close': '关闭',\n 'panel.description': '共 {count} 个只读参考库:供 agent 读取参考,禁止修改其中文件',\n 'list.remove': '移除',\n 'list.remove.aria': '移除参考库 {name}',\n 'list.empty': '还没有参考库',\n 'list.empty.hint': '在下方输入目录路径,或点击「浏览」选择目录',\n 'list.loading': '正在加载…',\n // ── 条目详情 ──\n 'detail.open': '查看详情',\n 'detail.open.aria': '查看 {name} 的详情',\n 'detail.path': '路径',\n 'detail.cancel': '取消',\n 'detail.save': '保存',\n // ── 添加表单 ──\n 'add.label': '添加参考库',\n 'add.placeholder': '输入目录路径(支持 ~ 与相对)',\n 'add.submit': '添加',\n 'add.browse': '浏览',\n 'add.note.label': '用途说明',\n 'add.note.placeholder': '用途说明(可选,帮助 agent 判断相关性)',\n 'add.hint': '目录仅作只读参考;用途不填时自动提取 README 标题',\n // ── 应用内目录浏览器(browse 后端)──\n 'browser.title': '选择目录',\n 'browser.home': '主目录',\n 'browser.open': '选择此目录',\n 'browser.open.aria': '添加当前目录为参考库',\n 'browser.enter.aria': '进入目录 {name}',\n 'browser.editPath': '编辑路径',\n 'browser.pathPlaceholder': '输入绝对路径,回车跳转',\n 'browser.empty': '该目录下没有子目录',\n 'browser.loading': '加载中…',\n 'browser.cancel': '取消',\n // ── 错误映射(wire code → 本地化文案)──\n 'error.missing': '目录不存在:{path}',\n 'error.notDirectory': '不是目录:{path}',\n 'error.unsafe': '路径包含控制字符,已拒绝:{path}',\n 'error.unknownId': '未找到参考库条目:{id}',\n 'error.unavailable': '参考库目录不可用(仅允许移除)',\n // ── /ref-lib 命令结果卡片(conversation.chat.commandview)──\n 'command.running': '执行中…',\n 'command.done': '完成',\n 'command.copy': '复制',\n 'command.copied': '已复制',\n} satisfies Record<string, string>\n\n/** ref-lib 命名空间的键集。 */\nexport type RefLibKey = keyof typeof zh\n\n/** 英文词典,与 zh 键集逐键对齐(编译期校验)。 */\nexport const en = {\n 'dock.label': 'Reference Library',\n 'dock.aria': 'Manage read-only reference libraries',\n 'dock.count.aria': 'Reference library, {count} total',\n 'dock.unavailable': 'Reference library, {count} unavailable',\n // ── Entry availability (stale detection, v9) ──\n 'status.missing': 'Directory deleted or unavailable',\n 'status.notDirectory': 'Path is no longer a directory',\n 'panel.title': 'Reference Library',\n 'panel.close': 'Close',\n 'panel.description':\n '{count} read-only reference libraries: the agent may read them for reference, but must not modify any files',\n 'list.remove': 'Remove',\n 'list.remove.aria': 'Remove reference library {name}',\n 'list.empty': 'No reference libraries yet',\n 'list.empty.hint': 'Enter a directory path below, or click “Browse” to pick one',\n 'list.loading': 'Loading…',\n // ── Entry details ──\n 'detail.open': 'View details',\n 'detail.open.aria': 'View details of {name}',\n 'detail.path': 'Path',\n 'detail.cancel': 'Cancel',\n 'detail.save': 'Save',\n 'add.label': 'Add a reference library',\n 'add.placeholder': 'Enter a directory path (~ or relative)',\n 'add.submit': 'Add',\n 'add.browse': 'Browse',\n 'add.note.label': 'Description',\n 'add.note.placeholder': 'Description (optional; helps the agent judge relevance)',\n 'add.hint': 'Directories are read-only references; if no description is given, the README title is used',\n // ── In-app directory browser (browse backend) ──\n 'browser.title': 'Select Directory',\n 'browser.home': 'Home',\n 'browser.open': 'Select this folder',\n 'browser.open.aria': 'Add the current directory as a reference library',\n 'browser.enter.aria': 'Open folder {name}',\n 'browser.editPath': 'Edit path',\n 'browser.pathPlaceholder': 'Type an absolute path and press Enter',\n 'browser.empty': 'No subdirectories here',\n 'browser.loading': 'Loading…',\n 'browser.cancel': 'Cancel',\n 'error.missing': 'Directory does not exist: {path}',\n 'error.notDirectory': 'Not a directory: {path}',\n 'error.unsafe': 'Path contains control characters and was rejected: {path}',\n 'error.unknownId': 'Reference library entry not found: {id}',\n 'error.unavailable': 'Reference library directory unavailable (remove only)',\n // ── /ref-lib command result card (conversation.chat.commandview) ──\n 'command.running': 'Running…',\n 'command.done': 'Done',\n 'command.copy': 'Copy',\n 'command.copied': 'Copied',\n} satisfies Record<RefLibKey, string>\n","/**\n * ref-lib client 插件(浏览器端):在输入框上方(conversation.input.dock)\n * 注册「参考库」入口,提供 per-session 的 UI 交互式管理。\n *\n * 入口位置(v7):注册在输入框上方(conversation.input.dock)槽位,胶囊渲染在\n * 输入卡正上方的独立一行,经 CSS 令牌与输入卡左缘对齐——hero(新会话)与 active\n * (具体对话)统一可见、零测量、零竞态,新建会话一开始即可注入参考库。\n *\n * 数据通道(v4/v5):client 经**普通同源 fetch** 访问插件在宿主 `ctx.webServer`\n * 上自注册的 /api/ref-lib/* HTTP 路由(node 端读写 sidecar)——静默双向、\n * 不渲染命令卡片、不执行命令、不产生用户消息。路由 loopback-only 护栏见\n * `src/routes.ts`。目录选择走 `ctx.workspaces.pickDirectory()`(host 原生 OS\n * 选择器),另提供路径输入直加(优化点 2:绕开卡顿的原生对话框)。\n * 文案经 `ctx.locale` 全量本地化(zh/en,优化点 2)。\n * @module @hpyperry/dsh-ref-lib/src/client\n */\n\nimport type { ClientContext, SessionId } from '@deepseek-ai/dsh-client-runtime/client'\n// Side-effect type imports:加载 slot 声明合并(conversation.input.dock 由\n// ui-conversation 声明)与 locale 服务的类型。\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport type { RefLibEntry } from '../spec.ts'\nimport { parseApiErrorPayload, parseLibsPayload, RefLibApiError } from './data.ts'\nimport { RefLibCommandCard } from './RefLibCommandCard.tsx'\nimport { RefLibDock, type RefLibDockInjected } from './RefLibDock.tsx'\nimport { zh, en, type RefLibKey } from './locales.ts'\n\n/** 所需服务(cordis fiber inject)。 */\nexport const inject = ['slots', 'workspaces', 'locale']\n\n/** 本插件文案命名空间。 */\nconst NS = 'ref-lib'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n /** ref-lib 面板/入口文案。 */\n 'ref-lib': RefLibKey\n }\n}\n\n/**\n * 一条对宿主 /api/ref-lib 路由族的 JSON 调用;失败时优先抛出带 wire code 的\n * RefLibApiError(用于本地化),无 code 时回退普通 Error。\n */\nasync function api<T>(path: string, payload?: unknown, method = 'POST'): Promise<T> {\n const res = await fetch(\n '/api/ref-lib' + path,\n payload === undefined\n ? undefined\n : {\n method,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n },\n )\n let body: unknown = null\n try {\n body = await res.json()\n } catch {\n /* non-JSON error body */\n }\n if (!res.ok) {\n const parsed = parseApiErrorPayload(body)\n if (parsed !== null) throw new RefLibApiError(parsed.code, parsed.message, parsed.details)\n const message = (body as { error?: unknown } | null)?.error ?? 'HTTP ' + res.status\n throw new Error(typeof message === 'string' ? message : String(message))\n }\n return body as T\n}\n\n/**\n * 注册输入框上方的「参考库」入口与管理面板。\n * @param ctx - client 根上下文。\n */\nexport function apply(ctx: ClientContext): void {\n // 注册本插件文案命名空间(zh/en 逐键对齐,编译期校验)。\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'ref-lib: dictionaries')\n\n const injected = (): RefLibDockInjected => ({\n load: async (sessionId: SessionId): Promise<RefLibEntry[]> =>\n parseLibsPayload(\n await api<{ libs?: unknown }>(`/list?session=${encodeURIComponent(sessionId)}`, undefined, 'GET'),\n ),\n add: async (sessionId: SessionId, path: string, note?: string): Promise<void> => {\n await api('/add', { session: sessionId, path, ...(note === undefined ? {} : { note }) })\n },\n remove: async (sessionId: SessionId, id: string): Promise<void> => {\n await api('/remove', { session: sessionId, id })\n },\n setNote: async (sessionId: SessionId, id: string, note: string): Promise<void> => {\n await api('/note', { session: sessionId, id, note })\n },\n pickDirectory: () => ctx.workspaces.pickDirectory(),\n listDirectory: (path, signal) => ctx.workspaces.listDirectory(path, signal),\n })\n\n ctx.slots.inject('conversation.input.dock', () =>\n ctx.slots.register(\n {\n name: 'conversation.input.dock',\n id: 'ref-lib',\n // 排在最后面(goal 10 / queue 20 / git-graph 100 等之后):不与其他插件\n // 的 dock 入口抢位置;独立一行流式堆叠,天然不重叠。\n order: 200,\n locale: NS,\n inject: injected,\n },\n RefLibDock,\n ),\n )\n\n // /ref-lib 命令结果专属卡片:官方 GenericCommandCard 长结果显示不全(折叠单行\n // ellipsis / 展开 260px 内滚动),本卡片默认全展开完整结果 + 复制按钮。\n ctx.slots.inject('conversation.chat.commandview', () =>\n ctx.slots.register(\n {\n name: 'conversation.chat.commandview',\n key: 'ref-lib',\n locale: NS,\n },\n RefLibCommandCard,\n ),\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["useState","IconLoadingOutline16","IconWarningOutline16","IconCheckOutline16","IconCopyOutline16","useState","useRef","Modal","IconWarningOutline16","IconChevronRightOutline14","IconEditOutline16","IconLoadingOutline16","IconFolderOpen16","IconFolderClose16","Button","useState","Modal","IconWarningOutline16","IconLoadingOutline16","IconFolderOpen16","Tooltip","IconEllipsisOutline16","IconTrashOutline16","Button","Input","IconSearchOutline16","IconPlusOutline16","useState","useRef","IconFolderOpen16"],"sources":["../src/validate.ts","../src/client/data.ts","../src/client/styles.ts","../src/client/RefLibCommandCard.tsx","../src/client/refresh-guard.ts","../src/client/refresh-triggers.ts","../src/client/RefLibBrowser.tsx","../src/client/RefLibPanel.tsx","../src/client/RefLibDock.tsx","../src/client/locales.ts","../src/client/index.ts"],"sourcesContent":["/**\n * 跨 node/client 共享的**零依赖**校验与消毒纯函数。\n *\n * node half(service/logic/render)与 client half(client/data.ts)分属两个构建\n * 产物,无法共享带 node 依赖的模块;本模块只依赖类型(spec.ts,type-only 导入\n * 在打包时被擦除),两半均可直接引用——消除 `isRefLibEntry` 在 logic.ts 与\n * client/data.ts 中的逐字重复,控制字符集合也在此统一维护。\n * @module @hpyperry/dsh-ref-lib/src/validate\n */\n\nimport type { RefLibEntry } from './spec.ts'\n\n/**\n * 不可见控制字符集合(提示词注入卫生):\n * C0(\\u0000-\\u001f)、DEL(\\u007f)、C1(\\u0080-\\u009f)、行/段分隔符\n * (\\u2028/\\u2029——旧实现遗漏,同样能破坏注入格式)。\n * 用于 add 拒绝(service.ts)与渲染层兜底消毒(render.ts)。\n */\nconst CONTROL_CHARACTERS = /[\\u0000-\\u001f\\u007f-\\u009f\\u2028\\u2029]/\nconst CONTROL_CHARACTERS_GLOBAL = /[\\u0000-\\u001f\\u007f-\\u009f\\u2028\\u2029]/g\n\n/** 文本是否含不可见控制字符。 */\nexport function hasControlCharacters(text: string): boolean {\n return CONTROL_CHARACTERS.test(text)\n}\n\n/** 把全部不可见控制字符替换为 U+FFFD(路径/备注最终会进入系统提示词,兜底消毒)。 */\nexport function sanitizeControlCharacters(text: string): string {\n return text.replace(CONTROL_CHARACTERS_GLOBAL, '\\uFFFD')\n}\n\n/** 可用性字面量集合(status 字段合法值)。 */\nconst AVAILABILITY_VALUES = new Set(['available', 'missing', 'not-directory'])\n\n/** 校验一个未知对象是否为合法条目(宽松:id/path 必填字符串,note/status/checkedAt 可选且类型正确)。 */\nexport function isRefLibEntry(value: unknown): value is RefLibEntry {\n if (typeof value !== 'object' || value === null) return false\n const { id, path, note, status, checkedAt } = value as {\n id?: unknown\n path?: unknown\n note?: unknown\n status?: unknown\n checkedAt?: unknown\n }\n if (typeof id !== 'string' || typeof path !== 'string') return false\n if (note !== undefined && typeof note !== 'string') return false\n if (status !== undefined && (typeof status !== 'string' || !AVAILABILITY_VALUES.has(status))) return false\n if (checkedAt !== undefined && (typeof checkedAt !== 'number' || !Number.isFinite(checkedAt))) return false\n return true\n}\n","/**\n * client 端数据纯函数:/api/ref-lib/* 路由响应解析、错误码解析与路径展示。\n * 独立于 React / runtime,便于单元测试。\n *\n * v5:路由错误响应新增 wire code(ref-lib/missing 等),client 据此把\n * node 端的中文错误消息映射为当前语言的本地化文案(优化点 2 的语言适配)。\n * @module @hpyperry/dsh-ref-lib/src/client/data\n */\n\nimport type { RefLibEntry } from '../spec.ts'\nimport { isRefLibEntry } from '../validate.ts'\n\n/** 路由错误载荷里的附加字段。 */\nexport interface RefLibApiErrorDetails {\n /** 出错的目录路径(missing/not-directory/unsafe)。 */\n readonly path?: string\n /** 未找到的条目 id(unknown-id)。 */\n readonly id?: string\n}\n\n/** 带 wire code 的 API 错误:code 用于本地化文案映射,message 为原始消息兜底。 */\nexport class RefLibApiError extends Error {\n /**\n * @param code - wire 错误码(如 ref-lib/missing)。\n * @param message - 服务端原始错误消息。\n * @param details - 附加字段(path/id)。\n */\n constructor(\n readonly code: string,\n message: string,\n readonly details: RefLibApiErrorDetails = {},\n ) {\n super(message)\n this.name = 'RefLibApiError'\n }\n}\n\n/**\n * 从失败的 /api/ref-lib/* 响应体解析错误码;无 code 的畸形体返回 null。\n * @param value - 非 2xx 响应体(可为任意 JSON)。\n * @returns 错误码 + 原始消息 + 附加字段;无法解析时为 null。\n */\nexport function parseApiErrorPayload(value: unknown): {\n code: string\n message: string\n details: RefLibApiErrorDetails\n} | null {\n if (typeof value !== 'object' || value === null) return null\n const { error, code, path, id } = value as {\n error?: unknown\n code?: unknown\n path?: unknown\n id?: unknown\n }\n if (typeof code !== 'string' || code === '') return null\n const details: RefLibApiErrorDetails = {\n ...(typeof path === 'string' ? { path } : {}),\n ...(typeof id === 'string' ? { id } : {}),\n }\n return { code, message: typeof error === 'string' ? error : code, details }\n}\n\n/**\n * 从 /api/ref-lib/list 路由响应({ libs: [...] })解析参考库列表;\n * 缺失/畸形返回空列表。\n * @param value - 路由响应体。\n * @returns 当前参考库列表。\n */\nexport function parseLibsPayload(value: unknown): RefLibEntry[] {\n if (typeof value !== 'object' || value === null) return []\n const libs = (value as { libs?: unknown }).libs\n if (!Array.isArray(libs)) return []\n return libs.filter(isRefLibEntry)\n}\n\n/**\n * 提取目录路径的展示用基名(列表行主行的可读标题)。\n * 兼容 POSIX 与 Windows 分隔符;去掉尾部分隔符后取最后一段;\n * 根路径(/、C:\\)原样返回。\n * @param path - 规范化绝对路径。\n * @returns 基名(如 /a/b/core → core)。\n */\nexport function libBasename(path: string): string {\n const trimmed = path.replace(/[\\\\/]+$/, '')\n if (trimmed === '') return path\n // Windows 盘符根(C:)不是基名,原样返回带分隔符的根路径(C:\\\\)。\n if (/^[A-Za-z]:$/.test(trimmed)) return path\n const idx = Math.max(trimmed.lastIndexOf('/'), trimmed.lastIndexOf('\\\\'))\n return idx === -1 ? trimmed : trimmed.slice(idx + 1)\n}\n","/**\n * ref-lib client 样式注入:在文档头挂一张本插件专属的 <style data-plugin> 标签。\n *\n * 为什么不用 CSS Modules:ref-lib 的 tsdown 配置未移植 core 的 lightningcss\n * CSS-Modules 插件(避免新增 native 依赖与构建面),而内联 style 无法表达\n * hover/媒体查询/动画。因此采用运行时注入单张样式表——与 loader 的清理契约\n * 兼容(`data-plugin` 标签在插件卸载/HMR 时由 loader 移除,重新物化时本模块\n * 重新注入,幂等)。类名统一 `reflib-` 前缀防碰撞;颜色/字号/圆角全部走\n * `--dsw-*` 设计令牌,随主题(浅色/深色)自动适配——这是\"字体显示不一致、\n * 没有设计感\"的根因修复之一(旧实现硬编码 #d33 等,不随主题变化)。\n * @module @hpyperry/dsh-ref-lib/src/client/styles\n */\n\n/** 插件 id(与 package.json 的 bundle 手递一致,loader 按它清理样式)。 */\nconst PLUGIN_ID = '@hpyperry/dsh-ref-lib'\n/** 样式标签稳定 id(幂等注入的判据)。 */\nconst STYLE_TAG_ID = '@hpyperry/dsh-ref-lib/styles'\n\nconst CSS = `\n/* ── 输入卡正上方的入口胶囊行(dock)──\n 独立一行,横跨整个 composer 列;chip 与输入卡左缘对齐——用官方设计令牌\n (--dsh-composer-side-clearance / --dsh-composer-card-max-width)纯 CSS 计算,\n 零 JS 测量(v7 起取消 hero 相位测量/绝对定位);hero 与 active 一致,\n plan/model 等工具行座位的启停不影响本行位置。 */\n.reflib-dock {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n min-width: 0;\n /* 镜像输入卡居中:chip 落在输入卡左缘之上(宽视口 = 居中余量,窄视口 = clearance) */\n padding-left: max(\n var(--dsh-composer-side-clearance, 16px),\n calc((100% - var(--dsh-composer-card-max-width, 100%)) / 2)\n );\n}\n\n.reflib-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n max-width: 100%;\n height: 30px;\n padding: 0 10px 0 8px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 15px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n line-height: 18px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 120ms ease, border-color 120ms ease;\n}\n\n.reflib-chip:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.reflib-chip:active {\n background: var(--dsw-alias-interactive-bg-active);\n}\n\n.reflib-chip[data-active='true'] {\n background: var(--dsw-alias-interactive-bg-hover);\n border-color: var(--dsw-alias-border-l2);\n color: var(--dsw-alias-label-primary);\n}\n\n.reflib-chipIcon {\n display: inline-flex;\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.reflib-chipLabel {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.reflib-chipBadge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 9px;\n background: var(--dsw-alias-state-business-tertiary);\n color: var(--dsw-alias-label-primary-bluish);\n font-size: 11px;\n line-height: 18px;\n font-weight: 500;\n}\n\n/* 失效条目计数角标(v9):红色系,与普通数量徽标区分。 */\n.reflib-chipWarn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 9px;\n background: var(--dsw-alias-state-error-primary);\n color: #fff;\n font-size: 11px;\n line-height: 18px;\n font-weight: 500;\n}\n\n/* ── 应用内目录浏览器(browse 后端)── */\n.reflib-browser {\n width: min(460px, 100%);\n}\n\n.reflib-browserPath {\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n height: 32px;\n padding: 0 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-1);\n}\n\n.reflib-browserCrumbs {\n display: flex;\n flex: 1;\n align-items: center;\n min-width: 0;\n overflow-x: auto;\n white-space: nowrap;\n scrollbar-width: none;\n}\n\n.reflib-browserCrumbs::-webkit-scrollbar {\n display: none;\n}\n\n.reflib-browserCrumb {\n display: inline-flex;\n align-items: center;\n flex: none;\n}\n\n.reflib-browserCrumbChevron {\n flex: none;\n color: var(--dsw-alias-label-caption);\n}\n\n.reflib-browserCrumbBtn {\n display: inline-flex;\n align-items: center;\n max-width: 160px;\n padding: 2px 6px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n line-height: 18px;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n}\n\n.reflib-browserCrumbBtn:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.reflib-browserCrumbBtn:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n.reflib-browserEdit {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: 24px;\n height: 24px;\n padding: 0;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n.reflib-browserEdit:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.reflib-browserEdit:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n.reflib-browserInput {\n flex: 1;\n min-width: 0;\n border: none;\n outline: none;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font-size: 12px;\n line-height: 18px;\n}\n\n.reflib-browserInput::placeholder {\n color: var(--dsw-alias-label-dimmed);\n}\n\n.reflib-browserList {\n display: flex;\n flex-direction: column;\n gap: 2px;\n max-height: 264px;\n min-height: 60px;\n overflow-y: auto;\n margin: 0 -8px;\n padding: 0 8px;\n}\n\n.reflib-browserRow {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n padding: 7px 8px;\n border: none;\n border-radius: 8px;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n line-height: 18px;\n cursor: pointer;\n text-align: left;\n}\n\n.reflib-browserRow:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.reflib-browserRow:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n.reflib-browserRowIcon {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.reflib-browserRowName {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.reflib-browserFooter {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n min-width: 0;\n}\n\n/* ── 管理面板 ── */\n.reflib-panel {\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-width: 0;\n}\n\n/* 列表:固定最大高度 + 内滚动(旧实现整个面板滚动、无设计,此处分层) */\n.reflib-list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n max-height: 264px;\n min-height: 0;\n overflow-y: auto;\n margin: 0 -8px;\n padding: 0 8px;\n}\n\n.reflib-listItem {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.reflib-row {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n padding: 7px 8px;\n border-radius: 10px;\n background: transparent;\n transition: background-color 120ms ease;\n}\n\n.reflib-row:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.reflib-listItem[data-removing='true'] {\n opacity: 0.55;\n pointer-events: none;\n}\n\n.reflib-rowIcon {\n display: inline-flex;\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n/* 失效条目行图标(v9):警示色。 */\n.reflib-rowIconWarn {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.reflib-rowBody {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: 1px;\n min-width: 0;\n}\n\n.reflib-rowName {\n overflow: hidden;\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n line-height: 18px;\n font-weight: 500;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.reflib-rowPath {\n overflow: hidden;\n color: var(--dsw-alias-label-tertiary);\n font-family: var(--ds-font-family-code);\n font-size: 11px;\n line-height: 16px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* 列表行用途说明(Description,v8):单行截断,与路径同属次行层级 */\n.reflib-rowNote {\n overflow: hidden;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n line-height: 16px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* 失效条目状态行(v9):红色警示文案,位于路径之下 */\n.reflib-rowStatus {\n overflow: hidden;\n color: var(--dsw-alias-state-error-primary);\n font-size: 12px;\n line-height: 16px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.reflib-rowRemove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n border-radius: 8px;\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n transition: background-color 120ms ease, color 120ms ease;\n}\n\n.reflib-rowRemove:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover-danger);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.reflib-rowRemove:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n/* 详情/编辑入口按钮(与移除同尺寸,非危险 hover) */\n.reflib-rowAction {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n border-radius: 8px;\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n transition: background-color 120ms ease, color 120ms ease;\n}\n\n.reflib-rowAction:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.reflib-rowAction:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n/* 条目详情展开区(ID / 路径 / 用途编辑) */\n.reflib-detail {\n display: flex;\n flex-direction: column;\n gap: 5px;\n margin: 2px 0 6px;\n padding: 8px 10px 10px;\n border-radius: 10px;\n background: var(--dsw-alias-surface-inset, var(--dsw-alias-surface-raised));\n min-width: 0;\n}\n\n.reflib-detailMeta {\n display: flex;\n align-items: baseline;\n gap: 8px;\n min-width: 0;\n}\n\n.reflib-detailKey {\n flex: none;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-caption);\n}\n\n.reflib-detailValue {\n overflow: hidden;\n min-width: 0;\n font-size: 12px;\n line-height: 16px;\n color: var(--dsw-alias-label-secondary);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.reflib-detailActions {\n display: flex;\n justify-content: flex-end;\n gap: 6px;\n margin-top: 2px;\n}\n\n/* 用途说明多行输入(添加表单 + 详情编辑共用) */\n.reflib-noteWrap {\n position: relative;\n display: flex;\n min-width: 0;\n}\n\n.reflib-noteTextarea {\n width: 100%;\n box-sizing: border-box;\n padding: 6px 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n background: var(--dsw-alias-surface-field);\n color: var(--dsw-alias-label-primary);\n font: inherit;\n font-size: 13px;\n line-height: 18px;\n resize: vertical;\n min-height: 40px;\n}\n\n.reflib-noteTextarea:focus {\n outline: 2px solid var(--dsw-alias-focus-ring, var(--dsw-alias-state-info-primary));\n outline-offset: -1px;\n}\n\n.reflib-noteTextarea:disabled {\n opacity: 0.5;\n}\n\n.reflib-noteCount {\n position: absolute;\n right: 8px;\n bottom: 6px;\n padding: 0 4px;\n border-radius: 4px;\n background: var(--dsw-alias-surface-field);\n font-size: 10px;\n line-height: 14px;\n color: var(--dsw-alias-label-caption);\n pointer-events: none;\n}\n\n/* 空态 / 加载态 / 错误态 */\n.reflib-status {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 22px 8px;\n color: var(--dsw-alias-label-caption);\n text-align: center;\n}\n\n.reflib-statusIcon {\n display: inline-flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.reflib-statusText {\n font-size: 13px;\n line-height: 18px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n.reflib-statusHint {\n max-width: 260px;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-caption);\n}\n\n.reflib-error {\n display: flex;\n align-items: flex-start;\n gap: 6px;\n padding: 6px 10px;\n border-radius: 8px;\n background: var(--dsw-alias-interactive-bg-hover-danger);\n color: var(--dsw-alias-state-error-primary);\n font-size: 12px;\n line-height: 18px;\n word-break: break-word;\n}\n\n.reflib-errorIcon {\n display: inline-flex;\n flex: none;\n margin-top: 1px;\n}\n\n.reflib-spin {\n animation: reflib-spin 800ms linear infinite;\n}\n\n@keyframes reflib-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n.reflib-divider {\n height: 1px;\n margin: 2px 0;\n background: var(--dsw-alias-border-l2);\n}\n\n/* ── 管理面板 Modal(v8 优化)──\n 宽度放宽到约 1/3 屏(上限 560px);进入动画为柔和缓出(easeOutQuint 风格:\n 280ms 浮起 + 淡入,位移 12px→0、scale 0.96→1),无回弹——更从容、高级感。 */\n.reflib-modal {\n width: min(33vw, 560px);\n animation: reflib-pop 280ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n@keyframes reflib-pop {\n 0% {\n opacity: 0;\n transform: scale(0.96) translateY(12px);\n }\n 100% {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n/* ── 添加表单 ──\n 统一表单(v8 UI 重构):路径(可输入 / 浏览填充)+ 用途(可选)同一容器,\n 同一「添加」按钮提交——用途与路径强关联,浏览不再直接添加。 */\n.reflib-add {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n}\n\n.reflib-addLabel {\n font-size: 12px;\n line-height: 16px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n.reflib-addRow {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n.reflib-addInputWrap {\n flex: 1 1 180px;\n min-width: 0;\n}\n\n/* 输入字体与面板一致(13px,同列表行名),placeholder 不再比整体大;\n 文案已缩短保证完整显示 */\n.reflib-addInputWrap > input {\n width: 100%;\n box-sizing: border-box;\n font-size: 13px;\n line-height: 18px;\n}\n\n/* 全宽「添加」主按钮 */\n.reflib-addSubmit {\n width: 100%;\n}\n\n.reflib-addHint {\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-caption);\n}\n\n/* ── /ref-lib 命令结果卡片(conversation.chat.commandview)── */\n.reflib-cmd {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n}\n\n.reflib-cmdHead {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n.reflib-cmdHeadIcon {\n flex: none;\n}\n\n.reflib-cmdName {\n flex: none;\n color: var(--dsw-alias-label-primary);\n font-size: 14px;\n line-height: 20px;\n font-weight: 500;\n}\n\n/* 摘要行 = 结果首行;过长单行省略(完整结果见下方 body) */\n.reflib-cmdSummary {\n min-width: 0;\n flex: 1 1 auto;\n overflow: hidden;\n color: var(--dsw-alias-label-tertiary);\n font-size: 13px;\n line-height: 20px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.reflib-cmdSummary[data-error] {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.reflib-cmdCopy {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n line-height: 18px;\n cursor: pointer;\n}\n\n.reflib-cmdCopy:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n/* 完整结果:默认全展开(无 max-height 截断),超宽自动换行 */\n.reflib-cmdBody {\n margin: 0;\n padding: 10px 14px;\n overflow: auto;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 10px;\n background: var(--dsw-alias-markdown-code-block);\n color: var(--dsw-alias-label-primary);\n font: var(--dsw-font-markdown-code-block-small);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.reflib-cmdBody[data-error] {\n color: var(--dsw-alias-state-error-primary);\n}\n\n/* 窄视口:路径行换行,输入框占满一行 */\n@media (max-width: 440px) {\n .reflib-addRow {\n flex-wrap: wrap;\n }\n\n .reflib-addInputWrap {\n flex: 1 1 100%;\n }\n\n .reflib-addRow > button:last-child {\n margin-left: auto;\n }\n}\n`\n\n/** 注入/确保样式表存在(幂等;HMR 重执行时旧标签已被 loader 移除,重新注入)。 */\nexport function ensureRefLibStyles(): void {\n if (typeof document === 'undefined') return\n if (document.querySelector('style[data-plugin-css=\"' + STYLE_TAG_ID + '\"]') !== null) return\n const tag = document.createElement('style')\n tag.dataset.plugin = PLUGIN_ID\n tag.dataset.pluginCss = STYLE_TAG_ID\n tag.textContent = CSS\n document.head.appendChild(tag)\n}\n","/**\n * `/ref-lib` 命令结果专属卡片(conversation.chat.commandview,key='ref-lib')。\n *\n * 背景(历史 bug):官方 `GenericCommandCard` 对命令结果折叠态 `white-space:\n * nowrap` + `text-overflow: ellipsis` 单行截断,展开态 `max-height: 260px` 内滚动\n * ——`/ref-lib list` 等多行长结果会显示不全。本卡片注册在\n * `conversation.chat.commandview`(keyed,按命令名分派)的 `ref-lib` 键上:\n * **默认全展开展示完整结果**(无高度上限)+ 一键复制按钮。只影响 `/ref-lib`,\n * 其他命令仍走官方卡片。\n * @module @hpyperry/dsh-ref-lib/src/client/RefLibCommandCard\n */\n\nimport { useState } from 'react'\nimport type { ReactElement } from 'react'\nimport type { CommandNode } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport {\n IconCheckOutline16,\n IconCopyOutline16,\n IconLoadingOutline16,\n IconWarningOutline16,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { ensureRefLibStyles } from './styles.ts'\n\n/** 完整 props:commandview 运行时套件 + owner(node)+ 本地化 seat。 */\nexport type RefLibCommandCardProps = PropsRuntime<'conversation.chat.commandview'> & {\n /** 折叠的命令生命周期节点(run + 可选 done);outcome 为 null 时仍在执行。 */\n node: CommandNode\n /** `/compact` 专用(ref-lib 不使用)。 */\n compaction?: unknown\n} & PropsLocale<'ref-lib'>\n\nensureRefLibStyles()\n\n/**\n * `/ref-lib` 命令结果卡片:完整展示 `outcome.text`(pre-wrap、无高度截断)+\n * 复制按钮。running 态显示执行中;error 态红色。\n * @param props - node(owner)与本地化 seat。\n * @returns 卡片元素。\n */\nexport function RefLibCommandCard(props: RefLibCommandCardProps): ReactElement {\n const { node, t } = props\n const [copied, setCopied] = useState(false)\n const outcome = node.outcome\n const text = outcome?.text\n const running = outcome === null\n const error = outcome?.kind === 'error'\n\n /** 复制完整结果到剪贴板;成功后短暂显示\"已复制\"(权限失败静默)。 */\n const copy = async (): Promise<void> => {\n if (text === undefined || text === '') return\n try {\n await navigator.clipboard.writeText(text)\n setCopied(true)\n window.setTimeout(() => { setCopied(false) }, 1500)\n } catch {\n /* 剪贴板不可用(权限/非安全上下文)时静默 */\n }\n }\n\n const summary = running\n ? t('command.running')\n : text !== undefined && text !== '' ? text.split('\\n')[0]! : t('command.done')\n\n return (\n <div className=\"reflib-cmd\" data-state={running ? 'running' : error ? 'error' : 'ok'}>\n <div className=\"reflib-cmdHead\">\n {running && <IconLoadingOutline16 size={14} className=\"reflib-spin reflib-cmdHeadIcon\" />}\n {!running && error && <IconWarningOutline16 size={14} className=\"reflib-cmdHeadIcon\" />}\n <span className=\"reflib-cmdName\">/ref-lib</span>\n <span className=\"reflib-cmdSummary\" data-error={error || undefined}>{summary}</span>\n {!running && text !== undefined && text !== '' && (\n <button\n type=\"button\"\n className=\"reflib-cmdCopy\"\n aria-label={t('command.copy')}\n title={t('command.copy')}\n onClick={() => { void copy() }}\n >\n {copied ? <IconCheckOutline16 size={14} /> : <IconCopyOutline16 size={14} />}\n {copied ? t('command.copied') : t('command.copy')}\n </button>\n )}\n </div>\n {!running && text !== undefined && text !== '' && (\n <pre className=\"reflib-cmdBody\" data-error={error || undefined}>{text}</pre>\n )}\n </div>\n )\n}\n","/**\n * 并发读守卫(竞态控制核心):只接受\"最后发起\"的请求结果。\n *\n * RefLibDock 有多个并发\"拉取列表\"来源——挂载预载、打开面板、30s 轮询、操作后的\n * 刷新——网络返回顺序不保证,旧快照可能覆盖新快照。守卫用递增编号标记每次发起:\n * 返回时只有仍持有**最新编号**的请求结果才被应用,其余一律丢弃。\n *\n * 为什么\"最后发起\"就代表最新:`list` 返回的是请求发起时刻的服务端快照,发起越晚\n * 快照越新,所以只信最后发起者 ≈ 只信最新快照。操作后的刷新总是最后发起(操作\n * 完成后才发起),天然胜出;响应乱序时旧号被丢弃,最终一致。\n *\n * 纯 TS、零依赖、零 DOM——node 环境可直接单元测试(tests/refresh-guard.spec.ts)。\n * @module @hpyperry/dsh-ref-lib/src/client/refresh-guard\n */\nexport class RefreshGuard {\n private seq = 0\n\n /** 发起一次请求,返回本次请求的编号。 */\n begin(): number {\n this.seq += 1\n return this.seq\n }\n\n /**\n * 该编号是否仍是最新发起者。\n * @param mine - 发起时 {@link begin} 返回的编号。\n * @returns true 表示应应用该请求的结果;false 表示期间又有新请求发起,结果已过期。\n */\n isLatest(mine: number): boolean {\n return mine === this.seq\n }\n\n /**\n * 作废所有 in-flight 请求的结果(会话切换 / 组件卸载时调用):seq 递增后,\n * 任何旧编号的 {@link isLatest} 都返回 false。\n */\n invalidate(): void {\n this.seq += 1\n }\n}\n","/**\n * 会话快照 → UI 刷新触发信号的纯函数派生(v9 交互驱动同步的信号源)。\n *\n * 交互驱动刷新依赖两个「从会话快照节点派生」的信号(RefLibDock 内两个 effect 的\n * 依赖项):\n * - `userMessageCount`:`kind: 'user'` 节点计数——普通人类消息落盘后 +1,\n * 驱动「发消息即刷新」;\n * - `refLibCommandDone`:`kind: 'command'` 且 `name === 'ref-lib'` 且已结算\n * (`outcome !== null`)的节点计数——`/ref-lib` 命令完成后 +1,驱动「命令执行\n * 即刷新」。\n *\n * 派生依据已在 deepseek-harness @ dsh-v0.1.0-rc.7 源码逐条查证(设计文档 §16):\n * - dock 槽位 owner 的 `session` 是响应式会话快照:ConversationRoot 经\n * `useSession(s => s)` 订阅会话 store,每次发布都重渲染 dock(\n * `ui-conversation/src/client/skeleton/ConversationRoot.tsx`);\n * - `user/message`(`source.kind === 'user'` 且未被收件箱认领)折叠为\n * `kind: 'user'` 节点;goal 轮次等插件注入为 `kind: 'context'`(source 非 user),\n * steer 消息为 `kind: 'steering'`——后两者不增本计数\n * (`ui-conversation/src/client/conversation-nodes/message.ts`);\n * - 宿主命令执行器对每个匹配命令 append log-only `command/run` → `command/done`\n * 对(运行中 `outcome` 为 null,结算后置值);命令名是 typed name(无别名机制、\n * 重名注册 fail loud),故 `name === 'ref-lib'` 过滤精确\n * (`interaction/commands/src/index.ts` + `conversation-nodes/command.ts`)。\n *\n * 已知信号盲区(设计取舍,见设计文档 §14/§16):\n * - steer 打断消息永不产生 `'user'` 节点 → 不触发发消息刷新(无状态变更,可接受);\n * - 忙碌期排队消息的 `user/message` 在 step 领取时才落盘 → 计数延迟至消息进入步骤;\n * - `command/run` 落在窗口外(压缩/截断)时节点 `name` 为 null → 不增\n * `refLibCommandDone`(罕见边界);\n * - 窗口长度变化(loadOlder/压缩/补拉)会增减计数 → 额外静默刷新(RefreshGuard 吸收)。\n *\n * 单次遍历同时派生两个计数(避免每次渲染两趟全量 filter)。\n * @module @hpyperry/dsh-ref-lib/src/client/refresh-triggers\n */\n\nimport type { ConversationNode } from '@deepseek-ai/dsh-client-runtime/client'\n\n/** 一次快照派生的刷新触发计数(RefLibDock 两个 effect 的依赖值)。 */\nexport interface RefreshTriggerCounts {\n /** `kind: 'user'` 节点数(普通人类消息;steer/context 不计)。 */\n readonly userMessageCount: number\n /** 已结算(outcome 非 null)的 `ref-lib` 命令节点数;运行中不计。 */\n readonly refLibCommandDone: number\n}\n\n/**\n * 从会话快照节点列表派生刷新触发计数。\n * @param nodes - `session.nodes`(窗口内全部会话节点,结构子集即可)。\n * @returns 两个计数;空列表返回 `{ userMessageCount: 0, refLibCommandDone: 0 }`。\n */\nexport function deriveRefreshTriggers(nodes: readonly ConversationNode[]): RefreshTriggerCounts {\n let userMessageCount = 0\n let refLibCommandDone = 0\n for (const node of nodes) {\n if (node.kind === 'user') {\n userMessageCount += 1\n } else if (node.kind === 'command' && node.name === 'ref-lib' && node.outcome !== null) {\n refLibCommandDone += 1\n }\n }\n return { userMessageCount, refLibCommandDone }\n}\n","/**\n * 应用内目录浏览器(browse 后端可用时,「选择目录」的落地实现)。\n *\n * 为什么需要它:v6 起 profile 把 directory-picker 从 -auto(本机解析为 native,\n * OS 对话框硬编码英文且每次拉 osascript 进程)切换为 -browse 后,\n * `host.pickDirectory`(native 专用 RPC)不再可用;本组件用 `listDirectory`\n * (Node stdlib 列目录,zh/en 本地化、无 OS 进程)提供等价的目录选择:\n * 面包屑 + 路径编辑 + 子目录列表,点击下行进入,「选择此目录」把当前层级添加为\n * 参考库。简化为单列(与官方 DirectoryBrowser 的 Miller 双列相比),\n * 但覆盖添加参考库的核心路径。\n * @module @hpyperry/dsh-ref-lib/src/client/RefLibBrowser\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport {\n Button,\n IconChevronRightOutline14,\n IconEditOutline16,\n IconFolderClose16,\n IconFolderOpen16,\n IconLoadingOutline16,\n IconWarningOutline16,\n Modal,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { DirectoryEntry, DirectoryListing } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { TranslateNS } from '@deepseek-ai/dsh-client-ui-slots'\n\n/** 面板组件依赖的注入面(由 RefLibDock 提供)。 */\nexport interface RefLibBrowserProps {\n /** 对话框可见性。 */\n open: boolean\n /** 关闭(Escape / 遮罩 / 取消)。 */\n onClose: () => void\n /** 列出一层目录(缺省路径 = 宿主主目录);signal 中止被取代的扫描。 */\n listDirectory: (path?: string, signal?: AbortSignal) => Promise<DirectoryListing>\n /** 本地化取词。 */\n t: TranslateNS<'ref-lib'>\n /** 选定当前层级目录(父组件负责添加并刷新)。 */\n onOpen: (path: string) => void\n}\n\n/** 面包屑展示:主目录子树内以本地化 Home 开头;之外显示完整祖先链。 */\nfunction displayCrumbs(listing: DirectoryListing, homeLabel: string): DirectoryEntry[] {\n const homeIndex = listing.crumbs.findIndex((crumb) => crumb.path === listing.home)\n if (homeIndex === -1) return listing.crumbs\n const tail = listing.crumbs.slice(homeIndex + 1)\n return [{ name: homeLabel, path: listing.home, hidden: false }, ...tail]\n}\n\n/** 平台分隔符(由宿主主目录推断,绝不从键入文本推断)。 */\nfunction separatorOf(listing: DirectoryListing): '\\\\' | '/' {\n return listing.home.includes('\\\\') ? '\\\\' : '/'\n}\n\n/**\n * 渲染应用内目录浏览器。\n * @param props - 见 {@link RefLibBrowserProps}。\n * @returns 对话框元素(关闭时 Modal 返回 null)。\n */\nexport function RefLibBrowser(props: RefLibBrowserProps): ReactElement {\n const { open, onClose, listDirectory, t, onOpen } = props\n const [listing, setListing] = useState<DirectoryListing | null>(null)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n // 路径编辑:null = 面包屑模式;字符串 = 正在键入的草稿。\n const [pathDraft, setPathDraft] = useState<string | null>(null)\n const seq = useRef(0)\n const controller = useRef<AbortController | null>(null)\n // IME 确认(Enter 选中候选)不得提交路径。\n const composing = useRef(false)\n\n /** 新意图胜出:中止在途扫描并使旧结果失效。 */\n const navigate = (target?: string): void => {\n controller.current?.abort()\n controller.current = null\n const mine = ++seq.current\n setLoading(true)\n setError(null)\n const ctrl = new AbortController()\n controller.current = ctrl\n listDirectory(target, ctrl.signal).then(\n (next) => {\n if (mine !== seq.current) return\n setListing(next)\n setLoading(false)\n },\n (cause: unknown) => {\n if (mine !== seq.current) return\n setLoading(false)\n setError(cause instanceof Error ? cause.message : String(cause))\n },\n )\n }\n\n // 打开时列主目录;关闭时清理在途扫描。\n useEffect(() => {\n if (open) {\n navigate()\n } else {\n seq.current += 1\n controller.current?.abort()\n controller.current = null\n setPathDraft(null)\n setError(null)\n }\n }, [open])\n\n const openPathEditor = (): void => {\n if (listing === null) {\n setPathDraft('')\n return\n }\n const sep = separatorOf(listing)\n const base = listing.path\n setPathDraft(base.endsWith(sep) ? base : base + sep)\n }\n\n const commitPath = (): void => {\n const draft = pathDraft ?? ''\n if (draft.trim() === '') return\n navigate(draft)\n setPathDraft(null)\n }\n\n const crumbs = listing === null ? [] : displayCrumbs(listing, t('browser.home'))\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={t('browser.title')}\n closeLabel={t('browser.cancel')}\n className=\"reflib-browser\"\n >\n <div className=\"reflib-panel\">\n {error !== null && (\n <div className=\"reflib-error\" role=\"alert\">\n <IconWarningOutline16 size={14} className=\"reflib-errorIcon\" />\n <span>{error}</span>\n </div>\n )}\n {/* 路径条:面包屑 + 编辑路径入口 */}\n <div className=\"reflib-browserPath\">\n {pathDraft === null ? (\n <>\n <span className=\"reflib-browserCrumbs\" role=\"navigation\">\n {crumbs.map((crumb, index) => (\n <span key={crumb.path} className=\"reflib-browserCrumb\">\n {index > 0 && <IconChevronRightOutline14 size={12} className=\"reflib-browserCrumbChevron\" />}\n <button\n type=\"button\"\n className=\"reflib-browserCrumbBtn\"\n disabled={loading}\n onClick={() => {\n navigate(crumb.path)\n }}\n >\n {crumb.name}\n </button>\n </span>\n ))}\n </span>\n <button\n type=\"button\"\n className=\"reflib-browserEdit\"\n aria-label={t('browser.editPath')}\n title={t('browser.editPath')}\n disabled={loading}\n onClick={openPathEditor}\n >\n <IconEditOutline16 size={14} />\n </button>\n </>\n ) : (\n <input\n className=\"reflib-browserInput\"\n value={pathDraft}\n aria-label={t('browser.editPath')}\n placeholder={t('browser.pathPlaceholder')}\n autoFocus\n disabled={loading}\n onChange={(event) => {\n setPathDraft(event.currentTarget.value)\n }}\n onCompositionStart={() => {\n composing.current = true\n }}\n onCompositionEnd={() => {\n composing.current = false\n }}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && !composing.current) {\n event.preventDefault()\n commitPath()\n }\n if (event.key === 'Escape') {\n event.stopPropagation()\n setPathDraft(null)\n }\n }}\n />\n )}\n </div>\n {/* 目录列表 */}\n {loading ? (\n <div className=\"reflib-status\" role=\"status\">\n <IconLoadingOutline16 size={20} className=\"reflib-spin reflib-statusIcon\" />\n <span className=\"reflib-statusText\">{t('browser.loading')}</span>\n </div>\n ) : listing !== null && listing.entries.length === 0 ? (\n <div className=\"reflib-status\">\n <IconFolderOpen16 size={22} className=\"reflib-statusIcon\" />\n <span className=\"reflib-statusText\">{t('browser.empty')}</span>\n </div>\n ) : (\n listing !== null && (\n <div className=\"reflib-browserList\">\n {listing.entries.map((entry) => (\n <button\n key={entry.path}\n type=\"button\"\n className=\"reflib-browserRow\"\n aria-label={t('browser.enter.aria', { name: entry.name })}\n disabled={loading}\n onClick={() => {\n navigate(entry.path)\n }}\n >\n <IconFolderClose16 size={16} className=\"reflib-browserRowIcon\" />\n <span className=\"reflib-browserRowName\">{entry.name}</span>\n </button>\n ))}\n </div>\n )\n )}\n <div className=\"reflib-divider\" />\n {/* 底部操作 */}\n <div className=\"reflib-browserFooter\">\n <Button variant=\"outline\" size=\"sm\" disabled={loading} onClick={onClose}>\n {t('browser.cancel')}\n </Button>\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={loading || listing === null}\n aria-label={t('browser.open.aria')}\n onClick={() => {\n if (listing !== null) onOpen(listing.path)\n }}\n >\n {t('browser.open')}\n </Button>\n </div>\n </div>\n </Modal>\n )\n}\n","/**\n * 参考库管理面板(Modal):列表(基名 + 全路径、移除操作)+ 添加表单。\n *\n * 设计(优化点 1/2):全部样式走 “--dsw-*” 设计令牌(随浅/深主题适配),\n * 列表行以「基名为主行、完整路径为次行」呈现,移除为带危险 hover 的图标按钮,\n * 添加为主按钮 + 路径输入(支持直接粘贴路径,绕开卡顿的系统选择器)+ 系统选择器\n * 兜底;空态/加载态/错误态各有独立视觉。文案全部经 `t` 本地化(zh/en)。\n * 本组件为纯展示:异步操作与错误归集由 RefLibDock 持有。\n * @module @hpyperry/dsh-ref-lib/src/client/RefLibPanel\n */\n\nimport { useEffect, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport {\n Button,\n IconEllipsisOutline16,\n IconFolderOpen16,\n IconLoadingOutline16,\n IconPlusOutline16,\n IconSearchOutline16,\n IconTrashOutline16,\n IconWarningOutline16,\n Input,\n Modal,\n Tooltip,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { TranslateNS } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { RefLibEntry } from '../spec.ts'\nimport { libBasename } from './data.ts'\n\n/** 用途说明最大长度(与 node half service.NOTE_MAX_LENGTH 一致)。 */\nconst NOTE_MAX_LENGTH = 120\n\n/** 面板组件依赖的注入面(由 RefLibDock 提供)。 */\nexport interface RefLibPanelProps {\n /** 对话框可见性。 */\n open: boolean\n /** 关闭(Escape / 遮罩 / 关闭按钮)。 */\n onClose: () => void\n /** 当前参考库列表。 */\n libs: readonly RefLibEntry[]\n /** 初次加载中(列表区显示加载态)。 */\n loading: boolean\n /** 任一异步操作(添加/移除)进行中:禁用全部操作。 */\n busy: boolean\n /** 系统目录选择器已打开(禁用添加表单,防重复唤起)。 */\n picking: boolean\n /** 正在移除的条目 id(该行显示行内 spinner)。 */\n removingId: string | null\n /** 已本地化的错误文案(null 表示无错误)。 */\n error: string | null\n /** 本地化取词。 */\n t: TranslateNS<'ref-lib'>\n /** 移除一个条目(父组件执行异步并刷新)。 */\n onRemove: (id: string) => void\n /** 按输入路径添加(可带用途说明 note);失败时抛出(面板保留输入内容)。 */\n onAddPath: (path: string, note?: string) => Promise<void>\n /** 更新条目的用途说明(详情编辑保存);失败入错误槽、不抛出。 */\n onUpdateNote: (id: string, note: string) => Promise<void>\n /** 唤起目录选择(browse/native),返回选中路径或 null(取消)——由面板填入路径字段,不直接添加。 */\n onBrowse: () => Promise<string | null>\n}\n\n/**\n * 渲染参考库管理面板。\n * @param props - 见 {@link RefLibPanelProps}。\n * @returns 对话框元素(关闭时 Modal 返回 null)。\n */\nexport function RefLibPanel(props: RefLibPanelProps): ReactElement {\n const { open, onClose, libs, loading, busy, picking, removingId, error, t, onRemove, onAddPath, onUpdateNote, onBrowse } = props\n const [draft, setDraft] = useState('')\n const [noteDraft, setNoteDraft] = useState('')\n // 详情展开:正在查看/编辑的条目 id + 编辑中的用途草稿。\n const [detailId, setDetailId] = useState<string | null>(null)\n const [editNote, setEditNote] = useState('')\n\n // 面板关闭时清空输入草稿:每次打开都是干净的添加表单(失败保留输入的行为只限于面板打开期间)。\n useEffect(() => {\n if (!open) {\n setDraft('')\n setNoteDraft('')\n setDetailId(null)\n }\n }, [open])\n\n const handleSubmit = async (): Promise<void> => {\n const trimmed = draft.trim()\n if (trimmed === '') return\n try {\n const note = noteDraft.trim()\n await onAddPath(trimmed, note === '' ? undefined : note)\n setDraft('')\n setNoteDraft('')\n } catch {\n /* 错误由父组件在统一错误槽展示;输入保留以便修正 */\n }\n }\n\n /** 浏览选中目录 → 填入路径字段(不直接添加,用户可补用途后提交)。 */\n const handleBrowse = async (): Promise<void> => {\n const path = await onBrowse()\n if (path !== null) setDraft(path)\n }\n\n /** 展开/收起条目详情;展开时载入当前用途草稿。 */\n const toggleDetail = (entry: RefLibEntry): void => {\n if (detailId === entry.id) {\n setDetailId(null)\n return\n }\n setDetailId(entry.id)\n setEditNote(entry.note ?? '')\n }\n\n /** 保存详情编辑的用途说明;成功后收起详情。 */\n const handleSaveNote = async (): Promise<void> => {\n if (detailId === null) return\n await onUpdateNote(detailId, editNote)\n setDetailId(null)\n }\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={t('panel.title')}\n closeLabel={t('panel.close')}\n description={t('panel.description', { count: String(libs.length) })}\n className=\"reflib-modal\"\n >\n <div className=\"reflib-panel\">\n {error !== null && (\n <div className=\"reflib-error\" role=\"alert\">\n <IconWarningOutline16 size={14} className=\"reflib-errorIcon\" />\n <span>{error}</span>\n </div>\n )}\n {loading ? (\n <div className=\"reflib-status\" role=\"status\">\n <IconLoadingOutline16 size={20} className=\"reflib-spin reflib-statusIcon\" />\n <span className=\"reflib-statusText\">{t('list.loading')}</span>\n </div>\n ) : libs.length === 0 ? (\n <div className=\"reflib-status\">\n <IconFolderOpen16 size={22} className=\"reflib-statusIcon\" />\n <span className=\"reflib-statusText\">{t('list.empty')}</span>\n <span className=\"reflib-statusHint\">{t('list.empty.hint')}</span>\n </div>\n ) : (\n <div className=\"reflib-list\">\n {libs.map((entry) => {\n const name = libBasename(entry.path)\n const removing = removingId === entry.id\n const detailOpen = detailId === entry.id\n const unavailable = entry.status !== undefined && entry.status !== 'available'\n return (\n <div\n key={entry.id}\n className=\"reflib-listItem\"\n data-removing={removing || undefined}\n data-status={unavailable ? entry.status : undefined}\n >\n <div className=\"reflib-row\">\n {unavailable\n ? <IconWarningOutline16 size={16} className=\"reflib-rowIcon reflib-rowIconWarn\" />\n : <IconFolderOpen16 size={16} className=\"reflib-rowIcon\" />}\n <div className=\"reflib-rowBody\">\n <span className=\"reflib-rowName\" title={entry.path}>\n {name}\n </span>\n <span className=\"reflib-rowPath\" title={entry.path}>\n {entry.path}\n </span>\n {unavailable && (\n <span className=\"reflib-rowStatus\" role=\"status\">\n {t(entry.status === 'missing' ? 'status.missing' : 'status.notDirectory')}\n </span>\n )}\n {entry.note !== undefined && entry.note !== '' && (\n <span className=\"reflib-rowNote\" title={entry.note}>\n {entry.note.replace(/\\s+/g, ' ')}\n </span>\n )}\n </div>\n <Tooltip label={t('detail.open')} side=\"top\" delayMs={400}>\n <button\n type=\"button\"\n className=\"reflib-rowAction\"\n aria-label={t('detail.open.aria', { name })}\n aria-expanded={detailOpen || undefined}\n // 失效条目只允许移除:详情/用途编辑禁用(node 端 note 接口同样拒绝)。\n disabled={busy || removingId !== null || unavailable}\n onClick={() => {\n toggleDetail(entry)\n }}\n >\n <IconEllipsisOutline16 size={14} />\n </button>\n </Tooltip>\n <Tooltip label={t('list.remove')} side=\"top\" delayMs={400}>\n <button\n type=\"button\"\n className=\"reflib-rowRemove\"\n aria-label={t('list.remove.aria', { name })}\n disabled={busy || removingId !== null}\n onClick={() => {\n onRemove(entry.id)\n }}\n >\n {removing ? (\n <IconLoadingOutline16 size={14} className=\"reflib-spin\" />\n ) : (\n <IconTrashOutline16 size={14} />\n )}\n </button>\n </Tooltip>\n </div>\n {/* 失效条目不渲染详情/用途编辑区(只允许移除) */}\n {detailOpen && !unavailable && (\n <div className=\"reflib-detail\">\n <div className=\"reflib-detailMeta\">\n <span className=\"reflib-detailKey\">ID</span>\n <span className=\"reflib-detailValue\">{entry.id}</span>\n </div>\n <div className=\"reflib-detailMeta\">\n <span className=\"reflib-detailKey\">{t('detail.path')}</span>\n <span className=\"reflib-detailValue\" title={entry.path}>\n {entry.path}\n </span>\n </div>\n <span className=\"reflib-detailKey\">{t('add.note.label')}</span>\n <div className=\"reflib-noteWrap\">\n <textarea\n className=\"reflib-noteTextarea\"\n value={editNote}\n placeholder={t('add.note.placeholder')}\n aria-label={t('add.note.label')}\n disabled={busy}\n rows={3}\n maxLength={NOTE_MAX_LENGTH}\n onChange={(event) => {\n setEditNote(event.currentTarget.value)\n }}\n />\n <span className=\"reflib-noteCount\">\n {editNote.length}/{NOTE_MAX_LENGTH}\n </span>\n </div>\n <div className=\"reflib-detailActions\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={busy}\n onClick={() => {\n setDetailId(null)\n }}\n >\n {t('detail.cancel')}\n </Button>\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={busy}\n onClick={() => {\n void handleSaveNote()\n }}\n >\n {t('detail.save')}\n </Button>\n </div>\n </div>\n )}\n </div>\n )\n })}\n </div>\n )}\n <div className=\"reflib-divider\" />\n <div className=\"reflib-add\">\n <span className=\"reflib-addLabel\">{t('add.label')}</span>\n {/* 统一表单:路径(可输入 / 浏览填充)+ 用途(可选),同一「添加」提交 */}\n <div className=\"reflib-addRow\">\n <Input\n className=\"reflib-addInputWrap\"\n value={draft}\n placeholder={t('add.placeholder')}\n aria-label={t('add.label')}\n disabled={busy || picking}\n onChange={(event) => {\n setDraft(event.currentTarget.value)\n }}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && !event.nativeEvent.isComposing) {\n event.preventDefault()\n void handleSubmit()\n }\n }}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n icon={<IconSearchOutline16 size={14} />}\n disabled={busy || picking}\n onClick={() => {\n void handleBrowse()\n }}\n >\n {t('add.browse')}\n </Button>\n </div>\n <div className=\"reflib-noteWrap\">\n <textarea\n className=\"reflib-noteTextarea\"\n value={noteDraft}\n placeholder={t('add.note.placeholder')}\n aria-label={t('add.note.label')}\n disabled={busy || picking}\n rows={2}\n maxLength={NOTE_MAX_LENGTH}\n onChange={(event) => {\n setNoteDraft(event.currentTarget.value)\n }}\n />\n <span className=\"reflib-noteCount\">\n {noteDraft.length}/{NOTE_MAX_LENGTH}\n </span>\n </div>\n <Button\n variant=\"primary\"\n className=\"reflib-addSubmit\"\n icon={<IconPlusOutline16 size={14} />}\n disabled={busy || picking || draft.trim() === ''}\n onClick={() => {\n void handleSubmit()\n }}\n >\n {t('add.submit')}\n </Button>\n <span className=\"reflib-addHint\">{t('add.hint')}</span>\n </div>\n </div>\n </Modal>\n )\n}\n","/**\n * 参考库入口(conversation.input.dock,输入卡正上方)+ 面板状态持有者。\n *\n * 位置(v7):v5/v6 曾在 hero 相位把胶囊**测量定位**提入官方 hero 行(紧跟\"标准\n * 模式\"chip 之后)。该像素测量与 hero 行的异步内容存在竞态——模式 chip 的 roster\n * 经 RPC 异步挂载、Web 字体异步加载、其他插件 chip 异步加入——而重测触发面\n * (hero 行/槽位出口/栈均为固定盒或 display:contents)对\"行内内容变化\"是盲区,\n * 导致偶发与模式按钮重叠。v7 起**取消测量与绝对定位**:胶囊统一渲染在 dock 槽位\n * (输入卡正上方)的独立一行,左缘经官方设计令牌(--dsh-composer-side-clearance /\n * --dsh-composer-card-max-width)纯 CSS 与输入卡左缘对齐——hero/active 一致、\n * 零 JS 测量、零竞态;plan/model 等工具行座位的启停不影响本行位置;与其他 dock\n * 条带(todo/goal/queue)按 order 流式堆叠,天然不重叠。\n *\n * 数据(v4/v5):读/写经 /api/ref-lib/* 路由(静默、无命令卡片);\n * 目录选择走系统原生选择器,另提供路径输入直加(绕开卡顿的原生对话框)。\n * @module @hpyperry/dsh-ref-lib/src/client/RefLibDock\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { DirectoryListing, SessionId } from '@deepseek-ai/dsh-client-runtime/client'\nimport { IconFolderOpen16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { RefLibEntry } from '../spec.ts'\nimport { RefLibApiError } from './data.ts'\nimport type { RefLibKey } from './locales.ts'\nimport { RefreshGuard } from './refresh-guard.ts'\nimport { deriveRefreshTriggers } from './refresh-triggers.ts'\nimport { RefLibBrowser } from './RefLibBrowser.tsx'\nimport { RefLibPanel } from './RefLibPanel.tsx'\nimport { ensureRefLibStyles } from './styles.ts'\n\n/** 面板组件依赖的注入面(apply 闭包绑定 runtime 能力)。 */\nexport interface RefLibDockInjected {\n /** 读取会话的参考库列表(GET /api/ref-lib/list,静默)。 */\n load: (sessionId: SessionId) => Promise<RefLibEntry[]>\n /** 添加一个参考库目录(POST /api/ref-lib/add,静默;note 为可选用途说明)。 */\n add: (sessionId: SessionId, path: string, note?: string) => Promise<void>\n /** 移除一个参考库条目(POST /api/ref-lib/remove,静默)。 */\n remove: (sessionId: SessionId, id: string) => Promise<void>\n /** 更新一个条目的用途说明(POST /api/ref-lib/note,静默;空串清除)。 */\n setNote: (sessionId: SessionId, id: string, note: string) => Promise<void>\n /** 唤起系统原生\"选择文件夹\"对话框;取消时返回 null。 */\n pickDirectory: () => Promise<string | null>\n /** 列出一层目录(browse 后端);缺省路径 = 宿主主目录;signal 中止扫描。 */\n listDirectory: (path?: string, signal?: AbortSignal) => Promise<DirectoryListing>\n}\n\n/** 挂载预载失败重试:间隔与上限(重启后会话 live 通常 <1s,重试 1–2 次即成功)。 */\nconst MOUNT_RETRY_DELAY_MS = 800\nconst MOUNT_RETRY_MAX = 5\n\n/** 完整 props:input.dock 运行时套件 + 注入面 + 本地化 seat。 */\nexport type RefLibDockProps = PropsRuntime<'conversation.input.dock'> & RefLibDockInjected & PropsLocale<'ref-lib'>\n\n/** wire 错误码 → 本地化文案键(未知码回退原始消息)。 */\nconst ERROR_KEYS: Record<string, RefLibKey> = {\n 'ref-lib/missing': 'error.missing',\n 'ref-lib/not-directory': 'error.notDirectory',\n 'ref-lib/unsafe': 'error.unsafe',\n 'ref-lib/unknown-id': 'error.unknownId',\n 'ref-lib/unavailable': 'error.unavailable',\n}\n\n/** 把未知错误规整为可展示文案。 */\nfunction messageOf(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause)\n}\n\n/**\n * 把 API 错误本地化:已知 wire code 映射为当前语言文案(带 path/id 参数),\n * 其余错误原样展示服务端消息。\n */\nfunction formatError(cause: unknown, t: RefLibDockProps['t']): string {\n if (cause instanceof RefLibApiError) {\n const key = ERROR_KEYS[cause.code]\n if (key !== undefined) {\n const params =\n cause.details.path !== undefined\n ? { path: cause.details.path }\n : cause.details.id !== undefined\n ? { id: cause.details.id }\n : undefined\n return t(key, params)\n }\n }\n return messageOf(cause)\n}\n\n// 模块装载即注入样式(幂等);组件挂载后再兜底一次(覆盖装载早于 DOM 的情况)。\nensureRefLibStyles()\n\n/**\n * 输入卡正上方的参考库入口:胶囊按钮(图标 + 文案 + 数量徽标)唤起管理面板。\n * 位置由 .reflib-dock 的纯 CSS padding 与输入卡左缘对齐,无任何 JS 测量。\n * @param props - sessionId 与注入面。\n * @returns 胶囊入口(+ 打开时的管理面板)。\n */\nexport function RefLibDock(props: RefLibDockProps): ReactElement {\n const { sessionId, session, load, add, remove, setNote, pickDirectory, listDirectory, t } = props\n const [open, setOpen] = useState(false)\n const [libs, setLibs] = useState<RefLibEntry[]>([])\n const [loading, setLoading] = useState(false)\n const [busy, setBusy] = useState(false)\n const [picking, setPicking] = useState(false)\n const [removingId, setRemovingId] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n // 并发读守卫(竞态控制):仅采纳最新一次 refresh 的结果(挂载预载/开面板/轮询/\n // 操作后刷新可能重叠);详见 src/client/refresh-guard.ts 与 tests/refresh-guard.spec.ts。\n const guard = useRef(new RefreshGuard())\n\n // 目录选择能力(v6):browse(应用内浏览器,listDirectory)或 native(OS 对话框,\n // pickDirectory)。探测一次并缓存;host 侧能力在单次 boot 内稳定。\n const [pickerMode, setPickerMode] = useState<'browse' | 'native' | null>(null)\n const [browserOpen, setBrowserOpen] = useState(false)\n // pickPath 等待应用内浏览器选定时挂起的 resolve(取消以 null 结束)。\n const pendingPick = useRef<((path: string | null) => void) | null>(null)\n const detectPicker = async (): Promise<'browse' | 'native'> => {\n if (pickerMode !== null) return pickerMode\n let mode: 'browse' | 'native'\n try {\n await listDirectory(undefined, new AbortController().signal)\n mode = 'browse'\n } catch {\n // browse 不可用(directory-picker-unavailable)→ 回退 native 尝试;\n // pickDirectory 若也不可用,由错误槽如实展示。\n mode = 'native'\n }\n setPickerMode(mode)\n return mode\n }\n\n /**\n * 拉取会话参考库列表并更新 UI。\n * @param silent - 静默模式(轮询用):失败不写入错误槽;成功也**不碰 error/loading**\n * ——错误与加载态只由用户操作/打开面板管理,避免后台轮询吞掉操作错误提示或\n * 提前结束面板加载态(轮询仅更新 libs 数据)。\n */\n const refresh = async (silent = false): Promise<void> => {\n const mine = guard.current.begin()\n try {\n const next = await load(sessionId)\n if (!guard.current.isLatest(mine)) return\n setLibs(next)\n if (!silent) setError(null)\n } catch (cause) {\n if (!guard.current.isLatest(mine)) return\n if (!silent) setError(formatError(cause, t))\n } finally {\n if (guard.current.isLatest(mine) && !silent) setLoading(false)\n }\n }\n\n // 挂载/会话切换预载(带失败重试):重启 dsh web 后会话可能尚未 live(/list 404),\n // 首次加载失败若直接放弃,胶囊角标/列表会缺失直到用户点开面板——延迟重试直至\n // 会话就绪或达到上限,让\"刚启动\"的失效角标也能自动出现(seq 守卫防并发竞态)。\n useEffect(() => {\n ensureRefLibStyles()\n let stopped = false\n let retries = 0\n let timer: number | undefined\n const attempt = async (): Promise<void> => {\n const mine = guard.current.begin()\n try {\n const next = await load(sessionId)\n if (stopped || !guard.current.isLatest(mine)) return\n setLibs(next)\n setError(null)\n } catch (cause) {\n if (stopped || !guard.current.isLatest(mine)) return\n if (retries < MOUNT_RETRY_MAX) {\n retries += 1\n timer = window.setTimeout(() => { void attempt() }, MOUNT_RETRY_DELAY_MS)\n return\n }\n setError(formatError(cause, t))\n } finally {\n if (!stopped && guard.current.isLatest(mine)) setLoading(false)\n }\n }\n void attempt()\n return () => {\n stopped = true\n if (timer !== undefined) window.clearTimeout(timer)\n }\n }, [sessionId])\n useEffect(() => {\n if (open) {\n setLoading(true)\n void refresh()\n }\n }, [open])\n\n // 发消息即刷新(交互钩子):dock owner 的 `session` 是**响应式会话快照**\n // (ConversationRoot `useSession(s => s)`,每次会话 store 发布重渲染)——用户\n // 发消息落盘后产生 user 消息节点(`kind: 'user'`),计数 +1 触发静默刷新;\n // 流式 assistant 回复不改变 user 计数,不会每 token 刷新。\n // 信号盲区(rc.7 查证,见 refresh-triggers.ts 与设计文档 §16):steer 打断消息\n // 折叠为 'steering' 节点不触发;忙碌期排队消息的 user 节点在 step 领取时才落盘\n // (刷新延迟);外部文件操作无会话事件(下次 GUI 交互同步)。\n const { userMessageCount, refLibCommandDone } = deriveRefreshTriggers(session.nodes)\n useEffect(() => {\n void refresh(true)\n }, [userMessageCount])\n\n // 命令执行即刷新:`/ref-lib` 命令(add/remove/note)执行必然产生 log-only\n // `command/run` → `command/done`,会话快照中的 command 节点从 running\n // (outcome null)变为 settled——settled 计数 +1 触发静默刷新(命令 handler 先\n // 落盘 sidecar 再结算,故刷新读到的必是新数据)。与其他插件命令隔离:命令名是\n // typed name(无别名、重名注册 fail loud),`name === 'ref-lib'` 过滤精确。\n // 盲区:command/run 落在窗口外(压缩/截断)时 name 为 null,本次完成不刷新。\n useEffect(() => {\n void refresh(true)\n }, [refLibCommandDone])\n\n // 后台轮询已移除(2026-08-22 用户决策):UI 同步改为**交互驱动**——/ref-lib\n // 命令完成、发消息、面板操作均即时刷新;外部文件操作(删/恢复目录)在下次\n // GUI 交互时同步。注入侧不受影响:每次模型请求的注入回调仍实时探测\n // (node half list()),与 UI 刷新完全解耦。详见设计文档 §14。\n\n const handleRemove = async (id: string): Promise<void> => {\n setRemovingId(id)\n setBusy(true)\n setError(null)\n try {\n await remove(sessionId, id)\n await refresh()\n } catch (cause) {\n setError(formatError(cause, t))\n } finally {\n setRemovingId(null)\n setBusy(false)\n }\n }\n\n const handleAddPath = async (path: string, note?: string): Promise<void> => {\n setBusy(true)\n setError(null)\n try {\n await add(sessionId, path, note)\n await refresh()\n } catch (cause) {\n setError(formatError(cause, t))\n // 失败时重新抛出:让面板保留输入内容供修正\n throw cause\n } finally {\n setBusy(false)\n }\n }\n\n /** 更新条目用途说明(编辑详情保存);失败入错误槽、不抛出(编辑区保持打开)。 */\n const handleUpdateNote = async (id: string, note: string): Promise<void> => {\n setBusy(true)\n setError(null)\n try {\n await setNote(sessionId, id, note)\n await refresh()\n } catch (cause) {\n setError(formatError(cause, t))\n } finally {\n setBusy(false)\n }\n }\n\n /** 唤起目录选择(browse 应用内浏览器 / native 系统对话框)并返回选中的路径;\n * 取消或失败返回 null——**不直接添加**,由面板把路径填入表单(用户可补用途后提交)。 */\n const pickPath = async (): Promise<string | null> => {\n setError(null)\n // 探测目录选择能力:browse → 应用内目录浏览器;native → 系统 OS 对话框。\n let mode: 'browse' | 'native'\n try {\n mode = await detectPicker()\n } catch (cause) {\n setError(formatError(cause, t))\n return null\n }\n if (mode === 'browse') {\n setBrowserOpen(true)\n return await new Promise<string | null>((resolve) => {\n pendingPick.current = resolve\n })\n }\n setPicking(true)\n try {\n return await pickDirectory()\n } catch (cause) {\n setError(formatError(cause, t))\n return null\n } finally {\n setPicking(false)\n }\n }\n\n /** 应用内浏览器选定目录 → 把路径交给等待中的 pickPath 调用方并关闭浏览器。 */\n const handleBrowserPick = (path: string): void => {\n setBrowserOpen(false)\n const resolve = pendingPick.current\n pendingPick.current = null\n resolve?.(path)\n }\n\n /** 应用内浏览器取消 → 以 null 结束等待中的 pickPath。 */\n const handleBrowserClose = (): void => {\n setBrowserOpen(false)\n const resolve = pendingPick.current\n pendingPick.current = null\n resolve?.(null)\n }\n\n /**\n * 胶囊计数(v9):徽标显示**可用**数量(失效不计入),红色角标显示失效数量\n * (总数 − 可用数),仅存在失效条目时显示。注意:UI 数据只在打开面板/操作后\n * 刷新,外部变更(如删除目录)不会自动反向同步到界面(与命令修改后不刷新同属\n * 待解决的 UI 数据同步问题,见设计文档\"遗留备注\")。\n */\n const availableCount = libs.filter((entry) => entry.status === 'available').length\n const unavailableCount = libs.length - availableCount\n\n return (\n <>\n <div className=\"reflib-dock\">\n <button\n type=\"button\"\n className=\"reflib-chip\"\n data-active={open || undefined}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-label={\n unavailableCount > 0\n ? t('dock.unavailable', { count: String(unavailableCount) })\n : availableCount > 0 ? t('dock.count.aria', { count: String(availableCount) }) : t('dock.aria')\n }\n title={t('dock.aria')}\n onClick={() => {\n setOpen((value) => !value)\n }}\n >\n <span className=\"reflib-chipIcon\">\n <IconFolderOpen16 size={14} />\n </span>\n <span className=\"reflib-chipLabel\">{t('dock.label')}</span>\n {availableCount > 0 && <span className=\"reflib-chipBadge\">{availableCount}</span>}\n {unavailableCount > 0 && (\n <span className=\"reflib-chipWarn\" title={t('dock.unavailable', { count: String(unavailableCount) })}>\n {unavailableCount}\n </span>\n )}\n </button>\n </div>\n <RefLibPanel\n open={open}\n onClose={() => {\n setOpen(false)\n }}\n libs={libs}\n loading={loading}\n busy={busy}\n picking={picking}\n removingId={removingId}\n error={error}\n t={t}\n onRemove={(id) => {\n void handleRemove(id)\n }}\n onAddPath={handleAddPath}\n onUpdateNote={handleUpdateNote}\n onBrowse={pickPath}\n />\n <RefLibBrowser\n open={browserOpen}\n onClose={handleBrowserClose}\n listDirectory={listDirectory}\n t={t}\n onOpen={handleBrowserPick}\n />\n </>\n )\n}\n","/**\n * ref-lib client 本地化字典(zh 为键集唯一来源,en 与之逐键对齐)。\n *\n * 语言适配(优化点 2):面板、入口胶囊与添加表单的全部文案经\n * `ctx.locale.register(NS, { zh, en })` 注册,槽位注册声明 `locale: NS`,\n * 组件经框架注入的 `t` seat 取词(活动语言实时切换,缺省回退 zh)。\n * 键对等由 `satisfies Record<RefLibKey, string>` 在编译期强制。\n * @module @hpyperry/dsh-ref-lib/src/client/locales\n */\n\n/** 简体中文字典(键集唯一来源)。 */\nexport const zh = {\n // ── 输入框上方入口胶囊(conversation.input.dock)──\n 'dock.label': '参考库',\n 'dock.aria': '管理只读参考库',\n 'dock.count.aria': '参考库,共 {count} 个',\n 'dock.unavailable': '参考库,{count} 个失效',\n // ── 条目可用性(失效检测,v9)──\n 'status.missing': '目录已删除或不可访问',\n 'status.notDirectory': '路径不再是目录',\n // ── 管理面板 ──\n 'panel.title': '参考库',\n 'panel.close': '关闭',\n 'panel.description': '共 {count} 个只读参考库:供 agent 读取参考,禁止修改其中文件',\n 'list.remove': '移除',\n 'list.remove.aria': '移除参考库 {name}',\n 'list.empty': '还没有参考库',\n 'list.empty.hint': '在下方输入目录路径,或点击「浏览」选择目录',\n 'list.loading': '正在加载…',\n // ── 条目详情 ──\n 'detail.open': '查看详情',\n 'detail.open.aria': '查看 {name} 的详情',\n 'detail.path': '路径',\n 'detail.cancel': '取消',\n 'detail.save': '保存',\n // ── 添加表单 ──\n 'add.label': '添加参考库',\n 'add.placeholder': '输入目录路径(支持 ~ 与相对)',\n 'add.submit': '添加',\n 'add.browse': '浏览',\n 'add.note.label': '用途说明',\n 'add.note.placeholder': '用途说明(可选,帮助 agent 判断相关性)',\n 'add.hint': '目录仅作只读参考;用途不填时自动提取 README 标题',\n // ── 应用内目录浏览器(browse 后端)──\n 'browser.title': '选择目录',\n 'browser.home': '主目录',\n 'browser.open': '选择此目录',\n 'browser.open.aria': '添加当前目录为参考库',\n 'browser.enter.aria': '进入目录 {name}',\n 'browser.editPath': '编辑路径',\n 'browser.pathPlaceholder': '输入绝对路径,回车跳转',\n 'browser.empty': '该目录下没有子目录',\n 'browser.loading': '加载中…',\n 'browser.cancel': '取消',\n // ── 错误映射(wire code → 本地化文案)──\n 'error.missing': '目录不存在:{path}',\n 'error.notDirectory': '不是目录:{path}',\n 'error.unsafe': '路径包含控制字符,已拒绝:{path}',\n 'error.unknownId': '未找到参考库条目:{id}',\n 'error.unavailable': '参考库目录不可用(仅允许移除)',\n // ── /ref-lib 命令结果卡片(conversation.chat.commandview)──\n 'command.running': '执行中…',\n 'command.done': '完成',\n 'command.copy': '复制',\n 'command.copied': '已复制',\n} satisfies Record<string, string>\n\n/** ref-lib 命名空间的键集。 */\nexport type RefLibKey = keyof typeof zh\n\n/** 英文词典,与 zh 键集逐键对齐(编译期校验)。 */\nexport const en = {\n 'dock.label': 'Reference Library',\n 'dock.aria': 'Manage read-only reference libraries',\n 'dock.count.aria': 'Reference library, {count} total',\n 'dock.unavailable': 'Reference library, {count} unavailable',\n // ── Entry availability (stale detection, v9) ──\n 'status.missing': 'Directory deleted or unavailable',\n 'status.notDirectory': 'Path is no longer a directory',\n 'panel.title': 'Reference Library',\n 'panel.close': 'Close',\n 'panel.description':\n '{count} read-only reference libraries: the agent may read them for reference, but must not modify any files',\n 'list.remove': 'Remove',\n 'list.remove.aria': 'Remove reference library {name}',\n 'list.empty': 'No reference libraries yet',\n 'list.empty.hint': 'Enter a directory path below, or click “Browse” to pick one',\n 'list.loading': 'Loading…',\n // ── Entry details ──\n 'detail.open': 'View details',\n 'detail.open.aria': 'View details of {name}',\n 'detail.path': 'Path',\n 'detail.cancel': 'Cancel',\n 'detail.save': 'Save',\n 'add.label': 'Add a reference library',\n 'add.placeholder': 'Enter a directory path (~ or relative)',\n 'add.submit': 'Add',\n 'add.browse': 'Browse',\n 'add.note.label': 'Description',\n 'add.note.placeholder': 'Description (optional; helps the agent judge relevance)',\n 'add.hint': 'Directories are read-only references; if no description is given, the README title is used',\n // ── In-app directory browser (browse backend) ──\n 'browser.title': 'Select Directory',\n 'browser.home': 'Home',\n 'browser.open': 'Select this folder',\n 'browser.open.aria': 'Add the current directory as a reference library',\n 'browser.enter.aria': 'Open folder {name}',\n 'browser.editPath': 'Edit path',\n 'browser.pathPlaceholder': 'Type an absolute path and press Enter',\n 'browser.empty': 'No subdirectories here',\n 'browser.loading': 'Loading…',\n 'browser.cancel': 'Cancel',\n 'error.missing': 'Directory does not exist: {path}',\n 'error.notDirectory': 'Not a directory: {path}',\n 'error.unsafe': 'Path contains control characters and was rejected: {path}',\n 'error.unknownId': 'Reference library entry not found: {id}',\n 'error.unavailable': 'Reference library directory unavailable (remove only)',\n // ── /ref-lib command result card (conversation.chat.commandview) ──\n 'command.running': 'Running…',\n 'command.done': 'Done',\n 'command.copy': 'Copy',\n 'command.copied': 'Copied',\n} satisfies Record<RefLibKey, string>\n","/**\n * ref-lib client 插件(浏览器端):在输入框上方(conversation.input.dock)\n * 注册「参考库」入口,提供 per-session 的 UI 交互式管理。\n *\n * 入口位置(v7):注册在输入框上方(conversation.input.dock)槽位,胶囊渲染在\n * 输入卡正上方的独立一行,经 CSS 令牌与输入卡左缘对齐——hero(新会话)与 active\n * (具体对话)统一可见、零测量、零竞态,新建会话一开始即可注入参考库。\n *\n * 数据通道(v4/v5):client 经**普通同源 fetch** 访问插件在宿主 `ctx.webServer`\n * 上自注册的 /api/ref-lib/* HTTP 路由(node 端读写 sidecar)——静默双向、\n * 不渲染命令卡片、不执行命令、不产生用户消息。路由 loopback-only 护栏见\n * `src/routes.ts`。目录选择走 `ctx.workspaces.pickDirectory()`(host 原生 OS\n * 选择器),另提供路径输入直加(优化点 2:绕开卡顿的原生对话框)。\n * 文案经 `ctx.locale` 全量本地化(zh/en,优化点 2)。\n * @module @hpyperry/dsh-ref-lib/src/client\n */\n\nimport type { ClientContext, SessionId } from '@deepseek-ai/dsh-client-runtime/client'\n// Side-effect type imports:加载 slot 声明合并(conversation.input.dock 由\n// ui-conversation 声明)与 locale 服务的类型。\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport type { RefLibEntry } from '../spec.ts'\nimport { parseApiErrorPayload, parseLibsPayload, RefLibApiError } from './data.ts'\nimport { RefLibCommandCard } from './RefLibCommandCard.tsx'\nimport { RefLibDock, type RefLibDockInjected } from './RefLibDock.tsx'\nimport { zh, en, type RefLibKey } from './locales.ts'\n\n/** 所需服务(cordis fiber inject)。 */\nexport const inject = ['slots', 'workspaces', 'locale']\n\n/** 本插件文案命名空间。 */\nconst NS = 'ref-lib'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n /** ref-lib 面板/入口文案。 */\n 'ref-lib': RefLibKey\n }\n}\n\n/**\n * 一条对宿主 /api/ref-lib 路由族的 JSON 调用;失败时优先抛出带 wire code 的\n * RefLibApiError(用于本地化),无 code 时回退普通 Error。\n */\nasync function api<T>(path: string, payload?: unknown, method = 'POST'): Promise<T> {\n const res = await fetch(\n '/api/ref-lib' + path,\n payload === undefined\n ? undefined\n : {\n method,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n },\n )\n let body: unknown = null\n try {\n body = await res.json()\n } catch {\n /* non-JSON error body */\n }\n if (!res.ok) {\n const parsed = parseApiErrorPayload(body)\n if (parsed !== null) throw new RefLibApiError(parsed.code, parsed.message, parsed.details)\n const message = (body as { error?: unknown } | null)?.error ?? 'HTTP ' + res.status\n throw new Error(typeof message === 'string' ? message : String(message))\n }\n return body as T\n}\n\n/**\n * 注册输入框上方的「参考库」入口与管理面板。\n * @param ctx - client 根上下文。\n */\nexport function apply(ctx: ClientContext): void {\n // 注册本插件文案命名空间(zh/en 逐键对齐,编译期校验)。\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'ref-lib: dictionaries')\n\n const injected = (): RefLibDockInjected => ({\n load: async (sessionId: SessionId): Promise<RefLibEntry[]> =>\n parseLibsPayload(\n await api<{ libs?: unknown }>(`/list?session=${encodeURIComponent(sessionId)}`, undefined, 'GET'),\n ),\n add: async (sessionId: SessionId, path: string, note?: string): Promise<void> => {\n await api('/add', { session: sessionId, path, ...(note === undefined ? {} : { note }) })\n },\n remove: async (sessionId: SessionId, id: string): Promise<void> => {\n await api('/remove', { session: sessionId, id })\n },\n setNote: async (sessionId: SessionId, id: string, note: string): Promise<void> => {\n await api('/note', { session: sessionId, id, note })\n },\n pickDirectory: () => ctx.workspaces.pickDirectory(),\n listDirectory: (path, signal) => ctx.workspaces.listDirectory(path, signal),\n })\n\n ctx.slots.inject('conversation.input.dock', () =>\n ctx.slots.register(\n {\n name: 'conversation.input.dock',\n id: 'ref-lib',\n // 排在最后面(goal 10 / queue 20 / git-graph 100 等之后):不与其他插件\n // 的 dock 入口抢位置;独立一行流式堆叠,天然不重叠。\n order: 200,\n locale: NS,\n inject: injected,\n },\n RefLibDock,\n ),\n )\n\n // /ref-lib 命令结果专属卡片:官方 GenericCommandCard 长结果显示不全(折叠单行\n // ellipsis / 展开 260px 内滚动),本卡片默认全展开完整结果 + 复制按钮。\n ctx.slots.inject('conversation.chat.commandview', () =>\n ctx.slots.register(\n {\n name: 'conversation.chat.commandview',\n key: 'ref-lib',\n locale: NS,\n },\n RefLibCommandCard,\n ),\n )\n}\n"],"mappings":"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"}
package/lib/routes.d.ts CHANGED
@@ -32,6 +32,10 @@ export interface RefLibRouteDeps {
32
32
  * - `GET /api/ref-lib/list?session=<id>` → `{ libs }`
33
33
  * - `POST /api/ref-lib/add { session, path }` → `{ entry }`
34
34
  * - `POST /api/ref-lib/remove { session, id }` → `{ ok: true }`
35
+ *
36
+ * 注:fork 继承不在此路由族——`session/created` 钩子(service.materializeInheritance)
37
+ * 在宿主创建子会话时直接写子会话 sidecar,UI 经现有 /list(dock 挂载 load)一次
38
+ * 刷新即可读到(2026-08-23 简化,移除原 POST /api/ref-lib/inherit 兜底路由)。
35
39
  * @param deps - 依赖面。
36
40
  * @returns 待注册到 `ctx.webServer` 的路由数组。
37
41
  */
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,WAAW,CAAA;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAA;AAE/D,OAAO,EAAgF,KAAK,aAAa,EAAE,MAAM,cAAc,CAAA;AAE/H,wBAAwB;AACxB,eAAO,MAAM,mBAAmB,QAAY,CAAA;AAE5C,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAoBnE;AA+BD,uCAAuC;AACvC,MAAM,WAAW,eAAe;IAC9B,yBAAyB;IACzB,OAAO,EAAE,aAAa,CAAA;IACtB,8DAA8D;IAC9D,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,GAAG,SAAS,CAAA;IAC1D,UAAU;IACV,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,QAAQ,EAAE,CAqKlE"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,WAAW,CAAA;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAA;AAE/D,OAAO,EAAgF,KAAK,aAAa,EAAE,MAAM,cAAc,CAAA;AAE/H,wBAAwB;AACxB,eAAO,MAAM,mBAAmB,QAAY,CAAA;AAE5C,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAoBnE;AA+BD,uCAAuC;AACvC,MAAM,WAAW,eAAe;IAC9B,yBAAyB;IACzB,OAAO,EAAE,aAAa,CAAA;IACtB,8DAA8D;IAC9D,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,GAAG,SAAS,CAAA;IAC1D,UAAU;IACV,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAC/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,QAAQ,EAAE,CAqKlE"}
package/lib/routes.js CHANGED
@@ -78,6 +78,10 @@ async function readJsonBody(req) {
78
78
  * - `GET /api/ref-lib/list?session=<id>` → `{ libs }`
79
79
  * - `POST /api/ref-lib/add { session, path }` → `{ entry }`
80
80
  * - `POST /api/ref-lib/remove { session, id }` → `{ ok: true }`
81
+ *
82
+ * 注:fork 继承不在此路由族——`session/created` 钩子(service.materializeInheritance)
83
+ * 在宿主创建子会话时直接写子会话 sidecar,UI 经现有 /list(dock 挂载 load)一次
84
+ * 刷新即可读到(2026-08-23 简化,移除原 POST /api/ref-lib/inherit 兜底路由)。
81
85
  * @param deps - 依赖面。
82
86
  * @returns 待注册到 `ctx.webServer` 的路由数组。
83
87
  */
package/lib/routes.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
package/lib/service.d.ts CHANGED
@@ -8,7 +8,20 @@
8
8
  * 会话日志被整体拒读(连写它的 harness 自己也读不回,SessionFormatUnsupportedError)。
9
9
  * v3 起 per-session 列表存为 dsh home 下的 sidecar JSON
10
10
  * (`<dshHome>/plugin-data/ref-lib/<sessionId>.json`);旧日志中的 `ref-lib/set`
11
- * 事件仅在冷读时折叠迁移一次,会话隔离与 fork 继承语义保持不变。
11
+ * 事件仅在冷读时折叠迁移一次。
12
+ *
13
+ * **fork 继承(2026-08-23 加固)**:dsh 的「分支会话」在宿主创建**新会话**
14
+ * (`SessionStore.fork()` 铸造新 id,header 携带 `parentSession`)。本服务在
15
+ * `session/created`(`{ global: true }`,与 core/tools 的 seed 钩子同款)时
16
+ * **物化继承**——子会话无自身 sidecar 则把父会话的有效列表复制到子会话自身文件
17
+ * 并**重新铸造条目 id**(fork 副本拥有独立身份;单次写盘)。这修复了纯惰性继承
18
+ * 的链式断口(fork 的分支的分支依赖中间会话是否落盘)并把继承时机从「首次读取」
19
+ * 提前到「fork 时刻」(确定性快照)。复制用「读父列表 + 写子文件」而非逐条 add():
20
+ * add() 会重复校验路径并重读 README 提取 note(IO 且可能改变 note),复制等价且
21
+ * 更省。UI 无需新通道:fork 后打开子会话,dock 挂载的现有 load()(GET /list)
22
+ * 一次刷新即可读到继承结果(2026-08-23 简化:不新增 webServer 接口)。
23
+ * 惰性 parentSession 继承路径(loadFromStorage 末段)保留并以同语义(重新铸造
24
+ * id + 落盘)服务旧版本创建的 legacy 子会话。
12
25
  * @module @hpyperry/dsh-ref-lib/src/service
13
26
  */
14
27
  import { Context, Service } from '@deepseek-ai/cordis';
@@ -124,6 +137,23 @@ export declare class RefLibService extends Service {
124
137
  * @throws {RefLibNoteError} note 含不允许的控制字符。
125
138
  */
126
139
  setNote(session: Session, id: string, note?: string): Promise<RefLibEntry>;
140
+ /**
141
+ * fork 继承物化(`session/created` 钩子调用):子会话(header 带 parentSession)
142
+ * 无自身 sidecar 时,把父会话的**有效列表**复制到子会话自身文件并**重新铸造条目
143
+ * id**(fork 副本拥有独立身份,不与父会话共享条目 id)——继承时机从「首次读取」
144
+ * 提前到「创建时刻」,并修复纯惰性继承的链式断口(中间会话未落盘时后代继承不
145
+ * 到)。同步执行、绝不抛错(announce 契约:session/created 监听器抛错会回滚
146
+ * 会话挂载)。
147
+ * @param session - 新创建的会话。
148
+ * @returns 物化后的子会话列表(未物化/无父会话时返回当前列表,含空列表)。
149
+ */
150
+ materializeInheritance(session: Session): readonly RefLibEntry[];
151
+ /** 复制父列表并重新铸造条目 id:fork 副本拥有自己的身份(同 id 的「关联价值」是
152
+ * 瞬时的——任一侧一变更即断裂,留不住;且避免未来跨会话功能/审计混淆)。 */
153
+ private mintOwnedCopy;
154
+ /** 解析父会话的有效参考库列表:优先经 live 父会话(覆盖父为 legacy/惰性子会话的
155
+ * 折叠路径),父会话不可得时兜底直接读其 sidecar 文件。 */
156
+ private resolveParentLibs;
127
157
  /** 冷读:sidecar 文件 → 旧日志事件迁移 → 父会话继承 → 空列表。 */
128
158
  private loadFromStorage;
129
159
  private pathOf;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAGvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAMhE;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAOlE;AAQD,oCAAoC;AACpC,eAAO,MAAM,eAAe,MAAM,CAAA;AAElC,mCAAmC;AACnC,qBAAa,eAAgB,SAAQ,KAAK;IAMtC,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,eAAe,GAAG,QAAQ;IANzD;;;OAGG;gBAEQ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,GAAG,eAAe,GAAG,QAAQ;CAW1D;AAED,oBAAoB;AACpB,qBAAa,kBAAmB,SAAQ,KAAK;IAI/B,QAAQ,CAAC,EAAE,EAAE,MAAM;IAH/B;;OAEG;gBACkB,EAAE,EAAE,MAAM;CAIhC;AAED,qCAAqC;AACrC,qBAAa,eAAgB,SAAQ,KAAK;;CAKzC;AAED,+DAA+D;AAC/D,qBAAa,sBAAuB,SAAQ,KAAK;IAInC,QAAQ,CAAC,IAAI,EAAE,MAAM;IAHjC;;OAEG;gBACkB,IAAI,EAAE,MAAM;CAIlC;AAED,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAStE;AA8BD,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,OAAO,EAAE,aAAa,CAAA;KACvB;CACF;AAED,0BAA0B;AAC1B,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAkBD;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,OAAO;IACxC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA4C;IAElE;;;OAGG;gBACS,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,mBAAwB;IAK1D;;oCAEgC;IAChC,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,WAAW,EAAE;IAQ9C;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IAc3B;;;;;;;;;;OAUG;IACG,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuC9E;;;;;OAKG;IACG,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzD;;;;;;;;;;OAUG;IACG,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAwBhF,6CAA6C;IAC7C,OAAO,CAAC,eAAe;IAyBvB,OAAO,CAAC,MAAM;IAKd,yDAAyD;IACzD,OAAO,CAAC,WAAW;IAanB,0CAA0C;IAC1C,OAAO,CAAC,WAAW;IAQnB,mCAAmC;IACnC,OAAO,CAAC,QAAQ;CAOjB"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAOH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAGvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAMhE;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAOlE;AAQD,oCAAoC;AACpC,eAAO,MAAM,eAAe,MAAM,CAAA;AAElC,mCAAmC;AACnC,qBAAa,eAAgB,SAAQ,KAAK;IAMtC,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,eAAe,GAAG,QAAQ;IANzD;;;OAGG;gBAEQ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,GAAG,eAAe,GAAG,QAAQ;CAW1D;AAED,oBAAoB;AACpB,qBAAa,kBAAmB,SAAQ,KAAK;IAI/B,QAAQ,CAAC,EAAE,EAAE,MAAM;IAH/B;;OAEG;gBACkB,EAAE,EAAE,MAAM;CAIhC;AAED,qCAAqC;AACrC,qBAAa,eAAgB,SAAQ,KAAK;;CAKzC;AAED,+DAA+D;AAC/D,qBAAa,sBAAuB,SAAQ,KAAK;IAInC,QAAQ,CAAC,IAAI,EAAE,MAAM;IAHjC;;OAEG;gBACkB,IAAI,EAAE,MAAM;CAIlC;AAED,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAStE;AA8BD,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,OAAO,EAAE,aAAa,CAAA;KACvB;CACF;AAED,0BAA0B;AAC1B,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAkBD;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,OAAO;IACxC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA4C;IAElE;;;OAGG;gBACS,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,mBAAwB;IAY1D;;oCAEgC;IAChC,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,WAAW,EAAE;IAQ9C;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IAc3B;;;;;;;;;;OAUG;IACG,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuC9E;;;;;OAKG;IACG,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzD;;;;;;;;;;OAUG;IACG,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAwBhF;;;;;;;;;OASG;IACH,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,WAAW,EAAE;IAkBhE;8CAC0C;IAC1C,OAAO,CAAC,aAAa;IAIrB;yCACqC;IACrC,OAAO,CAAC,iBAAiB;IASzB,6CAA6C;IAC7C,OAAO,CAAC,eAAe;IA+BvB,OAAO,CAAC,MAAM;IAKd,yDAAyD;IACzD,OAAO,CAAC,WAAW;IAanB,0CAA0C;IAC1C,OAAO,CAAC,WAAW;IAQnB,mCAAmC;IACnC,OAAO,CAAC,QAAQ;CAOjB"}
package/lib/service.js CHANGED
@@ -8,7 +8,20 @@
8
8
  * 会话日志被整体拒读(连写它的 harness 自己也读不回,SessionFormatUnsupportedError)。
9
9
  * v3 起 per-session 列表存为 dsh home 下的 sidecar JSON
10
10
  * (`<dshHome>/plugin-data/ref-lib/<sessionId>.json`);旧日志中的 `ref-lib/set`
11
- * 事件仅在冷读时折叠迁移一次,会话隔离与 fork 继承语义保持不变。
11
+ * 事件仅在冷读时折叠迁移一次。
12
+ *
13
+ * **fork 继承(2026-08-23 加固)**:dsh 的「分支会话」在宿主创建**新会话**
14
+ * (`SessionStore.fork()` 铸造新 id,header 携带 `parentSession`)。本服务在
15
+ * `session/created`(`{ global: true }`,与 core/tools 的 seed 钩子同款)时
16
+ * **物化继承**——子会话无自身 sidecar 则把父会话的有效列表复制到子会话自身文件
17
+ * 并**重新铸造条目 id**(fork 副本拥有独立身份;单次写盘)。这修复了纯惰性继承
18
+ * 的链式断口(fork 的分支的分支依赖中间会话是否落盘)并把继承时机从「首次读取」
19
+ * 提前到「fork 时刻」(确定性快照)。复制用「读父列表 + 写子文件」而非逐条 add():
20
+ * add() 会重复校验路径并重读 README 提取 note(IO 且可能改变 note),复制等价且
21
+ * 更省。UI 无需新通道:fork 后打开子会话,dock 挂载的现有 load()(GET /list)
22
+ * 一次刷新即可读到继承结果(2026-08-23 简化:不新增 webServer 接口)。
23
+ * 惰性 parentSession 继承路径(loadFromStorage 末段)保留并以同语义(重新铸造
24
+ * id + 落盘)服务旧版本创建的 legacy 子会话。
12
25
  * @module @hpyperry/dsh-ref-lib/src/service
13
26
  */
14
27
  import { randomUUID } from 'node:crypto';
@@ -167,6 +180,13 @@ export class RefLibService extends Service {
167
180
  constructor(ctx, config = {}) {
168
181
  super(ctx, 'refLibs');
169
182
  this.root = config.root ?? join(dshHomePath('plugin-data', 'ref-lib'));
183
+ // fork 继承物化:宿主每次创建会话(fork/subagent 带 parentSession)同步公告
184
+ // `session/created`。`{ global: true }` 忽略上下文过滤(同 core/tools 的
185
+ // seed 钩子);监听器绝不抛错——session/created 监听器同步抛错会**回滚会话
186
+ // 挂载**(core/session 的 announce 契约)。同步文件 IO 可接受:小文件、低频。
187
+ ctx.on('session/created', (session) => {
188
+ this.materializeInheritance(session);
189
+ }, { global: true });
170
190
  }
171
191
  /** 当前会话的参考库列表(内存缓存 → sidecar 文件 → 旧日志迁移 → 父会话继承),
172
192
  * 返回前对每个条目实时探测可用性,状态变化时原子写回。每次读取(面板/命令/注入
@@ -302,6 +322,54 @@ export class RefLibService extends Service {
302
322
  this.cacheSet(session.id, next);
303
323
  return next.find((item) => item.id === id);
304
324
  }
325
+ /**
326
+ * fork 继承物化(`session/created` 钩子调用):子会话(header 带 parentSession)
327
+ * 无自身 sidecar 时,把父会话的**有效列表**复制到子会话自身文件并**重新铸造条目
328
+ * id**(fork 副本拥有独立身份,不与父会话共享条目 id)——继承时机从「首次读取」
329
+ * 提前到「创建时刻」,并修复纯惰性继承的链式断口(中间会话未落盘时后代继承不
330
+ * 到)。同步执行、绝不抛错(announce 契约:session/created 监听器抛错会回滚
331
+ * 会话挂载)。
332
+ * @param session - 新创建的会话。
333
+ * @returns 物化后的子会话列表(未物化/无父会话时返回当前列表,含空列表)。
334
+ */
335
+ materializeInheritance(session) {
336
+ try {
337
+ const parentId = session.header.parentSession;
338
+ if (parentId === undefined)
339
+ return this.list(session);
340
+ // 已有自身状态(如持久化恢复的会话、或已物化过)不覆盖。
341
+ if (existsSync(this.pathOf(session.id)))
342
+ return this.list(session);
343
+ const parentLibs = this.resolveParentLibs(parentId);
344
+ if (parentLibs.length === 0)
345
+ return this.list(session); // 父无有效列表:保持惰性继承路径
346
+ const owned = this.mintOwnedCopy(parentLibs);
347
+ this.persistSync(session.id, owned);
348
+ this.cacheSet(session.id, owned);
349
+ return owned;
350
+ }
351
+ catch (error) {
352
+ this.ctx.logger.warn(`ref-lib: fork 继承物化失败(不阻断会话创建):${String(error)}`);
353
+ return this.list(session);
354
+ }
355
+ }
356
+ /** 复制父列表并重新铸造条目 id:fork 副本拥有自己的身份(同 id 的「关联价值」是
357
+ * 瞬时的——任一侧一变更即断裂,留不住;且避免未来跨会话功能/审计混淆)。 */
358
+ mintOwnedCopy(libs) {
359
+ return libs.map((entry) => ({ ...entry, id: randomUUID() }));
360
+ }
361
+ /** 解析父会话的有效参考库列表:优先经 live 父会话(覆盖父为 legacy/惰性子会话的
362
+ * 折叠路径),父会话不可得时兜底直接读其 sidecar 文件。 */
363
+ resolveParentLibs(parentId) {
364
+ const sessions = this.ctx.get('sessions');
365
+ const parent = sessions?.get(parentId);
366
+ if (parent !== undefined)
367
+ return this.list(parent);
368
+ const file = this.pathOf(parentId);
369
+ if (!existsSync(file))
370
+ return [];
371
+ return this.readSidecar(file) ?? [];
372
+ }
305
373
  /** 冷读:sidecar 文件 → 旧日志事件迁移 → 父会话继承 → 空列表。 */
306
374
  loadFromStorage(session) {
307
375
  const file = this.pathOf(session.id);
@@ -317,14 +385,19 @@ export class RefLibService extends Service {
317
385
  this.persistSync(session.id, fromEvents);
318
386
  return fromEvents;
319
387
  }
320
- // fork 继承:子会话无自身状态时继承父会话的列表(与旧事件 seed 行为一致)。
388
+ // fork 继承(legacy 子会话兜底):复制父列表、重新铸造条目 id 并**落盘自身
389
+ // sidecar**——与 session/created 物化(materializeInheritance)同一语义:fork
390
+ // 副本拥有独立身份;落盘保证重启后 id 稳定(不落盘则每次冷读重新铸造导致漂移)。
321
391
  const parentId = session.header.parentSession;
322
392
  if (parentId !== undefined) {
323
393
  const parentFile = this.pathOf(parentId);
324
394
  if (existsSync(parentFile)) {
325
395
  const inherited = this.readSidecar(parentFile);
326
- if (inherited !== undefined)
327
- return inherited;
396
+ if (inherited !== undefined && inherited.length > 0) {
397
+ const owned = this.mintOwnedCopy(inherited);
398
+ this.persistSync(session.id, owned);
399
+ return owned;
400
+ }
328
401
  }
329
402
  }
330
403
  return [];
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hpyperry/dsh-ref-lib",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "只读参考库插件:UI 交互式管理(应用内目录浏览器/系统选择器/手动路径直加)+ systemPrompt 注入 + per-session sidecar 持久化",
5
5
  "license": "MIT",
6
6
  "private": false,