@remnic/core 9.69.89 → 9.69.90
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.js +68 -67
- package/dist/access-authorization-probe.js +69 -68
- package/dist/access-boundary.js +68 -67
- package/dist/access-cli.js +160 -158
- package/dist/access-cli.js.map +1 -1
- package/dist/access-extraction-force-flush.js +68 -67
- package/dist/access-http-briefing.js +69 -68
- package/dist/access-http-query.js +70 -69
- package/dist/access-http.js +91 -90
- package/dist/access-identity-continuity-surface.js +68 -67
- package/dist/access-lcm-surface.js +68 -67
- package/dist/access-mcp-output-schemas.d.ts.map +1 -1
- package/dist/access-mcp-output-schemas.js +1 -1
- package/dist/access-mcp.js +80 -79
- package/dist/access-memory-search-fanout.js +3 -3
- package/dist/access-namespace-preflight.js +68 -67
- package/dist/access-observe-write-category.js +7 -7
- package/dist/access-observe-write-surface.js +68 -67
- package/dist/access-offline-manifest.js +6 -6
- package/dist/access-operations-batch.js +70 -69
- package/dist/access-operations.js +77 -76
- package/dist/access-recall-concurrency.js +68 -67
- package/dist/access-recall-corpus-versions.d.ts +12 -0
- package/dist/access-recall-corpus-versions.d.ts.map +1 -0
- package/dist/access-recall-corpus-versions.js +10 -0
- package/dist/access-recall-diagnostics.js +5 -5
- package/dist/access-recall-response.d.ts +4 -0
- package/dist/access-recall-response.d.ts.map +1 -1
- package/dist/access-recall-response.js +68 -67
- package/dist/access-recall-surface.d.ts +8 -0
- package/dist/access-recall-surface.d.ts.map +1 -1
- package/dist/access-recall-surface.js +68 -67
- package/dist/access-schema.js +6 -6
- package/dist/access-service.d.ts +5 -0
- package/dist/access-service.d.ts.map +1 -1
- package/dist/access-service.js +68 -67
- package/dist/access-surface-catalog.js +70 -69
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/active-memory-bridge.js +3 -3
- package/dist/active-recall.js +23 -21
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- package/dist/{auto-sync-U5N3CB5Y.js → auto-sync-PAWBFQWL.js} +5 -5
- package/dist/briefing.js +19 -19
- package/dist/buffer.js +8 -8
- package/dist/calibration.js +2 -2
- package/dist/capabilities.d.ts +2 -1
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +1 -1
- package/dist/{capsule-crypto-GWVG7LGC.js → capsule-crypto-7FJQINUR.js} +2 -2
- package/dist/causal-consolidation.js +19 -19
- package/dist/{chunk-BMXEBWBT.js → chunk-2EMROIXS.js} +2 -1
- package/dist/{chunk-BMXEBWBT.js.map → chunk-2EMROIXS.js.map} +1 -1
- package/dist/{chunk-MCTM4YPL.js → chunk-2FLFJTCI.js} +4 -2
- package/dist/chunk-2FLFJTCI.js.map +1 -0
- package/dist/{chunk-RDJ6C7NZ.js → chunk-2IWBHZ3H.js} +5 -5
- package/dist/{chunk-UP75KL3L.js → chunk-2JRB3Z5N.js} +2 -2
- package/dist/{chunk-OWHERGF2.js → chunk-2NLLXCJG.js} +2 -2
- package/dist/{chunk-KN6CIN7I.js → chunk-32HO62I4.js} +2 -2
- package/dist/{chunk-JLPNONPH.js → chunk-35A7GCHG.js} +2 -2
- package/dist/{chunk-EAQQ2FD3.js → chunk-37ZQYFX4.js} +6 -6
- package/dist/{chunk-3QKO4QN7.js → chunk-3BTHXB7Z.js} +2 -2
- package/dist/{chunk-C7V3KPKJ.js → chunk-47LTKAGL.js} +2 -2
- package/dist/{chunk-3O5BB45T.js → chunk-4DXNOVNW.js} +10 -10
- package/dist/{chunk-65I2LZEK.js → chunk-4G2YCKLT.js} +2 -2
- package/dist/{chunk-JBH26P62.js → chunk-4GEBLO7S.js} +10 -10
- package/dist/{chunk-6MNKDTDI.js → chunk-4I6PEEFA.js} +3 -3
- package/dist/{chunk-Z4TXB4K7.js → chunk-5BUCKFRE.js} +2 -2
- package/dist/{chunk-7D7OUO5W.js → chunk-5S7SNRSJ.js} +2 -2
- package/dist/{chunk-NOL7SEWN.js → chunk-5YR4UGF2.js} +5 -5
- package/dist/{chunk-PMNLL2TL.js → chunk-6BG364RN.js} +2 -2
- package/dist/{chunk-AEJ3TE5H.js → chunk-76LNUSS5.js} +2 -2
- package/dist/{chunk-7CRUDH7G.js → chunk-77HNHT6S.js} +2 -2
- package/dist/{chunk-OWYHHW67.js → chunk-7XI2UJHL.js} +4 -4
- package/dist/{chunk-BJVO4H5C.js → chunk-7Z2UKRNJ.js} +4 -4
- package/dist/{chunk-2WLMWP2T.js → chunk-A3K2KKSG.js} +2 -2
- package/dist/chunk-A5ZYP4K5.js +130 -0
- package/dist/chunk-A5ZYP4K5.js.map +1 -0
- package/dist/{chunk-NMZVDRVP.js → chunk-ACCOC6UM.js} +2 -2
- package/dist/{chunk-3JDA3XF5.js → chunk-AEGNDL24.js} +2 -2
- package/dist/{chunk-IYIBGSHJ.js → chunk-AEUMONCD.js} +2 -2
- package/dist/{chunk-RMDGAAZF.js → chunk-AF5PW35O.js} +2 -2
- package/dist/{chunk-JUT3OR2L.js → chunk-ANGZWYL2.js} +6 -6
- package/dist/{chunk-6LYAEM54.js → chunk-AXHU56C3.js} +2 -2
- package/dist/{chunk-YPI4RQWV.js → chunk-BCGMG2RD.js} +2 -2
- package/dist/{chunk-HXCJF4XU.js → chunk-BFIZXFUG.js} +2 -2
- package/dist/{chunk-DBYAY6UW.js → chunk-BTOHGPHC.js} +3 -3
- package/dist/{chunk-YSWJXOOL.js → chunk-CAKHZAXH.js} +2 -2
- package/dist/{chunk-YSBL7VPO.js → chunk-CDWFWOSZ.js} +2 -2
- package/dist/{chunk-VA4O3U7U.js → chunk-CZ44FH45.js} +4 -4
- package/dist/{chunk-T3FMRLWQ.js → chunk-D5HQ3VEX.js} +4 -4
- package/dist/{chunk-S7LWX2PQ.js → chunk-DPG5HQLE.js} +4 -4
- package/dist/{chunk-7WBSMXGC.js → chunk-DVSAMW5T.js} +3 -3
- package/dist/{chunk-WBYQA3VN.js → chunk-E5H4TM4Y.js} +3 -3
- package/dist/{chunk-4RL3JOB3.js → chunk-EEDI3OXB.js} +2 -2
- package/dist/{chunk-3TB2XQ3C.js → chunk-EUL3S3LE.js} +4 -4
- package/dist/{chunk-XAITGGX5.js → chunk-F23U5YE7.js} +4 -4
- package/dist/{chunk-IIARQTZ2.js → chunk-GDVORIFM.js} +2 -2
- package/dist/{chunk-CALBQ2NG.js → chunk-GXETU7AE.js} +79 -62
- package/dist/chunk-GXETU7AE.js.map +1 -0
- package/dist/{chunk-TPEZ2SHV.js → chunk-HCPUVB7S.js} +3 -3
- package/dist/{chunk-R3X2T2LP.js → chunk-HFOY2SBG.js} +2 -2
- package/dist/{chunk-JYM4Y6SO.js → chunk-HQCUUVG2.js} +19 -19
- package/dist/{chunk-ST2RQUXC.js → chunk-I6B3S62A.js} +2 -2
- package/dist/{chunk-RBITPCMK.js → chunk-IDSSDL4W.js} +9 -9
- package/dist/{chunk-B3OFQP5Y.js → chunk-IY47KPML.js} +6 -6
- package/dist/{chunk-AXC4WSF3.js → chunk-JDOBIFBK.js} +2 -2
- package/dist/{chunk-3AGHSQPM.js → chunk-JGXHQV5N.js} +3 -3
- package/dist/{chunk-7LNHRQKR.js → chunk-JLIGUFPF.js} +2 -2
- package/dist/{chunk-EDIH6X2P.js → chunk-JZ66PN72.js} +2 -2
- package/dist/{chunk-KTKHO3UI.js → chunk-KICEAGKM.js} +2 -2
- package/dist/{chunk-22LMCQ5B.js → chunk-KNI4SGQE.js} +118 -105
- package/dist/chunk-KNI4SGQE.js.map +1 -0
- package/dist/{chunk-BUKK5SWA.js → chunk-KQAFEZQX.js} +2 -2
- package/dist/{chunk-UQDC3W77.js → chunk-KTG23JDX.js} +2 -2
- package/dist/{chunk-3YD44CH2.js → chunk-KYOZ5E6V.js} +2 -2
- package/dist/{chunk-2FX374UI.js → chunk-L3TZXELN.js} +4 -4
- package/dist/{chunk-IKDRGVVJ.js → chunk-M3N2TUZ7.js} +2 -2
- package/dist/{chunk-76M5OK7V.js → chunk-M7T2NKET.js} +5 -5
- package/dist/{chunk-JZ4TJHR2.js → chunk-MZAH3CBT.js} +2 -2
- package/dist/{chunk-ZG5DWWKK.js → chunk-NJW2ZG64.js} +2 -2
- package/dist/{chunk-5STPRPE7.js → chunk-NSKXRTVZ.js} +2 -2
- package/dist/{chunk-4O4XCBOS.js → chunk-NUSQ3YEL.js} +2 -2
- package/dist/{chunk-SLEAJ67D.js → chunk-O57FCN42.js} +13 -13
- package/dist/{chunk-PULDSMCJ.js → chunk-OEBUAC3O.js} +10 -10
- package/dist/{chunk-Y23L4YJV.js → chunk-OEIA4IHU.js} +2 -2
- package/dist/{chunk-66DKTOBY.js → chunk-OGZC2WUX.js} +2 -2
- package/dist/{chunk-VHDKPGMG.js → chunk-P62DSJUK.js} +6 -6
- package/dist/{chunk-64ZUALXK.js → chunk-PH2V7EXZ.js} +2 -2
- package/dist/{chunk-KKNZ7PUZ.js → chunk-QAIKLICT.js} +2 -2
- package/dist/{chunk-SSUDD72S.js → chunk-QPWUG2S3.js} +2 -2
- package/dist/{chunk-QI2E6ISQ.js → chunk-R2TVWQLR.js} +2 -2
- package/dist/chunk-R2TVWQLR.js.map +1 -0
- package/dist/{chunk-AZIOEOK4.js → chunk-R36IBI2M.js} +3 -3
- package/dist/{chunk-MGZMC6WN.js → chunk-R5B3OWI4.js} +59 -59
- package/dist/{chunk-VL4X7ZHC.js → chunk-RFIJRZ4K.js} +2 -2
- package/dist/{chunk-PWF4JXKD.js → chunk-RKDSELA3.js} +1 -1
- package/dist/chunk-RKDSELA3.js.map +1 -0
- package/dist/{chunk-QZLCVO2V.js → chunk-RPVHRZ5C.js} +2 -2
- package/dist/{chunk-A6RVIHHK.js → chunk-RVBLCU5C.js} +4 -4
- package/dist/{chunk-BUQKSQXL.js → chunk-S533KGX6.js} +5 -5
- package/dist/{chunk-4HUCP4R4.js → chunk-SCPHU3RW.js} +7 -7
- package/dist/{chunk-RJLV4BKR.js → chunk-SFSD5Q6O.js} +3 -3
- package/dist/{chunk-QOXNTKXB.js → chunk-SMLKHXPF.js} +2 -2
- package/dist/{chunk-7QE46QXI.js → chunk-T7R5HI6A.js} +1 -1
- package/dist/{chunk-NJVR724O.js → chunk-TVQZAQPE.js} +2 -2
- package/dist/{chunk-H56VY4BY.js → chunk-U36GYZ2P.js} +10 -5
- package/dist/chunk-U36GYZ2P.js.map +1 -0
- package/dist/{chunk-XOV7NRY5.js → chunk-U46P4UAR.js} +3 -3
- package/dist/{chunk-DZ42MDZE.js → chunk-UCJINCZT.js} +2 -2
- package/dist/{chunk-WNRTXEWW.js → chunk-UG5V3Z3R.js} +7 -7
- package/dist/{chunk-IW3RMBPB.js → chunk-VAOC6GHN.js} +2 -2
- package/dist/{chunk-SZG4WFAG.js → chunk-VBNA2JEN.js} +2 -2
- package/dist/{chunk-J27JML5O.js → chunk-VOZNBQNL.js} +2 -2
- package/dist/{chunk-JB56XYHP.js → chunk-WHIGRW7T.js} +2 -2
- package/dist/{chunk-AZSGSRIM.js → chunk-WHTMVTU4.js} +3 -3
- package/dist/{chunk-AERXJCOG.js → chunk-WL7N5VGG.js} +5 -5
- package/dist/{chunk-TFA6HPOA.js → chunk-WQUGCOKF.js} +4 -4
- package/dist/{chunk-VDO32NLK.js → chunk-WTZQM74L.js} +5 -5
- package/dist/{chunk-UVYI6VIX.js → chunk-X7Y7WX73.js} +1 -1
- package/dist/{chunk-T2YX56QI.js → chunk-XWSUK5GL.js} +4 -4
- package/dist/{chunk-ACX55QDO.js → chunk-XYOT5GQU.js} +3 -3
- package/dist/{chunk-5FNZ3G6X.js → chunk-Y7427SL7.js} +7 -7
- package/dist/{chunk-FC52YWAO.js → chunk-YHZWVDP7.js} +2 -2
- package/dist/chunk-YVRQ5JRA.js +49 -0
- package/dist/chunk-YVRQ5JRA.js.map +1 -0
- package/dist/{chunk-DO4C4AXD.js → chunk-ZFTODDTX.js} +2 -2
- package/dist/{chunk-H36X4NRH.js → chunk-ZHXSOMYH.js} +2 -2
- package/dist/{chunk-FEIXG5FA.js → chunk-ZQTYWSO3.js} +2 -2
- package/dist/cli.js +119 -116
- package/dist/coding/export-okf-codegraph.js +17 -17
- package/dist/compounding/engine.js +19 -19
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +23 -21
- package/dist/connectors/codex-materialize-runner.js +18 -18
- package/dist/connectors/index.js +20 -20
- package/dist/contradiction/index.js +3 -3
- package/dist/{contradiction-scan-TAGMOUQ2.js → contradiction-scan-GGRTVB7C.js} +3 -3
- package/dist/convergence-refresh.js +20 -20
- package/dist/conversation-index/backend.js +2 -2
- package/dist/corpus-watermark.js +20 -20
- package/dist/day-summary.js +2 -2
- package/dist/deep-recall-http-glue.js +7 -7
- package/dist/embedding-fallback.js +2 -2
- package/dist/entity-retrieval.js +19 -19
- package/dist/explicit-capture.js +2 -2
- package/dist/external-wiki-access.js +69 -68
- package/dist/extraction-judge.js +3 -3
- package/dist/extraction-normalization.js +3 -3
- package/dist/extraction-prompt.js +2 -2
- package/dist/extraction.js +32 -32
- package/dist/{first-start-migration-GAT7G733.js → first-start-migration-OM3PHMZO.js} +5 -5
- package/dist/harmonic-retrieval.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +196 -194
- package/dist/lcm/engine.js +3 -3
- package/dist/lcm/index.js +6 -6
- package/dist/local-llm-config.js +1 -1
- package/dist/local-llm.js +3 -3
- package/dist/location/index.js +20 -20
- package/dist/maintenance/memory-governance.js +18 -18
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +18 -18
- package/dist/maintenance/rebuild-memory-projection.js +19 -19
- package/dist/memory-browse-operations.js +69 -68
- package/dist/memory-browse.js +5 -5
- package/dist/namespaces/migrate.js +19 -19
- package/dist/namespaces/principal.js +2 -2
- package/dist/namespaces/search.js +13 -13
- package/dist/namespaces/storage.js +18 -18
- package/dist/offline-sync-impression-drain.js +5 -5
- package/dist/operator-doctor-corpus.js +21 -21
- package/dist/operator-toolkit.js +35 -33
- package/dist/orchestration/compression-guideline-coordinator.js +2 -2
- package/dist/orchestration/maintenance.js +33 -33
- package/dist/orchestration/orchestrator-helpers.d.ts +1 -0
- package/dist/orchestration/orchestrator-helpers.d.ts.map +1 -1
- package/dist/orchestration/recall-entry.d.ts.map +1 -1
- package/dist/orchestration/recall-search-pipeline.d.ts.map +1 -1
- package/dist/orchestrator.js +162 -160
- package/dist/outcome-boost-config.d.ts +17 -0
- package/dist/outcome-boost-config.d.ts.map +1 -0
- package/dist/outcome-boost-config.js +1 -0
- package/dist/outcome-boost-config.js.map +1 -0
- package/dist/qmd.js +4 -4
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-navigate-access.js +2 -2
- package/dist/recall-navigate-disclosure.js +2 -2
- package/dist/recall-navigate.js +2 -2
- package/dist/recall-navigation-operations.js +69 -68
- package/dist/recall-navigation.js +68 -67
- package/dist/recall-state-view-admission.js +5 -5
- package/dist/recall-why-service.js +9 -9
- package/dist/recall-why.js +3 -3
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.js +2 -2
- package/dist/rerank-outcome.d.ts +73 -0
- package/dist/rerank-outcome.d.ts.map +1 -0
- package/dist/rerank-outcome.js +28 -0
- package/dist/rerank-outcome.js.map +1 -0
- package/dist/{resolution-K4A3VPKZ.js → resolution-BROE3TRO.js} +4 -4
- package/dist/resolution-BROE3TRO.js.map +1 -0
- package/dist/resume-bundles.js +24 -22
- package/dist/search/embed-helper.js +2 -2
- package/dist/search/factory.js +12 -12
- package/dist/search/index.js +16 -16
- package/dist/search/lancedb-backend.js +2 -2
- package/dist/search/meilisearch-backend.js +2 -2
- package/dist/search/orama-backend.js +2 -2
- package/dist/semantic-consolidation.js +19 -19
- package/dist/semantic-rule-promotion.js +18 -18
- package/dist/semantic-rule-verifier.js +18 -18
- package/dist/shared-context/manager.js +2 -2
- package/dist/source-agent-qualifier.js +26 -26
- package/dist/standup/build.js +18 -18
- package/dist/storage.js +17 -17
- package/dist/summarizer.js +4 -4
- package/dist/support-passport/index.js +71 -70
- package/dist/{tier-stats-VF6DS52E.js → tier-stats-M2FMMD2N.js} +2 -2
- package/dist/transfer/backup.js +2 -2
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/capsule-import.js +2 -2
- package/dist/transfer/export-okf.js +18 -18
- package/dist/types.d.ts +4 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/verified-recall.js +18 -18
- package/dist/who-knows-cli.js +19 -19
- package/dist/who-knows.js +18 -18
- package/package.json +13 -3
- package/src/access-mcp-output-schemas.ts +2 -0
- package/src/access-recall-corpus-versions.ts +59 -0
- package/src/access-recall-response.ts +3 -0
- package/src/access-recall-surface.ts +22 -23
- package/src/access-service-raw-excerpt-read-gate.test.ts +1 -1
- package/src/access-service.ts +3 -0
- package/src/capabilities.test.ts +1 -0
- package/src/capabilities.ts +6 -8
- package/src/config.ts +3 -0
- package/src/index.ts +1 -1
- package/src/orchestration/orchestrator-helpers.ts +1 -1
- package/src/orchestration/recall-entry.ts +32 -16
- package/src/orchestration/recall-internal.ts +2 -2
- package/src/orchestration/recall-search-pipeline.ts +3 -0
- package/src/outcome-boost-config.ts +16 -0
- package/src/recall-retrieval-failure.test.ts +456 -4
- package/src/rerank-outcome.test.ts +218 -0
- package/src/rerank-outcome.ts +219 -0
- package/src/types.ts +3 -3
- package/dist/chunk-22LMCQ5B.js.map +0 -1
- package/dist/chunk-CALBQ2NG.js.map +0 -1
- package/dist/chunk-H56VY4BY.js.map +0 -1
- package/dist/chunk-MCTM4YPL.js.map +0 -1
- package/dist/chunk-PWF4JXKD.js.map +0 -1
- package/dist/chunk-QI2E6ISQ.js.map +0 -1
- /package/dist/{capsule-crypto-GWVG7LGC.js.map → access-recall-corpus-versions.js.map} +0 -0
- /package/dist/{auto-sync-U5N3CB5Y.js.map → auto-sync-PAWBFQWL.js.map} +0 -0
- /package/dist/{contradiction-scan-TAGMOUQ2.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
- /package/dist/{chunk-RDJ6C7NZ.js.map → chunk-2IWBHZ3H.js.map} +0 -0
- /package/dist/{chunk-UP75KL3L.js.map → chunk-2JRB3Z5N.js.map} +0 -0
- /package/dist/{chunk-OWHERGF2.js.map → chunk-2NLLXCJG.js.map} +0 -0
- /package/dist/{chunk-KN6CIN7I.js.map → chunk-32HO62I4.js.map} +0 -0
- /package/dist/{chunk-JLPNONPH.js.map → chunk-35A7GCHG.js.map} +0 -0
- /package/dist/{chunk-EAQQ2FD3.js.map → chunk-37ZQYFX4.js.map} +0 -0
- /package/dist/{chunk-3QKO4QN7.js.map → chunk-3BTHXB7Z.js.map} +0 -0
- /package/dist/{chunk-C7V3KPKJ.js.map → chunk-47LTKAGL.js.map} +0 -0
- /package/dist/{chunk-3O5BB45T.js.map → chunk-4DXNOVNW.js.map} +0 -0
- /package/dist/{chunk-65I2LZEK.js.map → chunk-4G2YCKLT.js.map} +0 -0
- /package/dist/{chunk-JBH26P62.js.map → chunk-4GEBLO7S.js.map} +0 -0
- /package/dist/{chunk-6MNKDTDI.js.map → chunk-4I6PEEFA.js.map} +0 -0
- /package/dist/{chunk-Z4TXB4K7.js.map → chunk-5BUCKFRE.js.map} +0 -0
- /package/dist/{chunk-7D7OUO5W.js.map → chunk-5S7SNRSJ.js.map} +0 -0
- /package/dist/{chunk-NOL7SEWN.js.map → chunk-5YR4UGF2.js.map} +0 -0
- /package/dist/{chunk-PMNLL2TL.js.map → chunk-6BG364RN.js.map} +0 -0
- /package/dist/{chunk-AEJ3TE5H.js.map → chunk-76LNUSS5.js.map} +0 -0
- /package/dist/{chunk-7CRUDH7G.js.map → chunk-77HNHT6S.js.map} +0 -0
- /package/dist/{chunk-OWYHHW67.js.map → chunk-7XI2UJHL.js.map} +0 -0
- /package/dist/{chunk-BJVO4H5C.js.map → chunk-7Z2UKRNJ.js.map} +0 -0
- /package/dist/{chunk-2WLMWP2T.js.map → chunk-A3K2KKSG.js.map} +0 -0
- /package/dist/{chunk-NMZVDRVP.js.map → chunk-ACCOC6UM.js.map} +0 -0
- /package/dist/{chunk-3JDA3XF5.js.map → chunk-AEGNDL24.js.map} +0 -0
- /package/dist/{chunk-IYIBGSHJ.js.map → chunk-AEUMONCD.js.map} +0 -0
- /package/dist/{chunk-RMDGAAZF.js.map → chunk-AF5PW35O.js.map} +0 -0
- /package/dist/{chunk-JUT3OR2L.js.map → chunk-ANGZWYL2.js.map} +0 -0
- /package/dist/{chunk-6LYAEM54.js.map → chunk-AXHU56C3.js.map} +0 -0
- /package/dist/{chunk-YPI4RQWV.js.map → chunk-BCGMG2RD.js.map} +0 -0
- /package/dist/{chunk-HXCJF4XU.js.map → chunk-BFIZXFUG.js.map} +0 -0
- /package/dist/{chunk-DBYAY6UW.js.map → chunk-BTOHGPHC.js.map} +0 -0
- /package/dist/{chunk-YSWJXOOL.js.map → chunk-CAKHZAXH.js.map} +0 -0
- /package/dist/{chunk-YSBL7VPO.js.map → chunk-CDWFWOSZ.js.map} +0 -0
- /package/dist/{chunk-VA4O3U7U.js.map → chunk-CZ44FH45.js.map} +0 -0
- /package/dist/{chunk-T3FMRLWQ.js.map → chunk-D5HQ3VEX.js.map} +0 -0
- /package/dist/{chunk-S7LWX2PQ.js.map → chunk-DPG5HQLE.js.map} +0 -0
- /package/dist/{chunk-7WBSMXGC.js.map → chunk-DVSAMW5T.js.map} +0 -0
- /package/dist/{chunk-WBYQA3VN.js.map → chunk-E5H4TM4Y.js.map} +0 -0
- /package/dist/{chunk-4RL3JOB3.js.map → chunk-EEDI3OXB.js.map} +0 -0
- /package/dist/{chunk-3TB2XQ3C.js.map → chunk-EUL3S3LE.js.map} +0 -0
- /package/dist/{chunk-XAITGGX5.js.map → chunk-F23U5YE7.js.map} +0 -0
- /package/dist/{chunk-IIARQTZ2.js.map → chunk-GDVORIFM.js.map} +0 -0
- /package/dist/{chunk-TPEZ2SHV.js.map → chunk-HCPUVB7S.js.map} +0 -0
- /package/dist/{chunk-R3X2T2LP.js.map → chunk-HFOY2SBG.js.map} +0 -0
- /package/dist/{chunk-JYM4Y6SO.js.map → chunk-HQCUUVG2.js.map} +0 -0
- /package/dist/{chunk-ST2RQUXC.js.map → chunk-I6B3S62A.js.map} +0 -0
- /package/dist/{chunk-RBITPCMK.js.map → chunk-IDSSDL4W.js.map} +0 -0
- /package/dist/{chunk-B3OFQP5Y.js.map → chunk-IY47KPML.js.map} +0 -0
- /package/dist/{chunk-AXC4WSF3.js.map → chunk-JDOBIFBK.js.map} +0 -0
- /package/dist/{chunk-3AGHSQPM.js.map → chunk-JGXHQV5N.js.map} +0 -0
- /package/dist/{chunk-7LNHRQKR.js.map → chunk-JLIGUFPF.js.map} +0 -0
- /package/dist/{chunk-EDIH6X2P.js.map → chunk-JZ66PN72.js.map} +0 -0
- /package/dist/{chunk-KTKHO3UI.js.map → chunk-KICEAGKM.js.map} +0 -0
- /package/dist/{chunk-BUKK5SWA.js.map → chunk-KQAFEZQX.js.map} +0 -0
- /package/dist/{chunk-UQDC3W77.js.map → chunk-KTG23JDX.js.map} +0 -0
- /package/dist/{chunk-3YD44CH2.js.map → chunk-KYOZ5E6V.js.map} +0 -0
- /package/dist/{chunk-2FX374UI.js.map → chunk-L3TZXELN.js.map} +0 -0
- /package/dist/{chunk-IKDRGVVJ.js.map → chunk-M3N2TUZ7.js.map} +0 -0
- /package/dist/{chunk-76M5OK7V.js.map → chunk-M7T2NKET.js.map} +0 -0
- /package/dist/{chunk-JZ4TJHR2.js.map → chunk-MZAH3CBT.js.map} +0 -0
- /package/dist/{chunk-ZG5DWWKK.js.map → chunk-NJW2ZG64.js.map} +0 -0
- /package/dist/{chunk-5STPRPE7.js.map → chunk-NSKXRTVZ.js.map} +0 -0
- /package/dist/{chunk-4O4XCBOS.js.map → chunk-NUSQ3YEL.js.map} +0 -0
- /package/dist/{chunk-SLEAJ67D.js.map → chunk-O57FCN42.js.map} +0 -0
- /package/dist/{chunk-PULDSMCJ.js.map → chunk-OEBUAC3O.js.map} +0 -0
- /package/dist/{chunk-Y23L4YJV.js.map → chunk-OEIA4IHU.js.map} +0 -0
- /package/dist/{chunk-66DKTOBY.js.map → chunk-OGZC2WUX.js.map} +0 -0
- /package/dist/{chunk-VHDKPGMG.js.map → chunk-P62DSJUK.js.map} +0 -0
- /package/dist/{chunk-64ZUALXK.js.map → chunk-PH2V7EXZ.js.map} +0 -0
- /package/dist/{chunk-KKNZ7PUZ.js.map → chunk-QAIKLICT.js.map} +0 -0
- /package/dist/{chunk-SSUDD72S.js.map → chunk-QPWUG2S3.js.map} +0 -0
- /package/dist/{chunk-AZIOEOK4.js.map → chunk-R36IBI2M.js.map} +0 -0
- /package/dist/{chunk-MGZMC6WN.js.map → chunk-R5B3OWI4.js.map} +0 -0
- /package/dist/{chunk-VL4X7ZHC.js.map → chunk-RFIJRZ4K.js.map} +0 -0
- /package/dist/{chunk-QZLCVO2V.js.map → chunk-RPVHRZ5C.js.map} +0 -0
- /package/dist/{chunk-A6RVIHHK.js.map → chunk-RVBLCU5C.js.map} +0 -0
- /package/dist/{chunk-BUQKSQXL.js.map → chunk-S533KGX6.js.map} +0 -0
- /package/dist/{chunk-4HUCP4R4.js.map → chunk-SCPHU3RW.js.map} +0 -0
- /package/dist/{chunk-RJLV4BKR.js.map → chunk-SFSD5Q6O.js.map} +0 -0
- /package/dist/{chunk-QOXNTKXB.js.map → chunk-SMLKHXPF.js.map} +0 -0
- /package/dist/{chunk-7QE46QXI.js.map → chunk-T7R5HI6A.js.map} +0 -0
- /package/dist/{chunk-NJVR724O.js.map → chunk-TVQZAQPE.js.map} +0 -0
- /package/dist/{chunk-XOV7NRY5.js.map → chunk-U46P4UAR.js.map} +0 -0
- /package/dist/{chunk-DZ42MDZE.js.map → chunk-UCJINCZT.js.map} +0 -0
- /package/dist/{chunk-WNRTXEWW.js.map → chunk-UG5V3Z3R.js.map} +0 -0
- /package/dist/{chunk-IW3RMBPB.js.map → chunk-VAOC6GHN.js.map} +0 -0
- /package/dist/{chunk-SZG4WFAG.js.map → chunk-VBNA2JEN.js.map} +0 -0
- /package/dist/{chunk-J27JML5O.js.map → chunk-VOZNBQNL.js.map} +0 -0
- /package/dist/{chunk-JB56XYHP.js.map → chunk-WHIGRW7T.js.map} +0 -0
- /package/dist/{chunk-AZSGSRIM.js.map → chunk-WHTMVTU4.js.map} +0 -0
- /package/dist/{chunk-AERXJCOG.js.map → chunk-WL7N5VGG.js.map} +0 -0
- /package/dist/{chunk-TFA6HPOA.js.map → chunk-WQUGCOKF.js.map} +0 -0
- /package/dist/{chunk-VDO32NLK.js.map → chunk-WTZQM74L.js.map} +0 -0
- /package/dist/{chunk-UVYI6VIX.js.map → chunk-X7Y7WX73.js.map} +0 -0
- /package/dist/{chunk-T2YX56QI.js.map → chunk-XWSUK5GL.js.map} +0 -0
- /package/dist/{chunk-ACX55QDO.js.map → chunk-XYOT5GQU.js.map} +0 -0
- /package/dist/{chunk-5FNZ3G6X.js.map → chunk-Y7427SL7.js.map} +0 -0
- /package/dist/{chunk-FC52YWAO.js.map → chunk-YHZWVDP7.js.map} +0 -0
- /package/dist/{chunk-DO4C4AXD.js.map → chunk-ZFTODDTX.js.map} +0 -0
- /package/dist/{chunk-H36X4NRH.js.map → chunk-ZHXSOMYH.js.map} +0 -0
- /package/dist/{chunk-FEIXG5FA.js.map → chunk-ZQTYWSO3.js.map} +0 -0
- /package/dist/{resolution-K4A3VPKZ.js.map → contradiction-scan-GGRTVB7C.js.map} +0 -0
- /package/dist/{first-start-migration-GAT7G733.js.map → first-start-migration-OM3PHMZO.js.map} +0 -0
- /package/dist/{tier-stats-VF6DS52E.js.map → tier-stats-M2FMMD2N.js.map} +0 -0
|
@@ -13,18 +13,20 @@ import { mkdtemp, rm } from "node:fs/promises";
|
|
|
13
13
|
import os from "node:os";
|
|
14
14
|
import path from "node:path";
|
|
15
15
|
import test from "node:test";
|
|
16
|
+
import { createRecallCorpusVersionCapture } from "./access-recall-corpus-versions.js";
|
|
16
17
|
|
|
17
18
|
import { EngramMcpServer } from "./access-mcp.js";
|
|
18
19
|
import { EngramAccessService } from "./access-service.js";
|
|
19
20
|
import type { EngramAccessRecallRequest, EngramAccessRecallResponse } from "./access-service.js";
|
|
20
21
|
import { parseConfig } from "./config.js";
|
|
21
22
|
import { Orchestrator } from "./orchestrator.js";
|
|
23
|
+
import { resolveScopePlan } from "./scopes/scope-plan.js";
|
|
22
24
|
import {
|
|
23
25
|
MEMORY_CONTEXT_UNAVAILABLE_NOTE,
|
|
24
26
|
type RecallContextComposition,
|
|
25
27
|
} from "./recall-context-composition.js";
|
|
26
28
|
import type { SearchBackend, SearchDegradation, SearchExecutionOptions } from "./search/port.js";
|
|
27
|
-
import { DEFAULT_RECALL_DISCLOSURE } from "./types.js";
|
|
29
|
+
import { DEFAULT_RECALL_DISCLOSURE, type PluginConfig } from "./types.js";
|
|
28
30
|
|
|
29
31
|
const TIMEOUT_DEGRADATION: SearchDegradation = {
|
|
30
32
|
backend: "qmd",
|
|
@@ -34,10 +36,15 @@ const TIMEOUT_DEGRADATION: SearchDegradation = {
|
|
|
34
36
|
|
|
35
37
|
const QUERY = "what writing rules apply here?";
|
|
36
38
|
|
|
37
|
-
function searchBackend(
|
|
38
|
-
|
|
39
|
+
function searchBackend(
|
|
40
|
+
observed: { calls: number },
|
|
41
|
+
degrade: boolean,
|
|
42
|
+
onSearch?: () => Promise<void>,
|
|
43
|
+
): SearchBackend {
|
|
44
|
+
const search = async (execution?: SearchExecutionOptions) => {
|
|
39
45
|
observed.calls += 1;
|
|
40
46
|
if (degrade) execution?.onDegradation?.(TIMEOUT_DEGRADATION);
|
|
47
|
+
await onSearch?.();
|
|
41
48
|
return [];
|
|
42
49
|
};
|
|
43
50
|
const backend: Partial<SearchBackend> = {
|
|
@@ -80,6 +87,7 @@ async function withOrchestrator(
|
|
|
80
87
|
prefix: string,
|
|
81
88
|
degrade: boolean,
|
|
82
89
|
run: (orchestrator: Orchestrator, observed: { calls: number }) => Promise<void>,
|
|
90
|
+
configOverrides: Partial<PluginConfig> = {},
|
|
83
91
|
): Promise<void> {
|
|
84
92
|
const memoryDir = await mkdtemp(path.join(os.tmpdir(), prefix));
|
|
85
93
|
const orchestrator = new Orchestrator(
|
|
@@ -88,6 +96,7 @@ async function withOrchestrator(
|
|
|
88
96
|
workspaceDir: memoryDir,
|
|
89
97
|
qmdEnabled: true,
|
|
90
98
|
embeddingFallbackEnabled: false,
|
|
99
|
+
...configOverrides,
|
|
91
100
|
}),
|
|
92
101
|
);
|
|
93
102
|
const observed = { calls: 0 };
|
|
@@ -101,7 +110,7 @@ async function withOrchestrator(
|
|
|
101
110
|
await run(orchestrator, observed);
|
|
102
111
|
} finally {
|
|
103
112
|
await orchestrator.destroy();
|
|
104
|
-
await rm(memoryDir, { recursive: true, force: true });
|
|
113
|
+
await rm(memoryDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });
|
|
105
114
|
}
|
|
106
115
|
}
|
|
107
116
|
|
|
@@ -137,6 +146,443 @@ test("genuine empty retrieval stays marker-free at the orchestrator", async () =
|
|
|
137
146
|
});
|
|
138
147
|
});
|
|
139
148
|
|
|
149
|
+
test("recall reports storage corpus versions captured before retrieval, not index application", async () => {
|
|
150
|
+
await withOrchestrator("remnic-recall-version-", false, async (orchestrator, observed) => {
|
|
151
|
+
const storage = await orchestrator.getStorage("default");
|
|
152
|
+
const beforeRetrieval = storage.getMemoryCorpusVersion();
|
|
153
|
+
let writeDuringSearch = true;
|
|
154
|
+
let indexUpdates = 0;
|
|
155
|
+
const backend = searchBackend(observed, false, async () => {
|
|
156
|
+
if (!writeDuringSearch) return;
|
|
157
|
+
writeDuringSearch = false;
|
|
158
|
+
await storage.writeMemory("fact", "write committed while retrieval was in flight");
|
|
159
|
+
});
|
|
160
|
+
const withBackend = orchestrator as unknown as { qmd: SearchBackend };
|
|
161
|
+
withBackend.qmd = {
|
|
162
|
+
...backend,
|
|
163
|
+
async updateCollection() { indexUpdates += 1; },
|
|
164
|
+
async updateCollectionStrict() { indexUpdates += 1; },
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
const response = await new EngramAccessService(orchestrator).recall({
|
|
168
|
+
query: QUERY,
|
|
169
|
+
sessionKey: "corpus-version",
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
assert.ok(observed.calls > 0, "recall must consult the backend");
|
|
173
|
+
assert.ok(storage.getMemoryCorpusVersion() > beforeRetrieval, "the in-flight write advanced storage");
|
|
174
|
+
assert.deepEqual(response.storageCorpusVersionsAtRecallStart, [{ namespace: "default", version: beforeRetrieval }]);
|
|
175
|
+
assert.equal(indexUpdates, 0, "a corpus sentinel does not prove QMD index application");
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
test("includeRecall X-ray responses report storage versions sampled before retrieval", async () => {
|
|
180
|
+
await withOrchestrator("remnic-xray-recall-version-", false, async (orchestrator, observed) => {
|
|
181
|
+
const storage = await orchestrator.getStorage("default");
|
|
182
|
+
const beforeRetrieval = storage.getMemoryCorpusVersion();
|
|
183
|
+
let writeDuringSearch = true;
|
|
184
|
+
const backend = searchBackend(observed, false, async () => {
|
|
185
|
+
if (!writeDuringSearch) return;
|
|
186
|
+
writeDuringSearch = false;
|
|
187
|
+
await storage.writeMemory("fact", "write committed while X-ray retrieval was in flight");
|
|
188
|
+
});
|
|
189
|
+
(orchestrator as unknown as { qmd: SearchBackend }).qmd = backend;
|
|
190
|
+
|
|
191
|
+
const response = await new EngramAccessService(orchestrator).recallXray({
|
|
192
|
+
query: QUERY,
|
|
193
|
+
sessionKey: "xray-corpus-version",
|
|
194
|
+
includeRecall: true,
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
assert.ok(observed.calls > 0);
|
|
198
|
+
assert.ok(response.snapshotFound);
|
|
199
|
+
assert.ok(storage.getMemoryCorpusVersion() > beforeRetrieval);
|
|
200
|
+
assert.deepEqual(response.recall?.storageCorpusVersionsAtRecallStart, [
|
|
201
|
+
{ namespace: "default", version: beforeRetrieval },
|
|
202
|
+
]);
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
test("no-recall X-ray includes corpus versions read by the standing-memory block", async () => {
|
|
206
|
+
await withOrchestrator(
|
|
207
|
+
"remnic-xray-standing-version-",
|
|
208
|
+
false,
|
|
209
|
+
async (orchestrator) => {
|
|
210
|
+
const storage = await orchestrator.getStorage("default");
|
|
211
|
+
const versionBeforeRead = storage.getMemoryCorpusVersion();
|
|
212
|
+
const response = await new EngramAccessService(orchestrator).recallXray({
|
|
213
|
+
query: "thanks",
|
|
214
|
+
sessionKey: "xray-standing-no-recall",
|
|
215
|
+
mode: "no_recall",
|
|
216
|
+
includeRecall: true,
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
assert.ok(response.snapshotFound);
|
|
220
|
+
assert.deepEqual(response.recall?.storageCorpusVersionsAtRecallStart, [
|
|
221
|
+
{ namespace: "default", version: versionBeforeRead },
|
|
222
|
+
]);
|
|
223
|
+
},
|
|
224
|
+
{ recallStandingBlock: true },
|
|
225
|
+
);
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
test("standing-memory corpus version uses configured default namespace", async () => {
|
|
229
|
+
await withOrchestrator(
|
|
230
|
+
"remnic-standing-custom-namespace-",
|
|
231
|
+
false,
|
|
232
|
+
async (orchestrator) => {
|
|
233
|
+
const storage = await orchestrator.getStorage("personal");
|
|
234
|
+
const version = storage.getMemoryCorpusVersion();
|
|
235
|
+
const response = await new EngramAccessService(orchestrator).recall({
|
|
236
|
+
query: "thanks",
|
|
237
|
+
sessionKey: "standing-custom-namespace",
|
|
238
|
+
mode: "no_recall",
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
assert.deepEqual(response.storageCorpusVersionsAtRecallStart, [
|
|
242
|
+
{ namespace: "personal", version },
|
|
243
|
+
]);
|
|
244
|
+
},
|
|
245
|
+
{ recallStandingBlock: true, defaultNamespace: "personal" },
|
|
246
|
+
);
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
test("recall reports a separate storage corpus version for every searched namespace", async () => {
|
|
250
|
+
await withOrchestrator(
|
|
251
|
+
"remnic-recall-multi-version-",
|
|
252
|
+
false,
|
|
253
|
+
async (orchestrator) => {
|
|
254
|
+
const primary = await orchestrator.getStorage("default");
|
|
255
|
+
const shared = await orchestrator.getStorage("shared");
|
|
256
|
+
const response = await new EngramAccessService(orchestrator).recall({
|
|
257
|
+
query: QUERY,
|
|
258
|
+
sessionKey: "multi-corpus-version",
|
|
259
|
+
authenticatedPrincipal: "alice",
|
|
260
|
+
});
|
|
261
|
+
assert.deepEqual(response.storageCorpusVersionsAtRecallStart, [
|
|
262
|
+
{ namespace: "default", version: primary.getMemoryCorpusVersion() },
|
|
263
|
+
{ namespace: "shared", version: shared.getMemoryCorpusVersion() },
|
|
264
|
+
]);
|
|
265
|
+
},
|
|
266
|
+
{ namespacesEnabled: true, defaultRecallNamespaces: ["self", "shared"] },
|
|
267
|
+
);
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
test("cold-start recall samples corpus versions only after initialization", async () => {
|
|
271
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-recall-cold-start-"));
|
|
272
|
+
const orchestrator = new Orchestrator(parseConfig({
|
|
273
|
+
memoryDir,
|
|
274
|
+
workspaceDir: memoryDir,
|
|
275
|
+
qmdEnabled: true,
|
|
276
|
+
embeddingFallbackEnabled: false,
|
|
277
|
+
}));
|
|
278
|
+
const observed = { calls: 0 };
|
|
279
|
+
const withBackend = orchestrator as unknown as { qmd: SearchBackend };
|
|
280
|
+
withBackend.qmd = searchBackend(observed, false);
|
|
281
|
+
let releaseInitialization!: () => void;
|
|
282
|
+
let notifyInitializationStarted!: () => void;
|
|
283
|
+
const initializationGate = new Promise<void>((resolve) => { releaseInitialization = resolve; });
|
|
284
|
+
const initializationStarted = new Promise<void>((resolve) => { notifyInitializationStarted = resolve; });
|
|
285
|
+
const initialize = orchestrator.initialize.bind(orchestrator);
|
|
286
|
+
orchestrator.initialize = async () => {
|
|
287
|
+
notifyInitializationStarted();
|
|
288
|
+
await initializationGate;
|
|
289
|
+
await initialize();
|
|
290
|
+
};
|
|
291
|
+
let initialization: Promise<void> | undefined;
|
|
292
|
+
try {
|
|
293
|
+
initialization = orchestrator.initialize();
|
|
294
|
+
await initializationStarted;
|
|
295
|
+
const recall = new EngramAccessService(orchestrator).recall({
|
|
296
|
+
query: QUERY,
|
|
297
|
+
sessionKey: "cold-start-corpus-version",
|
|
298
|
+
});
|
|
299
|
+
releaseInitialization();
|
|
300
|
+
await initialization;
|
|
301
|
+
const response = await recall;
|
|
302
|
+
assert.ok(observed.calls > 0);
|
|
303
|
+
const storage = await orchestrator.getStorage("default");
|
|
304
|
+
assert.ok(storage.getMemoryCorpusVersion() > 0);
|
|
305
|
+
assert.deepEqual(response.storageCorpusVersionsAtRecallStart, [
|
|
306
|
+
{ namespace: "default", version: storage.getMemoryCorpusVersion() },
|
|
307
|
+
]);
|
|
308
|
+
} finally {
|
|
309
|
+
releaseInitialization();
|
|
310
|
+
await initialization?.catch(() => undefined);
|
|
311
|
+
await orchestrator.destroy();
|
|
312
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
test("fail-open recall still reports versions when initialization times out", async () => {
|
|
316
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-recall-init-timeout-"));
|
|
317
|
+
const orchestrator = new Orchestrator(parseConfig({
|
|
318
|
+
memoryDir,
|
|
319
|
+
workspaceDir: memoryDir,
|
|
320
|
+
qmdEnabled: true,
|
|
321
|
+
embeddingFallbackEnabled: false,
|
|
322
|
+
initGateTimeoutMs: 1,
|
|
323
|
+
}));
|
|
324
|
+
const observed = { calls: 0 };
|
|
325
|
+
(orchestrator as unknown as { qmd: SearchBackend }).qmd = searchBackend(observed, false);
|
|
326
|
+
let releaseInitialization!: () => void;
|
|
327
|
+
const initializationGate = new Promise<void>((resolve) => { releaseInitialization = resolve; });
|
|
328
|
+
const initialize = orchestrator.initialize.bind(orchestrator);
|
|
329
|
+
orchestrator.initialize = async () => {
|
|
330
|
+
await initializationGate;
|
|
331
|
+
await initialize();
|
|
332
|
+
};
|
|
333
|
+
let initialization: Promise<void> | undefined;
|
|
334
|
+
try {
|
|
335
|
+
initialization = orchestrator.initialize();
|
|
336
|
+
const response = await new EngramAccessService(orchestrator).recall({
|
|
337
|
+
query: QUERY,
|
|
338
|
+
sessionKey: "init-timeout-corpus-version",
|
|
339
|
+
});
|
|
340
|
+
assert.ok(observed.calls > 0);
|
|
341
|
+
assert.deepEqual(response.storageCorpusVersionsAtRecallStart?.map(({ namespace }) => namespace), ["default"]);
|
|
342
|
+
} finally {
|
|
343
|
+
releaseInitialization();
|
|
344
|
+
await initialization?.catch(() => undefined);
|
|
345
|
+
await orchestrator.destroy();
|
|
346
|
+
await rm(memoryDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
test("no_recall does not sample corpus versions for namespaces it did not search", async () => {
|
|
351
|
+
await withOrchestrator("remnic-recall-no-recall-version-", false, async (orchestrator) => {
|
|
352
|
+
const response = await new EngramAccessService(orchestrator).recall({
|
|
353
|
+
query: "thanks",
|
|
354
|
+
sessionKey: "no-recall-corpus-version",
|
|
355
|
+
mode: "no_recall",
|
|
356
|
+
});
|
|
357
|
+
assert.deepEqual(response.storageCorpusVersionsAtRecallStart, []);
|
|
358
|
+
const autoPlanned = await new EngramAccessService(orchestrator).recall({
|
|
359
|
+
query: "thanks",
|
|
360
|
+
sessionKey: "auto-no-recall-corpus-version",
|
|
361
|
+
});
|
|
362
|
+
assert.deepEqual(autoPlanned.storageCorpusVersionsAtRecallStart, []);
|
|
363
|
+
}, { recallStandingBlock: false });
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
test("no_recall reports the corpus version read by the standing-memory block", async () => {
|
|
367
|
+
await withOrchestrator(
|
|
368
|
+
"remnic-no-recall-standing-version-",
|
|
369
|
+
false,
|
|
370
|
+
async (orchestrator) => {
|
|
371
|
+
const storage = await orchestrator.getStorage("default");
|
|
372
|
+
const versionBeforeRead = storage.getMemoryCorpusVersion();
|
|
373
|
+
const manager = orchestrator.storage;
|
|
374
|
+
const readAllMemories = manager.readAllMemories.bind(manager);
|
|
375
|
+
manager.readAllMemories = async (...args) => {
|
|
376
|
+
await storage.writeMemory("fact", "write during no-recall standing-memory read");
|
|
377
|
+
return readAllMemories(...args);
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
const response = await new EngramAccessService(orchestrator).recall({
|
|
381
|
+
query: "thanks",
|
|
382
|
+
sessionKey: "no-recall-standing-version",
|
|
383
|
+
mode: "no_recall",
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
assert.ok(storage.getMemoryCorpusVersion() > versionBeforeRead);
|
|
387
|
+
assert.deepEqual(response.storageCorpusVersionsAtRecallStart, [
|
|
388
|
+
{ namespace: "default", version: versionBeforeRead },
|
|
389
|
+
]);
|
|
390
|
+
},
|
|
391
|
+
{ recallStandingBlock: true },
|
|
392
|
+
);
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
test("recall captures corpus versions before reading the standing-memory block", async () => {
|
|
396
|
+
await withOrchestrator(
|
|
397
|
+
"remnic-recall-standing-version-",
|
|
398
|
+
false,
|
|
399
|
+
async (orchestrator) => {
|
|
400
|
+
const storage = await orchestrator.getStorage("default");
|
|
401
|
+
const versionBeforeRecall = storage.getMemoryCorpusVersion();
|
|
402
|
+
const manager = orchestrator.storage;
|
|
403
|
+
const readAllMemories = manager.readAllMemories.bind(manager);
|
|
404
|
+
let standingReadCount = 0;
|
|
405
|
+
manager.readAllMemories = async (...args) => {
|
|
406
|
+
standingReadCount += 1;
|
|
407
|
+
if (standingReadCount === 1) {
|
|
408
|
+
await storage.writeMemory("fact", "write during standing-memory read");
|
|
409
|
+
}
|
|
410
|
+
return readAllMemories(...args);
|
|
411
|
+
};
|
|
412
|
+
|
|
413
|
+
const response = await new EngramAccessService(orchestrator).recall({
|
|
414
|
+
query: QUERY,
|
|
415
|
+
sessionKey: "standing-corpus-version",
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
assert.ok(standingReadCount >= 1);
|
|
419
|
+
assert.ok(storage.getMemoryCorpusVersion() > versionBeforeRecall);
|
|
420
|
+
assert.deepEqual(response.storageCorpusVersionsAtRecallStart, [
|
|
421
|
+
{ namespace: "default", version: versionBeforeRecall },
|
|
422
|
+
]);
|
|
423
|
+
},
|
|
424
|
+
{ recallStandingBlock: true },
|
|
425
|
+
);
|
|
426
|
+
});
|
|
427
|
+
test("standing-memory fallback survives recall planning failure with its captured version", async () => {
|
|
428
|
+
await withOrchestrator(
|
|
429
|
+
"remnic-standing-planning-failure-",
|
|
430
|
+
false,
|
|
431
|
+
async (orchestrator) => {
|
|
432
|
+
const storage = await orchestrator.getStorage("default");
|
|
433
|
+
await storage.writeMemory("fact", "standing fallback survives planning failure");
|
|
434
|
+
const versionBeforeRead = storage.getMemoryCorpusVersion();
|
|
435
|
+
const manager = orchestrator.storage;
|
|
436
|
+
const readAllMemories = manager.readAllMemories.bind(manager);
|
|
437
|
+
manager.readAllMemories = async () => {
|
|
438
|
+
await storage.writeMemory("fact", "write during failing-recall standing read");
|
|
439
|
+
return [{
|
|
440
|
+
id: "standing-fallback",
|
|
441
|
+
content: "Standing fallback memory survives planning failure.",
|
|
442
|
+
frontmatter: { id: "standing-fallback", origin: "user", status: "active", pinned: true },
|
|
443
|
+
}] as unknown as Awaited<ReturnType<typeof readAllMemories>>;
|
|
444
|
+
};
|
|
445
|
+
(orchestrator as unknown as { recallInternal: () => Promise<string> }).recallInternal = async () => {
|
|
446
|
+
throw new Error("synthetic planning failure");
|
|
447
|
+
};
|
|
448
|
+
|
|
449
|
+
const response = await new EngramAccessService(orchestrator).recall({
|
|
450
|
+
query: QUERY,
|
|
451
|
+
sessionKey: "standing-planning-failure",
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
assert.match(response.context, /Standing fallback memory survives planning failure/);
|
|
455
|
+
assert.ok(storage.getMemoryCorpusVersion() > versionBeforeRead);
|
|
456
|
+
assert.deepEqual(response.storageCorpusVersionsAtRecallStart, [
|
|
457
|
+
{ namespace: "default", version: versionBeforeRead },
|
|
458
|
+
]);
|
|
459
|
+
},
|
|
460
|
+
{ recallStandingBlock: true },
|
|
461
|
+
);
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
test("a throwing plan callback cannot escape recall or skip the standing block", async () => {
|
|
465
|
+
await withOrchestrator(
|
|
466
|
+
"remnic-throwing-plan-callback-",
|
|
467
|
+
false,
|
|
468
|
+
async (orchestrator) => {
|
|
469
|
+
const manager = orchestrator.storage;
|
|
470
|
+
manager.readAllMemories = async () => [{
|
|
471
|
+
id: "callback-standing",
|
|
472
|
+
content: "Standing memory survives a plan callback failure.",
|
|
473
|
+
frontmatter: { id: "callback-standing", origin: "user", status: "active", pinned: true },
|
|
474
|
+
}] as unknown as Awaited<ReturnType<typeof manager.readAllMemories>>;
|
|
475
|
+
let threw = false;
|
|
476
|
+
const response = await orchestrator.recall(QUERY, "throwing-plan-callback", {
|
|
477
|
+
onRecallPlanResolved: async (mode) => {
|
|
478
|
+
if (mode === "no_recall" && !threw) {
|
|
479
|
+
threw = true;
|
|
480
|
+
throw new Error("synthetic pre-plan callback failure");
|
|
481
|
+
}
|
|
482
|
+
},
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
assert.ok(threw);
|
|
486
|
+
assert.ok(response.includes("## Standing Memory (Remnic)"));
|
|
487
|
+
assert.ok(response.includes("Standing memory survives a plan callback failure."));
|
|
488
|
+
assert.ok(!response.includes("Memory context unavailable"));
|
|
489
|
+
},
|
|
490
|
+
{ recallStandingBlock: true },
|
|
491
|
+
);
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
test("corpus-version capture is failure-open for unavailable secondary storage", async () => {
|
|
495
|
+
let captured: Array<{ namespace: string; version: number | null }> = [];
|
|
496
|
+
const capture = createRecallCorpusVersionCapture(
|
|
497
|
+
{
|
|
498
|
+
async getStorage(namespace) {
|
|
499
|
+
if (namespace === "unavailable") throw new Error("store unavailable");
|
|
500
|
+
return { getMemoryCorpusVersion: () => 7 };
|
|
501
|
+
},
|
|
502
|
+
},
|
|
503
|
+
undefined,
|
|
504
|
+
(versions) => { captured = versions; },
|
|
505
|
+
true,
|
|
506
|
+
);
|
|
507
|
+
|
|
508
|
+
await capture("no_recall", ["default", "unavailable"]);
|
|
509
|
+
assert.deepEqual(captured, [
|
|
510
|
+
{ namespace: "default", version: 7 },
|
|
511
|
+
{ namespace: "unavailable", version: null },
|
|
512
|
+
]);
|
|
513
|
+
});
|
|
514
|
+
test("stalled corpus-version storage cannot block recall planning", async () => {
|
|
515
|
+
let captured: Array<{ namespace: string; version: number | null }> = [];
|
|
516
|
+
const capture = createRecallCorpusVersionCapture(
|
|
517
|
+
{ getStorage: () => new Promise<never>(() => {}) },
|
|
518
|
+
undefined,
|
|
519
|
+
(versions) => { captured = versions; },
|
|
520
|
+
true,
|
|
521
|
+
20,
|
|
522
|
+
);
|
|
523
|
+
const result = await Promise.race([
|
|
524
|
+
Promise.resolve(capture("no_recall", ["stalled"])).then(() => "captured"),
|
|
525
|
+
new Promise<string>((resolve) => setTimeout(() => resolve("deadline"), 100)),
|
|
526
|
+
]);
|
|
527
|
+
assert.equal(result, "captured");
|
|
528
|
+
assert.deepEqual(captured, [{ namespace: "stalled", version: null }]);
|
|
529
|
+
});
|
|
530
|
+
|
|
531
|
+
|
|
532
|
+
test("recall reports the same coding namespaces selected by its scope plan", async () => {
|
|
533
|
+
await withOrchestrator(
|
|
534
|
+
"remnic-recall-coding-version-",
|
|
535
|
+
false,
|
|
536
|
+
async (orchestrator) => {
|
|
537
|
+
const sessionKey = "coding-version";
|
|
538
|
+
orchestrator.setCodingContextForSession(sessionKey, {
|
|
539
|
+
projectId: "origin:acme/repo",
|
|
540
|
+
branch: "main",
|
|
541
|
+
rootPath: "/workspace/repo",
|
|
542
|
+
defaultBranch: "main",
|
|
543
|
+
});
|
|
544
|
+
const scopePlan = resolveScopePlan({
|
|
545
|
+
config: orchestrator.config,
|
|
546
|
+
sessionKey,
|
|
547
|
+
codingContext: orchestrator.getCodingContextForSession(sessionKey),
|
|
548
|
+
namespacesEnabled: true,
|
|
549
|
+
});
|
|
550
|
+
const originalRecall = orchestrator.recall.bind(orchestrator);
|
|
551
|
+
orchestrator.recall = async (...args) => {
|
|
552
|
+
orchestrator.setCodingContextForSession(sessionKey, {
|
|
553
|
+
projectId: "origin:acme/new-repo",
|
|
554
|
+
branch: "main",
|
|
555
|
+
rootPath: "/workspace/new-repo",
|
|
556
|
+
defaultBranch: "main",
|
|
557
|
+
});
|
|
558
|
+
return originalRecall(...args);
|
|
559
|
+
};
|
|
560
|
+
const actualScopePlan = resolveScopePlan({
|
|
561
|
+
config: orchestrator.config,
|
|
562
|
+
sessionKey,
|
|
563
|
+
codingContext: {
|
|
564
|
+
projectId: "origin:acme/new-repo",
|
|
565
|
+
branch: "main",
|
|
566
|
+
rootPath: "/workspace/new-repo",
|
|
567
|
+
defaultBranch: "main",
|
|
568
|
+
},
|
|
569
|
+
namespacesEnabled: true,
|
|
570
|
+
});
|
|
571
|
+
const response = await new EngramAccessService(orchestrator).recall({
|
|
572
|
+
query: QUERY,
|
|
573
|
+
sessionKey,
|
|
574
|
+
authenticatedPrincipal: "alice",
|
|
575
|
+
});
|
|
576
|
+
|
|
577
|
+
assert.deepEqual(
|
|
578
|
+
response.storageCorpusVersionsAtRecallStart?.map(({ namespace }) => namespace),
|
|
579
|
+
actualScopePlan.readNamespaces,
|
|
580
|
+
);
|
|
581
|
+
},
|
|
582
|
+
{ namespacesEnabled: true, codingMode: { projectScope: true, branchScope: false, globalFallback: true } },
|
|
583
|
+
);
|
|
584
|
+
});
|
|
585
|
+
|
|
140
586
|
test("access recall surfaces retrievalFailure on daemon timeout and omits it on genuine empty", async () => {
|
|
141
587
|
await withOrchestrator("remnic-recall-access-timeout-", true, async (timedOut, observed) => {
|
|
142
588
|
const failed = await new EngramAccessService(timedOut).recall({
|
|
@@ -192,6 +638,7 @@ test("MCP recall payload keeps retrievalFailure so a tool caller can branch on i
|
|
|
192
638
|
fallbackUsed: false,
|
|
193
639
|
sourcesUsed: [],
|
|
194
640
|
disclosure: DEFAULT_RECALL_DISCLOSURE,
|
|
641
|
+
storageCorpusVersionsAtRecallStart: [{ namespace: "default", version: 1 }],
|
|
195
642
|
retrievalFailure: {
|
|
196
643
|
reason: "backend_unavailable",
|
|
197
644
|
detail: "qmd:daemon_timeout (no response within the deadline)",
|
|
@@ -207,6 +654,7 @@ test("MCP recall payload keeps retrievalFailure so a tool caller can branch on i
|
|
|
207
654
|
fallbackUsed: false,
|
|
208
655
|
sourcesUsed: [],
|
|
209
656
|
disclosure: DEFAULT_RECALL_DISCLOSURE,
|
|
657
|
+
storageCorpusVersionsAtRecallStart: [{ namespace: "default", version: 1 }],
|
|
210
658
|
};
|
|
211
659
|
|
|
212
660
|
async function callRecall(response: EngramAccessRecallResponse): Promise<EngramAccessRecallResponse> {
|
|
@@ -233,6 +681,10 @@ test("MCP recall payload keeps retrievalFailure so a tool caller can branch on i
|
|
|
233
681
|
assert.ok(parsed && typeof parsed === "object");
|
|
234
682
|
const parsedFailure = "retrievalFailure" in parsed ? parsed.retrievalFailure : undefined;
|
|
235
683
|
assert.deepEqual(parsedFailure, structured.retrievalFailure);
|
|
684
|
+
assert.deepEqual(
|
|
685
|
+
"storageCorpusVersionsAtRecallStart" in parsed ? parsed.storageCorpusVersionsAtRecallStart : undefined,
|
|
686
|
+
structured.storageCorpusVersionsAtRecallStart,
|
|
687
|
+
);
|
|
236
688
|
return structured;
|
|
237
689
|
}
|
|
238
690
|
|