@remnic/core 9.49.0 → 9.50.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/abstraction-nodes.d.ts +12 -1
- package/dist/abstraction-nodes.js +9 -2
- package/dist/access-admin-ops-surface.d.ts +10 -10
- package/dist/access-admin-ops-surface.js +48 -48
- package/dist/access-authorization-probe.d.ts +10 -10
- package/dist/access-authorization-probe.js +49 -49
- package/dist/access-boundary.d.ts +10 -10
- package/dist/access-boundary.js +48 -48
- package/dist/access-cli.js +132 -127
- package/dist/access-cli.js.map +1 -1
- package/dist/access-coding-context-resolution.d.ts +1 -1
- package/dist/access-extraction-force-flush.d.ts +10 -10
- package/dist/access-extraction-force-flush.js +48 -48
- package/dist/access-health-types.d.ts +1 -1
- package/dist/access-http-lcm-compaction.d.ts +10 -10
- package/dist/access-http-lifecycle-flush.d.ts +10 -10
- package/dist/access-http-offline-stream.d.ts +10 -10
- package/dist/access-http-query.js +48 -48
- package/dist/access-http.d.ts +10 -10
- package/dist/access-http.js +60 -60
- package/dist/access-identity-continuity-surface.d.ts +8 -8
- package/dist/access-identity-continuity-surface.js +48 -48
- package/dist/access-lcm-surface.d.ts +10 -10
- package/dist/access-lcm-surface.js +48 -48
- package/dist/access-mcp.d.ts +10 -10
- package/dist/access-mcp.js +55 -55
- package/dist/access-memory-search-fanout.d.ts +2 -2
- package/dist/{access-namespace-preflight--H6HwN85.d.ts → access-namespace-preflight-DuDU301-.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +3 -3
- package/dist/access-namespace-preflight.js +48 -48
- package/dist/access-observe-write-surface.d.ts +10 -10
- package/dist/access-observe-write-surface.js +48 -48
- package/dist/access-offline-manifest.d.ts +8 -8
- package/dist/access-offline-manifest.js +3 -3
- package/dist/access-operations-batch.js +51 -51
- package/dist/access-operations.d.ts +13 -13
- package/dist/access-operations.js +54 -54
- package/dist/access-recall-concurrency.d.ts +10 -10
- package/dist/access-recall-concurrency.js +48 -48
- package/dist/access-recall-response.d.ts +10 -10
- package/dist/access-recall-response.js +48 -48
- package/dist/access-recall-surface.d.ts +10 -10
- package/dist/access-recall-surface.js +48 -48
- package/dist/access-schema.d.ts +105 -105
- package/dist/access-schema.js +4 -4
- package/dist/{access-service-DvXOzCrM.d.ts → access-service--_3T_v23.d.ts} +7 -7
- package/dist/access-service-helpers.d.ts +10 -10
- package/dist/access-service.d.ts +10 -10
- package/dist/access-service.js +48 -48
- package/dist/access-surface-catalog.d.ts +10 -10
- 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 +3 -2
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- package/dist/ambient-provenance.d.ts +1 -1
- package/dist/artifact-search.d.ts +1 -1
- package/dist/{auto-sync-7O6RP2RT.js → auto-sync-QFQGOEO2.js} +4 -4
- 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 +12 -12
- package/dist/buffer-surprise-report.d.ts +1 -1
- package/dist/buffer-turn-helpers.d.ts +1 -1
- package/dist/buffer.d.ts +2 -2
- package/dist/buffer.js +4 -4
- package/dist/bulk-import/index.d.ts +3 -3
- package/dist/calibration.d.ts +1 -1
- package/dist/calibration.js +1 -1
- package/dist/capabilities.d.ts +1 -1
- package/dist/{capsule-crypto-YO5QJ6L3.js → capsule-crypto-7FJQINUR.js} +2 -2
- package/dist/{capsule-merge-6GFHWECG.js → capsule-merge-KXTRZ23Z.js} +4 -4
- package/dist/{catalog-Iwbk9h5E.d.ts → catalog-DjUmUIal.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +1 -1
- package/dist/causal-behavior.js +3 -3
- package/dist/causal-chain.js +3 -3
- package/dist/causal-consolidation.d.ts +1 -1
- package/dist/causal-consolidation.js +16 -16
- package/dist/causal-retrieval.js +3 -3
- package/dist/causal-trajectory-graph.d.ts +1 -1
- package/dist/causal-trajectory.d.ts +51 -2
- package/dist/causal-trajectory.js +8 -2
- package/dist/{chunk-EY64JLOM.js → chunk-24BKGKGO.js} +30 -19
- package/dist/chunk-24BKGKGO.js.map +1 -0
- package/dist/{chunk-ICP53SKG.js → chunk-2HIJHXB3.js} +2 -2
- package/dist/{chunk-BXLOS5AJ.js → chunk-2NLLXCJG.js} +2 -2
- package/dist/{chunk-LZGCJSQR.js → chunk-3LD4N2TF.js} +151 -37
- package/dist/chunk-3LD4N2TF.js.map +1 -0
- package/dist/{chunk-5JRC6BYS.js → chunk-47J4EDGR.js} +11 -11
- package/dist/{chunk-2VHLLPTX.js → chunk-4EABKPZS.js} +4 -4
- package/dist/{chunk-RJV6Q2FT.js → chunk-4JWJMRPJ.js} +2 -2
- package/dist/{chunk-MXPB6PJQ.js → chunk-4S3ECH3U.js} +2 -2
- package/dist/{chunk-CGASUJVP.js → chunk-5V6IXHPI.js} +4 -4
- package/dist/{chunk-R5IGA2NH.js → chunk-5XCN4XBU.js} +4 -4
- package/dist/{chunk-2RPJ4NEE.js → chunk-64BHFFKZ.js} +2 -2
- package/dist/{chunk-FQC3DHH2.js → chunk-66SE3BNH.js} +2 -2
- package/dist/{chunk-TERNBNJB.js → chunk-6FC3IZ26.js} +2 -2
- package/dist/{chunk-K7VKAHFE.js → chunk-6XGEBQ3R.js} +4 -4
- package/dist/{chunk-JFLOOTXU.js → chunk-7BLWBSRL.js} +3 -3
- package/dist/{chunk-ABR2HEJO.js → chunk-7NDM2PNK.js} +3 -3
- package/dist/{chunk-JXZ7NLYH.js → chunk-7VWZ4LRW.js} +2 -2
- package/dist/{chunk-RN53QBM4.js → chunk-A4QMKFFO.js} +5 -1
- package/dist/chunk-A4QMKFFO.js.map +1 -0
- package/dist/chunk-ACPCA4NO.js +321 -0
- package/dist/chunk-ACPCA4NO.js.map +1 -0
- package/dist/chunk-AMTEYNYK.js +72 -0
- package/dist/chunk-AMTEYNYK.js.map +1 -0
- package/dist/{chunk-R6YJI3HE.js → chunk-AW4QUFQF.js} +1 -1
- package/dist/{chunk-P65YJEEL.js → chunk-AXFWMRKI.js} +2 -2
- package/dist/{chunk-WG5HSQ4P.js → chunk-BAKXNQ3C.js} +2 -2
- package/dist/{chunk-NM2WP3B7.js → chunk-BJYET5TX.js} +2 -2
- package/dist/{chunk-HLKPRWF4.js → chunk-DATDLJAO.js} +6 -6
- package/dist/chunk-DJUKBGAD.js +260 -0
- package/dist/chunk-DJUKBGAD.js.map +1 -0
- package/dist/{chunk-DX3XRGLH.js → chunk-DQTCGVFK.js} +2 -2
- package/dist/{chunk-IPBNC77A.js → chunk-E633OXMH.js} +11 -11
- package/dist/{chunk-J7T4MX7P.js → chunk-EEAMSNSG.js} +12 -1
- package/dist/chunk-EEAMSNSG.js.map +1 -0
- package/dist/{chunk-Z5UC3OKB.js → chunk-ELQCS47S.js} +7 -7
- package/dist/{chunk-FMXJ555A.js → chunk-EURCX6PS.js} +2 -2
- package/dist/{chunk-MZZR3J6M.js → chunk-FV7YQTN3.js} +2 -2
- package/dist/chunk-G73MCJKL.js +20 -0
- package/dist/chunk-G73MCJKL.js.map +1 -0
- package/dist/{chunk-3R6D33UF.js → chunk-GGBSF2X7.js} +2 -2
- package/dist/{chunk-SYUBB3WM.js → chunk-GKEYXXKX.js} +2 -2
- package/dist/{chunk-5AGR7SAI.js → chunk-GSEPRIZC.js} +3 -3
- package/dist/{chunk-UTVZKHJK.js → chunk-GUKBW4HL.js} +2 -2
- package/dist/chunk-GXSOUIA4.js +293 -0
- package/dist/chunk-GXSOUIA4.js.map +1 -0
- package/dist/{chunk-2F6NP3NT.js → chunk-HDQUQBPW.js} +2 -2
- package/dist/{chunk-6HMYUWXR.js → chunk-HTP6XRUI.js} +2 -2
- package/dist/{chunk-UYUYZ4WY.js → chunk-IARXXZU4.js} +2 -2
- package/dist/{chunk-MNB5RMAY.js → chunk-IIFFC3RL.js} +2 -2
- package/dist/{chunk-VDX2J7OX.js → chunk-IPLYGWQF.js} +6 -6
- package/dist/{chunk-NZBZ7IS2.js → chunk-JDCQK3C5.js} +2 -2
- package/dist/{chunk-C3KVFJH5.js → chunk-JI62YGPI.js} +2 -2
- package/dist/{chunk-LULR4IUW.js → chunk-KATEWTQJ.js} +2 -2
- package/dist/{chunk-BMCHFWGX.js → chunk-KMWYZTIE.js} +2 -2
- package/dist/{chunk-JGSKJHF7.js → chunk-KQS72GCR.js} +2 -2
- package/dist/{chunk-3S63QIFQ.js → chunk-LAQ33B5D.js} +1 -1
- package/dist/chunk-LAQ33B5D.js.map +1 -0
- package/dist/chunk-LNTUXKBT.js +224 -0
- package/dist/chunk-LNTUXKBT.js.map +1 -0
- package/dist/{chunk-2RIWJUSQ.js → chunk-LQKXVQZR.js} +12 -12
- package/dist/{chunk-LQL7ARIC.js → chunk-LTOAJXZB.js} +4 -4
- package/dist/{chunk-QKD65RGL.js → chunk-LYMNZZIM.js} +2 -2
- package/dist/{chunk-W4FBGYGK.js → chunk-M4MP34AQ.js} +189 -5
- package/dist/chunk-M4MP34AQ.js.map +1 -0
- package/dist/{chunk-3PY7VHV7.js → chunk-MCA2X4WH.js} +2 -2
- package/dist/{chunk-S5NZBKKQ.js → chunk-N3CXAYPJ.js} +3 -3
- package/dist/{chunk-WQIHRA5F.js → chunk-N3LL5NEU.js} +2 -2
- package/dist/{chunk-Z4U6U3M3.js → chunk-NKL25FCF.js} +2 -2
- package/dist/{chunk-LMDRGRJ2.js → chunk-NOB2T2FC.js} +2 -2
- package/dist/{chunk-P2OTGMTR.js → chunk-NSGU76YO.js} +2 -2
- package/dist/{chunk-L6DCVUCA.js → chunk-O76MWTVS.js} +2 -2
- package/dist/{chunk-WZFAPHIK.js → chunk-OIOZ6MOP.js} +3 -3
- package/dist/{chunk-DNHVPZOD.js → chunk-P26YHAQH.js} +201 -1
- package/dist/chunk-P26YHAQH.js.map +1 -0
- package/dist/{chunk-UMOO7IY7.js → chunk-P2KBDJJ6.js} +2 -2
- package/dist/{chunk-KVJRXN2E.js → chunk-P4QOYG52.js} +125 -13
- package/dist/chunk-P4QOYG52.js.map +1 -0
- package/dist/chunk-P77QX3ID.js +332 -0
- package/dist/chunk-P77QX3ID.js.map +1 -0
- package/dist/{chunk-SXWHN7GC.js → chunk-PDEKQWDV.js} +2 -2
- package/dist/{chunk-ENEA47UC.js → chunk-PLCHU56K.js} +3 -3
- package/dist/{chunk-IXPKESVP.js → chunk-PWIMF7LP.js} +37 -37
- package/dist/{chunk-RHTO4HTL.js → chunk-PWLB4TRK.js} +2 -2
- package/dist/{chunk-RVYVMQK4.js → chunk-QSYL5CXK.js} +3 -3
- package/dist/{chunk-B6KGGRUL.js → chunk-QWLW3VQH.js} +2 -2
- package/dist/{chunk-YQIVWS7Y.js → chunk-RBPH3GZV.js} +405 -101
- package/dist/chunk-RBPH3GZV.js.map +1 -0
- package/dist/{chunk-JBPKEARU.js → chunk-RKNJBZ55.js} +4 -4
- package/dist/{chunk-QCECHYZL.js → chunk-RVO6TCTU.js} +6 -6
- package/dist/{chunk-SHDZNSK4.js → chunk-S2SJEOTM.js} +2 -2
- package/dist/{chunk-ULWHRQEQ.js → chunk-S75UQ3T3.js} +3 -3
- package/dist/{chunk-LXOM6IQU.js → chunk-SEF4IOFE.js} +2 -2
- package/dist/{chunk-I3YHVVT4.js → chunk-SHYIMIX5.js} +2 -2
- package/dist/{chunk-IZANPXMV.js → chunk-T35UJI5R.js} +86 -82
- package/dist/chunk-T35UJI5R.js.map +1 -0
- package/dist/{chunk-G5OB4XZX.js → chunk-VANZKHTN.js} +4 -4
- package/dist/{chunk-I4TQST3L.js → chunk-VFS3MK5F.js} +2 -2
- package/dist/chunk-VUDMT5CP.js +86 -0
- package/dist/chunk-VUDMT5CP.js.map +1 -0
- package/dist/{chunk-CMQZNEIF.js → chunk-WFLBP5GC.js} +8 -1
- package/dist/chunk-WFLBP5GC.js.map +1 -0
- package/dist/{chunk-SMPVHGHG.js → chunk-WPZX7MEA.js} +3 -3
- package/dist/{chunk-ZRWB5D4H.js → chunk-WT6UL3UA.js} +2 -2
- package/dist/{chunk-DQEMWVMT.js → chunk-X7Y7WX73.js} +1 -1
- package/dist/{chunk-JHMAYABJ.js → chunk-XL3TATMJ.js} +4 -4
- package/dist/{chunk-MC6XO7T4.js → chunk-YLBE6PLR.js} +2 -2
- package/dist/{chunk-OLX2HJFW.js → chunk-YLHM5BQQ.js} +4 -4
- package/dist/{chunk-EZ25VE3G.js → chunk-YNDLCWXS.js} +4 -4
- package/dist/{chunk-GF22HWS2.js → chunk-Z54EM5YZ.js} +4 -4
- package/dist/{chunk-GVX3NAUU.js → chunk-ZDAYWJV6.js} +2 -2
- package/dist/{chunk-EYAIZBLM.js → chunk-ZJIFYUJI.js} +5 -5
- package/dist/{chunk-CNQQMB67.js → chunk-ZN4EYMKJ.js} +2 -2
- package/dist/{cli-PyAUaozE.d.ts → cli-BLNmNEMT.d.ts} +16 -14
- package/dist/cli.d.ts +13 -13
- package/dist/cli.js +96 -94
- package/dist/coding/pre-action-gate.d.ts +66 -0
- package/dist/coding/pre-action-gate.js +22 -0
- package/dist/commitment-ledger.js +2 -2
- package/dist/compounding/engine.d.ts +2 -2
- package/dist/compounding/engine.js +13 -13
- 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 +3 -2
- package/dist/connectors/codex-materialize-runner.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.js +12 -12
- package/dist/connectors/codex-materialize.d.ts +1 -1
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.js +12 -12
- package/dist/consolidation-provenance-check.d.ts +2 -2
- package/dist/consolidation-provenance-check.js +4 -4
- 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 +3 -3
- package/dist/converge-config.d.ts +1 -1
- package/dist/convergence-refresh.d.ts +2 -2
- package/dist/convergence-refresh.js +15 -15
- package/dist/conversation-index/backend.d.ts +1 -1
- 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 +23 -23
- package/dist/cue-anchors.d.ts +19 -1
- package/dist/cue-anchors.js +10 -2
- package/dist/dashboard-runtime.js +2 -2
- package/dist/day-summary.d.ts +1 -1
- package/dist/delinearize.d.ts +1 -1
- package/dist/dependency-propagation-config.d.ts +10 -0
- package/dist/dependency-propagation-config.js +10 -0
- package/dist/dependency-propagation-config.js.map +1 -0
- package/dist/deterministic-order.d.ts +4 -0
- package/dist/deterministic-order.js +10 -0
- package/dist/deterministic-order.js.map +1 -0
- 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 +12 -12
- package/dist/entity-schema.d.ts +1 -1
- package/dist/evals.js +2 -2
- package/dist/explicit-capture.d.ts +8 -8
- package/dist/explicit-capture.js +6 -6
- package/dist/external-wiki-access.d.ts +10 -10
- package/dist/external-wiki-access.js +49 -49
- package/dist/external-wiki-collection-registration.d.ts +1 -1
- package/dist/external-wiki-collection.d.ts +1 -1
- package/dist/external-wiki-mcp-tools.d.ts +10 -10
- 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-normalization.d.ts +14 -0
- package/dist/extraction-normalization.js +22 -0
- package/dist/extraction-normalization.js.map +1 -0
- package/dist/extraction-prompt.d.ts +4 -3
- package/dist/extraction-prompt.js +3 -1
- package/dist/extraction-source-grounding-rules.d.ts +1 -1
- package/dist/extraction-source-grounding.d.ts +1 -1
- package/dist/extraction.d.ts +18 -1
- package/dist/extraction.js +21 -19
- package/dist/fallback-llm.d.ts +1 -1
- package/dist/{first-start-migration-ZSHEFEI3.js → first-start-migration-626C5554.js} +5 -5
- package/dist/{forget-DNAJ66ZD.js → forget-GJ42LCBW.js} +2 -2
- 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/harmonic-construction.d.ts +43 -0
- package/dist/harmonic-construction.js +26 -0
- package/dist/harmonic-construction.js.map +1 -0
- package/dist/harmonic-retrieval.d.ts +1 -0
- package/dist/harmonic-retrieval.js +10 -4
- 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 +698 -696
- package/dist/index.js +207 -161
- package/dist/intent.d.ts +1 -1
- package/dist/json-store.d.ts +15 -1
- package/dist/json-store.js +11 -3
- package/dist/lcm/engine.d.ts +1 -1
- package/dist/lcm/engine.js +2 -2
- package/dist/lcm/index.d.ts +1 -1
- package/dist/lcm/index.js +4 -4
- 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.d.ts +1 -1
- package/dist/local-model-endpoint.d.ts +1 -1
- package/dist/maintenance/archive-observations.js +2 -2
- package/dist/maintenance/atomic-file.d.ts +5 -0
- package/dist/maintenance/atomic-file.js +12 -0
- package/dist/maintenance/atomic-file.js.map +1 -0
- package/dist/maintenance/memory-governance.d.ts +1 -1
- package/dist/maintenance/memory-governance.js +12 -12
- package/dist/maintenance/migrate-observations.js +3 -3
- package/dist/maintenance/observation-ledger-utils.d.ts +1 -1
- package/dist/maintenance/observation-ledger-utils.js +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +13 -13
- package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-projection.js +14 -14
- package/dist/maintenance/rebuild-observations.js +3 -3
- package/dist/{maintenance-j7sfNQdK.d.ts → maintenance-DKbKZi3u.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-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-snapshot.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 +22 -22
- 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 +12 -12
- package/dist/native-knowledge.d.ts +1 -1
- package/dist/objective-state-writers.js +3 -3
- package/dist/objective-state.js +2 -2
- package/dist/offline-sync-impression-drain.d.ts +1 -1
- package/dist/offline-sync-impression-drain.js +2 -2
- package/dist/operator-doctor-corpus.d.ts +1 -1
- package/dist/operator-doctor-corpus.js +24 -24
- package/dist/operator-doctor-replica.d.ts +1 -1
- package/dist/operator-toolkit.d.ts +3 -3
- package/dist/operator-toolkit.js +33 -32
- package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
- package/dist/orchestration/maintenance.d.ts +4 -4
- package/dist/orchestration/maintenance.js +18 -18
- package/dist/{orchestrator-Haa9xVPV.d.ts → orchestrator-BRwD7ceU.d.ts} +7 -7
- package/dist/orchestrator.d.ts +8 -8
- package/dist/orchestrator.js +132 -127
- package/dist/page-versioning.js +3 -3
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/{pipeline-1h2GpiHP.d.ts → pipeline-DC-1C9T8.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-UdwoF71D.d.ts → qmd-DdeCEZdb.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-state.js +2 -2
- 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/reconcile/cursor.d.ts +1 -1
- package/dist/reconcile/manifest.d.ts +1 -1
- package/dist/reconcile/plan.d.ts +1 -1
- package/dist/relevance.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-peers-config.d.ts +1 -1
- package/dist/{resolution-3K27T4VO.js → resolution-MDPNOEG6.js} +4 -4
- package/dist/resolution-MDPNOEG6.js.map +1 -0
- package/dist/resolve-auth-token.d.ts +1 -1
- package/dist/resume-bundles.js +8 -7
- 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/salvage-envelope.js +3 -3
- package/dist/schemas.d.ts +213 -116
- package/dist/schemas.js +1 -1
- package/dist/{scope-profiles-APjhSe-w.d.ts → scope-profiles-BXVq4Jv0.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 +13 -13
- package/dist/search/lancedb-backend.d.ts +1 -1
- package/dist/search/lancedb-backend.js +2 -2
- package/dist/search/meilisearch-backend.d.ts +1 -1
- package/dist/search/meilisearch-backend.js +2 -2
- package/dist/search/noop-backend.d.ts +1 -1
- package/dist/search/orama-backend.d.ts +1 -1
- package/dist/search/orama-backend.js +2 -2
- package/dist/search/port.d.ts +1 -1
- package/dist/search/remote-backend.d.ts +1 -1
- package/dist/{semantic-consolidation-CrySDbk3.d.ts → semantic-consolidation-CGYxfa8F.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +13 -13
- package/dist/semantic-rule-promotion.js +12 -12
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +12 -12
- package/dist/{service-Da_BI4S8.d.ts → service-CBDBQFCN.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 +11 -11
- package/dist/signal.d.ts +1 -1
- package/dist/source-agent-qualifier.d.ts +1 -1
- package/dist/source-agent-qualifier.js +16 -16
- package/dist/{storage-D1apCiCS.d.ts → storage-V--MQi7w.d.ts} +1 -1
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +11 -11
- package/dist/summarizer.d.ts +1 -1
- package/dist/summary-snapshot.d.ts +1 -1
- package/dist/temporal-supersession.d.ts +13 -2
- package/dist/temporal-supersession.js +1 -1
- 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/{tier-stats-OPTSBNRH.js → tier-stats-2JCZYEF7.js} +5 -5
- package/dist/topics.d.ts +1 -1
- package/dist/transcript.d.ts +1 -1
- package/dist/transfer/autodetect.js +1 -1
- package/dist/transfer/backup.js +2 -2
- package/dist/transfer/capsule-export.js +3 -3
- package/dist/transfer/capsule-import.js +5 -5
- package/dist/transfer/types.d.ts +66 -66
- package/dist/trust-score-stage.d.ts +1 -1
- package/dist/trust-score.d.ts +1 -1
- package/dist/trust-zones.js +2 -2
- package/dist/{types-D_Au9qJO.d.ts → types-D_a6Sqjz.d.ts} +25 -8
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/dist/utility-learner.js +3 -3
- package/dist/utility-runtime.d.ts +1 -1
- package/dist/utility-runtime.js +4 -4
- package/dist/utility-telemetry.js +2 -2
- package/dist/verified-recall.js +12 -12
- package/dist/work-product-ledger.js +2 -2
- package/dist/write-envelope.d.ts +1 -1
- package/dist/write-envelope.js +2 -2
- package/package.json +32 -2
- package/src/abstraction-nodes.ts +182 -4
- package/src/causal-trajectory.ts +258 -3
- package/src/cli/harmonic-search.ts +23 -0
- package/src/cli/research-status-commands.ts +2 -1
- package/src/cli.ts +1 -24
- package/src/coding/pre-action-gate.test.ts +516 -0
- package/src/coding/pre-action-gate.ts +320 -0
- package/src/config.test.ts +85 -0
- package/src/config.ts +2 -0
- package/src/cue-anchors.test.ts +90 -0
- package/src/cue-anchors.ts +264 -11
- package/src/dependency-frontmatter.test.ts +83 -0
- package/src/dependency-propagation-config.ts +94 -0
- package/src/deterministic-order.ts +14 -0
- package/src/extraction-normalization.ts +71 -0
- package/src/extraction-prompt.ts +45 -11
- package/src/extraction.ts +48 -32
- package/src/faithfulness-graph-guard.test.ts +27 -0
- package/src/harmonic-construction.test.ts +1799 -0
- package/src/harmonic-construction.ts +367 -0
- package/src/harmonic-retrieval.ts +166 -25
- package/src/index.ts +4 -5
- package/src/json-store.ts +354 -12
- package/src/orchestration/consolidation-run.ts +192 -0
- package/src/orchestration/contradiction-linking-coordinator.ts +35 -1
- package/src/orchestration/dependency-propagation-triggers.test.ts +286 -0
- package/src/orchestration/dependency-propagation.test.ts +487 -0
- package/src/orchestration/dependency-propagation.ts +263 -0
- package/src/orchestration/dependency-revalidation.ts +173 -0
- package/src/orchestration/extraction-persist-deps.ts +93 -0
- package/src/orchestration/extraction-persist.ts +101 -94
- package/src/orchestration/harmonic-construction-persist.ts +86 -0
- package/src/orchestration/recall-internal.ts +1 -0
- package/src/orchestrator.ts +2 -1
- package/src/schemas.ts +15 -0
- package/src/storage.ts +14 -0
- package/src/temporal-supersession.ts +29 -1
- package/src/testing/orchestrator-lite.ts +27 -8
- package/src/testing/subjects/extraction-lifecycle.test.ts +91 -50
- package/src/types.ts +22 -7
- package/dist/chunk-3S63QIFQ.js.map +0 -1
- package/dist/chunk-CMQZNEIF.js.map +0 -1
- package/dist/chunk-DNHVPZOD.js.map +0 -1
- package/dist/chunk-EY64JLOM.js.map +0 -1
- package/dist/chunk-FZZ2QTJI.js +0 -111
- package/dist/chunk-FZZ2QTJI.js.map +0 -1
- package/dist/chunk-IZANPXMV.js.map +0 -1
- package/dist/chunk-J7T4MX7P.js.map +0 -1
- package/dist/chunk-KVJRXN2E.js.map +0 -1
- package/dist/chunk-LPSF4OQH.js +0 -47
- package/dist/chunk-LPSF4OQH.js.map +0 -1
- package/dist/chunk-LZGCJSQR.js.map +0 -1
- package/dist/chunk-OADWQ5CR.js +0 -115
- package/dist/chunk-OADWQ5CR.js.map +0 -1
- package/dist/chunk-RN53QBM4.js.map +0 -1
- package/dist/chunk-W4FBGYGK.js.map +0 -1
- package/dist/chunk-YQIVWS7Y.js.map +0 -1
- /package/dist/{auto-sync-7O6RP2RT.js.map → auto-sync-QFQGOEO2.js.map} +0 -0
- /package/dist/{capsule-crypto-YO5QJ6L3.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
- /package/dist/{capsule-merge-6GFHWECG.js.map → capsule-merge-KXTRZ23Z.js.map} +0 -0
- /package/dist/{chunk-ICP53SKG.js.map → chunk-2HIJHXB3.js.map} +0 -0
- /package/dist/{chunk-BXLOS5AJ.js.map → chunk-2NLLXCJG.js.map} +0 -0
- /package/dist/{chunk-5JRC6BYS.js.map → chunk-47J4EDGR.js.map} +0 -0
- /package/dist/{chunk-2VHLLPTX.js.map → chunk-4EABKPZS.js.map} +0 -0
- /package/dist/{chunk-RJV6Q2FT.js.map → chunk-4JWJMRPJ.js.map} +0 -0
- /package/dist/{chunk-MXPB6PJQ.js.map → chunk-4S3ECH3U.js.map} +0 -0
- /package/dist/{chunk-CGASUJVP.js.map → chunk-5V6IXHPI.js.map} +0 -0
- /package/dist/{chunk-R5IGA2NH.js.map → chunk-5XCN4XBU.js.map} +0 -0
- /package/dist/{chunk-2RPJ4NEE.js.map → chunk-64BHFFKZ.js.map} +0 -0
- /package/dist/{chunk-FQC3DHH2.js.map → chunk-66SE3BNH.js.map} +0 -0
- /package/dist/{chunk-TERNBNJB.js.map → chunk-6FC3IZ26.js.map} +0 -0
- /package/dist/{chunk-K7VKAHFE.js.map → chunk-6XGEBQ3R.js.map} +0 -0
- /package/dist/{chunk-JFLOOTXU.js.map → chunk-7BLWBSRL.js.map} +0 -0
- /package/dist/{chunk-ABR2HEJO.js.map → chunk-7NDM2PNK.js.map} +0 -0
- /package/dist/{chunk-JXZ7NLYH.js.map → chunk-7VWZ4LRW.js.map} +0 -0
- /package/dist/{chunk-R6YJI3HE.js.map → chunk-AW4QUFQF.js.map} +0 -0
- /package/dist/{chunk-P65YJEEL.js.map → chunk-AXFWMRKI.js.map} +0 -0
- /package/dist/{chunk-WG5HSQ4P.js.map → chunk-BAKXNQ3C.js.map} +0 -0
- /package/dist/{chunk-NM2WP3B7.js.map → chunk-BJYET5TX.js.map} +0 -0
- /package/dist/{chunk-HLKPRWF4.js.map → chunk-DATDLJAO.js.map} +0 -0
- /package/dist/{chunk-DX3XRGLH.js.map → chunk-DQTCGVFK.js.map} +0 -0
- /package/dist/{chunk-IPBNC77A.js.map → chunk-E633OXMH.js.map} +0 -0
- /package/dist/{chunk-Z5UC3OKB.js.map → chunk-ELQCS47S.js.map} +0 -0
- /package/dist/{chunk-FMXJ555A.js.map → chunk-EURCX6PS.js.map} +0 -0
- /package/dist/{chunk-MZZR3J6M.js.map → chunk-FV7YQTN3.js.map} +0 -0
- /package/dist/{chunk-3R6D33UF.js.map → chunk-GGBSF2X7.js.map} +0 -0
- /package/dist/{chunk-SYUBB3WM.js.map → chunk-GKEYXXKX.js.map} +0 -0
- /package/dist/{chunk-5AGR7SAI.js.map → chunk-GSEPRIZC.js.map} +0 -0
- /package/dist/{chunk-UTVZKHJK.js.map → chunk-GUKBW4HL.js.map} +0 -0
- /package/dist/{chunk-2F6NP3NT.js.map → chunk-HDQUQBPW.js.map} +0 -0
- /package/dist/{chunk-6HMYUWXR.js.map → chunk-HTP6XRUI.js.map} +0 -0
- /package/dist/{chunk-UYUYZ4WY.js.map → chunk-IARXXZU4.js.map} +0 -0
- /package/dist/{chunk-MNB5RMAY.js.map → chunk-IIFFC3RL.js.map} +0 -0
- /package/dist/{chunk-VDX2J7OX.js.map → chunk-IPLYGWQF.js.map} +0 -0
- /package/dist/{chunk-NZBZ7IS2.js.map → chunk-JDCQK3C5.js.map} +0 -0
- /package/dist/{chunk-C3KVFJH5.js.map → chunk-JI62YGPI.js.map} +0 -0
- /package/dist/{chunk-LULR4IUW.js.map → chunk-KATEWTQJ.js.map} +0 -0
- /package/dist/{chunk-BMCHFWGX.js.map → chunk-KMWYZTIE.js.map} +0 -0
- /package/dist/{chunk-JGSKJHF7.js.map → chunk-KQS72GCR.js.map} +0 -0
- /package/dist/{chunk-2RIWJUSQ.js.map → chunk-LQKXVQZR.js.map} +0 -0
- /package/dist/{chunk-LQL7ARIC.js.map → chunk-LTOAJXZB.js.map} +0 -0
- /package/dist/{chunk-QKD65RGL.js.map → chunk-LYMNZZIM.js.map} +0 -0
- /package/dist/{chunk-3PY7VHV7.js.map → chunk-MCA2X4WH.js.map} +0 -0
- /package/dist/{chunk-S5NZBKKQ.js.map → chunk-N3CXAYPJ.js.map} +0 -0
- /package/dist/{chunk-WQIHRA5F.js.map → chunk-N3LL5NEU.js.map} +0 -0
- /package/dist/{chunk-Z4U6U3M3.js.map → chunk-NKL25FCF.js.map} +0 -0
- /package/dist/{chunk-LMDRGRJ2.js.map → chunk-NOB2T2FC.js.map} +0 -0
- /package/dist/{chunk-P2OTGMTR.js.map → chunk-NSGU76YO.js.map} +0 -0
- /package/dist/{chunk-L6DCVUCA.js.map → chunk-O76MWTVS.js.map} +0 -0
- /package/dist/{chunk-WZFAPHIK.js.map → chunk-OIOZ6MOP.js.map} +0 -0
- /package/dist/{chunk-UMOO7IY7.js.map → chunk-P2KBDJJ6.js.map} +0 -0
- /package/dist/{chunk-SXWHN7GC.js.map → chunk-PDEKQWDV.js.map} +0 -0
- /package/dist/{chunk-ENEA47UC.js.map → chunk-PLCHU56K.js.map} +0 -0
- /package/dist/{chunk-IXPKESVP.js.map → chunk-PWIMF7LP.js.map} +0 -0
- /package/dist/{chunk-RHTO4HTL.js.map → chunk-PWLB4TRK.js.map} +0 -0
- /package/dist/{chunk-RVYVMQK4.js.map → chunk-QSYL5CXK.js.map} +0 -0
- /package/dist/{chunk-B6KGGRUL.js.map → chunk-QWLW3VQH.js.map} +0 -0
- /package/dist/{chunk-JBPKEARU.js.map → chunk-RKNJBZ55.js.map} +0 -0
- /package/dist/{chunk-QCECHYZL.js.map → chunk-RVO6TCTU.js.map} +0 -0
- /package/dist/{chunk-SHDZNSK4.js.map → chunk-S2SJEOTM.js.map} +0 -0
- /package/dist/{chunk-ULWHRQEQ.js.map → chunk-S75UQ3T3.js.map} +0 -0
- /package/dist/{chunk-LXOM6IQU.js.map → chunk-SEF4IOFE.js.map} +0 -0
- /package/dist/{chunk-I3YHVVT4.js.map → chunk-SHYIMIX5.js.map} +0 -0
- /package/dist/{chunk-G5OB4XZX.js.map → chunk-VANZKHTN.js.map} +0 -0
- /package/dist/{chunk-I4TQST3L.js.map → chunk-VFS3MK5F.js.map} +0 -0
- /package/dist/{chunk-SMPVHGHG.js.map → chunk-WPZX7MEA.js.map} +0 -0
- /package/dist/{chunk-ZRWB5D4H.js.map → chunk-WT6UL3UA.js.map} +0 -0
- /package/dist/{chunk-DQEMWVMT.js.map → chunk-X7Y7WX73.js.map} +0 -0
- /package/dist/{chunk-JHMAYABJ.js.map → chunk-XL3TATMJ.js.map} +0 -0
- /package/dist/{chunk-MC6XO7T4.js.map → chunk-YLBE6PLR.js.map} +0 -0
- /package/dist/{chunk-OLX2HJFW.js.map → chunk-YLHM5BQQ.js.map} +0 -0
- /package/dist/{chunk-EZ25VE3G.js.map → chunk-YNDLCWXS.js.map} +0 -0
- /package/dist/{chunk-GF22HWS2.js.map → chunk-Z54EM5YZ.js.map} +0 -0
- /package/dist/{chunk-GVX3NAUU.js.map → chunk-ZDAYWJV6.js.map} +0 -0
- /package/dist/{chunk-EYAIZBLM.js.map → chunk-ZJIFYUJI.js.map} +0 -0
- /package/dist/{chunk-CNQQMB67.js.map → chunk-ZN4EYMKJ.js.map} +0 -0
- /package/dist/{resolution-3K27T4VO.js.map → coding/pre-action-gate.js.map} +0 -0
- /package/dist/{first-start-migration-ZSHEFEI3.js.map → first-start-migration-626C5554.js.map} +0 -0
- /package/dist/{forget-DNAJ66ZD.js.map → forget-GJ42LCBW.js.map} +0 -0
- /package/dist/{tier-stats-OPTSBNRH.js.map → tier-stats-2JCZYEF7.js.map} +0 -0
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import {
|
|
4
|
+
readCausalTrajectoryRecordsStrict,
|
|
5
|
+
readCausalTrajectoryRevisionToken,
|
|
6
|
+
resolveCausalTrajectoryStoreDir,
|
|
7
|
+
type ActionIntent,
|
|
8
|
+
type ActionStrategyId,
|
|
9
|
+
type CausalTrajectoryRecord,
|
|
10
|
+
type CausalTrajectoryStrictReadResult,
|
|
11
|
+
type EditKind,
|
|
12
|
+
} from "../causal-trajectory.js";
|
|
13
|
+
import type { CodingContext } from "../types.js";
|
|
14
|
+
|
|
15
|
+
export const PRE_ACTION_FINGERPRINT_VERSION = 1;
|
|
16
|
+
export const PRE_ACTION_WARNING_VERSION = 1;
|
|
17
|
+
export const PRE_ACTION_GATE_DEFAULT_TIMEOUT_MS = 50;
|
|
18
|
+
|
|
19
|
+
export type PreActionGateStatus = "NO_MATCH" | "MATCH_WARN" | "ERROR_FAIL_OPEN";
|
|
20
|
+
|
|
21
|
+
export interface PreActionGateRequest {
|
|
22
|
+
sessionKey: string;
|
|
23
|
+
strategyId: ActionStrategyId;
|
|
24
|
+
intent: ActionIntent;
|
|
25
|
+
codingContext: CodingContext;
|
|
26
|
+
memoryDir?: string;
|
|
27
|
+
causalTrajectoryStoreDir?: string;
|
|
28
|
+
signal?: AbortSignal;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface PreActionGateResult {
|
|
32
|
+
status: PreActionGateStatus;
|
|
33
|
+
reason?: string;
|
|
34
|
+
advisoryText?: string;
|
|
35
|
+
fingerprint?: string;
|
|
36
|
+
matchedTrajectoryId?: string;
|
|
37
|
+
revision?: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface NormalizedActionIntent {
|
|
41
|
+
kind: "command" | "edit";
|
|
42
|
+
strategyId: ActionStrategyId;
|
|
43
|
+
fingerprint: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface PreActionGateDependencies {
|
|
47
|
+
readStrict?: (options: {
|
|
48
|
+
memoryDir: string;
|
|
49
|
+
causalTrajectoryStoreDir?: string;
|
|
50
|
+
signal?: AbortSignal;
|
|
51
|
+
}) => Promise<CausalTrajectoryStrictReadResult>;
|
|
52
|
+
getRevision?: (options: {
|
|
53
|
+
memoryDir: string;
|
|
54
|
+
causalTrajectoryStoreDir?: string;
|
|
55
|
+
}) => Promise<string>;
|
|
56
|
+
clock?: () => number;
|
|
57
|
+
maxCacheSize?: number;
|
|
58
|
+
timeoutMs?: number;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const ACTION_STRATEGIES: ReadonlySet<ActionStrategyId> = new Set([
|
|
62
|
+
"RUN_CHECK",
|
|
63
|
+
"CHANGE_IMPLEMENTATION",
|
|
64
|
+
"CHANGE_TEST",
|
|
65
|
+
"CHANGE_CONFIGURATION",
|
|
66
|
+
"CHANGE_DEPENDENCY",
|
|
67
|
+
"INVALIDATE_CACHE",
|
|
68
|
+
"RETRY_ACTION",
|
|
69
|
+
"INSPECT_STATE",
|
|
70
|
+
]);
|
|
71
|
+
const EDIT_KINDS: ReadonlySet<EditKind> = new Set(["create", "update", "delete", "rename"]);
|
|
72
|
+
const MAX_COMMAND_CHARS = 128;
|
|
73
|
+
const MAX_ARGUMENTS = 32;
|
|
74
|
+
const MAX_ARGUMENT_CHARS = 128;
|
|
75
|
+
const MAX_PATH_CHARS = 512;
|
|
76
|
+
const MAX_SLOT_CHARS = 128;
|
|
77
|
+
const MAX_CITATION_CHARS = 180;
|
|
78
|
+
|
|
79
|
+
function bound(value: string, max: number, field: string): string {
|
|
80
|
+
const normalized = value.trim();
|
|
81
|
+
if (normalized.length > max) throw new Error(`${field} exceeds ${max} characters`);
|
|
82
|
+
return normalized;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function sanitizePayloadString(input: string): string {
|
|
86
|
+
return input
|
|
87
|
+
.replace(/(?:\/home\/[^\s/]+|\/Users\/[^\s/]+|[A-Za-z]:\\Users\\[^\s\\]+)/g, "$HOME")
|
|
88
|
+
.replace(/sk-[a-zA-Z0-9_-]{10,}/g, "<secret>")
|
|
89
|
+
.replace(/bearer\s+[a-zA-Z0-9._-]+/gi, "bearer <secret>")
|
|
90
|
+
.trim();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function normalizeRepositoryPath(filePath: string, codingContext: CodingContext): string {
|
|
94
|
+
const root = path.resolve(codingContext.rootPath);
|
|
95
|
+
const absolute = path.isAbsolute(filePath) ? path.resolve(filePath) : path.resolve(root, filePath);
|
|
96
|
+
const relative = path.relative(root, absolute);
|
|
97
|
+
if (relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
|
|
98
|
+
throw new Error("edit path must be contained by codingContext.rootPath");
|
|
99
|
+
}
|
|
100
|
+
return bound(relative.split(path.sep).join("/"), MAX_PATH_CHARS, "repo-relative path");
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function normalizeCommandArgument(
|
|
104
|
+
argument: string,
|
|
105
|
+
codingContext: CodingContext,
|
|
106
|
+
secretValue: boolean,
|
|
107
|
+
): string {
|
|
108
|
+
const value = bound(sanitizePayloadString(argument), MAX_ARGUMENT_CHARS, "command argument");
|
|
109
|
+
if (secretValue || value.includes("<secret>")) return "<secret>";
|
|
110
|
+
if (/^--(?:token|key|secret|password|authorization)=/i.test(value)) {
|
|
111
|
+
return `${value.slice(0, value.indexOf("=") + 1)}<secret>`;
|
|
112
|
+
}
|
|
113
|
+
if (/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)) return "<uuid>";
|
|
114
|
+
if (/^[0-9a-f]{7,64}$/i.test(value)) return "<sha>";
|
|
115
|
+
if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z$/.test(value)) return "<timestamp>";
|
|
116
|
+
if (/^\d+(?:\.\d+)?(?:ms|s|m|h|d)$/.test(value)) return "<duration>";
|
|
117
|
+
if (/^-?\d+(?:\.\d+)?$/.test(value)) return "<number>";
|
|
118
|
+
const pathLike = path.isAbsolute(value)
|
|
119
|
+
|| (!/^[a-z][a-z0-9+.-]*:\/\//i.test(value) && /[\\/]/.test(value) && !value.startsWith("--"));
|
|
120
|
+
if (pathLike) {
|
|
121
|
+
let relative: string;
|
|
122
|
+
try {
|
|
123
|
+
relative = normalizeRepositoryPath(value, codingContext);
|
|
124
|
+
} catch {
|
|
125
|
+
return "<external-path>";
|
|
126
|
+
}
|
|
127
|
+
return /(?:^|\/)(?:tmp|temp)(?:\/|$)|\.tmp$/i.test(relative)
|
|
128
|
+
? `<repo-temp-path:${relative}>`
|
|
129
|
+
: `<repo-path:${relative}>`;
|
|
130
|
+
}
|
|
131
|
+
return value;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export function normalizeActionIntent(
|
|
135
|
+
intent: ActionIntent,
|
|
136
|
+
strategyId: ActionStrategyId,
|
|
137
|
+
codingContext: CodingContext,
|
|
138
|
+
): NormalizedActionIntent {
|
|
139
|
+
if (!ACTION_STRATEGIES.has(strategyId)) throw new Error(`unsupported action strategy: ${strategyId}`);
|
|
140
|
+
|
|
141
|
+
let payload: string;
|
|
142
|
+
if (intent.kind === "command") {
|
|
143
|
+
const command = bound(sanitizePayloadString(intent.command), MAX_COMMAND_CHARS, "command");
|
|
144
|
+
const args = intent.args ?? [];
|
|
145
|
+
if (args.length > MAX_ARGUMENTS) throw new Error(`command args exceed ${MAX_ARGUMENTS} entries`);
|
|
146
|
+
const normalizedArgs = args.map((argument, index) => {
|
|
147
|
+
const prior = index > 0 ? args[index - 1] : undefined;
|
|
148
|
+
const secretValue = prior !== undefined
|
|
149
|
+
&& /^--(?:token|key|secret|password|authorization)$/i.test(prior);
|
|
150
|
+
return normalizeCommandArgument(argument, codingContext, secretValue);
|
|
151
|
+
});
|
|
152
|
+
payload = JSON.stringify({ kind: "command", strategyId, command, args: normalizedArgs });
|
|
153
|
+
} else if (intent.kind === "edit") {
|
|
154
|
+
if (!EDIT_KINDS.has(intent.editKind)) throw new Error(`unsupported edit kind: ${intent.editKind}`);
|
|
155
|
+
const relativePath = normalizeRepositoryPath(intent.filePath, codingContext);
|
|
156
|
+
payload = JSON.stringify({
|
|
157
|
+
kind: "edit",
|
|
158
|
+
strategyId,
|
|
159
|
+
filePath: relativePath,
|
|
160
|
+
editKind: intent.editKind,
|
|
161
|
+
symbol: intent.symbol ? bound(intent.symbol, MAX_SLOT_CHARS, "symbol") : undefined,
|
|
162
|
+
range: intent.range ? bound(intent.range, MAX_SLOT_CHARS, "range") : undefined,
|
|
163
|
+
diffShape: intent.diffShape ? bound(intent.diffShape, MAX_SLOT_CHARS, "diffShape") : undefined,
|
|
164
|
+
});
|
|
165
|
+
} else {
|
|
166
|
+
throw new Error("action intent kind must be command or edit");
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return {
|
|
170
|
+
kind: intent.kind,
|
|
171
|
+
strategyId,
|
|
172
|
+
fingerprint: `v1:sha256:${createHash("sha256").update(payload).digest("hex")}`,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function matchTrajectory(
|
|
177
|
+
record: CausalTrajectoryRecord,
|
|
178
|
+
projectId: string,
|
|
179
|
+
normalized: NormalizedActionIntent,
|
|
180
|
+
): boolean {
|
|
181
|
+
const identity = record.actionIdentity;
|
|
182
|
+
return record.outcomeKind === "failure"
|
|
183
|
+
&& record.codingContext?.projectId === projectId
|
|
184
|
+
&& identity?.fingerprintVersion === PRE_ACTION_FINGERPRINT_VERSION
|
|
185
|
+
&& identity.strategyId === normalized.strategyId
|
|
186
|
+
&& identity.fingerprint === normalized.fingerprint;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function boundedCitation(value: string | undefined, fallback: string): string {
|
|
190
|
+
const sanitized = sanitizePayloadString(value ?? fallback).replace(/\s+/g, " ");
|
|
191
|
+
return sanitized.slice(0, MAX_CITATION_CHARS);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
export class PreActionFailureGate {
|
|
195
|
+
private readonly cache = new Map<string, PreActionGateResult>();
|
|
196
|
+
private readonly maxCacheSize: number;
|
|
197
|
+
private readonly readStrict: NonNullable<PreActionGateDependencies["readStrict"]>;
|
|
198
|
+
private readonly getRevision: NonNullable<PreActionGateDependencies["getRevision"]>;
|
|
199
|
+
private readonly clock: () => number;
|
|
200
|
+
private readonly timeoutMs: number;
|
|
201
|
+
|
|
202
|
+
constructor(deps: PreActionGateDependencies = {}) {
|
|
203
|
+
this.readStrict = deps.readStrict ?? readCausalTrajectoryRecordsStrict;
|
|
204
|
+
this.getRevision = deps.getRevision ?? readCausalTrajectoryRevisionToken;
|
|
205
|
+
this.clock = deps.clock ?? Date.now;
|
|
206
|
+
this.maxCacheSize = deps.maxCacheSize ?? 500;
|
|
207
|
+
this.timeoutMs = Math.max(1, deps.timeoutMs ?? PRE_ACTION_GATE_DEFAULT_TIMEOUT_MS);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
public clearCache(): void {
|
|
211
|
+
this.cache.clear();
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
async evaluate(request: PreActionGateRequest): Promise<PreActionGateResult> {
|
|
215
|
+
const deadline = this.clock() + this.timeoutMs;
|
|
216
|
+
const controller = new AbortController();
|
|
217
|
+
const abortFromExternal = () => controller.abort();
|
|
218
|
+
request.signal?.addEventListener("abort", abortFromExternal, { once: true });
|
|
219
|
+
if (request.signal?.aborted) controller.abort();
|
|
220
|
+
|
|
221
|
+
let resolveTimeout!: (result: PreActionGateResult) => void;
|
|
222
|
+
const timeoutPromise = new Promise<PreActionGateResult>((resolve) => {
|
|
223
|
+
resolveTimeout = resolve;
|
|
224
|
+
});
|
|
225
|
+
const timer = setTimeout(() => {
|
|
226
|
+
controller.abort();
|
|
227
|
+
resolveTimeout({ status: "ERROR_FAIL_OPEN", reason: `PreActionFailureGate timed out after ${this.timeoutMs}ms` });
|
|
228
|
+
}, this.timeoutMs);
|
|
229
|
+
|
|
230
|
+
try {
|
|
231
|
+
return await Promise.race([
|
|
232
|
+
this.evaluateInternal(request, controller.signal, deadline),
|
|
233
|
+
timeoutPromise,
|
|
234
|
+
]);
|
|
235
|
+
} catch (error) {
|
|
236
|
+
return { status: "ERROR_FAIL_OPEN", reason: error instanceof Error ? error.message : String(error) };
|
|
237
|
+
} finally {
|
|
238
|
+
clearTimeout(timer);
|
|
239
|
+
request.signal?.removeEventListener("abort", abortFromExternal);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
private async evaluateInternal(
|
|
244
|
+
request: PreActionGateRequest,
|
|
245
|
+
signal: AbortSignal,
|
|
246
|
+
deadline: number,
|
|
247
|
+
): Promise<PreActionGateResult> {
|
|
248
|
+
if (!request.memoryDir?.trim()) return { status: "ERROR_FAIL_OPEN", reason: "memoryDir is required" };
|
|
249
|
+
if (!request.sessionKey?.trim()) return { status: "ERROR_FAIL_OPEN", reason: "sessionKey is required" };
|
|
250
|
+
if (!request.codingContext?.projectId?.trim() || !request.codingContext.rootPath?.trim()) {
|
|
251
|
+
return { status: "ERROR_FAIL_OPEN", reason: "codingContext with projectId and rootPath is required" };
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
let normalized: NormalizedActionIntent;
|
|
255
|
+
try {
|
|
256
|
+
normalized = normalizeActionIntent(request.intent, request.strategyId, request.codingContext);
|
|
257
|
+
} catch (error) {
|
|
258
|
+
return { status: "ERROR_FAIL_OPEN", reason: error instanceof Error ? error.message : String(error) };
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
const revisionOptions = {
|
|
262
|
+
memoryDir: request.memoryDir,
|
|
263
|
+
causalTrajectoryStoreDir: request.causalTrajectoryStoreDir,
|
|
264
|
+
};
|
|
265
|
+
const preRevision = await this.getRevision(revisionOptions);
|
|
266
|
+
const branch = request.codingContext.branch ?? "";
|
|
267
|
+
const storeId = createHash("sha256")
|
|
268
|
+
.update(resolveCausalTrajectoryStoreDir(request.memoryDir, request.causalTrajectoryStoreDir))
|
|
269
|
+
.digest("hex");
|
|
270
|
+
const cacheKey = createHash("sha256").update(JSON.stringify([
|
|
271
|
+
request.codingContext.projectId,
|
|
272
|
+
branch,
|
|
273
|
+
request.sessionKey,
|
|
274
|
+
PRE_ACTION_FINGERPRINT_VERSION,
|
|
275
|
+
preRevision,
|
|
276
|
+
normalized.fingerprint,
|
|
277
|
+
storeId,
|
|
278
|
+
])).digest("hex");
|
|
279
|
+
const cached = this.cache.get(cacheKey);
|
|
280
|
+
if (cached) return cached;
|
|
281
|
+
|
|
282
|
+
if (signal.aborted || this.clock() >= deadline) return { status: "ERROR_FAIL_OPEN", reason: "deadline exceeded" };
|
|
283
|
+
const scan = await this.readStrict({ ...revisionOptions, signal });
|
|
284
|
+
if (signal.aborted || this.clock() >= deadline) return { status: "ERROR_FAIL_OPEN", reason: "deadline exceeded" };
|
|
285
|
+
if (scan.invalidTrajectories.length > 0) {
|
|
286
|
+
return { status: "ERROR_FAIL_OPEN", reason: `store contains ${scan.invalidTrajectories.length} invalid record(s)` };
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
const postRevision = await this.getRevision(revisionOptions);
|
|
290
|
+
const stableRevision = preRevision === postRevision;
|
|
291
|
+
const match = scan.trajectories
|
|
292
|
+
.filter((record) => matchTrajectory(record, request.codingContext.projectId, normalized))
|
|
293
|
+
.sort((left, right) => {
|
|
294
|
+
const recordedAtOrder = right.recordedAt.localeCompare(left.recordedAt);
|
|
295
|
+
return recordedAtOrder !== 0
|
|
296
|
+
? recordedAtOrder
|
|
297
|
+
: left.trajectoryId.localeCompare(right.trajectoryId);
|
|
298
|
+
})[0];
|
|
299
|
+
const result: PreActionGateResult = match
|
|
300
|
+
? {
|
|
301
|
+
status: "MATCH_WARN",
|
|
302
|
+
advisoryText: `[PreActionFailureGate ${PRE_ACTION_WARNING_VERSION}] A similar action failed before. Prior act: "${boundedCitation(match.actionSummary, "recorded action")}". Failure: "${boundedCitation(match.outcomeSummary, "recorded failure")}". Next safe check: "${boundedCitation(match.followUpSummary, "verify prerequisites before retrying")}".`,
|
|
303
|
+
fingerprint: normalized.fingerprint,
|
|
304
|
+
matchedTrajectoryId: match.trajectoryId,
|
|
305
|
+
revision: postRevision,
|
|
306
|
+
}
|
|
307
|
+
: { status: "NO_MATCH", fingerprint: normalized.fingerprint, revision: postRevision };
|
|
308
|
+
|
|
309
|
+
if (stableRevision && !signal.aborted && this.clock() < deadline) this.setCache(cacheKey, result);
|
|
310
|
+
return result;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
private setCache(key: string, result: PreActionGateResult): void {
|
|
314
|
+
if (this.cache.size >= this.maxCacheSize) {
|
|
315
|
+
const oldest = this.cache.keys().next().value;
|
|
316
|
+
if (oldest !== undefined) this.cache.delete(oldest);
|
|
317
|
+
}
|
|
318
|
+
this.cache.set(key, result);
|
|
319
|
+
}
|
|
320
|
+
}
|
package/src/config.test.ts
CHANGED
|
@@ -1474,6 +1474,7 @@ test("parseConfig codingKnowledge: accepts CLI-style boolean strings (CLAUDE.md
|
|
|
1474
1474
|
assert.equal(result.codingKnowledge.architectureCardLlmSummary, true);
|
|
1475
1475
|
});
|
|
1476
1476
|
|
|
1477
|
+
|
|
1477
1478
|
test("parseConfig codingKnowledge: rejects unknown structuralProvider value (rule 51)", () => {
|
|
1478
1479
|
assert.throws(
|
|
1479
1480
|
() =>
|
|
@@ -1609,6 +1610,90 @@ test("parseConfig: non-array patternReinforcementCategories falls back to defaul
|
|
|
1609
1610
|
]);
|
|
1610
1611
|
});
|
|
1611
1612
|
|
|
1613
|
+
test("parseConfig: dependency propagation defaults stay disabled and bounded", () => {
|
|
1614
|
+
const result = parseConfig({ openaiApiKey: "sk-test" });
|
|
1615
|
+
assert.deepEqual(result.dependencyPropagation, {
|
|
1616
|
+
enabled: false,
|
|
1617
|
+
linkTypes: ["supports", "follows"],
|
|
1618
|
+
maxDependents: 10,
|
|
1619
|
+
timeoutMs: 20_000,
|
|
1620
|
+
dryRun: false,
|
|
1621
|
+
});
|
|
1622
|
+
});
|
|
1623
|
+
|
|
1624
|
+
test("parseConfig: dependency propagation accepts documented overrides", () => {
|
|
1625
|
+
const result = parseConfig({
|
|
1626
|
+
openaiApiKey: "sk-test",
|
|
1627
|
+
dependencyPropagation: {
|
|
1628
|
+
enabled: "true",
|
|
1629
|
+
linkTypes: ["references", "supports", "references"],
|
|
1630
|
+
maxDependents: "0",
|
|
1631
|
+
timeoutMs: "2500",
|
|
1632
|
+
dryRun: "yes",
|
|
1633
|
+
},
|
|
1634
|
+
});
|
|
1635
|
+
|
|
1636
|
+
assert.deepEqual(result.dependencyPropagation, {
|
|
1637
|
+
enabled: true,
|
|
1638
|
+
linkTypes: ["references", "supports"],
|
|
1639
|
+
maxDependents: 0,
|
|
1640
|
+
timeoutMs: 2_500,
|
|
1641
|
+
dryRun: true,
|
|
1642
|
+
});
|
|
1643
|
+
});
|
|
1644
|
+
|
|
1645
|
+
test("parseConfig: dependency propagation honors every documented falsy string", () => {
|
|
1646
|
+
for (const value of ["false", "0", "no", "off"]) {
|
|
1647
|
+
const result = parseConfig({
|
|
1648
|
+
openaiApiKey: "sk-test",
|
|
1649
|
+
dependencyPropagation: { enabled: value, dryRun: value },
|
|
1650
|
+
});
|
|
1651
|
+
assert.equal(result.dependencyPropagation.enabled, false, `${value} must disable propagation`);
|
|
1652
|
+
assert.equal(result.dependencyPropagation.dryRun, false, `${value} must disable dry run`);
|
|
1653
|
+
}
|
|
1654
|
+
});
|
|
1655
|
+
|
|
1656
|
+
test("parseConfig: dependency propagation rejects invalid integers", () => {
|
|
1657
|
+
for (const maxDependents of ["abc", 3.7, -1]) {
|
|
1658
|
+
assert.throws(
|
|
1659
|
+
() =>
|
|
1660
|
+
parseConfig({
|
|
1661
|
+
openaiApiKey: "sk-test",
|
|
1662
|
+
dependencyPropagation: { maxDependents },
|
|
1663
|
+
}),
|
|
1664
|
+
/dependencyPropagation\.maxDependents must be a non-negative integer/,
|
|
1665
|
+
);
|
|
1666
|
+
}
|
|
1667
|
+
|
|
1668
|
+
assert.throws(
|
|
1669
|
+
() =>
|
|
1670
|
+
parseConfig({
|
|
1671
|
+
openaiApiKey: "sk-test",
|
|
1672
|
+
dependencyPropagation: { timeoutMs: 0 },
|
|
1673
|
+
}),
|
|
1674
|
+
/dependencyPropagation\.timeoutMs must be a positive integer/,
|
|
1675
|
+
);
|
|
1676
|
+
});
|
|
1677
|
+
|
|
1678
|
+
test("parseConfig: dependency propagation rejects invalid link types and shapes", () => {
|
|
1679
|
+
assert.throws(
|
|
1680
|
+
() =>
|
|
1681
|
+
parseConfig({
|
|
1682
|
+
openaiApiKey: "sk-test",
|
|
1683
|
+
dependencyPropagation: { linkTypes: ["supports", "related"] },
|
|
1684
|
+
}),
|
|
1685
|
+
/dependencyPropagation\.linkTypes must contain only supports, follows, references/,
|
|
1686
|
+
);
|
|
1687
|
+
assert.throws(
|
|
1688
|
+
() =>
|
|
1689
|
+
parseConfig({
|
|
1690
|
+
openaiApiKey: "sk-test",
|
|
1691
|
+
dependencyPropagation: { linkTypes: "supports" },
|
|
1692
|
+
}),
|
|
1693
|
+
/dependencyPropagation\.linkTypes must be an array/,
|
|
1694
|
+
);
|
|
1695
|
+
});
|
|
1696
|
+
|
|
1612
1697
|
// ── #683 PR 2/N: connectors.googleDrive parsing.
|
|
1613
1698
|
|
|
1614
1699
|
test("parseConfig connectors defaults: googleDrive disabled with empty creds", () => {
|
package/src/config.ts
CHANGED
|
@@ -41,6 +41,7 @@ import { coerceBool, coerceBooleanLike, coerceInstallExtension, coerceNumber } f
|
|
|
41
41
|
import { parseRecallConcurrencyConfig } from "./recall-concurrency-config.js";
|
|
42
42
|
import { parseExtractionLivenessConfig } from "./extraction-liveness.js";
|
|
43
43
|
import { parseReplicaPeersConfig } from "./replica-peers-config.js";
|
|
44
|
+
import { parseDependencyPropagationConfig } from "./dependency-propagation-config.js";
|
|
44
45
|
import { hasLegacyConnectorEntries } from "./connectors/paths.js";
|
|
45
46
|
import {
|
|
46
47
|
parseQmdChunkStrategy,
|
|
@@ -1808,6 +1809,7 @@ export function parseConfig(
|
|
|
1808
1809
|
contradictionAutoResolve: cfg.contradictionAutoResolve !== false,
|
|
1809
1810
|
// Contradiction Scan cron (issue #520)
|
|
1810
1811
|
contradictionScan: parseContradictionScanConfig(cfg.contradictionScan),
|
|
1812
|
+
dependencyPropagation: parseDependencyPropagationConfig(cfg),
|
|
1811
1813
|
// Temporal Supersession (issue #375)
|
|
1812
1814
|
temporalSupersessionEnabled: cfg.temporalSupersessionEnabled !== false, // On by default
|
|
1813
1815
|
temporalSupersessionIncludeInRecall:
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { mkdtemp, readFile, rm } from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import test from "node:test";
|
|
6
|
+
import { upsertAbstractionNode } from "./abstraction-nodes.js";
|
|
7
|
+
import { pruneOrphanCueAnchors, upsertCueAnchor, validateCueAnchor } from "./cue-anchors.js";
|
|
8
|
+
|
|
9
|
+
const RECORDED_AT = "2026-08-08T20:00:00.000Z";
|
|
10
|
+
|
|
11
|
+
function anchor(sourceMemoryIds: string[]) {
|
|
12
|
+
return {
|
|
13
|
+
schemaVersion: 1 as const,
|
|
14
|
+
anchorId: "cue-provenance",
|
|
15
|
+
anchorType: "tool" as const,
|
|
16
|
+
anchorValue: "storage tool",
|
|
17
|
+
normalizedCue: "storage tool",
|
|
18
|
+
recordedAt: RECORDED_AT,
|
|
19
|
+
sessionKey: "session:test",
|
|
20
|
+
nodeRefs: ["node-storage"],
|
|
21
|
+
sourceMemoryIdsByNodeRef: { "node-storage": sourceMemoryIds },
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
test("repeated same-node upserts retain only live node source IDs", async () => {
|
|
26
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-cue-anchor-provenance-upsert-"));
|
|
27
|
+
try {
|
|
28
|
+
await upsertAbstractionNode({
|
|
29
|
+
memoryDir,
|
|
30
|
+
node: {
|
|
31
|
+
schemaVersion: 1,
|
|
32
|
+
nodeId: "node-storage",
|
|
33
|
+
recordedAt: RECORDED_AT,
|
|
34
|
+
sessionKey: "session:test",
|
|
35
|
+
kind: "episode",
|
|
36
|
+
abstractionLevel: "micro",
|
|
37
|
+
title: "Storage episode",
|
|
38
|
+
summary: "The storage episode remains live.",
|
|
39
|
+
sourceMemoryIds: ["mem-0", "mem-1"],
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
let filePath = "";
|
|
44
|
+
for (let index = 0; index < 100; index++) {
|
|
45
|
+
filePath = await upsertCueAnchor({
|
|
46
|
+
memoryDir,
|
|
47
|
+
anchor: anchor([`mem-${index}`, "mem-1", `stale-${index}`]),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const persisted = validateCueAnchor(JSON.parse(await readFile(filePath, "utf8")));
|
|
52
|
+
assert.deepEqual(persisted.sourceMemoryIdsByNodeRef, {
|
|
53
|
+
"node-storage": ["mem-0", "mem-1"],
|
|
54
|
+
});
|
|
55
|
+
} finally {
|
|
56
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test("pruneOrphanCueAnchors trims stale provenance from a live node", async () => {
|
|
61
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-cue-anchor-provenance-prune-"));
|
|
62
|
+
try {
|
|
63
|
+
const anchorPath = await upsertCueAnchor({
|
|
64
|
+
memoryDir,
|
|
65
|
+
anchor: anchor(["mem-keep", "mem-stale"]),
|
|
66
|
+
});
|
|
67
|
+
await upsertAbstractionNode({
|
|
68
|
+
memoryDir,
|
|
69
|
+
node: {
|
|
70
|
+
schemaVersion: 1,
|
|
71
|
+
nodeId: "node-storage",
|
|
72
|
+
recordedAt: RECORDED_AT,
|
|
73
|
+
sessionKey: "session:test",
|
|
74
|
+
kind: "episode",
|
|
75
|
+
abstractionLevel: "micro",
|
|
76
|
+
title: "Storage episode",
|
|
77
|
+
summary: "The storage episode remains live.",
|
|
78
|
+
sourceMemoryIds: ["mem-keep"],
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
assert.equal(await pruneOrphanCueAnchors({ memoryDir }), 0);
|
|
83
|
+
const persisted = validateCueAnchor(JSON.parse(await readFile(anchorPath, "utf8")));
|
|
84
|
+
assert.deepEqual(persisted.sourceMemoryIdsByNodeRef, {
|
|
85
|
+
"node-storage": ["mem-keep"],
|
|
86
|
+
});
|
|
87
|
+
} finally {
|
|
88
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
89
|
+
}
|
|
90
|
+
});
|