@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,402 +1,407 @@
1
- # 配置说明(全键参考)
2
-
3
- > 正本是 `src/config.js` 的 schema——本文与其同步维护,键名、默认值、取值范围以代码为准;
4
- > 行为动机与踩坑出处在 schema 注释里(含 issue 编号),本文只保留「怎么配、配了会怎样」。
5
- > 改 schema 时顺手更新对应行(新改动自查清单第 2 条)。
6
-
7
- **怎么读这张表**
8
-
9
- - 「默认」列即 `config.js` schema 的解析默认值;默认值本身 = 未配置时的行为。
10
- - 标 **light** 的键会被 lightMode 预设强制关闭(文末附完整清单);lightMode 是预设不是
11
- 强制——用户显式写在 feature_flags 里的值优先于预设。
12
- - 行为开关(布尔键)默认关的即 opt-in:不开 = 行为与该键存在之前逐字节一致。
13
- - 绝大多数行为开关与部分阈值/路由键在 `settings.js` 的白名单里,可在面板「功能开关」
14
- 逐项启停(线上回滚开关);未入白名单的键(路径、词典、枚举外的杂项)只能改 bundle 配置。
15
- - **「面板能改 / 只能改文件」不用在这里逐行标注**:面板「设置 → 连接 → 配置键覆盖面」
16
- 那张只读卡会实时把两者交/差出来(`GET /api/dsh-mneme/config-keys`,只回键名与计数、
17
- 不回任何值)。清单由 `src/config-keys.js` 从 schema 与白名单现算,改哪边都不会漏。
18
- 那里还会单独列出「白名单登记了、但 schema 没给默认值」的键——这类键在面板上有输入框,
19
- 留空时却不会进「当前生效值」。
20
-
21
- 路径键改完落点,见 [DIRECTORIES.md](DIRECTORIES.md)(注意各路径键的 `~` 展开规则不一致)。
22
-
23
- ## 全局与存储
24
-
25
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
26
- |---|---|---|---|
27
- | `language` | `zh` | 记忆语言:生成条目、注入标题、后台提示词所用语言(`zh`/`en`) | 切换后重启生效 |
28
- | `memoryDir` | `~/.dsh/memory` | SQLite 记忆库目录 | WAL + busy_timeout 已为多进程就绪;两个宿主共用库时 `externalApiEnabled` 与 `autoDream` 只能一边开 |
29
- | `lightMode` | `false` | 轻量档总闸:一键关掉全部重型路径,保留核心循环(见文末清单) | 面板 `panel_mode=light` 等效为 `true` 且优先于 bundle 配置 |
30
-
31
- ## 容量预警(#275,空间维度)
32
-
33
- 库体积 / 归档区规模过线时在 `GET /api/dsh-mneme/health` 的 `capacity` 块与面板「库体积」卡上报。三道阈值都是**观察口**,不是动作触发:没有周期性消费者(`/health` 被读到才算一次),预警也永不自动归档 / 删除——真删由人显式确认(#275 拍板),出口是维护卡的无损回收(`dsh-mneme reclaim`,见 [STORAGE.md](STORAGE.md))。判级实现 `service.getCapacityHealth`,与镜像健康 fail-safe 同款:读失败显式 `status:"unknown"`,绝不伪装 ok。
34
-
35
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
36
- |---|---|---|---|
37
- | `capacityWarning.dbSizeWarnMb` | `256` | 库磁盘足迹(主文件 + WAL + SHM)预警线,整数 MB | **0 = 关掉这条检查**。默认锚定议题实测:55 MB 库 VACUUM 0.8s,256 MB 起代价才值得先看数字再动手(议题「现在便宜、以后贵」) |
38
- | `capacityWarning.archivedRowsWarn` | `5000` | 归档区行数预警线 | **0 = 关**。锚定议题形态区间「归档是数千条这个量级」的上沿(实测 2,400 时还没坏) |
39
- | `capacityWarning.archivedRatioWarn` | `0.95` | 归档占比(归档 / 全部)预警线,浮点 0–1 | **0 = 关**。健康形态本身就落在 0.8~0.9(活跃数百 / 归档数千),0.9 会对着健康库报警;0.95 起才是「归档区吞掉活跃区」的形态 |
40
-
41
- 三个键都走 feature_flags 白名单(面板可改,改动是**启动快照**,与 `panel_mode` 同节奏,面板显示「待重启」);两个整数走 INT_RANGES、占比浮点走 NUMBER_RANGES。不设 `enabled` 总开关:数字恒在 `/health`,把某条检查关掉就是把对应阈值设 0。`:memory:` 库没有磁盘足迹,`db_size` 检查缺席(不是 ok);答复只带数字、不带库文件路径。归档增速(净增速率)是 recall-stats `archive` 块的第五指标,不在这里重复。
42
-
43
- ## 逐会话无痕(issue #539)
44
-
45
- 命中会话后,Mneme 不向该会话注入记忆、用户设置或工具指引,不接受其 `memory_*` / `set_scope_state` 工具调用,不对它蒸馏,也不由压缩抢救、M.O. 记账或自动提议路径保存该会话的内容。
46
-
47
- 自动匹配**只认宿主自己的委派标记**:会话头里 `origin === "subagent"`,或 `delegationDepth` 是正数。**`parentSession` 不是判据**——`sessions.fork()` 造出来的主会话分支同样写这个字段(fork 只写 cwd / parentSession / isSeeded,不写 origin、不带 delegationDepth),把它当判据就是「fork 一下就整体失忆」。兼容别名 `parentSessionId` 同理不读;旧形状 `requestHeader().config` 仍作为取头的第二条路。captain 会话不会因其有子代理而自动命中,队长侧对交付物的蒸馏仍由队长会话本身决定(#211 的边界)。
48
-
49
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
50
- |---|---|---|---|
51
- | `sessionGateEnabled` | `false` | 逐会话无痕总开关;可通过 bundle 配置或 `/api/dsh-mneme/features` 设置 | opt-in;关闭时恢复既有 Mneme 行为。feature flag 按现有设置契约在重启后生效 |
52
- | `sessionGateSubagents` | `true` | 总开关开启时,自动命中子代理会话;可通过 bundle 配置或 `/api/dsh-mneme/features` 设置 | 关闭后仍保留手动名单匹配;单独打开本键不生效 |
53
- | `sessionGateSessions` | `[]` | 手动指定精确 session id 的数组,只能写在 bundle 配置 | 手动匹配与子代理识别互相独立;改完配置后由宿主重新装载插件生效 |
54
-
55
- 逐会话消费点会直接检查当前 `Session`,因此首个 `session/event` 到达前也能识别完整会话头;**拿不到 id 也照判**(注入面在上下文组装期就跑在这条路径上,那时未必有可用 id)。事件订阅另外缓存已观察到的子会话 id,供会话日志扫描过滤——那张表只服务「拿得到 id、却解析不出头」的退路,有界淘汰,淘汰只影响那一次日志过滤。面板的 `/features` 只支持标量开关,不持久化 `sessionGateSessions` 数组。
56
-
57
- 边界:不带调用会话上下文的管理 API(如手动 `/nudge`)仍按管理操作处理,不继承某一个会话的闸门。
58
-
59
- ## scope 隔离(issue #17)
60
-
61
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
62
- |---|---|---|---|
63
- | `scopeEnabled` | `false` | 存储层总开关:**两条写入路径**(工具调用 `memory_save`/`memory_update`,以及机器提炼·会话蒸馏)都自动标注 agent_scope / workspace_scope(标注只贴**新建行**:并入既有行时不重贴,既有行的归属属于它原来被提炼出来的语境),去重键扩展;检索与注入排序按当前会话作用域加权(命中 ×1.25、他 scope ×0.5 保留可见,issue #339 补齐注入通道) | opt-in;关 = 写入不标注、行为与 A1 前逐字节一致 |
64
- | `strictScope` | `false` | 硬过滤模式(A3):他 scope 完全不可见、未标注恒可见(fail-closed);硬过滤先于软加权执行 | 依赖 `scopeEnabled` 打开才有意义;关 = A2 软隔离(他 scope 降权保留可见,检索与注入同权重) |
65
-
66
- ## 作用域级可逆闸门(issue #471)
67
-
68
- 上面两个键是**事实轴**——答「这条记忆属于谁」,改的是归属数据、跟着记忆行走。下面两个键是**政策轴**——答「这个作用域现在通不通」,由人按作用域整体按下、跨会话存续、松开即原样回来,**一条记忆行都不动、一个配置键都不改、不用重启**。两条轴落在同一个判定出口(`gateByScope`,全仓唯一的过滤实现),可叠加。
69
-
70
- 按下与松开走工具 `set_scope_state`(`dimension`: `agent`/`workspace`,`scope_value`: 标签本身或 `*` 表示该维度全局,`state`: `paused`/`active`)。状态存 `scope_state` 表,键 = 维度 + 作用域值,`UNIQUE(dimension, scope_value)` 保证幂等:**重复按下同一状态不刷新 `decided_at`**(同 `memory_archive` 的取舍——否则「最后一次真正变更」的时刻会被噪声盖掉)。
71
-
72
- 两级语义与 `writeAdmission` / `preInjectGate` 同构:先观察、再拦。
73
-
74
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
75
- |---|---|---|---|
76
- | `scopeState.enabled` | `false` | 跑政策轴判定:被按下的作用域其候选**照常注入**,但每次落一条 `llm_audit_logs`(`trigger_source=scopeState`,`metadata.paused` 记被按下的是哪些作用域、`metadata.gated` 记本应拦下几条、`metadata.enforced=false`) | 关 = 判定不跑、行为与今天逐字段一致。先看「如果按下会少掉多少」的真实分布,再决定真按——`gated` 恒为 0 就说明这一路本来就没在供料 |
77
- | `scopeState.enforce` | `false` | 真的不注入:被按下的作用域其候选出池(检索侧同款,`gateByScope` 一处生效;巩固与睡眠两侧的读入口与写入路径同款) | 关 = 仅观察(`metadata.enforced=false`)。**enforce 无 enabled 时无效果**(同 `preInjectGate`)。按下的是政策不是事实:记忆行、向量、归档位、作用域标注全部不动,松开即恢复 |
78
-
79
- 覆盖范围:`gateByScope` 的三条检索路(融合池、`entity:`、`attr:` 前缀路)与注入候选池(`injectCandidates` 内、图召回合并之后、pin 池之前)。
80
-
81
- **不覆盖检视面**:`memory_list`、`memory_get`、面板列表**刻意不过这道闸**(它们走 `strictVisibility` 与 `store.list` 的 `visibility` 参数,是另一条平行的链)。按下之后人还要能查「我按下了什么、里面有什么」——检视面关掉,人就没有入口确认该不该松开。这也正是「按下的是政策不是事实」的具体含义:行还在,只是不再喂给模型。
82
-
83
- **巩固(dream)侧另接四处**:`activeStoreSize`、叙述条 `inputs`、`runDream` 的读入口、总览 `summaryAll`——否则被按下的行会照常参与阈值判定与合并。**总览那一处只能从源头挡**:总览落库时是**无作用域**的 summary 行,而 `gateInjection` 只拦匹配暂停作用域的行,没有标注的行永远不会被它拦下;被按下的内容一旦进了总览就变成「洗干净的全局行」,此后一直注入。
84
-
85
- **睡眠(sleep)侧另接四个相位**:冲突消解、归档降级、模式发现、关系补全的候选池。这一侧比日间更要紧,因为**它不只读**——`phaseDemotion` 会 `setArchived` 与 `demoteToSummary`(真改归档面),`phasePatterns` 会铸出 `type=pattern` 的新行;不接的话闸门开着而每 6 小时一次的睡眠照样在被按下的作用域上动手,「按下」就只等于让它在白天看不见。两处位置纪律写在注释里:降级的过滤放在循环之外(不是循环体里 `continue`,免得将来有人加副作用时漏掉),模式发现的过滤排在 `.slice(0, limit)` 之前(否则被按下的行照样占名额,它们既不会被扫、也不该挤掉别人)。
86
-
87
- `llmAudit.enabled=false` 时观察档一行都不写(同 `writeAdmission` 的口径)。不进 lightMode 强制关闭清单——它只是查一张小表的判定,不引入重型后台路径、不加常驻文本(同 `actionPipelineEnabled` 的定性)。
88
-
89
- ## 审计
90
-
91
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
92
- |---|---|---|---|
93
- | `llmAudit.enabled` | `true` | 后台 LLM 调用全量落 `llm_audit_logs`(tokens / 时长 / 状态 / 触发源) | 覆盖 autoDream / autoSummarize / sleep / entityExtract 与写入准入测量点;关 = 一行不写 |
94
- | `llmAudit.retentionDays` | `90` | 审计表滚动清理保留天数(≤3650) | 启动时清理旧行 |
95
-
96
- ## 写入准入(#254)
97
-
98
- 写入前判定「这条该不该进库」,与 `memoryQualityFilter` 的分工是**时点**不是判据:那个是写入后打分归档(扣分可以错,只影响排序与归档),这个是写入前判定(硬拒不能错)。两个键都默认关,分层是为了把「先观察」和「开始拦」分成两次上线。
99
-
100
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
101
- |---|---|---|---|
102
- | `writeAdmission.enabled` | `false` | 跑第 1 级确定性判据:空白 / 纯噪声 + 密钥 / PII(判据来源是 #164 A2,经 `sensitiveScan` 注入) | 关 = 不判定、不拒绝,`evaluate` 返回与只计量阶段逐字段一致。命中 → 审计行带 `metadata.deny` |
103
- | `writeAdmission.enforce` | `false` | 命中时真的拒绝(`store.save` 之前返回) | 关 = 仅告警:判据照跑、审计照留、写入不拦(读审计时「`deny` 非空且 `decision=allow`」即这一档的指纹)。被拒写入不落库、不通知、不排嵌入,`memory_save` 返回 `action:"denied"` + `reason` |
104
- | `sensitiveScanEnabled` | `false` | A2 密钥 / PII 判据的来源(`sensitive-scan.js`)。开 = 判定结果可被写入准入消费;只覆盖带 sessionKey 的写入路径 | 关 = 扫描器不参与,`writeAdmission` 第 1 级只剩空白/噪声判据。**经 MCP / 8790 / `/import` 的写入不带 sessionKey,不进这道闸**(`write-admission.js` 的文件头注释点名了这条边界) |
105
-
106
- 第 1 级的判据面刻意收窄:**去重键命中不进第 1 级**(归 write-update 放行——同步近重复门跑在异步矛盾检测之前会把本该被裁决的矛盾直接拒掉),G1/G2 阈值也只是计量。两个键都走 feature_flags 白名单(面板可启停)。
107
-
108
- ## 注入前判定(#380)
109
-
110
- 每帧注入候选出池后、进入 system prompt 前,一次**池级** LLM 调用判出「会向本次请求注入意见/立场」的记忆(判定协议与 E12 实验同源;实验依据:D1 判定+过滤把谄媚率 26.9%→2.5%,判定+标记比过滤差 +17.6pp——判定结果**只给闸门用,绝不进模型上下文**)。两级语义与 writeAdmission 同构,落点在注入面而非写入面。
111
-
112
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
113
- |---|---|---|---|
114
- | `preInjectGate.enabled` | `false` | 跑池级判定。判定 async prefetch + cache、渲染帧同步消费(宿主 systemPrompt 渲染是同步回调) | 关 = 注入行为与现状逐字节一致。**冷缓存首帧降级**:新查询的第一帧原样注入,下一轮同 key 渲染生效;判定完成落 `llm_audit_logs`(`trigger_source=preInjectGate`,真实 token 用量,`related_memory_ids`=被标记记忆)——先观察真实负载的意见占比分布 |
115
- | `preInjectGate.enforce` | `false` | 缓存命中帧真的滤除被标记候选 | 关 = 仅观察:候选集不动。**enforce 无 enabled 时无效果**。pin 池(constraint/preference,#249 逐字保真)与 graphHint 线索行豁免——判定与过滤只作用于一般记忆槽 |
116
-
117
- 降级路径:判定失败/超时/不可解析 → 本帧原样注入 + 审计行 `degraded:true` 且不缓存(下一帧重试)——防线故障永不阻塞注入;连续失败 3 次熔断一个冷却期(判定器系统性坏掉时不再逐帧花钱,到期自动恢复)。**整池被标记**时放弃本帧 enforce(fail-open):记忆正文是判定模型的可影响输入,一条指令型记忆不该让整个记忆块静默失明——该形态在审计行里就是 `n_flagged == n_pool`(判定与审计按原样保留,只有滤除让位)。判定 LLM 走 `agentDefaultModel` 当前选择(entity adapter 同款装配,无独立 provider/model 键;审计行带实际模型与用量,无默认模型路由时 `model_id` 落 `unknown` 占位——判定生效就必有账;成本痛了再加覆盖键)。缓存键 = 查询 + 候选 `id:内容` 集,候选集变化(轮换/新记忆)或候选内容被就地修正(`updateMemory`)即重新判定,不吃旧判定;命中刷新序(LRU,容量 8)。`llmAudit.enabled=false` 时本闸不运行(无账目的判定不可见也不该花钱)。lightMode 强制关(LLM-per-turn 附加路径与低资源档互斥)。
118
-
119
- ## 蒸馏(会话 → 记忆)
120
-
121
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
122
- |---|---|---|---|
123
- | `autoSummarize` | `true` | 会话/回合结束自动蒸馏记忆。E10 EdgeMem 考卷(#339)实测:对「未来才问的具体值」类细节,零 LLM 原样写入保真 100% 而蒸馏丢 17/120——蒸馏的归纳收益在别的口径,二者是并存关系而非替代(原样写入并存的产品化见讨论 #361) | 关 = 只剩工具与命令写入口 |
124
- | `summarizeProvider` / `summarizeModel` | 空 | 蒸馏专用模型路由 | 两者都非空才生效;空 = 用会话当前模型 |
125
- | `distillMaxChars` | `24000` | 喂给蒸馏 LLM 的完整转录上限(字符,1000–200000) | 调大更完整、更贵 |
126
- | `summarizeMinIntervalMinutes` | `0` | 同会话两次蒸馏的最小间隔(分钟,≤10080) | 0 = 不限(#127 节流三键之一) |
127
- | `summarizeMaxEntriesPerRun` | `0` | 单次蒸馏最多落库条数(≤50) | 0 = 不限 |
128
- | `summarizeMinWindowChars` | `0` | 窗口可蒸馏文本下限(字符),不足直接跳过 LLM(#239) | 被挡窗口照常消费游标并留 skip 审计 |
129
- | `summarizeMaxRunsPerSession` | `0` | 每会话蒸馏次数预算,只计真实发起的调用(≤1000) | 0 = 不限;进程内计数,重启清零 |
130
- | `summarizeParseFailureMaxRetries` | `0` | 连续解析失败几次后放弃当前窗口(0–10,0 = 关,#493) | 达到阈值强制消费游标跳过该窗口;失败行 metadata 恒带 `raw_head`/`raw_has_bracket`/`streak` |
131
- | `summarizePeakHours` | `""` | 高峰时段串(`"09:00-18:00"` / `"mon-fri 08:00-12:00,14:00-18:00"`,支持跨零点;全角逗号/冒号/数字自动归一,#424) | 命中高峰不调 LLM、顺延补跑;任一写法非法整串按未配置处理。**非法不静默(#622)**:非空且解析失败时启动日志 warn 一条(带键名与原串)、面板该键输入行下出红色提示(`/features` 的 `invalidPeakHours`);空串是合法的未配置,不告警 |
132
- | `summarizePeakMaxDeferMinutes` | `120` | 高峰顺延上限(分钟,≤1440) | 0 = 不设上限;到点仍处高峰照跑(bypassPeak) |
133
- | `summarizeDedupeMode` | `off` | 落库前去重档位:`off` / `title`(拦完全同名)/ `vector`(同会话语义近邻) | `vector` 复用已有 embedding 列,无 LLM 调用 |
134
- | `summarizeDedupeMinSim` | `0.92` | `vector` 档并入阈值(0.5–0.99) | 仅 `vector` 档生效 |
135
- | `summarizeDedupeWindowHours` | `24` | `vector` 档回看窗口(小时,≤168) | 仅 `vector` 档生效 |
136
- | `distillRateLimitIntervalMs` | `1000` | 蒸馏请求全局串行排队的相邻间隔(毫秒) | 0 = 关闭排队(默认开的 429 保护随之失效) |
137
- | `distillRateLimitRetries` | `3` | 命中 429 的指数退避重试次数(≤10) | 重试全程对用户透明 |
138
- | `distillRateLimitBaseDelayMs` | `1000` | 429 退避基数(毫秒,100–60000) | 1s→2s→4s… |
139
- | `summarizeReasoningEffort` | `none` | 蒸馏 LLM 推理档位:`off`/`low`/`medium`/`high`/`none`(#315) | `none` = 不发字段用服务商默认;思考模型建议 `off`/`low` 防推理烧光输出预算 |
140
- | `codingRetrospect` | `false` | 编码记忆蒸馏:rejected_solution / pitfall / constraint 三类 | opt-in;开启后蒸馏上下文为整轮完整对话 |
141
- | `codingKeywords` | 内置词表 | 编码任务识别词表(读取侧门控) | 命中才注入编码记忆 |
142
- | `codingBoostFactor` | `2` | 编码任务时编码记忆的 importance 加权系数(1–5) | — |
143
- | `memoryQualityFilter.enabled` | `true` | 写入质量打分:≥60 正常 / 30–60 降权 / <30 归档打 low_quality 标 | 归档行仍可显式搜到 |
144
- | `memoryQualityFilter.archiveThreshold` | `30` | 自动归档线 | 与 `exemptImportance` 联动 |
145
- | `memoryQualityFilter.degradeThreshold` | `60` | 降权线(注入排序乘 quality_score) | — |
146
- | `memoryQualityFilter.minContentLength` | `10` | 最短内容长度(字符) | — |
147
- | `memoryQualityFilter.exemptImportance` | `4` | importance ≥ 此值豁免静默自动归档(#135) | 设 1 = 等效关自动归档 |
148
-
149
- ## 蒸馏原文留存与溯源(#399)
150
-
151
- 把蒸馏从「替换」降级为「叠加索引」:蒸过的窗口原文旁路落 `distill_records`,每条新记忆落 `memory_provenance` 回指来源窗口。**渲染与落盘共用同一隐私谓词**(`publicTranscriptParts`)——私有推理链与插件注入的机器内容两条路都不进;工具入参与结果只进渲染、不落盘。留存文本不受 `distillMaxChars` 与工具裁剪约束。详见 [蒸馏原文留存与记忆级溯源](DISTILL.md)。
152
-
153
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
154
- |---|---|---|---|
155
- | `distillRecords.enabled` **light** | `false` | 蒸馏时顺带留存窗口原文 + 写记忆级溯源链接;同时是溯源读出口(`GET /memory/provenance` 与宿主内 `/api/dsh-mneme/memory/provenance`)的总闸 | opt-in;关 = 一行不写、连收集都不做,行为与 #399 之前逐字节一致;读出口此时回 `409 {"error":"distill-records-disabled"}`(与「装配没接线」的 503 分开读数)。**关开关 ≠ 删掉已留存的原文**:只不再经 HTTP 提供,盘上的行要 `dsh-mneme reclaim` 或重新开启后的启动裁剪才走。开关是**启动快照**(与 `panel_mode` 同节奏),面板改完要到下次启动生效,面板会显示「待重启」 |
156
- | `distillRecords.retentionDays` | `90` | 原文保留天数(1–3650) | **只管启动期裁剪**(`src/index.js`,`enabled` 时动手)。`dsh-mneme reclaim` 不读这个键:它对三个表用同一条 `--older-than` 截止(默认 7 天),想对齐就显式传成与 `retentionDays` 相同的值(见 STORAGE.md)。两处都**只删 `distill_records`**,溯源链接保留指向空区间(显示「来源已过期」),绝不级联删记忆 |
157
-
158
- 两个键都走 feature_flags 白名单(面板可启停);`enabled` 进 lightMode 预设关闭清单,`retentionDays` 不进(它是时长不是行为面,用户显式设过就照旧)。`dsh-mneme reclaim` 的报告从两项变三项(`planned` / `column_bytes` / `cleared` 各多一个 `distill_records`),入口语义(默认 dry-run、`--apply` 才动手)不变。已知边界:无历史回填、从未蒸馏过的窗口不留记录、不覆盖工具结果与 code 输出。
159
-
160
- `enabled` 这一格**同时管读写两侧**(#509 评审整改后):写侧是蒸馏时是否落盘(`src/summarize.js:988`),读侧是溯源读出口是否把原文读出去(判据在 `src/provenance-http.js`,与写侧逐字同源,只此一份)。关着时读出口回 `409 {"error":"distill-records-disabled"}`——但**盘上的原文不会因此消失**:保留期裁剪与写入同在 `src/index.js:270` 一道门里,关掉开关意味着「不再写、启动期也不再裁」,已留的行会一直躺在库里,直到 `dsh-mneme reclaim`(它不读这个键,手动可删)或重新开启后的启动裁剪。所以「关掉就干净了」是误读,诚实的表述是「关掉 = 不再经 HTTP 提供」。
161
-
162
- **运行归因(#512)不加开关**:溯源窗口另外带 `distill_run_id / run_type / trigger_source / run_status`,答复级另带 `mints[]`(这条记忆出生自哪一轮 dream / sleep)。它记的是归因元数据、不含任何会话正文,所以不依附 `distillRecords.enabled`——上面那枚开关关着时端点照旧 409,但 `distill_runs` 与 `memory_mints` 两张表仍在记账。改造之前写下的行刻意留 NULL、不补:反推一个「看起来能追」的合成 id 比没有归因更坏。
163
-
164
- ## 注入
165
-
166
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
167
- |---|---|---|---|
168
- | `autoInject` | `true` | 每轮自动注入记忆块的父总闸 | 关 = 两个子开关一并失效(持久值保留,不重置) |
169
- | `maxInjectedItems` | `5` | 注入条数上限(1–20) | — |
170
- | `importanceThreshold` | `3` | 注入候选的 importance 下限(1–5) | 低于该值的记忆不进注入面 |
171
- | `injectRotationTurns` | `0` | 跨轮轮换:最近 N 轮注入过的不再优先(#205) | opt-in;会话边界自动重置 |
172
- | `injectContentMaxChars` | `300` | 单条正文截断上限(60–4000,#164①) | 截断带「上限/原长/全文指引」提示,不静默 |
173
- | `injectUncertaintyAdaptive` | `false` | 确定性强的话题收缩注入条数(减半、下限 1,#239 第 5 项) | 只做单向收缩,绝不越过 `maxInjectedItems` |
174
- | `injectGuidanceEnabled` **light** | `true` | 工具描述 + order 150 系统段讲「何时查/何时写」(#249) | `autoInject` 子开关;lightMode 强制关 |
175
- | `continuityRescueEnabled` **light** | `false` | 压缩边缘双落点:连续性提案落库 + 追加注入(#249 N3) | opt-in(新注入表面);`autoInject` 子开关;订阅宿主压缩事件,无该时机则降级为持久规则 |
176
- | `pinnedInjectBudget` | `0` | 约束/偏好 pin 池独立预算(0–5,#249 B1) | 0 = 关;pin 不占 `maxInjectedItems` 名额 |
177
- | `hotMemoryEnabled` | `true` | 会话近期对话渲染在长期记忆块之前 | — |
178
- | `hotMemoryRounds` | `5` | 热记忆覆盖最近几轮对话(≤50) | — |
179
- | `hotMemoryMaxTokens` | `2000` | 热记忆块 token 上限(200–32000) | — |
180
- | `escapePromptVariables` | `true` | 注入内容连续花括号转义(#162) | 关 = 原样透传(DSH interpolate 可能 throw) |
181
- | `injectTimePrefix` | `false` | 对话开始注入一次当前时间(#34,v0.7.11 误删后随 #333 恢复) | opt-in;格式与键名与 v0.7.2 一致,存量 feature_flags 恢复即生效 |
182
- | `personaEnabled` | `false` | 人格段:用户自写的一小段常驻注入文本 | opt-in;只是轻量常驻文本、不引入重型后台路径,故不进 `LIGHT_MODE_OFF` |
183
- | `personaStrictAddressing` | `false` | 人格寻址口径。关(历史行为):会话身份没建卡、或该卡被显式关掉时,落 `default` 卡 | 开:这两种情况都不注入人格,`default` 只兜「解析不到会话身份」的无名会话。用途是宿主里跑着自带身份的外部 bot 时,别让某个人格无条件进它每一帧。默认关 = 升级零变化 |
184
- | `profileExtractEnabled` **light** | `false` | 画像提取草稿:`POST /api/dsh-mneme/profile/extract` 从活跃记忆反向写一段「助手眼中的用户」草稿(面板「Agent 眼中的你」卡上的按钮) | opt-in;一次调用一轮 LLM + 读上百行记忆,故 `LIGHT_MODE_OFF` 里有它。**只出草稿副本**:它不写 `user_settings`,面板也只把结果当副本展示、可一键复制(2026-11-04 改口径,此前「采用为画像」会直接覆盖手写画像且无撤销)——画像正文必须是用户自己手写的原文。空库直接报 `no-input`、模型没按格式回报 `unparseable`,两者都不回空草稿 |
185
- | `profileFactsEnabled` **light** | `false` | 自动画像事实:「Agent 眼中的你」按会话身份分卡维护一份逐条事实清单(对标 ChatGPT 记忆 / DS Bot 每 bot 的 MEMORY.md)——dream 巩固轮成功后逐卡增量维护(有新记忆才跑),注入在手填画像之后;面板可手动触发与逐条增改归档,账本逐 op 可查 | opt-in;自动维护轮是 dream 级 LLM 调用 + 读上百行记忆,故 `LIGHT_MODE_OFF` 里有它(注入段本身是几十行常驻文本,关掉省的是维护调用不是注入)。事实住 `profile_facts` 独立三表,**绝不写 `user_settings`**(#497 口径不变:手填画像是用户原文,模型只有读权)。输入行严格按 `agent_scope` 分区、排除外来行;账本 `profile_fact_journal` 每卡裁剪到最近 200 条 |
186
-
187
- ## 巩固(autoDream)
188
-
189
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
190
- |---|---|---|---|
191
- | `autoDream` **light** | `true` | 阈值触发的后台巩固(LLM 合并/归档/降重) | lightMode 强制关;与 sleepMode 串行、不重叠 |
192
- | `dreamThresholdCount` / `dreamThresholdChars` | `10` / `5000` | 触发阈值(新增条数 / 字符,双过才跑) | — |
193
- | `dreamDelayMs` | `2000` | 触发后的延迟(毫秒) | — |
194
- | `dreamMinIntervalMinutes` | `0` | 两次开跑最小间隔(分钟,≤10080,#89) | 失败/degraded run 也占用;0 = 不限 |
195
- | `autoDreamFailureBackoff` | `false` | 连续失败指数退避:有效间隔 = 基数 × 2^连败,封顶 30 分钟(#292) | opt-in;基数取 `dreamMinIntervalMinutes`(0 = 无闸可翻倍);成功一次清零;重启归零 |
196
- | `dreamInputSummaryEnabled` | `false` | dream 审计行输入快照瘦身(#557):auto 轮只落骨架(id/type/title/importance/updated_at,不含 content) | opt-in;LLM 输入与 `snapshot_hash` 都不受影响;organize 轮重放载荷不受影响;开启后审计行无法离线重算 hash(骨架级回放) |
197
- | `dreamPeakHours` | `""` | 巩固错峰,与 `summarizePeakHours` 同一份时段语法(#239;全角逗号/冒号/数字同样归一,#424) | 命中高峰不做梦、阈值继续累积、留 skip 审计;非法写法按未配置,且同 `summarizePeakHours` 的 #622 可见性(启动 warn + 面板提示) |
198
- | `dreamPeakMaxDeferMinutes` | `120` | 巩固顺延上限(分钟) | 0 = 不设上限;到点仍处高峰照跑 |
199
- | `dreamProvider` / `dreamModel` | 空 | 巩固专用路由(settings「巩固模型」) | 建议非思考模型——思考模型易烧光预算返回空体(#135) |
200
- | `dreamMaxTokens` | `131072` | 巩固输出预算(256–131072) | 流式计费按实际用量,调大不增加成本;**调小则相反**——撞顶 → 无完整 JSON → 整轮失败 → baseline 不刷新 → 同输入重跑(#135 实测 cap=16384 净成本 +54%) |
201
- | `dreamReasoningEffort` | 未配置 | 巩固推理档位(同 `summarizeReasoningEffort` 的枚举) | 未配置 = 自动取模型支持的最低档(#135);显式 `none` = 不发字段 |
202
- | `dreamSummaryProvider` / `dreamSummaryModel` | 空 | 记忆总览(dream_summarize)专用路由(#258) | 空 = 回落巩固路由;总览输入为全库,建议大 ctx 非思考模型 |
203
- | `dreamSummaryMaxInputs` | `0` | 总览输入条数硬上限(按 updated_at 倒序取最新 N 条) | 0 = 不设上限(库增长可能撑爆小 ctx 模型) |
204
- | `dreamMaxSnapshotSize` | `200` | 滑动窗口:每次只巩固最近 N 条(≤1000) | 窗口外旧记忆不进快照 |
205
- | `dreamCandidateMode` | `window` | 候选集构造:`window` / `hybrid`(并入向量高相似组,#125) | `hybrid` 让该合并的对能碰面;输入成本不随库增长 |
206
- | `dreamCandidateMax` | `0` | `hybrid` 候选总量上限(≤5000) | 0 = 复用 `dreamMaxSnapshotSize` |
207
- | `dreamCandidateMinSim` | `0.85` | `hybrid` 判「高相似」的阈值 | 与 sleep normal 档同一个定义 |
208
- | `dreamMaxArchivePerRun` | `8` | 单轮 archive 决策上限(≤200,#104) | 超限整单拒绝,`dreamSkipInvalid` 不豁免 |
209
- | `dreamMaxMergePerRun` | `40` | 单轮 merge 决策上限(≤200,#135) | 超限整单拒绝;merge 是唯一回吐正文的动作,40 = 实测每轮 merge 数分布上沿(历史 0 命中) |
210
- | `dreamImplicitKeep` | `true` | LLM 未提及的快照记忆自动补 keep | `false` = 恢复严格校验(未覆盖即拒绝整单) |
211
- | `dreamMinExplicitCoverage` | `0.5` | 显式决策覆盖率下限(0–1) | 防截断输出被隐式 keep 洗白 |
212
- | `dreamSkipInvalid` | `true` | 跳过单条非法决策、应用合法子集、run 记 degraded(#89) | `false` = 恢复整单拒绝 |
213
- | `allowCrossTypeMerge` | `false` | 放宽跨类型合并检查 | opt-in;`dreamSkipInvalid` 关时跨类型 merge 直接整单拒绝 |
214
- | `dreamMergeGuard` | `true` | guarded 类型 merge 护栏(#339/E8):合并对象命中长保留类型(与 archive 护栏同表:preference/pattern/rejected_solution/constraint/pitfall)的 merge 决策跳过——E8 实测巩固损耗里 10/26 条被丢约束已归位 guarded 类型仍被 merge 吃掉。**#521 起带逃生门**:所有 id 同类型且 `reason` 命中「重复/过时」词表(与 archive 护栏同一份 `ARCHIVE_RATIONALE_RE`)时放行——archive 早就有这道门,merge 没有,于是一份真重复的 preference 永远合不掉而提示词还在催模型合并它 | 默认开(同类压缩管线实测:安全规则被同速压缩后一轮只剩 53%、五轮只剩 10%,全程无报错);关闭 = guarded 类型的 merge 不再被跳过,「更精炼的摘要」重新成为约束失真的主通道。`dreamSkipInvalid`(默认开)时被跳条目进 `dream_runs.skipped`、run 记 degraded,关闭时整单拒绝 |
215
- | `dreamNarrativeEnabled` **light** | `false` | dream 期间按共享 tag 聚类合成叙述条(#164 对齐) | opt-in;按需检索、不常驻注入 |
216
- | `dreamNarrativeMinCluster` | `3` | 成簇门槛(共享同一 tag 的记忆数,2–20) | — |
217
- | `documentMemoryEnabled` **light** | `false` | document 型记忆:长文档指针行,全文归 agent(#230) | opt-in;注册校验 + C2 去重 + supersede 记账 |
218
- | `documentInjectBudget` | `2` | document 摘要行的注入预算(1–5) | 只约束注入,不约束检索 |
219
- | `documentDir` | `""` | managed 落盘目录(#296) | 空 = `<memoryDir>/documents/`;目录之外只登记指针、正文零读零写 |
220
- | `policyEpoch` | `0` | 裁决规则版本号 | bump 后旧 dream_runs 降为历史证据(receipt 不再驱动现行决策) |
221
-
222
- ## 日记本(diary,v0.13)
223
-
224
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
225
- |---|---|---|---|
226
- | `diaryEnabled` **light** | `false` | QQ 日记本总闸:跨天判定 + 手写入口 + 面板页 | opt-in;与 `documentMemoryEnabled` **成对但不相依**——关着也能写正文文件,只是不铸造 `document` 指针行(回执里如实标 `pointer.skipped`) |
227
- | `diaryDir` | `""` | 日记正文根目录 | 空 = `<memoryDir>/diaries/<项目键>/`;`~` 展开到 home,绝对路径原样,相对路径落 memoryDir 下。**与 `memoryDir` 一样是路径配置,不是行为开关**,故不进 `settings.js` 白名单、也不上面板 |
228
- | `diaryWriteEveryMinutes` | `0` | 日记自动写的定时唤醒间隔(分钟) | `0` = 只在 turn/end 与插件启动时判定(此前行为);`>0` 时每隔这么多分钟扫一遍已知项目再判定。**不是 cron**:定时器只负责唤醒「该不该写」的判定,写不写仍由 compose 按落盘日期去重——一天最多一篇,填 5 也不会多写。跑完一篇再排下一次,所以不会与上一次的模型调用重叠。opt-in、可热改(走 `INT_RANGES` 表,0–1440)|
229
- | `diaryInboxDir` | `""` | QQ 入站素材目录(只读) | 空 = 从 `memoryDir` 推 `<memoryDir>/../media/onebot`(onebot 的默认落点)。本模块**不 import `dsh-onebot-qq` 任何模块**,边界只靠这份「目录 + 文件形状」约定 |
230
-
231
- 日记不落用户绑定的项目目录:那目录实测非 git、无 `.gitignore`、混着探针脚本,
232
- 写进去没有版本也没有回滚;mneme 成文的写盘面只有 `memoryDir` 与 `documentDir` 两处。
233
- 「入库到项目」是面板上一个**人主动点**的导出动作(复制而非移动)。
234
-
235
- ## 睡眠模式(sleep,空闲深维护)
236
-
237
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
238
- |---|---|---|---|
239
- | `sleepModeEnabled` **light** | `false` | 库静默后全库深维护:冲突消解/归档降级/模式发现/关系补全 | opt-in;可被用户活动中止,与 autoDream 串行 |
240
- | `sleepIdleMinutes` | `5` | 静默多久触发(1–60 分钟) | — |
241
- | `sleepMinIntervalHours` | `8` | 两次 run 最小间隔(小时,≤168) | — |
242
- | `sleepConflictStrictness` | `normal` | 冲突裁决档:`gentle`(0.92) / `normal`(0.85) / `aggressive`(0.75) | — |
243
- | `sleepActionSet` | `conflict` | 动作集:`conflict` / `full`(六分支,#126) | `full` 让互补型/演进型重复有正确出口 |
244
- | `sleepArchiveDays` / `sleepCompressDays` | `30` / `90` | 归档降级分层(天):先缩为摘要、再彻底归档 | 实体关系保留 |
245
- | `sleepPatternMinMemories` | `100` | 模式发现的扫描窗口(条) | — |
246
- | `sleepPatternLookbackDays` | `30` | 属性变更回看(天) | — |
247
- | `sleepMaxPatternPerRun` | `3` | 单轮模式条上限(0–10) | 0 = 关闭模式发现 |
248
- | `sleepAffectiveEnabled` **light** | `false` | 情感归因相位(#619):情境情绪写成 `affective_context` 关系,跨多次独立会话的稳定倾向才铸成 pattern | opt-in;`sleepModeEnabled` 的子相,父关着不跑;要调模型且依赖实体抽取 |
249
- | `sleepAffectiveTraitMinSessions` | `3` | 判「稳定倾向」所需的**独立会话**数(2–10) | 下界 2 是故意的:N=1 就是单次场合,正是必须禁止升特质的那个情形 |
250
- | `sleepAffectiveMaxRelationsPerRun` | `10` | 单轮最多写多少条 `affective_context` 关系(0–50) | 同 `sleepMaxPatternPerRun` 的角色;0 = 一条也不写 |
251
- | `sleepProvider` / `sleepModel` | 空 | sleep 专用路由 | 空 = 用巩固路由 / 当前模型 |
252
- | `sleepReasoningEffort` | 未配置 | 同 `dreamReasoningEffort` | — |
253
- | `sleepMaxTokens` | `8192` | 冲突/模式阶段输出预算(#257) | 原硬编码 2048 对 `full` 档必然截断 |
254
- | `sleepConflictMaxPairs` | `12` | **单批**送审的冲突对上限(0–500,0 = 不设上限回退旧行为) | 输入侧预算(#529):整池一次塞进一个 prompt 实测 163,054 token(占 `--ctx-size` 99.5%) |
255
- | `sleepConflictMaxPairsPerRun` | `60` | **单轮**最多送审多少对(0–5000,0 = 不设上限) | 与上一条分工:一个管批次大小、一个管整轮总量;剩下的一轮留给下一轮 |
256
- | `sleepFailureBackoff` | `false` | sleep 连续失败退避(#529) | 有效间隔 = `sleepMinIntervalHours` × 2^连败数(成功清零,封顶 `max(sleepMinIntervalHours, 24h)`);opt-in |
257
- | `sleepHeatThreshold` | `0.05` | 降级联合判定的热度下限(heat < 值且 importance<5 才降) | `heatEnabled` 关时退回纯时间分层 |
258
-
259
- ## 反思与冲突(dream 配套)
260
-
261
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
262
- |---|---|---|---|
263
- | `reflectionUpdateEnabled` | `true` | 检索后的反思更新既有记忆 | — |
264
- | `reflectionFailureTracking` | `true` | 失败经验追踪 | — |
265
- | `reflectionUpdateMaxPerRun` | `2` | 单轮 update 上限(0–5) | — |
266
- | `reflectionUpdateMinAgeHours` | `24` | 可更新记忆的最短年龄(小时,≤168) | — |
267
- | `reflectionFailureRetentionDays` | `90` | `failure_memories`(失败/纠正记录)的启动期清理保留天数(1–3650) | 只读 bundle 配置:未进 feature_flags 白名单,面板改不了。`dsh-mneme reclaim` 不读这个键(它对三个表用同一条 `--older-than`,本表不在其中)。此前这个 90 天是写死的(#275 伞下的欠账) |
268
- | `conflictFreezeEnabled` | `false` | 冲突不自动合并、冻结待人工复核 | opt-in |
269
- | `conflictFreezeMaxPending` | `100` | 冻结队列上限(≤1000) | — |
270
- | `conflictAutoResolveEnabled` | `false` | 相似度极高的**同 scope** 重复对自动裁决(保留新条、归档旧条),不进人工队列 | opt-in。会归档记忆,所以默认关;跨 scope 对永不自动(归属是用户的决定,#170)。用 supersede 而非 conflict:注记写在被归档侧,幸存记忆正文不动 |
271
- | `conflictAutoResolveMinSimilarity` | `0.95` | 自动裁决的相似度门槛(0.85–1) | 实测 live 库 345 条有相似度的历史行里 ≥0.95 只占 5.8%、≥0.94 占 8.1%——这一档减的是峰值,不是把队列清零。低于 0.85 就不是「重复」而是「相似」,不该自动归档任何一条 |
272
-
273
- ## 实体
274
-
275
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
276
- |---|---|---|---|
277
- | `entityExtractionEnabled` **light** | `false` | 写入时 LLM 抽取实体/属性/关系 | opt-in;存储三表与 CRUD 恒可用,本键只闸抽取 |
278
- | `entityExtractionProvider` / `entityExtractionModel` | 空 | 抽取专用路由 | 单边为空时回落调用方默认 |
279
- | `entityExtractionReasoning` | `none` | 抽取推理档位(#109) | `none` = 不发字段;拒收自动去掉字段重试一次 |
280
- | `entityExtractionMaxEntities` / `entityExtractionMaxAttrs` | `10` / `20` | 单次抽取的实体数 / 每实体属性数上限 | — |
281
- | `entitySearchEnabled` | `true` | 实体名前缀/语义搜索(供召回) | — |
282
- | `entityRecallEnabled` **light** | `false` | 图召回轴:查询命中实体名时并入融合池(#219) | opt-in;依赖实体抽取产出(lightMode 下抽取已关) |
283
-
284
- ## 检索
285
-
286
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
287
- |---|---|---|---|
288
- | `embedProvider` | `openai` | 嵌入提供方:`openai`(外部 API)/ `local`(ONNX)/ `ollama` | — |
289
- | `vectorSearchTopK` | `20` | 向量召回条数(≤100) | — |
290
- | `vectorSearchThreshold` | `0.65` | 固定向量阈值 | `adaptiveThresholdEnabled` 开启时被动态阈值取代 |
291
- | `adaptiveThresholdEnabled` | `true` | 查询感知动态阈值(实体前缀放宽、短查询收紧等) | 关 = 回到固定 0.65 |
292
- | `bm25SearchEnabled` **light** | `true` | BM25 第三召回路径(标识符/代码碎片/混排) | — |
293
- | `hybridSearchVectorWeight` / `hybridSearchKeywordWeight` | `0.6` / `0.4` | 混合检索加权 | — |
294
- | `recallFusion` | `blend` | 融合配方:`blend`(现状)/ `rrf` / `minmax` | `rrf`/`minmax` 修「raw 余弦 + 关键词分直接相加」的量纲失配 |
295
- | `signalTransparency` | `false` | 每条结果附带 `{keyword, vector, bm25, final}` 信号 | 只装饰返回行,不改排序 |
296
- | `hybridInject` **light** | `true` | 注入前语义优先召回、规则序回填 | — |
297
- | `selectiveInjectEnabled` **light** | `true` | 有查询向量时按相似度重排注入候选 | — |
298
- | `searchSemanticDedup` **light** | `false` | 检索期语义去重(贪心剔除近重复) | opt-in 激进档:小嵌入模型易把不同条目坍缩 |
299
- | `searchSemanticDedupThreshold` | `0.95` | 去重阈值 | — |
300
- | `evalPersistTestResults` | `false` | 检索评测快照落 `recall_evals` | 生产检索恒只进 `recall_runs`,与此键无关 |
301
- | `recallRecordDefault` | `true` | `recall_runs` 记录默认开 | 显式传 `false` 的调用方不受影响 |
302
- | `recallRetentionDays` | `90` | `recall_runs` 滚动清理保留天数 | — |
303
- | `trustEpistemicWeighting` | `false` | 来源可信度(observation/subjective/inferred)参与排序与标注 | opt-in;关时 epistemic_status 只是惰性数据 |
304
-
305
- ### 重排层
306
-
307
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
308
- |---|---|---|---|
309
- | `rerankEnabled` **light** | `false` | 本地交叉编码器重排 | opt-in:显式 `true` + `local` 才拉起 onnxruntime |
310
- | `rerankProvider` | `none` | `local` / `none` | — |
311
- | `rerankModel` | `Xenova/bge-reranker-base` | 重排模型 | — |
312
- | `rerankBatchSize` | `8` | 批大小(≤64) | — |
313
- | `rerankMaxCandidates` | `30` | 参与重排的候选上限(5–100) | — |
314
- | `rerankScoreThreshold` | `0.1` | 重排分数阈值 | — |
315
- | `rerankDtype` | `q8` | 量化档(#188) | 非法值由 transformers 抛出 → 重排降级告警 |
316
-
317
- ## 图谱(graph,opt-in,#24)
318
-
319
- 图谱四条链路都依赖实体抽取产出(`entityExtractionEnabled`),默认全关;lightMode 把前四个布尔键一并强制关。级联与预算键只是阈值,跟着开关走。
320
-
321
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
322
- |---|---|---|---|
323
- | `graphAnchoringEnabled` | `false` | 块1 图谱锚定:以查询命中的实体为种子沿关系表级联扩散(默认深度 2) | opt-in;关 = 与 #219 单跳轴逐字节一致;需 `entityRecallEnabled` 之上再开 |
324
- | `graphSeedCap` | `12` | 锚定种子集上限(1–30) | 只影响一次扩散的宽度 |
325
- | `graphCascadeDepth` | `2` | 级联深度(1–3) | 深度与召回面线性相关,3 容易把远邻拉进来 |
326
- | `graphWeightEnabled` | `false` | 块2 边权重演化:被寻回路径的边权重抬升(只加不减、封顶 1.0) | opt-in;关 = 边初值纯由建边来源决定 |
327
- | `graphWeightDelta` | `0.1` | 单次有效触达的抬升幅度(0–1) | 与其他 graph 开关无关的纯阈值 |
328
- | `graphPassiveConfirm` | `false` | 块4 被动确认:heat 触达(召回/注入)即给挂联关系边抬一格 | opt-in;关 = 零行为变化 |
329
- | `graphInjectHint` | `false` | 块3 关联提示标注:图召回候选在注入文本里以「[检索线索] …」标出 | 关 = 只参与排序、不改变注入块构成(保守档) |
330
- | `graphInjectBudget` | `1` | 图召回候选在注入块里的独立预算(0–5 条) | 不占 `maxInjectedItems` 名额;0 = 关闭 |
331
-
332
- ## 热度
333
-
334
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
335
- |---|---|---|---|
336
- | `heatEnabled` **light** | `false` | 热度曲线(遗忘):热度字段 / sleep 降级联判(#218) | opt-in;关 = sleep 退回纯时间分层 |
337
- | `injectHeatEnabled` | `false` | 注入排序乘 heat(#218 / E5 考卷:heat 乘进注入排序在真实年龄混合下饿死老约束,拆独立开关默认关) | 依赖 `heatEnabled`;关 = 注入乘数恒 1(与 heat 关闭逐字节一致);开 = 恢复层内乘 heat 旧序 |
338
- | `heatGlobalBeta` | `1.0` | 广义指数形状参数 β(0.5–2) | 专家调优项,不进面板白名单 |
339
- | `heatTypeDecay` | 内置默认 | per-type 衰减 λ(键为 type 字符串) | λ=0 的类型免疫(热度恒 1、sleep 永不降级) |
340
-
341
- ## API 与工具面
342
-
343
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
344
- |---|---|---|---|
345
- | `apiToken` | 空 | 宿主内 API 敏感端点的共享 token | 空 = 只读端点保持开放(DSH 绑 127.0.0.1 且无内建鉴权) |
346
- | `externalApiEnabled` | `false` | 独立 `node:http` 数据面(生态集成用) | opt-in;双宿主共用库时只能一边开(端口冲突) |
347
- | `externalApiPort` | `8790` | 端口 | — |
348
- | `externalApiHost` | `127.0.0.1` | 绑定地址 | 改成非回环 = 把整个记忆库暴露给网络,自负其责 |
349
- | `disableMemorySearch` | `false` | 对模型隐藏 `memory_search` 工具(v0.8.5) | 慢/轻量模型的工具往返节流;隐藏即不可调 |
350
- | `disableMemoryArchive` | `false` | 对模型隐藏 `memory_archive` 工具 | 同上 |
351
- | `organizeEnabled` | `false` | 对模型开放 `memory_organize` 工具(#231:先 dryRun 出比对报告,agent 判断后 apply 落库) | 与上面两个**反向**:那两个藏默认在场的工具,本键开默认不在场的能力。关 = 工具根本不注册(模型看不到就不会调)。dryRun→apply 是两步协议,弱模型容易漏 `run_id` 或跳过报告,所以 `LIGHT_MODE_OFF` 里有它;apply 只能引用一次真实报告、且一份报告只许落地一次 |
352
- | `chorographyEnabled` | `false` | chorography(仓库地志,spec 见 docs/specs/)暴露闸:对模型开放三个只读工具(`choro_search` / `choro_read_page` / `choro_module_map`)+ 面板「仓库地志」浏览页 + 每轮的开局提纲注入 + `/choro` 命令 | 与 `organizeEnabled` 同款反向语义:关 = 工具根本不注册、面板页空态、注入块不渲染、命令不注册,行为与旧版逐字节一致。本键是「是否启用这个子系统」,不是「每轮付多少」——所以它仍**不进 `LIGHT_MODE_OFF`**,轻量档要压的是下面那条 `chorographyInject`。检索是关键词子串(M1);生成走 `dsh-mneme-choro` CLI(T0 确定性骨架 + `--t1` headless 语义富化) |
353
- | `chorographyInject` | `"light"` | 开局注入档位:`light` 只列文件数最多的 6 个模块(约 8 行)、`full` 列全部模块、`off` 不注入 | 只注模块名 / 文件数 / 页状态 / 页相对路径,**不含正文**(正文由模型 `choro_read_page` 取);注入块折进既有 memory context,不新开 context(spec §7「合并成一次拼装」)。`lightMode: true` 时在消费侧压成 `off`(见 `wiki/inject.js` 的 `resolveInjectTier`)——它**不进 `LIGHT_MODE_OFF` 表**,因为那张表对平铺键一律赋 `false`,枚举值塞进去会与 schema 不符 |
354
- | `chorographyAutoRefresh` | `false` | 重建骨架后是否顺手把「过期」标记也刷掉:`POST /choro/run` 带 `refresh: true` 时,面板发起的一次重建会同时重算 `choro_repos` 的 git 基线与 plan 指纹 | opt-in 默认关。它与 `chorographyEnabled` 同属「谁按下按钮」而非「每轮付多少」,故不进 `LIGHT_MODE_OFF`;关着时重建照常跑,只是过期判据留旧基线,面板会继续显示「代码已变更」 |
355
- | `chorographyT1FromPanel` | `true` | 面板「补语义正文(T1)」按钮的暴露闸:开 = 地志页能发起 `POST /choro/t1`,后台 spawn 一次 `dsh-mneme-choro --t1 --apply` 并轮询 `/choro/t1/status` | 默认**开**(只在 `chorographyEnabled` 已开时才有意义;关整个子系统仍然全灭)。它管的是「面板能不能点这一下」,T1 花的是模型额度但每次都是人的显式动作,所以不设第二道默认关;T1 有模块数/时长/重试三重上限(`src/wiki/t1.js`) |
356
- | `kbEnabled` | `false` | 知识库第二层(AI-Native 知识库,对标 Qoder Knowledge)暴露闸:对模型开放三个只读工具(`kb_list_collections` / `kb_search` / `kb_read_doc`)+ 面板「知识库」页 + `/api/dsh-mneme/kb/*` 路由 | 与 `chorographyEnabled` 同款反向语义:关 = 工具不注册、面板页空态、路由 409。知识库收的是外来原文副本,真源在 `kb_*` 三张表(不是磁盘 MD),**只碰 kb_* 绝不写 `memories`**、不进巩固/质量过滤任何池子。检索是 BM25 + 可选向量;单文档上限 2 MB,超限/不可读落 `status='error'` 行并回人话,不静默截断。不进 `LIGHT_MODE_OFF`:它没有每轮注入物,模型只在被问到时才调用 |
357
- | `actionPipelineEnabled` | `false` | M.O. 只读视图的门控:做法图谱 + 对话行结算卡 | opt-in beta;只是纯 UI 入口、不引入重型后台路径,故不进 `LIGHT_MODE_OFF`。写账另有独立的执行记账键(`/mo-run`),看图 ≠ 写账 |
358
- | `actionRunEnabled` | `false` | M.O. 执行记账:`/mo-run` 开一次执行窗口,窗口内命令执行才可能被记成一条 run | opt-in beta;挂在热路径(每个会话事件都过一次监听),故 `LIGHT_MODE_OFF` 里有它 |
359
- | `actionNudgeEnabled` | `false` | M.O. 自动沉淀:每轮结束(`turn/end`)后挖一次「这个项目重复走的动作」,结果落成 `memoryDir/proposals/<项目键>/` 里的提议,等人确认 | opt-in beta;三个 M.O. 键里最重的一条——挂 `session/event` 且要**同步解压 zstd 会话日志**(本机 118 份实测 16.2s,单次预算 `budgetMs`=4s 兜底),故 `LIGHT_MODE_OFF` 里有它。**永不自动落草稿**:`materialize` 恒 false,进仓库必须是人的显式动作 |
360
-
361
- > **M.O. 已下架(v0.13.x)**:上面三个键仍留在 schema 与设置白名单里、语义不变,但面板不再渲染 `group.mo` 那一组(从 `FEATURE_GROUPS` 摘掉,首屏位一并收回)。想恢复:把该组加回 `FEATURE_GROUPS` 与 `FEATURE_FIRST_SCREEN` 即可,旗标与座位注册逻辑零改动。设置只能走配置文件。
362
-
363
- ## 运行时与本地模型
364
-
365
- | 键 | 默认 | 作用 | 开启后果 / 冲突 |
366
- |---|---|---|---|
367
- | `localEmbedModel` | `Xenova/bge-small-zh-v1.5` | 本地嵌入模型(`embedProvider=local` 时) | — |
368
- | `localEmbedDimension` | `512` | 向量维度 | — |
369
- | `localEmbedDevice` | `cpu` | `cpu` / `gpu` | — |
370
- | `localEmbedBatchSize` | `8` | 批大小(≤64) | — |
371
- | `localEmbedPooling` | `auto` | 池化:`auto`(BGE→cls,其余→mean)/ `cls` / `mean` | 池化决定向量空间——改动会变 modelHash、触发既有索引重建 |
372
- | `ollamaBaseUrl` | `http://localhost:11434` | Ollama 地址 | 只接受 http/https(SSRF 防线) |
373
- | `ollamaModel` | `nomic-embed-text` | Ollama 嵌入模型 | — |
374
- | `embedModelCacheDir` | `""` | 模型缓存目录 | 空 = `~/.dsh/mneme/models` |
375
- | `embedModelMirror` | `https://hf-mirror.com` | 模型下载镜像 | — |
376
- | `resilientModelDownload` | `true` | 模型下载断点续传 + 空闲看门狗(#194) | 关 = 恢复原生 fetch(线上回滚开关) |
377
- | `runtimeDir` | `""` | 自管运行时目录(transformers + onnxruntime 闭包,#131) | 空 = `~/.dsh/mneme/runtime`;把重依赖挪出宿主 profile 的依赖图 |
378
- | `runtimeTarballDir` | `""` | 本地 `.tgz` 离线取件目录 | 有货优先于联网(弱网下装 onnxruntime-node 用) |
379
- | `runtimeMirror` | `""` | registry 镜像前缀(如 `https://npmmirror.com/mirrors/npm/`) | 空 = manifest 里的官方地址 |
380
- | `reindexMaxPerBoot` | `500` | 启动期向量回填的单次上限(原先硬编码 500) | `0` = 不限、本次跑完整个积压(4k 行积压靠重启九次才清空的旧行为就是被这个上限卡住的) |
381
- | `reindexBatchSize` | `10` | 回填批大小(1–64) | 越大单批 token/耗时越高 |
382
- | `reindexRateLimitMs` | `200` | 回填批间隔毫秒(限速) | 0 = 不限速 |
383
-
384
- ## lightMode 强制关闭清单(`LIGHT_MODE_OFF`)
385
-
386
- `lightMode: true`(或面板 `panel_mode=light`)时,以下键被预设强制为 `false`——都是
387
- 重型路径;核心循环(autoInject、autoSummarize、hotMemory*、质量过滤、关键词检索)不动:
388
-
389
- `entityExtractionEnabled` · `autoDream` · `sleepModeEnabled` · `sleepAffectiveEnabled`(#619) · `rerankEnabled` ·
390
- `autoReindexOnBoot` · `hybridInject` · `injectGuidanceEnabled` · `searchSemanticDedup` ·
391
- `selectiveInjectEnabled` · `bm25SearchEnabled` · `entityRecallEnabled` ·
392
- `graphAnchoringEnabled` · `graphWeightEnabled` · `graphInjectHint` · `graphPassiveConfirm` ·
393
- `actionRunEnabled` · `actionNudgeEnabled` ·
394
- `dreamNarrativeEnabled` · `documentMemoryEnabled` · `heatEnabled` · `continuityRescueEnabled` ·
395
- `organizeEnabled`(#231) ·
396
- `profileExtractEnabled`(#497) ·
397
- `profileFactsEnabled`(2026-11-06) ·
398
- `preInjectGate.enabled`(#380) · `distillRecords.enabled`(#399) ·
399
- `diaryEnabled`(v0.13,每天一篇 = 一次 LLM 调用,属重型)
400
-
401
- 预设只是默认值而非强制:用户显式写进 feature_flags 的值在装配顺序上后展开、仍然生效
402
- (「用户开关 > 轻量预设 > bundle 配置」)。
1
+ # 配置说明(全键参考)
2
+
3
+ > 正本是 `src/config.js` 的 schema——本文与其同步维护,键名、默认值、取值范围以代码为准;
4
+ > 行为动机与踩坑出处在 schema 注释里(含 issue 编号),本文只保留「怎么配、配了会怎样」。
5
+ > 改 schema 时顺手更新对应行(新改动自查清单第 2 条)。
6
+
7
+ **怎么读这张表**
8
+
9
+ - 「默认」列即 `config.js` schema 的解析默认值;默认值本身 = 未配置时的行为。
10
+ - 标 **light** 的键会被 lightMode 预设强制关闭(文末附完整清单);lightMode 是预设不是
11
+ 强制——用户显式写在 feature_flags 里的值优先于预设。
12
+ - 行为开关(布尔键)默认关的即 opt-in:不开 = 行为与该键存在之前逐字节一致。
13
+ - 绝大多数行为开关与部分阈值/路由键在 `settings.js` 的白名单里,可在面板「功能开关」
14
+ 逐项启停(线上回滚开关);未入白名单的键(路径、词典、枚举外的杂项)只能改 bundle 配置。
15
+ - **「面板能改 / 只能改文件」不用在这里逐行标注**:面板「设置 → 连接 → 配置键覆盖面」
16
+ 那张只读卡会实时把两者交/差出来(`GET /api/dsh-mneme/config-keys`,只回键名与计数、
17
+ 不回任何值)。清单由 `src/config-keys.js` 从 schema 与白名单现算,改哪边都不会漏。
18
+ 那里还会单独列出「白名单登记了、但 schema 没给默认值」的键——这类键在面板上有输入框,
19
+ 留空时却不会进「当前生效值」。
20
+
21
+ 路径键改完落点,见 [DIRECTORIES.md](DIRECTORIES.md)(注意各路径键的 `~` 展开规则不一致)。
22
+
23
+ ## 全局与存储
24
+
25
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
26
+ |---|---|---|---|
27
+ | `language` | `zh` | 记忆语言:生成条目、注入标题、后台提示词所用语言(`zh`/`en`) | 切换后重启生效 |
28
+ | `memoryDir` | `~/.dsh/memory` | SQLite 记忆库目录 | WAL + busy_timeout 已为多进程就绪;两个宿主共用库时 `externalApiEnabled` 与 `autoDream` 只能一边开 |
29
+ | `lightMode` | `false` | 轻量档总闸:一键关掉全部重型路径,保留核心循环(见文末清单) | 面板 `panel_mode=light` 等效为 `true` 且优先于 bundle 配置 |
30
+
31
+ ## 容量预警(#275,空间维度)
32
+
33
+ 库体积 / 归档区规模过线时在 `GET /api/dsh-mneme/health` 的 `capacity` 块与面板「库体积」卡上报。三道阈值都是**观察口**,不是动作触发:没有周期性消费者(`/health` 被读到才算一次),预警也永不自动归档 / 删除——真删由人显式确认(#275 拍板),出口是维护卡的无损回收(`dsh-mneme reclaim`,见 [STORAGE.md](STORAGE.md))。判级实现 `service.getCapacityHealth`,与镜像健康 fail-safe 同款:读失败显式 `status:"unknown"`,绝不伪装 ok。
34
+
35
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
36
+ |---|---|---|---|
37
+ | `capacityWarning.dbSizeWarnMb` | `256` | 库磁盘足迹(主文件 + WAL + SHM)预警线,整数 MB | **0 = 关掉这条检查**。默认锚定议题实测:55 MB 库 VACUUM 0.8s,256 MB 起代价才值得先看数字再动手(议题「现在便宜、以后贵」) |
38
+ | `capacityWarning.archivedRowsWarn` | `5000` | 归档区行数预警线 | **0 = 关**。锚定议题形态区间「归档是数千条这个量级」的上沿(实测 2,400 时还没坏) |
39
+ | `capacityWarning.archivedRatioWarn` | `0.95` | 归档占比(归档 / 全部)预警线,浮点 0–1 | **0 = 关**。健康形态本身就落在 0.8~0.9(活跃数百 / 归档数千),0.9 会对着健康库报警;0.95 起才是「归档区吞掉活跃区」的形态 |
40
+
41
+ 三个键都走 feature_flags 白名单(面板可改,改动是**启动快照**,与 `panel_mode` 同节奏,面板显示「待重启」);两个整数走 INT_RANGES、占比浮点走 NUMBER_RANGES。不设 `enabled` 总开关:数字恒在 `/health`,把某条检查关掉就是把对应阈值设 0。`:memory:` 库没有磁盘足迹,`db_size` 检查缺席(不是 ok);答复只带数字、不带库文件路径。归档增速(净增速率)是 recall-stats `archive` 块的第五指标,不在这里重复。
42
+
43
+ ## 逐会话无痕(issue #539)
44
+
45
+ 命中会话后,Mneme 不向该会话注入记忆、用户设置或工具指引,不接受其 `memory_*` / `set_scope_state` 工具调用,不对它蒸馏,也不由压缩抢救、M.O. 记账或自动提议路径保存该会话的内容。
46
+
47
+ 自动匹配**只认宿主自己的委派标记**:会话头里 `origin === "subagent"`,或 `delegationDepth` 是正数。**`parentSession` 不是判据**——`sessions.fork()` 造出来的主会话分支同样写这个字段(fork 只写 cwd / parentSession / isSeeded,不写 origin、不带 delegationDepth),把它当判据就是「fork 一下就整体失忆」。兼容别名 `parentSessionId` 同理不读;旧形状 `requestHeader().config` 仍作为取头的第二条路。captain 会话不会因其有子代理而自动命中,队长侧对交付物的蒸馏仍由队长会话本身决定(#211 的边界)。
48
+
49
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
50
+ |---|---|---|---|
51
+ | `sessionGateEnabled` | `false` | 逐会话无痕总开关;可通过 bundle 配置或 `/api/dsh-mneme/features` 设置 | opt-in;关闭时恢复既有 Mneme 行为。feature flag 按现有设置契约在重启后生效 |
52
+ | `sessionGateSubagents` | `true` | 总开关开启时,自动命中子代理会话;可通过 bundle 配置或 `/api/dsh-mneme/features` 设置 | 关闭后仍保留手动名单匹配;单独打开本键不生效 |
53
+ | `sessionGateSessions` | `[]` | 手动指定精确 session id 的数组,只能写在 bundle 配置 | 手动匹配与子代理识别互相独立;改完配置后由宿主重新装载插件生效 |
54
+
55
+ 逐会话消费点会直接检查当前 `Session`,因此首个 `session/event` 到达前也能识别完整会话头;**拿不到 id 也照判**(注入面在上下文组装期就跑在这条路径上,那时未必有可用 id)。事件订阅另外缓存已观察到的子会话 id,供会话日志扫描过滤——那张表只服务「拿得到 id、却解析不出头」的退路,有界淘汰,淘汰只影响那一次日志过滤。面板的 `/features` 只支持标量开关,不持久化 `sessionGateSessions` 数组。
56
+
57
+ 边界:不带调用会话上下文的管理 API(如手动 `/nudge`)仍按管理操作处理,不继承某一个会话的闸门。
58
+
59
+ ## scope 隔离(issue #17)
60
+
61
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
62
+ |---|---|---|---|
63
+ | `scopeEnabled` | `false` | 存储层总开关:**两条写入路径**(工具调用 `memory_save`/`memory_update`,以及机器提炼·会话蒸馏)都自动标注 agent_scope / workspace_scope(标注只贴**新建行**:并入既有行时不重贴,既有行的归属属于它原来被提炼出来的语境),去重键扩展;检索与注入排序按当前会话作用域加权(命中 ×1.25、他 scope ×0.5 保留可见,issue #339 补齐注入通道) | opt-in;关 = 写入不标注、行为与 A1 前逐字节一致 |
64
+ | `strictScope` | `false` | 硬过滤模式(A3):他 scope 完全不可见、未标注恒可见(fail-closed);硬过滤先于软加权执行 | 依赖 `scopeEnabled` 打开才有意义;关 = A2 软隔离(他 scope 降权保留可见,检索与注入同权重) |
65
+
66
+ ## 作用域级可逆闸门(issue #471)
67
+
68
+ 上面两个键是**事实轴**——答「这条记忆属于谁」,改的是归属数据、跟着记忆行走。下面两个键是**政策轴**——答「这个作用域现在通不通」,由人按作用域整体按下、跨会话存续、松开即原样回来,**一条记忆行都不动、一个配置键都不改、不用重启**。两条轴落在同一个判定出口(`gateByScope`,全仓唯一的过滤实现),可叠加。
69
+
70
+ 按下与松开走工具 `set_scope_state`(`dimension`: `agent`/`workspace`,`scope_value`: 标签本身或 `*` 表示该维度全局,`state`: `paused`/`active`)。状态存 `scope_state` 表,键 = 维度 + 作用域值,`UNIQUE(dimension, scope_value)` 保证幂等:**重复按下同一状态不刷新 `decided_at`**(同 `memory_archive` 的取舍——否则「最后一次真正变更」的时刻会被噪声盖掉)。
71
+
72
+ 两级语义与 `writeAdmission` / `preInjectGate` 同构:先观察、再拦。
73
+
74
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
75
+ |---|---|---|---|
76
+ | `scopeState.enabled` | `false` | 跑政策轴判定:被按下的作用域其候选**照常注入**,但每次落一条 `llm_audit_logs`(`trigger_source=scopeState`,`metadata.paused` 记被按下的是哪些作用域、`metadata.gated` 记本应拦下几条、`metadata.enforced=false`) | 关 = 判定不跑、行为与今天逐字段一致。先看「如果按下会少掉多少」的真实分布,再决定真按——`gated` 恒为 0 就说明这一路本来就没在供料 |
77
+ | `scopeState.enforce` | `false` | 真的不注入:被按下的作用域其候选出池(检索侧同款,`gateByScope` 一处生效;巩固与睡眠两侧的读入口与写入路径同款) | 关 = 仅观察(`metadata.enforced=false`)。**enforce 无 enabled 时无效果**(同 `preInjectGate`)。按下的是政策不是事实:记忆行、向量、归档位、作用域标注全部不动,松开即恢复 |
78
+
79
+ 覆盖范围:`gateByScope` 的三条检索路(融合池、`entity:`、`attr:` 前缀路)与注入候选池(`injectCandidates` 内、图召回合并之后、pin 池之前)。
80
+
81
+ **不覆盖检视面**:`memory_list`、`memory_get`、面板列表**刻意不过这道闸**(它们走 `strictVisibility` 与 `store.list` 的 `visibility` 参数,是另一条平行的链)。按下之后人还要能查「我按下了什么、里面有什么」——检视面关掉,人就没有入口确认该不该松开。这也正是「按下的是政策不是事实」的具体含义:行还在,只是不再喂给模型。
82
+
83
+ **巩固(dream)侧另接四处**:`activeStoreSize`、叙述条 `inputs`、`runDream` 的读入口、总览 `summaryAll`——否则被按下的行会照常参与阈值判定与合并。**总览那一处只能从源头挡**:总览落库时是**无作用域**的 summary 行,而 `gateInjection` 只拦匹配暂停作用域的行,没有标注的行永远不会被它拦下;被按下的内容一旦进了总览就变成「洗干净的全局行」,此后一直注入。
84
+
85
+ **睡眠(sleep)侧另接四个相位**:冲突消解、归档降级、模式发现、关系补全的候选池。这一侧比日间更要紧,因为**它不只读**——`phaseDemotion` 会 `setArchived` 与 `demoteToSummary`(真改归档面),`phasePatterns` 会铸出 `type=pattern` 的新行;不接的话闸门开着而每 6 小时一次的睡眠照样在被按下的作用域上动手,「按下」就只等于让它在白天看不见。两处位置纪律写在注释里:降级的过滤放在循环之外(不是循环体里 `continue`,免得将来有人加副作用时漏掉),模式发现的过滤排在 `.slice(0, limit)` 之前(否则被按下的行照样占名额,它们既不会被扫、也不该挤掉别人)。
86
+
87
+ `llmAudit.enabled=false` 时观察档一行都不写(同 `writeAdmission` 的口径)。不进 lightMode 强制关闭清单——它只是查一张小表的判定,不引入重型后台路径、不加常驻文本(同 `actionPipelineEnabled` 的定性)。
88
+
89
+ ## 审计
90
+
91
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
92
+ |---|---|---|---|
93
+ | `llmAudit.enabled` | `true` | 后台 LLM 调用全量落 `llm_audit_logs`(tokens / 时长 / 状态 / 触发源) | 覆盖 autoDream / autoSummarize / sleep / entityExtract 与写入准入测量点;关 = 一行不写 |
94
+ | `llmAudit.retentionDays` | `90` | 审计表滚动清理保留天数(≤3650) | 启动时清理旧行 |
95
+
96
+ ## 写入准入(#254)
97
+
98
+ 写入前判定「这条该不该进库」,与 `memoryQualityFilter` 的分工是**时点**不是判据:那个是写入后打分归档(扣分可以错,只影响排序与归档),这个是写入前判定(硬拒不能错)。两个键都默认关,分层是为了把「先观察」和「开始拦」分成两次上线。
99
+
100
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
101
+ |---|---|---|---|
102
+ | `writeAdmission.enabled` | `false` | 跑第 1 级确定性判据:空白 / 纯噪声 + 密钥 / PII(判据来源是 #164 A2,经 `sensitiveScan` 注入) | 关 = 不判定、不拒绝,`evaluate` 返回与只计量阶段逐字段一致。命中 → 审计行带 `metadata.deny` |
103
+ | `writeAdmission.enforce` | `false` | 命中时真的拒绝(`store.save` 之前返回) | 关 = 仅告警:判据照跑、审计照留、写入不拦(读审计时「`deny` 非空且 `decision=allow`」即这一档的指纹)。被拒写入不落库、不通知、不排嵌入,`memory_save` 返回 `action:"denied"` + `reason` |
104
+ | `sensitiveScanEnabled` | `false` | A2 密钥 / PII 判据的来源(`sensitive-scan.js`)。开 = 判定结果可被写入准入消费;只覆盖带 sessionKey 的写入路径 | 关 = 扫描器不参与,`writeAdmission` 第 1 级只剩空白/噪声判据。**经 MCP / 8790 / `/import` 的写入不带 sessionKey,不进这道闸**(`write-admission.js` 的文件头注释点名了这条边界) |
105
+
106
+ 第 1 级的判据面刻意收窄:**去重键命中不进第 1 级**(归 write-update 放行——同步近重复门跑在异步矛盾检测之前会把本该被裁决的矛盾直接拒掉),G1/G2 阈值也只是计量。两个键都走 feature_flags 白名单(面板可启停)。
107
+
108
+ ## 注入前判定(#380)
109
+
110
+ 每帧注入候选出池后、进入 system prompt 前,一次**池级** LLM 调用判出「会向本次请求注入意见/立场」的记忆(判定协议与 E12 实验同源;实验依据:D1 判定+过滤把谄媚率 26.9%→2.5%,判定+标记比过滤差 +17.6pp——判定结果**只给闸门用,绝不进模型上下文**)。两级语义与 writeAdmission 同构,落点在注入面而非写入面。
111
+
112
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
113
+ |---|---|---|---|
114
+ | `preInjectGate.enabled` | `false` | 跑池级判定。判定 async prefetch + cache、渲染帧同步消费(宿主 systemPrompt 渲染是同步回调) | 关 = 注入行为与现状逐字节一致。**冷缓存首帧降级**:新查询的第一帧原样注入,下一轮同 key 渲染生效;判定完成落 `llm_audit_logs`(`trigger_source=preInjectGate`,真实 token 用量,`related_memory_ids`=被标记记忆)——先观察真实负载的意见占比分布 |
115
+ | `preInjectGate.enforce` | `false` | 缓存命中帧真的滤除被标记候选 | 关 = 仅观察:候选集不动。**enforce 无 enabled 时无效果**。pin 池(constraint/preference,#249 逐字保真)与 graphHint 线索行豁免——判定与过滤只作用于一般记忆槽 |
116
+
117
+ 降级路径:判定失败/超时/不可解析 → 本帧原样注入 + 审计行 `degraded:true` 且不缓存(下一帧重试)——防线故障永不阻塞注入;连续失败 3 次熔断一个冷却期(判定器系统性坏掉时不再逐帧花钱,到期自动恢复)。**整池被标记**时放弃本帧 enforce(fail-open):记忆正文是判定模型的可影响输入,一条指令型记忆不该让整个记忆块静默失明——该形态在审计行里就是 `n_flagged == n_pool`(判定与审计按原样保留,只有滤除让位)。判定 LLM 走 `agentDefaultModel` 当前选择(entity adapter 同款装配,无独立 provider/model 键;审计行带实际模型与用量,无默认模型路由时 `model_id` 落 `unknown` 占位——判定生效就必有账;成本痛了再加覆盖键)。缓存键 = 查询 + 候选 `id:内容` 集,候选集变化(轮换/新记忆)或候选内容被就地修正(`updateMemory`)即重新判定,不吃旧判定;命中刷新序(LRU,容量 8)。`llmAudit.enabled=false` 时本闸不运行(无账目的判定不可见也不该花钱)。lightMode 强制关(LLM-per-turn 附加路径与低资源档互斥)。
118
+
119
+ ## 蒸馏(会话 → 记忆)
120
+
121
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
122
+ |---|---|---|---|
123
+ | `autoSummarize` | `true` | 会话/回合结束自动蒸馏记忆。E10 EdgeMem 考卷(#339)实测:对「未来才问的具体值」类细节,零 LLM 原样写入保真 100% 而蒸馏丢 17/120——蒸馏的归纳收益在别的口径,二者是并存关系而非替代(原样写入并存的产品化见讨论 #361) | 关 = 只剩工具与命令写入口 |
124
+ | `summarizeProvider` / `summarizeModel` | 空 | 蒸馏专用模型路由 | 两者都非空才生效;空 = 用会话当前模型 |
125
+ | `distillMaxChars` | `24000` | 喂给蒸馏 LLM 的完整转录上限(字符,1000–200000) | 调大更完整、更贵 |
126
+ | `imageDescribeEnabled` **light** | `false` | 图像描述档([DISTILL.md](DISTILL.md) 的「描述档」):蒸馏时先用一个能看图的模型给每张图写一句描述,把描述并入转录再蒸馏 | opt-in;每张图多一次视觉调用,进 lightMode 强制关闭清单 |
127
+ | `imageDescribeProvider` / `imageDescribeModel` | 空 | 描述档专用路由 | **两者都非空才生效,且留空 = 整档不跑**——与 `summarizeProvider` 的「空 = 跟随会话当前模型」语义刻意不同:蒸馏路由多是纯文本模型,拿它看图只会换回占位。宿主侧按 `inputModalities` 决定发不发图字节,本插件不读图、不存原图 |
128
+ | `summarizeMinIntervalMinutes` | `0` | 同会话两次蒸馏的最小间隔(分钟,≤10080) | 0 = 不限(#127 节流三键之一) |
129
+ | `summarizeMaxEntriesPerRun` | `0` | 单次蒸馏最多落库条数(≤50) | 0 = 不限 |
130
+ | `summarizeMinWindowChars` | `0` | 窗口可蒸馏文本下限(字符),不足直接跳过 LLM(#239) | 被挡窗口照常消费游标并留 skip 审计 |
131
+ | `summarizeMaxRunsPerSession` | `0` | 每会话蒸馏次数预算,只计真实发起的调用(≤1000) | 0 = 不限;进程内计数,重启清零 |
132
+ | `summarizeParseFailureMaxRetries` | `0` | 连续解析失败几次后放弃当前窗口(0–10,0 = 关,#493) | 达到阈值强制消费游标跳过该窗口;失败行 metadata 恒带 `raw_head`/`raw_has_bracket`/`streak` |
133
+ | `summarizePeakHours` | `""` | 高峰时段串(`"09:00-18:00"` / `"mon-fri 08:00-12:00,14:00-18:00"`,支持跨零点;全角逗号/冒号/数字自动归一,#424) | 命中高峰不调 LLM、顺延补跑;任一写法非法整串按未配置处理。**非法不静默(#622)**:非空且解析失败时启动日志 warn 一条(带键名与原串)、面板该键输入行下出红色提示(`/features` 的 `invalidPeakHours`);空串是合法的未配置,不告警 |
134
+ | `summarizePeakMaxDeferMinutes` | `120` | 高峰顺延上限(分钟,≤1440) | 0 = 不设上限;到点仍处高峰照跑(bypassPeak) |
135
+ | `summarizeDedupeMode` | `off` | 落库前去重档位:`off` / `title`(拦完全同名)/ `vector`(同会话语义近邻) | `vector` 复用已有 embedding 列,无 LLM 调用 |
136
+ | `summarizeDedupeMinSim` | `0.92` | `vector` 档并入阈值(0.5–0.99) | 仅 `vector` 档生效 |
137
+ | `summarizeDedupeWindowHours` | `24` | `vector` 档回看窗口(小时,≤168) | 仅 `vector` 档生效 |
138
+ | `distillRateLimitIntervalMs` | `1000` | 蒸馏请求全局串行排队的相邻间隔(毫秒) | 0 = 关闭排队(默认开的 429 保护随之失效) |
139
+ | `distillRateLimitRetries` | `3` | 命中 429 的指数退避重试次数(≤10) | 重试全程对用户透明 |
140
+ | `distillRateLimitBaseDelayMs` | `1000` | 429 退避基数(毫秒,100–60000) | 1s→2s→4s… |
141
+ | `summarizeReasoningEffort` | `none` | 蒸馏 LLM 推理档位:`off`/`low`/`medium`/`high`/`none`(#315) | `none` = 不发字段用服务商默认;思考模型建议 `off`/`low` 防推理烧光输出预算 |
142
+ | `codingRetrospect` | `false` | 编码记忆蒸馏:rejected_solution / pitfall / constraint 三类 | opt-in;开启后蒸馏上下文为整轮完整对话 |
143
+ | `codingKeywords` | 内置词表 | 编码任务识别词表(读取侧门控) | 命中才注入编码记忆 |
144
+ | `codingBoostFactor` | `2` | 编码任务时编码记忆的 importance 加权系数(1–5) | — |
145
+ | `memoryQualityFilter.enabled` | `true` | 写入质量打分:≥60 正常 / 30–60 降权 / <30 归档打 low_quality 标 | 归档行仍可显式搜到 |
146
+ | `memoryQualityFilter.archiveThreshold` | `30` | 自动归档线 | 与 `exemptImportance` 联动 |
147
+ | `memoryQualityFilter.degradeThreshold` | `60` | 降权线(注入排序乘 quality_score) | — |
148
+ | `memoryQualityFilter.minContentLength` | `10` | 最短内容长度(字符) | — |
149
+ | `memoryQualityFilter.exemptImportance` | `4` | importance ≥ 此值豁免静默自动归档(#135) | 设 1 = 等效关自动归档 |
150
+
151
+ ## 蒸馏原文留存与溯源(#399)
152
+
153
+ 把蒸馏从「替换」降级为「叠加索引」:蒸过的窗口原文旁路落 `distill_records`,每条新记忆落 `memory_provenance` 回指来源窗口。**渲染与落盘共用同一隐私谓词**(`publicTranscriptParts`)——私有推理链与插件注入的机器内容两条路都不进;工具入参与结果只进渲染、不落盘。留存文本不受 `distillMaxChars` 与工具裁剪约束。详见 [蒸馏原文留存与记忆级溯源](DISTILL.md)。
154
+
155
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
156
+ |---|---|---|---|
157
+ | `distillRecords.enabled` **light** | `false` | 蒸馏时顺带留存窗口原文 + 写记忆级溯源链接;同时是溯源读出口(`GET /memory/provenance` 与宿主内 `/api/dsh-mneme/memory/provenance`)的总闸 | opt-in;关 = 一行不写、连收集都不做,行为与 #399 之前逐字节一致;读出口此时回 `409 {"error":"distill-records-disabled"}`(与「装配没接线」的 503 分开读数)。**关开关 ≠ 删掉已留存的原文**:只不再经 HTTP 提供,盘上的行要 `dsh-mneme reclaim` 或重新开启后的启动裁剪才走。开关是**启动快照**(与 `panel_mode` 同节奏),面板改完要到下次启动生效,面板会显示「待重启」 |
158
+ | `distillRecords.retentionDays` | `90` | 原文保留天数(1–3650) | **只管启动期裁剪**(`src/index.js`,`enabled` 时动手)。`dsh-mneme reclaim` 不读这个键:它对三个表用同一条 `--older-than` 截止(默认 7 天),想对齐就显式传成与 `retentionDays` 相同的值(见 STORAGE.md)。两处都**只删 `distill_records`**,溯源链接保留指向空区间(显示「来源已过期」),绝不级联删记忆 |
159
+
160
+ 两个键都走 feature_flags 白名单(面板可启停);`enabled` 进 lightMode 预设关闭清单,`retentionDays` 不进(它是时长不是行为面,用户显式设过就照旧)。`dsh-mneme reclaim` 的报告从两项变三项(`planned` / `column_bytes` / `cleared` 各多一个 `distill_records`),入口语义(默认 dry-run、`--apply` 才动手)不变。已知边界:无历史回填、从未蒸馏过的窗口不留记录、不覆盖工具结果与 code 输出。
161
+
162
+ `enabled` 这一格**同时管读写两侧**(#509 评审整改后):写侧是蒸馏时是否落盘(`src/summarize.js:988`),读侧是溯源读出口是否把原文读出去(判据在 `src/provenance-http.js`,与写侧逐字同源,只此一份)。关着时读出口回 `409 {"error":"distill-records-disabled"}`——但**盘上的原文不会因此消失**:保留期裁剪与写入同在 `src/index.js:270` 一道门里,关掉开关意味着「不再写、启动期也不再裁」,已留的行会一直躺在库里,直到 `dsh-mneme reclaim`(它不读这个键,手动可删)或重新开启后的启动裁剪。所以「关掉就干净了」是误读,诚实的表述是「关掉 = 不再经 HTTP 提供」。
163
+
164
+ **运行归因(#512)不加开关**:溯源窗口另外带 `distill_run_id / run_type / trigger_source / run_status`,答复级另带 `mints[]`(这条记忆出生自哪一轮 dream / sleep)。它记的是归因元数据、不含任何会话正文,所以不依附 `distillRecords.enabled`——上面那枚开关关着时端点照旧 409,但 `distill_runs` 与 `memory_mints` 两张表仍在记账。改造之前写下的行刻意留 NULL、不补:反推一个「看起来能追」的合成 id 比没有归因更坏。
165
+
166
+ ## 注入
167
+
168
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
169
+ |---|---|---|---|
170
+ | `autoInject` | `true` | 每轮自动注入记忆块的父总闸 | 关 = 两个子开关一并失效(持久值保留,不重置) |
171
+ | `maxInjectedItems` | `5` | 注入条数上限(1–20) | — |
172
+ | `importanceThreshold` | `3` | 注入候选的 importance 下限(1–5) | 低于该值的记忆不进注入面 |
173
+ | `injectRotationTurns` | `0` | 跨轮轮换:最近 N 轮注入过的不再优先(#205) | opt-in;面板设置页可调(#637 起进 feature_flags 白名单,此前只能写配置文件);会话边界自动重置 |
174
+ | `injectContentMaxChars` | `300` | 单条正文截断上限(60–4000,#164①) | 截断带「上限/原长/全文指引」提示,不静默 |
175
+ | `injectUncertaintyAdaptive` | `false` | 确定性强的话题收缩注入条数(减半、下限 1,#239 第 5 项) | 只做单向收缩,绝不越过 `maxInjectedItems` |
176
+ | `injectGuidanceEnabled` **light** | `true` | 工具描述 + order 150 系统段讲「何时查/何时写」(#249) | `autoInject` 子开关;lightMode 强制关 |
177
+ | `continuityRescueEnabled` **light** | `false` | 压缩边缘双落点:连续性提案落库 + 追加注入(#249 N3) | opt-in(新注入表面);`autoInject` 子开关;订阅宿主压缩事件,无该时机则降级为持久规则 |
178
+ | `pinnedInjectBudget` | `0` | 约束/偏好 pin 池独立预算(0–5,#249 B1) | 0 = 关;pin 不占 `maxInjectedItems` 名额 |
179
+ | `hotMemoryEnabled` | `true` | 会话近期对话渲染在长期记忆块之前 | 热记忆只回放**已完成的轮次**:正在组装的这一轮不渲染(提问本来就在 prompt 里,重复渲染 + 回答落地后的文本抖动会让宿主一轮追多份注入快照,#637) |
180
+ | `hotMemoryRounds` | `5` | 热记忆覆盖最近几轮对话(≤50) | — |
181
+ | `hotMemoryMaxTokens` | `2000` | 热记忆块 token 上限(200–32000) | — |
182
+ | `escapePromptVariables` | `true` | 注入内容连续花括号转义(#162) | 关 = 原样透传(DSH interpolate 可能 throw) |
183
+ | `injectTimePrefix` | `false` | 对话开始注入一次当前时间(#34,v0.7.11 误删后随 #333 恢复) | opt-in;格式与键名与 v0.7.2 一致,存量 feature_flags 恢复即生效 |
184
+ | `personaEnabled` | `false` | 人格段:用户自写的一小段常驻注入文本 | opt-in;只是轻量常驻文本、不引入重型后台路径,故不进 `LIGHT_MODE_OFF` |
185
+ | `personaStrictAddressing` | `false` | 人格寻址口径。关(历史行为):会话身份没建卡、或该卡被显式关掉时,落 `default` 卡 | 开:这两种情况都不注入人格,`default` 只兜「解析不到会话身份」的无名会话。用途是宿主里跑着自带身份的外部 bot 时,别让某个人格无条件进它每一帧。默认关 = 升级零变化 |
186
+ | `profileExtractEnabled` **light** | `false` | 画像提取草稿:`POST /api/dsh-mneme/profile/extract` 从活跃记忆反向写一段「助手眼中的用户」草稿(面板「Agent 眼中的你」卡上的按钮) | opt-in;一次调用一轮 LLM + 读上百行记忆,故 `LIGHT_MODE_OFF` 里有它。**只出草稿副本**:它不写 `user_settings`,面板也只把结果当副本展示、可一键复制(2026-11-04 改口径,此前「采用为画像」会直接覆盖手写画像且无撤销)——画像正文必须是用户自己手写的原文。空库直接报 `no-input`、模型没按格式回报 `unparseable`,两者都不回空草稿 |
187
+ | `profileFactsEnabled` **light** | `false` | 自动画像事实:「Agent 眼中的你」按会话身份分卡维护一份逐条事实清单(对标 ChatGPT 记忆 / DS Bot 每 bot 的 MEMORY.md)——dream 巩固轮成功后逐卡增量维护(有新记忆才跑),注入在手填画像之后;面板可手动触发与逐条增改归档,账本逐 op 可查 | opt-in;自动维护轮是 dream 级 LLM 调用 + 读上百行记忆,故 `LIGHT_MODE_OFF` 里有它(注入段本身是几十行常驻文本,关掉省的是维护调用不是注入)。事实住 `profile_facts` 独立三表,**绝不写 `user_settings`**(#497 口径不变:手填画像是用户原文,模型只有读权)。输入行严格按 `agent_scope` 分区、排除外来行;账本 `profile_fact_journal` 每卡裁剪到最近 200 条 |
188
+
189
+ ## 巩固(autoDream)
190
+
191
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
192
+ |---|---|---|---|
193
+ | `autoDream` **light** | `true` | 阈值触发的后台巩固(LLM 合并/归档/降重) | lightMode 强制关;与 sleepMode 串行、不重叠 |
194
+ | `dreamThresholdCount` / `dreamThresholdChars` | `10` / `5000` | 触发阈值(新增条数 / 字符,双过才跑) | — |
195
+ | `dreamDelayMs` | `2000` | 触发后的延迟(毫秒) | — |
196
+ | `dreamMinIntervalMinutes` | `0` | 两次开跑最小间隔(分钟,≤10080,#89) | 失败/degraded run 也占用;0 = 不限 |
197
+ | `autoDreamFailureBackoff` | `false` | 连续失败指数退避:有效间隔 = 基数 × 2^连败,封顶 30 分钟(#292) | opt-in;基数取 `dreamMinIntervalMinutes`(0 = 无闸可翻倍);成功一次清零;重启归零 |
198
+ | `dreamInputSummaryEnabled` | `false` | dream 审计行输入快照瘦身(#557):auto 轮只落骨架(id/type/title/importance/updated_at,不含 content) | opt-in;LLM 输入与 `snapshot_hash` 都不受影响;organize 轮重放载荷不受影响;开启后审计行无法离线重算 hash(骨架级回放) |
199
+ | `dreamPeakHours` | `""` | 巩固错峰,与 `summarizePeakHours` 同一份时段语法(#239;全角逗号/冒号/数字同样归一,#424) | 命中高峰不做梦、阈值继续累积、留 skip 审计;非法写法按未配置,且同 `summarizePeakHours` 的 #622 可见性(启动 warn + 面板提示) |
200
+ | `dreamPeakMaxDeferMinutes` | `120` | 巩固顺延上限(分钟) | 0 = 不设上限;到点仍处高峰照跑 |
201
+ | `dreamProvider` / `dreamModel` | 空 | 巩固专用路由(settings「巩固模型」) | 建议非思考模型——思考模型易烧光预算返回空体(#135) |
202
+ | `dreamMaxTokens` | `131072` | 巩固输出预算(256–131072) | 流式计费按实际用量,调大不增加成本;**调小则相反**——撞顶 → 无完整 JSON → 整轮失败 → baseline 不刷新 → 同输入重跑(#135 实测 cap=16384 净成本 +54%) |
203
+ | `dreamReasoningEffort` | 未配置 | 巩固推理档位(同 `summarizeReasoningEffort` 的枚举) | 未配置 = 自动取模型支持的最低档(#135);显式 `none` = 不发字段 |
204
+ | `dreamSummaryProvider` / `dreamSummaryModel` | 空 | 记忆总览(dream_summarize)专用路由(#258) | 空 = 回落巩固路由;总览输入为全库,建议大 ctx 非思考模型 |
205
+ | `dreamSummaryMaxInputs` | `0` | 总览输入条数硬上限(按 updated_at 倒序取最新 N 条) | 0 = 不设上限(库增长可能撑爆小 ctx 模型) |
206
+ | `dreamMaxSnapshotSize` | `200` | 滑动窗口:每次只巩固最近 N 条(≤1000) | 窗口外旧记忆不进快照 |
207
+ | `dreamCandidateMode` | `window` | 候选集构造:`window` / `hybrid`(并入向量高相似组,#125) | `hybrid` 让该合并的对能碰面;输入成本不随库增长 |
208
+ | `dreamCandidateMax` | `0` | `hybrid` 候选总量上限(≤5000) | 0 = 复用 `dreamMaxSnapshotSize` |
209
+ | `dreamCandidateMinSim` | `0.85` | `hybrid` 判「高相似」的阈值 | 与 sleep normal 档同一个定义 |
210
+ | `dreamMaxArchivePerRun` | `8` | 单轮 archive 决策上限(≤200,#104) | 超限整单拒绝,`dreamSkipInvalid` 不豁免 |
211
+ | `dreamMaxMergePerRun` | `40` | 单轮 merge 决策上限(≤200,#135) | 超限整单拒绝;merge 是唯一回吐正文的动作,40 = 实测每轮 merge 数分布上沿(历史 0 命中) |
212
+ | `dreamImplicitKeep` | `true` | LLM 未提及的快照记忆自动补 keep | `false` = 恢复严格校验(未覆盖即拒绝整单) |
213
+ | `dreamMinExplicitCoverage` | `0.5` | 显式决策覆盖率下限(0–1) | 防截断输出被隐式 keep 洗白 |
214
+ | `dreamSkipInvalid` | `true` | 跳过单条非法决策、应用合法子集、run 记 degraded(#89) | `false` = 恢复整单拒绝 |
215
+ | `allowCrossTypeMerge` | `false` | 放宽跨类型合并检查 | opt-in;`dreamSkipInvalid` 关时跨类型 merge 直接整单拒绝 |
216
+ | `dreamMergeGuard` | `true` | guarded 类型 merge 护栏(#339/E8):合并对象命中长保留类型(与 archive 护栏同表:preference/pattern/rejected_solution/constraint/pitfall)的 merge 决策跳过——E8 实测巩固损耗里 10/26 条被丢约束已归位 guarded 类型仍被 merge 吃掉。**#521 起带逃生门**:所有 id 同类型且 `reason` 命中「重复/过时」词表(与 archive 护栏同一份 `ARCHIVE_RATIONALE_RE`)时放行——archive 早就有这道门,merge 没有,于是一份真重复的 preference 永远合不掉而提示词还在催模型合并它 | 默认开(同类压缩管线实测:安全规则被同速压缩后一轮只剩 53%、五轮只剩 10%,全程无报错);关闭 = guarded 类型的 merge 不再被跳过,「更精炼的摘要」重新成为约束失真的主通道。`dreamSkipInvalid`(默认开)时被跳条目进 `dream_runs.skipped`、run 记 degraded,关闭时整单拒绝 |
217
+ | `dreamNarrativeEnabled` **light** | `false` | dream 期间按共享 tag 聚类合成叙述条(#164 对齐) | opt-in;按需检索、不常驻注入 |
218
+ | `dreamNarrativeMinCluster` | `3` | 成簇门槛(共享同一 tag 的记忆数,2–20) | — |
219
+ | `documentMemoryEnabled` **light** | `false` | document 型记忆:长文档指针行,全文归 agent(#230) | opt-in;注册校验 + C2 去重 + supersede 记账 |
220
+ | `documentInjectBudget` | `2` | document 摘要行的注入预算(1–5) | 只约束注入,不约束检索 |
221
+ | `documentDir` | `""` | managed 落盘目录(#296) | 空 = `<memoryDir>/documents/`;目录之外只登记指针、正文零读零写 |
222
+ | `policyEpoch` | `0` | 裁决规则版本号 | bump 后旧 dream_runs 降为历史证据(receipt 不再驱动现行决策) |
223
+
224
+ ## 日记本(diary,v0.13)
225
+
226
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
227
+ |---|---|---|---|
228
+ | `diaryEnabled` **light** | `false` | QQ 日记本总闸:跨天判定 + 手写入口 + 面板页 | opt-in;与 `documentMemoryEnabled` **成对但不相依**——关着也能写正文文件,只是不铸造 `document` 指针行(回执里如实标 `pointer.skipped`) |
229
+ | `diaryDir` | `""` | 日记正文根目录 | 空 = `<memoryDir>/diaries/<项目键>/`;`~` 展开到 home,绝对路径原样,相对路径落 memoryDir 下。**与 `memoryDir` 一样是路径配置,不是行为开关**,故不进 `settings.js` 白名单、也不上面板 |
230
+ | `diaryWriteEveryMinutes` | `0` | 日记自动写的定时唤醒间隔(分钟) | `0` = 只在 turn/end 与插件启动时判定(此前行为);`>0` 时每隔这么多分钟扫一遍已知项目再判定。**不是 cron**:定时器只负责唤醒「该不该写」的判定,写不写仍由 compose 按落盘日期去重——一天最多一篇,填 5 也不会多写。跑完一篇再排下一次,所以不会与上一次的模型调用重叠。opt-in、可热改(走 `INT_RANGES` 表,0–1440)|
231
+ | `diaryInboxDir` | `""` | QQ 入站素材目录(只读) | 空 = 从 `memoryDir` 推 `<memoryDir>/../media/onebot`(onebot 的默认落点)。本模块**不 import `dsh-onebot-qq` 任何模块**,边界只靠这份「目录 + 文件形状」约定 |
232
+
233
+ 日记不落用户绑定的项目目录:那目录实测非 git、无 `.gitignore`、混着探针脚本,
234
+ 写进去没有版本也没有回滚;mneme 成文的写盘面只有 `memoryDir` 与 `documentDir` 两处。
235
+ 「入库到项目」是面板上一个**人主动点**的导出动作(复制而非移动)。
236
+
237
+ ## 睡眠模式(sleep,空闲深维护)
238
+
239
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
240
+ |---|---|---|---|
241
+ | `sleepModeEnabled` **light** | `false` | 库静默后全库深维护:冲突消解/归档降级/模式发现/关系补全 | opt-in;可被用户活动中止,与 autoDream 串行 |
242
+ | `sleepIdleMinutes` | `5` | 静默多久触发(1–60 分钟) | — |
243
+ | `sleepMinIntervalHours` | `8` | 两次 run 最小间隔(小时,≤168) | — |
244
+ | `sleepConflictStrictness` | `normal` | 冲突裁决档:`gentle`(0.92) / `normal`(0.85) / `aggressive`(0.75) | — |
245
+ | `sleepActionSet` | `conflict` | 动作集:`conflict` / `full`(六分支,#126) | `full` 让互补型/演进型重复有正确出口 |
246
+ | `sleepArchiveDays` / `sleepCompressDays` | `30` / `90` | 归档降级分层(天):先缩为摘要、再彻底归档 | 实体关系保留 |
247
+ | `sleepPatternMinMemories` | `100` | 模式发现的扫描窗口(条) | — |
248
+ | `sleepPatternLookbackDays` | `30` | 属性变更回看(天) | — |
249
+ | `sleepMaxPatternPerRun` | `3` | 单轮模式条上限(0–10) | 0 = 关闭模式发现 |
250
+ | `sleepAffectiveEnabled` **light** | `false` | 情感归因相位(#619):情境情绪写成 `affective_context` 关系,跨多次独立会话的稳定倾向才铸成 pattern | opt-in;`sleepModeEnabled` 的子相,父关着不跑;要调模型且依赖实体抽取 |
251
+ | `sleepAffectiveTraitMinSessions` | `3` | 判「稳定倾向」所需的**独立会话**数(2–10) | 下界 2 是故意的:N=1 就是单次场合,正是必须禁止升特质的那个情形 |
252
+ | `sleepAffectiveMaxRelationsPerRun` | `10` | 单轮最多写多少条 `affective_context` 关系(0–50) | 同 `sleepMaxPatternPerRun` 的角色;0 = 一条也不写 |
253
+ | `sleepProvider` / `sleepModel` | 空 | sleep 专用路由 | 空 = 用巩固路由 / 当前模型 |
254
+ | `sleepReasoningEffort` | 未配置 | 同 `dreamReasoningEffort` | — |
255
+ | `sleepMaxTokens` | `8192` | 冲突/模式阶段输出预算(#257) | 原硬编码 2048 对 `full` 档必然截断 |
256
+ | `sleepConflictMaxPairs` | `12` | **单批**送审的冲突对上限(0–500,0 = 不设上限回退旧行为) | 输入侧预算(#529):整池一次塞进一个 prompt 实测 163,054 token(占 `--ctx-size` 99.5%) |
257
+ | `sleepConflictMaxPairsPerRun` | `60` | **单轮**最多送审多少对(0–5000,0 = 不设上限) | 与上一条分工:一个管批次大小、一个管整轮总量;剩下的一轮留给下一轮 |
258
+ | `sleepFailureBackoff` | `false` | sleep 连续失败退避(#529) | 有效间隔 = `sleepMinIntervalHours` × 2^连败数(成功清零,封顶 `max(sleepMinIntervalHours, 24h)`);opt-in |
259
+ | `sleepHeatThreshold` | `0.05` | 降级联合判定的热度下限(heat < 值且 importance<5 才降) | `heatEnabled` 关时退回纯时间分层 |
260
+
261
+ ## 反思与冲突(dream 配套)
262
+
263
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
264
+ |---|---|---|---|
265
+ | `reflectionUpdateEnabled` | `true` | 检索后的反思更新既有记忆 | — |
266
+ | `reflectionFailureTracking` | `true` | 失败经验追踪 | — |
267
+ | `reflectionUpdateMaxPerRun` | `2` | 单轮 update 上限(0–5) | — |
268
+ | `reflectionUpdateMinAgeHours` | `24` | 可更新记忆的最短年龄(小时,≤168) | — |
269
+ | `reflectionFailureRetentionDays` | `90` | `failure_memories`(失败/纠正记录)的启动期清理保留天数(1–3650) | 只读 bundle 配置:未进 feature_flags 白名单,面板改不了。`dsh-mneme reclaim` 不读这个键(它对三个表用同一条 `--older-than`,本表不在其中)。此前这个 90 天是写死的(#275 伞下的欠账) |
270
+ | `conflictFreezeEnabled` | `false` | 冲突不自动合并、冻结待人工复核 | opt-in |
271
+ | `conflictFreezeMaxPending` | `100` | 冻结队列上限(≤1000) | — |
272
+ | `conflictAutoResolveEnabled` | `false` | 相似度极高的**同 scope** 重复对自动裁决(保留新条、归档旧条),不进人工队列 | opt-in。会归档记忆,所以默认关;跨 scope 对永不自动(归属是用户的决定,#170)。用 supersede 而非 conflict:注记写在被归档侧,幸存记忆正文不动 |
273
+ | `conflictAutoResolveMinSimilarity` | `0.95` | 自动裁决的相似度门槛(0.85–1) | 实测 live 库 345 条有相似度的历史行里 ≥0.95 只占 5.8%、≥0.94 占 8.1%——这一档减的是峰值,不是把队列清零。低于 0.85 就不是「重复」而是「相似」,不该自动归档任何一条 |
274
+ | `conflictLedgerMode` | `off` | 冲突分诊账本档位(`off` / `shadow` / `enforce`) | beta(#641)。`shadow` = 每轮巩固对冲突候选对做确定性分诊(近重复/跨作用域/演进/真矛盾四档,判据见 `src/dream/triage.js`)并落 `conflict_ledger` 账本,**冻结/LLM 路径零变化**——先测一周真实分布再切档。`enforce` = 确定性处置:近重复对走信息量优先 supersede(败者归档、胜者正文不动),跨作用域重复与真矛盾只记账(不停车、不送 LLM、不动正文),时序演进落取代链(旧行 `superseded_by`/`superseded_at` 指向新行,两行都留着、正文都不动,检索侧降权),人审队列消失。与 `conflictFreezeEnabled` 同开时 freeze 让位(降级 + warn,#616 父子绑定不继承)。不进 lightMode 强制关闭清单:shadow 只多一张 bookkeeping 表的写入,enforce 零 LLM 调用(同 `actionPipelineEnabled` 的定性) |
275
+ | `conflictLedgerDupMinSimilarity` | `0.9` | 分诊 T1(近重复)档的相似度下限(0.85–1) | 检测阈值(0.85)与自动档(0.95)之间的空带由它接管:真实库 788 对的相似度回声集中在 0.85–0.93,恰好是自动档开了也接不住的那段 |
276
+
277
+ ## 实体
278
+
279
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
280
+ |---|---|---|---|
281
+ | `entityExtractionEnabled` **light** | `false` | 写入时 LLM 抽取实体/属性/关系 | opt-in;存储三表与 CRUD 恒可用,本键只闸抽取 |
282
+ | `entityExtractionProvider` / `entityExtractionModel` | 空 | 抽取专用路由 | 单边为空时回落调用方默认 |
283
+ | `entityExtractionReasoning` | `none` | 抽取推理档位(#109) | `none` = 不发字段;拒收自动去掉字段重试一次 |
284
+ | `entityExtractionMaxEntities` / `entityExtractionMaxAttrs` | `10` / `20` | 单次抽取的实体数 / 每实体属性数上限 | — |
285
+ | `entitySearchEnabled` | `true` | 实体名前缀/语义搜索(供召回) | — |
286
+ | `entityRecallEnabled` **light** | `false` | 图召回轴:查询命中实体名时并入融合池(#219) | opt-in;依赖实体抽取产出(lightMode 下抽取已关) |
287
+
288
+ ## 检索
289
+
290
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
291
+ |---|---|---|---|
292
+ | `embedProvider` | `openai` | 嵌入提供方:`openai`(外部 API)/ `local`(ONNX)/ `ollama` | — |
293
+ | `vectorSearchTopK` | `20` | 向量召回条数(≤100) | — |
294
+ | `vectorSearchThreshold` | `0.65` | 固定向量阈值 | `adaptiveThresholdEnabled` 开启时被动态阈值取代 |
295
+ | `adaptiveThresholdEnabled` | `true` | 查询感知动态阈值(实体前缀放宽、短查询收紧等) | 关 = 回到固定 0.65 |
296
+ | `bm25SearchEnabled` **light** | `true` | BM25 第三召回路径(标识符/代码碎片/混排) | — |
297
+ | `hybridSearchVectorWeight` / `hybridSearchKeywordWeight` | `0.6` / `0.4` | 混合检索加权 | — |
298
+ | `recallFusion` | `blend` | 融合配方:`blend`(现状)/ `rrf` / `minmax` | `rrf`/`minmax` 修「raw 余弦 + 关键词分直接相加」的量纲失配 |
299
+ | `signalTransparency` | `false` | 每条结果附带 `{keyword, vector, bm25, final}` 信号 | 只装饰返回行,不改排序 |
300
+ | `hybridInject` **light** | `true` | 注入前语义优先召回、规则序回填 | — |
301
+ | `selectiveInjectEnabled` **light** | `true` | 有查询向量时按相似度重排注入候选 | — |
302
+ | `searchSemanticDedup` **light** | `false` | 检索期语义去重(贪心剔除近重复) | opt-in 激进档:小嵌入模型易把不同条目坍缩 |
303
+ | `searchSemanticDedupThreshold` | `0.95` | 去重阈值 | — |
304
+ | `evalPersistTestResults` | `false` | 检索评测快照落 `recall_evals` | 生产检索恒只进 `recall_runs`,与此键无关 |
305
+ | `recallRecordDefault` | `true` | `recall_runs` 记录默认开 | 显式传 `false` 的调用方不受影响 |
306
+ | `recallRetentionDays` | `90` | `recall_runs` 滚动清理保留天数 | — |
307
+ | `trustEpistemicWeighting` | `false` | 来源可信度(observation/subjective/inferred)参与排序与标注 | opt-in;关时 epistemic_status 只是惰性数据 |
308
+
309
+ ### 重排层
310
+
311
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
312
+ |---|---|---|---|
313
+ | `rerankEnabled` **light** | `false` | 本地交叉编码器重排 | opt-in:显式 `true` + `local` 才拉起 onnxruntime |
314
+ | `rerankProvider` | `none` | `local` / `none` | — |
315
+ | `rerankModel` | `Xenova/bge-reranker-base` | 重排模型 | — |
316
+ | `rerankBatchSize` | `8` | 批大小(≤64) | — |
317
+ | `rerankMaxCandidates` | `30` | 参与重排的候选上限(5–100) | — |
318
+ | `rerankScoreThreshold` | `0.1` | 重排分数阈值 | — |
319
+ | `rerankDtype` | `q8` | 量化档(#188) | 非法值由 transformers 抛出 → 重排降级告警 |
320
+
321
+ ## 图谱(graph,opt-in,#24)
322
+
323
+ 图谱四条链路都依赖实体抽取产出(`entityExtractionEnabled`),默认全关;lightMode 把前四个布尔键一并强制关。级联与预算键只是阈值,跟着开关走。
324
+
325
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
326
+ |---|---|---|---|
327
+ | `graphAnchoringEnabled` | `false` | 块1 图谱锚定:以查询命中的实体为种子沿关系表级联扩散(默认深度 2) | opt-in;关 = 与 #219 单跳轴逐字节一致;需 `entityRecallEnabled` 之上再开 |
328
+ | `graphSeedCap` | `12` | 锚定种子集上限(1–30) | 只影响一次扩散的宽度 |
329
+ | `graphCascadeDepth` | `2` | 级联深度(1–3) | 深度与召回面线性相关,3 容易把远邻拉进来 |
330
+ | `graphWeightEnabled` | `false` | 块2 边权重演化:被寻回路径的边权重抬升(只加不减、封顶 1.0) | opt-in;关 = 边初值纯由建边来源决定 |
331
+ | `graphWeightDelta` | `0.1` | 单次有效触达的抬升幅度(0–1) | 与其他 graph 开关无关的纯阈值 |
332
+ | `graphPassiveConfirm` | `false` | 块4 被动确认:heat 触达(召回/注入)即给挂联关系边抬一格 | opt-in;关 = 零行为变化 |
333
+ | `graphInjectHint` | `false` | 块3 关联提示标注:图召回候选在注入文本里以「[检索线索] …」标出 | 关 = 只参与排序、不改变注入块构成(保守档) |
334
+ | `graphInjectBudget` | `1` | 图召回候选在注入块里的独立预算(0–5 条) | 不占 `maxInjectedItems` 名额;0 = 关闭 |
335
+
336
+ ## 热度
337
+
338
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
339
+ |---|---|---|---|
340
+ | `heatEnabled` **light** | `false` | 热度曲线(遗忘):热度字段 / sleep 降级联判(#218) | opt-in;关 = sleep 退回纯时间分层 |
341
+ | `injectHeatEnabled` | `false` | 注入排序乘 heat(#218 / E5 考卷:heat 乘进注入排序在真实年龄混合下饿死老约束,拆独立开关默认关) | 依赖 `heatEnabled`;关 = 注入乘数恒 1(与 heat 关闭逐字节一致);开 = 恢复层内乘 heat 旧序 |
342
+ | `heatGlobalBeta` | `1.0` | 广义指数形状参数 β(0.5–2) | 专家调优项,不进面板白名单 |
343
+ | `heatTypeDecay` | 内置默认 | per-type 衰减 λ(键为 type 字符串) | λ=0 的类型免疫(热度恒 1、sleep 永不降级) |
344
+
345
+ ## API 与工具面
346
+
347
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
348
+ |---|---|---|---|
349
+ | `apiToken` | 空 | 宿主内 API 敏感端点的共享 token | 空 = 只读端点保持开放(DSH 绑 127.0.0.1 且无内建鉴权) |
350
+ | `externalApiEnabled` | `false` | 独立 `node:http` 数据面(生态集成用) | opt-in;双宿主共用库时只能一边开(端口冲突) |
351
+ | `externalApiPort` | `8790` | 端口 | — |
352
+ | `externalApiHost` | `127.0.0.1` | 绑定地址 | 改成非回环 = 把整个记忆库暴露给网络,自负其责 |
353
+ | `disableMemorySearch` | `false` | 对模型隐藏 `memory_search` 工具(v0.8.5) | 慢/轻量模型的工具往返节流;隐藏即不可调 |
354
+ | `disableMemoryArchive` | `false` | 对模型隐藏 `memory_archive` 工具 | 同上 |
355
+ | `organizeEnabled` | `false` | 对模型开放 `memory_organize` 工具(#231:先 dryRun 出比对报告,agent 判断后 apply 落库) | 与上面两个**反向**:那两个藏默认在场的工具,本键开默认不在场的能力。关 = 工具根本不注册(模型看不到就不会调)。dryRun→apply 是两步协议,弱模型容易漏 `run_id` 或跳过报告,所以 `LIGHT_MODE_OFF` 里有它;apply 只能引用一次真实报告、且一份报告只许落地一次 |
356
+ | `chorographyEnabled` | `false` | chorography(仓库地志,spec 见 docs/specs/)暴露闸:对模型开放三个只读工具(`choro_search` / `choro_read_page` / `choro_module_map`)+ 面板「仓库地志」浏览页 + 每轮的开局提纲注入 + `/choro` 命令 | 与 `organizeEnabled` 同款反向语义:关 = 工具根本不注册、面板页空态、注入块不渲染、命令不注册,行为与旧版逐字节一致。本键是「是否启用这个子系统」,不是「每轮付多少」——所以它仍**不进 `LIGHT_MODE_OFF`**,轻量档要压的是下面那条 `chorographyInject`。检索是关键词子串(M1);生成走 `dsh-mneme-choro` CLI(T0 确定性骨架 + `--t1` headless 语义富化) |
357
+ | `chorographyInject` | `"light"` | 开局注入档位:`light` 只列文件数最多的 6 个模块(约 8 行)、`full` 列全部模块、`off` 不注入 | 只注模块名 / 文件数 / 页状态 / 页相对路径,**不含正文**(正文由模型 `choro_read_page` 取);注入块折进既有 memory context,不新开 context(spec §7「合并成一次拼装」)。`lightMode: true` 时在消费侧压成 `off`(见 `wiki/inject.js` 的 `resolveInjectTier`)——它**不进 `LIGHT_MODE_OFF` 表**,因为那张表对平铺键一律赋 `false`,枚举值塞进去会与 schema 不符 |
358
+ | `chorographyAutoRefresh` | `false` | 重建骨架后是否顺手把「过期」标记也刷掉:`POST /choro/run` 带 `refresh: true` 时,面板发起的一次重建会同时重算 `choro_repos` 的 git 基线与 plan 指纹 | opt-in 默认关。它与 `chorographyEnabled` 同属「谁按下按钮」而非「每轮付多少」,故不进 `LIGHT_MODE_OFF`;关着时重建照常跑,只是过期判据留旧基线,面板会继续显示「代码已变更」。**开着时读侧也会自动补跑一次 T0**(打开仓库看到 `staleReason === "git"` 就顺手重建骨架);这条路径带 `guardT1Loss`:仓库里只要有 `status = 'enriched'` 的页就**整轮拒绝**并回 `autoRefreshSkipped: "t1-loss"`,面板显示一条常驻提示条——因为 T0 apply 会清空 T1 语义段与 claims,而「点开一页」从来不等于「同意重建」。手动「重建骨架」与 CLI 不受此限 |
359
+ | `chorographyT1FromPanel` | `true` | 面板「补语义正文(T1)」按钮的暴露闸:开 = 地志页能发起 `POST /choro/t1`,后台 spawn 一次 `dsh-mneme-choro --t1 --apply` 并轮询 `/choro/t1/status` | 默认**开**(只在 `chorographyEnabled` 已开时才有意义;关整个子系统仍然全灭)。它管的是「面板能不能点这一下」,T1 花的是模型额度但每次都是人的显式动作,所以不设第二道默认关;T1 有模块数/时长/重试三重上限(`src/wiki/t1.js`) |
360
+ | `kbEnabled` | `false` | 知识库第二层(AI-Native 知识库,对标 Qoder Knowledge)暴露闸:对模型开放三个只读工具(`kb_list_collections` / `kb_search` / `kb_read_doc`)+ 面板「知识库」页 + `/api/dsh-mneme/kb/*` 路由 | 与 `chorographyEnabled` 同款反向语义:关 = 工具不注册、面板页空态、路由 409。知识库收的是外来原文副本,真源在 `kb_*` 三张表(不是磁盘 MD),**只碰 kb_* 绝不写 `memories`**、不进巩固/质量过滤任何池子。检索是 BM25 + 可选向量;单文档上限 2 MB,超限/不可读落 `status='error'` 行并回人话,不静默截断。不进 `LIGHT_MODE_OFF`:它没有每轮注入物,模型只在被问到时才调用 |
361
+ | `actionPipelineEnabled` | `false` | M.O. 只读视图的门控:做法图谱 + 对话行结算卡 | opt-in beta;只是纯 UI 入口、不引入重型后台路径,故不进 `LIGHT_MODE_OFF`。写账另有独立的执行记账键(`/mo-run`),看图 ≠ 写账 |
362
+ | `actionRunEnabled` | `false` | M.O. 执行记账:`/mo-run` 开一次执行窗口,窗口内命令执行才可能被记成一条 run | opt-in beta;挂在热路径(每个会话事件都过一次监听),故 `LIGHT_MODE_OFF` 里有它 |
363
+ | `actionNudgeEnabled` | `false` | M.O. 自动沉淀:每轮结束(`turn/end`)后挖一次「这个项目重复走的动作」,结果落成 `memoryDir/proposals/<项目键>/` 里的提议,等人确认 | opt-in beta;三个 M.O. 键里最重的一条——挂 `session/event` 且要**同步解压 zstd 会话日志**(本机 118 份实测 16.2s,单次预算 `budgetMs`=4s 兜底),故 `LIGHT_MODE_OFF` 里有它。**永不自动落草稿**:`materialize` 恒 false,进仓库必须是人的显式动作 |
364
+
365
+ > **M.O. 已下架(v0.13.x)**:上面三个键仍留在 schema 与设置白名单里、语义不变,但面板不再渲染 `group.mo` 那一组(从 `FEATURE_GROUPS` 摘掉,首屏位一并收回)。想恢复:把该组加回 `FEATURE_GROUPS` 与 `FEATURE_FIRST_SCREEN` 即可,旗标与座位注册逻辑零改动。设置只能走配置文件。
366
+
367
+ ## 运行时与本地模型
368
+
369
+ | 键 | 默认 | 作用 | 开启后果 / 冲突 |
370
+ |---|---|---|---|
371
+ | `localEmbedModel` | `Xenova/bge-small-zh-v1.5` | 本地嵌入模型(`embedProvider=local` 时) | — |
372
+ | `localEmbedDimension` | `512` | 向量维度 | — |
373
+ | `localEmbedDevice` | `cpu` | `cpu` / `gpu` | — |
374
+ | `localEmbedBatchSize` | `8` | 批大小(≤64) | — |
375
+ | `localEmbedPooling` | `auto` | 池化:`auto`(BGE→cls,其余→mean)/ `cls` / `mean` | 池化决定向量空间——改动会变 modelHash、触发既有索引重建 |
376
+ | `ollamaBaseUrl` | `http://localhost:11434` | Ollama 地址 | 只接受 http/https(SSRF 防线) |
377
+ | `ollamaModel` | `nomic-embed-text` | Ollama 嵌入模型 | — |
378
+ | `embedModelCacheDir` | `""` | 模型缓存目录 | 空 = `~/.dsh/mneme/models` |
379
+ | `embedModelMirror` | `https://hf-mirror.com` | 模型下载镜像 | — |
380
+ | `resilientModelDownload` | `true` | 模型下载断点续传 + 空闲看门狗(#194) | 关 = 恢复原生 fetch(线上回滚开关) |
381
+ | `runtimeDir` | `""` | 自管运行时目录(transformers + onnxruntime 闭包,#131) | 空 = `~/.dsh/mneme/runtime`;把重依赖挪出宿主 profile 的依赖图 |
382
+ | `runtimeTarballDir` | `""` | 本地 `.tgz` 离线取件目录 | 有货优先于联网(弱网下装 onnxruntime-node 用) |
383
+ | `runtimeMirror` | `""` | registry 镜像前缀(如 `https://npmmirror.com/mirrors/npm/`) | 空 = manifest 里的官方地址 |
384
+ | `reindexMaxPerBoot` | `500` | 启动期向量回填的单次上限(原先硬编码 500) | `0` = 不限、本次跑完整个积压(4k 行积压靠重启九次才清空的旧行为就是被这个上限卡住的) |
385
+ | `reindexBatchSize` | `10` | 回填批大小(1–64) | 越大单批 token/耗时越高 |
386
+ | `reindexRateLimitMs` | `200` | 回填批间隔毫秒(限速) | 0 = 不限速 |
387
+
388
+ ## lightMode 强制关闭清单(`LIGHT_MODE_OFF`)
389
+
390
+ `lightMode: true`(或面板 `panel_mode=light`)时,以下键被预设强制为 `false`——都是
391
+ 重型路径;核心循环(autoInject、autoSummarize、hotMemory*、质量过滤、关键词检索)不动:
392
+
393
+ `entityExtractionEnabled` · `autoDream` · `sleepModeEnabled` · `sleepAffectiveEnabled`(#619) · `rerankEnabled` ·
394
+ `autoReindexOnBoot` · `hybridInject` · `injectGuidanceEnabled` · `searchSemanticDedup` ·
395
+ `selectiveInjectEnabled` · `bm25SearchEnabled` · `entityRecallEnabled` ·
396
+ `graphAnchoringEnabled` · `graphWeightEnabled` · `graphInjectHint` · `graphPassiveConfirm` ·
397
+ `actionRunEnabled` · `actionNudgeEnabled` ·
398
+ `dreamNarrativeEnabled` · `documentMemoryEnabled` · `heatEnabled` · `continuityRescueEnabled` ·
399
+ `organizeEnabled`(#231) ·
400
+ `profileExtractEnabled`(#497) ·
401
+ `profileFactsEnabled`(2026-11-06) ·
402
+ `preInjectGate.enabled`(#380) · `distillRecords.enabled`(#399) ·
403
+ `imageDescribeEnabled`(每张图一次视觉调用) ·
404
+ `diaryEnabled`(v0.13,每天一篇 = 一次 LLM 调用,属重型)
405
+
406
+ 预设只是默认值而非强制:用户显式写进 feature_flags 的值在装配顺序上后展开、仍然生效
407
+ (「用户开关 > 轻量预设 > bundle 配置」)。