@modusensus/dsh-mneme 0.14.0-beta.1 → 0.14.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +830 -830
- package/assets/icon.svg +3 -3
- package/bin/cli.mjs +964 -964
- package/bin/dsh-mneme-choro.mjs +262 -262
- 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 -404
- 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 -3600
- 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 -14322
- package/lib/commands.js +95 -95
- package/lib/config-keys.js +144 -144
- package/lib/config.js +1361 -1344
- 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 -945
- package/lib/dream/narratives.js +44 -44
- package/lib/dream/sleep.js +2027 -2027
- package/lib/dream/triage.js +139 -139
- package/lib/dream.js +1879 -1879
- 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 -119
- package/lib/image-describe.js +158 -0
- package/lib/index.js +852 -852
- package/lib/inject.js +656 -651
- 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 -595
- 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 -3268
- package/lib/session-gate.js +91 -91
- package/lib/session-usage.js +350 -350
- package/lib/settings.js +827 -817
- 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 -5895
- 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 -267
- 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 -640
- package/lib/wiki/render.js +261 -261
- package/lib/wiki/scan.js +371 -371
- package/lib/wiki/t0.js +500 -500
- package/lib/wiki/t1-jobs.js +232 -232
- package/lib/wiki/t1.js +609 -609
- package/lib/write-admission.js +404 -404
- package/locale/en.json +6 -6
- package/locale/zh.json +6 -6
- package/package.json +1 -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 -210
- package/scripts/release-notes.mjs +164 -164
- 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 -3600
- 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 -1344
- 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 -945
- package/src/dream/narratives.js +44 -44
- package/src/dream/sleep.js +2027 -2027
- package/src/dream/triage.js +139 -139
- package/src/dream.js +1879 -1879
- 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 -119
- package/src/image-describe.js +158 -0
- package/src/index.js +852 -852
- package/src/inject.js +656 -651
- 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 -595
- 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 -3268
- package/src/session-gate.js +91 -91
- package/src/session-usage.js +350 -350
- package/src/settings.js +827 -817
- 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 -5895
- 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 -267
- 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 -640
- package/src/wiki/render.js +261 -261
- package/src/wiki/scan.js +371 -371
- package/src/wiki/t0.js +500 -500
- package/src/wiki/t1-jobs.js +232 -232
- package/src/wiki/t1.js +609 -609
- 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 -2998
- 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 -4425
- 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 -452
- package/test/conflict-ledger.test.js +242 -242
- 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 -432
- 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 -174
- 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 -333
- 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 -259
- 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 -109
- 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 -553
- 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 -90
- package/test/panel-tokens.test.js +245 -245
- 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 -156
- package/test/release-notes.test.js +265 -265
- 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 -188
- 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 -1455
- 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 -734
- package/test/wiki-claims.test.js +194 -194
- 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 -202
- package/test/wiki-queries.test.js +398 -398
- package/test/wiki-scan.test.js +208 -208
- package/test/wiki-store.test.js +190 -190
- package/test/wiki-t0.test.js +456 -456
- package/test/wiki-t1-jobs.test.js +125 -125
- package/test/wiki-t1.test.js +460 -460
- 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,36 +1,36 @@
|
|
|
1
|
-
// personaEnabled flag wiring (#254-style): schema key + whitelist pair must
|
|
2
|
-
// surface in /features effective with default false — a missing key would make
|
|
3
|
-
// the panel toggle silently ineffective (client reads effective to register).
|
|
4
|
-
import test from "node:test";
|
|
5
|
-
import assert from "node:assert/strict";
|
|
6
|
-
import { Config } from "../src/config.js";
|
|
7
|
-
import { createSettings, FEATURE_FLAG_SPEC } from "../src/settings.js";
|
|
8
|
-
import { createStore } from "../src/store.js";
|
|
9
|
-
|
|
10
|
-
test("config schema has personaEnabled defaulting to false", () => {
|
|
11
|
-
const cfg = Config({});
|
|
12
|
-
assert.equal(cfg.personaEnabled, false);
|
|
13
|
-
// 顶层扁平布尔:显式 true 穿透
|
|
14
|
-
const cfgOn = Config({ personaEnabled: true });
|
|
15
|
-
assert.equal(cfgOn.personaEnabled, true);
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
test("personaEnabled is in the boolean whitelist and spec export", () => {
|
|
19
|
-
assert.ok(FEATURE_FLAG_SPEC.booleans.includes("personaEnabled"));
|
|
20
|
-
// 默认关:不在 lightMode 排除名单(轻量纯文本注入物,用户显式勾选赢——
|
|
21
|
-
// 定性同 actionPipelineEnabled;若未来要进名单,此处会失败并提示改设计稿④)
|
|
22
|
-
const cfg = Config({});
|
|
23
|
-
const light = cfg.lightMode === true ? cfg : cfg;
|
|
24
|
-
void light; // lightMode 定性由 api.test.js 计数锁与 config.js 注释共同钉住
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
test("effective snapshot includes personaEnabled (false default) via featureSnapshot path", () => {
|
|
28
|
-
const store = createStore(":memory:");
|
|
29
|
-
const settings = createSettings(store.db);
|
|
30
|
-
// settings.setFeatureFlags 逐键校验合并写:白名单键可写(w1 已锁 TypeError 面)
|
|
31
|
-
settings.setFeatureFlags({ personaEnabled: true });
|
|
32
|
-
assert.equal(settings.getFeatureFlags().personaEnabled, true);
|
|
33
|
-
// 清掉覆盖后 effective 应回落到 config 默认 false——由 api.test.js 的
|
|
34
|
-
// 计数锁 + personaEnabled 默认值断言在 /features 路径上完整验证(w1 已同步 +1)。
|
|
35
|
-
store.close();
|
|
36
|
-
});
|
|
1
|
+
// personaEnabled flag wiring (#254-style): schema key + whitelist pair must
|
|
2
|
+
// surface in /features effective with default false — a missing key would make
|
|
3
|
+
// the panel toggle silently ineffective (client reads effective to register).
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
import assert from "node:assert/strict";
|
|
6
|
+
import { Config } from "../src/config.js";
|
|
7
|
+
import { createSettings, FEATURE_FLAG_SPEC } from "../src/settings.js";
|
|
8
|
+
import { createStore } from "../src/store.js";
|
|
9
|
+
|
|
10
|
+
test("config schema has personaEnabled defaulting to false", () => {
|
|
11
|
+
const cfg = Config({});
|
|
12
|
+
assert.equal(cfg.personaEnabled, false);
|
|
13
|
+
// 顶层扁平布尔:显式 true 穿透
|
|
14
|
+
const cfgOn = Config({ personaEnabled: true });
|
|
15
|
+
assert.equal(cfgOn.personaEnabled, true);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test("personaEnabled is in the boolean whitelist and spec export", () => {
|
|
19
|
+
assert.ok(FEATURE_FLAG_SPEC.booleans.includes("personaEnabled"));
|
|
20
|
+
// 默认关:不在 lightMode 排除名单(轻量纯文本注入物,用户显式勾选赢——
|
|
21
|
+
// 定性同 actionPipelineEnabled;若未来要进名单,此处会失败并提示改设计稿④)
|
|
22
|
+
const cfg = Config({});
|
|
23
|
+
const light = cfg.lightMode === true ? cfg : cfg;
|
|
24
|
+
void light; // lightMode 定性由 api.test.js 计数锁与 config.js 注释共同钉住
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("effective snapshot includes personaEnabled (false default) via featureSnapshot path", () => {
|
|
28
|
+
const store = createStore(":memory:");
|
|
29
|
+
const settings = createSettings(store.db);
|
|
30
|
+
// settings.setFeatureFlags 逐键校验合并写:白名单键可写(w1 已锁 TypeError 面)
|
|
31
|
+
settings.setFeatureFlags({ personaEnabled: true });
|
|
32
|
+
assert.equal(settings.getFeatureFlags().personaEnabled, true);
|
|
33
|
+
// 清掉覆盖后 effective 应回落到 config 默认 false——由 api.test.js 的
|
|
34
|
+
// 计数锁 + personaEnabled 默认值断言在 /features 路径上完整验证(w1 已同步 +1)。
|
|
35
|
+
store.close();
|
|
36
|
+
});
|
|
@@ -1,145 +1,145 @@
|
|
|
1
|
-
// Persona injection via renderUserSettings (user-settings context, order 85).
|
|
2
|
-
// Locks: with either gate off, output is byte-identical to the legacy rendering
|
|
3
|
-
// (old users see zero change); with both gates on, persona lines lead the block
|
|
4
|
-
// (design ⑥: persona → profile → rules, rules stay hardest) and go through
|
|
5
|
-
// escapePromptVars.
|
|
6
|
-
import test from "node:test";
|
|
7
|
-
import assert from "node:assert/strict";
|
|
8
|
-
import { createStore } from "../src/store.js";
|
|
9
|
-
import { createService } from "../src/service.js";
|
|
10
|
-
import { createInjector } from "../src/inject.js";
|
|
11
|
-
import { createSettings } from "../src/settings.js";
|
|
12
|
-
|
|
13
|
-
function setup(over = {}) {
|
|
14
|
-
const store = createStore(":memory:");
|
|
15
|
-
const service = createService({ store, mirror: null, config: {} });
|
|
16
|
-
const settings = createSettings(store.db);
|
|
17
|
-
const contexts = [];
|
|
18
|
-
const ctx = {
|
|
19
|
-
systemPrompt: {
|
|
20
|
-
context(def) {
|
|
21
|
-
contexts.push(def);
|
|
22
|
-
return () => {};
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
const config = { maxInjectedItems: 3, importanceThreshold: 3, ...over };
|
|
27
|
-
createInjector(ctx, service, settings, config);
|
|
28
|
-
const settingsCtx = contexts.find((c) => c.name === "user-settings");
|
|
29
|
-
return { store, settings, settingsCtx };
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
test("legacy output unchanged when config gate off (persona stored but ignored)", () => {
|
|
33
|
-
const { store, settings, settingsCtx } = setup({ personaEnabled: false });
|
|
34
|
-
settings.setProfile("用户是规划背景");
|
|
35
|
-
settings.setRules(["不提及用户名"]);
|
|
36
|
-
settings.setPersona({ name: "Amarre", personality: "轻松幽默", enabled: true });
|
|
37
|
-
const text = settingsCtx.text({});
|
|
38
|
-
// 逐字节等于历史渲染:无人格行、无人格名
|
|
39
|
-
assert.equal(text, escapeless([
|
|
40
|
-
"[用户设置] 来自 dsh-mneme 的用户画像与规则:",
|
|
41
|
-
"- 用户画像:用户是规划背景",
|
|
42
|
-
"- 规则:不提及用户名"
|
|
43
|
-
].join("\n")));
|
|
44
|
-
store.close();
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
test("legacy output unchanged when persona.enabled off (config gate on)", () => {
|
|
48
|
-
const { store, settings, settingsCtx } = setup({ personaEnabled: true });
|
|
49
|
-
settings.setProfile("用户是规划背景");
|
|
50
|
-
settings.setPersona({ name: "Amarre", personality: "轻松幽默", enabled: false });
|
|
51
|
-
const text = settingsCtx.text({});
|
|
52
|
-
assert.ok(text.includes("用户画像"));
|
|
53
|
-
assert.ok(!text.includes("人格"));
|
|
54
|
-
store.close();
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
test("empty block stays empty when only persona exists but a gate is off", () => {
|
|
58
|
-
const { store, settings, settingsCtx } = setup({ personaEnabled: false });
|
|
59
|
-
settings.setPersona({ name: "Amarre", enabled: true });
|
|
60
|
-
assert.equal(settingsCtx.text({}), "");
|
|
61
|
-
store.close();
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
test("both gates on: persona lines lead, then profile, then rules", () => {
|
|
65
|
-
const { store, settings, settingsCtx } = setup({ personaEnabled: true });
|
|
66
|
-
settings.setProfile("用户是规划背景");
|
|
67
|
-
settings.setRules(["不提及用户名"]);
|
|
68
|
-
settings.setPersona({ name: "Amarre", personality: "轻松幽默", replyStyle: "先给结论再解释", enabled: true });
|
|
69
|
-
const text = settingsCtx.text({});
|
|
70
|
-
const idxPersona = text.indexOf("你的人格名字:Amarre");
|
|
71
|
-
const idxProfile = text.indexOf("用户画像:用户是规划背景");
|
|
72
|
-
const idxRule = text.indexOf("规则:不提及用户名");
|
|
73
|
-
assert.ok(idxPersona > -1, "persona line present");
|
|
74
|
-
assert.ok(idxProfile > idxPersona, "profile after persona (design ⑥)");
|
|
75
|
-
assert.ok(idxRule > idxProfile, "rules after profile (rules hardest)");
|
|
76
|
-
assert.ok(text.includes("人格性格设定:轻松幽默"));
|
|
77
|
-
assert.ok(text.includes("回复要求:先给结论再解释"));
|
|
78
|
-
store.close();
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
test("persona with blank text fields renders no persona lines (no empty bullets)", () => {
|
|
82
|
-
const { store, settings, settingsCtx } = setup({ personaEnabled: true });
|
|
83
|
-
settings.setPersona({ name: " ", personality: "", enabled: true });
|
|
84
|
-
assert.equal(settingsCtx.text({}), "");
|
|
85
|
-
settings.setProfile("有画像");
|
|
86
|
-
const text = settingsCtx.text({});
|
|
87
|
-
assert.ok(!text.includes("人格"));
|
|
88
|
-
store.close();
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
test("persona text goes through escapePromptVars (no raw braces)", () => {
|
|
92
|
-
const { store, settings, settingsCtx } = setup({ personaEnabled: true });
|
|
93
|
-
settings.setPersona({ name: "{{evil}}", enabled: true });
|
|
94
|
-
const text = settingsCtx.text({});
|
|
95
|
-
assert.ok(!text.includes("{{"), "no raw {{ in user-settings block");
|
|
96
|
-
assert.ok(!text.includes("}}"), "no raw }} in user-settings block");
|
|
97
|
-
store.close();
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
// ---- v1.2 多卡寻址:按会话身份取卡,取不到落 default ------------------------
|
|
101
|
-
|
|
102
|
-
test("session identity hit: byAgent card wins over default", () => {
|
|
103
|
-
const { store, settings, settingsCtx } = setup({ personaEnabled: true });
|
|
104
|
-
settings.setPersona({ name: "Amarre", enabled: true }); // default
|
|
105
|
-
settings.setPersonaFor("zephyr", { name: "泽菲尔", personality: "冷危占有", enabled: true });
|
|
106
|
-
const ctxWithId = { agent: { session: { header: { agentPreset: "zephyr" } } } };
|
|
107
|
-
const text = settingsCtx.text(ctxWithId);
|
|
108
|
-
assert.ok(text.includes("你的人格名字:泽菲尔"), "byAgent card injected");
|
|
109
|
-
assert.ok(!text.includes("Amarre"), "default card not injected when identity hit");
|
|
110
|
-
store.close();
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
test("session identity miss: falls back to default card", () => {
|
|
114
|
-
const { store, settings, settingsCtx } = setup({ personaEnabled: true });
|
|
115
|
-
settings.setPersona({ name: "Amarre", enabled: true });
|
|
116
|
-
settings.setPersonaFor("zephyr", { name: "泽菲尔", enabled: true });
|
|
117
|
-
const ctxUnknown = { agent: { session: { header: { agentPreset: "unknown-bot" } } } };
|
|
118
|
-
const text = settingsCtx.text(ctxUnknown);
|
|
119
|
-
assert.ok(text.includes("Amarre"), "default on identity miss");
|
|
120
|
-
assert.ok(!text.includes("泽菲尔"), "other card not leaked");
|
|
121
|
-
store.close();
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
test("identity card disabled (enabled=false) falls back to default, not partial card", () => {
|
|
125
|
-
const { store, settings, settingsCtx } = setup({ personaEnabled: true });
|
|
126
|
-
settings.setPersona({ name: "Amarre", enabled: true });
|
|
127
|
-
settings.setPersonaFor("zephyr", { name: "泽菲尔", personality: "冷", enabled: false });
|
|
128
|
-
const ctxWithId = { agent: { session: { header: { agentPreset: "zephyr" } } } };
|
|
129
|
-
const text = settingsCtx.text(ctxWithId);
|
|
130
|
-
assert.ok(text.includes("Amarre"), "disabled id card → default");
|
|
131
|
-
assert.ok(!text.includes("泽菲尔"), "disabled card never partially injected");
|
|
132
|
-
store.close();
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
test("session without header (mock/old host) behaves exactly like v1 (default)", () => {
|
|
136
|
-
const { store, settings, settingsCtx } = setup({ personaEnabled: true });
|
|
137
|
-
settings.setPersona({ name: "Amarre", personality: "轻松幽默", enabled: true });
|
|
138
|
-
const text = settingsCtx.text({}); // 无 session.header → default,与 v1 一致
|
|
139
|
-
assert.ok(text.includes("你的人格名字:Amarre"));
|
|
140
|
-
assert.ok(text.includes("人格性格设定:轻松幽默"));
|
|
141
|
-
store.close();
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
// 期望值工具:直接写明文(本组用例不含需转义字符,escapePromptVars 为恒等)。
|
|
145
|
-
function escapeless(s) { return s; }
|
|
1
|
+
// Persona injection via renderUserSettings (user-settings context, order 85).
|
|
2
|
+
// Locks: with either gate off, output is byte-identical to the legacy rendering
|
|
3
|
+
// (old users see zero change); with both gates on, persona lines lead the block
|
|
4
|
+
// (design ⑥: persona → profile → rules, rules stay hardest) and go through
|
|
5
|
+
// escapePromptVars.
|
|
6
|
+
import test from "node:test";
|
|
7
|
+
import assert from "node:assert/strict";
|
|
8
|
+
import { createStore } from "../src/store.js";
|
|
9
|
+
import { createService } from "../src/service.js";
|
|
10
|
+
import { createInjector } from "../src/inject.js";
|
|
11
|
+
import { createSettings } from "../src/settings.js";
|
|
12
|
+
|
|
13
|
+
function setup(over = {}) {
|
|
14
|
+
const store = createStore(":memory:");
|
|
15
|
+
const service = createService({ store, mirror: null, config: {} });
|
|
16
|
+
const settings = createSettings(store.db);
|
|
17
|
+
const contexts = [];
|
|
18
|
+
const ctx = {
|
|
19
|
+
systemPrompt: {
|
|
20
|
+
context(def) {
|
|
21
|
+
contexts.push(def);
|
|
22
|
+
return () => {};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const config = { maxInjectedItems: 3, importanceThreshold: 3, ...over };
|
|
27
|
+
createInjector(ctx, service, settings, config);
|
|
28
|
+
const settingsCtx = contexts.find((c) => c.name === "user-settings");
|
|
29
|
+
return { store, settings, settingsCtx };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
test("legacy output unchanged when config gate off (persona stored but ignored)", () => {
|
|
33
|
+
const { store, settings, settingsCtx } = setup({ personaEnabled: false });
|
|
34
|
+
settings.setProfile("用户是规划背景");
|
|
35
|
+
settings.setRules(["不提及用户名"]);
|
|
36
|
+
settings.setPersona({ name: "Amarre", personality: "轻松幽默", enabled: true });
|
|
37
|
+
const text = settingsCtx.text({});
|
|
38
|
+
// 逐字节等于历史渲染:无人格行、无人格名
|
|
39
|
+
assert.equal(text, escapeless([
|
|
40
|
+
"[用户设置] 来自 dsh-mneme 的用户画像与规则:",
|
|
41
|
+
"- 用户画像:用户是规划背景",
|
|
42
|
+
"- 规则:不提及用户名"
|
|
43
|
+
].join("\n")));
|
|
44
|
+
store.close();
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test("legacy output unchanged when persona.enabled off (config gate on)", () => {
|
|
48
|
+
const { store, settings, settingsCtx } = setup({ personaEnabled: true });
|
|
49
|
+
settings.setProfile("用户是规划背景");
|
|
50
|
+
settings.setPersona({ name: "Amarre", personality: "轻松幽默", enabled: false });
|
|
51
|
+
const text = settingsCtx.text({});
|
|
52
|
+
assert.ok(text.includes("用户画像"));
|
|
53
|
+
assert.ok(!text.includes("人格"));
|
|
54
|
+
store.close();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test("empty block stays empty when only persona exists but a gate is off", () => {
|
|
58
|
+
const { store, settings, settingsCtx } = setup({ personaEnabled: false });
|
|
59
|
+
settings.setPersona({ name: "Amarre", enabled: true });
|
|
60
|
+
assert.equal(settingsCtx.text({}), "");
|
|
61
|
+
store.close();
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test("both gates on: persona lines lead, then profile, then rules", () => {
|
|
65
|
+
const { store, settings, settingsCtx } = setup({ personaEnabled: true });
|
|
66
|
+
settings.setProfile("用户是规划背景");
|
|
67
|
+
settings.setRules(["不提及用户名"]);
|
|
68
|
+
settings.setPersona({ name: "Amarre", personality: "轻松幽默", replyStyle: "先给结论再解释", enabled: true });
|
|
69
|
+
const text = settingsCtx.text({});
|
|
70
|
+
const idxPersona = text.indexOf("你的人格名字:Amarre");
|
|
71
|
+
const idxProfile = text.indexOf("用户画像:用户是规划背景");
|
|
72
|
+
const idxRule = text.indexOf("规则:不提及用户名");
|
|
73
|
+
assert.ok(idxPersona > -1, "persona line present");
|
|
74
|
+
assert.ok(idxProfile > idxPersona, "profile after persona (design ⑥)");
|
|
75
|
+
assert.ok(idxRule > idxProfile, "rules after profile (rules hardest)");
|
|
76
|
+
assert.ok(text.includes("人格性格设定:轻松幽默"));
|
|
77
|
+
assert.ok(text.includes("回复要求:先给结论再解释"));
|
|
78
|
+
store.close();
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
test("persona with blank text fields renders no persona lines (no empty bullets)", () => {
|
|
82
|
+
const { store, settings, settingsCtx } = setup({ personaEnabled: true });
|
|
83
|
+
settings.setPersona({ name: " ", personality: "", enabled: true });
|
|
84
|
+
assert.equal(settingsCtx.text({}), "");
|
|
85
|
+
settings.setProfile("有画像");
|
|
86
|
+
const text = settingsCtx.text({});
|
|
87
|
+
assert.ok(!text.includes("人格"));
|
|
88
|
+
store.close();
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test("persona text goes through escapePromptVars (no raw braces)", () => {
|
|
92
|
+
const { store, settings, settingsCtx } = setup({ personaEnabled: true });
|
|
93
|
+
settings.setPersona({ name: "{{evil}}", enabled: true });
|
|
94
|
+
const text = settingsCtx.text({});
|
|
95
|
+
assert.ok(!text.includes("{{"), "no raw {{ in user-settings block");
|
|
96
|
+
assert.ok(!text.includes("}}"), "no raw }} in user-settings block");
|
|
97
|
+
store.close();
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
// ---- v1.2 多卡寻址:按会话身份取卡,取不到落 default ------------------------
|
|
101
|
+
|
|
102
|
+
test("session identity hit: byAgent card wins over default", () => {
|
|
103
|
+
const { store, settings, settingsCtx } = setup({ personaEnabled: true });
|
|
104
|
+
settings.setPersona({ name: "Amarre", enabled: true }); // default
|
|
105
|
+
settings.setPersonaFor("zephyr", { name: "泽菲尔", personality: "冷危占有", enabled: true });
|
|
106
|
+
const ctxWithId = { agent: { session: { header: { agentPreset: "zephyr" } } } };
|
|
107
|
+
const text = settingsCtx.text(ctxWithId);
|
|
108
|
+
assert.ok(text.includes("你的人格名字:泽菲尔"), "byAgent card injected");
|
|
109
|
+
assert.ok(!text.includes("Amarre"), "default card not injected when identity hit");
|
|
110
|
+
store.close();
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test("session identity miss: falls back to default card", () => {
|
|
114
|
+
const { store, settings, settingsCtx } = setup({ personaEnabled: true });
|
|
115
|
+
settings.setPersona({ name: "Amarre", enabled: true });
|
|
116
|
+
settings.setPersonaFor("zephyr", { name: "泽菲尔", enabled: true });
|
|
117
|
+
const ctxUnknown = { agent: { session: { header: { agentPreset: "unknown-bot" } } } };
|
|
118
|
+
const text = settingsCtx.text(ctxUnknown);
|
|
119
|
+
assert.ok(text.includes("Amarre"), "default on identity miss");
|
|
120
|
+
assert.ok(!text.includes("泽菲尔"), "other card not leaked");
|
|
121
|
+
store.close();
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test("identity card disabled (enabled=false) falls back to default, not partial card", () => {
|
|
125
|
+
const { store, settings, settingsCtx } = setup({ personaEnabled: true });
|
|
126
|
+
settings.setPersona({ name: "Amarre", enabled: true });
|
|
127
|
+
settings.setPersonaFor("zephyr", { name: "泽菲尔", personality: "冷", enabled: false });
|
|
128
|
+
const ctxWithId = { agent: { session: { header: { agentPreset: "zephyr" } } } };
|
|
129
|
+
const text = settingsCtx.text(ctxWithId);
|
|
130
|
+
assert.ok(text.includes("Amarre"), "disabled id card → default");
|
|
131
|
+
assert.ok(!text.includes("泽菲尔"), "disabled card never partially injected");
|
|
132
|
+
store.close();
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
test("session without header (mock/old host) behaves exactly like v1 (default)", () => {
|
|
136
|
+
const { store, settings, settingsCtx } = setup({ personaEnabled: true });
|
|
137
|
+
settings.setPersona({ name: "Amarre", personality: "轻松幽默", enabled: true });
|
|
138
|
+
const text = settingsCtx.text({}); // 无 session.header → default,与 v1 一致
|
|
139
|
+
assert.ok(text.includes("你的人格名字:Amarre"));
|
|
140
|
+
assert.ok(text.includes("人格性格设定:轻松幽默"));
|
|
141
|
+
store.close();
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
// 期望值工具:直接写明文(本组用例不含需转义字符,escapePromptVars 为恒等)。
|
|
145
|
+
function escapeless(s) { return s; }
|