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