@remnic/core 9.69.89 → 9.69.91

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.
Files changed (405) hide show
  1. package/dist/access-admin-ops-surface.js +68 -67
  2. package/dist/access-authorization-probe.js +69 -68
  3. package/dist/access-boundary.js +68 -67
  4. package/dist/access-cli.js +160 -158
  5. package/dist/access-cli.js.map +1 -1
  6. package/dist/access-extraction-force-flush.js +68 -67
  7. package/dist/access-http-briefing.js +69 -68
  8. package/dist/access-http-query.js +70 -69
  9. package/dist/access-http.js +91 -90
  10. package/dist/access-identity-continuity-surface.js +68 -67
  11. package/dist/access-lcm-surface.js +68 -67
  12. package/dist/access-mcp-output-schemas.d.ts.map +1 -1
  13. package/dist/access-mcp-output-schemas.js +1 -1
  14. package/dist/access-mcp.js +80 -79
  15. package/dist/access-memory-search-fanout.js +3 -3
  16. package/dist/access-namespace-preflight.js +68 -67
  17. package/dist/access-observe-write-category.js +7 -7
  18. package/dist/access-observe-write-surface.js +68 -67
  19. package/dist/access-offline-manifest.js +6 -6
  20. package/dist/access-operations-batch.js +70 -69
  21. package/dist/access-operations.js +77 -76
  22. package/dist/access-recall-concurrency.js +68 -67
  23. package/dist/access-recall-corpus-versions.d.ts +12 -0
  24. package/dist/access-recall-corpus-versions.d.ts.map +1 -0
  25. package/dist/access-recall-corpus-versions.js +10 -0
  26. package/dist/access-recall-diagnostics.js +5 -5
  27. package/dist/access-recall-response.d.ts +4 -0
  28. package/dist/access-recall-response.d.ts.map +1 -1
  29. package/dist/access-recall-response.js +68 -67
  30. package/dist/access-recall-surface.d.ts +8 -0
  31. package/dist/access-recall-surface.d.ts.map +1 -1
  32. package/dist/access-recall-surface.js +68 -67
  33. package/dist/access-schema.js +6 -6
  34. package/dist/access-service.d.ts +5 -0
  35. package/dist/access-service.d.ts.map +1 -1
  36. package/dist/access-service.js +68 -67
  37. package/dist/access-surface-catalog.js +70 -69
  38. package/dist/access-surface-catalog.js.map +1 -1
  39. package/dist/active-memory-bridge.js +3 -3
  40. package/dist/active-recall.js +23 -21
  41. package/dist/active-recall.js.map +1 -1
  42. package/dist/adapters/index.js +4 -4
  43. package/dist/adapters/registry.js +2 -2
  44. package/dist/{auto-sync-U5N3CB5Y.js → auto-sync-PAWBFQWL.js} +5 -5
  45. package/dist/briefing.js +19 -19
  46. package/dist/buffer.js +8 -8
  47. package/dist/calibration.js +2 -2
  48. package/dist/capabilities.d.ts +2 -1
  49. package/dist/capabilities.d.ts.map +1 -1
  50. package/dist/capabilities.js +1 -1
  51. package/dist/{capsule-crypto-GWVG7LGC.js → capsule-crypto-7FJQINUR.js} +2 -2
  52. package/dist/causal-consolidation.js +19 -19
  53. package/dist/{chunk-BMXEBWBT.js → chunk-2EMROIXS.js} +2 -1
  54. package/dist/{chunk-BMXEBWBT.js.map → chunk-2EMROIXS.js.map} +1 -1
  55. package/dist/{chunk-MCTM4YPL.js → chunk-2FLFJTCI.js} +4 -2
  56. package/dist/chunk-2FLFJTCI.js.map +1 -0
  57. package/dist/{chunk-RDJ6C7NZ.js → chunk-2IWBHZ3H.js} +5 -5
  58. package/dist/{chunk-UP75KL3L.js → chunk-2JRB3Z5N.js} +2 -2
  59. package/dist/{chunk-OWHERGF2.js → chunk-2NLLXCJG.js} +2 -2
  60. package/dist/{chunk-KN6CIN7I.js → chunk-32HO62I4.js} +2 -2
  61. package/dist/{chunk-JLPNONPH.js → chunk-35A7GCHG.js} +2 -2
  62. package/dist/{chunk-EAQQ2FD3.js → chunk-37ZQYFX4.js} +6 -6
  63. package/dist/{chunk-3QKO4QN7.js → chunk-3BTHXB7Z.js} +2 -2
  64. package/dist/{chunk-C7V3KPKJ.js → chunk-47LTKAGL.js} +2 -2
  65. package/dist/{chunk-3O5BB45T.js → chunk-4DXNOVNW.js} +10 -10
  66. package/dist/{chunk-65I2LZEK.js → chunk-4G2YCKLT.js} +2 -2
  67. package/dist/{chunk-JBH26P62.js → chunk-4GEBLO7S.js} +10 -10
  68. package/dist/{chunk-6MNKDTDI.js → chunk-4I6PEEFA.js} +3 -3
  69. package/dist/{chunk-Z4TXB4K7.js → chunk-5BUCKFRE.js} +2 -2
  70. package/dist/{chunk-7D7OUO5W.js → chunk-5S7SNRSJ.js} +2 -2
  71. package/dist/{chunk-NOL7SEWN.js → chunk-5YR4UGF2.js} +5 -5
  72. package/dist/{chunk-PMNLL2TL.js → chunk-6BG364RN.js} +2 -2
  73. package/dist/{chunk-AEJ3TE5H.js → chunk-76LNUSS5.js} +2 -2
  74. package/dist/{chunk-7CRUDH7G.js → chunk-77HNHT6S.js} +2 -2
  75. package/dist/{chunk-OWYHHW67.js → chunk-7XI2UJHL.js} +4 -4
  76. package/dist/{chunk-BJVO4H5C.js → chunk-7Z2UKRNJ.js} +4 -4
  77. package/dist/{chunk-2WLMWP2T.js → chunk-A3K2KKSG.js} +2 -2
  78. package/dist/chunk-A5ZYP4K5.js +130 -0
  79. package/dist/chunk-A5ZYP4K5.js.map +1 -0
  80. package/dist/{chunk-NMZVDRVP.js → chunk-ACCOC6UM.js} +2 -2
  81. package/dist/{chunk-3JDA3XF5.js → chunk-AEGNDL24.js} +2 -2
  82. package/dist/{chunk-IYIBGSHJ.js → chunk-AEUMONCD.js} +2 -2
  83. package/dist/{chunk-RMDGAAZF.js → chunk-AF5PW35O.js} +2 -2
  84. package/dist/{chunk-JUT3OR2L.js → chunk-ANGZWYL2.js} +6 -6
  85. package/dist/{chunk-6LYAEM54.js → chunk-AXHU56C3.js} +2 -2
  86. package/dist/{chunk-YPI4RQWV.js → chunk-BCGMG2RD.js} +2 -2
  87. package/dist/{chunk-HXCJF4XU.js → chunk-BFIZXFUG.js} +2 -2
  88. package/dist/{chunk-DBYAY6UW.js → chunk-BTOHGPHC.js} +3 -3
  89. package/dist/{chunk-YSWJXOOL.js → chunk-CAKHZAXH.js} +2 -2
  90. package/dist/{chunk-YSBL7VPO.js → chunk-CDWFWOSZ.js} +2 -2
  91. package/dist/{chunk-VA4O3U7U.js → chunk-CZ44FH45.js} +4 -4
  92. package/dist/{chunk-T3FMRLWQ.js → chunk-D5HQ3VEX.js} +4 -4
  93. package/dist/{chunk-S7LWX2PQ.js → chunk-DPG5HQLE.js} +4 -4
  94. package/dist/{chunk-7WBSMXGC.js → chunk-DVSAMW5T.js} +3 -3
  95. package/dist/{chunk-WBYQA3VN.js → chunk-E5H4TM4Y.js} +3 -3
  96. package/dist/{chunk-4RL3JOB3.js → chunk-EEDI3OXB.js} +2 -2
  97. package/dist/{chunk-3TB2XQ3C.js → chunk-EUL3S3LE.js} +4 -4
  98. package/dist/{chunk-XAITGGX5.js → chunk-F23U5YE7.js} +4 -4
  99. package/dist/{chunk-IIARQTZ2.js → chunk-GDVORIFM.js} +2 -2
  100. package/dist/{chunk-CALBQ2NG.js → chunk-GXETU7AE.js} +79 -62
  101. package/dist/chunk-GXETU7AE.js.map +1 -0
  102. package/dist/{chunk-TPEZ2SHV.js → chunk-HCPUVB7S.js} +3 -3
  103. package/dist/{chunk-R3X2T2LP.js → chunk-HFOY2SBG.js} +2 -2
  104. package/dist/{chunk-JYM4Y6SO.js → chunk-HQCUUVG2.js} +19 -19
  105. package/dist/{chunk-ST2RQUXC.js → chunk-I6B3S62A.js} +2 -2
  106. package/dist/{chunk-RBITPCMK.js → chunk-IDSSDL4W.js} +9 -9
  107. package/dist/{chunk-B3OFQP5Y.js → chunk-IY47KPML.js} +6 -6
  108. package/dist/{chunk-AXC4WSF3.js → chunk-JDOBIFBK.js} +2 -2
  109. package/dist/{chunk-3AGHSQPM.js → chunk-JGXHQV5N.js} +3 -3
  110. package/dist/{chunk-7LNHRQKR.js → chunk-JLIGUFPF.js} +2 -2
  111. package/dist/{chunk-EDIH6X2P.js → chunk-JZ66PN72.js} +2 -2
  112. package/dist/{chunk-KTKHO3UI.js → chunk-KICEAGKM.js} +2 -2
  113. package/dist/{chunk-22LMCQ5B.js → chunk-KNI4SGQE.js} +118 -105
  114. package/dist/chunk-KNI4SGQE.js.map +1 -0
  115. package/dist/{chunk-BUKK5SWA.js → chunk-KQAFEZQX.js} +2 -2
  116. package/dist/{chunk-UQDC3W77.js → chunk-KTG23JDX.js} +2 -2
  117. package/dist/{chunk-3YD44CH2.js → chunk-KYOZ5E6V.js} +2 -2
  118. package/dist/{chunk-2FX374UI.js → chunk-L3TZXELN.js} +4 -4
  119. package/dist/{chunk-IKDRGVVJ.js → chunk-M3N2TUZ7.js} +2 -2
  120. package/dist/{chunk-76M5OK7V.js → chunk-M7T2NKET.js} +5 -5
  121. package/dist/{chunk-JZ4TJHR2.js → chunk-MZAH3CBT.js} +2 -2
  122. package/dist/{chunk-ZG5DWWKK.js → chunk-NJW2ZG64.js} +2 -2
  123. package/dist/{chunk-5STPRPE7.js → chunk-NSKXRTVZ.js} +2 -2
  124. package/dist/{chunk-4O4XCBOS.js → chunk-NUSQ3YEL.js} +2 -2
  125. package/dist/{chunk-SLEAJ67D.js → chunk-O57FCN42.js} +13 -13
  126. package/dist/{chunk-PULDSMCJ.js → chunk-OEBUAC3O.js} +10 -10
  127. package/dist/{chunk-Y23L4YJV.js → chunk-OEIA4IHU.js} +2 -2
  128. package/dist/{chunk-66DKTOBY.js → chunk-OGZC2WUX.js} +2 -2
  129. package/dist/{chunk-VHDKPGMG.js → chunk-P62DSJUK.js} +6 -6
  130. package/dist/{chunk-64ZUALXK.js → chunk-PH2V7EXZ.js} +2 -2
  131. package/dist/{chunk-KKNZ7PUZ.js → chunk-QAIKLICT.js} +2 -2
  132. package/dist/{chunk-SSUDD72S.js → chunk-QPWUG2S3.js} +2 -2
  133. package/dist/{chunk-QI2E6ISQ.js → chunk-R2TVWQLR.js} +2 -2
  134. package/dist/chunk-R2TVWQLR.js.map +1 -0
  135. package/dist/{chunk-AZIOEOK4.js → chunk-R36IBI2M.js} +3 -3
  136. package/dist/{chunk-MGZMC6WN.js → chunk-R5B3OWI4.js} +59 -59
  137. package/dist/{chunk-VL4X7ZHC.js → chunk-RFIJRZ4K.js} +2 -2
  138. package/dist/{chunk-PWF4JXKD.js → chunk-RKDSELA3.js} +1 -1
  139. package/dist/chunk-RKDSELA3.js.map +1 -0
  140. package/dist/{chunk-QZLCVO2V.js → chunk-RPVHRZ5C.js} +2 -2
  141. package/dist/{chunk-A6RVIHHK.js → chunk-RVBLCU5C.js} +4 -4
  142. package/dist/{chunk-BUQKSQXL.js → chunk-S533KGX6.js} +5 -5
  143. package/dist/{chunk-4HUCP4R4.js → chunk-SCPHU3RW.js} +7 -7
  144. package/dist/{chunk-RJLV4BKR.js → chunk-SFSD5Q6O.js} +3 -3
  145. package/dist/{chunk-QOXNTKXB.js → chunk-SMLKHXPF.js} +2 -2
  146. package/dist/{chunk-7QE46QXI.js → chunk-T7R5HI6A.js} +1 -1
  147. package/dist/{chunk-NJVR724O.js → chunk-TVQZAQPE.js} +2 -2
  148. package/dist/{chunk-H56VY4BY.js → chunk-U36GYZ2P.js} +10 -5
  149. package/dist/chunk-U36GYZ2P.js.map +1 -0
  150. package/dist/{chunk-XOV7NRY5.js → chunk-U46P4UAR.js} +3 -3
  151. package/dist/{chunk-DZ42MDZE.js → chunk-UCJINCZT.js} +2 -2
  152. package/dist/{chunk-WNRTXEWW.js → chunk-UG5V3Z3R.js} +7 -7
  153. package/dist/{chunk-IW3RMBPB.js → chunk-VAOC6GHN.js} +2 -2
  154. package/dist/{chunk-SZG4WFAG.js → chunk-VBNA2JEN.js} +2 -2
  155. package/dist/{chunk-J27JML5O.js → chunk-VOZNBQNL.js} +2 -2
  156. package/dist/{chunk-JB56XYHP.js → chunk-WHIGRW7T.js} +2 -2
  157. package/dist/{chunk-AZSGSRIM.js → chunk-WHTMVTU4.js} +3 -3
  158. package/dist/{chunk-AERXJCOG.js → chunk-WL7N5VGG.js} +5 -5
  159. package/dist/{chunk-TFA6HPOA.js → chunk-WQUGCOKF.js} +4 -4
  160. package/dist/{chunk-VDO32NLK.js → chunk-WTZQM74L.js} +5 -5
  161. package/dist/{chunk-UVYI6VIX.js → chunk-X7Y7WX73.js} +1 -1
  162. package/dist/{chunk-T2YX56QI.js → chunk-XWSUK5GL.js} +4 -4
  163. package/dist/{chunk-ACX55QDO.js → chunk-XYOT5GQU.js} +3 -3
  164. package/dist/{chunk-5FNZ3G6X.js → chunk-Y7427SL7.js} +7 -7
  165. package/dist/{chunk-FC52YWAO.js → chunk-YHZWVDP7.js} +2 -2
  166. package/dist/chunk-YVRQ5JRA.js +49 -0
  167. package/dist/chunk-YVRQ5JRA.js.map +1 -0
  168. package/dist/{chunk-DO4C4AXD.js → chunk-ZFTODDTX.js} +2 -2
  169. package/dist/{chunk-H36X4NRH.js → chunk-ZHXSOMYH.js} +2 -2
  170. package/dist/{chunk-FEIXG5FA.js → chunk-ZQTYWSO3.js} +2 -2
  171. package/dist/cli.js +119 -116
  172. package/dist/coding/export-okf-codegraph.js +17 -17
  173. package/dist/compounding/engine.js +19 -19
  174. package/dist/config.d.ts.map +1 -1
  175. package/dist/config.js +23 -21
  176. package/dist/connectors/codex-materialize-runner.js +18 -18
  177. package/dist/connectors/index.js +20 -20
  178. package/dist/contradiction/index.js +3 -3
  179. package/dist/{contradiction-scan-TAGMOUQ2.js → contradiction-scan-GGRTVB7C.js} +3 -3
  180. package/dist/convergence-refresh.js +20 -20
  181. package/dist/conversation-index/backend.js +2 -2
  182. package/dist/corpus-watermark.js +20 -20
  183. package/dist/day-summary.js +2 -2
  184. package/dist/deep-recall-http-glue.js +7 -7
  185. package/dist/embedding-fallback.js +2 -2
  186. package/dist/entity-retrieval.js +19 -19
  187. package/dist/explicit-capture.js +2 -2
  188. package/dist/external-wiki-access.js +69 -68
  189. package/dist/extraction-judge.js +3 -3
  190. package/dist/extraction-normalization.js +3 -3
  191. package/dist/extraction-prompt.js +2 -2
  192. package/dist/extraction.js +32 -32
  193. package/dist/{first-start-migration-GAT7G733.js → first-start-migration-OM3PHMZO.js} +5 -5
  194. package/dist/harmonic-retrieval.js +1 -1
  195. package/dist/index.d.ts +1 -1
  196. package/dist/index.d.ts.map +1 -1
  197. package/dist/index.js +196 -194
  198. package/dist/lcm/engine.js +3 -3
  199. package/dist/lcm/index.js +6 -6
  200. package/dist/local-llm-config.js +1 -1
  201. package/dist/local-llm.js +3 -3
  202. package/dist/location/index.js +20 -20
  203. package/dist/maintenance/memory-governance.js +18 -18
  204. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +18 -18
  205. package/dist/maintenance/rebuild-memory-projection.js +19 -19
  206. package/dist/memory-browse-operations.js +69 -68
  207. package/dist/memory-browse.js +5 -5
  208. package/dist/namespaces/migrate.js +19 -19
  209. package/dist/namespaces/principal.js +2 -2
  210. package/dist/namespaces/search.js +13 -13
  211. package/dist/namespaces/storage.js +18 -18
  212. package/dist/offline-sync-impression-drain.js +5 -5
  213. package/dist/operator-doctor-corpus.js +21 -21
  214. package/dist/operator-toolkit.js +35 -33
  215. package/dist/orchestration/compression-guideline-coordinator.js +2 -2
  216. package/dist/orchestration/maintenance.js +33 -33
  217. package/dist/orchestration/orchestrator-helpers.d.ts +1 -0
  218. package/dist/orchestration/orchestrator-helpers.d.ts.map +1 -1
  219. package/dist/orchestration/recall-entry.d.ts.map +1 -1
  220. package/dist/orchestration/recall-search-pipeline.d.ts.map +1 -1
  221. package/dist/orchestrator.js +162 -160
  222. package/dist/outcome-boost-config.d.ts +17 -0
  223. package/dist/outcome-boost-config.d.ts.map +1 -0
  224. package/dist/outcome-boost-config.js +1 -0
  225. package/dist/outcome-boost-config.js.map +1 -0
  226. package/dist/qmd.js +4 -4
  227. package/dist/recall-explain-renderer.js +3 -3
  228. package/dist/recall-navigate-access.js +2 -2
  229. package/dist/recall-navigate-disclosure.js +2 -2
  230. package/dist/recall-navigate.js +2 -2
  231. package/dist/recall-navigation-operations.js +69 -68
  232. package/dist/recall-navigation.js +68 -67
  233. package/dist/recall-state-view-admission.js +5 -5
  234. package/dist/recall-why-service.js +9 -9
  235. package/dist/recall-why.js +3 -3
  236. package/dist/recall-xray-cli.js +4 -4
  237. package/dist/recall-xray-renderer.js +3 -3
  238. package/dist/recall-xray.js +2 -2
  239. package/dist/rerank-outcome.d.ts +73 -0
  240. package/dist/rerank-outcome.d.ts.map +1 -0
  241. package/dist/rerank-outcome.js +28 -0
  242. package/dist/rerank-outcome.js.map +1 -0
  243. package/dist/{resolution-K4A3VPKZ.js → resolution-BROE3TRO.js} +4 -4
  244. package/dist/resolution-BROE3TRO.js.map +1 -0
  245. package/dist/resume-bundles.js +24 -22
  246. package/dist/search/embed-helper.js +2 -2
  247. package/dist/search/factory.js +12 -12
  248. package/dist/search/index.js +16 -16
  249. package/dist/search/lancedb-backend.js +2 -2
  250. package/dist/search/meilisearch-backend.js +2 -2
  251. package/dist/search/orama-backend.js +2 -2
  252. package/dist/semantic-consolidation.js +19 -19
  253. package/dist/semantic-rule-promotion.js +18 -18
  254. package/dist/semantic-rule-verifier.js +18 -18
  255. package/dist/shared-context/manager.js +2 -2
  256. package/dist/source-agent-qualifier.js +26 -26
  257. package/dist/standup/build.js +18 -18
  258. package/dist/storage.js +17 -17
  259. package/dist/summarizer.js +4 -4
  260. package/dist/support-passport/index.js +71 -70
  261. package/dist/{tier-stats-VF6DS52E.js → tier-stats-M2FMMD2N.js} +2 -2
  262. package/dist/transfer/backup.js +2 -2
  263. package/dist/transfer/capsule-export.js +2 -2
  264. package/dist/transfer/capsule-import.js +2 -2
  265. package/dist/transfer/export-okf.js +18 -18
  266. package/dist/types.d.ts +4 -2
  267. package/dist/types.d.ts.map +1 -1
  268. package/dist/types.js +1 -1
  269. package/dist/verified-recall.js +18 -18
  270. package/dist/who-knows-cli.js +19 -19
  271. package/dist/who-knows.js +18 -18
  272. package/package.json +13 -3
  273. package/src/access-mcp-output-schemas.ts +2 -0
  274. package/src/access-recall-corpus-versions.ts +59 -0
  275. package/src/access-recall-response.ts +3 -0
  276. package/src/access-recall-surface.ts +22 -23
  277. package/src/access-service-observe-lcm-parity.test.ts +54 -21
  278. package/src/access-service-raw-excerpt-read-gate.test.ts +1 -1
  279. package/src/access-service.ts +3 -0
  280. package/src/capabilities.test.ts +1 -0
  281. package/src/capabilities.ts +6 -8
  282. package/src/config.ts +3 -0
  283. package/src/index.ts +1 -1
  284. package/src/orchestration/orchestrator-helpers.ts +1 -1
  285. package/src/orchestration/recall-entry.ts +32 -16
  286. package/src/orchestration/recall-internal.ts +2 -2
  287. package/src/orchestration/recall-search-pipeline.ts +3 -0
  288. package/src/orchestrator-init.test.ts +11 -1
  289. package/src/outcome-boost-config.ts +16 -0
  290. package/src/recall-retrieval-failure.test.ts +456 -4
  291. package/src/rerank-outcome.test.ts +218 -0
  292. package/src/rerank-outcome.ts +219 -0
  293. package/src/types.ts +3 -3
  294. package/dist/chunk-22LMCQ5B.js.map +0 -1
  295. package/dist/chunk-CALBQ2NG.js.map +0 -1
  296. package/dist/chunk-H56VY4BY.js.map +0 -1
  297. package/dist/chunk-MCTM4YPL.js.map +0 -1
  298. package/dist/chunk-PWF4JXKD.js.map +0 -1
  299. package/dist/chunk-QI2E6ISQ.js.map +0 -1
  300. /package/dist/{capsule-crypto-GWVG7LGC.js.map → access-recall-corpus-versions.js.map} +0 -0
  301. /package/dist/{auto-sync-U5N3CB5Y.js.map → auto-sync-PAWBFQWL.js.map} +0 -0
  302. /package/dist/{contradiction-scan-TAGMOUQ2.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
  303. /package/dist/{chunk-RDJ6C7NZ.js.map → chunk-2IWBHZ3H.js.map} +0 -0
  304. /package/dist/{chunk-UP75KL3L.js.map → chunk-2JRB3Z5N.js.map} +0 -0
  305. /package/dist/{chunk-OWHERGF2.js.map → chunk-2NLLXCJG.js.map} +0 -0
  306. /package/dist/{chunk-KN6CIN7I.js.map → chunk-32HO62I4.js.map} +0 -0
  307. /package/dist/{chunk-JLPNONPH.js.map → chunk-35A7GCHG.js.map} +0 -0
  308. /package/dist/{chunk-EAQQ2FD3.js.map → chunk-37ZQYFX4.js.map} +0 -0
  309. /package/dist/{chunk-3QKO4QN7.js.map → chunk-3BTHXB7Z.js.map} +0 -0
  310. /package/dist/{chunk-C7V3KPKJ.js.map → chunk-47LTKAGL.js.map} +0 -0
  311. /package/dist/{chunk-3O5BB45T.js.map → chunk-4DXNOVNW.js.map} +0 -0
  312. /package/dist/{chunk-65I2LZEK.js.map → chunk-4G2YCKLT.js.map} +0 -0
  313. /package/dist/{chunk-JBH26P62.js.map → chunk-4GEBLO7S.js.map} +0 -0
  314. /package/dist/{chunk-6MNKDTDI.js.map → chunk-4I6PEEFA.js.map} +0 -0
  315. /package/dist/{chunk-Z4TXB4K7.js.map → chunk-5BUCKFRE.js.map} +0 -0
  316. /package/dist/{chunk-7D7OUO5W.js.map → chunk-5S7SNRSJ.js.map} +0 -0
  317. /package/dist/{chunk-NOL7SEWN.js.map → chunk-5YR4UGF2.js.map} +0 -0
  318. /package/dist/{chunk-PMNLL2TL.js.map → chunk-6BG364RN.js.map} +0 -0
  319. /package/dist/{chunk-AEJ3TE5H.js.map → chunk-76LNUSS5.js.map} +0 -0
  320. /package/dist/{chunk-7CRUDH7G.js.map → chunk-77HNHT6S.js.map} +0 -0
  321. /package/dist/{chunk-OWYHHW67.js.map → chunk-7XI2UJHL.js.map} +0 -0
  322. /package/dist/{chunk-BJVO4H5C.js.map → chunk-7Z2UKRNJ.js.map} +0 -0
  323. /package/dist/{chunk-2WLMWP2T.js.map → chunk-A3K2KKSG.js.map} +0 -0
  324. /package/dist/{chunk-NMZVDRVP.js.map → chunk-ACCOC6UM.js.map} +0 -0
  325. /package/dist/{chunk-3JDA3XF5.js.map → chunk-AEGNDL24.js.map} +0 -0
  326. /package/dist/{chunk-IYIBGSHJ.js.map → chunk-AEUMONCD.js.map} +0 -0
  327. /package/dist/{chunk-RMDGAAZF.js.map → chunk-AF5PW35O.js.map} +0 -0
  328. /package/dist/{chunk-JUT3OR2L.js.map → chunk-ANGZWYL2.js.map} +0 -0
  329. /package/dist/{chunk-6LYAEM54.js.map → chunk-AXHU56C3.js.map} +0 -0
  330. /package/dist/{chunk-YPI4RQWV.js.map → chunk-BCGMG2RD.js.map} +0 -0
  331. /package/dist/{chunk-HXCJF4XU.js.map → chunk-BFIZXFUG.js.map} +0 -0
  332. /package/dist/{chunk-DBYAY6UW.js.map → chunk-BTOHGPHC.js.map} +0 -0
  333. /package/dist/{chunk-YSWJXOOL.js.map → chunk-CAKHZAXH.js.map} +0 -0
  334. /package/dist/{chunk-YSBL7VPO.js.map → chunk-CDWFWOSZ.js.map} +0 -0
  335. /package/dist/{chunk-VA4O3U7U.js.map → chunk-CZ44FH45.js.map} +0 -0
  336. /package/dist/{chunk-T3FMRLWQ.js.map → chunk-D5HQ3VEX.js.map} +0 -0
  337. /package/dist/{chunk-S7LWX2PQ.js.map → chunk-DPG5HQLE.js.map} +0 -0
  338. /package/dist/{chunk-7WBSMXGC.js.map → chunk-DVSAMW5T.js.map} +0 -0
  339. /package/dist/{chunk-WBYQA3VN.js.map → chunk-E5H4TM4Y.js.map} +0 -0
  340. /package/dist/{chunk-4RL3JOB3.js.map → chunk-EEDI3OXB.js.map} +0 -0
  341. /package/dist/{chunk-3TB2XQ3C.js.map → chunk-EUL3S3LE.js.map} +0 -0
  342. /package/dist/{chunk-XAITGGX5.js.map → chunk-F23U5YE7.js.map} +0 -0
  343. /package/dist/{chunk-IIARQTZ2.js.map → chunk-GDVORIFM.js.map} +0 -0
  344. /package/dist/{chunk-TPEZ2SHV.js.map → chunk-HCPUVB7S.js.map} +0 -0
  345. /package/dist/{chunk-R3X2T2LP.js.map → chunk-HFOY2SBG.js.map} +0 -0
  346. /package/dist/{chunk-JYM4Y6SO.js.map → chunk-HQCUUVG2.js.map} +0 -0
  347. /package/dist/{chunk-ST2RQUXC.js.map → chunk-I6B3S62A.js.map} +0 -0
  348. /package/dist/{chunk-RBITPCMK.js.map → chunk-IDSSDL4W.js.map} +0 -0
  349. /package/dist/{chunk-B3OFQP5Y.js.map → chunk-IY47KPML.js.map} +0 -0
  350. /package/dist/{chunk-AXC4WSF3.js.map → chunk-JDOBIFBK.js.map} +0 -0
  351. /package/dist/{chunk-3AGHSQPM.js.map → chunk-JGXHQV5N.js.map} +0 -0
  352. /package/dist/{chunk-7LNHRQKR.js.map → chunk-JLIGUFPF.js.map} +0 -0
  353. /package/dist/{chunk-EDIH6X2P.js.map → chunk-JZ66PN72.js.map} +0 -0
  354. /package/dist/{chunk-KTKHO3UI.js.map → chunk-KICEAGKM.js.map} +0 -0
  355. /package/dist/{chunk-BUKK5SWA.js.map → chunk-KQAFEZQX.js.map} +0 -0
  356. /package/dist/{chunk-UQDC3W77.js.map → chunk-KTG23JDX.js.map} +0 -0
  357. /package/dist/{chunk-3YD44CH2.js.map → chunk-KYOZ5E6V.js.map} +0 -0
  358. /package/dist/{chunk-2FX374UI.js.map → chunk-L3TZXELN.js.map} +0 -0
  359. /package/dist/{chunk-IKDRGVVJ.js.map → chunk-M3N2TUZ7.js.map} +0 -0
  360. /package/dist/{chunk-76M5OK7V.js.map → chunk-M7T2NKET.js.map} +0 -0
  361. /package/dist/{chunk-JZ4TJHR2.js.map → chunk-MZAH3CBT.js.map} +0 -0
  362. /package/dist/{chunk-ZG5DWWKK.js.map → chunk-NJW2ZG64.js.map} +0 -0
  363. /package/dist/{chunk-5STPRPE7.js.map → chunk-NSKXRTVZ.js.map} +0 -0
  364. /package/dist/{chunk-4O4XCBOS.js.map → chunk-NUSQ3YEL.js.map} +0 -0
  365. /package/dist/{chunk-SLEAJ67D.js.map → chunk-O57FCN42.js.map} +0 -0
  366. /package/dist/{chunk-PULDSMCJ.js.map → chunk-OEBUAC3O.js.map} +0 -0
  367. /package/dist/{chunk-Y23L4YJV.js.map → chunk-OEIA4IHU.js.map} +0 -0
  368. /package/dist/{chunk-66DKTOBY.js.map → chunk-OGZC2WUX.js.map} +0 -0
  369. /package/dist/{chunk-VHDKPGMG.js.map → chunk-P62DSJUK.js.map} +0 -0
  370. /package/dist/{chunk-64ZUALXK.js.map → chunk-PH2V7EXZ.js.map} +0 -0
  371. /package/dist/{chunk-KKNZ7PUZ.js.map → chunk-QAIKLICT.js.map} +0 -0
  372. /package/dist/{chunk-SSUDD72S.js.map → chunk-QPWUG2S3.js.map} +0 -0
  373. /package/dist/{chunk-AZIOEOK4.js.map → chunk-R36IBI2M.js.map} +0 -0
  374. /package/dist/{chunk-MGZMC6WN.js.map → chunk-R5B3OWI4.js.map} +0 -0
  375. /package/dist/{chunk-VL4X7ZHC.js.map → chunk-RFIJRZ4K.js.map} +0 -0
  376. /package/dist/{chunk-QZLCVO2V.js.map → chunk-RPVHRZ5C.js.map} +0 -0
  377. /package/dist/{chunk-A6RVIHHK.js.map → chunk-RVBLCU5C.js.map} +0 -0
  378. /package/dist/{chunk-BUQKSQXL.js.map → chunk-S533KGX6.js.map} +0 -0
  379. /package/dist/{chunk-4HUCP4R4.js.map → chunk-SCPHU3RW.js.map} +0 -0
  380. /package/dist/{chunk-RJLV4BKR.js.map → chunk-SFSD5Q6O.js.map} +0 -0
  381. /package/dist/{chunk-QOXNTKXB.js.map → chunk-SMLKHXPF.js.map} +0 -0
  382. /package/dist/{chunk-7QE46QXI.js.map → chunk-T7R5HI6A.js.map} +0 -0
  383. /package/dist/{chunk-NJVR724O.js.map → chunk-TVQZAQPE.js.map} +0 -0
  384. /package/dist/{chunk-XOV7NRY5.js.map → chunk-U46P4UAR.js.map} +0 -0
  385. /package/dist/{chunk-DZ42MDZE.js.map → chunk-UCJINCZT.js.map} +0 -0
  386. /package/dist/{chunk-WNRTXEWW.js.map → chunk-UG5V3Z3R.js.map} +0 -0
  387. /package/dist/{chunk-IW3RMBPB.js.map → chunk-VAOC6GHN.js.map} +0 -0
  388. /package/dist/{chunk-SZG4WFAG.js.map → chunk-VBNA2JEN.js.map} +0 -0
  389. /package/dist/{chunk-J27JML5O.js.map → chunk-VOZNBQNL.js.map} +0 -0
  390. /package/dist/{chunk-JB56XYHP.js.map → chunk-WHIGRW7T.js.map} +0 -0
  391. /package/dist/{chunk-AZSGSRIM.js.map → chunk-WHTMVTU4.js.map} +0 -0
  392. /package/dist/{chunk-AERXJCOG.js.map → chunk-WL7N5VGG.js.map} +0 -0
  393. /package/dist/{chunk-TFA6HPOA.js.map → chunk-WQUGCOKF.js.map} +0 -0
  394. /package/dist/{chunk-VDO32NLK.js.map → chunk-WTZQM74L.js.map} +0 -0
  395. /package/dist/{chunk-UVYI6VIX.js.map → chunk-X7Y7WX73.js.map} +0 -0
  396. /package/dist/{chunk-T2YX56QI.js.map → chunk-XWSUK5GL.js.map} +0 -0
  397. /package/dist/{chunk-ACX55QDO.js.map → chunk-XYOT5GQU.js.map} +0 -0
  398. /package/dist/{chunk-5FNZ3G6X.js.map → chunk-Y7427SL7.js.map} +0 -0
  399. /package/dist/{chunk-FC52YWAO.js.map → chunk-YHZWVDP7.js.map} +0 -0
  400. /package/dist/{chunk-DO4C4AXD.js.map → chunk-ZFTODDTX.js.map} +0 -0
  401. /package/dist/{chunk-H36X4NRH.js.map → chunk-ZHXSOMYH.js.map} +0 -0
  402. /package/dist/{chunk-FEIXG5FA.js.map → chunk-ZQTYWSO3.js.map} +0 -0
  403. /package/dist/{resolution-K4A3VPKZ.js.map → contradiction-scan-GGRTVB7C.js.map} +0 -0
  404. /package/dist/{first-start-migration-GAT7G733.js.map → first-start-migration-OM3PHMZO.js.map} +0 -0
  405. /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(observed: { calls: number }, degrade: boolean): SearchBackend {
38
- const search = (execution?: SearchExecutionOptions) => {
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