@modusensus/dsh-mneme 0.14.0-beta.1 → 0.14.0-beta.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 (543) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +830 -830
  3. package/assets/icon.svg +3 -3
  4. package/bin/cli.mjs +964 -964
  5. package/bin/dsh-mneme-choro.mjs +262 -262
  6. package/bin/dsh-mneme-mcp.mjs +510 -510
  7. package/bin/dsh-mneme-serve.mjs +151 -151
  8. package/cordis.patch.yml +21 -21
  9. package/docs/CONFIGURATION.md +407 -404
  10. package/docs/CONTINUITY.md +139 -139
  11. package/docs/DAEMON.md +57 -57
  12. package/docs/DIRECTORIES.md +114 -114
  13. package/docs/DISTILL.md +397 -371
  14. package/docs/DSH-GO.md +97 -97
  15. package/docs/ENTITIES.md +247 -247
  16. package/docs/FORGET.md +77 -77
  17. package/docs/KB.md +110 -110
  18. package/docs/LOCAL_MODEL.md +222 -222
  19. package/docs/SEMANTIC.md +256 -256
  20. package/docs/SHARE.md +552 -552
  21. package/docs/SLEEP.md +202 -202
  22. package/docs/STORAGE.md +122 -122
  23. package/docs/WORKFLOWS.md +366 -366
  24. package/lib/api-standalone.js +1007 -1007
  25. package/lib/api.js +3600 -3600
  26. package/lib/attachment-text.js +122 -122
  27. package/lib/bootstrap-http.js +105 -105
  28. package/lib/bootstrap.js +215 -215
  29. package/lib/candidates.js +454 -454
  30. package/lib/capabilities.js +819 -819
  31. package/lib/choro-command.js +111 -111
  32. package/lib/client.js +14420 -14322
  33. package/lib/commands.js +95 -95
  34. package/lib/config-keys.js +144 -144
  35. package/lib/config.js +1361 -1344
  36. package/lib/content-hash.js +54 -54
  37. package/lib/continuity.js +258 -258
  38. package/lib/date-hint.js +32 -0
  39. package/lib/diary/auto.js +190 -190
  40. package/lib/diary/compose.js +440 -440
  41. package/lib/diary/dir.js +59 -59
  42. package/lib/diary/export.js +97 -97
  43. package/lib/diary/index.js +26 -26
  44. package/lib/diary/library.js +189 -189
  45. package/lib/diary/qq-inbox.js +142 -142
  46. package/lib/diary/rollover.js +61 -61
  47. package/lib/diary/session-provider.js +122 -122
  48. package/lib/document-index.js +94 -94
  49. package/lib/document.js +322 -322
  50. package/lib/dream/clustering.js +123 -123
  51. package/lib/dream/decisions.js +945 -945
  52. package/lib/dream/narratives.js +44 -44
  53. package/lib/dream/sleep.js +2027 -2027
  54. package/lib/dream/triage.js +139 -139
  55. package/lib/dream.js +1879 -1879
  56. package/lib/dsh-go/host.js +162 -162
  57. package/lib/dsh-go/panel.js +2091 -2091
  58. package/lib/dsh-go/text.js +342 -342
  59. package/lib/dsh-go/views/common.js +68 -68
  60. package/lib/dsh-go/views/entity.js +48 -48
  61. package/lib/dsh-go/views/memory.js +198 -198
  62. package/lib/dsh-go/views/root.js +30 -30
  63. package/lib/dsh-go/views/settings.js +398 -398
  64. package/lib/dsh-go/views/status.js +51 -51
  65. package/lib/embedding.js +342 -342
  66. package/lib/entities/extractor.js +285 -285
  67. package/lib/fence.js +24 -24
  68. package/lib/graph/anchoring.js +184 -184
  69. package/lib/guide.js +74 -74
  70. package/lib/heat.js +144 -144
  71. package/lib/hot-memory.js +119 -119
  72. package/lib/image-describe.js +158 -0
  73. package/lib/index.js +852 -852
  74. package/lib/inject.js +656 -651
  75. package/lib/kb/index.js +309 -309
  76. package/lib/kb/routes.js +219 -219
  77. package/lib/kb/tools.js +148 -148
  78. package/lib/lang.js +607 -595
  79. package/lib/local-embedder.js +358 -358
  80. package/lib/maintenance.js +162 -162
  81. package/lib/memory-source.js +9 -9
  82. package/lib/mirror.js +330 -330
  83. package/lib/organize.js +456 -456
  84. package/lib/peak-hours.js +172 -172
  85. package/lib/pipeline-activities.js +178 -178
  86. package/lib/pipeline-attribution.js +165 -165
  87. package/lib/pipeline-command.js +279 -279
  88. package/lib/pipeline-confirm.js +142 -142
  89. package/lib/pipeline-exec.js +174 -174
  90. package/lib/pipeline-nudge-auto.js +129 -129
  91. package/lib/pipeline-nudge.js +1623 -1623
  92. package/lib/pipeline-observations.js +181 -181
  93. package/lib/pipeline-observe.js +133 -133
  94. package/lib/pipeline-runner.js +361 -361
  95. package/lib/pipeline-runs.js +442 -442
  96. package/lib/pipeline.js +716 -716
  97. package/lib/placement.js +13 -13
  98. package/lib/pre-inject-gate.js +354 -354
  99. package/lib/profile-extract.js +164 -164
  100. package/lib/profile-facts.js +356 -356
  101. package/lib/provenance-http.js +251 -251
  102. package/lib/quality-filter.js +162 -162
  103. package/lib/recall-stats.js +190 -190
  104. package/lib/reclaim-http.js +150 -150
  105. package/lib/reranker.js +269 -269
  106. package/lib/runtime/adopt.js +176 -176
  107. package/lib/runtime/closure.js +172 -172
  108. package/lib/runtime/download.js +247 -247
  109. package/lib/runtime/layout.js +265 -265
  110. package/lib/runtime/loader.js +252 -252
  111. package/lib/runtime/model-fetch.js +361 -361
  112. package/lib/runtime/provision.js +237 -237
  113. package/lib/runtime/tarball.js +130 -130
  114. package/lib/runtime/verify.js +223 -223
  115. package/lib/safe-slice.js +18 -18
  116. package/lib/scope-state.js +277 -277
  117. package/lib/scope.js +187 -187
  118. package/lib/search/adaptive.js +60 -60
  119. package/lib/search/bm25.js +96 -96
  120. package/lib/semantic.js +572 -572
  121. package/lib/sensitive-scan.js +209 -209
  122. package/lib/serve.js +228 -228
  123. package/lib/service.js +3268 -3268
  124. package/lib/session-gate.js +91 -91
  125. package/lib/session-usage.js +350 -350
  126. package/lib/settings.js +827 -817
  127. package/lib/share-http.js +281 -281
  128. package/lib/share-import.js +234 -234
  129. package/lib/share.js +335 -335
  130. package/lib/store.js +5895 -5895
  131. package/lib/summarize.js +1388 -1343
  132. package/lib/tools.js +1370 -1356
  133. package/lib/user-settings.js +230 -230
  134. package/lib/vector-index.js +180 -180
  135. package/lib/version-check.js +122 -122
  136. package/lib/wiki/claims.js +267 -267
  137. package/lib/wiki/cli-hint.js +90 -90
  138. package/lib/wiki/inject.js +164 -164
  139. package/lib/wiki/partition.js +200 -200
  140. package/lib/wiki/plan.js +214 -214
  141. package/lib/wiki/queries.js +640 -640
  142. package/lib/wiki/render.js +261 -261
  143. package/lib/wiki/scan.js +371 -371
  144. package/lib/wiki/t0.js +500 -500
  145. package/lib/wiki/t1-jobs.js +232 -232
  146. package/lib/wiki/t1.js +609 -609
  147. package/lib/write-admission.js +404 -404
  148. package/locale/en.json +6 -6
  149. package/locale/zh.json +6 -6
  150. package/package.json +1 -1
  151. package/runtime-manifest.json +526 -526
  152. package/scripts/benchmark-embed.js +201 -201
  153. package/scripts/benchmark-recall.js +249 -249
  154. package/scripts/benchmark-rerank.js +166 -166
  155. package/scripts/build-runtime-manifest.mjs +224 -224
  156. package/scripts/changelog-prep.mjs +91 -91
  157. package/scripts/check-sync.js +44 -44
  158. package/scripts/e2e-dsh.js +220 -220
  159. package/scripts/mneme-runtime.mjs +277 -277
  160. package/scripts/publish-gate.mjs +197 -197
  161. package/scripts/release-docs.mjs +210 -210
  162. package/scripts/release-notes.mjs +164 -164
  163. package/scripts/stress-dsh.js +255 -255
  164. package/scripts/sync-lib.js +47 -47
  165. package/scripts/sync-test-badge.mjs +69 -69
  166. package/scripts/test-count-sync.mjs +48 -48
  167. package/src/api-standalone.js +1007 -1007
  168. package/src/api.js +3600 -3600
  169. package/src/attachment-text.js +122 -122
  170. package/src/bootstrap-http.js +105 -105
  171. package/src/bootstrap.js +215 -215
  172. package/src/candidates.js +454 -454
  173. package/src/capabilities.js +819 -819
  174. package/src/choro-command.js +111 -111
  175. package/src/commands.js +95 -95
  176. package/src/config-keys.js +144 -144
  177. package/src/config.js +1361 -1344
  178. package/src/content-hash.js +54 -54
  179. package/src/continuity.js +258 -258
  180. package/src/date-hint.js +32 -0
  181. package/src/diary/auto.js +190 -190
  182. package/src/diary/compose.js +440 -440
  183. package/src/diary/dir.js +59 -59
  184. package/src/diary/export.js +97 -97
  185. package/src/diary/index.js +26 -26
  186. package/src/diary/library.js +189 -189
  187. package/src/diary/qq-inbox.js +142 -142
  188. package/src/diary/rollover.js +61 -61
  189. package/src/diary/session-provider.js +122 -122
  190. package/src/document-index.js +94 -94
  191. package/src/document.js +322 -322
  192. package/src/dream/clustering.js +123 -123
  193. package/src/dream/decisions.js +945 -945
  194. package/src/dream/narratives.js +44 -44
  195. package/src/dream/sleep.js +2027 -2027
  196. package/src/dream/triage.js +139 -139
  197. package/src/dream.js +1879 -1879
  198. package/src/dsh-go/host.js +162 -162
  199. package/src/dsh-go/panel.js +2091 -2091
  200. package/src/dsh-go/text.js +342 -342
  201. package/src/dsh-go/views/common.js +68 -68
  202. package/src/dsh-go/views/entity.js +48 -48
  203. package/src/dsh-go/views/memory.js +198 -198
  204. package/src/dsh-go/views/root.js +30 -30
  205. package/src/dsh-go/views/settings.js +398 -398
  206. package/src/dsh-go/views/status.js +51 -51
  207. package/src/embedding.js +342 -342
  208. package/src/entities/extractor.js +285 -285
  209. package/src/fence.js +24 -24
  210. package/src/graph/anchoring.js +184 -184
  211. package/src/guide.js +74 -74
  212. package/src/heat.js +144 -144
  213. package/src/hot-memory.js +119 -119
  214. package/src/image-describe.js +158 -0
  215. package/src/index.js +852 -852
  216. package/src/inject.js +656 -651
  217. package/src/kb/index.js +309 -309
  218. package/src/kb/routes.js +219 -219
  219. package/src/kb/tools.js +148 -148
  220. package/src/lang.js +607 -595
  221. package/src/local-embedder.js +358 -358
  222. package/src/maintenance.js +162 -162
  223. package/src/memory-source.js +9 -9
  224. package/src/mirror.js +330 -330
  225. package/src/organize.js +456 -456
  226. package/src/peak-hours.js +172 -172
  227. package/src/pipeline-activities.js +178 -178
  228. package/src/pipeline-attribution.js +165 -165
  229. package/src/pipeline-command.js +279 -279
  230. package/src/pipeline-confirm.js +142 -142
  231. package/src/pipeline-exec.js +174 -174
  232. package/src/pipeline-nudge-auto.js +129 -129
  233. package/src/pipeline-nudge.js +1623 -1623
  234. package/src/pipeline-observations.js +181 -181
  235. package/src/pipeline-observe.js +133 -133
  236. package/src/pipeline-runner.js +361 -361
  237. package/src/pipeline-runs.js +442 -442
  238. package/src/pipeline.js +716 -716
  239. package/src/placement.js +13 -13
  240. package/src/pre-inject-gate.js +354 -354
  241. package/src/profile-extract.js +164 -164
  242. package/src/profile-facts.js +356 -356
  243. package/src/provenance-http.js +251 -251
  244. package/src/quality-filter.js +162 -162
  245. package/src/recall-stats.js +190 -190
  246. package/src/reclaim-http.js +150 -150
  247. package/src/reranker.js +269 -269
  248. package/src/runtime/adopt.js +176 -176
  249. package/src/runtime/closure.js +172 -172
  250. package/src/runtime/download.js +247 -247
  251. package/src/runtime/layout.js +265 -265
  252. package/src/runtime/loader.js +252 -252
  253. package/src/runtime/model-fetch.js +361 -361
  254. package/src/runtime/provision.js +237 -237
  255. package/src/runtime/tarball.js +130 -130
  256. package/src/runtime/verify.js +223 -223
  257. package/src/safe-slice.js +18 -18
  258. package/src/scope-state.js +277 -277
  259. package/src/scope.js +187 -187
  260. package/src/search/adaptive.js +60 -60
  261. package/src/search/bm25.js +96 -96
  262. package/src/semantic.js +572 -572
  263. package/src/sensitive-scan.js +209 -209
  264. package/src/serve.js +228 -228
  265. package/src/service.js +3268 -3268
  266. package/src/session-gate.js +91 -91
  267. package/src/session-usage.js +350 -350
  268. package/src/settings.js +827 -817
  269. package/src/share-http.js +281 -281
  270. package/src/share-import.js +234 -234
  271. package/src/share.js +335 -335
  272. package/src/store.js +5895 -5895
  273. package/src/summarize.js +1388 -1343
  274. package/src/tools.js +1370 -1356
  275. package/src/user-settings.js +230 -230
  276. package/src/vector-index.js +180 -180
  277. package/src/version-check.js +122 -122
  278. package/src/wiki/claims.js +267 -267
  279. package/src/wiki/cli-hint.js +90 -90
  280. package/src/wiki/inject.js +164 -164
  281. package/src/wiki/partition.js +200 -200
  282. package/src/wiki/plan.js +214 -214
  283. package/src/wiki/queries.js +640 -640
  284. package/src/wiki/render.js +261 -261
  285. package/src/wiki/scan.js +371 -371
  286. package/src/wiki/t0.js +500 -500
  287. package/src/wiki/t1-jobs.js +232 -232
  288. package/src/wiki/t1.js +609 -609
  289. package/src/write-admission.js +404 -404
  290. package/test/adaptive-inject-budget.test.js +85 -85
  291. package/test/api-hardening.test.js +173 -173
  292. package/test/api-nudge-route.test.js +259 -259
  293. package/test/api-routes-gaps.test.js +1092 -1092
  294. package/test/api.test.js +3007 -2998
  295. package/test/attachment-text.test.js +139 -139
  296. package/test/audit.test.js +448 -448
  297. package/test/baseline-persist.test.js +248 -248
  298. package/test/benchmark.test.js +94 -94
  299. package/test/bm25-corpus-cache.test.js +145 -145
  300. package/test/bootstrap.test.js +228 -228
  301. package/test/candidates.test.js +345 -345
  302. package/test/capabilities.test.js +577 -577
  303. package/test/capacity-warning.test.js +262 -262
  304. package/test/changelog-prep.test.js +125 -125
  305. package/test/choro-command.test.js +218 -218
  306. package/test/cli-enums.test.js +37 -37
  307. package/test/cli-flag-value.test.js +86 -86
  308. package/test/cli-receive.test.js +390 -390
  309. package/test/cli-share.test.js +437 -437
  310. package/test/client-share.test.js +225 -225
  311. package/test/client.test.js +4595 -4425
  312. package/test/clustering.test.js +100 -100
  313. package/test/commands.test.js +106 -106
  314. package/test/config-keys-routes.test.js +233 -233
  315. package/test/config.test.js +153 -153
  316. package/test/conflict-freeze.test.js +344 -344
  317. package/test/conflict-ledger-enforce.test.js +452 -452
  318. package/test/conflict-ledger.test.js +242 -242
  319. package/test/conflict-reviewed.test.js +79 -79
  320. package/test/content-hash.test.js +204 -204
  321. package/test/continuity.test.js +452 -452
  322. package/test/contrast.test.js +432 -432
  323. package/test/date-hint.test.js +156 -0
  324. package/test/dedupe-candidate-window.test.js +180 -180
  325. package/test/dependency-overrides.test.js +78 -78
  326. package/test/diary-library.test.js +187 -187
  327. package/test/diary.test.js +576 -576
  328. package/test/differentiate-feedback.test.js +248 -248
  329. package/test/distill-tx-embed-gap.test.js +110 -110
  330. package/test/docs-config-keys.test.js +65 -65
  331. package/test/document-dir.test.js +233 -233
  332. package/test/document.test.js +703 -703
  333. package/test/dream-archive-guardrail.test.js +116 -116
  334. package/test/dream-baseline-clamp.test.js +174 -174
  335. package/test/dream-candidate-hybrid.test.js +281 -281
  336. package/test/dream-coverage-degrade.test.js +86 -86
  337. package/test/dream-decision-evidence.test.js +314 -314
  338. package/test/dream-failure-backoff.test.js +173 -173
  339. package/test/dream-fence.test.js +207 -207
  340. package/test/dream-maxtokens-fallback.test.js +132 -132
  341. package/test/dream-merge-guardrail.test.js +219 -219
  342. package/test/dream-peak-hours.test.js +194 -194
  343. package/test/dream.test.js +1528 -1528
  344. package/test/dsh-go-host.test.js +134 -134
  345. package/test/dsh-go-panel-actions.test.js +854 -854
  346. package/test/dsh-go-panel.test.js +251 -251
  347. package/test/embed-ready-poll.test.js +94 -94
  348. package/test/embed-text-reasons.test.js +112 -112
  349. package/test/embedding-cache-f32.test.js +276 -276
  350. package/test/embedding-ready.test.js +226 -226
  351. package/test/entities.test.js +711 -711
  352. package/test/entity-recall.test.js +179 -179
  353. package/test/epistemic.test.js +325 -325
  354. package/test/failure-query.test.js +147 -147
  355. package/test/failure-retention.test.js +105 -105
  356. package/test/fnew-0112.test.js +311 -311
  357. package/test/fnew-03.test.js +422 -422
  358. package/test/forget-corrections.test.js +70 -70
  359. package/test/graph-anchoring.test.js +184 -184
  360. package/test/graph-api.test.js +333 -333
  361. package/test/graph-boosted-relations.test.js +189 -189
  362. package/test/graph-inject-budget.test.js +103 -103
  363. package/test/graph-multipath.test.js +269 -269
  364. package/test/graph-passive-confirm.test.js +91 -91
  365. package/test/graph-weight-evolution.test.js +104 -104
  366. package/test/heat.test.js +175 -175
  367. package/test/helpers/dream-mock.js +86 -86
  368. package/test/helpers/peer-worker.mjs +25 -25
  369. package/test/helpers/runtime-source.js +60 -60
  370. package/test/helpers/tar-builder.js +80 -80
  371. package/test/helpers/write-admission-samples.js +312 -312
  372. package/test/hot-memory.test.js +259 -259
  373. package/test/image-description.test.js +271 -0
  374. package/test/image-memory.test.js +170 -170
  375. package/test/inject-content-cap.test.js +91 -91
  376. package/test/inject-first-round-bm25.test.js +89 -89
  377. package/test/inject-heat.test.js +77 -77
  378. package/test/inject-parent-gate.test.js +134 -109
  379. package/test/inject-pin-explicit.test.js +300 -300
  380. package/test/inject-pin-vector-crowd.test.js +225 -225
  381. package/test/inject-pools.test.js +195 -195
  382. package/test/inject-recall.test.js +172 -172
  383. package/test/inject-rotation.test.js +161 -161
  384. package/test/inject.test.js +553 -553
  385. package/test/issue-617-step1-query-and-fusion.test.js +361 -361
  386. package/test/kb-api-wiring.test.js +128 -128
  387. package/test/kb-collections.test.js +272 -272
  388. package/test/kb-routes.test.js +379 -379
  389. package/test/lang.test.js +98 -98
  390. package/test/lastrunat-persist.test.js +101 -101
  391. package/test/lib-smoke.test.js +116 -116
  392. package/test/llm-audit.test.js +815 -815
  393. package/test/llm-message-source.test.js +207 -207
  394. package/test/local-embedder.test.js +292 -292
  395. package/test/maintenance.test.js +501 -501
  396. package/test/mcp-stdio.test.js +385 -385
  397. package/test/mint-source.test.js +311 -311
  398. package/test/mirror-dirty.test.js +424 -424
  399. package/test/mirror-edit-digest.test.js +187 -187
  400. package/test/mirror-generation.test.js +499 -499
  401. package/test/mirror-types.test.js +208 -208
  402. package/test/mirror.test.js +249 -249
  403. package/test/narrative-bars.test.js +162 -162
  404. package/test/organize-tool.test.js +232 -232
  405. package/test/organize.test.js +418 -418
  406. package/test/panel-chart-scale.test.js +90 -90
  407. package/test/panel-tokens.test.js +245 -245
  408. package/test/peak-hours-observability.test.js +70 -70
  409. package/test/peer-blockers.test.js +193 -193
  410. package/test/persona-addressing.test.js +83 -83
  411. package/test/persona-api.test.js +172 -172
  412. package/test/persona-by-session.test.js +568 -568
  413. package/test/persona-flag.test.js +36 -36
  414. package/test/persona-inject.test.js +145 -145
  415. package/test/persona-settings.test.js +198 -198
  416. package/test/pipeline-activities.test.js +155 -155
  417. package/test/pipeline-attribution.test.js +175 -175
  418. package/test/pipeline-command.test.js +243 -243
  419. package/test/pipeline-confirm.test.js +148 -148
  420. package/test/pipeline-exec.test.js +172 -172
  421. package/test/pipeline-nudge-auto.test.js +248 -248
  422. package/test/pipeline-nudge.test.js +1278 -1278
  423. package/test/pipeline-observations.test.js +157 -157
  424. package/test/pipeline-observe.test.js +127 -127
  425. package/test/pipeline-r1r2.test.js +278 -278
  426. package/test/pipeline-runner.test.js +468 -468
  427. package/test/pipeline-runs.test.js +767 -767
  428. package/test/pipeline.test.js +636 -636
  429. package/test/placement.test.js +36 -36
  430. package/test/policy-epoch.test.js +259 -259
  431. package/test/pre-inject-gate.test.js +444 -444
  432. package/test/profile-extract.test.js +269 -269
  433. package/test/profile-facts.test.js +492 -492
  434. package/test/prompt-stance.test.js +128 -128
  435. package/test/provenance-http.test.js +367 -367
  436. package/test/publish-gate.test.js +272 -272
  437. package/test/quality-backfill.test.js +290 -290
  438. package/test/quality-filter.test.js +295 -295
  439. package/test/readme-claims.test.js +113 -113
  440. package/test/reasoning-effort.test.js +752 -752
  441. package/test/recall-anti-update.test.js +82 -82
  442. package/test/recall-evals.test.js +253 -253
  443. package/test/recall-layer.test.js +326 -326
  444. package/test/recall-retention.test.js +128 -128
  445. package/test/recall-stats.test.js +274 -274
  446. package/test/receipt-chain.test.js +451 -451
  447. package/test/reclaim-http.test.js +209 -209
  448. package/test/reflection-update-gate.test.js +129 -129
  449. package/test/reflection.test.js +226 -226
  450. package/test/reindex-backfill.test.js +475 -475
  451. package/test/reindex-scheduler.test.js +369 -369
  452. package/test/release-docs.test.js +156 -156
  453. package/test/release-notes.test.js +265 -265
  454. package/test/release-workflow.test.js +93 -93
  455. package/test/reranker-single-logit.test.js +73 -73
  456. package/test/reranker.test.js +197 -197
  457. package/test/resident-status.test.js +83 -83
  458. package/test/route-policy.test.js +113 -113
  459. package/test/runtime-adopt.test.js +206 -206
  460. package/test/runtime-cli.test.js +89 -89
  461. package/test/runtime-closure.test.js +193 -193
  462. package/test/runtime-download.test.js +302 -302
  463. package/test/runtime-layout.test.js +163 -163
  464. package/test/runtime-loader.test.js +255 -255
  465. package/test/runtime-manifest.test.js +159 -159
  466. package/test/runtime-model-fetch.test.js +348 -348
  467. package/test/runtime-provision.test.js +101 -101
  468. package/test/runtime-tarball.test.js +81 -81
  469. package/test/runtime-verify.test.js +319 -319
  470. package/test/scope-candidates.test.js +491 -491
  471. package/test/scope-distill-stamp.test.js +134 -134
  472. package/test/scope-explicit.test.js +452 -452
  473. package/test/scope-inject-soft.test.js +106 -106
  474. package/test/scope-optional-service.test.js +110 -110
  475. package/test/scope-retrieval.test.js +197 -197
  476. package/test/scope-state.test.js +610 -610
  477. package/test/scope-storage.test.js +255 -255
  478. package/test/scope-strict.test.js +367 -367
  479. package/test/search-fusion.test.js +90 -90
  480. package/test/security-doc.test.js +188 -188
  481. package/test/semantic.test.js +124 -124
  482. package/test/sensitive-scan.test.js +251 -251
  483. package/test/serve-bin.test.js +121 -121
  484. package/test/serve.test.js +258 -258
  485. package/test/service-search.test.js +174 -174
  486. package/test/service.test.js +410 -410
  487. package/test/session-gate.test.js +264 -264
  488. package/test/session-usage.test.js +317 -317
  489. package/test/settings.test.js +273 -273
  490. package/test/share-foreign-rows.test.js +144 -144
  491. package/test/share-http.test.js +144 -144
  492. package/test/share-import.test.js +577 -577
  493. package/test/share-imported-guard.test.js +311 -311
  494. package/test/share-imported-identity.test.js +111 -111
  495. package/test/share-pack.test.js +511 -511
  496. package/test/share-receive-http.test.js +756 -756
  497. package/test/share-routes.test.js +337 -337
  498. package/test/share-store.test.js +133 -133
  499. package/test/share-validate.test.js +101 -101
  500. package/test/skip-invalid-restore.test.js +262 -262
  501. package/test/sleep-action-set.test.js +441 -441
  502. package/test/sleep-catchup.test.js +315 -315
  503. package/test/sleep-failure-backoff.test.js +156 -156
  504. package/test/sleep-heat.test.js +174 -174
  505. package/test/sleep-scheduler-rearm.test.js +89 -89
  506. package/test/sleep.test.js +1455 -1455
  507. package/test/standalone-api.test.js +1344 -1344
  508. package/test/store-vector-cache.test.js +98 -98
  509. package/test/store-write-path-columns.test.js +191 -191
  510. package/test/store.test.js +744 -744
  511. package/test/stress.test.js +209 -209
  512. package/test/summarize-occurred-at.test.js +127 -127
  513. package/test/summarize-parse-diagnostics.test.js +75 -75
  514. package/test/summarize-reasoning-effort.test.js +189 -189
  515. package/test/summarize.test.js +2251 -2251
  516. package/test/supersede-state-tracking.test.js +394 -394
  517. package/test/test-count-sync.test.js +71 -71
  518. package/test/tool-state-ignore.test.js +65 -65
  519. package/test/tools-dto-schema-matrix.test.js +398 -398
  520. package/test/tools-memory-get-schema.test.js +65 -65
  521. package/test/tools.test.js +585 -585
  522. package/test/updated-at-semantics.test.js +113 -113
  523. package/test/user-settings-preview.test.js +127 -127
  524. package/test/user-settings-segments.test.js +527 -527
  525. package/test/vector-index.test.js +334 -334
  526. package/test/version-check.test.js +152 -152
  527. package/test/webServer-optional.test.js +82 -82
  528. package/test/wiki-api.test.js +734 -734
  529. package/test/wiki-claims.test.js +194 -194
  530. package/test/wiki-cli-hint.test.js +118 -118
  531. package/test/wiki-inject.test.js +265 -265
  532. package/test/wiki-partition.test.js +112 -112
  533. package/test/wiki-plan.test.js +80 -80
  534. package/test/wiki-provenance.test.js +202 -202
  535. package/test/wiki-queries.test.js +398 -398
  536. package/test/wiki-scan.test.js +208 -208
  537. package/test/wiki-store.test.js +190 -190
  538. package/test/wiki-t0.test.js +456 -456
  539. package/test/wiki-t1-jobs.test.js +125 -125
  540. package/test/wiki-t1.test.js +460 -460
  541. package/test/wiki-tools.test.js +176 -176
  542. package/test/workflow-guards.test.js +155 -155
  543. package/test/write-admission.test.js +668 -668
package/docs/FORGET.md CHANGED
@@ -1,77 +1,77 @@
1
- # 选择性遗忘与事实更正(#532)
2
-
3
- > 这篇回答 #532 的三个确认请求:现象的根因链、当前机制能承诺什么、以及修复方向需要维护者拍板的取舍。全部结论出自 `main`(514d238)源码逐行核实与一个**零 LLM 的合成轨迹**——不需要真实用户库,任何人按 §4 的步骤能在空库上重现同一结构性结果。
4
-
5
- ## 1. 现象与根因链
6
-
7
- #532 的观察:更正两个事实(颜色 + 整理时间)→ 只要求忘掉颜色 → 新对话里颜色确实不知道,**但整理时间答回了更正前的旧值**。
8
-
9
- 根因是三段机制的接缝,每一段单独看都符合自己的契约:
10
-
11
- 1. **更正落成新行,旧行保持活跃。** `autoSummarize` 写入走 `saveWithDedupe` 的 `(type, title, scope)` 三元组去重——更正行的标题与原行不同(蒸馏器按内容起标题),去重不命中,于是**同一事实的两个版本同时活跃**。会清理这种并存的是 dream 的冲突裁决(loser 归档)——但它是阈值门控的(`dreamThresholdCount` 默认 100,#532 现场 13 条、`dream_runs` 0 行,裁决从未运行)。`summarizeDedupeMode`(#127,默认 off)帮不上:它只在**同会话**的时间窗内并(`findSessionDuplicate` 按 `type+source+时间窗` 找候选),而 #532 的更正发生在另一个会话。
12
- 2. **`memory_forget` 是行粒度的。** 它按 ID 翻 `forgotten` 标志(抑制注入/检索/列表,原文留存可恢复)——这是接口契约,**不是**「忘掉某个事实」:事实散在几行里,它就只管被点名的那一行。#532 的更正把两个新值合流在一行(蒸馏器把「颜色改成浅橙色 + 时间改成周六 09:00」写进同一条),忘掉「颜色」的操作抑制了这一行,**新的整理时间跟它一起退出可见面**。
13
- 3. **旧值行成了唯一幸存的载体。** 旧值(雾蓝色 + 周三 20:00)至少还活在另一行里(6 次蒸馏 × 每次 ≤3 条 = 13 行的库完全装得下独立的旧时间行)。新值行被抑制后,检索/注入面只剩旧值行——模型如实回答了它唯一能看到的东西。旧值行里同样有旧颜色,模型答「不知道颜色」是因为该行也已被抑制(或未入召回窗)——两半行为各自都有解释,合起来才是「保留的更正事实答回旧值」。
14
-
15
- **一句话定性:这不是某一行写错了,而是「更正的失效关系」在 dream 第一次运行之前根本不存在。** 旧行与新行之间没有任何持久链接,任何一方的隐藏都不会波及另一方;趁虚而入的是结构,不是某个 bug 的触发。
16
-
17
- ## 2. 三个确认请求的源码级回答
18
-
19
- **Q1:更正两个事实、只忘一个时,推荐怎样保住另一个?**
20
-
21
- 当前机制下的推荐做法(不需要新配置):
22
-
23
- - **更正时点名旧行**:用 `memory_update` 直接改原行的内容(同标题走 `saveWithDedupe` 的更新分支,`content_history` 留痕),或用 `memory_archive` 归档旧行后再让新事实自然入库——归档可恢复,且两行不再并存。
24
- - **遗忘时按行操作并核对行内容**:`memory_forget` 之前先 `memory_get` 看这一行还装着什么;一行装着多个要分开处置的事实时,`memory_update` 先拆、再对单行遗忘。
25
- - 工具描述已补一句行粒度警示(本 PR):模型在「忘掉 X」的请求下,应当先意识到一行可能载着多个事实,并在回复里说清它抑制的是哪一行、连带了什么。
26
-
27
- **Q2:更正所取代的旧事实,有没有持久失效关系,使隐藏新条目后旧值不会重新成为当前答案?**
28
-
29
- **没有——这是插件层面的真实缺口,不是配置遗漏。** 失效关系今天只存在于两处:① `memory_register_document` 的同路径/同标题 supersede(#230,只覆盖 document 行);② dream 冲突裁决的 loser 归档(阈值门控)。普通蒸馏行在 dream 第一次运行之前,旧行与新行之间**没有任何链接**。历史回溯与「当前答案」也因此无法区分:检索面对两行一视同仁,先后关系只体现在 `updated_at` 的排序权重里——模型答对(如 #532 对话 C)靠的是模型自己对比两行,不是机制保证。
30
-
31
- **Q3:配置是否遗漏了该语义必需的原生设置?**
32
-
33
- 没有。`lightMode` / 阈值配置都在正常范围内;0.9.5 的已发变更(溯源读出口 #509、蒸馏围栏 #501、merge 逃生门 #521 等)都不触碰这条接缝。**#532 报告的现象在当前 main 上结构性地成立**,与 0.9.4 还是 0.9.5 无关。
34
-
35
- ## 3. 修复方向的取舍(需要维护者拍板,本 PR 不擅自实现)
36
-
37
- | 方向 | 能修掉什么 | 代价 / 风险 |
38
- |---|---|---|
39
- | **A. 蒸馏提示词拆分粒度**(一事实一条) | 合流行被整条遗忘的连带伤 | 提示词级、行为面全变;行数增多(注入预算/检索排序全受影响);LLM 遵从度不确定 |
40
- | **B. 写侧更正失效关系**(蒸馏窗口内识别「同主题改值」→ 归档被取代行) | Q2 的缺口本体 | 「同主题」判据是 LLM 判断(dream 冲突裁决同款),放写入热路径要配阈值与误杀面测量——正是 dream 已经在做的事,重复建一套不如把 dream 的触发条件前移 |
41
- | **C. dream 触发前移**(更正类写入直接计 dream 优先级 / 降低阈值) | 让现成的裁决机制更早介入 | dream 有成本(LLM 调用);「更正类写入」的确定性判据同样不存在 |
42
- | **D. 遗忘回执带同侪提示**(`memory_forget` 答复列出同 type+scope 的高相似活跃行) | 让模型在遗忘当下看到「别处还有旧值」 | 相似度判据要么依赖嵌入(可能未配)、要么是弱启发(误报面要测);对已发生的遗忘只是事后提示 |
43
-
44
- 本 PR 只落地了零争议的一小块(工具描述的行粒度警示,见 §5);A–D 的取舍涉及 LLM 判断进入哪条路径、误杀面怎么量,按 R2/R3 纪律停下等人拍板。
45
-
46
- ## 4. 有界复测的最小合成轨迹(零 LLM)
47
-
48
- 不依赖任何模型行为,直接用存储/服务层复现「更正落新行 → 遗忘新行 → 旧值行幸存」:
49
-
50
- ```js
51
- // 空库;严格 scope 不影响本现象,默认配置即可
52
- const store = createStore(":memory:");
53
- const service = createService({ store, mirror: null, config: {} });
54
- // ① 原始陈述(模拟对话 A 的蒸馏产物:颜色 + 时间合流一行)
55
- const r1 = service.saveWithDedupe({ type: "preference", title: "纸模工具的收纳与整理",
56
- content: "纸模工具放在雾蓝色收纳盒,每周三晚上八点整理一次", importance: 3 });
57
- // ② 更正(模拟对话 B:标题由蒸馏器另起 → 三元组不命中 → 新行)
58
- const r2 = service.saveWithDedupe({ type: "preference", title: "收纳盒颜色与整理时间的更正",
59
- content: "收纳盒换成浅橙色,整理时间改为每周六上午九点", importance: 3 });
60
- // ③ 结构断言:两行同时活跃,二者之间没有任何失效链接
61
- const activeCount = () => store.db.prepare(
62
- "SELECT COUNT(*) AS n FROM memories WHERE forgotten = 0 AND archived = 0"
63
- ).get().n;
64
- assert.equal(activeCount(), 2);
65
- // ④ 「忘掉颜色」= 按行遗忘新值行(模型在 R1/R2 里看到的颜色载体)
66
- service.setForget(r2.memory.id, true);
67
- // ⑤ 现象复现:新值行退出注入/检索面后,旧值行仍是唯一幸存载体
68
- assert.equal(store.getById(r1.memory.id).forgotten, false, "旧行从未被任何机制波及");
69
- assert.match(store.getById(r1.memory.id).content, /每周三晚上八点/, "旧值仍在召回面");
70
- ```
71
-
72
- 完整可跑版本见 `test/forget-corrections.test.js`(本 PR 附),其中 ④⑤ 两条断言就是 #532 现象的存储层等价物——机制修复(§3 的 B/C)落地时,这条测试的 ⑤ 应当翻转:更正行写入后,旧行要么被记上失效关系、要么退出活跃面;遗忘新行不应让旧值重新成为「当前答案」。
73
-
74
- ## 5. 本 PR 落地的零争议部分
75
-
76
- - **`memory_forget` 工具描述补行粒度警示**(`src/tools.js`):「抑制的是**一行**——多个事实合流在同一行里时,它们会一起退出可见面;请求只针对其中一个事实时,先看行内容、用 `memory_update` 拆分或在回复里说清连带了什么」。这是 #532 对话 5 里模型误用工具的直接对策:请求的语义粒度(一个事实)与工具的能力粒度(一行)之间的落差,模型无从得知,除非描述告诉它。
77
- - **本文档**与 §4 的合成轨迹测试。
1
+ # 选择性遗忘与事实更正(#532)
2
+
3
+ > 这篇回答 #532 的三个确认请求:现象的根因链、当前机制能承诺什么、以及修复方向需要维护者拍板的取舍。全部结论出自 `main`(514d238)源码逐行核实与一个**零 LLM 的合成轨迹**——不需要真实用户库,任何人按 §4 的步骤能在空库上重现同一结构性结果。
4
+
5
+ ## 1. 现象与根因链
6
+
7
+ #532 的观察:更正两个事实(颜色 + 整理时间)→ 只要求忘掉颜色 → 新对话里颜色确实不知道,**但整理时间答回了更正前的旧值**。
8
+
9
+ 根因是三段机制的接缝,每一段单独看都符合自己的契约:
10
+
11
+ 1. **更正落成新行,旧行保持活跃。** `autoSummarize` 写入走 `saveWithDedupe` 的 `(type, title, scope)` 三元组去重——更正行的标题与原行不同(蒸馏器按内容起标题),去重不命中,于是**同一事实的两个版本同时活跃**。会清理这种并存的是 dream 的冲突裁决(loser 归档)——但它是阈值门控的(`dreamThresholdCount` 默认 100,#532 现场 13 条、`dream_runs` 0 行,裁决从未运行)。`summarizeDedupeMode`(#127,默认 off)帮不上:它只在**同会话**的时间窗内并(`findSessionDuplicate` 按 `type+source+时间窗` 找候选),而 #532 的更正发生在另一个会话。
12
+ 2. **`memory_forget` 是行粒度的。** 它按 ID 翻 `forgotten` 标志(抑制注入/检索/列表,原文留存可恢复)——这是接口契约,**不是**「忘掉某个事实」:事实散在几行里,它就只管被点名的那一行。#532 的更正把两个新值合流在一行(蒸馏器把「颜色改成浅橙色 + 时间改成周六 09:00」写进同一条),忘掉「颜色」的操作抑制了这一行,**新的整理时间跟它一起退出可见面**。
13
+ 3. **旧值行成了唯一幸存的载体。** 旧值(雾蓝色 + 周三 20:00)至少还活在另一行里(6 次蒸馏 × 每次 ≤3 条 = 13 行的库完全装得下独立的旧时间行)。新值行被抑制后,检索/注入面只剩旧值行——模型如实回答了它唯一能看到的东西。旧值行里同样有旧颜色,模型答「不知道颜色」是因为该行也已被抑制(或未入召回窗)——两半行为各自都有解释,合起来才是「保留的更正事实答回旧值」。
14
+
15
+ **一句话定性:这不是某一行写错了,而是「更正的失效关系」在 dream 第一次运行之前根本不存在。** 旧行与新行之间没有任何持久链接,任何一方的隐藏都不会波及另一方;趁虚而入的是结构,不是某个 bug 的触发。
16
+
17
+ ## 2. 三个确认请求的源码级回答
18
+
19
+ **Q1:更正两个事实、只忘一个时,推荐怎样保住另一个?**
20
+
21
+ 当前机制下的推荐做法(不需要新配置):
22
+
23
+ - **更正时点名旧行**:用 `memory_update` 直接改原行的内容(同标题走 `saveWithDedupe` 的更新分支,`content_history` 留痕),或用 `memory_archive` 归档旧行后再让新事实自然入库——归档可恢复,且两行不再并存。
24
+ - **遗忘时按行操作并核对行内容**:`memory_forget` 之前先 `memory_get` 看这一行还装着什么;一行装着多个要分开处置的事实时,`memory_update` 先拆、再对单行遗忘。
25
+ - 工具描述已补一句行粒度警示(本 PR):模型在「忘掉 X」的请求下,应当先意识到一行可能载着多个事实,并在回复里说清它抑制的是哪一行、连带了什么。
26
+
27
+ **Q2:更正所取代的旧事实,有没有持久失效关系,使隐藏新条目后旧值不会重新成为当前答案?**
28
+
29
+ **没有——这是插件层面的真实缺口,不是配置遗漏。** 失效关系今天只存在于两处:① `memory_register_document` 的同路径/同标题 supersede(#230,只覆盖 document 行);② dream 冲突裁决的 loser 归档(阈值门控)。普通蒸馏行在 dream 第一次运行之前,旧行与新行之间**没有任何链接**。历史回溯与「当前答案」也因此无法区分:检索面对两行一视同仁,先后关系只体现在 `updated_at` 的排序权重里——模型答对(如 #532 对话 C)靠的是模型自己对比两行,不是机制保证。
30
+
31
+ **Q3:配置是否遗漏了该语义必需的原生设置?**
32
+
33
+ 没有。`lightMode` / 阈值配置都在正常范围内;0.9.5 的已发变更(溯源读出口 #509、蒸馏围栏 #501、merge 逃生门 #521 等)都不触碰这条接缝。**#532 报告的现象在当前 main 上结构性地成立**,与 0.9.4 还是 0.9.5 无关。
34
+
35
+ ## 3. 修复方向的取舍(需要维护者拍板,本 PR 不擅自实现)
36
+
37
+ | 方向 | 能修掉什么 | 代价 / 风险 |
38
+ |---|---|---|
39
+ | **A. 蒸馏提示词拆分粒度**(一事实一条) | 合流行被整条遗忘的连带伤 | 提示词级、行为面全变;行数增多(注入预算/检索排序全受影响);LLM 遵从度不确定 |
40
+ | **B. 写侧更正失效关系**(蒸馏窗口内识别「同主题改值」→ 归档被取代行) | Q2 的缺口本体 | 「同主题」判据是 LLM 判断(dream 冲突裁决同款),放写入热路径要配阈值与误杀面测量——正是 dream 已经在做的事,重复建一套不如把 dream 的触发条件前移 |
41
+ | **C. dream 触发前移**(更正类写入直接计 dream 优先级 / 降低阈值) | 让现成的裁决机制更早介入 | dream 有成本(LLM 调用);「更正类写入」的确定性判据同样不存在 |
42
+ | **D. 遗忘回执带同侪提示**(`memory_forget` 答复列出同 type+scope 的高相似活跃行) | 让模型在遗忘当下看到「别处还有旧值」 | 相似度判据要么依赖嵌入(可能未配)、要么是弱启发(误报面要测);对已发生的遗忘只是事后提示 |
43
+
44
+ 本 PR 只落地了零争议的一小块(工具描述的行粒度警示,见 §5);A–D 的取舍涉及 LLM 判断进入哪条路径、误杀面怎么量,按 R2/R3 纪律停下等人拍板。
45
+
46
+ ## 4. 有界复测的最小合成轨迹(零 LLM)
47
+
48
+ 不依赖任何模型行为,直接用存储/服务层复现「更正落新行 → 遗忘新行 → 旧值行幸存」:
49
+
50
+ ```js
51
+ // 空库;严格 scope 不影响本现象,默认配置即可
52
+ const store = createStore(":memory:");
53
+ const service = createService({ store, mirror: null, config: {} });
54
+ // ① 原始陈述(模拟对话 A 的蒸馏产物:颜色 + 时间合流一行)
55
+ const r1 = service.saveWithDedupe({ type: "preference", title: "纸模工具的收纳与整理",
56
+ content: "纸模工具放在雾蓝色收纳盒,每周三晚上八点整理一次", importance: 3 });
57
+ // ② 更正(模拟对话 B:标题由蒸馏器另起 → 三元组不命中 → 新行)
58
+ const r2 = service.saveWithDedupe({ type: "preference", title: "收纳盒颜色与整理时间的更正",
59
+ content: "收纳盒换成浅橙色,整理时间改为每周六上午九点", importance: 3 });
60
+ // ③ 结构断言:两行同时活跃,二者之间没有任何失效链接
61
+ const activeCount = () => store.db.prepare(
62
+ "SELECT COUNT(*) AS n FROM memories WHERE forgotten = 0 AND archived = 0"
63
+ ).get().n;
64
+ assert.equal(activeCount(), 2);
65
+ // ④ 「忘掉颜色」= 按行遗忘新值行(模型在 R1/R2 里看到的颜色载体)
66
+ service.setForget(r2.memory.id, true);
67
+ // ⑤ 现象复现:新值行退出注入/检索面后,旧值行仍是唯一幸存载体
68
+ assert.equal(store.getById(r1.memory.id).forgotten, false, "旧行从未被任何机制波及");
69
+ assert.match(store.getById(r1.memory.id).content, /每周三晚上八点/, "旧值仍在召回面");
70
+ ```
71
+
72
+ 完整可跑版本见 `test/forget-corrections.test.js`(本 PR 附),其中 ④⑤ 两条断言就是 #532 现象的存储层等价物——机制修复(§3 的 B/C)落地时,这条测试的 ⑤ 应当翻转:更正行写入后,旧行要么被记上失效关系、要么退出活跃面;遗忘新行不应让旧值重新成为「当前答案」。
73
+
74
+ ## 5. 本 PR 落地的零争议部分
75
+
76
+ - **`memory_forget` 工具描述补行粒度警示**(`src/tools.js`):「抑制的是**一行**——多个事实合流在同一行里时,它们会一起退出可见面;请求只针对其中一个事实时,先看行内容、用 `memory_update` 拆分或在回复里说清连带了什么」。这是 #532 对话 5 里模型误用工具的直接对策:请求的语义粒度(一个事实)与工具的能力粒度(一行)之间的落差,模型无从得知,除非描述告诉它。
77
+ - **本文档**与 §4 的合成轨迹测试。
package/docs/KB.md CHANGED
@@ -1,110 +1,110 @@
1
- # 知识库(Knowledge base,第二层)
2
-
3
- 给 agent 一个「用户自己的参考资料」检索面:本地文件、网页、仓库地志页进来,分块后用 BM25 检索。
4
- 与记忆库(第一层)**物理隔离**——它不是记忆,不参与注入、不参与巩固、不参与质量过滤。
5
-
6
- ## 职责边界
7
-
8
- **它是**:一个只读给模型的语料检索面(三个只读工具)+ 一组面板可管理的集合/文档(写路由)。
9
- **它不是**:文件的真源、向量库、记忆库的旁支。
10
-
11
- - 真源在 SQLite 的 `kb_*` 三张表里,**不在磁盘上**。用户随时可能把原文件挪走或删掉,
12
- 检索面不能跟着消失——所以 `readDoc` 从库里拼回正文,读侧零 IO(`src/kb/index.js` 顶部有同样的话)。
13
- - 与 chorography 的区别:地志以盘上的 MD 为真源(重扫即重建),知识库收的是外来原文的副本。
14
- - **绝不写 `memories`**,也绝不进 `saveWithDedupe` / `dream` / 质量过滤的任何行池。
15
- 这条与 wiki 行同源,是 §3.3 的红线;`test/kb-collections.test.js` 第一条用例钉它。
16
-
17
- ## 对外接口
18
-
19
- ### 程序面(`src/kb/index.js`)
20
-
21
- ```js
22
- const kb = createKb({ store, embedder = null, cfg = {} });
23
- ```
24
-
25
- | 方法 | 形状 |
26
- |---|---|
27
- | `listCollections()` | `[{key,title,description,docs,chunks,updatedAt}]` |
28
- | `upsertCollection({key,title,description})` | `{key,title,description}`;同 key 再调 = 改名,`created_at` 不动 |
29
- | `deleteCollection(key)` | `boolean`;连带删它的文档与分块(一个事务,不留孤儿行) |
30
- | `listDocs({collection})` | `[{relKey,kind,title,bytes,indexedAt,status,error}]` |
31
- | `ingest({collection,kind,source,title?})` | `{docId,chunks,skipped,error?}` |
32
- | `search({query,collection?,limit?})` | `{hits:[{collection,relKey,title,heading,line,excerpt,score}],unreadable:[]}` |
33
- | `readDoc({collection,relKey})` | `{title,content,kind,relKey,status,error}` 或 `null` |
34
- | `dispose()` | 清索引缓存;可重复调用,不丢数据 |
35
-
36
- `kind` 三选一:`file` / `url` / `choro_page`。`url` 走 `fetch`;`choro_page` 的 `source`
37
- 就是该地志页 MD 的**绝对路径**,读取路径与 `file` 完全一致——不为它去跨域读 `choro_*` 表,
38
- 那会把两条线的写作用域搅在一起。
39
-
40
- ### HTTP 面(`src/kb/routes.js`,契约 §3.6)
41
-
42
- | 方法 | 路径 | policy |
43
- |---|---|---|
44
- | GET | `/api/dsh-mneme/kb/collections` | `token-write`(与 POST/DELETE 同路径,取更严的) |
45
- | POST | `/api/dsh-mneme/kb/collections` `{key,title,description}` | 同上 |
46
- | DELETE | `/api/dsh-mneme/kb/collections?key=<key>` | 同上 |
47
- | GET | `/api/dsh-mneme/kb/docs?collection=<key>` | `token` |
48
- | GET | `/api/dsh-mneme/kb/doc?collection=<key>&relKey=<rel>` | `token` |
49
- | POST | `/api/dsh-mneme/kb/ingest` `{collection,kind,source,title?}` | `token-write` |
50
- | POST | `/api/dsh-mneme/kb/search` `{query,collection?,limit?}` | `token-write` |
51
-
52
- `/kb/collections` 一条路径上读和写混着,只能声明一个 policy,取更严的 `token-write`
53
- (与 `/profile` 同款)。`register` 对同一 `kind+path` 重复登记直接抛错,所以不能拆两条。
54
-
55
- **状态码语义**(面板据此渲染,改之前先想清楚空态):
56
-
57
- - `409 {error:"disabled",reason:"kb-not-enabled"}` — 开关没开。判定在 `src/api.js` 的 `kbGate`,
58
- 本模块**不自己判** `cfg.kbEnabled`(一处判定,不两处分叉)。
59
- - `503 {error:"unavailable"}` — 开了开关但 kb 没装配(headless / 测试)。#497 先例:503 = 环境缺件,409 = 用户没开。
60
- - `404 {error:"collection-not-found"}` — 入库目标集合不存在。**不静默建集合**:拼错的 key
61
- 会把资料塞进一个凭空出现的集合,用户永远找不到。
62
- - `404 {error:"doc-not-found"}` — 读整篇查不到。
63
- - `400` — 缺必填字段 / `bad-kind` / `query-required`。
64
- - 入库**来源级**失败(`file-not-found` / `too-large` / `http-404` …)回 **200 + `ok:false` + `error`**,
65
- 不是 4xx。理由:`kb_docs` 里已经落了 `status='error'` 的留痕行,面板要能显示「这份为什么没进来」;
66
- 回 4xx 会让面板把它当成「请求本身错了」而丢掉那条记录。
67
-
68
- ### 模型面(`src/kb/tools.js`)
69
-
70
- 三个**只读**工具,返回 `defineTool()` 兼容的描述对象数组,由 `src/tools.js` 在
71
- `kbEnabled` 为真时展开进自己的数组(本文件不 import `defineTool`,装配顺序与开关归调用方):
72
-
73
- - `kb_list_collections` — 集合清单 + 文档/分块数。
74
- - `kb_search` — BM25 检索,回 `collection/relKey/heading/line/excerpt`。
75
- - `kb_read_doc` — 按 `collection + relKey` 读整篇。
76
-
77
- 写操作一个都不给模型:建集合、入库都是用户在面板上按的按钮。知识库收的是用户自己的资料,
78
- 模型不该有权决定往里塞什么(与 chorography「生成只走 CLI」同一条红线)。
79
-
80
- ## 内部文件
81
-
82
- - `src/kb/index.js` — `createKb`、切块(`chunkContent`)、检索(`search`)、读整篇。
83
- - `src/kb/routes.js` — `registerKbRoutes`,七个 handler 全在这里。
84
- - `src/kb/tools.js` — `kbToolDefinitions`,三个工具描述对象 + render。
85
- - `src/store.js` — `kb_collections` / `kb_docs` / `kb_chunks` 三张表与十个 `kb*` 方法
86
- (`kbCollectionByKey` / `listKbCollections` / `upsertKbCollection` / `deleteKbCollection` /
87
- `listKbDocs` / `kbDocByRelKey` / `kbChunksByDoc` / `replaceKbDoc` / `markKbDocError` /
88
- `kbChunksForSearch`)。
89
- - `test/kb-collections.test.js` — 建表/集合/幂等/重切块/检索/readDoc/失败留痕/dispose。
90
- - `test/kb-routes.test.js` — 路由表形状/policy/状态码/工具描述对象。
91
-
92
- ## 已知坑(都是踩过或刻意设计成这样的)
93
-
94
- 1. **切块必须严格按行连续、一个空行都不剥**。这是 `readDoc` 能逐字节还原原文、以及
95
- `search` 能回算准确行号(起始行 = 1 + 前面所有块的行数)的**共同前提**。破坏它两件事一起坏。
96
- 空行不产生 token,对 BM25 的 `len` 分母零成本,剥它纯赔。
97
- 2. **幂等判据是正文 sha256,不是 mtime / size**。同 rel_key + 同 sha256 = 整件事 no-op
98
- (回执 `skipped:true`,`chunks` 是库里现有块数)。否则编辑器保存一次(mtime 变、内容没变)
99
- 就要全量重切块,库和索引一起白忙。上一版 `status='error'` 的行不算命中——重来必须真跑。
100
- 3. **`## ` 是唯一的节边界**。一级标题 `# ` 不切节,它属于文件头那一块。这就是为什么
101
- `## 部署` 那块的起始行是标题自己的行号,而不是上一行。
102
- 4. **不带 `return` 的 `readBody().then(...)` 会吞掉回执**。handler 里凡是异步的那几条
103
- (collections 的 POST、ingest、search)都必须把 Promise 整条链 `return` 出去;不 return 的话
104
- 请求会在响应发出之前就「完成」,面板拿到空 body。choro/search 踩过同一个坑
105
- (`src/api.js:2787-2788` 有注释)。
106
- 5. **索引缓存按集合懒物化,写路径必须 `invalidate`**。`ingest` / `upsertCollection` /
107
- `deleteCollection` 都会失效对应缓存(`markKbDocError` 走的是同一处)。漏一处 = 检索命中
108
- 已删除的段落。
109
- 6. **Windows 上临时目录会被 Defender 短暂持锁**,`rmSync` 撞 `EPERM` 是抖动不是失败,
110
- 测试里用 `rmTempEventually` 重试(与 `test/wiki-store.test.js` 同源)。
1
+ # 知识库(Knowledge base,第二层)
2
+
3
+ 给 agent 一个「用户自己的参考资料」检索面:本地文件、网页、仓库地志页进来,分块后用 BM25 检索。
4
+ 与记忆库(第一层)**物理隔离**——它不是记忆,不参与注入、不参与巩固、不参与质量过滤。
5
+
6
+ ## 职责边界
7
+
8
+ **它是**:一个只读给模型的语料检索面(三个只读工具)+ 一组面板可管理的集合/文档(写路由)。
9
+ **它不是**:文件的真源、向量库、记忆库的旁支。
10
+
11
+ - 真源在 SQLite 的 `kb_*` 三张表里,**不在磁盘上**。用户随时可能把原文件挪走或删掉,
12
+ 检索面不能跟着消失——所以 `readDoc` 从库里拼回正文,读侧零 IO(`src/kb/index.js` 顶部有同样的话)。
13
+ - 与 chorography 的区别:地志以盘上的 MD 为真源(重扫即重建),知识库收的是外来原文的副本。
14
+ - **绝不写 `memories`**,也绝不进 `saveWithDedupe` / `dream` / 质量过滤的任何行池。
15
+ 这条与 wiki 行同源,是 §3.3 的红线;`test/kb-collections.test.js` 第一条用例钉它。
16
+
17
+ ## 对外接口
18
+
19
+ ### 程序面(`src/kb/index.js`)
20
+
21
+ ```js
22
+ const kb = createKb({ store, embedder = null, cfg = {} });
23
+ ```
24
+
25
+ | 方法 | 形状 |
26
+ |---|---|
27
+ | `listCollections()` | `[{key,title,description,docs,chunks,updatedAt}]` |
28
+ | `upsertCollection({key,title,description})` | `{key,title,description}`;同 key 再调 = 改名,`created_at` 不动 |
29
+ | `deleteCollection(key)` | `boolean`;连带删它的文档与分块(一个事务,不留孤儿行) |
30
+ | `listDocs({collection})` | `[{relKey,kind,title,bytes,indexedAt,status,error}]` |
31
+ | `ingest({collection,kind,source,title?})` | `{docId,chunks,skipped,error?}` |
32
+ | `search({query,collection?,limit?})` | `{hits:[{collection,relKey,title,heading,line,excerpt,score}],unreadable:[]}` |
33
+ | `readDoc({collection,relKey})` | `{title,content,kind,relKey,status,error}` 或 `null` |
34
+ | `dispose()` | 清索引缓存;可重复调用,不丢数据 |
35
+
36
+ `kind` 三选一:`file` / `url` / `choro_page`。`url` 走 `fetch`;`choro_page` 的 `source`
37
+ 就是该地志页 MD 的**绝对路径**,读取路径与 `file` 完全一致——不为它去跨域读 `choro_*` 表,
38
+ 那会把两条线的写作用域搅在一起。
39
+
40
+ ### HTTP 面(`src/kb/routes.js`,契约 §3.6)
41
+
42
+ | 方法 | 路径 | policy |
43
+ |---|---|---|
44
+ | GET | `/api/dsh-mneme/kb/collections` | `token-write`(与 POST/DELETE 同路径,取更严的) |
45
+ | POST | `/api/dsh-mneme/kb/collections` `{key,title,description}` | 同上 |
46
+ | DELETE | `/api/dsh-mneme/kb/collections?key=<key>` | 同上 |
47
+ | GET | `/api/dsh-mneme/kb/docs?collection=<key>` | `token` |
48
+ | GET | `/api/dsh-mneme/kb/doc?collection=<key>&relKey=<rel>` | `token` |
49
+ | POST | `/api/dsh-mneme/kb/ingest` `{collection,kind,source,title?}` | `token-write` |
50
+ | POST | `/api/dsh-mneme/kb/search` `{query,collection?,limit?}` | `token-write` |
51
+
52
+ `/kb/collections` 一条路径上读和写混着,只能声明一个 policy,取更严的 `token-write`
53
+ (与 `/profile` 同款)。`register` 对同一 `kind+path` 重复登记直接抛错,所以不能拆两条。
54
+
55
+ **状态码语义**(面板据此渲染,改之前先想清楚空态):
56
+
57
+ - `409 {error:"disabled",reason:"kb-not-enabled"}` — 开关没开。判定在 `src/api.js` 的 `kbGate`,
58
+ 本模块**不自己判** `cfg.kbEnabled`(一处判定,不两处分叉)。
59
+ - `503 {error:"unavailable"}` — 开了开关但 kb 没装配(headless / 测试)。#497 先例:503 = 环境缺件,409 = 用户没开。
60
+ - `404 {error:"collection-not-found"}` — 入库目标集合不存在。**不静默建集合**:拼错的 key
61
+ 会把资料塞进一个凭空出现的集合,用户永远找不到。
62
+ - `404 {error:"doc-not-found"}` — 读整篇查不到。
63
+ - `400` — 缺必填字段 / `bad-kind` / `query-required`。
64
+ - 入库**来源级**失败(`file-not-found` / `too-large` / `http-404` …)回 **200 + `ok:false` + `error`**,
65
+ 不是 4xx。理由:`kb_docs` 里已经落了 `status='error'` 的留痕行,面板要能显示「这份为什么没进来」;
66
+ 回 4xx 会让面板把它当成「请求本身错了」而丢掉那条记录。
67
+
68
+ ### 模型面(`src/kb/tools.js`)
69
+
70
+ 三个**只读**工具,返回 `defineTool()` 兼容的描述对象数组,由 `src/tools.js` 在
71
+ `kbEnabled` 为真时展开进自己的数组(本文件不 import `defineTool`,装配顺序与开关归调用方):
72
+
73
+ - `kb_list_collections` — 集合清单 + 文档/分块数。
74
+ - `kb_search` — BM25 检索,回 `collection/relKey/heading/line/excerpt`。
75
+ - `kb_read_doc` — 按 `collection + relKey` 读整篇。
76
+
77
+ 写操作一个都不给模型:建集合、入库都是用户在面板上按的按钮。知识库收的是用户自己的资料,
78
+ 模型不该有权决定往里塞什么(与 chorography「生成只走 CLI」同一条红线)。
79
+
80
+ ## 内部文件
81
+
82
+ - `src/kb/index.js` — `createKb`、切块(`chunkContent`)、检索(`search`)、读整篇。
83
+ - `src/kb/routes.js` — `registerKbRoutes`,七个 handler 全在这里。
84
+ - `src/kb/tools.js` — `kbToolDefinitions`,三个工具描述对象 + render。
85
+ - `src/store.js` — `kb_collections` / `kb_docs` / `kb_chunks` 三张表与十个 `kb*` 方法
86
+ (`kbCollectionByKey` / `listKbCollections` / `upsertKbCollection` / `deleteKbCollection` /
87
+ `listKbDocs` / `kbDocByRelKey` / `kbChunksByDoc` / `replaceKbDoc` / `markKbDocError` /
88
+ `kbChunksForSearch`)。
89
+ - `test/kb-collections.test.js` — 建表/集合/幂等/重切块/检索/readDoc/失败留痕/dispose。
90
+ - `test/kb-routes.test.js` — 路由表形状/policy/状态码/工具描述对象。
91
+
92
+ ## 已知坑(都是踩过或刻意设计成这样的)
93
+
94
+ 1. **切块必须严格按行连续、一个空行都不剥**。这是 `readDoc` 能逐字节还原原文、以及
95
+ `search` 能回算准确行号(起始行 = 1 + 前面所有块的行数)的**共同前提**。破坏它两件事一起坏。
96
+ 空行不产生 token,对 BM25 的 `len` 分母零成本,剥它纯赔。
97
+ 2. **幂等判据是正文 sha256,不是 mtime / size**。同 rel_key + 同 sha256 = 整件事 no-op
98
+ (回执 `skipped:true`,`chunks` 是库里现有块数)。否则编辑器保存一次(mtime 变、内容没变)
99
+ 就要全量重切块,库和索引一起白忙。上一版 `status='error'` 的行不算命中——重来必须真跑。
100
+ 3. **`## ` 是唯一的节边界**。一级标题 `# ` 不切节,它属于文件头那一块。这就是为什么
101
+ `## 部署` 那块的起始行是标题自己的行号,而不是上一行。
102
+ 4. **不带 `return` 的 `readBody().then(...)` 会吞掉回执**。handler 里凡是异步的那几条
103
+ (collections 的 POST、ingest、search)都必须把 Promise 整条链 `return` 出去;不 return 的话
104
+ 请求会在响应发出之前就「完成」,面板拿到空 body。choro/search 踩过同一个坑
105
+ (`src/api.js:2787-2788` 有注释)。
106
+ 5. **索引缓存按集合懒物化,写路径必须 `invalidate`**。`ingest` / `upsertCollection` /
107
+ `deleteCollection` 都会失效对应缓存(`markKbDocError` 走的是同一处)。漏一处 = 检索命中
108
+ 已删除的段落。
109
+ 6. **Windows 上临时目录会被 Defender 短暂持锁**,`rmSync` 撞 `EPERM` 是抖动不是失败,
110
+ 测试里用 `rmTempEventually` 重试(与 `test/wiki-store.test.js` 同源)。