@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
|
@@ -41,8 +41,11 @@ interface FakeState {
|
|
|
41
41
|
auditRecords: Array<{ planId: string; outcome: CorrectionOutcome }>;
|
|
42
42
|
replacementFailOnLoserId?: string;
|
|
43
43
|
retireFailOnMemoryId?: string;
|
|
44
|
+
retireFailuresRemaining?: number;
|
|
44
45
|
/** When set, appendTombstone throws for this source memory (PG9 test). */
|
|
45
46
|
tombstoneFailOnMemoryId?: string;
|
|
47
|
+
/** Hook used by cancellation-transaction regressions after a tombstone commits. */
|
|
48
|
+
abortAfterTombstone?: () => void;
|
|
46
49
|
propagateFails?: boolean;
|
|
47
50
|
propagateCalls: number;
|
|
48
51
|
/** Number of times retireMemory was invoked (PG9 ordering test). */
|
|
@@ -113,7 +116,14 @@ function makeExecutorDeps(state: FakeState, opts: { biTemporalEnabled?: boolean;
|
|
|
113
116
|
state.memories.set(memoryId, { ...existing, content: patch, rawContent: patch });
|
|
114
117
|
return memoryId;
|
|
115
118
|
},
|
|
116
|
-
retireMemory: async (_ns, memoryId, retireOpts) => {
|
|
119
|
+
retireMemory: async (_ns, memoryId, retireOpts, abortSignal) => {
|
|
120
|
+
if (abortSignal?.aborted) {
|
|
121
|
+
throw abortSignal.reason ?? new Error("aborted");
|
|
122
|
+
}
|
|
123
|
+
if (state.retireFailuresRemaining && state.retireFailuresRemaining > 0) {
|
|
124
|
+
state.retireFailuresRemaining -= 1;
|
|
125
|
+
throw new Error(`injected transient retire failure for ${memoryId}`);
|
|
126
|
+
}
|
|
117
127
|
if (state.retireFailOnMemoryId === memoryId) {
|
|
118
128
|
throw new Error(`injected retire failure for ${memoryId}`);
|
|
119
129
|
}
|
|
@@ -139,6 +149,7 @@ function makeExecutorDeps(state: FakeState, opts: { biTemporalEnabled?: boolean;
|
|
|
139
149
|
throw new Error(`injected tombstone failure for ${input.sourceMemoryId}`);
|
|
140
150
|
}
|
|
141
151
|
state.tombstones.push(input);
|
|
152
|
+
state.abortAfterTombstone?.();
|
|
142
153
|
return `tomb-${state.tombstones.length}`;
|
|
143
154
|
},
|
|
144
155
|
registerRedactionRule: async (_ns, pattern) => {
|
|
@@ -225,6 +236,286 @@ test("ordering: replacement write fails → loser NOT superseded, tagged partial
|
|
|
225
236
|
});
|
|
226
237
|
});
|
|
227
238
|
|
|
239
|
+
test("supersede retires the loser atomically when cancellation arrives after replacement write", async () => {
|
|
240
|
+
await withTempDir(async (dir) => {
|
|
241
|
+
const candidates = new Map<string, PlannerCandidate>([
|
|
242
|
+
["mem-old", { memoryId: "mem-old", path: "facts/mem-old.md", content: "old", excerpt: "old", score: 1 }],
|
|
243
|
+
]);
|
|
244
|
+
const state: FakeState = {
|
|
245
|
+
memories: new Map([["mem-old", fakeMemory({ memoryId: "mem-old", content: "old" })]]),
|
|
246
|
+
tombstones: [],
|
|
247
|
+
redactionRules: [],
|
|
248
|
+
auditRecords: [],
|
|
249
|
+
propagateCalls: 0,
|
|
250
|
+
writtenReplacements: [],
|
|
251
|
+
};
|
|
252
|
+
const plannerDeps: PlannerDeps = {
|
|
253
|
+
...makePlannerDeps(dir, candidates),
|
|
254
|
+
classifyAndDraft: async () => ({
|
|
255
|
+
classification: "outdated",
|
|
256
|
+
confidence: 0.9,
|
|
257
|
+
actions: [{ kind: "supersede", loserId: "mem-old", replacement: { content: "new" } }],
|
|
258
|
+
relevance: [{ memoryId: "mem-old", why: "x" }],
|
|
259
|
+
warnings: [],
|
|
260
|
+
}),
|
|
261
|
+
};
|
|
262
|
+
const planner = new CorrectionPlanner(plannerDeps);
|
|
263
|
+
const plan = await planner.plan({ text: "old", targetIds: ["mem-old"] }, ["default"]);
|
|
264
|
+
const abortController = new AbortController();
|
|
265
|
+
const baseDeps = makeExecutorDeps(state);
|
|
266
|
+
const deps: ExecutorDeps = {
|
|
267
|
+
...baseDeps,
|
|
268
|
+
writeReplacement: async (namespace, draft, abortSignal) => {
|
|
269
|
+
const newId = await baseDeps.writeReplacement(namespace, draft, abortSignal);
|
|
270
|
+
abortController.abort();
|
|
271
|
+
return newId;
|
|
272
|
+
},
|
|
273
|
+
retireMemory: async (namespace, memoryId, opts, abortSignal) => {
|
|
274
|
+
assert.equal(abortSignal, undefined, "retirement must finish after replacement cancellation");
|
|
275
|
+
await baseDeps.retireMemory(namespace, memoryId, opts, abortSignal);
|
|
276
|
+
},
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
const executor = new CorrectionExecutor(deps, planner);
|
|
280
|
+
const outcome = await executor.apply("default", plan.planId, {
|
|
281
|
+
confirm: true,
|
|
282
|
+
abortSignal: abortController.signal,
|
|
283
|
+
});
|
|
284
|
+
assert.equal(outcome.status, "applied");
|
|
285
|
+
assert.equal((await planner.loadPlan("default", plan.planId))?.status, "applied");
|
|
286
|
+
|
|
287
|
+
const loser = state.memories.get("mem-old");
|
|
288
|
+
assert.equal(loser?.status, "superseded");
|
|
289
|
+
assert.equal(loser?.supersededBy, "mem-new-0");
|
|
290
|
+
assert.equal(state.tombstones.length, 1);
|
|
291
|
+
assert.equal(state.retireCalls, 1);
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
test("cancellation after marking a plan applying restores it to pending", async () => {
|
|
296
|
+
await withTempDir(async (dir) => {
|
|
297
|
+
const candidates = new Map<string, PlannerCandidate>([
|
|
298
|
+
["mem-old", { memoryId: "mem-old", path: "facts/mem-old.md", content: "old", excerpt: "old", score: 1 }],
|
|
299
|
+
]);
|
|
300
|
+
const state: FakeState = {
|
|
301
|
+
memories: new Map([["mem-old", fakeMemory({ memoryId: "mem-old", content: "old" })]]),
|
|
302
|
+
tombstones: [],
|
|
303
|
+
redactionRules: [],
|
|
304
|
+
auditRecords: [],
|
|
305
|
+
propagateCalls: 0,
|
|
306
|
+
writtenReplacements: [],
|
|
307
|
+
};
|
|
308
|
+
const planner = new CorrectionPlanner(makePlannerDeps(dir, candidates));
|
|
309
|
+
const plan = await planner.plan({ text: "old", targetIds: ["mem-old"] }, ["default"]);
|
|
310
|
+
const abortController = new AbortController();
|
|
311
|
+
const originalMarkConsumed = planner.markConsumed.bind(planner);
|
|
312
|
+
planner.markConsumed = async (namespace, planId, status) => {
|
|
313
|
+
await originalMarkConsumed(namespace, planId, status);
|
|
314
|
+
if (status === "applying") abortController.abort();
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
const executor = new CorrectionExecutor(makeExecutorDeps(state), planner);
|
|
318
|
+
await assert.rejects(
|
|
319
|
+
executor.apply("default", plan.planId, {
|
|
320
|
+
confirm: true,
|
|
321
|
+
abortSignal: abortController.signal,
|
|
322
|
+
}),
|
|
323
|
+
/correction apply aborted/,
|
|
324
|
+
);
|
|
325
|
+
|
|
326
|
+
const reloaded = await planner.loadPlan("default", plan.planId);
|
|
327
|
+
assert.equal(reloaded?.status, "pending");
|
|
328
|
+
assert.ok(
|
|
329
|
+
(await planner.listPending("default")).some((pending) => pending.planId === plan.planId),
|
|
330
|
+
"cancelled plan must remain pending",
|
|
331
|
+
);
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
test("cancellation during loser preflight restores an applying plan to pending", async () => {
|
|
336
|
+
await withTempDir(async (dir) => {
|
|
337
|
+
const candidates = new Map<string, PlannerCandidate>([
|
|
338
|
+
["mem-old", { memoryId: "mem-old", path: "facts/mem-old.md", content: "old", excerpt: "old", score: 1 }],
|
|
339
|
+
]);
|
|
340
|
+
const state: FakeState = {
|
|
341
|
+
memories: new Map([["mem-old", fakeMemory({ memoryId: "mem-old", content: "old" })]]),
|
|
342
|
+
tombstones: [],
|
|
343
|
+
redactionRules: [],
|
|
344
|
+
auditRecords: [],
|
|
345
|
+
propagateCalls: 0,
|
|
346
|
+
writtenReplacements: [],
|
|
347
|
+
};
|
|
348
|
+
const plannerDeps: PlannerDeps = {
|
|
349
|
+
...makePlannerDeps(dir, candidates),
|
|
350
|
+
classifyAndDraft: async () => ({
|
|
351
|
+
classification: "outdated",
|
|
352
|
+
confidence: 0.9,
|
|
353
|
+
actions: [{ kind: "supersede", loserId: "mem-old", replacement: { content: "new" } }],
|
|
354
|
+
relevance: [{ memoryId: "mem-old", why: "x" }],
|
|
355
|
+
warnings: [],
|
|
356
|
+
}),
|
|
357
|
+
};
|
|
358
|
+
const planner = new CorrectionPlanner(plannerDeps);
|
|
359
|
+
const plan = await planner.plan({ text: "old", targetIds: ["mem-old"] }, ["default"]);
|
|
360
|
+
const abortController = new AbortController();
|
|
361
|
+
let resolveReadStarted!: () => void;
|
|
362
|
+
const readStarted = new Promise<void>((resolve) => {
|
|
363
|
+
resolveReadStarted = resolve;
|
|
364
|
+
});
|
|
365
|
+
const baseDeps = makeExecutorDeps(state);
|
|
366
|
+
const deps: ExecutorDeps = {
|
|
367
|
+
...baseDeps,
|
|
368
|
+
getMemory: async (namespace, memoryId, abortSignal) => {
|
|
369
|
+
resolveReadStarted();
|
|
370
|
+
await new Promise<never>((_resolve, reject) => {
|
|
371
|
+
abortSignal?.addEventListener(
|
|
372
|
+
"abort",
|
|
373
|
+
() => reject(abortSignal.reason ?? new Error("aborted")),
|
|
374
|
+
{ once: true },
|
|
375
|
+
);
|
|
376
|
+
});
|
|
377
|
+
return baseDeps.getMemory(namespace, memoryId);
|
|
378
|
+
},
|
|
379
|
+
};
|
|
380
|
+
const executor = new CorrectionExecutor(deps, planner);
|
|
381
|
+
const applyPromise = executor.apply("default", plan.planId, {
|
|
382
|
+
confirm: true,
|
|
383
|
+
abortSignal: abortController.signal,
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
await readStarted;
|
|
387
|
+
abortController.abort();
|
|
388
|
+
await assert.rejects(applyPromise, /correction apply aborted/);
|
|
389
|
+
|
|
390
|
+
const reloaded = await planner.loadPlan("default", plan.planId);
|
|
391
|
+
assert.equal(reloaded?.status, "pending");
|
|
392
|
+
assert.equal(state.writtenReplacements.length, 0);
|
|
393
|
+
});
|
|
394
|
+
});
|
|
395
|
+
test("#2128 Phase 1 pre-commit cancellation resets applying plans", async () => {
|
|
396
|
+
const cases: Array<{
|
|
397
|
+
name: string;
|
|
398
|
+
action: CorrectionAction;
|
|
399
|
+
inject: (deps: ExecutorDeps, abortController: AbortController) => ExecutorDeps;
|
|
400
|
+
}> = [
|
|
401
|
+
{
|
|
402
|
+
name: "supersede",
|
|
403
|
+
action: { kind: "supersede", loserId: "mem-old", replacement: { content: "new" } },
|
|
404
|
+
inject: (deps, abortController) => ({
|
|
405
|
+
...deps,
|
|
406
|
+
writeReplacement: async (_namespace, _draft, _abortSignal) => {
|
|
407
|
+
abortController.abort();
|
|
408
|
+
throw abortController.signal.reason ?? new Error("aborted");
|
|
409
|
+
},
|
|
410
|
+
}),
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
name: "edit",
|
|
414
|
+
action: { kind: "edit", memoryId: "mem-old", patch: "new" },
|
|
415
|
+
inject: (deps, abortController) => ({
|
|
416
|
+
...deps,
|
|
417
|
+
applyEdit: async (_namespace, _memoryId, _patch, _abortSignal) => {
|
|
418
|
+
abortController.abort();
|
|
419
|
+
throw abortController.signal.reason ?? new Error("aborted");
|
|
420
|
+
},
|
|
421
|
+
}),
|
|
422
|
+
},
|
|
423
|
+
{
|
|
424
|
+
name: "redaction_rule",
|
|
425
|
+
action: { kind: "redaction_rule", pattern: "secret-token" },
|
|
426
|
+
inject: (deps, abortController) => ({
|
|
427
|
+
...deps,
|
|
428
|
+
registerRedactionRule: async (_namespace, _pattern, _abortSignal) => {
|
|
429
|
+
abortController.abort();
|
|
430
|
+
throw abortController.signal.reason ?? new Error("aborted");
|
|
431
|
+
},
|
|
432
|
+
}),
|
|
433
|
+
},
|
|
434
|
+
];
|
|
435
|
+
|
|
436
|
+
for (const phaseCase of cases) {
|
|
437
|
+
await withTempDir(async (dir) => {
|
|
438
|
+
const candidates = new Map<string, PlannerCandidate>([
|
|
439
|
+
["mem-old", { memoryId: "mem-old", path: "facts/mem-old.md", content: "old", excerpt: "old", score: 1 }],
|
|
440
|
+
]);
|
|
441
|
+
const state: FakeState = {
|
|
442
|
+
memories: new Map([["mem-old", fakeMemory({ memoryId: "mem-old", content: "old" })]]),
|
|
443
|
+
tombstones: [],
|
|
444
|
+
redactionRules: [],
|
|
445
|
+
auditRecords: [],
|
|
446
|
+
propagateCalls: 0,
|
|
447
|
+
writtenReplacements: [],
|
|
448
|
+
};
|
|
449
|
+
const plannerDeps: PlannerDeps = {
|
|
450
|
+
...makePlannerDeps(dir, candidates),
|
|
451
|
+
classifyAndDraft: async () => ({
|
|
452
|
+
classification: phaseCase.action.kind === "redaction_rule" ? "never_store" : "outdated",
|
|
453
|
+
confidence: 0.9,
|
|
454
|
+
actions: [phaseCase.action],
|
|
455
|
+
relevance: [{ memoryId: "mem-old", why: "x" }],
|
|
456
|
+
warnings: [],
|
|
457
|
+
}),
|
|
458
|
+
};
|
|
459
|
+
const planner = new CorrectionPlanner(plannerDeps);
|
|
460
|
+
const plan = await planner.plan({ text: "old", targetIds: ["mem-old"] }, ["default"]);
|
|
461
|
+
const abortController = new AbortController();
|
|
462
|
+
const deps = phaseCase.inject(makeExecutorDeps(state), abortController);
|
|
463
|
+
|
|
464
|
+
await assert.rejects(
|
|
465
|
+
new CorrectionExecutor(deps, planner).apply("default", plan.planId, {
|
|
466
|
+
confirm: true,
|
|
467
|
+
abortSignal: abortController.signal,
|
|
468
|
+
}),
|
|
469
|
+
/aborted/,
|
|
470
|
+
);
|
|
471
|
+
|
|
472
|
+
const reloaded = await planner.loadPlan("default", plan.planId);
|
|
473
|
+
assert.equal(reloaded?.status, "pending", `${phaseCase.name} plan must remain pending`);
|
|
474
|
+
assert.ok(
|
|
475
|
+
(await planner.listPending("default")).some((pending) => pending.planId === plan.planId),
|
|
476
|
+
`${phaseCase.name} plan must remain retryable`,
|
|
477
|
+
);
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
});
|
|
481
|
+
|
|
482
|
+
test("supersede retries loser retirement after a transient failure", async () => {
|
|
483
|
+
await withTempDir(async (dir) => {
|
|
484
|
+
const candidates = new Map<string, PlannerCandidate>([
|
|
485
|
+
["mem-old", { memoryId: "mem-old", path: "facts/mem-old.md", content: "old", excerpt: "old", score: 1 }],
|
|
486
|
+
]);
|
|
487
|
+
const state: FakeState = {
|
|
488
|
+
memories: new Map([["mem-old", fakeMemory({ memoryId: "mem-old", content: "old" })]]),
|
|
489
|
+
tombstones: [],
|
|
490
|
+
redactionRules: [],
|
|
491
|
+
auditRecords: [],
|
|
492
|
+
retireFailuresRemaining: 1,
|
|
493
|
+
propagateCalls: 0,
|
|
494
|
+
writtenReplacements: [],
|
|
495
|
+
};
|
|
496
|
+
const plannerDeps: PlannerDeps = {
|
|
497
|
+
...makePlannerDeps(dir, candidates),
|
|
498
|
+
classifyAndDraft: async () => ({
|
|
499
|
+
classification: "outdated",
|
|
500
|
+
confidence: 0.9,
|
|
501
|
+
actions: [{ kind: "supersede", loserId: "mem-old", replacement: { content: "new" } }],
|
|
502
|
+
relevance: [{ memoryId: "mem-old", why: "x" }],
|
|
503
|
+
warnings: [],
|
|
504
|
+
}),
|
|
505
|
+
};
|
|
506
|
+
const planner = new CorrectionPlanner(plannerDeps);
|
|
507
|
+
const plan = await planner.plan({ text: "old", targetIds: ["mem-old"] }, ["default"]);
|
|
508
|
+
const executor = new CorrectionExecutor(makeExecutorDeps(state), planner);
|
|
509
|
+
const outcome = await executor.apply("default", plan.planId, { confirm: true });
|
|
510
|
+
|
|
511
|
+
assert.equal(outcome.status, "applied");
|
|
512
|
+
const loser = state.memories.get("mem-old");
|
|
513
|
+
assert.equal(loser?.status, "superseded");
|
|
514
|
+
assert.equal(state.tombstones.length, 2, "phase 2 must retry the failed retirement");
|
|
515
|
+
assert.equal(state.retireCalls, 1);
|
|
516
|
+
});
|
|
517
|
+
});
|
|
518
|
+
|
|
228
519
|
test("tombstone emitted per retract; validUntil absent when bi-temporal OFF", async () => {
|
|
229
520
|
await withTempDir(async (dir) => {
|
|
230
521
|
const candidates = new Map<string, PlannerCandidate>([
|
|
@@ -602,6 +893,256 @@ test("PG9: tombstone failure does NOT retire the source memory (write tombstone
|
|
|
602
893
|
});
|
|
603
894
|
});
|
|
604
895
|
|
|
896
|
+
test("#2128 cancellation after tombstone commit terminalizes the correction plan", async () => {
|
|
897
|
+
await withTempDir(async (dir) => {
|
|
898
|
+
const candidates = new Map<string, PlannerCandidate>([
|
|
899
|
+
["mem-old", { memoryId: "mem-old", path: "facts/mem-old.md", content: "stale", excerpt: "stale", score: 1 }],
|
|
900
|
+
]);
|
|
901
|
+
const abortController = new AbortController();
|
|
902
|
+
const state: FakeState = {
|
|
903
|
+
memories: new Map([["mem-old", fakeMemory({ memoryId: "mem-old", content: "stale" })]]),
|
|
904
|
+
tombstones: [],
|
|
905
|
+
redactionRules: [],
|
|
906
|
+
auditRecords: [],
|
|
907
|
+
propagateCalls: 0,
|
|
908
|
+
writtenReplacements: [],
|
|
909
|
+
abortAfterTombstone: () => abortController.abort(new Error("caller disconnected")),
|
|
910
|
+
};
|
|
911
|
+
const plannerDeps: PlannerDeps = {
|
|
912
|
+
...makePlannerDeps(dir, candidates),
|
|
913
|
+
classifyAndDraft: async () => ({
|
|
914
|
+
classification: "outdated",
|
|
915
|
+
confidence: 0.9,
|
|
916
|
+
actions: [{ kind: "retract", memoryId: "mem-old" }],
|
|
917
|
+
relevance: [{ memoryId: "mem-old", why: "stale" }],
|
|
918
|
+
warnings: [],
|
|
919
|
+
}),
|
|
920
|
+
};
|
|
921
|
+
const planner = new CorrectionPlanner(plannerDeps);
|
|
922
|
+
const plan = await planner.plan({ text: "stale", targetIds: ["mem-old"] }, ["default"]);
|
|
923
|
+
const executor = new CorrectionExecutor(makeExecutorDeps(state), planner);
|
|
924
|
+
|
|
925
|
+
const outcome = await executor.apply("default", plan.planId, {
|
|
926
|
+
confirm: true,
|
|
927
|
+
abortSignal: abortController.signal,
|
|
928
|
+
});
|
|
929
|
+
assert.equal(outcome.status, "applied");
|
|
930
|
+
assert.equal((await planner.loadPlan("default", plan.planId))?.status, "applied");
|
|
931
|
+
assert.equal(state.tombstones.length, 1);
|
|
932
|
+
assert.equal(state.retireCalls, 1, "retirement must complete after tombstone commit");
|
|
933
|
+
assert.equal(state.memories.get("mem-old")?.status, "retracted");
|
|
934
|
+
});
|
|
935
|
+
});
|
|
936
|
+
|
|
937
|
+
test("#2128 late cancellation before any mutation restores an applying plan to pending", async () => {
|
|
938
|
+
await withTempDir(async (dir) => {
|
|
939
|
+
const state: FakeState = {
|
|
940
|
+
memories: new Map(),
|
|
941
|
+
tombstones: [],
|
|
942
|
+
redactionRules: [],
|
|
943
|
+
auditRecords: [],
|
|
944
|
+
propagateCalls: 0,
|
|
945
|
+
writtenReplacements: [],
|
|
946
|
+
};
|
|
947
|
+
const planner = new CorrectionPlanner(makePlannerDeps(dir, new Map()));
|
|
948
|
+
const plan = await planner.plan({ text: "nothing matches" }, ["default"]);
|
|
949
|
+
const abortController = new AbortController();
|
|
950
|
+
const deps = makeExecutorDeps(state);
|
|
951
|
+
const appendAuditRecord = deps.appendAuditRecord;
|
|
952
|
+
deps.appendAuditRecord = async (namespace, record, signal) => {
|
|
953
|
+
abortController.abort(new Error("caller disconnected"));
|
|
954
|
+
return appendAuditRecord(namespace, record, signal);
|
|
955
|
+
};
|
|
956
|
+
const executor = new CorrectionExecutor(deps, planner);
|
|
957
|
+
|
|
958
|
+
await assert.rejects(
|
|
959
|
+
() => executor.apply("default", plan.planId, { confirm: true, abortSignal: abortController.signal }),
|
|
960
|
+
/caller disconnected/,
|
|
961
|
+
);
|
|
962
|
+
assert.equal((await planner.loadPlan("default", plan.planId))?.status, "pending");
|
|
963
|
+
});
|
|
964
|
+
});
|
|
965
|
+
|
|
966
|
+
test("#2128 cancellation before retract mutation restores a plan to pending", async () => {
|
|
967
|
+
await withTempDir(async (dir) => {
|
|
968
|
+
const candidates = new Map<string, PlannerCandidate>([
|
|
969
|
+
["mem-old", { memoryId: "mem-old", path: "facts/mem-old.md", content: "stale", excerpt: "stale", score: 1 }],
|
|
970
|
+
]);
|
|
971
|
+
const abortController = new AbortController();
|
|
972
|
+
const state: FakeState = {
|
|
973
|
+
memories: new Map([["mem-old", fakeMemory({ memoryId: "mem-old", content: "stale" })]]),
|
|
974
|
+
tombstones: [],
|
|
975
|
+
redactionRules: [],
|
|
976
|
+
auditRecords: [],
|
|
977
|
+
propagateCalls: 0,
|
|
978
|
+
writtenReplacements: [],
|
|
979
|
+
};
|
|
980
|
+
const plannerDeps: PlannerDeps = {
|
|
981
|
+
...makePlannerDeps(dir, candidates),
|
|
982
|
+
classifyAndDraft: async () => ({
|
|
983
|
+
classification: "outdated",
|
|
984
|
+
confidence: 0.9,
|
|
985
|
+
actions: [{ kind: "retract", memoryId: "mem-old" }],
|
|
986
|
+
relevance: [{ memoryId: "mem-old", why: "stale" }],
|
|
987
|
+
warnings: [],
|
|
988
|
+
}),
|
|
989
|
+
};
|
|
990
|
+
const planner = new CorrectionPlanner(plannerDeps);
|
|
991
|
+
const plan = await planner.plan({ text: "stale", targetIds: ["mem-old"] }, ["default"]);
|
|
992
|
+
const deps = makeExecutorDeps(state);
|
|
993
|
+
const originalGetMemory = deps.getMemory;
|
|
994
|
+
deps.getMemory = async (namespace, memoryId, signal) => {
|
|
995
|
+
if (memoryId === "mem-old") {
|
|
996
|
+
abortController.abort(new Error("caller disconnected"));
|
|
997
|
+
throw signal?.reason ?? new Error("caller disconnected");
|
|
998
|
+
}
|
|
999
|
+
return originalGetMemory(namespace, memoryId, signal);
|
|
1000
|
+
};
|
|
1001
|
+
const executor = new CorrectionExecutor(deps, planner);
|
|
1002
|
+
|
|
1003
|
+
await assert.rejects(
|
|
1004
|
+
() => executor.apply("default", plan.planId, { confirm: true, abortSignal: abortController.signal }),
|
|
1005
|
+
/caller disconnected/,
|
|
1006
|
+
);
|
|
1007
|
+
const reloaded = await planner.loadPlan("default", plan.planId);
|
|
1008
|
+
assert.equal(reloaded?.status, "pending");
|
|
1009
|
+
assert.equal(state.tombstones.length, 0);
|
|
1010
|
+
assert.equal(state.retireCalls ?? 0, 0);
|
|
1011
|
+
});
|
|
1012
|
+
});
|
|
1013
|
+
|
|
1014
|
+
test("#2128 committed actions terminalize plans after cancellation", async () => {
|
|
1015
|
+
const actions: CorrectionAction[] = [
|
|
1016
|
+
{ kind: "edit", memoryId: "mem-edit", patch: "edited" },
|
|
1017
|
+
{ kind: "redaction_rule", pattern: "secret-token-\\d+" },
|
|
1018
|
+
{ kind: "rescope", memoryId: "mem-rescope", toNamespace: "other-ns" },
|
|
1019
|
+
];
|
|
1020
|
+
|
|
1021
|
+
for (const action of actions) {
|
|
1022
|
+
await withTempDir(async (dir) => {
|
|
1023
|
+
const memoryId = action.kind === "rescope" ? action.memoryId : action.kind === "edit" ? action.memoryId : "mem-redact";
|
|
1024
|
+
const candidates = new Map<string, PlannerCandidate>([
|
|
1025
|
+
[memoryId, { memoryId, path: `facts/${memoryId}.md`, content: "old", excerpt: "old", score: 1 }],
|
|
1026
|
+
]);
|
|
1027
|
+
const state: FakeState = {
|
|
1028
|
+
memories: new Map([[memoryId, fakeMemory({ memoryId, content: "old" })]]),
|
|
1029
|
+
tombstones: [],
|
|
1030
|
+
redactionRules: [],
|
|
1031
|
+
auditRecords: [],
|
|
1032
|
+
propagateCalls: 0,
|
|
1033
|
+
writtenReplacements: [],
|
|
1034
|
+
};
|
|
1035
|
+
const abortController = new AbortController();
|
|
1036
|
+
const plannerDeps: PlannerDeps = {
|
|
1037
|
+
...makePlannerDeps(dir, candidates),
|
|
1038
|
+
classifyAndDraft: async () => ({
|
|
1039
|
+
classification: "outdated",
|
|
1040
|
+
confidence: 0.9,
|
|
1041
|
+
actions: [action],
|
|
1042
|
+
relevance: [{ memoryId, why: "test" }],
|
|
1043
|
+
warnings: [],
|
|
1044
|
+
}),
|
|
1045
|
+
};
|
|
1046
|
+
const planner = new CorrectionPlanner(plannerDeps);
|
|
1047
|
+
const plan = await planner.plan({ text: "old", targetIds: [memoryId] }, ["default"]);
|
|
1048
|
+
const baseDeps = makeExecutorDeps(state);
|
|
1049
|
+
let deps = baseDeps;
|
|
1050
|
+
if (action.kind === "edit") {
|
|
1051
|
+
deps = {
|
|
1052
|
+
...baseDeps,
|
|
1053
|
+
applyEdit: async (namespace, id, patch, signal) => {
|
|
1054
|
+
const editedId = await baseDeps.applyEdit(namespace, id, patch, signal);
|
|
1055
|
+
abortController.abort(new Error("caller disconnected"));
|
|
1056
|
+
return editedId;
|
|
1057
|
+
},
|
|
1058
|
+
};
|
|
1059
|
+
} else if (action.kind === "redaction_rule") {
|
|
1060
|
+
deps = {
|
|
1061
|
+
...baseDeps,
|
|
1062
|
+
registerRedactionRule: async (namespace, pattern, signal) => {
|
|
1063
|
+
await baseDeps.registerRedactionRule(namespace, pattern, signal);
|
|
1064
|
+
abortController.abort(new Error("caller disconnected"));
|
|
1065
|
+
},
|
|
1066
|
+
};
|
|
1067
|
+
} else {
|
|
1068
|
+
deps = {
|
|
1069
|
+
...baseDeps,
|
|
1070
|
+
rescopeMemory: async (namespace, id, toNamespace, signal) => {
|
|
1071
|
+
const destinationId = await baseDeps.rescopeMemory(namespace, id, toNamespace, signal);
|
|
1072
|
+
abortController.abort(new Error("caller disconnected"));
|
|
1073
|
+
return destinationId;
|
|
1074
|
+
},
|
|
1075
|
+
};
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1078
|
+
const outcome = await new CorrectionExecutor(deps, planner).apply("default", plan.planId, {
|
|
1079
|
+
confirm: true,
|
|
1080
|
+
abortSignal: abortController.signal,
|
|
1081
|
+
});
|
|
1082
|
+
assert.equal(outcome.status, "applied", `${action.kind} outcome`);
|
|
1083
|
+
assert.equal((await planner.loadPlan("default", plan.planId))?.status, "applied", `${action.kind} plan`);
|
|
1084
|
+
assert.equal(state.auditRecords.length, 1, `${action.kind} audit`);
|
|
1085
|
+
if (action.kind === "edit") {
|
|
1086
|
+
assert.equal(state.memories.get(action.memoryId)?.content, "edited");
|
|
1087
|
+
} else if (action.kind === "redaction_rule") {
|
|
1088
|
+
assert.deepEqual(state.redactionRules, [action.pattern]);
|
|
1089
|
+
} else if (action.kind === "rescope") {
|
|
1090
|
+
assert.equal(state.memories.get(action.memoryId)?.status, "rescoped");
|
|
1091
|
+
}
|
|
1092
|
+
});
|
|
1093
|
+
}
|
|
1094
|
+
});
|
|
1095
|
+
test("#2128 cancellation skips unstarted actions after a committed edit", async () => {
|
|
1096
|
+
await withTempDir(async (dir) => {
|
|
1097
|
+
const candidates = new Map<string, PlannerCandidate>([
|
|
1098
|
+
["mem-edit", { memoryId: "mem-edit", path: "facts/mem-edit.md", content: "old", excerpt: "old", score: 1 }],
|
|
1099
|
+
]);
|
|
1100
|
+
const state: FakeState = {
|
|
1101
|
+
memories: new Map([["mem-edit", fakeMemory({ memoryId: "mem-edit", content: "old" })]]),
|
|
1102
|
+
tombstones: [],
|
|
1103
|
+
redactionRules: [],
|
|
1104
|
+
auditRecords: [],
|
|
1105
|
+
propagateCalls: 0,
|
|
1106
|
+
writtenReplacements: [],
|
|
1107
|
+
};
|
|
1108
|
+
const abortController = new AbortController();
|
|
1109
|
+
const plannerDeps: PlannerDeps = {
|
|
1110
|
+
...makePlannerDeps(dir, candidates),
|
|
1111
|
+
classifyAndDraft: async () => ({
|
|
1112
|
+
classification: "outdated",
|
|
1113
|
+
confidence: 0.9,
|
|
1114
|
+
actions: [
|
|
1115
|
+
{ kind: "edit", memoryId: "mem-edit", patch: "edited" },
|
|
1116
|
+
{ kind: "redaction_rule", pattern: "secret-token-\\d+" },
|
|
1117
|
+
],
|
|
1118
|
+
relevance: [{ memoryId: "mem-edit", why: "test" }],
|
|
1119
|
+
warnings: [],
|
|
1120
|
+
}),
|
|
1121
|
+
};
|
|
1122
|
+
const planner = new CorrectionPlanner(plannerDeps);
|
|
1123
|
+
const plan = await planner.plan({ text: "old", targetIds: ["mem-edit"] }, ["default"]);
|
|
1124
|
+
const baseDeps = makeExecutorDeps(state);
|
|
1125
|
+
const deps: ExecutorDeps = {
|
|
1126
|
+
...baseDeps,
|
|
1127
|
+
applyEdit: async (namespace, memoryId, patch, signal) => {
|
|
1128
|
+
const editedId = await baseDeps.applyEdit(namespace, memoryId, patch, signal);
|
|
1129
|
+
abortController.abort(new Error("caller disconnected"));
|
|
1130
|
+
return editedId;
|
|
1131
|
+
},
|
|
1132
|
+
};
|
|
1133
|
+
|
|
1134
|
+
const outcome = await new CorrectionExecutor(deps, planner).apply("default", plan.planId, {
|
|
1135
|
+
confirm: true,
|
|
1136
|
+
abortSignal: abortController.signal,
|
|
1137
|
+
});
|
|
1138
|
+
assert.equal(outcome.status, "partial");
|
|
1139
|
+
assert.equal((await planner.loadPlan("default", plan.planId))?.status, "partial");
|
|
1140
|
+
assert.equal(state.memories.get("mem-edit")?.content, "edited");
|
|
1141
|
+
assert.deepEqual(state.redactionRules, [], "the cancelled plan must not start its second action");
|
|
1142
|
+
assert.equal(state.auditRecords.length, 1);
|
|
1143
|
+
});
|
|
1144
|
+
});
|
|
1145
|
+
|
|
605
1146
|
test("Of0pz: supersede with a missing loser writes NO replacement (preflight before write)", async () => {
|
|
606
1147
|
await withTempDir(async (dir) => {
|
|
607
1148
|
const candidates = new Map<string, PlannerCandidate>([
|