@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.
Files changed (431) hide show
  1. package/dist/access-admin-ops-surface.js +74 -72
  2. package/dist/access-authorization-probe.js +75 -73
  3. package/dist/access-boundary.js +74 -72
  4. package/dist/access-cli.js +168 -165
  5. package/dist/access-cli.js.map +1 -1
  6. package/dist/access-extraction-force-flush.js +74 -72
  7. package/dist/access-http-briefing.js +75 -73
  8. package/dist/access-http-query.js +76 -74
  9. package/dist/access-http.js +98 -96
  10. package/dist/access-identity-continuity-surface.js +74 -72
  11. package/dist/access-lcm-surface.js +74 -72
  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 +86 -84
  15. package/dist/access-memory-search-fanout.js +3 -3
  16. package/dist/access-namespace-preflight.js +74 -72
  17. package/dist/access-observe-write-category.js +11 -10
  18. package/dist/access-observe-write-surface.js +74 -72
  19. package/dist/access-offline-manifest.js +10 -9
  20. package/dist/access-operations-batch.js +76 -74
  21. package/dist/access-operations.js +83 -81
  22. package/dist/access-recall-concurrency.js +74 -72
  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 +74 -72
  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 +74 -72
  33. package/dist/access-schema.js +10 -9
  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 +74 -72
  37. package/dist/access-surface-catalog.js +76 -74
  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 +27 -24
  41. package/dist/active-recall.js.map +1 -1
  42. package/dist/adapters/index.js +7 -7
  43. package/dist/adapters/registry.js +3 -3
  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-YO5QJ6L3.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-BXLOS5AJ.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-MXCAJKMA.js → chunk-37ZQYFX4.js} +6 -6
  63. package/dist/{chunk-LW3HKRL7.js → chunk-3BTHXB7Z.js} +3 -3
  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-OK52IY3W.js → chunk-4GEBLO7S.js} +10 -10
  68. package/dist/{chunk-M6C7SOR6.js → chunk-4I6PEEFA.js} +3 -3
  69. package/dist/{chunk-Z4TXB4K7.js → chunk-5BUCKFRE.js} +2 -2
  70. package/dist/{chunk-BGI4NUAO.js → chunk-5S7SNRSJ.js} +2 -2
  71. package/dist/{chunk-JVPWRNHA.js → chunk-5YR4UGF2.js} +5 -5
  72. package/dist/{chunk-YJ7MW627.js → chunk-6BG364RN.js} +2 -2
  73. package/dist/{chunk-D5BSQR63.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-AWG3TIAY.js → chunk-ACCOC6UM.js} +2 -2
  81. package/dist/{chunk-3JDA3XF5.js → chunk-AEGNDL24.js} +2 -2
  82. package/dist/{chunk-2NAD4YCI.js → chunk-AEUMONCD.js} +2 -2
  83. package/dist/{chunk-C6U57KG4.js → chunk-AF5PW35O.js} +3 -3
  84. package/dist/{chunk-IOSZHHJC.js → chunk-ANGZWYL2.js} +6 -6
  85. package/dist/{chunk-K6T33R4Q.js → chunk-AXGJMDBS.js} +156 -7
  86. package/dist/chunk-AXGJMDBS.js.map +1 -0
  87. package/dist/{chunk-6LYAEM54.js → chunk-AXHU56C3.js} +2 -2
  88. package/dist/{chunk-GWM6T5EQ.js → chunk-BCGMG2RD.js} +2 -2
  89. package/dist/{chunk-HXCJF4XU.js → chunk-BFIZXFUG.js} +2 -2
  90. package/dist/{chunk-DBYAY6UW.js → chunk-BTOHGPHC.js} +3 -3
  91. package/dist/{chunk-5X4MXNEU.js → chunk-C6HPNPNK.js} +3 -3
  92. package/dist/{chunk-4MP7XR5J.js → chunk-CAKHZAXH.js} +2 -2
  93. package/dist/{chunk-YSBL7VPO.js → chunk-CDWFWOSZ.js} +2 -2
  94. package/dist/{chunk-QAW55ZHJ.js → chunk-CZ44FH45.js} +4 -4
  95. package/dist/{chunk-T3FMRLWQ.js → chunk-D5HQ3VEX.js} +4 -4
  96. package/dist/{chunk-S7LWX2PQ.js → chunk-DPG5HQLE.js} +4 -4
  97. package/dist/{chunk-C7ZDKWPS.js → chunk-DVSAMW5T.js} +3 -3
  98. package/dist/{chunk-WBYQA3VN.js → chunk-E5H4TM4Y.js} +3 -3
  99. package/dist/{chunk-4RL3JOB3.js → chunk-EEDI3OXB.js} +2 -2
  100. package/dist/{chunk-3TB2XQ3C.js → chunk-EUL3S3LE.js} +4 -4
  101. package/dist/{chunk-Q4AUIFUA.js → chunk-F23U5YE7.js} +7 -7
  102. package/dist/{chunk-ZZZ4I455.js → chunk-GDVORIFM.js} +2 -2
  103. package/dist/{chunk-QB57WIS6.js → chunk-GXETU7AE.js} +98 -73
  104. package/dist/chunk-GXETU7AE.js.map +1 -0
  105. package/dist/{chunk-SWBC3UER.js → chunk-HCPUVB7S.js} +3 -3
  106. package/dist/{chunk-R3X2T2LP.js → chunk-HFOY2SBG.js} +2 -2
  107. package/dist/{chunk-LU7E2MXE.js → chunk-HQCUUVG2.js} +20 -20
  108. package/dist/{chunk-FJLQXMTU.js → chunk-I6B3S62A.js} +2 -2
  109. package/dist/{chunk-RBITPCMK.js → chunk-IDSSDL4W.js} +9 -9
  110. package/dist/{chunk-OCFXVDBZ.js → chunk-IVEHY2VT.js} +54 -123
  111. package/dist/chunk-IVEHY2VT.js.map +1 -0
  112. package/dist/{chunk-B3OFQP5Y.js → chunk-IY47KPML.js} +6 -6
  113. package/dist/{chunk-AXC4WSF3.js → chunk-JDOBIFBK.js} +2 -2
  114. package/dist/{chunk-P2ODTYOF.js → chunk-JGXHQV5N.js} +3 -3
  115. package/dist/{chunk-7LNHRQKR.js → chunk-JLIGUFPF.js} +2 -2
  116. package/dist/{chunk-EDIH6X2P.js → chunk-JZ66PN72.js} +2 -2
  117. package/dist/{chunk-BLVR4WYU.js → chunk-KICEAGKM.js} +2 -2
  118. package/dist/{chunk-S2GE2K36.js → chunk-KNI4SGQE.js} +109 -96
  119. package/dist/chunk-KNI4SGQE.js.map +1 -0
  120. package/dist/{chunk-VDX2J7OX.js → chunk-KQAFEZQX.js} +2 -2
  121. package/dist/{chunk-PEBHPCX2.js → chunk-KTG23JDX.js} +2 -2
  122. package/dist/{chunk-BOZJD5PK.js → chunk-KYOZ5E6V.js} +2 -2
  123. package/dist/{chunk-2DLWLNO4.js → chunk-L3TZXELN.js} +4 -4
  124. package/dist/{chunk-VALKBYBN.js → chunk-M3N2TUZ7.js} +2 -2
  125. package/dist/{chunk-76M5OK7V.js → chunk-M7T2NKET.js} +5 -5
  126. package/dist/chunk-MSAI3Q7D.js +372 -0
  127. package/dist/chunk-MSAI3Q7D.js.map +1 -0
  128. package/dist/{chunk-Z5LP6ILP.js → chunk-MZAH3CBT.js} +2 -2
  129. package/dist/{chunk-QI7K7BZ5.js → chunk-NJW2ZG64.js} +2 -2
  130. package/dist/{chunk-CZJA2EQE.js → chunk-NSKXRTVZ.js} +2 -2
  131. package/dist/{chunk-4O4XCBOS.js → chunk-NUSQ3YEL.js} +2 -2
  132. package/dist/{chunk-4OQET73E.js → chunk-O57FCN42.js} +15 -15
  133. package/dist/{chunk-WKY7N3L7.js → chunk-OEBUAC3O.js} +10 -10
  134. package/dist/{chunk-Y23L4YJV.js → chunk-OEIA4IHU.js} +2 -2
  135. package/dist/{chunk-66DKTOBY.js → chunk-OGZC2WUX.js} +2 -2
  136. package/dist/{chunk-3SGTV7RD.js → chunk-P62DSJUK.js} +6 -6
  137. package/dist/{chunk-FKD656D2.js → chunk-PH2V7EXZ.js} +2 -2
  138. package/dist/{chunk-KKNZ7PUZ.js → chunk-QAIKLICT.js} +2 -2
  139. package/dist/{chunk-SSUDD72S.js → chunk-QPWUG2S3.js} +2 -2
  140. package/dist/{chunk-QI2E6ISQ.js → chunk-R2TVWQLR.js} +2 -2
  141. package/dist/chunk-R2TVWQLR.js.map +1 -0
  142. package/dist/{chunk-GZDTVYK2.js → chunk-R36IBI2M.js} +3 -3
  143. package/dist/{chunk-W3XXFPRI.js → chunk-R5B3OWI4.js} +64 -64
  144. package/dist/{chunk-VL4X7ZHC.js → chunk-RFIJRZ4K.js} +2 -2
  145. package/dist/{chunk-PWF4JXKD.js → chunk-RKDSELA3.js} +1 -1
  146. package/dist/chunk-RKDSELA3.js.map +1 -0
  147. package/dist/{chunk-AEHVZY3X.js → chunk-RPVHRZ5C.js} +2 -2
  148. package/dist/{chunk-X5SHE2O3.js → chunk-RVBLCU5C.js} +4 -4
  149. package/dist/{chunk-BUQKSQXL.js → chunk-S533KGX6.js} +5 -5
  150. package/dist/{chunk-STEOT4DI.js → chunk-SCPHU3RW.js} +7 -7
  151. package/dist/{chunk-LV5H6FTN.js → chunk-SFSD5Q6O.js} +3 -3
  152. package/dist/{chunk-AE5U5NMS.js → chunk-SMLKHXPF.js} +2 -2
  153. package/dist/{chunk-AEU4EQGV.js → chunk-T7R5HI6A.js} +1 -1
  154. package/dist/{chunk-H5BJWPUI.js → chunk-TVQZAQPE.js} +2 -2
  155. package/dist/{chunk-H56VY4BY.js → chunk-U36GYZ2P.js} +10 -5
  156. package/dist/chunk-U36GYZ2P.js.map +1 -0
  157. package/dist/{chunk-XOV7NRY5.js → chunk-U46P4UAR.js} +3 -3
  158. package/dist/{chunk-DZ42MDZE.js → chunk-UCJINCZT.js} +2 -2
  159. package/dist/{chunk-5E6RYRYW.js → chunk-UG5V3Z3R.js} +7 -7
  160. package/dist/{chunk-IW3RMBPB.js → chunk-VAOC6GHN.js} +2 -2
  161. package/dist/{chunk-6UQFJULG.js → chunk-VBNA2JEN.js} +2 -2
  162. package/dist/{chunk-HLB7GKGG.js → chunk-VOZNBQNL.js} +2 -2
  163. package/dist/{chunk-NYKIUQL6.js → chunk-WHIGRW7T.js} +2 -2
  164. package/dist/{chunk-AZSGSRIM.js → chunk-WHTMVTU4.js} +3 -3
  165. package/dist/{chunk-AERXJCOG.js → chunk-WL7N5VGG.js} +5 -5
  166. package/dist/{chunk-TFA6HPOA.js → chunk-WQUGCOKF.js} +4 -4
  167. package/dist/{chunk-A4VSOUCB.js → chunk-WTZQM74L.js} +5 -5
  168. package/dist/{chunk-DQEMWVMT.js → chunk-X7Y7WX73.js} +1 -1
  169. package/dist/{chunk-T2YX56QI.js → chunk-XWSUK5GL.js} +4 -4
  170. package/dist/{chunk-ACX55QDO.js → chunk-XYOT5GQU.js} +3 -3
  171. package/dist/{chunk-Z6EZCN6Z.js → chunk-Y7427SL7.js} +10 -10
  172. package/dist/{chunk-4KN2JLQV.js → chunk-YHZWVDP7.js} +2 -2
  173. package/dist/chunk-YVRQ5JRA.js +49 -0
  174. package/dist/chunk-YVRQ5JRA.js.map +1 -0
  175. package/dist/{chunk-5MNUBT7T.js → chunk-ZFTODDTX.js} +2 -2
  176. package/dist/{chunk-VVX5PZFS.js → chunk-ZHXSOMYH.js} +2 -2
  177. package/dist/{chunk-CRXRZA3G.js → chunk-ZQTYWSO3.js} +2 -2
  178. package/dist/cli.js +126 -122
  179. package/dist/coding/export-okf-codegraph.js +17 -17
  180. package/dist/compounding/engine.js +19 -19
  181. package/dist/config.d.ts.map +1 -1
  182. package/dist/config.js +27 -24
  183. package/dist/connectors/codex-materialize-runner.js +18 -18
  184. package/dist/connectors/index.js +20 -20
  185. package/dist/contradiction/index.js +3 -3
  186. package/dist/{contradiction-scan-TAGMOUQ2.js → contradiction-scan-GGRTVB7C.js} +3 -3
  187. package/dist/convergence-refresh.js +20 -20
  188. package/dist/conversation-index/backend.js +2 -2
  189. package/dist/corpus-watermark.js +20 -20
  190. package/dist/day-summary.js +2 -2
  191. package/dist/deep-recall-http-glue.js +11 -10
  192. package/dist/embedding-fallback.js +2 -2
  193. package/dist/entity-retrieval.js +19 -19
  194. package/dist/explicit-capture.js +2 -2
  195. package/dist/external-wiki-access.js +75 -73
  196. package/dist/extraction-judge.js +3 -3
  197. package/dist/extraction-normalization.js +3 -3
  198. package/dist/extraction-prompt.js +2 -2
  199. package/dist/extraction.js +32 -32
  200. package/dist/{first-start-migration-7OATHJKB.js → first-start-migration-OM3PHMZO.js} +2 -2
  201. package/dist/harmonic-retrieval.js +1 -1
  202. package/dist/index.d.ts +1 -1
  203. package/dist/index.d.ts.map +1 -1
  204. package/dist/index.js +198 -195
  205. package/dist/lcm/engine.js +4 -4
  206. package/dist/lcm/index.js +10 -10
  207. package/dist/local-llm-config.js +1 -1
  208. package/dist/local-llm.js +3 -3
  209. package/dist/location/index.js +20 -20
  210. package/dist/maintenance/memory-governance.js +18 -18
  211. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +18 -18
  212. package/dist/maintenance/rebuild-memory-projection.js +19 -19
  213. package/dist/memory-browse-operations.js +75 -73
  214. package/dist/memory-browse.js +5 -5
  215. package/dist/namespaces/migrate.js +19 -19
  216. package/dist/namespaces/principal.js +2 -2
  217. package/dist/namespaces/search.js +13 -13
  218. package/dist/namespaces/storage.js +18 -18
  219. package/dist/offline-sync-changeset-generations.d.ts +82 -0
  220. package/dist/offline-sync-changeset-generations.d.ts.map +1 -0
  221. package/dist/offline-sync-changeset-generations.js +21 -0
  222. package/dist/offline-sync-changeset-generations.js.map +1 -0
  223. package/dist/offline-sync-embedding-generation.d.ts +50 -0
  224. package/dist/offline-sync-embedding-generation.d.ts.map +1 -1
  225. package/dist/offline-sync-embedding-generation.js +4 -2
  226. package/dist/offline-sync-impression-drain.js +5 -5
  227. package/dist/offline-sync-snapshot-stream.js +5 -4
  228. package/dist/offline-sync.d.ts +12 -1
  229. package/dist/offline-sync.d.ts.map +1 -1
  230. package/dist/offline-sync.js +6 -5
  231. package/dist/operator-doctor-corpus.js +21 -21
  232. package/dist/operator-toolkit.js +39 -36
  233. package/dist/orchestration/compression-guideline-coordinator.js +2 -2
  234. package/dist/orchestration/maintenance.js +33 -33
  235. package/dist/orchestration/orchestrator-helpers.d.ts +1 -0
  236. package/dist/orchestration/orchestrator-helpers.d.ts.map +1 -1
  237. package/dist/orchestration/recall-entry.d.ts.map +1 -1
  238. package/dist/orchestration/recall-search-pipeline.d.ts.map +1 -1
  239. package/dist/orchestrator.js +168 -165
  240. package/dist/outcome-boost-config.d.ts +17 -0
  241. package/dist/outcome-boost-config.d.ts.map +1 -0
  242. package/dist/outcome-boost-config.js +1 -0
  243. package/dist/outcome-boost-config.js.map +1 -0
  244. package/dist/qmd.js +4 -4
  245. package/dist/recall-explain-renderer.js +3 -3
  246. package/dist/recall-navigate-access.js +2 -2
  247. package/dist/recall-navigate-disclosure.js +2 -2
  248. package/dist/recall-navigate.js +2 -2
  249. package/dist/recall-navigation-operations.js +75 -73
  250. package/dist/recall-navigation.js +74 -72
  251. package/dist/recall-state-view-admission.js +5 -5
  252. package/dist/recall-why-service.js +9 -9
  253. package/dist/recall-why.js +3 -3
  254. package/dist/recall-xray-cli.js +4 -4
  255. package/dist/recall-xray-renderer.js +3 -3
  256. package/dist/recall-xray.js +2 -2
  257. package/dist/rerank-outcome.d.ts +73 -0
  258. package/dist/rerank-outcome.d.ts.map +1 -0
  259. package/dist/rerank-outcome.js +28 -0
  260. package/dist/rerank-outcome.js.map +1 -0
  261. package/dist/{resolution-K4A3VPKZ.js → resolution-BROE3TRO.js} +4 -4
  262. package/dist/resolution-BROE3TRO.js.map +1 -0
  263. package/dist/resume-bundles.js +28 -25
  264. package/dist/search/embed-helper.js +2 -2
  265. package/dist/search/factory.js +12 -12
  266. package/dist/search/index.js +18 -18
  267. package/dist/search/lancedb-backend.js +2 -2
  268. package/dist/search/meilisearch-backend.js +2 -2
  269. package/dist/search/orama-backend.js +2 -2
  270. package/dist/semantic-consolidation.js +19 -19
  271. package/dist/semantic-rule-promotion.js +18 -18
  272. package/dist/semantic-rule-verifier.js +18 -18
  273. package/dist/shared-context/manager.js +2 -2
  274. package/dist/source-agent-qualifier.js +26 -26
  275. package/dist/standup/build.js +18 -18
  276. package/dist/storage.js +17 -17
  277. package/dist/summarizer.js +4 -4
  278. package/dist/support-passport/index.js +77 -75
  279. package/dist/support-passport/offline-sync-guard.d.ts +6 -2
  280. package/dist/support-passport/offline-sync-guard.d.ts.map +1 -1
  281. package/dist/{tier-stats-VF6DS52E.js → tier-stats-M2FMMD2N.js} +2 -2
  282. package/dist/transfer/backup.js +2 -2
  283. package/dist/transfer/capsule-export.js +2 -2
  284. package/dist/transfer/capsule-import.js +2 -2
  285. package/dist/transfer/export-okf.js +18 -18
  286. package/dist/types.d.ts +4 -2
  287. package/dist/types.d.ts.map +1 -1
  288. package/dist/types.js +1 -1
  289. package/dist/verified-recall.js +18 -18
  290. package/dist/who-knows-cli.js +19 -19
  291. package/dist/who-knows.js +18 -18
  292. package/package.json +13 -3
  293. package/src/access-mcp-output-schemas.ts +2 -0
  294. package/src/access-recall-corpus-versions.ts +59 -0
  295. package/src/access-recall-response.ts +3 -0
  296. package/src/access-recall-surface.ts +22 -23
  297. package/src/access-service-raw-excerpt-read-gate.test.ts +1 -1
  298. package/src/access-service.ts +3 -0
  299. package/src/capabilities.test.ts +1 -0
  300. package/src/capabilities.ts +6 -8
  301. package/src/config.ts +3 -0
  302. package/src/index.ts +1 -1
  303. package/src/offline-sync-changeset-generations.test.ts +962 -0
  304. package/src/offline-sync-changeset-generations.ts +549 -0
  305. package/src/offline-sync-embedding-generation.ts +272 -4
  306. package/src/offline-sync.ts +75 -162
  307. package/src/orchestration/orchestrator-helpers.ts +1 -1
  308. package/src/orchestration/recall-entry.ts +32 -16
  309. package/src/orchestration/recall-internal.ts +2 -2
  310. package/src/orchestration/recall-search-pipeline.ts +3 -0
  311. package/src/outcome-boost-config.ts +16 -0
  312. package/src/recall-retrieval-failure.test.ts +456 -4
  313. package/src/rerank-outcome.test.ts +218 -0
  314. package/src/rerank-outcome.ts +219 -0
  315. package/src/support-passport/offline-sync-guard.ts +16 -2
  316. package/src/types.ts +3 -3
  317. package/dist/chunk-H56VY4BY.js.map +0 -1
  318. package/dist/chunk-K6T33R4Q.js.map +0 -1
  319. package/dist/chunk-MCTM4YPL.js.map +0 -1
  320. package/dist/chunk-OCFXVDBZ.js.map +0 -1
  321. package/dist/chunk-PWF4JXKD.js.map +0 -1
  322. package/dist/chunk-QB57WIS6.js.map +0 -1
  323. package/dist/chunk-QI2E6ISQ.js.map +0 -1
  324. package/dist/chunk-S2GE2K36.js.map +0 -1
  325. /package/dist/{capsule-crypto-YO5QJ6L3.js.map → access-recall-corpus-versions.js.map} +0 -0
  326. /package/dist/{auto-sync-U5N3CB5Y.js.map → auto-sync-PAWBFQWL.js.map} +0 -0
  327. /package/dist/{contradiction-scan-TAGMOUQ2.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
  328. /package/dist/{chunk-RDJ6C7NZ.js.map → chunk-2IWBHZ3H.js.map} +0 -0
  329. /package/dist/{chunk-UP75KL3L.js.map → chunk-2JRB3Z5N.js.map} +0 -0
  330. /package/dist/{chunk-BXLOS5AJ.js.map → chunk-2NLLXCJG.js.map} +0 -0
  331. /package/dist/{chunk-KN6CIN7I.js.map → chunk-32HO62I4.js.map} +0 -0
  332. /package/dist/{chunk-JLPNONPH.js.map → chunk-35A7GCHG.js.map} +0 -0
  333. /package/dist/{chunk-MXCAJKMA.js.map → chunk-37ZQYFX4.js.map} +0 -0
  334. /package/dist/{chunk-LW3HKRL7.js.map → chunk-3BTHXB7Z.js.map} +0 -0
  335. /package/dist/{chunk-C7V3KPKJ.js.map → chunk-47LTKAGL.js.map} +0 -0
  336. /package/dist/{chunk-3O5BB45T.js.map → chunk-4DXNOVNW.js.map} +0 -0
  337. /package/dist/{chunk-65I2LZEK.js.map → chunk-4G2YCKLT.js.map} +0 -0
  338. /package/dist/{chunk-OK52IY3W.js.map → chunk-4GEBLO7S.js.map} +0 -0
  339. /package/dist/{chunk-M6C7SOR6.js.map → chunk-4I6PEEFA.js.map} +0 -0
  340. /package/dist/{chunk-Z4TXB4K7.js.map → chunk-5BUCKFRE.js.map} +0 -0
  341. /package/dist/{chunk-BGI4NUAO.js.map → chunk-5S7SNRSJ.js.map} +0 -0
  342. /package/dist/{chunk-JVPWRNHA.js.map → chunk-5YR4UGF2.js.map} +0 -0
  343. /package/dist/{chunk-YJ7MW627.js.map → chunk-6BG364RN.js.map} +0 -0
  344. /package/dist/{chunk-D5BSQR63.js.map → chunk-76LNUSS5.js.map} +0 -0
  345. /package/dist/{chunk-7CRUDH7G.js.map → chunk-77HNHT6S.js.map} +0 -0
  346. /package/dist/{chunk-OWYHHW67.js.map → chunk-7XI2UJHL.js.map} +0 -0
  347. /package/dist/{chunk-BJVO4H5C.js.map → chunk-7Z2UKRNJ.js.map} +0 -0
  348. /package/dist/{chunk-2WLMWP2T.js.map → chunk-A3K2KKSG.js.map} +0 -0
  349. /package/dist/{chunk-AWG3TIAY.js.map → chunk-ACCOC6UM.js.map} +0 -0
  350. /package/dist/{chunk-3JDA3XF5.js.map → chunk-AEGNDL24.js.map} +0 -0
  351. /package/dist/{chunk-2NAD4YCI.js.map → chunk-AEUMONCD.js.map} +0 -0
  352. /package/dist/{chunk-C6U57KG4.js.map → chunk-AF5PW35O.js.map} +0 -0
  353. /package/dist/{chunk-IOSZHHJC.js.map → chunk-ANGZWYL2.js.map} +0 -0
  354. /package/dist/{chunk-6LYAEM54.js.map → chunk-AXHU56C3.js.map} +0 -0
  355. /package/dist/{chunk-GWM6T5EQ.js.map → chunk-BCGMG2RD.js.map} +0 -0
  356. /package/dist/{chunk-HXCJF4XU.js.map → chunk-BFIZXFUG.js.map} +0 -0
  357. /package/dist/{chunk-DBYAY6UW.js.map → chunk-BTOHGPHC.js.map} +0 -0
  358. /package/dist/{chunk-5X4MXNEU.js.map → chunk-C6HPNPNK.js.map} +0 -0
  359. /package/dist/{chunk-4MP7XR5J.js.map → chunk-CAKHZAXH.js.map} +0 -0
  360. /package/dist/{chunk-YSBL7VPO.js.map → chunk-CDWFWOSZ.js.map} +0 -0
  361. /package/dist/{chunk-QAW55ZHJ.js.map → chunk-CZ44FH45.js.map} +0 -0
  362. /package/dist/{chunk-T3FMRLWQ.js.map → chunk-D5HQ3VEX.js.map} +0 -0
  363. /package/dist/{chunk-S7LWX2PQ.js.map → chunk-DPG5HQLE.js.map} +0 -0
  364. /package/dist/{chunk-C7ZDKWPS.js.map → chunk-DVSAMW5T.js.map} +0 -0
  365. /package/dist/{chunk-WBYQA3VN.js.map → chunk-E5H4TM4Y.js.map} +0 -0
  366. /package/dist/{chunk-4RL3JOB3.js.map → chunk-EEDI3OXB.js.map} +0 -0
  367. /package/dist/{chunk-3TB2XQ3C.js.map → chunk-EUL3S3LE.js.map} +0 -0
  368. /package/dist/{chunk-Q4AUIFUA.js.map → chunk-F23U5YE7.js.map} +0 -0
  369. /package/dist/{chunk-ZZZ4I455.js.map → chunk-GDVORIFM.js.map} +0 -0
  370. /package/dist/{chunk-SWBC3UER.js.map → chunk-HCPUVB7S.js.map} +0 -0
  371. /package/dist/{chunk-R3X2T2LP.js.map → chunk-HFOY2SBG.js.map} +0 -0
  372. /package/dist/{chunk-LU7E2MXE.js.map → chunk-HQCUUVG2.js.map} +0 -0
  373. /package/dist/{chunk-FJLQXMTU.js.map → chunk-I6B3S62A.js.map} +0 -0
  374. /package/dist/{chunk-RBITPCMK.js.map → chunk-IDSSDL4W.js.map} +0 -0
  375. /package/dist/{chunk-B3OFQP5Y.js.map → chunk-IY47KPML.js.map} +0 -0
  376. /package/dist/{chunk-AXC4WSF3.js.map → chunk-JDOBIFBK.js.map} +0 -0
  377. /package/dist/{chunk-P2ODTYOF.js.map → chunk-JGXHQV5N.js.map} +0 -0
  378. /package/dist/{chunk-7LNHRQKR.js.map → chunk-JLIGUFPF.js.map} +0 -0
  379. /package/dist/{chunk-EDIH6X2P.js.map → chunk-JZ66PN72.js.map} +0 -0
  380. /package/dist/{chunk-BLVR4WYU.js.map → chunk-KICEAGKM.js.map} +0 -0
  381. /package/dist/{chunk-VDX2J7OX.js.map → chunk-KQAFEZQX.js.map} +0 -0
  382. /package/dist/{chunk-PEBHPCX2.js.map → chunk-KTG23JDX.js.map} +0 -0
  383. /package/dist/{chunk-BOZJD5PK.js.map → chunk-KYOZ5E6V.js.map} +0 -0
  384. /package/dist/{chunk-2DLWLNO4.js.map → chunk-L3TZXELN.js.map} +0 -0
  385. /package/dist/{chunk-VALKBYBN.js.map → chunk-M3N2TUZ7.js.map} +0 -0
  386. /package/dist/{chunk-76M5OK7V.js.map → chunk-M7T2NKET.js.map} +0 -0
  387. /package/dist/{chunk-Z5LP6ILP.js.map → chunk-MZAH3CBT.js.map} +0 -0
  388. /package/dist/{chunk-QI7K7BZ5.js.map → chunk-NJW2ZG64.js.map} +0 -0
  389. /package/dist/{chunk-CZJA2EQE.js.map → chunk-NSKXRTVZ.js.map} +0 -0
  390. /package/dist/{chunk-4O4XCBOS.js.map → chunk-NUSQ3YEL.js.map} +0 -0
  391. /package/dist/{chunk-4OQET73E.js.map → chunk-O57FCN42.js.map} +0 -0
  392. /package/dist/{chunk-WKY7N3L7.js.map → chunk-OEBUAC3O.js.map} +0 -0
  393. /package/dist/{chunk-Y23L4YJV.js.map → chunk-OEIA4IHU.js.map} +0 -0
  394. /package/dist/{chunk-66DKTOBY.js.map → chunk-OGZC2WUX.js.map} +0 -0
  395. /package/dist/{chunk-3SGTV7RD.js.map → chunk-P62DSJUK.js.map} +0 -0
  396. /package/dist/{chunk-FKD656D2.js.map → chunk-PH2V7EXZ.js.map} +0 -0
  397. /package/dist/{chunk-KKNZ7PUZ.js.map → chunk-QAIKLICT.js.map} +0 -0
  398. /package/dist/{chunk-SSUDD72S.js.map → chunk-QPWUG2S3.js.map} +0 -0
  399. /package/dist/{chunk-GZDTVYK2.js.map → chunk-R36IBI2M.js.map} +0 -0
  400. /package/dist/{chunk-W3XXFPRI.js.map → chunk-R5B3OWI4.js.map} +0 -0
  401. /package/dist/{chunk-VL4X7ZHC.js.map → chunk-RFIJRZ4K.js.map} +0 -0
  402. /package/dist/{chunk-AEHVZY3X.js.map → chunk-RPVHRZ5C.js.map} +0 -0
  403. /package/dist/{chunk-X5SHE2O3.js.map → chunk-RVBLCU5C.js.map} +0 -0
  404. /package/dist/{chunk-BUQKSQXL.js.map → chunk-S533KGX6.js.map} +0 -0
  405. /package/dist/{chunk-STEOT4DI.js.map → chunk-SCPHU3RW.js.map} +0 -0
  406. /package/dist/{chunk-LV5H6FTN.js.map → chunk-SFSD5Q6O.js.map} +0 -0
  407. /package/dist/{chunk-AE5U5NMS.js.map → chunk-SMLKHXPF.js.map} +0 -0
  408. /package/dist/{chunk-AEU4EQGV.js.map → chunk-T7R5HI6A.js.map} +0 -0
  409. /package/dist/{chunk-H5BJWPUI.js.map → chunk-TVQZAQPE.js.map} +0 -0
  410. /package/dist/{chunk-XOV7NRY5.js.map → chunk-U46P4UAR.js.map} +0 -0
  411. /package/dist/{chunk-DZ42MDZE.js.map → chunk-UCJINCZT.js.map} +0 -0
  412. /package/dist/{chunk-5E6RYRYW.js.map → chunk-UG5V3Z3R.js.map} +0 -0
  413. /package/dist/{chunk-IW3RMBPB.js.map → chunk-VAOC6GHN.js.map} +0 -0
  414. /package/dist/{chunk-6UQFJULG.js.map → chunk-VBNA2JEN.js.map} +0 -0
  415. /package/dist/{chunk-HLB7GKGG.js.map → chunk-VOZNBQNL.js.map} +0 -0
  416. /package/dist/{chunk-NYKIUQL6.js.map → chunk-WHIGRW7T.js.map} +0 -0
  417. /package/dist/{chunk-AZSGSRIM.js.map → chunk-WHTMVTU4.js.map} +0 -0
  418. /package/dist/{chunk-AERXJCOG.js.map → chunk-WL7N5VGG.js.map} +0 -0
  419. /package/dist/{chunk-TFA6HPOA.js.map → chunk-WQUGCOKF.js.map} +0 -0
  420. /package/dist/{chunk-A4VSOUCB.js.map → chunk-WTZQM74L.js.map} +0 -0
  421. /package/dist/{chunk-DQEMWVMT.js.map → chunk-X7Y7WX73.js.map} +0 -0
  422. /package/dist/{chunk-T2YX56QI.js.map → chunk-XWSUK5GL.js.map} +0 -0
  423. /package/dist/{chunk-ACX55QDO.js.map → chunk-XYOT5GQU.js.map} +0 -0
  424. /package/dist/{chunk-Z6EZCN6Z.js.map → chunk-Y7427SL7.js.map} +0 -0
  425. /package/dist/{chunk-4KN2JLQV.js.map → chunk-YHZWVDP7.js.map} +0 -0
  426. /package/dist/{chunk-5MNUBT7T.js.map → chunk-ZFTODDTX.js.map} +0 -0
  427. /package/dist/{chunk-VVX5PZFS.js.map → chunk-ZHXSOMYH.js.map} +0 -0
  428. /package/dist/{chunk-CRXRZA3G.js.map → chunk-ZQTYWSO3.js.map} +0 -0
  429. /package/dist/{resolution-K4A3VPKZ.js.map → contradiction-scan-GGRTVB7C.js.map} +0 -0
  430. /package/dist/{first-start-migration-7OATHJKB.js.map → first-start-migration-OM3PHMZO.js.map} +0 -0
  431. /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
- if (this.deps.config.recallStandingBlock && !namespacesEnabled && standingBudget !== 0 && !options.asOf) {
166
+ const shouldReadStandingBlock =
167
+ this.deps.config.recallStandingBlock && !namespacesEnabled && standingBudget !== 0 && !options.asOf;
168
+ if (shouldReadStandingBlock) {
167
169
  try {
168
- const memories = await this.deps.storage.readAllMemories({
169
- abortSignal: abortController.signal,
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
- const innerBudget =
181
- standingText.length > 0 && standingBudget && standingBudget > 0
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
- standingText.length > 0
207
+ shouldReadStandingBlock
190
208
  ? (composition: RecallContextComposition) =>
191
209
  innerObserver?.({
192
210
  ...composition,
193
- context: prefixStandingMemoryBlock(
194
- composition.context ?? "",
195
- standingText,
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(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