@remnic/core 9.69.40 → 9.69.42

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 (688) hide show
  1. package/dist/access-admin-ops-surface.d.ts +14 -13
  2. package/dist/access-admin-ops-surface.js +79 -78
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-authorization-probe.d.ts +14 -13
  5. package/dist/access-authorization-probe.js +80 -79
  6. package/dist/access-boundary.d.ts +14 -13
  7. package/dist/access-boundary.js +79 -78
  8. package/dist/access-cli.js +170 -168
  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 +14 -13
  12. package/dist/access-extraction-force-flush.js +79 -78
  13. package/dist/access-health-types.d.ts +1 -1
  14. package/dist/access-http-briefing.d.ts +14 -13
  15. package/dist/access-http-briefing.js +80 -79
  16. package/dist/access-http-lcm-compaction.d.ts +14 -13
  17. package/dist/access-http-lifecycle-flush.d.ts +14 -13
  18. package/dist/access-http-offline-stream.d.ts +14 -13
  19. package/dist/access-http-query.d.ts +2 -2
  20. package/dist/access-http-query.js +81 -80
  21. package/dist/access-http.d.ts +15 -14
  22. package/dist/access-http.js +100 -97
  23. package/dist/access-identity-continuity-surface.d.ts +11 -11
  24. package/dist/access-identity-continuity-surface.js +79 -78
  25. package/dist/access-lcm-surface.d.ts +14 -13
  26. package/dist/access-lcm-surface.js +79 -78
  27. package/dist/access-mcp-shared-context-tools.d.ts +157 -0
  28. package/dist/access-mcp-shared-context-tools.js +8 -0
  29. package/dist/access-mcp.d.ts +14 -13
  30. package/dist/access-mcp.js +91 -88
  31. package/dist/access-memory-search-fanout.d.ts +2 -2
  32. package/dist/{access-namespace-preflight-CKBumJ8W.d.ts → access-namespace-preflight-ShnAJ9uL.d.ts} +1 -1
  33. package/dist/access-namespace-preflight.d.ts +3 -3
  34. package/dist/access-namespace-preflight.js +79 -78
  35. package/dist/access-observe-transcript.d.ts +11 -11
  36. package/dist/access-observe-write-category.d.ts +17 -1
  37. package/dist/access-observe-write-category.js +21 -4
  38. package/dist/access-observe-write-surface.d.ts +14 -13
  39. package/dist/access-observe-write-surface.js +79 -78
  40. package/dist/access-offline-manifest.d.ts +11 -11
  41. package/dist/access-offline-manifest.js +14 -14
  42. package/dist/access-operations-batch.js +84 -82
  43. package/dist/access-operations.d.ts +14 -13
  44. package/dist/access-operations.js +89 -87
  45. package/dist/access-recall-concurrency.d.ts +14 -13
  46. package/dist/access-recall-concurrency.js +79 -78
  47. package/dist/access-recall-response.d.ts +14 -13
  48. package/dist/access-recall-response.js +79 -78
  49. package/dist/access-recall-surface.d.ts +14 -13
  50. package/dist/access-recall-surface.js +79 -78
  51. package/dist/access-schema.d.ts +117 -114
  52. package/dist/access-schema.js +3 -3
  53. package/dist/{access-service-DJ3qogNt.d.ts → access-service-DjG_e2cM.d.ts} +81 -75
  54. package/dist/access-service-helpers.d.ts +14 -13
  55. package/dist/access-service.d.ts +14 -13
  56. package/dist/access-service.js +79 -78
  57. package/dist/access-surface-catalog.d.ts +14 -13
  58. package/dist/access-surface-catalog.js +81 -80
  59. package/dist/access-surface-catalog.js.map +1 -1
  60. package/dist/access-wearables-meetings-surface.d.ts +4 -4
  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 -10
  66. package/dist/activity/digest.d.ts +1 -1
  67. package/dist/ambient-provenance.d.ts +1 -1
  68. package/dist/artifact-search.d.ts +1 -1
  69. package/dist/{auto-sync-D6BAPIJV.js → auto-sync-QZD4RD6H.js} +14 -10
  70. package/dist/{auto-sync-D6BAPIJV.js.map → auto-sync-QZD4RD6H.js.map} +1 -1
  71. package/dist/background-generation.d.ts +1 -1
  72. package/dist/behavior-learner.d.ts +1 -1
  73. package/dist/behavior-signals.d.ts +1 -1
  74. package/dist/bootstrap.d.ts +11 -11
  75. package/dist/briefing-window.d.ts +2 -2
  76. package/dist/briefing.d.ts +2 -2
  77. package/dist/briefing.js +22 -22
  78. package/dist/buffer-surprise-report.d.ts +1 -1
  79. package/dist/buffer-turn-helpers.d.ts +1 -1
  80. package/dist/buffer.d.ts +2 -2
  81. package/dist/buffer.js +9 -9
  82. package/dist/bulk-import/index.d.ts +3 -3
  83. package/dist/calibration.d.ts +1 -1
  84. package/dist/calibration.js +2 -2
  85. package/dist/capabilities.d.ts +1 -1
  86. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  87. package/dist/{capsule-merge-IPG4IOFP.js → capsule-merge-3MNURAQ3.js} +2 -2
  88. package/dist/{catalog-BHXkBVhg.d.ts → catalog-BhuXaQHx.d.ts} +1 -1
  89. package/dist/causal-behavior.d.ts +1 -1
  90. package/dist/causal-consolidation.d.ts +1 -1
  91. package/dist/causal-consolidation.js +25 -25
  92. package/dist/causal-trajectory-graph.d.ts +1 -1
  93. package/dist/{chunk-M6RORUO5.js → chunk-2EYZ32LH.js} +24 -2
  94. package/dist/{chunk-M6RORUO5.js.map → chunk-2EYZ32LH.js.map} +1 -1
  95. package/dist/{chunk-JAJIMTFB.js → chunk-2PDMIPMP.js} +9 -9
  96. package/dist/{chunk-5LYSEZOF.js → chunk-2UINSKQC.js} +12 -11
  97. package/dist/chunk-2UINSKQC.js.map +1 -0
  98. package/dist/{chunk-6L2II3KS.js → chunk-3D75XIYO.js} +2 -2
  99. package/dist/{chunk-XCPNH2MG.js → chunk-3KJTSCSX.js} +5 -5
  100. package/dist/{chunk-YTZN2UZO.js → chunk-3RLWUW7G.js} +2 -2
  101. package/dist/{chunk-J272ODKJ.js → chunk-42DJ235G.js} +2 -2
  102. package/dist/{chunk-NVVZPBKI.js → chunk-46FVFU7S.js} +2 -2
  103. package/dist/{chunk-JUDT33RX.js → chunk-4AX5OYKC.js} +2 -2
  104. package/dist/{chunk-GSSDHAYH.js → chunk-4IGOLIWM.js} +2 -2
  105. package/dist/{chunk-23HFXQ5J.js → chunk-6EGIQEKC.js} +4 -4
  106. package/dist/{chunk-TVVEYCNW.js → chunk-7K5Q6COX.js} +4 -4
  107. package/dist/{chunk-GO5LOHCD.js → chunk-7L54ARML.js} +2 -2
  108. package/dist/{chunk-TEMKBSV6.js → chunk-7PSRCGWT.js} +3 -3
  109. package/dist/{chunk-ICNJ6J46.js → chunk-AAAFZW3U.js} +2 -2
  110. package/dist/{chunk-K4JKAXMO.js → chunk-AAX22E4K.js} +3 -3
  111. package/dist/{chunk-UZ6JYPJ6.js → chunk-ADARR5KF.js} +232 -171
  112. package/dist/chunk-ADARR5KF.js.map +1 -0
  113. package/dist/{chunk-KY236SP5.js → chunk-AHHFBJX7.js} +3 -3
  114. package/dist/{chunk-TZ44E732.js → chunk-AIVRD66I.js} +2 -2
  115. package/dist/{chunk-OEDW4ER7.js → chunk-AJBWVDRV.js} +2 -1
  116. package/dist/chunk-AJBWVDRV.js.map +1 -0
  117. package/dist/{chunk-YRIFXXMI.js → chunk-AOGICQMH.js} +6 -6
  118. package/dist/{chunk-KOTG3RXE.js → chunk-AUSRUOMQ.js} +2 -2
  119. package/dist/{chunk-C5R73BON.js → chunk-BIANISES.js} +2 -2
  120. package/dist/{chunk-IMBQFHRV.js → chunk-BPXJINHW.js} +8 -8
  121. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  122. package/dist/{chunk-2J3V5QEO.js → chunk-C3QXITIP.js} +4 -4
  123. package/dist/{chunk-2SNCQHJZ.js → chunk-CQ4BTPX6.js} +6 -6
  124. package/dist/{chunk-3QEVOQF5.js → chunk-CTETTVDN.js} +2 -2
  125. package/dist/{chunk-DFVSJFHK.js → chunk-DBB5JPSL.js} +2 -2
  126. package/dist/{chunk-W23JARAQ.js → chunk-DLPMOSNH.js} +2 -2
  127. package/dist/{chunk-BGRTZOJB.js → chunk-DMTSKY4W.js} +8 -8
  128. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  129. package/dist/{chunk-QS5Q5RBV.js → chunk-E4FRR4MA.js} +8 -8
  130. package/dist/{chunk-NETQXOPY.js → chunk-EH3HNCAM.js} +12 -7
  131. package/dist/{chunk-NETQXOPY.js.map → chunk-EH3HNCAM.js.map} +1 -1
  132. package/dist/{chunk-RJQAP333.js → chunk-ETE3SGAH.js} +2 -2
  133. package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
  134. package/dist/{chunk-RLU2Y5GV.js → chunk-F2FJTOV6.js} +4 -4
  135. package/dist/{chunk-V2ZA4YWE.js → chunk-F5H6YG5P.js} +2 -2
  136. package/dist/{chunk-K75A5XWU.js → chunk-F6PTJLEM.js} +4 -4
  137. package/dist/chunk-F6PTJLEM.js.map +1 -0
  138. package/dist/{chunk-4CMXI55L.js → chunk-FSUFKIFS.js} +2 -2
  139. package/dist/{chunk-ZAEPD4C2.js → chunk-G3NTZZWT.js} +2 -2
  140. package/dist/{chunk-ZMWSYUUL.js → chunk-GCBIXUPT.js} +2 -2
  141. package/dist/{chunk-WZYHPAG5.js → chunk-GIM2AGFL.js} +3 -3
  142. package/dist/{chunk-VKWFNPBH.js → chunk-GR76OKET.js} +14 -5
  143. package/dist/{chunk-VKWFNPBH.js.map → chunk-GR76OKET.js.map} +1 -1
  144. package/dist/{chunk-J7FVMLBR.js → chunk-GWEZNCGA.js} +2 -2
  145. package/dist/{chunk-LFVZD5EC.js → chunk-GWNSKQDA.js} +3 -3
  146. package/dist/{chunk-MJC7UKH7.js → chunk-H2N6SLTR.js} +2 -2
  147. package/dist/{chunk-J4WGTN2N.js → chunk-HK44SV6K.js} +4 -4
  148. package/dist/{chunk-JDX2OA4R.js → chunk-HNHIHXSD.js} +2 -2
  149. package/dist/{chunk-IS2IDFJP.js → chunk-HO2P3FAX.js} +22 -22
  150. package/dist/chunk-HO2P3FAX.js.map +1 -0
  151. package/dist/{chunk-VQYWKCDR.js → chunk-HPMCKAET.js} +3 -3
  152. package/dist/{chunk-ROEFLU37.js → chunk-HSJU6JFT.js} +16 -86
  153. package/dist/chunk-HSJU6JFT.js.map +1 -0
  154. package/dist/{chunk-MVG3KXON.js → chunk-I65KB36L.js} +25 -25
  155. package/dist/chunk-IFBSZGW3.js +42 -0
  156. package/dist/chunk-IFBSZGW3.js.map +1 -0
  157. package/dist/{chunk-SFHLQPBF.js → chunk-IUTYNDFS.js} +118 -112
  158. package/dist/chunk-IUTYNDFS.js.map +1 -0
  159. package/dist/{chunk-AEOOGXMQ.js → chunk-J2MGTGKC.js} +4 -4
  160. package/dist/chunk-JATHBCAV.js +94 -0
  161. package/dist/chunk-JATHBCAV.js.map +1 -0
  162. package/dist/{chunk-PKUJNICO.js → chunk-JC2OBYYD.js} +2 -2
  163. package/dist/{chunk-5U7K4W6K.js → chunk-JDOBQPJY.js} +3 -3
  164. package/dist/{chunk-TG3FAM2S.js → chunk-JL4TQYM5.js} +48 -1
  165. package/dist/{chunk-TG3FAM2S.js.map → chunk-JL4TQYM5.js.map} +1 -1
  166. package/dist/{chunk-VQWBUPSJ.js → chunk-JMAP6L6Q.js} +2 -2
  167. package/dist/{chunk-7Z54NXVS.js → chunk-K27INAPR.js} +2 -2
  168. package/dist/{chunk-YTK5MVNF.js → chunk-KCKXOS4Y.js} +14 -13
  169. package/dist/chunk-KCKXOS4Y.js.map +1 -0
  170. package/dist/{chunk-7D6SER6A.js → chunk-KJQ4Y2PY.js} +14 -14
  171. package/dist/{chunk-DAZANIYU.js → chunk-L732NBPR.js} +87 -88
  172. package/dist/{chunk-DAZANIYU.js.map → chunk-L732NBPR.js.map} +1 -1
  173. package/dist/{chunk-QPVNK2VE.js → chunk-LCVYO3ON.js} +2 -2
  174. package/dist/{chunk-HIP6DKJJ.js → chunk-LQVXSRAJ.js} +2 -2
  175. package/dist/{chunk-A7GQBJP5.js → chunk-LVFI5LG7.js} +7 -7
  176. package/dist/{chunk-TO36VPZI.js → chunk-LWF6GOII.js} +2 -2
  177. package/dist/{chunk-62HFZNCJ.js → chunk-N7B6V7SG.js} +13 -12
  178. package/dist/{chunk-62HFZNCJ.js.map → chunk-N7B6V7SG.js.map} +1 -1
  179. package/dist/{chunk-ES5BUPYB.js → chunk-OCWFKD5Q.js} +2 -2
  180. package/dist/{chunk-IOPIGX7Y.js → chunk-OP722LOG.js} +2 -2
  181. package/dist/{chunk-62D2PAAM.js → chunk-PAAJWQH5.js} +4 -4
  182. package/dist/{chunk-V6EGNVUT.js → chunk-PIWFNPQT.js} +4 -4
  183. package/dist/{chunk-JOP7W24J.js → chunk-PLJ2MQFT.js} +4 -4
  184. package/dist/{chunk-37CAEC7E.js → chunk-PWPIERBM.js} +4 -4
  185. package/dist/{chunk-BXIJSPCL.js → chunk-Q62GA5U2.js} +2 -2
  186. package/dist/{chunk-CC37E3QM.js → chunk-QKCXRS5A.js} +16 -1
  187. package/dist/chunk-QKCXRS5A.js.map +1 -0
  188. package/dist/{chunk-I3H5LFOI.js → chunk-QNJQCLI6.js} +4 -4
  189. package/dist/{chunk-BYQX4IOG.js → chunk-R45VFSEV.js} +2 -2
  190. package/dist/{chunk-XVDZFTN5.js → chunk-RFIJH2OE.js} +5 -5
  191. package/dist/{chunk-K4A6UVPB.js → chunk-RJ7Z7YXK.js} +11 -11
  192. package/dist/{chunk-ZZCR2QYL.js → chunk-RSSLDMFX.js} +2 -2
  193. package/dist/{chunk-ZZCR2QYL.js.map → chunk-RSSLDMFX.js.map} +1 -1
  194. package/dist/{chunk-QE6YVNP5.js → chunk-RTXHUVOD.js} +53 -19
  195. package/dist/chunk-RTXHUVOD.js.map +1 -0
  196. package/dist/{chunk-HJUP3K6L.js → chunk-RXYO6NA6.js} +2 -2
  197. package/dist/{chunk-TBXAY2SS.js → chunk-SGHGCFVV.js} +5 -5
  198. package/dist/{chunk-THTF2W7M.js → chunk-TRTLWUDD.js} +19 -18
  199. package/dist/chunk-TRTLWUDD.js.map +1 -0
  200. package/dist/{chunk-2SKMZUOW.js → chunk-U26LB4WA.js} +7 -7
  201. package/dist/{chunk-6P4REYKL.js → chunk-UDAUULK2.js} +28 -2
  202. package/dist/{chunk-6P4REYKL.js.map → chunk-UDAUULK2.js.map} +1 -1
  203. package/dist/{chunk-KTOXQMW3.js → chunk-UHSOPTNB.js} +14 -4
  204. package/dist/chunk-UHSOPTNB.js.map +1 -0
  205. package/dist/{chunk-VHKXRYQN.js → chunk-VBK6SRNE.js} +2 -2
  206. package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
  207. package/dist/{chunk-Z4GUX2M6.js → chunk-VSN2DMQK.js} +2 -2
  208. package/dist/{chunk-ZHXSOMYH.js → chunk-VVX5PZFS.js} +2 -2
  209. package/dist/{chunk-G2XZFGYN.js → chunk-WGZHSQDV.js} +4 -4
  210. package/dist/{chunk-H3TKENU4.js → chunk-WIKO4SCR.js} +5 -5
  211. package/dist/{chunk-MDIEES23.js → chunk-WN2OXGGH.js} +1 -1
  212. package/dist/chunk-WN2OXGGH.js.map +1 -0
  213. package/dist/{chunk-LKFVVN7R.js → chunk-WNPRRBOE.js} +2 -2
  214. package/dist/{chunk-SV4Z2S67.js → chunk-WUUGE7QC.js} +54 -21
  215. package/dist/chunk-WUUGE7QC.js.map +1 -0
  216. package/dist/{chunk-ZZUVBZL2.js → chunk-X2QPKLPL.js} +2 -2
  217. package/dist/{chunk-RDLPFM7I.js → chunk-XJLTQTAO.js} +2 -2
  218. package/dist/{chunk-ZRMMXWYI.js → chunk-YR5QT4SR.js} +32 -9
  219. package/dist/chunk-YR5QT4SR.js.map +1 -0
  220. package/dist/{chunk-CARRTDKC.js → chunk-Z22M4JCY.js} +4 -3
  221. package/dist/chunk-Z22M4JCY.js.map +1 -0
  222. package/dist/{chunk-XM46Y66S.js → chunk-ZFU6QNRN.js} +7 -7
  223. package/dist/{chunk-SUEOG2S4.js → chunk-ZGXHTV5Y.js} +2 -2
  224. package/dist/{chunk-ZX3AYNNV.js → chunk-ZOGKZ2XT.js} +3 -2
  225. package/dist/chunk-ZOGKZ2XT.js.map +1 -0
  226. package/dist/{chunk-46Z3VGWF.js → chunk-ZYRAY5FL.js} +3 -3
  227. package/dist/{chunk-3XPN7AVY.js → chunk-ZYSOT6HD.js} +2 -2
  228. package/dist/{cli-BWri5-am.d.ts → cli-Cx9s_VRn.d.ts} +5 -5
  229. package/dist/cli.d.ts +16 -15
  230. package/dist/cli.js +129 -127
  231. package/dist/coding/export-okf-codegraph.d.ts +1 -1
  232. package/dist/coding/export-okf-codegraph.js +22 -22
  233. package/dist/coding/pre-action-gate.d.ts +1 -1
  234. package/dist/compounding/engine.d.ts +2 -2
  235. package/dist/compounding/engine.js +24 -24
  236. package/dist/compounding/preference-consolidator.d.ts +1 -1
  237. package/dist/compression-optimizer.d.ts +1 -1
  238. package/dist/config.d.ts +1 -1
  239. package/dist/config.js +10 -10
  240. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  241. package/dist/connectors/codex-materialize-runner.js +24 -24
  242. package/dist/connectors/codex-materialize.d.ts +1 -1
  243. package/dist/connectors/codex-materialize.js +2 -2
  244. package/dist/connectors/index.d.ts +1 -1
  245. package/dist/connectors/index.js +25 -25
  246. package/dist/consolidation-provenance-check.d.ts +2 -2
  247. package/dist/consolidation-undo.d.ts +2 -2
  248. package/dist/contradiction/index.d.ts +4 -4
  249. package/dist/contradiction/index.js +7 -7
  250. package/dist/{contradiction-scan-BSGKZHYJ.js → contradiction-scan-GVD4JJ7B.js} +4 -4
  251. package/dist/converge-config.d.ts +1 -1
  252. package/dist/convergence-refresh.d.ts +2 -2
  253. package/dist/convergence-refresh.js +26 -26
  254. package/dist/conversation-index/backend.d.ts +1 -1
  255. package/dist/conversation-index/chunker.d.ts +1 -1
  256. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  257. package/dist/conversation-index/indexer.d.ts +1 -1
  258. package/dist/conversation-index/search.d.ts +1 -1
  259. package/dist/corpus-watermark.d.ts +1 -1
  260. package/dist/corpus-watermark.js +25 -25
  261. package/dist/cross-lingual-recall.d.ts +1 -1
  262. package/dist/dashboard-runtime.js +2 -2
  263. package/dist/day-summary.d.ts +1 -1
  264. package/dist/deep-recall-config.d.ts +12 -1
  265. package/dist/deep-recall-config.js +5 -3
  266. package/dist/deep-recall-http-glue.d.ts +17 -14
  267. package/dist/deep-recall-http-glue.js +7 -4
  268. package/dist/deep-recall-mcp-tools.d.ts +14 -13
  269. package/dist/deep-recall-policy-llm.d.ts +12 -2
  270. package/dist/deep-recall-policy-llm.js +3 -3
  271. package/dist/deep-recall-seeds.d.ts +4 -1
  272. package/dist/deep-recall-seeds.js +1 -1
  273. package/dist/deep-recall.d.ts +12 -1
  274. package/dist/deep-recall.js +3 -2
  275. package/dist/delinearize.d.ts +1 -1
  276. package/dist/dependency-propagation-config.d.ts +1 -1
  277. package/dist/{dependency-propagation-delivery-ueZlKTQB.d.ts → dependency-propagation-delivery-C2QFQ97b.d.ts} +1 -1
  278. package/dist/direct-answer-wiring.d.ts +1 -1
  279. package/dist/direct-answer.d.ts +1 -1
  280. package/dist/embedding-fallback.d.ts +1 -1
  281. package/dist/enrichment/index.d.ts +1 -1
  282. package/dist/entity-origin-fields.d.ts +1 -1
  283. package/dist/entity-retrieval.d.ts +2 -2
  284. package/dist/entity-retrieval.js +23 -23
  285. package/dist/entity-schema.d.ts +1 -1
  286. package/dist/episodic-context.d.ts +1 -1
  287. package/dist/eval-trajectory-contracts.d.ts +1 -1
  288. package/dist/eval-trajectory-store.d.ts +1 -1
  289. package/dist/eval-trajectory.d.ts +1 -1
  290. package/dist/explicit-capture.d.ts +11 -11
  291. package/dist/explicit-capture.js +6 -6
  292. package/dist/external-wiki-access.d.ts +14 -13
  293. package/dist/external-wiki-access.js +80 -79
  294. package/dist/external-wiki-collection-registration.d.ts +1 -1
  295. package/dist/external-wiki-collection.d.ts +1 -1
  296. package/dist/external-wiki-mcp-tools.d.ts +14 -13
  297. package/dist/extraction-error-classification.d.ts +1 -1
  298. package/dist/extraction-faithfulness.d.ts +2 -2
  299. package/dist/extraction-faithfulness.js +3 -3
  300. package/dist/extraction-judge-telemetry.d.ts +2 -2
  301. package/dist/extraction-judge-training.d.ts +2 -2
  302. package/dist/extraction-judge.d.ts +2 -2
  303. package/dist/extraction-judge.js +3 -3
  304. package/dist/extraction-liveness.d.ts +1 -1
  305. package/dist/extraction-normalization.d.ts +1 -1
  306. package/dist/extraction-prompt.d.ts +1 -1
  307. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  308. package/dist/extraction-source-grounding.d.ts +1 -1
  309. package/dist/extraction-span-config.d.ts +1 -1
  310. package/dist/extraction-span-materialize.d.ts +1 -1
  311. package/dist/extraction.d.ts +2 -2
  312. package/dist/extraction.js +38 -38
  313. package/dist/fallback-llm-codex-subscription.d.ts +15 -5
  314. package/dist/fallback-llm-codex-subscription.js +3 -1
  315. package/dist/fallback-llm.d.ts +1 -1
  316. package/dist/fallback-llm.js +2 -2
  317. package/dist/{first-start-migration-ZWMV5CX4.js → first-start-migration-L3UFX5CU.js} +4 -4
  318. package/dist/{generic-recall-paths-CpyVmA88.d.ts → generic-recall-paths-CeKQsQEn.d.ts} +1 -1
  319. package/dist/graph-append-error.d.ts +1 -1
  320. package/dist/graph-dashboard-diff.d.ts +1 -1
  321. package/dist/graph-dashboard-key.d.ts +1 -1
  322. package/dist/graph-dashboard-parser.d.ts +1 -1
  323. package/dist/graph-edge-reinforcement.d.ts +1 -1
  324. package/dist/graph-jsonl.d.ts +1 -1
  325. package/dist/graph-path-reconstruction.d.ts +1 -1
  326. package/dist/graph-path-scoring.d.ts +1 -1
  327. package/dist/graph-snapshot.d.ts +1 -1
  328. package/dist/graph.d.ts +1 -1
  329. package/dist/harmonic-retrieval.js +3 -3
  330. package/dist/importance.d.ts +1 -1
  331. package/dist/importers/index.d.ts +1 -1
  332. package/dist/importers/test-utils.d.ts +1 -1
  333. package/dist/in-flight-reads.d.ts +1 -1
  334. package/dist/{index-BvUA4S7M.d.ts → index-Bau-Wl0H.d.ts} +3 -3
  335. package/dist/index.d.ts +703 -702
  336. package/dist/index.js +331 -327
  337. package/dist/intent.d.ts +1 -1
  338. package/dist/lcm/engine.d.ts +1 -1
  339. package/dist/lcm/engine.js +3 -3
  340. package/dist/lcm/index.d.ts +1 -1
  341. package/dist/lcm/index.js +8 -8
  342. package/dist/lcm/tools.d.ts +1 -1
  343. package/dist/lifecycle.d.ts +1 -1
  344. package/dist/live-connectors-runner.d.ts +1 -1
  345. package/dist/{local-llm-BsJGulur.d.ts → local-llm-Bj-m01Ro.d.ts} +1 -1
  346. package/dist/local-llm-helpers.d.ts +2 -2
  347. package/dist/local-llm.d.ts +2 -2
  348. package/dist/local-llm.js +2 -2
  349. package/dist/local-model-endpoint.d.ts +1 -1
  350. package/dist/location/index.d.ts +6 -209
  351. package/dist/location/index.js +77 -71
  352. package/dist/maintenance/memory-governance.d.ts +1 -1
  353. package/dist/maintenance/memory-governance.js +23 -23
  354. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  355. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +23 -23
  356. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  357. package/dist/maintenance/rebuild-memory-projection.js +25 -25
  358. package/dist/{maintenance-CYubtIRr.d.ts → maintenance-Ye-y-c7f.d.ts} +7 -6
  359. package/dist/mcp-memory-inspector-app.d.ts +14 -13
  360. package/dist/memory-action-policy.d.ts +1 -1
  361. package/dist/memory-cache.d.ts +1 -1
  362. package/dist/memory-controller.d.ts +1 -1
  363. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  364. package/dist/memory-projection-store.d.ts +1 -1
  365. package/dist/memory-provenance.d.ts +1 -1
  366. package/dist/memory-snapshot.d.ts +1 -1
  367. package/dist/memory-subject-cli.d.ts +14 -13
  368. package/dist/memory-subject.d.ts +14 -13
  369. package/dist/memory-worth-outcomes.d.ts +2 -2
  370. package/dist/models-json.d.ts +1 -1
  371. package/dist/namespaces/migrate.d.ts +3 -3
  372. package/dist/namespaces/migrate.js +23 -23
  373. package/dist/namespaces/principal.d.ts +1 -1
  374. package/dist/namespaces/search.d.ts +1 -1
  375. package/dist/namespaces/search.js +3 -3
  376. package/dist/namespaces/storage.d.ts +3 -3
  377. package/dist/namespaces/storage.js +22 -22
  378. package/dist/native-knowledge.d.ts +1 -1
  379. package/dist/offline-sync-impression-drain.d.ts +1 -1
  380. package/dist/offline-sync-impression-drain.js +5 -5
  381. package/dist/operator-doctor-corpus.d.ts +1 -1
  382. package/dist/operator-doctor-corpus.js +26 -26
  383. package/dist/operator-doctor-replica.d.ts +1 -1
  384. package/dist/operator-toolkit.d.ts +3 -3
  385. package/dist/operator-toolkit.js +44 -44
  386. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  387. package/dist/orchestration/maintenance.d.ts +4 -4
  388. package/dist/orchestration/maintenance.js +39 -39
  389. package/dist/{orchestrator-BWDRJ_0d.d.ts → orchestrator-fFDDYUUV.d.ts} +20 -10
  390. package/dist/orchestrator.d.ts +11 -11
  391. package/dist/orchestrator.js +170 -168
  392. package/dist/patterns-cli.d.ts +1 -1
  393. package/dist/{pipeline-7JMn2yMH.d.ts → pipeline-D_j5n_Ih.d.ts} +1 -1
  394. package/dist/policy-runtime.d.ts +1 -1
  395. package/dist/proactive-contention.d.ts +2 -2
  396. package/dist/provenance.d.ts +1 -1
  397. package/dist/{public-http-CJWs3mo9.d.ts → public-http-CjiSqxUx.d.ts} +1 -1
  398. package/dist/{qmd-CxCH9G9m.d.ts → qmd-CnxVjKrv.d.ts} +1 -1
  399. package/dist/qmd-preflight.d.ts +2 -2
  400. package/dist/qmd-recall-cache.d.ts +1 -1
  401. package/dist/qmd.d.ts +2 -2
  402. package/dist/recall-concurrency-config.d.ts +1 -1
  403. package/dist/recall-disclosure-escalation.d.ts +1 -1
  404. package/dist/recall-explain-renderer.d.ts +1 -1
  405. package/dist/recall-explain-renderer.js +3 -3
  406. package/dist/recall-memory-map.d.ts +1 -1
  407. package/dist/recall-navigate-access.d.ts +1 -1
  408. package/dist/recall-navigate-access.js +2 -2
  409. package/dist/recall-navigate-disclosure.d.ts +1 -1
  410. package/dist/recall-navigate-disclosure.js +1 -1
  411. package/dist/recall-navigate.d.ts +1 -1
  412. package/dist/recall-navigate.js +2 -2
  413. package/dist/recall-planner-llm.d.ts +1 -1
  414. package/dist/recall-planner-llm.js +2 -2
  415. package/dist/recall-state-view-admission.d.ts +2 -2
  416. package/dist/recall-state-view-admission.js +8 -8
  417. package/dist/recall-state-view-anchors.d.ts +1 -1
  418. package/dist/recall-state-view-anchors.js +2 -2
  419. package/dist/recall-state-view-inject.js +2 -2
  420. package/dist/recall-state-view-render.js +2 -2
  421. package/dist/recall-state-view-widen.js +2 -2
  422. package/dist/recall-state-view-wire.js +3 -3
  423. package/dist/recall-state-view.d.ts +9 -1
  424. package/dist/recall-state-view.js +5 -3
  425. package/dist/recall-state.d.ts +1 -1
  426. package/dist/recall-tag-filter.d.ts +1 -1
  427. package/dist/recall-timings.d.ts +1 -1
  428. package/dist/recall-xray-cli.d.ts +1 -1
  429. package/dist/recall-xray-cli.js +4 -4
  430. package/dist/recall-xray-renderer.d.ts +1 -1
  431. package/dist/recall-xray-renderer.js +3 -3
  432. package/dist/recall-xray.d.ts +1 -1
  433. package/dist/recall-xray.js +2 -2
  434. package/dist/reconcile/cursor.d.ts +1 -1
  435. package/dist/reconcile/cursor.js +2 -2
  436. package/dist/reconcile/manifest.d.ts +1 -1
  437. package/dist/reconcile/manifest.js +4 -4
  438. package/dist/reconcile/plan.d.ts +1 -1
  439. package/dist/reconcile/plan.js +2 -2
  440. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  441. package/dist/replay/normalizers/claude.d.ts +1 -1
  442. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  443. package/dist/replay/normalizers/shared.d.ts +1 -1
  444. package/dist/replay/runner.d.ts +1 -1
  445. package/dist/replay/types.d.ts +1 -1
  446. package/dist/replica-divergence.d.ts +1 -1
  447. package/dist/replica-peers-config.d.ts +1 -1
  448. package/dist/{resolution-4GG3QZRJ.js → resolution-LXFQQ4AE.js} +8 -8
  449. package/dist/resolution-LXFQQ4AE.js.map +1 -0
  450. package/dist/resolve-auth-token.d.ts +1 -1
  451. package/dist/resume-bundles.js +12 -12
  452. package/dist/retrieval-agents.d.ts +2 -2
  453. package/dist/retrieval-tiers.d.ts +1 -1
  454. package/dist/routing/engine.d.ts +1 -1
  455. package/dist/routing/store.d.ts +1 -1
  456. package/dist/salvage-envelope.d.ts +1 -1
  457. package/dist/schemas.d.ts +160 -160
  458. package/dist/{scope-profiles-BGAUqhBR.d.ts → scope-profiles-BajH5zAT.d.ts} +1 -1
  459. package/dist/search/embed-helper.d.ts +1 -1
  460. package/dist/search/factory.d.ts +1 -1
  461. package/dist/search/factory.js +2 -2
  462. package/dist/search/index.d.ts +1 -1
  463. package/dist/search/index.js +4 -4
  464. package/dist/search/lancedb-backend.d.ts +1 -1
  465. package/dist/search/meilisearch-backend.d.ts +1 -1
  466. package/dist/search/noop-backend.d.ts +1 -1
  467. package/dist/search/orama-backend.d.ts +1 -1
  468. package/dist/search/port.d.ts +1 -1
  469. package/dist/search/remote-backend.d.ts +1 -1
  470. package/dist/{semantic-consolidation-CCeRD9pV.d.ts → semantic-consolidation-Bu6d3O7R.d.ts} +1 -1
  471. package/dist/semantic-consolidation.d.ts +2 -2
  472. package/dist/semantic-consolidation.js +25 -25
  473. package/dist/semantic-rule-promotion.js +22 -22
  474. package/dist/semantic-rule-verifier.d.ts +1 -1
  475. package/dist/semantic-rule-verifier.js +22 -22
  476. package/dist/{service-BwpzRduk.d.ts → service-ChFwWtLS.d.ts} +13 -2
  477. package/dist/session-observer-bands.d.ts +1 -1
  478. package/dist/session-observer-state.d.ts +1 -1
  479. package/dist/shared-context/manager.d.ts +7 -7
  480. package/dist/shared-context/manager.js +2 -2
  481. package/dist/shared-context/write-output-controls.d.ts +34 -0
  482. package/dist/shared-context/write-output-controls.js +10 -0
  483. package/dist/shared-context/write-output-controls.js.map +1 -0
  484. package/dist/signal.d.ts +1 -1
  485. package/dist/source-agent-qualifier.d.ts +1 -1
  486. package/dist/source-agent-qualifier.js +33 -33
  487. package/dist/source-attribution.d.ts +23 -1
  488. package/dist/source-attribution.js +13 -3
  489. package/dist/standup/build.js +23 -23
  490. package/dist/{storage-BprAGBG0.d.ts → storage-BDKQdsmB.d.ts} +1 -1
  491. package/dist/storage.d.ts +2 -2
  492. package/dist/storage.js +21 -21
  493. package/dist/subject-config.d.ts +1 -1
  494. package/dist/subject-config.js +2 -2
  495. package/dist/summarizer.d.ts +1 -1
  496. package/dist/summarizer.js +6 -6
  497. package/dist/summary-snapshot.d.ts +1 -1
  498. package/dist/support-passport/index.d.ts +17 -16
  499. package/dist/support-passport/index.js +82 -81
  500. package/dist/tagging-CwK6um2q.d.ts +240 -0
  501. package/dist/temporal-supersession.d.ts +2 -2
  502. package/dist/temporal-timeline-recall.d.ts +1 -1
  503. package/dist/temporal-validity.d.ts +1 -1
  504. package/dist/threading.d.ts +1 -1
  505. package/dist/tier-migration.d.ts +2 -2
  506. package/dist/tier-routing.d.ts +1 -1
  507. package/dist/tier-routing.js +3 -3
  508. package/dist/{tier-stats-LUSUUNU6.js → tier-stats-VK5PCO2L.js} +4 -4
  509. package/dist/topics.d.ts +1 -1
  510. package/dist/transcript.d.ts +1 -1
  511. package/dist/transfer/backup.js +2 -2
  512. package/dist/transfer/capsule-export.js +2 -2
  513. package/dist/transfer/capsule-import.js +3 -3
  514. package/dist/transfer/export-okf.d.ts +1 -1
  515. package/dist/transfer/export-okf.js +22 -22
  516. package/dist/transfer/types.d.ts +78 -78
  517. package/dist/trust-score-stage.d.ts +1 -1
  518. package/dist/trust-score.d.ts +1 -1
  519. package/dist/{types-nJV23pa3.d.ts → types-B65IoepH.d.ts} +6 -1
  520. package/dist/types.d.ts +1 -1
  521. package/dist/types.js +1 -1
  522. package/dist/utility-runtime.d.ts +1 -1
  523. package/dist/verified-recall.js +22 -22
  524. package/dist/who-knows-cli.d.ts +14 -13
  525. package/dist/who-knows-cli.js +23 -23
  526. package/dist/who-knows.d.ts +14 -13
  527. package/dist/who-knows.js +22 -22
  528. package/dist/write-envelope.d.ts +1 -1
  529. package/package.json +12 -2
  530. package/src/access-http.test.ts +1 -0
  531. package/src/access-http.ts +1 -1
  532. package/src/access-mcp-shared-context-tools.ts +103 -0
  533. package/src/access-mcp.ts +7 -80
  534. package/src/access-observe-write-category.ts +1 -0
  535. package/src/access-observe-write-surface.ts +3 -3
  536. package/src/access-operations-batch.ts +47 -4
  537. package/src/access-schema.ts +1 -0
  538. package/src/access-service.ts +18 -12
  539. package/src/activity/timeline/regenerate.test.ts +48 -0
  540. package/src/activity/timeline/regenerate.ts +7 -5
  541. package/src/cli/deep-recall-commands.ts +22 -10
  542. package/src/config.ts +5 -0
  543. package/src/dedup/merge.test.ts +283 -0
  544. package/src/deep-recall-boundary.test.ts +66 -0
  545. package/src/deep-recall-cli.test.ts +82 -0
  546. package/src/deep-recall-config.test.ts +56 -0
  547. package/src/deep-recall-config.ts +32 -0
  548. package/src/deep-recall-http-glue.ts +10 -10
  549. package/src/deep-recall-policy-llm.test.ts +242 -0
  550. package/src/deep-recall-policy-llm.ts +37 -7
  551. package/src/deep-recall-seeds.test.ts +53 -0
  552. package/src/deep-recall-seeds.ts +7 -1
  553. package/src/deep-recall-surface.test.ts +93 -0
  554. package/src/deep-recall.test.ts +121 -0
  555. package/src/deep-recall.ts +88 -28
  556. package/src/fallback-llm-codex-subscription.ts +27 -5
  557. package/src/fallback-llm.test.ts +120 -0
  558. package/src/fallback-llm.ts +17 -16
  559. package/src/location/phase5-wiring.test.ts +408 -0
  560. package/src/location/tagging.ts +58 -0
  561. package/src/meetings/config.test.ts +58 -0
  562. package/src/orchestration/extraction-persist.ts +1 -1
  563. package/src/orchestration/orchestrator-helpers.ts +2 -0
  564. package/src/orchestration/recall-entry.ts +15 -1
  565. package/src/orchestration/recall-internal.ts +1 -0
  566. package/src/orchestration/recall-section-coordinator.ts +65 -28
  567. package/src/orchestration/recall-state-view-pipeline.test.ts +8 -2
  568. package/src/orchestration/semantic-merge-commit-effects.ts +45 -16
  569. package/src/orchestration/semantic-merge-persist.ts +23 -36
  570. package/src/orchestration/workspace-ops.ts +14 -0
  571. package/src/providers/codex-subscription.test.ts +127 -0
  572. package/src/providers/codex-subscription.ts +1 -1
  573. package/src/recall-state-view-budget.test.ts +424 -0
  574. package/src/recall-state-view.ts +30 -16
  575. package/src/shared-context/envelope-io.ts +25 -0
  576. package/src/shared-context/envelope-wiring.test.ts +4 -2
  577. package/src/shared-context/manager.ts +1 -0
  578. package/src/shared-context/write-output-controls.test.ts +192 -0
  579. package/src/shared-context/write-output-controls.ts +72 -0
  580. package/src/source-attribution.test.ts +39 -0
  581. package/src/source-attribution.ts +72 -0
  582. package/src/types.ts +5 -0
  583. package/src/wearables/pipeline.ts +19 -0
  584. package/src/wearables/service.ts +8 -0
  585. package/dist/chunk-5LYSEZOF.js.map +0 -1
  586. package/dist/chunk-CARRTDKC.js.map +0 -1
  587. package/dist/chunk-CC37E3QM.js.map +0 -1
  588. package/dist/chunk-IS2IDFJP.js.map +0 -1
  589. package/dist/chunk-K75A5XWU.js.map +0 -1
  590. package/dist/chunk-KTOXQMW3.js.map +0 -1
  591. package/dist/chunk-MDIEES23.js.map +0 -1
  592. package/dist/chunk-OEDW4ER7.js.map +0 -1
  593. package/dist/chunk-QE6YVNP5.js.map +0 -1
  594. package/dist/chunk-ROEFLU37.js.map +0 -1
  595. package/dist/chunk-SFHLQPBF.js.map +0 -1
  596. package/dist/chunk-SV4Z2S67.js.map +0 -1
  597. package/dist/chunk-THTF2W7M.js.map +0 -1
  598. package/dist/chunk-UZ6JYPJ6.js.map +0 -1
  599. package/dist/chunk-YTK5MVNF.js.map +0 -1
  600. package/dist/chunk-ZRMMXWYI.js.map +0 -1
  601. package/dist/chunk-ZX3AYNNV.js.map +0 -1
  602. /package/dist/{capsule-crypto-7FJQINUR.js.map → access-mcp-shared-context-tools.js.map} +0 -0
  603. /package/dist/{contradiction-scan-BSGKZHYJ.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  604. /package/dist/{capsule-merge-IPG4IOFP.js.map → capsule-merge-3MNURAQ3.js.map} +0 -0
  605. /package/dist/{chunk-JAJIMTFB.js.map → chunk-2PDMIPMP.js.map} +0 -0
  606. /package/dist/{chunk-6L2II3KS.js.map → chunk-3D75XIYO.js.map} +0 -0
  607. /package/dist/{chunk-XCPNH2MG.js.map → chunk-3KJTSCSX.js.map} +0 -0
  608. /package/dist/{chunk-YTZN2UZO.js.map → chunk-3RLWUW7G.js.map} +0 -0
  609. /package/dist/{chunk-J272ODKJ.js.map → chunk-42DJ235G.js.map} +0 -0
  610. /package/dist/{chunk-NVVZPBKI.js.map → chunk-46FVFU7S.js.map} +0 -0
  611. /package/dist/{chunk-JUDT33RX.js.map → chunk-4AX5OYKC.js.map} +0 -0
  612. /package/dist/{chunk-GSSDHAYH.js.map → chunk-4IGOLIWM.js.map} +0 -0
  613. /package/dist/{chunk-23HFXQ5J.js.map → chunk-6EGIQEKC.js.map} +0 -0
  614. /package/dist/{chunk-TVVEYCNW.js.map → chunk-7K5Q6COX.js.map} +0 -0
  615. /package/dist/{chunk-GO5LOHCD.js.map → chunk-7L54ARML.js.map} +0 -0
  616. /package/dist/{chunk-TEMKBSV6.js.map → chunk-7PSRCGWT.js.map} +0 -0
  617. /package/dist/{chunk-ICNJ6J46.js.map → chunk-AAAFZW3U.js.map} +0 -0
  618. /package/dist/{chunk-K4JKAXMO.js.map → chunk-AAX22E4K.js.map} +0 -0
  619. /package/dist/{chunk-KY236SP5.js.map → chunk-AHHFBJX7.js.map} +0 -0
  620. /package/dist/{chunk-TZ44E732.js.map → chunk-AIVRD66I.js.map} +0 -0
  621. /package/dist/{chunk-YRIFXXMI.js.map → chunk-AOGICQMH.js.map} +0 -0
  622. /package/dist/{chunk-KOTG3RXE.js.map → chunk-AUSRUOMQ.js.map} +0 -0
  623. /package/dist/{chunk-C5R73BON.js.map → chunk-BIANISES.js.map} +0 -0
  624. /package/dist/{chunk-IMBQFHRV.js.map → chunk-BPXJINHW.js.map} +0 -0
  625. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  626. /package/dist/{chunk-2J3V5QEO.js.map → chunk-C3QXITIP.js.map} +0 -0
  627. /package/dist/{chunk-2SNCQHJZ.js.map → chunk-CQ4BTPX6.js.map} +0 -0
  628. /package/dist/{chunk-3QEVOQF5.js.map → chunk-CTETTVDN.js.map} +0 -0
  629. /package/dist/{chunk-DFVSJFHK.js.map → chunk-DBB5JPSL.js.map} +0 -0
  630. /package/dist/{chunk-W23JARAQ.js.map → chunk-DLPMOSNH.js.map} +0 -0
  631. /package/dist/{chunk-BGRTZOJB.js.map → chunk-DMTSKY4W.js.map} +0 -0
  632. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  633. /package/dist/{chunk-QS5Q5RBV.js.map → chunk-E4FRR4MA.js.map} +0 -0
  634. /package/dist/{chunk-RJQAP333.js.map → chunk-ETE3SGAH.js.map} +0 -0
  635. /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
  636. /package/dist/{chunk-RLU2Y5GV.js.map → chunk-F2FJTOV6.js.map} +0 -0
  637. /package/dist/{chunk-V2ZA4YWE.js.map → chunk-F5H6YG5P.js.map} +0 -0
  638. /package/dist/{chunk-4CMXI55L.js.map → chunk-FSUFKIFS.js.map} +0 -0
  639. /package/dist/{chunk-ZAEPD4C2.js.map → chunk-G3NTZZWT.js.map} +0 -0
  640. /package/dist/{chunk-ZMWSYUUL.js.map → chunk-GCBIXUPT.js.map} +0 -0
  641. /package/dist/{chunk-WZYHPAG5.js.map → chunk-GIM2AGFL.js.map} +0 -0
  642. /package/dist/{chunk-J7FVMLBR.js.map → chunk-GWEZNCGA.js.map} +0 -0
  643. /package/dist/{chunk-LFVZD5EC.js.map → chunk-GWNSKQDA.js.map} +0 -0
  644. /package/dist/{chunk-MJC7UKH7.js.map → chunk-H2N6SLTR.js.map} +0 -0
  645. /package/dist/{chunk-J4WGTN2N.js.map → chunk-HK44SV6K.js.map} +0 -0
  646. /package/dist/{chunk-JDX2OA4R.js.map → chunk-HNHIHXSD.js.map} +0 -0
  647. /package/dist/{chunk-VQYWKCDR.js.map → chunk-HPMCKAET.js.map} +0 -0
  648. /package/dist/{chunk-MVG3KXON.js.map → chunk-I65KB36L.js.map} +0 -0
  649. /package/dist/{chunk-AEOOGXMQ.js.map → chunk-J2MGTGKC.js.map} +0 -0
  650. /package/dist/{chunk-PKUJNICO.js.map → chunk-JC2OBYYD.js.map} +0 -0
  651. /package/dist/{chunk-5U7K4W6K.js.map → chunk-JDOBQPJY.js.map} +0 -0
  652. /package/dist/{chunk-VQWBUPSJ.js.map → chunk-JMAP6L6Q.js.map} +0 -0
  653. /package/dist/{chunk-7Z54NXVS.js.map → chunk-K27INAPR.js.map} +0 -0
  654. /package/dist/{chunk-7D6SER6A.js.map → chunk-KJQ4Y2PY.js.map} +0 -0
  655. /package/dist/{chunk-QPVNK2VE.js.map → chunk-LCVYO3ON.js.map} +0 -0
  656. /package/dist/{chunk-HIP6DKJJ.js.map → chunk-LQVXSRAJ.js.map} +0 -0
  657. /package/dist/{chunk-A7GQBJP5.js.map → chunk-LVFI5LG7.js.map} +0 -0
  658. /package/dist/{chunk-TO36VPZI.js.map → chunk-LWF6GOII.js.map} +0 -0
  659. /package/dist/{chunk-ES5BUPYB.js.map → chunk-OCWFKD5Q.js.map} +0 -0
  660. /package/dist/{chunk-IOPIGX7Y.js.map → chunk-OP722LOG.js.map} +0 -0
  661. /package/dist/{chunk-62D2PAAM.js.map → chunk-PAAJWQH5.js.map} +0 -0
  662. /package/dist/{chunk-V6EGNVUT.js.map → chunk-PIWFNPQT.js.map} +0 -0
  663. /package/dist/{chunk-JOP7W24J.js.map → chunk-PLJ2MQFT.js.map} +0 -0
  664. /package/dist/{chunk-37CAEC7E.js.map → chunk-PWPIERBM.js.map} +0 -0
  665. /package/dist/{chunk-BXIJSPCL.js.map → chunk-Q62GA5U2.js.map} +0 -0
  666. /package/dist/{chunk-I3H5LFOI.js.map → chunk-QNJQCLI6.js.map} +0 -0
  667. /package/dist/{chunk-BYQX4IOG.js.map → chunk-R45VFSEV.js.map} +0 -0
  668. /package/dist/{chunk-XVDZFTN5.js.map → chunk-RFIJH2OE.js.map} +0 -0
  669. /package/dist/{chunk-K4A6UVPB.js.map → chunk-RJ7Z7YXK.js.map} +0 -0
  670. /package/dist/{chunk-HJUP3K6L.js.map → chunk-RXYO6NA6.js.map} +0 -0
  671. /package/dist/{chunk-TBXAY2SS.js.map → chunk-SGHGCFVV.js.map} +0 -0
  672. /package/dist/{chunk-2SKMZUOW.js.map → chunk-U26LB4WA.js.map} +0 -0
  673. /package/dist/{chunk-VHKXRYQN.js.map → chunk-VBK6SRNE.js.map} +0 -0
  674. /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
  675. /package/dist/{chunk-Z4GUX2M6.js.map → chunk-VSN2DMQK.js.map} +0 -0
  676. /package/dist/{chunk-ZHXSOMYH.js.map → chunk-VVX5PZFS.js.map} +0 -0
  677. /package/dist/{chunk-G2XZFGYN.js.map → chunk-WGZHSQDV.js.map} +0 -0
  678. /package/dist/{chunk-H3TKENU4.js.map → chunk-WIKO4SCR.js.map} +0 -0
  679. /package/dist/{chunk-LKFVVN7R.js.map → chunk-WNPRRBOE.js.map} +0 -0
  680. /package/dist/{chunk-ZZUVBZL2.js.map → chunk-X2QPKLPL.js.map} +0 -0
  681. /package/dist/{chunk-RDLPFM7I.js.map → chunk-XJLTQTAO.js.map} +0 -0
  682. /package/dist/{chunk-XM46Y66S.js.map → chunk-ZFU6QNRN.js.map} +0 -0
  683. /package/dist/{chunk-SUEOG2S4.js.map → chunk-ZGXHTV5Y.js.map} +0 -0
  684. /package/dist/{chunk-46Z3VGWF.js.map → chunk-ZYRAY5FL.js.map} +0 -0
  685. /package/dist/{chunk-3XPN7AVY.js.map → chunk-ZYSOT6HD.js.map} +0 -0
  686. /package/dist/{resolution-4GG3QZRJ.js.map → contradiction-scan-GVD4JJ7B.js.map} +0 -0
  687. /package/dist/{first-start-migration-ZWMV5CX4.js.map → first-start-migration-L3UFX5CU.js.map} +0 -0
  688. /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
+ });
@@ -296,22 +296,15 @@ export function reconcileStateViewPairs<T extends StateViewResult>(results: read
296
296
  }
297
297
 
298
298
  /**
299
- * #2859 — packet-counting cap. A predecessor/successor chain admitted
300
- * together is ONE complete evidence packet: it consumes a single slot of
301
- * the user cap, and the slice never splits a packet at the boundary (no
302
- * underfill from post-cap orphan removal). Rows keep their incoming
303
- * (MMR) order; packets are ordered by first appearance. Call
304
- * reconcileStateViewPairs first so orphans never consume a slot.
299
+ * #2928 — per-row packet root keys for the final output budget. Runs the
300
+ * same namespace-qualified union-find as {@link capStateViewPackets}:
301
+ * every row of one evidence packet shares the root key, so a downstream
302
+ * budget that admits one row of the packet can admit them all or none.
303
+ * Blank-key rows get unique per-index roots (distinct singletons).
305
304
  */
306
- export function capStateViewPackets<T extends StateViewResult>(
305
+ export function stateViewPacketKeys<T extends StateViewResult>(
307
306
  ordered: readonly T[],
308
- limit: number,
309
- ): T[] {
310
- const safeLimit =
311
- typeof limit === "number" && Number.isFinite(limit) ? Math.max(0, Math.floor(limit)) : 0;
312
- if (safeLimit === 0) return [];
313
- if (ordered.length === 0) return [];
314
-
307
+ ): string[] {
315
308
  const byPred = buildSuccessorMap(ordered, []);
316
309
  // Union-find over row keys; blank-key rows become per-index singletons.
317
310
  const parent = new Map<string, string>();
@@ -347,14 +340,35 @@ export function capStateViewPackets<T extends StateViewResult>(
347
340
  const succIdx = keyToIndex.get(succKey);
348
341
  if (predIdx !== undefined && succIdx !== undefined) union(keys[predIdx]!, keys[succIdx]!);
349
342
  }
343
+ return keys.map((key) => root(key));
344
+ }
345
+
346
+ /**
347
+ * #2859 — packet-counting cap. A predecessor/successor chain admitted
348
+ * together is ONE complete evidence packet: it consumes a single slot of
349
+ * the user cap, and the slice never splits a packet at the boundary (no
350
+ * underfill from post-cap orphan removal). Rows keep their incoming
351
+ * (MMR) order; packets are ordered by first appearance. Call
352
+ * reconcileStateViewPairs first so orphans never consume a slot.
353
+ */
354
+ export function capStateViewPackets<T extends StateViewResult>(
355
+ ordered: readonly T[],
356
+ limit: number,
357
+ ): T[] {
358
+ const safeLimit =
359
+ typeof limit === "number" && Number.isFinite(limit) ? Math.max(0, Math.floor(limit)) : 0;
360
+ if (safeLimit === 0) return [];
361
+ if (ordered.length === 0) return [];
362
+
363
+ const keys = stateViewPacketKeys(ordered);
350
364
  // Packets ordered by first appearance; admit whole packets until the cap.
351
365
  const selectedRoots = new Set<string>();
352
366
  for (let i = 0; i < ordered.length && selectedRoots.size < safeLimit; i += 1) {
353
- selectedRoots.add(root(keys[i]!));
367
+ selectedRoots.add(keys[i]!);
354
368
  }
355
369
  const selected: T[] = [];
356
370
  for (let i = 0; i < ordered.length; i += 1) {
357
- if (selectedRoots.has(root(keys[i]!))) selected.push(ordered[i]!);
371
+ if (selectedRoots.has(keys[i]!)) selected.push(ordered[i]!);
358
372
  }
359
373
  return selected;
360
374
  }
@@ -29,6 +29,13 @@ export interface ComposeWriteEnvelopeInput {
29
29
  supersedes?: string;
30
30
  /** Config opt-in (`sharedContextAllowBindingAuthority`). Binding throws without it. */
31
31
  allowBinding: boolean;
32
+ /**
33
+ * Write instant for the expiry TTL policy (issue #2920). When finite, an
34
+ * `expiresAt` must land strictly after it and within the maximum TTL —
35
+ * a past or effectively-immortal expiry is a client input error, never a
36
+ * silently accepted stamp.
37
+ */
38
+ nowMs?: number;
32
39
  }
33
40
 
34
41
  function requireEnvelopeActor(agentId: string): string {
@@ -48,6 +55,21 @@ function optionalEnvelopeAt(expiresAt: string | undefined): string | undefined {
48
55
  return parsed.at;
49
56
  }
50
57
 
58
+ /** Maximum write-side TTL: 10 years. A farther `expiresAt` is rejected. */
59
+ export const MAX_WRITE_EXPIRES_AT_TTL_MS = 3650 * 24 * 60 * 60 * 1000;
60
+
61
+ function assertBoundedFutureExpiry(expiresAt: string, nowMs: number): void {
62
+ const expiresAtMs = Date.parse(expiresAt);
63
+ if (expiresAtMs <= nowMs) {
64
+ throw new Error("composeWriteEnvelope: expiresAt must be an instant strictly after the write time");
65
+ }
66
+ if (expiresAtMs - nowMs > MAX_WRITE_EXPIRES_AT_TTL_MS) {
67
+ throw new Error(
68
+ `composeWriteEnvelope: expiresAt exceeds the maximum TTL of ${MAX_WRITE_EXPIRES_AT_TTL_MS}ms`,
69
+ );
70
+ }
71
+ }
72
+
51
73
  function optionalEnvelopeId(supersedes: string | undefined): string | undefined {
52
74
  if (supersedes === undefined) return undefined;
53
75
  const parsed = parseEnvelopeId(supersedes);
@@ -137,6 +159,9 @@ function requireProducer(value: string): string {
137
159
  export function composeWriteEnvelope(input: ComposeWriteEnvelopeInput): SharedEnvelope {
138
160
  const sharedBy = requireEnvelopeActor(input.origin);
139
161
  const expiresAt = optionalEnvelopeAt(input.expiresAt);
162
+ if (expiresAt !== undefined && Number.isFinite(input.nowMs ?? Number.NaN)) {
163
+ assertBoundedFutureExpiry(expiresAt, input.nowMs as number);
164
+ }
140
165
  const supersedes = optionalEnvelopeId(input.supersedes);
141
166
  return applyDefaultEnvelope(
142
167
  { sharedBy, authority: input.authority, expiresAt, supersedes },
@@ -36,12 +36,14 @@ test("authority envelope round-trips write -> cross-signals -> curation", async
36
36
  const { manager, dir } = await makeManager();
37
37
  t.after(() => rm(dir, { recursive: true, force: true }));
38
38
 
39
+ // Within the write TTL policy (issue #2920): strictly future, ≤10 years.
40
+ const expiresAt = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString();
39
41
  const fp = await manager.writeAgentOutput({
40
42
  agentId: "agent-alpha",
41
43
  title: "Deploy checklist",
42
44
  content: "Verified the deploy checklist end to end.",
43
45
  authority: "advisory",
44
- expiresAt: "2099-01-01T00:00:00.000Z",
46
+ expiresAt,
45
47
  supersedes: "out-0001",
46
48
  });
47
49
 
@@ -49,7 +51,7 @@ test("authority envelope round-trips write -> cross-signals -> curation", async
49
51
  assert.match(raw, /^kind: agent_output$/m);
50
52
  assert.match(raw, /^sharedBy: "agent-alpha"$/m);
51
53
  assert.match(raw, /^authority: "advisory"$/m);
52
- assert.match(raw, /^expiresAt: "2099-01-01T00:00:00\.000Z"$/m);
54
+ assert.ok(raw.includes(`expiresAt: ${JSON.stringify(expiresAt)}`));
53
55
  assert.match(raw, /^supersedes: "out-0001"$/m);
54
56
 
55
57
  const signals = await manager.synthesizeCrossSignals({ date: today() });
@@ -605,6 +605,7 @@ export class SharedContextManager {
605
605
  expiresAt: opts.expiresAt,
606
606
  supersedes: opts.supersedes,
607
607
  allowBinding: this.allowBindingAuthority,
608
+ nowMs: createdAt.getTime(),
608
609
  });
609
610
 
610
611
  const dir = path.join(this.outputsDir, agentPathSegment, date);