@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,110 +1,110 @@
|
|
|
1
|
-
import test from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import { createStore } from "../src/store.js";
|
|
4
|
-
import { createService } from "../src/service.js";
|
|
5
|
-
|
|
6
|
-
// ============================================================ distill-tx-embed-gap
|
|
7
|
-
// 回归锁:此前 scheduleEmbed 在 txDepth>0 时首行直接 return(注释写 deferred,
|
|
8
|
-
// 实际 transaction() 从不补跑)——与 #372 的实体抽取是同一个 bug 模板,只是受害者
|
|
9
|
-
// 换成了嵌入:自动蒸馏(summarize 全部走 service.transaction)写入的 session:* 行
|
|
10
|
-
// 100% 拿不到向量,语义检索对这批行永远失明。照 #372 的修复模板改为入队、提交后
|
|
11
|
-
// 补跑、回滚截断。五把锁与 test/entities.test.js 的 #372 锁一一对应,锁的是
|
|
12
|
-
// 「commit 才补跑、回滚绝不补跑」这个契约本身——任何一侧改回丢弃或回滚也补跑,
|
|
13
|
-
// 这里当场红。
|
|
14
|
-
|
|
15
|
-
function makeService(config = {}) {
|
|
16
|
-
const store = createStore(":memory:");
|
|
17
|
-
const service = createService({ store, mirror: null, config });
|
|
18
|
-
return { store, service };
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// 8 维定值向量;schedule 分支同步写回(语义同真实 embedder:调度即含写回),
|
|
22
|
-
// 让整条链路确定性、无异步漂移。embedSingle 仅供 ready-gate/embedSingle 分支
|
|
23
|
-
// 的调用方使用,本文件的锁都走 schedule 分支。
|
|
24
|
-
function makeEmbedder(store, embedded) {
|
|
25
|
-
return {
|
|
26
|
-
schedule(memory) {
|
|
27
|
-
embedded.push(memory.id);
|
|
28
|
-
store.setEmbedding(memory.id, new Array(8).fill(0.5), "fake-model-hash");
|
|
29
|
-
},
|
|
30
|
-
embedSingle: async () => new Array(8).fill(0.5),
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
test("distill-tx: embedding queued inside transaction is written exactly once after commit", () => {
|
|
35
|
-
const { store, service } = makeService();
|
|
36
|
-
const embedded = [];
|
|
37
|
-
service.setEmbedder(makeEmbedder(store, embedded));
|
|
38
|
-
const r = service.transaction(() =>
|
|
39
|
-
service.saveWithDedupe({ type: "preference", title: "事务内创建", content: "x" })
|
|
40
|
-
);
|
|
41
|
-
const id = r.memory.id;
|
|
42
|
-
// 提交后补跑恰一次:向量非空、维度等于 embedder 输出(8 维)
|
|
43
|
-
assert.deepEqual(embedded, [id], "drain fires exactly once, after commit");
|
|
44
|
-
const row = store.db.prepare("SELECT embedding FROM memories WHERE id = ?").get(id);
|
|
45
|
-
const vec = JSON.parse(row.embedding);
|
|
46
|
-
assert.equal(vec.length, 8, "vector dimension equals embedder output");
|
|
47
|
-
store.close();
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
test("distill-tx: nothing schedules while txDepth > 0 (queued, not dropped, not immediate)", () => {
|
|
51
|
-
const { store, service } = makeService();
|
|
52
|
-
const embedded = [];
|
|
53
|
-
service.setEmbedder(makeEmbedder(store, embedded));
|
|
54
|
-
service.transaction(() => {
|
|
55
|
-
service.saveWithDedupe({ type: "preference", title: "事务内观察", content: "x" });
|
|
56
|
-
// 事务内此刻不得触发(排进队列而不是丢弃,也不是立即跑)
|
|
57
|
-
assert.equal(embedded.length, 0, "no embedding while txDepth > 0");
|
|
58
|
-
});
|
|
59
|
-
assert.equal(embedded.length, 1, "queued entry drains after commit");
|
|
60
|
-
store.close();
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
test("distill-tx: rolled-back transaction never embeds rolled-back rows", () => {
|
|
64
|
-
const { store, service } = makeService();
|
|
65
|
-
const embedded = [];
|
|
66
|
-
service.setEmbedder(makeEmbedder(store, embedded));
|
|
67
|
-
assert.throws(() => {
|
|
68
|
-
service.transaction(() => {
|
|
69
|
-
service.saveWithDedupe({ type: "preference", title: "会被回滚", content: "x" });
|
|
70
|
-
throw new Error("boom");
|
|
71
|
-
});
|
|
72
|
-
}, /boom/);
|
|
73
|
-
assert.equal(embedded.length, 0, "no embedding against rolled-back rows");
|
|
74
|
-
assert.equal(store.count(), 0, "row itself rolled back");
|
|
75
|
-
store.close();
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
// 与 #372 复审补锁同构:内层回滚截断只丢内层条目,外层提交 drain 外层条目。
|
|
79
|
-
test("distill-tx: inner rollback drops only inner entries; outer commit drains the rest", () => {
|
|
80
|
-
const { store, service } = makeService();
|
|
81
|
-
const embedded = [];
|
|
82
|
-
service.setEmbedder(makeEmbedder(store, embedded));
|
|
83
|
-
const ids = [];
|
|
84
|
-
service.transaction(() => {
|
|
85
|
-
ids.push(service.saveWithDedupe({ type: "preference", title: "外层A", content: "x" }).memory.id);
|
|
86
|
-
try {
|
|
87
|
-
service.transaction(() => {
|
|
88
|
-
service.saveWithDedupe({ type: "preference", title: "内层回滚", content: "x" });
|
|
89
|
-
throw new Error("inner boom");
|
|
90
|
-
});
|
|
91
|
-
} catch { /* 内层回滚,外层继续 */ }
|
|
92
|
-
ids.push(service.saveWithDedupe({ type: "preference", title: "外层B", content: "x" }).memory.id);
|
|
93
|
-
});
|
|
94
|
-
assert.deepEqual(embedded.sort(), ids.sort(), "inner rolled-back row never embedded; outer rows drain once");
|
|
95
|
-
assert.equal(store.count(), 2);
|
|
96
|
-
store.close();
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
test("distill-tx: no unbounded cap — large transaction drains every entry", () => {
|
|
100
|
-
const { store, service } = makeService();
|
|
101
|
-
const embedded = [];
|
|
102
|
-
service.setEmbedder(makeEmbedder(store, embedded));
|
|
103
|
-
service.transaction(() => {
|
|
104
|
-
for (let i = 0; i < 150; i++) {
|
|
105
|
-
service.saveWithDedupe({ type: "preference", title: `批量${i}`, content: "x" });
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
assert.equal(embedded.length, 150, "no silent drop at any queue cap");
|
|
109
|
-
store.close();
|
|
110
|
-
});
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { createStore } from "../src/store.js";
|
|
4
|
+
import { createService } from "../src/service.js";
|
|
5
|
+
|
|
6
|
+
// ============================================================ distill-tx-embed-gap
|
|
7
|
+
// 回归锁:此前 scheduleEmbed 在 txDepth>0 时首行直接 return(注释写 deferred,
|
|
8
|
+
// 实际 transaction() 从不补跑)——与 #372 的实体抽取是同一个 bug 模板,只是受害者
|
|
9
|
+
// 换成了嵌入:自动蒸馏(summarize 全部走 service.transaction)写入的 session:* 行
|
|
10
|
+
// 100% 拿不到向量,语义检索对这批行永远失明。照 #372 的修复模板改为入队、提交后
|
|
11
|
+
// 补跑、回滚截断。五把锁与 test/entities.test.js 的 #372 锁一一对应,锁的是
|
|
12
|
+
// 「commit 才补跑、回滚绝不补跑」这个契约本身——任何一侧改回丢弃或回滚也补跑,
|
|
13
|
+
// 这里当场红。
|
|
14
|
+
|
|
15
|
+
function makeService(config = {}) {
|
|
16
|
+
const store = createStore(":memory:");
|
|
17
|
+
const service = createService({ store, mirror: null, config });
|
|
18
|
+
return { store, service };
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// 8 维定值向量;schedule 分支同步写回(语义同真实 embedder:调度即含写回),
|
|
22
|
+
// 让整条链路确定性、无异步漂移。embedSingle 仅供 ready-gate/embedSingle 分支
|
|
23
|
+
// 的调用方使用,本文件的锁都走 schedule 分支。
|
|
24
|
+
function makeEmbedder(store, embedded) {
|
|
25
|
+
return {
|
|
26
|
+
schedule(memory) {
|
|
27
|
+
embedded.push(memory.id);
|
|
28
|
+
store.setEmbedding(memory.id, new Array(8).fill(0.5), "fake-model-hash");
|
|
29
|
+
},
|
|
30
|
+
embedSingle: async () => new Array(8).fill(0.5),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
test("distill-tx: embedding queued inside transaction is written exactly once after commit", () => {
|
|
35
|
+
const { store, service } = makeService();
|
|
36
|
+
const embedded = [];
|
|
37
|
+
service.setEmbedder(makeEmbedder(store, embedded));
|
|
38
|
+
const r = service.transaction(() =>
|
|
39
|
+
service.saveWithDedupe({ type: "preference", title: "事务内创建", content: "x" })
|
|
40
|
+
);
|
|
41
|
+
const id = r.memory.id;
|
|
42
|
+
// 提交后补跑恰一次:向量非空、维度等于 embedder 输出(8 维)
|
|
43
|
+
assert.deepEqual(embedded, [id], "drain fires exactly once, after commit");
|
|
44
|
+
const row = store.db.prepare("SELECT embedding FROM memories WHERE id = ?").get(id);
|
|
45
|
+
const vec = JSON.parse(row.embedding);
|
|
46
|
+
assert.equal(vec.length, 8, "vector dimension equals embedder output");
|
|
47
|
+
store.close();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test("distill-tx: nothing schedules while txDepth > 0 (queued, not dropped, not immediate)", () => {
|
|
51
|
+
const { store, service } = makeService();
|
|
52
|
+
const embedded = [];
|
|
53
|
+
service.setEmbedder(makeEmbedder(store, embedded));
|
|
54
|
+
service.transaction(() => {
|
|
55
|
+
service.saveWithDedupe({ type: "preference", title: "事务内观察", content: "x" });
|
|
56
|
+
// 事务内此刻不得触发(排进队列而不是丢弃,也不是立即跑)
|
|
57
|
+
assert.equal(embedded.length, 0, "no embedding while txDepth > 0");
|
|
58
|
+
});
|
|
59
|
+
assert.equal(embedded.length, 1, "queued entry drains after commit");
|
|
60
|
+
store.close();
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test("distill-tx: rolled-back transaction never embeds rolled-back rows", () => {
|
|
64
|
+
const { store, service } = makeService();
|
|
65
|
+
const embedded = [];
|
|
66
|
+
service.setEmbedder(makeEmbedder(store, embedded));
|
|
67
|
+
assert.throws(() => {
|
|
68
|
+
service.transaction(() => {
|
|
69
|
+
service.saveWithDedupe({ type: "preference", title: "会被回滚", content: "x" });
|
|
70
|
+
throw new Error("boom");
|
|
71
|
+
});
|
|
72
|
+
}, /boom/);
|
|
73
|
+
assert.equal(embedded.length, 0, "no embedding against rolled-back rows");
|
|
74
|
+
assert.equal(store.count(), 0, "row itself rolled back");
|
|
75
|
+
store.close();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// 与 #372 复审补锁同构:内层回滚截断只丢内层条目,外层提交 drain 外层条目。
|
|
79
|
+
test("distill-tx: inner rollback drops only inner entries; outer commit drains the rest", () => {
|
|
80
|
+
const { store, service } = makeService();
|
|
81
|
+
const embedded = [];
|
|
82
|
+
service.setEmbedder(makeEmbedder(store, embedded));
|
|
83
|
+
const ids = [];
|
|
84
|
+
service.transaction(() => {
|
|
85
|
+
ids.push(service.saveWithDedupe({ type: "preference", title: "外层A", content: "x" }).memory.id);
|
|
86
|
+
try {
|
|
87
|
+
service.transaction(() => {
|
|
88
|
+
service.saveWithDedupe({ type: "preference", title: "内层回滚", content: "x" });
|
|
89
|
+
throw new Error("inner boom");
|
|
90
|
+
});
|
|
91
|
+
} catch { /* 内层回滚,外层继续 */ }
|
|
92
|
+
ids.push(service.saveWithDedupe({ type: "preference", title: "外层B", content: "x" }).memory.id);
|
|
93
|
+
});
|
|
94
|
+
assert.deepEqual(embedded.sort(), ids.sort(), "inner rolled-back row never embedded; outer rows drain once");
|
|
95
|
+
assert.equal(store.count(), 2);
|
|
96
|
+
store.close();
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test("distill-tx: no unbounded cap — large transaction drains every entry", () => {
|
|
100
|
+
const { store, service } = makeService();
|
|
101
|
+
const embedded = [];
|
|
102
|
+
service.setEmbedder(makeEmbedder(store, embedded));
|
|
103
|
+
service.transaction(() => {
|
|
104
|
+
for (let i = 0; i < 150; i++) {
|
|
105
|
+
service.saveWithDedupe({ type: "preference", title: `批量${i}`, content: "x" });
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
assert.equal(embedded.length, 150, "no silent drop at any queue cap");
|
|
109
|
+
store.close();
|
|
110
|
+
});
|
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
// 「CONFIGURATION.md 是全键参考」这句声明需要一条闸门,否则它会慢慢变成谎话:
|
|
2
|
-
// 2026-10 审计实测有 11 个 schema 键(graph 组 8 个、sensitiveScanEnabled、
|
|
3
|
-
// injectTimePrefix、actionPipelineEnabled)在文档与双 README 里一个字都没有,
|
|
4
|
-
// 而它们里有安全开关。锁法:从 Config({}) 的默认值深挖叶子键,要求每个键名
|
|
5
|
-
// (或它的父路径,用于 heatTypeDecay 这类整表描述)在文档里出现。
|
|
6
|
-
import test from "node:test";
|
|
7
|
-
import assert from "node:assert/strict";
|
|
8
|
-
import { readFileSync } from "node:fs";
|
|
9
|
-
import { fileURLToPath } from "node:url";
|
|
10
|
-
import path from "node:path";
|
|
11
|
-
import { Config } from "../src/config.js";
|
|
12
|
-
|
|
13
|
-
const root = path.dirname(path.dirname(fileURLToPath(import.meta.url)));
|
|
14
|
-
const doc = readFileSync(path.join(root, "docs", "CONFIGURATION.md"), "utf8");
|
|
15
|
-
const cfgSrc = readFileSync(path.join(root, "src", "config.js"), "utf8");
|
|
16
|
-
|
|
17
|
-
function leafKeys(obj, prefix) {
|
|
18
|
-
const out = [];
|
|
19
|
-
for (const [k, v] of Object.entries(obj)) {
|
|
20
|
-
const p = prefix ? prefix + "." + k : k;
|
|
21
|
-
if (v && typeof v === "object" && !Array.isArray(v)) { out.push(...leafKeys(v, p)); continue; }
|
|
22
|
-
out.push({ path: p, leaf: k, parent: prefix || "" });
|
|
23
|
-
}
|
|
24
|
-
return out;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// 父路径回退是给「整表说明」用的例外,白名单写死在这里而不是「任何父路径都
|
|
28
|
-
// 放行」——否则往 writeAdmission 里加个子键,只要文档提到 writeAdmission 就过,
|
|
29
|
-
// 测试原本要防的漏键会静默复发(评审指出的漏洞)。新增例外必须显式加一行。
|
|
30
|
-
const PARENT_ONLY_OK = new Set(["heatTypeDecay"]);
|
|
31
|
-
|
|
32
|
-
test("CONFIGURATION.md 覆盖 schema 的每一个键", () => {
|
|
33
|
-
const keys = leafKeys(Config({}), "");
|
|
34
|
-
assert.ok(keys.length > 150, "键枚举失败会静默返回 0 项,先锁下限");
|
|
35
|
-
const missing = keys.filter((k) => {
|
|
36
|
-
// 完整路径优先("writeAdmission.enabled"),其次才是显式白名单里的整表父路径。
|
|
37
|
-
if (doc.includes(k.path)) return false;
|
|
38
|
-
if (k.parent && PARENT_ONLY_OK.has(k.parent) && doc.includes(k.parent)) return false;
|
|
39
|
-
// 表里写的是裸键名也认(绝大多数顶层键就是这么写的)。
|
|
40
|
-
return !doc.includes(k.leaf);
|
|
41
|
-
});
|
|
42
|
-
assert.deepEqual(missing.map((m) => m.path), []);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
// lightMode 清单是有边界的一节:整份文档 grep 会让「删掉清单里的某一行」照样
|
|
46
|
-
// 通过(图谱表里还留着同名键),测试要盯的漏项就藏在那个缝里。
|
|
47
|
-
function lightSection(text) {
|
|
48
|
-
const start = text.indexOf("lightMode 强制关闭清单");
|
|
49
|
-
assert.ok(start >= 0, "文档里应有「lightMode 强制关闭清单」一节");
|
|
50
|
-
const rest = text.slice(start);
|
|
51
|
-
const end = rest.indexOf("预设只是默认值");
|
|
52
|
-
return end > 0 ? rest.slice(0, end) : rest;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
test("LIGHT_MODE_OFF 的每一项都写进了文档的轻量档清单", () => {
|
|
56
|
-
// LIGHT_MODE_OFF 没有导出,只能解析源码文本;先锁解析结果的长度,防止
|
|
57
|
-
// 正则失配时这个用例变成「空数组 ⊂ 文档」的永真断言。
|
|
58
|
-
const m = cfgSrc.match(/const LIGHT_MODE_OFF = \[([\s\S]*?)\];/);
|
|
59
|
-
assert.ok(m, "LIGHT_MODE_OFF 应从 src/config.js 中解析出来");
|
|
60
|
-
const names = [...m[1].matchAll(/"([^"]+)"/g)].map((x) => x[1]);
|
|
61
|
-
assert.ok(names.length >= 20, "解析到 " + names.length + " 项,少于预期的 21 项");
|
|
62
|
-
const section = lightSection(doc);
|
|
63
|
-
const missing = names.filter((n) => !section.includes(n));
|
|
64
|
-
assert.deepEqual(missing, []);
|
|
65
|
-
});
|
|
1
|
+
// 「CONFIGURATION.md 是全键参考」这句声明需要一条闸门,否则它会慢慢变成谎话:
|
|
2
|
+
// 2026-10 审计实测有 11 个 schema 键(graph 组 8 个、sensitiveScanEnabled、
|
|
3
|
+
// injectTimePrefix、actionPipelineEnabled)在文档与双 README 里一个字都没有,
|
|
4
|
+
// 而它们里有安全开关。锁法:从 Config({}) 的默认值深挖叶子键,要求每个键名
|
|
5
|
+
// (或它的父路径,用于 heatTypeDecay 这类整表描述)在文档里出现。
|
|
6
|
+
import test from "node:test";
|
|
7
|
+
import assert from "node:assert/strict";
|
|
8
|
+
import { readFileSync } from "node:fs";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
import { Config } from "../src/config.js";
|
|
12
|
+
|
|
13
|
+
const root = path.dirname(path.dirname(fileURLToPath(import.meta.url)));
|
|
14
|
+
const doc = readFileSync(path.join(root, "docs", "CONFIGURATION.md"), "utf8");
|
|
15
|
+
const cfgSrc = readFileSync(path.join(root, "src", "config.js"), "utf8");
|
|
16
|
+
|
|
17
|
+
function leafKeys(obj, prefix) {
|
|
18
|
+
const out = [];
|
|
19
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
20
|
+
const p = prefix ? prefix + "." + k : k;
|
|
21
|
+
if (v && typeof v === "object" && !Array.isArray(v)) { out.push(...leafKeys(v, p)); continue; }
|
|
22
|
+
out.push({ path: p, leaf: k, parent: prefix || "" });
|
|
23
|
+
}
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// 父路径回退是给「整表说明」用的例外,白名单写死在这里而不是「任何父路径都
|
|
28
|
+
// 放行」——否则往 writeAdmission 里加个子键,只要文档提到 writeAdmission 就过,
|
|
29
|
+
// 测试原本要防的漏键会静默复发(评审指出的漏洞)。新增例外必须显式加一行。
|
|
30
|
+
const PARENT_ONLY_OK = new Set(["heatTypeDecay"]);
|
|
31
|
+
|
|
32
|
+
test("CONFIGURATION.md 覆盖 schema 的每一个键", () => {
|
|
33
|
+
const keys = leafKeys(Config({}), "");
|
|
34
|
+
assert.ok(keys.length > 150, "键枚举失败会静默返回 0 项,先锁下限");
|
|
35
|
+
const missing = keys.filter((k) => {
|
|
36
|
+
// 完整路径优先("writeAdmission.enabled"),其次才是显式白名单里的整表父路径。
|
|
37
|
+
if (doc.includes(k.path)) return false;
|
|
38
|
+
if (k.parent && PARENT_ONLY_OK.has(k.parent) && doc.includes(k.parent)) return false;
|
|
39
|
+
// 表里写的是裸键名也认(绝大多数顶层键就是这么写的)。
|
|
40
|
+
return !doc.includes(k.leaf);
|
|
41
|
+
});
|
|
42
|
+
assert.deepEqual(missing.map((m) => m.path), []);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// lightMode 清单是有边界的一节:整份文档 grep 会让「删掉清单里的某一行」照样
|
|
46
|
+
// 通过(图谱表里还留着同名键),测试要盯的漏项就藏在那个缝里。
|
|
47
|
+
function lightSection(text) {
|
|
48
|
+
const start = text.indexOf("lightMode 强制关闭清单");
|
|
49
|
+
assert.ok(start >= 0, "文档里应有「lightMode 强制关闭清单」一节");
|
|
50
|
+
const rest = text.slice(start);
|
|
51
|
+
const end = rest.indexOf("预设只是默认值");
|
|
52
|
+
return end > 0 ? rest.slice(0, end) : rest;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
test("LIGHT_MODE_OFF 的每一项都写进了文档的轻量档清单", () => {
|
|
56
|
+
// LIGHT_MODE_OFF 没有导出,只能解析源码文本;先锁解析结果的长度,防止
|
|
57
|
+
// 正则失配时这个用例变成「空数组 ⊂ 文档」的永真断言。
|
|
58
|
+
const m = cfgSrc.match(/const LIGHT_MODE_OFF = \[([\s\S]*?)\];/);
|
|
59
|
+
assert.ok(m, "LIGHT_MODE_OFF 应从 src/config.js 中解析出来");
|
|
60
|
+
const names = [...m[1].matchAll(/"([^"]+)"/g)].map((x) => x[1]);
|
|
61
|
+
assert.ok(names.length >= 20, "解析到 " + names.length + " 项,少于预期的 21 项");
|
|
62
|
+
const section = lightSection(doc);
|
|
63
|
+
const missing = names.filter((n) => !section.includes(n));
|
|
64
|
+
assert.deepEqual(missing, []);
|
|
65
|
+
});
|