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,482 @@
1
+ import { DIAGNOSIS_ENTITIES } from './schema.js';
2
+ /**
3
+ * 诊断卡片的**编解码**:markdown 卡片 ⇄ 图上的节点与边(0021 §6.3)。
4
+ *
5
+ * ## 为什么这一层必须存在
6
+ *
7
+ * 在它之前,智能归因的图只有一条来源:`seed.ts` 里的 TypeScript 字面量,被
8
+ * `DiagnosisStore.ensure()` 直接写成 `05_diagnosis/*.jsonl`。那意味着**排查思路从来没有
9
+ * 进过 wiki**:它不在 `01_source_truth` 里、不是 `02_wiki` 的卡片、编译器连
10
+ * `diagnosis/hypothesis` 这个 entity_type 都不认 —— 于是它既不会被 wikiNote 化,
11
+ * 也不会进向量索引,**召回永远召不到它**。而「遇到类似问题先召回」正是这个产品的主张。
12
+ *
13
+ * 这一层把图变成卡片的**投影**:卡片是手写的(人写、Agent 写、从 SourceRaw 编译而来),
14
+ * 图是算出来的。§4「存图、显树」讲的是同一件事 —— 存的是知识,图是它的一种读法。
15
+ *
16
+ * ## 卡片三段式与「谁由卡片定义」的边界
17
+ *
18
+ * ```
19
+ * front matter ── 信封:id / entity_type / title / summary / status / owner / source_refs
20
+ * 正文小节 ────── 人读、给向量召回(可 diff、可评审)
21
+ * 结构化块 ────── 机器读:枚举、引用、**顺序**、逐边属性
22
+ * ```
23
+ *
24
+ * 边界要说清楚,否则「为什么这张图里有东西不在卡片里」会变成一个反复出现的疑问:
25
+ *
26
+ * | 图上的东西 | 谁定义 | 为什么 |
27
+ * | --- | --- | --- |
28
+ * | symptom / hypothesis / check / failure-mode / case 节点 | **卡片** | 这五类是人写的知识(§6.4) |
29
+ * | asset 节点 | 引用反推 | 它随数据目录同步,不手写;卡片里只留 id |
30
+ * | 现象→假设 / 假设→检查 / 假设→失败模式 / 资产→假设 / 案例→现象 边 | **卡片** | 都是卡片字段的确定性投影 |
31
+ * | evidence / cause 节点,produces / supports / refutes / confirmed_as 边 | **一次排查** | 它们是一次执行的结果,不是知识;由排查自动写入(§6.4) |
32
+ *
33
+ * 最后一行不是妥协,是分层:把「上次查到什么」写进卡片,等于让一份可复用的知识
34
+ * 绑死在一次具体的执行上。
35
+ */
36
+ /** 卡片正文里那个机器可读块的围栏标记。用带名字的围栏,方便人和编辑器识别。 */
37
+ const BLOCK_FENCE = 'json diagnosis';
38
+ /** 卡片不声明状态时的默认值:它已经被人写过一遍,只是还没走评审流程。 */
39
+ export const DEFAULT_CARD_STATUS = 'reviewed';
40
+ /**
41
+ * 每种卡片:结构化块里放哪些字段,以及哪个字段是「节点的一句话说明」。
42
+ *
43
+ * 这张表是**唯一的映射声明**。校验、序列化、反序列化都读它 —— 三处各写一份字段清单,
44
+ * 迟早会出现「校验要求 A、写盘漏了 B、读回来又不认识 C」。
45
+ */
46
+ const CARD_LAYOUT = {
47
+ 'diagnosis/symptom': {
48
+ // 现象的「一句话说明」就是它的可观测口径 —— §6.4 把 observable 定成必填正因如此。
49
+ block: ['observable', 'entry_when', 'problem_class', 'problem_subclass', 'candidates'],
50
+ summaryFrom: 'observable',
51
+ },
52
+ 'diagnosis/hypothesis': {
53
+ block: ['discriminator', 'not_when', 'failure_mode', 'verified_by', 'assets', 'reuse_count', 'stale'],
54
+ summaryFrom: 'summary',
55
+ },
56
+ 'diagnosis/check': {
57
+ block: ['cost_minutes', 'automation', 'verdict_true', 'verdict_false', 'stale'],
58
+ summaryFrom: 'summary',
59
+ },
60
+ 'diagnosis/failure-mode': {
61
+ block: ['code', 'label', 'boundary'],
62
+ summaryFrom: 'summary',
63
+ },
64
+ 'diagnosis/case': {
65
+ block: ['symptom', 'path', 'duration_minutes', 'misleading', 'root_cause', 'impact', 'prevention'],
66
+ summaryFrom: 'summary',
67
+ },
68
+ };
69
+ /** 反向查表:节点 kind → 卡片 entity_type。`asset` 与执行产物没有卡片。 */
70
+ export function entityTypeOf(kind) {
71
+ return DIAGNOSIS_ENTITIES.find(spec => spec.kind === kind)?.entityType;
72
+ }
73
+ /** 卡片能定义的节点类型。其余(asset / evidence / cause / unknown)不走卡片。 */
74
+ export const CARD_NODE_KINDS = DIAGNOSIS_ENTITIES.map(spec => spec.kind);
75
+ /** 卡片能定义的边:全部是卡片字段的确定性投影。 */
76
+ export const CARD_EDGE_KINDS = [
77
+ 'may_be_caused_by', 'verified_by', 'categorized_as', 'indexed_from', 'instance_of',
78
+ ];
79
+ /** 一次排查写下的边。它们不属于任何卡片,见文件头的边界表。 */
80
+ export const RUN_EDGE_KINDS = ['produces', 'supports', 'refutes', 'confirmed_as'];
81
+ /* ─────────────────────────────────────────────── 序列化:卡片 → markdown ── */
82
+ function frontMatterValue(value) {
83
+ return typeof value === 'string' ? value : JSON.stringify(value);
84
+ }
85
+ /**
86
+ * 卡片 → markdown 文本。
87
+ *
88
+ * 结构化块放在**正文里**而不是 front matter 的 JSON 里:改一个字段就从「一个几百字符的
89
+ * 长行整体重写」变成「一行改动」,review 时才看得出改了哪条判据、哪一步顺序。
90
+ * 这正是 §6.3 把三段分开的理由。
91
+ */
92
+ export function serializeCard(card) {
93
+ const front = [
94
+ ['entity_id', card.entityId],
95
+ ['entity_type', card.entityType],
96
+ ['title', card.title],
97
+ ...(card.summary ? [['summary', card.summary]] : []),
98
+ ['status', card.status],
99
+ ...(card.owner ? [['owner', card.owner]] : []),
100
+ ['source_refs', card.sourceRefs],
101
+ ...(card.updatedAt ? [['updated_at', card.updatedAt]] : []),
102
+ ];
103
+ const body = card.sections
104
+ .filter(section => section.body.trim() !== '')
105
+ .map(section => `## ${section.heading}\n\n${section.body.trim()}`)
106
+ .join('\n\n');
107
+ const block = JSON.stringify(card.block, null, 2);
108
+ return `---\n${front.map(([key, value]) => `${key}: ${frontMatterValue(value)}`).join('\n')}\n---\n\n${body}\n\n\`\`\`${BLOCK_FENCE}\n${block}\n\`\`\`\n`;
109
+ }
110
+ /* ─────────────────────────────────────────────── 反序列化:markdown → 卡片 ── */
111
+ export function parseCard(source) {
112
+ // 复用运行时的 front matter 解析(同一个 yaml 子集),不另写一套。
113
+ const parsed = parseFrontmatter(source);
114
+ const entityType = String(parsed.frontmatter.entity_type ?? '');
115
+ if (!isEntityType(entityType))
116
+ return undefined;
117
+ const entityId = String(parsed.frontmatter.entity_id ?? '').trim();
118
+ if (!entityId)
119
+ return undefined;
120
+ const match = parsed.content.match(new RegExp('```' + BLOCK_FENCE + '\\s*\\n([\\s\\S]*?)```'));
121
+ let block = {};
122
+ if (match) {
123
+ try {
124
+ const value = JSON.parse(match[1]);
125
+ if (value && typeof value === 'object' && !Array.isArray(value))
126
+ block = value;
127
+ }
128
+ catch { /* 块坏了不静默降级成空对象:留空之后由三层校验的「格式层」报缺字段。 */ }
129
+ }
130
+ const body = match ? parsed.content.replace(match[0], '') : parsed.content;
131
+ const refs = parsed.frontmatter.source_refs;
132
+ return {
133
+ entityId,
134
+ entityType,
135
+ title: String(parsed.frontmatter.title ?? entityId),
136
+ ...(parsed.frontmatter.summary ? { summary: String(parsed.frontmatter.summary) } : {}),
137
+ status: String(parsed.frontmatter.status ?? DEFAULT_CARD_STATUS),
138
+ ...(parsed.frontmatter.owner ? { owner: String(parsed.frontmatter.owner) } : {}),
139
+ sourceRefs: Array.isArray(refs) ? refs.map(String) : [],
140
+ ...(parsed.frontmatter.updated_at ? { updatedAt: String(parsed.frontmatter.updated_at) } : {}),
141
+ sections: splitSections(body),
142
+ block,
143
+ };
144
+ }
145
+ /**
146
+ * 只解析 front matter 与正文。
147
+ *
148
+ * 与 `runtime.ts` 里的 `parseMarkdown` 是同一条规则(同一个 yaml 子集),这里保留一份
149
+ * 只读副本是为了让 `diagnosis/` 不反向依赖宿主的运行时 —— 领域模块被 runtime 依赖,
150
+ * 不能形成环。
151
+ */
152
+ function parseFrontmatter(source) {
153
+ if (!source.startsWith('---'))
154
+ return { frontmatter: {}, content: source.trim() };
155
+ const end = source.indexOf('\n---', 3);
156
+ if (end < 0)
157
+ return { frontmatter: {}, content: source.trim() };
158
+ const frontmatter = {};
159
+ for (const line of source.slice(3, end).replace(/^\n/, '').split(/\r?\n/)) {
160
+ const separator = line.indexOf(':');
161
+ if (separator <= 0)
162
+ continue;
163
+ const key = line.slice(0, separator).trim();
164
+ const text = line.slice(separator + 1).trim();
165
+ if (text === 'true')
166
+ frontmatter[key] = true;
167
+ else if (text === 'false')
168
+ frontmatter[key] = false;
169
+ else if (text === 'null')
170
+ frontmatter[key] = null;
171
+ else if (/^-?\d+(\.\d+)?$/.test(text))
172
+ frontmatter[key] = Number(text);
173
+ else if ((text.startsWith('[') && text.endsWith(']')) || (text.startsWith('{') && text.endsWith('}'))) {
174
+ try {
175
+ frontmatter[key] = JSON.parse(text);
176
+ }
177
+ catch {
178
+ frontmatter[key] = text.replace(/^['"]|['"]$/g, '');
179
+ }
180
+ }
181
+ else
182
+ frontmatter[key] = text.replace(/^['"]|['"]$/g, '');
183
+ }
184
+ return { frontmatter, content: source.slice(end + 4).trim() };
185
+ }
186
+ function splitSections(body) {
187
+ const sections = [];
188
+ let heading;
189
+ let lines = [];
190
+ const flush = () => {
191
+ if (heading !== undefined)
192
+ sections.push({ heading, body: lines.join('\n').trim() });
193
+ lines = [];
194
+ };
195
+ for (const line of body.split(/\r?\n/)) {
196
+ const match = /^##\s+(.+)$/.exec(line);
197
+ if (match) {
198
+ flush();
199
+ heading = match[1].trim();
200
+ }
201
+ else if (heading !== undefined)
202
+ lines.push(line);
203
+ }
204
+ flush();
205
+ return sections.filter(section => section.body !== '');
206
+ }
207
+ function isEntityType(value) {
208
+ return DIAGNOSIS_ENTITIES.some(spec => spec.entityType === value);
209
+ }
210
+ /* ─────────────────────────────────────────────── 图 → 卡片 ── */
211
+ /**
212
+ * 类型层与案例 → 卡片。
213
+ *
214
+ * `asset` / `evidence` / `cause` 节点**不产出卡片**:它们不是手写的知识(§6.4)。
215
+ * 被假设引用的资产会在反序列化时按 id 补一个最小节点回来。
216
+ */
217
+ export function graphToCards(graph, cases = []) {
218
+ const cards = [];
219
+ for (const node of graph.nodes) {
220
+ // 案例节点只是图上的**桩**:它的正文与有序路径住在 `cases` 里(§6.4)。图上的桩不单独成卡,
221
+ // 否则同一个 CASE-001 会有两张卡 —— 一张带路径、一张空壳,读图时看谁先被遍历到。
222
+ if (node.kind === 'case')
223
+ continue;
224
+ const entityType = entityTypeOf(node.kind);
225
+ if (!entityType)
226
+ continue;
227
+ const layout = CARD_LAYOUT[entityType];
228
+ const block = {};
229
+ if (node.kind === 'symptom') {
230
+ block.observable = node.summary ?? '';
231
+ block.entry_when = '';
232
+ block.problem_class = node.problemClass ?? null;
233
+ block.problem_subclass = node.problemSubclass ?? null;
234
+ // 现象 → 假设:**逐边属性必须落在边上**(stale_days 属于「这个现象 × 这个假设」这一对),
235
+ // 所以它跟着现象卡片走,而不是跟着假设卡片走。
236
+ block.candidates = graph.edges
237
+ .filter(edge => edge.kind === 'may_be_caused_by' && edge.source === node.id)
238
+ .map(edge => ({
239
+ id: edge.target,
240
+ ...(edge.staleDays === undefined ? {} : { stale_days: edge.staleDays }),
241
+ }));
242
+ }
243
+ else if (node.kind === 'hypothesis') {
244
+ block.discriminator = node.discriminator ?? '';
245
+ block.not_when = node.notWhen ?? '';
246
+ block.failure_mode = node.failureMode ?? null;
247
+ block.verified_by = graph.edges.filter(edge => edge.kind === 'verified_by' && edge.source === node.id).map(edge => edge.target);
248
+ block.assets = graph.edges.filter(edge => edge.kind === 'indexed_from' && edge.target === node.id).map(edge => edge.source);
249
+ block.reuse_count = node.reuseCount ?? 0;
250
+ if (node.stale !== undefined)
251
+ block.stale = node.stale;
252
+ }
253
+ else if (node.kind === 'check') {
254
+ block.cost_minutes = node.costMinutes ?? null;
255
+ block.automation = node.automation ?? null;
256
+ block.verdict_true = node.verdictTrue ?? '';
257
+ block.verdict_false = node.verdictFalse ?? '';
258
+ if (node.stale !== undefined)
259
+ block.stale = node.stale;
260
+ }
261
+ else if (node.kind === 'failure-mode') {
262
+ block.code = node.code ?? null;
263
+ block.label = node.title;
264
+ block.boundary = '';
265
+ }
266
+ cards.push({
267
+ entityId: node.id,
268
+ entityType,
269
+ title: node.title,
270
+ ...(layout.summaryFrom === 'summary' && node.summary ? { summary: node.summary } : {}),
271
+ status: DEFAULT_CARD_STATUS,
272
+ ...(node.owner ? { owner: node.owner } : {}),
273
+ sourceRefs: [],
274
+ sections: [],
275
+ block,
276
+ });
277
+ }
278
+ for (const item of cases) {
279
+ cards.push({
280
+ entityId: item.id,
281
+ entityType: 'diagnosis/case',
282
+ title: item.title,
283
+ status: DEFAULT_CARD_STATUS,
284
+ sourceRefs: [],
285
+ sections: item.sections.map(section => ({ heading: section.heading, body: section.body })),
286
+ block: {
287
+ // 案例必须从一个现象进入 —— 这条信息在图上就是 `instance_of` 边,在卡片上是这一个字段。
288
+ symptom: item.symptomId,
289
+ path: item.path,
290
+ duration_minutes: item.durationMinutes,
291
+ ...(item.misleading ? { misleading: item.misleading } : {}),
292
+ root_cause: item.rootCause,
293
+ },
294
+ });
295
+ }
296
+ return cards;
297
+ }
298
+ /**
299
+ * 卡片 → 图。
300
+ *
301
+ * 只产出「卡片定义得了」的那部分(类型层 + 引用层的资产 + 案例,以及五种卡片边);
302
+ * `evidence` / `cause` 与四条执行边由一次排查写入,不在这里合成 —— 否则一次执行的结果
303
+ * 会被伪装成可复用的知识。
304
+ */
305
+ export function cardsToGraph(cards) {
306
+ const nodes = [];
307
+ const edges = [];
308
+ const cases = [];
309
+ const problems = [];
310
+ const seen = new Set();
311
+ for (const card of cards) {
312
+ if (seen.has(card.entityId))
313
+ problems.push(`卡片 ${card.entityId} 被定义了多次 —— 同一份知识只能有一张卡片`);
314
+ seen.add(card.entityId);
315
+ }
316
+ /** 资产节点按引用反推:引用层随数据目录同步,卡片里只留 id。 */
317
+ const assetIds = new Set();
318
+ const modeIdByCode = new Map();
319
+ for (const card of cards) {
320
+ if (card.entityType === 'diagnosis/failure-mode' && typeof card.block.code === 'string') {
321
+ modeIdByCode.set(card.block.code, card.entityId);
322
+ }
323
+ if (card.entityType === 'diagnosis/hypothesis' && Array.isArray(card.block.assets)) {
324
+ for (const id of card.block.assets)
325
+ assetIds.add(String(id));
326
+ }
327
+ }
328
+ for (const card of cards) {
329
+ const spec = DIAGNOSIS_ENTITIES.find(candidate => candidate.entityType === card.entityType);
330
+ if (!spec)
331
+ continue;
332
+ const layout = CARD_LAYOUT[card.entityType];
333
+ const summary = layout.summaryFrom === 'observable' ? stringOf(card.block.observable) : card.summary;
334
+ const node = {
335
+ id: card.entityId,
336
+ kind: spec.kind,
337
+ layer: spec.layer,
338
+ title: card.title,
339
+ ...(summary ? { summary } : {}),
340
+ ...(card.owner ? { owner: card.owner } : {}),
341
+ };
342
+ if (card.entityType === 'diagnosis/symptom') {
343
+ const problemClass = stringOf(card.block.problem_class);
344
+ if (problemClass)
345
+ node.problemClass = problemClass;
346
+ const subclass = stringOf(card.block.problem_subclass);
347
+ if (subclass)
348
+ node.problemSubclass = subclass;
349
+ const candidates = Array.isArray(card.block.candidates) ? card.block.candidates : [];
350
+ candidates.forEach((entry, index) => {
351
+ const target = stringOf(entry?.id);
352
+ if (!target)
353
+ return;
354
+ const staleDays = numberOf(entry?.stale_days);
355
+ edges.push({
356
+ id: `e-${card.entityId.toLowerCase()}-${target.toLowerCase()}-${index}`,
357
+ source: card.entityId,
358
+ target,
359
+ kind: 'may_be_caused_by',
360
+ ...(staleDays === undefined ? {} : { staleDays }),
361
+ });
362
+ });
363
+ }
364
+ else if (card.entityType === 'diagnosis/hypothesis') {
365
+ const discriminator = stringOf(card.block.discriminator);
366
+ if (discriminator)
367
+ node.discriminator = discriminator;
368
+ const notWhen = stringOf(card.block.not_when);
369
+ if (notWhen)
370
+ node.notWhen = notWhen;
371
+ const failureMode = stringOf(card.block.failure_mode);
372
+ if (failureMode)
373
+ node.failureMode = failureMode;
374
+ const reuse = numberOf(card.block.reuse_count);
375
+ if (reuse !== undefined)
376
+ node.reuseCount = reuse;
377
+ if (typeof card.block.stale === 'boolean')
378
+ node.stale = card.block.stale;
379
+ for (const [index, target] of listOf(card.block.verified_by).entries()) {
380
+ edges.push({ id: `e-${card.entityId.toLowerCase()}-${String(target).toLowerCase()}-${index}`, source: card.entityId, target: String(target), kind: 'verified_by' });
381
+ }
382
+ for (const [index, asset] of listOf(card.block.assets).entries()) {
383
+ edges.push({ id: `e-${String(asset).toLowerCase()}-${card.entityId.toLowerCase()}-${index}`, source: String(asset), target: card.entityId, kind: 'indexed_from' });
384
+ }
385
+ if (failureMode) {
386
+ const modeNode = modeIdByCode.get(failureMode);
387
+ if (modeNode)
388
+ edges.push({ id: `e-${card.entityId.toLowerCase()}-${modeNode.toLowerCase()}`, source: card.entityId, target: modeNode, kind: 'categorized_as' });
389
+ else
390
+ problems.push(`${card.entityId} 的 failure_mode=${failureMode} 找不到对应的失败模式卡片 —— categorized_as 边无从建立`);
391
+ }
392
+ }
393
+ else if (card.entityType === 'diagnosis/check') {
394
+ const cost = numberOf(card.block.cost_minutes);
395
+ if (cost !== undefined)
396
+ node.costMinutes = cost;
397
+ const automation = stringOf(card.block.automation);
398
+ if (automation === 'auto' || automation === 'manual')
399
+ node.automation = automation;
400
+ const verdictTrue = stringOf(card.block.verdict_true);
401
+ if (verdictTrue)
402
+ node.verdictTrue = verdictTrue;
403
+ const verdictFalse = stringOf(card.block.verdict_false);
404
+ if (verdictFalse)
405
+ node.verdictFalse = verdictFalse;
406
+ if (typeof card.block.stale === 'boolean')
407
+ node.stale = card.block.stale;
408
+ }
409
+ else if (card.entityType === 'diagnosis/failure-mode') {
410
+ const code = stringOf(card.block.code);
411
+ if (code)
412
+ node.code = code;
413
+ }
414
+ else if (card.entityType === 'diagnosis/case') {
415
+ const symptom = stringOf(card.block.symptom);
416
+ if (!symptom)
417
+ problems.push(`${card.entityId} 没有 symptom —— 案例必须从一个现象进入`);
418
+ else {
419
+ edges.push({ id: `e-${card.entityId.toLowerCase()}-${symptom.toLowerCase()}`, source: card.entityId, target: symptom, kind: 'instance_of' });
420
+ const path = Array.isArray(card.block.path) ? card.block.path : [];
421
+ cases.push({
422
+ id: card.entityId,
423
+ title: card.title,
424
+ symptomId: symptom,
425
+ sections: card.sections.map(section => ({ heading: section.heading, body: section.body })),
426
+ path,
427
+ durationMinutes: numberOf(card.block.duration_minutes) ?? 0,
428
+ ...(card.block.misleading ? { misleading: card.block.misleading } : {}),
429
+ rootCause: stringOf(card.block.root_cause) ?? '',
430
+ });
431
+ }
432
+ }
433
+ nodes.push(node);
434
+ }
435
+ for (const id of assetIds) {
436
+ if (nodes.some(node => node.id === id))
437
+ continue;
438
+ nodes.push({ id, kind: 'asset', layer: 'reference', title: id });
439
+ }
440
+ // 引用完整性:卡片引用了不存在的卡片时,必须报出来(否则图上会出现悬空边,
441
+ // 而 `validateDiagnosis` 只在读图之后才看得到)。
442
+ const ids = new Set(nodes.map(node => node.id));
443
+ for (const edge of edges) {
444
+ if (!ids.has(edge.source))
445
+ problems.push(`边 ${edge.id} 的起点 ${edge.source} 没有对应卡片`);
446
+ if (!ids.has(edge.target))
447
+ problems.push(`边 ${edge.id} 的终点 ${edge.target} 没有对应卡片`);
448
+ }
449
+ return { graph: { nodes, edges }, cases, problems };
450
+ }
451
+ function stringOf(value) {
452
+ return typeof value === 'string' && value.trim() !== '' ? value : undefined;
453
+ }
454
+ function numberOf(value) {
455
+ return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
456
+ }
457
+ function listOf(value) {
458
+ return Array.isArray(value) ? value : [];
459
+ }
460
+ /**
461
+ * 路径片段规范化。**必须与 `KnowledgeRuntime` 里那份逐字相同** —— 差一个字符,
462
+ * 「写进去的卡片」和「编译器去读的路径」就永远对不上,而且失败方式是静默的(读不到 = 图上少几条边)。
463
+ *
464
+ * 之所以在这里重复三行而不是把它从 runtime 里 import 出来:`diagnosis/` 是领域子模块,
465
+ * 反向依赖宿主运行时会把分层倒过来。取而代之的是一条测试,拿同一批 id 比对两边的输出 ——
466
+ * 规则漂移时测试会失败,而不是靠人记得同时改两处。
467
+ */
468
+ function slugSegment(value) {
469
+ const normalized = value.trim().replace(/[^\p{L}\p{N}._-]+/gu, '-').replace(/^-+|-+$/g, '');
470
+ return normalized.slice(0, 120) || 'item';
471
+ }
472
+ /**
473
+ * 卡片在磁盘上的相对路径:`02_wiki/<entity_type>/<slug(entity_id)>.md`。
474
+ *
475
+ * `entity_type` 里的斜杠是**目录层级**(五类排查卡片因此落在 `02_wiki/diagnosis/` 下,
476
+ * 与其它 wiki 子树分开),不是要压成横杠 —— 我一开始压了,结果写进去的卡片和编译器去读的
477
+ * 路径差一层目录,而失败是静默的:读不到,就只是图上少几条边。
478
+ */
479
+ export function cardPathOf(card) {
480
+ return `02_wiki/${card.entityType}/${slugSegment(card.entityId)}.md`;
481
+ }
482
+ //# sourceMappingURL=cards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cards.js","sourceRoot":"","sources":["../../../src/diagnosis/cards.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * 问题侧的分类表(0021 §4.5)。
3
+ *
4
+ * **为什么是一张表,而不是让每个现象随手写一个字符串。** 分类的价值来自「同一批大类
5
+ * 被反复用」;一旦允许自由书写,两周后就会出现「上游未产出」「上游没产出」「上游未输出」
6
+ * 三个大类各挂一个现象 —— 那等于没分类,而且图上看不出来。所以大类只能从这张表里取。
7
+ *
8
+ * **两级就够了。** 第三层「详细问题」在图上是 symptom 节点本身(带它的资产、时间窗、
9
+ * 维度),不再是目录里的一层。理由见 §4.5:把实例塞进类型层,正是 §4.1 明令要分开的事。
10
+ *
11
+ * **子类同时是召回特征的来源。** §5.1 的 `shape` / `time_pattern` 由前端从告警载荷里
12
+ * 提取,这里把两者的对应关系**写死在数据里**:`deviation-drop-sharp` 就是「偏低 × 突降」。
13
+ * 这样「分类」与「召回权重」不可能各说各话 —— 它们读的是同一份表,而不是两份逐渐漂移的清单。
14
+ */
15
+ export type ProblemClassId = 'missing' | 'deviation' | 'inconsistency' | 'granularity';
16
+ /** 差异形态(§5.1 召回权重里的 .30 项)。 */
17
+ export type SymptomShape = 'zero' | 'low' | 'high' | 'mismatch' | 'error' | 'granularity';
18
+ /** 时间模式(§5.1 召回权重里的 .20 项)。缺席表示这条子类不携带时间语义。 */
19
+ export type SymptomTimePattern = 'drop-sharp' | 'drop-slow' | 'rise-sharp' | 'rise-slow' | 'periodic' | 'single-day';
20
+ export interface ProblemSubclassSpec {
21
+ /** 全局唯一,形如 `missing-zero`。落盘的是它,不是中文标签。 */
22
+ id: string;
23
+ label: string;
24
+ shape: SymptomShape;
25
+ timePattern?: SymptomTimePattern;
26
+ }
27
+ export interface ProblemClassSpec {
28
+ id: ProblemClassId;
29
+ label: string;
30
+ /** 「第一眼看到什么」—— 大类是按值班同学的判断顺序切的,这句话就是那个判断。 */
31
+ cue: string;
32
+ subclasses: ProblemSubclassSpec[];
33
+ }
34
+ /**
35
+ * 四个大类,按「看到异常之后的第一眼判断」排序:
36
+ * 该有的有没有 → 有的话幅度对不对 → 对不对得上 → 粒度对不对。
37
+ */
38
+ export declare const PROBLEM_CLASSES: ProblemClassSpec[];
39
+ export declare const PROBLEM_CLASS_LABEL: Record<ProblemClassId, string>;
40
+ /** 子类表项 + 它属于哪个大类 —— 有了它,界面和校验都不用再自己反查归属。 */
41
+ export interface IndexedProblemSubclass extends ProblemSubclassSpec {
42
+ classId: ProblemClassId;
43
+ }
44
+ /** 子类 id → 表项。查一次就够,落盘的 jsonl 里只写 id。 */
45
+ export declare const PROBLEM_SUBCLASS_INDEX: Record<string, IndexedProblemSubclass>;
46
+ export declare function problemClassOf(subclassId: string | undefined): ProblemClassId | undefined;
47
+ export declare function problemSubclassOf(subclassId: string | undefined): IndexedProblemSubclass | undefined;
48
+ /** 子类是否真的属于该大类 —— 校验和界面联动都用它,不再各写一遍包含判断。 */
49
+ export declare function subclassBelongsTo(subclassId: string | undefined, classId: ProblemClassId): boolean;
50
+ export declare function problemClassIds(): ProblemClassId[];
51
+ //# sourceMappingURL=problem-classes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"problem-classes.d.ts","sourceRoot":"","sources":["../../../src/diagnosis/problem-classes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,WAAW,GAAG,eAAe,GAAG,aAAa,CAAA;AAEtF,+BAA+B;AAC/B,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,aAAa,CAAA;AAEzF,+CAA+C;AAC/C,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,CAAA;AAEpH,MAAM,WAAW,mBAAmB;IAClC,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,YAAY,CAAA;IACnB,WAAW,CAAC,EAAE,kBAAkB,CAAA;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,cAAc,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,mBAAmB,EAAE,CAAA;CAClC;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,gBAAgB,EA4C7C,CAAA;AAED,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAE5B,CAAA;AAEnC,6CAA6C;AAC7C,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IAAG,OAAO,EAAE,cAAc,CAAA;CAAE;AAE/F,yCAAyC;AACzC,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAGtE,CAAA;AAEJ,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAEzF;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,sBAAsB,GAAG,SAAS,CAEpG;AAED,4CAA4C;AAC5C,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAElG;AAED,wBAAgB,eAAe,IAAI,cAAc,EAAE,CAElD"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * 四个大类,按「看到异常之后的第一眼判断」排序:
3
+ * 该有的有没有 → 有的话幅度对不对 → 对不对得上 → 粒度对不对。
4
+ */
5
+ export const PROBLEM_CLASSES = [
6
+ {
7
+ id: 'missing',
8
+ label: '缺失',
9
+ cue: '该有的没有',
10
+ subclasses: [
11
+ { id: 'missing-zero', label: '全量为 0', shape: 'zero' },
12
+ { id: 'missing-no-partition', label: '分区 / 表未产出', shape: 'zero' },
13
+ { id: 'missing-job-failed', label: '任务报错未产出', shape: 'error' },
14
+ ],
15
+ },
16
+ {
17
+ id: 'deviation',
18
+ label: '偏差',
19
+ cue: '有,但幅度不对',
20
+ subclasses: [
21
+ { id: 'deviation-drop-sharp', label: '突降', shape: 'low', timePattern: 'drop-sharp' },
22
+ { id: 'deviation-drop-slow', label: '缓降', shape: 'low', timePattern: 'drop-slow' },
23
+ { id: 'deviation-rise-sharp', label: '突增', shape: 'high', timePattern: 'rise-sharp' },
24
+ { id: 'deviation-rise-slow', label: '缓升', shape: 'high', timePattern: 'rise-slow' },
25
+ ],
26
+ },
27
+ {
28
+ id: 'inconsistency',
29
+ label: '不一致',
30
+ cue: '有,但对不上',
31
+ subclasses: [
32
+ { id: 'inconsistency-vs-source', label: '与源系统对不上', shape: 'mismatch' },
33
+ { id: 'inconsistency-cross-report', label: '跨报表勾稽不平', shape: 'mismatch' },
34
+ { id: 'inconsistency-spec-change', label: '口径变更后不一致', shape: 'mismatch', timePattern: 'periodic' },
35
+ { id: 'inconsistency-tz-boundary', label: '跨天 / 时区边界', shape: 'mismatch', timePattern: 'single-day' },
36
+ ],
37
+ },
38
+ {
39
+ id: 'granularity',
40
+ label: '粒度',
41
+ cue: '有,但切分不对',
42
+ subclasses: [
43
+ { id: 'granularity-dim-missing', label: '维度值缺失', shape: 'granularity' },
44
+ { id: 'granularity-dim-empty', label: '部分维度为空', shape: 'granularity' },
45
+ { id: 'granularity-dup-count', label: '重复计数', shape: 'granularity', timePattern: 'rise-sharp' },
46
+ { id: 'granularity-mapping-shift', label: '映射错位', shape: 'granularity' },
47
+ ],
48
+ },
49
+ ];
50
+ export const PROBLEM_CLASS_LABEL = Object.fromEntries(PROBLEM_CLASSES.map(item => [item.id, item.label]));
51
+ /** 子类 id → 表项。查一次就够,落盘的 jsonl 里只写 id。 */
52
+ export const PROBLEM_SUBCLASS_INDEX = Object.fromEntries(PROBLEM_CLASSES.flatMap(item => item.subclasses.map(subclass => [subclass.id, { ...subclass, classId: item.id }])));
53
+ export function problemClassOf(subclassId) {
54
+ return subclassId === undefined ? undefined : PROBLEM_SUBCLASS_INDEX[subclassId]?.classId;
55
+ }
56
+ export function problemSubclassOf(subclassId) {
57
+ return subclassId === undefined ? undefined : PROBLEM_SUBCLASS_INDEX[subclassId];
58
+ }
59
+ /** 子类是否真的属于该大类 —— 校验和界面联动都用它,不再各写一遍包含判断。 */
60
+ export function subclassBelongsTo(subclassId, classId) {
61
+ return problemClassOf(subclassId) === classId;
62
+ }
63
+ export function problemClassIds() {
64
+ return PROBLEM_CLASSES.map(item => item.id);
65
+ }
66
+ //# sourceMappingURL=problem-classes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"problem-classes.js","sourceRoot":"","sources":["../../../src/diagnosis/problem-classes.ts"],"names":[],"mappings":"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"}