@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,983 @@
1
+ /**
2
+ * codex-materialize.ts — Codex CLI native memory artifact materialization (#378)
3
+ *
4
+ * Periodically writes Remnic memories into the file layout that Codex CLI's
5
+ * phase-2 consolidation reads directly under `<codex_home>/memories/`:
6
+ *
7
+ * memory_summary.md — always-loaded at session start (tight budget)
8
+ * MEMORY.md — searchable handbook (task-group schema)
9
+ * raw_memories.md — mechanical merge of raw memories, latest first
10
+ * rollout_summaries/<slug>.md — per-session recaps
11
+ *
12
+ * Codex's own read path is agnostic to which producer wrote these files — it
13
+ * tags reads by `memory_md` / `memory_summary` / `raw_memories` /
14
+ * `rollout_summaries` / `skills`. By materializing Remnic content into this
15
+ * exact layout we let Codex pick up Remnic memories without a single MCP call.
16
+ *
17
+ * Safety invariants
18
+ * ─────────────────
19
+ * - **Atomic writes.** Every file is rendered under `.remnic-tmp/` and then
20
+ * `rename()`d into place so Codex never observes a half-written file.
21
+ * - **Sentinel-based opt-in.** If `<codex_home>/memories/.remnic-managed` is
22
+ * missing, we SKIP materialization entirely and log a warning. This honors
23
+ * user hand-edits to the directory — a user who manually curated their
24
+ * Codex memory layout will never have those edits overwritten.
25
+ * - **Schema validation.** `MEMORY.md` content is validated against the
26
+ * task-group schema before write. Invalid content throws and nothing is
27
+ * written.
28
+ * - **Idempotent no-ops.** A content hash is written into the sentinel. If
29
+ * the re-rendered hash matches the previous run, we skip writes entirely.
30
+ * - **Token budget.** `memory_summary.md` is truncated to fit under the
31
+ * configured token budget (whitespace-tokenized approximation), leaving
32
+ * headroom under Codex's 5000-token summary cap.
33
+ *
34
+ * Privacy
35
+ * ───────
36
+ * This module does not persist any user content outside `<codex_home>/memories`
37
+ * — it only mirrors the memories that Remnic already wrote. It does not log
38
+ * memory content to stdout; it logs file names, counts, and hashes.
39
+ */
40
+
41
+ import {
42
+ createHash,
43
+ } from "node:crypto";
44
+ import fs from "node:fs";
45
+ import path from "node:path";
46
+
47
+ import { log } from "../logger.js";
48
+ import { readEnvVar, resolveHomeDir } from "../runtime/env.js";
49
+ import type { MemoryFile } from "../types.js";
50
+
51
+ // ─── Types ─────────────────────────────────────────────────────────────────
52
+
53
+ /**
54
+ * Input for {@link materializeForNamespace}. Prefer passing pre-loaded
55
+ * `memories` so this module stays I/O-agnostic and trivially testable.
56
+ */
57
+ export interface MaterializeOptions {
58
+ /** Pre-loaded Remnic memories for this namespace (required). */
59
+ memories: MemoryFile[];
60
+ /** Override `<codex_home>`. Defaults to `$CODEX_HOME` or `~/.codex`. */
61
+ codexHome?: string;
62
+ /** Maximum whitespace-tokenized size of memory_summary.md. Default 4500. */
63
+ maxSummaryTokens?: number;
64
+ /** Maximum age of rollout_summaries/*.md in days. Default 30. */
65
+ rolloutRetentionDays?: number;
66
+ /** Per-session rollout summaries to render. */
67
+ rolloutSummaries?: RolloutSummaryInput[];
68
+ /** Current time, injected for deterministic tests. */
69
+ now?: Date;
70
+ /** Optional logger override for tests. */
71
+ logger?: { info: (msg: string) => void; warn: (msg: string) => void; debug?: (msg: string) => void };
72
+ }
73
+
74
+ /** Input describing one Codex rollout summary file. */
75
+ export interface RolloutSummaryInput {
76
+ /** Stable slug for the file (becomes `<slug>.md`). */
77
+ slug: string;
78
+ /** Working directory used during the rollout. */
79
+ cwd?: string;
80
+ /** Path to the raw Codex rollout log, if known. */
81
+ rolloutPath?: string;
82
+ /** ISO-8601 timestamp of the last update. */
83
+ updatedAt?: string;
84
+ /** Opaque thread / session id. */
85
+ threadId?: string;
86
+ /** Markdown body for the recap. */
87
+ body: string;
88
+ /** Freeform keywords / search hints. */
89
+ keywords?: string[];
90
+ }
91
+
92
+ /** Result of a materialization run. */
93
+ export interface MaterializeResult {
94
+ /** Namespace that was materialized. */
95
+ namespace: string;
96
+ /** `<codex_home>/memories` path this run targeted. */
97
+ memoriesDir: string;
98
+ /** Was anything actually written (vs. skipped / idempotent no-op)? */
99
+ wrote: boolean;
100
+ /** True if the sentinel was missing and we skipped with a warning. */
101
+ skippedNoSentinel: boolean;
102
+ /** True if the hash matched the previous run and we short-circuited. */
103
+ skippedIdempotent: boolean;
104
+ /** Files that were written this run (relative to `memoriesDir`). */
105
+ filesWritten: string[];
106
+ /** Content hash computed for this run. */
107
+ contentHash: string;
108
+ }
109
+
110
+ /** On-disk shape of the `.remnic-managed` sentinel. */
111
+ interface SentinelFile {
112
+ version: number;
113
+ namespace: string;
114
+ updated_at: string;
115
+ content_hash: string;
116
+ }
117
+
118
+ // ─── Constants ─────────────────────────────────────────────────────────────
119
+
120
+ /** Bump when the on-disk layout or semantics change. */
121
+ export const MATERIALIZE_VERSION = 1;
122
+
123
+ /** Sentinel file name at the root of the materialized memories dir. */
124
+ export const SENTINEL_FILE = ".remnic-managed";
125
+
126
+ /** Scratch directory used for atomic renames. */
127
+ export const TMP_DIR = ".remnic-tmp";
128
+
129
+ /** File names we own. Anything else in the directory is considered user-managed. */
130
+ const OWNED_FILES = new Set<string>([
131
+ "memory_summary.md",
132
+ "MEMORY.md",
133
+ "raw_memories.md",
134
+ ]);
135
+
136
+ /** Sub-directory for per-session rollout recaps. */
137
+ const ROLLOUT_SUBDIR = "rollout_summaries";
138
+
139
+ // ─── Public entry points ───────────────────────────────────────────────────
140
+
141
+ /**
142
+ * Materialize a Remnic namespace into Codex's native memory layout.
143
+ *
144
+ * Returns a {@link MaterializeResult} describing what happened. Callers
145
+ * should treat "skipped" as success — the sentinel / idempotent cases are
146
+ * expected and intentional.
147
+ *
148
+ * @throws if `MEMORY.md` fails schema validation (we do not write garbage).
149
+ */
150
+ export function materializeForNamespace(
151
+ namespace: string,
152
+ options: MaterializeOptions,
153
+ ): MaterializeResult {
154
+ const logger = options.logger ?? {
155
+ info: (msg) => log.info(`[codex-materialize] ${msg}`),
156
+ warn: (msg) => log.warn(`[codex-materialize] ${msg}`),
157
+ debug: (msg) => log.debug(`[codex-materialize] ${msg}`),
158
+ };
159
+ const memoriesDir = resolveCodexMemoriesDir(options.codexHome);
160
+ const now = options.now ?? new Date();
161
+ // Honor `0` as "no summary budget" — parseConfig already clamps to non-
162
+ // negative integers, so any provided number is meaningful. Only fall back
163
+ // to the default when the caller did not provide the option at all.
164
+ const maxSummaryTokens =
165
+ typeof options.maxSummaryTokens === "number" && options.maxSummaryTokens >= 0
166
+ ? options.maxSummaryTokens
167
+ : 4500;
168
+ const rolloutRetentionDays =
169
+ typeof options.rolloutRetentionDays === "number" && options.rolloutRetentionDays >= 0
170
+ ? options.rolloutRetentionDays
171
+ : 30;
172
+
173
+ // ── Sentinel check ─────────────────────────────────────────────────────
174
+ // We deliberately do NOT `mkdirSync(memoriesDir)` before reading the
175
+ // sentinel: creating `~/.codex/memories/` for every user (including ones
176
+ // who never use Codex) would make Remnic's post-consolidation hook leave
177
+ // empty opt-in directories behind on disk. Instead we only check whether
178
+ // the sentinel already exists — if the parent dir doesn't exist, the
179
+ // sentinel can't exist either and we fall straight through to the skip
180
+ // path without touching the filesystem. The `mkdirSync` for `memoriesDir`
181
+ // happens later, only once we know we're actually going to write.
182
+ const sentinelPath = path.join(memoriesDir, SENTINEL_FILE);
183
+ const existingSentinel = readSentinel(sentinelPath);
184
+ if (!existingSentinel) {
185
+ // Log at `debug` when the entire memories dir doesn't exist — that's
186
+ // the common "user never opted in" case and should not be noisy.
187
+ // Keep the `warn` level only when the dir exists but lacks a sentinel,
188
+ // which is the "user hand-curated layout, don't overwrite" case that
189
+ // genuinely warrants attention.
190
+ if (fs.existsSync(memoriesDir)) {
191
+ logger.warn(
192
+ `sentinel ${SENTINEL_FILE} missing in ${memoriesDir}; skipping materialization to preserve hand-edits`,
193
+ );
194
+ } else {
195
+ logger.debug?.(
196
+ `skipping materialization — ${memoriesDir} does not exist (user not opted in)`,
197
+ );
198
+ }
199
+ return {
200
+ namespace,
201
+ memoriesDir,
202
+ wrote: false,
203
+ skippedNoSentinel: true,
204
+ skippedIdempotent: false,
205
+ filesWritten: [],
206
+ contentHash: "",
207
+ };
208
+ }
209
+
210
+ // Now that we know the user has opted in (sentinel exists), it's safe to
211
+ // ensure the memories dir is present. In practice this is almost always a
212
+ // no-op because the sentinel read above already succeeded, but a defensive
213
+ // mkdirSync protects against a race where the dir was removed between the
214
+ // sentinel read and the first write.
215
+ fs.mkdirSync(memoriesDir, { recursive: true });
216
+
217
+ // ── Render ─────────────────────────────────────────────────────────────
218
+ const memories = [...options.memories];
219
+ // Track whether the caller actually supplied a rollout set. `undefined`
220
+ // means "don't touch rollout_summaries/"; an empty array is still
221
+ // authoritative and means "we own this dir and it should be empty".
222
+ const rolloutsSupplied = options.rolloutSummaries !== undefined;
223
+ const rolloutSummaries = options.rolloutSummaries ?? [];
224
+
225
+ // Prune-before-render: MEMORY.md and memory_summary.md both embed rollout
226
+ // filenames in their body, so they must only ever see the *retained* set.
227
+ // Running pruneRollouts after the renderers (as an earlier revision did)
228
+ // caused MEMORY.md to list `rollout_summaries/<slug>.md` paths for rollouts
229
+ // that were then pruned and never written — a broken link pointing at a
230
+ // ghost file. See review feedback on PR #392.
231
+ const retainedRollouts = pruneRollouts(rolloutSummaries, rolloutRetentionDays, now);
232
+
233
+ // Deduplicate on sanitized filename. Two different slugs ("Session 1" and
234
+ // "session!!!1") can sanitize to the same output ("session-1"), which would
235
+ // otherwise make the first entry's tmp file get overwritten and cause the
236
+ // later rename step to crash with ENOENT. For each collision slot we keep
237
+ // the entry with the newest `updatedAt` so an unsorted input (or a caller
238
+ // that accidentally appends older recaps after newer ones) can't have an
239
+ // older recap clobber a newer one.
240
+ // We do this at the retained-input level (not just at the written-file
241
+ // level) so MEMORY.md's "rollout_summary_files" section lists each slot
242
+ // exactly once and matches what actually gets written to disk.
243
+ const dedupedRollouts: RolloutSummaryInput[] = [];
244
+ const seenNames = new Map<string, number>();
245
+ const parseTs = (value: string | undefined): number => {
246
+ if (!value) return Number.NEGATIVE_INFINITY;
247
+ const parsed = Date.parse(value);
248
+ return Number.isFinite(parsed) ? parsed : Number.NEGATIVE_INFINITY;
249
+ };
250
+ for (const r of retainedRollouts) {
251
+ const name = `${sanitizeSlug(r.slug)}.md`;
252
+ const existingIdx = seenNames.get(name);
253
+ if (existingIdx === undefined) {
254
+ seenNames.set(name, dedupedRollouts.length);
255
+ dedupedRollouts.push(r);
256
+ continue;
257
+ }
258
+ // Newest-wins: only replace the existing entry if the incoming one has a
259
+ // strictly newer timestamp. Ties keep the earlier entry (stable for
260
+ // unsorted inputs) because overwriting on ties would flip rendering output
261
+ // for benign call-order changes.
262
+ const existing = dedupedRollouts[existingIdx];
263
+ if (parseTs(r.updatedAt) > parseTs(existing.updatedAt)) {
264
+ dedupedRollouts[existingIdx] = r;
265
+ }
266
+ }
267
+
268
+ const memorySummary = renderMemorySummary({
269
+ namespace,
270
+ memories,
271
+ rolloutSummaries: dedupedRollouts,
272
+ maxTokens: maxSummaryTokens,
273
+ });
274
+
275
+ const memoryMd = renderMemoryMd({
276
+ namespace,
277
+ memories,
278
+ rolloutSummaries: dedupedRollouts,
279
+ });
280
+
281
+ // Fail fast on schema issues — do not write garbage.
282
+ const validation = validateMemoryMd(memoryMd);
283
+ if (!validation.valid) {
284
+ const reason = validation.errors.join("; ");
285
+ logger.warn(`MEMORY.md failed schema validation: ${reason}`);
286
+ throw new Error(`codex-materialize: MEMORY.md schema validation failed: ${reason}`);
287
+ }
288
+
289
+ const rawMemories = renderRawMemories({ memories });
290
+
291
+ const rolloutFiles = dedupedRollouts.map((r) => ({
292
+ name: `${sanitizeSlug(r.slug)}.md`,
293
+ body: renderRolloutSummary(r),
294
+ }));
295
+
296
+ // ── Idempotence check ──────────────────────────────────────────────────
297
+ const hash = computeContentHash({
298
+ namespace,
299
+ memorySummary,
300
+ memoryMd,
301
+ rawMemories,
302
+ rolloutFiles,
303
+ });
304
+
305
+ if (existingSentinel.content_hash === hash) {
306
+ // Idempotence early-return is only safe when the managed files we would
307
+ // have written are still on disk. If a user or external process deleted
308
+ // `MEMORY.md` / `memory_summary.md` / `raw_memories.md` (or any retained
309
+ // rollout file) while the sentinel's hash stayed the same, we must fall
310
+ // through and rewrite — otherwise Codex would be stuck with missing
311
+ // artifacts until a memory-content change happens to flip the hash.
312
+ const requiredFiles = [
313
+ path.join(memoriesDir, "memory_summary.md"),
314
+ path.join(memoriesDir, "MEMORY.md"),
315
+ path.join(memoriesDir, "raw_memories.md"),
316
+ ...rolloutFiles.map((r) => path.join(memoriesDir, ROLLOUT_SUBDIR, r.name)),
317
+ ];
318
+ const allPresent = requiredFiles.every((f) => fs.existsSync(f));
319
+ if (allPresent) {
320
+ logger.debug?.(`no-op materialization for namespace=${namespace} (hash unchanged)`);
321
+ return {
322
+ namespace,
323
+ memoriesDir,
324
+ wrote: false,
325
+ skippedNoSentinel: false,
326
+ skippedIdempotent: true,
327
+ filesWritten: [],
328
+ contentHash: hash,
329
+ };
330
+ }
331
+ logger.debug?.(
332
+ `hash unchanged for namespace=${namespace} but managed file missing — forcing rewrite`,
333
+ );
334
+ }
335
+
336
+ // ── Atomic writes ──────────────────────────────────────────────────────
337
+ // Use a unique, per-run staging sub-directory so two overlapping runs
338
+ // (e.g. a session-end trigger overlapping with a consolidation post-hook)
339
+ // can't stomp each other's tmp files mid-rename. The old "fixed TMP_DIR,
340
+ // wipe-on-entry" layout meant run B would delete run A's staging area out
341
+ // from under it, causing ENOENT on A's rename loop. Per-run uniqueness
342
+ // turns the shared dir into an insulated workspace. See review feedback on
343
+ // PR #392.
344
+ const runTag = `${process.pid}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
345
+ const tmpDir = path.join(memoriesDir, `${TMP_DIR}-${runTag}`);
346
+ // Opportunistic GC for stale scratch dirs left behind by a previous
347
+ // crashed run. We only remove entries whose mtime is older than the
348
+ // stale-threshold below — that way we never delete another in-flight
349
+ // run's staging area out from under it. The threshold is deliberately
350
+ // generous (1h) because a healthy materialize completes in milliseconds
351
+ // and there's no legitimate reason for a live staging dir to be older.
352
+ //
353
+ // NB: we compare against `Date.now()` (wall-clock), not against the
354
+ // injected `options.now`. Tests and deterministic replays commonly
355
+ // inject a non-current timestamp, but file mtimes on disk are always
356
+ // wall-clock, so mixing the two would either false-positive delete
357
+ // fresh dirs (test-time in the past) or false-negative skip stale ones
358
+ // (test-time in the future).
359
+ const TMP_STALE_MS = 60 * 60 * 1000;
360
+ const wallClockMs = Date.now();
361
+ try {
362
+ for (const entry of fs.readdirSync(memoriesDir, { withFileTypes: true })) {
363
+ if (!entry.isDirectory()) continue;
364
+ if (!entry.name.startsWith(TMP_DIR)) continue;
365
+ const stalePath = path.join(memoriesDir, entry.name);
366
+ try {
367
+ const stat = fs.statSync(stalePath);
368
+ if (wallClockMs - stat.mtimeMs < TMP_STALE_MS) continue;
369
+ fs.rmSync(stalePath, { recursive: true, force: true });
370
+ } catch {
371
+ // ignore — another concurrent run may own it, or we lack perms
372
+ }
373
+ }
374
+ } catch {
375
+ // ignore — dir may not exist yet
376
+ }
377
+ fs.mkdirSync(tmpDir, { recursive: true });
378
+ fs.mkdirSync(path.join(tmpDir, ROLLOUT_SUBDIR), { recursive: true });
379
+
380
+ const filesWritten: string[] = [];
381
+
382
+ fs.writeFileSync(path.join(tmpDir, "memory_summary.md"), memorySummary);
383
+ filesWritten.push("memory_summary.md");
384
+
385
+ fs.writeFileSync(path.join(tmpDir, "MEMORY.md"), memoryMd);
386
+ filesWritten.push("MEMORY.md");
387
+
388
+ fs.writeFileSync(path.join(tmpDir, "raw_memories.md"), rawMemories);
389
+ filesWritten.push("raw_memories.md");
390
+
391
+ for (const rollout of rolloutFiles) {
392
+ fs.writeFileSync(path.join(tmpDir, ROLLOUT_SUBDIR, rollout.name), rollout.body);
393
+ filesWritten.push(path.join(ROLLOUT_SUBDIR, rollout.name));
394
+ }
395
+
396
+ // Rename into place. Atomic per-file is sufficient — Codex reads each file
397
+ // independently and tolerates an inconsistent in-between snapshot across
398
+ // files for the duration of the rename loop (milliseconds).
399
+ for (const rel of ["memory_summary.md", "MEMORY.md", "raw_memories.md"]) {
400
+ const src = path.join(tmpDir, rel);
401
+ const dest = path.join(memoriesDir, rel);
402
+ fs.renameSync(src, dest);
403
+ }
404
+
405
+ const destRolloutsDir = path.join(memoriesDir, ROLLOUT_SUBDIR);
406
+ fs.mkdirSync(destRolloutsDir, { recursive: true });
407
+ // Only garbage-collect rollout files when the caller actually supplied a
408
+ // `rolloutSummaries` array — otherwise we'd wipe legitimately
409
+ // user/Codex-created recap files on every session-end run, since those
410
+ // calls typically omit the rollout set entirely. When rollouts were
411
+ // supplied (even as an empty array — meaning "we own this dir and it
412
+ // should be empty"), we clear the stale files we previously owned.
413
+ if (rolloutsSupplied) {
414
+ const retainedRolloutNames = new Set(rolloutFiles.map((r) => r.name));
415
+ try {
416
+ for (const entry of fs.readdirSync(destRolloutsDir, { withFileTypes: true })) {
417
+ if (!entry.isFile()) continue;
418
+ if (!entry.name.endsWith(".md")) continue;
419
+ if (retainedRolloutNames.has(entry.name)) continue;
420
+ try {
421
+ fs.unlinkSync(path.join(destRolloutsDir, entry.name));
422
+ } catch {
423
+ // ignore
424
+ }
425
+ }
426
+ } catch {
427
+ // ignore — directory may not exist yet
428
+ }
429
+ }
430
+
431
+ for (const rollout of rolloutFiles) {
432
+ const src = path.join(tmpDir, ROLLOUT_SUBDIR, rollout.name);
433
+ const dest = path.join(destRolloutsDir, rollout.name);
434
+ fs.renameSync(src, dest);
435
+ }
436
+
437
+ // Update sentinel last so a crash leaves hash mismatched → next run rewrites.
438
+ const sentinel: SentinelFile = {
439
+ version: MATERIALIZE_VERSION,
440
+ namespace,
441
+ updated_at: now.toISOString(),
442
+ content_hash: hash,
443
+ };
444
+ fs.writeFileSync(sentinelPath, `${JSON.stringify(sentinel, null, 2)}\n`);
445
+
446
+ try {
447
+ fs.rmSync(tmpDir, { recursive: true, force: true });
448
+ } catch {
449
+ // ignore
450
+ }
451
+
452
+ logger.info(
453
+ `materialized namespace=${namespace} files=${filesWritten.length} hash=${hash.slice(0, 12)}`,
454
+ );
455
+
456
+ return {
457
+ namespace,
458
+ memoriesDir,
459
+ wrote: true,
460
+ skippedNoSentinel: false,
461
+ skippedIdempotent: false,
462
+ filesWritten,
463
+ contentHash: hash,
464
+ };
465
+ }
466
+
467
+ /**
468
+ * Create (or refresh) the `.remnic-managed` sentinel. Callers must do this
469
+ * explicitly the first time they want Remnic to start managing a directory —
470
+ * we never write it implicitly, because its presence is the user's opt-in.
471
+ */
472
+ export function ensureSentinel(memoriesDir: string, namespace: string, now: Date = new Date()): void {
473
+ fs.mkdirSync(memoriesDir, { recursive: true });
474
+ const sentinelPath = path.join(memoriesDir, SENTINEL_FILE);
475
+ if (fs.existsSync(sentinelPath)) return;
476
+ const sentinel: SentinelFile = {
477
+ version: MATERIALIZE_VERSION,
478
+ namespace,
479
+ updated_at: now.toISOString(),
480
+ content_hash: "",
481
+ };
482
+ fs.writeFileSync(sentinelPath, `${JSON.stringify(sentinel, null, 2)}\n`);
483
+ }
484
+
485
+ // ─── Rendering ─────────────────────────────────────────────────────────────
486
+
487
+ interface RenderContext {
488
+ namespace: string;
489
+ memories: MemoryFile[];
490
+ rolloutSummaries: RolloutSummaryInput[];
491
+ // Historically this interface exposed a `now: Date` field, but neither
492
+ // `renderMemoryMd` nor `renderMemorySummary` ever read it (rendered output
493
+ // is purely a function of `namespace`, `memories`, and `rolloutSummaries`).
494
+ // The field was flagged as dead weight in PR #392 review and removed.
495
+ // If a future renderer needs a timestamp, re-add it here and update both
496
+ // call sites and the schema test.
497
+ }
498
+
499
+ interface SummaryRenderContext extends RenderContext {
500
+ maxTokens: number;
501
+ }
502
+
503
+ /**
504
+ * Render `memory_summary.md` — the always-loaded file.
505
+ * Budget-capped at `maxTokens` whitespace tokens.
506
+ */
507
+ export function renderMemorySummary(ctx: SummaryRenderContext): string {
508
+ const lines: string[] = [];
509
+ lines.push("# Memory Summary");
510
+ lines.push("");
511
+ lines.push(`_namespace: ${ctx.namespace}_`);
512
+ lines.push(`_source: remnic_`);
513
+ lines.push("");
514
+
515
+ const highValue = selectSummaryMemories(ctx.memories, 12);
516
+ if (highValue.length > 0) {
517
+ lines.push("## Top memories");
518
+ lines.push("");
519
+ for (const mem of highValue) {
520
+ lines.push(`- ${oneLineSummary(mem)}`);
521
+ }
522
+ lines.push("");
523
+ }
524
+
525
+ if (ctx.rolloutSummaries.length > 0) {
526
+ lines.push("## Recent rollouts");
527
+ lines.push("");
528
+ const sorted = [...ctx.rolloutSummaries]
529
+ .sort((a, b) => (b.updatedAt ?? "").localeCompare(a.updatedAt ?? ""))
530
+ .slice(0, 5);
531
+ for (const r of sorted) {
532
+ const when = r.updatedAt ? ` (${r.updatedAt})` : "";
533
+ lines.push(`- ${r.slug}${when}`);
534
+ }
535
+ lines.push("");
536
+ }
537
+
538
+ const full = lines.join("\n").replace(/\n+$/u, "\n");
539
+ return truncateToTokenBudget(full, ctx.maxTokens);
540
+ }
541
+
542
+ /**
543
+ * Render `MEMORY.md` — the searchable handbook in Codex's task-group schema.
544
+ */
545
+ export function renderMemoryMd(ctx: RenderContext): string {
546
+ const lines: string[] = [];
547
+ lines.push(`# Task Group: ${ctx.namespace}`);
548
+ lines.push(`scope: ${ctx.namespace}`);
549
+ lines.push(`applies_to: cwd=*; reuse_rule=namespace-match`);
550
+ lines.push("");
551
+
552
+ // One "task" per top-level topic cluster. For the first cut we group by
553
+ // memory category so the schema validator always sees at least one task.
554
+ const byCategory = groupMemoriesByCategory(ctx.memories);
555
+ let taskIndex = 1;
556
+ if (byCategory.size === 0) {
557
+ lines.push(`## Task ${taskIndex}: baseline — no memories yet`);
558
+ lines.push("");
559
+ lines.push("### rollout_summary_files");
560
+ for (const r of ctx.rolloutSummaries) {
561
+ lines.push(
562
+ `- rollout_summaries/${sanitizeSlug(r.slug)}.md (cwd=${r.cwd ?? "*"}, rollout_path=${r.rolloutPath ?? ""}, updated_at=${r.updatedAt ?? ""}, thread_id=${r.threadId ?? ""})`,
563
+ );
564
+ }
565
+ if (ctx.rolloutSummaries.length === 0) {
566
+ lines.push("- (none)");
567
+ }
568
+ lines.push("");
569
+ lines.push("### keywords");
570
+ lines.push(`- ${ctx.namespace}`);
571
+ lines.push("");
572
+ taskIndex += 1;
573
+ } else {
574
+ for (const [category, mems] of byCategory) {
575
+ lines.push(`## Task ${taskIndex}: ${category} memories, outcome=surface-to-codex`);
576
+ lines.push("");
577
+ lines.push("### rollout_summary_files");
578
+ const relevantRollouts = ctx.rolloutSummaries.slice(0, 5);
579
+ if (relevantRollouts.length === 0) {
580
+ lines.push("- (none)");
581
+ } else {
582
+ for (const r of relevantRollouts) {
583
+ lines.push(
584
+ `- rollout_summaries/${sanitizeSlug(r.slug)}.md (cwd=${r.cwd ?? "*"}, rollout_path=${r.rolloutPath ?? ""}, updated_at=${r.updatedAt ?? ""}, thread_id=${r.threadId ?? ""})`,
585
+ );
586
+ }
587
+ }
588
+ lines.push("");
589
+ lines.push("### keywords");
590
+ const keywords = collectKeywords(mems, category, ctx.namespace);
591
+ lines.push(`- ${keywords.join(", ")}`);
592
+ lines.push("");
593
+ taskIndex += 1;
594
+ }
595
+ }
596
+
597
+ lines.push("## User preferences");
598
+ const prefs = pickCategory(ctx.memories, ["preference"]);
599
+ if (prefs.length === 0) {
600
+ lines.push("- (none recorded)");
601
+ } else {
602
+ for (const pref of prefs.slice(0, 20)) {
603
+ lines.push(`- ${oneLineSummary(pref)}`);
604
+ }
605
+ }
606
+ lines.push("");
607
+
608
+ lines.push("## Reusable knowledge");
609
+ const knowledge = pickCategory(ctx.memories, ["fact", "decision", "principle", "rule", "skill"]);
610
+ if (knowledge.length === 0) {
611
+ lines.push("- (none recorded)");
612
+ } else {
613
+ for (const mem of knowledge.slice(0, 30)) {
614
+ lines.push(`- ${oneLineSummary(mem)}`);
615
+ }
616
+ }
617
+ lines.push("");
618
+
619
+ lines.push("## Failures and how to do differently");
620
+ const corrections = pickCategory(ctx.memories, ["correction"]);
621
+ if (corrections.length === 0) {
622
+ lines.push("- (none recorded)");
623
+ } else {
624
+ for (const mem of corrections.slice(0, 20)) {
625
+ lines.push(`- ${oneLineSummary(mem)}`);
626
+ }
627
+ }
628
+ lines.push("");
629
+
630
+ return lines.join("\n");
631
+ }
632
+
633
+ /** Render `raw_memories.md` — mechanical dump, latest first. */
634
+ export function renderRawMemories(ctx: { memories: MemoryFile[] }): string {
635
+ const sorted = [...ctx.memories].sort((a, b) => {
636
+ const aUpdated = a.frontmatter.updated ?? a.frontmatter.created ?? "";
637
+ const bUpdated = b.frontmatter.updated ?? b.frontmatter.created ?? "";
638
+ return bUpdated.localeCompare(aUpdated);
639
+ });
640
+
641
+ const lines: string[] = ["# Raw Memories", "", "_source: remnic — latest first_", ""];
642
+ for (const mem of sorted) {
643
+ const fm = mem.frontmatter;
644
+ const id = fm.id ?? "unknown";
645
+ const category = fm.category ?? "unknown";
646
+ const updated = fm.updated ?? fm.created ?? "";
647
+ lines.push(`## ${id} (${category}, updated=${updated})`);
648
+ lines.push("");
649
+ lines.push(mem.content.trim());
650
+ lines.push("");
651
+ }
652
+ return lines.join("\n");
653
+ }
654
+
655
+ /** Render a single rollout summary file. */
656
+ export function renderRolloutSummary(input: RolloutSummaryInput): string {
657
+ const lines: string[] = [];
658
+ lines.push(`# Rollout Summary: ${input.slug}`);
659
+ lines.push("");
660
+ const meta: string[] = [];
661
+ if (input.cwd) meta.push(`cwd=${input.cwd}`);
662
+ if (input.rolloutPath) meta.push(`rollout_path=${input.rolloutPath}`);
663
+ if (input.updatedAt) meta.push(`updated_at=${input.updatedAt}`);
664
+ if (input.threadId) meta.push(`thread_id=${input.threadId}`);
665
+ if (meta.length > 0) {
666
+ lines.push(`_${meta.join("; ")}_`);
667
+ lines.push("");
668
+ }
669
+ if (input.keywords && input.keywords.length > 0) {
670
+ lines.push(`**keywords:** ${input.keywords.join(", ")}`);
671
+ lines.push("");
672
+ }
673
+ lines.push(input.body.trim());
674
+ lines.push("");
675
+ return lines.join("\n");
676
+ }
677
+
678
+ // ─── Schema validation ─────────────────────────────────────────────────────
679
+
680
+ export interface MemoryMdValidation {
681
+ valid: boolean;
682
+ errors: string[];
683
+ }
684
+
685
+ /**
686
+ * Validate that a rendered `MEMORY.md` matches Codex's task-group schema.
687
+ * We enforce the minimum set of structural requirements called out in #378:
688
+ *
689
+ * - one `# Task Group:` header
690
+ * - `scope:` and `applies_to:` lines directly beneath it
691
+ * - at least one `## Task N:` section
692
+ * - each task section has `### rollout_summary_files` and `### keywords`
693
+ * - `## User preferences`, `## Reusable knowledge`,
694
+ * `## Failures and how to do differently` sections all present
695
+ */
696
+ export function validateMemoryMd(content: string): MemoryMdValidation {
697
+ const errors: string[] = [];
698
+ const lines = content.split(/\r?\n/u);
699
+
700
+ const taskGroupIndex = lines.findIndex((l) => /^#\s+Task Group:\s+\S+/u.test(l));
701
+ if (taskGroupIndex === -1) {
702
+ errors.push("missing `# Task Group:` header");
703
+ } else {
704
+ const tail = lines.slice(taskGroupIndex + 1, taskGroupIndex + 5);
705
+ if (!tail.some((l) => /^scope:\s*\S+/u.test(l))) {
706
+ errors.push("missing `scope:` line under Task Group header");
707
+ }
708
+ if (!tail.some((l) => /^applies_to:\s*\S+/u.test(l))) {
709
+ errors.push("missing `applies_to:` line under Task Group header");
710
+ }
711
+ }
712
+
713
+ const taskHeaders = lines.filter((l) => /^##\s+Task\s+\d+:/u.test(l));
714
+ if (taskHeaders.length === 0) {
715
+ errors.push("at least one `## Task N:` section is required");
716
+ }
717
+
718
+ // For every task section, make sure we have rollout_summary_files + keywords
719
+ // before the next `##` header at the same level.
720
+ const sectionRegex = /^##\s+/u;
721
+ for (let i = 0; i < lines.length; i++) {
722
+ if (!/^##\s+Task\s+\d+:/u.test(lines[i])) continue;
723
+ let hasRollout = false;
724
+ let hasKeywords = false;
725
+ for (let j = i + 1; j < lines.length; j++) {
726
+ if (sectionRegex.test(lines[j])) break;
727
+ if (/^###\s+rollout_summary_files\s*$/u.test(lines[j])) hasRollout = true;
728
+ if (/^###\s+keywords\s*$/u.test(lines[j])) hasKeywords = true;
729
+ }
730
+ if (!hasRollout) errors.push(`task block at line ${i + 1} missing \`### rollout_summary_files\``);
731
+ if (!hasKeywords) errors.push(`task block at line ${i + 1} missing \`### keywords\``);
732
+ }
733
+
734
+ const requiredSections = [
735
+ /^##\s+User preferences\s*$/u,
736
+ /^##\s+Reusable knowledge\s*$/u,
737
+ /^##\s+Failures and how to do differently\s*$/u,
738
+ ];
739
+ for (const re of requiredSections) {
740
+ if (!lines.some((l) => re.test(l))) {
741
+ errors.push(`missing required section: ${re.source}`);
742
+ }
743
+ }
744
+
745
+ return { valid: errors.length === 0, errors };
746
+ }
747
+
748
+ // ─── Helpers ───────────────────────────────────────────────────────────────
749
+
750
+ function resolveCodexHome(override?: string): string {
751
+ if (override && override.trim().length > 0) return override;
752
+ const fromEnv = readEnvVar("CODEX_HOME");
753
+ if (fromEnv && fromEnv.trim().length > 0) return fromEnv;
754
+ return path.join(resolveHomeDir(), ".codex");
755
+ }
756
+
757
+ export function resolveCodexMemoriesDir(codexHome?: string): string {
758
+ return path.join(resolveCodexHome(codexHome), "memories");
759
+ }
760
+
761
+ export function hasCodexMaterializeSentinel(codexHome?: string): boolean {
762
+ return readSentinel(path.join(resolveCodexMemoriesDir(codexHome), SENTINEL_FILE)) !== null;
763
+ }
764
+
765
+ function readSentinel(sentinelPath: string): SentinelFile | null {
766
+ if (!fs.existsSync(sentinelPath)) return null;
767
+ try {
768
+ const raw = fs.readFileSync(sentinelPath, "utf-8");
769
+ const parsed = JSON.parse(raw) as Partial<SentinelFile>;
770
+ if (typeof parsed !== "object" || parsed === null) return null;
771
+ return {
772
+ version: typeof parsed.version === "number" ? parsed.version : MATERIALIZE_VERSION,
773
+ namespace: typeof parsed.namespace === "string" ? parsed.namespace : "",
774
+ updated_at: typeof parsed.updated_at === "string" ? parsed.updated_at : "",
775
+ content_hash: typeof parsed.content_hash === "string" ? parsed.content_hash : "",
776
+ };
777
+ } catch {
778
+ return null;
779
+ }
780
+ }
781
+
782
+ function selectSummaryMemories(memories: MemoryFile[], limit: number): MemoryFile[] {
783
+ const scored = memories
784
+ .filter((m) => !m.frontmatter.status || m.frontmatter.status === "active")
785
+ .map((m) => {
786
+ const confidence = typeof m.frontmatter.confidence === "number" ? m.frontmatter.confidence : 0;
787
+ const importance =
788
+ typeof m.frontmatter.importance === "object" &&
789
+ m.frontmatter.importance !== null &&
790
+ typeof (m.frontmatter.importance as { score?: number }).score === "number"
791
+ ? ((m.frontmatter.importance as { score: number }).score ?? 0)
792
+ : 0;
793
+ const updated = m.frontmatter.updated ?? m.frontmatter.created ?? "";
794
+ return { memory: m, score: importance * 2 + confidence, updated };
795
+ });
796
+
797
+ scored.sort((a, b) => {
798
+ if (b.score !== a.score) return b.score - a.score;
799
+ return b.updated.localeCompare(a.updated);
800
+ });
801
+
802
+ return scored.slice(0, limit).map((s) => s.memory);
803
+ }
804
+
805
+ function oneLineSummary(memory: MemoryFile): string {
806
+ const raw = memory.content.replace(/\s+/gu, " ").trim();
807
+ if (raw.length <= 160) return raw;
808
+ return `${raw.slice(0, 157)}...`;
809
+ }
810
+
811
+ function groupMemoriesByCategory(memories: MemoryFile[]): Map<string, MemoryFile[]> {
812
+ const map = new Map<string, MemoryFile[]>();
813
+ for (const memory of memories) {
814
+ if (memory.frontmatter.status && memory.frontmatter.status !== "active") continue;
815
+ const category = memory.frontmatter.category ?? "unknown";
816
+ const list = map.get(category) ?? [];
817
+ list.push(memory);
818
+ map.set(category, list);
819
+ }
820
+ return map;
821
+ }
822
+
823
+ function pickCategory(memories: MemoryFile[], categories: string[]): MemoryFile[] {
824
+ const allowed = new Set(categories);
825
+ return memories.filter(
826
+ (m) =>
827
+ (!m.frontmatter.status || m.frontmatter.status === "active") &&
828
+ allowed.has(m.frontmatter.category ?? ""),
829
+ );
830
+ }
831
+
832
+ function collectKeywords(memories: MemoryFile[], category: string, namespace: string): string[] {
833
+ const keywords = new Set<string>();
834
+ keywords.add(category);
835
+ keywords.add(namespace);
836
+ for (const mem of memories.slice(0, 10)) {
837
+ for (const tag of mem.frontmatter.tags ?? []) {
838
+ if (typeof tag === "string" && tag.trim().length > 0) keywords.add(tag.trim());
839
+ }
840
+ }
841
+ return [...keywords].slice(0, 16);
842
+ }
843
+
844
+ function pruneRollouts(
845
+ rollouts: RolloutSummaryInput[],
846
+ retentionDays: number,
847
+ now: Date,
848
+ ): RolloutSummaryInput[] {
849
+ // Negative retention → "infinite retention" escape hatch. `parseConfig`
850
+ // clamps the knob to >= 0, so in practice only callers passing a negative
851
+ // value intentionally get the all-pass behavior.
852
+ if (retentionDays < 0) return rollouts;
853
+ // retentionDays === 0 → cutoff is exactly `now`, which prunes every
854
+ // rollout whose `updatedAt` is in the past (i.e. all of them in practice).
855
+ // This matches the documented semantics of "retain for 0 days".
856
+ const cutoffMs = now.getTime() - retentionDays * 24 * 60 * 60 * 1000;
857
+ return rollouts.filter((r) => {
858
+ if (!r.updatedAt) return true;
859
+ const t = Date.parse(r.updatedAt);
860
+ if (!Number.isFinite(t)) return true;
861
+ return t >= cutoffMs;
862
+ });
863
+ }
864
+
865
+ function sanitizeSlug(slug: string): string {
866
+ return slug
867
+ .toLowerCase()
868
+ .replace(/[^a-z0-9._-]+/gu, "-")
869
+ .replace(/^-+|-+$/gu, "")
870
+ .slice(0, 96)
871
+ || "rollout";
872
+ }
873
+
874
+ /**
875
+ * Whitespace-tokenized approximation used by the budget check. Matches the
876
+ * simple heuristic Codex's usage.rs reporting uses for the "5000 token"
877
+ * memory_summary cap.
878
+ */
879
+ export function approximateTokenCount(text: string): number {
880
+ const trimmed = text.trim();
881
+ if (trimmed.length === 0) return 0;
882
+ return trimmed.split(/\s+/u).length;
883
+ }
884
+
885
+ /**
886
+ * Truncate `text` so it fits under `maxTokens` whitespace tokens. We drop
887
+ * trailing lines until we're under the budget and then append an ellipsis
888
+ * marker so downstream readers can see that truncation happened.
889
+ */
890
+ export function truncateToTokenBudget(text: string, maxTokens: number): string {
891
+ if (maxTokens <= 0) return "";
892
+ if (approximateTokenCount(text) <= maxTokens) return text;
893
+
894
+ // Reserve headroom for the truncation marker so the line-preserving path
895
+ // can actually fit the marker without flipping to the hard-cut fallback.
896
+ // Both markers are counted with the same whitespace heuristic the budget
897
+ // check uses, so the arithmetic stays consistent.
898
+ const lineMarker = "_[truncated for summary budget]_";
899
+ const tailMarker = "[truncated]";
900
+ const lineMarkerTokens = approximateTokenCount(lineMarker);
901
+ const tailMarkerTokens = approximateTokenCount(tailMarker);
902
+
903
+ const lines = text.split(/\r?\n/u);
904
+ const lineBudget = Math.max(0, maxTokens - lineMarkerTokens);
905
+ while (lines.length > 0 && approximateTokenCount(lines.join("\n")) > lineBudget) {
906
+ lines.pop();
907
+ }
908
+ lines.push(lineMarker);
909
+ let result = lines.join("\n");
910
+
911
+ // If a single huge line still blows the budget, hard-cut tokens. Reserve
912
+ // space for the tail marker's own token count so the final string stays
913
+ // within maxTokens rather than sneaking over by a few tokens.
914
+ if (approximateTokenCount(result) > maxTokens) {
915
+ const tokens = result.split(/\s+/u);
916
+ const keep = Math.max(0, maxTokens - tailMarkerTokens);
917
+ result = keep > 0 ? `${tokens.slice(0, keep).join(" ")} ${tailMarker}` : tailMarker;
918
+ }
919
+ return result;
920
+ }
921
+
922
+ function computeContentHash(input: {
923
+ namespace: string;
924
+ memorySummary: string;
925
+ memoryMd: string;
926
+ rawMemories: string;
927
+ rolloutFiles: Array<{ name: string; body: string }>;
928
+ }): string {
929
+ const hash = createHash("sha256");
930
+ hash.update(`v${MATERIALIZE_VERSION}\n`);
931
+ hash.update(`namespace=${input.namespace}\n`);
932
+ hash.update("---memory_summary---\n");
933
+ hash.update(input.memorySummary);
934
+ hash.update("\n---memory_md---\n");
935
+ hash.update(input.memoryMd);
936
+ hash.update("\n---raw_memories---\n");
937
+ hash.update(input.rawMemories);
938
+ const sortedRollouts = [...input.rolloutFiles].sort((a, b) => a.name.localeCompare(b.name));
939
+ for (const r of sortedRollouts) {
940
+ hash.update(`\n---rollout:${r.name}---\n`);
941
+ hash.update(r.body);
942
+ }
943
+ return hash.digest("hex");
944
+ }
945
+
946
+ // ─── Stat helper for tests / debugging ─────────────────────────────────────
947
+
948
+ /**
949
+ * Return basic stats about a materialized memories dir. Useful for tests and
950
+ * debug CLI output. Returns `null` if the dir does not exist.
951
+ */
952
+ export function describeMemoriesDir(memoriesDir: string): {
953
+ exists: boolean;
954
+ hasSentinel: boolean;
955
+ files: string[];
956
+ sentinel: SentinelFile | null;
957
+ } | null {
958
+ if (!fs.existsSync(memoriesDir)) return null;
959
+ const sentinelPath = path.join(memoriesDir, SENTINEL_FILE);
960
+ const sentinel = readSentinel(sentinelPath);
961
+ const files: string[] = [];
962
+ for (const entry of fs.readdirSync(memoriesDir, { withFileTypes: true })) {
963
+ if (entry.isFile() && OWNED_FILES.has(entry.name)) files.push(entry.name);
964
+ }
965
+ const rolloutsDir = path.join(memoriesDir, ROLLOUT_SUBDIR);
966
+ if (fs.existsSync(rolloutsDir)) {
967
+ try {
968
+ for (const entry of fs.readdirSync(rolloutsDir, { withFileTypes: true })) {
969
+ if (entry.isFile() && entry.name.endsWith(".md")) {
970
+ files.push(path.join(ROLLOUT_SUBDIR, entry.name));
971
+ }
972
+ }
973
+ } catch {
974
+ // ignore
975
+ }
976
+ }
977
+ return {
978
+ exists: true,
979
+ hasSentinel: sentinel !== null,
980
+ files: files.sort(),
981
+ sentinel,
982
+ };
983
+ }