@remnic/core 9.7.15 → 9.8.0

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 (929) hide show
  1. package/dist/access-admin-ops-surface.d.ts +13 -6
  2. package/dist/access-admin-ops-surface.js +85 -71
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-boundary.d.ts +35 -17
  5. package/dist/access-boundary.js +86 -74
  6. package/dist/access-citation.d.ts +28 -0
  7. package/dist/access-citation.js +9 -0
  8. package/dist/access-cli.js +194 -178
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-errors.d.ts +16 -1
  11. package/dist/access-errors.js +7 -3
  12. package/dist/access-http.d.ts +25 -19
  13. package/dist/access-http.js +100 -87
  14. package/dist/access-identity-continuity-surface.d.ts +13 -8
  15. package/dist/access-identity-continuity-surface.js +85 -71
  16. package/dist/access-lcm-surface.d.ts +16 -9
  17. package/dist/access-lcm-surface.js +85 -71
  18. package/dist/access-mcp.d.ts +23 -16
  19. package/dist/access-mcp.js +96 -84
  20. package/dist/access-memory-search-fanout.d.ts +93 -0
  21. package/dist/access-memory-search-fanout.js +18 -0
  22. package/dist/access-observe-write-surface.d.ts +26 -8
  23. package/dist/access-observe-write-surface.js +85 -71
  24. package/dist/access-operations-batch.js +92 -80
  25. package/dist/access-operations.d.ts +29 -22
  26. package/dist/access-operations.js +94 -82
  27. package/dist/access-recall-concurrency.d.ts +250 -0
  28. package/dist/access-recall-concurrency.js +157 -0
  29. package/dist/access-recall-response.d.ts +130 -0
  30. package/dist/access-recall-response.js +147 -0
  31. package/dist/access-recall-surface.d.ts +15 -7
  32. package/dist/access-recall-surface.js +85 -71
  33. package/dist/access-schema.d.ts +98 -98
  34. package/dist/access-schema.js +8 -6
  35. package/dist/{access-service-DpcYZ9Nl.d.ts → access-service-DEL4qCrc.d.ts} +25 -32
  36. package/dist/access-service.d.ts +13 -6
  37. package/dist/access-service.js +89 -72
  38. package/dist/access-surface-catalog.d.ts +23 -16
  39. package/dist/access-surface-catalog.js +1 -0
  40. package/dist/access-surface-catalog.js.map +1 -1
  41. package/dist/access-token-capabilities.d.ts +2 -1
  42. package/dist/access-token-capabilities.js +4 -2
  43. package/dist/action-confidence.d.ts +3 -1
  44. package/dist/active-memory-bridge.d.ts +3 -1
  45. package/dist/active-memory-bridge.js +4 -4
  46. package/dist/active-recall.d.ts +4 -1
  47. package/dist/active-recall.js +23 -13
  48. package/dist/active-recall.js.map +1 -1
  49. package/dist/adapters/index.js +4 -4
  50. package/dist/adapters/registry.js +2 -2
  51. package/dist/{auto-sync-AAMTVZMK.js → auto-sync-UZG3XQZ5.js} +14 -8
  52. package/dist/{auto-sync-AAMTVZMK.js.map → auto-sync-UZG3XQZ5.js.map} +1 -1
  53. package/dist/behavior-learner.d.ts +3 -1
  54. package/dist/behavior-signals.d.ts +3 -1
  55. package/dist/bootstrap.d.ts +12 -7
  56. package/dist/bootstrap.js +2 -2
  57. package/dist/bounded-jsonl-state.d.ts +54 -0
  58. package/dist/bounded-jsonl-state.js +10 -0
  59. package/dist/boxes.js +2 -2
  60. package/dist/briefing.d.ts +5 -2
  61. package/dist/briefing.js +34 -24
  62. package/dist/buffer-surprise-report.d.ts +3 -1
  63. package/dist/buffer.d.ts +60 -2
  64. package/dist/buffer.js +3 -3
  65. package/dist/bulk-import/index.d.ts +5 -3
  66. package/dist/calibration.d.ts +3 -1
  67. package/dist/calibration.js +6 -6
  68. package/dist/capabilities.d.ts +7 -7
  69. package/dist/capabilities.js +1 -1
  70. package/dist/{capsule-crypto-CZJSLEFG.js → capsule-crypto-YO5QJ6L3.js} +3 -3
  71. package/dist/capsule-crypto-YO5QJ6L3.js.map +1 -0
  72. package/dist/{catalog-C9444P10.d.ts → catalog-BWqHb5HT.d.ts} +1 -1
  73. package/dist/causal-behavior.d.ts +3 -1
  74. package/dist/causal-behavior.js +6 -6
  75. package/dist/causal-chain.js +4 -4
  76. package/dist/causal-consolidation.d.ts +3 -1
  77. package/dist/causal-consolidation.js +43 -34
  78. package/dist/causal-consolidation.js.map +1 -1
  79. package/dist/causal-retrieval.js +6 -6
  80. package/dist/causal-trajectory-graph.d.ts +3 -1
  81. package/dist/causal-trajectory-graph.js +1 -1
  82. package/dist/causal-trajectory.js +1 -1
  83. package/dist/{chunk-A3GOMRJG.js → chunk-23L3IXFD.js} +2 -2
  84. package/dist/chunk-2CGLBUW3.js +15 -0
  85. package/dist/chunk-2CGLBUW3.js.map +1 -0
  86. package/dist/{chunk-MRHFJV44.js → chunk-2DQ2XREU.js} +2 -2
  87. package/dist/{chunk-QKQYXZVS.js → chunk-2EJOEICD.js} +1819 -1481
  88. package/dist/chunk-2EJOEICD.js.map +1 -0
  89. package/dist/{chunk-L2B3EE7B.js → chunk-2QMKMVHH.js} +2 -2
  90. package/dist/{chunk-VJVNLNDQ.js → chunk-2UFO7X4Q.js} +7 -7
  91. package/dist/{chunk-2MR3MFQB.js → chunk-2VEOKUPP.js} +3 -3
  92. package/dist/chunk-2Z24E5W2.js +22 -0
  93. package/dist/chunk-2Z24E5W2.js.map +1 -0
  94. package/dist/{chunk-RHOZ5LLO.js → chunk-347WD2LE.js} +2 -2
  95. package/dist/{chunk-HDTQVNWD.js → chunk-3QAH2S33.js} +3 -3
  96. package/dist/{chunk-37CTGERM.js → chunk-3WCASNQZ.js} +12 -1
  97. package/dist/chunk-3WCASNQZ.js.map +1 -0
  98. package/dist/{chunk-LRNMRXJO.js → chunk-3Y224NYC.js} +3 -3
  99. package/dist/{chunk-3IY64MV6.js → chunk-44XZ75OQ.js} +44 -10
  100. package/dist/chunk-44XZ75OQ.js.map +1 -0
  101. package/dist/{chunk-VFSP73LP.js → chunk-45GF7Y3V.js} +2 -2
  102. package/dist/{chunk-K7LOWSLU.js → chunk-4BJQODZF.js} +2479 -1520
  103. package/dist/chunk-4BJQODZF.js.map +1 -0
  104. package/dist/{chunk-JREB6UFH.js → chunk-57OWKFUQ.js} +17 -6
  105. package/dist/chunk-57OWKFUQ.js.map +1 -0
  106. package/dist/{chunk-OEHCMALU.js → chunk-5I4M26Q7.js} +5 -5
  107. package/dist/{chunk-2AZXIZEN.js → chunk-5Q7EVV4X.js} +6 -6
  108. package/dist/{chunk-LC7OODWZ.js → chunk-5SB7SC2G.js} +80 -49
  109. package/dist/chunk-5SB7SC2G.js.map +1 -0
  110. package/dist/{chunk-PUBTHW5O.js → chunk-6DRPPQEJ.js} +2 -2
  111. package/dist/{chunk-NWTGD4AN.js → chunk-6KIQT7RG.js} +10 -9
  112. package/dist/chunk-6KIQT7RG.js.map +1 -0
  113. package/dist/{chunk-FDCTQWLW.js → chunk-6O22TZSB.js} +3 -3
  114. package/dist/{chunk-ZQ7UBUZ6.js → chunk-6QYST5XN.js} +6 -6
  115. package/dist/{chunk-W4PGTAS2.js → chunk-6WAFYNVT.js} +3 -3
  116. package/dist/chunk-6ZMAMSHS.js +20 -0
  117. package/dist/chunk-6ZMAMSHS.js.map +1 -0
  118. package/dist/{chunk-R5VAVVHP.js → chunk-72A4L5JJ.js} +2 -2
  119. package/dist/{chunk-X64YLC24.js → chunk-72VAXGEI.js} +5 -13
  120. package/dist/chunk-72VAXGEI.js.map +1 -0
  121. package/dist/{chunk-IKQTFQMI.js → chunk-755Q3DGF.js} +22 -3
  122. package/dist/chunk-755Q3DGF.js.map +1 -0
  123. package/dist/{chunk-OVJ2HIPE.js → chunk-76GLCM57.js} +158 -125
  124. package/dist/chunk-76GLCM57.js.map +1 -0
  125. package/dist/{chunk-D7FOKIY5.js → chunk-7AMFUATK.js} +12 -9
  126. package/dist/{chunk-D7FOKIY5.js.map → chunk-7AMFUATK.js.map} +1 -1
  127. package/dist/{chunk-BFVEEB7W.js → chunk-7ON2JW73.js} +57 -22
  128. package/dist/chunk-7ON2JW73.js.map +1 -0
  129. package/dist/chunk-7RNBVZZO.js +270 -0
  130. package/dist/chunk-7RNBVZZO.js.map +1 -0
  131. package/dist/{chunk-3FAMU5TX.js → chunk-A6USBZTO.js} +2 -2
  132. package/dist/{chunk-ZHIVCODT.js → chunk-A72SWTWW.js} +7 -7
  133. package/dist/{chunk-FC77VUX5.js → chunk-A7Q43EUZ.js} +2 -2
  134. package/dist/{chunk-UJBESW6X.js → chunk-AE7WMV4V.js} +7 -7
  135. package/dist/{chunk-J2HSAU72.js → chunk-AIK5W3IW.js} +29 -1
  136. package/dist/chunk-AIK5W3IW.js.map +1 -0
  137. package/dist/{chunk-A5UXZRRM.js → chunk-AJ7QCSIS.js} +2 -2
  138. package/dist/{chunk-FNMFJWBY.js → chunk-ANEUPF6O.js} +5 -5
  139. package/dist/chunk-AREGMX2J.js +50 -0
  140. package/dist/chunk-AREGMX2J.js.map +1 -0
  141. package/dist/chunk-AVPXXV6J.js +448 -0
  142. package/dist/chunk-AVPXXV6J.js.map +1 -0
  143. package/dist/{chunk-2A3OXAP2.js → chunk-B7RWBZXW.js} +2 -2
  144. package/dist/{chunk-GWTFLF2P.js → chunk-BJMBJZ2Y.js} +59 -59
  145. package/dist/chunk-BJMBJZ2Y.js.map +1 -0
  146. package/dist/{chunk-74F5STS4.js → chunk-BLAKS3CP.js} +4 -4
  147. package/dist/{chunk-M7VGG3ID.js → chunk-BV5WMSIJ.js} +9 -9
  148. package/dist/{chunk-2BFLDH5F.js → chunk-BXLOS5AJ.js} +2 -2
  149. package/dist/{chunk-UXKMMNJD.js → chunk-C23BYTJV.js} +6 -6
  150. package/dist/{chunk-JZHHREBL.js → chunk-C3AKM55W.js} +2 -2
  151. package/dist/{chunk-RP7YXA67.js → chunk-C5JF6EZ7.js} +2 -2
  152. package/dist/{chunk-T7Y5KPLN.js → chunk-C6XBRYVD.js} +16 -15
  153. package/dist/chunk-C6XBRYVD.js.map +1 -0
  154. package/dist/{chunk-FTYDWKO6.js → chunk-CEN6DW6X.js} +12 -2
  155. package/dist/chunk-CEN6DW6X.js.map +1 -0
  156. package/dist/chunk-CGASUJVP.js +421 -0
  157. package/dist/chunk-CGASUJVP.js.map +1 -0
  158. package/dist/{chunk-EHCONI6E.js → chunk-CQMEM5CC.js} +2 -2
  159. package/dist/{chunk-PBNZVPFS.js → chunk-CXZQOVIE.js} +12 -12
  160. package/dist/chunk-D3V3UMET.js +44 -0
  161. package/dist/chunk-D3V3UMET.js.map +1 -0
  162. package/dist/{chunk-7N2RUBAP.js → chunk-DDA47TES.js} +2 -2
  163. package/dist/{chunk-64SE4X5G.js → chunk-DEBHXHJR.js} +3 -3
  164. package/dist/{chunk-EHK6KZHK.js → chunk-DNHVPZOD.js} +2 -2
  165. package/dist/{chunk-437S3G37.js → chunk-DQEMWVMT.js} +2 -2
  166. package/dist/{chunk-LZZNTPLR.js → chunk-DX3XRGLH.js} +2 -2
  167. package/dist/chunk-EA2H5LML.js +72 -0
  168. package/dist/chunk-EA2H5LML.js.map +1 -0
  169. package/dist/{chunk-INELTPRG.js → chunk-EEC7UJPX.js} +103 -106
  170. package/dist/chunk-EEC7UJPX.js.map +1 -0
  171. package/dist/{chunk-KSNVDPDF.js → chunk-EKBNDKDY.js} +21 -20
  172. package/dist/chunk-EKBNDKDY.js.map +1 -0
  173. package/dist/{chunk-YF6FMLBT.js → chunk-EQWEIIKQ.js} +64 -34
  174. package/dist/chunk-EQWEIIKQ.js.map +1 -0
  175. package/dist/{chunk-DZKHSDOM.js → chunk-ES36HTSC.js} +4 -4
  176. package/dist/{chunk-TN7THW5U.js → chunk-ET356KSB.js} +2 -2
  177. package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
  178. package/dist/{chunk-DMSDUGDM.js → chunk-F7GAIWFA.js} +20 -20
  179. package/dist/{chunk-G6XXLKC5.js → chunk-FFPJINJE.js} +6 -6
  180. package/dist/chunk-FMLKOL2Z.js +636 -0
  181. package/dist/chunk-FMLKOL2Z.js.map +1 -0
  182. package/dist/chunk-FQC3DHH2.js +20 -0
  183. package/dist/chunk-FQC3DHH2.js.map +1 -0
  184. package/dist/{chunk-G4CN3ZXL.js → chunk-FUTF72MJ.js} +15 -15
  185. package/dist/chunk-GCASGYIO.js +71 -0
  186. package/dist/chunk-GCASGYIO.js.map +1 -0
  187. package/dist/{chunk-HF77M34J.js → chunk-GFPZS3F5.js} +8 -8
  188. package/dist/{chunk-BCDKBDSY.js → chunk-GNVZQ5JN.js} +99 -41
  189. package/dist/chunk-GNVZQ5JN.js.map +1 -0
  190. package/dist/{chunk-G6NKALRN.js → chunk-H4WG3UQZ.js} +2 -2
  191. package/dist/{chunk-UDQUSU27.js → chunk-HNZKVLAN.js} +2 -2
  192. package/dist/{chunk-5EZXHU36.js → chunk-HYQJQGD3.js} +2 -2
  193. package/dist/{chunk-OAZVR2BV.js → chunk-IDZFBSHN.js} +8 -6
  194. package/dist/{chunk-OAZVR2BV.js.map → chunk-IDZFBSHN.js.map} +1 -1
  195. package/dist/{chunk-PLQE6MJA.js → chunk-IFH6LWTO.js} +50 -8
  196. package/dist/chunk-IFH6LWTO.js.map +1 -0
  197. package/dist/{chunk-RULE4VG5.js → chunk-ILGC6JH6.js} +21 -6
  198. package/dist/chunk-ILGC6JH6.js.map +1 -0
  199. package/dist/chunk-IUM3VSHI.js +113 -0
  200. package/dist/chunk-IUM3VSHI.js.map +1 -0
  201. package/dist/{chunk-DCFV7A7H.js → chunk-IYNGIMVG.js} +101 -91
  202. package/dist/chunk-IYNGIMVG.js.map +1 -0
  203. package/dist/{chunk-TRWPCR6P.js → chunk-JECBQBEX.js} +3 -3
  204. package/dist/{chunk-E6CBU7XP.js → chunk-JYIFGGEM.js} +2 -2
  205. package/dist/{chunk-VA4WSW54.js → chunk-JYIJNNN3.js} +3 -3
  206. package/dist/{chunk-L5HJQC36.js → chunk-K2TDK7GG.js} +3 -3
  207. package/dist/{chunk-KDXVOFYY.js → chunk-KAVBJSBQ.js} +4 -4
  208. package/dist/{chunk-BS4SGLWV.js → chunk-KF5EUVKQ.js} +16 -6
  209. package/dist/chunk-KF5EUVKQ.js.map +1 -0
  210. package/dist/chunk-KFZY2OFH.js +42 -0
  211. package/dist/chunk-KFZY2OFH.js.map +1 -0
  212. package/dist/{chunk-4OKLXWDZ.js → chunk-KNB7IBBU.js} +2 -2
  213. package/dist/{chunk-QLULYKWZ.js → chunk-KSXJOC4F.js} +2 -2
  214. package/dist/{chunk-2S6QHZGJ.js → chunk-L2DPF4DF.js} +1 -1
  215. package/dist/{chunk-JI5AVXYO.js → chunk-LEPOP46W.js} +6 -6
  216. package/dist/{chunk-O7BBFJLP.js → chunk-LTAVSOZW.js} +2 -2
  217. package/dist/{chunk-E3VODCC3.js → chunk-LUDXM7MD.js} +14 -2
  218. package/dist/{chunk-E3VODCC3.js.map → chunk-LUDXM7MD.js.map} +1 -1
  219. package/dist/{chunk-2IZAGAJR.js → chunk-LULR4IUW.js} +3 -3
  220. package/dist/{chunk-QQGPUKMT.js → chunk-MC5Q3J7S.js} +398 -7
  221. package/dist/chunk-MC5Q3J7S.js.map +1 -0
  222. package/dist/{chunk-WMWVO45V.js → chunk-MC6XO7T4.js} +2 -2
  223. package/dist/chunk-MKQBXQKU.js +107 -0
  224. package/dist/chunk-MKQBXQKU.js.map +1 -0
  225. package/dist/{chunk-7PND4PUC.js → chunk-MMGGVZ4Q.js} +29 -9
  226. package/dist/{chunk-7PND4PUC.js.map → chunk-MMGGVZ4Q.js.map} +1 -1
  227. package/dist/{chunk-D6RIFG4O.js → chunk-MNB5RMAY.js} +2 -2
  228. package/dist/{chunk-Q5WG43OP.js → chunk-MYFQ3ED4.js} +7 -7
  229. package/dist/{chunk-V3UE5I5F.js → chunk-MYVPLJOO.js} +2 -2
  230. package/dist/chunk-NINSR6LX.js +83 -0
  231. package/dist/chunk-NINSR6LX.js.map +1 -0
  232. package/dist/{chunk-MTWKDOVO.js → chunk-NLE6TSLG.js} +2 -2
  233. package/dist/{chunk-DBRYEIGY.js → chunk-OJP3N7UK.js} +2 -2
  234. package/dist/{chunk-VDW4VU7B.js → chunk-OQJIB32H.js} +28 -23
  235. package/dist/chunk-OQJIB32H.js.map +1 -0
  236. package/dist/{chunk-SMX5267P.js → chunk-OZKOPQCM.js} +2 -2
  237. package/dist/{chunk-JCK7V6SN.js → chunk-P65YJEEL.js} +2 -2
  238. package/dist/{chunk-MTR7BZQN.js → chunk-PBGWYM3H.js} +3 -3
  239. package/dist/chunk-PIG4WJFQ.js +87 -0
  240. package/dist/chunk-PIG4WJFQ.js.map +1 -0
  241. package/dist/chunk-PQVCH2AE.js +76 -0
  242. package/dist/chunk-PQVCH2AE.js.map +1 -0
  243. package/dist/{chunk-AXTXN4T6.js → chunk-PWFCHOB3.js} +2 -2
  244. package/dist/{chunk-FDPZVY6D.js → chunk-QFN4U7AG.js} +2 -2
  245. package/dist/{chunk-K2ZLHESQ.js → chunk-QIEUU4UK.js} +2 -2
  246. package/dist/{chunk-DYP3YYJJ.js → chunk-QJAQNXWI.js} +39 -5
  247. package/dist/chunk-QJAQNXWI.js.map +1 -0
  248. package/dist/{chunk-3D6AFGQR.js → chunk-QVT3E4CE.js} +7 -7
  249. package/dist/{chunk-FIJUY7GG.js → chunk-R26ZMXR2.js} +23 -23
  250. package/dist/{chunk-FIJUY7GG.js.map → chunk-R26ZMXR2.js.map} +1 -1
  251. package/dist/chunk-R3DJVOSM.js +34 -0
  252. package/dist/chunk-R3DJVOSM.js.map +1 -0
  253. package/dist/{chunk-SFQ6QNL7.js → chunk-R6YJI3HE.js} +2 -1
  254. package/dist/{chunk-5CJVLG3H.js → chunk-RFDD3B7W.js} +5 -5
  255. package/dist/{chunk-JBPKEARU.js → chunk-RKNJBZ55.js} +4 -4
  256. package/dist/chunk-ROI7BK7H.js +88 -0
  257. package/dist/chunk-ROI7BK7H.js.map +1 -0
  258. package/dist/{chunk-FNZQGN76.js → chunk-S2BBISHU.js} +4 -4
  259. package/dist/{chunk-IALLX7EE.js → chunk-S2FSBU4H.js} +3 -3
  260. package/dist/{chunk-BFPETA3S.js → chunk-SCCO46KZ.js} +3 -2
  261. package/dist/chunk-SCCO46KZ.js.map +1 -0
  262. package/dist/chunk-SICXL4MK.js +165 -0
  263. package/dist/chunk-SICXL4MK.js.map +1 -0
  264. package/dist/chunk-SK7AMF2J.js +168 -0
  265. package/dist/chunk-SK7AMF2J.js.map +1 -0
  266. package/dist/{chunk-LZOV7MX7.js → chunk-TDTXKOAJ.js} +6474 -5747
  267. package/dist/chunk-TDTXKOAJ.js.map +1 -0
  268. package/dist/{chunk-KSBEEMQF.js → chunk-TG6IHVE2.js} +151 -6
  269. package/dist/chunk-TG6IHVE2.js.map +1 -0
  270. package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
  271. package/dist/{chunk-DPAENM7O.js → chunk-U3ZAVRP3.js} +2 -2
  272. package/dist/{chunk-ODPLEWB6.js → chunk-UFGFMWAD.js} +47 -17
  273. package/dist/chunk-UFGFMWAD.js.map +1 -0
  274. package/dist/{chunk-4KJLYTLS.js → chunk-V57NLO5P.js} +2 -2
  275. package/dist/{chunk-FLVL4L3L.js → chunk-VDX2J7OX.js} +2 -2
  276. package/dist/{chunk-AJLLIIML.js → chunk-W4FBGYGK.js} +1 -1
  277. package/dist/{chunk-TXLGHDHS.js → chunk-W4XJFLAL.js} +53 -32
  278. package/dist/chunk-W4XJFLAL.js.map +1 -0
  279. package/dist/{chunk-6SXVCD7W.js → chunk-W7IGLX4G.js} +2 -2
  280. package/dist/{chunk-KQDNAXOM.js → chunk-WG5HSQ4P.js} +19 -6
  281. package/dist/chunk-WG5HSQ4P.js.map +1 -0
  282. package/dist/{chunk-LTJAMRGI.js → chunk-WL5EBRDH.js} +17 -3
  283. package/dist/chunk-WL5EBRDH.js.map +1 -0
  284. package/dist/{chunk-KAWTOYAW.js → chunk-WLZYGLJ4.js} +2 -2
  285. package/dist/{chunk-RO4LQGT3.js → chunk-WON4APQY.js} +4 -4
  286. package/dist/{chunk-PQVK2S3J.js → chunk-WZFAPHIK.js} +6 -6
  287. package/dist/{chunk-KQPJLK3X.js → chunk-XL24QQ63.js} +2 -2
  288. package/dist/{chunk-RVZRYUQH.js → chunk-YROFNEG5.js} +7 -7
  289. package/dist/{chunk-RAR2BSEM.js → chunk-YV32N67O.js} +1 -1
  290. package/dist/chunk-YV32N67O.js.map +1 -0
  291. package/dist/{chunk-PBSAPHHA.js → chunk-YVKF3HEW.js} +1 -1
  292. package/dist/chunk-YVKF3HEW.js.map +1 -0
  293. package/dist/{chunk-VRAD2FGO.js → chunk-Z54EM5YZ.js} +12 -12
  294. package/dist/{chunk-2VN4JAX7.js → chunk-ZOKZIR5K.js} +95 -33
  295. package/dist/chunk-ZOKZIR5K.js.map +1 -0
  296. package/dist/{cli-Cd5fMmhq.d.ts → cli-C_pqqTCw.d.ts} +28 -12
  297. package/dist/cli.d.ts +16 -9
  298. package/dist/cli.js +142 -127
  299. package/dist/compounding/engine.d.ts +5 -2
  300. package/dist/compounding/engine.js +36 -26
  301. package/dist/compounding/preference-consolidator.d.ts +3 -1
  302. package/dist/compounding/preference-consolidator.js +1 -1
  303. package/dist/compression-optimizer.d.ts +3 -1
  304. package/dist/config-qmd.d.ts +8 -0
  305. package/dist/config-qmd.js +20 -0
  306. package/dist/config-qmd.js.map +1 -0
  307. package/dist/config.d.ts +3 -1
  308. package/dist/config.js +15 -10
  309. package/dist/connectors/codex-materialize-runner.d.ts +3 -1
  310. package/dist/connectors/codex-materialize-runner.js +36 -26
  311. package/dist/connectors/codex-materialize.d.ts +3 -1
  312. package/dist/connectors/codex-materialize.js +2 -2
  313. package/dist/connectors/index.d.ts +3 -1
  314. package/dist/connectors/index.js +41 -32
  315. package/dist/consolidation-provenance-check.d.ts +5 -2
  316. package/dist/consolidation-undo.d.ts +5 -2
  317. package/dist/contradiction/index.d.ts +5 -2
  318. package/dist/contradiction/index.js +10 -4
  319. package/dist/{contradiction-scan-J57T5QV7.js → contradiction-scan-RJBABNRH.js} +4 -4
  320. package/dist/contradiction-scan-RJBABNRH.js.map +1 -0
  321. package/dist/conversation-index/backend.d.ts +3 -1
  322. package/dist/conversation-index/backend.js +5 -5
  323. package/dist/conversation-index/chunker.d.ts +3 -1
  324. package/dist/conversation-index/cleanup.js +2 -2
  325. package/dist/conversation-index/faiss-adapter.d.ts +3 -1
  326. package/dist/conversation-index/faiss-adapter.js +2 -2
  327. package/dist/conversation-index/indexer.d.ts +3 -1
  328. package/dist/conversation-index/indexer.js +2 -2
  329. package/dist/conversation-index/search.d.ts +3 -1
  330. package/dist/conversation-index/search.js +2 -2
  331. package/dist/cross-namespace-budget.d.ts +45 -1
  332. package/dist/cross-namespace-budget.js +5 -3
  333. package/dist/dashboard-runtime.js +2 -2
  334. package/dist/day-summary.d.ts +3 -1
  335. package/dist/day-summary.js +3 -3
  336. package/dist/delinearize.d.ts +3 -1
  337. package/dist/direct-answer-wiring.d.ts +3 -1
  338. package/dist/direct-answer.d.ts +3 -1
  339. package/dist/{dreams-ledger-6UODQOX6.js → dreams-ledger-567VKVOU.js} +4 -2
  340. package/dist/dreams-ledger-567VKVOU.js.map +1 -0
  341. package/dist/embedding-fallback.d.ts +3 -1
  342. package/dist/embedding-fallback.js +3 -3
  343. package/dist/enrichment/index.d.ts +3 -1
  344. package/dist/entity-retrieval.d.ts +5 -2
  345. package/dist/entity-retrieval.js +35 -26
  346. package/dist/entity-schema.d.ts +3 -1
  347. package/dist/explicit-capture.d.ts +13 -8
  348. package/dist/explicit-capture.js +7 -3
  349. package/dist/extraction-faithfulness.d.ts +3 -1
  350. package/dist/extraction-faithfulness.js +5 -5
  351. package/dist/extraction-judge-telemetry.d.ts +3 -1
  352. package/dist/extraction-judge-telemetry.js +2 -2
  353. package/dist/extraction-judge-training.d.ts +3 -1
  354. package/dist/extraction-judge-training.js +2 -2
  355. package/dist/extraction-judge.d.ts +3 -1
  356. package/dist/extraction-judge.js +5 -5
  357. package/dist/extraction.d.ts +3 -1
  358. package/dist/extraction.js +13 -12
  359. package/dist/faithfulness-config.js +3 -2
  360. package/dist/fallback-llm.d.ts +3 -1
  361. package/dist/fallback-llm.js +4 -4
  362. package/dist/{first-start-migration-TI67YMLG.js → first-start-migration-CSRHCJIQ.js} +2 -2
  363. package/dist/{forget-CQCLB5LB.js → forget-HRPLVB3W.js} +5 -5
  364. package/dist/graph-dashboard-diff.d.ts +3 -1
  365. package/dist/graph-dashboard-key.d.ts +3 -1
  366. package/dist/graph-dashboard-parser.d.ts +3 -1
  367. package/dist/{graph-edge-decay-IOGBBAGC.js → graph-edge-decay-Z6ENALU2.js} +3 -3
  368. package/dist/graph-edge-decay-Z6ENALU2.js.map +1 -0
  369. package/dist/graph-edge-reinforcement.d.ts +3 -1
  370. package/dist/graph-snapshot.d.ts +3 -1
  371. package/dist/graph-snapshot.js +2 -2
  372. package/dist/graph.d.ts +3 -1
  373. package/dist/graph.js +1 -1
  374. package/dist/identity-continuity.d.ts +1 -2
  375. package/dist/importance.d.ts +3 -1
  376. package/dist/importers/index.d.ts +3 -1
  377. package/dist/in-flight-reads.d.ts +3 -1
  378. package/dist/index.d.ts +473 -464
  379. package/dist/index.js +287 -239
  380. package/dist/intent.d.ts +3 -1
  381. package/dist/lcm/archive.js +2 -2
  382. package/dist/lcm/engine.d.ts +3 -1
  383. package/dist/lcm/engine.js +6 -6
  384. package/dist/lcm/index.d.ts +3 -1
  385. package/dist/lcm/index.js +13 -13
  386. package/dist/lcm/schema.js +2 -2
  387. package/dist/lcm/summarizer.js +3 -3
  388. package/dist/lcm/tools.d.ts +3 -1
  389. package/dist/lifecycle.d.ts +3 -1
  390. package/dist/live-connectors-runner.d.ts +3 -1
  391. package/dist/local-llm.d.ts +5 -2
  392. package/dist/local-llm.js +3 -3
  393. package/dist/local-model-endpoint.d.ts +3 -1
  394. package/dist/logger.d.ts +3 -1
  395. package/dist/logger.js +7 -3
  396. package/dist/maintenance/archive-observations.js +2 -2
  397. package/dist/maintenance/memory-governance.d.ts +3 -1
  398. package/dist/maintenance/memory-governance.js +35 -25
  399. package/dist/maintenance/migrate-observations.js +3 -3
  400. package/dist/maintenance/observation-ledger-utils.js +2 -2
  401. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +102 -1
  402. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +37 -25
  403. package/dist/maintenance/rebuild-memory-projection.js +38 -28
  404. package/dist/maintenance/rebuild-observations.js +3 -3
  405. package/dist/mcp-memory-inspector-app.d.ts +22 -15
  406. package/dist/memory-action-policy.d.ts +3 -1
  407. package/dist/memory-cache.d.ts +3 -1
  408. package/dist/memory-lifecycle-ledger-utils.d.ts +25 -2
  409. package/dist/memory-lifecycle-ledger-utils.js +11 -1
  410. package/dist/memory-projection-store.d.ts +3 -1
  411. package/dist/memory-projection-store.js +2 -2
  412. package/dist/memory-provenance.d.ts +3 -1
  413. package/dist/memory-worth-outcomes.d.ts +5 -2
  414. package/dist/model-registry.js +2 -2
  415. package/dist/models-json.d.ts +3 -1
  416. package/dist/models-json.js +2 -2
  417. package/dist/namespaces/migrate.d.ts +6 -3
  418. package/dist/namespaces/migrate.js +51 -42
  419. package/dist/namespaces/principal.d.ts +27 -2
  420. package/dist/namespaces/principal.js +6 -2
  421. package/dist/namespaces/search.d.ts +16 -2
  422. package/dist/namespaces/search.js +24 -20
  423. package/dist/namespaces/storage.d.ts +24 -3
  424. package/dist/namespaces/storage.js +35 -27
  425. package/dist/native-knowledge.d.ts +3 -1
  426. package/dist/native-knowledge.js +2 -2
  427. package/dist/negative.js +2 -2
  428. package/dist/offline-sync-exclude-globs.d.ts +13 -0
  429. package/dist/offline-sync-exclude-globs.js +10 -0
  430. package/dist/offline-sync-exclude-globs.js.map +1 -0
  431. package/dist/offline-sync-impression-drain.d.ts +78 -0
  432. package/dist/offline-sync-impression-drain.js +37 -0
  433. package/dist/offline-sync-impression-drain.js.map +1 -0
  434. package/dist/offline-sync.js +4 -2
  435. package/dist/operator-toolkit.d.ts +5 -2
  436. package/dist/operator-toolkit.js +69 -54
  437. package/dist/orchestration/compression-guideline-coordinator.d.ts +5 -2
  438. package/dist/orchestration/compression-guideline-coordinator.js +3 -3
  439. package/dist/orchestration/maintenance.d.ts +121 -2
  440. package/dist/orchestration/maintenance.js +44 -31
  441. package/dist/{orchestrator-Bp_jeBHK.d.ts → orchestrator-CQJ8U7En.d.ts} +85 -79
  442. package/dist/orchestrator.d.ts +13 -8
  443. package/dist/orchestrator.js +194 -177
  444. package/dist/patterns-cli.d.ts +3 -1
  445. package/dist/{pipeline-BAj5bx7g.d.ts → pipeline-Cn-kvYeV.d.ts} +1 -1
  446. package/dist/policy-runtime.d.ts +3 -1
  447. package/dist/prioritized-embed.d.ts +19 -0
  448. package/dist/prioritized-embed.js +8 -0
  449. package/dist/prioritized-embed.js.map +1 -0
  450. package/dist/proactive-contention.d.ts +28 -0
  451. package/dist/proactive-contention.js +8 -0
  452. package/dist/proactive-contention.js.map +1 -0
  453. package/dist/profiling.js +2 -2
  454. package/dist/provenance.d.ts +3 -1
  455. package/dist/provenance.js +3 -2
  456. package/dist/{purge-NDWV6WYD.js → purge-IRF47ZTX.js} +3 -3
  457. package/dist/{qmd-_MDSlj1m.d.ts → qmd-oh9VXz1d.d.ts} +11 -1
  458. package/dist/qmd-preflight.d.ts +5 -2
  459. package/dist/qmd-recall-cache.d.ts +3 -1
  460. package/dist/qmd-status.d.ts +57 -0
  461. package/dist/qmd-status.js +18 -0
  462. package/dist/qmd-status.js.map +1 -0
  463. package/dist/qmd.d.ts +5 -2
  464. package/dist/qmd.js +7 -3
  465. package/dist/recall-concurrency-config.d.ts +16 -0
  466. package/dist/recall-concurrency-config.js +10 -0
  467. package/dist/recall-concurrency-config.js.map +1 -0
  468. package/dist/recall-disclosure-escalation.d.ts +3 -1
  469. package/dist/recall-explain-renderer.d.ts +4 -1
  470. package/dist/recall-explain-renderer.js +3 -3
  471. package/dist/recall-memory-map.d.ts +26 -0
  472. package/dist/recall-memory-map.js +18 -0
  473. package/dist/recall-memory-map.js.map +1 -0
  474. package/dist/recall-planner-llm.d.ts +3 -1
  475. package/dist/recall-planner-llm.js +4 -4
  476. package/dist/recall-qos.js +2 -2
  477. package/dist/recall-state.d.ts +163 -2
  478. package/dist/recall-state.js +6 -3
  479. package/dist/recall-tag-filter.d.ts +3 -1
  480. package/dist/recall-timings.d.ts +11 -2
  481. package/dist/recall-timings.js +3 -1
  482. package/dist/recall-xray-cli.d.ts +3 -1
  483. package/dist/recall-xray-cli.js +4 -4
  484. package/dist/recall-xray-renderer.d.ts +3 -1
  485. package/dist/recall-xray-renderer.js +3 -3
  486. package/dist/recall-xray.d.ts +3 -1
  487. package/dist/recall-xray.js +2 -2
  488. package/dist/relevance.js +3 -3
  489. package/dist/replay/normalizers/chatgpt.d.ts +3 -1
  490. package/dist/replay/normalizers/claude.d.ts +3 -1
  491. package/dist/replay/normalizers/openclaw.d.ts +3 -1
  492. package/dist/replay/normalizers/shared.d.ts +3 -1
  493. package/dist/replay/runner.d.ts +3 -1
  494. package/dist/replay/types.d.ts +3 -1
  495. package/dist/rerank.d.ts +8 -1
  496. package/dist/rerank.js +3 -1
  497. package/dist/resolution-3K27T4VO.js +18 -0
  498. package/dist/resolution-3K27T4VO.js.map +1 -0
  499. package/dist/resolve-auth-token.d.ts +3 -1
  500. package/dist/resolve-provider-secret.js +2 -2
  501. package/dist/resume-bundles.js +19 -14
  502. package/dist/retrieval-agents.d.ts +19 -16
  503. package/dist/retrieval-agents.js +3 -3
  504. package/dist/retrieval-tiers.d.ts +3 -1
  505. package/dist/routing/engine.d.ts +3 -1
  506. package/dist/routing/store.d.ts +3 -1
  507. package/dist/routing/store.js +2 -2
  508. package/dist/salvage-envelope.d.ts +18 -0
  509. package/dist/salvage-envelope.js +15 -0
  510. package/dist/salvage-envelope.js.map +1 -0
  511. package/dist/schemas.d.ts +98 -98
  512. package/dist/scope-profiles-EpJG7yKP.d.ts +30 -0
  513. package/dist/search/document-scanner.js +3 -2
  514. package/dist/search/embed-helper.d.ts +3 -1
  515. package/dist/search/embed-helper.js +3 -3
  516. package/dist/search/factory.d.ts +3 -1
  517. package/dist/search/factory.js +18 -16
  518. package/dist/search/index.d.ts +3 -1
  519. package/dist/search/index.js +22 -20
  520. package/dist/search/lancedb-backend.d.ts +3 -1
  521. package/dist/search/lancedb-backend.js +6 -5
  522. package/dist/search/meilisearch-backend.d.ts +3 -1
  523. package/dist/search/meilisearch-backend.js +6 -5
  524. package/dist/search/noop-backend.d.ts +3 -1
  525. package/dist/search/orama-backend.d.ts +3 -1
  526. package/dist/search/orama-backend.js +6 -5
  527. package/dist/search/port.d.ts +16 -2
  528. package/dist/search/port.js +1 -1
  529. package/dist/search/remote-backend.d.ts +3 -1
  530. package/dist/search/remote-backend.js +3 -3
  531. package/dist/secure-store/index.d.ts +12 -1
  532. package/dist/secure-store/index.js +6 -3
  533. package/dist/{semantic-consolidation-C2m5eHHE.d.ts → semantic-consolidation-DILZEQq3.d.ts} +1 -1
  534. package/dist/semantic-consolidation.d.ts +4 -2
  535. package/dist/semantic-consolidation.js +38 -29
  536. package/dist/semantic-rule-promotion.js +34 -24
  537. package/dist/semantic-rule-verifier.d.ts +3 -1
  538. package/dist/semantic-rule-verifier.js +35 -25
  539. package/dist/session-observer-bands.d.ts +3 -1
  540. package/dist/session-observer-state.d.ts +3 -1
  541. package/dist/session-observer-state.js +2 -2
  542. package/dist/session-transcript-migration.js +2 -2
  543. package/dist/shared-context/manager.d.ts +11 -9
  544. package/dist/shared-context/manager.js +3 -3
  545. package/dist/signal.d.ts +3 -1
  546. package/dist/{storage-hr_Y2z5R.d.ts → storage-NIyKYD8g.d.ts} +489 -110
  547. package/dist/storage-guards.js +2 -2
  548. package/dist/storage.d.ts +6 -3
  549. package/dist/storage.js +38 -26
  550. package/dist/structured-attributes.d.ts +23 -1
  551. package/dist/structured-attributes.js +7 -1
  552. package/dist/summarizer.d.ts +3 -1
  553. package/dist/summarizer.js +11 -11
  554. package/dist/summary-snapshot.d.ts +3 -1
  555. package/dist/summary-snapshot.js +2 -2
  556. package/dist/temporal-index-batch.d.ts +1 -0
  557. package/dist/temporal-index-batch.js +10 -0
  558. package/dist/temporal-index-batch.js.map +1 -0
  559. package/dist/temporal-index-compat.d.ts +279 -1
  560. package/dist/temporal-index-compat.js +1 -1
  561. package/dist/temporal-index.d.ts +1 -225
  562. package/dist/temporal-index.js +35 -3
  563. package/dist/temporal-supersession.d.ts +5 -2
  564. package/dist/temporal-supersession.js +2 -2
  565. package/dist/temporal-timeline-recall.d.ts +3 -1
  566. package/dist/temporal-validity.d.ts +3 -1
  567. package/dist/threading.d.ts +3 -1
  568. package/dist/threading.js +2 -2
  569. package/dist/tier-migration.d.ts +5 -2
  570. package/dist/tier-routing.d.ts +3 -1
  571. package/dist/{tier-stats-KV7IWCJR.js → tier-stats-QEJSPFV2.js} +2 -2
  572. package/dist/tokens.js +3 -3
  573. package/dist/topics.d.ts +3 -1
  574. package/dist/transcript.d.ts +3 -1
  575. package/dist/transcript.js +2 -2
  576. package/dist/transfer/backup.js +3 -3
  577. package/dist/transfer/capsule-export.js +3 -3
  578. package/dist/transfer/capsule-import.js +3 -3
  579. package/dist/transfer/types.d.ts +90 -90
  580. package/dist/trust-score-stage.d.ts +75 -38
  581. package/dist/trust-score-stage.js +11 -3
  582. package/dist/trust-score.d.ts +3 -1
  583. package/dist/{types-Cg8q7W7_.d.ts → types-D_fG2ix8.d.ts} +39 -63
  584. package/dist/types-continuity.d.ts +52 -0
  585. package/dist/types-continuity.js +1 -0
  586. package/dist/types-continuity.js.map +1 -0
  587. package/dist/types.d.ts +3 -1
  588. package/dist/types.js +1 -1
  589. package/dist/utility-runtime.d.ts +3 -1
  590. package/dist/utils/serialize-mutations.d.ts +31 -2
  591. package/dist/utils/serialize-mutations.js +1 -1
  592. package/dist/verified-recall.js +36 -26
  593. package/dist/write-envelope.d.ts +282 -0
  594. package/dist/write-envelope.js +35 -0
  595. package/dist/write-envelope.js.map +1 -0
  596. package/dist/write-quarantine.d.ts +79 -0
  597. package/dist/write-quarantine.js +11 -0
  598. package/dist/write-quarantine.js.map +1 -0
  599. package/dist/write-rate-limiter.d.ts +45 -0
  600. package/dist/write-rate-limiter.js +9 -0
  601. package/dist/write-rate-limiter.js.map +1 -0
  602. package/package.json +37 -2
  603. package/src/access-admin-ops-surface.ts +17 -7
  604. package/src/access-boundary.test.ts +28 -0
  605. package/src/access-boundary.ts +31 -2
  606. package/src/access-citation.test.ts +72 -0
  607. package/src/access-citation.ts +139 -0
  608. package/src/access-errors.ts +21 -0
  609. package/src/access-fingerprint-parity.test.ts +211 -0
  610. package/src/access-http-cancellation.test.ts +59 -21
  611. package/src/access-http.test.ts +90 -0
  612. package/src/access-http.ts +79 -79
  613. package/src/access-mcp-cancellation.test.ts +16 -7
  614. package/src/access-memory-search-fanout.test.ts +220 -0
  615. package/src/access-memory-search-fanout.ts +168 -0
  616. package/src/access-observe-quarantine.test.ts +120 -0
  617. package/src/access-observe-write-surface.ts +130 -11
  618. package/src/access-operations-batch.ts +2 -0
  619. package/src/access-recall-concurrency.ts +773 -0
  620. package/src/access-recall-response.ts +307 -0
  621. package/src/access-recall-surface.ts +100 -252
  622. package/src/access-service-coding-write.test.ts +22 -4
  623. package/src/access-service-health.test.ts +49 -0
  624. package/src/access-service-namespace.test.ts +486 -8
  625. package/src/access-service-observe-scope.test.ts +4 -0
  626. package/src/access-service-recall-concurrency.test.ts +1990 -0
  627. package/src/access-service.ts +182 -175
  628. package/src/access-surface-catalog.ts +1 -0
  629. package/src/access-token-capabilities.ts +16 -9
  630. package/src/active-recall.test.ts +35 -0
  631. package/src/active-recall.ts +7 -0
  632. package/src/bounded-jsonl-state.ts +93 -0
  633. package/src/buffer-session.test.ts +422 -5
  634. package/src/buffer-surprise-trigger.test.ts +41 -0
  635. package/src/buffer.ts +218 -3
  636. package/src/capabilities-cluster-b.test.ts +1 -0
  637. package/src/capabilities.ts +5 -6
  638. package/src/cli.ts +21 -22
  639. package/src/coding/architecture-surfaces.test.ts +6 -3
  640. package/src/coding/architecture-surfaces.ts +36 -25
  641. package/src/coding/decision-surfaces.ts +42 -34
  642. package/src/compounding/engine.test.ts +5 -1
  643. package/src/compounding/engine.ts +7 -7
  644. package/src/config-qmd.ts +89 -0
  645. package/src/config.test.ts +136 -0
  646. package/src/config.ts +113 -118
  647. package/src/connector-provenance-lifecycle.test.ts +4 -4
  648. package/src/connectors/coerce.test.ts +131 -0
  649. package/src/connectors/coerce.ts +80 -7
  650. package/src/contradiction/contradiction.test.ts +10 -6
  651. package/src/contradiction/resolution.ts +17 -4
  652. package/src/correction/correction-access-wiring.ts +62 -18
  653. package/src/cross-namespace-budget.test.ts +35 -0
  654. package/src/cross-namespace-budget.ts +86 -19
  655. package/src/explicit-capture.ts +54 -17
  656. package/src/extraction.ts +2 -3
  657. package/src/faithfulness-graph-guard.test.ts +16 -69
  658. package/src/graph-recall.test.ts +31 -0
  659. package/src/index.ts +22 -2
  660. package/src/local-llm.ts +4 -6
  661. package/src/logger.ts +16 -0
  662. package/src/maintenance/dreams-ledger.ts +100 -49
  663. package/src/maintenance/rebuild-memory-lifecycle-ledger-cli.ts +77 -0
  664. package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +373 -9
  665. package/src/memory-lifecycle-ledger-utils.ts +51 -5
  666. package/src/namespaces/principal.test.ts +37 -1
  667. package/src/namespaces/principal.ts +48 -0
  668. package/src/namespaces/search.test.ts +79 -5
  669. package/src/namespaces/search.ts +59 -6
  670. package/src/namespaces/storage.ts +43 -1
  671. package/src/offline-sync-exclude-globs.ts +58 -0
  672. package/src/offline-sync-impression-drain.test.ts +316 -0
  673. package/src/offline-sync-impression-drain.ts +260 -0
  674. package/src/offline-sync.test.ts +32 -5
  675. package/src/offline-sync.ts +1 -14
  676. package/src/operator-toolkit.ts +1 -1
  677. package/src/orchestration/batch-deindex-flush.test.ts +146 -0
  678. package/src/orchestration/consolidation-run.ts +96 -85
  679. package/src/orchestration/extraction-envelope.ts +94 -0
  680. package/src/orchestration/extraction-persist-promotion.ts +134 -0
  681. package/src/orchestration/extraction-persist.ts +325 -260
  682. package/src/orchestration/extraction-run.test.ts +1 -1
  683. package/src/orchestration/extraction-run.ts +2 -2
  684. package/src/orchestration/graph-recall-coordinator.ts +18 -7
  685. package/src/orchestration/lifecycle-policy-coordinator.ts +63 -48
  686. package/src/orchestration/maintenance.test.ts +2103 -3
  687. package/src/orchestration/maintenance.ts +574 -2
  688. package/src/orchestration/namespace-read-fanout.ts +14 -8
  689. package/src/orchestration/orchestrator-helpers.ts +8 -1
  690. package/src/orchestration/orchestrator-init.ts +22 -6
  691. package/src/orchestration/orchestrator-namespace-scope.ts +71 -0
  692. package/src/orchestration/persistence-index.ts +64 -9
  693. package/src/orchestration/qmd-result-resolver.ts +27 -0
  694. package/src/orchestration/recall-entry.ts +34 -19
  695. package/src/orchestration/recall-internal.ts +207 -79
  696. package/src/orchestration/recall-rerank-coordinator.ts +229 -82
  697. package/src/orchestration/recall-result-formatter.ts +76 -20
  698. package/src/orchestration/recall-search-pipeline.test.ts +70 -0
  699. package/src/orchestration/recall-search-pipeline.ts +102 -129
  700. package/src/orchestration/recall-section-coordinator.ts +315 -85
  701. package/src/orchestration/semantic-consolidation-coordinator.ts +69 -37
  702. package/src/orchestration/session-context.ts +21 -0
  703. package/src/orchestration/workspace-ops.test.ts +348 -0
  704. package/src/orchestration/workspace-ops.ts +168 -34
  705. package/src/orchestrator-chunked-hash-durability.test.ts +126 -0
  706. package/src/orchestrator-connector-dedup.test.ts +1061 -40
  707. package/src/orchestrator-flush.test.ts +155 -39
  708. package/src/orchestrator-nonchunked-hash-durability.test.ts +121 -0
  709. package/src/orchestrator-source-attribution.test.ts +9 -9
  710. package/src/orchestrator.ts +160 -149
  711. package/src/prioritized-embed.ts +123 -0
  712. package/src/proactive-contention.test.ts +80 -0
  713. package/src/proactive-contention.ts +39 -0
  714. package/src/procedural/procedure-miner.test.ts +19 -14
  715. package/src/procedural/procedure-miner.ts +44 -13
  716. package/src/qmd-client.test.ts +111 -1
  717. package/src/qmd-status.ts +186 -0
  718. package/src/qmd.ts +47 -47
  719. package/src/recall-budget-config.test.ts +30 -0
  720. package/src/recall-cold-deadline.test.ts +149 -0
  721. package/src/recall-concurrency-config.ts +28 -0
  722. package/src/recall-memory-map.ts +74 -0
  723. package/src/recall-rerank-coordinator.test.ts +508 -0
  724. package/src/recall-state.test.ts +825 -1
  725. package/src/recall-state.ts +406 -7
  726. package/src/recall-timings-access.test.ts +41 -0
  727. package/src/recall-timings.ts +16 -0
  728. package/src/relay/mission-access.test.ts +5 -5
  729. package/src/rerank.ts +22 -0
  730. package/src/retrieval-agents.test.ts +79 -0
  731. package/src/retrieval-agents.ts +71 -19
  732. package/src/salvage-envelope.ts +28 -0
  733. package/src/scopes/scope-plan.test.ts +42 -0
  734. package/src/scopes/scope-plan.ts +45 -0
  735. package/src/search/port.ts +13 -0
  736. package/src/secure-store/index.ts +1 -0
  737. package/src/secure-store/secure-fs.ts +48 -0
  738. package/src/secure-store/secure-store.test.ts +40 -0
  739. package/src/semantic-rule-promotion.ts +13 -4
  740. package/src/storage/content-hash-index.ts +655 -0
  741. package/src/storage/entity-timeline.ts +473 -0
  742. package/src/storage/memory-lifecycle-ledger-access.ts +603 -0
  743. package/src/storage/secure-line-reader.test.ts +197 -0
  744. package/src/storage/secure-line-reader.ts +181 -3
  745. package/src/storage-append-header-sniff.test.ts +195 -0
  746. package/src/storage-behavior-signals-cache.test.ts +237 -0
  747. package/src/storage-contract/cache-coherence.test.ts +96 -1
  748. package/src/storage-contract/content-hash.test.ts +47 -2
  749. package/src/storage-fact-hash-index-defer.test.ts +1200 -0
  750. package/src/storage-memory-lifecycle-ledger.test.ts +1146 -3
  751. package/src/storage.ts +882 -890
  752. package/src/structured-attributes.ts +52 -0
  753. package/src/temporal-index-batch.ts +112 -0
  754. package/src/temporal-index.test.ts +193 -0
  755. package/src/temporal-index.ts +49 -53
  756. package/src/testing/lifecycle-matrix.test.ts +212 -0
  757. package/src/testing/lifecycle-matrix.ts +271 -0
  758. package/src/testing/orchestrator-lite.ts +236 -0
  759. package/src/testing/subjects/dreams-ledger.test.ts +67 -0
  760. package/src/testing/subjects/extraction-lifecycle.test.ts +442 -0
  761. package/src/testing/subjects/lifecycle-ledger.test.ts +93 -0
  762. package/src/testing/subjects/recall-budget.test.ts +461 -0
  763. package/src/testing/subjects/serialized-write-chain.test.ts +224 -0
  764. package/src/trust-score-stage.test.ts +154 -0
  765. package/src/trust-score-stage.ts +216 -53
  766. package/src/types-continuity.ts +57 -0
  767. package/src/types.ts +51 -77
  768. package/src/utils/path-containment.test.ts +75 -0
  769. package/src/utils/path-containment.ts +76 -0
  770. package/src/utils/serialize-mutations.test.ts +122 -0
  771. package/src/utils/serialize-mutations.ts +68 -3
  772. package/src/wearables/memory-gen.test.ts +31 -9
  773. package/src/wearables/memory-gen.ts +95 -55
  774. package/src/wearables/pipeline.test.ts +10 -7
  775. package/src/wearables/service.test.ts +6 -8
  776. package/src/wearables/service.ts +2 -2
  777. package/src/write-envelope.extension.test.ts +111 -0
  778. package/src/write-envelope.test.ts +683 -0
  779. package/src/write-envelope.ts +902 -0
  780. package/src/write-quarantine.test.ts +193 -0
  781. package/src/write-quarantine.ts +241 -0
  782. package/src/write-rate-limiter.test.ts +105 -0
  783. package/src/write-rate-limiter.ts +135 -0
  784. package/src/write-sealed-parity.test.ts +204 -0
  785. package/dist/chunk-2VN4JAX7.js.map +0 -1
  786. package/dist/chunk-37CTGERM.js.map +0 -1
  787. package/dist/chunk-3IY64MV6.js.map +0 -1
  788. package/dist/chunk-BCDKBDSY.js.map +0 -1
  789. package/dist/chunk-BFPETA3S.js.map +0 -1
  790. package/dist/chunk-BFVEEB7W.js.map +0 -1
  791. package/dist/chunk-BS4SGLWV.js.map +0 -1
  792. package/dist/chunk-DCFV7A7H.js.map +0 -1
  793. package/dist/chunk-DYP3YYJJ.js.map +0 -1
  794. package/dist/chunk-E5BK6CGV.js +0 -335
  795. package/dist/chunk-E5BK6CGV.js.map +0 -1
  796. package/dist/chunk-FTYDWKO6.js.map +0 -1
  797. package/dist/chunk-GWTFLF2P.js.map +0 -1
  798. package/dist/chunk-IKQTFQMI.js.map +0 -1
  799. package/dist/chunk-INELTPRG.js.map +0 -1
  800. package/dist/chunk-J2HSAU72.js.map +0 -1
  801. package/dist/chunk-JREB6UFH.js.map +0 -1
  802. package/dist/chunk-K7LOWSLU.js.map +0 -1
  803. package/dist/chunk-KQDNAXOM.js.map +0 -1
  804. package/dist/chunk-KSBEEMQF.js.map +0 -1
  805. package/dist/chunk-KSNVDPDF.js.map +0 -1
  806. package/dist/chunk-LC7OODWZ.js.map +0 -1
  807. package/dist/chunk-LTJAMRGI.js.map +0 -1
  808. package/dist/chunk-LZOV7MX7.js.map +0 -1
  809. package/dist/chunk-NWTGD4AN.js.map +0 -1
  810. package/dist/chunk-ODPLEWB6.js.map +0 -1
  811. package/dist/chunk-OVJ2HIPE.js.map +0 -1
  812. package/dist/chunk-PBSAPHHA.js.map +0 -1
  813. package/dist/chunk-PHK3HARR.js +0 -32
  814. package/dist/chunk-PHK3HARR.js.map +0 -1
  815. package/dist/chunk-PLQE6MJA.js.map +0 -1
  816. package/dist/chunk-QKQYXZVS.js.map +0 -1
  817. package/dist/chunk-QQGPUKMT.js.map +0 -1
  818. package/dist/chunk-RANHFI3P.js +0 -8
  819. package/dist/chunk-RANHFI3P.js.map +0 -1
  820. package/dist/chunk-RAR2BSEM.js.map +0 -1
  821. package/dist/chunk-RULE4VG5.js.map +0 -1
  822. package/dist/chunk-SVOZFLIQ.js +0 -16
  823. package/dist/chunk-SVOZFLIQ.js.map +0 -1
  824. package/dist/chunk-T7Y5KPLN.js.map +0 -1
  825. package/dist/chunk-TXLGHDHS.js.map +0 -1
  826. package/dist/chunk-VDW4VU7B.js.map +0 -1
  827. package/dist/chunk-VSMRDBFT.js +0 -17
  828. package/dist/chunk-VSMRDBFT.js.map +0 -1
  829. package/dist/chunk-X64YLC24.js.map +0 -1
  830. package/dist/chunk-XDSXEKYK.js +0 -118
  831. package/dist/chunk-XDSXEKYK.js.map +0 -1
  832. package/dist/chunk-YF6FMLBT.js.map +0 -1
  833. package/dist/resolution-VH4NGENZ.js +0 -12
  834. /package/dist/{capsule-crypto-CZJSLEFG.js.map → access-citation.js.map} +0 -0
  835. /package/dist/{contradiction-scan-J57T5QV7.js.map → access-memory-search-fanout.js.map} +0 -0
  836. /package/dist/{dreams-ledger-6UODQOX6.js.map → access-recall-concurrency.js.map} +0 -0
  837. /package/dist/{graph-edge-decay-IOGBBAGC.js.map → access-recall-response.js.map} +0 -0
  838. /package/dist/{resolution-VH4NGENZ.js.map → bounded-jsonl-state.js.map} +0 -0
  839. /package/dist/{chunk-A3GOMRJG.js.map → chunk-23L3IXFD.js.map} +0 -0
  840. /package/dist/{chunk-MRHFJV44.js.map → chunk-2DQ2XREU.js.map} +0 -0
  841. /package/dist/{chunk-L2B3EE7B.js.map → chunk-2QMKMVHH.js.map} +0 -0
  842. /package/dist/{chunk-VJVNLNDQ.js.map → chunk-2UFO7X4Q.js.map} +0 -0
  843. /package/dist/{chunk-2MR3MFQB.js.map → chunk-2VEOKUPP.js.map} +0 -0
  844. /package/dist/{chunk-RHOZ5LLO.js.map → chunk-347WD2LE.js.map} +0 -0
  845. /package/dist/{chunk-HDTQVNWD.js.map → chunk-3QAH2S33.js.map} +0 -0
  846. /package/dist/{chunk-LRNMRXJO.js.map → chunk-3Y224NYC.js.map} +0 -0
  847. /package/dist/{chunk-VFSP73LP.js.map → chunk-45GF7Y3V.js.map} +0 -0
  848. /package/dist/{chunk-OEHCMALU.js.map → chunk-5I4M26Q7.js.map} +0 -0
  849. /package/dist/{chunk-2AZXIZEN.js.map → chunk-5Q7EVV4X.js.map} +0 -0
  850. /package/dist/{chunk-PUBTHW5O.js.map → chunk-6DRPPQEJ.js.map} +0 -0
  851. /package/dist/{chunk-FDCTQWLW.js.map → chunk-6O22TZSB.js.map} +0 -0
  852. /package/dist/{chunk-ZQ7UBUZ6.js.map → chunk-6QYST5XN.js.map} +0 -0
  853. /package/dist/{chunk-W4PGTAS2.js.map → chunk-6WAFYNVT.js.map} +0 -0
  854. /package/dist/{chunk-R5VAVVHP.js.map → chunk-72A4L5JJ.js.map} +0 -0
  855. /package/dist/{chunk-3FAMU5TX.js.map → chunk-A6USBZTO.js.map} +0 -0
  856. /package/dist/{chunk-ZHIVCODT.js.map → chunk-A72SWTWW.js.map} +0 -0
  857. /package/dist/{chunk-FC77VUX5.js.map → chunk-A7Q43EUZ.js.map} +0 -0
  858. /package/dist/{chunk-UJBESW6X.js.map → chunk-AE7WMV4V.js.map} +0 -0
  859. /package/dist/{chunk-A5UXZRRM.js.map → chunk-AJ7QCSIS.js.map} +0 -0
  860. /package/dist/{chunk-FNMFJWBY.js.map → chunk-ANEUPF6O.js.map} +0 -0
  861. /package/dist/{chunk-2A3OXAP2.js.map → chunk-B7RWBZXW.js.map} +0 -0
  862. /package/dist/{chunk-74F5STS4.js.map → chunk-BLAKS3CP.js.map} +0 -0
  863. /package/dist/{chunk-M7VGG3ID.js.map → chunk-BV5WMSIJ.js.map} +0 -0
  864. /package/dist/{chunk-2BFLDH5F.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  865. /package/dist/{chunk-UXKMMNJD.js.map → chunk-C23BYTJV.js.map} +0 -0
  866. /package/dist/{chunk-JZHHREBL.js.map → chunk-C3AKM55W.js.map} +0 -0
  867. /package/dist/{chunk-RP7YXA67.js.map → chunk-C5JF6EZ7.js.map} +0 -0
  868. /package/dist/{chunk-EHCONI6E.js.map → chunk-CQMEM5CC.js.map} +0 -0
  869. /package/dist/{chunk-PBNZVPFS.js.map → chunk-CXZQOVIE.js.map} +0 -0
  870. /package/dist/{chunk-7N2RUBAP.js.map → chunk-DDA47TES.js.map} +0 -0
  871. /package/dist/{chunk-64SE4X5G.js.map → chunk-DEBHXHJR.js.map} +0 -0
  872. /package/dist/{chunk-EHK6KZHK.js.map → chunk-DNHVPZOD.js.map} +0 -0
  873. /package/dist/{chunk-437S3G37.js.map → chunk-DQEMWVMT.js.map} +0 -0
  874. /package/dist/{chunk-LZZNTPLR.js.map → chunk-DX3XRGLH.js.map} +0 -0
  875. /package/dist/{chunk-DZKHSDOM.js.map → chunk-ES36HTSC.js.map} +0 -0
  876. /package/dist/{chunk-TN7THW5U.js.map → chunk-ET356KSB.js.map} +0 -0
  877. /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
  878. /package/dist/{chunk-DMSDUGDM.js.map → chunk-F7GAIWFA.js.map} +0 -0
  879. /package/dist/{chunk-G6XXLKC5.js.map → chunk-FFPJINJE.js.map} +0 -0
  880. /package/dist/{chunk-G4CN3ZXL.js.map → chunk-FUTF72MJ.js.map} +0 -0
  881. /package/dist/{chunk-HF77M34J.js.map → chunk-GFPZS3F5.js.map} +0 -0
  882. /package/dist/{chunk-G6NKALRN.js.map → chunk-H4WG3UQZ.js.map} +0 -0
  883. /package/dist/{chunk-UDQUSU27.js.map → chunk-HNZKVLAN.js.map} +0 -0
  884. /package/dist/{chunk-5EZXHU36.js.map → chunk-HYQJQGD3.js.map} +0 -0
  885. /package/dist/{chunk-TRWPCR6P.js.map → chunk-JECBQBEX.js.map} +0 -0
  886. /package/dist/{chunk-E6CBU7XP.js.map → chunk-JYIFGGEM.js.map} +0 -0
  887. /package/dist/{chunk-VA4WSW54.js.map → chunk-JYIJNNN3.js.map} +0 -0
  888. /package/dist/{chunk-L5HJQC36.js.map → chunk-K2TDK7GG.js.map} +0 -0
  889. /package/dist/{chunk-KDXVOFYY.js.map → chunk-KAVBJSBQ.js.map} +0 -0
  890. /package/dist/{chunk-4OKLXWDZ.js.map → chunk-KNB7IBBU.js.map} +0 -0
  891. /package/dist/{chunk-QLULYKWZ.js.map → chunk-KSXJOC4F.js.map} +0 -0
  892. /package/dist/{chunk-2S6QHZGJ.js.map → chunk-L2DPF4DF.js.map} +0 -0
  893. /package/dist/{chunk-JI5AVXYO.js.map → chunk-LEPOP46W.js.map} +0 -0
  894. /package/dist/{chunk-O7BBFJLP.js.map → chunk-LTAVSOZW.js.map} +0 -0
  895. /package/dist/{chunk-2IZAGAJR.js.map → chunk-LULR4IUW.js.map} +0 -0
  896. /package/dist/{chunk-WMWVO45V.js.map → chunk-MC6XO7T4.js.map} +0 -0
  897. /package/dist/{chunk-D6RIFG4O.js.map → chunk-MNB5RMAY.js.map} +0 -0
  898. /package/dist/{chunk-Q5WG43OP.js.map → chunk-MYFQ3ED4.js.map} +0 -0
  899. /package/dist/{chunk-V3UE5I5F.js.map → chunk-MYVPLJOO.js.map} +0 -0
  900. /package/dist/{chunk-MTWKDOVO.js.map → chunk-NLE6TSLG.js.map} +0 -0
  901. /package/dist/{chunk-DBRYEIGY.js.map → chunk-OJP3N7UK.js.map} +0 -0
  902. /package/dist/{chunk-SMX5267P.js.map → chunk-OZKOPQCM.js.map} +0 -0
  903. /package/dist/{chunk-JCK7V6SN.js.map → chunk-P65YJEEL.js.map} +0 -0
  904. /package/dist/{chunk-MTR7BZQN.js.map → chunk-PBGWYM3H.js.map} +0 -0
  905. /package/dist/{chunk-AXTXN4T6.js.map → chunk-PWFCHOB3.js.map} +0 -0
  906. /package/dist/{chunk-FDPZVY6D.js.map → chunk-QFN4U7AG.js.map} +0 -0
  907. /package/dist/{chunk-K2ZLHESQ.js.map → chunk-QIEUU4UK.js.map} +0 -0
  908. /package/dist/{chunk-3D6AFGQR.js.map → chunk-QVT3E4CE.js.map} +0 -0
  909. /package/dist/{chunk-SFQ6QNL7.js.map → chunk-R6YJI3HE.js.map} +0 -0
  910. /package/dist/{chunk-5CJVLG3H.js.map → chunk-RFDD3B7W.js.map} +0 -0
  911. /package/dist/{chunk-JBPKEARU.js.map → chunk-RKNJBZ55.js.map} +0 -0
  912. /package/dist/{chunk-FNZQGN76.js.map → chunk-S2BBISHU.js.map} +0 -0
  913. /package/dist/{chunk-IALLX7EE.js.map → chunk-S2FSBU4H.js.map} +0 -0
  914. /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
  915. /package/dist/{chunk-DPAENM7O.js.map → chunk-U3ZAVRP3.js.map} +0 -0
  916. /package/dist/{chunk-4KJLYTLS.js.map → chunk-V57NLO5P.js.map} +0 -0
  917. /package/dist/{chunk-FLVL4L3L.js.map → chunk-VDX2J7OX.js.map} +0 -0
  918. /package/dist/{chunk-AJLLIIML.js.map → chunk-W4FBGYGK.js.map} +0 -0
  919. /package/dist/{chunk-6SXVCD7W.js.map → chunk-W7IGLX4G.js.map} +0 -0
  920. /package/dist/{chunk-KAWTOYAW.js.map → chunk-WLZYGLJ4.js.map} +0 -0
  921. /package/dist/{chunk-RO4LQGT3.js.map → chunk-WON4APQY.js.map} +0 -0
  922. /package/dist/{chunk-PQVK2S3J.js.map → chunk-WZFAPHIK.js.map} +0 -0
  923. /package/dist/{chunk-KQPJLK3X.js.map → chunk-XL24QQ63.js.map} +0 -0
  924. /package/dist/{chunk-RVZRYUQH.js.map → chunk-YROFNEG5.js.map} +0 -0
  925. /package/dist/{chunk-VRAD2FGO.js.map → chunk-Z54EM5YZ.js.map} +0 -0
  926. /package/dist/{first-start-migration-TI67YMLG.js.map → first-start-migration-CSRHCJIQ.js.map} +0 -0
  927. /package/dist/{forget-CQCLB5LB.js.map → forget-HRPLVB3W.js.map} +0 -0
  928. /package/dist/{purge-NDWV6WYD.js.map → purge-IRF47ZTX.js.map} +0 -0
  929. /package/dist/{tier-stats-KV7IWCJR.js.map → tier-stats-QEJSPFV2.js.map} +0 -0
@@ -21,16 +21,20 @@
21
21
 
22
22
  import { resolveNamespaceCapabilities,
23
23
  resolveQmdCapabilities,resolveConsolidationCapabilities, resolveRecallAuxiliaryCapabilities } from "../capabilities.js";
24
- import { existsSync } from "node:fs";
24
+ import { existsSync, type Dirent } from "node:fs";
25
+ import { appendFile, lstat, mkdir, readFile, readdir, realpath, stat, writeFile } from "node:fs/promises";
25
26
  import path from "node:path";
26
27
 
27
28
  import type { PluginConfig } from "../types.js";
28
29
  import type { SearchBackend } from "../search/port.js";
30
+ import type { StorageManager } from "../index.js";
29
31
  import {
30
32
  NamespaceSearchRouter,
31
33
  type NamespaceUpdateResult,
32
34
  } from "../namespaces/search.js";
33
- import type { NamespaceCatalog } from "../namespaces/catalog.js";
35
+ import type { NamespaceCatalog, NamespaceRecord } from "../namespaces/catalog.js";
36
+ import { namespaceIdentityFromToken } from "../namespaces/identity.js";
37
+ import { isSafeRouteNamespace } from "../routing/engine.js";
34
38
  import {
35
39
  planNamespaceMaintenance,
36
40
  runNamespaceMaintenanceBatchPlan,
@@ -46,8 +50,21 @@ import {
46
50
  ensureProceduralMiningCron,
47
51
  graphEdgeDecayCadenceToCronExpr,
48
52
  } from "../maintenance/memory-governance-cron.js";
53
+ import { rebuildMemoryLifecycleLedger } from "../maintenance/rebuild-memory-lifecycle-ledger.js";
54
+ import {
55
+ drainPendingLifecycleLedgerIfAny,
56
+ pendingLifecycleLedgerDir,
57
+ type LifecyclePendingIo,
58
+ } from "../storage/memory-lifecycle-ledger-access.js";
59
+ import { STATE_FILE_MAX_DECRYPT_BYTES } from "../storage/secure-line-reader.js";
49
60
  import { resolveHomeDir } from "../runtime/env.js";
50
61
  import { log } from "../logger.js";
62
+ import { isErrnoCode } from "../utils/errno.js";
63
+ import { assertPathInsideRoot, listContainedSpillFiles } from "../utils/path-containment.js";
64
+ import {
65
+ probeEncryptedRegularFileHeader,
66
+ SECURE_STORE_ENVELOPE_OVERHEAD_BYTES,
67
+ } from "../secure-store/secure-fs.js";
51
68
 
52
69
  /** Reason a QMD maintenance pass was skipped, used for status recording. */
53
70
  function qmdMaintenanceSkipReasonForError(
@@ -68,6 +85,21 @@ export interface MaintenanceSchedulerDeps {
68
85
  getQmd: () => SearchBackend;
69
86
  namespaceSearchRouter: NamespaceSearchRouter;
70
87
  namespaceCatalog: NamespaceCatalog;
88
+ /**
89
+ * Root storage (secure-store configured). Threaded so lifecycle-ledger
90
+ * auto-compaction (#1910) rebuilds through the live secure context: encrypted
91
+ * memories stay decryptable and the rewritten ledger stays encrypted at rest.
92
+ * Omitted in focused tests, where compaction falls back to a fresh plaintext
93
+ * StorageManager (the CLI-equivalent path).
94
+ */
95
+ getStorage?: () => StorageManager;
96
+ /**
97
+ * Resolve a namespace's (secure-store aware) storage. Threaded so
98
+ * auto-compaction also bounds per-namespace lifecycle ledgers under
99
+ * `memoryDir/namespaces/<token>/state/`, not just the root state path
100
+ * (#1910). Consulted only when namespaces are enabled.
101
+ */
102
+ storageForNamespace?: (namespace: string) => Promise<StorageManager>;
71
103
  }
72
104
 
73
105
  /**
@@ -91,6 +123,16 @@ export class MaintenanceScheduler {
91
123
  private lastQmdEmbedAtMs = 0;
92
124
  private lastQmdEmbedAtMsByNamespace = new Map<string, number>();
93
125
 
126
+ // ── Lifecycle-ledger auto-compaction state (issue #1910) ──
127
+ private lifecycleCompactionInFlight = false;
128
+ private lastLifecycleCompactionAtMs = 0;
129
+ // Upper bound on a rewritten ledger; a preserving compaction is bounded to
130
+ // this so it can never leave the ledger over the whole-file read/decrypt cap
131
+ // (#2033). Defaults to the decrypt cap; overridable in focused tests to drive
132
+ // the bounding + post-write verification deterministically without a 400MB
133
+ // fixture.
134
+ private lifecycleLedgerMaxBytes = STATE_FILE_MAX_DECRYPT_BYTES;
135
+
94
136
  constructor(private readonly deps: MaintenanceSchedulerDeps) {}
95
137
 
96
138
  // ───────────────────────────────────────────────────────────────────────
@@ -429,6 +471,16 @@ export class MaintenanceScheduler {
429
471
  const msg = err instanceof Error ? err.message : String(err);
430
472
  log.warn(`qmd maintenance request failed (${reason}): ${msg}`);
431
473
  }
474
+ // Lifecycle-ledger auto-compaction (#1910) must run independently of QMD.
475
+ // When QMD is unavailable or its maintenance capability is off,
476
+ // requestQmdMaintenance() short-circuits and runQmdMaintenance() never
477
+ // fires — so a compaction check living only in that path would never run.
478
+ // Fire it here on every maintenance request (throttled, size-gated,
479
+ // single-flighted, never awaited, never throws) so a QMD-off deployment
480
+ // still bounds the lifecycle ledger.
481
+ void this.maybeCompactMemoryLifecycleLedger().catch((err) =>
482
+ log.debug(`lifecycle ledger auto-compaction check failed (non-fatal): ${err}`),
483
+ );
432
484
  }
433
485
 
434
486
  /** Internal: run a single QMD maintenance pass under singleflight guard. */
@@ -535,6 +587,526 @@ export class MaintenanceScheduler {
535
587
  if (this.qmdMaintenancePending) {
536
588
  this.requestQmdMaintenance();
537
589
  }
590
+ // Lifecycle-ledger auto-compaction is triggered from
591
+ // requestQmdMaintenanceForTool (every maintenance request, QMD or not),
592
+ // so it does not need to be re-fired here (issue #1910).
593
+ }
594
+ }
595
+
596
+ /**
597
+ * Size-gated, throttled, single-flighted auto-compaction of the lifecycle
598
+ * ledger (issue #1910). Compacts the root ledger AND every namespace ledger
599
+ * (`memoryDir/namespaces/<token>/state/`) when namespaces are enabled, each
600
+ * through the existing `rebuildMemoryLifecycleLedger` so the
601
+ * archive-then-atomic-write discipline is reused verbatim. `0` disables.
602
+ *
603
+ * Before compacting, drain EVERY target's durable pending-append spill (the
604
+ * root ledger AND each namespace ledger) so a lifecycle event that spilled
605
+ * while a prior long rewrite held the lock is folded back into its ledger and
606
+ * cannot be silently lost (issue #2033). Draining is independent of both the
607
+ * compaction threshold and the min-interval throttle: targets are enumerated
608
+ * through the same safe (symlink/containment-checked) resolver and every
609
+ * eligible queue is drained BEFORE any throttle return, so a namespace spill
610
+ * created after the previous pass never waits out the whole interval.
611
+ * Encrypted-store safety is preserved — a keyed target drains through its
612
+ * secure StorageManager, a filesystem-fallback target only through a plaintext
613
+ * context that refuses encrypted ledgers/spills. Work stays bounded: one
614
+ * target enumeration plus a bounded per-queue drain.
615
+ *
616
+ * The min-interval throttle timestamp advances ONLY after real, fully
617
+ * successful compaction work: a failed OR deferred target leaves the throttle
618
+ * un-advanced so it stays eligible on the next maintenance pass, while
619
+ * `lifecycleCompactionInFlight` still prevents overlapping runs. A "deferred"
620
+ * target is oversized but could not be compacted because its encrypted ledger
621
+ * has no unlocked secure store — arming the throttle for it would suppress the
622
+ * retry of that still-oversized ledger for the whole interval (#2033).
623
+ *
624
+ * The min-interval throttle is bypassed for one case: an encrypted ledger
625
+ * already at/over the whole-file decrypt cap is unreadable, so it must be
626
+ * clamped on the next pass rather than wait out the interval. Ordinary
627
+ * below-cap (or plaintext) targets stay throttled (#2033).
628
+ */
629
+ private async maybeCompactMemoryLifecycleLedger(): Promise<void> {
630
+ // Enumerate every lifecycle target (root + namespaces) through the safe,
631
+ // containment-checked resolver, and fold each one's durable pending spill
632
+ // back into its ledger BEFORE any threshold or throttle return (#2033). A
633
+ // spill created after the previous pass must land promptly even while
634
+ // compaction is throttled or disabled; draining is bounded per queue and
635
+ // never bypasses encrypted-store safety.
636
+ const targets = await this.resolveLifecycleCompactionTargets();
637
+ for (const target of targets) {
638
+ await this.drainPendingForTarget(target);
639
+ }
640
+
641
+ const threshold = this.deps.config.memoryLifecycleLedgerCompactBytes;
642
+ if (!(threshold > 0)) return; // 0 / negative / non-numeric disables compaction.
643
+ if (this.lifecycleCompactionInFlight) return;
644
+ const now = Date.now();
645
+ if (
646
+ now - this.lastLifecycleCompactionAtMs <
647
+ this.deps.config.memoryLifecycleLedgerCompactMinIntervalMs &&
648
+ !(await this.hasOverCapEncryptedLifecycleLedger(targets))
649
+ ) {
650
+ // Throttled: no ordinary target is due yet. The exception is an encrypted
651
+ // ledger already at/over the whole-file decrypt cap — it is unreadable, so
652
+ // the global min-interval must not defer clamping it for a whole interval.
653
+ // The guard above lets such a target through immediately (compaction then
654
+ // clamps it via the cap-aware effective threshold) while ordinary
655
+ // below-cap targets stay throttled (#2033).
656
+ return;
657
+ }
658
+ // The over-cap probe above awaits, so a second maintenance request can pass
659
+ // the early `lifecycleCompactionInFlight` guard and reach here during that
660
+ // await. Recheck the guard immediately before claiming it — otherwise two
661
+ // racing requests both see an over-cap ledger and run duplicate 400MB-class
662
+ // compactions/backups back-to-back (#2033). The set below is synchronous
663
+ // with this recheck (no await between), so exactly one caller wins.
664
+ if (this.lifecycleCompactionInFlight) return;
665
+ this.lifecycleCompactionInFlight = true;
666
+ try {
667
+ let compacted = 0;
668
+ let failed = 0;
669
+ let deferred = 0;
670
+ for (const target of targets) {
671
+ const outcome = await this.compactLifecycleLedgerTarget(target, threshold);
672
+ if (outcome === "compacted") compacted += 1;
673
+ else if (outcome === "failed") failed += 1;
674
+ else if (outcome === "deferred") deferred += 1;
675
+ }
676
+ // Arm the throttle only when at least one ledger actually compacted AND
677
+ // nothing failed AND nothing was deferred. A below-threshold no-op
678
+ // (compacted === 0), any failure, or a deferred oversized ledger (locked
679
+ // encrypted store, still pending) leaves the throttle where it was so the
680
+ // next pass retries the untouched targets (#2033).
681
+ if (compacted > 0 && failed === 0 && deferred === 0) {
682
+ this.lastLifecycleCompactionAtMs = now;
683
+ }
684
+ } finally {
685
+ this.lifecycleCompactionInFlight = false;
686
+ }
687
+ }
688
+
689
+ /**
690
+ * True when any lifecycle target's ledger is encrypted at rest AND its
691
+ * on-disk size is at/over the whole-file decrypt cap. Such a ledger is already
692
+ * unreadable (the secure reader refuses at/over the cap), so it must reach the
693
+ * bounded compaction path on the next maintenance pass regardless of the
694
+ * global min-interval throttle — otherwise the throttle could keep an
695
+ * unreadable ledger un-clamped for a whole interval (#2033). Ordinary
696
+ * below-cap or plaintext targets never match, so the throttle still governs
697
+ * them. A stat/probe failure yields "no forced target" and is left to the
698
+ * normal compaction path, which classifies it as failed and retries.
699
+ */
700
+ private async hasOverCapEncryptedLifecycleLedger(
701
+ targets: Array<{ memoryDir: string; storage?: StorageManager }>,
702
+ ): Promise<boolean> {
703
+ for (const target of targets) {
704
+ const ledgerPath = path.join(target.memoryDir, "state", "memory-lifecycle-ledger.jsonl");
705
+ let size: number;
706
+ try {
707
+ size = (await stat(ledgerPath)).size;
708
+ } catch {
709
+ continue; // absent/unstattable — nothing to force here.
710
+ }
711
+ if (size < this.lifecycleLedgerMaxBytes) continue;
712
+ try {
713
+ if (await probeEncryptedRegularFileHeader(ledgerPath)) return true;
714
+ } catch {
715
+ continue; // probe failure — the normal compaction path reports it.
716
+ }
717
+ }
718
+ return false;
719
+ }
720
+
721
+ /**
722
+ * Drain one compaction target's durable pending spill. A catalog-backed
723
+ * target folds through its secure StorageManager; a filesystem-fallback
724
+ * target (no storage) folds through a path-scoped plaintext context that
725
+ * refuses encrypted ledgers/spills so a keyless drain never downgrades an
726
+ * encrypted ledger (issue #2033).
727
+ */
728
+ private async drainPendingForTarget(
729
+ target: { memoryDir: string; storage?: StorageManager },
730
+ ): Promise<void> {
731
+ if (target.storage) {
732
+ await this.drainPendingLifecycleAppends(target.storage);
733
+ } else {
734
+ await this.drainPendingLifecycleAppendsForPath(target.memoryDir);
735
+ }
736
+ }
737
+
738
+ /** Drain a target's durable pending lifecycle-append spill into its ledger
739
+ * (issue #2033); non-fatal and a fast no-op when nothing is pending. */
740
+ private async drainPendingLifecycleAppends(storage: StorageManager | undefined): Promise<void> {
741
+ if (!storage) return;
742
+ try {
743
+ await storage.drainPendingMemoryLifecycleEvents();
744
+ } catch (err) {
745
+ log.debug(`lifecycle pending drain failed (non-fatal): ${err}`);
746
+ }
747
+ }
748
+
749
+ /**
750
+ * Drain a filesystem-fallback target's pending lifecycle-append spill when no
751
+ * secure StorageManager is available (catalog-disabled namespace; issue
752
+ * #2033). Uses the safe path-scoped PLAINTEXT context this fallback already
753
+ * operates in: a keyless drain can only fold plaintext spills into a plaintext
754
+ * ledger, so it refuses when the ledger or ANY spill is encrypted at rest,
755
+ * leaving those pending for a keyed (catalog-path) drain — exactly mirroring
756
+ * the fallback compaction's encrypted-ledger deferral. Non-fatal; a fast
757
+ * no-op when nothing is pending. The shared spill lister enforces the symlink/
758
+ * containment guard on every spill file it reads or deletes.
759
+ */
760
+ private async drainPendingLifecycleAppendsForPath(memoryDir: string): Promise<void> {
761
+ const ledgerPath = path.join(memoryDir, "state", "memory-lifecycle-ledger.jsonl");
762
+ const spillDir = pendingLifecycleLedgerDir(ledgerPath);
763
+ // Enumerate spills through the SAME guarded lister the actual drain uses
764
+ // (listContainedSpillFiles): it rejects a symlinked/non-directory spill dir
765
+ // and skips any symlink/FIFO/device/escaping entry, returning only regular
766
+ // files contained in the dir. Never raw-readdir + open() an untrusted name:
767
+ // opening a FIFO would block until a writer appears and a symlink would
768
+ // redirect the probe outside the dir (#2033). Enumerate BOTH live `*.jsonl`
769
+ // spills and crash-orphaned `*.jsonl.claimed` files: a drain that died
770
+ // between claiming a spill (rename to `.claimed`) and committing it leaves
771
+ // the ONLY copy of those rows as a claimed orphan. Gating solely on live
772
+ // spills would early-return here whenever the pending dir holds nothing but
773
+ // orphans, stranding those rows forever; proceeding lets
774
+ // drainPendingLifecycleLedgerIfAny -> recoverOrphanedClaims restore and
775
+ // re-commit them under the ledger lock (#2033).
776
+ let spillFiles: string[];
777
+ let claimedOrphans: string[];
778
+ try {
779
+ spillFiles = await listContainedSpillFiles(spillDir);
780
+ claimedOrphans = await listContainedSpillFiles(spillDir, ".jsonl.claimed");
781
+ } catch (err) {
782
+ log.debug(`fallback lifecycle pending scan failed (non-fatal) for ${memoryDir}: ${err}`);
783
+ return;
784
+ }
785
+ if (spillFiles.length === 0 && claimedOrphans.length === 0) return;
786
+ // The pending encryption state is authoritative only UNDER the ledger lock:
787
+ // drainPendingLifecycleLedgerIfAny waits for the lock and re-enumerates the
788
+ // pending dir, so a secure-store writer that spills an encrypted file — or a
789
+ // keyed compaction that rewrites the ledger encrypted — while this fallback
790
+ // waits would defeat any pre-lock probe (#2033). Probe each file at the
791
+ // moment of use inside the held lock instead: readSecure refuses an
792
+ // encrypted spill (the fold reads each spill lazily and propagates the throw
793
+ // BEFORE claiming that spill, leaving it intact) and the append refuses a
794
+ // ledger that became encrypted (the fold rolls the claims back). Either way
795
+ // the plaintext IO
796
+ // never reads or writes ciphertext; the keyed catalog-path drain handles the
797
+ // deferred rows.
798
+ const io: LifecyclePendingIo = {
799
+ writeSecure: async (filePath, payload) => {
800
+ await mkdir(path.dirname(filePath), { recursive: true });
801
+ await writeFile(filePath, payload, "utf-8");
802
+ },
803
+ readSecure: async (filePath) => {
804
+ if (await probeEncryptedRegularFileHeader(filePath)) {
805
+ throw new Error(`fallback lifecycle drain deferred: encrypted spill at ${filePath}`);
806
+ }
807
+ return readFile(filePath, "utf-8");
808
+ },
809
+ };
810
+ try {
811
+ await drainPendingLifecycleLedgerIfAny(
812
+ ledgerPath,
813
+ io,
814
+ async (payload) => {
815
+ if (await probeEncryptedRegularFileHeader(ledgerPath)) {
816
+ throw new Error(`fallback lifecycle drain deferred: ledger became encrypted at ${ledgerPath}`);
817
+ }
818
+ await appendFile(ledgerPath, payload, "utf-8");
819
+ },
820
+ async () => {
821
+ await mkdir(path.dirname(ledgerPath), { recursive: true });
822
+ },
823
+ );
824
+ } catch (err) {
825
+ log.debug(`fallback lifecycle pending drain failed (non-fatal) for ${memoryDir}: ${err}`);
826
+ }
827
+ }
828
+
829
+ /**
830
+ * Enumerate the lifecycle ledgers to consider for compaction: the root
831
+ * (through the secure-configured root storage when available) plus every
832
+ * cataloged namespace ledger when namespaces are enabled. Deduplicated by
833
+ * resolved storage dir so a namespace that collapses onto the root is not
834
+ * compacted twice. Namespace resolution failures are non-fatal.
835
+ */
836
+ private async resolveLifecycleCompactionTargets(): Promise<
837
+ Array<{ memoryDir: string; storage?: StorageManager }>
838
+ > {
839
+ const targets: Array<{ memoryDir: string; storage?: StorageManager }> = [];
840
+ const seen = new Set<string>();
841
+ const addTarget = (memoryDir: string, storage?: StorageManager): void => {
842
+ const key = path.resolve(memoryDir);
843
+ if (seen.has(key)) return;
844
+ seen.add(key);
845
+ targets.push({ memoryDir, storage });
846
+ };
847
+
848
+ const rootStorage = this.deps.getStorage?.();
849
+ addTarget(rootStorage ? rootStorage.dir : this.deps.config.memoryDir, rootStorage);
850
+
851
+ const resolveNamespaceStorage = this.deps.storageForNamespace;
852
+ if (resolveNamespaceStorage && this.deps.namespaceCatalog?.enabled) {
853
+ let records: NamespaceRecord[] = [];
854
+ try {
855
+ records = await this.deps.namespaceCatalog.listNamespaces();
856
+ } catch (err) {
857
+ log.debug(`lifecycle compaction: namespace enumeration failed (non-fatal): ${err}`);
858
+ }
859
+ for (const record of records) {
860
+ const namespace = record.namespace.trim();
861
+ if (!namespace) continue;
862
+ try {
863
+ const storage = await resolveNamespaceStorage(namespace);
864
+ addTarget(storage.dir, storage);
865
+ } catch (err) {
866
+ log.debug(
867
+ `lifecycle compaction: storage resolve failed for namespace ${namespace} (non-fatal): ${err}`,
868
+ );
869
+ }
870
+ }
871
+ }
872
+
873
+ // Filesystem fallback (codex P2): when namespaces are enabled but the
874
+ // catalog is disabled (namespaceCatalogEnabled=false) — or a namespace is
875
+ // not yet cataloged — the catalog walk above finds nothing, yet per-namespace
876
+ // ledgers still grow under <memoryDir>/namespaces/<token>/state/. Scan that
877
+ // base directly so those ledgers are still bounded. Deduped by resolved dir,
878
+ // so a namespace already added via the catalog is not compacted twice.
879
+ if (resolveNamespaceCapabilities(this.deps.config).namespaces) {
880
+ const namespacesBase = path.join(this.deps.config.memoryDir, "namespaces");
881
+ // Symlink/traversal containment (issue #2033 codex P2): a symlinked
882
+ // <memoryDir>/namespaces (or a symlinked child) must not redirect the scan
883
+ // — and later backup/ledger rewrites — outside memoryDir. Resolve the
884
+ // memory root and the scan base through realpath, reject a symlinked or
885
+ // escaping base, and skip any symlinked/escaping child, mirroring the
886
+ // memory-store walkers' hardening (utils/path-containment).
887
+ let memoryDirReal: string;
888
+ try {
889
+ memoryDirReal = await realpath(this.deps.config.memoryDir);
890
+ const baseStat = await lstat(namespacesBase);
891
+ if (baseStat.isSymbolicLink() || !baseStat.isDirectory()) {
892
+ throw new Error("namespaces base is a symlink or not a directory");
893
+ }
894
+ assertPathInsideRoot(memoryDirReal, await realpath(namespacesBase), namespacesBase);
895
+ } catch (err) {
896
+ if (!isErrnoCode(err, "ENOENT")) {
897
+ log.debug(`lifecycle compaction: namespaces base rejected (non-fatal): ${err}`);
898
+ }
899
+ return targets;
900
+ }
901
+ let entries: Dirent[] = [];
902
+ try {
903
+ entries = await readdir(namespacesBase, { withFileTypes: true });
904
+ } catch (err) {
905
+ if (!isErrnoCode(err, "ENOENT")) {
906
+ log.debug(`lifecycle compaction: namespaces dir scan failed (non-fatal): ${err}`);
907
+ }
908
+ }
909
+ for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
910
+ if (!entry.isDirectory() || entry.isSymbolicLink()) continue;
911
+ const childPath = path.join(namespacesBase, entry.name);
912
+ try {
913
+ assertPathInsideRoot(memoryDirReal, await realpath(childPath), childPath);
914
+ } catch (err) {
915
+ log.debug(`lifecycle compaction: skipping out-of-root namespace dir ${childPath}: ${err}`);
916
+ continue;
917
+ }
918
+ // Resolve the namespace's secure-store-aware storage so an encrypted
919
+ // fallback ledger compacts through the correct root key/context instead
920
+ // of deferring forever behind a keyless plaintext StorageManager (#2033
921
+ // thread PRRT_kwDORJXyws6SE5fv). The on-disk dir name is EITHER a
922
+ // namespace identity TOKEN (ns-<hex>) OR a legacy raw namespace dir name
923
+ // written before tokenization (namespaces/<name>/). Decode a token back
924
+ // to its canonical namespace; treat a non-token dir as a raw namespace
925
+ // only when it is a safe route namespace (isSafeRouteNamespace), so a
926
+ // garbage/traversal dir name is never handed to the resolver. Passing the
927
+ // raw token to the resolver would re-tokenize an already-tokenized value
928
+ // and (for namespaces longer than 30 bytes) exceed the router's 64-char
929
+ // safe-route limit, so the resolver throws and the encrypted over-cap
930
+ // ledger defers forever — hence decode first. Resolve the route namespace
931
+ // and accept the keyed storage only when it roots at THIS dir: the secure
932
+ // store keys one master key per memory ROOT (not per namespace), the
933
+ // router routes a token to namespaces/<token>/ and an existing legacy raw
934
+ // name to its namespaces/<name>/ root, so a correct resolve returns THIS
935
+ // childPath; anything else is an unexpected re-route we refuse (keeping
936
+ // namespace isolation and never compacting the wrong ledger). A dir that
937
+ // neither decodes nor is a safe raw namespace, or no resolver wired
938
+ // (focused tests / plaintext deployments), leaves the keyless target
939
+ // standing: the rebuild chokepoint still refuses to downgrade an
940
+ // encrypted ledger, so plaintext behavior holds.
941
+ const decodedNamespace = namespaceIdentityFromToken(entry.name);
942
+ const routeNamespace =
943
+ decodedNamespace !== null
944
+ ? decodedNamespace
945
+ : isSafeRouteNamespace(entry.name)
946
+ ? entry.name
947
+ : null;
948
+ if (resolveNamespaceStorage && routeNamespace !== null) {
949
+ try {
950
+ const storage = await resolveNamespaceStorage(routeNamespace);
951
+ if (path.resolve(storage.dir) === path.resolve(childPath)) {
952
+ addTarget(storage.dir, storage);
953
+ continue;
954
+ }
955
+ log.debug(
956
+ `lifecycle compaction: fallback resolver routed ${childPath} to ${storage.dir}; `
957
+ + "using keyless target",
958
+ );
959
+ } catch (err) {
960
+ log.debug(
961
+ `lifecycle compaction: fallback storage resolve failed for ${childPath} (non-fatal): ${err}`,
962
+ );
963
+ }
964
+ }
965
+ addTarget(childPath);
966
+ }
967
+ }
968
+ return targets;
969
+ }
970
+
971
+ /**
972
+ * Compact one lifecycle ledger when it is at/over `threshold`. Returns
973
+ * `"skipped"` (absent or below threshold — nothing to do), `"compacted"`
974
+ * (rewritten and verified under the read/decrypt cap), `"failed"`
975
+ * (rebuild/probe threw, or the rewritten ledger is STILL over the cap — an
976
+ * ineffective compaction — non-fatal, retried next pass), or `"deferred"`
977
+ * (oversized but its encrypted ledger cannot be rewritten because no unlocked
978
+ * secure store is available — real work still pending, so the caller must NOT
979
+ * arm the throttle). #2033: a deferred/failed target is distinct from a genuine
980
+ * no-op so one namespace compacting cannot suppress retries for another, and
981
+ * an over-cap rewrite never arms the throttle.
982
+ */
983
+ private async compactLifecycleLedgerTarget(
984
+ target: { memoryDir: string; storage?: StorageManager },
985
+ threshold: number,
986
+ ): Promise<"skipped" | "compacted" | "failed" | "deferred"> {
987
+ const ledgerPath = path.join(target.memoryDir, "state", "memory-lifecycle-ledger.jsonl");
988
+ let size = 0;
989
+ try {
990
+ size = (await stat(ledgerPath)).size;
991
+ } catch (err) {
992
+ if (isErrnoCode(err, "ENOENT")) return "skipped"; // absent — nothing to compact yet.
993
+ log.warn(
994
+ `lifecycle ledger size check failed (non-fatal) for ${target.memoryDir}: ${err}`,
995
+ );
996
+ return "failed";
997
+ }
998
+ // #2033 finding (1): an encrypted ledger becomes unreadable once its on-disk
999
+ // size reaches the whole-file decrypt cap (the reader refuses at/over it), so
1000
+ // the effective compaction trigger for an encrypted target is clamped to that
1001
+ // cap even when the configured threshold is LARGER — otherwise a ledger that
1002
+ // grows past the cap but stays below a bigger threshold would never compact
1003
+ // and stay permanently unreadable. Plaintext streaming is unaffected at any
1004
+ // size, so a plaintext target keeps the configured threshold. The cheap
1005
+ // pre-check skips anything below the smaller of the two before paying for the
1006
+ // extra lstat/open the encryption probe costs.
1007
+ if (size < Math.min(threshold, this.lifecycleLedgerMaxBytes)) return "skipped";
1008
+ let encrypted: boolean;
1009
+ try {
1010
+ encrypted = await probeEncryptedRegularFileHeader(ledgerPath);
1011
+ } catch (err) {
1012
+ log.warn(`lifecycle ledger encryption probe failed (non-fatal) for ${ledgerPath}: ${err}`);
1013
+ return "failed";
1014
+ }
1015
+ const effectiveThreshold = encrypted
1016
+ ? Math.min(threshold, this.lifecycleLedgerMaxBytes)
1017
+ : threshold;
1018
+ if (size < effectiveThreshold) return "skipped";
1019
+ // No plaintext rewrite of an encrypted-at-rest ledger (#2033): rebuilding an
1020
+ // encrypted ledger without an unlocked secure StorageManager would either
1021
+ // fail the preserve-read (locked store) or downgrade the ledger to plaintext.
1022
+ // Report "deferred" (NOT "skipped"): the ledger is over threshold and still
1023
+ // needs compaction, so the throttle must stay un-armed and retry once a key
1024
+ // is available — a "skipped" here would let another target's success arm the
1025
+ // throttle and suppress this pending work for the whole interval (#2033).
1026
+ if (encrypted && !(target.storage?.isSecureStoreUnlocked() ?? false)) {
1027
+ log.warn(
1028
+ `lifecycle ledger at ${ledgerPath} is encrypted at rest but no unlocked secure `
1029
+ + `storage is available; deferring auto-compaction to avoid a plaintext rewrite. `
1030
+ + `Run 'remnic rebuild-memory-lifecycle-ledger --write' after unlocking.`,
1031
+ );
1032
+ return "deferred";
1033
+ }
1034
+ // #2033 findings (2)+(4): the rewrite budget bounds the PLAINTEXT payload, but
1035
+ // an encrypted-at-rest target adds a fixed secure-store envelope on disk.
1036
+ // Reserve that envelope (plus one byte) from the plaintext budget so the
1037
+ // encrypted file lands STRICTLY below the reader's refusal cap and the
1038
+ // post-write check — which stats the on-disk (encrypted) size against the cap
1039
+ // — cannot fail forever on a plaintext budget that equals the cap (the
1040
+ // endless-retry bug). Base this on whether the REPLACEMENT will be encrypted
1041
+ // (the storage write mode), NOT only on the current file header: a
1042
+ // plaintext ledger rewritten under `secureStoreEncryptOnWrite` with the key
1043
+ // set becomes encrypted, so it needs the reserve even though its current
1044
+ // header is plaintext (#2033 write-mode finding).
1045
+ const replacementEncrypted =
1046
+ encrypted || (target.storage?.willEncryptStateWrites() ?? false);
1047
+ const plaintextBudget = replacementEncrypted
1048
+ ? this.lifecycleLedgerMaxBytes - SECURE_STORE_ENVELOPE_OVERHEAD_BYTES - 1
1049
+ : this.lifecycleLedgerMaxBytes - 1;
1050
+ try {
1051
+ const result = await rebuildMemoryLifecycleLedger({
1052
+ memoryDir: target.memoryDir,
1053
+ dryRun: false,
1054
+ storage: target.storage,
1055
+ // Background compaction must not lose append-only history that
1056
+ // frontmatter cannot reconstruct (issue #1910); the manual CLI repair
1057
+ // rebuild now preserves and bounds identically (#2033).
1058
+ preserveExistingEvents: true,
1059
+ // Bound the PLAINTEXT rewrite to a budget that reserves the secure-store
1060
+ // envelope, so the on-disk ledger (plaintext, or plaintext+envelope when
1061
+ // encrypted) is strictly below the read/decrypt cap; overflow lands in
1062
+ // the verbatim backup (#2033 findings 2+4).
1063
+ maxLedgerBytes: plaintextBudget,
1064
+ });
1065
+ // Verify the rewritten ledger is actually bounded. A compaction that left
1066
+ // the ledger at/over the read/decrypt cap is ineffective (the ledger would
1067
+ // be unreadable) — report "failed" so the throttle stays un-armed and the
1068
+ // next pass retries rather than declaring success (#2033).
1069
+ let rewrittenSize = 0;
1070
+ try {
1071
+ rewrittenSize = (await stat(ledgerPath)).size;
1072
+ } catch (err) {
1073
+ log.warn(`lifecycle ledger post-compaction size check failed (non-fatal) for ${target.memoryDir}: ${err}`);
1074
+ return "failed";
1075
+ }
1076
+ if (rewrittenSize >= this.lifecycleLedgerMaxBytes) {
1077
+ log.warn(
1078
+ `lifecycle ledger auto-compaction ineffective for ${target.memoryDir}: rewritten `
1079
+ + `ledger is ${rewrittenSize}B, still at/over the ${this.lifecycleLedgerMaxBytes}-byte `
1080
+ + `read/decrypt cap; leaving the throttle un-armed to retry.`,
1081
+ );
1082
+ return "failed";
1083
+ }
1084
+ if (result.rewritten === false) {
1085
+ // No-op pass (#2033 thread PRRT_kwDORJXyws6SExst): a preserving rebuild
1086
+ // would reproduce the current ledger byte-for-byte, so it skipped the
1087
+ // backup+rewrite. The ledger stays over the trigger but under the cap;
1088
+ // report "compacted" so the throttle still arms (nothing more can be
1089
+ // done until the ledger grows), which stops the periodic re-archive/
1090
+ // rewrite churn the review flagged — the archive no longer grows.
1091
+ log.debug(
1092
+ `lifecycle ledger already compact for ${target.memoryDir}: ${rewrittenSize}B, `
1093
+ + `no rewrite needed (throttle armed to avoid re-archiving an unchanged ledger).`,
1094
+ );
1095
+ } else {
1096
+ log.info(
1097
+ `lifecycle ledger auto-compacted (${target.memoryDir}): ${size}B -> `
1098
+ + `${rewrittenSize}B, ${result.rebuiltRows} rows `
1099
+ + `(${result.preservedAppendOnlyRows ?? 0} append-only preserved, `
1100
+ + `${result.archivedOverflowRows ?? 0} overflow archived), `
1101
+ + `backup=${result.backupPath ?? "none"}`,
1102
+ );
1103
+ }
1104
+ return "compacted";
1105
+ } catch (err) {
1106
+ log.warn(
1107
+ `lifecycle ledger auto-compaction failed (non-fatal) for ${target.memoryDir}: ${err}`,
1108
+ );
1109
+ return "failed";
538
1110
  }
539
1111
  }
540
1112