@hpyperry/dsh-ref-lib 0.7.0 → 0.9.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.
Files changed (59) hide show
  1. package/README.md +13 -14
  2. package/lib/client/RefLibCommandCard.d.ts +29 -0
  3. package/lib/client/RefLibCommandCard.d.ts.map +1 -0
  4. package/lib/client/RefLibCommandCard.js +48 -0
  5. package/lib/client/RefLibCommandCard.js.map +1 -0
  6. package/lib/client/RefLibDock.d.ts +4 -2
  7. package/lib/client/RefLibDock.d.ts.map +1 -1
  8. package/lib/client/RefLibDock.js +121 -37
  9. package/lib/client/RefLibDock.js.map +1 -1
  10. package/lib/client/RefLibPanel.d.ts +6 -4
  11. package/lib/client/RefLibPanel.d.ts.map +1 -1
  12. package/lib/client/RefLibPanel.js +69 -20
  13. package/lib/client/RefLibPanel.js.map +1 -1
  14. package/lib/client/index.d.ts.map +1 -1
  15. package/lib/client/index.js +13 -2
  16. package/lib/client/index.js.map +1 -1
  17. package/lib/client/locales.d.ts +30 -2
  18. package/lib/client/locales.d.ts.map +1 -1
  19. package/lib/client/locales.js +42 -8
  20. package/lib/client/locales.js.map +1 -1
  21. package/lib/client/refresh-guard.d.ts +31 -0
  22. package/lib/client/refresh-guard.d.ts.map +1 -0
  23. package/lib/client/refresh-guard.js +38 -0
  24. package/lib/client/refresh-guard.js.map +1 -0
  25. package/lib/client/styles.d.ts.map +1 -1
  26. package/lib/client/styles.js +269 -23
  27. package/lib/client/styles.js.map +1 -1
  28. package/lib/client.js +1141 -500
  29. package/lib/client.js.map +1 -1
  30. package/lib/commands.d.ts +2 -1
  31. package/lib/commands.d.ts.map +1 -1
  32. package/lib/commands.js +15 -3
  33. package/lib/commands.js.map +1 -1
  34. package/lib/index.d.ts +3 -2
  35. package/lib/index.d.ts.map +1 -1
  36. package/lib/index.js +9 -7
  37. package/lib/index.js.map +1 -1
  38. package/lib/logic.d.ts +16 -1
  39. package/lib/logic.d.ts.map +1 -1
  40. package/lib/logic.js +19 -0
  41. package/lib/logic.js.map +1 -1
  42. package/lib/render.d.ts +10 -4
  43. package/lib/render.d.ts.map +1 -1
  44. package/lib/render.js +113 -16
  45. package/lib/render.js.map +1 -1
  46. package/lib/routes.d.ts.map +1 -1
  47. package/lib/routes.js +46 -2
  48. package/lib/routes.js.map +1 -1
  49. package/lib/service.d.ts +52 -3
  50. package/lib/service.d.ts.map +1 -1
  51. package/lib/service.js +172 -14
  52. package/lib/service.js.map +1 -1
  53. package/lib/spec.d.ts +9 -0
  54. package/lib/spec.d.ts.map +1 -1
  55. package/lib/validate.d.ts +1 -1
  56. package/lib/validate.d.ts.map +1 -1
  57. package/lib/validate.js +11 -3
  58. package/lib/validate.js.map +1 -1
  59. package/package.json +17 -9
package/README.md CHANGED
@@ -3,27 +3,28 @@
3
3
  > DeepSeek Harness(DSH)插件:给任意会话挂上**只读参考库**,agent 需要查证时
4
4
  > **先在参考库里检索**——而不是凭空猜测或直接搜网。
5
5
  >
6
- > 安装:`dsh plugin --profile web add github:hpyperry/dsh-ref-lib`
6
+ > 安装:`dsh plugin --profile web add @hpyperry/dsh-ref-lib`
7
7
 
8
8
  ## ✨ 特性
9
9
 
10
10
  | | 能力 | 说明 |
11
11
  | --- | --- | --- |
12
12
  | 🚀 | **统一入口** | 输入卡正上方的「参考库」胶囊(hero / active 常显、带数量徽标)——纯 CSS 与输入卡左缘对齐,零测量、零竞态 |
13
- | 🎨 | **可视化面板** | 基名 + 完整路径列表、悬停高亮、危险色移除、独立的空/加载/错误态 |
14
- | 📂 | **三种添加方式** | 应用内目录浏览器 / 系统原生选择器(按宿主能力自动适配)/ 手动输入路径(`~` 与相对路径) |
15
- | 🧠 | **上下文注入** | 仅向配置了参考库的会话注入:库清单 + **查询优先级**(先查参考库,未覆盖再查别的)+ 只读约束;空列表零 token |
13
+ | 🎨 | **可视化面板** | 基名 + 完整路径列表、用途说明、悬停高亮、危险色移除、独立的空/加载/错误态 |
14
+ | 📂 | **三种添加方式** | 应用内目录浏览器 / 系统原生选择器(按宿主能力自动适配)/ 手动输入路径(`~` 与相对路径),可附**用途说明**(自动提取 README 标题兜底) |
15
+ | 🧠 | **上下文注入** | 仅向配置了参考库的会话注入定稿英文规则:库清单(含用途 routing metadata)+ **强制查证流程**(先查参考库,未覆盖才外部)+ 权威性/冲突处理 + 只读约束;空列表零 token |
16
16
  | 🔒 | **per-session 隔离** | 每个会话独立维护,会话间互不可见;sidecar JSON 持久化,重启/恢复后仍在 |
17
+ | 📡 | **失效检测** | 每次读取实时探测库目录可用性(删除 / 被替换为文件即标记),失效库自动跳过注入并红色提示(面板状态行 + dock 失效角标 + `/ref-lib list` 标记);UI 同步**交互驱动**(命令完成 / 发消息 / 面板操作即时刷新,零后台请求) |
17
18
  | ⚡ | **静默数据通道** | client 读写走插件自注册的 `/api/ref-lib/*` HTTP 路由——不渲染命令卡片、不执行命令、不产生用户消息 |
18
19
  | 🌐 | **双语界面** | zh/en 全量本地化,随界面语言实时切换 |
19
- | ⌨️ | **命令入口** | `/ref-lib add <path> \| list \| remove <id>`,与 UI 数据一致 |
20
+ | ⌨️ | **命令入口** | `/ref-lib add <path> [--note <用途>] \| list \| remove <id>`,与 UI 数据一致;结果走专属卡片(全展开完整文本 + 一键复制,规避官方卡片的截断显示) |
20
21
  | 🛡️ | **安全** | loopback 护栏 + 路径消毒 + 只读保证分层(沙箱强制 / 上下文软约束) |
21
22
 
22
23
  ## 📦 安装
23
24
 
24
25
  ```bash
25
- # 从 GitHub 安装(`github:owner/repo` 简写,dsh plugin 负责维护 profile manifest 与依赖)
26
- dsh plugin --profile web add github:hpyperry/dsh-ref-lib
26
+ # 使用npm
27
+ dsh plugin --profile web add @hpyperry/dsh-ref-lib
27
28
 
28
29
  # 本地开发期(改动即时生效):指向仓库本地路径
29
30
  # dsh plugin --profile web add /path/to/ref-lib
@@ -32,17 +33,14 @@ dsh plugin --profile web add github:hpyperry/dsh-ref-lib
32
33
  dsh --profile web
33
34
  ```
34
35
 
35
- > 发布到 npm 后也可直接按包名安装:`dsh plugin --profile web add @hpyperry/dsh-ref-lib`。
36
-
37
36
  卸载:`dsh plugin --profile web remove @hpyperry/dsh-ref-lib`
38
37
 
39
38
  ## 🚀 快速开始
40
39
 
41
40
  1. 重启后在**输入卡正上方**看到「参考库」胶囊(新会话与具体对话均可见);
42
41
  2. 点开面板 → 添加目录(应用内浏览器 / 系统选择器 / 手动路径三选一)→ 列表出现 → 行尾垃圾桶移除;
43
- 3. 或对话内命令:`/ref-lib add <path>`、`/ref-lib list`、`/ref-lib remove <id>`;
44
- 4. 配置了参考库的会话,agent 会收到"先查参考库、禁止修改库内文件"的上下文指令——
45
- 需要查证时它会先在参考库里检索。
42
+ 3. 或对话内命令:`/ref-lib add <path> [--note <用途>]`、`/ref-lib list`、`/ref-lib remove <id>`;
43
+ 4. 配置了参考库的会话,agent 会收到定稿英文的"参考库规则"上下文指令——查证规范/API/项目事实时**必须先查参考库**(未覆盖才允许外部途径并自报),且禁止修改库内文件。
46
44
 
47
45
  ## ⚙️ 行为与配置
48
46
 
@@ -51,8 +49,9 @@ dsh --profile web
51
49
  | 项 | 说明 |
52
50
  | --- | --- |
53
51
  | 数据存储 | `<dshHome>/plugin-data/ref-lib/<sessionId>.json`(per-session sidecar,随 dsh home 持久化) |
52
+ | 用途说明(note) | 添加时可选填写;未填写时自动提取目录 README 首个 H1 标题兜底(无 README 则为空)。note 作为 routing metadata 注入,帮助 agent 判断库的相关性 |
54
53
  | 目录选择后端 | 启动时自动探测:应用内目录浏览器(browse)或系统原生对话框(native);可在 profile 的 `cordis.patch.yml` 切换 `directory-picker` 行为 |
55
- | 上下文注入 | 仅向有参考库的会话注入(`systemPrompt.context`,空列表零 token |
54
+ | 上下文注入 | 仅向有参考库的会话注入(`systemPrompt.context`,空列表零 token;注入文本为定稿英文模板) |
56
55
  | 子会话 | 无自身配置时继承父会话的参考库列表 |
57
56
 
58
57
  ## 🛡️ 安全
@@ -65,7 +64,7 @@ dsh --profile web
65
64
 
66
65
  - **系统原生目录选择器可能卡顿且界面语言跟随 OS**:可用「手动输入路径」绕开;或在 profile 把 `directory-picker` 切换为 `@deepseek-ai/dsh-host-directory-picker-browse`(应用内浏览器,快速且 zh/en 本地化);
67
66
  - **settings 配置客户端白名单**(DSH rc.6 框架限制):第三方插件 namespace 默认不可被浏览器端读写,官方标注为 deferred work;
68
- - UI 添加暂不支持备注(note 字段已在类型中预留);
67
+ - 已添加条目的用途说明暂不支持在 UI 编辑(可移除后重新添加,或重新 `add` 同路径带新 note 更新);
69
68
  - `/ref-lib add <path>` 的相对路径**基于当前会话工作区**解析,而非 dsh 进程启动目录。
70
69
 
71
70
  ## 🧑‍💻 开发
@@ -0,0 +1,29 @@
1
+ /**
2
+ * `/ref-lib` 命令结果专属卡片(conversation.chat.commandview,key='ref-lib')。
3
+ *
4
+ * 背景(历史 bug):官方 `GenericCommandCard` 对命令结果折叠态 `white-space:
5
+ * nowrap` + `text-overflow: ellipsis` 单行截断,展开态 `max-height: 260px` 内滚动
6
+ * ——`/ref-lib list` 等多行长结果会显示不全。本卡片注册在
7
+ * `conversation.chat.commandview`(keyed,按命令名分派)的 `ref-lib` 键上:
8
+ * **默认全展开展示完整结果**(无高度上限)+ 一键复制按钮。只影响 `/ref-lib`,
9
+ * 其他命令仍走官方卡片。
10
+ * @module @hpyperry/dsh-ref-lib/src/client/RefLibCommandCard
11
+ */
12
+ import type { ReactElement } from 'react';
13
+ import type { CommandNode } from '@deepseek-ai/dsh-client-runtime/client';
14
+ import type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
15
+ /** 完整 props:commandview 运行时套件 + owner(node)+ 本地化 seat。 */
16
+ export type RefLibCommandCardProps = PropsRuntime<'conversation.chat.commandview'> & {
17
+ /** 折叠的命令生命周期节点(run + 可选 done);outcome 为 null 时仍在执行。 */
18
+ node: CommandNode;
19
+ /** `/compact` 专用(ref-lib 不使用)。 */
20
+ compaction?: unknown;
21
+ } & PropsLocale<'ref-lib'>;
22
+ /**
23
+ * `/ref-lib` 命令结果卡片:完整展示 `outcome.text`(pre-wrap、无高度截断)+
24
+ * 复制按钮。running 态显示执行中;error 态红色。
25
+ * @param props - node(owner)与本地化 seat。
26
+ * @returns 卡片元素。
27
+ */
28
+ export declare function RefLibCommandCard(props: RefLibCommandCardProps): ReactElement;
29
+ //# sourceMappingURL=RefLibCommandCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RefLibCommandCard.d.ts","sourceRoot":"","sources":["../../src/client/RefLibCommandCard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAA;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AASjF,0DAA0D;AAC1D,MAAM,MAAM,sBAAsB,GAAG,YAAY,CAAC,+BAA+B,CAAC,GAAG;IACnF,uDAAuD;IACvD,IAAI,EAAE,WAAW,CAAA;IACjB,kCAAkC;IAClC,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,GAAG,WAAW,CAAC,SAAS,CAAC,CAAA;AAI1B;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,YAAY,CAiD7E"}
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * `/ref-lib` 命令结果专属卡片(conversation.chat.commandview,key='ref-lib')。
4
+ *
5
+ * 背景(历史 bug):官方 `GenericCommandCard` 对命令结果折叠态 `white-space:
6
+ * nowrap` + `text-overflow: ellipsis` 单行截断,展开态 `max-height: 260px` 内滚动
7
+ * ——`/ref-lib list` 等多行长结果会显示不全。本卡片注册在
8
+ * `conversation.chat.commandview`(keyed,按命令名分派)的 `ref-lib` 键上:
9
+ * **默认全展开展示完整结果**(无高度上限)+ 一键复制按钮。只影响 `/ref-lib`,
10
+ * 其他命令仍走官方卡片。
11
+ * @module @hpyperry/dsh-ref-lib/src/client/RefLibCommandCard
12
+ */
13
+ import { useState } from 'react';
14
+ import { IconCheckOutline16, IconCopyOutline16, IconLoadingOutline16, IconWarningOutline16, } from '@deepseek-ai/dsh-client-ui-primitives';
15
+ import { ensureRefLibStyles } from "./styles.js";
16
+ ensureRefLibStyles();
17
+ /**
18
+ * `/ref-lib` 命令结果卡片:完整展示 `outcome.text`(pre-wrap、无高度截断)+
19
+ * 复制按钮。running 态显示执行中;error 态红色。
20
+ * @param props - node(owner)与本地化 seat。
21
+ * @returns 卡片元素。
22
+ */
23
+ export function RefLibCommandCard(props) {
24
+ const { node, t } = props;
25
+ const [copied, setCopied] = useState(false);
26
+ const outcome = node.outcome;
27
+ const text = outcome?.text;
28
+ const running = outcome === null;
29
+ const error = outcome?.kind === 'error';
30
+ /** 复制完整结果到剪贴板;成功后短暂显示"已复制"(权限失败静默)。 */
31
+ const copy = async () => {
32
+ if (text === undefined || text === '')
33
+ return;
34
+ try {
35
+ await navigator.clipboard.writeText(text);
36
+ setCopied(true);
37
+ window.setTimeout(() => { setCopied(false); }, 1500);
38
+ }
39
+ catch {
40
+ /* 剪贴板不可用(权限/非安全上下文)时静默 */
41
+ }
42
+ };
43
+ const summary = running
44
+ ? t('command.running')
45
+ : text !== undefined && text !== '' ? text.split('\n')[0] : t('command.done');
46
+ return (_jsxs("div", { className: "reflib-cmd", "data-state": running ? 'running' : error ? 'error' : 'ok', children: [_jsxs("div", { className: "reflib-cmdHead", children: [running && _jsx(IconLoadingOutline16, { size: 14, className: "reflib-spin reflib-cmdHeadIcon" }), !running && error && _jsx(IconWarningOutline16, { size: 14, className: "reflib-cmdHeadIcon" }), _jsx("span", { className: "reflib-cmdName", children: "/ref-lib" }), _jsx("span", { className: "reflib-cmdSummary", "data-error": error || undefined, children: summary }), !running && text !== undefined && text !== '' && (_jsxs("button", { type: "button", className: "reflib-cmdCopy", "aria-label": t('command.copy'), title: t('command.copy'), onClick: () => { void copy(); }, children: [copied ? _jsx(IconCheckOutline16, { size: 14 }) : _jsx(IconCopyOutline16, { size: 14 }), copied ? t('command.copied') : t('command.copy')] }))] }), !running && text !== undefined && text !== '' && (_jsx("pre", { className: "reflib-cmdBody", "data-error": error || undefined, children: text }))] }));
47
+ }
48
+ //# sourceMappingURL=RefLibCommandCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RefLibCommandCard.js","sourceRoot":"","sources":["../../src/client/RefLibCommandCard.tsx"],"names":[],"mappings":"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"}
@@ -23,10 +23,12 @@ import type { RefLibEntry } from '../spec.ts';
23
23
  export interface RefLibDockInjected {
24
24
  /** 读取会话的参考库列表(GET /api/ref-lib/list,静默)。 */
25
25
  load: (sessionId: SessionId) => Promise<RefLibEntry[]>;
26
- /** 添加一个参考库目录(POST /api/ref-lib/add,静默)。 */
27
- add: (sessionId: SessionId, path: string) => Promise<void>;
26
+ /** 添加一个参考库目录(POST /api/ref-lib/add,静默;note 为可选用途说明)。 */
27
+ add: (sessionId: SessionId, path: string, note?: string) => Promise<void>;
28
28
  /** 移除一个参考库条目(POST /api/ref-lib/remove,静默)。 */
29
29
  remove: (sessionId: SessionId, id: string) => Promise<void>;
30
+ /** 更新一个条目的用途说明(POST /api/ref-lib/note,静默;空串清除)。 */
31
+ setNote: (sessionId: SessionId, id: string, note: string) => Promise<void>;
30
32
  /** 唤起系统原生"选择文件夹"对话框;取消时返回 null。 */
31
33
  pickDirectory: () => Promise<string | null>;
32
34
  /** 列出一层目录(browse 后端);缺省路径 = 宿主主目录;signal 中止扫描。 */
@@ -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;AAO7C,yCAAyC;AACzC,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;IACtD,2CAA2C;IAC3C,GAAG,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1D,8CAA8C;IAC9C,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3D,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;AAED,kDAAkD;AAClD,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC,yBAAyB,CAAC,GAAG,kBAAkB,GAAG,WAAW,CAAC,SAAS,CAAC,CAAA;AAsCnH;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,CA4L/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;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"}
@@ -19,15 +19,20 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
19
19
  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
+ import { RefreshGuard } from "./refresh-guard.js";
22
23
  import { RefLibBrowser } from "./RefLibBrowser.js";
23
24
  import { RefLibPanel } from "./RefLibPanel.js";
24
25
  import { ensureRefLibStyles } from "./styles.js";
26
+ /** 挂载预载失败重试:间隔与上限(重启后会话 live 通常 <1s,重试 1–2 次即成功)。 */
27
+ const MOUNT_RETRY_DELAY_MS = 800;
28
+ const MOUNT_RETRY_MAX = 5;
25
29
  /** wire 错误码 → 本地化文案键(未知码回退原始消息)。 */
26
30
  const ERROR_KEYS = {
27
31
  'ref-lib/missing': 'error.missing',
28
32
  'ref-lib/not-directory': 'error.notDirectory',
29
33
  'ref-lib/unsafe': 'error.unsafe',
30
34
  'ref-lib/unknown-id': 'error.unknownId',
35
+ 'ref-lib/unavailable': 'error.unavailable',
31
36
  };
32
37
  /** 把未知错误规整为可展示文案。 */
33
38
  function messageOf(cause) {
@@ -60,7 +65,7 @@ ensureRefLibStyles();
60
65
  * @returns 胶囊入口(+ 打开时的管理面板)。
61
66
  */
62
67
  export function RefLibDock(props) {
63
- const { sessionId, load, add, remove, pickDirectory, listDirectory, t } = props;
68
+ const { sessionId, session, load, add, remove, setNote, pickDirectory, listDirectory, t } = props;
64
69
  const [open, setOpen] = useState(false);
65
70
  const [libs, setLibs] = useState([]);
66
71
  const [loading, setLoading] = useState(false);
@@ -68,12 +73,15 @@ export function RefLibDock(props) {
68
73
  const [picking, setPicking] = useState(false);
69
74
  const [removingId, setRemovingId] = useState(null);
70
75
  const [error, setError] = useState(null);
71
- // 并发读守卫:仅采纳最新一次 refresh 的结果(挂载预载与开面板刷新可能重叠)。
72
- const seq = useRef(0);
76
+ // 并发读守卫(竞态控制):仅采纳最新一次 refresh 的结果(挂载预载/开面板/轮询/
77
+ // 操作后刷新可能重叠);详见 src/client/refresh-guard.ts 与 tests/refresh-guard.spec.ts。
78
+ const guard = useRef(new RefreshGuard());
73
79
  // 目录选择能力(v6):browse(应用内浏览器,listDirectory)或 native(OS 对话框,
74
80
  // pickDirectory)。探测一次并缓存;host 侧能力在单次 boot 内稳定。
75
81
  const [pickerMode, setPickerMode] = useState(null);
76
82
  const [browserOpen, setBrowserOpen] = useState(false);
83
+ // pickPath 等待应用内浏览器选定时挂起的 resolve(取消以 null 结束)。
84
+ const pendingPick = useRef(null);
77
85
  const detectPicker = async () => {
78
86
  if (pickerMode !== null)
79
87
  return pickerMode;
@@ -90,30 +98,71 @@ export function RefLibDock(props) {
90
98
  setPickerMode(mode);
91
99
  return mode;
92
100
  };
93
- const refresh = async () => {
94
- const mine = ++seq.current;
101
+ /**
102
+ * 拉取会话参考库列表并更新 UI。
103
+ * @param silent - 静默模式(轮询用):失败不写入错误槽;成功也**不碰 error/loading**
104
+ * ——错误与加载态只由用户操作/打开面板管理,避免后台轮询吞掉操作错误提示或
105
+ * 提前结束面板加载态(轮询仅更新 libs 数据)。
106
+ */
107
+ const refresh = async (silent = false) => {
108
+ const mine = guard.current.begin();
95
109
  try {
96
110
  const next = await load(sessionId);
97
- if (mine !== seq.current)
111
+ if (!guard.current.isLatest(mine))
98
112
  return;
99
113
  setLibs(next);
100
- setError(null);
114
+ if (!silent)
115
+ setError(null);
101
116
  }
102
117
  catch (cause) {
103
- if (mine !== seq.current)
118
+ if (!guard.current.isLatest(mine))
104
119
  return;
105
- setError(formatError(cause, t));
120
+ if (!silent)
121
+ setError(formatError(cause, t));
106
122
  }
107
123
  finally {
108
- if (mine === seq.current)
124
+ if (guard.current.isLatest(mine) && !silent)
109
125
  setLoading(false);
110
126
  }
111
127
  };
112
- // 挂载预载。依赖 sessionId:若同一 dock 实例跨会话复用(槽位按会话切换),
113
- // 会话切换后徽标/列表随之刷新,避免停留在上一个会话的过期数据(seq 守卫防竞态)。
128
+ // 挂载/会话切换预载(带失败重试):重启 dsh web 后会话可能尚未 live(/list 404),
129
+ // 首次加载失败若直接放弃,胶囊角标/列表会缺失直到用户点开面板——延迟重试直至
130
+ // 会话就绪或达到上限,让"刚启动"的失效角标也能自动出现(seq 守卫防并发竞态)。
114
131
  useEffect(() => {
115
132
  ensureRefLibStyles();
116
- void refresh();
133
+ let stopped = false;
134
+ let retries = 0;
135
+ let timer;
136
+ const attempt = async () => {
137
+ const mine = guard.current.begin();
138
+ try {
139
+ const next = await load(sessionId);
140
+ if (stopped || !guard.current.isLatest(mine))
141
+ return;
142
+ setLibs(next);
143
+ setError(null);
144
+ }
145
+ catch (cause) {
146
+ if (stopped || !guard.current.isLatest(mine))
147
+ return;
148
+ if (retries < MOUNT_RETRY_MAX) {
149
+ retries += 1;
150
+ timer = window.setTimeout(() => { void attempt(); }, MOUNT_RETRY_DELAY_MS);
151
+ return;
152
+ }
153
+ setError(formatError(cause, t));
154
+ }
155
+ finally {
156
+ if (!stopped && guard.current.isLatest(mine))
157
+ setLoading(false);
158
+ }
159
+ };
160
+ void attempt();
161
+ return () => {
162
+ stopped = true;
163
+ if (timer !== undefined)
164
+ window.clearTimeout(timer);
165
+ };
117
166
  }, [sessionId]);
118
167
  useEffect(() => {
119
168
  if (open) {
@@ -121,6 +170,25 @@ export function RefLibDock(props) {
121
170
  void refresh();
122
171
  }
123
172
  }, [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;
177
+ useEffect(() => {
178
+ void refresh(true);
179
+ }, [userMessageCount]);
180
+ // 命令执行即刷新:`/ref-lib` 命令(add/remove/note)执行必然产生
181
+ // `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;
185
+ useEffect(() => {
186
+ void refresh(true);
187
+ }, [refLibCommandDone]);
188
+ // 后台轮询已移除(2026-08-22 用户决策):UI 同步改为**交互驱动**——/ref-lib
189
+ // 命令完成、发消息、面板操作均即时刷新;外部文件操作(删/恢复目录)在下次
190
+ // GUI 交互时同步。注入侧不受影响:每次模型请求的注入回调仍实时探测
191
+ // (node half list()),与 UI 刷新完全解耦。详见设计文档 §14。
124
192
  const handleRemove = async (id) => {
125
193
  setRemovingId(id);
126
194
  setBusy(true);
@@ -137,11 +205,11 @@ export function RefLibDock(props) {
137
205
  setBusy(false);
138
206
  }
139
207
  };
140
- const handleAddPath = async (path) => {
208
+ const handleAddPath = async (path, note) => {
141
209
  setBusy(true);
142
210
  setError(null);
143
211
  try {
144
- await add(sessionId, path);
212
+ await add(sessionId, path, note);
145
213
  await refresh();
146
214
  }
147
215
  catch (cause) {
@@ -153,24 +221,24 @@ export function RefLibDock(props) {
153
221
  setBusy(false);
154
222
  }
155
223
  };
156
- /** 添加一个已选定目录并刷新列表;返回是否成功(失败时错误已入错误槽,不抛出)。 */
157
- const addPath = async (path) => {
224
+ /** 更新条目用途说明(编辑详情保存);失败入错误槽、不抛出(编辑区保持打开)。 */
225
+ const handleUpdateNote = async (id, note) => {
158
226
  setBusy(true);
159
227
  setError(null);
160
228
  try {
161
- await add(sessionId, path);
229
+ await setNote(sessionId, id, note);
162
230
  await refresh();
163
- return true;
164
231
  }
165
232
  catch (cause) {
166
233
  setError(formatError(cause, t));
167
- return false;
168
234
  }
169
235
  finally {
170
236
  setBusy(false);
171
237
  }
172
238
  };
173
- const handleBrowse = async () => {
239
+ /** 唤起目录选择(browse 应用内浏览器 / native 系统对话框)并返回选中的路径;
240
+ * 取消或失败返回 null——**不直接添加**,由面板把路径填入表单(用户可补用途后提交)。 */
241
+ const pickPath = async () => {
174
242
  setError(null);
175
243
  // 探测目录选择能力:browse → 应用内目录浏览器;native → 系统 OS 对话框。
176
244
  let mode;
@@ -179,40 +247,56 @@ export function RefLibDock(props) {
179
247
  }
180
248
  catch (cause) {
181
249
  setError(formatError(cause, t));
182
- return;
250
+ return null;
183
251
  }
184
252
  if (mode === 'browse') {
185
253
  setBrowserOpen(true);
186
- return;
254
+ return await new Promise((resolve) => {
255
+ pendingPick.current = resolve;
256
+ });
187
257
  }
188
258
  setPicking(true);
189
259
  try {
190
- const picked = await pickDirectory();
191
- if (picked !== null)
192
- await addPath(picked);
260
+ return await pickDirectory();
193
261
  }
194
262
  catch (cause) {
195
263
  setError(formatError(cause, t));
264
+ return null;
196
265
  }
197
266
  finally {
198
267
  setPicking(false);
199
268
  }
200
269
  };
201
- /** 应用内浏览器选定目录 → 添加成功才关闭(失败时错误显示在面板,浏览器保持打开便于重试)。 */
202
- const handleBrowserPick = async (path) => {
203
- if (await addPath(path))
204
- setBrowserOpen(false);
270
+ /** 应用内浏览器选定目录 → 把路径交给等待中的 pickPath 调用方并关闭浏览器。 */
271
+ const handleBrowserPick = (path) => {
272
+ setBrowserOpen(false);
273
+ const resolve = pendingPick.current;
274
+ pendingPick.current = null;
275
+ resolve?.(path);
276
+ };
277
+ /** 应用内浏览器取消 → 以 null 结束等待中的 pickPath。 */
278
+ const handleBrowserClose = () => {
279
+ setBrowserOpen(false);
280
+ const resolve = pendingPick.current;
281
+ pendingPick.current = null;
282
+ resolve?.(null);
205
283
  };
206
- return (_jsxs(_Fragment, { children: [_jsx("div", { className: "reflib-dock", children: _jsxs("button", { type: "button", className: "reflib-chip", "data-active": open || undefined, "aria-haspopup": "dialog", "aria-expanded": open, "aria-label": libs.length > 0 ? t('dock.count.aria', { count: String(libs.length) }) : t('dock.aria'), title: t('dock.aria'), onClick: () => {
284
+ /**
285
+ * 胶囊计数(v9):徽标显示**可用**数量(失效不计入),红色角标显示失效数量
286
+ * (总数 − 可用数),仅存在失效条目时显示。注意:UI 数据只在打开面板/操作后
287
+ * 刷新,外部变更(如删除目录)不会自动反向同步到界面(与命令修改后不刷新同属
288
+ * 待解决的 UI 数据同步问题,见设计文档"遗留备注")。
289
+ */
290
+ const availableCount = libs.filter((entry) => entry.status === 'available').length;
291
+ const unavailableCount = libs.length - availableCount;
292
+ return (_jsxs(_Fragment, { children: [_jsx("div", { className: "reflib-dock", children: _jsxs("button", { type: "button", className: "reflib-chip", "data-active": open || undefined, "aria-haspopup": "dialog", "aria-expanded": open, "aria-label": unavailableCount > 0
293
+ ? t('dock.unavailable', { count: String(unavailableCount) })
294
+ : availableCount > 0 ? t('dock.count.aria', { count: String(availableCount) }) : t('dock.aria'), title: t('dock.aria'), onClick: () => {
207
295
  setOpen((value) => !value);
208
- }, children: [_jsx("span", { className: "reflib-chipIcon", children: _jsx(IconFolderOpen16, { size: 14 }) }), _jsx("span", { className: "reflib-chipLabel", children: t('dock.label') }), libs.length > 0 && _jsx("span", { className: "reflib-chipBadge", children: libs.length })] }) }), _jsx(RefLibPanel, { open: open, onClose: () => {
296
+ }, children: [_jsx("span", { className: "reflib-chipIcon", children: _jsx(IconFolderOpen16, { size: 14 }) }), _jsx("span", { className: "reflib-chipLabel", children: t('dock.label') }), availableCount > 0 && _jsx("span", { className: "reflib-chipBadge", children: availableCount }), unavailableCount > 0 && (_jsx("span", { className: "reflib-chipWarn", title: t('dock.unavailable', { count: String(unavailableCount) }), children: unavailableCount }))] }) }), _jsx(RefLibPanel, { open: open, onClose: () => {
209
297
  setOpen(false);
210
298
  }, libs: libs, loading: loading, busy: busy, picking: picking, removingId: removingId, error: error, t: t, onRemove: (id) => {
211
299
  void handleRemove(id);
212
- }, onAddPath: handleAddPath, onBrowse: handleBrowse }), _jsx(RefLibBrowser, { open: browserOpen, onClose: () => {
213
- setBrowserOpen(false);
214
- }, listDirectory: listDirectory, t: t, onOpen: (path) => {
215
- void handleBrowserPick(path);
216
- } })] }));
300
+ }, onAddPath: handleAddPath, onUpdateNote: handleUpdateNote, onBrowse: pickPath }), _jsx(RefLibBrowser, { open: browserOpen, onClose: handleBrowserClose, listDirectory: listDirectory, t: t, onOpen: handleBrowserPick })] }));
217
301
  }
218
302
  //# sourceMappingURL=RefLibDock.js.map
@@ -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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"}
@@ -33,10 +33,12 @@ export interface RefLibPanelProps {
33
33
  t: TranslateNS<'ref-lib'>;
34
34
  /** 移除一个条目(父组件执行异步并刷新)。 */
35
35
  onRemove: (id: string) => void;
36
- /** 按输入路径添加;失败时抛出(面板保留输入内容)。 */
37
- onAddPath: (path: string) => Promise<void>;
38
- /** 选择目录(按宿主能力自适应:browse 应用内浏览器 / native 系统选择器;父组件确认后添加)。 */
39
- onBrowse: () => Promise<void>;
36
+ /** 按输入路径添加(可带用途说明 note);失败时抛出(面板保留输入内容)。 */
37
+ onAddPath: (path: string, note?: string) => Promise<void>;
38
+ /** 更新条目的用途说明(详情编辑保存);失败入错误槽、不抛出。 */
39
+ onUpdateNote: (id: string, note: string) => Promise<void>;
40
+ /** 唤起目录选择(browse/native),返回选中路径或 null(取消)——由面板填入路径字段,不直接添加。 */
41
+ onBrowse: () => Promise<string | null>;
40
42
  }
41
43
  /**
42
44
  * 渲染参考库管理面板。
@@ -1 +1 @@
1
- {"version":3,"file":"RefLibPanel.d.ts","sourceRoot":"","sources":["../../src/client/RefLibPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AAazC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAG7C,mCAAmC;AACnC,MAAM,WAAW,gBAAgB;IAC/B,cAAc;IACd,IAAI,EAAE,OAAO,CAAA;IACb,8BAA8B;IAC9B,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,eAAe;IACf,IAAI,EAAE,SAAS,WAAW,EAAE,CAAA;IAC5B,uBAAuB;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,+BAA+B;IAC/B,IAAI,EAAE,OAAO,CAAA;IACb,gCAAgC;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,kCAAkC;IAClC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,aAAa;IACb,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;IACzB,0BAA0B;IAC1B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,+BAA+B;IAC/B,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,CAyIjE"}
1
+ {"version":3,"file":"RefLibPanel.d.ts","sourceRoot":"","sources":["../../src/client/RefLibPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AAczC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAM7C,mCAAmC;AACnC,MAAM,WAAW,gBAAgB;IAC/B,cAAc;IACd,IAAI,EAAE,OAAO,CAAA;IACb,8BAA8B;IAC9B,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,eAAe;IACf,IAAI,EAAE,SAAS,WAAW,EAAE,CAAA;IAC5B,uBAAuB;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,+BAA+B;IAC/B,IAAI,EAAE,OAAO,CAAA;IACb,gCAAgC;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,kCAAkC;IAClC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,aAAa;IACb,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;IACzB,0BAA0B;IAC1B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,4CAA4C;IAC5C,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACzD,oCAAoC;IACpC,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACzD,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;CACvC;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,CAmRjE"}