dsh-data-domain-knowledge 0.1.0-alpha.9 → 0.1.1-alpha.2

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 (438) hide show
  1. package/README.md +118 -567
  2. package/cordis.patch.yml +5 -418
  3. package/eval/README.md +19 -8
  4. package/eval/benchmark-extraction-format.mjs +20 -0
  5. package/eval/evaluate-retrieval.mjs +17 -8
  6. package/eval/queries.example.jsonl +1 -0
  7. package/lib/client.js +4181 -3239
  8. package/lib/contract-envelope.d.ts +91 -0
  9. package/lib/contract-envelope.js +106 -0
  10. package/lib/contract-layout.d.ts +130 -0
  11. package/lib/contract-layout.js +138 -0
  12. package/lib/contract-refs.d.ts +39 -0
  13. package/lib/contract-refs.js +9 -0
  14. package/lib/contract-version.d.ts +311 -0
  15. package/lib/contract-version.js +270 -0
  16. package/lib/contract-wire.d.ts +147 -0
  17. package/lib/contract-wire.js +99 -0
  18. package/lib/contracts.d.ts +12 -0
  19. package/lib/contracts.js +12 -0
  20. package/lib/doc-page.js +2 -2
  21. package/lib/pages.js +3329 -1296
  22. package/lib/types/agent-behavior-rules.d.ts +10 -0
  23. package/lib/types/agent-behavior-rules.d.ts.map +1 -0
  24. package/lib/types/agent-behavior-rules.js +28 -0
  25. package/lib/types/agent-behavior-rules.js.map +1 -0
  26. package/lib/types/axis-registry.d.ts +37 -5
  27. package/lib/types/axis-registry.d.ts.map +1 -1
  28. package/lib/types/axis-registry.js +234 -26
  29. package/lib/types/axis-registry.js.map +1 -1
  30. package/lib/types/card-organize.d.ts +27 -12
  31. package/lib/types/card-organize.d.ts.map +1 -1
  32. package/lib/types/card-organize.js +58 -73
  33. package/lib/types/card-organize.js.map +1 -1
  34. package/lib/types/compiler/embedding-identity.d.ts +3 -0
  35. package/lib/types/compiler/embedding-identity.d.ts.map +1 -0
  36. package/lib/types/compiler/embedding-identity.js +24 -0
  37. package/lib/types/compiler/embedding-identity.js.map +1 -0
  38. package/lib/types/compiler/snapshot.d.ts +16 -0
  39. package/lib/types/compiler/snapshot.d.ts.map +1 -0
  40. package/lib/types/compiler/snapshot.js +2 -0
  41. package/lib/types/compiler/snapshot.js.map +1 -0
  42. package/lib/types/config-schema.d.ts +6 -3
  43. package/lib/types/config-schema.d.ts.map +1 -1
  44. package/lib/types/config-schema.js +6 -2
  45. package/lib/types/config-schema.js.map +1 -1
  46. package/lib/types/convert/host.d.ts +6 -5
  47. package/lib/types/convert/host.d.ts.map +1 -1
  48. package/lib/types/convert/host.js +58 -18
  49. package/lib/types/convert/host.js.map +1 -1
  50. package/lib/types/convert/ingest.d.ts +10 -1
  51. package/lib/types/convert/ingest.d.ts.map +1 -1
  52. package/lib/types/convert/ingest.js +68 -9
  53. package/lib/types/convert/ingest.js.map +1 -1
  54. package/lib/types/derive-contract.d.ts +3 -0
  55. package/lib/types/derive-contract.d.ts.map +1 -0
  56. package/lib/types/derive-contract.js +15 -0
  57. package/lib/types/derive-contract.js.map +1 -0
  58. package/lib/types/diagnosis/cards.d.ts +7 -3
  59. package/lib/types/diagnosis/cards.d.ts.map +1 -1
  60. package/lib/types/diagnosis/cards.js +13 -8
  61. package/lib/types/diagnosis/cards.js.map +1 -1
  62. package/lib/types/diagnosis/run.d.ts +4 -13
  63. package/lib/types/diagnosis/run.d.ts.map +1 -1
  64. package/lib/types/diagnosis/run.js +26 -16
  65. package/lib/types/diagnosis/run.js.map +1 -1
  66. package/lib/types/diagnosis/schema.js +2 -2
  67. package/lib/types/diagnosis/schema.js.map +1 -1
  68. package/lib/types/diagnosis/seed-source.d.ts +1 -1
  69. package/lib/types/diagnosis/seed-source.d.ts.map +1 -1
  70. package/lib/types/diagnosis/seed-source.js +5 -4
  71. package/lib/types/diagnosis/seed-source.js.map +1 -1
  72. package/lib/types/diagnosis/seed.d.ts +4 -4
  73. package/lib/types/diagnosis/seed.d.ts.map +1 -1
  74. package/lib/types/diagnosis/seed.js +6 -8
  75. package/lib/types/diagnosis/seed.js.map +1 -1
  76. package/lib/types/diagnosis/store.d.ts +24 -18
  77. package/lib/types/diagnosis/store.d.ts.map +1 -1
  78. package/lib/types/diagnosis/store.js +130 -65
  79. package/lib/types/diagnosis/store.js.map +1 -1
  80. package/lib/types/diagnosis/types.d.ts +47 -15
  81. package/lib/types/diagnosis/types.d.ts.map +1 -1
  82. package/lib/types/diagnosis/types.js.map +1 -1
  83. package/lib/types/environment/dsh-python.d.ts +77 -0
  84. package/lib/types/environment/dsh-python.d.ts.map +1 -0
  85. package/lib/types/environment/dsh-python.js +139 -0
  86. package/lib/types/environment/dsh-python.js.map +1 -0
  87. package/lib/types/environment/install.d.ts +15 -0
  88. package/lib/types/environment/install.d.ts.map +1 -0
  89. package/lib/types/environment/install.js +297 -0
  90. package/lib/types/environment/install.js.map +1 -0
  91. package/lib/types/environment/manifest.d.ts +208 -0
  92. package/lib/types/environment/manifest.d.ts.map +1 -0
  93. package/lib/types/environment/manifest.js +26 -0
  94. package/lib/types/environment/manifest.js.map +1 -0
  95. package/lib/types/environment/model-catalog.d.ts +223 -0
  96. package/lib/types/environment/model-catalog.d.ts.map +1 -0
  97. package/lib/types/environment/model-catalog.js +129 -0
  98. package/lib/types/environment/model-catalog.js.map +1 -0
  99. package/lib/types/environment/process.d.ts +10 -0
  100. package/lib/types/environment/process.d.ts.map +1 -0
  101. package/lib/types/environment/process.js +54 -0
  102. package/lib/types/environment/process.js.map +1 -0
  103. package/lib/types/environment/selection.d.ts +9 -0
  104. package/lib/types/environment/selection.d.ts.map +1 -0
  105. package/lib/types/environment/selection.js +29 -0
  106. package/lib/types/environment/selection.js.map +1 -0
  107. package/lib/types/environment/service.d.ts +64 -0
  108. package/lib/types/environment/service.d.ts.map +1 -0
  109. package/lib/types/environment/service.js +424 -0
  110. package/lib/types/environment/service.js.map +1 -0
  111. package/lib/types/environment/types.d.ts +56 -0
  112. package/lib/types/environment/types.d.ts.map +1 -0
  113. package/lib/types/environment/types.js +2 -0
  114. package/lib/types/environment/types.js.map +1 -0
  115. package/lib/types/events.d.ts +76 -0
  116. package/lib/types/events.d.ts.map +1 -0
  117. package/lib/types/events.js +52 -0
  118. package/lib/types/events.js.map +1 -0
  119. package/lib/types/extract-contract.d.ts +3 -0
  120. package/lib/types/extract-contract.d.ts.map +1 -0
  121. package/lib/types/extract-contract.js +41 -0
  122. package/lib/types/extract-contract.js.map +1 -0
  123. package/lib/types/extract-model.d.ts +5 -0
  124. package/lib/types/extract-model.d.ts.map +1 -1
  125. package/lib/types/extract-model.js.map +1 -1
  126. package/lib/types/extract-table-contract.d.ts +3 -0
  127. package/lib/types/extract-table-contract.d.ts.map +1 -0
  128. package/lib/types/extract-table-contract.js +27 -0
  129. package/lib/types/extract-table-contract.js.map +1 -0
  130. package/lib/types/extract-table.d.ts +8 -0
  131. package/lib/types/extract-table.d.ts.map +1 -0
  132. package/lib/types/extract-table.js +158 -0
  133. package/lib/types/extract-table.js.map +1 -0
  134. package/lib/types/extraction-runs.d.ts +30 -6
  135. package/lib/types/extraction-runs.d.ts.map +1 -1
  136. package/lib/types/extraction-runs.js +69 -8
  137. package/lib/types/extraction-runs.js.map +1 -1
  138. package/lib/types/fs-atomic.d.ts +0 -7
  139. package/lib/types/fs-atomic.d.ts.map +1 -1
  140. package/lib/types/fs-atomic.js +17 -2
  141. package/lib/types/fs-atomic.js.map +1 -1
  142. package/lib/types/images.d.ts +26 -0
  143. package/lib/types/images.d.ts.map +1 -0
  144. package/lib/types/images.js +196 -0
  145. package/lib/types/images.js.map +1 -0
  146. package/lib/types/index.d.ts +2 -2
  147. package/lib/types/index.d.ts.map +1 -1
  148. package/lib/types/index.js +598 -209
  149. package/lib/types/index.js.map +1 -1
  150. package/lib/types/intent/engine.d.ts +12 -4
  151. package/lib/types/intent/engine.d.ts.map +1 -1
  152. package/lib/types/intent/engine.js +43 -5
  153. package/lib/types/intent/engine.js.map +1 -1
  154. package/lib/types/intent/host.d.ts +5 -8
  155. package/lib/types/intent/host.d.ts.map +1 -1
  156. package/lib/types/intent/host.js +56 -11
  157. package/lib/types/intent/host.js.map +1 -1
  158. package/lib/types/intent/scope.d.ts +25 -0
  159. package/lib/types/intent/scope.d.ts.map +1 -0
  160. package/lib/types/intent/scope.js +116 -0
  161. package/lib/types/intent/scope.js.map +1 -0
  162. package/lib/types/intent/tools.d.ts +24 -20
  163. package/lib/types/intent/tools.d.ts.map +1 -1
  164. package/lib/types/intent/tools.js +65 -23
  165. package/lib/types/intent/tools.js.map +1 -1
  166. package/lib/types/intent/types.d.ts +11 -4
  167. package/lib/types/intent/types.d.ts.map +1 -1
  168. package/lib/types/knowledge-bases.d.ts +11 -5
  169. package/lib/types/knowledge-bases.d.ts.map +1 -1
  170. package/lib/types/knowledge-bases.js +52 -20
  171. package/lib/types/knowledge-bases.js.map +1 -1
  172. package/lib/types/knowledge-contract.d.ts +32 -0
  173. package/lib/types/knowledge-contract.d.ts.map +1 -0
  174. package/lib/types/knowledge-contract.js +116 -0
  175. package/lib/types/knowledge-contract.js.map +1 -0
  176. package/lib/types/knowledge.d.ts +31 -9
  177. package/lib/types/knowledge.d.ts.map +1 -1
  178. package/lib/types/knowledge.js +137 -60
  179. package/lib/types/knowledge.js.map +1 -1
  180. package/lib/types/layout.d.ts +10 -29
  181. package/lib/types/layout.d.ts.map +1 -1
  182. package/lib/types/layout.js +17 -36
  183. package/lib/types/layout.js.map +1 -1
  184. package/lib/types/materialize-snapshot.d.ts +49 -0
  185. package/lib/types/materialize-snapshot.d.ts.map +1 -0
  186. package/lib/types/materialize-snapshot.js +2 -0
  187. package/lib/types/materialize-snapshot.js.map +1 -0
  188. package/lib/types/migrate.d.ts +11 -0
  189. package/lib/types/migrate.d.ts.map +1 -1
  190. package/lib/types/migrate.js +83 -2
  191. package/lib/types/migrate.js.map +1 -1
  192. package/lib/types/model-text.d.ts +58 -1
  193. package/lib/types/model-text.d.ts.map +1 -1
  194. package/lib/types/model-text.js +85 -30
  195. package/lib/types/model-text.js.map +1 -1
  196. package/lib/types/oplog.d.ts.map +1 -1
  197. package/lib/types/oplog.js +7 -0
  198. package/lib/types/oplog.js.map +1 -1
  199. package/lib/types/organize-contract.d.ts +18 -0
  200. package/lib/types/organize-contract.d.ts.map +1 -0
  201. package/lib/types/organize-contract.js +82 -0
  202. package/lib/types/organize-contract.js.map +1 -0
  203. package/lib/types/pipeline/engine.d.ts +66 -0
  204. package/lib/types/pipeline/engine.d.ts.map +1 -0
  205. package/lib/types/pipeline/engine.js +352 -0
  206. package/lib/types/pipeline/engine.js.map +1 -0
  207. package/lib/types/pipeline/store.d.ts +73 -0
  208. package/lib/types/pipeline/store.d.ts.map +1 -0
  209. package/lib/types/pipeline/store.js +143 -0
  210. package/lib/types/pipeline/store.js.map +1 -0
  211. package/lib/types/pipeline/types.d.ts +102 -0
  212. package/lib/types/pipeline/types.d.ts.map +1 -0
  213. package/lib/types/pipeline/types.js +5 -0
  214. package/lib/types/pipeline/types.js.map +1 -0
  215. package/lib/types/present.d.ts +2 -0
  216. package/lib/types/present.d.ts.map +1 -1
  217. package/lib/types/present.js +9 -4
  218. package/lib/types/present.js.map +1 -1
  219. package/lib/types/preset-ids.d.ts +4 -0
  220. package/lib/types/preset-ids.d.ts.map +1 -0
  221. package/lib/types/preset-ids.js +6 -0
  222. package/lib/types/preset-ids.js.map +1 -0
  223. package/lib/types/query-analysis.d.ts +13 -1
  224. package/lib/types/query-analysis.d.ts.map +1 -1
  225. package/lib/types/query-analysis.js +62 -6
  226. package/lib/types/query-analysis.js.map +1 -1
  227. package/lib/types/recall-rank.d.ts +3 -3
  228. package/lib/types/recall-rank.d.ts.map +1 -1
  229. package/lib/types/recall-rank.js +4 -4
  230. package/lib/types/recall-rank.js.map +1 -1
  231. package/lib/types/retention.d.ts +39 -0
  232. package/lib/types/retention.d.ts.map +1 -0
  233. package/lib/types/retention.js +42 -0
  234. package/lib/types/retention.js.map +1 -0
  235. package/lib/types/retrieval/vector-index.d.ts +32 -0
  236. package/lib/types/retrieval/vector-index.d.ts.map +1 -0
  237. package/lib/types/retrieval/vector-index.js +15 -0
  238. package/lib/types/retrieval/vector-index.js.map +1 -0
  239. package/lib/types/retrieval/visibility.d.ts +6 -0
  240. package/lib/types/retrieval/visibility.d.ts.map +1 -0
  241. package/lib/types/retrieval/visibility.js +11 -0
  242. package/lib/types/retrieval/visibility.js.map +1 -0
  243. package/lib/types/runtime.d.ts +272 -27
  244. package/lib/types/runtime.d.ts.map +1 -1
  245. package/lib/types/runtime.js +2751 -537
  246. package/lib/types/runtime.js.map +1 -1
  247. package/lib/types/settings-schema.d.ts +17 -15
  248. package/lib/types/settings-schema.d.ts.map +1 -1
  249. package/lib/types/settings-schema.js +50 -47
  250. package/lib/types/settings-schema.js.map +1 -1
  251. package/lib/types/settings-volatile.d.ts +4 -4
  252. package/lib/types/settings-volatile.js +4 -4
  253. package/lib/types/source-evidence.d.ts +14 -0
  254. package/lib/types/source-evidence.d.ts.map +1 -0
  255. package/lib/types/source-evidence.js +36 -0
  256. package/lib/types/source-evidence.js.map +1 -0
  257. package/lib/types/store/axis-references.d.ts +5 -0
  258. package/lib/types/store/axis-references.d.ts.map +1 -0
  259. package/lib/types/store/axis-references.js +106 -0
  260. package/lib/types/store/axis-references.js.map +1 -0
  261. package/lib/types/store/derived.d.ts +12 -1
  262. package/lib/types/store/derived.d.ts.map +1 -1
  263. package/lib/types/store/derived.js +71 -12
  264. package/lib/types/store/derived.js.map +1 -1
  265. package/lib/types/store/knowledge-db.d.ts +31 -1
  266. package/lib/types/store/knowledge-db.d.ts.map +1 -1
  267. package/lib/types/store/knowledge-db.js +252 -18
  268. package/lib/types/store/knowledge-db.js.map +1 -1
  269. package/lib/types/store/migrate.d.ts.map +1 -1
  270. package/lib/types/store/migrate.js +17 -6
  271. package/lib/types/store/migrate.js.map +1 -1
  272. package/lib/types/trajectory-types.d.ts +172 -0
  273. package/lib/types/trajectory-types.d.ts.map +1 -0
  274. package/lib/types/trajectory-types.js +36 -0
  275. package/lib/types/trajectory-types.js.map +1 -0
  276. package/lib/types/types.d.ts +59 -27
  277. package/lib/types/types.d.ts.map +1 -1
  278. package/lib/types/types.js +6 -15
  279. package/lib/types/types.js.map +1 -1
  280. package/lib/types/wiki-finalize.d.ts +16 -0
  281. package/lib/types/wiki-finalize.d.ts.map +1 -1
  282. package/lib/types/wiki-finalize.js +26 -0
  283. package/lib/types/wiki-finalize.js.map +1 -1
  284. package/lib/types/wiki-materialize.d.ts +4 -0
  285. package/lib/types/wiki-materialize.d.ts.map +1 -1
  286. package/lib/types/wiki-materialize.js +21 -7
  287. package/lib/types/wiki-materialize.js.map +1 -1
  288. package/lib/types/wiki-trial-types.d.ts +87 -0
  289. package/lib/types/wiki-trial-types.d.ts.map +1 -1
  290. package/lib/types/wiki-trial-types.js +0 -16
  291. package/lib/types/wiki-trial-types.js.map +1 -1
  292. package/lib/types/wiki-trial.d.ts +40 -16
  293. package/lib/types/wiki-trial.d.ts.map +1 -1
  294. package/lib/types/wiki-trial.js +337 -224
  295. package/lib/types/wiki-trial.js.map +1 -1
  296. package/package.json +29 -20
  297. package/python/prepare-models.py +19 -0
  298. package/python/requirements.txt +8 -6
  299. package/scripts/doctor.mjs +13 -19
  300. package/scripts/environment.mjs +29 -0
  301. package/scripts/setup-embedding.sh +15 -5
  302. package/src/agent-behavior-rules.ts +37 -0
  303. package/src/axis-registry.ts +234 -27
  304. package/src/card-organize.ts +69 -75
  305. package/src/client/AgentBehaviorRulesCard.tsx +65 -0
  306. package/src/client/AttributionEventGuide.tsx +41 -39
  307. package/src/client/AxisRegistrySection.tsx +204 -164
  308. package/src/client/CompileDialogs.tsx +44 -29
  309. package/src/client/DeleteDocumentDialog.tsx +36 -5
  310. package/src/client/DirectoryPicker.tsx +0 -10
  311. package/src/client/EnvironmentSetup.tsx +243 -0
  312. package/src/client/ExpansionGraph.tsx +13 -7
  313. package/src/client/ExtractionTasksPage.tsx +578 -0
  314. package/src/client/GuideArchitectureCanvas.tsx +470 -0
  315. package/src/client/ImportFilesDialog.tsx +2 -13
  316. package/src/client/IntentLogic.tsx +2 -2
  317. package/src/client/IntentTab.tsx +118 -47
  318. package/src/client/KnowledgeBaseTab.tsx +277 -197
  319. package/src/client/KnowledgeLayerSection.tsx +24 -6
  320. package/src/client/KnowledgePanel.tsx +58 -93
  321. package/src/client/KnowledgeSettingsDrawer.tsx +90 -0
  322. package/src/client/ListPager.tsx +15 -5
  323. package/src/client/MaterializeTrajectoryView.tsx +124 -0
  324. package/src/client/NodeSettings.tsx +210 -89
  325. package/src/client/NormalizeTrajectoryView.tsx +136 -0
  326. package/src/client/PipelineNotice.tsx +26 -0
  327. package/src/client/PreviewSections.tsx +118 -51
  328. package/src/client/RecallPanel.tsx +89 -85
  329. package/src/client/TabGuide.tsx +159 -184
  330. package/src/client/TrialReportView.tsx +391 -214
  331. package/src/client/TypeDefinitionDrawer.tsx +150 -23
  332. package/src/client/WikiCardPreview.tsx +62 -16
  333. package/src/client/WikiFlowPanel.tsx +4 -4
  334. package/src/client/arch/NodeLogicPanel.tsx +3 -4
  335. package/src/client/arch/model.ts +6 -9
  336. package/src/client/architecture.tsx +23 -33
  337. package/src/client/attribution/AttributionGraph.tsx +10 -6
  338. package/src/client/attribution/AttributionTab.tsx +136 -84
  339. package/src/client/attribution/CaseView.tsx +3 -1
  340. package/src/client/attribution/EventView.tsx +108 -0
  341. package/src/client/attribution/RunView.tsx +2 -2
  342. package/src/client/attribution/StageChrome.tsx +34 -3
  343. package/src/client/attribution/ViewSwitch.tsx +20 -5
  344. package/src/client/attribution/graph-options.ts +47 -39
  345. package/src/client/attribution/model.ts +17 -10
  346. package/src/client/config-scope.ts +3 -3
  347. package/src/client/graph/palette.ts +165 -0
  348. package/src/client/index.ts +49 -42
  349. package/src/client/pages.css +459 -135
  350. package/src/client/pages.tsx +37 -9
  351. package/src/client/problem-domains.ts +1 -1
  352. package/src/client/session-remote.ts +9 -0
  353. package/src/client/styles.css +205 -62
  354. package/src/client/wiki-trial.ts +44 -3
  355. package/src/compiler/embedding-identity.ts +21 -0
  356. package/src/compiler/snapshot.ts +17 -0
  357. package/src/config-schema.ts +8 -3
  358. package/src/convert/host.ts +56 -21
  359. package/src/convert/ingest.ts +74 -10
  360. package/src/derive-contract.ts +14 -0
  361. package/src/diagnosis/cards.ts +13 -8
  362. package/src/diagnosis/run.ts +27 -17
  363. package/src/diagnosis/schema.ts +2 -2
  364. package/src/diagnosis/seed-source.ts +5 -4
  365. package/src/diagnosis/seed.ts +6 -8
  366. package/src/diagnosis/store.ts +138 -69
  367. package/src/diagnosis/types.ts +34 -15
  368. package/src/environment/dsh-python.ts +156 -0
  369. package/src/environment/install.ts +244 -0
  370. package/src/environment/manifest.ts +28 -0
  371. package/src/environment/model-catalog.ts +147 -0
  372. package/src/environment/process.ts +54 -0
  373. package/src/environment/selection.ts +29 -0
  374. package/src/environment/service.ts +348 -0
  375. package/src/environment/types.ts +45 -0
  376. package/src/events.ts +108 -0
  377. package/src/extract-contract.ts +42 -0
  378. package/src/extract-model.ts +10 -1
  379. package/src/extract-table-contract.ts +26 -0
  380. package/src/extract-table.ts +132 -0
  381. package/src/extraction-runs.ts +70 -11
  382. package/src/fs-atomic.ts +19 -2
  383. package/src/images.ts +203 -0
  384. package/src/index.ts +553 -205
  385. package/src/intent/README.md +8 -6
  386. package/src/intent/engine.ts +44 -6
  387. package/src/intent/host.ts +59 -18
  388. package/src/intent/scope.ts +125 -0
  389. package/src/intent/tools.ts +70 -28
  390. package/src/intent/types.ts +11 -4
  391. package/src/knowledge-bases.ts +56 -20
  392. package/src/knowledge-contract.ts +114 -0
  393. package/src/knowledge.ts +138 -69
  394. package/src/layout.ts +17 -37
  395. package/src/materialize-snapshot.ts +46 -0
  396. package/src/migrate.ts +75 -2
  397. package/src/model-text.ts +109 -4
  398. package/src/oplog.ts +7 -0
  399. package/src/organize-contract.ts +83 -0
  400. package/src/pipeline/engine.ts +323 -0
  401. package/src/pipeline/store.ts +147 -0
  402. package/src/pipeline/types.ts +93 -0
  403. package/src/present.ts +10 -4
  404. package/src/preset-ids.ts +6 -0
  405. package/src/python/embedding_worker.py +66 -2
  406. package/src/query-analysis.ts +68 -8
  407. package/src/recall-rank.ts +5 -5
  408. package/src/retention.ts +76 -0
  409. package/src/retrieval/vector-index.ts +45 -0
  410. package/src/retrieval/visibility.ts +14 -0
  411. package/src/runtime.ts +2708 -567
  412. package/src/settings-schema.ts +11 -8
  413. package/src/settings-volatile.ts +4 -4
  414. package/src/source-evidence.ts +37 -0
  415. package/src/store/axis-references.ts +96 -0
  416. package/src/store/derived.ts +70 -12
  417. package/src/store/knowledge-db.ts +248 -17
  418. package/src/store/migrate.ts +16 -6
  419. package/src/trajectory-types.ts +142 -0
  420. package/src/types.ts +61 -35
  421. package/src/wiki-finalize.ts +28 -0
  422. package/src/wiki-materialize.ts +25 -6
  423. package/src/wiki-trial-types.ts +83 -1
  424. package/src/wiki-trial.ts +357 -185
  425. package/lib/types/intent/preset-tools.d.ts +0 -37
  426. package/lib/types/intent/preset-tools.d.ts.map +0 -1
  427. package/lib/types/intent/preset-tools.js +0 -45
  428. package/lib/types/intent/preset-tools.js.map +0 -1
  429. package/preset/tita-data-agent/agent.cordis.yml +0 -394
  430. package/preset/tita-data-agent/preset.yml +0 -3
  431. package/scripts/install-agent-preset.mjs +0 -92
  432. package/scripts/sync-agent-preset.mjs +0 -188
  433. package/src/client/AgentPresetCard.tsx +0 -247
  434. package/src/client/agent-preset.ts +0 -121
  435. package/src/client/convert/ConvertPanel.tsx +0 -583
  436. package/src/client/convert/styles.css +0 -138
  437. package/src/client/convert/styles.ts +0 -49
  438. package/src/intent/preset-tools.ts +0 -48
@@ -1,33 +1,139 @@
1
- /**
2
- * 知识库定义抽屉。
3
- *
4
- * 这里不再保留不参与运行时行为的来源标签入口,只保留真正参与坐标抽取的库级定义。
5
- */
6
-
7
- import { useEffect, useState, type ChangeEvent, type ReactNode } from 'react'
1
+ import { useEffect, useMemo, useRef, useState, type ChangeEvent, type ReactNode } from 'react'
8
2
  import { Check } from '@tita-agent/ui/icons'
9
- import { Button, Field, Textarea } from '@tita-agent/ui/components'
3
+ import { Button, Field, SelectMenu, Textarea, type SelectMenuOption } from '@tita-agent/ui/components'
10
4
  import {
11
5
  Drawer, DrawerBody, DrawerContent, DrawerHeader, DrawerTitle,
12
6
  } from '@tita-agent/ui/overlays'
13
7
  import { styles } from './styles.ts'
14
8
  import { AxisRegistrySection } from './AxisRegistrySection.tsx'
9
+ import { requestJson } from './request.ts'
10
+
11
+ export interface CompileModelSelectionView {
12
+ mode: 'default' | 'fixed'
13
+ provider?: string
14
+ model?: string
15
+ reasoningEffort?: string
16
+ }
17
+
18
+ interface CompileModelCatalogItem {
19
+ provider: string
20
+ id: string
21
+ name: string
22
+ description?: string
23
+ available: boolean
24
+ current?: boolean
25
+ reasoning?: { efforts: Array<{ id: string; name: string; description?: string }>; defaultEffort?: string }
26
+ }
27
+
28
+ interface CompileModelCatalog {
29
+ selection: CompileModelSelectionView
30
+ default: { provider?: string; model?: string; reasoningEffort?: string; available: boolean }
31
+ models: CompileModelCatalogItem[]
32
+ why?: string
33
+ }
34
+
35
+ const DEFAULT_MODEL_VALUE = '__dsh_default__'
36
+ const fixedModelValue = (provider: string, model: string): string => `fixed:${encodeURIComponent(provider)}:${encodeURIComponent(model)}`
15
37
 
16
38
  export interface TypeDefinitionDrawerProps {
17
39
  open: boolean
18
40
  onOpenChange: (open: boolean) => void
19
41
  kbId: string
20
42
  busy: string | null
21
- /** 坐标提取备注:逐字进入抽取提示词。 */
22
43
  extractionNote?: string
23
44
  onSaveExtractionNote?: (note: string) => Promise<void>
45
+ compileModel?: CompileModelSelectionView
46
+ onSaveCompileModel?: (selection: CompileModelSelectionView) => Promise<void>
24
47
  }
25
48
 
26
49
  export function TypeDefinitionDrawer({
27
50
  open, onOpenChange, kbId, busy, extractionNote = '', onSaveExtractionNote,
51
+ compileModel = { mode: 'default' }, onSaveCompileModel,
28
52
  }: TypeDefinitionDrawerProps): ReactNode {
29
53
  const [noteDraft, setNoteDraft] = useState(extractionNote)
54
+ const [modelDraft, setModelDraft] = useState(DEFAULT_MODEL_VALUE)
55
+ const [effortDraft, setEffortDraft] = useState(compileModel.reasoningEffort ?? '__default__')
56
+ useEffect(() => { setEffortDraft(compileModel.reasoningEffort ?? '__default__') }, [compileModel.reasoningEffort])
57
+ const [catalog, setCatalog] = useState<CompileModelCatalog | null>(null)
58
+ const [catalogError, setCatalogError] = useState('')
59
+ /**
60
+ * 上一次读回来的默认模型。
61
+ *
62
+ * 放进 ref 而不是当成 effect 的依赖:这份 effect **自己会写 `catalog`**,把
63
+ * `catalog?.default.provider` 列进依赖就是让输出当输入 —— 每读一次目录都会再触发
64
+ * 一次自己,打开抽屉要打两三次 `/knowledge/models`。ref 让它读到最新值,但不触发。
65
+ */
66
+ const catalogRef = useRef<CompileModelCatalog | null>(null)
67
+ catalogRef.current = catalog
30
68
  useEffect(() => { setNoteDraft(extractionNote) }, [extractionNote])
69
+ useEffect(() => {
70
+ if (compileModel.mode === 'fixed' && compileModel.provider && compileModel.model) {
71
+ setModelDraft(fixedModelValue(compileModel.provider, compileModel.model))
72
+ } else {
73
+ setModelDraft(DEFAULT_MODEL_VALUE)
74
+ }
75
+ }, [compileModel.mode, compileModel.provider, compileModel.model])
76
+ useEffect(() => {
77
+ if (!open || onSaveCompileModel === undefined) return undefined
78
+ let cancelled = false
79
+ setCatalogError('')
80
+ const route = modelDraft.startsWith('fixed:') ? modelDraft.split(':').slice(1).map(decodeURIComponent) : [catalogRef.current?.default.provider, catalogRef.current?.default.model]
81
+ const params = new URLSearchParams({ kb: kbId })
82
+ if (route[0] && route[1]) { params.set('provider', route[0]); params.set('model', route[1]) }
83
+ void requestJson<CompileModelCatalog>(`/knowledge/models?${params}`).then(result => {
84
+ if (!cancelled) setCatalog(result.data ?? null)
85
+ }).catch(error => {
86
+ if (!cancelled) setCatalogError(error instanceof Error ? error.message : String(error))
87
+ })
88
+ return () => { cancelled = true }
89
+ }, [kbId, onSaveCompileModel, open, modelDraft])
90
+
91
+ const modelOptions = useMemo(() => {
92
+ const options: SelectMenuOption[] = [{
93
+ value: DEFAULT_MODEL_VALUE,
94
+ label: catalog?.default?.provider && catalog.default.model
95
+ ? `跟随 DSH 默认模型(${catalog.default.provider} / ${catalog.default.model})`
96
+ : '跟随 DSH 默认模型',
97
+ }]
98
+ for (const item of catalog?.models ?? []) {
99
+ options.push({
100
+ value: fixedModelValue(item.provider, item.id),
101
+ label: item.available
102
+ ? `${item.name}(${item.provider} / ${item.id})`
103
+ : `当前已失效:${item.provider} / ${item.id}`,
104
+ ...(item.available ? {} : { disabled: true }),
105
+ })
106
+ }
107
+ if (compileModel.mode === 'fixed' && compileModel.provider && compileModel.model
108
+ && !options.some(option => option.value === fixedModelValue(compileModel.provider!, compileModel.model!))) {
109
+ options.push({
110
+ value: fixedModelValue(compileModel.provider, compileModel.model),
111
+ label: `当前已失效:${compileModel.provider} / ${compileModel.model}`,
112
+ disabled: true,
113
+ })
114
+ }
115
+ return options
116
+ }, [catalog, compileModel.mode, compileModel.model, compileModel.provider])
117
+
118
+ const modelChanged = effortDraft !== (compileModel.reasoningEffort ?? '__default__') || modelDraft !== (compileModel.mode === 'fixed' && compileModel.provider && compileModel.model
119
+ ? fixedModelValue(compileModel.provider, compileModel.model)
120
+ : DEFAULT_MODEL_VALUE)
121
+ const saveCompileModel = async (): Promise<void> => {
122
+ if (onSaveCompileModel === undefined) return
123
+ if (modelDraft === DEFAULT_MODEL_VALUE) {
124
+ await onSaveCompileModel({ mode: 'default', ...(effortDraft === '__default__' ? {} : { reasoningEffort: effortDraft }) })
125
+ return
126
+ }
127
+ const selected = catalog?.models.find(item => fixedModelValue(item.provider, item.id) === modelDraft && item.available)
128
+ if (!selected) return
129
+ await onSaveCompileModel({ mode: 'fixed', provider: selected.provider, model: selected.id, ...(effortDraft === '__default__' ? {} : { reasoningEffort: effortDraft }) })
130
+ }
131
+
132
+ const selectedModel = catalog?.models.find(item => modelDraft === DEFAULT_MODEL_VALUE
133
+ ? item.provider === catalog.default.provider && item.id === catalog.default.model
134
+ : fixedModelValue(item.provider, item.id) === modelDraft)
135
+ const effortOptions: SelectMenuOption[] = [{ value: '__default__', label: '跟随模型默认强度' }, ...(selectedModel?.reasoning?.efforts ?? []).map(item => ({ value: item.id, label: item.name }))]
136
+ if (effortDraft !== '__default__' && !effortOptions.some(option => option.value === effortDraft)) effortOptions.push({ value: effortDraft, label: `当前不可用:${effortDraft}`, disabled: true })
31
137
 
32
138
  return <Drawer open={open} onOpenChange={onOpenChange}>
33
139
  {open && <DrawerContent
@@ -36,28 +142,49 @@ export function TypeDefinitionDrawer({
36
142
  resizeKey="tita-typedef-drawer"
37
143
  >
38
144
  <DrawerHeader>
39
- <DrawerTitle>知识库定义</DrawerTitle>
145
+ <DrawerTitle>编译设置</DrawerTitle>
40
146
  </DrawerHeader>
41
147
  <DrawerBody>
42
148
  <div className={styles.settingsStack}>
149
+ {onSaveCompileModel !== undefined && <section className={styles.settingsSection}>
150
+ <div className={styles.settingsSectionHeader}>
151
+ <div><h3>编译模型</h3></div>
152
+ </div>
153
+ <Field as="div" label="模型" hint="用于抽取、归一补判与卡片组织;任务启动时保存实际选择。">
154
+ <SelectMenu value={modelDraft} disabled={busy !== null || (catalog === null && catalogError === '')} onValueChange={value => { setModelDraft(value); setEffortDraft('__default__') }}
155
+ options={modelOptions} placeholder="加载 DSH 模型目录…" aria-label="编译模型" />
156
+ </Field>
157
+ <Field as="div" label="思考强度" hint={selectedModel?.reasoning?.efforts.length ? '档位来自当前模型的 DSH 目录。' : '当前模型未提供可选档位,使用模型默认值。'}>
158
+ <SelectMenu value={effortDraft} options={effortOptions} onValueChange={setEffortDraft} disabled={busy !== null || !selectedModel?.reasoning?.efforts.length} aria-label="编译模型思考强度" />
159
+ </Field>
160
+ {catalog?.default && !catalog.default.available && <p className={styles.kbHint} role="status">
161
+ DSH 默认模型不可用;可在 DSH 设置中修复,或选择固定模型。
162
+ </p>}
163
+ {catalogError !== '' && <p className={styles.kbHint} role="alert">模型目录读取失败:{catalogError}</p>}
164
+ {catalog?.why && <p className={styles.kbHint} role="status">模型目录提示:{catalog.why}</p>}
165
+ {modelChanged && <div className={styles.settingsSectionActions}>
166
+ <Button variant="outline" size="sm" disabled={busy !== null || (catalog === null && modelDraft !== DEFAULT_MODEL_VALUE)}
167
+ onClick={() => void saveCompileModel()}>
168
+ <Check size={12} />保存
169
+ </Button>
170
+ </div>}
171
+ </section>}
172
+
43
173
  {onSaveExtractionNote !== undefined && <section className={styles.settingsSection}>
44
174
  <div className={styles.settingsSectionHeader}>
45
- <div><h3>坐标提取备注</h3></div>
46
- <span className={styles.kbCount}>{extractionNote.trim() === '' ? '没有备注' : `${extractionNote.length} 字`}</span>
175
+ <div><h3>提取备注</h3></div>
47
176
  </div>
48
- <p className={styles.kbHint}>
49
- 这段话<b>逐字进每一次抽取的提示词</b>,用来交代这个库的坐标怎么定。
50
- <b>抽取规则本身不可编辑</b>:这条备注只补充这个库自己的判断约定。
51
- </p>
52
- <Field label="备注">
53
- <Textarea value={noteDraft} spellCheck={false} disabled={busy !== null}
54
- placeholder={'本库约定:spm 的 a / b / c / d 是四个独立对象,别并成一个。\n「楼层」在不同页面分期下是不同对象,认的时候看作用域。'}
177
+ <Field label="坐标约定" hint="逐字加入每次抽取提示词。">
178
+ <Textarea value={noteDraft} rows={3} spellCheck={false} disabled={busy !== null}
179
+ aria-label="坐标提取备注" placeholder="填写本库特有的坐标约定。"
55
180
  onChange={(event: ChangeEvent<HTMLTextAreaElement>) => setNoteDraft(event.target.value)} />
56
181
  </Field>
57
- <Button variant="outline" size="sm" disabled={busy !== null || noteDraft === extractionNote}
58
- onClick={() => void onSaveExtractionNote(noteDraft)}>
59
- <Check size={12} />保存备注
60
- </Button>
182
+ {noteDraft !== extractionNote && <div className={styles.settingsSectionActions}>
183
+ <Button variant="outline" size="sm" disabled={busy !== null}
184
+ onClick={() => void onSaveExtractionNote(noteDraft)}>
185
+ <Check size={12} />保存
186
+ </Button>
187
+ </div>}
61
188
  </section>}
62
189
 
63
190
  <AxisRegistrySection kbId={kbId} canEdit={busy === null} />
@@ -20,8 +20,9 @@
20
20
  */
21
21
 
22
22
  import { useEffect, useMemo, useState, type ReactNode } from 'react'
23
- import { AlertCircle, Check, RefreshCw } from '@tita-agent/ui/icons'
24
- import { Button, cn } from '@tita-agent/ui/components'
23
+ import { AlertCircle, Check, CircleDot, GitCompare, RefreshCw } from '@tita-agent/ui/icons'
24
+ import { Badge, Button, cn } from '@tita-agent/ui/components'
25
+ import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@tita-agent/ui/overlays'
25
26
  import type { AssetRef } from './asset-images.ts'
26
27
  import type { VersionManagerEntry } from '@tita-agent/ui/versions'
27
28
  import { PreviewContent, PreviewMeta, PreviewRelated, PreviewVersions, VersionContentDiff, splitSections, type KnowledgeLine, type VersionContentDiffData } from './PreviewSections.tsx'
@@ -33,13 +34,10 @@ import { STATUS_VIEW } from './WikiCardRow.tsx'
33
34
  import { styles } from './styles.ts'
34
35
  import { formatDateTime } from './format.ts'
35
36
  import type { CardRelatedView, KnowledgeCardView, WikiCardVersionView } from './KnowledgeBaseTab.tsx'
37
+ import type { AttributionEvent } from './attribution/model.ts'
36
38
 
37
- /**
38
- * 正文档里那一节「相关」的小节名。与 `wiki-finalize.ts` 的 `RELATED_HEADING` 同值 ——
39
- * 客户端不能 import 服务端模块(那边拉 node: 内置),所以这里重列一次,并由一条测试
40
- * 钉住两边相等(同 `SOURCE_FORMAT_LABEL` 那类「契约重列」的处置)。
41
- */
42
- const RELATED_SECTION = ['相关']
39
+ /** 正文里的生成式导航小节名;它们由结构化引用展示,不重复留在正文。 */
40
+ const RELATED_SECTION = ['相关', '关联 Event', '关联 Events', '关联事件']
43
41
 
44
42
  /** 一张卡片的完整预览数据(正文 + 版本 + 图片 + 相关 + 坐标名字)。 */
45
43
  export interface CardPreviewDetail {
@@ -81,15 +79,17 @@ export interface WikiCardPreviewProps {
81
79
  kbId: string
82
80
  detail: CardPreviewDetail
83
81
  versionEntries: VersionManagerEntry[]
84
- /** 当前版本的 id:只有它可回滚(回滚到当前版本是无操作)。 */
82
+ /** 当前版本的 id:用于在只读时间线上标记当前版本。 */
85
83
  currentVersionId?: string
86
84
  loading: boolean
87
85
  /** 卡片状态被 review / 备注改过之后,让宿主重新读这张卡片与列表。 */
88
86
  onChanged: () => void | Promise<void>
89
- onRestore: (entry: VersionManagerEntry) => void
90
87
  onCompare?: (entry: VersionManagerEntry) => void
91
88
  versionDiff?: { data?: VersionContentDiffData; loading: boolean; error?: string }
92
89
  onOpenRelated: (link: { entityType: string; entityId: string; title: string }) => void
90
+ /** 打开 Event 栏并定位到这张卡片引用的事件。 */
91
+ onOpenEvent: (eventId: string) => void
92
+ events?: AttributionEvent[]
93
93
  /**
94
94
  * SourceRaw 的 docId → 文档标题。
95
95
  *
@@ -113,16 +113,36 @@ function sourceRefsText(refs: string[], titles?: Map<string, string>): string {
113
113
 
114
114
  export function WikiCardPreview({
115
115
  kbId, detail, versionEntries, currentVersionId, loading,
116
- onChanged, onRestore, onOpenRelated, sourceTitles,
116
+ onChanged, onOpenRelated, onOpenEvent, events = [], sourceTitles,
117
117
  onCompare, versionDiff = { loading: false },
118
118
  }: WikiCardPreviewProps): ReactNode {
119
119
  const [recompiling, setRecompiling] = useState(false)
120
120
  const [recompileNotice, setRecompileNotice] = useState<{ tone: 'success' | 'error'; text: string } | null>(null)
121
+ const [compareOpen, setCompareOpen] = useState(false)
121
122
  const status = STATUS_VIEW[detail.card.status]?.label ?? detail.card.status
122
123
  const refs = sourceRefsText(detail.card.sourceRefs, sourceTitles)
123
124
  const knowledge = useCardKnowledge(kbId, detail.card.entityId, sourceTitles)
125
+ const relatedEvents = useMemo(() => {
126
+ const raw = detail.card.metadata?.event_refs
127
+ let ids: string[] = []
128
+ if (Array.isArray(raw)) ids = raw.filter((item): item is string => typeof item === 'string')
129
+ else if (typeof raw === 'string') {
130
+ try {
131
+ const parsed: unknown = JSON.parse(raw)
132
+ if (Array.isArray(parsed)) ids = parsed.filter((item): item is string => typeof item === 'string')
133
+ } catch { /* 无效派生引用不显示 */ }
134
+ }
135
+ const byId = new Map(events.map(event => [event.id, event]))
136
+ return [...new Set(ids)].map(id => byId.get(id) ?? { id }).map(event => ({
137
+ id: event.id,
138
+ title: 'title' in event ? event.title : event.id,
139
+ summary: 'summary' in event ? event.summary : '',
140
+ occurredAt: 'occurredAt' in event ? event.occurredAt : undefined,
141
+ }))
142
+ }, [detail.card.metadata, events])
143
+ useEffect(() => { setCompareOpen(false) }, [detail.card.entityId])
124
144
  /**
125
- * 先移除旧版本只在面板下方由关系图展示的「相关」区块,再补普通引用清单。
145
+ * 移除旧版本正文里的生成式导航区块,再显示结构化卡片与 Event 引用。
126
146
  *
127
147
  * 投影顺序固定为:物化正文 → 去掉旧导航区 → 补引用清单。
128
148
  */
@@ -204,6 +224,21 @@ export function WikiCardPreview({
204
224
  {recompiling ? '编译中…' : '按坐标重新编译'}</Button>}
205
225
  />
206
226
 
227
+ {relatedEvents.length > 0 && <section className="flex min-w-0 flex-col gap-1.5" aria-label="关联 Event">
228
+ <h3 className="m-0 flex items-center gap-1.5 text-[11px] font-semibold text-tita-ink">
229
+ <CircleDot size={12} aria-hidden="true" />关联 Event <Badge tone="neutral">{relatedEvents.length}</Badge>
230
+ </h3>
231
+ <ul className="m-0 grid list-none gap-1 p-0">
232
+ {relatedEvents.map(event => <li key={event.id} className="min-w-0 rounded-md border border-tita-line px-2 py-1.5">
233
+ <Button variant="ghost" size="sm" className="h-auto max-w-full justify-start px-0 py-0 text-left text-[10.5px]" onClick={() => onOpenEvent(event.id)}>
234
+ <span className="min-w-0 truncate">{event.title}</span>
235
+ {event.occurredAt && <span className="shrink-0 text-[9px] text-tita-ink-faint">· {event.occurredAt}</span>}
236
+ </Button>
237
+ {event.summary && <p className="m-0 mt-0.5 line-clamp-2 text-[10px] leading-relaxed text-tita-ink-muted">{event.summary}</p>}
238
+ </li>)}
239
+ </ul>
240
+ </section>}
241
+
207
242
  {recompileNotice && <div className={cn(styles.cardRecompileNotice, recompileNotice.tone === 'error' ? styles.cardRecompileNoticeError : styles.cardRecompileNoticeSuccess)} role="status">
208
243
  {recompileNotice.tone === 'error' ? <AlertCircle size={12} aria-hidden="true" /> : <Check size={12} aria-hidden="true" />}
209
244
  <span>{recompileNotice.text}</span>
@@ -230,13 +265,24 @@ export function WikiCardPreview({
230
265
  />
231
266
 
232
267
  <PreviewVersions
233
- hint="卡片正文每次变化前都会留一份快照;回滚是往前的写入,所以回滚前的那一版也会被快照 —— 回滚本身也可以回滚。"
268
+ hint="卡片正文变化前会保存快照,可查看历史版本并比较正文差异。"
234
269
  entries={versionEntries}
235
270
  loading={loading}
236
271
  emptyLabel="这张卡片还没有历史版本(正文变化时才会生成快照;只改状态不会造版本)。"
237
- actions={{ restorableId: currentVersionId, onRestore, ...(onCompare === undefined ? {} : { onCompare }) }}
238
- ><VersionContentDiff data={versionDiff.data} loading={versionDiff.loading} error={versionDiff.error} />
239
- </PreviewVersions>
272
+ actions={{
273
+ restorableId: currentVersionId,
274
+ ...(onCompare === undefined ? {} : { onCompare: (entry: VersionManagerEntry) => { setCompareOpen(true); onCompare(entry) } }),
275
+ }}
276
+ />
277
+ <Dialog open={compareOpen} onOpenChange={setCompareOpen}>
278
+ <DialogContent className="w-[min(900px,calc(100vw-32px))] max-w-[min(900px,calc(100vw-32px))] max-h-[calc(100vh-32px)]">
279
+ <DialogHeader>
280
+ <DialogTitle className="flex items-center gap-[6px]"><GitCompare size={15} aria-hidden="true" /> WikiCard 版本差异</DialogTitle>
281
+ <DialogDescription>只读比较所选历史正文与当前正文。关闭窗口不会改变卡片内容。</DialogDescription>
282
+ </DialogHeader>
283
+ <VersionContentDiff data={versionDiff.data} loading={versionDiff.loading} error={versionDiff.error} fullText />
284
+ </DialogContent>
285
+ </Dialog>
240
286
  </div>
241
287
  }
242
288
 
@@ -165,7 +165,7 @@ const STAGES: Stage[] = [
165
165
  body: [
166
166
  '**三个轴分别归一**:先找 canonical,再找 alias,最后才新建候选。匹配不唯一时,**不猜**。',
167
167
  '每条知识绑定一个**坐标**:三个轴实体 id 的**复合键**。**Coordinate 不是实体**,没有自己的表。',
168
- '同义知识合并,`sources` 追加;相互矛盾的说法保留,并标记为 disputed。',
168
+ '归一化文本一致时合并并追加来源;语义相似只记候选,不自动合并。相互矛盾的说法需显式标记 disputed。',
169
169
  ],
170
170
  rule: {
171
171
  order: '2',
@@ -176,7 +176,7 @@ const STAGES: Stage[] = [
176
176
  produces: {
177
177
  layer: 'Canonical Knowledge',
178
178
  ask: '在哪里',
179
- note: '轴已归一并绑成 id;同义合并过,冲突留着',
179
+ note: '轴绑定为 id;同文事实合并,语义候选待确认',
180
180
  },
181
181
  },
182
182
  {
@@ -198,7 +198,7 @@ const STAGES: Stage[] = [
198
198
  title: '坐标决定卡片身份,卡名只是显示',
199
199
  body: '一个坐标最多一张卡。坐标是数据库主键;标题由对象、场景和动作生成,只是**显示名**,不参与判重。',
200
200
  },
201
- model: '系统(确定)',
201
+ model: '系统分组,可选模型组织',
202
202
  produces: {
203
203
  layer: 'Wiki Card',
204
204
  ask: '怎么组织这些知道的东西',
@@ -217,7 +217,7 @@ const STAGES: Stage[] = [
217
217
  '**Knowledge 是证据层,不是第二个检索入口**:命中 Section 后,再带出对应知识、状态和出处。',
218
218
  '向量、关键词和图谱 boost 都属于**可重建的派生层**(`derived.db`)。**轴注册表不是索引**,而是坐标解析时使用的命名真源。',
219
219
  ],
220
- model: '不调模型',
220
+ model: '系统切分 + 向量编码',
221
221
  produces: {
222
222
  layer: '可检索 Wiki',
223
223
  /* 派生层,所以没有 ask —— 它不是实体,不回答上面那三个问题。 */
@@ -38,7 +38,7 @@ export interface NodeLogicPanelProps {
38
38
  version: number
39
39
  /** 跳到节点所属的功能 tab;`knowledgeTab` 存在时还要落到知识库里那一栏。 */
40
40
  onJump: (tab: PanelTab, knowledgeTab?: KnowledgeTab) => void
41
- /** 打开一个工作区页面(Table / Notebook / 画布)。 */
41
+ /** 打开一个工作区页面(Table / 画布)。 */
42
42
  onOpenTab?: (kind: WorkspaceTabKind) => void
43
43
  onClose: () => void
44
44
  }
@@ -124,10 +124,9 @@ export function NodeLogicPanel({ selected, stats, version, onJump, onOpenTab, on
124
124
  去配置<ArrowRight size={14} />
125
125
  </Button>
126
126
  : <p className={styles.archPanelHint}><CircleHelp size={13} />这个节点没有可配置页:{meta.status === 'host' ? '它由宿主提供' : meta.status === 'planned' ? '它还没实现,先在这里说明设计意图' : '它的行为由代码决定,没有可调参数'}。</p>}
127
- {(selected === 'answer' || selected === 'data-sheet' || selected === 'data-notebook' || selected === 'data-canvas') && onOpenTab && <div className={styles.archPanelActions}>
127
+ {(selected === 'answer' || selected === 'data-sheet' || selected === 'data-canvas') && onOpenTab && <div className={styles.archPanelActions}>
128
128
  <Button variant="outline" size="sm" onClick={() => onOpenTab('data-sheet')}><ChevronRight size={13} />打开 Table</Button>
129
- <Button variant="outline" size="sm" onClick={() => onOpenTab('data-notebook')}><ChevronRight size={13} />打开 Notebook</Button>
130
- {/* 画布与 Table / Notebook 并列:三者都是这一格的输出产物,之前少列了一个。 */}
129
+ {/* 画布与 Table 并列,都是可编辑的工作区产物。 */}
131
130
  <Button variant="outline" size="sm" onClick={() => onOpenTab('data-excalidraw')}><ChevronRight size={13} />打开画布</Button>
132
131
  </div>}
133
132
  </PanelSection>
@@ -46,7 +46,7 @@ export const NODE_H_STACKED = 80
46
46
  * 一列竖排**三张**时的卡片高度(2026-09-26 加画布带来的第三张)。
47
47
  *
48
48
  * 它比两排矮一档,不是审美选择,是算术:三张要挤进同一条带,而带高是全图共享的。
49
- * 内容也正好只差一行 —— 这一列的 Table / Notebook / 画布都没有计数行,两行文字
49
+ * 内容也正好只差一行 —— 这一列的 Table / 画布都没有计数行,两行文字
50
50
  * (标题 + 说明)加 8px 上下内边距正好 52px;而情节 / 操作记忆两张带计数行,需要 73px,
51
51
  * 所以它们仍用 80。写死一个高度给两种内容,不是裁掉计数就是白留一条空带。
52
52
  */
@@ -65,7 +65,7 @@ export const STACK_GAP = 14
65
65
  * 测试会断言两者一致(一处写三张、另一处只放两张是最容易犯的错,而且肉眼看不出来)。
66
66
  */
67
67
  export const STACK_COLUMNS: ReadonlyArray<{ lane: number; col: number; count: number }> = [
68
- { lane: 0, col: 4, count: 3 },
68
+ { lane: 0, col: 4, count: 2 },
69
69
  { lane: 2, col: 3, count: 2 },
70
70
  ]
71
71
 
@@ -210,8 +210,7 @@ export const ARCH_SLOTS: Record<NodeId, Slot> = {
210
210
  runtime: { lane: 0, col: 2 },
211
211
  answer: { lane: 0, col: 3 },
212
212
  'data-sheet': { lane: 0, col: 4, stack: 0 },
213
- 'data-notebook': { lane: 0, col: 4, stack: 1 },
214
- 'data-canvas': { lane: 0, col: 4, stack: 2 },
213
+ 'data-canvas': { lane: 0, col: 4, stack: 1 },
215
214
 
216
215
  'source-raw': { lane: 1, col: 0 },
217
216
  compile: { lane: 1, col: 1 },
@@ -284,9 +283,8 @@ export const ARCH_EDGES: ArchEdge[] = [
284
283
  { id: 'a2', source: 'intent', target: 'runtime', kind: 'flow' },
285
284
  { id: 'a3', source: 'runtime', target: 'answer', kind: 'flow' },
286
285
  { id: 'a4', source: 'answer', target: 'data-sheet', kind: 'branch' },
287
- { id: 'a5', source: 'answer', target: 'data-notebook', kind: 'branch' },
288
- // 画布与 Table / Notebook 是同一格的三种输出产物,所以也是同一种边。
289
- { id: 'a6', source: 'answer', target: 'data-canvas', kind: 'branch' },
286
+ // 画布与 Table 是同一格的两种可编辑输出产物。
287
+ { id: 'a5', source: 'answer', target: 'data-canvas', kind: 'branch' },
290
288
 
291
289
  // B · 知识编译与召回链路(写入侧 → 读取侧)
292
290
  { id: 'b1', source: 'source-raw', target: 'compile', kind: 'flow' },
@@ -367,7 +365,6 @@ export function isBusEdge(edgeId: string): boolean {
367
365
  * ```
368
366
  * 回答 ──┐ 拐点 1 把三条边锁在同一个 y(发点的中心),
369
367
  * ├──▶ Table 所以三根箭头从**同一个点**出来;
370
- * ├──▶ Notebook 拐点 2 各自落在目标那一行。
371
368
  * └──▶ 画布
372
369
  * ```
373
370
  *
@@ -923,7 +920,7 @@ export function recordRows(id: NodeId, stats: KnowledgeStats, version: number):
923
920
  rows.push(indexRow)
924
921
  break
925
922
  case 'recall':
926
- rows.push(['默认路线', stats.recallMode ?? 'hybrid'])
923
+ rows.push(['召回方式', '多路径融合'])
927
924
  rows.push(['召回 topK', String(stats.recallTopK ?? 10)])
928
925
  rows.push(['检索后端', stats.searchBackend === 'hybrid' ? 'Hybrid(Coordinate + 关键词 + 向量)' : 'FTS fallback'])
929
926
  rows.push(indexRow)
@@ -11,7 +11,7 @@
11
11
  */
12
12
 
13
13
  import {
14
- BarChart3, Box, BrainCircuit, ClipboardCheck, Clock3, Database, FileCode2, FileText,
14
+ BarChart3, Box, BrainCircuit, ClipboardCheck, Clock3, Database, FileText,
15
15
  HardDrive, Layers3, MessageCircle, PenTool, Quote, RefreshCw, Search,
16
16
  Share2, Table2, UserRound,
17
17
  } from '@tita-agent/ui/icons'
@@ -51,7 +51,7 @@ export type KnowledgeTab = 'source-raw' | 'knowledge' | 'wiki' | 'recall'
51
51
  /**
52
52
  * 「回答 / 数据工具」这个节点能打开的**工作区页面**。
53
53
  *
54
- * 三个 kind 各由一个别的插件注册(`dsh-data-table` / `dsh-data-notebook` /
54
+ * 两个 kind 各由一个别的插件注册(`dsh-data-table` /
55
55
  * `dsh-data-excalidraw`)—— 这里只写 kind 字符串,不 import 它们的代码,所以某个
56
56
  * 插件没装时按钮依然在,宿主会就着这个 kind 显示「没有页面类型能打开它」。
57
57
  *
@@ -59,11 +59,9 @@ export type KnowledgeTab = 'source-raw' | 'knowledge' | 'wiki' | 'recall'
59
59
  * 把它交给宿主的 `openTab`。三处各写一份,迟早出现「面板多了一个按钮,入口的类型
60
60
  * 还不认它」——加画布这次就正好会踩到。
61
61
  *
62
- * 「回答 / 数据工具」的输出产物就是这三样:可编辑表格、可复现 Notebook、可编辑画布。
63
- * 画布是 2026-09-26 补上的第四个出口:Excalidraw 画布已经在宿主里跑着,而这张架构图
64
- * 上原先只列了 Table 与 Notebook,读起来像是「Agent 出不了图」。
62
+ * 「回答 / 数据工具」的可编辑工作区产物是表格和画布;分析报告由 DRender 生成。
65
63
  */
66
- export type WorkspaceTabKind = 'data-sheet' | 'data-notebook' | 'data-excalidraw'
64
+ export type WorkspaceTabKind = 'data-sheet' | 'data-excalidraw'
67
65
 
68
66
  /**
69
67
  * 四个分栏的顺序、名字与图标。**定义在这里而不是在 `KnowledgeBaseTab` 里**:
@@ -76,9 +74,8 @@ export type WorkspaceTabKind = 'data-sheet' | 'data-notebook' | 'data-excalidraw
76
74
  */
77
75
  export const KNOWLEDGE_TABS: Array<{ id: KnowledgeTab; label: string; step: string; icon: LucideIcon }> = [
78
76
  { id: 'source-raw', label: 'SourceRaw', step: '收录', icon: Database },
79
- /* Knowledge 是 0063 的**事实真源**,所以它有自己的一栏(原先它挤在 Wiki 那一栏里,
80
- 压在卡片列表上方)。它装的是 Extract 与 Resolve 两段:抽出来的知识,和归一后的坐标。 */
81
- { id: 'knowledge', label: 'Knowledge', step: '抽取 · 归一', icon: Quote },
77
+ /* Knowledge 与 Event 都是抽取真源,放在同一栏用二级切换区分;两者都属于 Extract 与 Resolve。 */
78
+ { id: 'knowledge', label: 'Knowledge & Event', step: '抽取 · 归一', icon: Quote },
82
79
  /* WikiCard 这一栏现在只回答一件事:**这些知识被组织成了哪些页**(Materialize)。
83
80
  构建(向量 + 图谱)没有自己的栏,它的参数 chip 挂在这一栏的卡片头上。 */
84
81
  { id: 'wiki', label: 'WikiCard', step: '物化', icon: Layers3 },
@@ -110,7 +107,7 @@ export const NODE_LANES: LaneMeta[] = [
110
107
  ]
111
108
 
112
109
  export type NodeId =
113
- | 'conversation' | 'intent' | 'runtime' | 'answer' | 'data-sheet' | 'data-notebook' | 'data-canvas'
110
+ | 'conversation' | 'intent' | 'runtime' | 'answer' | 'data-sheet' | 'data-canvas'
114
111
  | 'source-raw' | 'compile' | 'build' | 'recall' | 'context'
115
112
  | 'interaction' | 'episodic-memory' | 'procedural-memory' | 'memory-quality' | 'daily-update'
116
113
 
@@ -118,7 +115,7 @@ export type NodeId =
118
115
  * 实现状态。**这是这张图最容易被写坏的一格**:把待实现的画成已实现,图就从契约
119
116
  * 退化成宣传。所以状态只有四档,且每一档都要在 `statusNote` 里说清依据。
120
117
  *
121
- * - `host`:不是本插件的代码(Runtime / Table / Notebook 由宿主提供),不冒充我们的进度。
118
+ * - `host`:不是本插件的代码(Runtime / Table 由宿主提供),不冒充我们的进度。
122
119
  */
123
120
  export type NodeStatus = 'live' | 'partial' | 'planned' | 'host'
124
121
 
@@ -209,8 +206,9 @@ icon: MessageCircle, lane: 'interaction',
209
206
  input: '用户原文 + 会话 + 当前 Query', output: 'intent 记录 + Query Analysis(Intent / OAS)',
210
207
  steps: [
211
208
  { label: '固定审计契约', detail: '按内置分类、act 与 relation 规则记录会话事实', state: 'done' },
212
- { label: '记录不拦截执行', detail: '模型无法判定时记录 unknown,不阻塞后续请求', state: 'done' },
213
- { label: '置信度与兜底', detail: '低于阈值的记录标 lowConfidence;漏调由 Host 补一条 fallback', state: 'done' },
209
+ { label: '数据域门控', detail: '只有标准模式的数据轮次进入意图链路,普通聊天不生成记录', state: 'done' },
210
+ { label: '记录不拦截执行', detail: '模型无法判定时记录 unknown,不阻塞后续请求;非数据轮次不补记录', state: 'done' },
211
+ { label: '置信度与兜底', detail: '低于阈值的记录标 lowConfidence;数据轮次漏调由 Host 补一条 fallback', state: 'done' },
214
212
  { label: '召回侧解析', detail: '当前 Query 解析 Intent + Object / Action / Scene,交给 Coordinate 路', state: 'done' },
215
213
  ],
216
214
  status: 'live', statusNote: '会话意图记录已落盘;召回侧 Query Analysis 在知识库 → 召回重排中实时展示。',
@@ -218,25 +216,25 @@ icon: BrainCircuit, lane: 'interaction', tab: 'intent',
218
216
  },
219
217
  runtime: {
220
218
  title: 'Tita Agent Runtime', shortTitle: 'Agent Runtime', subtitle: '规划、调用工具、执行分析',
221
- detail: 'Agent 核心运行时:编排知识召回、数据表格、Notebook 和自进化记忆,组织结果并返回给用户。',
219
+ detail: 'Agent 核心运行时:编排知识召回、数据表格和自进化记忆,组织结果并返回给用户。',
222
220
  input: '意图与上下文 + 召回得到的知识', output: '回答、引用、结构化数据',
223
221
  steps: [
224
222
  { label: '接收 Agent Context', detail: '重排后的 Section 归并为完整 WikiCard,连同 Knowledge 与 Source provenance 返回', state: 'done' },
225
- { label: '调用工具', detail: '取数、表格、Notebook、知识写入都由工具完成', state: 'done' },
226
- { label: '组织回答', detail: '解释与引用一起返回,结构化结果转交 Table / Notebook', state: 'done' },
223
+ { label: '调用工具', detail: '取数、表格、知识写入都由工具完成', state: 'done' },
224
+ { label: '组织回答', detail: '解释与引用一起返回,结构化结果可转交 Table / 画布或 DRender 报告', state: 'done' },
227
225
  ],
228
226
  status: 'host', statusNote: 'Runtime 是宿主 Agent 本体;本插件以「召回上下文 + 知识工具」的方式接入它。',
229
227
  icon: Box, lane: 'interaction',
230
228
  },
231
229
  answer: {
232
230
  title: '回答 / 数据工具', subtitle: '生成结果、可视化与方案',
233
- detail: '输出解释、引用和数据结果,并把结构化结果继续交给 Table、Notebook 或画布处理。',
234
- input: '模型回答 + 工具返回值', output: '可读回答、可编辑表格、可复现 Notebook、可编辑画布',
231
+ detail: '输出解释、引用和数据结果,并把结构化结果交给 Table、画布或 DRender 报告处理。',
232
+ input: '模型回答 + 工具返回值', output: '可读回答、可编辑表格、DRender 报告、可编辑画布',
235
233
  steps: [
236
234
  { label: '回答与引用', detail: '每一条结论都能指回 wiki 与 SourceRaw', state: 'done' },
237
- { label: '转交数据工具', detail: '结构化结果可继续在 Table / Notebook / 画布里加工', state: 'done' },
235
+ { label: '转交数据工具', detail: '结构化结果可继续在 Table / 画布里加工,或由 DRender 生成报告', state: 'done' },
238
236
  ],
239
- status: 'host', statusNote: '回答渲染与 Table / Notebook / 画布由宿主工作区提供。',
237
+ status: 'host', statusNote: '回答渲染与 Table / 画布由宿主工作区提供;DRender 负责报告生成。',
240
238
  icon: BarChart3, lane: 'interaction',
241
239
  },
242
240
  'data-sheet': {
@@ -246,14 +244,6 @@ icon: BarChart3, lane: 'interaction',
246
244
  steps: [{ label: '打开数据表格', detail: '由宿主的 Table 插件承载', state: 'done' }],
247
245
  status: 'host', statusNote: '属于 `dsh-data-table` 插件,这里只画调用关系。',
248
246
  icon: Table2, lane: 'interaction',
249
- },
250
- 'data-notebook': {
251
- title: 'Notebook', subtitle: '生成 / 分析 Notebook',
252
- detail: '把查询、SQL、Markdown 和图表组织成可复用的分析 Notebook。',
253
- input: '查询与代码片段', output: '可复现的分析 Notebook',
254
- steps: [{ label: '打开数据笔记本', detail: '由宿主的 Notebook 插件承载', state: 'done' }],
255
- status: 'host', statusNote: '属于 `dsh-data-notebook` 插件,这里只画调用关系。',
256
- icon: FileCode2, lane: 'interaction',
257
247
  },
258
248
  'data-canvas': {
259
249
  title: '画布', subtitle: '生成 / 编辑 Excalidraw 画布',
@@ -286,7 +276,7 @@ icon: Database, lane: 'knowledge', tab: 'knowledge', knowledgeTab: 'source-raw',
286
276
  { label: '物化 WikiCard', detail: '按 (对象, 动作, 场景) 分组,卡名由公式推导(对象名 + 场景 + 动作名);小节与字段作为组织提示,卡片直接入库,review 与备注在预览中处理', state: 'done' },
287
277
  { label: '建索引', detail: '切召回单元、写索引页与相关卡片、检查断链,不调模型', state: 'done' },
288
278
  ],
289
- status: 'live', statusNote: '四段都已实现:抽 Knowledge、归一坐标、按坐标物化卡片、切召回单元并建索引(模型不可用时退回规则抽取,此时没有坐标,正文按小节切)。入库后的 review 与备注在卡片的预览侧栏里。',
279
+ status: 'live', statusNote: '导入默认只保存来源;抽取 Knowledge / Event、归一、物化分别运行,也可全链路运行。未变文档复用检查点;构建成功后统一发布索引。模型不可用时任务明确失败,可查看输出与历史后重试。',
290
280
  icon: RefreshCw, lane: 'knowledge', tab: 'knowledge', knowledgeTab: 'wiki',
291
281
  },
292
282
  build: {
@@ -334,7 +324,7 @@ icon: Layers3, lane: 'knowledge', tab: 'knowledge', knowledgeTab: 'recall',
334
324
  detail: '记录用户做了什么、采用了什么结果,以及对分析结果的反馈,为自进化闭环提供输入。',
335
325
  input: '每一轮的意图记录与工具调用', output: '可回溯的交互审计流',
336
326
  steps: [
337
- { label: '意图审计流', detail: '每轮一条 intent 记录,只标注不拦截', state: 'done' },
327
+ { label: '意图审计流', detail: '每个数据轮次一条 intent 记录,只标注不拦截', state: 'done' },
338
328
  { label: '结果采纳与反馈', detail: '用户是否采用了结果、事后评价还没采集', state: 'todo' },
339
329
  ],
340
330
  status: 'partial', statusNote: '意图记录已经是一条真实的审计流;「结果是否被采用」这类反馈还没有采集入口。',
@@ -499,7 +489,7 @@ export function nodeMetrics(id: NodeId, stats: KnowledgeStats, version: number):
499
489
  case 'recall':
500
490
  return [
501
491
  { label: 'topK', value: String(stats.recallTopK ?? 10) },
502
- { label: '默认路线', value: stats.recallMode ?? 'hybrid' },
492
+ { label: '召回方式', value: '多路径融合' },
503
493
  ]
504
494
  case 'context':
505
495
  return [
@@ -533,12 +523,12 @@ export function metricsByNode(stats: KnowledgeStats, version: number): Partial<R
533
523
 
534
524
  /** 节点在图上出现的顺序:按链路,再按链内阅读顺序。它就是键盘可达列表的顺序。 */
535
525
  export const NODE_ORDER: NodeId[] = [
536
- 'conversation', 'intent', 'runtime', 'answer', 'data-sheet', 'data-notebook', 'data-canvas',
526
+ 'conversation', 'intent', 'runtime', 'answer', 'data-sheet', 'data-canvas',
537
527
  'source-raw', 'compile', 'build', 'recall', 'context',
538
528
  'interaction', 'episodic-memory', 'procedural-memory', 'memory-quality', 'daily-update',
539
529
  ]
540
530
 
541
- /** 只在面板里出现、不占图上格子的节点(0025 起 Table / Notebook 已上图,这里保留给未来)。 */
531
+ /** 只在面板里出现、不占图上格子的节点(这里保留给未来扩展)。 */
542
532
  export const DERIVED_NODES: NodeId[] = []
543
533
 
544
534
  /** 某个节点归属的链路定义;找不到(例如未来新增节点漏填 lane)时返回 null 而不是猜。 */