@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
|
@@ -1,128 +1,128 @@
|
|
|
1
|
-
import test from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import { STR } from "../src/lang.js";
|
|
4
|
-
import { createStore } from "../src/store.js";
|
|
5
|
-
import { createService } from "../src/service.js";
|
|
6
|
-
import { createDreamScheduler } from "../src/dream.js";
|
|
7
|
-
|
|
8
|
-
// 防谄媚的**提示词侧**回归锁。
|
|
9
|
-
//
|
|
10
|
-
// 背景:#380 的注入前判定(pre-inject-gate)只拦「已落库的意见/立场」,而落到库里
|
|
11
|
-
// 之前的两个写作环节——蒸馏(summary / codingSummary)与总览叙述(dreamSummary)
|
|
12
|
-
// ——此前对谄媚内容一字未提。这两个环节写出的内容**完全不过** writeAdmission
|
|
13
|
-
// (write-admission.js 只在带 sessionKey 的 memory_save 路径生效),所以提示词是
|
|
14
|
-
// 唯一能施加约束的地方,本轮把「立场纪律 / 叙述纪律」写进字面量(Issue #530)。
|
|
15
|
-
//
|
|
16
|
-
// 这些用例锁的是**形状**(提示词里有没有这条约束、位置对不对),锁不了**行为**
|
|
17
|
-
// (模型是否真的照做)——后者要 LLM 在环 + 预注册判据,属 E12 那类实验,不在单测里
|
|
18
|
-
// 宣称。PR 与 CHANGELOG 不得把本文件写成「已知降低谄媚率」。
|
|
19
|
-
|
|
20
|
-
const LANGS = ["zh", "en"];
|
|
21
|
-
|
|
22
|
-
// 五组判据在两种语言里的对应词。写成「中英成对」是刻意的:少一种语言就等于
|
|
23
|
-
// 换语言的用户拿到一份没有防线的提示词(同 lang.test.js 对 profileExtract 的锁法)。
|
|
24
|
-
const STANCE_PATTERNS = [
|
|
25
|
-
[/立场纪律|Stance discipline/, "立场纪律小节本身"],
|
|
26
|
-
[/不要记录对用户本人|Never record evaluations of the user/, "规则 a:不记对用户本人的性格/能力/情绪评价"],
|
|
27
|
-
[/可信度不同|differ in trustworthiness/, "规则 b:转录三种角色可信度不同"],
|
|
28
|
-
[/事实归属以用户陈述为准|the user statement wins on the facts/, "规则 c:事实归属不记成助手推断"],
|
|
29
|
-
[/如实并存|keep both sides/, "规则 c:两种说法并存,不写成谁对谁错"],
|
|
30
|
-
[/不是提高 importance 的理由|never a reason to raise it/, "规则 d:赞许不抬 importance"],
|
|
31
|
-
];
|
|
32
|
-
|
|
33
|
-
for (const key of ["summary", "codingSummary"]) {
|
|
34
|
-
test(`${key} 提示词带完整立场纪律(中英成对)`, () => {
|
|
35
|
-
for (const lang of LANGS) {
|
|
36
|
-
const text = STR.prompts[key][lang];
|
|
37
|
-
for (const [re, label] of STANCE_PATTERNS) {
|
|
38
|
-
assert.match(text, re, `${key}.${lang} 缺少${label}`);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
test("立场纪律排在任何 JSON 输出形状之前,不会被后置的时间锚点覆盖", () => {
|
|
45
|
-
// summarize.js 在提示词**之后**再拼 STR.distillTimeAnchor(「据此换算 occurred_at」)。
|
|
46
|
-
// 规则若排在那句之后,就成了「先按时间换算、再谈记什么」——指令优先级反了。
|
|
47
|
-
// 同时它必须排在 schema 行之前:schema 是输出形状,纪律是内容判据,形状压不住判据。
|
|
48
|
-
for (const key of ["summary", "codingSummary"]) {
|
|
49
|
-
for (const lang of LANGS) {
|
|
50
|
-
const text = STR.prompts[key][lang];
|
|
51
|
-
const stance = text.search(/立场纪律|Stance discipline/);
|
|
52
|
-
assert.ok(stance > 0, `${key}.${lang}: 立场纪律必须存在于提示词字面量内部`);
|
|
53
|
-
assert.ok(stance < text.search(/occurred_at|occurred_at/), `${key}.${lang}: 立场纪律必须在 occurred_at 说明之前`);
|
|
54
|
-
assert.ok(stance < text.search(/只输出 JSON 数组|Output only a JSON array/), `${key}.${lang}: 立场纪律必须在输出形状之前`);
|
|
55
|
-
assert.ok(text.indexOf("立场纪律") < 0 || stance > text.indexOf("原子记忆原则") - 1,
|
|
56
|
-
`${key}.${lang}: 立场纪律要跟在原子记忆原则之后,别抢掉开头角色句`);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
test("工具/报错结论的豁免条款必须在场(删掉它会误杀 pitfall 与 constraint)", () => {
|
|
62
|
-
// 规则 b 说「助手的结论是推断」,但编码类记忆(pitfall / rejected_solution /
|
|
63
|
-
// constraint)的内容本来就是工具输出与报错直接给出的技术结论。没有这半句豁免,
|
|
64
|
-
// 规则 b 会把整个编码回溯功能一并否掉——这是最容易被后人顺手删掉的高危句。
|
|
65
|
-
for (const lang of LANGS) {
|
|
66
|
-
const text = STR.prompts.summary[lang];
|
|
67
|
-
assert.match(text, /工具输出、报错、命令结果|tool output, errors or command results/,
|
|
68
|
-
`summary.${lang}: 工具结论豁免条款缺失,规则 b 会误杀 pitfall/constraint`);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
test("dreamSummary 带叙述纪律,且散文契约不被破坏", () => {
|
|
73
|
-
for (const lang of LANGS) {
|
|
74
|
-
const text = STR.prompts.dreamSummary[lang];
|
|
75
|
-
assert.match(text, /叙述纪律|Narrative discipline/, `dreamSummary.${lang}: 缺叙述纪律`);
|
|
76
|
-
assert.match(text, /不要给用户添上|add no characterisation/, `dreamSummary.${lang}: 缺「不给用户添性格评价」`);
|
|
77
|
-
// 总览是**散文**契约:dream-fence 那条锁要求这里绝不能出现「JSON 数组」,
|
|
78
|
-
// 否则模型会按数组契约回 `[]`,而 summaryText.trim() 判非空通过,`[]` 就
|
|
79
|
-
// 被当成摘要存进库(dream.js:326-328 的注释记着这次评审实测)。
|
|
80
|
-
assert.doesNotMatch(text, /JSON 数组|JSON array/, `dreamSummary.${lang}: 散文契约里不得出现 JSON 数组`);
|
|
81
|
-
// 硬输出格式锁必须留在末尾,它是「只回叙述文本」的唯一保证。
|
|
82
|
-
assert.match(lang === "zh" ? text : text, /只输出叙述文本,不要其他内容。|Output only the narrative text, nothing else./,
|
|
83
|
-
`dreamSummary.${lang}: 末尾输出格式锁丢了`);
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
// 下面这条是**输出侧**的接线锁:提示词改了,落库判据不能跟着变。
|
|
88
|
-
// 空字符串仍必须判为「没有摘要」(degraded/noop),不能被新文案带成「存了个空叙述」。
|
|
89
|
-
test("总览落库判据不因提示词改动而放宽", async () => {
|
|
90
|
-
function mockCtx({ summaryText }) {
|
|
91
|
-
return {
|
|
92
|
-
logger: { warn: () => {} },
|
|
93
|
-
agentDefaultModel: { currentSelection: () => ({ provider: "mock", model: "mock-model" }) },
|
|
94
|
-
llm: {
|
|
95
|
-
async *stream(options) {
|
|
96
|
-
const userText = options.messages.find((m) => m.role === "user")?.content?.[0]?.text ?? "";
|
|
97
|
-
if (userText.includes("| type=")) {
|
|
98
|
-
yield { type: "block-start", index: 0, blockType: "text" };
|
|
99
|
-
yield { type: "text-delta", index: 0, text: "[]" };
|
|
100
|
-
yield { type: "block-end", index: 0, block: { type: "text" } };
|
|
101
|
-
yield { type: "finish", reason: { kind: "stop" } };
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
yield { type: "text-delta", index: 0, text: summaryText };
|
|
105
|
-
yield { type: "finish", reason: { kind: "stop" } };
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
const store = createStore(":memory:");
|
|
112
|
-
const service = createService({ store, mirror: null, config: {} });
|
|
113
|
-
const dream = createDreamScheduler({ onRun: () => Promise.resolve({ ok: true, skipped: true }) });
|
|
114
|
-
service.saveWithDedupe({ type: "preference", title: "语言", content: "中文", importance: 3 });
|
|
115
|
-
|
|
116
|
-
const ok = await dream.runDream(mockCtx({ summaryText: "记忆库总览:用户偏好中文。" }), service, {});
|
|
117
|
-
assert.equal(ok.summary, true, "非空叙述照常落库");
|
|
118
|
-
const row = service.all().find((m) => m.type === "summary");
|
|
119
|
-
assert.ok(row, "总览行必须存在");
|
|
120
|
-
assert.equal(row.source, "dream");
|
|
121
|
-
assert.equal(row.importance, 5, "总览行的 importance 固定 5(最高注入档)");
|
|
122
|
-
|
|
123
|
-
const empty = await dream.runDream(mockCtx({ summaryText: "" }), service, {});
|
|
124
|
-
assert.equal(empty.summary, false, "空叙述不得落库");
|
|
125
|
-
const rows = service.all().filter((m) => m.type === "summary");
|
|
126
|
-
assert.equal(rows.length, 1, "旧总览存活,没有被空叙述覆盖");
|
|
127
|
-
store.close();
|
|
128
|
-
});
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { STR } from "../src/lang.js";
|
|
4
|
+
import { createStore } from "../src/store.js";
|
|
5
|
+
import { createService } from "../src/service.js";
|
|
6
|
+
import { createDreamScheduler } from "../src/dream.js";
|
|
7
|
+
|
|
8
|
+
// 防谄媚的**提示词侧**回归锁。
|
|
9
|
+
//
|
|
10
|
+
// 背景:#380 的注入前判定(pre-inject-gate)只拦「已落库的意见/立场」,而落到库里
|
|
11
|
+
// 之前的两个写作环节——蒸馏(summary / codingSummary)与总览叙述(dreamSummary)
|
|
12
|
+
// ——此前对谄媚内容一字未提。这两个环节写出的内容**完全不过** writeAdmission
|
|
13
|
+
// (write-admission.js 只在带 sessionKey 的 memory_save 路径生效),所以提示词是
|
|
14
|
+
// 唯一能施加约束的地方,本轮把「立场纪律 / 叙述纪律」写进字面量(Issue #530)。
|
|
15
|
+
//
|
|
16
|
+
// 这些用例锁的是**形状**(提示词里有没有这条约束、位置对不对),锁不了**行为**
|
|
17
|
+
// (模型是否真的照做)——后者要 LLM 在环 + 预注册判据,属 E12 那类实验,不在单测里
|
|
18
|
+
// 宣称。PR 与 CHANGELOG 不得把本文件写成「已知降低谄媚率」。
|
|
19
|
+
|
|
20
|
+
const LANGS = ["zh", "en"];
|
|
21
|
+
|
|
22
|
+
// 五组判据在两种语言里的对应词。写成「中英成对」是刻意的:少一种语言就等于
|
|
23
|
+
// 换语言的用户拿到一份没有防线的提示词(同 lang.test.js 对 profileExtract 的锁法)。
|
|
24
|
+
const STANCE_PATTERNS = [
|
|
25
|
+
[/立场纪律|Stance discipline/, "立场纪律小节本身"],
|
|
26
|
+
[/不要记录对用户本人|Never record evaluations of the user/, "规则 a:不记对用户本人的性格/能力/情绪评价"],
|
|
27
|
+
[/可信度不同|differ in trustworthiness/, "规则 b:转录三种角色可信度不同"],
|
|
28
|
+
[/事实归属以用户陈述为准|the user statement wins on the facts/, "规则 c:事实归属不记成助手推断"],
|
|
29
|
+
[/如实并存|keep both sides/, "规则 c:两种说法并存,不写成谁对谁错"],
|
|
30
|
+
[/不是提高 importance 的理由|never a reason to raise it/, "规则 d:赞许不抬 importance"],
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
for (const key of ["summary", "codingSummary"]) {
|
|
34
|
+
test(`${key} 提示词带完整立场纪律(中英成对)`, () => {
|
|
35
|
+
for (const lang of LANGS) {
|
|
36
|
+
const text = STR.prompts[key][lang];
|
|
37
|
+
for (const [re, label] of STANCE_PATTERNS) {
|
|
38
|
+
assert.match(text, re, `${key}.${lang} 缺少${label}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
test("立场纪律排在任何 JSON 输出形状之前,不会被后置的时间锚点覆盖", () => {
|
|
45
|
+
// summarize.js 在提示词**之后**再拼 STR.distillTimeAnchor(「据此换算 occurred_at」)。
|
|
46
|
+
// 规则若排在那句之后,就成了「先按时间换算、再谈记什么」——指令优先级反了。
|
|
47
|
+
// 同时它必须排在 schema 行之前:schema 是输出形状,纪律是内容判据,形状压不住判据。
|
|
48
|
+
for (const key of ["summary", "codingSummary"]) {
|
|
49
|
+
for (const lang of LANGS) {
|
|
50
|
+
const text = STR.prompts[key][lang];
|
|
51
|
+
const stance = text.search(/立场纪律|Stance discipline/);
|
|
52
|
+
assert.ok(stance > 0, `${key}.${lang}: 立场纪律必须存在于提示词字面量内部`);
|
|
53
|
+
assert.ok(stance < text.search(/occurred_at|occurred_at/), `${key}.${lang}: 立场纪律必须在 occurred_at 说明之前`);
|
|
54
|
+
assert.ok(stance < text.search(/只输出 JSON 数组|Output only a JSON array/), `${key}.${lang}: 立场纪律必须在输出形状之前`);
|
|
55
|
+
assert.ok(text.indexOf("立场纪律") < 0 || stance > text.indexOf("原子记忆原则") - 1,
|
|
56
|
+
`${key}.${lang}: 立场纪律要跟在原子记忆原则之后,别抢掉开头角色句`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test("工具/报错结论的豁免条款必须在场(删掉它会误杀 pitfall 与 constraint)", () => {
|
|
62
|
+
// 规则 b 说「助手的结论是推断」,但编码类记忆(pitfall / rejected_solution /
|
|
63
|
+
// constraint)的内容本来就是工具输出与报错直接给出的技术结论。没有这半句豁免,
|
|
64
|
+
// 规则 b 会把整个编码回溯功能一并否掉——这是最容易被后人顺手删掉的高危句。
|
|
65
|
+
for (const lang of LANGS) {
|
|
66
|
+
const text = STR.prompts.summary[lang];
|
|
67
|
+
assert.match(text, /工具输出、报错、命令结果|tool output, errors or command results/,
|
|
68
|
+
`summary.${lang}: 工具结论豁免条款缺失,规则 b 会误杀 pitfall/constraint`);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test("dreamSummary 带叙述纪律,且散文契约不被破坏", () => {
|
|
73
|
+
for (const lang of LANGS) {
|
|
74
|
+
const text = STR.prompts.dreamSummary[lang];
|
|
75
|
+
assert.match(text, /叙述纪律|Narrative discipline/, `dreamSummary.${lang}: 缺叙述纪律`);
|
|
76
|
+
assert.match(text, /不要给用户添上|add no characterisation/, `dreamSummary.${lang}: 缺「不给用户添性格评价」`);
|
|
77
|
+
// 总览是**散文**契约:dream-fence 那条锁要求这里绝不能出现「JSON 数组」,
|
|
78
|
+
// 否则模型会按数组契约回 `[]`,而 summaryText.trim() 判非空通过,`[]` 就
|
|
79
|
+
// 被当成摘要存进库(dream.js:326-328 的注释记着这次评审实测)。
|
|
80
|
+
assert.doesNotMatch(text, /JSON 数组|JSON array/, `dreamSummary.${lang}: 散文契约里不得出现 JSON 数组`);
|
|
81
|
+
// 硬输出格式锁必须留在末尾,它是「只回叙述文本」的唯一保证。
|
|
82
|
+
assert.match(lang === "zh" ? text : text, /只输出叙述文本,不要其他内容。|Output only the narrative text, nothing else./,
|
|
83
|
+
`dreamSummary.${lang}: 末尾输出格式锁丢了`);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// 下面这条是**输出侧**的接线锁:提示词改了,落库判据不能跟着变。
|
|
88
|
+
// 空字符串仍必须判为「没有摘要」(degraded/noop),不能被新文案带成「存了个空叙述」。
|
|
89
|
+
test("总览落库判据不因提示词改动而放宽", async () => {
|
|
90
|
+
function mockCtx({ summaryText }) {
|
|
91
|
+
return {
|
|
92
|
+
logger: { warn: () => {} },
|
|
93
|
+
agentDefaultModel: { currentSelection: () => ({ provider: "mock", model: "mock-model" }) },
|
|
94
|
+
llm: {
|
|
95
|
+
async *stream(options) {
|
|
96
|
+
const userText = options.messages.find((m) => m.role === "user")?.content?.[0]?.text ?? "";
|
|
97
|
+
if (userText.includes("| type=")) {
|
|
98
|
+
yield { type: "block-start", index: 0, blockType: "text" };
|
|
99
|
+
yield { type: "text-delta", index: 0, text: "[]" };
|
|
100
|
+
yield { type: "block-end", index: 0, block: { type: "text" } };
|
|
101
|
+
yield { type: "finish", reason: { kind: "stop" } };
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
yield { type: "text-delta", index: 0, text: summaryText };
|
|
105
|
+
yield { type: "finish", reason: { kind: "stop" } };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const store = createStore(":memory:");
|
|
112
|
+
const service = createService({ store, mirror: null, config: {} });
|
|
113
|
+
const dream = createDreamScheduler({ onRun: () => Promise.resolve({ ok: true, skipped: true }) });
|
|
114
|
+
service.saveWithDedupe({ type: "preference", title: "语言", content: "中文", importance: 3 });
|
|
115
|
+
|
|
116
|
+
const ok = await dream.runDream(mockCtx({ summaryText: "记忆库总览:用户偏好中文。" }), service, {});
|
|
117
|
+
assert.equal(ok.summary, true, "非空叙述照常落库");
|
|
118
|
+
const row = service.all().find((m) => m.type === "summary");
|
|
119
|
+
assert.ok(row, "总览行必须存在");
|
|
120
|
+
assert.equal(row.source, "dream");
|
|
121
|
+
assert.equal(row.importance, 5, "总览行的 importance 固定 5(最高注入档)");
|
|
122
|
+
|
|
123
|
+
const empty = await dream.runDream(mockCtx({ summaryText: "" }), service, {});
|
|
124
|
+
assert.equal(empty.summary, false, "空叙述不得落库");
|
|
125
|
+
const rows = service.all().filter((m) => m.type === "summary");
|
|
126
|
+
assert.equal(rows.length, 1, "旧总览存活,没有被空叙述覆盖");
|
|
127
|
+
store.close();
|
|
128
|
+
});
|