@remnic/core 9.69.39 → 9.69.41

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 (774) hide show
  1. package/dist/access-admin-ops-surface.d.ts +16 -14
  2. package/dist/access-admin-ops-surface.js +75 -74
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-authorization-probe.d.ts +16 -14
  5. package/dist/access-authorization-probe.js +76 -75
  6. package/dist/access-boundary.d.ts +16 -14
  7. package/dist/access-boundary.js +75 -74
  8. package/dist/access-cli.js +173 -170
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-coding-context-resolution.d.ts +1 -1
  11. package/dist/access-extraction-force-flush.d.ts +16 -14
  12. package/dist/access-extraction-force-flush.js +75 -74
  13. package/dist/access-health-types.d.ts +1 -1
  14. package/dist/access-http-briefing.d.ts +16 -14
  15. package/dist/access-http-briefing.js +76 -75
  16. package/dist/access-http-lcm-compaction.d.ts +16 -14
  17. package/dist/access-http-lifecycle-flush.d.ts +16 -14
  18. package/dist/access-http-offline-stream.d.ts +16 -14
  19. package/dist/access-http-query.d.ts +2 -2
  20. package/dist/access-http-query.js +77 -76
  21. package/dist/access-http.d.ts +17 -15
  22. package/dist/access-http.js +95 -92
  23. package/dist/access-identity-continuity-surface.d.ts +13 -12
  24. package/dist/access-identity-continuity-surface.js +75 -74
  25. package/dist/access-lcm-surface.d.ts +16 -14
  26. package/dist/access-lcm-surface.js +75 -74
  27. package/dist/access-mcp-shared-context-tools.d.ts +156 -0
  28. package/dist/access-mcp-shared-context-tools.js +8 -0
  29. package/dist/access-mcp.d.ts +16 -14
  30. package/dist/access-mcp.js +86 -83
  31. package/dist/access-memory-search-fanout.d.ts +2 -2
  32. package/dist/{access-namespace-preflight-DY4z6L5X.d.ts → access-namespace-preflight-DWsMc9Dh.d.ts} +1 -1
  33. package/dist/access-namespace-preflight.d.ts +3 -3
  34. package/dist/access-namespace-preflight.js +75 -74
  35. package/dist/access-observe-transcript.d.ts +13 -12
  36. package/dist/access-observe-write-category.d.ts +1 -1
  37. package/dist/access-observe-write-category.js +4 -4
  38. package/dist/access-observe-write-surface.d.ts +16 -14
  39. package/dist/access-observe-write-surface.js +75 -74
  40. package/dist/access-offline-manifest.d.ts +37 -13
  41. package/dist/access-offline-manifest.js +15 -11
  42. package/dist/access-operations-batch.js +79 -77
  43. package/dist/access-operations.d.ts +16 -14
  44. package/dist/access-operations.js +84 -82
  45. package/dist/access-recall-concurrency.d.ts +16 -14
  46. package/dist/access-recall-concurrency.js +75 -74
  47. package/dist/access-recall-response.d.ts +16 -14
  48. package/dist/access-recall-response.js +75 -74
  49. package/dist/access-recall-surface.d.ts +16 -14
  50. package/dist/access-recall-surface.js +75 -74
  51. package/dist/access-schema.d.ts +5 -3
  52. package/dist/access-schema.js +3 -3
  53. package/dist/{access-service-MY4bsr_Q.d.ts → access-service-Cisy5YDq.d.ts} +14 -9
  54. package/dist/access-service-helpers.d.ts +16 -14
  55. package/dist/access-service.d.ts +16 -14
  56. package/dist/access-service.js +75 -74
  57. package/dist/access-surface-catalog.d.ts +16 -14
  58. package/dist/access-surface-catalog.js +77 -76
  59. package/dist/access-surface-catalog.js.map +1 -1
  60. package/dist/access-wearables-meetings-surface.d.ts +6 -5
  61. package/dist/action-confidence.d.ts +1 -1
  62. package/dist/active-memory-bridge.d.ts +1 -1
  63. package/dist/active-memory-bridge.js +3 -3
  64. package/dist/active-recall.d.ts +1 -1
  65. package/dist/active-recall.js +10 -9
  66. package/dist/active-recall.js.map +1 -1
  67. package/dist/activity/digest.d.ts +1 -1
  68. package/dist/ambient-provenance.d.ts +1 -1
  69. package/dist/artifact-search.d.ts +1 -1
  70. package/dist/{auto-sync-RP4C6ZPF.js → auto-sync-7PGUFY7U.js} +7 -7
  71. package/dist/background-generation-config.d.ts +1 -1
  72. package/dist/background-generation-config.js +3 -1
  73. package/dist/background-generation.d.ts +1 -1
  74. package/dist/behavior-learner.d.ts +1 -1
  75. package/dist/behavior-signals.d.ts +1 -1
  76. package/dist/bootstrap.d.ts +13 -12
  77. package/dist/briefing-window.d.ts +2 -2
  78. package/dist/briefing.d.ts +2 -2
  79. package/dist/briefing.js +23 -23
  80. package/dist/buffer-surprise-report.d.ts +1 -1
  81. package/dist/buffer-turn-helpers.d.ts +1 -1
  82. package/dist/buffer.d.ts +2 -2
  83. package/dist/buffer.js +7 -7
  84. package/dist/bulk-import/index.d.ts +3 -3
  85. package/dist/calibration.d.ts +3 -2
  86. package/dist/calibration.js +2 -2
  87. package/dist/capabilities.d.ts +1 -1
  88. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  89. package/dist/{capsule-merge-IPG4IOFP.js → capsule-merge-3MNURAQ3.js} +2 -2
  90. package/dist/{catalog-CW87xGx8.d.ts → catalog-wcX1QhtQ.d.ts} +1 -1
  91. package/dist/causal-behavior.d.ts +1 -1
  92. package/dist/causal-consolidation.d.ts +1 -1
  93. package/dist/causal-consolidation.js +29 -28
  94. package/dist/causal-consolidation.js.map +1 -1
  95. package/dist/causal-trajectory-graph.d.ts +1 -1
  96. package/dist/{chunk-YFTNZMGR.js → chunk-27NO2KVB.js} +31 -8
  97. package/dist/chunk-27NO2KVB.js.map +1 -0
  98. package/dist/{chunk-M6RORUO5.js → chunk-2EYZ32LH.js} +24 -2
  99. package/dist/{chunk-M6RORUO5.js.map → chunk-2EYZ32LH.js.map} +1 -1
  100. package/dist/{chunk-XH3HGI2N.js → chunk-2HQPE2NM.js} +2 -2
  101. package/dist/{chunk-3EKVN2OP.js → chunk-2ZG2LLZT.js} +2 -2
  102. package/dist/{chunk-6EHM2AV7.js → chunk-3BLHPQHT.js} +5 -5
  103. package/dist/{chunk-YKREX63Z.js → chunk-3D75XIYO.js} +5 -3
  104. package/dist/chunk-3D75XIYO.js.map +1 -0
  105. package/dist/{chunk-J272ODKJ.js → chunk-42DJ235G.js} +2 -2
  106. package/dist/{chunk-F4EHXVP7.js → chunk-46RII65S.js} +2 -2
  107. package/dist/{chunk-YUW66UAH.js → chunk-4AX5OYKC.js} +2 -2
  108. package/dist/{chunk-AECJY3GJ.js → chunk-4IGOLIWM.js} +2 -2
  109. package/dist/{chunk-2ZTDRNCS.js → chunk-54QPOE45.js} +2 -2
  110. package/dist/{chunk-O4M4BDIJ.js → chunk-563X6JJX.js} +2 -2
  111. package/dist/{chunk-IL6ODG6M.js → chunk-5EQT62HH.js} +2 -2
  112. package/dist/{chunk-JKKII6GX.js → chunk-6MQMYXSQ.js} +2 -2
  113. package/dist/{chunk-TVVEYCNW.js → chunk-7K5Q6COX.js} +4 -4
  114. package/dist/{chunk-BV4ZKIZH.js → chunk-7ZLC4DTZ.js} +5 -4
  115. package/dist/{chunk-WBM2MVBK.js → chunk-A4OIJYCV.js} +2 -2
  116. package/dist/{chunk-RLJHJQUY.js → chunk-AFJHNHAM.js} +8 -8
  117. package/dist/{chunk-6YAIN5XJ.js → chunk-AIVRD66I.js} +44 -6
  118. package/dist/chunk-AIVRD66I.js.map +1 -0
  119. package/dist/{chunk-OEDW4ER7.js → chunk-AJBWVDRV.js} +2 -1
  120. package/dist/chunk-AJBWVDRV.js.map +1 -0
  121. package/dist/{chunk-4RZLTZVM.js → chunk-AKABVXFS.js} +2 -2
  122. package/dist/{chunk-M6HBPLBA.js → chunk-AUSRUOMQ.js} +2 -2
  123. package/dist/{chunk-QHT7MOUF.js → chunk-BTPCP535.js} +25 -14
  124. package/dist/chunk-BTPCP535.js.map +1 -0
  125. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  126. package/dist/{chunk-Q7CLGFA7.js → chunk-C3G6MW4W.js} +3 -3
  127. package/dist/{chunk-O76F5QPP.js → chunk-D6PY63OM.js} +2 -2
  128. package/dist/{chunk-BD7JTBYP.js → chunk-D7MAYFQP.js} +2 -2
  129. package/dist/{chunk-LMLGBG6H.js → chunk-DBB5JPSL.js} +2 -2
  130. package/dist/{chunk-TSP5WH72.js → chunk-DIXZQTGY.js} +2 -2
  131. package/dist/{chunk-P4ZAEYKG.js → chunk-DM5CU5J7.js} +7 -4
  132. package/dist/chunk-DM5CU5J7.js.map +1 -0
  133. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  134. package/dist/{chunk-UHRZ324M.js → chunk-E3I3NDUP.js} +4 -4
  135. package/dist/{chunk-AENM6GKU.js → chunk-E4LMQTST.js} +2 -2
  136. package/dist/{chunk-YDVAM7S4.js → chunk-EH3HNCAM.js} +13 -8
  137. package/dist/chunk-EH3HNCAM.js.map +1 -0
  138. package/dist/{chunk-MUTVRKKY.js → chunk-EMSYMYXO.js} +14 -14
  139. package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
  140. package/dist/{chunk-FXHOZGSE.js → chunk-F5H6YG5P.js} +2 -2
  141. package/dist/{chunk-TRLOFIQC.js → chunk-FGFC2EFR.js} +14 -13
  142. package/dist/chunk-FGFC2EFR.js.map +1 -0
  143. package/dist/{chunk-TNSCIPBQ.js → chunk-G6NQ3L4T.js} +2 -2
  144. package/dist/{chunk-ZMWSYUUL.js → chunk-GCBIXUPT.js} +2 -2
  145. package/dist/{chunk-EYKIDK33.js → chunk-GMH5QPUU.js} +22 -22
  146. package/dist/chunk-GMH5QPUU.js.map +1 -0
  147. package/dist/{chunk-4BCHFSC7.js → chunk-GWNSKQDA.js} +3 -3
  148. package/dist/{chunk-JDX2OA4R.js → chunk-HNHIHXSD.js} +2 -2
  149. package/dist/{chunk-GG5FHZJJ.js → chunk-I33QYUAF.js} +6 -6
  150. package/dist/{chunk-LPYYY4AP.js → chunk-I46BYY7U.js} +653 -328
  151. package/dist/chunk-I46BYY7U.js.map +1 -0
  152. package/dist/{chunk-CZTPU65V.js → chunk-ICN37XHG.js} +74 -27
  153. package/dist/chunk-ICN37XHG.js.map +1 -0
  154. package/dist/chunk-IFBSZGW3.js +42 -0
  155. package/dist/chunk-IFBSZGW3.js.map +1 -0
  156. package/dist/{chunk-AAZEKXUP.js → chunk-IYIPXAIJ.js} +2 -2
  157. package/dist/{chunk-ACY4ZPF7.js → chunk-J2MGTGKC.js} +10 -5
  158. package/dist/chunk-J2MGTGKC.js.map +1 -0
  159. package/dist/chunk-JATHBCAV.js +94 -0
  160. package/dist/chunk-JATHBCAV.js.map +1 -0
  161. package/dist/{chunk-5U7K4W6K.js → chunk-JDOBQPJY.js} +3 -3
  162. package/dist/{chunk-TG3FAM2S.js → chunk-JL4TQYM5.js} +48 -1
  163. package/dist/{chunk-TG3FAM2S.js.map → chunk-JL4TQYM5.js.map} +1 -1
  164. package/dist/{chunk-UZZ7SQT3.js → chunk-JMWUPUE6.js} +2 -2
  165. package/dist/{chunk-ENBPQEVU.js → chunk-JSD7Q7LD.js} +2 -2
  166. package/dist/{chunk-QTQ6XKGT.js → chunk-K5D2XVNN.js} +4 -4
  167. package/dist/chunk-K5D2XVNN.js.map +1 -0
  168. package/dist/{chunk-3CBI2ZSA.js → chunk-KG2OOAFF.js} +20 -12
  169. package/dist/chunk-KG2OOAFF.js.map +1 -0
  170. package/dist/{chunk-Q432REND.js → chunk-KJLLPG26.js} +2 -2
  171. package/dist/{chunk-JTQR6L2N.js → chunk-KLUC2GSG.js} +6 -6
  172. package/dist/{chunk-OB3XMWX5.js → chunk-KVO2BTA4.js} +2 -2
  173. package/dist/{chunk-PCOVEDPK.js → chunk-KZJM7R4F.js} +3 -3
  174. package/dist/{chunk-X4TD4O2F.js → chunk-LE2KZ72G.js} +3 -3
  175. package/dist/{chunk-HIP6DKJJ.js → chunk-LQVXSRAJ.js} +2 -2
  176. package/dist/{chunk-A7GQBJP5.js → chunk-LVFI5LG7.js} +7 -7
  177. package/dist/{chunk-FWWWUPOE.js → chunk-MCMS4VUK.js} +25 -15
  178. package/dist/chunk-MCMS4VUK.js.map +1 -0
  179. package/dist/{chunk-5SPCMAUC.js → chunk-N6XTC56E.js} +13 -81
  180. package/dist/chunk-N6XTC56E.js.map +1 -0
  181. package/dist/{chunk-VBSNUH4J.js → chunk-ND7MAIJC.js} +2 -2
  182. package/dist/{chunk-TNZNSMVJ.js → chunk-NYWCFC3K.js} +301 -348
  183. package/dist/chunk-NYWCFC3K.js.map +1 -0
  184. package/dist/{chunk-54NX5EG4.js → chunk-P66QH6R6.js} +2 -2
  185. package/dist/{chunk-62D2PAAM.js → chunk-PAAJWQH5.js} +4 -4
  186. package/dist/{chunk-TA4C3XB7.js → chunk-PFKIOYJH.js} +2 -2
  187. package/dist/{chunk-WIWLX65T.js → chunk-PGGPRF6J.js} +2 -2
  188. package/dist/{chunk-V6EGNVUT.js → chunk-PIWFNPQT.js} +4 -4
  189. package/dist/{chunk-BLDBT6HZ.js → chunk-PJRKLB4Z.js} +18 -2
  190. package/dist/chunk-PJRKLB4Z.js.map +1 -0
  191. package/dist/{chunk-4JVQRFZD.js → chunk-PLJ2MQFT.js} +11 -11
  192. package/dist/{chunk-4RX5O34R.js → chunk-PQ42DJNG.js} +2 -2
  193. package/dist/{chunk-37CAEC7E.js → chunk-PWPIERBM.js} +4 -4
  194. package/dist/{chunk-ZEGL7YCC.js → chunk-Q62GA5U2.js} +2 -2
  195. package/dist/{chunk-CC37E3QM.js → chunk-QKCXRS5A.js} +16 -1
  196. package/dist/chunk-QKCXRS5A.js.map +1 -0
  197. package/dist/{chunk-WKDFJXW5.js → chunk-QM2SPLKQ.js} +1 -1
  198. package/dist/chunk-QM2SPLKQ.js.map +1 -0
  199. package/dist/{chunk-GAS7KYC7.js → chunk-RQQO3ORQ.js} +2 -2
  200. package/dist/{chunk-UZEHHXYC.js → chunk-S4MJTIPG.js} +85 -81
  201. package/dist/chunk-S4MJTIPG.js.map +1 -0
  202. package/dist/chunk-SK7D34OL.js +68 -0
  203. package/dist/chunk-SK7D34OL.js.map +1 -0
  204. package/dist/{chunk-LQNRVPTV.js → chunk-TRTLWUDD.js} +164 -130
  205. package/dist/chunk-TRTLWUDD.js.map +1 -0
  206. package/dist/{chunk-JXN77SGO.js → chunk-U2VDCFXW.js} +1 -1
  207. package/dist/chunk-U2VDCFXW.js.map +1 -0
  208. package/dist/{chunk-CWTCMZGE.js → chunk-UHSOPTNB.js} +132 -6
  209. package/dist/chunk-UHSOPTNB.js.map +1 -0
  210. package/dist/{chunk-3NPNBVFR.js → chunk-UZGHKD3T.js} +2 -2
  211. package/dist/{chunk-IQEJIOEU.js → chunk-V2EXYQEQ.js} +20 -12
  212. package/dist/chunk-V2EXYQEQ.js.map +1 -0
  213. package/dist/{chunk-OPBFP4TF.js → chunk-V2TOGJPM.js} +46 -13
  214. package/dist/chunk-V2TOGJPM.js.map +1 -0
  215. package/dist/{chunk-VJIE4D2I.js → chunk-V62YYBBY.js} +4 -4
  216. package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
  217. package/dist/{chunk-6H2G7RFT.js → chunk-VNQRRUNS.js} +11 -10
  218. package/dist/chunk-VNQRRUNS.js.map +1 -0
  219. package/dist/{chunk-6AGWBKQU.js → chunk-VSN2DMQK.js} +2 -2
  220. package/dist/{chunk-ZHXSOMYH.js → chunk-VVX5PZFS.js} +2 -2
  221. package/dist/{chunk-GI4ZBWPQ.js → chunk-W7UV2ZCA.js} +3 -3
  222. package/dist/{chunk-GMIQV6DD.js → chunk-WBQ4ONQJ.js} +2 -2
  223. package/dist/{chunk-FNHLI2RE.js → chunk-WFMQN7JE.js} +3 -3
  224. package/dist/{chunk-MVAQ2WM3.js → chunk-WGZHSQDV.js} +9 -5
  225. package/dist/chunk-WGZHSQDV.js.map +1 -0
  226. package/dist/{chunk-IYKZJVL5.js → chunk-WN2OXGGH.js} +1 -1
  227. package/dist/chunk-WN2OXGGH.js.map +1 -0
  228. package/dist/{chunk-ZBW7A667.js → chunk-WPGA4RYI.js} +2 -2
  229. package/dist/{chunk-YQNNHLCG.js → chunk-WPGR3RW4.js} +2 -2
  230. package/dist/{chunk-SV4Z2S67.js → chunk-WUUGE7QC.js} +54 -21
  231. package/dist/chunk-WUUGE7QC.js.map +1 -0
  232. package/dist/{chunk-NXGSONWM.js → chunk-WZIO3TW6.js} +2 -2
  233. package/dist/{chunk-ZZUVBZL2.js → chunk-X2QPKLPL.js} +2 -2
  234. package/dist/{chunk-5HYUUFMQ.js → chunk-XCPNH2MG.js} +259 -10
  235. package/dist/chunk-XCPNH2MG.js.map +1 -0
  236. package/dist/{chunk-VSL63CFJ.js → chunk-XRS65T4O.js} +9 -9
  237. package/dist/{chunk-5N4MZLEH.js → chunk-YFXAWGMR.js} +2 -2
  238. package/dist/{chunk-KQW3YGEN.js → chunk-YR5QT4SR.js} +32 -9
  239. package/dist/chunk-YR5QT4SR.js.map +1 -0
  240. package/dist/{chunk-CARRTDKC.js → chunk-Z22M4JCY.js} +4 -3
  241. package/dist/chunk-Z22M4JCY.js.map +1 -0
  242. package/dist/{chunk-D545Z7UH.js → chunk-Z535ADTC.js} +3 -3
  243. package/dist/{chunk-B36GUU6T.js → chunk-Z7NBT6AK.js} +38 -5
  244. package/dist/chunk-Z7NBT6AK.js.map +1 -0
  245. package/dist/{chunk-5YCNDC3C.js → chunk-ZX6NNFSY.js} +3 -3
  246. package/dist/{chunk-3N3PBBEH.js → chunk-ZYSOT6HD.js} +2 -2
  247. package/dist/{chunk-MCRVQ5YQ.js → chunk-ZZEIL3MI.js} +2 -2
  248. package/dist/{cli-DGq0MNpO.d.ts → cli-CUlMlS2N.d.ts} +5 -5
  249. package/dist/cli.d.ts +18 -16
  250. package/dist/cli.js +129 -126
  251. package/dist/coding/export-okf-codegraph.d.ts +1 -1
  252. package/dist/coding/export-okf-codegraph.js +22 -22
  253. package/dist/coding/pre-action-gate.d.ts +1 -1
  254. package/dist/compounding/engine.d.ts +2 -2
  255. package/dist/compounding/engine.js +25 -25
  256. package/dist/compounding/preference-consolidator.d.ts +1 -1
  257. package/dist/compression-optimizer.d.ts +1 -1
  258. package/dist/config.d.ts +1 -1
  259. package/dist/config.js +10 -9
  260. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  261. package/dist/connectors/codex-materialize-runner.js +25 -25
  262. package/dist/connectors/codex-materialize.d.ts +1 -1
  263. package/dist/connectors/codex-materialize.js +2 -2
  264. package/dist/connectors/index.d.ts +1 -1
  265. package/dist/connectors/index.js +25 -25
  266. package/dist/consolidation-provenance-check.d.ts +2 -2
  267. package/dist/consolidation-undo.d.ts +2 -2
  268. package/dist/contradiction/index.d.ts +6 -5
  269. package/dist/contradiction/index.js +4 -4
  270. package/dist/{contradiction-scan-BSGKZHYJ.js → contradiction-scan-GVD4JJ7B.js} +4 -4
  271. package/dist/converge-config.d.ts +1 -1
  272. package/dist/convergence-refresh.d.ts +2 -2
  273. package/dist/convergence-refresh.js +26 -26
  274. package/dist/conversation-index/backend.d.ts +1 -1
  275. package/dist/conversation-index/chunker.d.ts +1 -1
  276. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  277. package/dist/conversation-index/indexer.d.ts +1 -1
  278. package/dist/conversation-index/search.d.ts +1 -1
  279. package/dist/corpus-watermark.d.ts +1 -1
  280. package/dist/corpus-watermark.js +25 -25
  281. package/dist/cross-lingual-recall.d.ts +1 -1
  282. package/dist/dashboard-runtime.js +2 -2
  283. package/dist/day-summary.d.ts +1 -1
  284. package/dist/deep-recall-config.d.ts +12 -1
  285. package/dist/deep-recall-config.js +5 -3
  286. package/dist/deep-recall-http-glue.d.ts +19 -15
  287. package/dist/deep-recall-http-glue.js +7 -4
  288. package/dist/deep-recall-mcp-tools.d.ts +16 -14
  289. package/dist/deep-recall-policy-llm.d.ts +14 -3
  290. package/dist/deep-recall-policy-llm.js +3 -3
  291. package/dist/deep-recall-seeds.d.ts +4 -1
  292. package/dist/deep-recall-seeds.js +1 -1
  293. package/dist/deep-recall.d.ts +12 -1
  294. package/dist/deep-recall.js +3 -2
  295. package/dist/delinearize.d.ts +1 -1
  296. package/dist/dependency-propagation-config.d.ts +1 -1
  297. package/dist/{dependency-propagation-delivery-Cq1ekOwV.d.ts → dependency-propagation-delivery-BDDjImQn.d.ts} +1 -1
  298. package/dist/direct-answer-wiring.d.ts +1 -1
  299. package/dist/direct-answer.d.ts +1 -1
  300. package/dist/embedding-fallback.d.ts +1 -1
  301. package/dist/enrichment/index.d.ts +1 -1
  302. package/dist/entity-origin-fields.d.ts +1 -1
  303. package/dist/entity-retrieval.d.ts +2 -2
  304. package/dist/entity-retrieval.js +24 -24
  305. package/dist/entity-schema.d.ts +1 -1
  306. package/dist/episodic-context.d.ts +1 -1
  307. package/dist/eval-trajectory-contracts.d.ts +1 -1
  308. package/dist/eval-trajectory-store.d.ts +1 -1
  309. package/dist/eval-trajectory.d.ts +1 -1
  310. package/dist/explicit-capture.d.ts +13 -12
  311. package/dist/explicit-capture.js +3 -3
  312. package/dist/external-wiki-access.d.ts +16 -14
  313. package/dist/external-wiki-access.js +76 -75
  314. package/dist/external-wiki-collection-registration.d.ts +1 -1
  315. package/dist/external-wiki-collection.d.ts +1 -1
  316. package/dist/external-wiki-mcp-tools.d.ts +16 -14
  317. package/dist/extraction-error-classification.d.ts +14 -3
  318. package/dist/extraction-error-classification.js +5 -3
  319. package/dist/extraction-faithfulness.d.ts +4 -3
  320. package/dist/extraction-faithfulness.js +3 -3
  321. package/dist/extraction-judge-telemetry.d.ts +4 -3
  322. package/dist/extraction-judge-training.d.ts +4 -3
  323. package/dist/extraction-judge.d.ts +4 -3
  324. package/dist/extraction-judge.js +3 -3
  325. package/dist/extraction-liveness.d.ts +1 -1
  326. package/dist/extraction-normalization.d.ts +1 -1
  327. package/dist/extraction-prompt.d.ts +1 -1
  328. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  329. package/dist/extraction-source-grounding.d.ts +1 -1
  330. package/dist/extraction-span-config.d.ts +1 -1
  331. package/dist/extraction-span-materialize.d.ts +1 -1
  332. package/dist/extraction.d.ts +4 -4
  333. package/dist/extraction.js +40 -38
  334. package/dist/fallback-llm-codex-subscription.d.ts +65 -10
  335. package/dist/fallback-llm-codex-subscription.js +19 -1
  336. package/dist/fallback-llm.d.ts +25 -28
  337. package/dist/fallback-llm.js +4 -3
  338. package/dist/{first-start-migration-ZWMV5CX4.js → first-start-migration-L3UFX5CU.js} +4 -4
  339. package/dist/{generic-recall-paths-BcySh_f9.d.ts → generic-recall-paths-CpDzNO_I.d.ts} +1 -1
  340. package/dist/graph-append-error.d.ts +1 -1
  341. package/dist/graph-dashboard-diff.d.ts +1 -1
  342. package/dist/graph-dashboard-key.d.ts +1 -1
  343. package/dist/graph-dashboard-parser.d.ts +1 -1
  344. package/dist/graph-edge-reinforcement.d.ts +1 -1
  345. package/dist/graph-jsonl.d.ts +1 -1
  346. package/dist/graph-path-reconstruction.d.ts +1 -1
  347. package/dist/graph-path-scoring.d.ts +1 -1
  348. package/dist/graph-snapshot.d.ts +1 -1
  349. package/dist/graph.d.ts +1 -1
  350. package/dist/harmonic-retrieval.js +3 -3
  351. package/dist/importance.d.ts +1 -1
  352. package/dist/importers/index.d.ts +1 -1
  353. package/dist/importers/test-utils.d.ts +1 -1
  354. package/dist/in-flight-reads.d.ts +1 -1
  355. package/dist/{index-DWOb4wz9.d.ts → index-CtmmCJoo.d.ts} +3 -3
  356. package/dist/index.d.ts +80 -40
  357. package/dist/index.js +316 -296
  358. package/dist/intent.d.ts +1 -1
  359. package/dist/lcm/engine.d.ts +1 -1
  360. package/dist/lcm/engine.js +3 -3
  361. package/dist/lcm/index.d.ts +1 -1
  362. package/dist/lcm/index.js +11 -11
  363. package/dist/lcm/tools.d.ts +1 -1
  364. package/dist/lifecycle.d.ts +1 -1
  365. package/dist/live-connectors-runner.d.ts +1 -1
  366. package/dist/local-llm-DpXIvm6F.d.ts +247 -0
  367. package/dist/local-llm-config.d.ts +4 -1
  368. package/dist/local-llm-config.js +4 -2
  369. package/dist/local-llm-helpers.d.ts +18 -69
  370. package/dist/local-llm-helpers.js +1 -1
  371. package/dist/local-llm.d.ts +3 -170
  372. package/dist/local-llm.js +2 -2
  373. package/dist/local-model-endpoint.d.ts +1 -1
  374. package/dist/location/index.d.ts +3 -3
  375. package/dist/location/index.js +25 -25
  376. package/dist/maintenance/memory-governance.d.ts +1 -1
  377. package/dist/maintenance/memory-governance.js +24 -24
  378. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  379. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +23 -23
  380. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  381. package/dist/maintenance/rebuild-memory-projection.js +25 -25
  382. package/dist/{maintenance-CW9wCzMP.d.ts → maintenance-CNgoLsoM.d.ts} +13 -6
  383. package/dist/mcp-memory-inspector-app.d.ts +16 -14
  384. package/dist/memory-action-policy.d.ts +1 -1
  385. package/dist/memory-cache.d.ts +1 -1
  386. package/dist/memory-controller.d.ts +1 -1
  387. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  388. package/dist/memory-projection-store.d.ts +1 -1
  389. package/dist/memory-provenance.d.ts +1 -1
  390. package/dist/memory-snapshot.d.ts +1 -1
  391. package/dist/memory-subject-cli.d.ts +16 -14
  392. package/dist/memory-subject.d.ts +16 -14
  393. package/dist/memory-worth-outcomes.d.ts +2 -2
  394. package/dist/models-json.d.ts +1 -1
  395. package/dist/namespaces/migrate.d.ts +3 -3
  396. package/dist/namespaces/migrate.js +24 -24
  397. package/dist/namespaces/principal.d.ts +1 -1
  398. package/dist/namespaces/search.d.ts +12 -1
  399. package/dist/namespaces/search.js +9 -9
  400. package/dist/namespaces/storage.d.ts +3 -3
  401. package/dist/namespaces/storage.js +23 -23
  402. package/dist/native-knowledge.d.ts +1 -1
  403. package/dist/offline-sync-impression-drain.d.ts +1 -1
  404. package/dist/operator-doctor-corpus.d.ts +1 -1
  405. package/dist/operator-doctor-corpus.js +26 -26
  406. package/dist/operator-doctor-replica.d.ts +1 -1
  407. package/dist/operator-toolkit.d.ts +3 -3
  408. package/dist/operator-toolkit.js +45 -44
  409. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  410. package/dist/orchestration/maintenance.d.ts +4 -4
  411. package/dist/orchestration/maintenance.js +36 -36
  412. package/dist/{orchestrator-ComHLm49.d.ts → orchestrator-DT7ybIFz.d.ts} +32 -11
  413. package/dist/orchestrator.d.ts +13 -12
  414. package/dist/orchestrator.js +176 -171
  415. package/dist/patterns-cli.d.ts +1 -1
  416. package/dist/{pipeline-CiYcqqhl.d.ts → pipeline-CgBEmHcz.d.ts} +1 -1
  417. package/dist/policy-runtime.d.ts +1 -1
  418. package/dist/proactive-contention.d.ts +2 -2
  419. package/dist/provenance.d.ts +1 -1
  420. package/dist/{public-http-CuK4_Cb1.d.ts → public-http-C8P8fyiO.d.ts} +1 -1
  421. package/dist/{qmd-qXD4vatU.d.ts → qmd-BkY8KpCh.d.ts} +2 -2
  422. package/dist/qmd-preflight.d.ts +2 -2
  423. package/dist/qmd-recall-cache.d.ts +1 -1
  424. package/dist/qmd.d.ts +2 -2
  425. package/dist/qmd.js +2 -2
  426. package/dist/recall-concurrency-config.d.ts +1 -1
  427. package/dist/recall-disclosure-escalation.d.ts +1 -1
  428. package/dist/recall-explain-renderer.d.ts +1 -1
  429. package/dist/recall-explain-renderer.js +3 -3
  430. package/dist/recall-memory-map.d.ts +1 -1
  431. package/dist/recall-navigate-access.d.ts +1 -1
  432. package/dist/recall-navigate-access.js +2 -2
  433. package/dist/recall-navigate-disclosure.d.ts +1 -1
  434. package/dist/recall-navigate-disclosure.js +1 -1
  435. package/dist/recall-navigate.d.ts +1 -1
  436. package/dist/recall-navigate.js +2 -2
  437. package/dist/recall-planner-llm.d.ts +3 -2
  438. package/dist/recall-planner-llm.js +4 -3
  439. package/dist/recall-planner-llm.js.map +1 -1
  440. package/dist/recall-state-view-admission.d.ts +13 -3
  441. package/dist/recall-state-view-admission.js +9 -9
  442. package/dist/recall-state-view-anchors.d.ts +1 -1
  443. package/dist/recall-state-view-anchors.js +2 -2
  444. package/dist/recall-state-view-inject.js +2 -2
  445. package/dist/recall-state-view-render.js +2 -2
  446. package/dist/recall-state-view-widen.js +2 -2
  447. package/dist/recall-state-view-wire.js +3 -3
  448. package/dist/recall-state-view.d.ts +10 -1
  449. package/dist/recall-state-view.js +5 -3
  450. package/dist/recall-state.d.ts +1 -1
  451. package/dist/recall-tag-filter.d.ts +1 -1
  452. package/dist/recall-timings.d.ts +1 -1
  453. package/dist/recall-xray-cli.d.ts +1 -1
  454. package/dist/recall-xray-cli.js +4 -4
  455. package/dist/recall-xray-renderer.d.ts +1 -1
  456. package/dist/recall-xray-renderer.js +3 -3
  457. package/dist/recall-xray.d.ts +1 -1
  458. package/dist/recall-xray.js +2 -2
  459. package/dist/reconcile/cursor.d.ts +1 -1
  460. package/dist/reconcile/cursor.js +2 -2
  461. package/dist/reconcile/manifest.d.ts +1 -1
  462. package/dist/reconcile/manifest.js +4 -4
  463. package/dist/reconcile/plan.d.ts +1 -1
  464. package/dist/reconcile/plan.js +2 -2
  465. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  466. package/dist/replay/normalizers/claude.d.ts +1 -1
  467. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  468. package/dist/replay/normalizers/shared.d.ts +1 -1
  469. package/dist/replay/runner.d.ts +1 -1
  470. package/dist/replay/types.d.ts +1 -1
  471. package/dist/replica-divergence.d.ts +1 -1
  472. package/dist/replica-peers-config.d.ts +1 -1
  473. package/dist/{resolution-4GG3QZRJ.js → resolution-LXFQQ4AE.js} +5 -5
  474. package/dist/resolution-LXFQQ4AE.js.map +1 -0
  475. package/dist/resolve-auth-token.d.ts +1 -1
  476. package/dist/resume-bundles.js +12 -11
  477. package/dist/retrieval-agents.d.ts +2 -2
  478. package/dist/retrieval-tiers.d.ts +1 -1
  479. package/dist/routing/engine.d.ts +1 -1
  480. package/dist/routing/store.d.ts +1 -1
  481. package/dist/salvage-envelope.d.ts +1 -1
  482. package/dist/{scope-profiles-BT9rqC3w.d.ts → scope-profiles-BBPjZ9jb.d.ts} +1 -1
  483. package/dist/search/embed-helper.d.ts +1 -1
  484. package/dist/search/factory.d.ts +1 -1
  485. package/dist/search/factory.js +8 -8
  486. package/dist/search/index.d.ts +1 -1
  487. package/dist/search/index.js +12 -12
  488. package/dist/search/lancedb-backend.d.ts +1 -1
  489. package/dist/search/lancedb-backend.js +2 -2
  490. package/dist/search/meilisearch-backend.d.ts +1 -1
  491. package/dist/search/meilisearch-backend.js +2 -2
  492. package/dist/search/noop-backend.d.ts +1 -1
  493. package/dist/search/orama-backend.d.ts +1 -1
  494. package/dist/search/orama-backend.js +2 -2
  495. package/dist/search/port.d.ts +2 -2
  496. package/dist/search/port.js +1 -1
  497. package/dist/search/remote-backend.d.ts +1 -1
  498. package/dist/search/remote-backend.js +2 -2
  499. package/dist/{semantic-consolidation-CmZi7thY.d.ts → semantic-consolidation-BPFFVO84.d.ts} +1 -1
  500. package/dist/semantic-consolidation.d.ts +2 -2
  501. package/dist/semantic-consolidation.js +26 -26
  502. package/dist/semantic-rule-promotion.js +23 -23
  503. package/dist/semantic-rule-verifier.d.ts +1 -1
  504. package/dist/semantic-rule-verifier.js +23 -23
  505. package/dist/{service-CLkA7AQB.d.ts → service-jKcr6Jvr.d.ts} +2 -2
  506. package/dist/session-observer-bands.d.ts +1 -1
  507. package/dist/session-observer-state.d.ts +1 -1
  508. package/dist/shared-context/manager.d.ts +1 -1
  509. package/dist/shared-context/manager.js +2 -2
  510. package/dist/shared-context/write-output-controls.d.ts +34 -0
  511. package/dist/shared-context/write-output-controls.js +10 -0
  512. package/dist/shared-context/write-output-controls.js.map +1 -0
  513. package/dist/signal.d.ts +1 -1
  514. package/dist/source-agent-qualifier.d.ts +1 -1
  515. package/dist/source-agent-qualifier.js +31 -31
  516. package/dist/source-attribution.d.ts +23 -1
  517. package/dist/source-attribution.js +13 -3
  518. package/dist/standup/build.js +23 -23
  519. package/dist/{storage-wvX01lht.d.ts → storage-C-0Ah5OY.d.ts} +2 -1
  520. package/dist/storage.d.ts +2 -2
  521. package/dist/storage.js +22 -22
  522. package/dist/subject-config.d.ts +1 -1
  523. package/dist/summarizer.d.ts +1 -1
  524. package/dist/summarizer.js +6 -6
  525. package/dist/summary-snapshot.d.ts +1 -1
  526. package/dist/support-passport/index.d.ts +18 -17
  527. package/dist/support-passport/index.js +78 -77
  528. package/dist/task-llm-config.d.ts +16 -0
  529. package/dist/task-llm-config.js +12 -0
  530. package/dist/task-llm-config.js.map +1 -0
  531. package/dist/temporal-supersession.d.ts +2 -2
  532. package/dist/temporal-timeline-recall.d.ts +1 -1
  533. package/dist/temporal-validity.d.ts +1 -1
  534. package/dist/threading.d.ts +1 -1
  535. package/dist/tier-migration.d.ts +2 -2
  536. package/dist/tier-routing.d.ts +1 -1
  537. package/dist/tier-routing.js +3 -3
  538. package/dist/{tier-stats-LUSUUNU6.js → tier-stats-VK5PCO2L.js} +4 -4
  539. package/dist/topics.d.ts +1 -1
  540. package/dist/transcript.d.ts +1 -1
  541. package/dist/transfer/backup.js +2 -2
  542. package/dist/transfer/capsule-export.js +2 -2
  543. package/dist/transfer/capsule-import.js +3 -3
  544. package/dist/transfer/export-okf.d.ts +1 -1
  545. package/dist/transfer/export-okf.js +23 -23
  546. package/dist/trust-score-stage.d.ts +1 -1
  547. package/dist/trust-score.d.ts +1 -1
  548. package/dist/{types-Cyr32ABj.d.ts → types-cK5LydjL.d.ts} +6 -1
  549. package/dist/types.d.ts +1 -1
  550. package/dist/types.js +1 -1
  551. package/dist/utility-runtime.d.ts +1 -1
  552. package/dist/verified-recall.js +23 -23
  553. package/dist/who-knows-cli.d.ts +16 -14
  554. package/dist/who-knows-cli.js +24 -24
  555. package/dist/who-knows.d.ts +16 -14
  556. package/dist/who-knows.js +23 -23
  557. package/dist/write-envelope.d.ts +1 -1
  558. package/package.json +12 -2
  559. package/src/access-category-alias.test.ts +93 -0
  560. package/src/access-http.ts +1 -1
  561. package/src/access-mcp-shared-context-tools.ts +103 -0
  562. package/src/access-mcp.ts +4 -74
  563. package/src/access-offline-manifest.ts +52 -2
  564. package/src/access-operations-batch.ts +45 -2
  565. package/src/access-schema.ts +9 -4
  566. package/src/access-service.ts +14 -7
  567. package/src/activity/config.test.ts +61 -0
  568. package/src/activity/config.ts +40 -1
  569. package/src/activity/timeline/analysis-provider.ts +8 -2
  570. package/src/activity/timeline/analysis-run.test.ts +82 -0
  571. package/src/activity/timeline/publish-cli.test.ts +30 -0
  572. package/src/activity/timeline/publish-cli.ts +7 -0
  573. package/src/activity/timeline/query.ts +8 -1
  574. package/src/activity/timeline/regenerate.test.ts +130 -2
  575. package/src/activity/timeline/regenerate.ts +14 -6
  576. package/src/activity/vault-frontmatter.test.ts +99 -1
  577. package/src/activity/vault-frontmatter.ts +131 -0
  578. package/src/activity/vault-publish.ts +6 -0
  579. package/src/activity/vault-publisher.test.ts +172 -0
  580. package/src/activity/vault-publisher.ts +69 -15
  581. package/src/activity/vault-region.test.ts +7 -2
  582. package/src/activity/vault-region.ts +7 -3
  583. package/src/background-generation-config.ts +32 -6
  584. package/src/background-generation.test.ts +10 -1
  585. package/src/cli/deep-recall-commands.ts +22 -10
  586. package/src/cli/timeline-publish-commands.ts +9 -0
  587. package/src/config.test.ts +170 -43
  588. package/src/config.ts +22 -5
  589. package/src/dedup/merge.test.ts +283 -0
  590. package/src/deep-recall-boundary.test.ts +66 -0
  591. package/src/deep-recall-cli.test.ts +82 -0
  592. package/src/deep-recall-config.test.ts +56 -0
  593. package/src/deep-recall-config.ts +32 -0
  594. package/src/deep-recall-http-glue.ts +10 -10
  595. package/src/deep-recall-policy-llm.test.ts +242 -0
  596. package/src/deep-recall-policy-llm.ts +37 -7
  597. package/src/deep-recall-seeds.test.ts +53 -0
  598. package/src/deep-recall-seeds.ts +7 -1
  599. package/src/deep-recall-surface.test.ts +93 -0
  600. package/src/deep-recall.test.ts +121 -0
  601. package/src/deep-recall.ts +88 -28
  602. package/src/extraction-error-classification.ts +36 -1
  603. package/src/extraction-timeout.test.ts +110 -1
  604. package/src/extraction.test.ts +19 -1
  605. package/src/extraction.ts +23 -21
  606. package/src/fallback-llm-codex-subscription.ts +220 -12
  607. package/src/fallback-llm-parse-failure.test.ts +156 -0
  608. package/src/fallback-llm.test.ts +178 -0
  609. package/src/fallback-llm.ts +200 -198
  610. package/src/index.ts +1 -0
  611. package/src/local-llm-config.ts +11 -10
  612. package/src/local-llm-headers-timeout.test.ts +30 -0
  613. package/src/local-llm-helpers.ts +28 -0
  614. package/src/local-llm.ts +8 -19
  615. package/src/meetings/config.test.ts +58 -0
  616. package/src/namespaces/search.test.ts +51 -1
  617. package/src/namespaces/search.ts +48 -3
  618. package/src/orchestration/extraction-persist-promotion.test.ts +228 -2
  619. package/src/orchestration/extraction-persist-promotion.ts +17 -14
  620. package/src/orchestration/extraction-persist.ts +1 -1
  621. package/src/orchestration/orchestrator-helpers.test.ts +104 -0
  622. package/src/orchestration/orchestrator-init.ts +366 -106
  623. package/src/orchestration/recall-entry.ts +15 -1
  624. package/src/orchestration/recall-internal.ts +6 -11
  625. package/src/orchestration/recall-section-coordinator.ts +65 -28
  626. package/src/orchestration/recall-state-view-pipeline.test.ts +8 -2
  627. package/src/orchestration/semantic-merge-commit-effects.ts +45 -16
  628. package/src/orchestration/semantic-merge-persist.ts +23 -36
  629. package/src/orchestration/semantic-merge-promotion-payload.ts +62 -6
  630. package/src/orchestration/startup-collection-checks.ts +85 -0
  631. package/src/orchestrator-flush.test.ts +7 -0
  632. package/src/orchestrator-init.test.ts +1539 -0
  633. package/src/orchestrator.ts +7 -0
  634. package/src/providers/codex-subscription.test.ts +127 -0
  635. package/src/providers/codex-subscription.ts +1 -1
  636. package/src/qmd.ts +21 -10
  637. package/src/recall-state-view-admission.ts +11 -1
  638. package/src/recall-state-view-budget.test.ts +424 -0
  639. package/src/recall-state-view-cron-intent.test.ts +268 -0
  640. package/src/recall-state-view-widen.test.ts +14 -5
  641. package/src/recall-state-view-widen.ts +8 -1
  642. package/src/recall-state-view.ts +35 -18
  643. package/src/reconcile-identity-cache.test.ts +82 -1
  644. package/src/search/port.ts +1 -1
  645. package/src/shared-context/envelope-io.ts +25 -0
  646. package/src/shared-context/envelope-wiring.test.ts +4 -2
  647. package/src/shared-context/manager.ts +1 -0
  648. package/src/shared-context/write-output-controls.test.ts +192 -0
  649. package/src/shared-context/write-output-controls.ts +72 -0
  650. package/src/source-attribution.test.ts +39 -0
  651. package/src/source-attribution.ts +72 -0
  652. package/src/storage/cas-revision-store.test.ts +4 -0
  653. package/src/storage/cas-revision-store.ts +104 -12
  654. package/src/storage-frontmatter-cas.test.ts +19 -17
  655. package/src/summarizer.ts +5 -1
  656. package/src/task-llm-config.test.ts +124 -0
  657. package/src/task-llm-config.ts +88 -0
  658. package/src/testing/subjects/startup-discovery-lifecycle.test.ts +273 -0
  659. package/src/types.ts +6 -0
  660. package/dist/chunk-3CBI2ZSA.js.map +0 -1
  661. package/dist/chunk-5HYUUFMQ.js.map +0 -1
  662. package/dist/chunk-5SPCMAUC.js.map +0 -1
  663. package/dist/chunk-6H2G7RFT.js.map +0 -1
  664. package/dist/chunk-6YAIN5XJ.js.map +0 -1
  665. package/dist/chunk-ACY4ZPF7.js.map +0 -1
  666. package/dist/chunk-B36GUU6T.js.map +0 -1
  667. package/dist/chunk-BLDBT6HZ.js.map +0 -1
  668. package/dist/chunk-CARRTDKC.js.map +0 -1
  669. package/dist/chunk-CC37E3QM.js.map +0 -1
  670. package/dist/chunk-CWTCMZGE.js.map +0 -1
  671. package/dist/chunk-CZTPU65V.js.map +0 -1
  672. package/dist/chunk-EYKIDK33.js.map +0 -1
  673. package/dist/chunk-FWWWUPOE.js.map +0 -1
  674. package/dist/chunk-IQEJIOEU.js.map +0 -1
  675. package/dist/chunk-IYKZJVL5.js.map +0 -1
  676. package/dist/chunk-JXN77SGO.js.map +0 -1
  677. package/dist/chunk-KQW3YGEN.js.map +0 -1
  678. package/dist/chunk-LPYYY4AP.js.map +0 -1
  679. package/dist/chunk-LQNRVPTV.js.map +0 -1
  680. package/dist/chunk-MVAQ2WM3.js.map +0 -1
  681. package/dist/chunk-OEDW4ER7.js.map +0 -1
  682. package/dist/chunk-OPBFP4TF.js.map +0 -1
  683. package/dist/chunk-P4ZAEYKG.js.map +0 -1
  684. package/dist/chunk-QHT7MOUF.js.map +0 -1
  685. package/dist/chunk-QTQ6XKGT.js.map +0 -1
  686. package/dist/chunk-SV4Z2S67.js.map +0 -1
  687. package/dist/chunk-TNZNSMVJ.js.map +0 -1
  688. package/dist/chunk-TRLOFIQC.js.map +0 -1
  689. package/dist/chunk-UZEHHXYC.js.map +0 -1
  690. package/dist/chunk-WKDFJXW5.js.map +0 -1
  691. package/dist/chunk-YDVAM7S4.js.map +0 -1
  692. package/dist/chunk-YFTNZMGR.js.map +0 -1
  693. package/dist/chunk-YKREX63Z.js.map +0 -1
  694. /package/dist/{capsule-crypto-7FJQINUR.js.map → access-mcp-shared-context-tools.js.map} +0 -0
  695. /package/dist/{auto-sync-RP4C6ZPF.js.map → auto-sync-7PGUFY7U.js.map} +0 -0
  696. /package/dist/{contradiction-scan-BSGKZHYJ.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  697. /package/dist/{capsule-merge-IPG4IOFP.js.map → capsule-merge-3MNURAQ3.js.map} +0 -0
  698. /package/dist/{chunk-XH3HGI2N.js.map → chunk-2HQPE2NM.js.map} +0 -0
  699. /package/dist/{chunk-3EKVN2OP.js.map → chunk-2ZG2LLZT.js.map} +0 -0
  700. /package/dist/{chunk-6EHM2AV7.js.map → chunk-3BLHPQHT.js.map} +0 -0
  701. /package/dist/{chunk-J272ODKJ.js.map → chunk-42DJ235G.js.map} +0 -0
  702. /package/dist/{chunk-F4EHXVP7.js.map → chunk-46RII65S.js.map} +0 -0
  703. /package/dist/{chunk-YUW66UAH.js.map → chunk-4AX5OYKC.js.map} +0 -0
  704. /package/dist/{chunk-AECJY3GJ.js.map → chunk-4IGOLIWM.js.map} +0 -0
  705. /package/dist/{chunk-2ZTDRNCS.js.map → chunk-54QPOE45.js.map} +0 -0
  706. /package/dist/{chunk-O4M4BDIJ.js.map → chunk-563X6JJX.js.map} +0 -0
  707. /package/dist/{chunk-IL6ODG6M.js.map → chunk-5EQT62HH.js.map} +0 -0
  708. /package/dist/{chunk-JKKII6GX.js.map → chunk-6MQMYXSQ.js.map} +0 -0
  709. /package/dist/{chunk-TVVEYCNW.js.map → chunk-7K5Q6COX.js.map} +0 -0
  710. /package/dist/{chunk-BV4ZKIZH.js.map → chunk-7ZLC4DTZ.js.map} +0 -0
  711. /package/dist/{chunk-WBM2MVBK.js.map → chunk-A4OIJYCV.js.map} +0 -0
  712. /package/dist/{chunk-RLJHJQUY.js.map → chunk-AFJHNHAM.js.map} +0 -0
  713. /package/dist/{chunk-4RZLTZVM.js.map → chunk-AKABVXFS.js.map} +0 -0
  714. /package/dist/{chunk-M6HBPLBA.js.map → chunk-AUSRUOMQ.js.map} +0 -0
  715. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  716. /package/dist/{chunk-Q7CLGFA7.js.map → chunk-C3G6MW4W.js.map} +0 -0
  717. /package/dist/{chunk-O76F5QPP.js.map → chunk-D6PY63OM.js.map} +0 -0
  718. /package/dist/{chunk-BD7JTBYP.js.map → chunk-D7MAYFQP.js.map} +0 -0
  719. /package/dist/{chunk-LMLGBG6H.js.map → chunk-DBB5JPSL.js.map} +0 -0
  720. /package/dist/{chunk-TSP5WH72.js.map → chunk-DIXZQTGY.js.map} +0 -0
  721. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  722. /package/dist/{chunk-UHRZ324M.js.map → chunk-E3I3NDUP.js.map} +0 -0
  723. /package/dist/{chunk-AENM6GKU.js.map → chunk-E4LMQTST.js.map} +0 -0
  724. /package/dist/{chunk-MUTVRKKY.js.map → chunk-EMSYMYXO.js.map} +0 -0
  725. /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
  726. /package/dist/{chunk-FXHOZGSE.js.map → chunk-F5H6YG5P.js.map} +0 -0
  727. /package/dist/{chunk-TNSCIPBQ.js.map → chunk-G6NQ3L4T.js.map} +0 -0
  728. /package/dist/{chunk-ZMWSYUUL.js.map → chunk-GCBIXUPT.js.map} +0 -0
  729. /package/dist/{chunk-4BCHFSC7.js.map → chunk-GWNSKQDA.js.map} +0 -0
  730. /package/dist/{chunk-JDX2OA4R.js.map → chunk-HNHIHXSD.js.map} +0 -0
  731. /package/dist/{chunk-GG5FHZJJ.js.map → chunk-I33QYUAF.js.map} +0 -0
  732. /package/dist/{chunk-AAZEKXUP.js.map → chunk-IYIPXAIJ.js.map} +0 -0
  733. /package/dist/{chunk-5U7K4W6K.js.map → chunk-JDOBQPJY.js.map} +0 -0
  734. /package/dist/{chunk-UZZ7SQT3.js.map → chunk-JMWUPUE6.js.map} +0 -0
  735. /package/dist/{chunk-ENBPQEVU.js.map → chunk-JSD7Q7LD.js.map} +0 -0
  736. /package/dist/{chunk-Q432REND.js.map → chunk-KJLLPG26.js.map} +0 -0
  737. /package/dist/{chunk-JTQR6L2N.js.map → chunk-KLUC2GSG.js.map} +0 -0
  738. /package/dist/{chunk-OB3XMWX5.js.map → chunk-KVO2BTA4.js.map} +0 -0
  739. /package/dist/{chunk-PCOVEDPK.js.map → chunk-KZJM7R4F.js.map} +0 -0
  740. /package/dist/{chunk-X4TD4O2F.js.map → chunk-LE2KZ72G.js.map} +0 -0
  741. /package/dist/{chunk-HIP6DKJJ.js.map → chunk-LQVXSRAJ.js.map} +0 -0
  742. /package/dist/{chunk-A7GQBJP5.js.map → chunk-LVFI5LG7.js.map} +0 -0
  743. /package/dist/{chunk-VBSNUH4J.js.map → chunk-ND7MAIJC.js.map} +0 -0
  744. /package/dist/{chunk-54NX5EG4.js.map → chunk-P66QH6R6.js.map} +0 -0
  745. /package/dist/{chunk-62D2PAAM.js.map → chunk-PAAJWQH5.js.map} +0 -0
  746. /package/dist/{chunk-TA4C3XB7.js.map → chunk-PFKIOYJH.js.map} +0 -0
  747. /package/dist/{chunk-WIWLX65T.js.map → chunk-PGGPRF6J.js.map} +0 -0
  748. /package/dist/{chunk-V6EGNVUT.js.map → chunk-PIWFNPQT.js.map} +0 -0
  749. /package/dist/{chunk-4JVQRFZD.js.map → chunk-PLJ2MQFT.js.map} +0 -0
  750. /package/dist/{chunk-4RX5O34R.js.map → chunk-PQ42DJNG.js.map} +0 -0
  751. /package/dist/{chunk-37CAEC7E.js.map → chunk-PWPIERBM.js.map} +0 -0
  752. /package/dist/{chunk-ZEGL7YCC.js.map → chunk-Q62GA5U2.js.map} +0 -0
  753. /package/dist/{chunk-GAS7KYC7.js.map → chunk-RQQO3ORQ.js.map} +0 -0
  754. /package/dist/{chunk-3NPNBVFR.js.map → chunk-UZGHKD3T.js.map} +0 -0
  755. /package/dist/{chunk-VJIE4D2I.js.map → chunk-V62YYBBY.js.map} +0 -0
  756. /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
  757. /package/dist/{chunk-6AGWBKQU.js.map → chunk-VSN2DMQK.js.map} +0 -0
  758. /package/dist/{chunk-ZHXSOMYH.js.map → chunk-VVX5PZFS.js.map} +0 -0
  759. /package/dist/{chunk-GI4ZBWPQ.js.map → chunk-W7UV2ZCA.js.map} +0 -0
  760. /package/dist/{chunk-GMIQV6DD.js.map → chunk-WBQ4ONQJ.js.map} +0 -0
  761. /package/dist/{chunk-FNHLI2RE.js.map → chunk-WFMQN7JE.js.map} +0 -0
  762. /package/dist/{chunk-ZBW7A667.js.map → chunk-WPGA4RYI.js.map} +0 -0
  763. /package/dist/{chunk-YQNNHLCG.js.map → chunk-WPGR3RW4.js.map} +0 -0
  764. /package/dist/{chunk-NXGSONWM.js.map → chunk-WZIO3TW6.js.map} +0 -0
  765. /package/dist/{chunk-ZZUVBZL2.js.map → chunk-X2QPKLPL.js.map} +0 -0
  766. /package/dist/{chunk-VSL63CFJ.js.map → chunk-XRS65T4O.js.map} +0 -0
  767. /package/dist/{chunk-5N4MZLEH.js.map → chunk-YFXAWGMR.js.map} +0 -0
  768. /package/dist/{chunk-D545Z7UH.js.map → chunk-Z535ADTC.js.map} +0 -0
  769. /package/dist/{chunk-5YCNDC3C.js.map → chunk-ZX6NNFSY.js.map} +0 -0
  770. /package/dist/{chunk-3N3PBBEH.js.map → chunk-ZYSOT6HD.js.map} +0 -0
  771. /package/dist/{chunk-MCRVQ5YQ.js.map → chunk-ZZEIL3MI.js.map} +0 -0
  772. /package/dist/{resolution-4GG3QZRJ.js.map → contradiction-scan-GVD4JJ7B.js.map} +0 -0
  773. /package/dist/{first-start-migration-ZWMV5CX4.js.map → first-start-migration-L3UFX5CU.js.map} +0 -0
  774. /package/dist/{tier-stats-LUSUUNU6.js.map → tier-stats-VK5PCO2L.js.map} +0 -0
@@ -0,0 +1,424 @@
1
+ /**
2
+ * recall-state-view-budget.test.ts — issue #2928.
3
+ *
4
+ * Final output budgeting must keep state-view packets atomic: a historical
5
+ * row and its linked successor share ONE canonical packet key
6
+ * (`stateViewPacketKeys`), so the final character/token cap admits BOTH or
7
+ * NEITHER — never one side alone. Post-cap follow-up to the #2877/#2859
8
+ * state-view work: the packet cap upstream counts packets, but the section
9
+ * coordinator's final assembly still admitted rows one by one and could
10
+ * split a pair at the budget boundary.
11
+ *
12
+ * Zero-diff guarantee: rows without a packetKey (state views off, non-state
13
+ * rows) keep the pre-#2928 per-row admission exactly.
14
+ */
15
+ import assert from "node:assert/strict";
16
+ import os from "node:os";
17
+ import path from "node:path";
18
+ import { mkdtemp, mkdir, rm, writeFile } from "node:fs/promises";
19
+ import test from "node:test";
20
+
21
+ import { parseConfig } from "./config.js";
22
+ import { Orchestrator } from "./orchestrator.js";
23
+ import { RecallSectionCoordinator } from "./orchestration/recall-section-coordinator.js";
24
+ import type {
25
+ RecallSectionBuckets,
26
+ RecallSectionChunk,
27
+ } from "./orchestration/recall-section-coordinator.js";
28
+ import { capStateViewPackets, stateViewPacketKeys } from "./recall-state-view.js";
29
+ import type { PluginConfig, QmdSearchResult } from "./types.js";
30
+
31
+ const HEADING = "## Relevant Memories";
32
+ const PRED = "[superseded 2026-08-01 by sv-new] Job title used to be Senior Engineer.";
33
+ const SUCC = "Current job title: Staff Engineer.";
34
+ const PAIR_BLOCK = `${PRED}\n\n${SUCC}`;
35
+
36
+ // Token ceiling far above every character budget used here, so the
37
+ // character budget is the only binding constraint (deterministic).
38
+ const TOKENS = 1_000_000;
39
+
40
+ function makeCoordinator(recallBudgetChars: number): RecallSectionCoordinator {
41
+ const config = parseConfig({
42
+ maxMemoryTokens: TOKENS,
43
+ recallBudgetChars,
44
+ recallPipeline: [{ id: "memories", enabled: true }],
45
+ });
46
+ return new RecallSectionCoordinator({ getConfig: () => config });
47
+ }
48
+
49
+ interface RowOptions {
50
+ memoryId: string;
51
+ packetKey?: string;
52
+ memoryNamespace?: string;
53
+ }
54
+
55
+ function appendRow(
56
+ coordinator: RecallSectionCoordinator,
57
+ buckets: RecallSectionBuckets,
58
+ content: string,
59
+ options: RowOptions,
60
+ ): void {
61
+ coordinator.appendRecallSection(buckets, "memories", content, {
62
+ atomic: true,
63
+ memoryId: options.memoryId,
64
+ memoryPath: `facts/${options.memoryId}.md`,
65
+ ...(options.packetKey ? { packetKey: options.packetKey } : {}),
66
+ ...(options.memoryNamespace ? { memoryNamespace: options.memoryNamespace } : {}),
67
+ });
68
+ }
69
+
70
+ function appendPair(
71
+ coordinator: RecallSectionCoordinator,
72
+ buckets: RecallSectionBuckets,
73
+ predId: string,
74
+ succId: string,
75
+ packetKey: string,
76
+ predContent = PRED,
77
+ succContent = SUCC,
78
+ memoryNamespace?: string,
79
+ ): void {
80
+ appendRow(coordinator, buckets, predContent, { memoryId: predId, packetKey, memoryNamespace });
81
+ appendRow(coordinator, buckets, succContent, { memoryId: succId, packetKey, memoryNamespace });
82
+ }
83
+
84
+ function newBuckets(): RecallSectionBuckets {
85
+ return new Map<string, Array<string | RecallSectionChunk>>();
86
+ }
87
+
88
+ function heading(buckets: RecallSectionBuckets, coordinator: RecallSectionCoordinator): void {
89
+ coordinator.appendRecallSection(buckets, "memories", HEADING);
90
+ }
91
+
92
+ test("exact fit admits the historical row and its successor together", () => {
93
+ const coordinator = makeCoordinator(HEADING.length + 2 + PAIR_BLOCK.length);
94
+ const buckets = newBuckets();
95
+ heading(buckets, coordinator);
96
+ appendPair(coordinator, buckets, "sv-old", "sv-new", "pkt-1");
97
+
98
+ const assembled = coordinator.assembleRecallSections(buckets);
99
+
100
+ assert.deepEqual(assembled.includedMemoryIds, ["sv-old", "sv-new"]);
101
+ assert.equal(assembled.sections[0], `${HEADING}\n\n${PAIR_BLOCK}`);
102
+ assert.equal(assembled.truncated, false);
103
+ });
104
+
105
+ test("one char short of the packet alone drops BOTH rows — never one side", () => {
106
+ const coordinator = makeCoordinator(PAIR_BLOCK.length - 1);
107
+ const buckets = newBuckets();
108
+ heading(buckets, coordinator);
109
+ appendPair(coordinator, buckets, "sv-old", "sv-new", "pkt-1");
110
+
111
+ const assembled = coordinator.assembleRecallSections(buckets);
112
+
113
+ assert.deepEqual(assembled.includedMemoryIds, []);
114
+ assert.deepEqual(assembled.omittedMemoryIds, ["sv-old", "sv-new"]);
115
+ assert.equal(assembled.truncated, true);
116
+ assert.equal(assembled.sections.length, 0);
117
+ });
118
+
119
+ test("one char short of heading+packet still keeps the packet whole (restart drops the heading, not the pair)", () => {
120
+ const budget = HEADING.length + 2 + PAIR_BLOCK.length - 1;
121
+ const coordinator = makeCoordinator(budget);
122
+ const buckets = newBuckets();
123
+ heading(buckets, coordinator);
124
+ appendPair(coordinator, buckets, "sv-old", "sv-new", "pkt-1");
125
+
126
+ const assembled = coordinator.assembleRecallSections(buckets);
127
+
128
+ assert.deepEqual(assembled.includedMemoryIds, ["sv-old", "sv-new"]);
129
+ assert.equal(assembled.sections[0], PAIR_BLOCK);
130
+ });
131
+
132
+ test("predecessor-first order is preserved on admission", () => {
133
+ const coordinator = makeCoordinator(HEADING.length + 2 + PAIR_BLOCK.length);
134
+ const buckets = newBuckets();
135
+ heading(buckets, coordinator);
136
+ appendPair(coordinator, buckets, "sv-old", "sv-new", "pkt-1");
137
+
138
+ const out = coordinator.assembleRecallSections(buckets).sections[0] ?? "";
139
+ assert.ok(out.indexOf(PRED) < out.indexOf(SUCC), "historical row must render before its successor");
140
+ });
141
+
142
+ test("successor-first order is preserved and still never splits the packet", () => {
143
+ // Successor ranks first: the packet block renders at the FIRST member's
144
+ // position with members in incoming order.
145
+ const fits = makeCoordinator(HEADING.length + 2 + PAIR_BLOCK.length);
146
+ const fitsBuckets = newBuckets();
147
+ heading(fitsBuckets, fits);
148
+ appendRow(fits, fitsBuckets, SUCC, { memoryId: "sv-new", packetKey: "pkt-1" });
149
+ appendRow(fits, fitsBuckets, PRED, { memoryId: "sv-old", packetKey: "pkt-1" });
150
+ const fitted = fits.assembleRecallSections(fitsBuckets);
151
+
152
+ assert.deepEqual(fitted.includedMemoryIds, ["sv-new", "sv-old"]);
153
+ const out = fitted.sections[0] ?? "";
154
+ assert.ok(out.indexOf(SUCC) < out.indexOf(PRED));
155
+
156
+ // One char short of the packet alone: the lone successor must NOT slip in.
157
+ const tight = makeCoordinator(PAIR_BLOCK.length - 1);
158
+ const tightBuckets = newBuckets();
159
+ heading(tightBuckets, tight);
160
+ appendRow(tight, tightBuckets, SUCC, { memoryId: "sv-new", packetKey: "pkt-1" });
161
+ appendRow(tight, tightBuckets, PRED, { memoryId: "sv-old", packetKey: "pkt-1" });
162
+
163
+ const dropped = tight.assembleRecallSections(tightBuckets);
164
+ assert.deepEqual(dropped.includedMemoryIds, []);
165
+ assert.equal(dropped.sections.length, 0);
166
+ });
167
+
168
+ test("multiple packets: a tight budget keeps whole packets, never a half pair", () => {
169
+ const PRED2 = "[superseded 2026-08-01 by sv-new2] Old office was Austin.";
170
+ const SUCC2 = "Current office: Denver.";
171
+ const block1 = PAIR_BLOCK;
172
+ const block2 = `${PRED2}\n\n${SUCC2}`;
173
+ const fitBoth = HEADING.length + 2 + block1.length + 2 + block2.length;
174
+
175
+ const all = makeCoordinator(fitBoth);
176
+ const allBuckets = newBuckets();
177
+ heading(allBuckets, all);
178
+ appendPair(all, allBuckets, "sv-old", "sv-new", "pkt-1");
179
+ appendPair(all, allBuckets, "sv-old2", "sv-new2", "pkt-2", PRED2, SUCC2);
180
+ const assembledAll = all.assembleRecallSections(allBuckets);
181
+ assert.deepEqual(assembledAll.includedMemoryIds, ["sv-old", "sv-new", "sv-old2", "sv-new2"]);
182
+ assert.equal(assembledAll.truncated, false);
183
+
184
+ // One char short of both packets: the first packet stays whole, the second
185
+ // drops whole — no half pair on either side of the boundary.
186
+ const one = makeCoordinator(fitBoth - 1);
187
+ const oneBuckets = newBuckets();
188
+ heading(oneBuckets, one);
189
+ appendPair(one, oneBuckets, "sv-old", "sv-new", "pkt-1");
190
+ appendPair(one, oneBuckets, "sv-old2", "sv-new2", "pkt-2", PRED2, SUCC2);
191
+ const assembledOne = one.assembleRecallSections(oneBuckets);
192
+
193
+ assert.deepEqual(assembledOne.includedMemoryIds, ["sv-old", "sv-new"]);
194
+ assert.deepEqual(assembledOne.omittedMemoryIds, ["sv-old2", "sv-new2"]);
195
+ assert.equal(assembledOne.truncated, true);
196
+ const out = assembledOne.sections[0] ?? "";
197
+ assert.ok(out.includes(PRED) && out.includes(SUCC));
198
+ assert.ok(!out.includes(PRED2) && !out.includes(SUCC2));
199
+ });
200
+
201
+ test("namespace collision: identical ids in different namespaces are separate packets", () => {
202
+ // Canonical packet keys are namespace-qualified — same memory ids across
203
+ // two namespaces must never merge into one packet (#2859 pair-key rule).
204
+ const rows: QmdSearchResult[] = [
205
+ { id: "sv-old", namespace: "ns-a", supersededBy: "sv-new" } as QmdSearchResult,
206
+ { id: "sv-new", namespace: "ns-a" } as QmdSearchResult,
207
+ { id: "sv-old", namespace: "ns-b", supersededBy: "sv-new" } as QmdSearchResult,
208
+ { id: "sv-new", namespace: "ns-b" } as QmdSearchResult,
209
+ ];
210
+ const keys = stateViewPacketKeys(rows);
211
+ assert.equal(keys[0], keys[1], "ns-a pair shares one root");
212
+ assert.equal(keys[2], keys[3], "ns-b pair shares one root");
213
+ assert.notEqual(keys[0], keys[2], "same ids in different namespaces must not merge");
214
+
215
+ const fitBoth = HEADING.length + 2 + PAIR_BLOCK.length * 2 + 2;
216
+ const all = makeCoordinator(fitBoth);
217
+ const allBuckets = newBuckets();
218
+ heading(allBuckets, all);
219
+ appendPair(all, allBuckets, "sv-old", "sv-new", keys[0]!, PRED, SUCC, "ns-a");
220
+ appendPair(all, allBuckets, "sv-old", "sv-new", keys[2]!, PRED, SUCC, "ns-b");
221
+ const assembledAll = all.assembleRecallSections(allBuckets);
222
+ assert.equal(assembledAll.includedMemoryIds.length, 4, "both namespaces' packets admitted");
223
+
224
+ // Budget for the heading plus ONE packet minus a char: whichever packet is
225
+ // dropped goes whole — the identical foreign-namespace id never rescues it.
226
+ const one = makeCoordinator(HEADING.length + 2 + PAIR_BLOCK.length + 1);
227
+ const oneBuckets = newBuckets();
228
+ heading(oneBuckets, one);
229
+ appendPair(one, oneBuckets, "sv-old", "sv-new", keys[0]!, PRED, SUCC, "ns-a");
230
+ appendPair(one, oneBuckets, "sv-old", "sv-new", keys[2]!, PRED, SUCC, "ns-b");
231
+ const assembledOne = one.assembleRecallSections(oneBuckets);
232
+
233
+ assert.equal(assembledOne.includedMemoryIds.length, 2, "exactly one whole packet admitted");
234
+ assert.deepEqual(assembledOne.omittedMemoryIds, ["sv-old", "sv-new"]);
235
+ });
236
+
237
+ test("non-state rows between packet members stay admitted in rank order", () => {
238
+ const OTHER = "An unrelated active fact about coffee.";
239
+ const budget = HEADING.length + 2 + PAIR_BLOCK.length + 2 + OTHER.length;
240
+ const coordinator = makeCoordinator(budget);
241
+ const buckets = newBuckets();
242
+ heading(buckets, coordinator);
243
+ appendRow(coordinator, buckets, PRED, { memoryId: "sv-old", packetKey: "pkt-1" });
244
+ appendRow(coordinator, buckets, OTHER, { memoryId: "other" });
245
+ appendRow(coordinator, buckets, SUCC, { memoryId: "sv-new", packetKey: "pkt-1" });
246
+
247
+ const assembled = coordinator.assembleRecallSections(buckets);
248
+ const out = assembled.sections[0] ?? "";
249
+ assert.deepEqual(assembled.includedMemoryIds, ["sv-old", "sv-new", "other"]);
250
+ assert.ok(out.indexOf(PRED) < out.indexOf(SUCC));
251
+ assert.ok(out.includes(OTHER));
252
+ });
253
+
254
+ test("zero-diff: rows without a packetKey keep per-row admission (split allowed)", () => {
255
+ // Pre-#2928 semantics for non-state rows: the budget admits whatever fits,
256
+ // including one row of an (unmarked) pair. Pinning this proves the packet
257
+ // gate is opt-in via packetKey, not a global behavior change.
258
+ const budget = HEADING.length + 2 + PRED.length + 1;
259
+ const coordinator = makeCoordinator(budget);
260
+ const buckets = newBuckets();
261
+ heading(buckets, coordinator);
262
+ appendRow(coordinator, buckets, PRED, { memoryId: "sv-old" });
263
+ appendRow(coordinator, buckets, SUCC, { memoryId: "sv-new" });
264
+
265
+ const assembled = coordinator.assembleRecallSections(buckets);
266
+ assert.deepEqual(assembled.includedMemoryIds, ["sv-old"]);
267
+ assert.equal(assembled.truncated, true);
268
+ });
269
+
270
+ test("stateViewPacketKeys: chains share one root, back-pointers anchor, blank ids stay singletons", () => {
271
+ const chain = [
272
+ { id: "a", supersededBy: "b" },
273
+ { id: "b", supersededBy: "c" },
274
+ { id: "c" },
275
+ { id: "d" },
276
+ ] as QmdSearchResult[];
277
+ const keys = stateViewPacketKeys(chain);
278
+ assert.equal(keys[0], keys[1]);
279
+ assert.equal(keys[1], keys[2]);
280
+ assert.notEqual(keys[0], keys[3]);
281
+
282
+ // A successor's `supersedes` back-pointer anchors the pair even when the
283
+ // predecessor lacks `supersededBy` (buildSuccessorMap precedence).
284
+ const backPointer = [
285
+ { id: "old" },
286
+ { id: "new", supersedes: "old" },
287
+ ] as QmdSearchResult[];
288
+ const backKeys = stateViewPacketKeys(backPointer);
289
+ assert.equal(backKeys[0], backKeys[1]);
290
+
291
+ // Blank-key rows are distinct singletons.
292
+ const blanks = [{}, {}] as QmdSearchResult[];
293
+ const blankKeys = stateViewPacketKeys(blanks);
294
+ assert.notEqual(blankKeys[0], blankKeys[1]);
295
+
296
+ // capStateViewPackets keeps counting a whole chain as one slot (#2859).
297
+ assert.deepEqual(
298
+ capStateViewPackets(chain, 1).map((row) => row.id),
299
+ ["a", "b", "c"],
300
+ );
301
+ assert.deepEqual(
302
+ capStateViewPackets(chain, 2).map((row) => row.id),
303
+ ["a", "b", "c", "d"],
304
+ );
305
+ });
306
+
307
+ // ---------------------------------------------------------------------------
308
+ // End to end: the publish seam threads real packet keys into the final
309
+ // budget, so a tight memories-section cap on a live recall output can never
310
+ // emit one side of a supersession pair (recent-scan path, QMD disabled).
311
+ // ---------------------------------------------------------------------------
312
+
313
+ const QUERY = "when did the job title change";
314
+
315
+ async function makeOrchestrator(
316
+ overrides: Partial<PluginConfig> = {},
317
+ ): Promise<{ orchestrator: Orchestrator; memoryDir: string }> {
318
+ const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-sv-budget-"));
319
+ const config = parseConfig({
320
+ openaiApiKey: "sk-test",
321
+ memoryDir,
322
+ workspaceDir: path.join(memoryDir, "workspace"),
323
+ qmdEnabled: false,
324
+ embeddingFallbackEnabled: false,
325
+ multiGraphMemoryEnabled: false,
326
+ entityGraphEnabled: false,
327
+ timeGraphEnabled: false,
328
+ causalGraphEnabled: false,
329
+ extractionJudgeEnabled: false,
330
+ temporalSupersessionEnabled: true,
331
+ temporalSupersessionIncludeInRecall: false,
332
+ contradictionDetectionEnabled: false,
333
+ chunkingEnabled: false,
334
+ extractionMinChars: 0,
335
+ extractionMinImportanceLevel: "trivial",
336
+ inlineSourceAttributionEnabled: false,
337
+ initGateTimeoutMs: 200,
338
+ ...overrides,
339
+ });
340
+ return { orchestrator: new Orchestrator(config), memoryDir };
341
+ }
342
+
343
+ async function writePair(memoryDir: string): Promise<void> {
344
+ const today = new Date().toISOString().slice(0, 10);
345
+ const factsDir = path.join(memoryDir, "facts", today);
346
+ await mkdir(factsDir, { recursive: true });
347
+ const now = new Date().toISOString();
348
+ const successor = [
349
+ "---",
350
+ "id: sv-new",
351
+ "category: fact",
352
+ `created: ${now}`,
353
+ `updated: ${now}`,
354
+ "source: extraction",
355
+ "confidence: 0.8",
356
+ "confidenceTier: high",
357
+ "tags: []",
358
+ "status: active",
359
+ "---",
360
+ "",
361
+ "Current job title: Staff Engineer.",
362
+ "",
363
+ ];
364
+ const predecessor = [
365
+ "---",
366
+ "id: sv-old",
367
+ "category: fact",
368
+ `created: ${now}`,
369
+ `updated: ${now}`,
370
+ "source: extraction",
371
+ "confidence: 0.8",
372
+ "confidenceTier: high",
373
+ "tags: []",
374
+ "status: superseded",
375
+ "supersededBy: sv-new",
376
+ "supersededAt: 2026-08-01",
377
+ "---",
378
+ "",
379
+ "Job title history: the job title used to be Senior Engineer.",
380
+ "",
381
+ ];
382
+ await writeFile(path.join(factsDir, "sv-new.md"), `${successor.join("\n")}\n`, "utf-8");
383
+ await writeFile(path.join(factsDir, "sv-old.md"), `${predecessor.join("\n")}\n`, "utf-8");
384
+ }
385
+
386
+ test("end to end: a tight memories cap emits neither side of the pair (#2928)", async () => {
387
+ const { orchestrator, memoryDir } = await makeOrchestrator({
388
+ recallPipeline: [{ id: "memories", enabled: true, maxChars: 40 }],
389
+ });
390
+ try {
391
+ await writePair(memoryDir);
392
+ await orchestrator.initialize();
393
+ const out = await orchestrator.recall(QUERY, "sess-sv-budget-tight", { stateView: true });
394
+
395
+ // Atomicity is the XOR property: never exactly one side.
396
+ const hasPred = out.includes("Senior Engineer");
397
+ const hasSucc = out.includes("Staff Engineer");
398
+ assert.ok(
399
+ hasPred === hasSucc,
400
+ `pair must be admitted or dropped together, got pred=${hasPred} succ=${hasSucc}:\n${out}`,
401
+ );
402
+ assert.ok(!hasPred && !hasSucc, "a 40-char cap cannot fit the packet, so both sides must be absent");
403
+ } finally {
404
+ await orchestrator.destroy();
405
+ await rm(memoryDir, { recursive: true, force: true });
406
+ }
407
+ });
408
+
409
+ test("end to end: a generous cap emits both sides of the pair (#2928)", async () => {
410
+ const { orchestrator, memoryDir } = await makeOrchestrator({
411
+ recallPipeline: [{ id: "memories", enabled: true, maxChars: 4000 }],
412
+ });
413
+ try {
414
+ await writePair(memoryDir);
415
+ await orchestrator.initialize();
416
+ const out = await orchestrator.recall(QUERY, "sess-sv-budget-wide", { stateView: true });
417
+
418
+ assert.ok(out.includes("Senior Engineer"), "historical row must render, got:\n" + out);
419
+ assert.ok(out.includes("Staff Engineer"), "successor row must render, got:\n" + out);
420
+ } finally {
421
+ await orchestrator.destroy();
422
+ await rm(memoryDir, { recursive: true, force: true });
423
+ }
424
+ });
@@ -0,0 +1,268 @@
1
+ /**
2
+ * recall-state-view-cron-intent.test.ts — issue #2893.
3
+ *
4
+ * Cron recall policy (buildRecallQueryPolicy) normalizes the retrieval
5
+ * query: standard prompts are truncated at maxChars, instruction-heavy
6
+ * prompts are compacted with stop-word removal ("when", "before",
7
+ * "after") plus a token cap. Either path can erase the change-intent
8
+ * signal that gates state views. These regressions pin:
9
+ *
10
+ * 1. Change intent is classified from the ORIGINAL prompt at the recall
11
+ * entry seam, so a long cron prompt whose intent phrase lies beyond
12
+ * the normalization cutoff still activates state views.
13
+ * 2. Only the validated boolean flows downstream: retrieval keeps the
14
+ * normalized query, and the inject seam does not re-classify intent
15
+ * against it when the per-request flag is threaded.
16
+ * 3. Negative controls: non-change prompts, flag-less calls, and the
17
+ * legacy config-only path (no threaded flag) keep prior behavior.
18
+ */
19
+
20
+ import assert from "node:assert/strict";
21
+ import os from "node:os";
22
+ import path from "node:path";
23
+ import { mkdtemp, mkdir, writeFile, rm } from "node:fs/promises";
24
+ import test from "node:test";
25
+
26
+ import { parseConfig } from "./config.js";
27
+ import { buildRecallQueryPolicy, type RecallQueryPolicyConfig } from "./recall-query-policy.js";
28
+ import { resolveRecallStateViewActive } from "./recall-state-view-admission.js";
29
+ import { annotateStateView, isChangeOrientedQuery, type StateViewResult } from "./recall-state-view.js";
30
+ import { widenRecallStateViews } from "./recall-state-view-widen.js";
31
+ import { applyRecallStateViews } from "./recall-state-view-wire.js";
32
+ import { Orchestrator } from "./orchestrator.js";
33
+ import type { PluginConfig } from "./types.js";
34
+
35
+ // No change-intent tokens; comfortably longer than the 120-char cutoff.
36
+ const FILLER =
37
+ "daily ops digest for platform delivery covering deploy notes on-call handoffs release cadence sprint board columns quota dashboards vendor invoices and rotating shift owners";
38
+ const LONG_CHANGE = `${FILLER} plus tell me when did the job title change`;
39
+ const LONG_NON_CHANGE = `${FILLER} plus confirm the current job title roster`;
40
+ const CRON_KEY = "sess:cron:nightly-digest";
41
+ const POLICY_CFG: RecallQueryPolicyConfig = {
42
+ cronRecallPolicyEnabled: true,
43
+ cronRecallNormalizedQueryMaxChars: 120,
44
+ cronRecallInstructionHeavyTokenCap: 8,
45
+ cronConversationRecallMode: "auto",
46
+ };
47
+
48
+ test("fixtures: filler carries no intent and outruns the cutoff", () => {
49
+ assert.ok(FILLER.length >= 120, `filler must exceed maxChars, got ${FILLER.length}`);
50
+ assert.equal(isChangeOrientedQuery(FILLER), false);
51
+ assert.equal(isChangeOrientedQuery(LONG_CHANGE), true);
52
+ assert.equal(isChangeOrientedQuery(LONG_NON_CHANGE), false);
53
+ });
54
+
55
+ test("standard cron truncation erases intent from the normalized query", () => {
56
+ const policy = buildRecallQueryPolicy(LONG_CHANGE, CRON_KEY, POLICY_CFG);
57
+ assert.equal(policy.promptShape, "standard");
58
+ assert.equal(isChangeOrientedQuery(policy.retrievalQuery), false);
59
+ assert.ok(!policy.retrievalQuery.includes("when did"));
60
+ });
61
+
62
+ test("instruction-heavy compaction erases intent from the normalized query", () => {
63
+ const lines = [
64
+ "GOAL: nightly infrastructure digest",
65
+ "OUTPUT FORMAT: markdown summary",
66
+ "TONE RULES: concise operator voice",
67
+ "GROUNDING RULES: cite memory ids",
68
+ ];
69
+ for (let i = 0; i < 10; i += 1) lines.push(`- item-${i} inventory cluster-${i}`);
70
+ for (let i = 0; i < 14; i += 1) lines.push(`vendor ledger panel review segment ${i}`);
71
+ lines.push("finally answer when did the job title change");
72
+ const prompt = lines.join("\n");
73
+
74
+ const policy = buildRecallQueryPolicy(prompt, CRON_KEY, POLICY_CFG);
75
+ assert.equal(policy.promptShape, "instruction_heavy");
76
+ assert.equal(isChangeOrientedQuery(prompt), true);
77
+ assert.equal(isChangeOrientedQuery(policy.retrievalQuery), false);
78
+ assert.ok(!policy.retrievalQuery.includes("change"));
79
+ });
80
+
81
+ test("entry seam classifies the ORIGINAL prompt, not the normalized query (#2893)", () => {
82
+ const policy = buildRecallQueryPolicy(LONG_CHANGE, CRON_KEY, POLICY_CFG);
83
+ // Pre-fix shape: classifying the normalized query disables the view.
84
+ assert.equal(resolveRecallStateViewActive({ stateView: true }, {}, policy.retrievalQuery), false);
85
+ // Post-fix contract: the original prompt carries the signal.
86
+ assert.equal(resolveRecallStateViewActive({ stateView: true }, { recallStateViews: false }, LONG_CHANGE), true);
87
+ assert.equal(resolveRecallStateViewActive({}, { recallStateViews: true }, LONG_CHANGE), true);
88
+ });
89
+
90
+ test("negative controls: non-change prompts and flag-less calls stay inactive", () => {
91
+ assert.equal(
92
+ resolveRecallStateViewActive({ stateView: true }, { recallStateViews: true }, LONG_NON_CHANGE),
93
+ false,
94
+ );
95
+ assert.equal(resolveRecallStateViewActive({}, {}, LONG_CHANGE), false);
96
+ assert.equal(
97
+ resolveRecallStateViewActive({ stateView: false }, { recallStateViews: false }, LONG_CHANGE),
98
+ false,
99
+ );
100
+ });
101
+
102
+ test("non-cron sessions keep the original prompt as the retrieval query", () => {
103
+ const policy = buildRecallQueryPolicy(LONG_CHANGE, "sess-interactive", POLICY_CFG);
104
+ assert.equal(policy.retrievalQuery, LONG_CHANGE);
105
+ });
106
+
107
+ function fact(id: string, extra: Partial<StateViewResult> = {}): StateViewResult {
108
+ return { id, ...extra };
109
+ }
110
+
111
+ const CURRENT = fact("new-job", { status: "active" });
112
+ const HISTORICAL = fact("old-job", {
113
+ status: "superseded",
114
+ supersededBy: "new-job",
115
+ supersededAt: "2026-03-01",
116
+ });
117
+
118
+ test("threaded flag carries the decision past the normalized query at the inject seam (#2893)", () => {
119
+ const policy = buildRecallQueryPolicy(LONG_CHANGE, CRON_KEY, POLICY_CFG);
120
+ assert.equal(isChangeOrientedQuery(policy.retrievalQuery), false);
121
+
122
+ const labeled = widenRecallStateViews([CURRENT], policy.retrievalQuery, { recallStateViews: false }, [HISTORICAL], true);
123
+ assert.deepEqual(
124
+ labeled.map((row) => [row.id, row.stateLabel]),
125
+ [
126
+ ["new-job", "current"],
127
+ ["old-job", "historical"],
128
+ ],
129
+ );
130
+ assert.deepEqual(
131
+ applyRecallStateViews([CURRENT, HISTORICAL], policy.retrievalQuery, { recallStateViews: false }, true).map(
132
+ (row) => row.stateLabel,
133
+ ),
134
+ ["current", "historical"],
135
+ );
136
+ assert.deepEqual(
137
+ annotateStateView([CURRENT, HISTORICAL], policy.retrievalQuery, [], {
138
+ enabled: true,
139
+ changeIntent: true,
140
+ }).map((row) => row.stateLabel),
141
+ ["current", "historical"],
142
+ );
143
+ });
144
+
145
+ test("legacy config-only path still re-checks intent against the given query", () => {
146
+ const policy = buildRecallQueryPolicy(LONG_CHANGE, CRON_KEY, POLICY_CFG);
147
+ const input = [CURRENT, HISTORICAL];
148
+ // No threaded flag: config-on alone must not label a non-change query.
149
+ assert.equal(widenRecallStateViews(input, policy.retrievalQuery, { recallStateViews: true }), input);
150
+ assert.equal(applyRecallStateViews(input, policy.retrievalQuery, { recallStateViews: true }), input);
151
+ assert.equal(annotateStateView(input, policy.retrievalQuery, [], { enabled: true }), input);
152
+ assert.equal(input[0]?.stateLabel, undefined);
153
+ });
154
+
155
+ async function makeOrchestrator(
156
+ overrides: Partial<PluginConfig> = {},
157
+ ): Promise<{ orchestrator: Orchestrator; memoryDir: string }> {
158
+ const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-sv-cron-"));
159
+ const config = parseConfig({
160
+ openaiApiKey: "sk-test",
161
+ memoryDir,
162
+ workspaceDir: path.join(memoryDir, "workspace"),
163
+ qmdEnabled: false,
164
+ embeddingFallbackEnabled: false,
165
+ multiGraphMemoryEnabled: false,
166
+ entityGraphEnabled: false,
167
+ timeGraphEnabled: false,
168
+ causalGraphEnabled: false,
169
+ extractionJudgeEnabled: false,
170
+ temporalSupersessionEnabled: true,
171
+ temporalSupersessionIncludeInRecall: false,
172
+ contradictionDetectionEnabled: false,
173
+ chunkingEnabled: false,
174
+ extractionMinChars: 0,
175
+ extractionMinImportanceLevel: "trivial",
176
+ inlineSourceAttributionEnabled: false,
177
+ initGateTimeoutMs: 200,
178
+ ...overrides,
179
+ });
180
+ return { orchestrator: new Orchestrator(config), memoryDir };
181
+ }
182
+
183
+ async function writePair(memoryDir: string): Promise<void> {
184
+ const today = new Date().toISOString().slice(0, 10);
185
+ const factsDir = path.join(memoryDir, "facts", today);
186
+ await mkdir(factsDir, { recursive: true });
187
+ const now = new Date().toISOString();
188
+ const successor = [
189
+ "---",
190
+ "id: sv-new",
191
+ "category: fact",
192
+ `created: ${now}`,
193
+ `updated: ${now}`,
194
+ "source: extraction",
195
+ "confidence: 0.8",
196
+ "confidenceTier: high",
197
+ "tags: []",
198
+ "status: active",
199
+ "---",
200
+ "",
201
+ "Current job title: Staff Engineer.",
202
+ "",
203
+ ];
204
+ const predecessor = [
205
+ "---",
206
+ "id: sv-old",
207
+ "category: fact",
208
+ `created: ${now}`,
209
+ `updated: ${now}`,
210
+ "source: extraction",
211
+ "confidence: 0.8",
212
+ "confidenceTier: high",
213
+ "tags: []",
214
+ "status: superseded",
215
+ "supersededBy: sv-new",
216
+ "supersededAt: 2026-08-01",
217
+ "---",
218
+ "",
219
+ "Job title history: the job title used to be Senior Engineer.",
220
+ "",
221
+ ];
222
+ await writeFile(path.join(factsDir, "sv-new.md"), `${successor.join("\n")}\n`, "utf-8");
223
+ await writeFile(path.join(factsDir, "sv-old.md"), `${predecessor.join("\n")}\n`, "utf-8");
224
+ }
225
+
226
+ const CRON_E2E_CONFIG: Partial<PluginConfig> = {
227
+ cronRecallPolicyEnabled: true,
228
+ cronRecallNormalizedQueryMaxChars: 120,
229
+ };
230
+
231
+ test("long cron prompt keeps per-call stateView labels when truncation erases intent (#2893)", async () => {
232
+ const { orchestrator, memoryDir } = await makeOrchestrator(CRON_E2E_CONFIG);
233
+ try {
234
+ await writePair(memoryDir);
235
+ const out = await orchestrator.recall(LONG_CHANGE, CRON_KEY, { stateView: true });
236
+ assert.ok(
237
+ out.includes("[superseded 2026-08-01 by sv-new]"),
238
+ `cron truncation must not erase the classified intent, got:\n${out}`,
239
+ );
240
+ } finally {
241
+ await orchestrator.destroy();
242
+ await rm(memoryDir, { recursive: true, force: true });
243
+ }
244
+ });
245
+
246
+ test("e2e negative: long cron prompt without intent stays unlabeled even with the flag", async () => {
247
+ const { orchestrator, memoryDir } = await makeOrchestrator(CRON_E2E_CONFIG);
248
+ try {
249
+ await writePair(memoryDir);
250
+ const out = await orchestrator.recall(LONG_NON_CHANGE, CRON_KEY, { stateView: true });
251
+ assert.ok(!out.includes("[superseded "), `non-change prompt must stay filtered, got:\n${out}`);
252
+ } finally {
253
+ await orchestrator.destroy();
254
+ await rm(memoryDir, { recursive: true, force: true });
255
+ }
256
+ });
257
+
258
+ test("e2e negative: long cron prompt with intent stays zero-diff without flags", async () => {
259
+ const { orchestrator, memoryDir } = await makeOrchestrator(CRON_E2E_CONFIG);
260
+ try {
261
+ await writePair(memoryDir);
262
+ const out = await orchestrator.recall(LONG_CHANGE, CRON_KEY);
263
+ assert.ok(!out.includes("[superseded "), `no flags must keep the injection byte-identical, got:\n${out}`);
264
+ } finally {
265
+ await orchestrator.destroy();
266
+ await rm(memoryDir, { recursive: true, force: true });
267
+ }
268
+ });