@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/lib/service.js CHANGED
@@ -12,20 +12,38 @@
12
12
  * @module @hpyperry/dsh-ref-lib/src/service
13
13
  */
14
14
  import { randomUUID } from 'node:crypto';
15
- import { realpath, stat } from 'node:fs/promises';
16
- import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
15
+ import { readFile, realpath, stat } from 'node:fs/promises';
16
+ import { existsSync, mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from 'node:fs';
17
17
  import { dirname, join } from 'node:path';
18
18
  import { dshHomePath } from '@deepseek-ai/dsh-home-paths';
19
19
  import { Service } from '@deepseek-ai/cordis';
20
- import { foldRefLibs, removeLib, upsertLib } from "./logic.js";
20
+ import { foldRefLibs, removeLib, statusChanged, upsertLib } from "./logic.js";
21
21
  import { hasControlCharacters, isRefLibEntry } from "./validate.js";
22
- /** sidecar 文件内容版本(v3 文件 = `{ version: 2, libs }`)。 */
23
- const SIDECAR_VERSION = 2;
22
+ /** sidecar 文件内容版本(v3 文件 = `{ version: 3, libs }`,条目带 status/checkedAt)。 */
23
+ const SIDECAR_VERSION = 3;
24
+ /**
25
+ * 探测目录可用性(同步 statSync)。库数量少、本地磁盘、单次亚毫秒级;同步形态
26
+ * 保持 `list()` 与 systemPrompt 注入回调(`text()` 为同步函数)不变。
27
+ * @param path - 目录绝对路径。
28
+ * @returns 存在且是目录 → available;存在但不是目录 → not-directory;
29
+ * stat 失败(不存在/权限不可达)→ missing。
30
+ */
31
+ export function probeAvailability(path) {
32
+ try {
33
+ const info = statSync(path);
34
+ return info.isDirectory() ? 'available' : 'not-directory';
35
+ }
36
+ catch {
37
+ return 'missing';
38
+ }
39
+ }
24
40
  /**
25
41
  * 内存缓存会话数上限:超出后按插入序淘汰最旧会话(下次访问从 sidecar 重读,
26
42
  * 语义不变,只是多一次文件读)。防止长驻进程在大量会话上无限累积内存。
27
43
  */
28
44
  const CACHE_MAX_SESSIONS = 512;
45
+ /** 用途说明(note)最大长度;超出截断,防止注入文本膨胀。 */
46
+ export const NOTE_MAX_LENGTH = 120;
29
47
  /** add 请求指向的路径不存在或不是目录(或含控制字符)。 */
30
48
  export class RefLibPathError extends Error {
31
49
  path;
@@ -57,6 +75,66 @@ export class RefLibUnknownError extends Error {
57
75
  this.name = 'RefLibUnknownError';
58
76
  }
59
77
  }
78
+ /** note 含控制字符(提示词注入卫生;渲染层另有兜底消毒)。 */
79
+ export class RefLibNoteError extends Error {
80
+ constructor() {
81
+ super('用途说明(note)包含控制字符,已拒绝(防止破坏上下文注入)');
82
+ this.name = 'RefLibNoteError';
83
+ }
84
+ }
85
+ /** 条目目录不可用(missing / not-directory):仅允许移除,其他变更(如更新 note)拒绝。 */
86
+ export class RefLibUnavailableError extends Error {
87
+ path;
88
+ /**
89
+ * @param path - 失效条目的目录路径。
90
+ */
91
+ constructor(path) {
92
+ super(`参考库目录不可用(仅允许移除):${path}`);
93
+ this.path = path;
94
+ this.name = 'RefLibUnavailableError';
95
+ }
96
+ }
97
+ /** 从 README 文本提取首个 Markdown 标题(去 `#`、trim、限长);无标题返回 undefined。 */
98
+ export function extractReadmeTitle(content) {
99
+ for (const line of content.split('\n')) {
100
+ const match = /^#\s+(.+)$/.exec(line.trim());
101
+ if (match !== null) {
102
+ const title = match[1].trim();
103
+ return title.length > NOTE_MAX_LENGTH ? title.slice(0, NOTE_MAX_LENGTH) : title;
104
+ }
105
+ }
106
+ return undefined;
107
+ }
108
+ /** 读取目录 README(README.md/README/readme.md/index.md)的首个标题作为默认 note;IO 失败静默返回 undefined。 */
109
+ async function readReadmeTitle(dir) {
110
+ for (const candidate of ['README.md', 'README', 'readme.md', 'index.md']) {
111
+ try {
112
+ const content = await readFile(join(dir, candidate), 'utf8');
113
+ const title = extractReadmeTitle(content);
114
+ if (title !== undefined)
115
+ return title;
116
+ }
117
+ catch {
118
+ /* 该候选不可读,尝试下一个 */
119
+ }
120
+ }
121
+ return undefined;
122
+ }
123
+ /** note 允许的空白:换行/制表(多行说明,渲染注入时折叠为空格);
124
+ * 其余不可见控制字符(含 U+2028/2029 行/段分隔符)仍拒绝——防止破坏注入格式。 */
125
+ const NOTE_UNSAFE_CHARACTERS = /[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f\u2028\u2029]/;
126
+ /** 规范化 note:统一换行(\r\n/\r → \n)、trim;含不允许的控制字符抛 RefLibNoteError;
127
+ * 空串/undefined 返回 undefined;超长截断。 */
128
+ function normalizeNote(note) {
129
+ if (note === undefined)
130
+ return undefined;
131
+ const normalized = note.replace(/\r\n?/g, '\n').trim();
132
+ if (normalized === '')
133
+ return undefined;
134
+ if (NOTE_UNSAFE_CHARACTERS.test(normalized))
135
+ throw new RefLibNoteError();
136
+ return normalized.length > NOTE_MAX_LENGTH ? normalized.slice(0, NOTE_MAX_LENGTH) : normalized;
137
+ }
60
138
  /** 把 session id 编码为安全路径段(同 harness encodeSegment 方案:安全字符原样,其余 ~XXXX)。 */
61
139
  function encodeSegment(raw) {
62
140
  if (raw.length === 0)
@@ -90,24 +168,51 @@ export class RefLibService extends Service {
90
168
  super(ctx, 'refLibs');
91
169
  this.root = config.root ?? join(dshHomePath('plugin-data', 'ref-lib'));
92
170
  }
93
- /** 当前会话的参考库列表(内存缓存 → sidecar 文件 → 旧日志迁移 → 父会话继承)。 */
171
+ /** 当前会话的参考库列表(内存缓存 → sidecar 文件 → 旧日志迁移 → 父会话继承),
172
+ * 返回前对每个条目实时探测可用性,状态变化时原子写回。每次读取(面板/命令/注入
173
+ * 回调)即刷新——"下一次对话"必然反映最新失效状态。 */
94
174
  list(session) {
95
175
  const cached = this.cache.get(session.id);
96
- if (cached !== undefined)
97
- return cached;
98
- const libs = this.loadFromStorage(session);
99
- this.cacheSet(session.id, libs);
100
- return libs;
176
+ const libs = cached !== undefined ? cached : this.loadFromStorage(session);
177
+ const refreshed = this.refreshAvailability(session.id, libs);
178
+ this.cacheSet(session.id, refreshed);
179
+ return refreshed;
180
+ }
181
+ /**
182
+ * 对每个条目实时探测可用性;探测结果与条目当前 status 不同(或从未检测)时,
183
+ * 更新 status/checkedAt 并原子写回 sidecar v3;无变化不写盘。
184
+ * @param sessionId - 会话 id(写回目标)。
185
+ * @param libs - 条目列表。
186
+ * @returns 探测后的最新列表(元素在无变化时保持引用不变)。
187
+ */
188
+ refreshAvailability(sessionId, libs) {
189
+ if (libs.length === 0)
190
+ return libs;
191
+ const now = Date.now();
192
+ let changed = false;
193
+ const next = libs.map((entry) => {
194
+ const probe = probeAvailability(entry.path);
195
+ if (!statusChanged(entry, probe))
196
+ return entry;
197
+ changed = true;
198
+ return { ...entry, status: probe, checkedAt: now };
199
+ });
200
+ if (changed)
201
+ this.persistSync(sessionId, next);
202
+ return next;
101
203
  }
102
204
  /**
103
205
  * 为当前会话注册一个只读参考库:realpath 规范化并校验为存在的目录;
104
206
  * 同路径已注册时幂等返回现有条目。
105
207
  * @param session - 目标会话。
106
208
  * @param path - 目录路径(相对路径按宿主 cwd 解析)。
209
+ * @param note - 可选用途说明(注入上下文时展示);空/undefined 时尝试自动提取
210
+ * README 首标题作为默认 note。
107
211
  * @returns 新增(或已存在)的条目。
108
212
  * @throws {RefLibPathError} 路径不存在或不是目录。
213
+ * @throws {RefLibNoteError} note 含控制字符。
109
214
  */
110
- async add(session, path) {
215
+ async add(session, path, note) {
111
216
  const canonical = await realpath(path).catch(() => {
112
217
  throw new RefLibPathError(path, 'missing');
113
218
  });
@@ -120,11 +225,28 @@ export class RefLibService extends Service {
120
225
  });
121
226
  if (!info.isDirectory())
122
227
  throw new RefLibPathError(path, 'not-directory');
228
+ // note:显式提供优先;否则自动提取 README 标题(IO 失败/无标题则 undefined)。
229
+ const noteValue = normalizeNote(note) ?? (await readReadmeTitle(canonical));
123
230
  const current = this.list(session);
124
231
  const existing = current.find((entry) => entry.path === canonical);
125
- if (existing !== undefined)
232
+ if (existing !== undefined) {
233
+ // 同路径再次 add 且带不同 note:更新用途说明(兼作改用途入口)。
234
+ if (noteValue !== undefined && noteValue !== existing.note) {
235
+ const next = current.map((entry) => (entry.id === existing.id ? { ...entry, note: noteValue } : entry));
236
+ this.persistSync(session.id, next);
237
+ this.cacheSet(session.id, next);
238
+ return { ...existing, note: noteValue };
239
+ }
126
240
  return existing;
127
- const entry = { id: randomUUID(), path: canonical };
241
+ }
242
+ const entry = {
243
+ id: randomUUID(),
244
+ path: canonical,
245
+ // add 已做 realpath + stat 校验,新条目直接标记可用并记录检测时间。
246
+ status: 'available',
247
+ checkedAt: Date.now(),
248
+ ...(noteValue === undefined ? {} : { note: noteValue }),
249
+ };
128
250
  const next = upsertLib(current, entry);
129
251
  this.persistSync(session.id, next);
130
252
  this.cacheSet(session.id, next);
@@ -144,6 +266,42 @@ export class RefLibService extends Service {
144
266
  this.persistSync(session.id, next);
145
267
  this.cacheSet(session.id, next);
146
268
  }
269
+ /**
270
+ * 更新已有条目的用途说明(note);note 为空/undefined 时清除该字段。
271
+ * 失效条目(status 非 available)**拒绝更新**——目录不可用时仅允许移除。
272
+ * @param session - 目标会话。
273
+ * @param id - 条目 id。
274
+ * @param note - 新用途说明(可为空串清除)。
275
+ * @returns 更新后的条目。
276
+ * @throws {RefLibUnknownError} id 未注册。
277
+ * @throws {RefLibUnavailableError} 条目目录不可用(仅允许移除)。
278
+ * @throws {RefLibNoteError} note 含不允许的控制字符。
279
+ */
280
+ async setNote(session, id, note) {
281
+ const current = this.list(session);
282
+ const entry = current.find((item) => item.id === id);
283
+ if (entry === undefined)
284
+ throw new RefLibUnknownError(id);
285
+ // list() 返回前已实时探测;失效条目只允许 remove。
286
+ if (entry.status !== undefined && entry.status !== 'available') {
287
+ throw new RefLibUnavailableError(entry.path);
288
+ }
289
+ const normalized = normalizeNote(note);
290
+ const next = current.map((item) => {
291
+ if (item.id !== id)
292
+ return item;
293
+ // 空串/undefined:清除 note 字段(显式删除键,避免 spread 保留旧值)。
294
+ if (normalized === undefined) {
295
+ const rest = { ...item };
296
+ delete rest.note;
297
+ return rest;
298
+ }
299
+ return { ...item, note: normalized };
300
+ });
301
+ this.persistSync(session.id, next);
302
+ this.cacheSet(session.id, next);
303
+ return next.find((item) => item.id === id);
304
+ }
147
305
  /** 冷读:sidecar 文件 → 旧日志事件迁移 → 父会话继承 → 空列表。 */
148
306
  loadFromStorage(session) {
149
307
  const file = this.pathOf(session.id);
@@ -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/lib/spec.d.ts CHANGED
@@ -9,6 +9,8 @@
9
9
  * 读取历史 `ref-lib/set` 事件)。无全局配置。
10
10
  * @module @hpyperry/dsh-ref-lib/src/spec
11
11
  */
12
+ /** 目录在文件系统上的可用性(最近一次检测快照)。 */
13
+ export type RefLibAvailability = 'available' | 'missing' | 'not-directory';
12
14
  /** 一个只读参考库条目。 */
13
15
  export interface RefLibEntry {
14
16
  /** 稳定 id(uuid),与路径解耦(路径可规范化重写)。 */
@@ -17,6 +19,13 @@ export interface RefLibEntry {
17
19
  readonly path: string;
18
20
  /** 可选用途说明,注入上下文时展示。 */
19
21
  readonly note?: string;
22
+ /**
23
+ * 最近一次可用性检测结果;无检测记录(v2 旧 sidecar / 旧日志迁移条目)时缺省,
24
+ * 首次读取即探测。`missing` = 目录被删/不可达;`not-directory` = 路径被替换为文件。
25
+ */
26
+ readonly status?: RefLibAvailability;
27
+ /** 最近一次检测的 epoch ms;缺省视为"从未检测"(立即探测)。 */
28
+ readonly checkedAt?: number;
20
29
  }
21
30
  declare module '@deepseek-ai/dsh-session/types' {
22
31
  interface SessionEventMap {
package/lib/spec.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../src/spec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,iBAAiB;AACjB,MAAM,WAAW,WAAW;IAC1B,mCAAmC;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,uBAAuB;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,OAAO,QAAQ,gCAAgC,CAAC;IAC9C,UAAU,eAAe;QACvB;;;;WAIG;QACH,aAAa,EAAE;YAAE,IAAI,EAAE,SAAS,WAAW,EAAE,CAAA;SAAE,CAAA;KAChD;CACF"}
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../src/spec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,8BAA8B;AAC9B,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,SAAS,GAAG,eAAe,CAAA;AAE1E,iBAAiB;AACjB,MAAM,WAAW,WAAW;IAC1B,mCAAmC;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,uBAAuB;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAA;IACpC,yCAAyC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,OAAO,QAAQ,gCAAgC,CAAC;IAC9C,UAAU,eAAe;QACvB;;;;WAIG;QACH,aAAa,EAAE;YAAE,IAAI,EAAE,SAAS,WAAW,EAAE,CAAA;SAAE,CAAA;KAChD;CACF"}
package/lib/validate.d.ts CHANGED
@@ -12,6 +12,6 @@ import type { RefLibEntry } from './spec.ts';
12
12
  export declare function hasControlCharacters(text: string): boolean;
13
13
  /** 把全部不可见控制字符替换为 U+FFFD(路径/备注最终会进入系统提示词,兜底消毒)。 */
14
14
  export declare function sanitizeControlCharacters(text: string): string;
15
- /** 校验一个未知对象是否为合法条目(宽松:仅要求 id/path 字符串、note 可选字符串)。 */
15
+ /** 校验一个未知对象是否为合法条目(宽松:id/path 必填字符串,note/status/checkedAt 可选且类型正确)。 */
16
16
  export declare function isRefLibEntry(value: unknown): value is RefLibEntry;
17
17
  //# sourceMappingURL=validate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAW5C,oBAAoB;AACpB,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,kDAAkD;AAClD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAKlE"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAW5C,oBAAoB;AACpB,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,kDAAkD;AAClD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9D;AAKD,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAclE"}
package/lib/validate.js CHANGED
@@ -23,13 +23,21 @@ export function hasControlCharacters(text) {
23
23
  export function sanitizeControlCharacters(text) {
24
24
  return text.replace(CONTROL_CHARACTERS_GLOBAL, '\uFFFD');
25
25
  }
26
- /** 校验一个未知对象是否为合法条目(宽松:仅要求 id/path 字符串、note 可选字符串)。 */
26
+ /** 可用性字面量集合(status 字段合法值)。 */
27
+ const AVAILABILITY_VALUES = new Set(['available', 'missing', 'not-directory']);
28
+ /** 校验一个未知对象是否为合法条目(宽松:id/path 必填字符串,note/status/checkedAt 可选且类型正确)。 */
27
29
  export function isRefLibEntry(value) {
28
30
  if (typeof value !== 'object' || value === null)
29
31
  return false;
30
- const { id, path, note } = value;
32
+ const { id, path, note, status, checkedAt } = value;
31
33
  if (typeof id !== 'string' || typeof path !== 'string')
32
34
  return false;
33
- return note === undefined || typeof note === 'string';
35
+ if (note !== undefined && typeof note !== 'string')
36
+ return false;
37
+ if (status !== undefined && (typeof status !== 'string' || !AVAILABILITY_VALUES.has(status)))
38
+ return false;
39
+ if (checkedAt !== undefined && (typeof checkedAt !== 'number' || !Number.isFinite(checkedAt)))
40
+ return false;
41
+ return true;
34
42
  }
35
43
  //# sourceMappingURL=validate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG,0CAA0C,CAAA;AACrE,MAAM,yBAAyB,GAAG,2CAA2C,CAAA;AAE7E,oBAAoB;AACpB,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACtC,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,OAAO,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAA;AAC1D,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAC7D,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAyD,CAAA;IACpF,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACpE,OAAO,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAA;AACvD,CAAC"}
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG,0CAA0C,CAAA;AACrE,MAAM,yBAAyB,GAAG,2CAA2C,CAAA;AAE7E,oBAAoB;AACpB,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACtC,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,OAAO,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAA;AAC1D,CAAC;AAED,8BAA8B;AAC9B,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC,CAAA;AAE9E,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAC7D,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,KAM7C,CAAA;IACD,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACpE,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAChE,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA;IAC1G,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA;IAC3G,OAAO,IAAI,CAAA;AACb,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hpyperry/dsh-ref-lib",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "description": "只读参考库插件:UI 交互式管理(应用内目录浏览器/系统选择器/手动路径直加)+ systemPrompt 注入 + per-session sidecar 持久化",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -40,17 +40,25 @@
40
40
  },
41
41
  "peerDependencies": {
42
42
  "@deepseek-ai/cordis": "^4.0.1",
43
- "@deepseek-ai/dsh-client-locale": "^0.1.0-rc.6",
44
- "@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.6",
45
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.0-rc.6",
46
- "@deepseek-ai/dsh-commands": "^0.1.0-rc.6",
47
- "@deepseek-ai/dsh-home-paths": "^0.1.0-rc.6",
48
- "@deepseek-ai/dsh-host-webserver": "^0.1.0-rc.6",
49
- "@deepseek-ai/dsh-session": "^0.1.0-rc.6",
50
- "@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6",
43
+ "@deepseek-ai/dsh-client-locale": "^0.1.0-rc.7",
44
+ "@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.7",
45
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.1.0-rc.7",
46
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.0-rc.7",
47
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.7",
48
+ "@deepseek-ai/dsh-commands": "^0.1.0-rc.7",
49
+ "@deepseek-ai/dsh-home-paths": "^0.1.0-rc.7",
50
+ "@deepseek-ai/dsh-host-webserver": "^0.1.0-rc.7",
51
+ "@deepseek-ai/dsh-session": "^0.1.0-rc.7",
52
+ "@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.7",
51
53
  "react": "^18.2.0"
52
54
  },
53
55
  "devDependencies": {
56
+ "@deepseek-ai/cordis-plugin-include": "^1.0.6",
57
+ "@deepseek-ai/cordis-plugin-loader": "^1.0.2",
58
+ "@deepseek-ai/dsh-client-ui-conversation": "0.1.0-rc.7",
59
+ "@deepseek-ai/dsh-client-ui-slots": "0.1.0-rc.7",
60
+ "@deepseek-ai/dsh-session-persistence": "0.1.0-rc.7",
61
+ "@deepseek-ai/dsh-session-persistence-jsonl": "0.1.0-rc.7",
54
62
  "@types/node": "^22.0.0",
55
63
  "@types/react": "^18.3.31",
56
64
  "eslint": "^10.8.1",