@remnic/core 1.1.31 → 9.3.516

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 (1102) hide show
  1. package/dist/abstraction-nodes.js +2 -2
  2. package/dist/access-cli.d.ts +1 -1
  3. package/dist/access-cli.js +158 -121
  4. package/dist/access-cli.js.map +1 -1
  5. package/dist/access-http.d.ts +9 -5
  6. package/dist/access-http.js +51 -51
  7. package/dist/access-idempotency.d.ts +2 -0
  8. package/dist/access-idempotency.js +1 -1
  9. package/dist/access-mcp.d.ts +16 -9
  10. package/dist/access-mcp.js +44 -44
  11. package/dist/access-schema.d.ts +45 -13
  12. package/dist/access-schema.js +8 -8
  13. package/dist/{access-service-CkZyb35d.d.ts → access-service-CZfksQuS.d.ts} +11 -130
  14. package/dist/access-service.d.ts +7 -4
  15. package/dist/access-service.js +40 -40
  16. package/dist/action-confidence.d.ts +1 -0
  17. package/dist/active-memory-bridge.d.ts +1 -0
  18. package/dist/active-memory-bridge.js +3 -2
  19. package/dist/active-recall.d.ts +1 -0
  20. package/dist/active-recall.js +14 -9
  21. package/dist/active-recall.js.map +1 -1
  22. package/dist/adapters/claude-code.d.ts +6 -2
  23. package/dist/adapters/claude-code.js +2 -2
  24. package/dist/adapters/codex.d.ts +5 -1
  25. package/dist/adapters/codex.js +2 -2
  26. package/dist/adapters/hermes.js +2 -2
  27. package/dist/adapters/index.js +6 -6
  28. package/dist/adapters/registry.js +6 -6
  29. package/dist/adapters/replit.d.ts +4 -2
  30. package/dist/adapters/replit.js +2 -2
  31. package/dist/adapters/types.d.ts +4 -0
  32. package/dist/adapters/types.js +1 -1
  33. package/dist/behavior-learner.d.ts +1 -0
  34. package/dist/behavior-signals.d.ts +1 -0
  35. package/dist/behavior-signals.js +1 -1
  36. package/dist/bootstrap.d.ts +5 -3
  37. package/dist/bootstrap.js +2 -2
  38. package/dist/boxes.d.ts +1 -0
  39. package/dist/boxes.js +1 -1
  40. package/dist/briefing.d.ts +1 -0
  41. package/dist/briefing.js +9 -9
  42. package/dist/buffer-surprise-report.d.ts +1 -0
  43. package/dist/buffer.d.ts +1 -0
  44. package/dist/buffer.js +2 -2
  45. package/dist/bulk-import/index.d.ts +28 -0
  46. package/dist/bulk-import/index.js +31 -0
  47. package/dist/calibration.d.ts +2 -0
  48. package/dist/calibration.js +50 -17
  49. package/dist/calibration.js.map +1 -1
  50. package/dist/{capsule-crypto-5CYAGVC5.js → capsule-crypto-7FJQINUR.js} +2 -2
  51. package/dist/{capsule-merge-4MGKE7C5.js → capsule-merge-T2JRE46P.js} +3 -3
  52. package/dist/causal-behavior.d.ts +1 -0
  53. package/dist/causal-behavior.js +4 -4
  54. package/dist/causal-chain.js +4 -4
  55. package/dist/causal-consolidation.d.ts +16 -1
  56. package/dist/causal-consolidation.js +115 -32
  57. package/dist/causal-consolidation.js.map +1 -1
  58. package/dist/causal-retrieval.js +14 -6
  59. package/dist/causal-retrieval.js.map +1 -1
  60. package/dist/causal-trajectory-graph.js +2 -2
  61. package/dist/causal-trajectory.js +2 -2
  62. package/dist/{chunk-SAZS2QZB.js → chunk-23UORJ4S.js} +3 -3
  63. package/dist/{chunk-76FLAAUC.js → chunk-2AN2L4NL.js} +17 -6
  64. package/dist/chunk-2AN2L4NL.js.map +1 -0
  65. package/dist/{chunk-W4L6CZKA.js → chunk-2DL3OFLD.js} +15 -10
  66. package/dist/chunk-2DL3OFLD.js.map +1 -0
  67. package/dist/{chunk-NJ3MJQZX.js → chunk-2I5JGH3M.js} +2 -2
  68. package/dist/{chunk-NJ3MJQZX.js.map → chunk-2I5JGH3M.js.map} +1 -1
  69. package/dist/{chunk-7OZ53EXP.js → chunk-2NLLXCJG.js} +21 -10
  70. package/dist/chunk-2NLLXCJG.js.map +1 -0
  71. package/dist/{chunk-PK7H5L6Y.js → chunk-2NM43EWN.js} +2 -2
  72. package/dist/{chunk-PYXS46O7.js → chunk-3BP57I6J.js} +2 -2
  73. package/dist/{chunk-FBYESMQ2.js → chunk-3C5RPJAX.js} +2 -2
  74. package/dist/{chunk-FKFMOY3N.js → chunk-42NQ7AVG.js} +3 -4
  75. package/dist/{chunk-FKFMOY3N.js.map → chunk-42NQ7AVG.js.map} +1 -1
  76. package/dist/chunk-4426WSWL.js +73 -0
  77. package/dist/chunk-4426WSWL.js.map +1 -0
  78. package/dist/{chunk-LIRZNNUP.js → chunk-44442YCH.js} +5 -2
  79. package/dist/chunk-44442YCH.js.map +1 -0
  80. package/dist/{chunk-H3ME6L6D.js → chunk-46GJIW5M.js} +23 -20
  81. package/dist/chunk-46GJIW5M.js.map +1 -0
  82. package/dist/{chunk-QDZ2RLEC.js → chunk-472U7RDF.js} +3 -3
  83. package/dist/chunk-472U7RDF.js.map +1 -0
  84. package/dist/{chunk-NN2DKE4T.js → chunk-4H5ZJHEN.js} +16 -3
  85. package/dist/{chunk-NN2DKE4T.js.map → chunk-4H5ZJHEN.js.map} +1 -1
  86. package/dist/{chunk-56K5QLHX.js → chunk-4HP7HIE3.js} +56 -13
  87. package/dist/chunk-4HP7HIE3.js.map +1 -0
  88. package/dist/{chunk-RK2Y4XOM.js → chunk-4JRRISLU.js} +9 -6
  89. package/dist/chunk-4JRRISLU.js.map +1 -0
  90. package/dist/{chunk-XKLD5OK4.js → chunk-4RR6ROTB.js} +10 -11
  91. package/dist/chunk-4RR6ROTB.js.map +1 -0
  92. package/dist/{chunk-YROHKYBY.js → chunk-5UHVGNZD.js} +22 -6
  93. package/dist/chunk-5UHVGNZD.js.map +1 -0
  94. package/dist/{chunk-ZAVUCJ4H.js → chunk-5V456VRV.js} +154 -69
  95. package/dist/chunk-5V456VRV.js.map +1 -0
  96. package/dist/{chunk-77H5NU3M.js → chunk-6BR7L222.js} +82 -18
  97. package/dist/chunk-6BR7L222.js.map +1 -0
  98. package/dist/{chunk-4KGVTPGD.js → chunk-6F6BXB7A.js} +9 -8
  99. package/dist/chunk-6F6BXB7A.js.map +1 -0
  100. package/dist/{chunk-NMZY542O.js → chunk-6URPAY2D.js} +41 -17
  101. package/dist/chunk-6URPAY2D.js.map +1 -0
  102. package/dist/{chunk-N53K2EXC.js → chunk-6VF75M3X.js} +2 -2
  103. package/dist/{chunk-XSZEP4SF.js → chunk-6XSPNR6L.js} +6 -5
  104. package/dist/chunk-6XSPNR6L.js.map +1 -0
  105. package/dist/{chunk-6H2TESSP.js → chunk-765K3SAT.js} +3 -3
  106. package/dist/{chunk-EDTHC6UD.js → chunk-77NAFXUD.js} +2 -2
  107. package/dist/{chunk-S7KDBTWT.js → chunk-7F7Z6MOS.js} +29 -14
  108. package/dist/chunk-7F7Z6MOS.js.map +1 -0
  109. package/dist/{chunk-MZH6EHNR.js → chunk-7H6CFEBJ.js} +41 -14
  110. package/dist/chunk-7H6CFEBJ.js.map +1 -0
  111. package/dist/{chunk-MGKYQQYF.js → chunk-7Q3RCKAQ.js} +2 -2
  112. package/dist/chunk-7RXCMVFQ.js +27 -0
  113. package/dist/chunk-7RXCMVFQ.js.map +1 -0
  114. package/dist/{chunk-DGXUHMOV.js → chunk-A2IYSXDQ.js} +25 -6
  115. package/dist/chunk-A2IYSXDQ.js.map +1 -0
  116. package/dist/{chunk-EABGC2TL.js → chunk-A2Z6UCWT.js} +26 -4
  117. package/dist/chunk-A2Z6UCWT.js.map +1 -0
  118. package/dist/{chunk-5375UYTQ.js → chunk-A6D7A2FW.js} +4 -4
  119. package/dist/chunk-A6D7A2FW.js.map +1 -0
  120. package/dist/{chunk-FAAFWE4G.js → chunk-ALEPI75L.js} +24 -6
  121. package/dist/chunk-ALEPI75L.js.map +1 -0
  122. package/dist/{chunk-3SLRNYNG.js → chunk-AUDJPF4N.js} +15 -4
  123. package/dist/chunk-AUDJPF4N.js.map +1 -0
  124. package/dist/chunk-B5XMS73R.js +145 -0
  125. package/dist/chunk-B5XMS73R.js.map +1 -0
  126. package/dist/{chunk-HXXBL2KD.js → chunk-BECQDWBA.js} +44 -4
  127. package/dist/chunk-BECQDWBA.js.map +1 -0
  128. package/dist/{chunk-7SEAZFFB.js → chunk-BEUDU7Y4.js} +24 -4
  129. package/dist/chunk-BEUDU7Y4.js.map +1 -0
  130. package/dist/chunk-CHBI22MI.js +159 -0
  131. package/dist/chunk-CHBI22MI.js.map +1 -0
  132. package/dist/{chunk-GDFS42HT.js → chunk-CHCA44C3.js} +15 -8
  133. package/dist/chunk-CHCA44C3.js.map +1 -0
  134. package/dist/chunk-CINZGPSJ.js +22 -0
  135. package/dist/chunk-CINZGPSJ.js.map +1 -0
  136. package/dist/chunk-CMTINOFS.js +36 -0
  137. package/dist/chunk-CMTINOFS.js.map +1 -0
  138. package/dist/{chunk-34DQE4KF.js → chunk-CO7ZO4TU.js} +2 -2
  139. package/dist/{chunk-PFV5C235.js → chunk-CPPS65WS.js} +2 -1
  140. package/dist/{chunk-PFV5C235.js.map → chunk-CPPS65WS.js.map} +1 -1
  141. package/dist/{chunk-DINWEURR.js → chunk-CSKLPDN6.js} +20 -6
  142. package/dist/chunk-CSKLPDN6.js.map +1 -0
  143. package/dist/chunk-CWWMTTQE.js +566 -0
  144. package/dist/chunk-CWWMTTQE.js.map +1 -0
  145. package/dist/{chunk-IQT3XTKW.js → chunk-D24OXEPB.js} +13 -7
  146. package/dist/chunk-D24OXEPB.js.map +1 -0
  147. package/dist/{chunk-WIICJPET.js → chunk-DEUNUKTD.js} +6 -4
  148. package/dist/{chunk-WIICJPET.js.map → chunk-DEUNUKTD.js.map} +1 -1
  149. package/dist/{chunk-ZYVPLJ4T.js → chunk-DHGSZ3UD.js} +9 -7
  150. package/dist/chunk-DHGSZ3UD.js.map +1 -0
  151. package/dist/{chunk-JR4ZC3G4.js → chunk-DLJ4IR6M.js} +91 -41
  152. package/dist/chunk-DLJ4IR6M.js.map +1 -0
  153. package/dist/{chunk-U4SCL7B7.js → chunk-DRD2Q7HQ.js} +82 -18
  154. package/dist/chunk-DRD2Q7HQ.js.map +1 -0
  155. package/dist/{chunk-2IWUMAES.js → chunk-E62SBGQ3.js} +28 -13
  156. package/dist/chunk-E62SBGQ3.js.map +1 -0
  157. package/dist/{chunk-C5BCH4ZS.js → chunk-EAZGEEG2.js} +21 -3
  158. package/dist/chunk-EAZGEEG2.js.map +1 -0
  159. package/dist/{chunk-TPB3I2AC.js → chunk-ECZU5BJH.js} +31 -10
  160. package/dist/chunk-ECZU5BJH.js.map +1 -0
  161. package/dist/chunk-EDQVAMQI.js +308 -0
  162. package/dist/chunk-EDQVAMQI.js.map +1 -0
  163. package/dist/{chunk-RRF5UOBJ.js → chunk-EI6V5UXY.js} +22 -15
  164. package/dist/chunk-EI6V5UXY.js.map +1 -0
  165. package/dist/{chunk-ZKSK55RC.js → chunk-ETUPBUHB.js} +2 -2
  166. package/dist/{chunk-25MQ7IHJ.js → chunk-EUML3N6B.js} +17 -6
  167. package/dist/chunk-EUML3N6B.js.map +1 -0
  168. package/dist/{chunk-5RGLBDQF.js → chunk-EVZFIAPG.js} +12 -12
  169. package/dist/chunk-EVZFIAPG.js.map +1 -0
  170. package/dist/{chunk-QRNI5JBH.js → chunk-EYIEWJNI.js} +2 -2
  171. package/dist/{chunk-TPU5L5EY.js → chunk-FCOQXV3T.js} +272 -411
  172. package/dist/chunk-FCOQXV3T.js.map +1 -0
  173. package/dist/{chunk-TMQLARTH.js → chunk-FK556DDH.js} +34 -15
  174. package/dist/chunk-FK556DDH.js.map +1 -0
  175. package/dist/{chunk-43PJZYGL.js → chunk-FPGE5NVO.js} +45 -10
  176. package/dist/chunk-FPGE5NVO.js.map +1 -0
  177. package/dist/{chunk-3VAL7ZL2.js → chunk-FUC4LZMD.js} +60 -25
  178. package/dist/chunk-FUC4LZMD.js.map +1 -0
  179. package/dist/{chunk-C6QPK5GG.js → chunk-FZZ2QTJI.js} +2 -2
  180. package/dist/{chunk-D46YSIYX.js → chunk-G3Z3QEF5.js} +19 -11
  181. package/dist/{chunk-D46YSIYX.js.map → chunk-G3Z3QEF5.js.map} +1 -1
  182. package/dist/{chunk-3JXBXXM2.js → chunk-G4IAEX6D.js} +2 -2
  183. package/dist/{chunk-MSWG7JI6.js → chunk-G56P5RLD.js} +8 -2
  184. package/dist/chunk-G56P5RLD.js.map +1 -0
  185. package/dist/{chunk-AGZQD76C.js → chunk-GCGJW34D.js} +48 -2
  186. package/dist/chunk-GCGJW34D.js.map +1 -0
  187. package/dist/chunk-H2NCNXMS.js +159 -0
  188. package/dist/chunk-H2NCNXMS.js.map +1 -0
  189. package/dist/{chunk-XYIK4LF6.js → chunk-H3FZVNRN.js} +8 -2
  190. package/dist/chunk-H3FZVNRN.js.map +1 -0
  191. package/dist/{chunk-YU5KIWYQ.js → chunk-HC6EKOID.js} +94 -43
  192. package/dist/chunk-HC6EKOID.js.map +1 -0
  193. package/dist/{chunk-TK4UEOSK.js → chunk-HDDRVXX4.js} +8 -8
  194. package/dist/chunk-HDDRVXX4.js.map +1 -0
  195. package/dist/{chunk-LLQ2LLWF.js → chunk-HENLZHIT.js} +15 -5
  196. package/dist/chunk-HENLZHIT.js.map +1 -0
  197. package/dist/{chunk-N2D6GXBM.js → chunk-HINSGUA7.js} +28 -20
  198. package/dist/chunk-HINSGUA7.js.map +1 -0
  199. package/dist/{chunk-APO3DCMU.js → chunk-HLAVGJ62.js} +30 -8
  200. package/dist/chunk-HLAVGJ62.js.map +1 -0
  201. package/dist/{chunk-TPMQ3G6Z.js → chunk-HOJZMQ4J.js} +2 -2
  202. package/dist/chunk-HOJZMQ4J.js.map +1 -0
  203. package/dist/{chunk-LUDTDZLK.js → chunk-HPWVAEET.js} +33 -7
  204. package/dist/chunk-HPWVAEET.js.map +1 -0
  205. package/dist/{chunk-NZL6GGQE.js → chunk-HQ6NIBL6.js} +92 -30
  206. package/dist/chunk-HQ6NIBL6.js.map +1 -0
  207. package/dist/{chunk-UWVJF25J.js → chunk-HWVTS5NO.js} +20 -6
  208. package/dist/chunk-HWVTS5NO.js.map +1 -0
  209. package/dist/{chunk-2WWLHTZY.js → chunk-IC4GELZE.js} +2 -2
  210. package/dist/{chunk-QA2ZAPBU.js → chunk-IPLYGWQF.js} +28 -20
  211. package/dist/chunk-IPLYGWQF.js.map +1 -0
  212. package/dist/{chunk-A6KTB5R6.js → chunk-IQ3OI2RR.js} +3 -3
  213. package/dist/chunk-IQ3OI2RR.js.map +1 -0
  214. package/dist/{chunk-6LVVDPJ4.js → chunk-J64TK33U.js} +3 -4
  215. package/dist/chunk-J64TK33U.js.map +1 -0
  216. package/dist/{chunk-6FC5EGNV.js → chunk-JBPKEARU.js} +15 -5
  217. package/dist/{chunk-6FC5EGNV.js.map → chunk-JBPKEARU.js.map} +1 -1
  218. package/dist/{chunk-RHY3HH7P.js → chunk-JFEKNTX7.js} +125 -33
  219. package/dist/chunk-JFEKNTX7.js.map +1 -0
  220. package/dist/{chunk-TZOLIGIG.js → chunk-JJEJJ7RK.js} +4 -2
  221. package/dist/chunk-JJEJJ7RK.js.map +1 -0
  222. package/dist/{chunk-PCUKNJAZ.js → chunk-JKV57BTN.js} +2 -2
  223. package/dist/{chunk-EJI5XIBB.js → chunk-JLNBQWZ2.js} +55 -7
  224. package/dist/chunk-JLNBQWZ2.js.map +1 -0
  225. package/dist/{chunk-PIRJPV5T.js → chunk-JNANKJLN.js} +2 -2
  226. package/dist/chunk-JNANKJLN.js.map +1 -0
  227. package/dist/{chunk-XIG5PDM7.js → chunk-JUC24CTX.js} +8 -12
  228. package/dist/chunk-JUC24CTX.js.map +1 -0
  229. package/dist/{chunk-OIGNEXKZ.js → chunk-K5O2QY6T.js} +5 -1
  230. package/dist/{chunk-OIGNEXKZ.js.map → chunk-K5O2QY6T.js.map} +1 -1
  231. package/dist/{chunk-ZTFCYYEZ.js → chunk-KCYE2MZM.js} +3 -3
  232. package/dist/chunk-KCYE2MZM.js.map +1 -0
  233. package/dist/{chunk-JWPLJLDU.js → chunk-KD3QD3A5.js} +2 -2
  234. package/dist/{chunk-JWPLJLDU.js.map → chunk-KD3QD3A5.js.map} +1 -1
  235. package/dist/{chunk-YRMVARQP.js → chunk-KFY3SGN7.js} +49 -2
  236. package/dist/chunk-KFY3SGN7.js.map +1 -0
  237. package/dist/{chunk-CYFQJMUV.js → chunk-KIB7SDIJ.js} +15 -10
  238. package/dist/chunk-KIB7SDIJ.js.map +1 -0
  239. package/dist/{chunk-3KW65B36.js → chunk-KILOTVIF.js} +95 -48
  240. package/dist/chunk-KILOTVIF.js.map +1 -0
  241. package/dist/{chunk-MXFBBHJU.js → chunk-KJMYHC7K.js} +10 -5
  242. package/dist/chunk-KJMYHC7K.js.map +1 -0
  243. package/dist/{chunk-W3LR522O.js → chunk-KM2A35EO.js} +36 -34
  244. package/dist/chunk-KM2A35EO.js.map +1 -0
  245. package/dist/{chunk-575RMLWN.js → chunk-KXULCVOC.js} +30 -24
  246. package/dist/chunk-KXULCVOC.js.map +1 -0
  247. package/dist/{chunk-WELDCG6C.js → chunk-L227SKTB.js} +109 -36
  248. package/dist/chunk-L227SKTB.js.map +1 -0
  249. package/dist/{chunk-BVF3AGJP.js → chunk-LJBOVCQG.js} +26 -11
  250. package/dist/chunk-LJBOVCQG.js.map +1 -0
  251. package/dist/{chunk-2KI4QFHU.js → chunk-LMDRGRJ2.js} +2 -2
  252. package/dist/{chunk-MY6TPVXW.js → chunk-LMPHTYJC.js} +2 -2
  253. package/dist/{chunk-EHRTFRWW.js → chunk-LQHDIS7L.js} +10 -5
  254. package/dist/chunk-LQHDIS7L.js.map +1 -0
  255. package/dist/chunk-LUDUFZTV.js +170 -0
  256. package/dist/chunk-LUDUFZTV.js.map +1 -0
  257. package/dist/{chunk-5HRY2WRF.js → chunk-LZ3VEOU5.js} +2 -2
  258. package/dist/{chunk-Q7P4WJDP.js → chunk-M5T4Q2ZU.js} +1 -1
  259. package/dist/chunk-M5T4Q2ZU.js.map +1 -0
  260. package/dist/{chunk-ICRIXAP2.js → chunk-MC4FJXPA.js} +16 -6
  261. package/dist/chunk-MC4FJXPA.js.map +1 -0
  262. package/dist/{chunk-WPGJYVUH.js → chunk-MGVIEM2O.js} +23 -6
  263. package/dist/chunk-MGVIEM2O.js.map +1 -0
  264. package/dist/{chunk-NGAVDO7E.js → chunk-OADWQ5CR.js} +2 -2
  265. package/dist/{chunk-2NMMFZ5T.js → chunk-OD4FM2U7.js} +6 -3
  266. package/dist/chunk-OD4FM2U7.js.map +1 -0
  267. package/dist/{chunk-OZHRDTDX.js → chunk-OKTXM5H4.js} +11 -1
  268. package/dist/chunk-OKTXM5H4.js.map +1 -0
  269. package/dist/{chunk-RXDLTSWT.js → chunk-ONPLNAPX.js} +16 -7
  270. package/dist/chunk-ONPLNAPX.js.map +1 -0
  271. package/dist/{chunk-FJ43PRLT.js → chunk-ORFGK3XI.js} +20 -14
  272. package/dist/chunk-ORFGK3XI.js.map +1 -0
  273. package/dist/{chunk-DOM4GKSW.js → chunk-OZKVVUJB.js} +3 -3
  274. package/dist/{chunk-3TNBOMQT.js → chunk-PCI747N2.js} +13 -13
  275. package/dist/{chunk-3TNBOMQT.js.map → chunk-PCI747N2.js.map} +1 -1
  276. package/dist/{chunk-MT4HVDUZ.js → chunk-PM3QHTFT.js} +3 -3
  277. package/dist/{chunk-4DWOBS2A.js → chunk-PRQJ5ESM.js} +27 -2
  278. package/dist/{chunk-4DWOBS2A.js.map → chunk-PRQJ5ESM.js.map} +1 -1
  279. package/dist/chunk-PU44GBL4.js +52 -0
  280. package/dist/chunk-PU44GBL4.js.map +1 -0
  281. package/dist/{chunk-MJFNCJXV.js → chunk-Q4CAQGKQ.js} +47 -9
  282. package/dist/chunk-Q4CAQGKQ.js.map +1 -0
  283. package/dist/{chunk-U3WSW6PZ.js → chunk-QMYXNM4P.js} +90 -35
  284. package/dist/chunk-QMYXNM4P.js.map +1 -0
  285. package/dist/{chunk-XVVIG67A.js → chunk-QVJ4NWL2.js} +62 -18
  286. package/dist/chunk-QVJ4NWL2.js.map +1 -0
  287. package/dist/{chunk-NBNN5GOB.js → chunk-QY7YA7OL.js} +11 -2
  288. package/dist/chunk-QY7YA7OL.js.map +1 -0
  289. package/dist/{chunk-ZK7I7JYV.js → chunk-R3PS27B4.js} +7 -7
  290. package/dist/{chunk-2PRLKQAH.js → chunk-RLV3PQGH.js} +35 -19
  291. package/dist/chunk-RLV3PQGH.js.map +1 -0
  292. package/dist/{chunk-WW3QQF4H.js → chunk-ROZJACKP.js} +16 -1
  293. package/dist/chunk-ROZJACKP.js.map +1 -0
  294. package/dist/{chunk-7MNMYOFP.js → chunk-RSUYKGGZ.js} +3 -4
  295. package/dist/chunk-RSUYKGGZ.js.map +1 -0
  296. package/dist/{chunk-LT3NLYSI.js → chunk-RUZOJKNF.js} +10 -7
  297. package/dist/chunk-RUZOJKNF.js.map +1 -0
  298. package/dist/{chunk-326G7DJK.js → chunk-RW5DGAGO.js} +67 -13
  299. package/dist/chunk-RW5DGAGO.js.map +1 -0
  300. package/dist/{chunk-KOSORCJG.js → chunk-S53PKKWK.js} +63 -24
  301. package/dist/chunk-S53PKKWK.js.map +1 -0
  302. package/dist/{chunk-65PG43EQ.js → chunk-S7WU3Y3D.js} +21 -4
  303. package/dist/chunk-S7WU3Y3D.js.map +1 -0
  304. package/dist/{chunk-SKE7JYKA.js → chunk-SFXKHM7P.js} +2 -2
  305. package/dist/{chunk-HMDCOMYU.js → chunk-SKGV326D.js} +3 -3
  306. package/dist/{chunk-I5GLV3VE.js → chunk-SML26KED.js} +33 -26
  307. package/dist/{chunk-I5GLV3VE.js.map → chunk-SML26KED.js.map} +1 -1
  308. package/dist/chunk-T2PO5MUF.js +62 -0
  309. package/dist/chunk-T2PO5MUF.js.map +1 -0
  310. package/dist/{chunk-C7VW7C3F.js → chunk-TDKQGLJW.js} +3 -3
  311. package/dist/chunk-TDKQGLJW.js.map +1 -0
  312. package/dist/{chunk-3QKK7QOS.js → chunk-TERNBNJB.js} +3 -3
  313. package/dist/chunk-TERNBNJB.js.map +1 -0
  314. package/dist/{chunk-MXC3AP5I.js → chunk-TGQ2NTWH.js} +12 -7
  315. package/dist/chunk-TGQ2NTWH.js.map +1 -0
  316. package/dist/{chunk-3Y4P7RXM.js → chunk-TMSXWOBZ.js} +3 -4
  317. package/dist/chunk-TMSXWOBZ.js.map +1 -0
  318. package/dist/{chunk-3ZLVGM76.js → chunk-TTGZV5R3.js} +106 -44
  319. package/dist/chunk-TTGZV5R3.js.map +1 -0
  320. package/dist/{chunk-5UM2VJ6D.js → chunk-UEY3VB6W.js} +2 -2
  321. package/dist/{chunk-I6K5FBRQ.js → chunk-UI3NYK34.js} +4 -1
  322. package/dist/{chunk-I6K5FBRQ.js.map → chunk-UI3NYK34.js.map} +1 -1
  323. package/dist/{chunk-VBJ7V5SK.js → chunk-UIPDNLXA.js} +21 -8
  324. package/dist/chunk-UIPDNLXA.js.map +1 -0
  325. package/dist/{chunk-GIF42EW3.js → chunk-UP6MOYCB.js} +3 -3
  326. package/dist/{chunk-K4FLSOR5.js → chunk-USYGGIJZ.js} +44 -15
  327. package/dist/chunk-USYGGIJZ.js.map +1 -0
  328. package/dist/{chunk-FIT6DMX6.js → chunk-UWY7GIVS.js} +152 -54
  329. package/dist/chunk-UWY7GIVS.js.map +1 -0
  330. package/dist/{chunk-MRILGULB.js → chunk-V2RCP53Q.js} +2 -2
  331. package/dist/{chunk-XKECPATV.js → chunk-VFUEZZBS.js} +113 -4
  332. package/dist/chunk-VFUEZZBS.js.map +1 -0
  333. package/dist/{chunk-FSFEQI74.js → chunk-W7L6HXUC.js} +2 -2
  334. package/dist/{chunk-3IQ2TR4N.js → chunk-WLEB7WCG.js} +2 -2
  335. package/dist/{chunk-GL6I6MEQ.js → chunk-WSGF57U2.js} +3 -3
  336. package/dist/{chunk-KNKUID7G.js → chunk-X7Y7WX73.js} +72 -6
  337. package/dist/chunk-X7Y7WX73.js.map +1 -0
  338. package/dist/{chunk-5NPGSAVB.js → chunk-XEKAG3FM.js} +23 -5
  339. package/dist/chunk-XEKAG3FM.js.map +1 -0
  340. package/dist/{chunk-3APJ5EVB.js → chunk-XKIQZXUB.js} +41 -26
  341. package/dist/chunk-XKIQZXUB.js.map +1 -0
  342. package/dist/chunk-XKXKSQU7.js +92 -0
  343. package/dist/chunk-XKXKSQU7.js.map +1 -0
  344. package/dist/{chunk-JA3AK3PT.js → chunk-XNLXAWHX.js} +4 -4
  345. package/dist/{chunk-CULXMQJH.js → chunk-XPXEJRUB.js} +3 -3
  346. package/dist/chunk-XPXEJRUB.js.map +1 -0
  347. package/dist/{chunk-PZIAX57I.js → chunk-XR6DNK4U.js} +7 -4
  348. package/dist/chunk-XR6DNK4U.js.map +1 -0
  349. package/dist/{chunk-47VWKCAF.js → chunk-XSQ4SGM5.js} +33 -4
  350. package/dist/chunk-XSQ4SGM5.js.map +1 -0
  351. package/dist/{chunk-66DHUKLO.js → chunk-XSWKORGM.js} +16 -14
  352. package/dist/chunk-XSWKORGM.js.map +1 -0
  353. package/dist/{chunk-QR3C7BKQ.js → chunk-XZ4WBBB5.js} +7 -8
  354. package/dist/chunk-XZ4WBBB5.js.map +1 -0
  355. package/dist/{chunk-WNARATI3.js → chunk-Y2SXZ5KZ.js} +59 -11
  356. package/dist/chunk-Y2SXZ5KZ.js.map +1 -0
  357. package/dist/{chunk-QLLBRHAT.js → chunk-YDMVYYD2.js} +229 -264
  358. package/dist/chunk-YDMVYYD2.js.map +1 -0
  359. package/dist/{chunk-SIC6U3GZ.js → chunk-YHV3KRKS.js} +3 -3
  360. package/dist/{chunk-ZPKBYX2F.js → chunk-YNDLCWXS.js} +85 -9
  361. package/dist/chunk-YNDLCWXS.js.map +1 -0
  362. package/dist/{chunk-W6AQJ2PY.js → chunk-YNXOKMJP.js} +35 -16
  363. package/dist/chunk-YNXOKMJP.js.map +1 -0
  364. package/dist/{chunk-VLXA6PI2.js → chunk-YQMZ7IH2.js} +4 -4
  365. package/dist/{chunk-TMM4S4IJ.js → chunk-YR6GIWWY.js} +58 -8
  366. package/dist/chunk-YR6GIWWY.js.map +1 -0
  367. package/dist/{chunk-DK5LDEQM.js → chunk-YR7XMOWK.js} +39 -23
  368. package/dist/chunk-YR7XMOWK.js.map +1 -0
  369. package/dist/{chunk-U7EJOMFC.js → chunk-ZEY4KYRQ.js} +41 -14
  370. package/dist/chunk-ZEY4KYRQ.js.map +1 -0
  371. package/dist/chunk-ZFXCQPNO.js +27 -0
  372. package/dist/chunk-ZFXCQPNO.js.map +1 -0
  373. package/dist/citations.js +1 -1
  374. package/dist/{cli-kuh9PwZ5.d.ts → cli-CPe_2KB1.d.ts} +8 -31
  375. package/dist/cli.d.ts +10 -6
  376. package/dist/cli.js +124 -119
  377. package/dist/commitment-ledger.js +2 -2
  378. package/dist/compat/checks.js +1 -2
  379. package/dist/compounding/engine.d.ts +3 -2
  380. package/dist/compounding/engine.js +11 -11
  381. package/dist/compounding/preference-consolidator.d.ts +1 -0
  382. package/dist/compounding/preference-consolidator.js +8 -8
  383. package/dist/compounding/preference-consolidator.js.map +1 -1
  384. package/dist/compression-optimizer.d.ts +1 -0
  385. package/dist/compression-optimizer.js +1 -1
  386. package/dist/config.d.ts +1 -0
  387. package/dist/config.js +3 -2
  388. package/dist/connectors/codex-materialize-runner.d.ts +1 -0
  389. package/dist/connectors/codex-materialize-runner.js +12 -11
  390. package/dist/connectors/codex-materialize.d.ts +1 -0
  391. package/dist/connectors/codex-materialize.js +3 -2
  392. package/dist/connectors/index.d.ts +1 -0
  393. package/dist/connectors/index.js +14 -14
  394. package/dist/{connectors-cli-CwbyjGR7.d.ts → connectors-cli-DbTPNj2H.d.ts} +7 -1
  395. package/dist/connectors-cli.d.ts +1 -1
  396. package/dist/connectors-cli.js +3 -1
  397. package/dist/consolidation-provenance-check.d.ts +1 -0
  398. package/dist/consolidation-provenance-check.js +2 -2
  399. package/dist/consolidation-undo.d.ts +1 -0
  400. package/dist/consolidation-undo.js +1 -1
  401. package/dist/contradiction/index.d.ts +3 -1
  402. package/dist/contradiction/index.js +3 -3
  403. package/dist/{contradiction-review-ATP4S6IC.js → contradiction-review-6V2LXXK6.js} +2 -2
  404. package/dist/{contradiction-scan-5A4IDZV5.js → contradiction-scan-GIRVC4C7.js} +3 -3
  405. package/dist/conversation-index/backend.d.ts +3 -1
  406. package/dist/conversation-index/backend.js +3 -3
  407. package/dist/conversation-index/chunker.d.ts +1 -0
  408. package/dist/conversation-index/cleanup.js +1 -1
  409. package/dist/conversation-index/faiss-adapter.d.ts +2 -1
  410. package/dist/conversation-index/faiss-adapter.js +1 -1
  411. package/dist/conversation-index/indexer.d.ts +5 -2
  412. package/dist/conversation-index/indexer.js +1 -1
  413. package/dist/conversation-index/search.d.ts +2 -1
  414. package/dist/cross-namespace-budget.js +1 -1
  415. package/dist/cue-anchors.js +2 -2
  416. package/dist/dashboard-runtime.d.ts +6 -0
  417. package/dist/dashboard-runtime.js +3 -3
  418. package/dist/day-summary.d.ts +1 -0
  419. package/dist/day-summary.js +2 -2
  420. package/dist/delinearize.d.ts +1 -0
  421. package/dist/direct-answer-wiring.d.ts +1 -0
  422. package/dist/direct-answer.d.ts +1 -0
  423. package/dist/{dreams-ledger-LR2NBAZE.js → dreams-ledger-3WSCI5V4.js} +5 -4
  424. package/dist/{dreams-ledger-LR2NBAZE.js.map → dreams-ledger-3WSCI5V4.js.map} +1 -1
  425. package/dist/embedding-fallback.d.ts +3 -0
  426. package/dist/embedding-fallback.js +2 -2
  427. package/dist/enrichment/index.d.ts +1 -0
  428. package/dist/enrichment/index.js +1 -1
  429. package/dist/entity-retrieval.d.ts +2 -0
  430. package/dist/entity-retrieval.js +9 -9
  431. package/dist/entity-schema.d.ts +1 -0
  432. package/dist/evals.js +1 -1
  433. package/dist/explicit-capture.d.ts +5 -3
  434. package/dist/explicit-capture.js +2 -2
  435. package/dist/extraction-judge-telemetry.d.ts +2 -0
  436. package/dist/extraction-judge-training.d.ts +2 -0
  437. package/dist/extraction-judge.d.ts +2 -0
  438. package/dist/extraction.d.ts +2 -0
  439. package/dist/extraction.js +12 -12
  440. package/dist/{faiss-adapter-CzPghc4C.d.ts → faiss-adapter-BHecI1fF.d.ts} +4 -1
  441. package/dist/fallback-llm.d.ts +11 -1
  442. package/dist/fallback-llm.js +8 -6
  443. package/dist/{first-start-migration-4MHQEOSD.js → first-start-migration-CKTCTCQI.js} +5 -5
  444. package/dist/graph-dashboard-diff.d.ts +4 -0
  445. package/dist/graph-dashboard-diff.js +1 -1
  446. package/dist/graph-dashboard-parser.js +1 -1
  447. package/dist/{graph-edge-decay-5DI5GUNL.js → graph-edge-decay-MUP5J7CC.js} +6 -6
  448. package/dist/graph-events.js +1 -1
  449. package/dist/graph-snapshot.js +3 -3
  450. package/dist/graph.js +2 -2
  451. package/dist/harmonic-retrieval.js +4 -4
  452. package/dist/identity-continuity.d.ts +1 -0
  453. package/dist/importance.d.ts +1 -0
  454. package/dist/importers/index.d.ts +244 -0
  455. package/dist/importers/index.js +20 -0
  456. package/dist/index.d.ts +20 -350
  457. package/dist/index.js +885 -562
  458. package/dist/index.js.map +1 -1
  459. package/dist/intent.d.ts +1 -0
  460. package/dist/lcm/archive.d.ts +2 -2
  461. package/dist/lcm/archive.js +2 -2
  462. package/dist/lcm/engine.d.ts +3 -2
  463. package/dist/lcm/engine.js +6 -6
  464. package/dist/lcm/index.d.ts +1 -0
  465. package/dist/lcm/index.js +8 -8
  466. package/dist/lcm/recall.js +1 -1
  467. package/dist/lcm/summarizer.js +3 -3
  468. package/dist/lcm/tools.d.ts +1 -0
  469. package/dist/lifecycle.d.ts +1 -0
  470. package/dist/live-connectors-runner.d.ts +1 -0
  471. package/dist/live-connectors-runner.js +6 -6
  472. package/dist/local-llm.d.ts +1 -0
  473. package/dist/local-llm.js +2 -2
  474. package/dist/maintenance/archive-observations.js +1 -1
  475. package/dist/maintenance/memory-governance.d.ts +3 -1
  476. package/dist/maintenance/memory-governance.js +10 -8
  477. package/dist/maintenance/migrate-observations.js +3 -2
  478. package/dist/maintenance/observation-ledger-utils.d.ts +3 -0
  479. package/dist/maintenance/observation-ledger-utils.js +2 -1
  480. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -1
  481. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +11 -8
  482. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -1
  483. package/dist/maintenance/rebuild-memory-projection.js +13 -10
  484. package/dist/maintenance/rebuild-observations.d.ts +1 -0
  485. package/dist/maintenance/rebuild-observations.js +3 -2
  486. package/dist/mcp-memory-inspector-app.d.ts +7 -4
  487. package/dist/mcp-memory-inspector-app.js +1 -1
  488. package/dist/memory-action-policy.d.ts +1 -0
  489. package/dist/memory-cache.d.ts +1 -0
  490. package/dist/memory-cache.js +1 -1
  491. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -0
  492. package/dist/memory-projection-store.d.ts +1 -0
  493. package/dist/memory-projection-store.js +1 -1
  494. package/dist/memory-provenance.d.ts +1 -0
  495. package/dist/memory-worth-outcomes.d.ts +1 -0
  496. package/dist/migrate/from-engram.js +2 -2
  497. package/dist/{migrate-from-identity-anchor-G27MCD6A.js → migrate-from-identity-anchor-EB4XI4Q2.js} +2 -2
  498. package/dist/model-registry.js +1 -1
  499. package/dist/models-json.d.ts +1 -0
  500. package/dist/namespaces/migrate.d.ts +3 -0
  501. package/dist/namespaces/migrate.js +26 -24
  502. package/dist/namespaces/principal.d.ts +1 -0
  503. package/dist/namespaces/principal.js +2 -1
  504. package/dist/namespaces/search.d.ts +2 -1
  505. package/dist/namespaces/search.js +17 -15
  506. package/dist/namespaces/storage.d.ts +4 -2
  507. package/dist/namespaces/storage.js +10 -9
  508. package/dist/native-knowledge.d.ts +1 -0
  509. package/dist/native-knowledge.js +1 -1
  510. package/dist/negative.js +1 -1
  511. package/dist/network/webdav.d.ts +16 -1
  512. package/dist/network/webdav.js +5 -3
  513. package/dist/objective-state-writers.js +4 -4
  514. package/dist/objective-state.js +2 -2
  515. package/dist/offline-sync.d.ts +4 -0
  516. package/dist/offline-sync.js +4 -4
  517. package/dist/operator-toolkit.d.ts +4 -1
  518. package/dist/operator-toolkit.js +37 -34
  519. package/dist/opik-exporter.js +1 -1
  520. package/dist/{orchestrator-DuWl9Hwx.d.ts → orchestrator-Co9nxRLF.d.ts} +4 -74
  521. package/dist/orchestrator.d.ts +5 -3
  522. package/dist/orchestrator.js +101 -98
  523. package/dist/page-versioning.js +1 -1
  524. package/dist/path-X2K5XCHL.js +9 -0
  525. package/dist/patterns-cli.d.ts +1 -0
  526. package/dist/peers/index.d.ts +328 -0
  527. package/dist/{peers-HCVGHMAE.js → peers/index.js} +4 -4
  528. package/dist/pipeline-D18UAKlN.d.ts +32 -0
  529. package/dist/plugin-entry-resolver.d.ts +9 -0
  530. package/dist/plugin-entry-resolver.js +8 -0
  531. package/dist/plugin-entry-resolver.js.map +1 -0
  532. package/dist/plugin-id.d.ts +2 -21
  533. package/dist/plugin-id.js +33 -4
  534. package/dist/plugin-id.js.map +1 -1
  535. package/dist/policy-runtime.d.ts +4 -0
  536. package/dist/policy-runtime.js +1 -1
  537. package/dist/profiling.js +1 -1
  538. package/dist/qmd-recall-cache.d.ts +1 -0
  539. package/dist/qmd.d.ts +2 -1
  540. package/dist/qmd.js +3 -3
  541. package/dist/recall-disclosure-escalation.d.ts +1 -0
  542. package/dist/recall-explain-renderer.d.ts +1 -0
  543. package/dist/recall-explain-renderer.js +3 -3
  544. package/dist/recall-state.d.ts +8 -1
  545. package/dist/recall-state.js +2 -1
  546. package/dist/recall-tag-filter.d.ts +1 -0
  547. package/dist/recall-xray-cli.d.ts +1 -0
  548. package/dist/recall-xray-cli.js +4 -4
  549. package/dist/recall-xray-renderer.d.ts +1 -0
  550. package/dist/recall-xray-renderer.js +3 -3
  551. package/dist/recall-xray.d.ts +1 -0
  552. package/dist/recall-xray.js +2 -2
  553. package/dist/relevance.d.ts +7 -1
  554. package/dist/relevance.js +2 -1
  555. package/dist/replay/normalizers/chatgpt.js +2 -2
  556. package/dist/replay/normalizers/claude.js +2 -2
  557. package/dist/replay/normalizers/openclaw.js +2 -2
  558. package/dist/replay/normalizers/shared.js +1 -1
  559. package/dist/replay/runner.js +1 -1
  560. package/dist/rerank.js +1 -1
  561. package/dist/{resolution-B7FNQSSP.js → resolution-ZY7VM6WS.js} +3 -3
  562. package/dist/resolution-ZY7VM6WS.js.map +1 -0
  563. package/dist/resolve-auth-token.d.ts +1 -0
  564. package/dist/resolve-auth-token.js +1 -1
  565. package/dist/resolve-provider-secret.d.ts +19 -29
  566. package/dist/resolve-provider-secret.js +2 -6
  567. package/dist/resume-bundles.js +10 -9
  568. package/dist/retrieval-agents.d.ts +2 -1
  569. package/dist/retrieval-agents.js +2 -1
  570. package/dist/retrieval-tiers.d.ts +1 -0
  571. package/dist/routing/engine.d.ts +1 -0
  572. package/dist/routing/store.d.ts +3 -0
  573. package/dist/routing/store.js +1 -1
  574. package/dist/runtime/env.js +1 -1
  575. package/dist/schemas.d.ts +191 -17
  576. package/dist/schemas.js +1 -1
  577. package/dist/sdk-compat.js +1 -1
  578. package/dist/search/document-scanner.js +1 -1
  579. package/dist/search/embed-helper.d.ts +7 -2
  580. package/dist/search/embed-helper.js +3 -1
  581. package/dist/search/factory.d.ts +2 -1
  582. package/dist/search/factory.js +15 -14
  583. package/dist/search/index.d.ts +2 -1
  584. package/dist/search/index.js +21 -20
  585. package/dist/search/lancedb-backend.d.ts +8 -7
  586. package/dist/search/lancedb-backend.js +4 -2
  587. package/dist/search/meilisearch-backend.d.ts +8 -7
  588. package/dist/search/meilisearch-backend.js +4 -2
  589. package/dist/search/noop-backend.d.ts +2 -1
  590. package/dist/search/noop-backend.js +1 -1
  591. package/dist/search/orama-backend.d.ts +10 -8
  592. package/dist/search/orama-backend.js +8 -4
  593. package/dist/search/port.d.ts +2 -1
  594. package/dist/search/remote-backend.d.ts +2 -1
  595. package/dist/search/remote-backend.js +1 -1
  596. package/dist/secure-store/index.d.ts +16 -3
  597. package/dist/secure-store/index.js +2 -2
  598. package/dist/{semantic-VwGI14Ok.d.ts → semantic-SLAa_prH.d.ts} +5 -3
  599. package/dist/semantic-consolidation.d.ts +1 -0
  600. package/dist/semantic-consolidation.js +14 -13
  601. package/dist/semantic-rule-promotion.js +8 -8
  602. package/dist/semantic-rule-verifier.d.ts +1 -0
  603. package/dist/semantic-rule-verifier.js +8 -8
  604. package/dist/session-integrity.d.ts +1 -0
  605. package/dist/session-integrity.js +1 -1
  606. package/dist/session-observer-bands.d.ts +1 -0
  607. package/dist/session-observer-state.d.ts +6 -1
  608. package/dist/session-observer-state.js +1 -1
  609. package/dist/shared-context/manager.d.ts +5 -0
  610. package/dist/shared-context/manager.js +3 -3
  611. package/dist/signal.d.ts +1 -0
  612. package/dist/signal.js +1 -1
  613. package/dist/source-attribution.js +1 -1
  614. package/dist/state-store-4QZISH3J.js +30 -0
  615. package/dist/state-store-4QZISH3J.js.map +1 -0
  616. package/dist/storage-C4DX8CuG.d.ts +157 -0
  617. package/dist/storage.d.ts +2 -0
  618. package/dist/storage.js +7 -7
  619. package/dist/store-contract.js +1 -1
  620. package/dist/summarizer.d.ts +1 -0
  621. package/dist/summarizer.js +7 -7
  622. package/dist/summary-snapshot.d.ts +1 -0
  623. package/dist/surfaces/dreams.js +48 -17
  624. package/dist/surfaces/dreams.js.map +1 -1
  625. package/dist/temporal-supersession.d.ts +1 -0
  626. package/dist/temporal-supersession.js +1 -1
  627. package/dist/temporal-validity.d.ts +1 -0
  628. package/dist/threading.d.ts +1 -0
  629. package/dist/tier-migration.d.ts +1 -0
  630. package/dist/tier-routing.d.ts +1 -0
  631. package/dist/{tier-stats-62ZVDFKS.js → tier-stats-SKML2OSF.js} +5 -5
  632. package/dist/tmt.js +1 -1
  633. package/dist/tokens.js +2 -2
  634. package/dist/topics.d.ts +1 -0
  635. package/dist/{trace-C5ETWBEF.js → trace-WM7V4CKI.js} +31 -1
  636. package/dist/trace-WM7V4CKI.js.map +1 -0
  637. package/dist/transcript.d.ts +1 -0
  638. package/dist/transcript.js +2 -2
  639. package/dist/transfer/autodetect.js +7 -7
  640. package/dist/transfer/backup.js +5 -5
  641. package/dist/transfer/capsule-export.js +5 -5
  642. package/dist/transfer/capsule-import.d.ts +6 -0
  643. package/dist/transfer/capsule-import.js +4 -4
  644. package/dist/transfer/export-json.js +3 -3
  645. package/dist/transfer/export-md.js +3 -3
  646. package/dist/transfer/export-sqlite.js +3 -3
  647. package/dist/transfer/fs-utils.d.ts +2 -1
  648. package/dist/transfer/fs-utils.js +5 -3
  649. package/dist/transfer/import-json.js +3 -3
  650. package/dist/transfer/import-md.js +3 -3
  651. package/dist/transfer/import-sqlite.js +3 -3
  652. package/dist/trust-zones.js +2 -2
  653. package/dist/types-B1VHaf2w.d.ts +126 -0
  654. package/dist/types-BliCnURB.d.ts +83 -0
  655. package/dist/types.d.ts +35 -0
  656. package/dist/types.js +1 -1
  657. package/dist/utility-learner.js +3 -3
  658. package/dist/utility-runtime.d.ts +1 -0
  659. package/dist/utility-runtime.js +4 -4
  660. package/dist/utility-telemetry.js +2 -2
  661. package/dist/verified-recall.js +9 -9
  662. package/dist/work/board.js +2 -2
  663. package/dist/work/boundary.js +1 -1
  664. package/dist/work/storage.d.ts +5 -0
  665. package/dist/work/storage.js +1 -1
  666. package/dist/work-product-ledger.js +2 -2
  667. package/package.json +74 -3
  668. package/scripts/ensure-better-sqlite3.mjs +8 -7
  669. package/scripts/faiss_index.py +141 -29
  670. package/src/access-cli.test.ts +87 -2
  671. package/src/access-cli.ts +59 -5
  672. package/src/access-http.test.ts +150 -0
  673. package/src/access-http.ts +103 -34
  674. package/src/access-idempotency.ts +136 -3
  675. package/src/access-mcp.test.ts +155 -0
  676. package/src/access-mcp.ts +116 -30
  677. package/src/access-schema.ts +22 -4
  678. package/src/access-service-namespace.test.ts +9 -9
  679. package/src/access-service-project-tag.test.ts +37 -0
  680. package/src/access-service.ts +15 -14
  681. package/src/active-recall.test.ts +29 -1
  682. package/src/active-recall.ts +11 -7
  683. package/src/adapters/claude-code.ts +7 -8
  684. package/src/adapters/codex.ts +6 -7
  685. package/src/adapters/hermes.ts +1 -5
  686. package/src/adapters/registry.test.ts +63 -0
  687. package/src/adapters/registry.ts +10 -0
  688. package/src/adapters/replit.ts +5 -7
  689. package/src/adapters/types.ts +24 -1
  690. package/src/behavior-signals.ts +1 -1
  691. package/src/binary-lifecycle/backend.ts +16 -4
  692. package/src/binary-lifecycle/pipeline.test.ts +149 -0
  693. package/src/binary-lifecycle/pipeline.ts +49 -7
  694. package/src/binary-lifecycle/scanner.ts +19 -4
  695. package/src/boxes.ts +119 -32
  696. package/src/buffer-session.test.ts +28 -0
  697. package/src/buffer.ts +10 -14
  698. package/src/bulk-import/types.ts +10 -0
  699. package/src/calibration.test.ts +99 -0
  700. package/src/calibration.ts +57 -13
  701. package/src/causal-consolidation.test.ts +214 -0
  702. package/src/causal-consolidation.ts +131 -14
  703. package/src/causal-retrieval.ts +16 -3
  704. package/src/citations.test.ts +75 -0
  705. package/src/citations.ts +19 -6
  706. package/src/cli.ts +134 -109
  707. package/src/coding/coding-namespace.test.ts +7 -0
  708. package/src/coding/coding-namespace.ts +8 -0
  709. package/src/coding/review-context.test.ts +30 -0
  710. package/src/coding/review-context.ts +79 -9
  711. package/src/coding/wire-coding-context.test.ts +16 -0
  712. package/src/compat/checks.test.ts +33 -0
  713. package/src/compat/checks.ts +64 -4
  714. package/src/compounding/engine.ts +2 -2
  715. package/src/compounding/preference-consolidator.test.ts +47 -0
  716. package/src/compounding/preference-consolidator.ts +8 -8
  717. package/src/compression-optimizer.ts +5 -2
  718. package/src/config.test.ts +34 -2
  719. package/src/config.ts +62 -18
  720. package/src/connectors/codex-materialize-runner.ts +4 -3
  721. package/src/connectors/codex-materialize.ts +149 -34
  722. package/src/connectors/index.test.ts +144 -7
  723. package/src/connectors/index.ts +86 -15
  724. package/src/connectors/live/github.test.ts +47 -0
  725. package/src/connectors/live/github.ts +29 -1
  726. package/src/connectors/live/index.ts +2 -0
  727. package/src/connectors/live/live-connectors.test.ts +359 -73
  728. package/src/connectors/live/notion.test.ts +84 -0
  729. package/src/connectors/live/notion.ts +18 -1
  730. package/src/connectors/live/state-store.ts +419 -38
  731. package/src/connectors/weclone-installer.test.ts +16 -18
  732. package/src/connectors-cli.ts +19 -0
  733. package/src/console/trace.test.ts +28 -0
  734. package/src/console/trace.ts +42 -5
  735. package/src/contradiction/contradiction-judge.test.ts +49 -0
  736. package/src/contradiction/contradiction-judge.ts +15 -5
  737. package/src/contradiction/contradiction-review.ts +31 -7
  738. package/src/contradiction/contradiction-scan.ts +28 -18
  739. package/src/contradiction/contradiction.test.ts +237 -1
  740. package/src/contradiction/resolution.ts +43 -4
  741. package/src/conversation-index/backend.ts +13 -5
  742. package/src/conversation-index/cleanup.ts +25 -4
  743. package/src/conversation-index/faiss-adapter.ts +24 -15
  744. package/src/conversation-index/indexer.test.ts +71 -10
  745. package/src/conversation-index/indexer.ts +22 -3
  746. package/src/cross-namespace-budget.test.ts +59 -0
  747. package/src/cross-namespace-budget.ts +15 -7
  748. package/src/curation/index.ts +18 -17
  749. package/src/dashboard-runtime.test.ts +98 -0
  750. package/src/dashboard-runtime.ts +96 -6
  751. package/src/dedup/index.test.ts +133 -0
  752. package/src/dedup/index.ts +73 -10
  753. package/src/dedup/semantic.test.ts +77 -2
  754. package/src/dedup/semantic.ts +26 -6
  755. package/src/embedding-fallback.ts +47 -15
  756. package/src/enrichment/audit.ts +8 -1
  757. package/src/enrichment/pipeline.ts +21 -13
  758. package/src/enrichment/web-search-provider.ts +1 -6
  759. package/src/entity-retrieval.ts +57 -6
  760. package/src/evals.ts +22 -13
  761. package/src/explicit-capture.test.ts +40 -0
  762. package/src/explicit-capture.ts +14 -2
  763. package/src/extraction.ts +42 -30
  764. package/src/fallback-llm.ts +35 -2
  765. package/src/graph-dashboard-diff.test.ts +57 -0
  766. package/src/graph-dashboard-diff.ts +24 -2
  767. package/src/graph-dashboard-parser.test.ts +31 -0
  768. package/src/graph-dashboard-parser.ts +4 -1
  769. package/src/graph-events.ts +6 -4
  770. package/src/graph.test.ts +69 -0
  771. package/src/graph.ts +7 -4
  772. package/src/importers/base.test.ts +70 -0
  773. package/src/importers/base.ts +56 -7
  774. package/src/index.ts +5 -2
  775. package/src/lcm/archive.ts +65 -16
  776. package/src/lcm/engine.ts +27 -8
  777. package/src/lcm/recall.ts +5 -5
  778. package/src/lcm-engine.test.ts +87 -1
  779. package/src/lcm-recall.test.ts +71 -0
  780. package/src/live-connectors-runner.ts +100 -36
  781. package/src/maintenance/archive-observations.ts +24 -3
  782. package/src/maintenance/atomic-file.ts +85 -0
  783. package/src/maintenance/dreams-ledger.ts +15 -8
  784. package/src/maintenance/memory-governance.test.ts +53 -0
  785. package/src/maintenance/memory-governance.ts +15 -5
  786. package/src/maintenance/observation-ledger-utils.ts +6 -5
  787. package/src/maintenance/purge.test.ts +64 -0
  788. package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +22 -9
  789. package/src/maintenance/rebuild-memory-projection.ts +22 -9
  790. package/src/maintenance/rebuild-observations.ts +7 -3
  791. package/src/mcp-memory-inspector-app.ts +26 -3
  792. package/src/memory-cache.test.ts +19 -0
  793. package/src/memory-cache.ts +1 -0
  794. package/src/memory-extension/codex-publisher.ts +25 -4
  795. package/src/memory-extension-host/host-discovery.test.ts +69 -0
  796. package/src/memory-extension-host/host-discovery.ts +63 -6
  797. package/src/memory-projection-store.ts +114 -62
  798. package/src/message-parts/index.ts +46 -31
  799. package/src/message-parts/message-parts.test.ts +77 -0
  800. package/src/migrate/from-engram.ts +68 -14
  801. package/src/model-registry.test.ts +38 -0
  802. package/src/model-registry.ts +12 -7
  803. package/src/namespaces/identity.test.ts +66 -0
  804. package/src/namespaces/identity.ts +23 -0
  805. package/src/namespaces/migrate.test.ts +62 -0
  806. package/src/namespaces/migrate.ts +82 -14
  807. package/src/namespaces/principal.test.ts +37 -1
  808. package/src/namespaces/principal.ts +18 -7
  809. package/src/namespaces/search.test.ts +96 -7
  810. package/src/namespaces/search.ts +32 -25
  811. package/src/namespaces/storage.ts +93 -11
  812. package/src/native-knowledge.ts +23 -3
  813. package/src/negative.ts +50 -5
  814. package/src/network/webdav.ts +177 -58
  815. package/src/offline-sync.test.ts +128 -18
  816. package/src/offline-sync.ts +41 -7
  817. package/src/onboarding/index.test.ts +105 -0
  818. package/src/onboarding/index.ts +17 -5
  819. package/src/operator-toolkit.ts +43 -5
  820. package/src/orchestrator.ts +120 -27
  821. package/src/page-versioning.ts +31 -5
  822. package/src/peers/peers.test.ts +70 -0
  823. package/src/peers/storage.ts +32 -3
  824. package/src/plugin-entry-resolver.test.ts +60 -0
  825. package/src/plugin-entry-resolver.ts +48 -0
  826. package/src/plugin-id.test.ts +38 -0
  827. package/src/plugin-id.ts +31 -64
  828. package/src/policy-runtime.test.ts +75 -0
  829. package/src/policy-runtime.ts +32 -3
  830. package/src/procedural/procedure-miner.test.ts +152 -0
  831. package/src/procedural/procedure-miner.ts +124 -19
  832. package/src/profiling.test.ts +23 -0
  833. package/src/profiling.ts +10 -1
  834. package/src/projection/index.test.ts +253 -0
  835. package/src/projection/index.ts +159 -18
  836. package/src/qmd-client.test.ts +45 -0
  837. package/src/qmd.ts +13 -10
  838. package/src/recall-disclosure.test.ts +15 -1
  839. package/src/recall-state.ts +24 -5
  840. package/src/relevance.ts +24 -5
  841. package/src/replay/normalizers/chatgpt.ts +14 -4
  842. package/src/replay/normalizers/claude.ts +8 -3
  843. package/src/replay/normalizers/openclaw.ts +35 -12
  844. package/src/replay/normalizers/replay-normalizers.test.ts +65 -0
  845. package/src/replay/normalizers/shared.ts +4 -1
  846. package/src/replay/runner.ts +1 -1
  847. package/src/rerank.test.ts +41 -1
  848. package/src/rerank.ts +2 -2
  849. package/src/resolve-auth-token.test.ts +29 -0
  850. package/src/resolve-auth-token.ts +12 -7
  851. package/src/resolve-provider-secret.test.ts +78 -22
  852. package/src/resolve-provider-secret.ts +55 -223
  853. package/src/retrieval-agents.ts +51 -14
  854. package/src/review/index.test.ts +75 -1
  855. package/src/review/index.ts +88 -30
  856. package/src/routing/store.ts +36 -6
  857. package/src/runtime/env.test.ts +73 -0
  858. package/src/runtime/env.ts +7 -11
  859. package/src/schemas.ts +16 -1
  860. package/src/search/abort.ts +18 -0
  861. package/src/search/document-scanner.test.ts +80 -0
  862. package/src/search/document-scanner.ts +51 -9
  863. package/src/search/embed-helper.ts +19 -6
  864. package/src/search/factory.ts +9 -5
  865. package/src/search/lancedb-backend.ts +66 -23
  866. package/src/search/meilisearch-backend.ts +39 -13
  867. package/src/search/noop-backend.ts +1 -1
  868. package/src/search/orama-backend.test.ts +27 -0
  869. package/src/search/orama-backend.ts +69 -16
  870. package/src/search/port.ts +4 -1
  871. package/src/search/remote-backend.ts +1 -1
  872. package/src/secure-store/cli-handlers.ts +70 -6
  873. package/src/secure-store/cli-renderer.ts +13 -7
  874. package/src/secure-store/secure-fs.ts +11 -5
  875. package/src/secure-store/secure-store.test.ts +70 -0
  876. package/src/semantic-consolidation.test.ts +45 -0
  877. package/src/semantic-consolidation.ts +3 -3
  878. package/src/session-integrity.test.ts +98 -0
  879. package/src/session-integrity.ts +51 -1
  880. package/src/session-observer-state.ts +108 -41
  881. package/src/shared-context/manager.ts +93 -15
  882. package/src/signal.test.ts +14 -0
  883. package/src/signal.ts +8 -1
  884. package/src/source-attribution.test.ts +8 -0
  885. package/src/source-attribution.ts +24 -2
  886. package/src/spaces/index.test.ts +93 -0
  887. package/src/spaces/index.ts +75 -9
  888. package/src/storage.ts +14 -1
  889. package/src/store-contract.test.ts +35 -0
  890. package/src/store-contract.ts +39 -5
  891. package/src/summarizer.ts +24 -18
  892. package/src/summary-snapshot.test.ts +77 -0
  893. package/src/surfaces/dreams.test.ts +73 -0
  894. package/src/surfaces/dreams.ts +53 -19
  895. package/src/sync/index.ts +42 -17
  896. package/src/taxonomy/taxonomy-loader.ts +43 -4
  897. package/src/temporal-supersession.test.ts +67 -0
  898. package/src/temporal-supersession.ts +8 -0
  899. package/src/tmt.test.ts +50 -0
  900. package/src/tmt.ts +35 -11
  901. package/src/tokens.test.ts +18 -0
  902. package/src/tokens.ts +7 -0
  903. package/src/training-export/converter.test.ts +55 -2
  904. package/src/training-export/converter.ts +36 -10
  905. package/src/training-export/registry.test.ts +17 -0
  906. package/src/training-export/registry.ts +19 -1
  907. package/src/transcript.ts +2 -2
  908. package/src/transfer/backup.ts +18 -7
  909. package/src/transfer/capsule-crypto.ts +105 -21
  910. package/src/transfer/capsule-encrypt.test.ts +106 -7
  911. package/src/transfer/capsule-export.ts +23 -14
  912. package/src/transfer/capsule-import.ts +11 -2
  913. package/src/transfer/exclusions.ts +7 -0
  914. package/src/transfer/export-sqlite.ts +14 -13
  915. package/src/transfer/fs-utils.ts +52 -1
  916. package/src/transfer/import-json.ts +12 -7
  917. package/src/transfer/import-md.ts +5 -5
  918. package/src/transfer/import-sqlite.ts +4 -5
  919. package/src/trust-zones.ts +1 -1
  920. package/src/types.ts +25 -0
  921. package/src/utility-telemetry.ts +1 -1
  922. package/src/utils/category-dir.test.ts +15 -0
  923. package/src/utils/category-dir.ts +3 -1
  924. package/src/work/boundary.ts +30 -18
  925. package/src/work/storage.ts +116 -38
  926. package/src/work-product-ledger.ts +1 -1
  927. package/dist/chunk-25MQ7IHJ.js.map +0 -1
  928. package/dist/chunk-2IWUMAES.js.map +0 -1
  929. package/dist/chunk-2NMMFZ5T.js.map +0 -1
  930. package/dist/chunk-2PRLKQAH.js.map +0 -1
  931. package/dist/chunk-326G7DJK.js.map +0 -1
  932. package/dist/chunk-3APJ5EVB.js.map +0 -1
  933. package/dist/chunk-3KW65B36.js.map +0 -1
  934. package/dist/chunk-3QKK7QOS.js.map +0 -1
  935. package/dist/chunk-3SLRNYNG.js.map +0 -1
  936. package/dist/chunk-3VAL7ZL2.js.map +0 -1
  937. package/dist/chunk-3Y4P7RXM.js.map +0 -1
  938. package/dist/chunk-3ZLVGM76.js.map +0 -1
  939. package/dist/chunk-43PJZYGL.js.map +0 -1
  940. package/dist/chunk-47VWKCAF.js.map +0 -1
  941. package/dist/chunk-4KGVTPGD.js.map +0 -1
  942. package/dist/chunk-5375UYTQ.js.map +0 -1
  943. package/dist/chunk-56K5QLHX.js.map +0 -1
  944. package/dist/chunk-575RMLWN.js.map +0 -1
  945. package/dist/chunk-5NPGSAVB.js.map +0 -1
  946. package/dist/chunk-5RGLBDQF.js.map +0 -1
  947. package/dist/chunk-65PG43EQ.js.map +0 -1
  948. package/dist/chunk-66DHUKLO.js.map +0 -1
  949. package/dist/chunk-6LVVDPJ4.js.map +0 -1
  950. package/dist/chunk-76FLAAUC.js.map +0 -1
  951. package/dist/chunk-77H5NU3M.js.map +0 -1
  952. package/dist/chunk-7MNMYOFP.js.map +0 -1
  953. package/dist/chunk-7OZ53EXP.js.map +0 -1
  954. package/dist/chunk-7SEAZFFB.js.map +0 -1
  955. package/dist/chunk-A6KTB5R6.js.map +0 -1
  956. package/dist/chunk-AGZQD76C.js.map +0 -1
  957. package/dist/chunk-APO3DCMU.js.map +0 -1
  958. package/dist/chunk-BVF3AGJP.js.map +0 -1
  959. package/dist/chunk-C5BCH4ZS.js.map +0 -1
  960. package/dist/chunk-C7VW7C3F.js.map +0 -1
  961. package/dist/chunk-CULXMQJH.js.map +0 -1
  962. package/dist/chunk-CYFQJMUV.js.map +0 -1
  963. package/dist/chunk-D654IBA6.js +0 -61
  964. package/dist/chunk-D654IBA6.js.map +0 -1
  965. package/dist/chunk-DGXUHMOV.js.map +0 -1
  966. package/dist/chunk-DINWEURR.js.map +0 -1
  967. package/dist/chunk-DK5LDEQM.js.map +0 -1
  968. package/dist/chunk-EABGC2TL.js.map +0 -1
  969. package/dist/chunk-EHRTFRWW.js.map +0 -1
  970. package/dist/chunk-EJI5XIBB.js.map +0 -1
  971. package/dist/chunk-FAAFWE4G.js.map +0 -1
  972. package/dist/chunk-FAJ7FZYM.js +0 -11
  973. package/dist/chunk-FAJ7FZYM.js.map +0 -1
  974. package/dist/chunk-FDU6HUUL.js +0 -147
  975. package/dist/chunk-FDU6HUUL.js.map +0 -1
  976. package/dist/chunk-FIT6DMX6.js.map +0 -1
  977. package/dist/chunk-FJ43PRLT.js.map +0 -1
  978. package/dist/chunk-FLTNHQK6.js +0 -262
  979. package/dist/chunk-FLTNHQK6.js.map +0 -1
  980. package/dist/chunk-GDFS42HT.js.map +0 -1
  981. package/dist/chunk-H3ME6L6D.js.map +0 -1
  982. package/dist/chunk-HXXBL2KD.js.map +0 -1
  983. package/dist/chunk-ICRIXAP2.js.map +0 -1
  984. package/dist/chunk-IQT3XTKW.js.map +0 -1
  985. package/dist/chunk-JR4ZC3G4.js.map +0 -1
  986. package/dist/chunk-K4FLSOR5.js.map +0 -1
  987. package/dist/chunk-KNKUID7G.js.map +0 -1
  988. package/dist/chunk-KOSORCJG.js.map +0 -1
  989. package/dist/chunk-LIRZNNUP.js.map +0 -1
  990. package/dist/chunk-LLQ2LLWF.js.map +0 -1
  991. package/dist/chunk-LPMVBPA3.js +0 -236
  992. package/dist/chunk-LPMVBPA3.js.map +0 -1
  993. package/dist/chunk-LT3NLYSI.js.map +0 -1
  994. package/dist/chunk-LUDTDZLK.js.map +0 -1
  995. package/dist/chunk-MJFNCJXV.js.map +0 -1
  996. package/dist/chunk-MSWG7JI6.js.map +0 -1
  997. package/dist/chunk-MXC3AP5I.js.map +0 -1
  998. package/dist/chunk-MXFBBHJU.js.map +0 -1
  999. package/dist/chunk-MZH6EHNR.js.map +0 -1
  1000. package/dist/chunk-N2D6GXBM.js.map +0 -1
  1001. package/dist/chunk-NBNN5GOB.js.map +0 -1
  1002. package/dist/chunk-NMZY542O.js.map +0 -1
  1003. package/dist/chunk-NZL6GGQE.js.map +0 -1
  1004. package/dist/chunk-OZHRDTDX.js.map +0 -1
  1005. package/dist/chunk-PIRJPV5T.js.map +0 -1
  1006. package/dist/chunk-PZIAX57I.js.map +0 -1
  1007. package/dist/chunk-Q7P4WJDP.js.map +0 -1
  1008. package/dist/chunk-QA2ZAPBU.js.map +0 -1
  1009. package/dist/chunk-QDZ2RLEC.js.map +0 -1
  1010. package/dist/chunk-QLLBRHAT.js.map +0 -1
  1011. package/dist/chunk-QR3C7BKQ.js.map +0 -1
  1012. package/dist/chunk-RHY3HH7P.js.map +0 -1
  1013. package/dist/chunk-RK2Y4XOM.js.map +0 -1
  1014. package/dist/chunk-RR2PKP3I.js +0 -63
  1015. package/dist/chunk-RR2PKP3I.js.map +0 -1
  1016. package/dist/chunk-RRF5UOBJ.js.map +0 -1
  1017. package/dist/chunk-RXDLTSWT.js.map +0 -1
  1018. package/dist/chunk-RYED3SPJ.js +0 -42
  1019. package/dist/chunk-RYED3SPJ.js.map +0 -1
  1020. package/dist/chunk-S7KDBTWT.js.map +0 -1
  1021. package/dist/chunk-TK4UEOSK.js.map +0 -1
  1022. package/dist/chunk-TMM4S4IJ.js.map +0 -1
  1023. package/dist/chunk-TMQLARTH.js.map +0 -1
  1024. package/dist/chunk-TPB3I2AC.js.map +0 -1
  1025. package/dist/chunk-TPMQ3G6Z.js.map +0 -1
  1026. package/dist/chunk-TPU5L5EY.js.map +0 -1
  1027. package/dist/chunk-TZOLIGIG.js.map +0 -1
  1028. package/dist/chunk-U3WSW6PZ.js.map +0 -1
  1029. package/dist/chunk-U4SCL7B7.js.map +0 -1
  1030. package/dist/chunk-U66YHYC7.js +0 -31
  1031. package/dist/chunk-U66YHYC7.js.map +0 -1
  1032. package/dist/chunk-U7EJOMFC.js.map +0 -1
  1033. package/dist/chunk-UWVJF25J.js.map +0 -1
  1034. package/dist/chunk-VBJ7V5SK.js.map +0 -1
  1035. package/dist/chunk-W3LR522O.js.map +0 -1
  1036. package/dist/chunk-W4L6CZKA.js.map +0 -1
  1037. package/dist/chunk-W6AQJ2PY.js.map +0 -1
  1038. package/dist/chunk-WELDCG6C.js.map +0 -1
  1039. package/dist/chunk-WNARATI3.js.map +0 -1
  1040. package/dist/chunk-WPGJYVUH.js.map +0 -1
  1041. package/dist/chunk-WW3QQF4H.js.map +0 -1
  1042. package/dist/chunk-XIG5PDM7.js.map +0 -1
  1043. package/dist/chunk-XKECPATV.js.map +0 -1
  1044. package/dist/chunk-XKLD5OK4.js.map +0 -1
  1045. package/dist/chunk-XSZEP4SF.js.map +0 -1
  1046. package/dist/chunk-XVVIG67A.js.map +0 -1
  1047. package/dist/chunk-XYIK4LF6.js.map +0 -1
  1048. package/dist/chunk-YRMVARQP.js.map +0 -1
  1049. package/dist/chunk-YROHKYBY.js.map +0 -1
  1050. package/dist/chunk-YU5KIWYQ.js.map +0 -1
  1051. package/dist/chunk-ZAVUCJ4H.js.map +0 -1
  1052. package/dist/chunk-ZPKBYX2F.js.map +0 -1
  1053. package/dist/chunk-ZTFCYYEZ.js.map +0 -1
  1054. package/dist/chunk-ZYVPLJ4T.js.map +0 -1
  1055. package/dist/path-MR5JPYOP.js +0 -9
  1056. package/dist/state-store-VZU2IA53.js +0 -16
  1057. package/dist/trace-C5ETWBEF.js.map +0 -1
  1058. /package/dist/{capsule-crypto-5CYAGVC5.js.map → bulk-import/index.js.map} +0 -0
  1059. /package/dist/{contradiction-review-ATP4S6IC.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
  1060. /package/dist/{capsule-merge-4MGKE7C5.js.map → capsule-merge-T2JRE46P.js.map} +0 -0
  1061. /package/dist/{chunk-SAZS2QZB.js.map → chunk-23UORJ4S.js.map} +0 -0
  1062. /package/dist/{chunk-PK7H5L6Y.js.map → chunk-2NM43EWN.js.map} +0 -0
  1063. /package/dist/{chunk-PYXS46O7.js.map → chunk-3BP57I6J.js.map} +0 -0
  1064. /package/dist/{chunk-FBYESMQ2.js.map → chunk-3C5RPJAX.js.map} +0 -0
  1065. /package/dist/{chunk-N53K2EXC.js.map → chunk-6VF75M3X.js.map} +0 -0
  1066. /package/dist/{chunk-6H2TESSP.js.map → chunk-765K3SAT.js.map} +0 -0
  1067. /package/dist/{chunk-EDTHC6UD.js.map → chunk-77NAFXUD.js.map} +0 -0
  1068. /package/dist/{chunk-MGKYQQYF.js.map → chunk-7Q3RCKAQ.js.map} +0 -0
  1069. /package/dist/{chunk-34DQE4KF.js.map → chunk-CO7ZO4TU.js.map} +0 -0
  1070. /package/dist/{chunk-ZKSK55RC.js.map → chunk-ETUPBUHB.js.map} +0 -0
  1071. /package/dist/{chunk-QRNI5JBH.js.map → chunk-EYIEWJNI.js.map} +0 -0
  1072. /package/dist/{chunk-C6QPK5GG.js.map → chunk-FZZ2QTJI.js.map} +0 -0
  1073. /package/dist/{chunk-3JXBXXM2.js.map → chunk-G4IAEX6D.js.map} +0 -0
  1074. /package/dist/{chunk-2WWLHTZY.js.map → chunk-IC4GELZE.js.map} +0 -0
  1075. /package/dist/{chunk-PCUKNJAZ.js.map → chunk-JKV57BTN.js.map} +0 -0
  1076. /package/dist/{chunk-2KI4QFHU.js.map → chunk-LMDRGRJ2.js.map} +0 -0
  1077. /package/dist/{chunk-MY6TPVXW.js.map → chunk-LMPHTYJC.js.map} +0 -0
  1078. /package/dist/{chunk-5HRY2WRF.js.map → chunk-LZ3VEOU5.js.map} +0 -0
  1079. /package/dist/{chunk-NGAVDO7E.js.map → chunk-OADWQ5CR.js.map} +0 -0
  1080. /package/dist/{chunk-DOM4GKSW.js.map → chunk-OZKVVUJB.js.map} +0 -0
  1081. /package/dist/{chunk-MT4HVDUZ.js.map → chunk-PM3QHTFT.js.map} +0 -0
  1082. /package/dist/{chunk-ZK7I7JYV.js.map → chunk-R3PS27B4.js.map} +0 -0
  1083. /package/dist/{chunk-SKE7JYKA.js.map → chunk-SFXKHM7P.js.map} +0 -0
  1084. /package/dist/{chunk-HMDCOMYU.js.map → chunk-SKGV326D.js.map} +0 -0
  1085. /package/dist/{chunk-5UM2VJ6D.js.map → chunk-UEY3VB6W.js.map} +0 -0
  1086. /package/dist/{chunk-GIF42EW3.js.map → chunk-UP6MOYCB.js.map} +0 -0
  1087. /package/dist/{chunk-MRILGULB.js.map → chunk-V2RCP53Q.js.map} +0 -0
  1088. /package/dist/{chunk-FSFEQI74.js.map → chunk-W7L6HXUC.js.map} +0 -0
  1089. /package/dist/{chunk-3IQ2TR4N.js.map → chunk-WLEB7WCG.js.map} +0 -0
  1090. /package/dist/{chunk-GL6I6MEQ.js.map → chunk-WSGF57U2.js.map} +0 -0
  1091. /package/dist/{chunk-JA3AK3PT.js.map → chunk-XNLXAWHX.js.map} +0 -0
  1092. /package/dist/{chunk-SIC6U3GZ.js.map → chunk-YHV3KRKS.js.map} +0 -0
  1093. /package/dist/{chunk-VLXA6PI2.js.map → chunk-YQMZ7IH2.js.map} +0 -0
  1094. /package/dist/{contradiction-scan-5A4IDZV5.js.map → contradiction-review-6V2LXXK6.js.map} +0 -0
  1095. /package/dist/{migrate-from-identity-anchor-G27MCD6A.js.map → contradiction-scan-GIRVC4C7.js.map} +0 -0
  1096. /package/dist/{first-start-migration-4MHQEOSD.js.map → first-start-migration-CKTCTCQI.js.map} +0 -0
  1097. /package/dist/{graph-edge-decay-5DI5GUNL.js.map → graph-edge-decay-MUP5J7CC.js.map} +0 -0
  1098. /package/dist/{path-MR5JPYOP.js.map → importers/index.js.map} +0 -0
  1099. /package/dist/{peers-HCVGHMAE.js.map → migrate-from-identity-anchor-EB4XI4Q2.js.map} +0 -0
  1100. /package/dist/{resolution-B7FNQSSP.js.map → path-X2K5XCHL.js.map} +0 -0
  1101. /package/dist/{state-store-VZU2IA53.js.map → peers/index.js.map} +0 -0
  1102. /package/dist/{tier-stats-62ZVDFKS.js.map → tier-stats-SKML2OSF.js.map} +0 -0
@@ -25,6 +25,73 @@ function makeTraceId(topics) {
25
25
  const key = topics.slice().sort().join(",");
26
26
  return `trace-${createHash("sha256").update(key).digest("hex").slice(0, 8)}`;
27
27
  }
28
+ function isRecord(value) {
29
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
30
+ }
31
+ function isStringArray(value) {
32
+ return Array.isArray(value) && value.every((entry) => typeof entry === "string");
33
+ }
34
+ function isStringRecord(value) {
35
+ return isRecord(value) && Object.values(value).every((entry) => typeof entry === "string");
36
+ }
37
+ function isStringArrayRecord(value) {
38
+ return isRecord(value) && Object.values(value).every(isStringArray);
39
+ }
40
+ function parseOpenBoxState(value) {
41
+ if (value === null) return null;
42
+ if (!isRecord(value)) return null;
43
+ if (typeof value.id !== "string" || typeof value.createdAt !== "string" || typeof value.lastActivityAt !== "string" || !isStringArray(value.topics) || !isStringArray(value.memoryIds)) {
44
+ return null;
45
+ }
46
+ if (value.goal !== void 0 && typeof value.goal !== "string") return null;
47
+ if (value.toolsUsed !== void 0 && !isStringArray(value.toolsUsed)) return null;
48
+ return {
49
+ id: value.id,
50
+ createdAt: value.createdAt,
51
+ lastActivityAt: value.lastActivityAt,
52
+ topics: value.topics,
53
+ memoryIds: value.memoryIds,
54
+ goal: value.goal,
55
+ toolsUsed: value.toolsUsed
56
+ };
57
+ }
58
+ function parseTraceIndex(value) {
59
+ if (!isRecord(value)) return null;
60
+ if (!isStringArrayRecord(value.traces) || !isStringRecord(value.boxToTrace) || !isStringArrayRecord(value.traceTopics)) {
61
+ return null;
62
+ }
63
+ const traceLastSeen = value.traceLastSeen ?? {};
64
+ if (!isStringRecord(traceLastSeen)) return null;
65
+ return {
66
+ traces: value.traces,
67
+ boxToTrace: value.boxToTrace,
68
+ traceTopics: value.traceTopics,
69
+ traceLastSeen
70
+ };
71
+ }
72
+ function serializeStringArray(values) {
73
+ return JSON.stringify(values);
74
+ }
75
+ function parseStringArray(val) {
76
+ if (!val) return [];
77
+ try {
78
+ const parsed = JSON.parse(val);
79
+ if (Array.isArray(parsed)) {
80
+ return parsed.filter((entry) => typeof entry === "string");
81
+ }
82
+ } catch {
83
+ }
84
+ const start = val.indexOf("[");
85
+ const end = val.lastIndexOf("]");
86
+ if (start === -1 || end <= start) return [];
87
+ return val.slice(start + 1, end).split(",").map((s) => stripLegacyQuotes(s.trim())).filter(Boolean);
88
+ }
89
+ function stripLegacyQuotes(value) {
90
+ if (value.length >= 2 && value.startsWith('"') && value.endsWith('"')) {
91
+ return value.slice(1, -1);
92
+ }
93
+ return value;
94
+ }
28
95
  function serializeBoxFrontmatter(fm) {
29
96
  const lines = [
30
97
  "---",
@@ -33,13 +100,13 @@ function serializeBoxFrontmatter(fm) {
33
100
  `createdAt: ${fm.createdAt}`,
34
101
  `sealedAt: ${fm.sealedAt}`,
35
102
  `sealReason: ${fm.sealReason}`,
36
- `topics: [${fm.topics.map((t) => `"${t}"`).join(", ")}]`,
37
- `memoryIds: [${fm.memoryIds.map((m) => `"${m}"`).join(", ")}]`
103
+ `topics: ${serializeStringArray(fm.topics)}`,
104
+ `memoryIds: ${serializeStringArray(fm.memoryIds)}`
38
105
  ];
39
106
  if (fm.sessionKey) lines.push(`sessionKey: ${fm.sessionKey}`);
40
107
  if (fm.traceId) lines.push(`traceId: ${fm.traceId}`);
41
108
  if (fm.goal) lines.push(`goal: ${fm.goal.replace(/[\r\n]+/g, " ")}`);
42
- if (fm.toolsUsed?.length) lines.push(`toolsUsed: [${fm.toolsUsed.map((t) => `"${t}"`).join(", ")}]`);
109
+ if (fm.toolsUsed?.length) lines.push(`toolsUsed: ${serializeStringArray(fm.toolsUsed)}`);
43
110
  if (fm.outcome) lines.push(`outcome: ${fm.outcome}`);
44
111
  lines.push("---");
45
112
  return lines.join("\n");
@@ -54,12 +121,6 @@ function parseBoxFrontmatter(raw) {
54
121
  if (colonIdx === -1) continue;
55
122
  fm[line.slice(0, colonIdx).trim()] = line.slice(colonIdx + 1).trim();
56
123
  }
57
- const parseArray = (val) => {
58
- if (!val) return [];
59
- const m = val.match(/\[(.*)]/);
60
- if (!m) return [];
61
- return m[1].split(",").map((s) => s.trim().replace(/^"|"$/g, "")).filter(Boolean);
62
- };
63
124
  const outcome = fm.outcome;
64
125
  return {
65
126
  id: fm.id ?? "",
@@ -68,11 +129,11 @@ function parseBoxFrontmatter(raw) {
68
129
  sealedAt: fm.sealedAt ?? "",
69
130
  sealReason: fm.sealReason ?? "forced",
70
131
  sessionKey: fm.sessionKey,
71
- topics: parseArray(fm.topics),
72
- memoryIds: parseArray(fm.memoryIds),
132
+ topics: parseStringArray(fm.topics),
133
+ memoryIds: parseStringArray(fm.memoryIds),
73
134
  traceId: fm.traceId,
74
135
  goal: fm.goal || void 0,
75
- toolsUsed: fm.toolsUsed ? parseArray(fm.toolsUsed) : void 0,
136
+ toolsUsed: fm.toolsUsed ? parseStringArray(fm.toolsUsed) : void 0,
76
137
  outcome: outcome && ["success", "failure", "partial", "unknown"].includes(outcome) ? outcome : void 0
77
138
  };
78
139
  }
@@ -119,27 +180,26 @@ var BoxBuilder = class {
119
180
  this.stateLoaded = true;
120
181
  try {
121
182
  const raw = await readFile(this.openBoxStatePath, "utf-8");
122
- this.openBox = JSON.parse(raw);
183
+ this.openBox = parseOpenBoxState(JSON.parse(raw));
123
184
  } catch {
124
185
  this.openBox = null;
125
186
  }
126
187
  }
127
- async saveOpenBox() {
188
+ async writeOpenBoxState(state) {
128
189
  await mkdir(this.stateDir, { recursive: true });
129
- if (this.openBox) {
130
- await writeFile(this.openBoxStatePath, JSON.stringify(this.openBox, null, 2), "utf-8");
131
- } else {
132
- try {
133
- await writeFile(this.openBoxStatePath, "null", "utf-8");
134
- } catch {
135
- }
136
- }
190
+ await writeFile(this.openBoxStatePath, JSON.stringify(state, null, 2), "utf-8");
191
+ }
192
+ async saveOpenBox() {
193
+ await this.writeOpenBoxState(this.openBox);
137
194
  }
138
195
  async loadTraceIndex() {
139
196
  try {
140
197
  const raw = await readFile(this.tracesPath, "utf-8");
141
- const parsed = JSON.parse(raw);
142
- parsed.traceLastSeen ??= {};
198
+ const parsed = parseTraceIndex(JSON.parse(raw));
199
+ if (!parsed) {
200
+ log.warn("[engram/boxes] Ignoring invalid trace index state");
201
+ return { traces: {}, boxToTrace: {}, traceTopics: {}, traceLastSeen: {} };
202
+ }
143
203
  return parsed;
144
204
  } catch {
145
205
  return { traces: {}, boxToTrace: {}, traceTopics: {}, traceLastSeen: {} };
@@ -149,8 +209,10 @@ var BoxBuilder = class {
149
209
  try {
150
210
  await mkdir(this.stateDir, { recursive: true });
151
211
  await writeFile(this.tracesPath, JSON.stringify(idx, null, 2), "utf-8");
212
+ return true;
152
213
  } catch (err) {
153
214
  log.warn(`[engram/boxes] Failed to save trace index: ${err.message}`);
215
+ return false;
154
216
  }
155
217
  }
156
218
  // ── Core logic ────────────────────────────────────────────────────────────
@@ -233,9 +295,9 @@ var BoxBuilder = class {
233
295
  await this.loadOpenBox();
234
296
  if (!this.openBox) return null;
235
297
  const box = this.openBox;
236
- this.openBox = null;
237
298
  if (box.memoryIds.length === 0 && box.topics.length === 0) {
238
- await this.saveOpenBox();
299
+ await this.writeOpenBoxState(null);
300
+ this.openBox = null;
239
301
  return null;
240
302
  }
241
303
  const sealedAt = (/* @__PURE__ */ new Date()).toISOString();
@@ -266,7 +328,8 @@ var BoxBuilder = class {
266
328
  const filePath = path.join(dir, `${box.id}.md`);
267
329
  await writeFile(filePath, content, "utf-8");
268
330
  log.debug(`[boxes] sealed box ${box.id} (${reason}): ${box.memoryIds.length} memories, topics=[${box.topics.join(",")}]`);
269
- await this.saveOpenBox();
331
+ await this.writeOpenBoxState(null);
332
+ this.openBox = null;
270
333
  return box.id;
271
334
  }
272
335
  // ── Trace Weaving ─────────────────────────────────────────────────────────
@@ -304,8 +367,7 @@ var BoxBuilder = class {
304
367
  } else {
305
368
  idx.traceTopics[traceId] = [...topics];
306
369
  }
307
- await this.saveTraceIndex(idx);
308
- return traceId;
370
+ return await this.saveTraceIndex(idx) ? traceId : void 0;
309
371
  }
310
372
  // ── Recall ────────────────────────────────────────────────────────────────
311
373
  /**
@@ -372,4 +434,4 @@ export {
372
434
  parseBoxFrontmatter,
373
435
  BoxBuilder
374
436
  };
375
- //# sourceMappingURL=chunk-NZL6GGQE.js.map
437
+ //# sourceMappingURL=chunk-HQ6NIBL6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/boxes.ts"],"sourcesContent":["/**\n * Memory Boxes + Trace Weaving (v8.0 Phase 2A)\n *\n * Implements the Membox concept: a sliding topic window that forms an \"open box\"\n * accumulating related memories. The box is sealed on topic shift or time gap,\n * then written to memory/boxes/YYYY-MM-DD/box-<id>.md.\n *\n * Trace Weaving links recurring topic boxes with a shared traceId so that\n * cross-session continuity on the same topics is preserved and discoverable.\n */\n\nimport { mkdir, writeFile, readFile, readdir } from \"node:fs/promises\";\nimport type { Dirent } from \"node:fs\";\nimport path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { log } from \"./logger.js\";\n\nexport const BOX_DIR = \"boxes\";\nconst STATE_DIR = \"state\";\nconst TRACES_FILE = \"traces.json\";\nconst OPEN_BOX_STATE_FILE = \"open-box.json\";\n\n// ── Types ─────────────────────────────────────────────────────────────────\n\nexport interface BoxFrontmatter {\n id: string;\n memoryKind: \"box\";\n createdAt: string;\n sealedAt: string;\n sealReason: SealReason;\n sessionKey?: string;\n topics: string[];\n memoryIds: string[];\n traceId?: string;\n /** High-level task goal for this episode (REMem-inspired). */\n goal?: string;\n /** Tools invoked during this episode. */\n toolsUsed?: string[];\n /** Episode outcome: success, failure, partial, or unknown. */\n outcome?: \"success\" | \"failure\" | \"partial\" | \"unknown\";\n}\n\nexport type SealReason = \"topic_shift\" | \"time_gap\" | \"max_memories\" | \"forced\" | \"flush\";\n\ninterface OpenBoxState {\n id: string;\n createdAt: string;\n lastActivityAt: string;\n topics: string[];\n memoryIds: string[];\n goal?: string;\n toolsUsed?: string[];\n}\n\ninterface TraceIndex {\n /** traceId → list of box IDs */\n traces: Record<string, string[]>;\n /** boxId → traceId */\n boxToTrace: Record<string, string>;\n /** traceId → canonical topic fingerprint for matching */\n traceTopics: Record<string, string[]>;\n /** traceId → ISO timestamp of last box added (for lookback filtering) */\n traceLastSeen: Record<string, string>;\n}\n\nexport interface BoxBuilderConfig {\n memoryBoxesEnabled: boolean;\n traceWeaverEnabled: boolean;\n /** Jaccard threshold below which topic shift triggers seal (0-1, default 0.35) */\n boxTopicShiftThreshold: number;\n /** Time gap in ms before sealing an open box (default 30 min) */\n boxTimeGapMs: number;\n /** Max memories in one box before forced seal */\n boxMaxMemories: number;\n /** Days back to look for trace links */\n traceWeaverLookbackDays: number;\n /** Minimum topic overlap to assign same traceId (0-1, default 0.4) */\n traceWeaverOverlapThreshold: number;\n}\n\ninterface ExtractionEvent {\n topics: string[];\n memoryIds: string[];\n timestamp: string;\n goal?: string;\n toolsUsed?: string[];\n}\n\n// ── Utility ───────────────────────────────────────────────────────────────\n\n/**\n * Jaccard similarity between two topic arrays.\n * Returns 0.0 for empty inputs.\n */\nexport function topicOverlapScore(a: string[], b: string[]): number {\n if (a.length === 0 || b.length === 0) return 0.0;\n const setA = new Set(a.map((t) => t.toLowerCase()));\n const setB = new Set(b.map((t) => t.toLowerCase()));\n const intersection = [...setA].filter((t) => setB.has(t)).length;\n const union = new Set([...setA, ...setB]).size;\n return union === 0 ? 0.0 : intersection / union;\n}\n\nfunction makeBoxId(): string {\n return `box-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;\n}\n\nfunction makeTraceId(topics: string[]): string {\n const key = topics.slice().sort().join(\",\");\n return `trace-${createHash(\"sha256\").update(key).digest(\"hex\").slice(0, 8)}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n return isRecord(value) && Object.values(value).every((entry) => typeof entry === \"string\");\n}\n\nfunction isStringArrayRecord(value: unknown): value is Record<string, string[]> {\n return isRecord(value) && Object.values(value).every(isStringArray);\n}\n\nfunction parseOpenBoxState(value: unknown): OpenBoxState | null {\n if (value === null) return null;\n if (!isRecord(value)) return null;\n if (\n typeof value.id !== \"string\" ||\n typeof value.createdAt !== \"string\" ||\n typeof value.lastActivityAt !== \"string\" ||\n !isStringArray(value.topics) ||\n !isStringArray(value.memoryIds)\n ) {\n return null;\n }\n if (value.goal !== undefined && typeof value.goal !== \"string\") return null;\n if (value.toolsUsed !== undefined && !isStringArray(value.toolsUsed)) return null;\n return {\n id: value.id,\n createdAt: value.createdAt,\n lastActivityAt: value.lastActivityAt,\n topics: value.topics,\n memoryIds: value.memoryIds,\n goal: value.goal,\n toolsUsed: value.toolsUsed,\n };\n}\n\nfunction parseTraceIndex(value: unknown): TraceIndex | null {\n if (!isRecord(value)) return null;\n if (\n !isStringArrayRecord(value.traces) ||\n !isStringRecord(value.boxToTrace) ||\n !isStringArrayRecord(value.traceTopics)\n ) {\n return null;\n }\n const traceLastSeen = value.traceLastSeen ?? {};\n if (!isStringRecord(traceLastSeen)) return null;\n return {\n traces: value.traces,\n boxToTrace: value.boxToTrace,\n traceTopics: value.traceTopics,\n traceLastSeen,\n };\n}\n\n// ── Frontmatter serialization ──────────────────────────────────────────────\n\nfunction serializeStringArray(values: string[]): string {\n return JSON.stringify(values);\n}\n\nfunction parseStringArray(val: string | undefined): string[] {\n if (!val) return [];\n try {\n const parsed = JSON.parse(val);\n if (Array.isArray(parsed)) {\n return parsed.filter((entry): entry is string => typeof entry === \"string\");\n }\n } catch {\n // Fall back to the legacy comma-split parser below.\n }\n const start = val.indexOf(\"[\");\n const end = val.lastIndexOf(\"]\");\n if (start === -1 || end <= start) return [];\n return val\n .slice(start + 1, end)\n .split(\",\")\n .map((s) => stripLegacyQuotes(s.trim()))\n .filter(Boolean);\n}\n\nfunction stripLegacyQuotes(value: string): string {\n if (value.length >= 2 && value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\")) {\n return value.slice(1, -1);\n }\n return value;\n}\n\nfunction serializeBoxFrontmatter(fm: BoxFrontmatter): string {\n const lines = [\n \"---\",\n `id: ${fm.id}`,\n `memoryKind: ${fm.memoryKind}`,\n `createdAt: ${fm.createdAt}`,\n `sealedAt: ${fm.sealedAt}`,\n `sealReason: ${fm.sealReason}`,\n `topics: ${serializeStringArray(fm.topics)}`,\n `memoryIds: ${serializeStringArray(fm.memoryIds)}`,\n ];\n if (fm.sessionKey) lines.push(`sessionKey: ${fm.sessionKey}`);\n if (fm.traceId) lines.push(`traceId: ${fm.traceId}`);\n if (fm.goal) lines.push(`goal: ${fm.goal.replace(/[\\r\\n]+/g, \" \")}`);\n if (fm.toolsUsed?.length) lines.push(`toolsUsed: ${serializeStringArray(fm.toolsUsed)}`);\n if (fm.outcome) lines.push(`outcome: ${fm.outcome}`);\n lines.push(\"---\");\n return lines.join(\"\\n\");\n}\n\nexport function parseBoxFrontmatter(raw: string): BoxFrontmatter | null {\n const match = raw.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return null;\n\n const fmBlock = match[1];\n const fm: Record<string, string> = {};\n for (const line of fmBlock.split(\"\\n\")) {\n const colonIdx = line.indexOf(\":\");\n if (colonIdx === -1) continue;\n fm[line.slice(0, colonIdx).trim()] = line.slice(colonIdx + 1).trim();\n }\n\n const outcome = fm.outcome as BoxFrontmatter[\"outcome\"];\n return {\n id: fm.id ?? \"\",\n memoryKind: \"box\",\n createdAt: fm.createdAt ?? \"\",\n sealedAt: fm.sealedAt ?? \"\",\n sealReason: (fm.sealReason ?? \"forced\") as SealReason,\n sessionKey: fm.sessionKey,\n topics: parseStringArray(fm.topics),\n memoryIds: parseStringArray(fm.memoryIds),\n traceId: fm.traceId,\n goal: fm.goal || undefined,\n toolsUsed: fm.toolsUsed ? parseStringArray(fm.toolsUsed) : undefined,\n outcome: outcome && [\"success\", \"failure\", \"partial\", \"unknown\"].includes(outcome) ? outcome : undefined,\n };\n}\n\n// ── BoxBuilder ────────────────────────────────────────────────────────────\n\nexport class BoxBuilder {\n private baseDir: string;\n private cfg: BoxBuilderConfig;\n private openBox: OpenBoxState | null = null;\n private stateLoaded = false;\n private openBoxMutationChain: Promise<unknown> = Promise.resolve();\n private traceMutationChain: Promise<unknown> = Promise.resolve();\n\n constructor(baseDir: string, cfg: BoxBuilderConfig) {\n this.baseDir = baseDir;\n this.cfg = cfg;\n }\n\n private enqueueOpenBoxMutation<T>(op: () => Promise<T>): Promise<T> {\n const run = this.openBoxMutationChain.catch(() => {}).then(op);\n this.openBoxMutationChain = run.catch(() => {});\n return run;\n }\n\n private enqueueTraceMutation<T>(op: () => Promise<T>): Promise<T> {\n const run = this.traceMutationChain.catch(() => {}).then(op);\n this.traceMutationChain = run.catch(() => {});\n return run;\n }\n\n private get boxBaseDir(): string {\n return path.join(this.baseDir, BOX_DIR);\n }\n\n private get stateDir(): string {\n return path.join(this.baseDir, STATE_DIR);\n }\n\n private get openBoxStatePath(): string {\n return path.join(this.stateDir, OPEN_BOX_STATE_FILE);\n }\n\n private get tracesPath(): string {\n return path.join(this.stateDir, TRACES_FILE);\n }\n\n // ── State persistence ────────────────────────────────────────────────────\n\n private async loadOpenBox(): Promise<void> {\n if (this.stateLoaded) return;\n this.stateLoaded = true;\n try {\n const raw = await readFile(this.openBoxStatePath, \"utf-8\");\n this.openBox = parseOpenBoxState(JSON.parse(raw));\n } catch {\n this.openBox = null;\n }\n }\n\n private async writeOpenBoxState(state: OpenBoxState | null): Promise<void> {\n await mkdir(this.stateDir, { recursive: true });\n await writeFile(this.openBoxStatePath, JSON.stringify(state, null, 2), \"utf-8\");\n }\n\n private async saveOpenBox(): Promise<void> {\n await this.writeOpenBoxState(this.openBox);\n }\n\n private async loadTraceIndex(): Promise<TraceIndex> {\n try {\n const raw = await readFile(this.tracesPath, \"utf-8\");\n const parsed = parseTraceIndex(JSON.parse(raw));\n if (!parsed) {\n log.warn(\"[engram/boxes] Ignoring invalid trace index state\");\n return { traces: {}, boxToTrace: {}, traceTopics: {}, traceLastSeen: {} };\n }\n return parsed;\n } catch {\n return { traces: {}, boxToTrace: {}, traceTopics: {}, traceLastSeen: {} };\n }\n }\n\n private async saveTraceIndex(idx: TraceIndex): Promise<boolean> {\n try {\n await mkdir(this.stateDir, { recursive: true });\n await writeFile(this.tracesPath, JSON.stringify(idx, null, 2), \"utf-8\");\n return true;\n } catch (err) {\n log.warn(`[engram/boxes] Failed to save trace index: ${(err as Error).message}`);\n return false;\n }\n }\n\n // ── Core logic ────────────────────────────────────────────────────────────\n\n /**\n * Called after each extraction run.\n * Decides whether to seal the current open box and/or start a new one.\n */\n async onExtraction(event: ExtractionEvent): Promise<void> {\n await this.enqueueOpenBoxMutation(async () => this.onExtractionUnlocked(event));\n }\n\n private async onExtractionUnlocked(event: ExtractionEvent): Promise<void> {\n if (!this.cfg.memoryBoxesEnabled) return;\n\n await this.loadOpenBox();\n\n const newTopics = event.topics.filter(Boolean);\n const now = new Date(event.timestamp);\n const nowMs = now.getTime();\n\n if (this.openBox) {\n // Check seal conditions\n const lastActivity = new Date(this.openBox.lastActivityAt).getTime();\n const timeGapMs = nowMs - lastActivity;\n const overlap = topicOverlapScore(this.openBox.topics, newTopics);\n const topicShifted = newTopics.length > 0 && overlap < this.cfg.boxTopicShiftThreshold;\n const timeExpired = timeGapMs >= this.cfg.boxTimeGapMs;\n const tooManyMemories =\n this.openBox.memoryIds.length + event.memoryIds.length > this.cfg.boxMaxMemories;\n\n if (tooManyMemories) {\n // Merge topics and add current batch then seal\n const topicSet = new Set([...this.openBox.topics, ...newTopics]);\n this.openBox.topics = [...topicSet];\n this.openBox.memoryIds.push(...event.memoryIds);\n if (event.toolsUsed?.length) {\n const toolSet = new Set([...(this.openBox.toolsUsed ?? []), ...event.toolsUsed]);\n this.openBox.toolsUsed = [...toolSet];\n }\n await this.sealCurrentUnlocked(\"max_memories\");\n } else if (topicShifted) {\n await this.sealCurrentUnlocked(\"topic_shift\");\n this.openBox = this.newBox(event, now.toISOString());\n await this.saveOpenBox();\n } else if (timeExpired) {\n await this.sealCurrentUnlocked(\"time_gap\");\n this.openBox = this.newBox(event, now.toISOString());\n await this.saveOpenBox();\n } else {\n // Accumulate\n this.openBox.memoryIds.push(...event.memoryIds);\n // Merge new topics (union)\n const topicSet = new Set([...this.openBox.topics, ...newTopics]);\n this.openBox.topics = [...topicSet];\n this.openBox.lastActivityAt = now.toISOString();\n // Merge toolsUsed (union)\n if (event.toolsUsed?.length) {\n const toolSet = new Set([...(this.openBox.toolsUsed ?? []), ...event.toolsUsed]);\n this.openBox.toolsUsed = [...toolSet];\n }\n await this.saveOpenBox();\n }\n } else {\n // No open box — start one\n this.openBox = this.newBox(event, now.toISOString());\n // If this initial batch already exceeds max, seal immediately\n if (this.openBox.memoryIds.length > this.cfg.boxMaxMemories) {\n await this.sealCurrentUnlocked(\"max_memories\");\n } else {\n await this.saveOpenBox();\n }\n }\n }\n\n private newBox(event: ExtractionEvent, ts: string): OpenBoxState {\n return {\n id: makeBoxId(),\n createdAt: ts,\n lastActivityAt: ts,\n topics: event.topics.filter(Boolean),\n memoryIds: [...event.memoryIds],\n goal: event.goal,\n toolsUsed: event.toolsUsed?.length ? [...event.toolsUsed] : undefined,\n };\n }\n\n /**\n * Seal the current open box and write it to disk.\n * Also runs trace weaving if enabled.\n */\n async sealCurrent(reason: SealReason): Promise<string | null> {\n return this.enqueueOpenBoxMutation(async () => this.sealCurrentUnlocked(reason));\n }\n\n private async sealCurrentUnlocked(reason: SealReason): Promise<string | null> {\n await this.loadOpenBox();\n if (!this.openBox) return null;\n\n const box = this.openBox;\n\n if (box.memoryIds.length === 0 && box.topics.length === 0) {\n await this.writeOpenBoxState(null);\n this.openBox = null;\n return null;\n }\n\n const sealedAt = new Date().toISOString();\n const day = sealedAt.slice(0, 10);\n const dir = path.join(this.boxBaseDir, day);\n await mkdir(dir, { recursive: true });\n\n let traceId: string | undefined;\n if (this.cfg.traceWeaverEnabled && box.topics.length > 0) {\n traceId = await this.resolveTrace(box.id, box.topics);\n }\n\n const fm: BoxFrontmatter = {\n id: box.id,\n memoryKind: \"box\",\n createdAt: box.createdAt,\n sealedAt,\n sealReason: reason,\n topics: box.topics,\n memoryIds: box.memoryIds,\n traceId,\n goal: box.goal,\n toolsUsed: box.toolsUsed?.length ? box.toolsUsed : undefined,\n outcome: \"unknown\",\n };\n\n const content = `${serializeBoxFrontmatter(fm)}\\n\\n<!-- Topics: ${box.topics.join(\", \")} | Memories: ${box.memoryIds.length} -->\\n`;\n const filePath = path.join(dir, `${box.id}.md`);\n await writeFile(filePath, content, \"utf-8\");\n log.debug(`[boxes] sealed box ${box.id} (${reason}): ${box.memoryIds.length} memories, topics=[${box.topics.join(\",\")}]`);\n\n await this.writeOpenBoxState(null);\n this.openBox = null;\n return box.id;\n }\n\n // ── Trace Weaving ─────────────────────────────────────────────────────────\n\n /**\n * Find an existing trace that matches box topics, or create a new trace.\n * Returns the traceId to assign to this box.\n */\n private async resolveTrace(boxId: string, topics: string[]): Promise<string | undefined> {\n return this.enqueueTraceMutation(async () => this.resolveTraceUnlocked(boxId, topics));\n }\n\n private async resolveTraceUnlocked(boxId: string, topics: string[]): Promise<string | undefined> {\n const idx = await this.loadTraceIndex();\n\n // Filter to traces active within the lookback window\n const lookbackMs = this.cfg.traceWeaverLookbackDays * 24 * 60 * 60 * 1000;\n const cutoff = new Date(Date.now() - lookbackMs);\n\n let bestTraceId: string | undefined;\n let bestScore = 0;\n\n for (const [tid, traceTopics] of Object.entries(idx.traceTopics)) {\n const lastSeen = idx.traceLastSeen[tid];\n if (lastSeen && new Date(lastSeen) < cutoff) continue; // outside lookback window\n const score = topicOverlapScore(topics, traceTopics);\n if (score >= this.cfg.traceWeaverOverlapThreshold && score > bestScore) {\n bestScore = score;\n bestTraceId = tid;\n }\n }\n\n const traceId = bestTraceId ?? makeTraceId(topics);\n const now = new Date().toISOString();\n\n // Update trace index\n if (!idx.traces[traceId]) idx.traces[traceId] = [];\n idx.traces[traceId].push(boxId);\n idx.boxToTrace[boxId] = traceId;\n idx.traceLastSeen[traceId] = now;\n\n // Update canonical topics for this trace (merge)\n if (idx.traceTopics[traceId]) {\n const merged = new Set([...idx.traceTopics[traceId], ...topics]);\n idx.traceTopics[traceId] = [...merged];\n } else {\n idx.traceTopics[traceId] = [...topics];\n }\n\n return (await this.saveTraceIndex(idx)) ? traceId : undefined;\n }\n\n // ── Recall ────────────────────────────────────────────────────────────────\n\n /**\n * Read all sealed boxes from the last N days for recall injection.\n */\n async readRecentBoxes(days: number): Promise<BoxFrontmatter[]> {\n const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000);\n const cutoffDateStr = cutoff.toISOString().slice(0, 10); // \"YYYY-MM-DD\"\n\n let topEntries: Dirent<string>[];\n try {\n topEntries = await readdir(this.boxBaseDir, { withFileTypes: true, encoding: \"utf-8\" });\n } catch {\n return [];\n }\n\n // Filter day directories by name (YYYY-MM-DD) — skip dirs older than cutoff\n // without reading a single file from them.\n const recentDirs = topEntries\n .filter((e) => e.isDirectory() && /^\\d{4}-\\d{2}-\\d{2}$/.test(e.name) && e.name >= cutoffDateStr)\n .map((e) => path.join(this.boxBaseDir, e.name));\n\n // Also include legacy flat entries at the root level (non-date dirs and .md files)\n const legacyEntries = topEntries.filter(\n (e) => !e.isDirectory() || !/^\\d{4}-\\d{2}-\\d{2}$/.test(e.name),\n );\n\n // Read all files in each recent day directory in parallel (per dir)\n const boxes: BoxFrontmatter[] = [];\n\n const readDir = async (dir: string) => {\n let files: string[];\n try {\n files = (await readdir(dir)).filter((f) => f.endsWith(\".md\"));\n } catch {\n return;\n }\n const results = await Promise.all(\n files.map(async (f) => {\n try {\n const raw = await readFile(path.join(dir, f), \"utf-8\");\n const parsed = parseBoxFrontmatter(raw);\n return parsed && new Date(parsed.sealedAt) >= cutoff ? parsed : null;\n } catch {\n return null;\n }\n }),\n );\n for (const r of results) {\n if (r !== null) boxes.push(r);\n }\n };\n\n // Day dirs in parallel\n await Promise.all(recentDirs.map(readDir));\n\n // Legacy non-date entries (walk sub-dirs sequentially but read files in parallel)\n for (const e of legacyEntries) {\n const full = path.join(this.boxBaseDir, e.name);\n if (e.isDirectory()) {\n await readDir(full);\n } else if (e.name.endsWith(\".md\")) {\n try {\n const raw = await readFile(full, \"utf-8\");\n const parsed = parseBoxFrontmatter(raw);\n if (parsed && new Date(parsed.sealedAt) >= cutoff) boxes.push(parsed);\n } catch { /* corrupt file — skip */ }\n }\n }\n\n // Sort newest-first so slice(0, N) gives the most recent boxes\n boxes.sort((a, b) => new Date(b.sealedAt).getTime() - new Date(a.sealedAt).getTime());\n return boxes;\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,4 +1,17 @@
1
+ import {
2
+ isLikelyUnsafeRegex
3
+ } from "./chunk-U3PN77QT.js";
4
+
1
5
  // src/namespaces/principal.ts
6
+ var MAX_REGEX_SESSION_KEY_LENGTH = 512;
7
+ function compileSafePrincipalRegex(pattern) {
8
+ if (isLikelyUnsafeRegex(pattern)) return null;
9
+ try {
10
+ return new RegExp(pattern);
11
+ } catch {
12
+ return null;
13
+ }
14
+ }
2
15
  function resolvePrincipal(sessionKey, config) {
3
16
  if (!config.namespacesEnabled) return "default";
4
17
  const sk = sessionKey ?? "";
@@ -14,11 +27,12 @@ function resolvePrincipal(sessionKey, config) {
14
27
  if (sk === r.match) return r.principal;
15
28
  }
16
29
  } else if (mode === "regex") {
17
- for (const r of rules) {
18
- try {
19
- const re = new RegExp(r.match);
20
- if (re.test(sk)) return r.principal;
21
- } catch {
30
+ if (sk.length <= MAX_REGEX_SESSION_KEY_LENGTH) {
31
+ for (const r of rules) {
32
+ const re = compileSafePrincipalRegex(r.match);
33
+ if (re?.test(sk)) {
34
+ return r.principal;
35
+ }
22
36
  }
23
37
  }
24
38
  }
@@ -71,4 +85,4 @@ export {
71
85
  defaultNamespaceForPrincipal,
72
86
  recallNamespacesForPrincipal
73
87
  };
74
- //# sourceMappingURL=chunk-UWVJF25J.js.map
88
+ //# sourceMappingURL=chunk-HWVTS5NO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/namespaces/principal.ts"],"sourcesContent":["import type { PluginConfig } from \"../types.js\";\nimport { isLikelyUnsafeRegex } from \"../routing/engine.js\";\n\nconst MAX_REGEX_SESSION_KEY_LENGTH = 512;\n\nfunction compileSafePrincipalRegex(pattern: string): RegExp | null {\n if (isLikelyUnsafeRegex(pattern)) return null;\n try {\n return new RegExp(pattern);\n } catch {\n return null;\n }\n}\n\nexport function resolvePrincipal(sessionKey: string | undefined, config: PluginConfig): string {\n if (!config.namespacesEnabled) return \"default\";\n const sk = sessionKey ?? \"\";\n const mode = config.principalFromSessionKeyMode;\n const rules = config.principalFromSessionKeyRules ?? [];\n\n if (!sk) return \"default\";\n\n if (mode === \"prefix\") {\n for (const r of rules) {\n if (sk.startsWith(r.match)) return r.principal;\n }\n } else if (mode === \"map\") {\n for (const r of rules) {\n if (sk === r.match) return r.principal;\n }\n } else if (mode === \"regex\") {\n if (sk.length <= MAX_REGEX_SESSION_KEY_LENGTH) {\n for (const r of rules) {\n const re = compileSafePrincipalRegex(r.match);\n if (re?.test(sk)) {\n return r.principal;\n }\n }\n }\n }\n\n // Fallback heuristic: \"agent:<agentId>:<channelType>:...\"\n const parts = sk.split(\":\");\n if (parts.length >= 2 && parts[0] === \"agent\") {\n const agentId = parts[1];\n if (agentId && agentId.length > 0) return agentId;\n }\n return \"default\";\n}\n\nexport function canReadNamespace(principal: string, namespace: string, config: PluginConfig): boolean {\n if (!config.namespacesEnabled) return true;\n const policy = config.namespacePolicies.find((p) => p.name === namespace);\n if (!policy) return namespace === config.defaultNamespace || namespace === config.sharedNamespace;\n return policy.readPrincipals.includes(principal) || policy.readPrincipals.includes(\"*\");\n}\n\nexport function canWriteNamespace(principal: string, namespace: string, config: PluginConfig): boolean {\n if (!config.namespacesEnabled) return true;\n const policy = config.namespacePolicies.find((p) => p.name === namespace);\n if (!policy) return namespace === config.defaultNamespace;\n return policy.writePrincipals.includes(principal) || policy.writePrincipals.includes(\"*\");\n}\n\n/**\n * Default \"self\" namespace for a principal.\n *\n * Heuristic:\n * - If there's a namespace policy with the same name as the principal, use it.\n * - Otherwise use config.defaultNamespace.\n */\nexport function defaultNamespaceForPrincipal(principal: string, config: PluginConfig): string {\n if (!config.namespacesEnabled) return config.defaultNamespace;\n const exists = config.namespacePolicies.some((p) => p.name === principal);\n return exists ? principal : config.defaultNamespace;\n}\n\nexport function recallNamespacesForPrincipal(principal: string, config: PluginConfig): string[] {\n const out: string[] = [];\n if (!config.namespacesEnabled) return [config.defaultNamespace];\n\n const selfNs = defaultNamespaceForPrincipal(principal, config);\n if (config.defaultRecallNamespaces.includes(\"self\") && canReadNamespace(principal, selfNs, config)) {\n out.push(selfNs);\n }\n if (config.defaultRecallNamespaces.includes(\"shared\") && canReadNamespace(principal, config.sharedNamespace, config)) {\n out.push(config.sharedNamespace);\n }\n\n for (const p of config.namespacePolicies) {\n if (p.includeInRecallByDefault && canReadNamespace(principal, p.name, config)) {\n if (!out.includes(p.name)) out.push(p.name);\n }\n }\n\n return out;\n}\n"],"mappings":"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","names":[]}
@@ -6,7 +6,7 @@ import {
6
6
  canReadNamespace,
7
7
  defaultNamespaceForPrincipal,
8
8
  resolvePrincipal
9
- } from "./chunk-UWVJF25J.js";
9
+ } from "./chunk-HWVTS5NO.js";
10
10
 
11
11
  // src/active-memory-bridge.ts
12
12
  function isArtifactPath(value) {
@@ -118,4 +118,4 @@ export {
118
118
  recallForActiveMemory,
119
119
  getMemoryForActiveMemory
120
120
  };
121
- //# sourceMappingURL=chunk-2WWLHTZY.js.map
121
+ //# sourceMappingURL=chunk-IC4GELZE.js.map
@@ -1,3 +1,7 @@
1
+ import {
2
+ CAPSULE_SCHEMA_VERSION,
3
+ EXPORT_FORMAT
4
+ } from "./chunk-J4EB7DNW.js";
1
5
  import {
2
6
  CAPSULE_ID_PATTERN,
3
7
  CapsuleBlockSchema,
@@ -6,24 +10,20 @@ import {
6
10
  } from "./chunk-WEHSQBFR.js";
7
11
  import {
8
12
  encryptCapsuleFile
9
- } from "./chunk-KNKUID7G.js";
10
- import {
11
- CAPSULE_SCHEMA_VERSION,
12
- EXPORT_FORMAT
13
- } from "./chunk-J4EB7DNW.js";
13
+ } from "./chunk-X7Y7WX73.js";
14
14
  import {
15
15
  DEFAULT_TRANSFER_EXCLUDE_DIRS,
16
16
  computeTransferOutputRel
17
- } from "./chunk-I6K5FBRQ.js";
17
+ } from "./chunk-UI3NYK34.js";
18
18
  import {
19
19
  listFilesRecursive,
20
20
  sha256File,
21
21
  toPosixRelPath,
22
22
  writeJsonFile
23
- } from "./chunk-AGZQD76C.js";
23
+ } from "./chunk-GCGJW34D.js";
24
24
 
25
25
  // src/transfer/capsule-export.ts
26
- import { mkdir, readFile, stat, writeFile } from "fs/promises";
26
+ import { mkdir, readFile, stat, unlink, writeFile } from "fs/promises";
27
27
  import path from "path";
28
28
  import { gzipSync } from "zlib";
29
29
  var DEFAULT_EXCLUDE_DIRS = DEFAULT_TRANSFER_EXCLUDE_DIRS;
@@ -31,6 +31,12 @@ var TRANSCRIPTS_DIR = "transcripts";
31
31
  var PEERS_DIR = "peers";
32
32
  async function exportCapsule(opts) {
33
33
  validateName(opts.name);
34
+ if (opts.encrypt === true && !opts.memoryDir) {
35
+ throw new Error(
36
+ "exportCapsule: 'memoryDir' is required when 'encrypt' is true so the secure-store key can be retrieved."
37
+ );
38
+ }
39
+ const encryptionMemoryDir = opts.encrypt === true ? opts.memoryDir : void 0;
34
40
  const sinceMs = parseSince(opts.since);
35
41
  const includeKinds = normalizeIncludeKinds(opts.includeKinds);
36
42
  const peerFilter = normalizePeerIds(opts.peerIds);
@@ -85,18 +91,20 @@ async function exportCapsule(opts) {
85
91
  const gz = gzipSync(Buffer.from(json, "utf-8"));
86
92
  await writeFile(archivePath, gz);
87
93
  if (opts.encrypt === true) {
88
- if (!opts.memoryDir) {
89
- throw new Error(
90
- "exportCapsule: 'memoryDir' is required when 'encrypt' is true so the secure-store key can be retrieved."
91
- );
94
+ try {
95
+ const { encPath } = await encryptCapsuleFile({
96
+ sourceGzPath: archivePath,
97
+ memoryDir: encryptionMemoryDir
98
+ });
99
+ await unlink(archivePath);
100
+ return { archivePath: encPath, manifestPath, manifest, encryptedArchivePath: encPath };
101
+ } catch (error) {
102
+ try {
103
+ await unlink(archivePath);
104
+ } catch {
105
+ }
106
+ throw error;
92
107
  }
93
- const { encPath } = await encryptCapsuleFile({
94
- sourceGzPath: archivePath,
95
- memoryDir: opts.memoryDir
96
- });
97
- const { unlink } = await import("fs/promises");
98
- await unlink(archivePath);
99
- return { archivePath: encPath, manifestPath, manifest, encryptedArchivePath: encPath };
100
108
  }
101
109
  return { archivePath, manifestPath, manifest, encryptedArchivePath: null };
102
110
  }
@@ -253,4 +261,4 @@ export {
253
261
  exportCapsule,
254
262
  isValidCapsuleSince
255
263
  };
256
- //# sourceMappingURL=chunk-QA2ZAPBU.js.map
264
+ //# sourceMappingURL=chunk-IPLYGWQF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/transfer/capsule-export.ts"],"sourcesContent":["import { mkdir, readFile, stat, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { gzipSync } from \"node:zlib\";\nimport { CAPSULE_SCHEMA_VERSION, EXPORT_FORMAT } from \"./constants.js\";\nimport {\n listFilesRecursive,\n sha256File,\n toPosixRelPath,\n writeJsonFile,\n} from \"./fs-utils.js\";\nimport {\n CAPSULE_ID_PATTERN,\n CapsuleBlockSchema,\n ExportBundleV2Schema,\n ExportManifestV2Schema,\n type CapsuleBlock,\n type ExportBundleV2,\n type ExportManifestV2,\n type ExportMemoryRecordV1,\n} from \"./types.js\";\nimport { encryptCapsuleFile } from \"./capsule-crypto.js\";\nimport { computeTransferOutputRel, DEFAULT_TRANSFER_EXCLUDE_DIRS } from \"./exclusions.js\";\n\n/**\n * Default subdirectory excludes applied to every capsule export. These match\n * the shared plaintext transfer exclusions plus the `transcripts`\n * directory, which is excluded by default and only included when the caller\n * explicitly passes `transcripts` in {@link ExportCapsuleOptions.includeKinds}.\n */\nconst DEFAULT_EXCLUDE_DIRS = DEFAULT_TRANSFER_EXCLUDE_DIRS;\n\nconst TRANSCRIPTS_DIR = \"transcripts\" as const;\n\n/**\n * Top-level directory under {@link ExportCapsuleOptions.root} that holds\n * per-peer profile bundles. When {@link ExportCapsuleOptions.peerIds} is\n * provided, only files under `peers/<peerId>/...` for the listed ids are\n * included; the rest of the `peers/` tree is excluded.\n */\nconst PEERS_DIR = \"peers\" as const;\n\n/**\n * Options accepted by {@link exportCapsule}.\n *\n * `name` — capsule id, validated against {@link CAPSULE_ID_PATTERN}. The id\n * also forms the manifest's `capsule.id` and the archive filename.\n *\n * `root` — absolute or cwd-relative path to the memory directory to export.\n *\n * `since` — optional ISO-8601 timestamp; only files with `mtime >= since`\n * are included.\n *\n * `includeKinds` — optional allow-list of top-level subdirectory names\n * (e.g. `facts`, `entities`, `corrections`, `transcripts`). When set, files\n * directly under {@link root} are excluded and only files whose first path\n * segment is in the allow-list are kept. Pass `transcripts` here explicitly\n * to opt-in transcripts (they are excluded by default).\n *\n * `peerIds` — optional allow-list restricting the `peers/` tree to files\n * under `peers/<peerId>/...`. When omitted the entire `peers/` tree is\n * included (subject to {@link includeKinds}). When set to an empty array\n * the `peers/` tree is excluded entirely.\n *\n * `outDir` — optional output directory. Defaults to `<root>/.capsules`.\n *\n * `pluginVersion` — recorded in the manifest. Defaults to `\"0.0.0\"` so\n * tests do not need to thread a version through; production callers SHOULD\n * pass the running plugin version.\n *\n * `capsule` — optional overrides for the manifest's `capsule` block. The\n * caller may pass any subset; remaining fields are filled with conservative\n * defaults documented inline below.\n *\n * `now` — optional clock override (ms epoch) used for `manifest.createdAt`.\n * Tests pass a fixed value for deterministic output.\n *\n * `encrypt` — when `true`, encrypt the output archive using the secure-store\n * master key for `memoryDir`. The keyring must be unlocked before calling\n * (`remnic secure-store unlock`). The plaintext `.capsule.json.gz` is written\n * first, then encrypted to `<name>.capsule.json.gz.enc`; the plaintext is\n * removed after successful encryption. Requires `memoryDir` to be provided.\n *\n * `memoryDir` — required when `encrypt` is `true`. The memory directory whose\n * secure-store keyring holds the master key.\n */\nexport interface ExportCapsuleOptions {\n name: string;\n root: string;\n since?: string;\n includeKinds?: readonly string[];\n peerIds?: readonly string[];\n outDir?: string;\n pluginVersion?: string;\n capsule?: Partial<Omit<CapsuleBlock, \"id\">>;\n now?: number;\n /**\n * When `true`, encrypt the output archive. Requires the secure-store to be\n * unlocked and `memoryDir` to be set. The plaintext `.capsule.json.gz` is\n * replaced by `<name>.capsule.json.gz.enc` on success.\n */\n encrypt?: boolean;\n /**\n * Memory directory whose secure-store keyring holds the master key. Required\n * when `encrypt` is `true`; ignored otherwise.\n */\n memoryDir?: string;\n /**\n * When `true`, include the `transcripts/` directory in the export even\n * though it is excluded by default. Using this flag avoids hard-coding an\n * explicit `includeKinds` allow-list that would inadvertently drop other\n * valid memory directories (`peers/`, `forks/`, etc.). (Cursor / #747)\n *\n * Ignored when `includeKinds` is provided and already contains\n * `\"transcripts\"`.\n */\n includeTranscripts?: boolean;\n}\n\nexport interface ExportCapsuleResult {\n archivePath: string;\n manifestPath: string;\n manifest: ExportManifestV2;\n /** When the export was encrypted, the `.enc` path. `null` when unencrypted. */\n encryptedArchivePath: string | null;\n}\n\n/**\n * Pure function that exports a memory directory as a portable, capsule-aware\n * V2 bundle.\n *\n * The output is a single `.capsule.json.gz` archive containing the entire\n * `ExportBundleV2` (manifest + records) plus a sidecar `manifest.json` for\n * cheap inspection. The bundle format is intentionally identical to the\n * existing `export-json` shape so PR 3/6's importer can reuse the V1 code\n * path with only a manifest version-dispatch.\n *\n * Determinism guarantees:\n * - `manifest.files` and `bundle.records` are sorted by posix path.\n * - `manifest.createdAt` is taken from {@link ExportCapsuleOptions.now}\n * when provided.\n * - The archive is gzip-compressed with default settings; no timestamp is\n * embedded (Node's `gzipSync` does not write a header timestamp when\n * using the synchronous helper, so byte-identical outputs are possible\n * given identical inputs).\n *\n * Empty result handling: a capsule with zero matching files is still a\n * valid capsule and produces a well-formed manifest with an empty `files`\n * array and an archive containing the empty bundle.\n */\nexport async function exportCapsule(\n opts: ExportCapsuleOptions,\n): Promise<ExportCapsuleResult> {\n validateName(opts.name);\n if (opts.encrypt === true && !opts.memoryDir) {\n throw new Error(\n \"exportCapsule: 'memoryDir' is required when 'encrypt' is true so the \" +\n \"secure-store key can be retrieved.\",\n );\n }\n const encryptionMemoryDir = opts.encrypt === true ? opts.memoryDir : undefined;\n const sinceMs = parseSince(opts.since);\n const includeKinds = normalizeIncludeKinds(opts.includeKinds);\n const peerFilter = normalizePeerIds(opts.peerIds);\n // `includeTranscripts: true` overrides the default transcripts exclusion\n // without requiring an explicit `includeKinds` list — so callers that want\n // all memory dirs + transcripts don't need to hard-code a list that would\n // inadvertently drop new dirs like `peers/` or `forks/`. (Cursor / #747)\n const transcriptsOverride = opts.includeTranscripts === true;\n\n const rootAbs = path.resolve(opts.root);\n await assertIsDirectory(rootAbs);\n\n const outDirAbs = path.resolve(opts.outDir ?? path.join(rootAbs, \".capsules\"));\n // Reject outDir === root: the input scan would otherwise be entirely\n // skipped by `shouldInclude` (outDirRelPosix === \".\") and the export would\n // silently succeed with an empty manifest/archive — a Rule 51 violation\n // and a data-loss footgun for callers that point outDir at the root.\n if (outDirAbs === rootAbs) {\n throw new Error(\n \"exportCapsule: 'outDir' must not equal 'root'. \" +\n \"Choose a separate directory (default: <root>/.capsules) so the \" +\n \"export does not overwrite or shadow the source tree.\",\n );\n }\n await mkdir(outDirAbs, { recursive: true });\n\n // If the output directory lives inside the export root, scan results would\n // re-import previous capsule archives on subsequent runs. Compute the\n // posix-relative path of the outDir under rootAbs (or `null` when it sits\n // outside) so {@link shouldInclude} can skip the entire subtree.\n const outDirRelPosix = computeTransferOutputRel(rootAbs, outDirAbs);\n\n const filesAbs = await listFilesRecursive(rootAbs);\n\n const records: ExportMemoryRecordV1[] = [];\n const manifestFiles: ExportManifestV2[\"files\"] = [];\n\n for (const abs of filesAbs) {\n const relPosix = toPosixRelPath(abs, rootAbs);\n if (!shouldInclude(relPosix, includeKinds, peerFilter, outDirRelPosix, transcriptsOverride)) continue;\n\n if (sinceMs !== null) {\n const st = await stat(abs);\n if (st.mtimeMs < sinceMs) continue;\n }\n\n const content = await readFile(abs, \"utf-8\");\n records.push({ path: relPosix, content });\n const { sha256, bytes } = await sha256File(abs);\n manifestFiles.push({ path: relPosix, sha256, bytes });\n }\n\n records.sort((a, b) => a.path.localeCompare(b.path));\n manifestFiles.sort((a, b) => a.path.localeCompare(b.path));\n\n const capsule = buildCapsuleBlock(opts.name, opts.capsule);\n const includesTranscripts =\n transcriptsOverride || (includeKinds ?? new Set<string>()).has(TRANSCRIPTS_DIR);\n\n const createdAtMs = opts.now ?? Date.now();\n const manifest = ExportManifestV2Schema.parse({\n format: EXPORT_FORMAT,\n schemaVersion: CAPSULE_SCHEMA_VERSION,\n createdAt: new Date(createdAtMs).toISOString(),\n pluginVersion: opts.pluginVersion ?? \"0.0.0\",\n includesTranscripts,\n files: manifestFiles,\n capsule,\n } satisfies ExportManifestV2);\n\n const bundle: ExportBundleV2 = ExportBundleV2Schema.parse({\n manifest,\n records,\n });\n\n const archivePath = path.join(outDirAbs, `${opts.name}.capsule.json.gz`);\n const manifestPath = path.join(outDirAbs, `${opts.name}.manifest.json`);\n\n // Sidecar manifest for cheap inspection without decompressing the archive.\n await writeJsonFile(manifestPath, manifest);\n\n // Single-artifact gzip archive containing the whole bundle. JSON encoded\n // before gzip so the archive is opaque to file-tree filtering. Using the\n // sync helper keeps the function pure async (no filesystem callback chain)\n // and matches the existing transfer modules' style.\n const json = JSON.stringify(bundle);\n const gz = gzipSync(Buffer.from(json, \"utf-8\"));\n await writeFile(archivePath, gz);\n\n // Optional encryption (PR 4/4). When opts.encrypt is true, wrap the\n // plaintext gzip in a REMNIC-ENC sealed envelope and remove the plaintext.\n // Per gotcha #54: write the encrypted file before removing the plaintext so\n // a crash mid-encrypt does not destroy the only copy.\n if (opts.encrypt === true) {\n try {\n const { encPath } = await encryptCapsuleFile({\n sourceGzPath: archivePath,\n memoryDir: encryptionMemoryDir!,\n });\n // Remove the plaintext only after the encrypted file was written successfully.\n await unlink(archivePath);\n return { archivePath: encPath, manifestPath, manifest, encryptedArchivePath: encPath };\n } catch (error) {\n try {\n await unlink(archivePath);\n } catch {\n // Best-effort cleanup: do not leave a plaintext capsule after a failed encrypted export.\n }\n throw error;\n }\n }\n\n return { archivePath, manifestPath, manifest, encryptedArchivePath: null };\n}\n\n// ---------------------------------------------------------------------------\n// Validation helpers\n// ---------------------------------------------------------------------------\n\nfunction validateName(name: unknown): void {\n if (typeof name !== \"string\" || !CAPSULE_ID_PATTERN.test(name)) {\n throw new Error(\n `exportCapsule: invalid capsule name. Expected /${CAPSULE_ID_PATTERN.source}/`,\n );\n }\n if (name.length > 64) {\n throw new Error(\n \"exportCapsule: invalid capsule name. Must be 64 characters or fewer.\",\n );\n }\n}\n\n/**\n * Strict ISO-8601 form accepted by {@link parseSince}. We accept exactly two\n * shapes:\n *\n * 1. Date-only: `YYYY-MM-DD` — interpreted as UTC midnight per ECMAScript.\n * 2. Date+time with an explicit timezone designator:\n * `YYYY-MM-DDTHH:MM(:SS(.fff)?)?(Z|±HH:MM)`.\n *\n * Notably **rejected**: date+time **without** a timezone (e.g.\n * `2026-02-28T00:00:00`). ECMAScript treats this as local time, which makes\n * acceptance and the resulting cutoff depend on the host's `TZ` and silently\n * shifts incremental-export windows for users outside UTC. Rule 51: reject\n * inputs that silently coerce to a host-dependent meaning.\n */\nconst ISO_8601_RE =\n /^\\d{4}-\\d{2}-\\d{2}(?:[Tt]\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d{1,9})?)?(?:[Zz]|[+-]\\d{2}:?\\d{2}))?$/;\n\nfunction parseSince(since: string | undefined): number | null {\n if (since === undefined) return null;\n if (typeof since !== \"string\" || since.trim() === \"\") {\n throw new Error(\"exportCapsule: 'since' must be a non-empty ISO-8601 string\");\n }\n if (!ISO_8601_RE.test(since)) {\n throw new Error(\n `exportCapsule: 'since' is not a valid ISO-8601 timestamp: ${since}`,\n );\n }\n const ms = Date.parse(since);\n if (!Number.isFinite(ms)) {\n throw new Error(\n `exportCapsule: 'since' is not a valid ISO-8601 timestamp: ${since}`,\n );\n }\n // Reject calendar overflow: `Date.parse(\"2026-02-31\")` returns a finite ms\n // for March 3 because the JS Date constructor silently normalizes invalid\n // calendar values. Round-trip through `Date` and compare the year/month/day\n // components against the input prefix to catch this. Rule 51: silent\n // coercion of an exact time boundary is a Rule 51 violation that breaks\n // incremental exports.\n assertCalendarRoundTrip(since, ms);\n return ms;\n}\n\nexport function isValidCapsuleSince(since: string): boolean {\n try {\n parseSince(since);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Verify that parsing {@link since} did not silently normalize an invalid\n * calendar date (e.g. `2026-02-31` → `2026-03-03`). We extract the\n * year/month/day from the input string (regex-validated above) and compare\n * against the parsed Date's UTC components. Both date-only forms and forms\n * with an explicit Z/offset are normalized to UTC by `Date.parse`; for the\n * non-Z case where the offset shifts the calendar day across midnight, we\n * re-derive the input's intended UTC instant by accounting for the offset\n * before the comparison.\n */\nfunction assertCalendarRoundTrip(since: string, ms: number): void {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(since);\n if (!m) return;\n const wantY = Number(m[1]);\n const wantMo = Number(m[2]);\n const wantD = Number(m[3]);\n\n // For inputs with an explicit non-zero offset, compare against the\n // wall-clock components of that offset instead of UTC. Date.parse maps to\n // UTC, so 2026-02-31T00:00:00-05:00 and 2026-02-31T00:00:00Z both fail the\n // calendar check; the wall-clock comparison via `m[1..3]` is still the\n // right reference because the input's stated calendar day must exist.\n const offsetMatch = /([+-])(\\d{2}):?(\\d{2})$/.exec(since);\n let displayMs = ms;\n if (offsetMatch) {\n const sign = offsetMatch[1] === \"-\" ? -1 : 1;\n const offsetMin = sign * (Number(offsetMatch[2]) * 60 + Number(offsetMatch[3]));\n displayMs = ms + offsetMin * 60_000;\n }\n const dd = new Date(displayMs);\n const gotY = dd.getUTCFullYear();\n const gotMo = dd.getUTCMonth() + 1;\n const gotD = dd.getUTCDate();\n if (gotY !== wantY || gotMo !== wantMo || gotD !== wantD) {\n throw new Error(\n `exportCapsule: 'since' is not a valid ISO-8601 timestamp: ${since}`,\n );\n }\n}\n\nfunction normalizeIncludeKinds(\n kinds: readonly string[] | undefined,\n): ReadonlySet<string> | null {\n if (kinds === undefined) return null;\n // Empty array is treated as \"include nothing\" rather than \"include all\"\n // so callers cannot accidentally widen the filter by passing []. This\n // mirrors PR-1/6 Rule 51: reject ambiguous input — but here we model it\n // as \"explicit empty allow-list\" rather than throwing, because empty\n // capsules ARE valid (see acceptance criteria).\n const set = new Set<string>();\n for (const raw of kinds) {\n if (typeof raw !== \"string\" || raw.trim() === \"\") {\n throw new Error(\"exportCapsule: 'includeKinds' entries must be non-empty strings\");\n }\n if (raw.includes(\"/\") || raw.includes(\"\\\\\")) {\n throw new Error(\n `exportCapsule: 'includeKinds' entries must be top-level segment names, got: ${raw}`,\n );\n }\n set.add(raw);\n }\n return set;\n}\n\nfunction normalizePeerIds(\n peerIds: readonly string[] | undefined,\n): ReadonlySet<string> | null {\n if (peerIds === undefined) return null;\n const set = new Set<string>();\n for (const raw of peerIds) {\n if (typeof raw !== \"string\" || raw.trim() === \"\") {\n throw new Error(\"exportCapsule: 'peerIds' entries must be non-empty strings\");\n }\n if (raw.includes(\"/\") || raw.includes(\"\\\\\") || raw === \".\" || raw === \"..\") {\n throw new Error(\n `exportCapsule: 'peerIds' entries must be plain segment names, got: ${raw}`,\n );\n }\n set.add(raw);\n }\n return set;\n}\n\nasync function assertIsDirectory(absPath: string): Promise<void> {\n // Mirror gotcha #24: existsSync returns true for files. The export root\n // MUST be a directory or the walk silently succeeds with zero entries.\n const st = await stat(absPath).catch(() => null);\n if (!st || !st.isDirectory()) {\n throw new Error(\n `exportCapsule: 'root' must be an existing directory: ${absPath}`,\n );\n }\n}\n\nfunction shouldInclude(\n relPosix: string,\n includeKinds: ReadonlySet<string> | null,\n peerFilter: ReadonlySet<string> | null,\n outDirRelPosix: string | null,\n transcriptsOverride = false,\n): boolean {\n const parts = relPosix.split(\"/\");\n if (parts.some((p) => DEFAULT_EXCLUDE_DIRS.has(p))) return false;\n\n // Exclude the output directory subtree. Without this, re-running against\n // the same root packages prior `.capsule.json.gz` archives and sidecar\n // manifests as records, causing bundle bloat and leaking stale exports.\n // `outDir === root` is rejected at the entrypoint (`exportCapsule`), so\n // {@link computeOutDirRel} never returns `\".\"` for the in-tree case here.\n if (outDirRelPosix !== null) {\n if (relPosix === outDirRelPosix) return false;\n if (relPosix.startsWith(`${outDirRelPosix}/`)) return false;\n }\n\n const top = parts[0];\n\n // Transcripts are opt-in: excluded unless caller explicitly listed them\n // in includeKinds OR passed `includeTranscripts: true`. The override flag\n // avoids the footgun of having the CLI build a hard-coded kinds list that\n // inadvertently drops valid memory dirs like `peers/` or `forks/`. (Cursor / #747)\n if (\n top === TRANSCRIPTS_DIR &&\n !transcriptsOverride &&\n (includeKinds === null || !includeKinds.has(TRANSCRIPTS_DIR))\n ) {\n return false;\n }\n\n if (includeKinds !== null) {\n // includeKinds restricts to whitelisted top-level segments. Files at\n // the repo root (no top-level dir) are excluded under an explicit\n // allow-list because they are not categorized.\n if (parts.length < 2) return false;\n if (!includeKinds.has(top)) return false;\n }\n\n if (top === PEERS_DIR && peerFilter !== null) {\n if (peerFilter.size === 0) return false;\n if (parts.length < 2) return false;\n if (!peerFilter.has(parts[1])) return false;\n }\n\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// Capsule-block defaults\n// ---------------------------------------------------------------------------\n\n/**\n * Build a {@link CapsuleBlock} for the manifest. PR 2/6 ships a minimal\n * snapshot: tier-weights and `directAnswerEnabled` default to zod-passing\n * placeholders so the bundle parses cleanly. PRs 3/6+ will wire real\n * retrieval-policy and identity-anchor snapshots into the override path.\n *\n * Defaults (chosen to be safe + least-surprising):\n * - `version` — `0.1.0` (capsule authors override per release).\n * - `schemaVersion` — `taxonomy-v1` until the taxonomy registry stabilizes.\n * - `parentCapsule` — `null` (explicit \"no parent\" sentinel).\n * - `description` — empty string. Capsule authors override.\n * - `retrievalPolicy` — empty `tierWeights` map + `directAnswerEnabled: false`.\n * Empty weights mean \"no overrides\"; importers fall back to their local\n * policy. `false` is the least-privileged default per Rule 48.\n * - `includes` — all flags `false` until later PRs wire the\n * sub-bundles in.\n */\nfunction buildCapsuleBlock(\n name: string,\n override: Partial<Omit<CapsuleBlock, \"id\">> | undefined,\n): CapsuleBlock {\n // `parent` (structured, PR 4/6) and `parentCapsule` (legacy string) carry\n // overlapping information. The schema documents the invariant: when\n // `parent` is non-null, `parentCapsule` SHOULD equal `parent.capsuleId`.\n // We derive the legacy field from the structured field whenever the\n // caller supplies `parent` but omits `parentCapsule`, so a single-source\n // override path produces a manifest that satisfies the documented\n // invariant for legacy V2 readers (Cursor medium #751 round 3).\n // An explicit `parentCapsule` override still wins — including an explicit\n // `null` — so callers can intentionally diverge from the structured field\n // for migration scenarios.\n const parent = override?.parent ?? null;\n const parentCapsule =\n override && Object.prototype.hasOwnProperty.call(override, \"parentCapsule\")\n ? (override.parentCapsule ?? null)\n : (parent?.capsuleId ?? null);\n\n const merged: CapsuleBlock = {\n id: name,\n version: override?.version ?? \"0.1.0\",\n schemaVersion: override?.schemaVersion ?? \"taxonomy-v1\",\n parentCapsule,\n parent,\n description: override?.description ?? \"\",\n retrievalPolicy: override?.retrievalPolicy ?? {\n tierWeights: {},\n directAnswerEnabled: false,\n },\n includes: override?.includes ?? {\n taxonomy: false,\n identityAnchors: false,\n peerProfiles: false,\n procedural: false,\n },\n };\n // Re-parse to surface invalid overrides with the same zod errors a caller\n // would get when constructing a CapsuleBlock by hand.\n return CapsuleBlockSchema.parse(merged);\n}\n"],"mappings":"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","names":[]}
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  SharedFeedbackEntrySchema,
3
3
  resolveSharedContextDir
4
- } from "./chunk-U4SCL7B7.js";
4
+ } from "./chunk-DRD2Q7HQ.js";
5
5
  import {
6
6
  StorageManager
7
- } from "./chunk-VBJ7V5SK.js";
7
+ } from "./chunk-UIPDNLXA.js";
8
8
  import {
9
9
  parseContinuityImprovementLoops
10
10
  } from "./chunk-QSVPYQPG.js";
@@ -1259,4 +1259,4 @@ export {
1259
1259
  defaultTierMigrationCycleBudget,
1260
1260
  CompoundingEngine
1261
1261
  };
1262
- //# sourceMappingURL=chunk-A6KTB5R6.js.map
1262
+ //# sourceMappingURL=chunk-IQ3OI2RR.js.map