@remnic/core 9.69.38 → 9.69.40
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 +16 -14
- package/dist/access-admin-ops-surface.js +39 -39
- package/dist/access-authorization-probe.d.ts +16 -14
- package/dist/access-authorization-probe.js +40 -40
- package/dist/access-boundary.d.ts +16 -14
- package/dist/access-boundary.js +39 -39
- package/dist/access-cli.js +107 -105
- 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 +16 -14
- package/dist/access-extraction-force-flush.js +39 -39
- package/dist/access-health-types.d.ts +1 -1
- package/dist/access-http-briefing.d.ts +16 -14
- package/dist/access-http-briefing.js +40 -40
- package/dist/access-http-lcm-compaction.d.ts +16 -14
- package/dist/access-http-lifecycle-flush.d.ts +16 -14
- package/dist/access-http-offline-stream.d.ts +16 -14
- package/dist/access-http-query.d.ts +2 -2
- package/dist/access-http-query.js +41 -41
- package/dist/access-http.d.ts +17 -15
- package/dist/access-http.js +58 -58
- package/dist/access-identity-continuity-surface.d.ts +13 -12
- package/dist/access-identity-continuity-surface.js +39 -39
- package/dist/access-lcm-surface.d.ts +16 -14
- package/dist/access-lcm-surface.js +39 -39
- package/dist/access-mcp.d.ts +16 -14
- package/dist/access-mcp.js +47 -47
- package/dist/access-memory-search-fanout.d.ts +2 -2
- package/dist/{access-namespace-preflight-DY4z6L5X.d.ts → access-namespace-preflight-CKBumJ8W.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +3 -3
- package/dist/access-namespace-preflight.js +39 -39
- package/dist/access-observe-transcript.d.ts +13 -12
- package/dist/access-observe-write-category.d.ts +1 -1
- package/dist/access-observe-write-category.js +2 -2
- package/dist/access-observe-write-surface.d.ts +16 -14
- package/dist/access-observe-write-surface.js +39 -39
- package/dist/access-offline-manifest.d.ts +37 -13
- package/dist/access-offline-manifest.js +7 -3
- package/dist/access-operations-batch.js +41 -41
- package/dist/access-operations.d.ts +16 -14
- package/dist/access-operations.js +46 -46
- package/dist/access-recall-concurrency.d.ts +16 -14
- package/dist/access-recall-concurrency.js +39 -39
- package/dist/access-recall-response.d.ts +16 -14
- package/dist/access-recall-response.js +39 -39
- package/dist/access-recall-surface.d.ts +16 -14
- package/dist/access-recall-surface.js +39 -39
- package/dist/access-schema.d.ts +5 -3
- package/dist/access-schema.js +1 -1
- package/dist/{access-service-gBcdRUHY.d.ts → access-service-DJ3qogNt.d.ts} +8 -8
- package/dist/access-service-helpers.d.ts +16 -14
- package/dist/access-service.d.ts +16 -14
- package/dist/access-service.js +39 -39
- package/dist/access-surface-catalog.d.ts +16 -14
- package/dist/access-surface-catalog.js +41 -41
- package/dist/access-wearables-meetings-surface.d.ts +6 -5
- 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 +6 -5
- package/dist/active-recall.js.map +1 -1
- package/dist/activity/digest.d.ts +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-RP4C6ZPF.js → auto-sync-D6BAPIJV.js} +5 -5
- package/dist/background-generation-config.d.ts +1 -1
- package/dist/background-generation-config.js +3 -1
- package/dist/background-generation.d.ts +1 -1
- package/dist/behavior-learner.d.ts +1 -1
- package/dist/behavior-signals.d.ts +1 -1
- package/dist/bootstrap.d.ts +13 -12
- package/dist/briefing-window.d.ts +2 -2
- package/dist/briefing.d.ts +2 -2
- package/dist/briefing.js +16 -16
- 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 +5 -5
- package/dist/bulk-import/index.d.ts +3 -3
- package/dist/calibration.d.ts +3 -2
- package/dist/calibration.js +2 -2
- package/dist/capabilities.d.ts +1 -1
- package/dist/{catalog-CW87xGx8.d.ts → catalog-BHXkBVhg.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +1 -1
- package/dist/causal-consolidation.d.ts +1 -1
- package/dist/causal-consolidation.js +20 -19
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-trajectory-graph.d.ts +1 -1
- package/dist/{chunk-B36GUU6T.js → chunk-23HFXQ5J.js} +36 -3
- package/dist/chunk-23HFXQ5J.js.map +1 -0
- package/dist/{chunk-YFTNZMGR.js → chunk-27NO2KVB.js} +31 -8
- package/dist/chunk-27NO2KVB.js.map +1 -0
- package/dist/{chunk-T32B72QX.js → chunk-2SKMZUOW.js} +2 -2
- package/dist/{chunk-VHOSM5G4.js → chunk-2SNCQHJZ.js} +2 -2
- package/dist/{chunk-VV4ZVUE6.js → chunk-3QEVOQF5.js} +2 -2
- package/dist/{chunk-3N3PBBEH.js → chunk-3XPN7AVY.js} +2 -2
- package/dist/{chunk-XN6XT6GR.js → chunk-46Z3VGWF.js} +2 -2
- package/dist/{chunk-2PTNJTBE.js → chunk-4CMXI55L.js} +2 -2
- package/dist/{chunk-2MT4ADLQ.js → chunk-5LYSEZOF.js} +18 -9
- package/dist/chunk-5LYSEZOF.js.map +1 -0
- package/dist/{chunk-XWLLFKHM.js → chunk-62HFZNCJ.js} +19 -12
- package/dist/chunk-62HFZNCJ.js.map +1 -0
- package/dist/{chunk-VELCIWJZ.js → chunk-6L2II3KS.js} +22 -11
- package/dist/chunk-6L2II3KS.js.map +1 -0
- package/dist/{chunk-A6CKMIPK.js → chunk-7D6SER6A.js} +8 -8
- package/dist/{chunk-4B3HBIFX.js → chunk-7Z54NXVS.js} +2 -2
- package/dist/{chunk-X2NFFBTO.js → chunk-A7GQBJP5.js} +4 -4
- package/dist/{chunk-ACY4ZPF7.js → chunk-AEOOGXMQ.js} +10 -5
- package/dist/chunk-AEOOGXMQ.js.map +1 -0
- package/dist/{chunk-NWMUSKED.js → chunk-BGRTZOJB.js} +3 -3
- package/dist/{chunk-ZEGL7YCC.js → chunk-BXIJSPCL.js} +2 -2
- package/dist/{chunk-MLWMR2GE.js → chunk-BYQX4IOG.js} +2 -2
- package/dist/{chunk-ULDBGA5W.js → chunk-C5R73BON.js} +2 -2
- package/dist/{chunk-BD7JTBYP.js → chunk-D7MAYFQP.js} +2 -2
- package/dist/{chunk-V6G2PSXA.js → chunk-DAZANIYU.js} +251 -297
- package/dist/chunk-DAZANIYU.js.map +1 -0
- package/dist/{chunk-BRZWWUCJ.js → chunk-DFVSJFHK.js} +2 -2
- package/dist/{chunk-DPMTLJCT.js → chunk-ES5BUPYB.js} +2 -2
- package/dist/{chunk-MVAQ2WM3.js → chunk-G2XZFGYN.js} +6 -2
- package/dist/chunk-G2XZFGYN.js.map +1 -0
- package/dist/{chunk-TNSCIPBQ.js → chunk-G6NQ3L4T.js} +2 -2
- package/dist/{chunk-5N4MZLEH.js → chunk-GO5LOHCD.js} +2 -2
- package/dist/{chunk-AECJY3GJ.js → chunk-GSSDHAYH.js} +2 -2
- package/dist/{chunk-JA2QJOAX.js → chunk-HJUP3K6L.js} +2 -2
- package/dist/{chunk-ZKZFFWLV.js → chunk-ICNJ6J46.js} +2 -2
- package/dist/{chunk-6EHM2AV7.js → chunk-IMBQFHRV.js} +2 -2
- package/dist/{chunk-6PRY6CLC.js → chunk-IOPIGX7Y.js} +1 -1
- package/dist/{chunk-TRHBQVVO.js → chunk-IS2IDFJP.js} +14 -14
- package/dist/{chunk-R4VAUNNC.js → chunk-J4WGTN2N.js} +2 -2
- package/dist/{chunk-JPOX2AJB.js → chunk-J7FVMLBR.js} +2 -2
- package/dist/{chunk-BYZKLEWG.js → chunk-JAJIMTFB.js} +6 -6
- package/dist/{chunk-OKO57IXB.js → chunk-JOP7W24J.js} +11 -11
- package/dist/{chunk-YUW66UAH.js → chunk-JUDT33RX.js} +2 -2
- package/dist/{chunk-QHT7MOUF.js → chunk-K4A6UVPB.js} +22 -11
- package/dist/chunk-K4A6UVPB.js.map +1 -0
- package/dist/{chunk-UQNYPK7G.js → chunk-K4JKAXMO.js} +2 -2
- package/dist/{chunk-BV4ZKIZH.js → chunk-K75A5XWU.js} +3 -2
- package/dist/{chunk-3CBI2ZSA.js → chunk-KG2OOAFF.js} +20 -12
- package/dist/chunk-KG2OOAFF.js.map +1 -0
- package/dist/{chunk-M6HBPLBA.js → chunk-KOTG3RXE.js} +2 -2
- package/dist/{chunk-CWTCMZGE.js → chunk-KTOXQMW3.js} +119 -3
- package/dist/chunk-KTOXQMW3.js.map +1 -0
- package/dist/{chunk-OB3XMWX5.js → chunk-KVO2BTA4.js} +2 -2
- package/dist/{chunk-CBFYCDYO.js → chunk-KY236SP5.js} +3 -3
- package/dist/{chunk-4BCHFSC7.js → chunk-LFVZD5EC.js} +3 -3
- package/dist/{chunk-GGAXFTNH.js → chunk-LKFVVN7R.js} +2 -2
- package/dist/{chunk-IYKZJVL5.js → chunk-MDIEES23.js} +1 -1
- package/dist/chunk-MDIEES23.js.map +1 -0
- package/dist/{chunk-4RX5O34R.js → chunk-MJC7UKH7.js} +2 -2
- package/dist/{chunk-7S53BPTU.js → chunk-MVG3KXON.js} +69 -22
- package/dist/chunk-MVG3KXON.js.map +1 -0
- package/dist/chunk-NETQXOPY.js +221 -0
- package/dist/chunk-NETQXOPY.js.map +1 -0
- package/dist/{chunk-UZZ7SQT3.js → chunk-NVVZPBKI.js} +2 -2
- package/dist/{chunk-BLDBT6HZ.js → chunk-PJRKLB4Z.js} +18 -2
- package/dist/chunk-PJRKLB4Z.js.map +1 -0
- package/dist/{chunk-TTSJ7WUC.js → chunk-PKUJNICO.js} +2 -2
- package/dist/{chunk-QMWKENNK.js → chunk-Q4AUIFUA.js} +4 -4
- package/dist/{chunk-G43PMSME.js → chunk-QE6YVNP5.js} +7 -7
- package/dist/{chunk-WKDFJXW5.js → chunk-QM2SPLKQ.js} +1 -1
- package/dist/chunk-QM2SPLKQ.js.map +1 -0
- package/dist/{chunk-GT4ZHOKT.js → chunk-QPVNK2VE.js} +2 -2
- package/dist/{chunk-K5DA5TRG.js → chunk-QS5Q5RBV.js} +2 -2
- package/dist/{chunk-BX4EOMKT.js → chunk-RDLPFM7I.js} +2 -2
- package/dist/{chunk-EY5JAWZC.js → chunk-RJQAP333.js} +2 -2
- package/dist/{chunk-5AERZWJD.js → chunk-RLU2Y5GV.js} +4 -4
- package/dist/chunk-RLU2Y5GV.js.map +1 -0
- package/dist/{chunk-2OGTN37H.js → chunk-ROEFLU37.js} +4 -4
- package/dist/{chunk-62QIQEUC.js → chunk-SFHLQPBF.js} +25 -25
- package/dist/chunk-SK7D34OL.js +68 -0
- package/dist/chunk-SK7D34OL.js.map +1 -0
- package/dist/{chunk-HVS7TH2Y.js → chunk-SUEOG2S4.js} +2 -2
- package/dist/{chunk-74AHCL56.js → chunk-TEMKBSV6.js} +2 -2
- package/dist/{chunk-LQNRVPTV.js → chunk-THTF2W7M.js} +151 -118
- package/dist/chunk-THTF2W7M.js.map +1 -0
- package/dist/{chunk-KDFDXEXZ.js → chunk-TO36VPZI.js} +2 -2
- package/dist/{chunk-BJEJUOGM.js → chunk-TZ44E732.js} +44 -6
- package/dist/chunk-TZ44E732.js.map +1 -0
- package/dist/{chunk-JXN77SGO.js → chunk-U2VDCFXW.js} +1 -1
- package/dist/chunk-U2VDCFXW.js.map +1 -0
- package/dist/{chunk-3OYSIVOO.js → chunk-UZ6JYPJ6.js} +611 -289
- package/dist/chunk-UZ6JYPJ6.js.map +1 -0
- package/dist/{chunk-M3MYMWXG.js → chunk-V2ZA4YWE.js} +2 -2
- package/dist/{chunk-UIOIDW3L.js → chunk-VHKXRYQN.js} +2 -2
- package/dist/{chunk-GAS7KYC7.js → chunk-VKWFNPBH.js} +2 -2
- package/dist/{chunk-6H2G7RFT.js → chunk-VNQRRUNS.js} +11 -10
- package/dist/chunk-VNQRRUNS.js.map +1 -0
- package/dist/{chunk-XGRXQR6T.js → chunk-VQWBUPSJ.js} +2 -2
- package/dist/{chunk-TUKGXQ5T.js → chunk-VQYWKCDR.js} +2 -2
- package/dist/{chunk-PPQEP4OH.js → chunk-W23JARAQ.js} +2 -2
- package/dist/{chunk-YQNNHLCG.js → chunk-WPGR3RW4.js} +2 -2
- package/dist/{chunk-474DL7UB.js → chunk-WZYHPAG5.js} +3 -3
- package/dist/{chunk-5HYUUFMQ.js → chunk-XCPNH2MG.js} +259 -10
- package/dist/chunk-XCPNH2MG.js.map +1 -0
- package/dist/{chunk-GQQVEH6V.js → chunk-XM46Y66S.js} +2 -2
- package/dist/{chunk-JNSENHV5.js → chunk-YRIFXXMI.js} +3 -3
- package/dist/{chunk-TRLOFIQC.js → chunk-YTK5MVNF.js} +2 -2
- package/dist/{chunk-VMNCZ627.js → chunk-YTZN2UZO.js} +2 -2
- package/dist/chunk-Z4GUX2M6.js +94 -0
- package/dist/chunk-Z4GUX2M6.js.map +1 -0
- package/dist/{chunk-6ZMNTRU3.js → chunk-ZAEPD4C2.js} +2 -2
- package/dist/{chunk-KQW3YGEN.js → chunk-ZRMMXWYI.js} +2 -2
- package/dist/{chunk-P4ZAEYKG.js → chunk-ZX3AYNNV.js} +6 -3
- package/dist/chunk-ZX3AYNNV.js.map +1 -0
- package/dist/{chunk-MCRVQ5YQ.js → chunk-ZZCR2QYL.js} +2 -2
- package/dist/{cli-BNg-TAlz.d.ts → cli-BWri5-am.d.ts} +5 -5
- package/dist/cli.d.ts +18 -16
- package/dist/cli.js +80 -79
- package/dist/coding/export-okf-codegraph.d.ts +1 -1
- package/dist/coding/export-okf-codegraph.js +15 -15
- package/dist/coding/pre-action-gate.d.ts +1 -1
- package/dist/compounding/engine.d.ts +2 -2
- package/dist/compounding/engine.js +16 -16
- 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 +6 -5
- package/dist/connectors/codex-materialize-runner.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.js +16 -16
- package/dist/connectors/codex-materialize.d.ts +1 -1
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.js +16 -16
- package/dist/consolidation-provenance-check.d.ts +2 -2
- package/dist/consolidation-undo.d.ts +2 -2
- package/dist/contradiction/index.d.ts +6 -5
- package/dist/converge-config.d.ts +1 -1
- package/dist/convergence-refresh.d.ts +2 -2
- package/dist/convergence-refresh.js +18 -18
- 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 +18 -18
- package/dist/cross-lingual-recall.d.ts +1 -1
- package/dist/day-summary.d.ts +1 -1
- package/dist/deep-recall-http-glue.d.ts +16 -14
- package/dist/deep-recall-http-glue.js +2 -2
- package/dist/deep-recall-mcp-tools.d.ts +16 -14
- package/dist/deep-recall-policy-llm.d.ts +4 -3
- package/dist/deep-recall-policy-llm.js +3 -3
- package/dist/deep-recall-seeds.d.ts +1 -1
- package/dist/delinearize.d.ts +1 -1
- package/dist/dependency-propagation-config.d.ts +1 -1
- package/dist/{dependency-propagation-delivery-Cq1ekOwV.d.ts → dependency-propagation-delivery-ueZlKTQB.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-origin-fields.d.ts +1 -1
- package/dist/entity-retrieval.d.ts +2 -2
- package/dist/entity-retrieval.js +16 -16
- package/dist/entity-schema.d.ts +1 -1
- package/dist/episodic-context.d.ts +1 -1
- package/dist/eval-trajectory-contracts.d.ts +1 -1
- package/dist/eval-trajectory-store.d.ts +1 -1
- package/dist/eval-trajectory.d.ts +1 -1
- package/dist/explicit-capture.d.ts +13 -12
- package/dist/external-wiki-access.d.ts +16 -14
- package/dist/external-wiki-access.js +40 -40
- 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 +16 -14
- package/dist/extraction-error-classification.d.ts +14 -3
- package/dist/extraction-error-classification.js +5 -3
- package/dist/extraction-faithfulness.d.ts +4 -3
- package/dist/extraction-faithfulness.js +3 -3
- package/dist/extraction-judge-telemetry.d.ts +4 -3
- package/dist/extraction-judge-training.d.ts +4 -3
- package/dist/extraction-judge.d.ts +4 -3
- package/dist/extraction-judge.js +3 -3
- package/dist/extraction-liveness.d.ts +1 -1
- package/dist/extraction-normalization.d.ts +1 -1
- package/dist/extraction-prompt.d.ts +1 -1
- package/dist/extraction-source-grounding-rules.d.ts +1 -1
- package/dist/extraction-source-grounding.d.ts +1 -1
- package/dist/extraction-span-config.d.ts +1 -1
- package/dist/extraction-span-materialize.d.ts +1 -1
- package/dist/extraction.d.ts +4 -4
- package/dist/extraction.js +26 -24
- package/dist/fallback-llm-codex-subscription.d.ts +52 -7
- package/dist/fallback-llm-codex-subscription.js +17 -1
- package/dist/fallback-llm.d.ts +25 -28
- package/dist/fallback-llm.js +4 -3
- package/dist/{generic-recall-paths-BcySh_f9.d.ts → generic-recall-paths-CpyVmA88.d.ts} +1 -1
- package/dist/graph-append-error.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-jsonl.d.ts +1 -1
- package/dist/graph-path-reconstruction.d.ts +1 -1
- package/dist/graph-path-scoring.d.ts +1 -1
- package/dist/graph-snapshot.d.ts +1 -1
- package/dist/graph.d.ts +1 -1
- package/dist/harmonic-retrieval.js +1 -1
- package/dist/importance.d.ts +1 -1
- package/dist/importers/index.d.ts +1 -1
- package/dist/importers/test-utils.d.ts +1 -1
- package/dist/in-flight-reads.d.ts +1 -1
- package/dist/{index-DWOb4wz9.d.ts → index-BvUA4S7M.d.ts} +3 -3
- package/dist/index.d.ts +80 -40
- package/dist/index.js +140 -115
- package/dist/intent.d.ts +1 -1
- 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 +7 -7
- 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-BsJGulur.d.ts +247 -0
- package/dist/local-llm-config.d.ts +4 -1
- package/dist/local-llm-config.js +4 -2
- package/dist/local-llm-helpers.d.ts +18 -69
- package/dist/local-llm-helpers.js +1 -1
- package/dist/local-llm.d.ts +3 -170
- package/dist/local-llm.js +2 -2
- package/dist/local-model-endpoint.d.ts +1 -1
- package/dist/location/index.d.ts +3 -3
- package/dist/location/index.js +18 -18
- package/dist/maintenance/memory-governance.d.ts +1 -1
- package/dist/maintenance/memory-governance.js +16 -16
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +16 -16
- package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-projection.js +17 -17
- package/dist/{maintenance-CW9wCzMP.d.ts → maintenance-CYubtIRr.d.ts} +9 -3
- package/dist/mcp-memory-inspector-app.d.ts +16 -14
- package/dist/memory-action-policy.d.ts +1 -1
- package/dist/memory-cache.d.ts +1 -1
- package/dist/memory-controller.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-subject-cli.d.ts +16 -14
- package/dist/memory-subject.d.ts +16 -14
- 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 +17 -17
- package/dist/namespaces/principal.d.ts +1 -1
- package/dist/namespaces/search.d.ts +12 -1
- package/dist/namespaces/search.js +9 -9
- package/dist/namespaces/storage.d.ts +3 -3
- package/dist/namespaces/storage.js +16 -16
- package/dist/native-knowledge.d.ts +1 -1
- package/dist/offline-sync-impression-drain.d.ts +1 -1
- package/dist/operator-doctor-corpus.d.ts +1 -1
- package/dist/operator-doctor-corpus.js +19 -19
- package/dist/operator-doctor-replica.d.ts +1 -1
- package/dist/operator-toolkit.d.ts +3 -3
- package/dist/operator-toolkit.js +30 -29
- package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
- package/dist/orchestration/maintenance.d.ts +4 -4
- package/dist/orchestration/maintenance.js +27 -27
- package/dist/{orchestrator-DocO0_hw.d.ts → orchestrator-BWDRJ_0d.d.ts} +37 -13
- package/dist/orchestrator.d.ts +13 -12
- package/dist/orchestrator.js +110 -106
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/{pipeline-CiYcqqhl.d.ts → pipeline-7JMn2yMH.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +1 -1
- package/dist/proactive-contention.d.ts +2 -2
- package/dist/provenance.d.ts +1 -1
- package/dist/{public-http-C0FoTiL_.d.ts → public-http-CJWs3mo9.d.ts} +1 -1
- package/dist/{qmd-qXD4vatU.d.ts → qmd-CxCH9G9m.d.ts} +2 -2
- 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 +2 -2
- 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-navigate-access.d.ts +1 -1
- package/dist/recall-navigate-access.js +2 -2
- package/dist/recall-navigate-disclosure.d.ts +1 -1
- package/dist/recall-navigate-disclosure.js +1 -1
- package/dist/recall-navigate.d.ts +1 -1
- package/dist/recall-navigate.js +2 -2
- package/dist/recall-planner-llm.d.ts +3 -2
- package/dist/recall-planner-llm.js +4 -3
- package/dist/recall-planner-llm.js.map +1 -1
- package/dist/recall-state-view-admission.d.ts +13 -3
- package/dist/recall-state-view-admission.js +8 -8
- package/dist/recall-state-view-anchors.d.ts +85 -0
- package/dist/recall-state-view-anchors.js +21 -0
- package/dist/recall-state-view-anchors.js.map +1 -0
- package/dist/recall-state-view-inject.js +2 -2
- package/dist/recall-state-view-render.js +2 -2
- package/dist/recall-state-view-widen.js +2 -2
- package/dist/recall-state-view-wire.js +3 -3
- package/dist/recall-state-view.d.ts +38 -1
- package/dist/recall-state-view.js +11 -3
- 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/reconcile/cursor.d.ts +1 -1
- package/dist/reconcile/manifest.d.ts +1 -1
- package/dist/reconcile/plan.d.ts +1 -1
- 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/resolve-auth-token.d.ts +1 -1
- package/dist/resume-bundles.js +7 -6
- 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-BT9rqC3w.d.ts → scope-profiles-BGAUqhBR.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/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 +2 -2
- package/dist/search/port.js +1 -1
- package/dist/search/remote-backend.d.ts +1 -1
- package/dist/search/remote-backend.js +2 -2
- package/dist/{semantic-consolidation-CmZi7thY.d.ts → semantic-consolidation-CCeRD9pV.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +17 -17
- package/dist/semantic-rule-promotion.js +16 -16
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +16 -16
- package/dist/{service-CLkA7AQB.d.ts → service-BwpzRduk.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/source-agent-qualifier.d.ts +1 -1
- package/dist/source-agent-qualifier.js +19 -19
- package/dist/standup/build.js +16 -16
- package/dist/{storage-wvX01lht.d.ts → storage-BprAGBG0.d.ts} +2 -1
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +15 -15
- package/dist/subject-config.d.ts +1 -1
- package/dist/summarizer.d.ts +1 -1
- package/dist/summarizer.js +5 -5
- package/dist/summary-snapshot.d.ts +1 -1
- package/dist/support-passport/index.d.ts +18 -17
- package/dist/support-passport/index.js +42 -42
- package/dist/task-llm-config.d.ts +16 -0
- package/dist/task-llm-config.js +12 -0
- package/dist/task-llm-config.js.map +1 -0
- 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/topics.d.ts +1 -1
- package/dist/transcript.d.ts +1 -1
- package/dist/transfer/export-okf.d.ts +1 -1
- package/dist/transfer/export-okf.js +16 -16
- package/dist/trust-score-stage.d.ts +1 -1
- package/dist/trust-score.d.ts +1 -1
- package/dist/{types-Cyr32ABj.d.ts → types-nJV23pa3.d.ts} +1 -1
- 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 +16 -16
- package/dist/who-knows-cli.d.ts +16 -14
- package/dist/who-knows-cli.js +17 -17
- package/dist/who-knows.d.ts +16 -14
- package/dist/who-knows.js +16 -16
- package/dist/write-envelope.d.ts +1 -1
- package/package.json +2 -2
- package/src/access-category-alias.test.ts +93 -0
- package/src/access-offline-manifest.ts +52 -2
- package/src/access-schema.ts +9 -4
- package/src/activity/config.test.ts +61 -0
- package/src/activity/config.ts +40 -1
- package/src/activity/timeline/analysis-provider.ts +8 -2
- package/src/activity/timeline/analysis-run.test.ts +82 -0
- package/src/activity/timeline/publish-cli.test.ts +30 -0
- package/src/activity/timeline/publish-cli.ts +7 -0
- package/src/activity/timeline/query.ts +8 -1
- package/src/activity/timeline/regenerate.test.ts +82 -2
- package/src/activity/timeline/regenerate.ts +7 -1
- package/src/activity/vault-frontmatter.test.ts +99 -1
- package/src/activity/vault-frontmatter.ts +131 -0
- package/src/activity/vault-publish.ts +6 -0
- package/src/activity/vault-publisher.test.ts +172 -0
- package/src/activity/vault-publisher.ts +69 -15
- package/src/activity/vault-region.test.ts +7 -2
- package/src/activity/vault-region.ts +7 -3
- package/src/background-generation-config.ts +32 -6
- package/src/background-generation.test.ts +10 -1
- package/src/cli/timeline-publish-commands.ts +9 -0
- package/src/config.test.ts +170 -43
- package/src/config.ts +17 -5
- package/src/extraction-error-classification.ts +36 -1
- package/src/extraction-timeout.test.ts +110 -1
- package/src/extraction.test.ts +19 -1
- package/src/extraction.ts +23 -21
- package/src/fallback-llm-codex-subscription.ts +193 -7
- package/src/fallback-llm-parse-failure.test.ts +156 -0
- package/src/fallback-llm.test.ts +58 -0
- package/src/fallback-llm.ts +187 -186
- package/src/index.ts +1 -0
- package/src/local-llm-config.ts +11 -10
- package/src/local-llm-headers-timeout.test.ts +30 -0
- package/src/local-llm-helpers.ts +28 -0
- package/src/local-llm.ts +8 -19
- package/src/namespaces/search.test.ts +51 -1
- package/src/namespaces/search.ts +48 -3
- package/src/orchestration/extraction-persist-promotion.test.ts +228 -2
- package/src/orchestration/extraction-persist-promotion.ts +17 -14
- package/src/orchestration/orchestrator-helpers.test.ts +104 -0
- package/src/orchestration/orchestrator-init.ts +366 -106
- package/src/orchestration/recall-internal.ts +85 -74
- package/src/orchestration/recall-rerank-coordinator.ts +41 -4
- package/src/orchestration/recall-search-pipeline.ts +25 -18
- package/src/orchestration/recall-state-view-pipeline.test.ts +89 -0
- package/src/orchestration/semantic-merge-promotion-payload.ts +62 -6
- package/src/orchestration/startup-collection-checks.ts +85 -0
- package/src/orchestrator-flush.test.ts +7 -0
- package/src/orchestrator-init.test.ts +1539 -0
- package/src/orchestrator.ts +7 -0
- package/src/qmd.ts +21 -10
- package/src/recall-rerank-coordinator.test.ts +153 -0
- package/src/recall-state-view-admission.ts +11 -1
- package/src/recall-state-view-anchors.ts +163 -0
- package/src/recall-state-view-cron-intent.test.ts +268 -0
- package/src/recall-state-view-widen.test.ts +14 -5
- package/src/recall-state-view-widen.ts +29 -8
- package/src/recall-state-view-zero-diff.test.ts +30 -0
- package/src/recall-state-view.test.ts +161 -0
- package/src/recall-state-view.ts +211 -37
- package/src/reconcile-identity-cache.test.ts +82 -1
- package/src/search/port.ts +1 -1
- package/src/storage/cas-revision-store.test.ts +4 -0
- package/src/storage/cas-revision-store.ts +104 -12
- package/src/storage-frontmatter-cas.test.ts +19 -17
- package/src/summarizer.ts +5 -1
- package/src/task-llm-config.test.ts +124 -0
- package/src/task-llm-config.ts +88 -0
- package/src/testing/subjects/startup-discovery-lifecycle.test.ts +273 -0
- package/src/trust-score-recall-paths.test.ts +1 -1
- package/src/types.ts +1 -0
- package/dist/chunk-255PC37A.js +0 -120
- package/dist/chunk-255PC37A.js.map +0 -1
- package/dist/chunk-2MT4ADLQ.js.map +0 -1
- package/dist/chunk-3CBI2ZSA.js.map +0 -1
- package/dist/chunk-3OYSIVOO.js.map +0 -1
- package/dist/chunk-5AERZWJD.js.map +0 -1
- package/dist/chunk-5HYUUFMQ.js.map +0 -1
- package/dist/chunk-6H2G7RFT.js.map +0 -1
- package/dist/chunk-7S53BPTU.js.map +0 -1
- package/dist/chunk-ACY4ZPF7.js.map +0 -1
- package/dist/chunk-B36GUU6T.js.map +0 -1
- package/dist/chunk-BJEJUOGM.js.map +0 -1
- package/dist/chunk-BLDBT6HZ.js.map +0 -1
- package/dist/chunk-CWTCMZGE.js.map +0 -1
- package/dist/chunk-IYKZJVL5.js.map +0 -1
- package/dist/chunk-JXN77SGO.js.map +0 -1
- package/dist/chunk-LQNRVPTV.js.map +0 -1
- package/dist/chunk-MVAQ2WM3.js.map +0 -1
- package/dist/chunk-P4ZAEYKG.js.map +0 -1
- package/dist/chunk-QHT7MOUF.js.map +0 -1
- package/dist/chunk-V6G2PSXA.js.map +0 -1
- package/dist/chunk-VELCIWJZ.js.map +0 -1
- package/dist/chunk-WKDFJXW5.js.map +0 -1
- package/dist/chunk-XWLLFKHM.js.map +0 -1
- package/dist/chunk-YFTNZMGR.js.map +0 -1
- /package/dist/{auto-sync-RP4C6ZPF.js.map → auto-sync-D6BAPIJV.js.map} +0 -0
- /package/dist/{chunk-T32B72QX.js.map → chunk-2SKMZUOW.js.map} +0 -0
- /package/dist/{chunk-VHOSM5G4.js.map → chunk-2SNCQHJZ.js.map} +0 -0
- /package/dist/{chunk-VV4ZVUE6.js.map → chunk-3QEVOQF5.js.map} +0 -0
- /package/dist/{chunk-3N3PBBEH.js.map → chunk-3XPN7AVY.js.map} +0 -0
- /package/dist/{chunk-XN6XT6GR.js.map → chunk-46Z3VGWF.js.map} +0 -0
- /package/dist/{chunk-2PTNJTBE.js.map → chunk-4CMXI55L.js.map} +0 -0
- /package/dist/{chunk-A6CKMIPK.js.map → chunk-7D6SER6A.js.map} +0 -0
- /package/dist/{chunk-4B3HBIFX.js.map → chunk-7Z54NXVS.js.map} +0 -0
- /package/dist/{chunk-X2NFFBTO.js.map → chunk-A7GQBJP5.js.map} +0 -0
- /package/dist/{chunk-NWMUSKED.js.map → chunk-BGRTZOJB.js.map} +0 -0
- /package/dist/{chunk-ZEGL7YCC.js.map → chunk-BXIJSPCL.js.map} +0 -0
- /package/dist/{chunk-MLWMR2GE.js.map → chunk-BYQX4IOG.js.map} +0 -0
- /package/dist/{chunk-ULDBGA5W.js.map → chunk-C5R73BON.js.map} +0 -0
- /package/dist/{chunk-BD7JTBYP.js.map → chunk-D7MAYFQP.js.map} +0 -0
- /package/dist/{chunk-BRZWWUCJ.js.map → chunk-DFVSJFHK.js.map} +0 -0
- /package/dist/{chunk-DPMTLJCT.js.map → chunk-ES5BUPYB.js.map} +0 -0
- /package/dist/{chunk-TNSCIPBQ.js.map → chunk-G6NQ3L4T.js.map} +0 -0
- /package/dist/{chunk-5N4MZLEH.js.map → chunk-GO5LOHCD.js.map} +0 -0
- /package/dist/{chunk-AECJY3GJ.js.map → chunk-GSSDHAYH.js.map} +0 -0
- /package/dist/{chunk-JA2QJOAX.js.map → chunk-HJUP3K6L.js.map} +0 -0
- /package/dist/{chunk-ZKZFFWLV.js.map → chunk-ICNJ6J46.js.map} +0 -0
- /package/dist/{chunk-6EHM2AV7.js.map → chunk-IMBQFHRV.js.map} +0 -0
- /package/dist/{chunk-6PRY6CLC.js.map → chunk-IOPIGX7Y.js.map} +0 -0
- /package/dist/{chunk-TRHBQVVO.js.map → chunk-IS2IDFJP.js.map} +0 -0
- /package/dist/{chunk-R4VAUNNC.js.map → chunk-J4WGTN2N.js.map} +0 -0
- /package/dist/{chunk-JPOX2AJB.js.map → chunk-J7FVMLBR.js.map} +0 -0
- /package/dist/{chunk-BYZKLEWG.js.map → chunk-JAJIMTFB.js.map} +0 -0
- /package/dist/{chunk-OKO57IXB.js.map → chunk-JOP7W24J.js.map} +0 -0
- /package/dist/{chunk-YUW66UAH.js.map → chunk-JUDT33RX.js.map} +0 -0
- /package/dist/{chunk-UQNYPK7G.js.map → chunk-K4JKAXMO.js.map} +0 -0
- /package/dist/{chunk-BV4ZKIZH.js.map → chunk-K75A5XWU.js.map} +0 -0
- /package/dist/{chunk-M6HBPLBA.js.map → chunk-KOTG3RXE.js.map} +0 -0
- /package/dist/{chunk-OB3XMWX5.js.map → chunk-KVO2BTA4.js.map} +0 -0
- /package/dist/{chunk-CBFYCDYO.js.map → chunk-KY236SP5.js.map} +0 -0
- /package/dist/{chunk-4BCHFSC7.js.map → chunk-LFVZD5EC.js.map} +0 -0
- /package/dist/{chunk-GGAXFTNH.js.map → chunk-LKFVVN7R.js.map} +0 -0
- /package/dist/{chunk-4RX5O34R.js.map → chunk-MJC7UKH7.js.map} +0 -0
- /package/dist/{chunk-UZZ7SQT3.js.map → chunk-NVVZPBKI.js.map} +0 -0
- /package/dist/{chunk-TTSJ7WUC.js.map → chunk-PKUJNICO.js.map} +0 -0
- /package/dist/{chunk-QMWKENNK.js.map → chunk-Q4AUIFUA.js.map} +0 -0
- /package/dist/{chunk-G43PMSME.js.map → chunk-QE6YVNP5.js.map} +0 -0
- /package/dist/{chunk-GT4ZHOKT.js.map → chunk-QPVNK2VE.js.map} +0 -0
- /package/dist/{chunk-K5DA5TRG.js.map → chunk-QS5Q5RBV.js.map} +0 -0
- /package/dist/{chunk-BX4EOMKT.js.map → chunk-RDLPFM7I.js.map} +0 -0
- /package/dist/{chunk-EY5JAWZC.js.map → chunk-RJQAP333.js.map} +0 -0
- /package/dist/{chunk-2OGTN37H.js.map → chunk-ROEFLU37.js.map} +0 -0
- /package/dist/{chunk-62QIQEUC.js.map → chunk-SFHLQPBF.js.map} +0 -0
- /package/dist/{chunk-HVS7TH2Y.js.map → chunk-SUEOG2S4.js.map} +0 -0
- /package/dist/{chunk-74AHCL56.js.map → chunk-TEMKBSV6.js.map} +0 -0
- /package/dist/{chunk-KDFDXEXZ.js.map → chunk-TO36VPZI.js.map} +0 -0
- /package/dist/{chunk-M3MYMWXG.js.map → chunk-V2ZA4YWE.js.map} +0 -0
- /package/dist/{chunk-UIOIDW3L.js.map → chunk-VHKXRYQN.js.map} +0 -0
- /package/dist/{chunk-GAS7KYC7.js.map → chunk-VKWFNPBH.js.map} +0 -0
- /package/dist/{chunk-XGRXQR6T.js.map → chunk-VQWBUPSJ.js.map} +0 -0
- /package/dist/{chunk-TUKGXQ5T.js.map → chunk-VQYWKCDR.js.map} +0 -0
- /package/dist/{chunk-PPQEP4OH.js.map → chunk-W23JARAQ.js.map} +0 -0
- /package/dist/{chunk-YQNNHLCG.js.map → chunk-WPGR3RW4.js.map} +0 -0
- /package/dist/{chunk-474DL7UB.js.map → chunk-WZYHPAG5.js.map} +0 -0
- /package/dist/{chunk-GQQVEH6V.js.map → chunk-XM46Y66S.js.map} +0 -0
- /package/dist/{chunk-JNSENHV5.js.map → chunk-YRIFXXMI.js.map} +0 -0
- /package/dist/{chunk-TRLOFIQC.js.map → chunk-YTK5MVNF.js.map} +0 -0
- /package/dist/{chunk-VMNCZ627.js.map → chunk-YTZN2UZO.js.map} +0 -0
- /package/dist/{chunk-6ZMNTRU3.js.map → chunk-ZAEPD4C2.js.map} +0 -0
- /package/dist/{chunk-KQW3YGEN.js.map → chunk-ZRMMXWYI.js.map} +0 -0
- /package/dist/{chunk-MCRVQ5YQ.js.map → chunk-ZZCR2QYL.js.map} +0 -0
|
@@ -98,7 +98,8 @@ import {
|
|
|
98
98
|
type RecallInvocationOptions,
|
|
99
99
|
} from "../orchestrator.js";
|
|
100
100
|
import { isGenericRecallExcludedPath } from "./generic-recall-paths.js";
|
|
101
|
-
import {
|
|
101
|
+
import { filterRecentScanMemories } from "../recall-state-view-anchors.js";
|
|
102
|
+
import { indexStateViewAnnotatedResults, resolveRecallStateViewActive } from "../recall-state-view-admission.js";
|
|
102
103
|
import type { RecallSectionBuckets } from "./recall-section-coordinator.js";
|
|
103
104
|
import {
|
|
104
105
|
reconcileRecallResultPartition,
|
|
@@ -242,8 +243,11 @@ export class RecallInternalCoordinator {
|
|
|
242
243
|
this.deps.effectiveCronRecallInstructionHeavyTokenCap(),
|
|
243
244
|
cronConversationRecallMode: this.deps.config.cronConversationRecallMode,
|
|
244
245
|
});
|
|
246
|
+
// #1952 state views: config flag OR per-call override, gated on change intent; computed once for all branches.
|
|
245
247
|
const retrievalQuery = queryPolicy.retrievalQuery || prompt;
|
|
246
|
-
const stateViewActive = resolveRecallStateViewActive(options, this.deps.config,
|
|
248
|
+
const stateViewActive = resolveRecallStateViewActive(options, this.deps.config, prompt);
|
|
249
|
+
const stateViewPacketActive =
|
|
250
|
+
stateViewActive === true && !(typeof asOfMs === "number" && Number.isFinite(asOfMs));
|
|
247
251
|
const retrievalQueryHash = createHash("sha256")
|
|
248
252
|
.update(retrievalQuery)
|
|
249
253
|
.digest("hex");
|
|
@@ -3996,17 +4000,19 @@ export class RecallInternalCoordinator {
|
|
|
3996
4000
|
recallResultLimit,
|
|
3997
4001
|
retrievalQuery,
|
|
3998
4002
|
caps,
|
|
4003
|
+
stateViewPacketActive,
|
|
3999
4004
|
)
|
|
4000
4005
|
: null;
|
|
4001
4006
|
memoryResults = hotQmdPartition
|
|
4002
4007
|
? [...hotQmdPartition.appliedResults]
|
|
4003
|
-
: this.deps.
|
|
4008
|
+
: this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
|
|
4004
4009
|
"memories",
|
|
4005
4010
|
memoryResults,
|
|
4006
4011
|
recallResultLimit,
|
|
4007
4012
|
retrievalQuery,
|
|
4008
4013
|
caps,
|
|
4009
|
-
|
|
4014
|
+
stateViewPacketActive,
|
|
4015
|
+
).appliedResults;
|
|
4010
4016
|
// E-Mem-inspired memory reconstruction: fill gaps for referenced entities
|
|
4011
4017
|
if (resolveRecallEnhancementCapabilities(this.deps.config).memoryReconstruction && memoryResults.length > 0) {
|
|
4012
4018
|
try {
|
|
@@ -4120,27 +4126,8 @@ export class RecallInternalCoordinator {
|
|
|
4120
4126
|
},
|
|
4121
4127
|
[] as QmdSearchResult[],
|
|
4122
4128
|
);
|
|
4123
|
-
|
|
4124
|
-
|
|
4125
|
-
? this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
|
|
4126
|
-
"memories",
|
|
4127
|
-
scoped,
|
|
4128
|
-
recallResultLimit,
|
|
4129
|
-
retrievalQuery,
|
|
4130
|
-
caps,
|
|
4131
|
-
)
|
|
4132
|
-
: null;
|
|
4133
|
-
scoped =
|
|
4134
|
-
embeddingPartition?.appliedResults ??
|
|
4135
|
-
this.deps.diversifyAndLimitRecallResults(
|
|
4136
|
-
"memories",
|
|
4137
|
-
scoped,
|
|
4138
|
-
recallResultLimit,
|
|
4139
|
-
retrievalQuery,
|
|
4140
|
-
caps,
|
|
4141
|
-
);
|
|
4142
|
-
// Issue #1577 — apply TrustScore on the embedding-fallback path so the
|
|
4143
|
-
// feature gate is consistent across ALL recall paths (rule 41 parity).
|
|
4129
|
+
// Issue #1577 — trust filter before packet cap (AGENTS.md order).
|
|
4130
|
+
// Feature gate is consistent across ALL recall paths (rule 41 parity).
|
|
4144
4131
|
{
|
|
4145
4132
|
// Deadline-bound (issue #1905). This branch has no preloaded
|
|
4146
4133
|
// frontmatter map (boost ran without one), so pass undefined and let
|
|
@@ -4173,6 +4160,27 @@ export class RecallInternalCoordinator {
|
|
|
4173
4160
|
success: !trustFellBack,
|
|
4174
4161
|
});
|
|
4175
4162
|
}
|
|
4163
|
+
const embeddingPartition =
|
|
4164
|
+
options.xrayCapture === true
|
|
4165
|
+
? this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
|
|
4166
|
+
"memories",
|
|
4167
|
+
scoped,
|
|
4168
|
+
recallResultLimit,
|
|
4169
|
+
retrievalQuery,
|
|
4170
|
+
caps,
|
|
4171
|
+
stateViewPacketActive,
|
|
4172
|
+
)
|
|
4173
|
+
: null;
|
|
4174
|
+
scoped =
|
|
4175
|
+
embeddingPartition?.appliedResults ??
|
|
4176
|
+
this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
|
|
4177
|
+
"memories",
|
|
4178
|
+
scoped,
|
|
4179
|
+
recallResultLimit,
|
|
4180
|
+
retrievalQuery,
|
|
4181
|
+
caps,
|
|
4182
|
+
stateViewPacketActive,
|
|
4183
|
+
).appliedResults;
|
|
4176
4184
|
if (scoped.length > 0) {
|
|
4177
4185
|
if (shouldPersistGraphSnapshot) {
|
|
4178
4186
|
graphSnapshotFinalResults = this.deps.buildGraphRecallRankedResults(
|
|
@@ -4338,27 +4346,8 @@ export class RecallInternalCoordinator {
|
|
|
4338
4346
|
},
|
|
4339
4347
|
[] as QmdSearchResult[],
|
|
4340
4348
|
);
|
|
4341
|
-
|
|
4342
|
-
|
|
4343
|
-
? this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
|
|
4344
|
-
"memories",
|
|
4345
|
-
scoped,
|
|
4346
|
-
recallResultLimit,
|
|
4347
|
-
retrievalQuery,
|
|
4348
|
-
caps,
|
|
4349
|
-
)
|
|
4350
|
-
: null;
|
|
4351
|
-
scoped =
|
|
4352
|
-
embeddingPartition?.appliedResults ??
|
|
4353
|
-
this.deps.diversifyAndLimitRecallResults(
|
|
4354
|
-
"memories",
|
|
4355
|
-
scoped,
|
|
4356
|
-
recallResultLimit,
|
|
4357
|
-
retrievalQuery,
|
|
4358
|
-
caps,
|
|
4359
|
-
);
|
|
4360
|
-
// Issue #1577 — apply TrustScore on the embedding-fallback path so the
|
|
4361
|
-
// feature gate is consistent across ALL recall paths (rule 41 parity).
|
|
4349
|
+
// Issue #1577 — trust filter before packet cap (AGENTS.md order).
|
|
4350
|
+
// Feature gate is consistent across ALL recall paths (rule 41 parity).
|
|
4362
4351
|
{
|
|
4363
4352
|
// Deadline-bound (issue #1905); no preloaded map on this branch.
|
|
4364
4353
|
const trustT0 = Date.now();
|
|
@@ -4388,6 +4377,27 @@ export class RecallInternalCoordinator {
|
|
|
4388
4377
|
success: !trustFellBack,
|
|
4389
4378
|
});
|
|
4390
4379
|
}
|
|
4380
|
+
const embeddingPartition =
|
|
4381
|
+
options.xrayCapture === true
|
|
4382
|
+
? this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
|
|
4383
|
+
"memories",
|
|
4384
|
+
scoped,
|
|
4385
|
+
recallResultLimit,
|
|
4386
|
+
retrievalQuery,
|
|
4387
|
+
caps,
|
|
4388
|
+
stateViewPacketActive,
|
|
4389
|
+
)
|
|
4390
|
+
: null;
|
|
4391
|
+
scoped =
|
|
4392
|
+
embeddingPartition?.appliedResults ??
|
|
4393
|
+
this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
|
|
4394
|
+
"memories",
|
|
4395
|
+
scoped,
|
|
4396
|
+
recallResultLimit,
|
|
4397
|
+
retrievalQuery,
|
|
4398
|
+
caps,
|
|
4399
|
+
stateViewPacketActive,
|
|
4400
|
+
).appliedResults;
|
|
4391
4401
|
if (scoped.length > 0) {
|
|
4392
4402
|
if (shouldPersistGraphSnapshot) {
|
|
4393
4403
|
graphSnapshotFinalResults = this.deps.buildGraphRecallRankedResults(
|
|
@@ -4427,16 +4437,15 @@ export class RecallInternalCoordinator {
|
|
|
4427
4437
|
[] as MemoryFile[],
|
|
4428
4438
|
);
|
|
4429
4439
|
if (memories.length > 0) {
|
|
4430
|
-
const activeMemories =
|
|
4431
|
-
|
|
4432
|
-
this.deps.
|
|
4433
|
-
|
|
4440
|
+
const activeMemories = filterRecentScanMemories(memories, {
|
|
4441
|
+
stateViewActive, asOfMs,
|
|
4442
|
+
namespaceOf: (p) => this.deps.namespaceFromPath(p),
|
|
4443
|
+
isExcluded: (p) => isGenericRecallExcludedPath(p, this.deps.config),
|
|
4444
|
+
supersessionOptions: {
|
|
4434
4445
|
enabled: lifecycleCaps.temporalSupersession,
|
|
4435
4446
|
includeInRecall: this.deps.config.temporalSupersessionIncludeInRecall,
|
|
4436
4447
|
},
|
|
4437
|
-
|
|
4438
|
-
asOfMs,
|
|
4439
|
-
);
|
|
4448
|
+
});
|
|
4440
4449
|
// Convert to QmdSearchResult with recency baseline, then boost so
|
|
4441
4450
|
// temporal/tag boosts match the QMD path. Cap AFTER boosting, and
|
|
4442
4451
|
// pass a pre-populated memoryByPath to skip redundant disk reads.
|
|
@@ -4541,27 +4550,8 @@ export class RecallInternalCoordinator {
|
|
|
4541
4550
|
},
|
|
4542
4551
|
[] as QmdSearchResult[],
|
|
4543
4552
|
);
|
|
4544
|
-
|
|
4545
|
-
|
|
4546
|
-
? this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
|
|
4547
|
-
"memories",
|
|
4548
|
-
recent,
|
|
4549
|
-
recallResultLimit,
|
|
4550
|
-
retrievalQuery,
|
|
4551
|
-
caps,
|
|
4552
|
-
)
|
|
4553
|
-
: null;
|
|
4554
|
-
recent =
|
|
4555
|
-
recentPartition?.appliedResults ??
|
|
4556
|
-
this.deps.diversifyAndLimitRecallResults(
|
|
4557
|
-
"memories",
|
|
4558
|
-
recent,
|
|
4559
|
-
recallResultLimit,
|
|
4560
|
-
retrievalQuery,
|
|
4561
|
-
caps,
|
|
4562
|
-
);
|
|
4563
|
-
// Issue #1577 — apply TrustScore on the recent-scan path so the
|
|
4564
|
-
// feature gate is consistent across ALL recall paths (rule 41).
|
|
4553
|
+
// Issue #1577 — trust filter before packet cap (AGENTS.md order).
|
|
4554
|
+
// Feature gate is consistent across ALL recall paths (rule 41).
|
|
4565
4555
|
{
|
|
4566
4556
|
// Deadline-bound (issue #1905). The recent-scan branch already
|
|
4567
4557
|
// loaded every candidate's MemoryFile (queryAwareScopedMemories),
|
|
@@ -4597,6 +4587,27 @@ export class RecallInternalCoordinator {
|
|
|
4597
4587
|
success: !trustFellBack,
|
|
4598
4588
|
});
|
|
4599
4589
|
}
|
|
4590
|
+
const recentPartition =
|
|
4591
|
+
options.xrayCapture === true
|
|
4592
|
+
? this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
|
|
4593
|
+
"memories",
|
|
4594
|
+
recent,
|
|
4595
|
+
recallResultLimit,
|
|
4596
|
+
retrievalQuery,
|
|
4597
|
+
caps,
|
|
4598
|
+
stateViewPacketActive,
|
|
4599
|
+
)
|
|
4600
|
+
: null;
|
|
4601
|
+
recent =
|
|
4602
|
+
recentPartition?.appliedResults ??
|
|
4603
|
+
this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
|
|
4604
|
+
"memories",
|
|
4605
|
+
recent,
|
|
4606
|
+
recallResultLimit,
|
|
4607
|
+
retrievalQuery,
|
|
4608
|
+
caps,
|
|
4609
|
+
stateViewPacketActive,
|
|
4610
|
+
).appliedResults;
|
|
4600
4611
|
if (recent.length > 0) {
|
|
4601
4612
|
if (shouldPersistGraphSnapshot) {
|
|
4602
4613
|
graphSnapshotFinalResults = this.deps.buildGraphRecallRankedResults(
|
|
@@ -39,6 +39,7 @@ import type { TrustSignals } from "../trust-score.js";
|
|
|
39
39
|
import { reorderRecallResultsWithMmr } from "../recall-mmr.js";
|
|
40
40
|
import { applyReasoningTraceBoost } from "../reasoning-trace-recall.js";
|
|
41
41
|
import { memoryMapKey } from "../recall-memory-map.js";
|
|
42
|
+
import { capStateViewPackets, reconcileStateViewPairs } from "../recall-state-view.js";
|
|
42
43
|
|
|
43
44
|
export interface RecallResultPartition {
|
|
44
45
|
appliedResults: QmdSearchResult[];
|
|
@@ -621,12 +622,28 @@ export class RecallRerankCoordinator {
|
|
|
621
622
|
limit: number,
|
|
622
623
|
retrievalQuery?: string,
|
|
623
624
|
caps: CapabilitySet = resolveCapabilities(this.getConfig()),
|
|
625
|
+
/**
|
|
626
|
+
* #2859 — state-view packet semantics. When true, superseded rows are
|
|
627
|
+
* reconciled against their successors BEFORE MMR (orphan removal can
|
|
628
|
+
* never underfill), and the cap counts complete evidence packets: a
|
|
629
|
+
* predecessor admitted alongside its successor consumes ONE slot and
|
|
630
|
+
* the slice never splits the pair at the boundary. Absent/false keeps
|
|
631
|
+
* the legacy slice byte-identical.
|
|
632
|
+
*/
|
|
633
|
+
stateViewActive?: boolean,
|
|
624
634
|
): RecallResultPartition {
|
|
625
635
|
const safeLimit =
|
|
626
636
|
typeof limit === "number" && Number.isFinite(limit)
|
|
627
637
|
? Math.max(0, Math.floor(limit))
|
|
628
638
|
: 0;
|
|
629
|
-
|
|
639
|
+
// #2859: reconcile pairs before the user cap/MMR so orphan removal
|
|
640
|
+
// happens pre-truncation, never post-cap.
|
|
641
|
+
const candidates =
|
|
642
|
+
stateViewActive === true && Array.isArray(results)
|
|
643
|
+
? reconcileStateViewPairs(results)
|
|
644
|
+
: Array.isArray(results)
|
|
645
|
+
? results
|
|
646
|
+
: [];
|
|
630
647
|
let orderedPool: QmdSearchResult[] | undefined;
|
|
631
648
|
const resolveOrderedPool = (): QmdSearchResult[] => {
|
|
632
649
|
if (orderedPool) return orderedPool;
|
|
@@ -640,15 +657,32 @@ export class RecallRerankCoordinator {
|
|
|
640
657
|
orderedPool = this.applyMmrToQmdResults(sectionId, boosted, caps);
|
|
641
658
|
return orderedPool;
|
|
642
659
|
};
|
|
660
|
+
let appliedCache: QmdSearchResult[] | undefined;
|
|
661
|
+
const resolveApplied = (): QmdSearchResult[] => {
|
|
662
|
+
if (appliedCache) return appliedCache;
|
|
663
|
+
if (safeLimit === 0 || candidates.length === 0) {
|
|
664
|
+
appliedCache = [];
|
|
665
|
+
return appliedCache;
|
|
666
|
+
}
|
|
667
|
+
const ordered = resolveOrderedPool();
|
|
668
|
+
// #2859: the cap counts complete evidence packets, not rows.
|
|
669
|
+
appliedCache =
|
|
670
|
+
stateViewActive === true ? capStateViewPackets(ordered, safeLimit) : ordered.slice(0, safeLimit);
|
|
671
|
+
return appliedCache;
|
|
672
|
+
};
|
|
643
673
|
|
|
644
674
|
return {
|
|
645
675
|
get appliedResults(): QmdSearchResult[] {
|
|
646
|
-
|
|
647
|
-
return resolveOrderedPool().slice(0, safeLimit);
|
|
676
|
+
return resolveApplied().slice();
|
|
648
677
|
},
|
|
649
678
|
get headroomResults(): QmdSearchResult[] {
|
|
650
679
|
if (candidates.length === 0) return [];
|
|
651
|
-
|
|
680
|
+
const ordered = resolveOrderedPool();
|
|
681
|
+
if (stateViewActive === true) {
|
|
682
|
+
const applied = new Set(resolveApplied());
|
|
683
|
+
return ordered.filter((row) => !applied.has(row));
|
|
684
|
+
}
|
|
685
|
+
return ordered.slice(safeLimit);
|
|
652
686
|
},
|
|
653
687
|
};
|
|
654
688
|
}
|
|
@@ -659,6 +693,8 @@ export class RecallRerankCoordinator {
|
|
|
659
693
|
limit: number,
|
|
660
694
|
retrievalQuery?: string,
|
|
661
695
|
caps: CapabilitySet = resolveCapabilities(this.getConfig()),
|
|
696
|
+
/** #2859 — see diversifyRecallResultsWithHeadroom. */
|
|
697
|
+
stateViewActive?: boolean,
|
|
662
698
|
): QmdSearchResult[] {
|
|
663
699
|
return this.diversifyRecallResultsWithHeadroom(
|
|
664
700
|
sectionId,
|
|
@@ -666,6 +702,7 @@ export class RecallRerankCoordinator {
|
|
|
666
702
|
limit,
|
|
667
703
|
retrievalQuery,
|
|
668
704
|
caps,
|
|
705
|
+
stateViewActive,
|
|
669
706
|
).appliedResults;
|
|
670
707
|
}
|
|
671
708
|
|
|
@@ -45,6 +45,7 @@ import {
|
|
|
45
45
|
} from "./recall-search-prefilter.js";
|
|
46
46
|
import { shouldFilterSupersededFromRecall } from "../temporal-supersession.js";
|
|
47
47
|
import { isValidAsOf, isValidityExpiredNow } from "../temporal-validity.js";
|
|
48
|
+
import { StateViewAnchorTracker, stateViewPacketActive } from "../recall-state-view-anchors.js";
|
|
48
49
|
import type { TrustStageResultItem } from "../trust-score-stage.js";
|
|
49
50
|
import type { MemoryFile, PluginConfig, QmdSearchResult, RecallPlanMode } from "../types.js";
|
|
50
51
|
import {
|
|
@@ -987,17 +988,22 @@ export class RecallSearchPipelineCoordinator {
|
|
|
987
988
|
options.recallResultLimit,
|
|
988
989
|
options.prompt,
|
|
989
990
|
caps,
|
|
991
|
+
// #2859: packet semantics are off under a historical asOf pin.
|
|
992
|
+
stateViewPacketActive(options.stateViewActive, options.asOfMs),
|
|
990
993
|
);
|
|
991
994
|
options.resultPartitionSink.partition = partition;
|
|
992
995
|
return partition.appliedResults;
|
|
993
996
|
}
|
|
994
|
-
return this.deps.
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
997
|
+
return this.deps.recallRerankCoordinator
|
|
998
|
+
.diversifyRecallResultsWithHeadroom(
|
|
999
|
+
"memories",
|
|
1000
|
+
results,
|
|
1001
|
+
options.recallResultLimit,
|
|
1002
|
+
options.prompt,
|
|
1003
|
+
caps,
|
|
1004
|
+
stateViewPacketActive(options.stateViewActive, options.asOfMs),
|
|
1005
|
+
)
|
|
1006
|
+
.appliedResults;
|
|
1001
1007
|
}
|
|
1002
1008
|
|
|
1003
1009
|
async loadSearchResultMemoryMap(
|
|
@@ -1132,10 +1138,11 @@ export class RecallSearchPipelineCoordinator {
|
|
|
1132
1138
|
// when its successor SURVIVES this filter — a successor rejected by
|
|
1133
1139
|
// the connector/lifecycle/validity/dedicated-surface/status gates
|
|
1134
1140
|
// must never anchor (or spend a result slot on) its superseded row.
|
|
1135
|
-
//
|
|
1136
|
-
//
|
|
1141
|
+
// #2859: anchors are namespace-qualified and include the successor
|
|
1142
|
+
// `supersedes` back-pointer (see StateViewAnchorTracker); superseded
|
|
1143
|
+
// rows defer admission to the post-pass fixpoint.
|
|
1137
1144
|
const stateViewActive = options?.stateViewActive === true;
|
|
1138
|
-
const
|
|
1145
|
+
const stateViewAnchors = stateViewActive ? new StateViewAnchorTracker() : null;
|
|
1139
1146
|
const stateViewDeferred: number[] = [];
|
|
1140
1147
|
const stateViewBuilt: (QmdSearchResult | null)[] | null = stateViewActive
|
|
1141
1148
|
? new Array<QmdSearchResult | null>(results.length).fill(null)
|
|
@@ -1150,8 +1157,11 @@ export class RecallSearchPipelineCoordinator {
|
|
|
1150
1157
|
? {
|
|
1151
1158
|
id: memory.frontmatter.id,
|
|
1152
1159
|
status: memory.frontmatter.status,
|
|
1160
|
+
supersedes: memory.frontmatter.supersedes,
|
|
1153
1161
|
supersededBy: memory.frontmatter.supersededBy,
|
|
1154
1162
|
supersededAt: memory.frontmatter.supersededAt,
|
|
1163
|
+
validAt: memory.frontmatter.valid_at,
|
|
1164
|
+
invalidAt: memory.frontmatter.invalid_at,
|
|
1155
1165
|
}
|
|
1156
1166
|
: {}),
|
|
1157
1167
|
});
|
|
@@ -1307,10 +1317,7 @@ export class RecallSearchPipelineCoordinator {
|
|
|
1307
1317
|
const builtRow = buildRecallRow(r, memory);
|
|
1308
1318
|
if (stateViewBuilt !== null) {
|
|
1309
1319
|
stateViewBuilt[resultIdx] = builtRow;
|
|
1310
|
-
if (memory)
|
|
1311
|
-
const id = memory.frontmatter.id;
|
|
1312
|
-
if (typeof id === "string" && id.length > 0) stateViewSurvivorIds!.add(id);
|
|
1313
|
-
}
|
|
1320
|
+
if (memory && stateViewAnchors) stateViewAnchors.admit(r.namespace, memory.frontmatter);
|
|
1314
1321
|
}
|
|
1315
1322
|
filtered.push(builtRow);
|
|
1316
1323
|
}
|
|
@@ -1324,12 +1331,12 @@ export class RecallSearchPipelineCoordinator {
|
|
|
1324
1331
|
progress = false;
|
|
1325
1332
|
for (const deferredIdx of stateViewDeferred) {
|
|
1326
1333
|
if (admitted.has(deferredIdx)) continue;
|
|
1327
|
-
const
|
|
1334
|
+
const deferredRow = results[deferredIdx]!;
|
|
1335
|
+
const deferredMemory = memoryForResult(memoryByPath, deferredRow);
|
|
1328
1336
|
if (!deferredMemory) continue;
|
|
1329
|
-
if (
|
|
1337
|
+
if (stateViewAnchors!.anchored(deferredRow.namespace, deferredMemory.frontmatter)) {
|
|
1330
1338
|
admitted.add(deferredIdx);
|
|
1331
|
-
|
|
1332
|
-
if (typeof id === "string" && id.length > 0) stateViewSurvivorIds!.add(id);
|
|
1339
|
+
stateViewAnchors!.admit(deferredRow.namespace, deferredMemory.frontmatter);
|
|
1333
1340
|
progress = true;
|
|
1334
1341
|
}
|
|
1335
1342
|
}
|
|
@@ -209,3 +209,92 @@ test("an anchored predecessor keeps its rank position when admitted", async () =
|
|
|
209
209
|
await rm(memoryDir, { recursive: true, force: true });
|
|
210
210
|
}
|
|
211
211
|
});
|
|
212
|
+
|
|
213
|
+
test("#2859 namespace fanout collision: a same-id successor in another namespace cannot anchor", async () => {
|
|
214
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-sv-fanout-"));
|
|
215
|
+
try {
|
|
216
|
+
const coordinator = await makeCoordinator(memoryDir);
|
|
217
|
+
const A_OLD = "facts/a-old.md";
|
|
218
|
+
const B_NEW = "facts/b-new.md";
|
|
219
|
+
// ns-a: superseded predecessor whose successor id m-1 is NOT in the
|
|
220
|
+
// candidate set. ns-b: an unrelated active row that reuses id m-1.
|
|
221
|
+
// Bare-id matching (pre-#2859) admitted the ns-a predecessor on the
|
|
222
|
+
// ns-b anchor; qualified keys must not.
|
|
223
|
+
const results: QmdSearchResult[] = [
|
|
224
|
+
{ ...result(B_NEW, 0.9), namespace: "ns-b" },
|
|
225
|
+
{ ...result(A_OLD, 0.7), namespace: "ns-a" },
|
|
226
|
+
];
|
|
227
|
+
const memories = new Map<string, MemoryFile>([
|
|
228
|
+
[`ns-b\0${B_NEW}`, memory(B_NEW, { id: "m-1", status: "active" })],
|
|
229
|
+
[
|
|
230
|
+
`ns-a\0${A_OLD}`,
|
|
231
|
+
memory(A_OLD, {
|
|
232
|
+
id: "m-0",
|
|
233
|
+
status: "superseded",
|
|
234
|
+
supersededBy: "m-1",
|
|
235
|
+
supersededAt: "2026-08-01",
|
|
236
|
+
}),
|
|
237
|
+
],
|
|
238
|
+
]);
|
|
239
|
+
const safe = coordinator.filterSearchResultsByRecallSafety(results, memories, {
|
|
240
|
+
stateViewActive: true,
|
|
241
|
+
});
|
|
242
|
+
assert.deepEqual(
|
|
243
|
+
safe.map((r) => r.path),
|
|
244
|
+
[B_NEW],
|
|
245
|
+
"a foreign-namespace successor must never anchor the superseded row"
|
|
246
|
+
);
|
|
247
|
+
|
|
248
|
+
// Positive control: ns-a's own m-1 present → the pair is admitted.
|
|
249
|
+
const A_NEW = "facts/a-new.md";
|
|
250
|
+
const pairResults: QmdSearchResult[] = [
|
|
251
|
+
{ ...result(A_NEW, 0.9), namespace: "ns-a" },
|
|
252
|
+
{ ...result(A_OLD, 0.7), namespace: "ns-a" },
|
|
253
|
+
];
|
|
254
|
+
const pairMemories = new Map<string, MemoryFile>([
|
|
255
|
+
[`ns-a\0${A_NEW}`, memory(A_NEW, { id: "m-1", status: "active" })],
|
|
256
|
+
[`ns-a\0${A_OLD}`, memories.get(`ns-a\0${A_OLD}`)!],
|
|
257
|
+
]);
|
|
258
|
+
const pair = coordinator.filterSearchResultsByRecallSafety(pairResults, pairMemories, {
|
|
259
|
+
stateViewActive: true,
|
|
260
|
+
});
|
|
261
|
+
assert.deepEqual(
|
|
262
|
+
pair.map((r) => r.path),
|
|
263
|
+
[A_NEW, A_OLD],
|
|
264
|
+
"the same-namespace successor anchors the pair as before"
|
|
265
|
+
);
|
|
266
|
+
} finally {
|
|
267
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
test("#2859 back-pointer anchors a deferred row whose supersededBy is absent", async () => {
|
|
272
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-sv-backptr-"));
|
|
273
|
+
try {
|
|
274
|
+
const coordinator = await makeCoordinator(memoryDir);
|
|
275
|
+
const results = [result(NEW, 0.9), result(OLD, 0.7)];
|
|
276
|
+
const memories = new Map<string, MemoryFile>([
|
|
277
|
+
[NEW, memory(NEW, { id: "m-new", status: "active", supersedes: "m-old" })],
|
|
278
|
+
[
|
|
279
|
+
OLD,
|
|
280
|
+
memory(OLD, {
|
|
281
|
+
id: "m-old",
|
|
282
|
+
status: "superseded",
|
|
283
|
+
supersededAt: "2026-08-01",
|
|
284
|
+
}),
|
|
285
|
+
],
|
|
286
|
+
]);
|
|
287
|
+
const safe = coordinator.filterSearchResultsByRecallSafety(results, memories, {
|
|
288
|
+
stateViewActive: true,
|
|
289
|
+
});
|
|
290
|
+
assert.deepEqual(
|
|
291
|
+
safe.map((r) => r.path),
|
|
292
|
+
[NEW, OLD],
|
|
293
|
+
"the successor's supersedes back-pointer must admit its predecessor"
|
|
294
|
+
);
|
|
295
|
+
assert.equal(safe[1]?.supersedes, undefined, "the admitted row itself has no back-pointer");
|
|
296
|
+
assert.equal(safe[0]?.supersedes, "m-old", "the survivor carries its supersedes back-pointer");
|
|
297
|
+
} finally {
|
|
298
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
299
|
+
}
|
|
300
|
+
});
|
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
* within its file-size ratchet. Everything here derives from the re-read
|
|
5
5
|
* COMMITTED record; nothing reads the incoming extraction.
|
|
6
6
|
*/
|
|
7
|
-
|
|
7
|
+
import { createHash } from "node:crypto";
|
|
8
|
+
import { readFile } from "node:fs/promises";
|
|
9
|
+
import { canonicalSemanticFileText } from "../storage/cas-revision-store.js";
|
|
8
10
|
import { parseOriginClass } from "../security/origin-authority.js";
|
|
9
11
|
import { log } from "../logger.js";
|
|
10
12
|
import { inferMemoryStatus } from "../memory-lifecycle-ledger-utils.js";
|
|
@@ -76,6 +78,15 @@ export interface MergedTargetPromotionPayload {
|
|
|
76
78
|
committedRevision?: string;
|
|
77
79
|
/** #2813 (P1 B): sha256 hex digest of the durable memory file when committed. */
|
|
78
80
|
committedDigest?: string;
|
|
81
|
+
/** #2870: canonical SEMANTIC fingerprint of the durable file at
|
|
82
|
+
* payload-build time — access telemetry (`accessCount`/`lastAccessed`)
|
|
83
|
+
* excluded, the same exclusion set `invalidationCommitFingerprint`
|
|
84
|
+
* applies. The final guard re-reads the file and compares THIS, not the
|
|
85
|
+
* byte digest: an access-tracking flush between build and promotion
|
|
86
|
+
* leaves it equal (the flush mints no receipt and touches no semantic
|
|
87
|
+
* line), while any body/confidence/provenance/scope/tags/status change
|
|
88
|
+
* makes it differ. */
|
|
89
|
+
committedSemanticFingerprint?: string;
|
|
79
90
|
}
|
|
80
91
|
|
|
81
92
|
/**
|
|
@@ -151,13 +162,22 @@ export async function buildMergedTargetPromotionPayload(
|
|
|
151
162
|
return { payload: null, readFailed: false };
|
|
152
163
|
}
|
|
153
164
|
const fm = committed.frontmatter;
|
|
154
|
-
// #
|
|
155
|
-
//
|
|
156
|
-
//
|
|
165
|
+
// #2870: bind to the record's SEMANTIC identity, not its bytes. The
|
|
166
|
+
// receipt's committed semantic fingerprint — the durable file with the
|
|
167
|
+
// access-telemetry keys (`accessCount:`, `lastAccessed:`) stripped, the
|
|
168
|
+
// same exclusion set `invalidationCommitFingerprint` applies — stays
|
|
169
|
+
// equal across an access-tracking flush (which rewrites exactly those
|
|
170
|
+
// two lines without minting a receipt), so a flush between the merge
|
|
171
|
+
// commit and this reread no longer blocks a valid promotion. Any other
|
|
172
|
+
// frontmatter or body change still refuses. Shards recorded before
|
|
173
|
+
// #2870 carry no stored semantic fingerprint; those keep the stricter
|
|
174
|
+
// full-digest comparison until the next semantic write re-records the
|
|
175
|
+
// shard.
|
|
157
176
|
const snapshotDigest =
|
|
158
177
|
typeof storage.readDurableFileDigest === "function"
|
|
159
178
|
? await storage.readDurableFileDigest(committed.path).catch(() => null)
|
|
160
179
|
: null;
|
|
180
|
+
const snapshotSemanticFingerprint = await readDurableSemanticFingerprint(committed.path);
|
|
161
181
|
const receipt = await readPromotionReceiptStatus(storage, committed.path);
|
|
162
182
|
if (!receipt.available) {
|
|
163
183
|
log.warn(
|
|
@@ -165,7 +185,22 @@ export async function buildMergedTargetPromotionPayload(
|
|
|
165
185
|
);
|
|
166
186
|
return { payload: null, readFailed: true };
|
|
167
187
|
}
|
|
168
|
-
if (
|
|
188
|
+
if (
|
|
189
|
+
receipt.committedSemanticFingerprint !== undefined &&
|
|
190
|
+
snapshotSemanticFingerprint !== receipt.committedSemanticFingerprint
|
|
191
|
+
) {
|
|
192
|
+
log.warn(
|
|
193
|
+
snapshotSemanticFingerprint == null
|
|
194
|
+
? `semantic-merge: merged-target promotion refused for ${merge.targetId} — the semantic snapshot fingerprint is unavailable while the CAS receipt carries ${receipt.committedSemanticFingerprint}; promotion and reconciliation retry on the next merge`
|
|
195
|
+
: `semantic-merge: merged-target promotion refused for ${merge.targetId} — record semantic fingerprint (${snapshotSemanticFingerprint}) does not match committed receipt fingerprint (${receipt.committedSemanticFingerprint}); record metadata was mutated concurrently`,
|
|
196
|
+
);
|
|
197
|
+
return { payload: null, readFailed: true };
|
|
198
|
+
}
|
|
199
|
+
if (
|
|
200
|
+
receipt.committedSemanticFingerprint === undefined &&
|
|
201
|
+
receipt.committedDigest !== undefined &&
|
|
202
|
+
snapshotDigest !== receipt.committedDigest
|
|
203
|
+
) {
|
|
169
204
|
log.warn(
|
|
170
205
|
snapshotDigest == null
|
|
171
206
|
? `semantic-merge: merged-target promotion refused for ${merge.targetId} — the record snapshot digest is unavailable while the CAS receipt carries committed digest ${receipt.committedDigest}; promotion and reconciliation retry on the next merge`
|
|
@@ -210,11 +245,30 @@ export async function buildMergedTargetPromotionPayload(
|
|
|
210
245
|
: snapshotDigest !== null
|
|
211
246
|
? { committedDigest: snapshotDigest }
|
|
212
247
|
: {}),
|
|
248
|
+
...(receipt.committedSemanticFingerprint !== undefined
|
|
249
|
+
? { committedSemanticFingerprint: receipt.committedSemanticFingerprint }
|
|
250
|
+
: snapshotSemanticFingerprint !== null
|
|
251
|
+
? { committedSemanticFingerprint: snapshotSemanticFingerprint }
|
|
252
|
+
: {}),
|
|
213
253
|
},
|
|
214
254
|
readFailed: false,
|
|
215
255
|
};
|
|
216
256
|
}
|
|
217
257
|
|
|
258
|
+
/** #2870: canonical SEMANTIC fingerprint of a durable file's CURRENT
|
|
259
|
+
* bytes — the file text with access telemetry stripped
|
|
260
|
+
* ({@link canonicalSemanticFileText}), hashed exactly the way the CAS
|
|
261
|
+
* receipt records it at commit time. Null when the file cannot be read
|
|
262
|
+
* (fail-open, like readDurableFileDigest). */
|
|
263
|
+
export async function readDurableSemanticFingerprint(filePath: string): Promise<string | null> {
|
|
264
|
+
try {
|
|
265
|
+
return createHash("sha256")
|
|
266
|
+
.update(canonicalSemanticFileText(await readFile(filePath, "utf8")))
|
|
267
|
+
.digest("hex");
|
|
268
|
+
} catch {
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
218
272
|
/** #2813 (P1 A): read the standing receipt as a three-way truth for the
|
|
219
273
|
* promotion path. Present and absent are usable identities (absent = the
|
|
220
274
|
* target predates the sidecar); unavailable is not. A storage whose status
|
|
@@ -223,7 +277,7 @@ export async function readPromotionReceiptStatus(
|
|
|
223
277
|
storage: Pick<StorageManager, "readCasRevisionStatus">,
|
|
224
278
|
filePath: string,
|
|
225
279
|
): Promise<
|
|
226
|
-
| { available: true; revision: string | undefined; committedDigest?: string }
|
|
280
|
+
| { available: true; revision: string | undefined; committedDigest?: string; committedSemanticFingerprint?: string }
|
|
227
281
|
| { available: false; reason: string }
|
|
228
282
|
> {
|
|
229
283
|
try {
|
|
@@ -233,6 +287,8 @@ export async function readPromotionReceiptStatus(
|
|
|
233
287
|
available: true,
|
|
234
288
|
revision: status.status === "present" ? status.revision : undefined,
|
|
235
289
|
committedDigest: status.status === "present" ? status.committedDigest : undefined,
|
|
290
|
+
committedSemanticFingerprint:
|
|
291
|
+
status.status === "present" ? status.committedSemanticFingerprint : undefined,
|
|
236
292
|
};
|
|
237
293
|
} catch (err) {
|
|
238
294
|
return { available: false, reason: err instanceof Error ? err.message : String(err) };
|