@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.
- package/README.md +13 -14
- package/lib/client/RefLibCommandCard.d.ts +29 -0
- package/lib/client/RefLibCommandCard.d.ts.map +1 -0
- package/lib/client/RefLibCommandCard.js +48 -0
- package/lib/client/RefLibCommandCard.js.map +1 -0
- package/lib/client/RefLibDock.d.ts +4 -2
- package/lib/client/RefLibDock.d.ts.map +1 -1
- package/lib/client/RefLibDock.js +121 -37
- package/lib/client/RefLibDock.js.map +1 -1
- package/lib/client/RefLibPanel.d.ts +6 -4
- package/lib/client/RefLibPanel.d.ts.map +1 -1
- package/lib/client/RefLibPanel.js +69 -20
- package/lib/client/RefLibPanel.js.map +1 -1
- package/lib/client/index.d.ts.map +1 -1
- package/lib/client/index.js +13 -2
- package/lib/client/index.js.map +1 -1
- package/lib/client/locales.d.ts +30 -2
- package/lib/client/locales.d.ts.map +1 -1
- package/lib/client/locales.js +42 -8
- package/lib/client/locales.js.map +1 -1
- package/lib/client/refresh-guard.d.ts +31 -0
- package/lib/client/refresh-guard.d.ts.map +1 -0
- package/lib/client/refresh-guard.js +38 -0
- package/lib/client/refresh-guard.js.map +1 -0
- package/lib/client/styles.d.ts.map +1 -1
- package/lib/client/styles.js +269 -23
- package/lib/client/styles.js.map +1 -1
- package/lib/client.js +1141 -500
- package/lib/client.js.map +1 -1
- package/lib/commands.d.ts +2 -1
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +15 -3
- package/lib/commands.js.map +1 -1
- package/lib/index.d.ts +3 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +9 -7
- package/lib/index.js.map +1 -1
- package/lib/logic.d.ts +16 -1
- package/lib/logic.d.ts.map +1 -1
- package/lib/logic.js +19 -0
- package/lib/logic.js.map +1 -1
- package/lib/render.d.ts +10 -4
- package/lib/render.d.ts.map +1 -1
- package/lib/render.js +113 -16
- package/lib/render.js.map +1 -1
- package/lib/routes.d.ts.map +1 -1
- package/lib/routes.js +46 -2
- package/lib/routes.js.map +1 -1
- package/lib/service.d.ts +52 -3
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +172 -14
- package/lib/service.js.map +1 -1
- package/lib/spec.d.ts +9 -0
- package/lib/spec.d.ts.map +1 -1
- package/lib/validate.d.ts +1 -1
- package/lib/validate.d.ts.map +1 -1
- package/lib/validate.js +11 -3
- package/lib/validate.js.map +1 -1
- package/package.json +17 -9
package/lib/logic.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @module @hpyperry/dsh-ref-lib/src/logic
|
|
4
4
|
*/
|
|
5
5
|
import type { SessionEvent } from '@deepseek-ai/dsh-session';
|
|
6
|
-
import type { RefLibEntry } from './spec.ts';
|
|
6
|
+
import type { RefLibAvailability, RefLibEntry } from './spec.ts';
|
|
7
7
|
/**
|
|
8
8
|
* 从 session 事件流折叠出参考库列表(取最后一个合法 `ref-lib/set` 的完整快照;
|
|
9
9
|
* 无事件时为初始空列表)。v3 起仅用于迁移旧日志中已存在的 `ref-lib/set` 事件。
|
|
@@ -29,4 +29,19 @@ export declare function upsertLib(list: readonly RefLibEntry[], entry: RefLibEnt
|
|
|
29
29
|
* @returns 移除后的新列表。
|
|
30
30
|
*/
|
|
31
31
|
export declare function removeLib(list: readonly RefLibEntry[], id: string): RefLibEntry[];
|
|
32
|
+
/**
|
|
33
|
+
* 注入过滤:仅保留可用条目。失效(missing/not-directory)与未检测(status 缺省)
|
|
34
|
+
* 条目一律不注入——注入的是"可用参考",失效目录读了也白读,且避免误导模型访问
|
|
35
|
+
* 不存在的路径。调用方(service.list)保证 status 在返回前已实时探测。
|
|
36
|
+
* @param libs - 全部条目(含失效)。
|
|
37
|
+
* @returns 仅 `status === 'available'` 的条目。
|
|
38
|
+
*/
|
|
39
|
+
export declare function filterAvailable(libs: readonly RefLibEntry[]): RefLibEntry[];
|
|
40
|
+
/**
|
|
41
|
+
* 探测结果是否与条目当前 status 不同(决定是否写盘)。
|
|
42
|
+
* @param entry - 条目(可能无检测记录)。
|
|
43
|
+
* @param probe - 最新探测结果。
|
|
44
|
+
* @returns true 表示需要把探测结果落盘:条目从未检测(status 缺省),或结果已变化。
|
|
45
|
+
*/
|
|
46
|
+
export declare function statusChanged(entry: RefLibEntry, probe: RefLibAvailability): boolean;
|
|
32
47
|
//# sourceMappingURL=logic.d.ts.map
|
package/lib/logic.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logic.d.ts","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"logic.d.ts","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAGhE;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,WAAW,EAAE,CAQ1E;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,EAAE,CAKzF;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,WAAW,EAAE,CAEjF;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,GAAG,WAAW,EAAE,CAE3E;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAEpF"}
|
package/lib/logic.js
CHANGED
|
@@ -45,4 +45,23 @@ export function upsertLib(list, entry) {
|
|
|
45
45
|
export function removeLib(list, id) {
|
|
46
46
|
return list.filter((entry) => entry.id !== id);
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* 注入过滤:仅保留可用条目。失效(missing/not-directory)与未检测(status 缺省)
|
|
50
|
+
* 条目一律不注入——注入的是"可用参考",失效目录读了也白读,且避免误导模型访问
|
|
51
|
+
* 不存在的路径。调用方(service.list)保证 status 在返回前已实时探测。
|
|
52
|
+
* @param libs - 全部条目(含失效)。
|
|
53
|
+
* @returns 仅 `status === 'available'` 的条目。
|
|
54
|
+
*/
|
|
55
|
+
export function filterAvailable(libs) {
|
|
56
|
+
return libs.filter((entry) => entry.status === 'available');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 探测结果是否与条目当前 status 不同(决定是否写盘)。
|
|
60
|
+
* @param entry - 条目(可能无检测记录)。
|
|
61
|
+
* @param probe - 最新探测结果。
|
|
62
|
+
* @returns true 表示需要把探测结果落盘:条目从未检测(status 缺省),或结果已变化。
|
|
63
|
+
*/
|
|
64
|
+
export function statusChanged(entry, probe) {
|
|
65
|
+
return entry.status === undefined || entry.status !== probe;
|
|
66
|
+
}
|
|
48
67
|
//# sourceMappingURL=logic.js.map
|
package/lib/logic.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logic.js","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAE7C;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,MAA+B;IACzD,IAAI,IAAI,GAAkB,EAAE,CAAA;IAC5B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;YAAE,SAAQ;QAC1C,MAAM,IAAI,GAAI,KAAK,CAAC,IAAuC,EAAE,IAAI,CAAA;QACjE,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IAC5D,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,IAA4B,EAAE,KAAkB;IACxE,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtF,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAA;AACzB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,IAA4B,EAAE,EAAU;IAChE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;AAChD,CAAC"}
|
|
1
|
+
{"version":3,"file":"logic.js","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAE7C;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,MAA+B;IACzD,IAAI,IAAI,GAAkB,EAAE,CAAA;IAC5B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;YAAE,SAAQ;QAC1C,MAAM,IAAI,GAAI,KAAK,CAAC,IAAuC,EAAE,IAAI,CAAA;QACjE,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IAC5D,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,IAA4B,EAAE,KAAkB;IACxE,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtF,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAA;AACzB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,IAA4B,EAAE,EAAU;IAChE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;AAChD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAA4B;IAC1D,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,CAAA;AAC7D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAkB,EAAE,KAAyB;IACzE,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAA;AAC7D,CAAC"}
|
package/lib/render.d.ts
CHANGED
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* systemPrompt 注入文本的纯渲染函数。
|
|
3
|
+
*
|
|
4
|
+
* 注入模板为**定稿英文版**(2026-08 优化:MUST/ALWAYS 强制语义 + note 作为
|
|
5
|
+
* routing metadata + 只读约束细化)。动态部分仅参考库列表(序号 + basename +
|
|
6
|
+
* Path + Description),其余规则文本为静态常量。
|
|
3
7
|
* @module @hpyperry/dsh-ref-lib/src/render
|
|
4
8
|
*/
|
|
5
9
|
import type { RefLibEntry } from './spec.ts';
|
|
6
10
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
11
|
+
* 渲染参考库清单与规则声明。先过滤失效条目(`filterAvailable`):失效目录读了也
|
|
12
|
+
* 白读,且避免误导模型访问不存在的路径。过滤后为空(无库/全部失效)返回空串,
|
|
13
|
+
* 不占用模型上下文 token。
|
|
14
|
+
* @param libs - 已注册的只读参考库(含失效)。
|
|
15
|
+
* @returns 注入到系统提示的文本;无可注入库时为空串。
|
|
10
16
|
*/
|
|
11
17
|
export declare function renderRefLibs(libs: readonly RefLibEntry[]): string;
|
|
12
18
|
/**
|
|
13
|
-
* 渲染 `/ref-lib list`
|
|
19
|
+
* 渲染 `/ref-lib list` 的人类可读输出;失效条目带状态标记。
|
|
14
20
|
* @param libs - 已注册的只读参考库。
|
|
15
21
|
* @returns 列表文本;无库时提示为空。
|
|
16
22
|
*/
|
package/lib/render.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAkG5C;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,CAKlE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,CAWlE"}
|
package/lib/render.js
CHANGED
|
@@ -1,29 +1,123 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* systemPrompt 注入文本的纯渲染函数。
|
|
3
|
+
*
|
|
4
|
+
* 注入模板为**定稿英文版**(2026-08 优化:MUST/ALWAYS 强制语义 + note 作为
|
|
5
|
+
* routing metadata + 只读约束细化)。动态部分仅参考库列表(序号 + basename +
|
|
6
|
+
* Path + Description),其余规则文本为静态常量。
|
|
3
7
|
* @module @hpyperry/dsh-ref-lib/src/render
|
|
4
8
|
*/
|
|
9
|
+
import { basename } from 'node:path';
|
|
10
|
+
import { filterAvailable } from "./logic.js";
|
|
5
11
|
import { sanitizeControlCharacters } from "./validate.js";
|
|
12
|
+
/** 一条参考库的注入渲染(`1. <basename>\n Path: <path>\n Description: <note>`)。 */
|
|
13
|
+
function renderLibrary(entry, index) {
|
|
14
|
+
const path = sanitizeControlCharacters(entry.path);
|
|
15
|
+
const lines = [`${index + 1}. ${sanitizeControlCharacters(basename(path))}`, ` Path: ${path}`];
|
|
16
|
+
const note = entry.note?.trim();
|
|
17
|
+
if (note !== undefined && note !== '') {
|
|
18
|
+
// 注入模板的 Description 是单行:多行 note 折叠为空格(存储保留换行,展示与注入单行化)。
|
|
19
|
+
const flat = note.replace(/\s+/g, ' ');
|
|
20
|
+
lines.push(` Description: ${sanitizeControlCharacters(flat)}`);
|
|
21
|
+
}
|
|
22
|
+
return lines.join('\n');
|
|
23
|
+
}
|
|
24
|
+
/** 参考库规则模板(定稿英文版):静态部分,仅 Reference libraries 列表动态。 */
|
|
25
|
+
const REF_LIB_TEMPLATE = `[Read-only Reference Libraries]
|
|
26
|
+
|
|
27
|
+
The following local directories are registered as reference libraries.
|
|
28
|
+
|
|
29
|
+
Each library has a path and a description. The description is routing
|
|
30
|
+
metadata that explains the library's scope and helps determine whether
|
|
31
|
+
the library is relevant to the current task.
|
|
32
|
+
|
|
33
|
+
Reference libraries:
|
|
34
|
+
|
|
35
|
+
{LIBS}
|
|
36
|
+
|
|
37
|
+
[Reference Library Selection]
|
|
38
|
+
|
|
39
|
+
Before answering or acting on any project-specific question:
|
|
40
|
+
|
|
41
|
+
1. Use the library descriptions to determine which reference libraries
|
|
42
|
+
are potentially relevant.
|
|
43
|
+
|
|
44
|
+
2. Search relevant reference libraries FIRST, before:
|
|
45
|
+
- web search
|
|
46
|
+
- third-party sources
|
|
47
|
+
- model memory
|
|
48
|
+
|
|
49
|
+
3. Do NOT search unrelated reference libraries unless the relevant
|
|
50
|
+
library does not contain sufficient information.
|
|
51
|
+
|
|
52
|
+
4. A library description is routing metadata only. It is NOT authoritative
|
|
53
|
+
evidence about the contents or behavior of the project. Verify factual
|
|
54
|
+
claims by reading the actual files in the library.
|
|
55
|
+
|
|
56
|
+
[Reference Library Search]
|
|
57
|
+
|
|
58
|
+
For each relevant library:
|
|
59
|
+
|
|
60
|
+
1. Read its root README, index, or documented entry point first.
|
|
61
|
+
2. Locate only the files needed to answer the question.
|
|
62
|
+
3. Read the minimum necessary content.
|
|
63
|
+
4. NEVER recursively scan or dump the entire library.
|
|
64
|
+
|
|
65
|
+
If the library has no README or index, inspect its root directory to find
|
|
66
|
+
an appropriate entry point.
|
|
67
|
+
|
|
68
|
+
[Authority]
|
|
69
|
+
|
|
70
|
+
Information found in a relevant reference library is authoritative for
|
|
71
|
+
project-specific facts and takes precedence over model memory and general
|
|
72
|
+
knowledge.
|
|
73
|
+
|
|
74
|
+
If multiple reference libraries contain conflicting information:
|
|
75
|
+
|
|
76
|
+
1. Prefer the library most directly relevant to the question.
|
|
77
|
+
2. Prefer explicit source code or documentation over inference.
|
|
78
|
+
3. If the conflict cannot be resolved, explicitly report the conflict.
|
|
79
|
+
4. NEVER silently guess or merge conflicting information.
|
|
80
|
+
|
|
81
|
+
[External Sources]
|
|
82
|
+
|
|
83
|
+
If the relevant reference libraries do not contain sufficient information,
|
|
84
|
+
external sources MAY be used.
|
|
85
|
+
|
|
86
|
+
When external sources are used, explicitly state:
|
|
87
|
+
|
|
88
|
+
"Not in reference library; external source used."
|
|
89
|
+
|
|
90
|
+
Do NOT use external sources merely to verify or supplement information
|
|
91
|
+
already established by the reference libraries.
|
|
92
|
+
|
|
93
|
+
[Read-only Constraint]
|
|
94
|
+
|
|
95
|
+
Reference libraries are strictly read-only.
|
|
96
|
+
|
|
97
|
+
NEVER create, modify, delete, rename, move, or overwrite files or directories
|
|
98
|
+
inside a reference library.
|
|
99
|
+
|
|
100
|
+
If changes are required:
|
|
101
|
+
|
|
102
|
+
1. Copy the relevant files into the current workspace.
|
|
103
|
+
2. Make changes only in the copied files.
|
|
104
|
+
3. Keep the original reference library unchanged.`;
|
|
6
105
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
106
|
+
* 渲染参考库清单与规则声明。先过滤失效条目(`filterAvailable`):失效目录读了也
|
|
107
|
+
* 白读,且避免误导模型访问不存在的路径。过滤后为空(无库/全部失效)返回空串,
|
|
108
|
+
* 不占用模型上下文 token。
|
|
109
|
+
* @param libs - 已注册的只读参考库(含失效)。
|
|
110
|
+
* @returns 注入到系统提示的文本;无可注入库时为空串。
|
|
10
111
|
*/
|
|
11
112
|
export function renderRefLibs(libs) {
|
|
12
|
-
|
|
113
|
+
const available = filterAvailable(libs);
|
|
114
|
+
if (available.length === 0)
|
|
13
115
|
return '';
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
return `- ${sanitizeControlCharacters(entry.path)}${note}`;
|
|
17
|
-
});
|
|
18
|
-
return [
|
|
19
|
-
'只读参考库:以下目录作为可参考库按需使用——不要主动遍历或全量读取,仅当任务需要时才读取具体文件(大文件先读其索引/README)。',
|
|
20
|
-
'查询优先级:当需要查证信息、规范或依据时,优先在上述参考库目录内检索(先读其索引/README,再按需读取具体文件),确认参考库未覆盖或不足以回答后,才改用其他途径(如网络搜索等)。',
|
|
21
|
-
'只读约束:禁止创建、修改或删除其中任何文件;如需改动,先把文件复制到当前工作区。',
|
|
22
|
-
...lines,
|
|
23
|
-
].join('\n');
|
|
116
|
+
const libraries = available.map(renderLibrary).join('\n\n');
|
|
117
|
+
return REF_LIB_TEMPLATE.replace('{LIBS}', libraries);
|
|
24
118
|
}
|
|
25
119
|
/**
|
|
26
|
-
* 渲染 `/ref-lib list`
|
|
120
|
+
* 渲染 `/ref-lib list` 的人类可读输出;失效条目带状态标记。
|
|
27
121
|
* @param libs - 已注册的只读参考库。
|
|
28
122
|
* @returns 列表文本;无库时提示为空。
|
|
29
123
|
*/
|
|
@@ -33,7 +127,10 @@ export function renderLibList(libs) {
|
|
|
33
127
|
return libs
|
|
34
128
|
.map((entry) => {
|
|
35
129
|
const note = entry.note === undefined || entry.note === '' ? '' : `(${sanitizeControlCharacters(entry.note)})`;
|
|
36
|
-
|
|
130
|
+
const status = entry.status === 'missing'
|
|
131
|
+
? ' [已失效]'
|
|
132
|
+
: entry.status === 'not-directory' ? ' [不是目录]' : '';
|
|
133
|
+
return `- ${entry.id}: ${sanitizeControlCharacters(entry.path)}${status}${note}`;
|
|
37
134
|
})
|
|
38
135
|
.join('\n');
|
|
39
136
|
}
|
package/lib/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AAEzD,4EAA4E;AAC5E,SAAS,aAAa,CAAC,KAAkB,EAAE,KAAa;IACtD,MAAM,IAAI,GAAG,yBAAyB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAClD,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,yBAAyB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,YAAY,IAAI,EAAE,CAAC,CAAA;IAChG,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAA;IAC/B,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QACtC,wDAAwD;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QACtC,KAAK,CAAC,IAAI,CAAC,mBAAmB,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAClE,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,sDAAsD;AACtD,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kDA+EyB,CAAA;AAElD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,IAA4B;IACxD,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;IACvC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IACrC,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC3D,OAAO,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;AACtD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAA4B;IACxD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,0CAA0C,CAAA;IACxE,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,yBAAyB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAA;QAC9G,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS;YACvC,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAA;QACrD,OAAO,KAAK,KAAK,CAAC,EAAE,KAAK,yBAAyB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,CAAA;IAClF,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC"}
|
package/lib/routes.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/lib/routes.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* @module @hpyperry/dsh-ref-lib/src/routes
|
|
12
12
|
*/
|
|
13
13
|
import { resolveRefLibPath } from "./commands.js";
|
|
14
|
-
import { RefLibPathError, RefLibUnknownError } from "./service.js";
|
|
14
|
+
import { RefLibNoteError, RefLibPathError, RefLibUnavailableError, RefLibUnknownError } from "./service.js";
|
|
15
15
|
/** 请求体大小上限(管理载荷都很小)。 */
|
|
16
16
|
export const MAX_JSON_BODY_BYTES = 64 * 1024;
|
|
17
17
|
/** Loopback 校验:回环源地址 + 同源 Host/Origin(镜像 dsh-ssh 的护栏)。 */
|
|
@@ -128,6 +128,14 @@ export function makeRefLibRoutes(deps) {
|
|
|
128
128
|
writeJson(res, 400, { error: error.message, code: 'ref-lib/unknown-id', id: error.id });
|
|
129
129
|
return;
|
|
130
130
|
}
|
|
131
|
+
if (error instanceof RefLibNoteError) {
|
|
132
|
+
writeJson(res, 400, { error: error.message, code: 'ref-lib/note-unsafe' });
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (error instanceof RefLibUnavailableError) {
|
|
136
|
+
writeJson(res, 400, { error: error.message, code: 'ref-lib/unavailable', path: error.path });
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
131
139
|
log(`ref-lib route error: ${error instanceof Error ? error.message : String(error)}`);
|
|
132
140
|
writeJson(res, 500, { error: error instanceof Error ? error.message : String(error) });
|
|
133
141
|
};
|
|
@@ -169,8 +177,13 @@ export function makeRefLibRoutes(deps) {
|
|
|
169
177
|
writeJson(res, 400, { error: 'missing path' });
|
|
170
178
|
return;
|
|
171
179
|
}
|
|
180
|
+
const note = body.note;
|
|
181
|
+
if (note !== undefined && typeof note !== 'string') {
|
|
182
|
+
writeJson(res, 400, { error: 'note must be a string' });
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
172
185
|
const base = session.header.cwd ?? process.cwd();
|
|
173
|
-
const entry = await refLibs.add(session, resolveRefLibPath(body.path, base));
|
|
186
|
+
const entry = await refLibs.add(session, resolveRefLibPath(body.path, base), note);
|
|
174
187
|
writeJson(res, 200, { entry });
|
|
175
188
|
}
|
|
176
189
|
catch (error) {
|
|
@@ -205,6 +218,37 @@ export function makeRefLibRoutes(deps) {
|
|
|
205
218
|
}
|
|
206
219
|
},
|
|
207
220
|
},
|
|
221
|
+
{
|
|
222
|
+
kind: 'exact',
|
|
223
|
+
path: '/api/ref-lib/note',
|
|
224
|
+
handler: async (req, res) => {
|
|
225
|
+
if (!guard(req, res, 'POST'))
|
|
226
|
+
return;
|
|
227
|
+
try {
|
|
228
|
+
const body = await readJsonBody(req);
|
|
229
|
+
if (body === undefined) {
|
|
230
|
+
writeJson(res, 400, { error: 'invalid JSON body' });
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const session = requireSession(res, body.session);
|
|
234
|
+
if (session === undefined)
|
|
235
|
+
return;
|
|
236
|
+
if (typeof body.id !== 'string' || body.id === '') {
|
|
237
|
+
writeJson(res, 400, { error: 'missing id' });
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
if (body.note !== undefined && typeof body.note !== 'string') {
|
|
241
|
+
writeJson(res, 400, { error: 'note must be a string' });
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
const entry = await refLibs.setNote(session, body.id, body.note);
|
|
245
|
+
writeJson(res, 200, { entry });
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
writeError(res, error);
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
},
|
|
208
252
|
];
|
|
209
253
|
}
|
|
210
254
|
//# sourceMappingURL=routes.js.map
|
package/lib/routes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAsB,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
|
package/lib/service.d.ts
CHANGED
|
@@ -13,7 +13,17 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { Context, Service } from '@deepseek-ai/cordis';
|
|
15
15
|
import type { Session } from '@deepseek-ai/dsh-session';
|
|
16
|
-
import type { RefLibEntry } from './spec.ts';
|
|
16
|
+
import type { RefLibAvailability, RefLibEntry } from './spec.ts';
|
|
17
|
+
/**
|
|
18
|
+
* 探测目录可用性(同步 statSync)。库数量少、本地磁盘、单次亚毫秒级;同步形态
|
|
19
|
+
* 保持 `list()` 与 systemPrompt 注入回调(`text()` 为同步函数)不变。
|
|
20
|
+
* @param path - 目录绝对路径。
|
|
21
|
+
* @returns 存在且是目录 → available;存在但不是目录 → not-directory;
|
|
22
|
+
* stat 失败(不存在/权限不可达)→ missing。
|
|
23
|
+
*/
|
|
24
|
+
export declare function probeAvailability(path: string): RefLibAvailability;
|
|
25
|
+
/** 用途说明(note)最大长度;超出截断,防止注入文本膨胀。 */
|
|
26
|
+
export declare const NOTE_MAX_LENGTH = 120;
|
|
17
27
|
/** add 请求指向的路径不存在或不是目录(或含控制字符)。 */
|
|
18
28
|
export declare class RefLibPathError extends Error {
|
|
19
29
|
readonly path: string;
|
|
@@ -32,6 +42,20 @@ export declare class RefLibUnknownError extends Error {
|
|
|
32
42
|
*/
|
|
33
43
|
constructor(id: string);
|
|
34
44
|
}
|
|
45
|
+
/** note 含控制字符(提示词注入卫生;渲染层另有兜底消毒)。 */
|
|
46
|
+
export declare class RefLibNoteError extends Error {
|
|
47
|
+
constructor();
|
|
48
|
+
}
|
|
49
|
+
/** 条目目录不可用(missing / not-directory):仅允许移除,其他变更(如更新 note)拒绝。 */
|
|
50
|
+
export declare class RefLibUnavailableError extends Error {
|
|
51
|
+
readonly path: string;
|
|
52
|
+
/**
|
|
53
|
+
* @param path - 失效条目的目录路径。
|
|
54
|
+
*/
|
|
55
|
+
constructor(path: string);
|
|
56
|
+
}
|
|
57
|
+
/** 从 README 文本提取首个 Markdown 标题(去 `#`、trim、限长);无标题返回 undefined。 */
|
|
58
|
+
export declare function extractReadmeTitle(content: string): string | undefined;
|
|
35
59
|
declare module '@deepseek-ai/cordis' {
|
|
36
60
|
interface Context {
|
|
37
61
|
refLibs: RefLibService;
|
|
@@ -57,17 +81,30 @@ export declare class RefLibService extends Service {
|
|
|
57
81
|
* @param config - 可选存储根目录覆盖(测试用)。
|
|
58
82
|
*/
|
|
59
83
|
constructor(ctx: Context, config?: RefLibServiceConfig);
|
|
60
|
-
/** 当前会话的参考库列表(内存缓存 → sidecar 文件 → 旧日志迁移 →
|
|
84
|
+
/** 当前会话的参考库列表(内存缓存 → sidecar 文件 → 旧日志迁移 → 父会话继承),
|
|
85
|
+
* 返回前对每个条目实时探测可用性,状态变化时原子写回。每次读取(面板/命令/注入
|
|
86
|
+
* 回调)即刷新——"下一次对话"必然反映最新失效状态。 */
|
|
61
87
|
list(session: Session): readonly RefLibEntry[];
|
|
88
|
+
/**
|
|
89
|
+
* 对每个条目实时探测可用性;探测结果与条目当前 status 不同(或从未检测)时,
|
|
90
|
+
* 更新 status/checkedAt 并原子写回 sidecar v3;无变化不写盘。
|
|
91
|
+
* @param sessionId - 会话 id(写回目标)。
|
|
92
|
+
* @param libs - 条目列表。
|
|
93
|
+
* @returns 探测后的最新列表(元素在无变化时保持引用不变)。
|
|
94
|
+
*/
|
|
95
|
+
private refreshAvailability;
|
|
62
96
|
/**
|
|
63
97
|
* 为当前会话注册一个只读参考库:realpath 规范化并校验为存在的目录;
|
|
64
98
|
* 同路径已注册时幂等返回现有条目。
|
|
65
99
|
* @param session - 目标会话。
|
|
66
100
|
* @param path - 目录路径(相对路径按宿主 cwd 解析)。
|
|
101
|
+
* @param note - 可选用途说明(注入上下文时展示);空/undefined 时尝试自动提取
|
|
102
|
+
* README 首标题作为默认 note。
|
|
67
103
|
* @returns 新增(或已存在)的条目。
|
|
68
104
|
* @throws {RefLibPathError} 路径不存在或不是目录。
|
|
105
|
+
* @throws {RefLibNoteError} note 含控制字符。
|
|
69
106
|
*/
|
|
70
|
-
add(session: Session, path: string): Promise<RefLibEntry>;
|
|
107
|
+
add(session: Session, path: string, note?: string): Promise<RefLibEntry>;
|
|
71
108
|
/**
|
|
72
109
|
* 从当前会话移除一个参考库条目(不删除磁盘目录)。
|
|
73
110
|
* @param session - 目标会话。
|
|
@@ -75,6 +112,18 @@ export declare class RefLibService extends Service {
|
|
|
75
112
|
* @throws {RefLibUnknownError} id 未注册。
|
|
76
113
|
*/
|
|
77
114
|
remove(session: Session, id: string): Promise<void>;
|
|
115
|
+
/**
|
|
116
|
+
* 更新已有条目的用途说明(note);note 为空/undefined 时清除该字段。
|
|
117
|
+
* 失效条目(status 非 available)**拒绝更新**——目录不可用时仅允许移除。
|
|
118
|
+
* @param session - 目标会话。
|
|
119
|
+
* @param id - 条目 id。
|
|
120
|
+
* @param note - 新用途说明(可为空串清除)。
|
|
121
|
+
* @returns 更新后的条目。
|
|
122
|
+
* @throws {RefLibUnknownError} id 未注册。
|
|
123
|
+
* @throws {RefLibUnavailableError} 条目目录不可用(仅允许移除)。
|
|
124
|
+
* @throws {RefLibNoteError} note 含不允许的控制字符。
|
|
125
|
+
*/
|
|
126
|
+
setNote(session: Session, id: string, note?: string): Promise<RefLibEntry>;
|
|
78
127
|
/** 冷读:sidecar 文件 → 旧日志事件迁移 → 父会话继承 → 空列表。 */
|
|
79
128
|
private loadFromStorage;
|
|
80
129
|
private pathOf;
|
package/lib/service.d.ts.map
CHANGED
|
@@ -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,WAAW,EAAE,MAAM,WAAW,CAAA;
|
|
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"}
|