@modusensus/dsh-mneme 0.13.0 → 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 -828
  3. package/assets/icon.svg +3 -3
  4. package/bin/cli.mjs +964 -964
  5. package/bin/dsh-mneme-choro.mjs +262 -254
  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 -402
  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 -3394
  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 -13436
  33. package/lib/commands.js +95 -95
  34. package/lib/config-keys.js +144 -144
  35. package/lib/config.js +1361 -1317
  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 -907
  52. package/lib/dream/narratives.js +44 -44
  53. package/lib/dream/sleep.js +2027 -1887
  54. package/lib/dream/triage.js +139 -0
  55. package/lib/dream.js +1879 -1764
  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 -107
  72. package/lib/image-describe.js +158 -0
  73. package/lib/index.js +852 -822
  74. package/lib/inject.js +656 -639
  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 -584
  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 -3196
  124. package/lib/session-gate.js +91 -91
  125. package/lib/session-usage.js +350 -350
  126. package/lib/settings.js +827 -802
  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 -5662
  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 -0
  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 -474
  142. package/lib/wiki/render.js +261 -187
  143. package/lib/wiki/scan.js +371 -371
  144. package/lib/wiki/t0.js +500 -463
  145. package/lib/wiki/t1-jobs.js +232 -232
  146. package/lib/wiki/t1.js +609 -502
  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 +15 -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 -204
  162. package/scripts/release-notes.mjs +164 -161
  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 -3394
  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 -1317
  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 -907
  194. package/src/dream/narratives.js +44 -44
  195. package/src/dream/sleep.js +2027 -1887
  196. package/src/dream/triage.js +139 -0
  197. package/src/dream.js +1879 -1764
  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 -107
  214. package/src/image-describe.js +158 -0
  215. package/src/index.js +852 -822
  216. package/src/inject.js +656 -639
  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 -584
  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 -3196
  266. package/src/session-gate.js +91 -91
  267. package/src/session-usage.js +350 -350
  268. package/src/settings.js +827 -802
  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 -5662
  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 -0
  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 -474
  284. package/src/wiki/render.js +261 -187
  285. package/src/wiki/scan.js +371 -371
  286. package/src/wiki/t0.js +500 -463
  287. package/src/wiki/t1-jobs.js +232 -232
  288. package/src/wiki/t1.js +609 -502
  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 -2988
  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 -4184
  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 -0
  318. package/test/conflict-ledger.test.js +242 -0
  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 -320
  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 -0
  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 -209
  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 -211
  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 -106
  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 -494
  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 -0
  407. package/test/panel-tokens.test.js +245 -0
  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 -136
  453. package/test/release-notes.test.js +265 -240
  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 -178
  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 -1418
  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 -627
  529. package/test/wiki-claims.test.js +194 -0
  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 -0
  535. package/test/wiki-queries.test.js +398 -277
  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 -380
  539. package/test/wiki-t1-jobs.test.js +125 -125
  540. package/test/wiki-t1.test.js +460 -235
  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
@@ -1,222 +1,222 @@
1
- # dsh-mneme 本地模型部署指南
2
-
3
- - **日期**:2026-08-15
4
- - **范围**:为 dsh-mneme 配置完全离线的本地语义模型(Embedding + Rerank),覆盖 ONNX(transformers.js)与 Ollama 两种路径
5
-
6
- ## 1. 前置要求
7
-
8
- | 项目 | 要求 | 说明 |
9
- |------|------|------|
10
- | Node.js | ≥ 22.5(建议 24+) | 插件依赖 `node:sqlite`(22.5 起可用,24 稳定) |
11
- | 磁盘空间 | ≥ 300MB(推荐 1GB+) | bge-small-zh-v1.5 量化约 100MB,bge-reranker-base 约 250MB;Ollama 模型另计 |
12
- | 内存 | ≥ 1GB 可用 | 纯 CPU 推理亦可运行 |
13
- | GPU(可选) | 显存 ≥ 2GB | 开启 `localEmbedDevice: "gpu"`(onnxruntime 需要额外安装 cuda 后端) |
14
- | 网络 | 仅首次下载模型需要 | 已下载后可完全离线(默认走 Hugging Face,可换镜像源) |
15
-
16
- > 依赖解析分三层:① **插件自管运行时目录**(`~/.dsh/mneme/runtime/`,见 §2.5,优先);② 宿主 profile 里已装的 `@huggingface/transformers`;③ 都没有则本地推理不可用,检索自动降级为关键词/BM25(读写在任何情况下都不受影响)。
17
- >
18
- > 从本版起 `@huggingface/transformers` 已从 `dependencies` 降为**可选 peer**(`peerDependenciesMeta.optional`),安装插件时不会再带上它和它那套原生闭包;第 ② 层因此只对「自己装过这份依赖」或「从旧版本升级上来、尚未被 prune」的环境有效。**正在使用本地嵌入的用户请在升级前按 §2.5 收编一份**,否则升级后本地嵌入不可用(读写信道不受影响)。
19
- >
20
- > `onnxruntime-node` 作为可选原生后端列在 `allowScripts`(首次安装需确认脚本),无需手动额外安装。
21
-
22
- ## 2. 模型安装 / 下载
23
-
24
- ### 2.1 自动下载(默认,推荐)
25
-
26
- 首次使用本地 Embedder 时会**自动从 Hugging Face Hub 下载**对应模型到本地缓存,无需手动操作:
27
-
28
- ```bash
29
- node scripts/benchmark-embed.js --provider local --model Xenova/bge-small-zh-v1.5
30
- # 首次运行会显示下载进度 → 加载模型 → 输出基准表格
31
- ```
32
-
33
- 默认缓存目录:`~/.dsh/mneme/models`(用户级,重装/升级依赖不丢;`embedModelCacheDir` 留空时启用)。transformers.js 把模型存成 `<cacheDir>/<org>/<name>/`(实测 4.2.0,例如 `~/.dsh/mneme/models/Xenova/bge-small-zh-v1.5/`):
34
-
35
- - Linux/macOS:`~/.dsh/mneme/models/`
36
- - Windows:`%USERPROFILE%\.dsh\mneme\models\`
37
-
38
- > 实测 transformers.js 4.2.0 在离线加载(`allowRemoteModels=false`)时按 `<cacheDir>/<org>/<model>/` 解析模型文件,例如 `<cacheDir>/Xenova/bge-small-zh-v1.5/config.json`。与本段上面描述的 `hub/models--…` 布局不一致时,以实际报错里给出的路径为准;缓存不在默认位置时按 §2.5 用 `--cache-dir` 指过去。
39
-
40
- ### 2.2 手动指定缓存目录
41
-
42
- 内存受限/离线机器可把模型缓存放到指定位置(迁移、共享缓存):
43
-
44
- ```js
45
- // 配置示例(插件配置里设置 embedModelCacheDir)
46
- const embedder = createEmbedderByProvider("local", {
47
- cacheDir: "/data/hf-models", // 模型缓存目录
48
- model: "Xenova/bge-small-zh-v1.5"
49
- });
50
- ```
51
-
52
- ### 2.3 Ollama 路径
53
-
54
- 如果本机已有 Ollama:
55
-
56
- ```bash
57
- ollama pull nomic-embed-text # 或 bge-m3(多语言)
58
- ```
59
-
60
- Ollama Embedder 走 `/api/embeddings`,**不下载任何文件到插件缓存**,模型由 Ollama 管理。
61
-
62
- ### 2.4 断点续传
63
-
64
- 下载基于 Hugging Face Hub 缓存协议,**中断后重试自动续传**(按分片断点续传,不重新下载已完成部分)。若反复中断导致缓存损坏,删除对应模型的缓存目录后重跑即可:
65
-
66
- ```bash
67
- rm -rf ~/.dsh/mneme/models/hub/models--Xenova--bge-small-zh-v1.5
68
- ```
69
-
70
- ### 2.5 自管运行时(收编 / 校验 / 排查)
71
-
72
- 本地推理真正要用的是一整套依赖闭包:`@huggingface/transformers` + `onnxruntime-node` + `sharp`(本机实测从宿主 node_modules 收编时是 **49 个包、3203 个文件、约 393MB**)。插件支持把它收编到自管目录 `~/.dsh/mneme/runtime/`,与宿主 profile 的依赖图解耦;收编**优先使用硬链接**,同盘时几乎不额外占盘。
73
-
74
- **为什么要独立出来**:这份闭包此前留在插件 `dependencies` 里,而 profile 是所有插件共用的依赖图,于是「装任何插件」都要替它重走一遍整条链,弱网下极慢。摘掉该声明后,运行时由自管目录承接——所以要**先收编、再升级**,否则升级后本地嵌入不可用。
75
-
76
- **三条取件来源,按可用性依次尝试**(面板按钮、`memory_runtime` 工具、CLI 三者共用同一套编排):
77
-
78
- | 顺序 | 来源 | 特点 |
79
- |---|---|---|
80
- | ① | 收编本机 profile 的 `node_modules` | **零网络**;同盘硬链接,几乎不占额外空间 |
81
- | ② | `runtimeTarballDir` 指向的本地 `.tgz` 目录 | 某个包网络下不到时用(文件名按 npm 约定 `<basename>-<version>.tgz`) |
82
- | ③ | npm registry(`runtimeMirror` 可换镜像) | 按随包发布的 `runtime-manifest.json` 逐个取,**每个 tarball 先校验 sha512 再落盘** |
83
-
84
- 走 ③ 时体积是 **win32-x64 实测约 33 个包、2142 个文件、数百 MB**(各平台不同,故不写死数值)——比①少,因为清单剔除了 `onnxruntime-web`(127.7MB,占全量三分之一):transformers 的 Node 构建从不 import 它(把一个空的 `onnxruntime-web` 打桩进去,嵌入结果逐字节相同),风险由 `verify` 的真实推理兜底。清单本身**平台无关**(数据源是 `package-lock.json` 里所有平台的条目),下载时按各包的 `os`/`cpu` 过滤,所以 win32 / darwin / linux × x64 / arm64 都被覆盖 —— 不需要谁在某个系统上先跑一次生成脚本。
85
-
86
- ```bash
87
- # 在插件目录下运行(例如 node_modules/@modusensus/dsh-mneme)
88
-
89
- # 1) 看状态:在哪、来源、结构完不完整(不加载模型,秒回)
90
- node scripts/mneme-runtime.mjs status
91
-
92
- # 2) 收编宿主里已有的那份(只读源、只写自管目录,不安装任何东西)
93
- node scripts/mneme-runtime.mjs adopt --from ~/.dsh/profiles/<profile>/node_modules
94
-
95
- # 3) 真加载运行时并跑一次推理,确认可用
96
- node scripts/mneme-runtime.mjs verify --cache-dir ~/.dsh/mneme/models
97
- ```
98
-
99
- - 退出码:`0` 健康 / `1` 不健康或失败 / `2` 用法错误(便于脚本直接 gate,区分「没装」和「装坏了」看输出里的 `status`)。加 `--json` 得到机器可读结果。
100
- - `verify` 的功能验证**不触网**(`allowRemoteModels=false`):模型必须已在缓存目录里,否则会明确失败——这是有意的,验证不该偷偷触网。缓存不在默认位置时用 `--cache-dir` 指到与 `embedModelCacheDir` 一致的位置。
101
- - 三条入口(CLI / 面板 / `memory_runtime`)的判据是同一份:缓存目录取 `embedModelCacheDir`(**留空即用户级默认目录**,与真实嵌入同一处解析),探针模型取 `localEmbedModel`(留空即默认小模型)。也就是说验证用的就是真实推理用的那份模型——CLI 不需要额外 `--cache-dir`,面板也不会跑到包内去找(#387 修的就是这个不一致)。
102
- - 收编来的目录没有可比对的原始产物,完整性如实标 `unverified`,不假装验过;结构检查通过 ≠ 功能可用,两者分开报。
103
- - `status` 只做结构检查,所以 `functional` 恒为 `unknown`——要看真实推理结果就跑 `verify`。
104
- - 运行时不可用时插件不会崩:检索降级为关键词/BM25,读写在任何情况下都不受影响;错误信息会带上 `adopt` 的具体命令。
105
- - 同一份状态也能从 `GET /api/dsh-mneme/semantic` 的 `localRuntime` 字段读到(面板与 CLI 同源)。
106
-
107
- #### 不用命令行也可以
108
-
109
- - **面板**:记忆面板的「向量索引」卡片在本地 provider 且运行时不就绪时,会显示**代价说明**(要额外一份运行时、解包后数百 MB)、先试收编、没有再下载,并按实际走的那一档分开报结果。卡片下面还有一个「取回本地运行时」按钮,点一下即完成。
110
- - **让 agent 代做**:`memory_runtime` 工具提供三个动作——`status`(只读,**返回里带代价说明**,便于 agent 先告知你再动手)、`provision`(走上面三档来源)、`verify`(真跑一次推理)。所以即便你不看面板,也可以直接让 agent 处理。
111
- - **这条路由与其它写路由走同一道门**:`POST /api/dsh-mneme/runtime/provision` 是唯一会联网拉数百 MB 并写盘的写面,鉴权规则与其他写路由完全一致——配了 `apiToken` 就必须带 token,**没配就等于不校验**(这是插件既有的鉴权模型,不是这条路由特有的)。本机默认部署下它开箱可用;但若这个端口能被别的页面/机器够到,请照第 3.1 节配上 `apiToken`。面板按钮与 `memory_runtime` 都走这道门,不需要额外配置。
112
- - **平台过滤的取向是「宽松优先」**:清单是平台无关的一份(含所有平台的包),下载时按本机 `os`/`cpu` 过滤;Linux 上如果**确认**了本机是 glibc,还会剔掉另一套 libc 的变体(`sharp` 与 `libvips` 的 musl 包,十几 MB)。拿不到 libc 证据时一律不过滤——多下十几兆,好过赌错方向装出一份跑不起来的运行时。
113
- - **宿主那份 transformers 会被版本门禁**:第 ② 层(宿主裸 specifier)只接受 `>=4.2.0` 且 `<5` 的版本;宿主装到 v5 时不会被静默使用,而是明确报出「版本越界」并退到第 ③ 层的可操作提示。版本读不到(某些打包形态)时不拦,以免这层对老用户整体失效。
114
-
115
- ```yaml
116
- # 两个可选配置键(默认留空 = 不改变任何行为)
117
- runtimeTarballDir: "" # 本地 .tgz 目录:有它就优先于联网
118
- runtimeMirror: "" # registry 镜像前缀,例如 https://npmmirror.com/mirrors/npm/
119
- ```
120
-
121
- #### 升级前必做(否则本地嵌入会断)
122
-
123
- 如果你正在使用本地嵌入(`embedProvider: local`),**在升级到已摘掉 `dependencies` 声明的版本之前**先执行一次 `adopt` + `verify`。顺序不能反:升级时 pnpm 会 prune 掉宿主里那份依赖,那之后就没有可收编的源了,只剩联网下载一条路。
124
-
125
- #### 自己取一份来收编(相对上面的手动路径)
126
-
127
- 上面的面板按钮 / `provision` 已经能在没有可收编副本时自行下载。但如果你希望**完全掌控取件过程**(例如用自己的镜像、或先在一处统一缓存),仍然可以手工取一份再收编——不必逐个下载包:
128
-
129
- ```bash
130
- # Windows(PowerShell / cmd)
131
- mkdir %TEMP%\mneme-fetch && cd /d %TEMP%\mneme-fetch
132
- npm i @huggingface/transformers@^4.2.0
133
- node "<插件目录>\scripts\mneme-runtime.mjs" adopt --from "%TEMP%\mneme-fetch\node_modules"
134
-
135
- # Linux / macOS
136
- mkdir -p /tmp/mneme-fetch && cd /tmp/mneme-fetch
137
- npm i @huggingface/transformers@^4.2.0
138
- node "<插件目录>/scripts/mneme-runtime.mjs" adopt --from /tmp/mneme-fetch/node_modules
139
- ```
140
-
141
- - **安装脚本必须能执行**:npm 默认会执行生命周期脚本,而 `onnxruntime-node` / `sharp` 正是靠 postinstall 取原生二进制;加 `--ignore-scripts` 会得到一个装不起来的闭包。pnpm 10+ 默认拦截构建脚本,所以这里用 npm 更省事。
142
- - 收编完那个临时目录可以直接删掉:闭包已经在 `~/.dsh/mneme/runtime/` 里了(硬链接时几乎不额外占盘)。
143
- - 收编后**仍然建议跑一次 `verify`**——结构完整不等于能推理。
144
-
145
- ## 3. 配置
146
-
147
- ### 3.1 插件配置(`~/.dsh/profiles/web/cordis.patch.yml`)
148
-
149
- ```yaml
150
- - id: dsh-mneme
151
- name: '@modusensus/dsh-mneme'
152
- config:
153
- # ── Embedding ──────────────────────────────
154
- embedProvider: local # local | ollama | openai(默认 openai,保持 v0.1 行为)
155
- localEmbedModel: Xenova/bge-small-zh-v1.5
156
- localEmbedDimension: 512 # 与模型匹配的向量维度
157
- localEmbedDevice: cpu # cpu | gpu(仅 local 生效)
158
- localEmbedBatchSize: 8 # 分批嵌入条数,内存紧张调小
159
- embedModelCacheDir: "" # 模型缓存目录(空=用户级 ~/.dsh/mneme/models;注意:不做 ~ 展开,要指别处必须写绝对路径)
160
- ollamaBaseUrl: "http://localhost:11434" # 仅 ollama 生效
161
- ollamaModel: "nomic-embed-text" # 仅 ollama 生效(openai 端点走面板 vector-config)
162
- # ── Rerank(Phase 2,可选)─────────────────
163
- rerankEnabled: false # 开启向量召回后的精排
164
- rerankModel: Xenova/bge-reranker-base
165
- ```
166
-
167
- ### 3.2 环境变量(可选)
168
-
169
- | 变量 | 作用 |
170
- |------|------|
171
- | `HF_ENDPOINT` | Hugging Face 镜像源,例如 `https://hf-mirror.com`(国内加速) |
172
- | `HF_HUB_CACHE` | 覆盖默认缓存目录 |
173
-
174
- ### 3.3 各后端配置对照
175
-
176
- | 配置 | local (ONNX) | ollama | openai |
177
- |------|--------------|--------|--------|
178
- | `localEmbedModel` | HF 模型 id(如 `Xenova/bge-small-zh-v1.5`) | —(用 `ollamaModel`) | —(用面板 vector-config) |
179
- | `ollamaBaseUrl` | — | `http://localhost:11434`(默认) | — |
180
- | `ollamaModel` | — | Ollama 模型名(如 `nomic-embed-text`) | — |
181
- | `localEmbedDevice` | ✅ | — | — |
182
- | `localEmbedBatchSize` | ✅ | — | — |
183
- | `embedModelCacheDir` | ✅ | — | — |
184
-
185
- ## 4. 首次使用
186
-
187
- 1. 配置 `embedProvider`(或保持 `openai` 不动)
188
- 2. 保存配置并重启 DSH,或直接跑 `scripts/benchmark-embed.js` 验证
189
- 3. 首次触发本地模型时,transformers.js 自动下载 → `init()` 打印 `local embedder ready: <model> (dim=512, device=cpu)`
190
- 4. 之后所有 `memory_save` 写入自动补向量;已有记忆可用「重建索引」批量补建
191
-
192
- > 注意:切换 `localEmbedModel` 或 `embedDimension` 后,旧向量与新向量维度不同、无法混算,需**重建索引**(复用 v0.1 的 `reindexMissing` 机制)。
193
-
194
- ## 5. 常见问题
195
-
196
- ### Q1:模型下载失败 / 下载超慢
197
-
198
- - 国内网络:设置镜像源 `HF_ENDPOINT=https://hf-mirror.com`(或 `export HF_ENDPOINT=https://hf-mirror.com`)
199
- - 公司代理拦截:检查 `HTTPS_PROXY` / `HTTP_PROXY` 环境变量
200
- - 磁盘不足:清理缓存或用 `embedModelCacheDir` 换目录
201
-
202
- ### Q2:`Xenova/bge-small-zh-v1.5` 加载报错 / 显存不足(OOM)
203
-
204
- - 默认 `device: cpu`、`dtype: q8`,内存占用已最小化
205
- - 尝试 `embedBatchSize` 调小(如 4/2)降低峰值内存
206
- - 显存不足:`device: gpu` 时改回 `cpu`;或检查 onnxruntime-node 是否安装了 GPU 后端
207
-
208
- ### Q3:中英文混排 / CJK 文本处理
209
-
210
- - `bge-small-zh-v1.5` 对中文与中英混排均优化良好;纯英文场景可换 Ollama 的 `nomic-embed-text`
211
- - 单条文本上限 8000 字符(与 v0.1 一致),超长自动截断
212
- - 检索时 query 与记忆正文走同一 Embedder、同一归一化(mean pooling + L2),余弦分数才可比
213
-
214
- ### Q4:换模型后结果变差 / 向量混乱
215
-
216
- - 换模型(尤其维度不同)后旧向量不可复用,必须重建索引
217
- - 若在 Web 面板/API 配置过 v0.1 的 `vector-config`,v0.2 会优先采用插件配置,旧配置仅作降级路径
218
-
219
- ### Q5:本地模型加载很慢(首次/每次启动)
220
-
221
- - 首次含下载,属正常;已缓存后每次启动仅加载进内存(数百 ms 级)
222
- - 大模型(如 bge-m3)可考虑换用更小的 `Xenova/bge-small-zh-v1.5`(量化 q8 约 100MB)
1
+ # dsh-mneme 本地模型部署指南
2
+
3
+ - **日期**:2026-08-15
4
+ - **范围**:为 dsh-mneme 配置完全离线的本地语义模型(Embedding + Rerank),覆盖 ONNX(transformers.js)与 Ollama 两种路径
5
+
6
+ ## 1. 前置要求
7
+
8
+ | 项目 | 要求 | 说明 |
9
+ |------|------|------|
10
+ | Node.js | ≥ 22.5(建议 24+) | 插件依赖 `node:sqlite`(22.5 起可用,24 稳定) |
11
+ | 磁盘空间 | ≥ 300MB(推荐 1GB+) | bge-small-zh-v1.5 量化约 100MB,bge-reranker-base 约 250MB;Ollama 模型另计 |
12
+ | 内存 | ≥ 1GB 可用 | 纯 CPU 推理亦可运行 |
13
+ | GPU(可选) | 显存 ≥ 2GB | 开启 `localEmbedDevice: "gpu"`(onnxruntime 需要额外安装 cuda 后端) |
14
+ | 网络 | 仅首次下载模型需要 | 已下载后可完全离线(默认走 Hugging Face,可换镜像源) |
15
+
16
+ > 依赖解析分三层:① **插件自管运行时目录**(`~/.dsh/mneme/runtime/`,见 §2.5,优先);② 宿主 profile 里已装的 `@huggingface/transformers`;③ 都没有则本地推理不可用,检索自动降级为关键词/BM25(读写在任何情况下都不受影响)。
17
+ >
18
+ > 从本版起 `@huggingface/transformers` 已从 `dependencies` 降为**可选 peer**(`peerDependenciesMeta.optional`),安装插件时不会再带上它和它那套原生闭包;第 ② 层因此只对「自己装过这份依赖」或「从旧版本升级上来、尚未被 prune」的环境有效。**正在使用本地嵌入的用户请在升级前按 §2.5 收编一份**,否则升级后本地嵌入不可用(读写信道不受影响)。
19
+ >
20
+ > `onnxruntime-node` 作为可选原生后端列在 `allowScripts`(首次安装需确认脚本),无需手动额外安装。
21
+
22
+ ## 2. 模型安装 / 下载
23
+
24
+ ### 2.1 自动下载(默认,推荐)
25
+
26
+ 首次使用本地 Embedder 时会**自动从 Hugging Face Hub 下载**对应模型到本地缓存,无需手动操作:
27
+
28
+ ```bash
29
+ node scripts/benchmark-embed.js --provider local --model Xenova/bge-small-zh-v1.5
30
+ # 首次运行会显示下载进度 → 加载模型 → 输出基准表格
31
+ ```
32
+
33
+ 默认缓存目录:`~/.dsh/mneme/models`(用户级,重装/升级依赖不丢;`embedModelCacheDir` 留空时启用)。transformers.js 把模型存成 `<cacheDir>/<org>/<name>/`(实测 4.2.0,例如 `~/.dsh/mneme/models/Xenova/bge-small-zh-v1.5/`):
34
+
35
+ - Linux/macOS:`~/.dsh/mneme/models/`
36
+ - Windows:`%USERPROFILE%\.dsh\mneme\models\`
37
+
38
+ > 实测 transformers.js 4.2.0 在离线加载(`allowRemoteModels=false`)时按 `<cacheDir>/<org>/<model>/` 解析模型文件,例如 `<cacheDir>/Xenova/bge-small-zh-v1.5/config.json`。与本段上面描述的 `hub/models--…` 布局不一致时,以实际报错里给出的路径为准;缓存不在默认位置时按 §2.5 用 `--cache-dir` 指过去。
39
+
40
+ ### 2.2 手动指定缓存目录
41
+
42
+ 内存受限/离线机器可把模型缓存放到指定位置(迁移、共享缓存):
43
+
44
+ ```js
45
+ // 配置示例(插件配置里设置 embedModelCacheDir)
46
+ const embedder = createEmbedderByProvider("local", {
47
+ cacheDir: "/data/hf-models", // 模型缓存目录
48
+ model: "Xenova/bge-small-zh-v1.5"
49
+ });
50
+ ```
51
+
52
+ ### 2.3 Ollama 路径
53
+
54
+ 如果本机已有 Ollama:
55
+
56
+ ```bash
57
+ ollama pull nomic-embed-text # 或 bge-m3(多语言)
58
+ ```
59
+
60
+ Ollama Embedder 走 `/api/embeddings`,**不下载任何文件到插件缓存**,模型由 Ollama 管理。
61
+
62
+ ### 2.4 断点续传
63
+
64
+ 下载基于 Hugging Face Hub 缓存协议,**中断后重试自动续传**(按分片断点续传,不重新下载已完成部分)。若反复中断导致缓存损坏,删除对应模型的缓存目录后重跑即可:
65
+
66
+ ```bash
67
+ rm -rf ~/.dsh/mneme/models/hub/models--Xenova--bge-small-zh-v1.5
68
+ ```
69
+
70
+ ### 2.5 自管运行时(收编 / 校验 / 排查)
71
+
72
+ 本地推理真正要用的是一整套依赖闭包:`@huggingface/transformers` + `onnxruntime-node` + `sharp`(本机实测从宿主 node_modules 收编时是 **49 个包、3203 个文件、约 393MB**)。插件支持把它收编到自管目录 `~/.dsh/mneme/runtime/`,与宿主 profile 的依赖图解耦;收编**优先使用硬链接**,同盘时几乎不额外占盘。
73
+
74
+ **为什么要独立出来**:这份闭包此前留在插件 `dependencies` 里,而 profile 是所有插件共用的依赖图,于是「装任何插件」都要替它重走一遍整条链,弱网下极慢。摘掉该声明后,运行时由自管目录承接——所以要**先收编、再升级**,否则升级后本地嵌入不可用。
75
+
76
+ **三条取件来源,按可用性依次尝试**(面板按钮、`memory_runtime` 工具、CLI 三者共用同一套编排):
77
+
78
+ | 顺序 | 来源 | 特点 |
79
+ |---|---|---|
80
+ | ① | 收编本机 profile 的 `node_modules` | **零网络**;同盘硬链接,几乎不占额外空间 |
81
+ | ② | `runtimeTarballDir` 指向的本地 `.tgz` 目录 | 某个包网络下不到时用(文件名按 npm 约定 `<basename>-<version>.tgz`) |
82
+ | ③ | npm registry(`runtimeMirror` 可换镜像) | 按随包发布的 `runtime-manifest.json` 逐个取,**每个 tarball 先校验 sha512 再落盘** |
83
+
84
+ 走 ③ 时体积是 **win32-x64 实测约 33 个包、2142 个文件、数百 MB**(各平台不同,故不写死数值)——比①少,因为清单剔除了 `onnxruntime-web`(127.7MB,占全量三分之一):transformers 的 Node 构建从不 import 它(把一个空的 `onnxruntime-web` 打桩进去,嵌入结果逐字节相同),风险由 `verify` 的真实推理兜底。清单本身**平台无关**(数据源是 `package-lock.json` 里所有平台的条目),下载时按各包的 `os`/`cpu` 过滤,所以 win32 / darwin / linux × x64 / arm64 都被覆盖 —— 不需要谁在某个系统上先跑一次生成脚本。
85
+
86
+ ```bash
87
+ # 在插件目录下运行(例如 node_modules/@modusensus/dsh-mneme)
88
+
89
+ # 1) 看状态:在哪、来源、结构完不完整(不加载模型,秒回)
90
+ node scripts/mneme-runtime.mjs status
91
+
92
+ # 2) 收编宿主里已有的那份(只读源、只写自管目录,不安装任何东西)
93
+ node scripts/mneme-runtime.mjs adopt --from ~/.dsh/profiles/<profile>/node_modules
94
+
95
+ # 3) 真加载运行时并跑一次推理,确认可用
96
+ node scripts/mneme-runtime.mjs verify --cache-dir ~/.dsh/mneme/models
97
+ ```
98
+
99
+ - 退出码:`0` 健康 / `1` 不健康或失败 / `2` 用法错误(便于脚本直接 gate,区分「没装」和「装坏了」看输出里的 `status`)。加 `--json` 得到机器可读结果。
100
+ - `verify` 的功能验证**不触网**(`allowRemoteModels=false`):模型必须已在缓存目录里,否则会明确失败——这是有意的,验证不该偷偷触网。缓存不在默认位置时用 `--cache-dir` 指到与 `embedModelCacheDir` 一致的位置。
101
+ - 三条入口(CLI / 面板 / `memory_runtime`)的判据是同一份:缓存目录取 `embedModelCacheDir`(**留空即用户级默认目录**,与真实嵌入同一处解析),探针模型取 `localEmbedModel`(留空即默认小模型)。也就是说验证用的就是真实推理用的那份模型——CLI 不需要额外 `--cache-dir`,面板也不会跑到包内去找(#387 修的就是这个不一致)。
102
+ - 收编来的目录没有可比对的原始产物,完整性如实标 `unverified`,不假装验过;结构检查通过 ≠ 功能可用,两者分开报。
103
+ - `status` 只做结构检查,所以 `functional` 恒为 `unknown`——要看真实推理结果就跑 `verify`。
104
+ - 运行时不可用时插件不会崩:检索降级为关键词/BM25,读写在任何情况下都不受影响;错误信息会带上 `adopt` 的具体命令。
105
+ - 同一份状态也能从 `GET /api/dsh-mneme/semantic` 的 `localRuntime` 字段读到(面板与 CLI 同源)。
106
+
107
+ #### 不用命令行也可以
108
+
109
+ - **面板**:记忆面板的「向量索引」卡片在本地 provider 且运行时不就绪时,会显示**代价说明**(要额外一份运行时、解包后数百 MB)、先试收编、没有再下载,并按实际走的那一档分开报结果。卡片下面还有一个「取回本地运行时」按钮,点一下即完成。
110
+ - **让 agent 代做**:`memory_runtime` 工具提供三个动作——`status`(只读,**返回里带代价说明**,便于 agent 先告知你再动手)、`provision`(走上面三档来源)、`verify`(真跑一次推理)。所以即便你不看面板,也可以直接让 agent 处理。
111
+ - **这条路由与其它写路由走同一道门**:`POST /api/dsh-mneme/runtime/provision` 是唯一会联网拉数百 MB 并写盘的写面,鉴权规则与其他写路由完全一致——配了 `apiToken` 就必须带 token,**没配就等于不校验**(这是插件既有的鉴权模型,不是这条路由特有的)。本机默认部署下它开箱可用;但若这个端口能被别的页面/机器够到,请照第 3.1 节配上 `apiToken`。面板按钮与 `memory_runtime` 都走这道门,不需要额外配置。
112
+ - **平台过滤的取向是「宽松优先」**:清单是平台无关的一份(含所有平台的包),下载时按本机 `os`/`cpu` 过滤;Linux 上如果**确认**了本机是 glibc,还会剔掉另一套 libc 的变体(`sharp` 与 `libvips` 的 musl 包,十几 MB)。拿不到 libc 证据时一律不过滤——多下十几兆,好过赌错方向装出一份跑不起来的运行时。
113
+ - **宿主那份 transformers 会被版本门禁**:第 ② 层(宿主裸 specifier)只接受 `>=4.2.0` 且 `<5` 的版本;宿主装到 v5 时不会被静默使用,而是明确报出「版本越界」并退到第 ③ 层的可操作提示。版本读不到(某些打包形态)时不拦,以免这层对老用户整体失效。
114
+
115
+ ```yaml
116
+ # 两个可选配置键(默认留空 = 不改变任何行为)
117
+ runtimeTarballDir: "" # 本地 .tgz 目录:有它就优先于联网
118
+ runtimeMirror: "" # registry 镜像前缀,例如 https://npmmirror.com/mirrors/npm/
119
+ ```
120
+
121
+ #### 升级前必做(否则本地嵌入会断)
122
+
123
+ 如果你正在使用本地嵌入(`embedProvider: local`),**在升级到已摘掉 `dependencies` 声明的版本之前**先执行一次 `adopt` + `verify`。顺序不能反:升级时 pnpm 会 prune 掉宿主里那份依赖,那之后就没有可收编的源了,只剩联网下载一条路。
124
+
125
+ #### 自己取一份来收编(相对上面的手动路径)
126
+
127
+ 上面的面板按钮 / `provision` 已经能在没有可收编副本时自行下载。但如果你希望**完全掌控取件过程**(例如用自己的镜像、或先在一处统一缓存),仍然可以手工取一份再收编——不必逐个下载包:
128
+
129
+ ```bash
130
+ # Windows(PowerShell / cmd)
131
+ mkdir %TEMP%\mneme-fetch && cd /d %TEMP%\mneme-fetch
132
+ npm i @huggingface/transformers@^4.2.0
133
+ node "<插件目录>\scripts\mneme-runtime.mjs" adopt --from "%TEMP%\mneme-fetch\node_modules"
134
+
135
+ # Linux / macOS
136
+ mkdir -p /tmp/mneme-fetch && cd /tmp/mneme-fetch
137
+ npm i @huggingface/transformers@^4.2.0
138
+ node "<插件目录>/scripts/mneme-runtime.mjs" adopt --from /tmp/mneme-fetch/node_modules
139
+ ```
140
+
141
+ - **安装脚本必须能执行**:npm 默认会执行生命周期脚本,而 `onnxruntime-node` / `sharp` 正是靠 postinstall 取原生二进制;加 `--ignore-scripts` 会得到一个装不起来的闭包。pnpm 10+ 默认拦截构建脚本,所以这里用 npm 更省事。
142
+ - 收编完那个临时目录可以直接删掉:闭包已经在 `~/.dsh/mneme/runtime/` 里了(硬链接时几乎不额外占盘)。
143
+ - 收编后**仍然建议跑一次 `verify`**——结构完整不等于能推理。
144
+
145
+ ## 3. 配置
146
+
147
+ ### 3.1 插件配置(`~/.dsh/profiles/web/cordis.patch.yml`)
148
+
149
+ ```yaml
150
+ - id: dsh-mneme
151
+ name: '@modusensus/dsh-mneme'
152
+ config:
153
+ # ── Embedding ──────────────────────────────
154
+ embedProvider: local # local | ollama | openai(默认 openai,保持 v0.1 行为)
155
+ localEmbedModel: Xenova/bge-small-zh-v1.5
156
+ localEmbedDimension: 512 # 与模型匹配的向量维度
157
+ localEmbedDevice: cpu # cpu | gpu(仅 local 生效)
158
+ localEmbedBatchSize: 8 # 分批嵌入条数,内存紧张调小
159
+ embedModelCacheDir: "" # 模型缓存目录(空=用户级 ~/.dsh/mneme/models;注意:不做 ~ 展开,要指别处必须写绝对路径)
160
+ ollamaBaseUrl: "http://localhost:11434" # 仅 ollama 生效
161
+ ollamaModel: "nomic-embed-text" # 仅 ollama 生效(openai 端点走面板 vector-config)
162
+ # ── Rerank(Phase 2,可选)─────────────────
163
+ rerankEnabled: false # 开启向量召回后的精排
164
+ rerankModel: Xenova/bge-reranker-base
165
+ ```
166
+
167
+ ### 3.2 环境变量(可选)
168
+
169
+ | 变量 | 作用 |
170
+ |------|------|
171
+ | `HF_ENDPOINT` | Hugging Face 镜像源,例如 `https://hf-mirror.com`(国内加速) |
172
+ | `HF_HUB_CACHE` | 覆盖默认缓存目录 |
173
+
174
+ ### 3.3 各后端配置对照
175
+
176
+ | 配置 | local (ONNX) | ollama | openai |
177
+ |------|--------------|--------|--------|
178
+ | `localEmbedModel` | HF 模型 id(如 `Xenova/bge-small-zh-v1.5`) | —(用 `ollamaModel`) | —(用面板 vector-config) |
179
+ | `ollamaBaseUrl` | — | `http://localhost:11434`(默认) | — |
180
+ | `ollamaModel` | — | Ollama 模型名(如 `nomic-embed-text`) | — |
181
+ | `localEmbedDevice` | ✅ | — | — |
182
+ | `localEmbedBatchSize` | ✅ | — | — |
183
+ | `embedModelCacheDir` | ✅ | — | — |
184
+
185
+ ## 4. 首次使用
186
+
187
+ 1. 配置 `embedProvider`(或保持 `openai` 不动)
188
+ 2. 保存配置并重启 DSH,或直接跑 `scripts/benchmark-embed.js` 验证
189
+ 3. 首次触发本地模型时,transformers.js 自动下载 → `init()` 打印 `local embedder ready: <model> (dim=512, device=cpu)`
190
+ 4. 之后所有 `memory_save` 写入自动补向量;已有记忆可用「重建索引」批量补建
191
+
192
+ > 注意:切换 `localEmbedModel` 或 `embedDimension` 后,旧向量与新向量维度不同、无法混算,需**重建索引**(复用 v0.1 的 `reindexMissing` 机制)。
193
+
194
+ ## 5. 常见问题
195
+
196
+ ### Q1:模型下载失败 / 下载超慢
197
+
198
+ - 国内网络:设置镜像源 `HF_ENDPOINT=https://hf-mirror.com`(或 `export HF_ENDPOINT=https://hf-mirror.com`)
199
+ - 公司代理拦截:检查 `HTTPS_PROXY` / `HTTP_PROXY` 环境变量
200
+ - 磁盘不足:清理缓存或用 `embedModelCacheDir` 换目录
201
+
202
+ ### Q2:`Xenova/bge-small-zh-v1.5` 加载报错 / 显存不足(OOM)
203
+
204
+ - 默认 `device: cpu`、`dtype: q8`,内存占用已最小化
205
+ - 尝试 `embedBatchSize` 调小(如 4/2)降低峰值内存
206
+ - 显存不足:`device: gpu` 时改回 `cpu`;或检查 onnxruntime-node 是否安装了 GPU 后端
207
+
208
+ ### Q3:中英文混排 / CJK 文本处理
209
+
210
+ - `bge-small-zh-v1.5` 对中文与中英混排均优化良好;纯英文场景可换 Ollama 的 `nomic-embed-text`
211
+ - 单条文本上限 8000 字符(与 v0.1 一致),超长自动截断
212
+ - 检索时 query 与记忆正文走同一 Embedder、同一归一化(mean pooling + L2),余弦分数才可比
213
+
214
+ ### Q4:换模型后结果变差 / 向量混乱
215
+
216
+ - 换模型(尤其维度不同)后旧向量不可复用,必须重建索引
217
+ - 若在 Web 面板/API 配置过 v0.1 的 `vector-config`,v0.2 会优先采用插件配置,旧配置仅作降级路径
218
+
219
+ ### Q5:本地模型加载很慢(首次/每次启动)
220
+
221
+ - 首次含下载,属正常;已缓存后每次启动仅加载进内存(数百 ms 级)
222
+ - 大模型(如 bge-m3)可考虑换用更小的 `Xenova/bge-small-zh-v1.5`(量化 q8 约 100MB)