@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
package/lib/dsh-go/text.js
CHANGED
|
@@ -1,342 +1,342 @@
|
|
|
1
|
-
// Labels, flag metadata and small formatting helpers shared by the panel pages.
|
|
2
|
-
export const TYPE_LABELS = {
|
|
3
|
-
preference: "偏好",
|
|
4
|
-
project: "项目",
|
|
5
|
-
decision: "决策",
|
|
6
|
-
history: "历史",
|
|
7
|
-
rejected_solution: "弃用方案",
|
|
8
|
-
pitfall: "教训",
|
|
9
|
-
constraint: "约束",
|
|
10
|
-
summary: "摘要",
|
|
11
|
-
document: "文档",
|
|
12
|
-
fact: "事实",
|
|
13
|
-
pattern: "模式",
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
// 编辑器只提供常用的几类(写库层接受更多,但新建表单不必铺满)。
|
|
17
|
-
export const TYPE_OPTIONS = [
|
|
18
|
-
"preference",
|
|
19
|
-
"project",
|
|
20
|
-
"decision",
|
|
21
|
-
"constraint",
|
|
22
|
-
"pitfall",
|
|
23
|
-
"history",
|
|
24
|
-
"rejected_solution",
|
|
25
|
-
"summary",
|
|
26
|
-
];
|
|
27
|
-
|
|
28
|
-
// 筛选要覆盖写库层接受的全部类型(store.TYPES 的 10 个):只给 8 个的话,
|
|
29
|
-
// 库里已有的 pattern / document 条目在面板上筛不出来(评审 #11)。
|
|
30
|
-
export const FILTER_TYPE_OPTIONS = [
|
|
31
|
-
"preference",
|
|
32
|
-
"project",
|
|
33
|
-
"decision",
|
|
34
|
-
"history",
|
|
35
|
-
"summary",
|
|
36
|
-
"pattern",
|
|
37
|
-
"rejected_solution",
|
|
38
|
-
"pitfall",
|
|
39
|
-
"constraint",
|
|
40
|
-
"document",
|
|
41
|
-
];
|
|
42
|
-
|
|
43
|
-
const TYPE_TONES = {
|
|
44
|
-
preference: "info",
|
|
45
|
-
decision: "good",
|
|
46
|
-
constraint: "warn",
|
|
47
|
-
pitfall: "bad",
|
|
48
|
-
project: "info",
|
|
49
|
-
history: "muted",
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
const TYPE_ICONS = {
|
|
53
|
-
preference: "star",
|
|
54
|
-
project: "folder",
|
|
55
|
-
decision: "check",
|
|
56
|
-
constraint: "flag",
|
|
57
|
-
pitfall: "warning",
|
|
58
|
-
history: "clock",
|
|
59
|
-
rejected_solution: "remove",
|
|
60
|
-
summary: "note",
|
|
61
|
-
document: "book",
|
|
62
|
-
fact: "pin",
|
|
63
|
-
pattern: "repeat",
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
// Entity types come from extraction, so this is a best-effort mapping with a
|
|
67
|
-
// neutral fallback rather than a closed enum.
|
|
68
|
-
const ENTITY_ICONS = {
|
|
69
|
-
person: "user",
|
|
70
|
-
people: "user",
|
|
71
|
-
agent: "robot",
|
|
72
|
-
project: "folder",
|
|
73
|
-
workspace: "workspace",
|
|
74
|
-
repo: "code",
|
|
75
|
-
technology: "code",
|
|
76
|
-
tech: "code",
|
|
77
|
-
tool: "wrench",
|
|
78
|
-
library: "puzzle",
|
|
79
|
-
concept: "lightbulb",
|
|
80
|
-
topic: "note",
|
|
81
|
-
event: "calendar",
|
|
82
|
-
place: "globe",
|
|
83
|
-
location: "globe",
|
|
84
|
-
organization: "team",
|
|
85
|
-
org: "team",
|
|
86
|
-
team: "team",
|
|
87
|
-
document: "book",
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
// Entity types are free-form (the extractor invents them), so unknown ones fall
|
|
91
|
-
// back to what the store returned instead of being hidden.
|
|
92
|
-
const ENTITY_TYPE_LABELS = {
|
|
93
|
-
person: "人物",
|
|
94
|
-
people: "人物",
|
|
95
|
-
agent: "智能体",
|
|
96
|
-
project: "项目",
|
|
97
|
-
workspace: "工作区",
|
|
98
|
-
repo: "仓库",
|
|
99
|
-
technology: "技术",
|
|
100
|
-
tech: "技术",
|
|
101
|
-
tool: "工具",
|
|
102
|
-
library: "库",
|
|
103
|
-
concept: "概念",
|
|
104
|
-
topic: "主题",
|
|
105
|
-
event: "事件",
|
|
106
|
-
place: "地点",
|
|
107
|
-
location: "地点",
|
|
108
|
-
organization: "组织",
|
|
109
|
-
org: "组织",
|
|
110
|
-
team: "团队",
|
|
111
|
-
document: "文档",
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
export const entityIcon = (type) => ENTITY_ICONS[String(type ?? "").toLowerCase()] ?? "link";
|
|
115
|
-
export const entityTypeLabel = (type) => ENTITY_TYPE_LABELS[String(type ?? "").toLowerCase()] ?? String(type ?? "实体");
|
|
116
|
-
|
|
117
|
-
export const typeLabel = (type) => TYPE_LABELS[type] ?? String(type ?? "其它");
|
|
118
|
-
export const typeTone = (type) => TYPE_TONES[type];
|
|
119
|
-
export const typeIcon = (type) => TYPE_ICONS[type];
|
|
120
|
-
|
|
121
|
-
const TIME = new Intl.DateTimeFormat("zh-CN", {
|
|
122
|
-
timeZone: "Asia/Shanghai",
|
|
123
|
-
month: "2-digit",
|
|
124
|
-
day: "2-digit",
|
|
125
|
-
hour: "2-digit",
|
|
126
|
-
minute: "2-digit",
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
export function fmtTime(iso) {
|
|
130
|
-
if (typeof iso !== "string" || iso === "") return "—";
|
|
131
|
-
const when = new Date(iso);
|
|
132
|
-
if (Number.isNaN(when.getTime())) return "—";
|
|
133
|
-
return TIME.format(when);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
export function clip(text, max) {
|
|
137
|
-
const str = typeof text === "string" ? text : String(text ?? "");
|
|
138
|
-
if (str.length <= max) return str;
|
|
139
|
-
return `${str.slice(0, max - 1)}…`;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
export function splitTags(value) {
|
|
143
|
-
if (typeof value !== "string") return [];
|
|
144
|
-
return value
|
|
145
|
-
.split(/[,,]/u)
|
|
146
|
-
.map((t) => t.trim())
|
|
147
|
-
.filter((t) => t !== "");
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
export function joinTags(tags) {
|
|
151
|
-
return Array.isArray(tags) ? tags.join(", ") : "";
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/** Error text short enough for a 32 KiB panel payload. */
|
|
155
|
-
export function errorText(error) {
|
|
156
|
-
const raw = error instanceof Error ? error.message : String(error);
|
|
157
|
-
return clip(raw, 600);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/** True for a dotted flag key, used as a nested `data.flags.*` binding path. */
|
|
161
|
-
export const flagPath = (key) => `data.flags.${key}`;
|
|
162
|
-
|
|
163
|
-
/** One action id per switch: the app only tells us which action fired. */
|
|
164
|
-
export const flagAction = (key) => `flag.${key.replace(/[^A-Za-z0-9_-]/gu, "_")}`;
|
|
165
|
-
|
|
166
|
-
// Mirrors mneme's own settings page grouping (lib/client.js FEATURE_GROUPS),
|
|
167
|
-
// trimmed to the switches this panel can flip on a phone.
|
|
168
|
-
export const FLAG_GROUPS = [
|
|
169
|
-
{
|
|
170
|
-
key: "basic",
|
|
171
|
-
label: "常用",
|
|
172
|
-
note: "先动这几个总开关。",
|
|
173
|
-
items: [
|
|
174
|
-
["autoInject", "每轮自动带上相关记忆"],
|
|
175
|
-
["autoSummarize", "对话结束自动提炼成记忆"],
|
|
176
|
-
["autoDream", "后台自动合并、去重"],
|
|
177
|
-
],
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
key: "record",
|
|
181
|
-
label: "记录",
|
|
182
|
-
note: "它记住什么、写多细。",
|
|
183
|
-
items: [
|
|
184
|
-
["hotMemoryEnabled", "带上最近几轮原话"],
|
|
185
|
-
["injectTimePrefix", "注入当天日期"],
|
|
186
|
-
["injectGuidanceEnabled", "教 Agent 怎么用记忆"],
|
|
187
|
-
["continuityRescueEnabled", "压缩前先存快照"],
|
|
188
|
-
["memoryQualityFilter.enabled", "滤掉低质量条目"],
|
|
189
|
-
["sensitiveScanEnabled", "写入前扫描敏感内容"],
|
|
190
|
-
["documentMemoryEnabled", "长文档只存摘要卡"],
|
|
191
|
-
["profileFactsEnabled", "自动维护「Agent 眼中的你」"],
|
|
192
|
-
["codingRetrospect", "编码过程也沉淀"],
|
|
193
|
-
["distillRecords.enabled", "保留蒸馏原文"],
|
|
194
|
-
],
|
|
195
|
-
},
|
|
196
|
-
{
|
|
197
|
-
key: "write",
|
|
198
|
-
label: "写入",
|
|
199
|
-
note: "它什么时候主动写。",
|
|
200
|
-
items: [
|
|
201
|
-
["entityExtractionEnabled", "抽取人物与项目"],
|
|
202
|
-
["writeAdmission.enabled", "写入准入判定"],
|
|
203
|
-
["writeAdmission.enforce", "准入不通过就拦下"],
|
|
204
|
-
["preInjectGate.enabled", "注入前判定"],
|
|
205
|
-
["preInjectGate.enforce", "判定不通过就不注入"],
|
|
206
|
-
["profileExtractEnabled", "画像提取草稿"],
|
|
207
|
-
],
|
|
208
|
-
},
|
|
209
|
-
{
|
|
210
|
-
key: "workflow",
|
|
211
|
-
label: "工作流",
|
|
212
|
-
note: "后台整理与人格。",
|
|
213
|
-
items: [
|
|
214
|
-
["sleepModeEnabled", "空闲时整理记忆"],
|
|
215
|
-
["actionPipelineEnabled", "M.O. 动作图谱"],
|
|
216
|
-
["actionNudgeEnabled", "自动沉淀工作流"],
|
|
217
|
-
["personaEnabled", "注入人格卡"],
|
|
218
|
-
["personaStrictAddressing", "严格人格寻址"],
|
|
219
|
-
["llmAudit.enabled", "记录后台模型用量"],
|
|
220
|
-
["rerankEnabled", "召回结果精排"],
|
|
221
|
-
["chorographyEnabled", "代码库地志(chorography)"],
|
|
222
|
-
],
|
|
223
|
-
},
|
|
224
|
-
{
|
|
225
|
-
key: "retrieval",
|
|
226
|
-
label: "检索",
|
|
227
|
-
note: "它怎么把记忆找回来。",
|
|
228
|
-
items: [
|
|
229
|
-
["hybridInject", "关键词 + 语义两路"],
|
|
230
|
-
["selectiveInjectEnabled", "选择性注入"],
|
|
231
|
-
["adaptiveThresholdEnabled", "自适应阈值"],
|
|
232
|
-
["bm25SearchEnabled", "BM25 检索"],
|
|
233
|
-
["searchSemanticDedup", "语义去重"],
|
|
234
|
-
["heatEnabled", "热度衰减"],
|
|
235
|
-
["conflictFreezeEnabled", "矛盾记忆先冻结"],
|
|
236
|
-
["trustEpistemicWeighting", "可信度加权"],
|
|
237
|
-
["reflectionUpdateEnabled", "反思式更新"],
|
|
238
|
-
],
|
|
239
|
-
},
|
|
240
|
-
{
|
|
241
|
-
key: "scope",
|
|
242
|
-
label: "作用域",
|
|
243
|
-
note: "不同会话之间怎么隔离。",
|
|
244
|
-
items: [
|
|
245
|
-
["scopeEnabled", "按会话作用域标注"],
|
|
246
|
-
["strictScope", "严格按作用域过滤"],
|
|
247
|
-
["scopeState.enabled", "作用域级暂停"],
|
|
248
|
-
["scopeState.enforce", "暂停后真的不注入"],
|
|
249
|
-
],
|
|
250
|
-
},
|
|
251
|
-
{
|
|
252
|
-
key: "extra",
|
|
253
|
-
label: "其它",
|
|
254
|
-
// 上游不断加开关:这里按 /features 的 effective 动态列出「我们还没给中文名」
|
|
255
|
-
// 的布尔项,避免新功能在手机面板上静默消失(视图结构不能靠数据分支,所以
|
|
256
|
-
// 用 list + 数据行,点一行翻转一项)。
|
|
257
|
-
note: "上游新增的开关,面板还没有中文名;点一行即可切换。",
|
|
258
|
-
items: [],
|
|
259
|
-
},
|
|
260
|
-
];
|
|
261
|
-
|
|
262
|
-
// 枚举型旗标(不是开关,得用下拉):PUT /features 认字符串值。
|
|
263
|
-
export const ENUM_FLAGS = [
|
|
264
|
-
{
|
|
265
|
-
key: "chorographyInject",
|
|
266
|
-
label: "地志注入档位",
|
|
267
|
-
hint: "每轮往系统提示里塞多少代码库提纲:轻量只放前 6 个模块,完整放全部,关闭则一轮都不放。",
|
|
268
|
-
options: [
|
|
269
|
-
{ label: "轻量", value: "light" },
|
|
270
|
-
{ label: "完整", value: "full" },
|
|
271
|
-
{ label: "关闭", value: "off" },
|
|
272
|
-
],
|
|
273
|
-
},
|
|
274
|
-
];
|
|
275
|
-
|
|
276
|
-
export const FLAG_LABELS = new Map();
|
|
277
|
-
for (const group of FLAG_GROUPS) {
|
|
278
|
-
for (const [key, label] of group.items) FLAG_LABELS.set(key, label);
|
|
279
|
-
}
|
|
280
|
-
for (const flag of ENUM_FLAGS) FLAG_LABELS.set(flag.key, flag.label);
|
|
281
|
-
|
|
282
|
-
export const MODE_OPTIONS = [
|
|
283
|
-
{ label: "标准", value: "standard" },
|
|
284
|
-
{ label: "轻量", value: "light" },
|
|
285
|
-
];
|
|
286
|
-
|
|
287
|
-
// ---- memory list filters (mirrors mneme's own filter bar) -------------------
|
|
288
|
-
export const RANGE_OPTIONS = [
|
|
289
|
-
{ label: "全部时间", value: "all" },
|
|
290
|
-
{ label: "近 7 天", value: "7d" },
|
|
291
|
-
{ label: "近 30 天", value: "30d" },
|
|
292
|
-
{ label: "近 90 天", value: "90d" },
|
|
293
|
-
];
|
|
294
|
-
|
|
295
|
-
export const MINIMP_OPTIONS = [
|
|
296
|
-
{ label: "不限重要度", value: "0" },
|
|
297
|
-
{ label: "★3 以上", value: "3" },
|
|
298
|
-
{ label: "★4 以上", value: "4" },
|
|
299
|
-
{ label: "仅 ★5", value: "5" },
|
|
300
|
-
];
|
|
301
|
-
|
|
302
|
-
export const SCOPE_OPTIONS = [
|
|
303
|
-
{ label: "全部来源", value: "all" },
|
|
304
|
-
{ label: "仅已沉淀", value: "deposited" },
|
|
305
|
-
{ label: "仅已归档", value: "archived" },
|
|
306
|
-
{ label: "仅外部导入", value: "foreign" },
|
|
307
|
-
];
|
|
308
|
-
|
|
309
|
-
export const VIEW_OPTIONS = [
|
|
310
|
-
{ label: "平铺", value: "flat" },
|
|
311
|
-
{ label: "按月", value: "month" },
|
|
312
|
-
];
|
|
313
|
-
|
|
314
|
-
export const RANGE_DAYS = { "7d": 7, "30d": 30, "90d": 90 };
|
|
315
|
-
|
|
316
|
-
const MONTH = new Intl.DateTimeFormat("zh-CN", { timeZone: "Asia/Shanghai", year: "numeric", month: "2-digit" });
|
|
317
|
-
const DAY = new Intl.DateTimeFormat("zh-CN", { timeZone: "Asia/Shanghai", month: "2-digit", day: "2-digit" });
|
|
318
|
-
|
|
319
|
-
/** `2026-11` group label for the month view. */
|
|
320
|
-
export function fmtMonth(iso) {
|
|
321
|
-
if (typeof iso !== "string" || iso === "") return "未知时间";
|
|
322
|
-
const when = new Date(iso);
|
|
323
|
-
if (Number.isNaN(when.getTime())) return "未知时间";
|
|
324
|
-
return MONTH.format(when).replace(/\//gu, "-");
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
/** `07-12` for charts. */
|
|
328
|
-
export function fmtDay(iso) {
|
|
329
|
-
if (typeof iso !== "string" || iso === "") return "—";
|
|
330
|
-
const when = new Date(iso);
|
|
331
|
-
if (Number.isNaN(when.getTime())) return "—";
|
|
332
|
-
return DAY.format(when);
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
/** 归属 line for a memory row (agent/workspace scope). */
|
|
336
|
-
export function scopeText(memo) {
|
|
337
|
-
const parts = [];
|
|
338
|
-
if (typeof memo?.agent_scope === "string" && memo.agent_scope !== "") parts.push(`Agent ${memo.agent_scope}`);
|
|
339
|
-
if (typeof memo?.workspace_scope === "string" && memo.workspace_scope !== "")
|
|
340
|
-
parts.push(`工作区 ${memo.workspace_scope}`);
|
|
341
|
-
return parts.length === 0 ? "全局" : parts.join(" · ");
|
|
342
|
-
}
|
|
1
|
+
// Labels, flag metadata and small formatting helpers shared by the panel pages.
|
|
2
|
+
export const TYPE_LABELS = {
|
|
3
|
+
preference: "偏好",
|
|
4
|
+
project: "项目",
|
|
5
|
+
decision: "决策",
|
|
6
|
+
history: "历史",
|
|
7
|
+
rejected_solution: "弃用方案",
|
|
8
|
+
pitfall: "教训",
|
|
9
|
+
constraint: "约束",
|
|
10
|
+
summary: "摘要",
|
|
11
|
+
document: "文档",
|
|
12
|
+
fact: "事实",
|
|
13
|
+
pattern: "模式",
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
// 编辑器只提供常用的几类(写库层接受更多,但新建表单不必铺满)。
|
|
17
|
+
export const TYPE_OPTIONS = [
|
|
18
|
+
"preference",
|
|
19
|
+
"project",
|
|
20
|
+
"decision",
|
|
21
|
+
"constraint",
|
|
22
|
+
"pitfall",
|
|
23
|
+
"history",
|
|
24
|
+
"rejected_solution",
|
|
25
|
+
"summary",
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
// 筛选要覆盖写库层接受的全部类型(store.TYPES 的 10 个):只给 8 个的话,
|
|
29
|
+
// 库里已有的 pattern / document 条目在面板上筛不出来(评审 #11)。
|
|
30
|
+
export const FILTER_TYPE_OPTIONS = [
|
|
31
|
+
"preference",
|
|
32
|
+
"project",
|
|
33
|
+
"decision",
|
|
34
|
+
"history",
|
|
35
|
+
"summary",
|
|
36
|
+
"pattern",
|
|
37
|
+
"rejected_solution",
|
|
38
|
+
"pitfall",
|
|
39
|
+
"constraint",
|
|
40
|
+
"document",
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
const TYPE_TONES = {
|
|
44
|
+
preference: "info",
|
|
45
|
+
decision: "good",
|
|
46
|
+
constraint: "warn",
|
|
47
|
+
pitfall: "bad",
|
|
48
|
+
project: "info",
|
|
49
|
+
history: "muted",
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const TYPE_ICONS = {
|
|
53
|
+
preference: "star",
|
|
54
|
+
project: "folder",
|
|
55
|
+
decision: "check",
|
|
56
|
+
constraint: "flag",
|
|
57
|
+
pitfall: "warning",
|
|
58
|
+
history: "clock",
|
|
59
|
+
rejected_solution: "remove",
|
|
60
|
+
summary: "note",
|
|
61
|
+
document: "book",
|
|
62
|
+
fact: "pin",
|
|
63
|
+
pattern: "repeat",
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// Entity types come from extraction, so this is a best-effort mapping with a
|
|
67
|
+
// neutral fallback rather than a closed enum.
|
|
68
|
+
const ENTITY_ICONS = {
|
|
69
|
+
person: "user",
|
|
70
|
+
people: "user",
|
|
71
|
+
agent: "robot",
|
|
72
|
+
project: "folder",
|
|
73
|
+
workspace: "workspace",
|
|
74
|
+
repo: "code",
|
|
75
|
+
technology: "code",
|
|
76
|
+
tech: "code",
|
|
77
|
+
tool: "wrench",
|
|
78
|
+
library: "puzzle",
|
|
79
|
+
concept: "lightbulb",
|
|
80
|
+
topic: "note",
|
|
81
|
+
event: "calendar",
|
|
82
|
+
place: "globe",
|
|
83
|
+
location: "globe",
|
|
84
|
+
organization: "team",
|
|
85
|
+
org: "team",
|
|
86
|
+
team: "team",
|
|
87
|
+
document: "book",
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
// Entity types are free-form (the extractor invents them), so unknown ones fall
|
|
91
|
+
// back to what the store returned instead of being hidden.
|
|
92
|
+
const ENTITY_TYPE_LABELS = {
|
|
93
|
+
person: "人物",
|
|
94
|
+
people: "人物",
|
|
95
|
+
agent: "智能体",
|
|
96
|
+
project: "项目",
|
|
97
|
+
workspace: "工作区",
|
|
98
|
+
repo: "仓库",
|
|
99
|
+
technology: "技术",
|
|
100
|
+
tech: "技术",
|
|
101
|
+
tool: "工具",
|
|
102
|
+
library: "库",
|
|
103
|
+
concept: "概念",
|
|
104
|
+
topic: "主题",
|
|
105
|
+
event: "事件",
|
|
106
|
+
place: "地点",
|
|
107
|
+
location: "地点",
|
|
108
|
+
organization: "组织",
|
|
109
|
+
org: "组织",
|
|
110
|
+
team: "团队",
|
|
111
|
+
document: "文档",
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
export const entityIcon = (type) => ENTITY_ICONS[String(type ?? "").toLowerCase()] ?? "link";
|
|
115
|
+
export const entityTypeLabel = (type) => ENTITY_TYPE_LABELS[String(type ?? "").toLowerCase()] ?? String(type ?? "实体");
|
|
116
|
+
|
|
117
|
+
export const typeLabel = (type) => TYPE_LABELS[type] ?? String(type ?? "其它");
|
|
118
|
+
export const typeTone = (type) => TYPE_TONES[type];
|
|
119
|
+
export const typeIcon = (type) => TYPE_ICONS[type];
|
|
120
|
+
|
|
121
|
+
const TIME = new Intl.DateTimeFormat("zh-CN", {
|
|
122
|
+
timeZone: "Asia/Shanghai",
|
|
123
|
+
month: "2-digit",
|
|
124
|
+
day: "2-digit",
|
|
125
|
+
hour: "2-digit",
|
|
126
|
+
minute: "2-digit",
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
export function fmtTime(iso) {
|
|
130
|
+
if (typeof iso !== "string" || iso === "") return "—";
|
|
131
|
+
const when = new Date(iso);
|
|
132
|
+
if (Number.isNaN(when.getTime())) return "—";
|
|
133
|
+
return TIME.format(when);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function clip(text, max) {
|
|
137
|
+
const str = typeof text === "string" ? text : String(text ?? "");
|
|
138
|
+
if (str.length <= max) return str;
|
|
139
|
+
return `${str.slice(0, max - 1)}…`;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export function splitTags(value) {
|
|
143
|
+
if (typeof value !== "string") return [];
|
|
144
|
+
return value
|
|
145
|
+
.split(/[,,]/u)
|
|
146
|
+
.map((t) => t.trim())
|
|
147
|
+
.filter((t) => t !== "");
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export function joinTags(tags) {
|
|
151
|
+
return Array.isArray(tags) ? tags.join(", ") : "";
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/** Error text short enough for a 32 KiB panel payload. */
|
|
155
|
+
export function errorText(error) {
|
|
156
|
+
const raw = error instanceof Error ? error.message : String(error);
|
|
157
|
+
return clip(raw, 600);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/** True for a dotted flag key, used as a nested `data.flags.*` binding path. */
|
|
161
|
+
export const flagPath = (key) => `data.flags.${key}`;
|
|
162
|
+
|
|
163
|
+
/** One action id per switch: the app only tells us which action fired. */
|
|
164
|
+
export const flagAction = (key) => `flag.${key.replace(/[^A-Za-z0-9_-]/gu, "_")}`;
|
|
165
|
+
|
|
166
|
+
// Mirrors mneme's own settings page grouping (lib/client.js FEATURE_GROUPS),
|
|
167
|
+
// trimmed to the switches this panel can flip on a phone.
|
|
168
|
+
export const FLAG_GROUPS = [
|
|
169
|
+
{
|
|
170
|
+
key: "basic",
|
|
171
|
+
label: "常用",
|
|
172
|
+
note: "先动这几个总开关。",
|
|
173
|
+
items: [
|
|
174
|
+
["autoInject", "每轮自动带上相关记忆"],
|
|
175
|
+
["autoSummarize", "对话结束自动提炼成记忆"],
|
|
176
|
+
["autoDream", "后台自动合并、去重"],
|
|
177
|
+
],
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
key: "record",
|
|
181
|
+
label: "记录",
|
|
182
|
+
note: "它记住什么、写多细。",
|
|
183
|
+
items: [
|
|
184
|
+
["hotMemoryEnabled", "带上最近几轮原话"],
|
|
185
|
+
["injectTimePrefix", "注入当天日期"],
|
|
186
|
+
["injectGuidanceEnabled", "教 Agent 怎么用记忆"],
|
|
187
|
+
["continuityRescueEnabled", "压缩前先存快照"],
|
|
188
|
+
["memoryQualityFilter.enabled", "滤掉低质量条目"],
|
|
189
|
+
["sensitiveScanEnabled", "写入前扫描敏感内容"],
|
|
190
|
+
["documentMemoryEnabled", "长文档只存摘要卡"],
|
|
191
|
+
["profileFactsEnabled", "自动维护「Agent 眼中的你」"],
|
|
192
|
+
["codingRetrospect", "编码过程也沉淀"],
|
|
193
|
+
["distillRecords.enabled", "保留蒸馏原文"],
|
|
194
|
+
],
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
key: "write",
|
|
198
|
+
label: "写入",
|
|
199
|
+
note: "它什么时候主动写。",
|
|
200
|
+
items: [
|
|
201
|
+
["entityExtractionEnabled", "抽取人物与项目"],
|
|
202
|
+
["writeAdmission.enabled", "写入准入判定"],
|
|
203
|
+
["writeAdmission.enforce", "准入不通过就拦下"],
|
|
204
|
+
["preInjectGate.enabled", "注入前判定"],
|
|
205
|
+
["preInjectGate.enforce", "判定不通过就不注入"],
|
|
206
|
+
["profileExtractEnabled", "画像提取草稿"],
|
|
207
|
+
],
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
key: "workflow",
|
|
211
|
+
label: "工作流",
|
|
212
|
+
note: "后台整理与人格。",
|
|
213
|
+
items: [
|
|
214
|
+
["sleepModeEnabled", "空闲时整理记忆"],
|
|
215
|
+
["actionPipelineEnabled", "M.O. 动作图谱"],
|
|
216
|
+
["actionNudgeEnabled", "自动沉淀工作流"],
|
|
217
|
+
["personaEnabled", "注入人格卡"],
|
|
218
|
+
["personaStrictAddressing", "严格人格寻址"],
|
|
219
|
+
["llmAudit.enabled", "记录后台模型用量"],
|
|
220
|
+
["rerankEnabled", "召回结果精排"],
|
|
221
|
+
["chorographyEnabled", "代码库地志(chorography)"],
|
|
222
|
+
],
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
key: "retrieval",
|
|
226
|
+
label: "检索",
|
|
227
|
+
note: "它怎么把记忆找回来。",
|
|
228
|
+
items: [
|
|
229
|
+
["hybridInject", "关键词 + 语义两路"],
|
|
230
|
+
["selectiveInjectEnabled", "选择性注入"],
|
|
231
|
+
["adaptiveThresholdEnabled", "自适应阈值"],
|
|
232
|
+
["bm25SearchEnabled", "BM25 检索"],
|
|
233
|
+
["searchSemanticDedup", "语义去重"],
|
|
234
|
+
["heatEnabled", "热度衰减"],
|
|
235
|
+
["conflictFreezeEnabled", "矛盾记忆先冻结"],
|
|
236
|
+
["trustEpistemicWeighting", "可信度加权"],
|
|
237
|
+
["reflectionUpdateEnabled", "反思式更新"],
|
|
238
|
+
],
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
key: "scope",
|
|
242
|
+
label: "作用域",
|
|
243
|
+
note: "不同会话之间怎么隔离。",
|
|
244
|
+
items: [
|
|
245
|
+
["scopeEnabled", "按会话作用域标注"],
|
|
246
|
+
["strictScope", "严格按作用域过滤"],
|
|
247
|
+
["scopeState.enabled", "作用域级暂停"],
|
|
248
|
+
["scopeState.enforce", "暂停后真的不注入"],
|
|
249
|
+
],
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
key: "extra",
|
|
253
|
+
label: "其它",
|
|
254
|
+
// 上游不断加开关:这里按 /features 的 effective 动态列出「我们还没给中文名」
|
|
255
|
+
// 的布尔项,避免新功能在手机面板上静默消失(视图结构不能靠数据分支,所以
|
|
256
|
+
// 用 list + 数据行,点一行翻转一项)。
|
|
257
|
+
note: "上游新增的开关,面板还没有中文名;点一行即可切换。",
|
|
258
|
+
items: [],
|
|
259
|
+
},
|
|
260
|
+
];
|
|
261
|
+
|
|
262
|
+
// 枚举型旗标(不是开关,得用下拉):PUT /features 认字符串值。
|
|
263
|
+
export const ENUM_FLAGS = [
|
|
264
|
+
{
|
|
265
|
+
key: "chorographyInject",
|
|
266
|
+
label: "地志注入档位",
|
|
267
|
+
hint: "每轮往系统提示里塞多少代码库提纲:轻量只放前 6 个模块,完整放全部,关闭则一轮都不放。",
|
|
268
|
+
options: [
|
|
269
|
+
{ label: "轻量", value: "light" },
|
|
270
|
+
{ label: "完整", value: "full" },
|
|
271
|
+
{ label: "关闭", value: "off" },
|
|
272
|
+
],
|
|
273
|
+
},
|
|
274
|
+
];
|
|
275
|
+
|
|
276
|
+
export const FLAG_LABELS = new Map();
|
|
277
|
+
for (const group of FLAG_GROUPS) {
|
|
278
|
+
for (const [key, label] of group.items) FLAG_LABELS.set(key, label);
|
|
279
|
+
}
|
|
280
|
+
for (const flag of ENUM_FLAGS) FLAG_LABELS.set(flag.key, flag.label);
|
|
281
|
+
|
|
282
|
+
export const MODE_OPTIONS = [
|
|
283
|
+
{ label: "标准", value: "standard" },
|
|
284
|
+
{ label: "轻量", value: "light" },
|
|
285
|
+
];
|
|
286
|
+
|
|
287
|
+
// ---- memory list filters (mirrors mneme's own filter bar) -------------------
|
|
288
|
+
export const RANGE_OPTIONS = [
|
|
289
|
+
{ label: "全部时间", value: "all" },
|
|
290
|
+
{ label: "近 7 天", value: "7d" },
|
|
291
|
+
{ label: "近 30 天", value: "30d" },
|
|
292
|
+
{ label: "近 90 天", value: "90d" },
|
|
293
|
+
];
|
|
294
|
+
|
|
295
|
+
export const MINIMP_OPTIONS = [
|
|
296
|
+
{ label: "不限重要度", value: "0" },
|
|
297
|
+
{ label: "★3 以上", value: "3" },
|
|
298
|
+
{ label: "★4 以上", value: "4" },
|
|
299
|
+
{ label: "仅 ★5", value: "5" },
|
|
300
|
+
];
|
|
301
|
+
|
|
302
|
+
export const SCOPE_OPTIONS = [
|
|
303
|
+
{ label: "全部来源", value: "all" },
|
|
304
|
+
{ label: "仅已沉淀", value: "deposited" },
|
|
305
|
+
{ label: "仅已归档", value: "archived" },
|
|
306
|
+
{ label: "仅外部导入", value: "foreign" },
|
|
307
|
+
];
|
|
308
|
+
|
|
309
|
+
export const VIEW_OPTIONS = [
|
|
310
|
+
{ label: "平铺", value: "flat" },
|
|
311
|
+
{ label: "按月", value: "month" },
|
|
312
|
+
];
|
|
313
|
+
|
|
314
|
+
export const RANGE_DAYS = { "7d": 7, "30d": 30, "90d": 90 };
|
|
315
|
+
|
|
316
|
+
const MONTH = new Intl.DateTimeFormat("zh-CN", { timeZone: "Asia/Shanghai", year: "numeric", month: "2-digit" });
|
|
317
|
+
const DAY = new Intl.DateTimeFormat("zh-CN", { timeZone: "Asia/Shanghai", month: "2-digit", day: "2-digit" });
|
|
318
|
+
|
|
319
|
+
/** `2026-11` group label for the month view. */
|
|
320
|
+
export function fmtMonth(iso) {
|
|
321
|
+
if (typeof iso !== "string" || iso === "") return "未知时间";
|
|
322
|
+
const when = new Date(iso);
|
|
323
|
+
if (Number.isNaN(when.getTime())) return "未知时间";
|
|
324
|
+
return MONTH.format(when).replace(/\//gu, "-");
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/** `07-12` for charts. */
|
|
328
|
+
export function fmtDay(iso) {
|
|
329
|
+
if (typeof iso !== "string" || iso === "") return "—";
|
|
330
|
+
const when = new Date(iso);
|
|
331
|
+
if (Number.isNaN(when.getTime())) return "—";
|
|
332
|
+
return DAY.format(when);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/** 归属 line for a memory row (agent/workspace scope). */
|
|
336
|
+
export function scopeText(memo) {
|
|
337
|
+
const parts = [];
|
|
338
|
+
if (typeof memo?.agent_scope === "string" && memo.agent_scope !== "") parts.push(`Agent ${memo.agent_scope}`);
|
|
339
|
+
if (typeof memo?.workspace_scope === "string" && memo.workspace_scope !== "")
|
|
340
|
+
parts.push(`工作区 ${memo.workspace_scope}`);
|
|
341
|
+
return parts.length === 0 ? "全局" : parts.join(" · ");
|
|
342
|
+
}
|