@remnic/core 1.1.11 → 1.1.13

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 (1462) hide show
  1. package/README.md +3 -3
  2. package/dist/access-cli.d.ts +2 -1
  3. package/dist/access-cli.js +293 -104
  4. package/dist/access-cli.js.map +1 -1
  5. package/dist/access-http.d.ts +31 -62
  6. package/dist/access-http.js +53 -35
  7. package/dist/access-mcp.d.ts +31 -8
  8. package/dist/access-mcp.js +45 -34
  9. package/dist/access-schema.d.ts +197 -14
  10. package/dist/access-schema.js +16 -5
  11. package/dist/access-service-DcCDmNYC.d.ts +1542 -0
  12. package/dist/access-service.d.ts +30 -9
  13. package/dist/access-service.js +42 -32
  14. package/dist/action-confidence.d.ts +83 -0
  15. package/dist/action-confidence.js +22 -0
  16. package/dist/active-memory-bridge.d.ts +1 -1
  17. package/dist/active-memory-bridge.js +2 -2
  18. package/dist/active-recall.d.ts +1 -1
  19. package/dist/active-recall.js +11 -3
  20. package/dist/active-recall.js.map +1 -1
  21. package/dist/adapters/claude-code.d.ts +24 -0
  22. package/dist/adapters/claude-code.js +9 -0
  23. package/dist/adapters/codex.d.ts +25 -0
  24. package/dist/adapters/codex.js +9 -0
  25. package/dist/adapters/hermes.d.ts +35 -0
  26. package/dist/adapters/hermes.js +9 -0
  27. package/dist/adapters/index.d.ts +6 -0
  28. package/dist/adapters/index.js +26 -0
  29. package/dist/adapters/registry.d.ts +20 -0
  30. package/dist/adapters/registry.js +13 -0
  31. package/dist/adapters/replit.d.ts +28 -0
  32. package/dist/adapters/replit.js +9 -0
  33. package/dist/adapters/types.d.ts +43 -0
  34. package/dist/adapters/types.js +8 -0
  35. package/dist/behavior-learner.d.ts +1 -1
  36. package/dist/behavior-signals.d.ts +1 -1
  37. package/dist/bootstrap.d.ts +23 -6
  38. package/dist/boxes.d.ts +7 -0
  39. package/dist/boxes.js +1 -1
  40. package/dist/briefing.d.ts +5 -3
  41. package/dist/briefing.js +10 -7
  42. package/dist/buffer-surprise-report.d.ts +1 -1
  43. package/dist/buffer-surprise-report.js +1 -1
  44. package/dist/buffer.d.ts +18 -4
  45. package/dist/buffer.js +1 -1
  46. package/dist/calibration.d.ts +1 -1
  47. package/dist/calibration.js +6 -6
  48. package/dist/capsule-cli.d.ts +4 -4
  49. package/dist/capsule-cli.js +1 -1
  50. package/dist/capsule-crypto-5CYAGVC5.js +18 -0
  51. package/dist/capsule-merge-4MGKE7C5.js +189 -0
  52. package/dist/causal-behavior.d.ts +9 -29
  53. package/dist/causal-behavior.js +6 -3
  54. package/dist/causal-behavior.js.map +1 -1
  55. package/dist/causal-chain.js +3 -2
  56. package/dist/causal-consolidation.d.ts +2 -2
  57. package/dist/causal-consolidation.js +28 -17
  58. package/dist/causal-consolidation.js.map +1 -1
  59. package/dist/causal-retrieval.js +3 -3
  60. package/dist/causal-trajectory.js +1 -1
  61. package/dist/chunk-25MQ7IHJ.js +427 -0
  62. package/dist/chunk-25MQ7IHJ.js.map +1 -0
  63. package/dist/chunk-2F2W355T.js +256 -0
  64. package/dist/chunk-2F2W355T.js.map +1 -0
  65. package/dist/chunk-2KI4QFHU.js +228 -0
  66. package/dist/chunk-2KI4QFHU.js.map +1 -0
  67. package/dist/chunk-2PRQG7PV.js +86 -0
  68. package/dist/chunk-2PRQG7PV.js.map +1 -0
  69. package/dist/chunk-2QR3XXIC.js +2272 -0
  70. package/dist/chunk-2QR3XXIC.js.map +1 -0
  71. package/dist/chunk-2WWLHTZY.js +121 -0
  72. package/dist/chunk-326G7DJK.js +2185 -0
  73. package/dist/chunk-326G7DJK.js.map +1 -0
  74. package/dist/chunk-34DQE4KF.js +174 -0
  75. package/dist/chunk-34DQE4KF.js.map +1 -0
  76. package/dist/chunk-3APJ5EVB.js +601 -0
  77. package/dist/chunk-3APJ5EVB.js.map +1 -0
  78. package/dist/chunk-3HPAPHUK.js +51 -0
  79. package/dist/chunk-3HPAPHUK.js.map +1 -0
  80. package/dist/chunk-3JXBXXM2.js +69 -0
  81. package/dist/chunk-3JXBXXM2.js.map +1 -0
  82. package/dist/chunk-3KW65B36.js +681 -0
  83. package/dist/chunk-3KW65B36.js.map +1 -0
  84. package/dist/chunk-3UXOZBHV.js +20 -0
  85. package/dist/chunk-3UXOZBHV.js.map +1 -0
  86. package/dist/chunk-3VAL7ZL2.js +266 -0
  87. package/dist/chunk-3VAL7ZL2.js.map +1 -0
  88. package/dist/chunk-3Y4P7RXM.js +31 -0
  89. package/dist/chunk-3Y4P7RXM.js.map +1 -0
  90. package/dist/chunk-47VWKCAF.js +273 -0
  91. package/dist/chunk-47VWKCAF.js.map +1 -0
  92. package/dist/chunk-4CRG46BG.js +271 -0
  93. package/dist/chunk-4RA3C3EV.js +60 -0
  94. package/dist/chunk-4RA3C3EV.js.map +1 -0
  95. package/dist/chunk-5375UYTQ.js +914 -0
  96. package/dist/chunk-5375UYTQ.js.map +1 -0
  97. package/dist/chunk-56K5QLHX.js +506 -0
  98. package/dist/chunk-56K5QLHX.js.map +1 -0
  99. package/dist/chunk-5NXIJZFX.js +180 -0
  100. package/dist/chunk-5NXIJZFX.js.map +1 -0
  101. package/dist/chunk-5RGLBDQF.js +596 -0
  102. package/dist/chunk-5RGLBDQF.js.map +1 -0
  103. package/dist/chunk-5UZXUTVO.js +9 -0
  104. package/dist/chunk-5UZXUTVO.js.map +1 -0
  105. package/dist/chunk-65PG43EQ.js +105 -0
  106. package/dist/chunk-65PG43EQ.js.map +1 -0
  107. package/dist/chunk-66DHUKLO.js +57 -0
  108. package/dist/chunk-66DHUKLO.js.map +1 -0
  109. package/dist/chunk-6FC5EGNV.js +46 -0
  110. package/dist/chunk-6FC5EGNV.js.map +1 -0
  111. package/dist/chunk-6H2TESSP.js +62 -0
  112. package/dist/chunk-6H2TESSP.js.map +1 -0
  113. package/dist/chunk-6LVVDPJ4.js +32 -0
  114. package/dist/chunk-6LVVDPJ4.js.map +1 -0
  115. package/dist/chunk-6NKAQ74D.js +2237 -0
  116. package/dist/chunk-6NKAQ74D.js.map +1 -0
  117. package/dist/chunk-6RVI47ZR.js +159 -0
  118. package/dist/chunk-6RVI47ZR.js.map +1 -0
  119. package/dist/chunk-7AAT6G4Q.js +5117 -0
  120. package/dist/chunk-7AAT6G4Q.js.map +1 -0
  121. package/dist/chunk-7DTASS5T.js +29 -0
  122. package/dist/chunk-7DTASS5T.js.map +1 -0
  123. package/dist/chunk-7IASACLB.js +596 -0
  124. package/dist/chunk-7MNMYOFP.js +32 -0
  125. package/dist/chunk-7MNMYOFP.js.map +1 -0
  126. package/dist/chunk-7N4KAIGN.js +133 -0
  127. package/dist/chunk-7N4KAIGN.js.map +1 -0
  128. package/dist/chunk-7OZ53EXP.js +101 -0
  129. package/dist/chunk-7OZ53EXP.js.map +1 -0
  130. package/dist/chunk-7XYTQGCC.js +134 -0
  131. package/dist/chunk-7XYTQGCC.js.map +1 -0
  132. package/dist/chunk-A2XUIMJ3.js +341 -0
  133. package/dist/chunk-A2XUIMJ3.js.map +1 -0
  134. package/dist/chunk-AC5LO7IU.js +308 -0
  135. package/dist/chunk-AC5LO7IU.js.map +1 -0
  136. package/dist/chunk-AGZQD76C.js +201 -0
  137. package/dist/chunk-AGZQD76C.js.map +1 -0
  138. package/dist/chunk-AH2JUU6X.js +336 -0
  139. package/dist/chunk-AH2JUU6X.js.map +1 -0
  140. package/dist/chunk-APO3DCMU.js +361 -0
  141. package/dist/chunk-APO3DCMU.js.map +1 -0
  142. package/dist/chunk-BFBF3XEF.js +283 -0
  143. package/dist/chunk-BFBF3XEF.js.map +1 -0
  144. package/dist/chunk-BJ3KMYTB.js +1974 -0
  145. package/dist/chunk-BJ3KMYTB.js.map +1 -0
  146. package/dist/chunk-C5BCH4ZS.js +317 -0
  147. package/dist/chunk-C5BCH4ZS.js.map +1 -0
  148. package/dist/chunk-CHEL3SKB.js +6758 -0
  149. package/dist/chunk-CHEL3SKB.js.map +1 -0
  150. package/dist/chunk-CQZRLNMV.js +1491 -0
  151. package/dist/chunk-CQZRLNMV.js.map +1 -0
  152. package/dist/chunk-D46YSIYX.js +892 -0
  153. package/dist/chunk-D46YSIYX.js.map +1 -0
  154. package/dist/chunk-DB5A3NHS.js +906 -0
  155. package/dist/chunk-DB5A3NHS.js.map +1 -0
  156. package/dist/chunk-DINWEURR.js +648 -0
  157. package/dist/chunk-DINWEURR.js.map +1 -0
  158. package/dist/chunk-DK5LDEQM.js +530 -0
  159. package/dist/chunk-DK5LDEQM.js.map +1 -0
  160. package/dist/chunk-DOM4GKSW.js +34 -0
  161. package/dist/chunk-DOM4GKSW.js.map +1 -0
  162. package/dist/chunk-EDTHC6UD.js +1075 -0
  163. package/dist/chunk-EDTHC6UD.js.map +1 -0
  164. package/dist/chunk-EFJ3MQ4V.js +721 -0
  165. package/dist/chunk-EHRTFRWW.js +89 -0
  166. package/dist/chunk-EHRTFRWW.js.map +1 -0
  167. package/dist/chunk-FAJ7FZYM.js +11 -0
  168. package/dist/chunk-FAJ7FZYM.js.map +1 -0
  169. package/dist/chunk-FBYESMQ2.js +570 -0
  170. package/dist/chunk-FBYESMQ2.js.map +1 -0
  171. package/dist/chunk-FDU6HUUL.js +147 -0
  172. package/dist/chunk-FF4KLI5W.js +99 -0
  173. package/dist/chunk-FF4KLI5W.js.map +1 -0
  174. package/dist/chunk-FIT6DMX6.js +310 -0
  175. package/dist/chunk-FIT6DMX6.js.map +1 -0
  176. package/dist/chunk-FJ43PRLT.js +272 -0
  177. package/dist/chunk-FJ43PRLT.js.map +1 -0
  178. package/dist/chunk-FKFMOY3N.js +32 -0
  179. package/dist/chunk-FKFMOY3N.js.map +1 -0
  180. package/dist/chunk-FLTNHQK6.js +262 -0
  181. package/dist/chunk-FLTNHQK6.js.map +1 -0
  182. package/dist/chunk-GA454ALV.js +12436 -0
  183. package/dist/chunk-GA454ALV.js.map +1 -0
  184. package/dist/chunk-GGKRUQOO.js +228 -0
  185. package/dist/chunk-GIF42EW3.js +63 -0
  186. package/dist/chunk-GIF42EW3.js.map +1 -0
  187. package/dist/chunk-GL6I6MEQ.js +647 -0
  188. package/dist/chunk-H3ME6L6D.js +709 -0
  189. package/dist/chunk-H3ME6L6D.js.map +1 -0
  190. package/dist/chunk-HHLLAQGZ.js +1 -0
  191. package/dist/chunk-HXXBL2KD.js +2040 -0
  192. package/dist/chunk-I5V2VDIW.js +219 -0
  193. package/dist/chunk-I5V2VDIW.js.map +1 -0
  194. package/dist/chunk-I6K5FBRQ.js +35 -0
  195. package/dist/chunk-I6K5FBRQ.js.map +1 -0
  196. package/dist/chunk-ICRIXAP2.js +121 -0
  197. package/dist/chunk-ICRIXAP2.js.map +1 -0
  198. package/dist/chunk-J4EB7DNW.js +11 -0
  199. package/dist/chunk-J4EB7DNW.js.map +1 -0
  200. package/dist/chunk-JLFA7DQG.js +62 -0
  201. package/dist/chunk-JLFA7DQG.js.map +1 -0
  202. package/dist/chunk-KJTKLXTH.js +9 -0
  203. package/dist/chunk-KJTKLXTH.js.map +1 -0
  204. package/dist/chunk-KLAO5DGL.js +917 -0
  205. package/dist/chunk-KLAO5DGL.js.map +1 -0
  206. package/dist/chunk-KNKUID7G.js +183 -0
  207. package/dist/chunk-KOSORCJG.js +624 -0
  208. package/dist/chunk-KOSORCJG.js.map +1 -0
  209. package/dist/chunk-KUJVMMZQ.js +1262 -0
  210. package/dist/chunk-KUJVMMZQ.js.map +1 -0
  211. package/dist/chunk-LCR46JY5.js +123 -0
  212. package/dist/chunk-LCR46JY5.js.map +1 -0
  213. package/dist/chunk-LLQ2LLWF.js +148 -0
  214. package/dist/chunk-LLQ2LLWF.js.map +1 -0
  215. package/dist/chunk-LPMVBPA3.js +236 -0
  216. package/dist/chunk-LT3NLYSI.js +50 -0
  217. package/dist/chunk-LT3NLYSI.js.map +1 -0
  218. package/dist/chunk-LUDTDZLK.js +287 -0
  219. package/dist/chunk-LUDTDZLK.js.map +1 -0
  220. package/dist/chunk-M23FSH32.js +3963 -0
  221. package/dist/chunk-M23FSH32.js.map +1 -0
  222. package/dist/chunk-MC26UJIM.js +118 -0
  223. package/dist/chunk-ME6ESPZU.js +119 -0
  224. package/dist/chunk-ME6ESPZU.js.map +1 -0
  225. package/dist/chunk-MGKYQQYF.js +272 -0
  226. package/dist/chunk-MGKYQQYF.js.map +1 -0
  227. package/dist/chunk-MJFNCJXV.js +66 -0
  228. package/dist/chunk-MJFNCJXV.js.map +1 -0
  229. package/dist/chunk-MSWG7JI6.js +237 -0
  230. package/dist/chunk-MSWG7JI6.js.map +1 -0
  231. package/dist/chunk-MT25YHYH.js +141 -0
  232. package/dist/chunk-MT25YHYH.js.map +1 -0
  233. package/dist/chunk-MT4HVDUZ.js +53 -0
  234. package/dist/chunk-MY6TPVXW.js +219 -0
  235. package/dist/chunk-N2D6GXBM.js +267 -0
  236. package/dist/chunk-N2D6GXBM.js.map +1 -0
  237. package/dist/chunk-NJ3MJQZX.js +46 -0
  238. package/dist/chunk-NJ3MJQZX.js.map +1 -0
  239. package/dist/chunk-NMZY542O.js +335 -0
  240. package/dist/chunk-NMZY542O.js.map +1 -0
  241. package/dist/chunk-NNVTUXEB.js +23 -0
  242. package/dist/chunk-NZL6GGQE.js +375 -0
  243. package/dist/chunk-NZL6GGQE.js.map +1 -0
  244. package/dist/chunk-OAZ5MFUB.js +4124 -0
  245. package/dist/chunk-OAZ5MFUB.js.map +1 -0
  246. package/dist/chunk-OIGNEXKZ.js +237 -0
  247. package/dist/chunk-OIGNEXKZ.js.map +1 -0
  248. package/dist/chunk-OZKZ2TRP.js +3729 -0
  249. package/dist/chunk-OZKZ2TRP.js.map +1 -0
  250. package/dist/chunk-P4NEIHUT.js +108 -0
  251. package/dist/chunk-P7FMDTKL.js +103 -0
  252. package/dist/chunk-P7FMDTKL.js.map +1 -0
  253. package/dist/chunk-PD6O7AXF.js +110 -0
  254. package/dist/chunk-PD6O7AXF.js.map +1 -0
  255. package/dist/chunk-PHK3HARR.js +32 -0
  256. package/dist/chunk-PHK3HARR.js.map +1 -0
  257. package/dist/chunk-PIRJPV5T.js +98 -0
  258. package/dist/chunk-PIRJPV5T.js.map +1 -0
  259. package/dist/chunk-PK7H5L6Y.js +159 -0
  260. package/dist/chunk-PK7H5L6Y.js.map +1 -0
  261. package/dist/chunk-PR5FBTFU.js +233 -0
  262. package/dist/chunk-PR5FBTFU.js.map +1 -0
  263. package/dist/chunk-PU63GXWS.js +174 -0
  264. package/dist/chunk-PU63GXWS.js.map +1 -0
  265. package/dist/chunk-PYPOFEMK.js +294 -0
  266. package/dist/chunk-PYPOFEMK.js.map +1 -0
  267. package/dist/chunk-PZIAX57I.js +124 -0
  268. package/dist/chunk-PZIAX57I.js.map +1 -0
  269. package/dist/chunk-Q7P4WJDP.js +26 -0
  270. package/dist/chunk-Q7P4WJDP.js.map +1 -0
  271. package/dist/chunk-QDZ2RLEC.js +908 -0
  272. package/dist/chunk-QDZ2RLEC.js.map +1 -0
  273. package/dist/chunk-QQUAB63I.js +63 -0
  274. package/dist/chunk-QQUAB63I.js.map +1 -0
  275. package/dist/chunk-QRNI5JBH.js +18 -0
  276. package/dist/chunk-RHY3HH7P.js +601 -0
  277. package/dist/chunk-RHY3HH7P.js.map +1 -0
  278. package/dist/chunk-RK6F44Y6.js +84 -0
  279. package/dist/chunk-RK6F44Y6.js.map +1 -0
  280. package/dist/chunk-RRF5UOBJ.js +91 -0
  281. package/dist/chunk-RXDLTSWT.js +124 -0
  282. package/dist/chunk-RXDLTSWT.js.map +1 -0
  283. package/dist/chunk-RYED3SPJ.js +42 -0
  284. package/dist/chunk-RYED3SPJ.js.map +1 -0
  285. package/dist/chunk-S7KDBTWT.js +106 -0
  286. package/dist/chunk-S7KDBTWT.js.map +1 -0
  287. package/dist/chunk-SEDEKFYQ.js +1 -0
  288. package/dist/chunk-SOAU2OE2.js +125 -0
  289. package/dist/chunk-SOAU2OE2.js.map +1 -0
  290. package/dist/chunk-TECVW3JP.js +36 -0
  291. package/dist/chunk-TECVW3JP.js.map +1 -0
  292. package/dist/chunk-TFO23QT4.js +88 -0
  293. package/dist/chunk-TFO23QT4.js.map +1 -0
  294. package/dist/chunk-TK4UEOSK.js +76 -0
  295. package/dist/chunk-TK4UEOSK.js.map +1 -0
  296. package/dist/chunk-TKWGAOLV.js +122 -0
  297. package/dist/chunk-TKWGAOLV.js.map +1 -0
  298. package/dist/chunk-TMM4S4IJ.js +597 -0
  299. package/dist/chunk-TMM4S4IJ.js.map +1 -0
  300. package/dist/chunk-TMQLARTH.js +188 -0
  301. package/dist/chunk-TMQLARTH.js.map +1 -0
  302. package/dist/chunk-TPDBFYEG.js +130 -0
  303. package/dist/chunk-TPDBFYEG.js.map +1 -0
  304. package/dist/chunk-TPMQ3G6Z.js +145 -0
  305. package/dist/chunk-TPMQ3G6Z.js.map +1 -0
  306. package/dist/chunk-TZOLIGIG.js +61 -0
  307. package/dist/chunk-TZOLIGIG.js.map +1 -0
  308. package/dist/chunk-U3PN77QT.js +113 -0
  309. package/dist/chunk-U3WSW6PZ.js +277 -0
  310. package/dist/chunk-U4SCL7B7.js +640 -0
  311. package/dist/chunk-U4SCL7B7.js.map +1 -0
  312. package/dist/chunk-UWK5OXUJ.js +156 -0
  313. package/dist/chunk-UWK5OXUJ.js.map +1 -0
  314. package/dist/chunk-UWVJF25J.js +74 -0
  315. package/dist/chunk-UXHQAFNA.js +1317 -0
  316. package/dist/chunk-UXHQAFNA.js.map +1 -0
  317. package/dist/chunk-V5OCT34X.js +1 -0
  318. package/dist/chunk-V5OCT34X.js.map +1 -0
  319. package/dist/chunk-VLXA6PI2.js +304 -0
  320. package/dist/chunk-VLXA6PI2.js.map +1 -0
  321. package/dist/chunk-VNO6ZJ35.js +500 -0
  322. package/dist/chunk-VNO6ZJ35.js.map +1 -0
  323. package/dist/chunk-VW676BEI.js +827 -0
  324. package/dist/chunk-VW676BEI.js.map +1 -0
  325. package/dist/chunk-VWT3F4IV.js +2161 -0
  326. package/dist/chunk-VWT3F4IV.js.map +1 -0
  327. package/dist/chunk-W3LR522O.js +2296 -0
  328. package/dist/chunk-W3LR522O.js.map +1 -0
  329. package/dist/chunk-W4L6CZKA.js +96 -0
  330. package/dist/chunk-W4L6CZKA.js.map +1 -0
  331. package/dist/chunk-W4RVMTHR.js +372 -0
  332. package/dist/chunk-W4RVMTHR.js.map +1 -0
  333. package/dist/chunk-WEHSQBFR.js +188 -0
  334. package/dist/chunk-WEHSQBFR.js.map +1 -0
  335. package/dist/chunk-WELDCG6C.js +380 -0
  336. package/dist/chunk-WELDCG6C.js.map +1 -0
  337. package/dist/chunk-WZYKANL3.js +2800 -0
  338. package/dist/chunk-WZYKANL3.js.map +1 -0
  339. package/dist/chunk-XIG5PDM7.js +48 -0
  340. package/dist/chunk-XJNBEDFE.js +193 -0
  341. package/dist/chunk-XJNBEDFE.js.map +1 -0
  342. package/dist/chunk-XVVIG67A.js +291 -0
  343. package/dist/chunk-XVVIG67A.js.map +1 -0
  344. package/dist/chunk-XVZ7B3HG.js +135 -0
  345. package/dist/chunk-YBPYIAA5.js +73 -0
  346. package/dist/chunk-YBPYIAA5.js.map +1 -0
  347. package/dist/chunk-Z734BLO3.js +21 -0
  348. package/dist/chunk-Z734BLO3.js.map +1 -0
  349. package/dist/chunk-ZKSK55RC.js +269 -0
  350. package/dist/chunk-ZKSK55RC.js.map +1 -0
  351. package/dist/chunk-ZTFCYYEZ.js +69 -0
  352. package/dist/chunk-ZTFCYYEZ.js.map +1 -0
  353. package/dist/chunk-ZY2MNJR6.js +329 -0
  354. package/dist/chunk-ZY2MNJR6.js.map +1 -0
  355. package/dist/cli-D3VpkVwB.d.ts +1136 -0
  356. package/dist/cli.d.ts +42 -10
  357. package/dist/cli.js +121 -58
  358. package/dist/codex-cli-fallback.d.ts +1 -0
  359. package/dist/codex-cli-fallback.js +1 -1
  360. package/dist/commitment-ledger.js +1 -1
  361. package/dist/compat/checks.d.ts +5 -0
  362. package/dist/compat/checks.js +11 -0
  363. package/dist/compat/checks.js.map +1 -0
  364. package/dist/compat/types.d.ts +30 -0
  365. package/dist/compat/types.js +1 -0
  366. package/dist/compat/types.js.map +1 -0
  367. package/dist/compounding/engine.d.ts +221 -0
  368. package/dist/compounding/engine.js +32 -0
  369. package/dist/compounding/engine.js.map +1 -0
  370. package/dist/compounding/preference-consolidator.d.ts +92 -0
  371. package/dist/compounding/preference-consolidator.js +553 -0
  372. package/dist/compounding/preference-consolidator.js.map +1 -0
  373. package/dist/compression-optimizer.d.ts +1 -1
  374. package/dist/config.d.ts +5 -3
  375. package/dist/config.js +9 -4
  376. package/dist/conflict-policy-DyJ2wd-h.d.ts +4 -0
  377. package/dist/connectors/codex-materialize-runner.d.ts +64 -0
  378. package/dist/connectors/codex-materialize-runner.js +33 -0
  379. package/dist/connectors/codex-materialize-runner.js.map +1 -0
  380. package/dist/connectors/codex-materialize.d.ts +195 -0
  381. package/dist/connectors/codex-materialize.js +38 -0
  382. package/dist/connectors/codex-materialize.js.map +1 -0
  383. package/dist/connectors/index.d.ts +444 -0
  384. package/dist/connectors/index.js +115 -0
  385. package/dist/connectors/index.js.map +1 -0
  386. package/dist/connectors-cli-CwbyjGR7.d.ts +257 -0
  387. package/dist/connectors-cli.d.ts +1 -1
  388. package/dist/consolidation-provenance-check.d.ts +4 -2
  389. package/dist/consolidation-undo.d.ts +4 -2
  390. package/dist/contradiction/index.d.ts +258 -0
  391. package/dist/contradiction/index.js +43 -0
  392. package/dist/contradiction/index.js.map +1 -0
  393. package/dist/contradiction-review-ATP4S6IC.js +30 -0
  394. package/dist/contradiction-review-ATP4S6IC.js.map +1 -0
  395. package/dist/contradiction-scan-5A4IDZV5.js +13 -0
  396. package/dist/contradiction-scan-5A4IDZV5.js.map +1 -0
  397. package/dist/conversation-index/backend.d.ts +97 -0
  398. package/dist/conversation-index/backend.js +13 -0
  399. package/dist/conversation-index/backend.js.map +1 -0
  400. package/dist/conversation-index/chunker.d.ts +16 -0
  401. package/dist/conversation-index/chunker.js +8 -0
  402. package/dist/conversation-index/chunker.js.map +1 -0
  403. package/dist/conversation-index/cleanup.d.ts +11 -0
  404. package/dist/conversation-index/cleanup.js +9 -0
  405. package/dist/conversation-index/cleanup.js.map +1 -0
  406. package/dist/conversation-index/faiss-adapter.d.ts +6 -0
  407. package/dist/conversation-index/faiss-adapter.js +16 -0
  408. package/dist/conversation-index/faiss-adapter.js.map +1 -0
  409. package/dist/conversation-index/indexer.d.ts +23 -0
  410. package/dist/conversation-index/indexer.js +15 -0
  411. package/dist/conversation-index/indexer.js.map +1 -0
  412. package/dist/conversation-index/search.d.ts +6 -0
  413. package/dist/conversation-index/search.js +11 -0
  414. package/dist/conversation-index/search.js.map +1 -0
  415. package/dist/day-summary.d.ts +1 -1
  416. package/dist/delinearize.d.ts +1 -1
  417. package/dist/direct-answer-wiring.d.ts +1 -1
  418. package/dist/direct-answer-wiring.js +1 -1
  419. package/dist/direct-answer.d.ts +1 -1
  420. package/dist/embedding-fallback.d.ts +1 -1
  421. package/dist/embedding-fallback.js +2 -2
  422. package/dist/enrichment/index.d.ts +163 -0
  423. package/dist/enrichment/index.js +18 -0
  424. package/dist/enrichment/index.js.map +1 -0
  425. package/dist/entity-retrieval.d.ts +4 -2
  426. package/dist/entity-retrieval.js +9 -6
  427. package/dist/entity-schema.d.ts +1 -1
  428. package/dist/evals.js +1 -1
  429. package/dist/event-order-recall.d.ts +17 -0
  430. package/dist/event-order-recall.js +11 -0
  431. package/dist/event-order-recall.js.map +1 -0
  432. package/dist/evidence-pack.d.ts +3 -1
  433. package/dist/evidence-pack.js +5 -3
  434. package/dist/explicit-capture.d.ts +23 -6
  435. package/dist/explicit-capture.js +2 -2
  436. package/dist/explicit-cue-recall.d.ts +4 -1
  437. package/dist/explicit-cue-recall.js +4 -2
  438. package/dist/extraction-judge-telemetry.d.ts +1 -1
  439. package/dist/extraction-judge-training.d.ts +1 -1
  440. package/dist/extraction-judge-training.js +1 -1
  441. package/dist/extraction-judge.d.ts +1 -1
  442. package/dist/extraction.d.ts +1 -1
  443. package/dist/extraction.js +11 -10
  444. package/dist/faiss-adapter-CzPghc4C.d.ts +70 -0
  445. package/dist/fallback-llm.d.ts +4 -1
  446. package/dist/fallback-llm.js +6 -6
  447. package/dist/focused-list-recall.d.ts +17 -0
  448. package/dist/focused-list-recall.js +11 -0
  449. package/dist/focused-list-recall.js.map +1 -0
  450. package/dist/graph-edge-decay-5DI5GUNL.js +207 -0
  451. package/dist/identity-continuity.d.ts +1 -1
  452. package/dist/importance.d.ts +1 -1
  453. package/dist/index-DJ9QWMw-.d.ts +35 -0
  454. package/dist/index.d.ts +107 -715
  455. package/dist/index.js +657 -2611
  456. package/dist/index.js.map +1 -1
  457. package/dist/intent.d.ts +1 -1
  458. package/dist/intent.js +1 -1
  459. package/dist/lcm/archive.d.ts +89 -0
  460. package/dist/lcm/archive.js +12 -0
  461. package/dist/lcm/archive.js.map +1 -0
  462. package/dist/lcm/dag.d.ts +48 -0
  463. package/dist/lcm/dag.js +8 -0
  464. package/dist/lcm/dag.js.map +1 -0
  465. package/dist/lcm/engine.d.ts +116 -0
  466. package/dist/lcm/engine.js +20 -0
  467. package/dist/lcm/engine.js.map +1 -0
  468. package/dist/lcm/index.d.ts +12 -0
  469. package/dist/lcm/index.js +44 -0
  470. package/dist/lcm/index.js.map +1 -0
  471. package/dist/lcm/queue.d.ts +62 -0
  472. package/dist/lcm/queue.js +8 -0
  473. package/dist/lcm/queue.js.map +1 -0
  474. package/dist/lcm/recall.d.ts +20 -0
  475. package/dist/lcm/recall.js +8 -0
  476. package/dist/lcm/recall.js.map +1 -0
  477. package/dist/lcm/schema.d.ts +16 -0
  478. package/dist/lcm/schema.js +14 -0
  479. package/dist/lcm/schema.js.map +1 -0
  480. package/dist/lcm/summarizer.d.ts +38 -0
  481. package/dist/lcm/summarizer.js +12 -0
  482. package/dist/lcm/summarizer.js.map +1 -0
  483. package/dist/lcm/tools.d.ts +29 -0
  484. package/dist/lcm/tools.js +8 -0
  485. package/dist/lcm/tools.js.map +1 -0
  486. package/dist/lifecycle.d.ts +1 -1
  487. package/dist/live-connectors-runner.d.ts +1 -1
  488. package/dist/live-connectors-runner.js +5 -5
  489. package/dist/local-llm.d.ts +8 -4
  490. package/dist/local-llm.js +3 -3
  491. package/dist/maintenance/archive-observations.d.ts +18 -0
  492. package/dist/maintenance/archive-observations.js +8 -0
  493. package/dist/maintenance/archive-observations.js.map +1 -0
  494. package/dist/maintenance/backup-stamp.d.ts +3 -0
  495. package/dist/maintenance/backup-stamp.js +8 -0
  496. package/dist/maintenance/backup-stamp.js.map +1 -0
  497. package/dist/maintenance/memory-governance-cron.d.ts +85 -0
  498. package/dist/maintenance/memory-governance-cron.js +22 -0
  499. package/dist/maintenance/memory-governance-cron.js.map +1 -0
  500. package/dist/maintenance/memory-governance.d.ts +137 -0
  501. package/dist/maintenance/memory-governance.js +40 -0
  502. package/dist/maintenance/memory-governance.js.map +1 -0
  503. package/dist/maintenance/migrate-observations.d.ts +18 -0
  504. package/dist/maintenance/migrate-observations.js +9 -0
  505. package/dist/maintenance/migrate-observations.js.map +1 -0
  506. package/dist/maintenance/observation-ledger-utils.d.ts +10 -0
  507. package/dist/maintenance/observation-ledger-utils.js +10 -0
  508. package/dist/maintenance/observation-ledger-utils.js.map +1 -0
  509. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +15 -0
  510. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +28 -0
  511. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js.map +1 -0
  512. package/dist/maintenance/rebuild-memory-projection.d.ts +77 -0
  513. package/dist/maintenance/rebuild-memory-projection.js +35 -0
  514. package/dist/maintenance/rebuild-memory-projection.js.map +1 -0
  515. package/dist/maintenance/rebuild-observations.d.ts +17 -0
  516. package/dist/maintenance/rebuild-observations.js +9 -0
  517. package/dist/maintenance/rebuild-observations.js.map +1 -0
  518. package/dist/mcp-memory-inspector-app.d.ts +124 -0
  519. package/dist/mcp-memory-inspector-app.js +20 -0
  520. package/dist/mcp-memory-inspector-app.js.map +1 -0
  521. package/dist/memory-action-policy.d.ts +1 -1
  522. package/dist/memory-cache.d.ts +1 -1
  523. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  524. package/dist/memory-projection-store.d.ts +108 -3
  525. package/dist/memory-projection-store.js +2 -1
  526. package/dist/memory-provenance.d.ts +57 -0
  527. package/dist/memory-provenance.js +13 -0
  528. package/dist/memory-provenance.js.map +1 -0
  529. package/dist/memory-worth-outcomes.d.ts +4 -2
  530. package/dist/migrate/from-engram.d.ts +24 -0
  531. package/dist/migrate/from-engram.js +12 -0
  532. package/dist/migrate/from-engram.js.map +1 -0
  533. package/dist/models-json.d.ts +1 -1
  534. package/dist/namespaces/migrate.d.ts +50 -0
  535. package/dist/namespaces/migrate.js +50 -0
  536. package/dist/namespaces/migrate.js.map +1 -0
  537. package/dist/namespaces/principal.d.ts +17 -0
  538. package/dist/namespaces/principal.js +16 -0
  539. package/dist/namespaces/principal.js.map +1 -0
  540. package/dist/namespaces/search.d.ts +46 -0
  541. package/dist/namespaces/search.js +28 -0
  542. package/dist/namespaces/search.js.map +1 -0
  543. package/dist/namespaces/storage.d.ts +32 -0
  544. package/dist/namespaces/storage.js +28 -0
  545. package/dist/namespaces/storage.js.map +1 -0
  546. package/dist/native-knowledge.d.ts +1 -1
  547. package/dist/network/tailscale.d.ts +41 -0
  548. package/dist/network/tailscale.js +9 -0
  549. package/dist/network/tailscale.js.map +1 -0
  550. package/dist/network/webdav.d.ts +39 -0
  551. package/dist/network/webdav.js +10 -0
  552. package/dist/network/webdav.js.map +1 -0
  553. package/dist/objective-state-writers.d.ts +1 -1
  554. package/dist/objective-state-writers.js +2 -2
  555. package/dist/operator-toolkit.d.ts +4 -2
  556. package/dist/operator-toolkit.js +35 -17
  557. package/dist/opik-exporter.js +2 -2
  558. package/dist/opik-exporter.js.map +1 -1
  559. package/dist/orchestrator-DuWl9Hwx.d.ts +1244 -0
  560. package/dist/orchestrator.d.ts +24 -7
  561. package/dist/orchestrator.js +107 -65
  562. package/dist/path-MR5JPYOP.js +9 -0
  563. package/dist/path-MR5JPYOP.js.map +1 -0
  564. package/dist/patterns-cli.d.ts +1 -1
  565. package/dist/policy-runtime.d.ts +1 -1
  566. package/dist/qmd-recall-cache.d.ts +2 -2
  567. package/dist/qmd.d.ts +103 -4
  568. package/dist/qmd.js +23 -5
  569. package/dist/recall-disclosure-escalation.d.ts +1 -1
  570. package/dist/recall-explain-renderer.d.ts +3 -1
  571. package/dist/recall-explain-renderer.js +5 -3
  572. package/dist/recall-state.d.ts +1 -1
  573. package/dist/recall-tag-filter.d.ts +3 -1
  574. package/dist/recall-xray-cli.d.ts +3 -1
  575. package/dist/recall-xray-cli.js +6 -4
  576. package/dist/recall-xray-renderer.d.ts +3 -1
  577. package/dist/recall-xray-renderer.js +5 -3
  578. package/dist/recall-xray.d.ts +8 -1
  579. package/dist/recall-xray.js +4 -2
  580. package/dist/replay/normalizers/chatgpt.d.ts +6 -0
  581. package/dist/replay/normalizers/chatgpt.js +11 -0
  582. package/dist/replay/normalizers/chatgpt.js.map +1 -0
  583. package/dist/replay/normalizers/claude.d.ts +6 -0
  584. package/dist/replay/normalizers/claude.js +11 -0
  585. package/dist/replay/normalizers/claude.js.map +1 -0
  586. package/dist/replay/normalizers/openclaw.d.ts +6 -0
  587. package/dist/replay/normalizers/openclaw.js +11 -0
  588. package/dist/replay/normalizers/openclaw.js.map +1 -0
  589. package/dist/replay/normalizers/shared.d.ts +16 -0
  590. package/dist/replay/normalizers/shared.js +14 -0
  591. package/dist/replay/normalizers/shared.js.map +1 -0
  592. package/dist/replay/runner.d.ts +35 -0
  593. package/dist/replay/runner.js +16 -0
  594. package/dist/replay/runner.js.map +1 -0
  595. package/dist/replay/types.d.ts +57 -0
  596. package/dist/replay/types.js +19 -0
  597. package/dist/replay/types.js.map +1 -0
  598. package/dist/resolution-B7FNQSSP.js +12 -0
  599. package/dist/resolution-B7FNQSSP.js.map +1 -0
  600. package/dist/resolve-auth-token.d.ts +1 -1
  601. package/dist/resolve-provider-secret.js +2 -2
  602. package/dist/response-guidance-recall.d.ts +18 -0
  603. package/dist/response-guidance-recall.js +11 -0
  604. package/dist/response-guidance-recall.js.map +1 -0
  605. package/dist/resume-bundles.js +7 -5
  606. package/dist/retrieval-agents.d.ts +2 -2
  607. package/dist/retrieval-tiers.d.ts +1 -1
  608. package/dist/routing/engine.d.ts +35 -0
  609. package/dist/routing/engine.js +16 -0
  610. package/dist/routing/engine.js.map +1 -0
  611. package/dist/routing/store.d.ts +27 -0
  612. package/dist/routing/store.js +10 -0
  613. package/dist/routing/store.js.map +1 -0
  614. package/dist/runtime/better-sqlite.d.ts +8 -0
  615. package/dist/runtime/better-sqlite.js +10 -0
  616. package/dist/runtime/better-sqlite.js.map +1 -0
  617. package/dist/runtime/child-process.d.ts +32 -0
  618. package/dist/runtime/child-process.js +10 -0
  619. package/dist/runtime/child-process.js.map +1 -0
  620. package/dist/runtime/env.d.ts +5 -0
  621. package/dist/runtime/env.js +12 -0
  622. package/dist/runtime/env.js.map +1 -0
  623. package/dist/sdk-compat.js +1 -1
  624. package/dist/search/document-scanner.d.ts +22 -0
  625. package/dist/search/document-scanner.js +8 -0
  626. package/dist/search/document-scanner.js.map +1 -0
  627. package/dist/search/embed-helper.d.ts +35 -0
  628. package/dist/search/embed-helper.js +9 -0
  629. package/dist/search/embed-helper.js.map +1 -0
  630. package/dist/search/factory.d.ts +32 -0
  631. package/dist/search/factory.js +29 -0
  632. package/dist/search/factory.js.map +1 -0
  633. package/dist/search/index.d.ts +15 -0
  634. package/dist/search/index.js +50 -0
  635. package/dist/search/index.js.map +1 -0
  636. package/dist/search/lancedb-backend.d.ts +51 -0
  637. package/dist/search/lancedb-backend.js +10 -0
  638. package/dist/search/lancedb-backend.js.map +1 -0
  639. package/dist/search/meilisearch-backend.d.ts +48 -0
  640. package/dist/search/meilisearch-backend.js +10 -0
  641. package/dist/search/meilisearch-backend.js.map +1 -0
  642. package/dist/search/noop-backend.d.ts +26 -0
  643. package/dist/search/noop-backend.js +8 -0
  644. package/dist/search/noop-backend.js.map +1 -0
  645. package/dist/search/orama-backend.d.ts +53 -0
  646. package/dist/search/orama-backend.js +10 -0
  647. package/dist/search/orama-backend.js.map +1 -0
  648. package/dist/search/port.d.ts +61 -0
  649. package/dist/search/port.js +1 -0
  650. package/dist/search/port.js.map +1 -0
  651. package/dist/search/remote-backend.d.ts +39 -0
  652. package/dist/search/remote-backend.js +9 -0
  653. package/dist/search/remote-backend.js.map +1 -0
  654. package/dist/secure-store/index.d.ts +890 -0
  655. package/dist/secure-store/index.js +156 -0
  656. package/dist/secure-store/index.js.map +1 -0
  657. package/dist/semantic-VwGI14Ok.d.ts +69 -0
  658. package/dist/semantic-consolidation-4HkHWgeI.d.ts +180 -0
  659. package/dist/semantic-consolidation.d.ts +3 -3
  660. package/dist/semantic-consolidation.js +15 -8
  661. package/dist/semantic-rule-promotion.js +9 -6
  662. package/dist/semantic-rule-verifier.d.ts +1 -1
  663. package/dist/semantic-rule-verifier.js +10 -7
  664. package/dist/session-observer-bands.d.ts +1 -1
  665. package/dist/session-observer-state.d.ts +1 -1
  666. package/dist/shared-context/manager.d.ts +131 -0
  667. package/dist/shared-context/manager.js +15 -0
  668. package/dist/shared-context/manager.js.map +1 -0
  669. package/dist/signal.d.ts +1 -1
  670. package/dist/skills-registry.js +13 -1
  671. package/dist/skills-registry.js.map +1 -1
  672. package/dist/state-store-VZU2IA53.js +16 -0
  673. package/dist/state-store-VZU2IA53.js.map +1 -0
  674. package/dist/storage-paths.d.ts +9 -0
  675. package/dist/storage-paths.js +20 -0
  676. package/dist/storage-paths.js.map +1 -0
  677. package/dist/storage.d.ts +6 -2
  678. package/dist/storage.js +8 -5
  679. package/dist/summarizer.d.ts +6 -1
  680. package/dist/summarizer.js +11 -10
  681. package/dist/summary-snapshot.d.ts +1 -1
  682. package/dist/summary-snapshot.js +2 -1
  683. package/dist/surfaces/dreams.d.ts +16 -0
  684. package/dist/surfaces/dreams.js +282 -0
  685. package/dist/surfaces/dreams.js.map +1 -0
  686. package/dist/surfaces/heartbeat.d.ts +17 -0
  687. package/dist/surfaces/heartbeat.js +265 -0
  688. package/dist/surfaces/heartbeat.js.map +1 -0
  689. package/dist/targeted-fact-recall.d.ts +17 -0
  690. package/dist/targeted-fact-recall.js +11 -0
  691. package/dist/targeted-fact-recall.js.map +1 -0
  692. package/dist/telemetry-transcript.d.ts +7 -0
  693. package/dist/telemetry-transcript.js +16 -0
  694. package/dist/telemetry-transcript.js.map +1 -0
  695. package/dist/temporal-supersession.d.ts +4 -2
  696. package/dist/temporal-supersession.js +2 -1
  697. package/dist/temporal-validity.d.ts +1 -1
  698. package/dist/threading.d.ts +6 -1
  699. package/dist/threading.js +2 -1
  700. package/dist/tier-migration.d.ts +5 -3
  701. package/dist/tier-routing.d.ts +1 -1
  702. package/dist/tokens.js +2 -2
  703. package/dist/topics.d.ts +1 -1
  704. package/dist/transcript.d.ts +16 -2
  705. package/dist/transcript.js +2 -1
  706. package/dist/transfer/autodetect.d.ts +4 -0
  707. package/dist/transfer/autodetect.js +15 -0
  708. package/dist/transfer/autodetect.js.map +1 -0
  709. package/dist/transfer/backup.d.ts +21 -0
  710. package/dist/transfer/backup.js +17 -0
  711. package/dist/transfer/backup.js.map +1 -0
  712. package/dist/transfer/capsule-export.d.ts +113 -0
  713. package/dist/transfer/capsule-export.js +19 -0
  714. package/dist/transfer/capsule-export.js.map +1 -0
  715. package/dist/transfer/capsule-import.d.ts +124 -0
  716. package/dist/transfer/capsule-import.js +16 -0
  717. package/dist/transfer/capsule-import.js.map +1 -0
  718. package/dist/transfer/constants.d.ts +13 -0
  719. package/dist/transfer/constants.js +12 -0
  720. package/dist/transfer/constants.js.map +1 -0
  721. package/dist/transfer/export-json.d.ts +11 -0
  722. package/dist/transfer/export-json.js +11 -0
  723. package/dist/transfer/export-json.js.map +1 -0
  724. package/dist/transfer/export-md.d.ts +10 -0
  725. package/dist/transfer/export-md.js +13 -0
  726. package/dist/transfer/export-md.js.map +1 -0
  727. package/dist/transfer/export-sqlite.d.ts +9 -0
  728. package/dist/transfer/export-sqlite.js +12 -0
  729. package/dist/transfer/export-sqlite.js.map +1 -0
  730. package/dist/transfer/fs-utils.d.ts +61 -0
  731. package/dist/transfer/fs-utils.js +40 -0
  732. package/dist/transfer/fs-utils.js.map +1 -0
  733. package/dist/transfer/import-json.d.ts +16 -0
  734. package/dist/transfer/import-json.js +13 -0
  735. package/dist/transfer/import-json.js.map +1 -0
  736. package/dist/transfer/import-md.d.ts +14 -0
  737. package/dist/transfer/import-md.js +11 -0
  738. package/dist/transfer/import-md.js.map +1 -0
  739. package/dist/transfer/import-sqlite.d.ts +14 -0
  740. package/dist/transfer/import-sqlite.js +12 -0
  741. package/dist/transfer/import-sqlite.js.map +1 -0
  742. package/dist/transfer/sqlite-schema.d.ts +4 -0
  743. package/dist/transfer/sqlite-schema.js +10 -0
  744. package/dist/transfer/sqlite-schema.js.map +1 -0
  745. package/dist/transfer/types.d.ts +916 -0
  746. package/dist/transfer/types.js +30 -0
  747. package/dist/transfer/types.js.map +1 -0
  748. package/dist/trust-zones.d.ts +3 -2
  749. package/dist/trust-zones.js +1 -1
  750. package/dist/types.d.ts +88 -3
  751. package/dist/types.js +1 -1
  752. package/dist/user-model.d.ts +37 -0
  753. package/dist/user-model.js +28 -0
  754. package/dist/user-model.js.map +1 -0
  755. package/dist/utility-runtime.d.ts +1 -1
  756. package/dist/verified-recall.js +11 -8
  757. package/dist/work/board.d.ts +43 -0
  758. package/dist/work/board.js +14 -0
  759. package/dist/work/board.js.map +1 -0
  760. package/dist/work/boundary.d.ts +8 -0
  761. package/dist/work/boundary.js +14 -0
  762. package/dist/work/boundary.js.map +1 -0
  763. package/dist/work/storage.d.ts +39 -0
  764. package/dist/work/storage.js +11 -0
  765. package/dist/work/storage.js.map +1 -0
  766. package/dist/work/types.d.ts +75 -0
  767. package/dist/work/types.js +1 -0
  768. package/dist/work/types.js.map +1 -0
  769. package/package.json +2767 -6
  770. package/scripts/faiss_index.py +816 -0
  771. package/scripts/faiss_requirements.txt +3 -0
  772. package/skills/remnic-entities/SKILL.md +51 -0
  773. package/skills/remnic-memory-workflow/SKILL.md +61 -0
  774. package/skills/remnic-recall/SKILL.md +51 -0
  775. package/skills/remnic-remember/SKILL.md +56 -0
  776. package/skills/remnic-search/SKILL.md +51 -0
  777. package/skills/remnic-status/SKILL.md +51 -0
  778. package/src/abort-error.test.ts +49 -0
  779. package/src/abort-error.ts +46 -0
  780. package/src/abstraction-nodes.ts +162 -0
  781. package/src/access-audit.test.ts +178 -0
  782. package/src/access-audit.ts +125 -0
  783. package/src/access-cli.test.ts +439 -0
  784. package/src/access-cli.ts +438 -0
  785. package/src/access-http.test.ts +225 -0
  786. package/src/access-http.ts +1899 -0
  787. package/src/access-idempotency.ts +232 -0
  788. package/src/access-mcp.test.ts +568 -0
  789. package/src/access-mcp.ts +3056 -0
  790. package/src/access-schema-pi.test.ts +60 -0
  791. package/src/access-schema.ts +522 -0
  792. package/src/access-service-namespace.test.ts +123 -0
  793. package/src/access-service.ts +5629 -0
  794. package/src/action-confidence.test.ts +206 -0
  795. package/src/action-confidence.ts +466 -0
  796. package/src/active-memory-bridge.test.ts +285 -0
  797. package/src/active-memory-bridge.ts +217 -0
  798. package/src/active-recall.test.ts +484 -0
  799. package/src/active-recall.ts +459 -0
  800. package/src/adapters/claude-code.ts +56 -0
  801. package/src/adapters/codex.ts +57 -0
  802. package/src/adapters/hermes.ts +64 -0
  803. package/src/adapters/index.ts +6 -0
  804. package/src/adapters/registry.ts +41 -0
  805. package/src/adapters/replit.ts +55 -0
  806. package/src/adapters/types.ts +51 -0
  807. package/src/behavior-learner.ts +144 -0
  808. package/src/behavior-signals.ts +73 -0
  809. package/src/binary-lifecycle/backend.ts +117 -0
  810. package/src/binary-lifecycle/index.ts +35 -0
  811. package/src/binary-lifecycle/manifest.ts +79 -0
  812. package/src/binary-lifecycle/pipeline.ts +352 -0
  813. package/src/binary-lifecycle/scanner.ts +89 -0
  814. package/src/binary-lifecycle/types.ts +89 -0
  815. package/src/bootstrap.ts +178 -0
  816. package/src/boxes.ts +521 -0
  817. package/src/briefing.test.ts +1535 -0
  818. package/src/briefing.ts +1382 -0
  819. package/src/buffer-session.test.ts +443 -0
  820. package/src/buffer-surprise-report.ts +176 -0
  821. package/src/buffer-surprise-telemetry.test.ts +606 -0
  822. package/src/buffer-surprise-trigger.test.ts +766 -0
  823. package/src/buffer-surprise.test.ts +339 -0
  824. package/src/buffer-surprise.ts +203 -0
  825. package/src/buffer.ts +900 -0
  826. package/src/bulk-import/cli-command.test.ts +204 -0
  827. package/src/bulk-import/index.ts +34 -0
  828. package/src/bulk-import/pipeline.test.ts +445 -0
  829. package/src/bulk-import/pipeline.ts +178 -0
  830. package/src/bulk-import/registry.test.ts +151 -0
  831. package/src/bulk-import/registry.ts +72 -0
  832. package/src/bulk-import/types.test.ts +272 -0
  833. package/src/bulk-import/types.ts +145 -0
  834. package/src/calibration.ts +394 -0
  835. package/src/capsule-cli.test.ts +398 -0
  836. package/src/capsule-cli.ts +565 -0
  837. package/src/causal-behavior.ts +308 -0
  838. package/src/causal-chain.ts +419 -0
  839. package/src/causal-consolidation.ts +370 -0
  840. package/src/causal-retrieval.ts +286 -0
  841. package/src/causal-trajectory-graph.ts +60 -0
  842. package/src/causal-trajectory.ts +303 -0
  843. package/src/chunking.ts +220 -0
  844. package/src/citations.ts +232 -0
  845. package/src/cli.ts +9403 -0
  846. package/src/codex-cli-fallback.ts +162 -0
  847. package/src/codex-thread-key.ts +1 -0
  848. package/src/coding/access-coding-context.test.ts +197 -0
  849. package/src/coding/coding-branch-scope.test.ts +281 -0
  850. package/src/coding/coding-namespace.test.ts +360 -0
  851. package/src/coding/coding-namespace.ts +412 -0
  852. package/src/coding/coding-orchestrator.test.ts +249 -0
  853. package/src/coding/git-context.test.ts +507 -0
  854. package/src/coding/git-context.ts +336 -0
  855. package/src/coding/mcp-set-coding-context.test.ts +174 -0
  856. package/src/coding/review-context.test.ts +316 -0
  857. package/src/coding/review-context.ts +349 -0
  858. package/src/coding/wire-coding-context.test.ts +468 -0
  859. package/src/commitment-ledger.test.ts +78 -0
  860. package/src/commitment-ledger.ts +337 -0
  861. package/src/compat/checks.test.ts +206 -0
  862. package/src/compat/checks.ts +716 -0
  863. package/src/compat/types.ts +33 -0
  864. package/src/compounding/engine.ts +1686 -0
  865. package/src/compounding/preference-consolidator.ts +778 -0
  866. package/src/compression-optimizer.ts +312 -0
  867. package/src/config.test.ts +930 -0
  868. package/src/config.ts +3807 -0
  869. package/src/connectors/codex/instructions.md +160 -0
  870. package/src/connectors/codex/resources/namespace-cheatsheet.md +48 -0
  871. package/src/connectors/codex-marketplace.ts +500 -0
  872. package/src/connectors/codex-materialize-runner.ts +212 -0
  873. package/src/connectors/codex-materialize.ts +983 -0
  874. package/src/connectors/coerce.ts +62 -0
  875. package/src/connectors/index.test.ts +1570 -0
  876. package/src/connectors/index.ts +3222 -0
  877. package/src/connectors/live/framework.ts +164 -0
  878. package/src/connectors/live/github.test.ts +1218 -0
  879. package/src/connectors/live/github.ts +1068 -0
  880. package/src/connectors/live/gmail.test.ts +1706 -0
  881. package/src/connectors/live/gmail.ts +1293 -0
  882. package/src/connectors/live/google-drive.test.ts +696 -0
  883. package/src/connectors/live/google-drive.ts +724 -0
  884. package/src/connectors/live/index.ts +101 -0
  885. package/src/connectors/live/live-connectors.test.ts +689 -0
  886. package/src/connectors/live/notion.test.ts +1109 -0
  887. package/src/connectors/live/notion.ts +978 -0
  888. package/src/connectors/live/registry.ts +103 -0
  889. package/src/connectors/live/state-store.ts +399 -0
  890. package/src/connectors/live/transient-errors.ts +150 -0
  891. package/src/connectors/weclone-installer.test.ts +850 -0
  892. package/src/connectors-cli.ts +513 -0
  893. package/src/console/state.test.ts +224 -0
  894. package/src/console/state.ts +514 -0
  895. package/src/console/trace.test.ts +813 -0
  896. package/src/console/trace.ts +603 -0
  897. package/src/console/tui.test.ts +582 -0
  898. package/src/console/tui.ts +508 -0
  899. package/src/consolidation-operator.ts +182 -0
  900. package/src/consolidation-provenance-check.ts +551 -0
  901. package/src/consolidation-undo.ts +718 -0
  902. package/src/contradiction/contradiction-judge.test.ts +189 -0
  903. package/src/contradiction/contradiction-judge.ts +333 -0
  904. package/src/contradiction/contradiction-review.ts +574 -0
  905. package/src/contradiction/contradiction-scan.ts +504 -0
  906. package/src/contradiction/contradiction.test.ts +2230 -0
  907. package/src/contradiction/index.ts +37 -0
  908. package/src/contradiction/resolution.ts +383 -0
  909. package/src/conversation-index/backend.ts +323 -0
  910. package/src/conversation-index/chunker.ts +47 -0
  911. package/src/conversation-index/cleanup.ts +53 -0
  912. package/src/conversation-index/faiss-adapter.ts +384 -0
  913. package/src/conversation-index/indexer.test.ts +164 -0
  914. package/src/conversation-index/indexer.ts +192 -0
  915. package/src/conversation-index/search.ts +37 -0
  916. package/src/cross-namespace-budget.test.ts +275 -0
  917. package/src/cross-namespace-budget.ts +365 -0
  918. package/src/cue-anchors.ts +163 -0
  919. package/src/curation/index.ts +544 -0
  920. package/src/dashboard-runtime.ts +337 -0
  921. package/src/day-summary.ts +122 -0
  922. package/src/dedup/index.ts +330 -0
  923. package/src/dedup/semantic.test.ts +1577 -0
  924. package/src/dedup/semantic.ts +148 -0
  925. package/src/delinearize.ts +193 -0
  926. package/src/direct-answer-wiring.test.ts +473 -0
  927. package/src/direct-answer-wiring.ts +180 -0
  928. package/src/direct-answer.test.ts +484 -0
  929. package/src/direct-answer.ts +273 -0
  930. package/src/embedding-fallback.ts +565 -0
  931. package/src/enrichment/audit.ts +89 -0
  932. package/src/enrichment/index.ts +27 -0
  933. package/src/enrichment/pipeline.ts +197 -0
  934. package/src/enrichment/provider-registry.ts +85 -0
  935. package/src/enrichment/types.ts +100 -0
  936. package/src/enrichment/web-search-provider.ts +63 -0
  937. package/src/entity-retrieval.ts +774 -0
  938. package/src/entity-schema.ts +239 -0
  939. package/src/evals.ts +1312 -0
  940. package/src/event-order-recall.test.ts +4164 -0
  941. package/src/event-order-recall.ts +2802 -0
  942. package/src/evidence-pack.test.ts +89 -0
  943. package/src/evidence-pack.ts +388 -0
  944. package/src/explicit-capture.ts +530 -0
  945. package/src/explicit-cue-recall.test.ts +3019 -0
  946. package/src/explicit-cue-recall.ts +5545 -0
  947. package/src/extraction-judge-telemetry.ts +234 -0
  948. package/src/extraction-judge-training.ts +221 -0
  949. package/src/extraction-judge.ts +846 -0
  950. package/src/extraction-timeout.test.ts +265 -0
  951. package/src/extraction.ts +2719 -0
  952. package/src/fallback-llm.test.ts +1060 -0
  953. package/src/fallback-llm.ts +918 -0
  954. package/src/focused-list-recall.test.ts +734 -0
  955. package/src/focused-list-recall.ts +1160 -0
  956. package/src/graph-dashboard-diff.ts +35 -0
  957. package/src/graph-dashboard-key.ts +5 -0
  958. package/src/graph-dashboard-parser.ts +104 -0
  959. package/src/graph-edge-reinforcement.ts +192 -0
  960. package/src/graph-events.ts +151 -0
  961. package/src/graph-recall.test.ts +164 -0
  962. package/src/graph-recall.ts +189 -0
  963. package/src/graph-retrieval.test.ts +809 -0
  964. package/src/graph-retrieval.ts +823 -0
  965. package/src/graph-snapshot.ts +329 -0
  966. package/src/graph.ts +813 -0
  967. package/src/harmonic-retrieval.ts +223 -0
  968. package/src/himem.ts +154 -0
  969. package/src/hygiene.ts +87 -0
  970. package/src/identity-continuity.ts +333 -0
  971. package/src/importance.ts +328 -0
  972. package/src/importers/base.test.ts +294 -0
  973. package/src/importers/base.ts +436 -0
  974. package/src/importers/index.ts +21 -0
  975. package/src/index.ts +1204 -0
  976. package/src/intent.ts +154 -0
  977. package/src/json-extract.ts +85 -0
  978. package/src/json-store.ts +42 -0
  979. package/src/lcm/archive.ts +617 -0
  980. package/src/lcm/dag.ts +199 -0
  981. package/src/lcm/engine.ts +645 -0
  982. package/src/lcm/index.ts +7 -0
  983. package/src/lcm/queue.test.ts +178 -0
  984. package/src/lcm/queue.ts +200 -0
  985. package/src/lcm/recall.ts +117 -0
  986. package/src/lcm/schema.ts +154 -0
  987. package/src/lcm/summarizer.ts +235 -0
  988. package/src/lcm/tools.ts +191 -0
  989. package/src/lcm-engine.test.ts +660 -0
  990. package/src/legacy-hook-compat.test.ts +20 -0
  991. package/src/legacy-hook-compat.ts +45 -0
  992. package/src/lifecycle.ts +289 -0
  993. package/src/live-connectors-runner.ts +385 -0
  994. package/src/local-llm-qos.test.ts +303 -0
  995. package/src/local-llm-thinking.test.ts +292 -0
  996. package/src/local-llm.ts +1464 -0
  997. package/src/logger.ts +49 -0
  998. package/src/maintenance/archive-observations.ts +147 -0
  999. package/src/maintenance/backup-stamp.ts +3 -0
  1000. package/src/maintenance/dreams-ledger.ts +516 -0
  1001. package/src/maintenance/first-start-migration.ts +362 -0
  1002. package/src/maintenance/forget.test.ts +206 -0
  1003. package/src/maintenance/forget.ts +126 -0
  1004. package/src/maintenance/graph-edge-decay.test.ts +409 -0
  1005. package/src/maintenance/graph-edge-decay.ts +394 -0
  1006. package/src/maintenance/memory-governance-cron.ts +447 -0
  1007. package/src/maintenance/memory-governance.ts +1039 -0
  1008. package/src/maintenance/migrate-observations.ts +216 -0
  1009. package/src/maintenance/observation-ledger-utils.ts +54 -0
  1010. package/src/maintenance/pattern-reinforcement.test.ts +875 -0
  1011. package/src/maintenance/pattern-reinforcement.ts +369 -0
  1012. package/src/maintenance/purge.ts +334 -0
  1013. package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +78 -0
  1014. package/src/maintenance/rebuild-memory-projection.ts +1234 -0
  1015. package/src/maintenance/rebuild-observations.ts +178 -0
  1016. package/src/maintenance/tier-stats.test.ts +378 -0
  1017. package/src/maintenance/tier-stats.ts +222 -0
  1018. package/src/mcp-memory-inspector-app.ts +421 -0
  1019. package/src/memory-action-policy.ts +80 -0
  1020. package/src/memory-cache.ts +208 -0
  1021. package/src/memory-extension/claude-code-publisher.ts +51 -0
  1022. package/src/memory-extension/codex-publisher.ts +149 -0
  1023. package/src/memory-extension/hermes-publisher.ts +51 -0
  1024. package/src/memory-extension/index.ts +100 -0
  1025. package/src/memory-extension/shared-instructions.ts +133 -0
  1026. package/src/memory-extension/types.ts +86 -0
  1027. package/src/memory-extension-host/host-discovery.ts +276 -0
  1028. package/src/memory-extension-host/index.ts +14 -0
  1029. package/src/memory-extension-host/render-extensions-block.ts +73 -0
  1030. package/src/memory-extension-host/types.ts +21 -0
  1031. package/src/memory-lifecycle-ledger-utils.ts +116 -0
  1032. package/src/memory-projection-format.ts +11 -0
  1033. package/src/memory-projection-store.ts +951 -0
  1034. package/src/memory-provenance.test.ts +196 -0
  1035. package/src/memory-provenance.ts +484 -0
  1036. package/src/memory-worth-bench.test.ts +71 -0
  1037. package/src/memory-worth-bench.ts +265 -0
  1038. package/src/memory-worth-filter.test.ts +209 -0
  1039. package/src/memory-worth-filter.ts +204 -0
  1040. package/src/memory-worth-frontmatter.test.ts +311 -0
  1041. package/src/memory-worth-outcomes.test.ts +316 -0
  1042. package/src/memory-worth-outcomes.ts +286 -0
  1043. package/src/memory-worth.test.ts +317 -0
  1044. package/src/memory-worth.ts +215 -0
  1045. package/src/message-parts/index.ts +806 -0
  1046. package/src/message-parts/message-parts.test.ts +421 -0
  1047. package/src/migrate/from-engram.ts +789 -0
  1048. package/src/model-registry.ts +313 -0
  1049. package/src/models-json.ts +76 -0
  1050. package/src/namespaces/migrate.ts +187 -0
  1051. package/src/namespaces/path.ts +25 -0
  1052. package/src/namespaces/principal.test.ts +195 -0
  1053. package/src/namespaces/principal.ts +86 -0
  1054. package/src/namespaces/search.test.ts +105 -0
  1055. package/src/namespaces/search.ts +233 -0
  1056. package/src/namespaces/storage.ts +74 -0
  1057. package/src/native-knowledge.ts +1823 -0
  1058. package/src/negative.ts +72 -0
  1059. package/src/network/tailscale.ts +179 -0
  1060. package/src/network/webdav.ts +385 -0
  1061. package/src/objective-state-writers.ts +951 -0
  1062. package/src/objective-state.ts +320 -0
  1063. package/src/onboarding/index.ts +529 -0
  1064. package/src/openai-chat-compat.ts +56 -0
  1065. package/src/operator-toolkit.ts +2132 -0
  1066. package/src/opik-exporter.test.ts +72 -0
  1067. package/src/opik-exporter.ts +587 -0
  1068. package/src/orchestrator-extraction-queue.test.ts +197 -0
  1069. package/src/orchestrator-flush.test.ts +1171 -0
  1070. package/src/orchestrator-pattern-reinforcement.test.ts +128 -0
  1071. package/src/orchestrator-source-attribution.test.ts +701 -0
  1072. package/src/orchestrator.ts +16368 -0
  1073. package/src/page-versioning.ts +450 -0
  1074. package/src/patterns-cli.ts +574 -0
  1075. package/src/peers/index.ts +54 -0
  1076. package/src/peers/migrate-from-identity-anchor.test.ts +291 -0
  1077. package/src/peers/migrate-from-identity-anchor.ts +350 -0
  1078. package/src/peers/peers.test.ts +419 -0
  1079. package/src/peers/profile-reasoner.ts +694 -0
  1080. package/src/peers/storage.ts +1350 -0
  1081. package/src/peers/types.ts +138 -0
  1082. package/src/plugin-id.ts +84 -0
  1083. package/src/policy-runtime.ts +209 -0
  1084. package/src/procedural/procedure-miner.ts +150 -0
  1085. package/src/procedural/procedure-recall.ts +93 -0
  1086. package/src/procedural/procedure-stats.ts +213 -0
  1087. package/src/procedural/procedure-types.ts +132 -0
  1088. package/src/procedural/reinforcement-core.test.ts +132 -0
  1089. package/src/procedural/reinforcement-core.ts +73 -0
  1090. package/src/profiling.test.ts +263 -0
  1091. package/src/profiling.ts +435 -0
  1092. package/src/projection/index.ts +398 -0
  1093. package/src/qmd-recall-cache.test.ts +138 -0
  1094. package/src/qmd-recall-cache.ts +111 -0
  1095. package/src/qmd.test.ts +257 -0
  1096. package/src/qmd.ts +2614 -0
  1097. package/src/reasoning-trace-recall.ts +201 -0
  1098. package/src/reasoning-trace-types.ts +235 -0
  1099. package/src/recall-audit-anomaly.test.ts +246 -0
  1100. package/src/recall-audit-anomaly.ts +297 -0
  1101. package/src/recall-audit.test.ts +51 -0
  1102. package/src/recall-audit.ts +72 -0
  1103. package/src/recall-budget-config.test.ts +87 -0
  1104. package/src/recall-disclosure-escalation.test.ts +196 -0
  1105. package/src/recall-disclosure-escalation.ts +158 -0
  1106. package/src/recall-disclosure-shaping.test.ts +146 -0
  1107. package/src/recall-disclosure.test.ts +214 -0
  1108. package/src/recall-explain-renderer.test.ts +140 -0
  1109. package/src/recall-explain-renderer.ts +356 -0
  1110. package/src/recall-mmr.test.ts +808 -0
  1111. package/src/recall-mmr.ts +607 -0
  1112. package/src/recall-qos.test.ts +85 -0
  1113. package/src/recall-qos.ts +82 -0
  1114. package/src/recall-query-policy.ts +221 -0
  1115. package/src/recall-state.test.ts +233 -0
  1116. package/src/recall-state.ts +456 -0
  1117. package/src/recall-tag-filter.ts +143 -0
  1118. package/src/recall-tokenization.ts +35 -0
  1119. package/src/recall-xray-cli.test.ts +118 -0
  1120. package/src/recall-xray-cli.ts +100 -0
  1121. package/src/recall-xray-disclosure-telemetry.test.ts +183 -0
  1122. package/src/recall-xray-renderer.test.ts +539 -0
  1123. package/src/recall-xray-renderer.ts +487 -0
  1124. package/src/recall-xray.test.ts +503 -0
  1125. package/src/recall-xray.ts +621 -0
  1126. package/src/reconstruct.ts +41 -0
  1127. package/src/release-changelog.ts +35 -0
  1128. package/src/relevance.ts +67 -0
  1129. package/src/replay/normalizers/chatgpt.ts +133 -0
  1130. package/src/replay/normalizers/claude.ts +102 -0
  1131. package/src/replay/normalizers/openclaw.ts +119 -0
  1132. package/src/replay/normalizers/shared.ts +69 -0
  1133. package/src/replay/runner.ts +197 -0
  1134. package/src/replay/types.ts +143 -0
  1135. package/src/rerank.test.ts +48 -0
  1136. package/src/rerank.ts +176 -0
  1137. package/src/resolve-auth-token.test.ts +226 -0
  1138. package/src/resolve-auth-token.ts +151 -0
  1139. package/src/resolve-provider-secret.test.ts +187 -0
  1140. package/src/resolve-provider-secret.ts +410 -0
  1141. package/src/response-guidance-recall.test.ts +3952 -0
  1142. package/src/response-guidance-recall.ts +4431 -0
  1143. package/src/resume-bundles.ts +415 -0
  1144. package/src/retrieval-agents.ts +623 -0
  1145. package/src/retrieval-tiers.ts +25 -0
  1146. package/src/retrieval.ts +104 -0
  1147. package/src/review/index.test.ts +201 -0
  1148. package/src/review/index.ts +536 -0
  1149. package/src/routing/engine.ts +162 -0
  1150. package/src/routing/store.ts +321 -0
  1151. package/src/runtime/better-sqlite.test.ts +32 -0
  1152. package/src/runtime/better-sqlite.ts +76 -0
  1153. package/src/runtime/child-process.ts +67 -0
  1154. package/src/runtime/env.ts +48 -0
  1155. package/src/sanitize.ts +58 -0
  1156. package/src/schemas.ts +449 -0
  1157. package/src/sdk-compat.ts +87 -0
  1158. package/src/search/document-scanner.ts +96 -0
  1159. package/src/search/embed-helper.ts +142 -0
  1160. package/src/search/factory.ts +189 -0
  1161. package/src/search/index.ts +10 -0
  1162. package/src/search/lancedb-backend.ts +342 -0
  1163. package/src/search/meilisearch-backend.ts +232 -0
  1164. package/src/search/noop-backend.ts +57 -0
  1165. package/src/search/orama-backend.ts +358 -0
  1166. package/src/search/port.ts +86 -0
  1167. package/src/search/remote-backend.ts +124 -0
  1168. package/src/secure-store/cipher.ts +271 -0
  1169. package/src/secure-store/cli-handlers.ts +355 -0
  1170. package/src/secure-store/cli-renderer.ts +131 -0
  1171. package/src/secure-store/header.ts +373 -0
  1172. package/src/secure-store/index.ts +137 -0
  1173. package/src/secure-store/kdf.ts +263 -0
  1174. package/src/secure-store/keyring.ts +106 -0
  1175. package/src/secure-store/metadata.ts +394 -0
  1176. package/src/secure-store/passphrase-reader.ts +252 -0
  1177. package/src/secure-store/secure-fs.ts +571 -0
  1178. package/src/secure-store/secure-store.test.ts +755 -0
  1179. package/src/semantic-chunking.ts +545 -0
  1180. package/src/semantic-consolidation.test.ts +182 -0
  1181. package/src/semantic-consolidation.ts +432 -0
  1182. package/src/semantic-rule-promotion.ts +183 -0
  1183. package/src/semantic-rule-verifier.ts +160 -0
  1184. package/src/session-integrity.ts +569 -0
  1185. package/src/session-observer-bands.ts +11 -0
  1186. package/src/session-observer-state.ts +346 -0
  1187. package/src/session-toggles.test.ts +96 -0
  1188. package/src/session-toggles.ts +159 -0
  1189. package/src/shared-context/manager.ts +810 -0
  1190. package/src/signal.ts +84 -0
  1191. package/src/skills-registry.test.ts +277 -0
  1192. package/src/skills-registry.ts +120 -0
  1193. package/src/source-attribution-roundtrip.test.ts +215 -0
  1194. package/src/source-attribution.test.ts +1425 -0
  1195. package/src/source-attribution.ts +639 -0
  1196. package/src/spaces/index.ts +627 -0
  1197. package/src/storage-paths.ts +117 -0
  1198. package/src/storage.ts +6657 -0
  1199. package/src/store-contract.ts +55 -0
  1200. package/src/summarizer.ts +844 -0
  1201. package/src/summary-snapshot.test.ts +681 -0
  1202. package/src/summary-snapshot.ts +238 -0
  1203. package/src/surfaces/dreams.test.ts +394 -0
  1204. package/src/surfaces/dreams.ts +346 -0
  1205. package/src/surfaces/heartbeat.test.ts +415 -0
  1206. package/src/surfaces/heartbeat.ts +325 -0
  1207. package/src/sync/index.ts +308 -0
  1208. package/src/targeted-fact-recall.test.ts +1694 -0
  1209. package/src/targeted-fact-recall.ts +2905 -0
  1210. package/src/taxonomy/default-taxonomy.ts +87 -0
  1211. package/src/taxonomy/index.ts +26 -0
  1212. package/src/taxonomy/resolver-doc-generator.ts +57 -0
  1213. package/src/taxonomy/resolver.ts +184 -0
  1214. package/src/taxonomy/taxonomy-loader.ts +186 -0
  1215. package/src/taxonomy/types.ts +48 -0
  1216. package/src/telemetry-transcript.ts +70 -0
  1217. package/src/temporal-index.ts +890 -0
  1218. package/src/temporal-supersession.test.ts +2703 -0
  1219. package/src/temporal-supersession.ts +493 -0
  1220. package/src/temporal-validity.test.ts +448 -0
  1221. package/src/temporal-validity.ts +123 -0
  1222. package/src/threading.ts +395 -0
  1223. package/src/tier-migration.ts +124 -0
  1224. package/src/tier-routing.ts +102 -0
  1225. package/src/tmt.ts +462 -0
  1226. package/src/tokens.test.ts +178 -0
  1227. package/src/tokens.ts +279 -0
  1228. package/src/topics.ts +147 -0
  1229. package/src/training-export/cli-date-validation.test.ts +258 -0
  1230. package/src/training-export/converter.test.ts +452 -0
  1231. package/src/training-export/converter.ts +319 -0
  1232. package/src/training-export/date-parse.ts +117 -0
  1233. package/src/training-export/index.ts +26 -0
  1234. package/src/training-export/registry.test.ts +85 -0
  1235. package/src/training-export/registry.ts +57 -0
  1236. package/src/training-export/types.ts +31 -0
  1237. package/src/transcript.ts +1179 -0
  1238. package/src/transfer/autodetect.ts +30 -0
  1239. package/src/transfer/backup.ts +138 -0
  1240. package/src/transfer/capsule-crypto.ts +485 -0
  1241. package/src/transfer/capsule-encrypt.test.ts +690 -0
  1242. package/src/transfer/capsule-export.ts +543 -0
  1243. package/src/transfer/capsule-fork.ts +375 -0
  1244. package/src/transfer/capsule-import.ts +564 -0
  1245. package/src/transfer/capsule-merge.ts +433 -0
  1246. package/src/transfer/conflict-policy.ts +16 -0
  1247. package/src/transfer/constants.ts +13 -0
  1248. package/src/transfer/exclusions.ts +37 -0
  1249. package/src/transfer/export-json.ts +65 -0
  1250. package/src/transfer/export-md.ts +59 -0
  1251. package/src/transfer/export-sqlite.ts +52 -0
  1252. package/src/transfer/fs-utils.ts +269 -0
  1253. package/src/transfer/import-json.ts +108 -0
  1254. package/src/transfer/import-md.ts +84 -0
  1255. package/src/transfer/import-sqlite.ts +100 -0
  1256. package/src/transfer/integrity.ts +71 -0
  1257. package/src/transfer/sqlite-schema.ts +16 -0
  1258. package/src/transfer/types.ts +297 -0
  1259. package/src/trust-zones.ts +1186 -0
  1260. package/src/types.ts +3074 -0
  1261. package/src/user-model.test.ts +124 -0
  1262. package/src/user-model.ts +162 -0
  1263. package/src/utility-learner.ts +353 -0
  1264. package/src/utility-runtime.ts +88 -0
  1265. package/src/utility-telemetry.ts +215 -0
  1266. package/src/utils/category-dir.ts +44 -0
  1267. package/src/utils/errno.ts +6 -0
  1268. package/src/utils/iso-timestamp.test.ts +37 -0
  1269. package/src/utils/iso-timestamp.ts +164 -0
  1270. package/src/utils/path.ts +26 -0
  1271. package/src/verified-recall.ts +138 -0
  1272. package/src/version-utils.test.ts +10 -0
  1273. package/src/version-utils.ts +9 -0
  1274. package/src/whitespace.ts +10 -0
  1275. package/src/work/board.ts +359 -0
  1276. package/src/work/boundary.ts +107 -0
  1277. package/src/work/storage.ts +436 -0
  1278. package/src/work/types.ts +82 -0
  1279. package/src/work-product-ledger.ts +265 -0
  1280. package/dist/access-service-BkXt3di1.d.ts +0 -2039
  1281. package/dist/capsule-crypto-SJS5VVAP.js +0 -18
  1282. package/dist/capsule-export-LLEVB2RG.js +0 -17
  1283. package/dist/capsule-import-UW45R2MZ.js +0 -16
  1284. package/dist/capsule-merge-DI7PNQ2H.js +0 -189
  1285. package/dist/chunk-2LGMW3DJ.js +0 -111
  1286. package/dist/chunk-2YMTO4ZJ.js +0 -265
  1287. package/dist/chunk-2YMTO4ZJ.js.map +0 -1
  1288. package/dist/chunk-363MWCD3.js +0 -9683
  1289. package/dist/chunk-363MWCD3.js.map +0 -1
  1290. package/dist/chunk-36CTNQY7.js +0 -1554
  1291. package/dist/chunk-36CTNQY7.js.map +0 -1
  1292. package/dist/chunk-457A4P3L.js +0 -119
  1293. package/dist/chunk-457A4P3L.js.map +0 -1
  1294. package/dist/chunk-4DXC6HQQ.js +0 -1837
  1295. package/dist/chunk-4DXC6HQQ.js.map +0 -1
  1296. package/dist/chunk-4IS4SXIQ.js +0 -2040
  1297. package/dist/chunk-57QNCUEZ.js +0 -1914
  1298. package/dist/chunk-57QNCUEZ.js.map +0 -1
  1299. package/dist/chunk-6AUUAZEX.js +0 -150
  1300. package/dist/chunk-6AUUAZEX.js.map +0 -1
  1301. package/dist/chunk-6TBWYBJ3.js +0 -236
  1302. package/dist/chunk-6XA7UN4Z.js +0 -135
  1303. package/dist/chunk-6Z6UH6TK.js +0 -2129
  1304. package/dist/chunk-6Z6UH6TK.js.map +0 -1
  1305. package/dist/chunk-74EMIVE4.js +0 -329
  1306. package/dist/chunk-74EMIVE4.js.map +0 -1
  1307. package/dist/chunk-74WWN7ZW.js +0 -82
  1308. package/dist/chunk-74WWN7ZW.js.map +0 -1
  1309. package/dist/chunk-767ODGE6.js +0 -183
  1310. package/dist/chunk-A4ACKWIW.js +0 -289
  1311. package/dist/chunk-A4ACKWIW.js.map +0 -1
  1312. package/dist/chunk-ASAITVLA.js +0 -64
  1313. package/dist/chunk-ASAITVLA.js.map +0 -1
  1314. package/dist/chunk-C5HUWVH2.js +0 -891
  1315. package/dist/chunk-C5HUWVH2.js.map +0 -1
  1316. package/dist/chunk-D54LZC5L.js +0 -147
  1317. package/dist/chunk-DF3RVK3X.js +0 -119
  1318. package/dist/chunk-DF3RVK3X.js.map +0 -1
  1319. package/dist/chunk-E6K4NIEU.js +0 -747
  1320. package/dist/chunk-E6K4NIEU.js.map +0 -1
  1321. package/dist/chunk-EEQLFRUM.js +0 -89
  1322. package/dist/chunk-EQINRHYR.js +0 -672
  1323. package/dist/chunk-EQINRHYR.js.map +0 -1
  1324. package/dist/chunk-ETOW6ACV.js +0 -158
  1325. package/dist/chunk-ETOW6ACV.js.map +0 -1
  1326. package/dist/chunk-EYNQTST2.js +0 -721
  1327. package/dist/chunk-FYIYMQ5N.js +0 -221
  1328. package/dist/chunk-FYIYMQ5N.js.map +0 -1
  1329. package/dist/chunk-G2WADRQ3.js +0 -219
  1330. package/dist/chunk-G4SK7DSQ.js +0 -121
  1331. package/dist/chunk-GGD5W7TB.js +0 -105
  1332. package/dist/chunk-GGD5W7TB.js.map +0 -1
  1333. package/dist/chunk-GVPWB7EY.js +0 -390
  1334. package/dist/chunk-GVPWB7EY.js.map +0 -1
  1335. package/dist/chunk-HJYHRE4S.js +0 -647
  1336. package/dist/chunk-I6BQZSML.js +0 -1451
  1337. package/dist/chunk-I6BQZSML.js.map +0 -1
  1338. package/dist/chunk-IBX3VFOM.js +0 -446
  1339. package/dist/chunk-IBX3VFOM.js.map +0 -1
  1340. package/dist/chunk-IXEJRKCZ.js +0 -18
  1341. package/dist/chunk-JBMSGZEQ.js +0 -441
  1342. package/dist/chunk-JBMSGZEQ.js.map +0 -1
  1343. package/dist/chunk-JRNQ3RNA.js +0 -284
  1344. package/dist/chunk-JRNQ3RNA.js.map +0 -1
  1345. package/dist/chunk-K6WK37A6.js +0 -865
  1346. package/dist/chunk-K6WK37A6.js.map +0 -1
  1347. package/dist/chunk-KBYWQWSB.js +0 -271
  1348. package/dist/chunk-KUHRUM6B.js +0 -14397
  1349. package/dist/chunk-KUHRUM6B.js.map +0 -1
  1350. package/dist/chunk-KWBPHZUU.js +0 -83
  1351. package/dist/chunk-KWBPHZUU.js.map +0 -1
  1352. package/dist/chunk-LIO5X3CM.js +0 -596
  1353. package/dist/chunk-MARWOCVP.js +0 -48
  1354. package/dist/chunk-MCC6KDQF.js +0 -5095
  1355. package/dist/chunk-MCC6KDQF.js.map +0 -1
  1356. package/dist/chunk-N5AKDXAI.js +0 -74
  1357. package/dist/chunk-NN3LPQ5D.js +0 -936
  1358. package/dist/chunk-NN3LPQ5D.js.map +0 -1
  1359. package/dist/chunk-O4XJUPSF.js +0 -533
  1360. package/dist/chunk-O4XJUPSF.js.map +0 -1
  1361. package/dist/chunk-OA3L7BFR.js +0 -183
  1362. package/dist/chunk-OA3L7BFR.js.map +0 -1
  1363. package/dist/chunk-OR64ZGRZ.js +0 -23
  1364. package/dist/chunk-P73JTV34.js +0 -275
  1365. package/dist/chunk-P73JTV34.js.map +0 -1
  1366. package/dist/chunk-P77UEOU2.js +0 -1521
  1367. package/dist/chunk-P77UEOU2.js.map +0 -1
  1368. package/dist/chunk-PB5KW5PL.js +0 -118
  1369. package/dist/chunk-PHNGXFQ6.js +0 -623
  1370. package/dist/chunk-PHNGXFQ6.js.map +0 -1
  1371. package/dist/chunk-QIGOEM65.js +0 -228
  1372. package/dist/chunk-RXTFCYQF.js +0 -108
  1373. package/dist/chunk-S2JJBLJG.js +0 -2101
  1374. package/dist/chunk-S2JJBLJG.js.map +0 -1
  1375. package/dist/chunk-S3IP6R6K.js +0 -219
  1376. package/dist/chunk-S3IP6R6K.js.map +0 -1
  1377. package/dist/chunk-SRBJUAMP.js +0 -403
  1378. package/dist/chunk-SRBJUAMP.js.map +0 -1
  1379. package/dist/chunk-URB2WSKZ.js +0 -350
  1380. package/dist/chunk-URB2WSKZ.js.map +0 -1
  1381. package/dist/chunk-VQXK37XA.js +0 -26
  1382. package/dist/chunk-VQXK37XA.js.map +0 -1
  1383. package/dist/chunk-VTU2B4VF.js +0 -146
  1384. package/dist/chunk-VTU2B4VF.js.map +0 -1
  1385. package/dist/chunk-VX2IUQFE.js +0 -613
  1386. package/dist/chunk-VX2IUQFE.js.map +0 -1
  1387. package/dist/chunk-WGK4VHGP.js +0 -4292
  1388. package/dist/chunk-WGK4VHGP.js.map +0 -1
  1389. package/dist/chunk-WTFWLUSX.js +0 -827
  1390. package/dist/chunk-WTFWLUSX.js.map +0 -1
  1391. package/dist/chunk-XJKFSSDW.js +0 -726
  1392. package/dist/chunk-XJKFSSDW.js.map +0 -1
  1393. package/dist/chunk-XMHBH5H6.js +0 -283
  1394. package/dist/chunk-XMHBH5H6.js.map +0 -1
  1395. package/dist/chunk-XMVFHBHT.js +0 -277
  1396. package/dist/chunk-Y5KDIOKF.js +0 -2403
  1397. package/dist/chunk-Y5KDIOKF.js.map +0 -1
  1398. package/dist/chunk-YNB73F22.js +0 -137
  1399. package/dist/chunk-YNB73F22.js.map +0 -1
  1400. package/dist/chunk-Z2E7VW55.js +0 -335
  1401. package/dist/chunk-Z2E7VW55.js.map +0 -1
  1402. package/dist/chunk-Z5S5HNGY.js +0 -2280
  1403. package/dist/chunk-Z5S5HNGY.js.map +0 -1
  1404. package/dist/chunk-ZL4S7ARC.js +0 -53
  1405. package/dist/chunk-ZTSE2ZJ6.js +0 -190
  1406. package/dist/chunk-ZTSE2ZJ6.js.map +0 -1
  1407. package/dist/cli-Cvy2SNhF.d.ts +0 -1259
  1408. package/dist/codex-materialize-CQlLTzke.d.ts +0 -139
  1409. package/dist/connectors-cli-DFGtY2DB.d.ts +0 -257
  1410. package/dist/contradiction-review-5LTTVDQV.js +0 -22
  1411. package/dist/contradiction-scan-3Z6YW7YA.js +0 -413
  1412. package/dist/contradiction-scan-3Z6YW7YA.js.map +0 -1
  1413. package/dist/engine-FOC3IJLA.js +0 -28
  1414. package/dist/fs-utils-IRVUFB6G.js +0 -30
  1415. package/dist/graph-edge-decay-PWB63GRE.js +0 -207
  1416. package/dist/index-1qIcnbG1.d.ts +0 -34
  1417. package/dist/memory-governance-F3QOJGEY.js +0 -37
  1418. package/dist/memory-projection-store-CY8TU40w.d.ts +0 -222
  1419. package/dist/orchestrator-AOQMo7QI.d.ts +0 -1784
  1420. package/dist/path-RMTY5Y5A.js +0 -9
  1421. package/dist/port-B6VEDIkC.d.ts +0 -53
  1422. package/dist/resolution-YGIBORXI.js +0 -101
  1423. package/dist/resolution-YGIBORXI.js.map +0 -1
  1424. package/dist/secure-store-4R2GSO7S.js +0 -156
  1425. package/dist/semantic-consolidation-ByBXb-sf.d.ts +0 -180
  1426. package/dist/state-store-3EH7HYIN.js +0 -16
  1427. package/dist/types-V3FJ26TF.js +0 -30
  1428. /package/dist/{capsule-crypto-SJS5VVAP.js.map → action-confidence.js.map} +0 -0
  1429. /package/dist/{capsule-export-LLEVB2RG.js.map → adapters/claude-code.js.map} +0 -0
  1430. /package/dist/{capsule-import-UW45R2MZ.js.map → adapters/codex.js.map} +0 -0
  1431. /package/dist/{contradiction-review-5LTTVDQV.js.map → adapters/hermes.js.map} +0 -0
  1432. /package/dist/{engine-FOC3IJLA.js.map → adapters/index.js.map} +0 -0
  1433. /package/dist/{fs-utils-IRVUFB6G.js.map → adapters/registry.js.map} +0 -0
  1434. /package/dist/{memory-governance-F3QOJGEY.js.map → adapters/replit.js.map} +0 -0
  1435. /package/dist/{path-RMTY5Y5A.js.map → adapters/types.js.map} +0 -0
  1436. /package/dist/{secure-store-4R2GSO7S.js.map → capsule-crypto-5CYAGVC5.js.map} +0 -0
  1437. /package/dist/{capsule-merge-DI7PNQ2H.js.map → capsule-merge-4MGKE7C5.js.map} +0 -0
  1438. /package/dist/{chunk-G4SK7DSQ.js.map → chunk-2WWLHTZY.js.map} +0 -0
  1439. /package/dist/{chunk-KBYWQWSB.js.map → chunk-4CRG46BG.js.map} +0 -0
  1440. /package/dist/{chunk-LIO5X3CM.js.map → chunk-7IASACLB.js.map} +0 -0
  1441. /package/dist/{chunk-EYNQTST2.js.map → chunk-EFJ3MQ4V.js.map} +0 -0
  1442. /package/dist/{chunk-D54LZC5L.js.map → chunk-FDU6HUUL.js.map} +0 -0
  1443. /package/dist/{chunk-QIGOEM65.js.map → chunk-GGKRUQOO.js.map} +0 -0
  1444. /package/dist/{chunk-HJYHRE4S.js.map → chunk-GL6I6MEQ.js.map} +0 -0
  1445. /package/dist/{state-store-3EH7HYIN.js.map → chunk-HHLLAQGZ.js.map} +0 -0
  1446. /package/dist/{chunk-4IS4SXIQ.js.map → chunk-HXXBL2KD.js.map} +0 -0
  1447. /package/dist/{chunk-767ODGE6.js.map → chunk-KNKUID7G.js.map} +0 -0
  1448. /package/dist/{chunk-6TBWYBJ3.js.map → chunk-LPMVBPA3.js.map} +0 -0
  1449. /package/dist/{chunk-PB5KW5PL.js.map → chunk-MC26UJIM.js.map} +0 -0
  1450. /package/dist/{chunk-ZL4S7ARC.js.map → chunk-MT4HVDUZ.js.map} +0 -0
  1451. /package/dist/{chunk-G2WADRQ3.js.map → chunk-MY6TPVXW.js.map} +0 -0
  1452. /package/dist/{chunk-OR64ZGRZ.js.map → chunk-NNVTUXEB.js.map} +0 -0
  1453. /package/dist/{chunk-RXTFCYQF.js.map → chunk-P4NEIHUT.js.map} +0 -0
  1454. /package/dist/{chunk-IXEJRKCZ.js.map → chunk-QRNI5JBH.js.map} +0 -0
  1455. /package/dist/{chunk-EEQLFRUM.js.map → chunk-RRF5UOBJ.js.map} +0 -0
  1456. /package/dist/{types-V3FJ26TF.js.map → chunk-SEDEKFYQ.js.map} +0 -0
  1457. /package/dist/{chunk-2LGMW3DJ.js.map → chunk-U3PN77QT.js.map} +0 -0
  1458. /package/dist/{chunk-XMVFHBHT.js.map → chunk-U3WSW6PZ.js.map} +0 -0
  1459. /package/dist/{chunk-N5AKDXAI.js.map → chunk-UWVJF25J.js.map} +0 -0
  1460. /package/dist/{chunk-MARWOCVP.js.map → chunk-XIG5PDM7.js.map} +0 -0
  1461. /package/dist/{chunk-6XA7UN4Z.js.map → chunk-XVZ7B3HG.js.map} +0 -0
  1462. /package/dist/{graph-edge-decay-PWB63GRE.js.map → graph-edge-decay-5DI5GUNL.js.map} +0 -0
@@ -0,0 +1,1179 @@
1
+ import { appendFile, mkdir, readdir, readFile, stat, unlink, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { log } from "./logger.js";
4
+ import type { TranscriptEntry, Checkpoint, PluginConfig } from "./types.js";
5
+ import { analyzeSessionIntegrity, type SessionIntegrityReport } from "./session-integrity.js";
6
+ import {
7
+ encodeStoragePathSegment,
8
+ encodeStoragePathSegmentWithHash,
9
+ isSafeLegacyPathSegment,
10
+ resolveSafeStoragePath,
11
+ storagePathHash,
12
+ } from "./storage-paths.js";
13
+
14
+ type DirectorySessionStatus = "missing" | "empty" | "matches" | "occupied";
15
+ type DirectoryOwnershipCacheEntry = {
16
+ status: "empty" | "matches";
17
+ fileSizes: Map<string, number>;
18
+ };
19
+
20
+ function legacyTranscriptDirFor(
21
+ channelType: string,
22
+ channelId: string,
23
+ encodedDir: string,
24
+ ): string | undefined {
25
+ if (!isSafeLegacyPathSegment(channelType) || !isSafeLegacyPathSegment(channelId)) {
26
+ return undefined;
27
+ }
28
+ const legacyDir = path.join(channelType, channelId);
29
+ return legacyDir === encodedDir ? undefined : legacyDir;
30
+ }
31
+
32
+ /**
33
+ * Manages conversation transcript storage, checkpointing, and recall formatting.
34
+ *
35
+ * Transcripts are stored as JSONL files in a hierarchical structure:
36
+ * transcripts/{channelType}/{channelId}.jsonl
37
+ *
38
+ * Channel types are extracted from sessionKey (discord, slack, cron, main, etc.)
39
+ * Checkpoints are used to preserve conversation context across compaction events.
40
+ */
41
+ export class TranscriptManager {
42
+ private transcriptsDir: string;
43
+ private checkpointPath: string;
44
+ private stateDir: string;
45
+ private toolUsageDir: string;
46
+ private config: PluginConfig;
47
+ private sessionFootprintCache = new Map<
48
+ string,
49
+ { totalBytes: number; fileBytes: Map<string, number>; fileSizes: Map<string, number> }
50
+ >();
51
+ private directoryOwnershipCache = new Map<string, DirectoryOwnershipCacheEntry>();
52
+
53
+ /** Default checkpoint TTL in hours */
54
+ private static readonly DEFAULT_CHECKPOINT_TTL_HOURS = 24;
55
+ /** Approximate characters per token for rough estimation */
56
+ private static readonly CHARS_PER_TOKEN = 4;
57
+
58
+ constructor(config: PluginConfig) {
59
+ this.config = config;
60
+ this.transcriptsDir = path.join(config.memoryDir, "transcripts");
61
+ this.stateDir = path.join(config.memoryDir, "state");
62
+ this.checkpointPath = path.join(this.stateDir, "checkpoint.json");
63
+ this.toolUsageDir = path.join(this.stateDir, "tool-usage");
64
+ }
65
+
66
+ /**
67
+ * Parse a sessionKey to extract channel type and ID.
68
+ *
69
+ * SessionKey patterns:
70
+ * - agent:<agent-id>:main → type="main", id="default"
71
+ * - agent:<agent-id>:discord:channel:<channel-id> → type="discord", id="<channel-id>"
72
+ * - agent:<agent-id>:cron:<job-id> → type="cron", id="<job-id>"
73
+ * - agent:<agent-id>:slack:channel:<channel-id> → type="slack", id="<channel-id>"
74
+ *
75
+ * @returns Object with raw channel identifiers and encoded storage path pieces.
76
+ */
77
+ getTranscriptPath(sessionKey: string): {
78
+ dir: string;
79
+ file: string;
80
+ channelType: string;
81
+ channelId: string;
82
+ alternateDir: string;
83
+ legacyDir?: string;
84
+ } {
85
+ const parts = sessionKey.split(":");
86
+
87
+ // Default fallback
88
+ let channelType = "other";
89
+ let channelId = "default";
90
+
91
+ if (parts.length >= 3) {
92
+ // parts[0] = "agent", parts[1] = agent name, parts[2] = channel type
93
+ channelType = parts[2];
94
+
95
+ // Extract channel ID based on pattern
96
+ if (channelType === "main") {
97
+ channelId = "default";
98
+ } else if (channelType === "discord" && parts.length >= 5 && parts[3] === "channel") {
99
+ channelId = parts[4];
100
+ } else if (channelType === "slack" && parts.length >= 5 && parts[3] === "channel") {
101
+ channelId = parts[4];
102
+ } else if (channelType === "cron" && parts.length >= 4) {
103
+ channelId = parts[3];
104
+ } else if (parts.length >= 4) {
105
+ // For other types, use the 4th part as ID if available
106
+ channelId = parts[3];
107
+ }
108
+ }
109
+
110
+ // Daily rotation: transcripts/{channelType}/{channelId}/YYYY-MM-DD.jsonl
111
+ const today = new Date().toISOString().slice(0, 10);
112
+ const dir = path.join(
113
+ encodeStoragePathSegment(channelType),
114
+ encodeStoragePathSegment(channelId),
115
+ );
116
+ const alternateDir = path.join(
117
+ encodeStoragePathSegmentWithHash(channelType),
118
+ `${encodeStoragePathSegmentWithHash(channelId)}--session-${storagePathHash(sessionKey)}`,
119
+ );
120
+ return {
121
+ dir,
122
+ file: `${today}.jsonl`,
123
+ channelType,
124
+ channelId,
125
+ alternateDir,
126
+ legacyDir: legacyTranscriptDirFor(channelType, channelId, dir),
127
+ };
128
+ }
129
+
130
+ /**
131
+ * Initialize the transcript manager by ensuring directories exist.
132
+ */
133
+ async initialize(): Promise<void> {
134
+ await mkdir(this.transcriptsDir, { recursive: true });
135
+ await mkdir(this.stateDir, { recursive: true });
136
+ await mkdir(this.toolUsageDir, { recursive: true });
137
+ log.info("transcript manager initialized");
138
+ }
139
+
140
+ /**
141
+ * Best-effort list of sessionKeys that have transcript files on disk.
142
+ * This is used by cron-style tooling (hourly summaries, conversation indexing)
143
+ * to iterate across "active" sessions.
144
+ */
145
+ async listSessionKeys(): Promise<string[]> {
146
+ const transcriptDir = this.transcriptsDir;
147
+ const sessionKeys = new Set<string>();
148
+
149
+ try {
150
+ const typeEntries = await readdir(transcriptDir, { withFileTypes: true });
151
+ for (const typeEnt of typeEntries) {
152
+ if (!typeEnt.isDirectory()) continue;
153
+ const typeDir = path.join(transcriptDir, typeEnt.name);
154
+ const idEntries = await readdir(typeDir, { withFileTypes: true });
155
+ for (const idEnt of idEntries) {
156
+ if (!idEnt.isDirectory()) continue;
157
+ const chanDir = path.join(typeDir, idEnt.name);
158
+ const files = (await readdir(chanDir)).filter((f) => f.endsWith(".jsonl")).sort();
159
+ const last = files[files.length - 1];
160
+ if (!last) continue;
161
+ try {
162
+ const raw = await readFile(path.join(chanDir, last), "utf-8");
163
+ const firstLine = raw.split("\n").find((l) => l.trim().length > 0);
164
+ if (!firstLine) continue;
165
+ const entry = JSON.parse(firstLine) as TranscriptEntry;
166
+ if (typeof entry.sessionKey === "string" && entry.sessionKey.length > 0) {
167
+ sessionKeys.add(entry.sessionKey);
168
+ }
169
+ } catch {
170
+ // ignore
171
+ }
172
+ }
173
+ }
174
+ } catch {
175
+ return [];
176
+ }
177
+
178
+ return Array.from(sessionKeys);
179
+ }
180
+
181
+ getToolUsagePath(sessionKey: string): {
182
+ dir: string;
183
+ file: string;
184
+ alternateDir: string;
185
+ legacyDir?: string;
186
+ } {
187
+ const p = this.getTranscriptPath(sessionKey);
188
+ return { dir: p.dir, file: p.file, alternateDir: p.alternateDir, legacyDir: p.legacyDir };
189
+ }
190
+
191
+ private async selectStorageDirForWrite(
192
+ root: string,
193
+ dir: string,
194
+ legacyDir?: string,
195
+ sessionKey?: string,
196
+ alternateDir?: string,
197
+ ): Promise<{ dir: string; channelDir: string }> {
198
+ const channelDir = await resolveSafeStoragePath(root, dir);
199
+ const encodedStatus = await this.directorySessionStatus(root, dir, sessionKey);
200
+ if (encodedStatus === "matches" || encodedStatus === "empty") return { dir, channelDir };
201
+
202
+ if (legacyDir) {
203
+ const legacyChannelDir = await resolveSafeStoragePath(root, legacyDir);
204
+ if ((await this.directorySessionStatus(root, legacyDir, sessionKey)) === "matches") {
205
+ return { dir: legacyDir, channelDir: legacyChannelDir };
206
+ }
207
+ }
208
+
209
+ if (encodedStatus === "missing") return { dir, channelDir };
210
+
211
+ if (alternateDir) {
212
+ const alternateChannelDir = await resolveSafeStoragePath(root, alternateDir);
213
+ const alternateStatus = await this.directorySessionStatus(root, alternateDir, sessionKey);
214
+ if (
215
+ alternateStatus === "missing" ||
216
+ alternateStatus === "empty" ||
217
+ alternateStatus === "matches"
218
+ ) {
219
+ return { dir: alternateDir, channelDir: alternateChannelDir };
220
+ }
221
+ }
222
+
223
+ throw new Error(`transcript storage path collision for session: ${sessionKey ?? "(unknown)"}`);
224
+ }
225
+
226
+ private async directorySessionStatus(
227
+ root: string,
228
+ dir: string,
229
+ sessionKey?: string,
230
+ ): Promise<DirectorySessionStatus> {
231
+ let channelDir: string;
232
+ try {
233
+ channelDir = await resolveSafeStoragePath(root, dir);
234
+ if (!(await stat(channelDir)).isDirectory()) return "occupied";
235
+ } catch (err) {
236
+ const code =
237
+ err && typeof err === "object" && "code" in err
238
+ ? (err as { code?: string }).code
239
+ : undefined;
240
+ if (code === "ENOENT") return "missing";
241
+ throw err;
242
+ }
243
+
244
+ let names: string[];
245
+ try {
246
+ names = (await readdir(channelDir)).filter((file) => file.endsWith(".jsonl"));
247
+ } catch {
248
+ return "occupied";
249
+ }
250
+
251
+ const fileSizes = await this.directoryJsonlFileSizes(root, dir, names);
252
+ if (!fileSizes) return "occupied";
253
+
254
+ if (!sessionKey) return "matches";
255
+ const cacheKey = this.directoryOwnershipCacheKey(root, dir, sessionKey);
256
+ const cached = this.directoryOwnershipCache.get(cacheKey);
257
+ if (cached && this.sameFileSizes(cached.fileSizes, fileSizes)) {
258
+ return cached.status;
259
+ }
260
+
261
+ let hasEntries = false;
262
+ let hasMatchingEntry = false;
263
+
264
+ for (const name of names) {
265
+ const filePath = await resolveSafeStoragePath(root, dir, name).catch(() => null);
266
+ if (filePath === null) return "occupied";
267
+ try {
268
+ const raw = await readFile(filePath, "utf-8");
269
+ for (const line of raw.split("\n")) {
270
+ if (!line.trim()) continue;
271
+ hasEntries = true;
272
+ try {
273
+ const obj = JSON.parse(line) as { sessionKey?: string };
274
+ if (obj.sessionKey === sessionKey) {
275
+ hasMatchingEntry = true;
276
+ } else {
277
+ return "occupied";
278
+ }
279
+ } catch {
280
+ return "occupied";
281
+ }
282
+ }
283
+ } catch {
284
+ return "occupied";
285
+ }
286
+ }
287
+
288
+ const status = hasMatchingEntry ? "matches" : hasEntries ? "occupied" : "empty";
289
+ if (status === "matches" || status === "empty") {
290
+ this.directoryOwnershipCache.set(cacheKey, { status, fileSizes });
291
+ }
292
+ return status;
293
+ }
294
+
295
+ private directoryOwnershipCacheKey(root: string, dir: string, sessionKey: string): string {
296
+ return `${path.resolve(root)}\0${dir}\0${sessionKey}`;
297
+ }
298
+
299
+ private sameFileSizes(left: Map<string, number>, right: Map<string, number>): boolean {
300
+ if (left.size !== right.size) return false;
301
+ for (const [name, size] of left) {
302
+ if (right.get(name) !== size) return false;
303
+ }
304
+ return true;
305
+ }
306
+
307
+ private async directoryJsonlFileSizes(
308
+ root: string,
309
+ dir: string,
310
+ names: string[],
311
+ ): Promise<Map<string, number> | null> {
312
+ const fileSizes = new Map<string, number>();
313
+ for (const name of names) {
314
+ const filePath = await resolveSafeStoragePath(root, dir, name).catch(() => null);
315
+ if (filePath === null) return null;
316
+ const fileInfo = await stat(filePath).catch(() => null);
317
+ if (!fileInfo?.isFile()) return null;
318
+ fileSizes.set(name, Math.max(0, fileInfo.size));
319
+ }
320
+ return fileSizes;
321
+ }
322
+
323
+ private async rememberDirectoryOwnership(
324
+ root: string,
325
+ dir: string,
326
+ sessionKey: string,
327
+ ): Promise<void> {
328
+ try {
329
+ const channelDir = await resolveSafeStoragePath(root, dir);
330
+ const names = (await readdir(channelDir)).filter((file) => file.endsWith(".jsonl"));
331
+ const fileSizes = await this.directoryJsonlFileSizes(root, dir, names);
332
+ if (!fileSizes) return;
333
+ this.directoryOwnershipCache.set(
334
+ this.directoryOwnershipCacheKey(root, dir, sessionKey),
335
+ { status: "matches", fileSizes },
336
+ );
337
+ } catch {
338
+ // Cache refresh is best-effort; write path correctness does not depend on it.
339
+ }
340
+ }
341
+
342
+ private async getSessionStorageFiles(
343
+ root: string,
344
+ dir: string,
345
+ legacyDir?: string,
346
+ alternateDir?: string,
347
+ ): Promise<Array<{ cacheKey: string; name: string; path: string }>> {
348
+ const files: Array<{ cacheKey: string; name: string; path: string }> = [];
349
+ const seenDirs = new Set<string>();
350
+
351
+ for (const candidateDir of [dir, alternateDir, legacyDir]) {
352
+ if (!candidateDir || seenDirs.has(candidateDir)) continue;
353
+ seenDirs.add(candidateDir);
354
+
355
+ let channelDir: string;
356
+ try {
357
+ channelDir = await resolveSafeStoragePath(root, candidateDir);
358
+ } catch {
359
+ continue;
360
+ }
361
+
362
+ let names: string[];
363
+ try {
364
+ names = (await readdir(channelDir)).filter((file) => file.endsWith(".jsonl")).sort();
365
+ } catch {
366
+ continue;
367
+ }
368
+
369
+ for (const name of names) {
370
+ const filePath = await resolveSafeStoragePath(root, candidateDir, name).catch(() => null);
371
+ if (filePath === null) continue;
372
+ files.push({
373
+ cacheKey: path.join(candidateDir, name),
374
+ name,
375
+ path: filePath,
376
+ });
377
+ }
378
+ }
379
+
380
+ return files.sort((a, b) => a.cacheKey.localeCompare(b.cacheKey));
381
+ }
382
+
383
+ async appendToolUse(entry: { timestamp: string; sessionKey: string; tool: string }): Promise<void> {
384
+ const { dir, file, alternateDir, legacyDir } = this.getToolUsagePath(entry.sessionKey);
385
+ const { dir: writeDir, channelDir } = await this.selectStorageDirForWrite(
386
+ this.toolUsageDir,
387
+ dir,
388
+ legacyDir,
389
+ entry.sessionKey,
390
+ alternateDir,
391
+ );
392
+ await mkdir(channelDir, { recursive: true });
393
+ const filePath = await resolveSafeStoragePath(this.toolUsageDir, writeDir, file);
394
+ await appendFile(filePath, JSON.stringify(entry) + "\n", "utf-8");
395
+ await this.rememberDirectoryOwnership(this.toolUsageDir, writeDir, entry.sessionKey);
396
+ }
397
+
398
+ async readToolUse(
399
+ sessionKey: string,
400
+ startTime: Date,
401
+ endTime: Date,
402
+ ): Promise<Array<{ timestamp: string; sessionKey: string; tool: string }>> {
403
+ const { dir, alternateDir, legacyDir } = this.getToolUsagePath(sessionKey);
404
+ try {
405
+ const files = await this.getSessionStorageFiles(this.toolUsageDir, dir, legacyDir, alternateDir);
406
+ const out: Array<{ timestamp: string; sessionKey: string; tool: string }> = [];
407
+ for (const file of files) {
408
+ const raw = await readFile(file.path, "utf-8");
409
+ for (const line of raw.split("\n")) {
410
+ if (!line.trim()) continue;
411
+ try {
412
+ const obj = JSON.parse(line) as any;
413
+ const ts = new Date(String(obj.timestamp ?? "")).getTime();
414
+ if (!Number.isFinite(ts)) continue;
415
+ if (ts >= startTime.getTime() && ts < endTime.getTime()) {
416
+ if (typeof obj.tool === "string" && typeof obj.sessionKey === "string") {
417
+ if (obj.sessionKey === sessionKey) {
418
+ out.push({ timestamp: obj.timestamp, sessionKey: obj.sessionKey, tool: obj.tool });
419
+ }
420
+ }
421
+ }
422
+ } catch {
423
+ // ignore
424
+ }
425
+ }
426
+ }
427
+ return out;
428
+ } catch {
429
+ return [];
430
+ }
431
+ }
432
+
433
+ async estimateSessionFootprint(sessionKey: string): Promise<{ bytes: number; tokens: number }> {
434
+ const { dir, alternateDir, legacyDir } = this.getTranscriptPath(sessionKey);
435
+ let bytes = 0;
436
+
437
+ try {
438
+ const files = await this.getSessionStorageFiles(this.transcriptsDir, dir, legacyDir, alternateDir);
439
+ const cached = this.sessionFootprintCache.get(sessionKey);
440
+ if (!cached) {
441
+ const fileBytes = new Map<string, number>();
442
+ const fileSizes = new Map<string, number>();
443
+ for (const file of files) {
444
+ try {
445
+ const fileInfo = await stat(file.path);
446
+ const sessionBytes = await this.estimateSessionBytesInFile(
447
+ file.path,
448
+ sessionKey,
449
+ );
450
+ fileBytes.set(file.cacheKey, sessionBytes);
451
+ fileSizes.set(file.cacheKey, Math.max(0, fileInfo.size));
452
+ bytes += sessionBytes;
453
+ } catch {
454
+ // fail-open
455
+ }
456
+ }
457
+ this.sessionFootprintCache.set(sessionKey, { totalBytes: bytes, fileBytes, fileSizes });
458
+ } else {
459
+ bytes = cached.totalBytes;
460
+ const seen = new Set(files.map((file) => file.cacheKey));
461
+
462
+ // Drop removed files from the cached total.
463
+ for (const [cachedFile, cachedSessionBytes] of cached.fileBytes.entries()) {
464
+ if (!seen.has(cachedFile)) {
465
+ bytes -= cachedSessionBytes;
466
+ cached.fileBytes.delete(cachedFile);
467
+ cached.fileSizes.delete(cachedFile);
468
+ }
469
+ }
470
+
471
+ // Read only newly discovered files.
472
+ for (const file of files) {
473
+ if (cached.fileBytes.has(file.cacheKey)) continue;
474
+ try {
475
+ const fileInfo = await stat(file.path);
476
+ const sessionBytes = await this.estimateSessionBytesInFile(file.path, sessionKey);
477
+ cached.fileBytes.set(file.cacheKey, sessionBytes);
478
+ cached.fileSizes.set(file.cacheKey, Math.max(0, fileInfo.size));
479
+ bytes += sessionBytes;
480
+ } catch {
481
+ // fail-open
482
+ }
483
+ }
484
+
485
+ // Recompute any shard whose file size changed. A session can have both
486
+ // encoded and legacy directories during migration, so path ordering does
487
+ // not reliably identify the file that can grow.
488
+ for (const file of files) {
489
+ try {
490
+ const fileInfo = await stat(file.path);
491
+ const size = Math.max(0, fileInfo.size);
492
+ const previousSessionBytes = cached.fileBytes.get(file.cacheKey) ?? 0;
493
+ const previousSize = cached.fileSizes.get(file.cacheKey) ?? -1;
494
+ if (size !== previousSize) {
495
+ const sessionBytes = await this.estimateSessionBytesInFile(file.path, sessionKey);
496
+ cached.fileBytes.set(file.cacheKey, sessionBytes);
497
+ cached.fileSizes.set(file.cacheKey, size);
498
+ bytes += sessionBytes - previousSessionBytes;
499
+ }
500
+ } catch {
501
+ // fail-open
502
+ }
503
+ }
504
+
505
+ if (bytes < 0) bytes = 0;
506
+ cached.totalBytes = bytes;
507
+ }
508
+ } catch {
509
+ // fail-open
510
+ this.sessionFootprintCache.delete(sessionKey);
511
+ }
512
+
513
+ return {
514
+ bytes,
515
+ tokens: Math.floor(bytes / TranscriptManager.CHARS_PER_TOKEN),
516
+ };
517
+ }
518
+
519
+ private async estimateSessionBytesInFile(filePath: string, sessionKey: string): Promise<number> {
520
+ try {
521
+ const raw = await readFile(filePath, "utf-8");
522
+ let total = 0;
523
+ for (const line of raw.split("\n")) {
524
+ if (!line.trim()) continue;
525
+ try {
526
+ const parsed = JSON.parse(line) as { sessionKey?: string };
527
+ if (parsed.sessionKey === sessionKey) {
528
+ total += Buffer.byteLength(`${line}\n`, "utf-8");
529
+ }
530
+ } catch {
531
+ // fail-open for malformed lines
532
+ }
533
+ }
534
+ return total;
535
+ } catch {
536
+ return 0;
537
+ }
538
+ }
539
+
540
+ /**
541
+ * Check if a file is a legacy flat transcript file (YYYY-MM-DD.jsonl format).
542
+ */
543
+ private isLegacyTranscriptFile(filename: string): boolean {
544
+ return /^\d{4}-\d{2}-\d{2}\.jsonl$/.test(filename);
545
+ }
546
+
547
+ /**
548
+ * Append a turn to the appropriate transcript file.
549
+ * Files are stored hierarchically: transcripts/{channelType}/{channelId}.jsonl
550
+ *
551
+ * Skips channel types in config.transcriptSkipChannelTypes (e.g., "cron").
552
+ */
553
+ async append(entry: TranscriptEntry): Promise<void> {
554
+ try {
555
+ const { dir, file, channelType, alternateDir, legacyDir } = this.getTranscriptPath(entry.sessionKey);
556
+
557
+ // Skip if this channel type is in the skip list
558
+ if (this.config.transcriptSkipChannelTypes.includes(channelType)) {
559
+ return;
560
+ }
561
+
562
+ const { dir: writeDir, channelDir } = await this.selectStorageDirForWrite(
563
+ this.transcriptsDir,
564
+ dir,
565
+ legacyDir,
566
+ entry.sessionKey,
567
+ alternateDir,
568
+ );
569
+ const filePath = await resolveSafeStoragePath(this.transcriptsDir, writeDir, file);
570
+
571
+ // Ensure channel directory exists
572
+ await mkdir(channelDir, { recursive: true });
573
+
574
+ const line = JSON.stringify(entry) + "\n";
575
+ await appendFile(filePath, line, "utf-8");
576
+ await this.rememberDirectoryOwnership(this.transcriptsDir, writeDir, entry.sessionKey);
577
+ log.debug(`appended transcript entry for ${entry.sessionKey}: ${entry.turnId}`);
578
+ } catch (err) {
579
+ log.error("failed to append transcript entry:", err);
580
+ throw err;
581
+ }
582
+ }
583
+
584
+ /**
585
+ * Get all transcript files from the hierarchical directory structure.
586
+ * Recursively finds all .jsonl files in transcripts/{channelType}/{channelId}/ subdirectories.
587
+ */
588
+ private async getAllTranscriptFiles(): Promise<string[]> {
589
+ const files: string[] = [];
590
+
591
+ try {
592
+ const entries = await readdir(this.transcriptsDir, { withFileTypes: true });
593
+
594
+ for (const entry of entries) {
595
+ if (entry.isDirectory()) {
596
+ // This is a channel type directory (discord, slack, cron, main, etc.)
597
+ const channelTypeDir = path.join(this.transcriptsDir, entry.name);
598
+ try {
599
+ const channelTypeEntries = await readdir(channelTypeDir, { withFileTypes: true });
600
+
601
+ for (const channelTypeEntry of channelTypeEntries) {
602
+ if (channelTypeEntry.isDirectory()) {
603
+ // This is a channel ID directory - contains daily transcript files
604
+ const channelDir = path.join(channelTypeDir, channelTypeEntry.name);
605
+ try {
606
+ const channelFiles = await readdir(channelDir);
607
+ for (const file of channelFiles) {
608
+ if (file.endsWith(".jsonl")) {
609
+ files.push(path.join(entry.name, channelTypeEntry.name, file));
610
+ }
611
+ }
612
+ } catch {
613
+ // Skip unreadable directories
614
+ }
615
+ } else if (channelTypeEntry.isFile() && channelTypeEntry.name.endsWith(".jsonl")) {
616
+ // Legacy: channel type dir contains .jsonl files directly
617
+ files.push(path.join(entry.name, channelTypeEntry.name));
618
+ }
619
+ }
620
+ } catch {
621
+ // Skip unreadable directories
622
+ }
623
+ } else if (entry.isFile() && entry.name.endsWith(".jsonl")) {
624
+ // Legacy flat file - still include for backward compatibility
625
+ files.push(entry.name);
626
+ }
627
+ }
628
+ } catch {
629
+ // Directory doesn't exist or is unreadable
630
+ }
631
+
632
+ return files;
633
+ }
634
+
635
+ /**
636
+ * Read transcript entries for a date range.
637
+ * Returns entries within the time range, optionally filtered by sessionKey.
638
+ * Reads from all channel subdirectories in the hierarchical structure.
639
+ */
640
+ async readRange(startTime: string, endTime: string, sessionKey?: string): Promise<TranscriptEntry[]> {
641
+ const start = new Date(startTime);
642
+ const end = new Date(endTime);
643
+ const entries: TranscriptEntry[] = [];
644
+
645
+ try {
646
+ // Get all transcript files from the hierarchical structure
647
+ const transcriptFiles = await this.getAllTranscriptFiles();
648
+
649
+ // Read each relevant file
650
+ for (const relativePath of transcriptFiles) {
651
+ const filePath = path.join(this.transcriptsDir, relativePath);
652
+ try {
653
+ const content = await readFile(filePath, "utf-8");
654
+ const lines = content.trim().split("\n").filter(Boolean);
655
+
656
+ for (const line of lines) {
657
+ try {
658
+ const entry = JSON.parse(line) as TranscriptEntry;
659
+ const entryTime = new Date(entry.timestamp);
660
+
661
+ // Check if entry is within time range
662
+ if (entryTime >= start && entryTime <= end) {
663
+ // Filter by sessionKey if provided
664
+ if (!sessionKey || entry.sessionKey === sessionKey) {
665
+ entries.push(entry);
666
+ }
667
+ }
668
+ } catch {
669
+ // Skip malformed lines
670
+ log.debug(`skipped malformed transcript line in ${relativePath}`);
671
+ }
672
+ }
673
+ } catch {
674
+ // File doesn't exist or is unreadable - skip
675
+ }
676
+ }
677
+
678
+ // Sort by timestamp
679
+ entries.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
680
+
681
+ log.debug(`read ${entries.length} transcript entries from ${transcriptFiles.length} file(s)`);
682
+ return entries;
683
+ } catch (err) {
684
+ log.error("failed to read transcript range:", err);
685
+ return [];
686
+ }
687
+ }
688
+
689
+ /**
690
+ * Read the last N hours of transcript.
691
+ *
692
+ * Fast path: when sessionKey is given, reads only the 1-2 daily files for that
693
+ * specific channel instead of scanning all 95+ transcript files across all channels.
694
+ */
695
+ async readRecent(hours: number, sessionKey?: string): Promise<TranscriptEntry[]> {
696
+ const end = new Date();
697
+ const start = new Date(end.getTime() - hours * 60 * 60 * 1000);
698
+
699
+ if (sessionKey) {
700
+ return this.readRecentForSession(start, end, sessionKey);
701
+ }
702
+ return this.readRange(start.toISOString(), end.toISOString(), undefined);
703
+ }
704
+
705
+ /**
706
+ * Optimized read for a specific session: only looks in that session's channel
707
+ * directory and only reads files whose date falls within the lookback window.
708
+ */
709
+ private async readRecentForSession(
710
+ start: Date,
711
+ end: Date,
712
+ sessionKey: string,
713
+ ): Promise<TranscriptEntry[]> {
714
+ const { dir, alternateDir, legacyDir } = this.getTranscriptPath(sessionKey);
715
+
716
+ // Build set of date strings that overlap with [start, end].
717
+ // Always include end's date to handle midnight-crossing lookbacks
718
+ // (e.g. start=23:30 yesterday, end=00:30 today).
719
+ const dateStrings = new Set<string>();
720
+ const cursor = new Date(start);
721
+ while (cursor <= end) {
722
+ dateStrings.add(cursor.toISOString().slice(0, 10));
723
+ cursor.setDate(cursor.getDate() + 1);
724
+ }
725
+ dateStrings.add(end.toISOString().slice(0, 10));
726
+
727
+ const entries: TranscriptEntry[] = [];
728
+ const files = await this.getSessionStorageFiles(this.transcriptsDir, dir, legacyDir, alternateDir);
729
+
730
+ for (const file of files) {
731
+ // Only read files whose date is within the window
732
+ const dateStr = file.name.slice(0, 10);
733
+ if (!dateStrings.has(dateStr)) continue;
734
+
735
+ try {
736
+ const content = await readFile(file.path, "utf-8");
737
+ for (const line of content.split("\n")) {
738
+ if (!line.trim()) continue;
739
+ try {
740
+ const entry = JSON.parse(line) as TranscriptEntry;
741
+ const ts = new Date(entry.timestamp);
742
+ if (ts >= start && ts <= end && entry.sessionKey === sessionKey) {
743
+ entries.push(entry);
744
+ }
745
+ } catch {
746
+ // skip malformed line
747
+ }
748
+ }
749
+ } catch {
750
+ // skip unreadable file
751
+ }
752
+ }
753
+
754
+ entries.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
755
+ log.debug(`readRecentForSession: ${entries.length} entries from ${files.length} file(s) in ${dir}`);
756
+ return entries;
757
+ }
758
+
759
+ /**
760
+ * Cleanup old transcript entries that are older than retentionDays.
761
+ * For hierarchical structure, reads each file and rewrites without old entries.
762
+ * Legacy flat files are deleted if their date is older than retentionDays.
763
+ * Returns the number of files processed (cleaned or deleted).
764
+ */
765
+ async cleanup(retentionDays: number): Promise<number> {
766
+ if (retentionDays <= 0) {
767
+ log.warn("cleanup called with invalid retentionDays:", retentionDays);
768
+ return 0;
769
+ }
770
+
771
+ const cutoff = new Date();
772
+ cutoff.setDate(cutoff.getDate() - retentionDays);
773
+ cutoff.setHours(0, 0, 0, 0);
774
+
775
+ let processed = 0;
776
+
777
+ try {
778
+ const entries = await readdir(this.transcriptsDir, { withFileTypes: true });
779
+
780
+ for (const entry of entries) {
781
+ if (entry.isDirectory()) {
782
+ // This is a channel type directory (discord, slack, cron, main, etc.)
783
+ const channelTypeDir = path.join(this.transcriptsDir, entry.name);
784
+ try {
785
+ const channelTypeEntries = await readdir(channelTypeDir, { withFileTypes: true });
786
+
787
+ for (const channelTypeEntry of channelTypeEntries) {
788
+ if (channelTypeEntry.isDirectory()) {
789
+ // This is a channel ID directory - contains daily transcript files
790
+ const channelDir = path.join(channelTypeDir, channelTypeEntry.name);
791
+ try {
792
+ const channelFiles = await readdir(channelDir);
793
+ for (const file of channelFiles) {
794
+ if (!file.endsWith(".jsonl")) continue;
795
+
796
+ const filePath = path.join(channelDir, file);
797
+
798
+ // Check if file is a daily transcript file (YYYY-MM-DD.jsonl)
799
+ if (this.isLegacyTranscriptFile(file)) {
800
+ const dateStr = file.slice(0, 10);
801
+ const fileDate = new Date(dateStr);
802
+
803
+ if (!isNaN(fileDate.getTime()) && fileDate < cutoff) {
804
+ try {
805
+ await unlink(filePath);
806
+ processed++;
807
+ log.debug(`deleted old daily transcript file: ${entry.name}/${channelTypeEntry.name}/${file}`);
808
+ } catch (err) {
809
+ log.error(`failed to delete transcript file ${filePath}:`, err);
810
+ }
811
+ }
812
+ } else {
813
+ // Legacy file in new structure - clean up old entries
814
+ const cleaned = await this.cleanupTranscriptFile(filePath, cutoff);
815
+ if (cleaned) {
816
+ processed++;
817
+ }
818
+ }
819
+ }
820
+ } catch (err) {
821
+ log.debug(`failed to process channel directory ${entry.name}/${channelTypeEntry.name}:`, err);
822
+ }
823
+ } else if (channelTypeEntry.isFile() && channelTypeEntry.name.endsWith(".jsonl")) {
824
+ // Legacy: channel type dir contains .jsonl files directly
825
+ const filePath = path.join(channelTypeDir, channelTypeEntry.name);
826
+ const cleaned = await this.cleanupTranscriptFile(filePath, cutoff);
827
+ if (cleaned) {
828
+ processed++;
829
+ }
830
+ }
831
+ }
832
+ } catch (err) {
833
+ log.debug(`failed to process channel type directory ${entry.name}:`, err);
834
+ }
835
+ } else if (entry.isFile() && entry.name.endsWith(".jsonl")) {
836
+ // Handle legacy flat files - delete if older than retentionDays
837
+ if (this.isLegacyTranscriptFile(entry.name)) {
838
+ const dateStr = entry.name.slice(0, 10);
839
+ const fileDate = new Date(dateStr);
840
+
841
+ if (!isNaN(fileDate.getTime()) && fileDate < cutoff) {
842
+ const filePath = path.join(this.transcriptsDir, entry.name);
843
+ try {
844
+ await unlink(filePath);
845
+ processed++;
846
+ log.debug(`deleted old legacy transcript file: ${entry.name}`);
847
+ } catch (err) {
848
+ log.error(`failed to delete legacy transcript file ${entry.name}:`, err);
849
+ }
850
+ }
851
+ }
852
+ }
853
+ }
854
+
855
+ if (processed > 0) {
856
+ log.info(`cleaned up ${processed} transcript file(s) older than ${retentionDays} days`);
857
+ }
858
+
859
+ return processed;
860
+ } catch (err) {
861
+ log.error("failed to cleanup old transcripts:", err);
862
+ return 0;
863
+ }
864
+ }
865
+
866
+ /**
867
+ * Clean up old entries from a single transcript file.
868
+ * Reads the file, filters out entries older than cutoff, and rewrites if needed.
869
+ * Returns true if the file was processed (cleaned or deleted).
870
+ */
871
+ private async cleanupTranscriptFile(filePath: string, cutoff: Date): Promise<boolean> {
872
+ try {
873
+ const content = await readFile(filePath, "utf-8");
874
+ const lines = content.trim().split("\n").filter(Boolean);
875
+
876
+ const validLines: string[] = [];
877
+ let hasOldEntries = false;
878
+
879
+ for (const line of lines) {
880
+ try {
881
+ const entry = JSON.parse(line) as TranscriptEntry;
882
+ const entryTime = new Date(entry.timestamp);
883
+
884
+ if (entryTime >= cutoff) {
885
+ validLines.push(line);
886
+ } else {
887
+ hasOldEntries = true;
888
+ }
889
+ } catch {
890
+ // Keep malformed lines to avoid data loss
891
+ validLines.push(line);
892
+ }
893
+ }
894
+
895
+ if (validLines.length === 0) {
896
+ // No valid entries left, delete the file
897
+ try {
898
+ await unlink(filePath);
899
+ log.debug(`deleted empty transcript file: ${filePath}`);
900
+ return true;
901
+ } catch (err) {
902
+ log.error(`failed to delete empty transcript file ${filePath}:`, err);
903
+ return false;
904
+ }
905
+ }
906
+
907
+ if (hasOldEntries) {
908
+ // Rewrite file without old entries
909
+ await writeFile(filePath, validLines.join("\n") + "\n", "utf-8");
910
+ log.debug(`cleaned old entries from transcript file: ${filePath}`);
911
+ return true;
912
+ }
913
+
914
+ // No old entries found, no action needed
915
+ return false;
916
+ } catch (err) {
917
+ // File doesn't exist or is unreadable
918
+ return false;
919
+ }
920
+ }
921
+
922
+ /**
923
+ * Save a checkpoint to preserve conversation context.
924
+ * Called when compaction is detected.
925
+ */
926
+ async saveCheckpoint(checkpoint: Checkpoint): Promise<void> {
927
+ try {
928
+ await writeFile(this.checkpointPath, JSON.stringify(checkpoint, null, 2), "utf-8");
929
+ log.info(`saved checkpoint for session ${checkpoint.sessionKey} with ${checkpoint.turns.length} turn(s)`);
930
+ } catch (err) {
931
+ log.error("failed to save checkpoint:", err);
932
+ throw err;
933
+ }
934
+ }
935
+
936
+ /**
937
+ * Load a checkpoint if one exists and is not expired.
938
+ * Returns null if no checkpoint exists or if it has expired.
939
+ */
940
+ async loadCheckpoint(sessionKey?: string): Promise<Checkpoint | null> {
941
+ try {
942
+ const raw = await readFile(this.checkpointPath, "utf-8");
943
+ const checkpoint = JSON.parse(raw) as Checkpoint;
944
+
945
+ // Validate checkpoint structure
946
+ if (!checkpoint.sessionKey || !checkpoint.capturedAt || !checkpoint.ttl || !Array.isArray(checkpoint.turns)) {
947
+ log.warn("checkpoint file has invalid structure");
948
+ return null;
949
+ }
950
+
951
+ // Check if checkpoint is for the requested session (if specified)
952
+ if (sessionKey && checkpoint.sessionKey !== sessionKey) {
953
+ log.debug(`checkpoint session mismatch: ${checkpoint.sessionKey} vs ${sessionKey}`);
954
+ return null;
955
+ }
956
+
957
+ // Check if checkpoint has expired
958
+ const ttl = new Date(checkpoint.ttl);
959
+ if (isNaN(ttl.getTime())) {
960
+ log.warn("checkpoint has invalid TTL format");
961
+ return null;
962
+ }
963
+
964
+ if (ttl < new Date()) {
965
+ log.info(`checkpoint expired at ${checkpoint.ttl}`);
966
+ return null;
967
+ }
968
+
969
+ log.info(`loaded checkpoint with ${checkpoint.turns.length} turn(s), expires at ${checkpoint.ttl}`);
970
+ return checkpoint;
971
+ } catch (err) {
972
+ // File doesn't exist or is unreadable - that's fine
973
+ log.debug("no valid checkpoint found");
974
+ return null;
975
+ }
976
+ }
977
+
978
+ /**
979
+ * Clear (delete) the checkpoint file.
980
+ * Called after successful injection of checkpoint context.
981
+ */
982
+ async clearCheckpoint(): Promise<void> {
983
+ try {
984
+ await unlink(this.checkpointPath);
985
+ log.info("cleared checkpoint");
986
+ } catch (err) {
987
+ // File doesn't exist - that's fine
988
+ log.debug("no checkpoint to clear");
989
+ }
990
+ }
991
+
992
+ /**
993
+ * Format entries for recall injection.
994
+ * Returns a formatted string suitable for injecting into agent context.
995
+ *
996
+ * Format:
997
+ * ## Recent Conversation (last X hours)
998
+ * [10:32] User: message content
999
+ * [10:33] Assistant: response content
1000
+ *
1001
+ * Content is trimmed to approximately maxTokens.
1002
+ */
1003
+ formatForRecall(entries: TranscriptEntry[], maxTokens: number): string {
1004
+ if (entries.length === 0) {
1005
+ return "";
1006
+ }
1007
+
1008
+ const maxChars = maxTokens * TranscriptManager.CHARS_PER_TOKEN;
1009
+ const lines: string[] = [];
1010
+
1011
+ // Calculate time range for header
1012
+ const firstEntry = new Date(entries[0].timestamp);
1013
+ const lastEntry = new Date(entries[entries.length - 1].timestamp);
1014
+ const hoursDiff = Math.round((lastEntry.getTime() - firstEntry.getTime()) / (60 * 60 * 1000));
1015
+
1016
+ // Add header
1017
+ if (hoursDiff < 1) {
1018
+ lines.push("## Recent Conversation (last few minutes)");
1019
+ } else {
1020
+ lines.push(`## Recent Conversation (last ${hoursDiff} hour${hoursDiff === 1 ? "" : "s"})`);
1021
+ }
1022
+ lines.push("");
1023
+
1024
+ // Format each entry
1025
+ const formattedEntries: string[] = [];
1026
+ for (const entry of entries) {
1027
+ const time = new Date(entry.timestamp);
1028
+ const timeStr = time.toLocaleTimeString("en-US", {
1029
+ hour: "2-digit",
1030
+ minute: "2-digit",
1031
+ hour12: false,
1032
+ });
1033
+ const roleLabel = entry.role === "user" ? "User" : "Assistant";
1034
+ formattedEntries.push(`[${timeStr}] ${roleLabel}: ${entry.content}`);
1035
+ }
1036
+
1037
+ // Build output, trimming from the beginning if too long
1038
+ // (we want to keep the most recent context)
1039
+ let totalChars = lines.join("\n").length;
1040
+ const selectedEntries: string[] = [];
1041
+
1042
+ for (let i = formattedEntries.length - 1; i >= 0; i--) {
1043
+ const entry = formattedEntries[i];
1044
+ const entryChars = entry.length + 1; // +1 for newline
1045
+
1046
+ if (totalChars + entryChars > maxChars && selectedEntries.length > 0) {
1047
+ // Adding this entry would exceed limit, and we have some entries already
1048
+ break;
1049
+ }
1050
+
1051
+ selectedEntries.unshift(entry);
1052
+ totalChars += entryChars;
1053
+ }
1054
+
1055
+ lines.push(...selectedEntries);
1056
+ lines.push(""); // Trailing newline
1057
+
1058
+ const result = lines.join("\n");
1059
+ log.debug(`formatted ${selectedEntries.length}/${entries.length} transcript entries for recall (~${result.length} chars)`);
1060
+
1061
+ return result;
1062
+ }
1063
+
1064
+ /**
1065
+ * Create a checkpoint from the current buffer state.
1066
+ * Helper method for creating checkpoints before compaction.
1067
+ */
1068
+ createCheckpoint(sessionKey: string, turns: TranscriptEntry[], ttlHours?: number): Checkpoint {
1069
+ const ttl = ttlHours ?? TranscriptManager.DEFAULT_CHECKPOINT_TTL_HOURS;
1070
+ const expiresAt = new Date();
1071
+ expiresAt.setHours(expiresAt.getHours() + ttl);
1072
+
1073
+ return {
1074
+ sessionKey,
1075
+ capturedAt: new Date().toISOString(),
1076
+ turns: [...turns], // Copy turns to avoid mutation
1077
+ ttl: expiresAt.toISOString(),
1078
+ };
1079
+ }
1080
+
1081
+ /**
1082
+ * Get statistics about stored transcripts.
1083
+ * Returns counts from the hierarchical directory structure.
1084
+ */
1085
+ async getStats(): Promise<{
1086
+ totalFiles: number;
1087
+ totalEntries: number;
1088
+ oldestFile: string | null;
1089
+ newestFile: string | null;
1090
+ channelTypes: Record<string, number>;
1091
+ }> {
1092
+ try {
1093
+ const allFiles = await this.getAllTranscriptFiles();
1094
+
1095
+ if (allFiles.length === 0) {
1096
+ return {
1097
+ totalFiles: 0,
1098
+ totalEntries: 0,
1099
+ oldestFile: null,
1100
+ newestFile: null,
1101
+ channelTypes: {},
1102
+ };
1103
+ }
1104
+
1105
+ // Sort files by path
1106
+ const sortedFiles = allFiles.sort();
1107
+
1108
+ let totalEntries = 0;
1109
+ const channelTypes: Record<string, number> = {};
1110
+
1111
+ for (const relativePath of allFiles) {
1112
+ const filePath = path.join(this.transcriptsDir, relativePath);
1113
+ try {
1114
+ const content = await readFile(filePath, "utf-8");
1115
+ const lines = content.trim().split("\n").filter(Boolean);
1116
+ totalEntries += lines.length;
1117
+
1118
+ // Count by channel type (first directory in path)
1119
+ const channelType = relativePath.includes(path.sep)
1120
+ ? relativePath.split(path.sep)[0]
1121
+ : "legacy";
1122
+ channelTypes[channelType] = (channelTypes[channelType] || 0) + 1;
1123
+ } catch {
1124
+ // Skip unreadable files
1125
+ }
1126
+ }
1127
+
1128
+ return {
1129
+ totalFiles: allFiles.length,
1130
+ totalEntries,
1131
+ oldestFile: sortedFiles[0],
1132
+ newestFile: sortedFiles[sortedFiles.length - 1],
1133
+ channelTypes,
1134
+ };
1135
+ } catch (err) {
1136
+ log.error("failed to get transcript stats:", err);
1137
+ return {
1138
+ totalFiles: 0,
1139
+ totalEntries: 0,
1140
+ oldestFile: null,
1141
+ newestFile: null,
1142
+ channelTypes: {},
1143
+ };
1144
+ }
1145
+ }
1146
+
1147
+ async analyzeIntegrity(): Promise<SessionIntegrityReport> {
1148
+ return analyzeSessionIntegrity({ memoryDir: this.config.memoryDir });
1149
+ }
1150
+
1151
+ async getRecoverySummary(sessionKey?: string): Promise<{
1152
+ generatedAt: string;
1153
+ sessionKey?: string;
1154
+ healthy: boolean;
1155
+ issueCount: number;
1156
+ incompleteTurns: number;
1157
+ brokenChains: number;
1158
+ checkpointHealthy: boolean;
1159
+ }> {
1160
+ const report = await this.analyzeIntegrity();
1161
+ const selectedSessions = sessionKey
1162
+ ? report.sessions.filter((session) => session.sessionKey === sessionKey)
1163
+ : report.sessions;
1164
+ const incompleteTurns = selectedSessions.reduce((sum, session) => sum + session.incompleteTurns, 0);
1165
+ const brokenChains = selectedSessions.reduce((sum, session) => sum + session.brokenChains, 0);
1166
+ const filteredIssues = report.issues.filter((issue) => !sessionKey || issue.sessionKey === sessionKey);
1167
+ const issueCount = filteredIssues.length;
1168
+ const severeIssueCount = filteredIssues.filter((issue) => issue.severity !== "info").length;
1169
+ return {
1170
+ generatedAt: report.generatedAt,
1171
+ sessionKey,
1172
+ healthy: sessionKey ? severeIssueCount === 0 && report.checkpoint.healthy : report.healthy,
1173
+ issueCount,
1174
+ incompleteTurns,
1175
+ brokenChains,
1176
+ checkpointHealthy: report.checkpoint.healthy,
1177
+ };
1178
+ }
1179
+ }