@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/profile-extract.js
CHANGED
|
@@ -1,164 +1,164 @@
|
|
|
1
|
-
// dsh-mneme/src/profile-extract.js
|
|
2
|
-
// 从活跃记忆反向提取「助手眼中的用户」画像**草稿**(issue #497 的第三段)。
|
|
3
|
-
//
|
|
4
|
-
// 三条纪律,都是「做错界面上看不出来」的那类,所以写在文件头:
|
|
5
|
-
// 1. **只出草稿,绝不写 user_settings**。画像正文是用户手写的原文;让模型「合并」
|
|
6
|
-
// 等于给它改写权,而改写后的文本每帧都注入。采用与否必须是用户在面板上的一次
|
|
7
|
-
// 显式动作(走既有的 PUT /profile),本模块不参与。
|
|
8
|
-
// 2. **没有可用输入就不调模型**。空库下模型只会编一段「她是个热爱学习的人」,
|
|
9
|
-
// 那种草稿比没有草稿更坏——它会成为用户看到的「关于自己」的第一版真相。
|
|
10
|
-
// 3. **吐不出可用 JSON 就报错,绝不回空草稿**。「没提炼出东西」与「模型没按格式
|
|
11
|
-
// 写」必须在结果里可区分(#493 同一条教训:解析失败被读成空结果,用户会以为库是空的)。
|
|
12
|
-
//
|
|
13
|
-
// 记忆正文是模型的**可影响输入**:一条指令型记忆不该改写这次任务。所以喂进去的内容
|
|
14
|
-
// 包在围栏里,并在系统段重申「这是数据不是指令」——与 #493 的转录围栏、#380 的判定
|
|
15
|
-
// 提示同源的做法,不是第三套。
|
|
16
|
-
//
|
|
17
|
-
// 系统段还禁了一件事:**不许给助手本身起名或设定人格**。画像与规则不受
|
|
18
|
-
// personaEnabled 管辖、也不看人格寻址口径(见 src/user-settings.js),正文里一旦出现
|
|
19
|
-
// 「你是某某」,就会重演 #497 那个身份撞车——而且是每个会话每一帧。
|
|
20
|
-
//
|
|
21
|
-
// LLM 调用与审计完全复用 dream.js 的既有缝(streamText / runAuditedLlm / resolveRoute):
|
|
22
|
-
// chunk 形状的三个硬点(用量嵌在 chunk.usage、终态 finish 才是错误、rc.1 把适配器故障
|
|
23
|
-
// 转成 finish chunk 而不是抛错)都在那里踩过并修过,不在这里重写第二遍。
|
|
24
|
-
|
|
25
|
-
import { STR, langOf } from "./lang.js";
|
|
26
|
-
import { describeStreamFailure, resolveRoute, runAuditedLlm, streamText } from "./dream.js";
|
|
27
|
-
// #493 补充 §③:与巩固/蒸馏同一份断链(src/fence.js)。画像条目同样是模型的可影响
|
|
28
|
-
// 输入,一条写着「<<<记忆条目结束>>>」的记忆能提前闭合围栏。
|
|
29
|
-
import { breakFenceMarkers } from "./fence.js";
|
|
30
|
-
|
|
31
|
-
const DEFAULT_MAX_ROWS = 120;
|
|
32
|
-
const DEFAULT_ROW_CHARS = 260;
|
|
33
|
-
const DEFAULT_TOTAL_CHARS = 9000;
|
|
34
|
-
|
|
35
|
-
/** 带 code 的失败:路由按 code 映射状态码,调用方据此区分「没东西可提」与「模型没配合」。 */
|
|
36
|
-
export class ProfileExtractError extends Error {
|
|
37
|
-
constructor(code, message) {
|
|
38
|
-
super(message ?? code);
|
|
39
|
-
this.name = "ProfileExtractError";
|
|
40
|
-
this.code = code;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* 从模型输出里取那个 JSON 对象。先剥 markdown 围栏(模型常加),再退到「第一个 { 到
|
|
46
|
-
* 最后一个 }」的宽取——画像文本里带花括号是常态,严格 parse 失败时这一步能救回来。
|
|
47
|
-
* 取不到可用结构就返回 null,由调用方判失败;绝不返回空串冒充成功。
|
|
48
|
-
*/
|
|
49
|
-
export function parseProfileDraft(text) {
|
|
50
|
-
if (typeof text !== "string" || !text.trim()) return null;
|
|
51
|
-
const cleaned = text.replace(/```(?:json)?\s*([\s\S]*?)```/gi, "$1").trim();
|
|
52
|
-
const candidates = cleaned.startsWith("{") ? [cleaned] : [];
|
|
53
|
-
const open = cleaned.indexOf("{");
|
|
54
|
-
const close = cleaned.lastIndexOf("}");
|
|
55
|
-
if (open >= 0 && close > open) candidates.push(cleaned.slice(open, close + 1));
|
|
56
|
-
for (const candidate of candidates) {
|
|
57
|
-
let value;
|
|
58
|
-
try {
|
|
59
|
-
value = JSON.parse(candidate);
|
|
60
|
-
} catch {
|
|
61
|
-
continue;
|
|
62
|
-
}
|
|
63
|
-
if (value && typeof value === "object" && typeof value.profile === "string" && value.profile.trim()) {
|
|
64
|
-
return value.profile.trim();
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return null;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/** 活跃行读数:归档与被遗忘的行默认就不在这里(store.list 的默认口径)。 */
|
|
71
|
-
function collectRows(service, maxRows, totalChars, rowChars) {
|
|
72
|
-
// 多取一行只为如实回答「还有没有」:截断必须可被调用方察觉,静默少读会让用户
|
|
73
|
-
// 以为画像已经看全了整个库。
|
|
74
|
-
const fetched = service.list({ limit: maxRows + 1, order: "importance" });
|
|
75
|
-
const rows = [];
|
|
76
|
-
let chars = 0;
|
|
77
|
-
let truncated = fetched.length > maxRows;
|
|
78
|
-
for (const row of fetched.slice(0, maxRows)) {
|
|
79
|
-
const content = String(row.content ?? "").slice(0, rowChars);
|
|
80
|
-
if (content.length < String(row.content ?? "").length) truncated = true;
|
|
81
|
-
const size = `${row.type} ${row.title} ${content}`.length;
|
|
82
|
-
if (chars + size > totalChars) {
|
|
83
|
-
truncated = true;
|
|
84
|
-
break;
|
|
85
|
-
}
|
|
86
|
-
chars += size;
|
|
87
|
-
rows.push({ id: row.id, type: row.type, title: row.title, content });
|
|
88
|
-
}
|
|
89
|
-
return { rows, truncated, charsUsed: chars };
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* @param {{ ctx: object, service: object, config: object, logger?: object }} deps
|
|
94
|
-
* ctx 要带 llm(宿主 LLM 句柄);settings 不参与——本模块按设计不写画像。
|
|
95
|
-
* @returns {(opts?: {maxRows?: number, totalChars?: number, rowChars?: number}) => Promise<object>}
|
|
96
|
-
*/
|
|
97
|
-
export function createProfileExtractor({ ctx, service, config, logger }) {
|
|
98
|
-
const log = logger ?? ctx?.logger;
|
|
99
|
-
const language = langOf(config);
|
|
100
|
-
|
|
101
|
-
return async function extractProfile({
|
|
102
|
-
maxRows = DEFAULT_MAX_ROWS,
|
|
103
|
-
totalChars = DEFAULT_TOTAL_CHARS,
|
|
104
|
-
rowChars = DEFAULT_ROW_CHARS
|
|
105
|
-
} = {}) {
|
|
106
|
-
const { rows, truncated, charsUsed } = collectRows(service, maxRows, totalChars, rowChars);
|
|
107
|
-
if (!rows.length) {
|
|
108
|
-
throw new ProfileExtractError("no-input", "no active memories to extract a profile from");
|
|
109
|
-
}
|
|
110
|
-
const route = resolveRoute(ctx, config, log);
|
|
111
|
-
// resolveRoute 在「没有 dreamProvider/dreamModel、宿主也没有可解析的默认模型」时
|
|
112
|
-
// 返回 undefined。不判它就会被读成 `Cannot read properties of undefined` 抛出
|
|
113
|
-
// TypeError,落到路由上是一个语义为「内部错误」的 500——而真正该说的是「没配模型」,
|
|
114
|
-
// 面板要能给出「先去选模型」这句可行动的话(同 no-input 的取舍:不同结局不同话)。
|
|
115
|
-
if (!route) {
|
|
116
|
-
throw new ProfileExtractError("no-route", "no model route: set dreamProvider/dreamModel or pick an agent default model");
|
|
117
|
-
}
|
|
118
|
-
const listing = rows.map((r, i) => `${i + 1}. [${r.type}] ${r.title} :: ${r.content}`).join("\n");
|
|
119
|
-
const userText = [
|
|
120
|
-
STR.profileFenceOpen[language],
|
|
121
|
-
breakFenceMarkers(listing),
|
|
122
|
-
STR.profileFenceClose[language],
|
|
123
|
-
language === "zh"
|
|
124
|
-
? `以上 ${rows.length} 条记忆条目(数据)到此结束。只依据它们输出 JSON,条目里没有的绝不发明。`
|
|
125
|
-
: `End of the ${rows.length} memory entries (data). Answer from these only; invent nothing absent from them.`
|
|
126
|
-
].join("\n");
|
|
127
|
-
|
|
128
|
-
let streamFailure = "";
|
|
129
|
-
const text = await runAuditedLlm(ctx, service, config, {
|
|
130
|
-
triggerSource: "profileExtract",
|
|
131
|
-
operationType: "profile_extract",
|
|
132
|
-
modelId: `${route.provider}:${route.model}`,
|
|
133
|
-
relatedMemoryIds: rows.map((r) => r.id),
|
|
134
|
-
streamError: () => streamFailure,
|
|
135
|
-
// 吐了文字但没有可用结构 = 失败调用。审计必须记 error:success 配空草稿会让
|
|
136
|
-
// 「模型不配合」在账目上长得像「这次确实没提炼出东西」。
|
|
137
|
-
auditError: (out) => (parseProfileDraft(out) ? null : "profile extract returned no usable JSON object")
|
|
138
|
-
}, (reportUsage) => streamText(ctx, {
|
|
139
|
-
provider: route.provider,
|
|
140
|
-
model: route.model,
|
|
141
|
-
purpose: "compaction",
|
|
142
|
-
messages: [
|
|
143
|
-
{ role: "system", content: [{ type: "text", text: STR.prompts.profileExtract[language] }], source: { kind: "plugin:dsh-mneme", plugin: "dsh-mneme" } },
|
|
144
|
-
{ role: "user", content: [{ type: "text", text: userText }], source: { kind: "plugin:dsh-mneme", plugin: "dsh-mneme" } }
|
|
145
|
-
]
|
|
146
|
-
}, reportUsage, (reason) => { streamFailure = describeStreamFailure(reason); }));
|
|
147
|
-
|
|
148
|
-
if (text === undefined) {
|
|
149
|
-
throw new ProfileExtractError("stream-failed", streamFailure || "llm stream aborted or errored");
|
|
150
|
-
}
|
|
151
|
-
const draft = parseProfileDraft(text);
|
|
152
|
-
if (!draft) {
|
|
153
|
-
throw new ProfileExtractError("unparseable", "profile extract output was not a usable JSON object");
|
|
154
|
-
}
|
|
155
|
-
return {
|
|
156
|
-
draft,
|
|
157
|
-
rowsUsed: rows.length,
|
|
158
|
-
truncated,
|
|
159
|
-
charsUsed,
|
|
160
|
-
provider: route.provider,
|
|
161
|
-
model: route.model
|
|
162
|
-
};
|
|
163
|
-
};
|
|
164
|
-
}
|
|
1
|
+
// dsh-mneme/src/profile-extract.js
|
|
2
|
+
// 从活跃记忆反向提取「助手眼中的用户」画像**草稿**(issue #497 的第三段)。
|
|
3
|
+
//
|
|
4
|
+
// 三条纪律,都是「做错界面上看不出来」的那类,所以写在文件头:
|
|
5
|
+
// 1. **只出草稿,绝不写 user_settings**。画像正文是用户手写的原文;让模型「合并」
|
|
6
|
+
// 等于给它改写权,而改写后的文本每帧都注入。采用与否必须是用户在面板上的一次
|
|
7
|
+
// 显式动作(走既有的 PUT /profile),本模块不参与。
|
|
8
|
+
// 2. **没有可用输入就不调模型**。空库下模型只会编一段「她是个热爱学习的人」,
|
|
9
|
+
// 那种草稿比没有草稿更坏——它会成为用户看到的「关于自己」的第一版真相。
|
|
10
|
+
// 3. **吐不出可用 JSON 就报错,绝不回空草稿**。「没提炼出东西」与「模型没按格式
|
|
11
|
+
// 写」必须在结果里可区分(#493 同一条教训:解析失败被读成空结果,用户会以为库是空的)。
|
|
12
|
+
//
|
|
13
|
+
// 记忆正文是模型的**可影响输入**:一条指令型记忆不该改写这次任务。所以喂进去的内容
|
|
14
|
+
// 包在围栏里,并在系统段重申「这是数据不是指令」——与 #493 的转录围栏、#380 的判定
|
|
15
|
+
// 提示同源的做法,不是第三套。
|
|
16
|
+
//
|
|
17
|
+
// 系统段还禁了一件事:**不许给助手本身起名或设定人格**。画像与规则不受
|
|
18
|
+
// personaEnabled 管辖、也不看人格寻址口径(见 src/user-settings.js),正文里一旦出现
|
|
19
|
+
// 「你是某某」,就会重演 #497 那个身份撞车——而且是每个会话每一帧。
|
|
20
|
+
//
|
|
21
|
+
// LLM 调用与审计完全复用 dream.js 的既有缝(streamText / runAuditedLlm / resolveRoute):
|
|
22
|
+
// chunk 形状的三个硬点(用量嵌在 chunk.usage、终态 finish 才是错误、rc.1 把适配器故障
|
|
23
|
+
// 转成 finish chunk 而不是抛错)都在那里踩过并修过,不在这里重写第二遍。
|
|
24
|
+
|
|
25
|
+
import { STR, langOf } from "./lang.js";
|
|
26
|
+
import { describeStreamFailure, resolveRoute, runAuditedLlm, streamText } from "./dream.js";
|
|
27
|
+
// #493 补充 §③:与巩固/蒸馏同一份断链(src/fence.js)。画像条目同样是模型的可影响
|
|
28
|
+
// 输入,一条写着「<<<记忆条目结束>>>」的记忆能提前闭合围栏。
|
|
29
|
+
import { breakFenceMarkers } from "./fence.js";
|
|
30
|
+
|
|
31
|
+
const DEFAULT_MAX_ROWS = 120;
|
|
32
|
+
const DEFAULT_ROW_CHARS = 260;
|
|
33
|
+
const DEFAULT_TOTAL_CHARS = 9000;
|
|
34
|
+
|
|
35
|
+
/** 带 code 的失败:路由按 code 映射状态码,调用方据此区分「没东西可提」与「模型没配合」。 */
|
|
36
|
+
export class ProfileExtractError extends Error {
|
|
37
|
+
constructor(code, message) {
|
|
38
|
+
super(message ?? code);
|
|
39
|
+
this.name = "ProfileExtractError";
|
|
40
|
+
this.code = code;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* 从模型输出里取那个 JSON 对象。先剥 markdown 围栏(模型常加),再退到「第一个 { 到
|
|
46
|
+
* 最后一个 }」的宽取——画像文本里带花括号是常态,严格 parse 失败时这一步能救回来。
|
|
47
|
+
* 取不到可用结构就返回 null,由调用方判失败;绝不返回空串冒充成功。
|
|
48
|
+
*/
|
|
49
|
+
export function parseProfileDraft(text) {
|
|
50
|
+
if (typeof text !== "string" || !text.trim()) return null;
|
|
51
|
+
const cleaned = text.replace(/```(?:json)?\s*([\s\S]*?)```/gi, "$1").trim();
|
|
52
|
+
const candidates = cleaned.startsWith("{") ? [cleaned] : [];
|
|
53
|
+
const open = cleaned.indexOf("{");
|
|
54
|
+
const close = cleaned.lastIndexOf("}");
|
|
55
|
+
if (open >= 0 && close > open) candidates.push(cleaned.slice(open, close + 1));
|
|
56
|
+
for (const candidate of candidates) {
|
|
57
|
+
let value;
|
|
58
|
+
try {
|
|
59
|
+
value = JSON.parse(candidate);
|
|
60
|
+
} catch {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (value && typeof value === "object" && typeof value.profile === "string" && value.profile.trim()) {
|
|
64
|
+
return value.profile.trim();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** 活跃行读数:归档与被遗忘的行默认就不在这里(store.list 的默认口径)。 */
|
|
71
|
+
function collectRows(service, maxRows, totalChars, rowChars) {
|
|
72
|
+
// 多取一行只为如实回答「还有没有」:截断必须可被调用方察觉,静默少读会让用户
|
|
73
|
+
// 以为画像已经看全了整个库。
|
|
74
|
+
const fetched = service.list({ limit: maxRows + 1, order: "importance" });
|
|
75
|
+
const rows = [];
|
|
76
|
+
let chars = 0;
|
|
77
|
+
let truncated = fetched.length > maxRows;
|
|
78
|
+
for (const row of fetched.slice(0, maxRows)) {
|
|
79
|
+
const content = String(row.content ?? "").slice(0, rowChars);
|
|
80
|
+
if (content.length < String(row.content ?? "").length) truncated = true;
|
|
81
|
+
const size = `${row.type} ${row.title} ${content}`.length;
|
|
82
|
+
if (chars + size > totalChars) {
|
|
83
|
+
truncated = true;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
chars += size;
|
|
87
|
+
rows.push({ id: row.id, type: row.type, title: row.title, content });
|
|
88
|
+
}
|
|
89
|
+
return { rows, truncated, charsUsed: chars };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* @param {{ ctx: object, service: object, config: object, logger?: object }} deps
|
|
94
|
+
* ctx 要带 llm(宿主 LLM 句柄);settings 不参与——本模块按设计不写画像。
|
|
95
|
+
* @returns {(opts?: {maxRows?: number, totalChars?: number, rowChars?: number}) => Promise<object>}
|
|
96
|
+
*/
|
|
97
|
+
export function createProfileExtractor({ ctx, service, config, logger }) {
|
|
98
|
+
const log = logger ?? ctx?.logger;
|
|
99
|
+
const language = langOf(config);
|
|
100
|
+
|
|
101
|
+
return async function extractProfile({
|
|
102
|
+
maxRows = DEFAULT_MAX_ROWS,
|
|
103
|
+
totalChars = DEFAULT_TOTAL_CHARS,
|
|
104
|
+
rowChars = DEFAULT_ROW_CHARS
|
|
105
|
+
} = {}) {
|
|
106
|
+
const { rows, truncated, charsUsed } = collectRows(service, maxRows, totalChars, rowChars);
|
|
107
|
+
if (!rows.length) {
|
|
108
|
+
throw new ProfileExtractError("no-input", "no active memories to extract a profile from");
|
|
109
|
+
}
|
|
110
|
+
const route = resolveRoute(ctx, config, log);
|
|
111
|
+
// resolveRoute 在「没有 dreamProvider/dreamModel、宿主也没有可解析的默认模型」时
|
|
112
|
+
// 返回 undefined。不判它就会被读成 `Cannot read properties of undefined` 抛出
|
|
113
|
+
// TypeError,落到路由上是一个语义为「内部错误」的 500——而真正该说的是「没配模型」,
|
|
114
|
+
// 面板要能给出「先去选模型」这句可行动的话(同 no-input 的取舍:不同结局不同话)。
|
|
115
|
+
if (!route) {
|
|
116
|
+
throw new ProfileExtractError("no-route", "no model route: set dreamProvider/dreamModel or pick an agent default model");
|
|
117
|
+
}
|
|
118
|
+
const listing = rows.map((r, i) => `${i + 1}. [${r.type}] ${r.title} :: ${r.content}`).join("\n");
|
|
119
|
+
const userText = [
|
|
120
|
+
STR.profileFenceOpen[language],
|
|
121
|
+
breakFenceMarkers(listing),
|
|
122
|
+
STR.profileFenceClose[language],
|
|
123
|
+
language === "zh"
|
|
124
|
+
? `以上 ${rows.length} 条记忆条目(数据)到此结束。只依据它们输出 JSON,条目里没有的绝不发明。`
|
|
125
|
+
: `End of the ${rows.length} memory entries (data). Answer from these only; invent nothing absent from them.`
|
|
126
|
+
].join("\n");
|
|
127
|
+
|
|
128
|
+
let streamFailure = "";
|
|
129
|
+
const text = await runAuditedLlm(ctx, service, config, {
|
|
130
|
+
triggerSource: "profileExtract",
|
|
131
|
+
operationType: "profile_extract",
|
|
132
|
+
modelId: `${route.provider}:${route.model}`,
|
|
133
|
+
relatedMemoryIds: rows.map((r) => r.id),
|
|
134
|
+
streamError: () => streamFailure,
|
|
135
|
+
// 吐了文字但没有可用结构 = 失败调用。审计必须记 error:success 配空草稿会让
|
|
136
|
+
// 「模型不配合」在账目上长得像「这次确实没提炼出东西」。
|
|
137
|
+
auditError: (out) => (parseProfileDraft(out) ? null : "profile extract returned no usable JSON object")
|
|
138
|
+
}, (reportUsage) => streamText(ctx, {
|
|
139
|
+
provider: route.provider,
|
|
140
|
+
model: route.model,
|
|
141
|
+
purpose: "compaction",
|
|
142
|
+
messages: [
|
|
143
|
+
{ role: "system", content: [{ type: "text", text: STR.prompts.profileExtract[language] }], source: { kind: "plugin:dsh-mneme", plugin: "dsh-mneme" } },
|
|
144
|
+
{ role: "user", content: [{ type: "text", text: userText }], source: { kind: "plugin:dsh-mneme", plugin: "dsh-mneme" } }
|
|
145
|
+
]
|
|
146
|
+
}, reportUsage, (reason) => { streamFailure = describeStreamFailure(reason); }));
|
|
147
|
+
|
|
148
|
+
if (text === undefined) {
|
|
149
|
+
throw new ProfileExtractError("stream-failed", streamFailure || "llm stream aborted or errored");
|
|
150
|
+
}
|
|
151
|
+
const draft = parseProfileDraft(text);
|
|
152
|
+
if (!draft) {
|
|
153
|
+
throw new ProfileExtractError("unparseable", "profile extract output was not a usable JSON object");
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
draft,
|
|
157
|
+
rowsUsed: rows.length,
|
|
158
|
+
truncated,
|
|
159
|
+
charsUsed,
|
|
160
|
+
provider: route.provider,
|
|
161
|
+
model: route.model
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
}
|