@remnic/core 9.30.1 → 9.31.0
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/dist/access-admin-ops-surface.d.ts +10 -10
- package/dist/access-admin-ops-surface.js +50 -44
- package/dist/access-authorization-probe.d.ts +10 -10
- package/dist/access-authorization-probe.js +51 -45
- package/dist/access-boundary.d.ts +13 -11
- package/dist/access-boundary.js +50 -44
- package/dist/access-cli.js +168 -123
- package/dist/access-cli.js.map +1 -1
- package/dist/access-extraction-force-flush.d.ts +119 -0
- package/dist/access-extraction-force-flush.js +166 -0
- package/dist/access-health-types.d.ts +1 -1
- package/dist/access-http-lcm-compaction.d.ts +47 -13
- package/dist/access-http-lcm-compaction.js +7 -3
- package/dist/access-http-lifecycle-flush.d.ts +132 -0
- package/dist/access-http-lifecycle-flush.js +9 -0
- package/dist/access-http-lifecycle-flush.js.map +1 -0
- package/dist/access-http.d.ts +11 -10
- package/dist/access-http.js +66 -59
- package/dist/access-identity-continuity-surface.d.ts +8 -8
- package/dist/access-identity-continuity-surface.js +50 -44
- package/dist/access-lcm-surface.d.ts +10 -10
- package/dist/access-lcm-surface.js +50 -44
- package/dist/access-mcp-output-schemas.js +1 -1
- package/dist/access-mcp.d.ts +16 -10
- package/dist/access-mcp.js +58 -52
- package/dist/access-memory-search-fanout.d.ts +2 -2
- package/dist/{access-namespace-preflight-VfXssvoI.d.ts → access-namespace-preflight-D4vW97H1.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +3 -3
- package/dist/access-namespace-preflight.js +50 -44
- package/dist/access-observe-helpers.d.ts +22 -0
- package/dist/access-observe-helpers.js +10 -0
- package/dist/access-observe-helpers.js.map +1 -0
- package/dist/access-observe-write-surface.d.ts +51 -47
- package/dist/access-observe-write-surface.js +50 -44
- package/dist/access-operations-batch.js +53 -47
- package/dist/access-operations.d.ts +11 -11
- package/dist/access-operations.js +55 -49
- package/dist/access-recall-concurrency.d.ts +10 -10
- package/dist/access-recall-concurrency.js +50 -44
- package/dist/access-recall-response.d.ts +10 -10
- package/dist/access-recall-response.js +50 -44
- package/dist/access-recall-surface.d.ts +10 -10
- package/dist/access-recall-surface.js +50 -44
- package/dist/access-schema.d.ts +37 -7
- package/dist/access-schema.js +5 -3
- package/dist/{access-service-B5RwVsTV.d.ts → access-service-B6PZ_xUL.d.ts} +44 -20
- package/dist/access-service-helpers.d.ts +113 -0
- package/dist/access-service-helpers.js +8 -0
- package/dist/access-service-helpers.js.map +1 -0
- package/dist/access-service.d.ts +10 -10
- package/dist/access-service.js +50 -44
- package/dist/access-surface-catalog.d.ts +10 -10
- package/dist/access-surface-catalog.js +2 -0
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-wearables-meetings-surface.d.ts +3 -3
- package/dist/action-confidence.d.ts +1 -1
- package/dist/active-memory-bridge.d.ts +1 -1
- package/dist/active-recall.d.ts +1 -1
- package/dist/active-recall.js +1 -1
- package/dist/adapters/index.js +7 -7
- package/dist/adapters/registry.js +3 -3
- package/dist/behavior-learner.d.ts +1 -1
- package/dist/behavior-signals.d.ts +1 -1
- package/dist/bootstrap.d.ts +8 -8
- package/dist/briefing.d.ts +2 -2
- package/dist/briefing.js +14 -14
- package/dist/buffer-surprise-report.d.ts +1 -1
- package/dist/buffer-turn-helpers.d.ts +5 -0
- package/dist/buffer-turn-helpers.js +24 -0
- package/dist/buffer-turn-helpers.js.map +1 -0
- package/dist/buffer.d.ts +17 -4
- package/dist/buffer.js +21 -1
- package/dist/bulk-import/index.d.ts +3 -3
- package/dist/calibration.d.ts +1 -1
- package/dist/capabilities.d.ts +1 -1
- package/dist/{capsule-crypto-GWVG7LGC.js → capsule-crypto-7FJQINUR.js} +2 -2
- package/dist/capsule-crypto-7FJQINUR.js.map +1 -0
- package/dist/{capsule-merge-5KKJQBWQ.js → capsule-merge-2H2IUTBT.js} +4 -4
- package/dist/{catalog-V7inUQdp.d.ts → catalog-CGFYmTT8.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +1 -1
- package/dist/causal-behavior.js +2 -2
- package/dist/causal-chain.js +2 -2
- package/dist/causal-consolidation.d.ts +1 -1
- package/dist/causal-consolidation.js +19 -19
- package/dist/causal-retrieval.js +2 -2
- package/dist/causal-trajectory-graph.d.ts +1 -1
- package/dist/causal-trajectory.js +1 -1
- package/dist/{chunk-LEPOP46W.js → chunk-227UFSEQ.js} +4 -4
- package/dist/{chunk-GIBMDSJ2.js → chunk-27P5YVDU.js} +2 -2
- package/dist/{chunk-2SA56WMI.js → chunk-2LTDWSR6.js} +4 -4
- package/dist/{chunk-OWHERGF2.js → chunk-2NLLXCJG.js} +2 -2
- package/dist/{chunk-YTSNAUXN.js → chunk-3F2LKUMU.js} +22 -8
- package/dist/chunk-3F2LKUMU.js.map +1 -0
- package/dist/chunk-3QL24R5Y.js +9 -0
- package/dist/chunk-3QL24R5Y.js.map +1 -0
- package/dist/chunk-4RNZMRAV.js +60 -0
- package/dist/chunk-4RNZMRAV.js.map +1 -0
- package/dist/{chunk-6U7F52DE.js → chunk-4XHR3I67.js} +60 -60
- package/dist/chunk-5IVLTFOV.js +65 -0
- package/dist/chunk-5IVLTFOV.js.map +1 -0
- package/dist/{chunk-2EUVEDF5.js → chunk-5XA7PQ5I.js} +2 -2
- package/dist/{chunk-ALSGMEJR.js → chunk-65ZPVYTA.js} +7 -7
- package/dist/{chunk-5VQJBH2G.js → chunk-6TAUHL33.js} +2 -2
- package/dist/{chunk-HUHX2OCX.js → chunk-7DRETLP5.js} +1 -1
- package/dist/chunk-7DRETLP5.js.map +1 -0
- package/dist/{chunk-RGIWINDN.js → chunk-7G5MH4NT.js} +30 -30
- package/dist/{chunk-WVO4G37W.js → chunk-7TEZUUGM.js} +3 -3
- package/dist/{chunk-MJCGLM25.js → chunk-7VUAG236.js} +5 -5
- package/dist/{chunk-M3C2V3PV.js → chunk-AJEMDQNA.js} +12 -12
- package/dist/{chunk-RKNJBZ55.js → chunk-AU7Q3LSC.js} +7 -7
- package/dist/{chunk-ACXPX4AG.js → chunk-BR2K43MK.js} +2 -2
- package/dist/{chunk-IYZ5K7MU.js → chunk-BUE5E2HL.js} +4 -187
- package/dist/chunk-BUE5E2HL.js.map +1 -0
- package/dist/{chunk-CZRYLSSW.js → chunk-BUGVGH4N.js} +2 -2
- package/dist/{chunk-YTQNQ4KB.js → chunk-C4VQMFVM.js} +3 -3
- package/dist/{chunk-ZPSVBSOF.js → chunk-CIVDJD6P.js} +3 -3
- package/dist/{chunk-K5GB36ME.js → chunk-CZDOT5I2.js} +2 -2
- package/dist/{chunk-VI2JQPNQ.js → chunk-E4PWACUN.js} +2 -2
- package/dist/{chunk-D2ANTDGO.js → chunk-E6BMSH7U.js} +2 -2
- package/dist/{chunk-P5PXWTW7.js → chunk-EJCAV3QZ.js} +3 -3
- package/dist/{chunk-CKMO4RDY.js → chunk-EMDLM3LW.js} +4 -4
- package/dist/chunk-ER7W6H4T.js +112 -0
- package/dist/chunk-ER7W6H4T.js.map +1 -0
- package/dist/{chunk-6FUPCJUL.js → chunk-FI4F5X2V.js} +54 -54
- package/dist/chunk-FI4F5X2V.js.map +1 -0
- package/dist/{chunk-LGHKJABJ.js → chunk-GOUILH55.js} +40 -18
- package/dist/chunk-GOUILH55.js.map +1 -0
- package/dist/{chunk-G5R3D5UP.js → chunk-GTTAHHD3.js} +2 -2
- package/dist/{chunk-H5CPS5JP.js → chunk-H36LJIPD.js} +3 -3
- package/dist/{chunk-AITCS2RC.js → chunk-IJ7HK452.js} +4 -4
- package/dist/{chunk-D3LMYTBV.js → chunk-J7WZUL2K.js} +9 -9
- package/dist/{chunk-5W4ZLBEZ.js → chunk-JCFTIQBR.js} +2 -2
- package/dist/{chunk-XOZ4ALGB.js → chunk-KE353EWI.js} +3 -3
- package/dist/{chunk-W5EG6LE3.js → chunk-KIT6M7EB.js} +3 -3
- package/dist/{chunk-5W7CTZ2E.js → chunk-KQAFEZQX.js} +4 -4
- package/dist/{chunk-Z54EM5YZ.js → chunk-MAXVH44E.js} +7 -7
- package/dist/{chunk-WZFAPHIK.js → chunk-MU7ZHSZE.js} +2 -2
- package/dist/chunk-N5Z4EVOR.js +123 -0
- package/dist/chunk-N5Z4EVOR.js.map +1 -0
- package/dist/{chunk-66772WBP.js → chunk-NFXQJHJD.js} +5 -5
- package/dist/{chunk-AZ5BTEKX.js → chunk-NQUF7XKR.js} +2 -2
- package/dist/{chunk-W4FBGYGK.js → chunk-NRV4Y3PM.js} +1 -1
- package/dist/{chunk-NHWB6HG2.js → chunk-NYCGIQRA.js} +2 -2
- package/dist/{chunk-4WKA6I65.js → chunk-OGCNZPKX.js} +1119 -309
- package/dist/chunk-OGCNZPKX.js.map +1 -0
- package/dist/{chunk-QJAQNXWI.js → chunk-ONHRRJZM.js} +6 -6
- package/dist/{chunk-FDAMS4PK.js → chunk-PNPOWBGC.js} +2 -2
- package/dist/{chunk-IC6CBHCA.js → chunk-QGENAYVS.js} +2 -2
- package/dist/{chunk-GBJ4RDFR.js → chunk-QIHIHZYC.js} +66 -91
- package/dist/chunk-QIHIHZYC.js.map +1 -0
- package/dist/{chunk-YNQBRLC5.js → chunk-RUYJ7TWU.js} +517 -2011
- package/dist/chunk-RUYJ7TWU.js.map +1 -0
- package/dist/{chunk-4A6YGWQN.js → chunk-TL4TO3EA.js} +115 -120
- package/dist/chunk-TL4TO3EA.js.map +1 -0
- package/dist/{chunk-SPJXKAVF.js → chunk-U52AKICI.js} +14 -13
- package/dist/chunk-U52AKICI.js.map +1 -0
- package/dist/chunk-ULARSG5Z.js +203 -0
- package/dist/chunk-ULARSG5Z.js.map +1 -0
- package/dist/{chunk-62U4J2GN.js → chunk-UR77VKF7.js} +2 -2
- package/dist/{chunk-JCBWCYEJ.js → chunk-VANLTS5F.js} +2 -2
- package/dist/{chunk-4Z4XNEWZ.js → chunk-VCD4PSK2.js} +56 -12
- package/dist/chunk-VCD4PSK2.js.map +1 -0
- package/dist/{chunk-RMMVQQA6.js → chunk-WDISJRMG.js} +2 -2
- package/dist/{chunk-B6JDYXL7.js → chunk-WWUVONGW.js} +7 -1
- package/dist/chunk-WWUVONGW.js.map +1 -0
- package/dist/{chunk-UVYI6VIX.js → chunk-X7Y7WX73.js} +1 -1
- package/dist/{chunk-TH2LSRMG.js → chunk-XHDIB4T4.js} +2 -2
- package/dist/{chunk-CVILPI77.js → chunk-XOQSEF7X.js} +6 -6
- package/dist/{chunk-LBOD4U5B.js → chunk-YFOMN2II.js} +6 -6
- package/dist/{chunk-RPW2NOU6.js → chunk-YIAA2X3D.js} +41 -1
- package/dist/chunk-YIAA2X3D.js.map +1 -0
- package/dist/chunk-YPC7W6GA.js +1604 -0
- package/dist/chunk-YPC7W6GA.js.map +1 -0
- package/dist/{chunk-I5NLEENJ.js → chunk-Z4SWV4VW.js} +3 -3
- package/dist/{chunk-PHWUFPCO.js → chunk-ZCPP5OW6.js} +61 -53
- package/dist/chunk-ZCPP5OW6.js.map +1 -0
- package/dist/{cli-C4GbETPC.d.ts → cli-BptUDTtp.d.ts} +5 -5
- package/dist/cli.d.ts +12 -12
- package/dist/cli.js +91 -84
- package/dist/compounding/engine.d.ts +2 -2
- package/dist/compounding/engine.js +14 -14
- package/dist/compounding/preference-consolidator.d.ts +1 -1
- package/dist/compression-optimizer.d.ts +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -1
- package/dist/connectors/codex-materialize-runner.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.js +14 -14
- package/dist/connectors/codex-materialize.d.ts +1 -1
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.js +17 -17
- package/dist/consolidation-provenance-check.d.ts +2 -2
- package/dist/consolidation-provenance-check.js +5 -5
- package/dist/consolidation-undo.d.ts +2 -2
- package/dist/consolidation-undo.js +3 -3
- package/dist/contradiction/index.d.ts +2 -2
- package/dist/contradiction/index.js +4 -4
- package/dist/conversation-index/backend.d.ts +1 -1
- package/dist/conversation-index/backend.js +2 -2
- package/dist/conversation-index/chunker.d.ts +1 -1
- package/dist/conversation-index/faiss-adapter.d.ts +1 -1
- package/dist/conversation-index/indexer.d.ts +1 -1
- package/dist/conversation-index/search.d.ts +1 -1
- package/dist/corpus-watermark.d.ts +1 -1
- package/dist/corpus-watermark.js +26 -26
- package/dist/day-summary.d.ts +1 -1
- package/dist/delinearize.d.ts +1 -1
- package/dist/direct-answer-wiring.d.ts +1 -1
- package/dist/direct-answer.d.ts +1 -1
- package/dist/embedding-fallback.d.ts +1 -1
- package/dist/enrichment/index.d.ts +1 -1
- package/dist/entity-retrieval.d.ts +2 -2
- package/dist/entity-retrieval.js +14 -14
- package/dist/entity-schema.d.ts +1 -1
- package/dist/explicit-capture.d.ts +8 -8
- package/dist/extraction-error-classification.d.ts +1 -1
- package/dist/extraction-faithfulness.d.ts +1 -1
- package/dist/extraction-judge-telemetry.d.ts +1 -1
- package/dist/extraction-judge-training.d.ts +1 -1
- package/dist/extraction-judge.d.ts +1 -1
- package/dist/extraction-liveness.d.ts +1 -1
- package/dist/extraction-source-grounding-rules.d.ts +1 -1
- package/dist/extraction-source-grounding.d.ts +15 -2
- package/dist/extraction-source-grounding.js +10 -1
- package/dist/extraction.d.ts +2 -15
- package/dist/extraction.js +5 -4
- package/dist/fallback-llm.d.ts +1 -1
- package/dist/graph-dashboard-diff.d.ts +1 -1
- package/dist/graph-dashboard-key.d.ts +1 -1
- package/dist/graph-dashboard-parser.d.ts +1 -1
- package/dist/graph-edge-reinforcement.d.ts +1 -1
- package/dist/graph-snapshot.d.ts +1 -1
- package/dist/graph.d.ts +1 -1
- package/dist/importance.d.ts +1 -1
- package/dist/importers/index.d.ts +1 -1
- package/dist/in-flight-reads.d.ts +1 -1
- package/dist/index.d.ts +19 -19
- package/dist/index.js +215 -207
- package/dist/intent.d.ts +1 -1
- package/dist/lcm/engine.d.ts +1 -1
- package/dist/lcm/engine.js +3 -3
- package/dist/lcm/index.d.ts +1 -1
- package/dist/lcm/index.js +6 -6
- package/dist/lcm/tools.d.ts +1 -1
- package/dist/lifecycle.d.ts +1 -1
- package/dist/live-connectors-runner.d.ts +1 -1
- package/dist/local-llm-helpers.d.ts +7 -0
- package/dist/local-llm-helpers.js +16 -0
- package/dist/local-llm-helpers.js.map +1 -0
- package/dist/local-llm.d.ts +3 -6
- package/dist/local-llm.js +2 -1
- package/dist/local-model-endpoint.d.ts +1 -1
- package/dist/maintenance/memory-governance.d.ts +1 -1
- package/dist/maintenance/memory-governance.js +14 -14
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +14 -14
- package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-projection.js +15 -15
- package/dist/{maintenance-CL30NWtc.d.ts → maintenance-b6f92bRz.d.ts} +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +10 -10
- package/dist/memory-action-policy.d.ts +1 -1
- package/dist/memory-cache.d.ts +1 -1
- package/dist/memory-corpus-version.js +2 -2
- package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
- package/dist/memory-projection-store.d.ts +1 -1
- package/dist/memory-provenance.d.ts +1 -1
- package/dist/memory-worth-outcomes.d.ts +2 -2
- package/dist/models-json.d.ts +1 -1
- package/dist/namespaces/migrate.d.ts +3 -3
- package/dist/namespaces/migrate.js +24 -24
- package/dist/namespaces/principal.d.ts +1 -1
- package/dist/namespaces/search.d.ts +1 -1
- package/dist/namespaces/search.js +9 -9
- package/dist/namespaces/storage.d.ts +3 -3
- package/dist/namespaces/storage.js +14 -14
- package/dist/native-knowledge.d.ts +1 -1
- package/dist/offline-sync-impression-drain.d.ts +1 -1
- package/dist/offline-sync-impression-drain.js +6 -5
- package/dist/operator-doctor-corpus.d.ts +1 -1
- package/dist/operator-doctor-corpus.js +29 -29
- package/dist/operator-doctor-replica.d.ts +1 -1
- package/dist/operator-doctor-replica.js +3 -3
- package/dist/operator-toolkit.d.ts +3 -3
- package/dist/operator-toolkit.js +38 -37
- package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
- package/dist/orchestration/maintenance.d.ts +4 -4
- package/dist/orchestration/maintenance.js +22 -21
- package/dist/{orchestrator-CKTCRwWV.d.ts → orchestrator-3uGxC1qO.d.ts} +72 -34
- package/dist/orchestrator.d.ts +8 -8
- package/dist/orchestrator.js +167 -159
- package/dist/page-versioning.js +3 -3
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/{pipeline-B7wj4rRZ.d.ts → pipeline-DepuNr-m.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +1 -1
- package/dist/proactive-contention.d.ts +1 -1
- package/dist/provenance.d.ts +1 -1
- package/dist/{qmd-q9tg4dHp.d.ts → qmd-Dalr3Jby.d.ts} +1 -1
- package/dist/qmd-preflight.d.ts +2 -2
- package/dist/qmd-recall-cache.d.ts +1 -1
- package/dist/qmd.d.ts +2 -2
- package/dist/qmd.js +4 -4
- package/dist/recall-concurrency-config.d.ts +1 -1
- package/dist/recall-disclosure-escalation.d.ts +1 -1
- package/dist/recall-explain-renderer.d.ts +1 -1
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-memory-map.d.ts +1 -1
- package/dist/recall-planner-llm.d.ts +1 -1
- package/dist/recall-state.d.ts +1 -1
- package/dist/recall-tag-filter.d.ts +1 -1
- package/dist/recall-timings.d.ts +1 -1
- package/dist/recall-xray-cli.d.ts +1 -1
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +1 -1
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +1 -1
- package/dist/recall-xray.js +2 -2
- package/dist/replay/normalizers/chatgpt.d.ts +1 -1
- package/dist/replay/normalizers/claude.d.ts +1 -1
- package/dist/replay/normalizers/openclaw.d.ts +1 -1
- package/dist/replay/normalizers/shared.d.ts +1 -1
- package/dist/replay/runner.d.ts +1 -1
- package/dist/replay/types.d.ts +1 -1
- package/dist/replica-divergence.d.ts +1 -1
- package/dist/replica-divergence.js +2 -2
- package/dist/replica-peers-config.d.ts +1 -1
- package/dist/resolve-auth-token.d.ts +1 -1
- package/dist/resume-bundles.js +1 -1
- package/dist/retrieval-agents.d.ts +2 -2
- package/dist/retrieval-tiers.d.ts +1 -1
- package/dist/routing/engine.d.ts +1 -1
- package/dist/routing/store.d.ts +1 -1
- package/dist/salvage-envelope.d.ts +1 -1
- package/dist/{scope-profiles-CWDyglPM.d.ts → scope-profiles-BpiM5hTU.d.ts} +1 -1
- package/dist/search/embed-helper.d.ts +1 -1
- package/dist/search/factory.d.ts +1 -1
- package/dist/search/factory.js +8 -8
- package/dist/search/index.d.ts +1 -1
- package/dist/search/index.js +12 -12
- package/dist/search/lancedb-backend.d.ts +1 -1
- package/dist/search/meilisearch-backend.d.ts +1 -1
- package/dist/search/noop-backend.d.ts +1 -1
- package/dist/search/orama-backend.d.ts +1 -1
- package/dist/search/port.d.ts +1 -1
- package/dist/search/remote-backend.d.ts +1 -1
- package/dist/{semantic-consolidation-BUE3deLn.d.ts → semantic-consolidation-CMtVrf9f.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +16 -16
- package/dist/semantic-rule-promotion.js +14 -14
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +14 -14
- package/dist/{service-CXgM0bQG.d.ts → service-DuAxwSgg.d.ts} +2 -2
- package/dist/session-observer-bands.d.ts +1 -1
- package/dist/session-observer-state.d.ts +1 -1
- package/dist/shared-context/manager.d.ts +1 -1
- package/dist/signal.d.ts +1 -1
- package/dist/{storage-DysJq-XH.d.ts → storage-CF0Ih8GP.d.ts} +1 -1
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +13 -13
- package/dist/summarizer.d.ts +1 -1
- package/dist/summarizer.js +3 -2
- package/dist/summary-snapshot.d.ts +1 -1
- package/dist/temporal-supersession.d.ts +2 -2
- package/dist/temporal-timeline-recall.d.ts +1 -1
- package/dist/temporal-validity.d.ts +1 -1
- package/dist/threading.d.ts +1 -1
- package/dist/tier-migration.d.ts +2 -2
- package/dist/tier-routing.d.ts +1 -1
- package/dist/tokens.js +2 -2
- package/dist/topics.d.ts +1 -1
- package/dist/transcript.d.ts +1 -1
- package/dist/transfer/backup.js +2 -2
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/capsule-import.js +5 -5
- package/dist/trust-score-stage.d.ts +1 -1
- package/dist/trust-score.d.ts +1 -1
- package/dist/{types-aPPzhnjT.d.ts → types-BpaYvJ6v.d.ts} +22 -2
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/dist/utility-runtime.d.ts +1 -1
- package/dist/verified-recall.js +14 -14
- package/dist/write-envelope.d.ts +1 -1
- package/package.json +2 -2
- package/src/access-boundary.ts +3 -0
- package/src/access-cli.test.ts +93 -0
- package/src/access-cli.ts +56 -2
- package/src/access-extraction-force-flush.ts +177 -0
- package/src/access-http-extraction-force-flush.test.ts +132 -0
- package/src/access-http-lcm-compaction.ts +99 -22
- package/src/access-http-lifecycle-flush.ts +81 -0
- package/src/access-http.test.ts +227 -0
- package/src/access-http.ts +33 -40
- package/src/access-mcp-output-schemas.ts +6 -0
- package/src/access-mcp.test.ts +40 -0
- package/src/access-mcp.ts +32 -1
- package/src/access-observe-helpers.ts +180 -0
- package/src/access-observe-write-surface.ts +78 -19
- package/src/access-operations-batch.ts +2 -1
- package/src/access-schema-pi.test.ts +17 -0
- package/src/access-schema.ts +28 -11
- package/src/access-service-helpers.ts +46 -0
- package/src/access-service-observe-lcm-parity.test.ts +781 -31
- package/src/access-service-observe-scope.test.ts +88 -0
- package/src/access-service.ts +46 -128
- package/src/access-surface-catalog.test.ts +32 -0
- package/src/access-surface-catalog.ts +2 -0
- package/src/buffer-session.test.ts +148 -0
- package/src/buffer-turn-helpers.ts +152 -0
- package/src/buffer.ts +126 -201
- package/src/correction/correction-access-wiring.ts +79 -27
- package/src/correction/correction-executor.test.ts +542 -1
- package/src/correction/correction-executor.ts +309 -89
- package/src/correction/correction-planner.test.ts +35 -1
- package/src/correction/correction-planner.ts +50 -3
- package/src/correction/correction-service.ts +12 -7
- package/src/correction/correction-storage-integration.test.ts +172 -1
- package/src/correction/passive-capture.test.ts +35 -0
- package/src/correction/passive-capture.ts +17 -3
- package/src/extraction-source-grounding.ts +55 -1
- package/src/extraction-timeout.test.ts +51 -0
- package/src/extraction.ts +64 -90
- package/src/local-llm-headers-timeout.test.ts +48 -0
- package/src/local-llm-helpers.ts +58 -0
- package/src/local-llm.ts +62 -58
- package/src/orchestration/extraction-run-helpers.ts +309 -0
- package/src/orchestration/extraction-run.test.ts +350 -7
- package/src/orchestration/extraction-run.ts +327 -250
- package/src/orchestration/session-context.ts +193 -18
- package/src/orchestration/turn-ingestion.ts +61 -11
- package/src/orchestrator-flush.test.ts +511 -5
- package/src/orchestrator.ts +8 -6
- package/src/types.ts +2 -2
- package/dist/chunk-4A6YGWQN.js.map +0 -1
- package/dist/chunk-4WKA6I65.js.map +0 -1
- package/dist/chunk-4Z4XNEWZ.js.map +0 -1
- package/dist/chunk-6FUPCJUL.js.map +0 -1
- package/dist/chunk-B6JDYXL7.js.map +0 -1
- package/dist/chunk-GBJ4RDFR.js.map +0 -1
- package/dist/chunk-HUHX2OCX.js.map +0 -1
- package/dist/chunk-IYZ5K7MU.js.map +0 -1
- package/dist/chunk-LGHKJABJ.js.map +0 -1
- package/dist/chunk-PHWUFPCO.js.map +0 -1
- package/dist/chunk-RPW2NOU6.js.map +0 -1
- package/dist/chunk-SPJXKAVF.js.map +0 -1
- package/dist/chunk-YNQBRLC5.js.map +0 -1
- package/dist/chunk-YTSNAUXN.js.map +0 -1
- /package/dist/{capsule-crypto-GWVG7LGC.js.map → access-extraction-force-flush.js.map} +0 -0
- /package/dist/{capsule-merge-5KKJQBWQ.js.map → capsule-merge-2H2IUTBT.js.map} +0 -0
- /package/dist/{chunk-LEPOP46W.js.map → chunk-227UFSEQ.js.map} +0 -0
- /package/dist/{chunk-GIBMDSJ2.js.map → chunk-27P5YVDU.js.map} +0 -0
- /package/dist/{chunk-2SA56WMI.js.map → chunk-2LTDWSR6.js.map} +0 -0
- /package/dist/{chunk-OWHERGF2.js.map → chunk-2NLLXCJG.js.map} +0 -0
- /package/dist/{chunk-6U7F52DE.js.map → chunk-4XHR3I67.js.map} +0 -0
- /package/dist/{chunk-2EUVEDF5.js.map → chunk-5XA7PQ5I.js.map} +0 -0
- /package/dist/{chunk-ALSGMEJR.js.map → chunk-65ZPVYTA.js.map} +0 -0
- /package/dist/{chunk-5VQJBH2G.js.map → chunk-6TAUHL33.js.map} +0 -0
- /package/dist/{chunk-RGIWINDN.js.map → chunk-7G5MH4NT.js.map} +0 -0
- /package/dist/{chunk-WVO4G37W.js.map → chunk-7TEZUUGM.js.map} +0 -0
- /package/dist/{chunk-MJCGLM25.js.map → chunk-7VUAG236.js.map} +0 -0
- /package/dist/{chunk-M3C2V3PV.js.map → chunk-AJEMDQNA.js.map} +0 -0
- /package/dist/{chunk-RKNJBZ55.js.map → chunk-AU7Q3LSC.js.map} +0 -0
- /package/dist/{chunk-ACXPX4AG.js.map → chunk-BR2K43MK.js.map} +0 -0
- /package/dist/{chunk-CZRYLSSW.js.map → chunk-BUGVGH4N.js.map} +0 -0
- /package/dist/{chunk-YTQNQ4KB.js.map → chunk-C4VQMFVM.js.map} +0 -0
- /package/dist/{chunk-ZPSVBSOF.js.map → chunk-CIVDJD6P.js.map} +0 -0
- /package/dist/{chunk-K5GB36ME.js.map → chunk-CZDOT5I2.js.map} +0 -0
- /package/dist/{chunk-VI2JQPNQ.js.map → chunk-E4PWACUN.js.map} +0 -0
- /package/dist/{chunk-D2ANTDGO.js.map → chunk-E6BMSH7U.js.map} +0 -0
- /package/dist/{chunk-P5PXWTW7.js.map → chunk-EJCAV3QZ.js.map} +0 -0
- /package/dist/{chunk-CKMO4RDY.js.map → chunk-EMDLM3LW.js.map} +0 -0
- /package/dist/{chunk-G5R3D5UP.js.map → chunk-GTTAHHD3.js.map} +0 -0
- /package/dist/{chunk-H5CPS5JP.js.map → chunk-H36LJIPD.js.map} +0 -0
- /package/dist/{chunk-AITCS2RC.js.map → chunk-IJ7HK452.js.map} +0 -0
- /package/dist/{chunk-D3LMYTBV.js.map → chunk-J7WZUL2K.js.map} +0 -0
- /package/dist/{chunk-5W4ZLBEZ.js.map → chunk-JCFTIQBR.js.map} +0 -0
- /package/dist/{chunk-XOZ4ALGB.js.map → chunk-KE353EWI.js.map} +0 -0
- /package/dist/{chunk-W5EG6LE3.js.map → chunk-KIT6M7EB.js.map} +0 -0
- /package/dist/{chunk-5W7CTZ2E.js.map → chunk-KQAFEZQX.js.map} +0 -0
- /package/dist/{chunk-Z54EM5YZ.js.map → chunk-MAXVH44E.js.map} +0 -0
- /package/dist/{chunk-WZFAPHIK.js.map → chunk-MU7ZHSZE.js.map} +0 -0
- /package/dist/{chunk-66772WBP.js.map → chunk-NFXQJHJD.js.map} +0 -0
- /package/dist/{chunk-AZ5BTEKX.js.map → chunk-NQUF7XKR.js.map} +0 -0
- /package/dist/{chunk-W4FBGYGK.js.map → chunk-NRV4Y3PM.js.map} +0 -0
- /package/dist/{chunk-NHWB6HG2.js.map → chunk-NYCGIQRA.js.map} +0 -0
- /package/dist/{chunk-QJAQNXWI.js.map → chunk-ONHRRJZM.js.map} +0 -0
- /package/dist/{chunk-FDAMS4PK.js.map → chunk-PNPOWBGC.js.map} +0 -0
- /package/dist/{chunk-IC6CBHCA.js.map → chunk-QGENAYVS.js.map} +0 -0
- /package/dist/{chunk-62U4J2GN.js.map → chunk-UR77VKF7.js.map} +0 -0
- /package/dist/{chunk-JCBWCYEJ.js.map → chunk-VANLTS5F.js.map} +0 -0
- /package/dist/{chunk-RMMVQQA6.js.map → chunk-WDISJRMG.js.map} +0 -0
- /package/dist/{chunk-UVYI6VIX.js.map → chunk-X7Y7WX73.js.map} +0 -0
- /package/dist/{chunk-TH2LSRMG.js.map → chunk-XHDIB4T4.js.map} +0 -0
- /package/dist/{chunk-CVILPI77.js.map → chunk-XOQSEF7X.js.map} +0 -0
- /package/dist/{chunk-LBOD4U5B.js.map → chunk-YFOMN2II.js.map} +0 -0
- /package/dist/{chunk-I5NLEENJ.js.map → chunk-Z4SWV4VW.js.map} +0 -0
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* Behavior-preserving move (late-binding selfDeps wiring, seams 18–27).
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
+
import { abortError, throwIfAborted } from "../abort-error.js";
|
|
14
15
|
import { SmartBuffer } from "../buffer.js";
|
|
15
16
|
import { resolveNamespaceCapabilities } from "../capabilities.js";
|
|
16
17
|
import { combineNamespaces, resolveCodingNamespaceOverlay } from "../coding/coding-namespace.js";
|
|
@@ -21,9 +22,11 @@ import { StorageManager } from "../index.js";
|
|
|
21
22
|
import { LocalLlmClient } from "../local-llm.js";
|
|
22
23
|
import { log } from "../logger.js";
|
|
23
24
|
import { canWriteNamespace, defaultNamespaceForPrincipal, recallNamespacesForPrincipal, resolvePrincipal } from "../namespaces/principal.js";
|
|
25
|
+
import { ExtractionDeadlineError } from "./extraction-run.js";
|
|
24
26
|
import type { ExtractionRunResult } from "./extraction-run.js";
|
|
25
27
|
import type { EntitySynthesisCoordinator } from "./entity-synthesis-coordinator.js";
|
|
26
28
|
import type { BufferTurn, CodingContext, DaySummaryResult, MemoryFile, PluginConfig } from "../types.js";
|
|
29
|
+
import type { ResolvedScopeProfilePlan } from "../namespaces/scope-profiles.js";
|
|
27
30
|
import {
|
|
28
31
|
Orchestrator,
|
|
29
32
|
} from "../orchestrator.js";
|
|
@@ -48,10 +51,12 @@ export interface SessionContextDeps {
|
|
|
48
51
|
options?: {
|
|
49
52
|
skipDedupeCheck?: boolean;
|
|
50
53
|
clearBufferAfterExtraction?: boolean;
|
|
54
|
+
clearMatchingTurns?: boolean;
|
|
51
55
|
skipCharThreshold?: boolean;
|
|
52
56
|
skipUserTurnThreshold?: boolean;
|
|
53
57
|
extractionDeadlineMs?: number;
|
|
54
58
|
failOnExtractionFailure?: boolean;
|
|
59
|
+
onDurableCommit?: () => void;
|
|
55
60
|
forceExtractionAttempt?: boolean;
|
|
56
61
|
onTaskSettled?: (
|
|
57
62
|
error?: unknown,
|
|
@@ -73,6 +78,7 @@ export interface SessionContextDeps {
|
|
|
73
78
|
* authenticated principal instead of `resolvePrincipal(sessionKey)`.
|
|
74
79
|
*/
|
|
75
80
|
principalOverride?: string;
|
|
81
|
+
scopeProfileWritePlan?: ResolvedScopeProfilePlan | null;
|
|
76
82
|
},
|
|
77
83
|
): Promise<void>;
|
|
78
84
|
resolvePrincipal(sessionKey?: string): string | undefined;
|
|
@@ -82,6 +88,89 @@ export interface SessionContextDeps {
|
|
|
82
88
|
readonly orchestratorSelf: Orchestrator;
|
|
83
89
|
}
|
|
84
90
|
|
|
91
|
+
|
|
92
|
+
export interface SessionFlushOptions {
|
|
93
|
+
reason: string;
|
|
94
|
+
abortSignal?: AbortSignal;
|
|
95
|
+
bufferKey?: string;
|
|
96
|
+
clearMatchingTurns?: boolean;
|
|
97
|
+
extractionDeadlineMs?: number;
|
|
98
|
+
writeNamespaceOverride?: string;
|
|
99
|
+
/** Called at the first durable extraction commit in this flush. */
|
|
100
|
+
onCommitted?: () => void;
|
|
101
|
+
failOnExtractionFailure?: boolean;
|
|
102
|
+
/** Resolved profile plan from access scope resolution; avoids recomputing from shared session context. */
|
|
103
|
+
scopeProfileWritePlan?: ResolvedScopeProfilePlan | null;
|
|
104
|
+
principalOverride?: string;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** Scoped flushes must never claim an opaque buffer without trusted ingestion ownership. */
|
|
108
|
+
export class SessionOwnershipError extends Error {
|
|
109
|
+
constructor(message: string) {
|
|
110
|
+
super(message);
|
|
111
|
+
this.name = "SessionOwnershipError";
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const MAX_SET_TIMEOUT_MS = 2_147_483_647;
|
|
116
|
+
|
|
117
|
+
export async function awaitSessionFlushPhase<T>(
|
|
118
|
+
task: () => Promise<T>,
|
|
119
|
+
options: Pick<SessionFlushOptions, "abortSignal" | "extractionDeadlineMs" | "reason"> & {
|
|
120
|
+
deadlineStage?: string;
|
|
121
|
+
onDeadline?: () => void;
|
|
122
|
+
},
|
|
123
|
+
): Promise<T> {
|
|
124
|
+
const abortMessage =
|
|
125
|
+
options.reason === "access_force_flush" ? "extraction force-flush aborted" : "session flush aborted";
|
|
126
|
+
throwIfAborted(options.abortSignal, abortMessage);
|
|
127
|
+
const deadline = options.extractionDeadlineMs;
|
|
128
|
+
if (typeof deadline === "number" && Date.now() >= deadline) {
|
|
129
|
+
options.onDeadline?.();
|
|
130
|
+
throw new ExtractionDeadlineError(options.deadlineStage ?? "before_buffer_flush");
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const taskPromise = Promise.resolve().then(task);
|
|
134
|
+
if (!options.abortSignal && typeof deadline !== "number") return taskPromise;
|
|
135
|
+
|
|
136
|
+
let abortHandler: (() => void) | undefined;
|
|
137
|
+
let deadlineTimer: ReturnType<typeof setTimeout> | undefined;
|
|
138
|
+
const abortPromise =
|
|
139
|
+
options.abortSignal === undefined
|
|
140
|
+
? undefined
|
|
141
|
+
: new Promise<T>((_resolve, reject) => {
|
|
142
|
+
abortHandler = () => reject(abortError(abortMessage));
|
|
143
|
+
options.abortSignal?.addEventListener("abort", abortHandler, { once: true });
|
|
144
|
+
});
|
|
145
|
+
const deadlinePromise =
|
|
146
|
+
typeof deadline !== "number"
|
|
147
|
+
? undefined
|
|
148
|
+
: new Promise<T>((_resolve, reject) => {
|
|
149
|
+
const schedule = (): void => {
|
|
150
|
+
const remainingMs = deadline - Date.now();
|
|
151
|
+
if (remainingMs <= 0) {
|
|
152
|
+
options.onDeadline?.();
|
|
153
|
+
reject(new ExtractionDeadlineError(options.deadlineStage ?? "before_buffer_flush"));
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
deadlineTimer = setTimeout(schedule, Math.min(remainingMs, MAX_SET_TIMEOUT_MS));
|
|
157
|
+
deadlineTimer.unref?.();
|
|
158
|
+
};
|
|
159
|
+
schedule();
|
|
160
|
+
});
|
|
161
|
+
const races: Promise<T>[] = [taskPromise];
|
|
162
|
+
if (abortPromise) races.push(abortPromise);
|
|
163
|
+
if (deadlinePromise) races.push(deadlinePromise);
|
|
164
|
+
try {
|
|
165
|
+
return await Promise.race(races);
|
|
166
|
+
} finally {
|
|
167
|
+
if (abortHandler && options.abortSignal) {
|
|
168
|
+
options.abortSignal.removeEventListener("abort", abortHandler);
|
|
169
|
+
}
|
|
170
|
+
if (deadlineTimer) clearTimeout(deadlineTimer);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
85
174
|
export class SessionContextCoordinator {
|
|
86
175
|
constructor(
|
|
87
176
|
private readonly deps: SessionContextDeps,
|
|
@@ -316,11 +405,7 @@ export class SessionContextCoordinator {
|
|
|
316
405
|
|
|
317
406
|
async flushSession(
|
|
318
407
|
sessionKey: string,
|
|
319
|
-
options:
|
|
320
|
-
reason: string;
|
|
321
|
-
abortSignal?: AbortSignal;
|
|
322
|
-
bufferKey?: string;
|
|
323
|
-
},
|
|
408
|
+
options: SessionFlushOptions,
|
|
324
409
|
): Promise<void> {
|
|
325
410
|
// Force any pending debounced buffer save to land durably BEFORE we read
|
|
326
411
|
// and (via clearBufferAfterExtraction below) clear turns (issue #1909, PR
|
|
@@ -334,14 +419,20 @@ export class SessionContextCoordinator {
|
|
|
334
419
|
// extraction leaves them on disk for re-extraction on next startup.
|
|
335
420
|
// Durability-preserving AND fail-closed: pass throwOnFailure so a failed
|
|
336
421
|
// durable save stops this lifecycle drain BEFORE any extraction runs
|
|
337
|
-
//
|
|
338
|
-
// and re-arms a background retry on write failure, but it now rethrows so
|
|
339
|
-
// flushSession rejects instead of clearing turns behind a non-durable save.
|
|
340
|
-
// Without this, a force-drain could queue extraction with
|
|
341
|
-
// clearBufferAfterExtraction on turns that never reached disk; if extraction
|
|
342
|
-
// then failed and the host exited, the turn was lost.
|
|
422
|
+
// flushPendingSave retains pending state and re-arms a retry on failure.
|
|
343
423
|
if (typeof this.deps.buffer.flushPendingSave === "function") {
|
|
344
|
-
await
|
|
424
|
+
await awaitSessionFlushPhase(
|
|
425
|
+
() => this.deps.buffer.flushPendingSave!({ throwOnFailure: true }),
|
|
426
|
+
options,
|
|
427
|
+
);
|
|
428
|
+
} else {
|
|
429
|
+
throwIfAborted(
|
|
430
|
+
options.abortSignal,
|
|
431
|
+
options.reason === "access_force_flush" ? "extraction force-flush aborted" : "session flush aborted",
|
|
432
|
+
);
|
|
433
|
+
if (typeof options.extractionDeadlineMs === "number" && Date.now() >= options.extractionDeadlineMs) {
|
|
434
|
+
throw new ExtractionDeadlineError("before_buffer_flush");
|
|
435
|
+
}
|
|
345
436
|
}
|
|
346
437
|
const explicitBufferKey =
|
|
347
438
|
typeof options.bufferKey === "string" && options.bufferKey.length > 0
|
|
@@ -353,7 +444,10 @@ export class SessionContextCoordinator {
|
|
|
353
444
|
sessionKey.length === 0 ||
|
|
354
445
|
typeof this.deps.buffer.findBufferKeysForSession !== "function"
|
|
355
446
|
? []
|
|
356
|
-
: await
|
|
447
|
+
: await awaitSessionFlushPhase(
|
|
448
|
+
() => this.deps.buffer.findBufferKeysForSession!(sessionKey),
|
|
449
|
+
options,
|
|
450
|
+
);
|
|
357
451
|
const bufferKeys = explicitBufferKey
|
|
358
452
|
? [explicitBufferKey]
|
|
359
453
|
: discoveredBufferKeys.length > 0
|
|
@@ -361,20 +455,101 @@ export class SessionContextCoordinator {
|
|
|
361
455
|
: typeof sessionKey === "string" && sessionKey.length > 0
|
|
362
456
|
? [sessionKey]
|
|
363
457
|
: ["default"];
|
|
458
|
+
const namespacesEnabled =
|
|
459
|
+
this.deps.config === undefined ||
|
|
460
|
+
resolveNamespaceCapabilities(this.deps.config).namespaces === true;
|
|
461
|
+
const scopedRequest =
|
|
462
|
+
typeof options.writeNamespaceOverride === "string" ||
|
|
463
|
+
typeof options.principalOverride === "string";
|
|
464
|
+
const ownershipEnforced = namespacesEnabled && scopedRequest;
|
|
465
|
+
const ownerPrincipal =
|
|
466
|
+
typeof options.principalOverride === "string" && options.principalOverride.trim().length > 0
|
|
467
|
+
? options.principalOverride.trim()
|
|
468
|
+
: undefined;
|
|
469
|
+
const resolvedSessionPrincipal =
|
|
470
|
+
ownershipEnforced && ownerPrincipal !== undefined && this.deps.config
|
|
471
|
+
? resolvePrincipal(sessionKey, this.deps.config)
|
|
472
|
+
: undefined;
|
|
473
|
+
const opaqueScopedSession =
|
|
474
|
+
ownershipEnforced &&
|
|
475
|
+
ownerPrincipal !== undefined &&
|
|
476
|
+
(resolvedSessionPrincipal === undefined || resolvedSessionPrincipal === "default");
|
|
477
|
+
const belongsToSession = (turn: BufferTurn): boolean => {
|
|
478
|
+
if (turn.sessionKey !== sessionKey) return false;
|
|
479
|
+
if (!ownershipEnforced || ownerPrincipal === undefined) return true;
|
|
480
|
+
if (turn.sessionOwnerPrincipal === ownerPrincipal) return true;
|
|
481
|
+
return (
|
|
482
|
+
turn.sessionOwnerPrincipal === undefined &&
|
|
483
|
+
this.deps.config !== undefined &&
|
|
484
|
+
resolvePrincipal(turn.sessionKey, this.deps.config) === ownerPrincipal
|
|
485
|
+
);
|
|
486
|
+
};
|
|
487
|
+
if (
|
|
488
|
+
opaqueScopedSession &&
|
|
489
|
+
bufferKeys.some((bufferKey) =>
|
|
490
|
+
this.deps.buffer
|
|
491
|
+
.getTurns(bufferKey)
|
|
492
|
+
.some((turn) => turn.sessionKey === sessionKey && turn.sessionOwnerPrincipal === undefined),
|
|
493
|
+
)
|
|
494
|
+
) {
|
|
495
|
+
throw new SessionOwnershipError(
|
|
496
|
+
`session ${sessionKey} has buffered turns without trusted ownership`,
|
|
497
|
+
);
|
|
498
|
+
}
|
|
364
499
|
for (const bufferKey of bufferKeys) {
|
|
365
500
|
const turns = this.deps.buffer.getTurns(bufferKey);
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
501
|
+
const turnsForSession = scopedRequest ? turns.filter(belongsToSession) : turns;
|
|
502
|
+
if (turnsForSession.length === 0) continue;
|
|
503
|
+
const retainedTurnsForOtherSessions =
|
|
504
|
+
scopedRequest && typeof this.deps.buffer.getRetainedDeferredTurns === "function"
|
|
505
|
+
? this.deps.buffer
|
|
506
|
+
.getRetainedDeferredTurns(bufferKey)
|
|
507
|
+
.filter((turn) => !belongsToSession(turn))
|
|
508
|
+
: [];
|
|
509
|
+
try {
|
|
510
|
+
await new Promise<void>((resolve, reject) => {
|
|
511
|
+
void this.deps.queueBufferedExtraction(turnsForSession, "trigger_mode", {
|
|
369
512
|
bufferKey,
|
|
370
513
|
clearBufferAfterExtraction: true,
|
|
371
514
|
skipDedupeCheck: true,
|
|
515
|
+
skipCharThreshold: true,
|
|
516
|
+
skipUserTurnThreshold: true,
|
|
517
|
+
failOnExtractionFailure: options.failOnExtractionFailure === true,
|
|
372
518
|
forceExtractionAttempt: true,
|
|
373
519
|
abortSignal: options.abortSignal,
|
|
520
|
+
extractionDeadlineMs: options.extractionDeadlineMs,
|
|
521
|
+
writeNamespaceOverride: options.writeNamespaceOverride,
|
|
522
|
+
principalOverride: options.principalOverride,
|
|
523
|
+
scopeProfileWritePlan: options.scopeProfileWritePlan,
|
|
524
|
+
clearMatchingTurns: options.clearMatchingTurns ?? scopedRequest,
|
|
525
|
+
onDurableCommit: options.onCommitted,
|
|
374
526
|
onTaskSettled: (error) => (error ? reject(error) : resolve()),
|
|
375
527
|
})
|
|
376
|
-
|
|
377
|
-
|
|
528
|
+
.catch(reject);
|
|
529
|
+
});
|
|
530
|
+
} finally {
|
|
531
|
+
if (
|
|
532
|
+
retainedTurnsForOtherSessions.length > 0 &&
|
|
533
|
+
typeof this.deps.buffer.retainDeferredTurns === "function"
|
|
534
|
+
) {
|
|
535
|
+
const retainedAfterExtraction = this.deps.buffer.getRetainedDeferredTurns(bufferKey);
|
|
536
|
+
await this.deps.buffer
|
|
537
|
+
.retainDeferredTurns(
|
|
538
|
+
bufferKey,
|
|
539
|
+
[
|
|
540
|
+
...retainedAfterExtraction.filter((turn) => belongsToSession(turn)),
|
|
541
|
+
...retainedTurnsForOtherSessions,
|
|
542
|
+
],
|
|
543
|
+
10,
|
|
544
|
+
)
|
|
545
|
+
.catch((error: unknown) => {
|
|
546
|
+
log.warn(
|
|
547
|
+
`session flush could not restore retained turns for other sessions in ${bufferKey}`,
|
|
548
|
+
error,
|
|
549
|
+
);
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
}
|
|
378
553
|
}
|
|
379
554
|
}
|
|
380
555
|
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
19
|
import { createHash, randomBytes } from "node:crypto";
|
|
20
|
+
import { abortError } from "../abort-error.js";
|
|
20
21
|
import { SmartBuffer } from "../buffer.js";
|
|
21
22
|
import type { ImportTurn } from "../bulk-import/types.js";
|
|
22
23
|
import { resolvePipelineProcessingCapabilities, resolveRecallAuxiliaryCapabilities } from "../capabilities.js";
|
|
@@ -28,13 +29,18 @@ import { StorageManager } from "../index.js";
|
|
|
28
29
|
import { LcmEngine } from "../lcm/index.js";
|
|
29
30
|
import { log } from "../logger.js";
|
|
30
31
|
import { ExtractionQueueCoordinator } from "./extraction-queue-coordinator.js";
|
|
31
|
-
import {
|
|
32
|
+
import {
|
|
33
|
+
ExtractionDeadlineError,
|
|
34
|
+
ExtractionRunCoordinator,
|
|
35
|
+
type ExtractionRunResult,
|
|
36
|
+
} from "./extraction-run.js";
|
|
32
37
|
import { stripHandles } from "../recall-handles.js";
|
|
33
38
|
import { type ReplayTurn, normalizeReplaySessionKey } from "../replay/types.js";
|
|
34
39
|
import { SessionObserverState } from "../session-observer-state.js";
|
|
35
40
|
import { CODEX_THREAD_KEY_PREFIX } from "../thread-key.js";
|
|
36
41
|
import { TranscriptManager } from "../transcript.js";
|
|
37
42
|
import type { BufferTurn, PluginConfig, SourceConnectorProvenance } from "../types.js";
|
|
43
|
+
import type { ResolvedScopeProfilePlan } from "../namespaces/scope-profiles.js";
|
|
38
44
|
import {
|
|
39
45
|
BulkImportBatchPartialFailureError,
|
|
40
46
|
splitTurnsBySourceValidAt,
|
|
@@ -64,10 +70,12 @@ export interface TurnIngestionDeps {
|
|
|
64
70
|
options?: {
|
|
65
71
|
skipDedupeCheck?: boolean;
|
|
66
72
|
clearBufferAfterExtraction?: boolean;
|
|
73
|
+
clearMatchingTurns?: boolean;
|
|
67
74
|
skipCharThreshold?: boolean;
|
|
68
75
|
skipUserTurnThreshold?: boolean;
|
|
69
76
|
extractionDeadlineMs?: number;
|
|
70
77
|
failOnExtractionFailure?: boolean;
|
|
78
|
+
onDurableCommit?: () => void;
|
|
71
79
|
forceExtractionAttempt?: boolean;
|
|
72
80
|
onTaskSettled?: (
|
|
73
81
|
error?: unknown,
|
|
@@ -88,6 +96,7 @@ export interface TurnIngestionDeps {
|
|
|
88
96
|
* `runExtraction` so access `observe` can record provenance under the
|
|
89
97
|
* authenticated principal instead of `resolvePrincipal(sessionKey)`.
|
|
90
98
|
*/
|
|
99
|
+
scopeProfileWritePlan?: ResolvedScopeProfilePlan | null;
|
|
91
100
|
principalOverride?: string;
|
|
92
101
|
},
|
|
93
102
|
): Promise<void>;
|
|
@@ -208,6 +217,12 @@ export class TurnIngestionCoordinator {
|
|
|
208
217
|
* `principalOverride` (issue #570 PR 4).
|
|
209
218
|
*/
|
|
210
219
|
principalOverride?: string;
|
|
220
|
+
/**
|
|
221
|
+
* Persist the authenticated principal that owns the replay session.
|
|
222
|
+
* Access observe supplies this from the transport auth boundary; replay
|
|
223
|
+
* and import callers leave it unset.
|
|
224
|
+
*/
|
|
225
|
+
sessionOwnerPrincipal?: string;
|
|
211
226
|
} = {},
|
|
212
227
|
): Promise<void> {
|
|
213
228
|
if (!Array.isArray(turns) || turns.length === 0) return;
|
|
@@ -234,6 +249,7 @@ export class TurnIngestionCoordinator {
|
|
|
234
249
|
timestamp: turn.timestamp,
|
|
235
250
|
sourceValidAt: turn.sourceValidAt,
|
|
236
251
|
sessionKey: key,
|
|
252
|
+
...(options.sessionOwnerPrincipal ? { sessionOwnerPrincipal: options.sessionOwnerPrincipal } : {}),
|
|
237
253
|
parts: turn.parts,
|
|
238
254
|
rawContent: turn.rawContent,
|
|
239
255
|
sourceFormat: turn.sourceFormat,
|
|
@@ -605,10 +621,12 @@ export class TurnIngestionCoordinator {
|
|
|
605
621
|
options: {
|
|
606
622
|
skipDedupeCheck?: boolean;
|
|
607
623
|
clearBufferAfterExtraction?: boolean;
|
|
624
|
+
clearMatchingTurns?: boolean;
|
|
608
625
|
skipCharThreshold?: boolean;
|
|
609
626
|
skipUserTurnThreshold?: boolean;
|
|
610
627
|
extractionDeadlineMs?: number;
|
|
611
628
|
failOnExtractionFailure?: boolean;
|
|
629
|
+
onDurableCommit?: () => void;
|
|
612
630
|
forceExtractionAttempt?: boolean;
|
|
613
631
|
onTaskSettled?: (
|
|
614
632
|
error?: unknown,
|
|
@@ -630,6 +648,7 @@ export class TurnIngestionCoordinator {
|
|
|
630
648
|
* authenticated principal instead of `resolvePrincipal(sessionKey)`.
|
|
631
649
|
*/
|
|
632
650
|
principalOverride?: string;
|
|
651
|
+
scopeProfileWritePlan?: ResolvedScopeProfilePlan | null;
|
|
633
652
|
} = {},
|
|
634
653
|
): Promise<void> {
|
|
635
654
|
const bufferKey = options.bufferKey ?? turnsToExtract[0]?.sessionKey ?? "default";
|
|
@@ -660,6 +679,13 @@ export class TurnIngestionCoordinator {
|
|
|
660
679
|
timeout = undefined;
|
|
661
680
|
}
|
|
662
681
|
};
|
|
682
|
+
let abortHandler: (() => void) | undefined;
|
|
683
|
+
const clearAbortListener = (): void => {
|
|
684
|
+
if (abortHandler && options.abortSignal) {
|
|
685
|
+
options.abortSignal.removeEventListener("abort", abortHandler);
|
|
686
|
+
abortHandler = undefined;
|
|
687
|
+
}
|
|
688
|
+
};
|
|
663
689
|
const settleTask = (
|
|
664
690
|
error?: unknown,
|
|
665
691
|
result?: ExtractionRunResult,
|
|
@@ -667,19 +693,38 @@ export class TurnIngestionCoordinator {
|
|
|
667
693
|
if (settled) return false;
|
|
668
694
|
settled = true;
|
|
669
695
|
clearQueueWaitTimer();
|
|
696
|
+
clearAbortListener();
|
|
670
697
|
options.onTaskSettled?.(error, result);
|
|
671
698
|
return true;
|
|
672
699
|
};
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
700
|
+
if (options.abortSignal) {
|
|
701
|
+
const signal = options.abortSignal;
|
|
702
|
+
abortHandler = () => settleTask(signal.reason ?? abortError("extraction aborted (queue_wait)"));
|
|
703
|
+
signal.addEventListener("abort", abortHandler, { once: true });
|
|
704
|
+
if (signal.aborted) {
|
|
705
|
+
settleTask(signal.reason ?? abortError("extraction aborted (queue_wait)"));
|
|
678
706
|
return;
|
|
679
707
|
}
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
if (typeof extractionDeadlineMs === "number") {
|
|
711
|
+
const deadline = extractionDeadlineMs;
|
|
712
|
+
const maxTimerDelayMs = 2_147_483_647;
|
|
713
|
+
const scheduleQueueWaitTimeout = (): void => {
|
|
714
|
+
const remainingMs = deadline - Date.now();
|
|
715
|
+
if (remainingMs <= 0) {
|
|
716
|
+
settleTask(new ExtractionDeadlineError("queue_wait"));
|
|
717
|
+
return;
|
|
718
|
+
}
|
|
719
|
+
timeout = setTimeout(() => {
|
|
720
|
+
if (Date.now() >= deadline) {
|
|
721
|
+
settleTask(new ExtractionDeadlineError("queue_wait"));
|
|
722
|
+
} else {
|
|
723
|
+
scheduleQueueWaitTimeout();
|
|
724
|
+
}
|
|
725
|
+
}, Math.min(remainingMs, maxTimerDelayMs));
|
|
726
|
+
};
|
|
727
|
+
scheduleQueueWaitTimeout();
|
|
683
728
|
}
|
|
684
729
|
|
|
685
730
|
this.deps.extractionQueueCoordinator.enqueue(async () => {
|
|
@@ -688,7 +733,7 @@ export class TurnIngestionCoordinator {
|
|
|
688
733
|
typeof extractionDeadlineMs === "number" &&
|
|
689
734
|
extractionDeadlineMs <= Date.now()
|
|
690
735
|
) {
|
|
691
|
-
settleTask(new
|
|
736
|
+
settleTask(new ExtractionDeadlineError("queue_wait"));
|
|
692
737
|
return;
|
|
693
738
|
}
|
|
694
739
|
clearQueueWaitTimer();
|
|
@@ -696,14 +741,17 @@ export class TurnIngestionCoordinator {
|
|
|
696
741
|
const result = await this.deps.runExtraction(turnsToExtract, {
|
|
697
742
|
clearBufferAfterExtraction:
|
|
698
743
|
options.clearBufferAfterExtraction ?? true,
|
|
744
|
+
clearMatchingTurns: options.clearMatchingTurns === true,
|
|
699
745
|
skipCharThreshold: options.skipCharThreshold ?? false,
|
|
700
746
|
skipUserTurnThreshold: options.skipUserTurnThreshold ?? false,
|
|
701
747
|
deadlineMs: extractionDeadlineMs,
|
|
702
748
|
bufferKey,
|
|
749
|
+
onDurableCommit: options.onDurableCommit,
|
|
703
750
|
abortSignal: options.abortSignal,
|
|
704
751
|
failOnExtractionFailure: options.failOnExtractionFailure === true,
|
|
705
752
|
writeNamespaceOverride: options.writeNamespaceOverride,
|
|
706
753
|
principalOverride: options.principalOverride,
|
|
754
|
+
scopeProfileWritePlan: options.scopeProfileWritePlan,
|
|
707
755
|
forceExtractionAttempt: options.forceExtractionAttempt === true,
|
|
708
756
|
});
|
|
709
757
|
settleTask(undefined, result);
|
|
@@ -735,6 +783,7 @@ export class TurnIngestionCoordinator {
|
|
|
735
783
|
namespace: string;
|
|
736
784
|
bufferKey: string;
|
|
737
785
|
isLiveSession: boolean;
|
|
786
|
+
abortSignal?: AbortSignal;
|
|
738
787
|
},
|
|
739
788
|
): Promise<void> {
|
|
740
789
|
const mode = this.deps.config.correctionCaptureMode;
|
|
@@ -765,10 +814,11 @@ export class TurnIngestionCoordinator {
|
|
|
765
814
|
sessionKey: opts.sessionKey,
|
|
766
815
|
principal: opts.principal,
|
|
767
816
|
namespace: opts.namespace,
|
|
817
|
+
abortSignal: opts.abortSignal,
|
|
768
818
|
},
|
|
769
819
|
captureConfig,
|
|
770
820
|
{
|
|
771
|
-
planCorrection: (req) => service.plan(req),
|
|
821
|
+
planCorrection: (req, planOpts) => service.plan(req, planOpts),
|
|
772
822
|
applyCorrection: (planId, applyOpts) => service.apply(planId, applyOpts),
|
|
773
823
|
storageDir: async (ns) => (await this.deps.getStorage(ns)).dir,
|
|
774
824
|
// Resolve `[m:xxxx]` handles to concrete memory ids via the single
|