@remnic/core 9.69.88 → 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 +74 -72
- package/dist/access-authorization-probe.js +75 -73
- package/dist/access-boundary.js +74 -72
- package/dist/access-cli.js +168 -165
- package/dist/access-cli.js.map +1 -1
- package/dist/access-extraction-force-flush.js +74 -72
- package/dist/access-http-briefing.js +75 -73
- package/dist/access-http-query.js +76 -74
- package/dist/access-http.js +98 -96
- package/dist/access-identity-continuity-surface.js +74 -72
- package/dist/access-lcm-surface.js +74 -72
- 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 +86 -84
- package/dist/access-memory-search-fanout.js +3 -3
- package/dist/access-namespace-preflight.js +74 -72
- package/dist/access-observe-write-category.js +11 -10
- package/dist/access-observe-write-surface.js +74 -72
- package/dist/access-offline-manifest.js +10 -9
- package/dist/access-operations-batch.js +76 -74
- package/dist/access-operations.js +83 -81
- package/dist/access-recall-concurrency.js +74 -72
- 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 +74 -72
- 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 +74 -72
- package/dist/access-schema.js +10 -9
- package/dist/access-service.d.ts +5 -0
- package/dist/access-service.d.ts.map +1 -1
- package/dist/access-service.js +74 -72
- package/dist/access-surface-catalog.js +76 -74
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/active-memory-bridge.js +3 -3
- package/dist/active-recall.js +27 -24
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +7 -7
- package/dist/adapters/registry.js +3 -3
- 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-YO5QJ6L3.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-BXLOS5AJ.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-MXCAJKMA.js → chunk-37ZQYFX4.js} +6 -6
- package/dist/{chunk-LW3HKRL7.js → chunk-3BTHXB7Z.js} +3 -3
- 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-OK52IY3W.js → chunk-4GEBLO7S.js} +10 -10
- package/dist/{chunk-M6C7SOR6.js → chunk-4I6PEEFA.js} +3 -3
- package/dist/{chunk-Z4TXB4K7.js → chunk-5BUCKFRE.js} +2 -2
- package/dist/{chunk-BGI4NUAO.js → chunk-5S7SNRSJ.js} +2 -2
- package/dist/{chunk-JVPWRNHA.js → chunk-5YR4UGF2.js} +5 -5
- package/dist/{chunk-YJ7MW627.js → chunk-6BG364RN.js} +2 -2
- package/dist/{chunk-D5BSQR63.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-AWG3TIAY.js → chunk-ACCOC6UM.js} +2 -2
- package/dist/{chunk-3JDA3XF5.js → chunk-AEGNDL24.js} +2 -2
- package/dist/{chunk-2NAD4YCI.js → chunk-AEUMONCD.js} +2 -2
- package/dist/{chunk-C6U57KG4.js → chunk-AF5PW35O.js} +3 -3
- package/dist/{chunk-IOSZHHJC.js → chunk-ANGZWYL2.js} +6 -6
- package/dist/{chunk-K6T33R4Q.js → chunk-AXGJMDBS.js} +156 -7
- package/dist/chunk-AXGJMDBS.js.map +1 -0
- package/dist/{chunk-6LYAEM54.js → chunk-AXHU56C3.js} +2 -2
- package/dist/{chunk-GWM6T5EQ.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-5X4MXNEU.js → chunk-C6HPNPNK.js} +3 -3
- package/dist/{chunk-4MP7XR5J.js → chunk-CAKHZAXH.js} +2 -2
- package/dist/{chunk-YSBL7VPO.js → chunk-CDWFWOSZ.js} +2 -2
- package/dist/{chunk-QAW55ZHJ.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-C7ZDKWPS.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-Q4AUIFUA.js → chunk-F23U5YE7.js} +7 -7
- package/dist/{chunk-ZZZ4I455.js → chunk-GDVORIFM.js} +2 -2
- package/dist/{chunk-QB57WIS6.js → chunk-GXETU7AE.js} +98 -73
- package/dist/chunk-GXETU7AE.js.map +1 -0
- package/dist/{chunk-SWBC3UER.js → chunk-HCPUVB7S.js} +3 -3
- package/dist/{chunk-R3X2T2LP.js → chunk-HFOY2SBG.js} +2 -2
- package/dist/{chunk-LU7E2MXE.js → chunk-HQCUUVG2.js} +20 -20
- package/dist/{chunk-FJLQXMTU.js → chunk-I6B3S62A.js} +2 -2
- package/dist/{chunk-RBITPCMK.js → chunk-IDSSDL4W.js} +9 -9
- package/dist/{chunk-OCFXVDBZ.js → chunk-IVEHY2VT.js} +54 -123
- package/dist/chunk-IVEHY2VT.js.map +1 -0
- package/dist/{chunk-B3OFQP5Y.js → chunk-IY47KPML.js} +6 -6
- package/dist/{chunk-AXC4WSF3.js → chunk-JDOBIFBK.js} +2 -2
- package/dist/{chunk-P2ODTYOF.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-BLVR4WYU.js → chunk-KICEAGKM.js} +2 -2
- package/dist/{chunk-S2GE2K36.js → chunk-KNI4SGQE.js} +109 -96
- package/dist/chunk-KNI4SGQE.js.map +1 -0
- package/dist/{chunk-VDX2J7OX.js → chunk-KQAFEZQX.js} +2 -2
- package/dist/{chunk-PEBHPCX2.js → chunk-KTG23JDX.js} +2 -2
- package/dist/{chunk-BOZJD5PK.js → chunk-KYOZ5E6V.js} +2 -2
- package/dist/{chunk-2DLWLNO4.js → chunk-L3TZXELN.js} +4 -4
- package/dist/{chunk-VALKBYBN.js → chunk-M3N2TUZ7.js} +2 -2
- package/dist/{chunk-76M5OK7V.js → chunk-M7T2NKET.js} +5 -5
- package/dist/chunk-MSAI3Q7D.js +372 -0
- package/dist/chunk-MSAI3Q7D.js.map +1 -0
- package/dist/{chunk-Z5LP6ILP.js → chunk-MZAH3CBT.js} +2 -2
- package/dist/{chunk-QI7K7BZ5.js → chunk-NJW2ZG64.js} +2 -2
- package/dist/{chunk-CZJA2EQE.js → chunk-NSKXRTVZ.js} +2 -2
- package/dist/{chunk-4O4XCBOS.js → chunk-NUSQ3YEL.js} +2 -2
- package/dist/{chunk-4OQET73E.js → chunk-O57FCN42.js} +15 -15
- package/dist/{chunk-WKY7N3L7.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-3SGTV7RD.js → chunk-P62DSJUK.js} +6 -6
- package/dist/{chunk-FKD656D2.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-GZDTVYK2.js → chunk-R36IBI2M.js} +3 -3
- package/dist/{chunk-W3XXFPRI.js → chunk-R5B3OWI4.js} +64 -64
- 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-AEHVZY3X.js → chunk-RPVHRZ5C.js} +2 -2
- package/dist/{chunk-X5SHE2O3.js → chunk-RVBLCU5C.js} +4 -4
- package/dist/{chunk-BUQKSQXL.js → chunk-S533KGX6.js} +5 -5
- package/dist/{chunk-STEOT4DI.js → chunk-SCPHU3RW.js} +7 -7
- package/dist/{chunk-LV5H6FTN.js → chunk-SFSD5Q6O.js} +3 -3
- package/dist/{chunk-AE5U5NMS.js → chunk-SMLKHXPF.js} +2 -2
- package/dist/{chunk-AEU4EQGV.js → chunk-T7R5HI6A.js} +1 -1
- package/dist/{chunk-H5BJWPUI.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-5E6RYRYW.js → chunk-UG5V3Z3R.js} +7 -7
- package/dist/{chunk-IW3RMBPB.js → chunk-VAOC6GHN.js} +2 -2
- package/dist/{chunk-6UQFJULG.js → chunk-VBNA2JEN.js} +2 -2
- package/dist/{chunk-HLB7GKGG.js → chunk-VOZNBQNL.js} +2 -2
- package/dist/{chunk-NYKIUQL6.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-A4VSOUCB.js → chunk-WTZQM74L.js} +5 -5
- package/dist/{chunk-DQEMWVMT.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-Z6EZCN6Z.js → chunk-Y7427SL7.js} +10 -10
- package/dist/{chunk-4KN2JLQV.js → chunk-YHZWVDP7.js} +2 -2
- package/dist/chunk-YVRQ5JRA.js +49 -0
- package/dist/chunk-YVRQ5JRA.js.map +1 -0
- package/dist/{chunk-5MNUBT7T.js → chunk-ZFTODDTX.js} +2 -2
- package/dist/{chunk-VVX5PZFS.js → chunk-ZHXSOMYH.js} +2 -2
- package/dist/{chunk-CRXRZA3G.js → chunk-ZQTYWSO3.js} +2 -2
- package/dist/cli.js +126 -122
- 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 +27 -24
- 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 +11 -10
- 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 +75 -73
- 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-7OATHJKB.js → first-start-migration-OM3PHMZO.js} +2 -2
- 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 +198 -195
- package/dist/lcm/engine.js +4 -4
- package/dist/lcm/index.js +10 -10
- 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 +75 -73
- 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-changeset-generations.d.ts +82 -0
- package/dist/offline-sync-changeset-generations.d.ts.map +1 -0
- package/dist/offline-sync-changeset-generations.js +21 -0
- package/dist/offline-sync-changeset-generations.js.map +1 -0
- package/dist/offline-sync-embedding-generation.d.ts +50 -0
- package/dist/offline-sync-embedding-generation.d.ts.map +1 -1
- package/dist/offline-sync-embedding-generation.js +4 -2
- package/dist/offline-sync-impression-drain.js +5 -5
- package/dist/offline-sync-snapshot-stream.js +5 -4
- package/dist/offline-sync.d.ts +12 -1
- package/dist/offline-sync.d.ts.map +1 -1
- package/dist/offline-sync.js +6 -5
- package/dist/operator-doctor-corpus.js +21 -21
- package/dist/operator-toolkit.js +39 -36
- 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 +168 -165
- 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 +75 -73
- package/dist/recall-navigation.js +74 -72
- 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 +28 -25
- package/dist/search/embed-helper.js +2 -2
- package/dist/search/factory.js +12 -12
- package/dist/search/index.js +18 -18
- 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 +77 -75
- package/dist/support-passport/offline-sync-guard.d.ts +6 -2
- package/dist/support-passport/offline-sync-guard.d.ts.map +1 -1
- 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/offline-sync-changeset-generations.test.ts +962 -0
- package/src/offline-sync-changeset-generations.ts +549 -0
- package/src/offline-sync-embedding-generation.ts +272 -4
- package/src/offline-sync.ts +75 -162
- 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/support-passport/offline-sync-guard.ts +16 -2
- package/src/types.ts +3 -3
- package/dist/chunk-H56VY4BY.js.map +0 -1
- package/dist/chunk-K6T33R4Q.js.map +0 -1
- package/dist/chunk-MCTM4YPL.js.map +0 -1
- package/dist/chunk-OCFXVDBZ.js.map +0 -1
- package/dist/chunk-PWF4JXKD.js.map +0 -1
- package/dist/chunk-QB57WIS6.js.map +0 -1
- package/dist/chunk-QI2E6ISQ.js.map +0 -1
- package/dist/chunk-S2GE2K36.js.map +0 -1
- /package/dist/{capsule-crypto-YO5QJ6L3.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-BXLOS5AJ.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-MXCAJKMA.js.map → chunk-37ZQYFX4.js.map} +0 -0
- /package/dist/{chunk-LW3HKRL7.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-OK52IY3W.js.map → chunk-4GEBLO7S.js.map} +0 -0
- /package/dist/{chunk-M6C7SOR6.js.map → chunk-4I6PEEFA.js.map} +0 -0
- /package/dist/{chunk-Z4TXB4K7.js.map → chunk-5BUCKFRE.js.map} +0 -0
- /package/dist/{chunk-BGI4NUAO.js.map → chunk-5S7SNRSJ.js.map} +0 -0
- /package/dist/{chunk-JVPWRNHA.js.map → chunk-5YR4UGF2.js.map} +0 -0
- /package/dist/{chunk-YJ7MW627.js.map → chunk-6BG364RN.js.map} +0 -0
- /package/dist/{chunk-D5BSQR63.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-AWG3TIAY.js.map → chunk-ACCOC6UM.js.map} +0 -0
- /package/dist/{chunk-3JDA3XF5.js.map → chunk-AEGNDL24.js.map} +0 -0
- /package/dist/{chunk-2NAD4YCI.js.map → chunk-AEUMONCD.js.map} +0 -0
- /package/dist/{chunk-C6U57KG4.js.map → chunk-AF5PW35O.js.map} +0 -0
- /package/dist/{chunk-IOSZHHJC.js.map → chunk-ANGZWYL2.js.map} +0 -0
- /package/dist/{chunk-6LYAEM54.js.map → chunk-AXHU56C3.js.map} +0 -0
- /package/dist/{chunk-GWM6T5EQ.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-5X4MXNEU.js.map → chunk-C6HPNPNK.js.map} +0 -0
- /package/dist/{chunk-4MP7XR5J.js.map → chunk-CAKHZAXH.js.map} +0 -0
- /package/dist/{chunk-YSBL7VPO.js.map → chunk-CDWFWOSZ.js.map} +0 -0
- /package/dist/{chunk-QAW55ZHJ.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-C7ZDKWPS.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-Q4AUIFUA.js.map → chunk-F23U5YE7.js.map} +0 -0
- /package/dist/{chunk-ZZZ4I455.js.map → chunk-GDVORIFM.js.map} +0 -0
- /package/dist/{chunk-SWBC3UER.js.map → chunk-HCPUVB7S.js.map} +0 -0
- /package/dist/{chunk-R3X2T2LP.js.map → chunk-HFOY2SBG.js.map} +0 -0
- /package/dist/{chunk-LU7E2MXE.js.map → chunk-HQCUUVG2.js.map} +0 -0
- /package/dist/{chunk-FJLQXMTU.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-P2ODTYOF.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-BLVR4WYU.js.map → chunk-KICEAGKM.js.map} +0 -0
- /package/dist/{chunk-VDX2J7OX.js.map → chunk-KQAFEZQX.js.map} +0 -0
- /package/dist/{chunk-PEBHPCX2.js.map → chunk-KTG23JDX.js.map} +0 -0
- /package/dist/{chunk-BOZJD5PK.js.map → chunk-KYOZ5E6V.js.map} +0 -0
- /package/dist/{chunk-2DLWLNO4.js.map → chunk-L3TZXELN.js.map} +0 -0
- /package/dist/{chunk-VALKBYBN.js.map → chunk-M3N2TUZ7.js.map} +0 -0
- /package/dist/{chunk-76M5OK7V.js.map → chunk-M7T2NKET.js.map} +0 -0
- /package/dist/{chunk-Z5LP6ILP.js.map → chunk-MZAH3CBT.js.map} +0 -0
- /package/dist/{chunk-QI7K7BZ5.js.map → chunk-NJW2ZG64.js.map} +0 -0
- /package/dist/{chunk-CZJA2EQE.js.map → chunk-NSKXRTVZ.js.map} +0 -0
- /package/dist/{chunk-4O4XCBOS.js.map → chunk-NUSQ3YEL.js.map} +0 -0
- /package/dist/{chunk-4OQET73E.js.map → chunk-O57FCN42.js.map} +0 -0
- /package/dist/{chunk-WKY7N3L7.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-3SGTV7RD.js.map → chunk-P62DSJUK.js.map} +0 -0
- /package/dist/{chunk-FKD656D2.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-GZDTVYK2.js.map → chunk-R36IBI2M.js.map} +0 -0
- /package/dist/{chunk-W3XXFPRI.js.map → chunk-R5B3OWI4.js.map} +0 -0
- /package/dist/{chunk-VL4X7ZHC.js.map → chunk-RFIJRZ4K.js.map} +0 -0
- /package/dist/{chunk-AEHVZY3X.js.map → chunk-RPVHRZ5C.js.map} +0 -0
- /package/dist/{chunk-X5SHE2O3.js.map → chunk-RVBLCU5C.js.map} +0 -0
- /package/dist/{chunk-BUQKSQXL.js.map → chunk-S533KGX6.js.map} +0 -0
- /package/dist/{chunk-STEOT4DI.js.map → chunk-SCPHU3RW.js.map} +0 -0
- /package/dist/{chunk-LV5H6FTN.js.map → chunk-SFSD5Q6O.js.map} +0 -0
- /package/dist/{chunk-AE5U5NMS.js.map → chunk-SMLKHXPF.js.map} +0 -0
- /package/dist/{chunk-AEU4EQGV.js.map → chunk-T7R5HI6A.js.map} +0 -0
- /package/dist/{chunk-H5BJWPUI.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-5E6RYRYW.js.map → chunk-UG5V3Z3R.js.map} +0 -0
- /package/dist/{chunk-IW3RMBPB.js.map → chunk-VAOC6GHN.js.map} +0 -0
- /package/dist/{chunk-6UQFJULG.js.map → chunk-VBNA2JEN.js.map} +0 -0
- /package/dist/{chunk-HLB7GKGG.js.map → chunk-VOZNBQNL.js.map} +0 -0
- /package/dist/{chunk-NYKIUQL6.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-A4VSOUCB.js.map → chunk-WTZQM74L.js.map} +0 -0
- /package/dist/{chunk-DQEMWVMT.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-Z6EZCN6Z.js.map → chunk-Y7427SL7.js.map} +0 -0
- /package/dist/{chunk-4KN2JLQV.js.map → chunk-YHZWVDP7.js.map} +0 -0
- /package/dist/{chunk-5MNUBT7T.js.map → chunk-ZFTODDTX.js.map} +0 -0
- /package/dist/{chunk-VVX5PZFS.js.map → chunk-ZHXSOMYH.js.map} +0 -0
- /package/dist/{chunk-CRXRZA3G.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-7OATHJKB.js.map → first-start-migration-OM3PHMZO.js.map} +0 -0
- /package/dist/{tier-stats-VF6DS52E.js.map → tier-stats-M2FMMD2N.js.map} +0 -0
|
@@ -19,7 +19,7 @@ import { type RecallInvocationOptions, abortRecallError } from "./orchestrator-h
|
|
|
19
19
|
import { ProfilingCollector } from "../profiling.js";
|
|
20
20
|
import { trustResultFor, type TrustStageResultItem } from "../trust-score-stage.js";
|
|
21
21
|
import type { RecallResultFormatter } from "./recall-result-formatter.js";
|
|
22
|
-
import type { IdentityInjectionMode, PluginConfig, QmdSearchResult } from "../types.js";
|
|
22
|
+
import type { IdentityInjectionMode, PluginConfig, QmdSearchResult, RecallPlanMode } from "../types.js";
|
|
23
23
|
import { stateViewPacketActive } from "../recall-state-view-anchors.js";
|
|
24
24
|
import { resultStateViewKey, stateViewPacketKeys } from "../recall-state-view.js";
|
|
25
25
|
import { applyRecallStateViews } from "../recall-state-view-wire.js";
|
|
@@ -163,11 +163,16 @@ export class RecallEntryCoordinator {
|
|
|
163
163
|
options.budgetCharsOverride >= 0
|
|
164
164
|
? options.budgetCharsOverride
|
|
165
165
|
: this.deps.config.recallBudgetChars;
|
|
166
|
-
|
|
166
|
+
const shouldReadStandingBlock =
|
|
167
|
+
this.deps.config.recallStandingBlock && !namespacesEnabled && standingBudget !== 0 && !options.asOf;
|
|
168
|
+
if (shouldReadStandingBlock) {
|
|
167
169
|
try {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
});
|
|
170
|
+
await options.onRecallPlanResolved?.("no_recall", [this.deps.config.defaultNamespace]);
|
|
171
|
+
} catch (err) {
|
|
172
|
+
log.warn(`standing-memory plan callback failed: ${err}`);
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
const memories = await this.deps.storage.readAllMemories({ abortSignal: abortController.signal });
|
|
171
176
|
standingText = renderStandingMemoryBlock(
|
|
172
177
|
this.deps.config,
|
|
173
178
|
memoriesToStandingEntries(memories, { requestingConnector: options.sourceConnector }),
|
|
@@ -176,25 +181,36 @@ export class RecallEntryCoordinator {
|
|
|
176
181
|
log.warn(`standing memory block skipped: ${err}`);
|
|
177
182
|
}
|
|
178
183
|
}
|
|
184
|
+
let innerBudget = options.budgetCharsOverride;
|
|
179
185
|
const innerObserver = options.onContextComposition;
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
? Math.max(0, standingBudget - standingText.length - 2)
|
|
183
|
-
: options.budgetCharsOverride;
|
|
184
|
-
const recallOptions = {
|
|
186
|
+
let recallOptions: RecallInvocationOptions;
|
|
187
|
+
recallOptions = {
|
|
185
188
|
...options,
|
|
186
189
|
abortSignal: abortController.signal,
|
|
187
190
|
budgetCharsOverride: innerBudget,
|
|
191
|
+
onRecallPlanResolved: options.onRecallPlanResolved || shouldReadStandingBlock
|
|
192
|
+
? async (mode: RecallPlanMode, readNamespaces: readonly string[]) => {
|
|
193
|
+
const versionNamespaces =
|
|
194
|
+
mode === "no_recall" && !shouldReadStandingBlock
|
|
195
|
+
? []
|
|
196
|
+
: shouldReadStandingBlock && !readNamespaces.includes(this.deps.config.defaultNamespace)
|
|
197
|
+
? [...readNamespaces, this.deps.config.defaultNamespace]
|
|
198
|
+
: readNamespaces;
|
|
199
|
+
await options.onRecallPlanResolved?.(mode, versionNamespaces);
|
|
200
|
+
innerBudget = standingText.length > 0 && standingBudget > 0
|
|
201
|
+
? Math.max(0, standingBudget - standingText.length - 2)
|
|
202
|
+
: options.budgetCharsOverride;
|
|
203
|
+
recallOptions.budgetCharsOverride = innerBudget;
|
|
204
|
+
}
|
|
205
|
+
: undefined,
|
|
188
206
|
onContextComposition:
|
|
189
|
-
|
|
207
|
+
shouldReadStandingBlock
|
|
190
208
|
? (composition: RecallContextComposition) =>
|
|
191
209
|
innerObserver?.({
|
|
192
210
|
...composition,
|
|
193
|
-
context:
|
|
194
|
-
composition.context ?? "",
|
|
195
|
-
|
|
196
|
-
standingBudget,
|
|
197
|
-
),
|
|
211
|
+
context: standingText.length > 0
|
|
212
|
+
? prefixStandingMemoryBlock(composition.context ?? "", standingText, standingBudget)
|
|
213
|
+
: composition.context,
|
|
198
214
|
})
|
|
199
215
|
: innerObserver,
|
|
200
216
|
};
|
|
@@ -344,8 +344,7 @@ export class RecallInternalCoordinator {
|
|
|
344
344
|
);
|
|
345
345
|
}
|
|
346
346
|
this.deps.profiler.endSpan("planning", profileTraceId);
|
|
347
|
-
const recallMode: RecallPlanMode =
|
|
348
|
-
requestedMode ?? recallDecision.effectiveMode;
|
|
347
|
+
const recallMode: RecallPlanMode = requestedMode ?? recallDecision.effectiveMode;
|
|
349
348
|
const queryIntent = inferIntentFromText(retrievalQuery);
|
|
350
349
|
const qmdSearchOptions =
|
|
351
350
|
this.deps.buildConfiguredQmdSearchOptions(retrievalQuery);
|
|
@@ -467,6 +466,7 @@ export class RecallInternalCoordinator {
|
|
|
467
466
|
scopeProfilePlan,
|
|
468
467
|
lcmReadSessionIds,
|
|
469
468
|
} = scopePlan;
|
|
469
|
+
await options.onRecallPlanResolved?.(recallMode, recallNamespaces);
|
|
470
470
|
// `firstNonEmptyLcmRead`: query the ordered LCM read key set, return the
|
|
471
471
|
// FIRST non-empty result (#1505). The query-SCORED sections no longer use
|
|
472
472
|
// it — they MERGE candidates across every authorized key (a weak primary
|
|
@@ -58,6 +58,7 @@ import {
|
|
|
58
58
|
memoryMapKey,
|
|
59
59
|
resultHasKey,
|
|
60
60
|
} from "../recall-memory-map.js";
|
|
61
|
+
import { applyOutcomePriorScores, outcomePriorBoostActive } from "../rerank-outcome.js";
|
|
61
62
|
import { type UtilityRuntimeValues, applyUtilityRankingRuntimeDelta } from "../utility-runtime.js";
|
|
62
63
|
import {
|
|
63
64
|
lifecycleRecallScoreAdjustment,
|
|
@@ -1710,6 +1711,8 @@ export class RecallSearchPipelineCoordinator {
|
|
|
1710
1711
|
boosted.push({ ...r, score });
|
|
1711
1712
|
}
|
|
1712
1713
|
|
|
1714
|
+
if (outcomePriorBoostActive(this.deps.config)) applyOutcomePriorScores(boosted, memoryByPath, this.deps.config);
|
|
1715
|
+
|
|
1713
1716
|
// Re-sort by boosted score
|
|
1714
1717
|
return boosted.sort((a, b) => b.score - a.score);
|
|
1715
1718
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* H1 outcome-prior recall blend (issue #1958).
|
|
3
|
+
*
|
|
4
|
+
* Both fields default off/zero. Recall ranking stays on the existing
|
|
5
|
+
* boost path unless `outcomeBoostEnabled` is true and `outcomeBoostWeight`
|
|
6
|
+
* is greater than 0.
|
|
7
|
+
*/
|
|
8
|
+
export interface OutcomeBoostConfig {
|
|
9
|
+
/** Opt-in gate. Default false. */
|
|
10
|
+
outcomeBoostEnabled: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Blend weight in [0, 1]. Absent config parses as 0, which does not
|
|
13
|
+
* change scores. Invalid values throw.
|
|
14
|
+
*/
|
|
15
|
+
outcomeBoostWeight: number;
|
|
16
|
+
}
|
|
@@ -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
|
|