dsh-data-domain-knowledge 0.1.0-alpha.1

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 (231) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +360 -0
  3. package/cordis.patch.yml +410 -0
  4. package/eval/README.md +76 -0
  5. package/eval/evaluate-retrieval.mjs +121 -0
  6. package/eval/queries.example.jsonl +2 -0
  7. package/lib/client.js +111415 -0
  8. package/lib/types/config-schema.d.ts +35 -0
  9. package/lib/types/config-schema.d.ts.map +1 -0
  10. package/lib/types/config-schema.js +34 -0
  11. package/lib/types/config-schema.js.map +1 -0
  12. package/lib/types/convert/core-loader.d.ts +32 -0
  13. package/lib/types/convert/core-loader.d.ts.map +1 -0
  14. package/lib/types/convert/core-loader.js +60 -0
  15. package/lib/types/convert/core-loader.js.map +1 -0
  16. package/lib/types/convert/host.d.ts +88 -0
  17. package/lib/types/convert/host.d.ts.map +1 -0
  18. package/lib/types/convert/host.js +479 -0
  19. package/lib/types/convert/host.js.map +1 -0
  20. package/lib/types/convert/ingest.d.ts +125 -0
  21. package/lib/types/convert/ingest.d.ts.map +1 -0
  22. package/lib/types/convert/ingest.js +228 -0
  23. package/lib/types/convert/ingest.js.map +1 -0
  24. package/lib/types/convert/settings-schema.d.ts +18 -0
  25. package/lib/types/convert/settings-schema.d.ts.map +1 -0
  26. package/lib/types/convert/settings-schema.js +26 -0
  27. package/lib/types/convert/settings-schema.js.map +1 -0
  28. package/lib/types/convert/types.d.ts +46 -0
  29. package/lib/types/convert/types.d.ts.map +1 -0
  30. package/lib/types/convert/types.js +41 -0
  31. package/lib/types/convert/types.js.map +1 -0
  32. package/lib/types/diagnosis/cards.d.ts +71 -0
  33. package/lib/types/diagnosis/cards.d.ts.map +1 -0
  34. package/lib/types/diagnosis/cards.js +482 -0
  35. package/lib/types/diagnosis/cards.js.map +1 -0
  36. package/lib/types/diagnosis/problem-classes.d.ts +51 -0
  37. package/lib/types/diagnosis/problem-classes.d.ts.map +1 -0
  38. package/lib/types/diagnosis/problem-classes.js +66 -0
  39. package/lib/types/diagnosis/problem-classes.js.map +1 -0
  40. package/lib/types/diagnosis/schema.d.ts +65 -0
  41. package/lib/types/diagnosis/schema.d.ts.map +1 -0
  42. package/lib/types/diagnosis/schema.js +208 -0
  43. package/lib/types/diagnosis/schema.js.map +1 -0
  44. package/lib/types/diagnosis/seed-source.d.ts +20 -0
  45. package/lib/types/diagnosis/seed-source.d.ts.map +1 -0
  46. package/lib/types/diagnosis/seed-source.js +96 -0
  47. package/lib/types/diagnosis/seed-source.js.map +1 -0
  48. package/lib/types/diagnosis/seed.d.ts +50 -0
  49. package/lib/types/diagnosis/seed.d.ts.map +1 -0
  50. package/lib/types/diagnosis/seed.js +242 -0
  51. package/lib/types/diagnosis/seed.js.map +1 -0
  52. package/lib/types/diagnosis/store.d.ts +81 -0
  53. package/lib/types/diagnosis/store.d.ts.map +1 -0
  54. package/lib/types/diagnosis/store.js +409 -0
  55. package/lib/types/diagnosis/store.js.map +1 -0
  56. package/lib/types/diagnosis/types.d.ts +124 -0
  57. package/lib/types/diagnosis/types.d.ts.map +1 -0
  58. package/lib/types/diagnosis/types.js +13 -0
  59. package/lib/types/diagnosis/types.js.map +1 -0
  60. package/lib/types/directory-picker.d.ts +94 -0
  61. package/lib/types/directory-picker.d.ts.map +1 -0
  62. package/lib/types/directory-picker.js +110 -0
  63. package/lib/types/directory-picker.js.map +1 -0
  64. package/lib/types/extract-model.d.ts +76 -0
  65. package/lib/types/extract-model.d.ts.map +1 -0
  66. package/lib/types/extract-model.js +193 -0
  67. package/lib/types/extract-model.js.map +1 -0
  68. package/lib/types/extract.d.ts +121 -0
  69. package/lib/types/extract.d.ts.map +1 -0
  70. package/lib/types/extract.js +549 -0
  71. package/lib/types/extract.js.map +1 -0
  72. package/lib/types/fts.d.ts +96 -0
  73. package/lib/types/fts.d.ts.map +1 -0
  74. package/lib/types/fts.js +184 -0
  75. package/lib/types/fts.js.map +1 -0
  76. package/lib/types/index.d.ts +39 -0
  77. package/lib/types/index.d.ts.map +1 -0
  78. package/lib/types/index.js +1112 -0
  79. package/lib/types/index.js.map +1 -0
  80. package/lib/types/intent/engine.d.ts +108 -0
  81. package/lib/types/intent/engine.d.ts.map +1 -0
  82. package/lib/types/intent/engine.js +501 -0
  83. package/lib/types/intent/engine.js.map +1 -0
  84. package/lib/types/intent/host.d.ts +88 -0
  85. package/lib/types/intent/host.d.ts.map +1 -0
  86. package/lib/types/intent/host.js +389 -0
  87. package/lib/types/intent/host.js.map +1 -0
  88. package/lib/types/intent/preset-tools.d.ts +37 -0
  89. package/lib/types/intent/preset-tools.d.ts.map +1 -0
  90. package/lib/types/intent/preset-tools.js +45 -0
  91. package/lib/types/intent/preset-tools.js.map +1 -0
  92. package/lib/types/intent/settings-schema.d.ts +59 -0
  93. package/lib/types/intent/settings-schema.d.ts.map +1 -0
  94. package/lib/types/intent/settings-schema.js +57 -0
  95. package/lib/types/intent/settings-schema.js.map +1 -0
  96. package/lib/types/intent/store.d.ts +75 -0
  97. package/lib/types/intent/store.d.ts.map +1 -0
  98. package/lib/types/intent/store.js +139 -0
  99. package/lib/types/intent/store.js.map +1 -0
  100. package/lib/types/intent/tools.d.ts +63 -0
  101. package/lib/types/intent/tools.d.ts.map +1 -0
  102. package/lib/types/intent/tools.js +108 -0
  103. package/lib/types/intent/tools.js.map +1 -0
  104. package/lib/types/intent/types.d.ts +189 -0
  105. package/lib/types/intent/types.d.ts.map +1 -0
  106. package/lib/types/intent/types.js +62 -0
  107. package/lib/types/intent/types.js.map +1 -0
  108. package/lib/types/knowledge-bases.d.ts +266 -0
  109. package/lib/types/knowledge-bases.d.ts.map +1 -0
  110. package/lib/types/knowledge-bases.js +1107 -0
  111. package/lib/types/knowledge-bases.js.map +1 -0
  112. package/lib/types/layout.d.ts +262 -0
  113. package/lib/types/layout.d.ts.map +1 -0
  114. package/lib/types/layout.js +312 -0
  115. package/lib/types/layout.js.map +1 -0
  116. package/lib/types/migrate.d.ts +110 -0
  117. package/lib/types/migrate.d.ts.map +1 -0
  118. package/lib/types/migrate.js +280 -0
  119. package/lib/types/migrate.js.map +1 -0
  120. package/lib/types/recall-rank.d.ts +158 -0
  121. package/lib/types/recall-rank.d.ts.map +1 -0
  122. package/lib/types/recall-rank.js +261 -0
  123. package/lib/types/recall-rank.js.map +1 -0
  124. package/lib/types/runtime.d.ts +568 -0
  125. package/lib/types/runtime.d.ts.map +1 -0
  126. package/lib/types/runtime.js +3045 -0
  127. package/lib/types/runtime.js.map +1 -0
  128. package/lib/types/settings-schema.d.ts +117 -0
  129. package/lib/types/settings-schema.d.ts.map +1 -0
  130. package/lib/types/settings-schema.js +92 -0
  131. package/lib/types/settings-schema.js.map +1 -0
  132. package/lib/types/settings-volatile.d.ts +102 -0
  133. package/lib/types/settings-volatile.d.ts.map +1 -0
  134. package/lib/types/settings-volatile.js +114 -0
  135. package/lib/types/settings-volatile.js.map +1 -0
  136. package/lib/types/types.d.ts +799 -0
  137. package/lib/types/types.d.ts.map +1 -0
  138. package/lib/types/types.js +387 -0
  139. package/lib/types/types.js.map +1 -0
  140. package/lib/types/wiki-types.d.ts +68 -0
  141. package/lib/types/wiki-types.d.ts.map +1 -0
  142. package/lib/types/wiki-types.js +322 -0
  143. package/lib/types/wiki-types.js.map +1 -0
  144. package/package.json +101 -0
  145. package/preset/tita-data-agent/agent.cordis.yml +376 -0
  146. package/preset/tita-data-agent/preset.yml +3 -0
  147. package/python/requirements.txt +8 -0
  148. package/scripts/doctor.mjs +70 -0
  149. package/scripts/e2e-pipeline.mjs +355 -0
  150. package/scripts/install-agent-preset.mjs +92 -0
  151. package/scripts/setup-embedding.sh +34 -0
  152. package/scripts/sync-agent-preset.mjs +188 -0
  153. package/src/client/AgentPresetCard.tsx +247 -0
  154. package/src/client/DirectoryPicker.tsx +357 -0
  155. package/src/client/InfoHint.tsx +65 -0
  156. package/src/client/IntentLogicTab.tsx +185 -0
  157. package/src/client/IntentTab.tsx +715 -0
  158. package/src/client/KnowledgeBaseTab.tsx +1454 -0
  159. package/src/client/KnowledgeGraphView.tsx +306 -0
  160. package/src/client/KnowledgePanel.tsx +381 -0
  161. package/src/client/KnowledgeStepRail.tsx +60 -0
  162. package/src/client/NodeSettings.tsx +392 -0
  163. package/src/client/PreviewSections.tsx +116 -0
  164. package/src/client/RecallPanel.tsx +399 -0
  165. package/src/client/TypeDefinitionDrawer.tsx +215 -0
  166. package/src/client/WikiFlowCard.tsx +226 -0
  167. package/src/client/WikiTypeEditor.tsx +332 -0
  168. package/src/client/agent-preset.ts +121 -0
  169. package/src/client/arch/AgentArchitectureGraph.tsx +219 -0
  170. package/src/client/arch/NodeLogicPanel.tsx +133 -0
  171. package/src/client/arch/ProblemDetailPanel.tsx +88 -0
  172. package/src/client/arch/model.ts +691 -0
  173. package/src/client/architecture.css +191 -0
  174. package/src/client/architecture.tsx +530 -0
  175. package/src/client/attribution/AttributionGraph.tsx +104 -0
  176. package/src/client/attribution/AttributionTab.tsx +332 -0
  177. package/src/client/attribution/CaseView.tsx +102 -0
  178. package/src/client/attribution/GraphStage.tsx +87 -0
  179. package/src/client/attribution/RunView.tsx +184 -0
  180. package/src/client/attribution/StageChrome.tsx +403 -0
  181. package/src/client/attribution/ViewSwitch.tsx +107 -0
  182. package/src/client/attribution/graph-options.ts +381 -0
  183. package/src/client/attribution/model.ts +462 -0
  184. package/src/client/config-scope.ts +119 -0
  185. package/src/client/convert/ConvertPanel.tsx +594 -0
  186. package/src/client/convert/styles.css +138 -0
  187. package/src/client/convert/styles.ts +49 -0
  188. package/src/client/format.ts +39 -0
  189. package/src/client/graph/layout.ts +181 -0
  190. package/src/client/graph.css +113 -0
  191. package/src/client/index.ts +98 -0
  192. package/src/client/problem-domains.ts +114 -0
  193. package/src/client/styles.css +940 -0
  194. package/src/client/styles.ts +11 -0
  195. package/src/client/useFitScale.ts +68 -0
  196. package/src/config-schema.ts +45 -0
  197. package/src/convert/core-loader.ts +68 -0
  198. package/src/convert/host.ts +579 -0
  199. package/src/convert/ingest.ts +367 -0
  200. package/src/convert/settings-schema.ts +27 -0
  201. package/src/convert/types.ts +65 -0
  202. package/src/diagnosis/cards.ts +498 -0
  203. package/src/diagnosis/problem-classes.ts +117 -0
  204. package/src/diagnosis/schema.ts +260 -0
  205. package/src/diagnosis/seed-source.ts +107 -0
  206. package/src/diagnosis/seed.ts +291 -0
  207. package/src/diagnosis/store.ts +432 -0
  208. package/src/diagnosis/types.ts +152 -0
  209. package/src/directory-picker.ts +164 -0
  210. package/src/extract-model.ts +227 -0
  211. package/src/extract.ts +632 -0
  212. package/src/fts.ts +203 -0
  213. package/src/index.ts +1091 -0
  214. package/src/intent/README.md +63 -0
  215. package/src/intent/engine.ts +527 -0
  216. package/src/intent/host.ts +462 -0
  217. package/src/intent/preset-tools.ts +48 -0
  218. package/src/intent/settings-schema.ts +63 -0
  219. package/src/intent/store.ts +143 -0
  220. package/src/intent/tools.ts +139 -0
  221. package/src/intent/types.ts +245 -0
  222. package/src/knowledge-bases.ts +1160 -0
  223. package/src/layout.ts +350 -0
  224. package/src/migrate.ts +262 -0
  225. package/src/python/embedding_worker.py +471 -0
  226. package/src/recall-rank.ts +299 -0
  227. package/src/runtime.ts +3069 -0
  228. package/src/settings-schema.ts +94 -0
  229. package/src/settings-volatile.ts +122 -0
  230. package/src/types.ts +1140 -0
  231. package/src/wiki-types.ts +357 -0
@@ -0,0 +1,102 @@
1
+ /**
2
+ * 0.1.7 的一条硬规矩:**设置界面只暴露 volatile 字段。**
3
+ *
4
+ * ## 现象与原因
5
+ *
6
+ * 面板上一直显示「设置服务不可用」,客户端拿到的快照状态是 `unavailable`。原因不在
7
+ * 客户端、也不在 entry 能不能被寻址 —— 我们实测过,`configEditor.configuration()`
8
+ * 里**有**这条 entry(187 条可寻址行里有它)。真正的关卡在 `SettingsForms.describe()`
9
+ * 里那一步 schema 投影:
10
+ *
11
+ * ```js
12
+ * // dsh-settings
13
+ * function volatileForm(schema) {
14
+ * if (schema.meta.volatile) return plainSchema(schema); // ① 标了 volatile → 当成叶子字段
15
+ * if (schema.type === "object") { …递归,子字段一个都投影不出来就 undefined… } // ② object → 下钻
16
+ * // ③ 其它一切(string / number / boolean / array / union…)→ undefined
17
+ * }
18
+ * ```
19
+ *
20
+ * 然后:
21
+ *
22
+ * ```js
23
+ * const form = volatileForm(schema);
24
+ * if (form === void 0) return []; // ← 一个字段都投影不出来,整条 entry 不会进 describe()
25
+ * ```
26
+ *
27
+ * 我们的字段全是普通的 `.default(...)`,既不是 object 也不是 volatile,于是全部落到
28
+ * 出口 ③,整条 entry 被丢掉,客户端就只剩下 `unavailable`。核心插件的写法都带
29
+ * `.volatile()`(`z.string().volatile()`、`z.number().default(10).volatile()`),
30
+ * 这就是那条约定。
31
+ *
32
+ * ## 为什么这里统一标,而不是逐个手写
33
+ *
34
+ * 三个设置 schema 一共 40 多个字段;逐个加 `.volatile()` 既啰嗦,又会漏 —— 而**漏一个
35
+ * 字段的后果是那个设置项在界面上直接消失**,属于沉默的失败。统一包一层让「新增字段
36
+ * 默认可见」成为默认行为,想让它不可见才需要显式说明。
37
+ *
38
+ * 嵌套对象**不**在这里递归:本项目里唯一的内嵌结构在数组里面(`categories` / `acts`),
39
+ * 而数组本来就无法被表单下钻,标成 volatile 让它按整块编辑才是可用形态。
40
+ *
41
+ * ## 标了 volatile 就必须自己应用
42
+ *
43
+ * 这是成对的两件事,只做一半就是「假的设置」。volatile 改动**不会重载插件**
44
+ * (`Entry._commitVolatile()` 只调 `updateVolatile()` 就地改引用,再发一个
45
+ * `loader/volatile-update` 事件)。所以插件必须监听那个事件,把新配置读回来并用上去 ——
46
+ * 见 `index.ts` 里 `applyVolatile()` 的说明。
47
+ *
48
+ * @module
49
+ */
50
+ import type Schemastery from '@deepseek-ai/schemastery';
51
+ import type { KnowledgeConfig } from './types.js';
52
+ /**
53
+ * 把一组字段全部标成 volatile。返回值仍是同一个对象形状,可以直接交给 `z.object()`。
54
+ *
55
+ * @param fields - 一个 schema 对象的字段表:`{ 字段名: schemastery schema }`。
56
+ * @returns 每个字段都调用过 `.volatile()` 的字段表。
57
+ */
58
+ export declare function volatileFields<T extends Record<string, Schemastery>>(fields: T): T;
59
+ /**
60
+ * volatile 字段解包。
61
+ *
62
+ * 0.1.7 的设置字段**全部标了 `.volatile()`**(理由见 `settings-volatile.ts`),而
63
+ * schemastery 对 volatile 字段解析出来的**不是值,是一个引用** —— `{ get(), set() }`。
64
+ * 核心插件也是这么用的:`dsh-agent-default-model` 读的是 `this.config.provider.get()`。
65
+ *
66
+ * 于是「配置解析出来是什么形状」在 0.1.7 变了:**schema 产出引用,解包这一层的责任
67
+ * 落在插件身上**。统一在这里解开一次,下游(迁移、runtime、路由)拿到的仍然是一份
68
+ * 普通值的 `KnowledgeConfig`;否则 `config.agentRoot` 会是一个对象,而它会一路传进
69
+ * `path.join()`。
70
+ *
71
+ * 普通值原样返回 —— 所以单元测试直接塞普通对象、或配置来自非 volatile 来源时,
72
+ * 行为都不变。
73
+ */
74
+ export declare function unwrapVolatile<T>(value: unknown): T | undefined;
75
+ /**
76
+ * 解一个**设置组**:组里的每个字段都过一次 `unwrapVolatile`。
77
+ *
78
+ * ## 为什么需要两层
79
+ *
80
+ * entry config 的形状是固定的 `{ 组名: { 字段: 引用 } }`(见 `config-schema.ts` 的
81
+ * `knowledge` / `intent` / `convert` 三组),而只解一层的结果是「组本身还是原始对象、
82
+ * 组里的字段还是引用」。
83
+ *
84
+ * 0029 实测到的故障就是这样来的:`intent` 组被原样交给 `applyIntent`,于是
85
+ * `engine.settings.predicates` 是一个 `{get, write}` 引用而不是字符串数组,
86
+ * `routingPrompt()` 里那句 `predicates.join('、')` 抛
87
+ * `this.settings.predicates.join is not a function`。抛出点在 **preset 的挂载行**上,
88
+ * 所以整个 preset 组合不出会话 —— 宿主平面没事(它在 apply 时不读谓词),一个字段
89
+ * 的类型错误把 preset 打挂。
90
+ *
91
+ * ## 为什么是两层而不是把 `unwrapVolatile` 写成递归
92
+ *
93
+ * 多出来的那一层是**已知的、唯一的一层**:组 → 字段。递归会把「数组里的对象恰好
94
+ * 有个 `get` 方法」也当成引用来解开 —— 那是猜,不是契约。
95
+ *
96
+ * @param group - schema 解析出来的一个设置组(字段可能是引用,也可能是普通值)。
97
+ * @returns 解包后的组;给 `undefined` 或非对象时返回 `{}`。
98
+ */
99
+ export declare function unwrapGroup<T>(group: unknown): Partial<T>;
100
+ /** 把一份可能带 volatile 引用的配置解成普通值。 */
101
+ export declare function unwrapKnowledge(next: Partial<KnowledgeConfig> | undefined): Partial<KnowledgeConfig>;
102
+ //# sourceMappingURL=settings-volatile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-volatile.d.ts","sourceRoot":"","sources":["../../src/settings-volatile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAEH,OAAO,KAAK,WAAW,MAAM,0BAA0B,CAAA;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAIlF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,GAAG,SAAS,CAI/D;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAMzD;AAED,kCAAkC;AAClC,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC,CAEpG"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * 0.1.7 的一条硬规矩:**设置界面只暴露 volatile 字段。**
3
+ *
4
+ * ## 现象与原因
5
+ *
6
+ * 面板上一直显示「设置服务不可用」,客户端拿到的快照状态是 `unavailable`。原因不在
7
+ * 客户端、也不在 entry 能不能被寻址 —— 我们实测过,`configEditor.configuration()`
8
+ * 里**有**这条 entry(187 条可寻址行里有它)。真正的关卡在 `SettingsForms.describe()`
9
+ * 里那一步 schema 投影:
10
+ *
11
+ * ```js
12
+ * // dsh-settings
13
+ * function volatileForm(schema) {
14
+ * if (schema.meta.volatile) return plainSchema(schema); // ① 标了 volatile → 当成叶子字段
15
+ * if (schema.type === "object") { …递归,子字段一个都投影不出来就 undefined… } // ② object → 下钻
16
+ * // ③ 其它一切(string / number / boolean / array / union…)→ undefined
17
+ * }
18
+ * ```
19
+ *
20
+ * 然后:
21
+ *
22
+ * ```js
23
+ * const form = volatileForm(schema);
24
+ * if (form === void 0) return []; // ← 一个字段都投影不出来,整条 entry 不会进 describe()
25
+ * ```
26
+ *
27
+ * 我们的字段全是普通的 `.default(...)`,既不是 object 也不是 volatile,于是全部落到
28
+ * 出口 ③,整条 entry 被丢掉,客户端就只剩下 `unavailable`。核心插件的写法都带
29
+ * `.volatile()`(`z.string().volatile()`、`z.number().default(10).volatile()`),
30
+ * 这就是那条约定。
31
+ *
32
+ * ## 为什么这里统一标,而不是逐个手写
33
+ *
34
+ * 三个设置 schema 一共 40 多个字段;逐个加 `.volatile()` 既啰嗦,又会漏 —— 而**漏一个
35
+ * 字段的后果是那个设置项在界面上直接消失**,属于沉默的失败。统一包一层让「新增字段
36
+ * 默认可见」成为默认行为,想让它不可见才需要显式说明。
37
+ *
38
+ * 嵌套对象**不**在这里递归:本项目里唯一的内嵌结构在数组里面(`categories` / `acts`),
39
+ * 而数组本来就无法被表单下钻,标成 volatile 让它按整块编辑才是可用形态。
40
+ *
41
+ * ## 标了 volatile 就必须自己应用
42
+ *
43
+ * 这是成对的两件事,只做一半就是「假的设置」。volatile 改动**不会重载插件**
44
+ * (`Entry._commitVolatile()` 只调 `updateVolatile()` 就地改引用,再发一个
45
+ * `loader/volatile-update` 事件)。所以插件必须监听那个事件,把新配置读回来并用上去 ——
46
+ * 见 `index.ts` 里 `applyVolatile()` 的说明。
47
+ *
48
+ * @module
49
+ */
50
+ /**
51
+ * 把一组字段全部标成 volatile。返回值仍是同一个对象形状,可以直接交给 `z.object()`。
52
+ *
53
+ * @param fields - 一个 schema 对象的字段表:`{ 字段名: schemastery schema }`。
54
+ * @returns 每个字段都调用过 `.volatile()` 的字段表。
55
+ */
56
+ export function volatileFields(fields) {
57
+ return Object.fromEntries(Object.entries(fields).map(([key, schema]) => [key, schema.volatile()]));
58
+ }
59
+ /**
60
+ * volatile 字段解包。
61
+ *
62
+ * 0.1.7 的设置字段**全部标了 `.volatile()`**(理由见 `settings-volatile.ts`),而
63
+ * schemastery 对 volatile 字段解析出来的**不是值,是一个引用** —— `{ get(), set() }`。
64
+ * 核心插件也是这么用的:`dsh-agent-default-model` 读的是 `this.config.provider.get()`。
65
+ *
66
+ * 于是「配置解析出来是什么形状」在 0.1.7 变了:**schema 产出引用,解包这一层的责任
67
+ * 落在插件身上**。统一在这里解开一次,下游(迁移、runtime、路由)拿到的仍然是一份
68
+ * 普通值的 `KnowledgeConfig`;否则 `config.agentRoot` 会是一个对象,而它会一路传进
69
+ * `path.join()`。
70
+ *
71
+ * 普通值原样返回 —— 所以单元测试直接塞普通对象、或配置来自非 volatile 来源时,
72
+ * 行为都不变。
73
+ */
74
+ export function unwrapVolatile(value) {
75
+ if (value === null || typeof value !== 'object')
76
+ return value;
77
+ const ref = value;
78
+ return typeof ref.get === 'function' ? ref.get() : value;
79
+ }
80
+ /**
81
+ * 解一个**设置组**:组里的每个字段都过一次 `unwrapVolatile`。
82
+ *
83
+ * ## 为什么需要两层
84
+ *
85
+ * entry config 的形状是固定的 `{ 组名: { 字段: 引用 } }`(见 `config-schema.ts` 的
86
+ * `knowledge` / `intent` / `convert` 三组),而只解一层的结果是「组本身还是原始对象、
87
+ * 组里的字段还是引用」。
88
+ *
89
+ * 0029 实测到的故障就是这样来的:`intent` 组被原样交给 `applyIntent`,于是
90
+ * `engine.settings.predicates` 是一个 `{get, write}` 引用而不是字符串数组,
91
+ * `routingPrompt()` 里那句 `predicates.join('、')` 抛
92
+ * `this.settings.predicates.join is not a function`。抛出点在 **preset 的挂载行**上,
93
+ * 所以整个 preset 组合不出会话 —— 宿主平面没事(它在 apply 时不读谓词),一个字段
94
+ * 的类型错误把 preset 打挂。
95
+ *
96
+ * ## 为什么是两层而不是把 `unwrapVolatile` 写成递归
97
+ *
98
+ * 多出来的那一层是**已知的、唯一的一层**:组 → 字段。递归会把「数组里的对象恰好
99
+ * 有个 `get` 方法」也当成引用来解开 —— 那是猜,不是契约。
100
+ *
101
+ * @param group - schema 解析出来的一个设置组(字段可能是引用,也可能是普通值)。
102
+ * @returns 解包后的组;给 `undefined` 或非对象时返回 `{}`。
103
+ */
104
+ export function unwrapGroup(group) {
105
+ const plain = unwrapVolatile(group);
106
+ if (plain === null || typeof plain !== 'object')
107
+ return {};
108
+ return Object.fromEntries(Object.entries(plain).map(([key, value]) => [key, unwrapVolatile(value)]));
109
+ }
110
+ /** 把一份可能带 volatile 引用的配置解成普通值。 */
111
+ export function unwrapKnowledge(next) {
112
+ return unwrapGroup(next);
113
+ }
114
+ //# sourceMappingURL=settings-volatile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-volatile.js","sourceRoot":"","sources":["../../src/settings-volatile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAKH;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAwC,MAAS;IAC7E,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CACnE,CAAA;AACR,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,cAAc,CAAI,KAAc;IAC9C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAsB,CAAA;IAC9E,MAAM,GAAG,GAAG,KAA0B,CAAA;IACtC,OAAO,OAAO,GAAG,CAAC,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,KAAW,CAAA;AACjE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,WAAW,CAAI,KAAc;IAC3C,MAAM,KAAK,GAAG,cAAc,CAA0B,KAAK,CAAC,CAAA;IAC5D,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAA;IAC1D,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAC5D,CAAA;AACjB,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,eAAe,CAAC,IAA0C;IACxE,OAAO,WAAW,CAAkB,IAAI,CAAC,CAAA;AAC3C,CAAC"}