@struktoai/mirage-node 0.0.3 → 0.0.4

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 (430) hide show
  1. package/dist/aliyun-PGI57A43.js +10 -0
  2. package/dist/backblaze-TSPL6Y56.js +10 -0
  3. package/dist/box-7XTZYDSO.js +8 -0
  4. package/dist/cas.lua +15 -0
  5. package/dist/ceph-C265UI5T.js +10 -0
  6. package/dist/{chunk-I5THIMPP.js → chunk-25W4XQJZ.js} +5 -5
  7. package/dist/{chunk-QGRDPSAH.js → chunk-2ERLWAGG.js} +4 -2
  8. package/dist/chunk-2ERLWAGG.js.map +1 -0
  9. package/dist/{chunk-NJMGCT63.js → chunk-2QNPKPZZ.js} +7 -2
  10. package/dist/chunk-2QNPKPZZ.js.map +1 -0
  11. package/dist/{chunk-ZNWVJ6UW.js → chunk-3ASOQTZB.js} +7 -2
  12. package/dist/chunk-3ASOQTZB.js.map +1 -0
  13. package/dist/{chunk-WAR4Q2NM.js → chunk-3JZN3GYO.js} +13 -12
  14. package/dist/chunk-3JZN3GYO.js.map +1 -0
  15. package/dist/{chunk-S5OVP467.js → chunk-4GYB7DGC.js} +294 -705
  16. package/dist/chunk-4GYB7DGC.js.map +1 -0
  17. package/dist/{chunk-HJJMP6IX.js → chunk-4M73WHIE.js} +3 -3
  18. package/dist/{chunk-7CW3BMPH.js → chunk-4X6CLF4F.js} +3 -3
  19. package/dist/{chunk-QQBJC2FQ.js → chunk-5I7Q7RHW.js} +3 -3
  20. package/dist/{chunk-LV2G7VHL.js → chunk-5YRWF5RP.js} +17 -15
  21. package/dist/chunk-5YRWF5RP.js.map +1 -0
  22. package/dist/chunk-5ZHNPNDD.js +944 -0
  23. package/dist/chunk-5ZHNPNDD.js.map +1 -0
  24. package/dist/{chunk-VGLHY6BK.js → chunk-AULFV3KY.js} +1 -2
  25. package/dist/chunk-AULFV3KY.js.map +1 -0
  26. package/dist/{chunk-VWKUT4CW.js → chunk-BWLUBJQG.js} +19 -15
  27. package/dist/chunk-BWLUBJQG.js.map +1 -0
  28. package/dist/{chunk-X5HF2OFP.js → chunk-BWWU5T2D.js} +3 -3
  29. package/dist/chunk-C7TNKIK5.js +39 -0
  30. package/dist/chunk-C7TNKIK5.js.map +1 -0
  31. package/dist/{chunk-MPCCRRE6.js → chunk-CB76WPUS.js} +12 -13
  32. package/dist/chunk-CB76WPUS.js.map +1 -0
  33. package/dist/chunk-CGGO5NKD.js +1194 -0
  34. package/dist/chunk-CGGO5NKD.js.map +1 -0
  35. package/dist/{chunk-B2ZOKNN4.js → chunk-CQCTCW4S.js} +1 -2
  36. package/dist/chunk-CQCTCW4S.js.map +1 -0
  37. package/dist/{chunk-KPULTUOK.js → chunk-CXQGMFI7.js} +3 -3
  38. package/dist/{chunk-LW25LMIH.js → chunk-D3U7VQCG.js} +1 -2
  39. package/dist/{chunk-LW25LMIH.js.map → chunk-D3U7VQCG.js.map} +1 -1
  40. package/dist/{chunk-N5FSLVKO.js → chunk-DXU7NZPH.js} +3 -3
  41. package/dist/{chunk-XGJ2QERC.js → chunk-E3KXVEYI.js} +8 -4
  42. package/dist/chunk-E3KXVEYI.js.map +1 -0
  43. package/dist/{chunk-YAHRT6MB.js → chunk-EGZNOUMH.js} +3 -3
  44. package/dist/{chunk-DNBAMB5J.js → chunk-EVK6HH6Z.js} +1 -2
  45. package/dist/{chunk-DNBAMB5J.js.map → chunk-EVK6HH6Z.js.map} +1 -1
  46. package/dist/{chunk-HGCRXJGP.js → chunk-F5NWRF32.js} +3 -3
  47. package/dist/{chunk-GCFYZSVR.js → chunk-FRGTDZQT.js} +15 -10
  48. package/dist/chunk-FRGTDZQT.js.map +1 -0
  49. package/dist/{chunk-DYXEITK3.js → chunk-GF75O2EN.js} +4 -2
  50. package/dist/chunk-GF75O2EN.js.map +1 -0
  51. package/dist/{chunk-W7FLHT65.js → chunk-GTAS3QVC.js} +1 -2
  52. package/dist/{chunk-W7FLHT65.js.map → chunk-GTAS3QVC.js.map} +1 -1
  53. package/dist/{chunk-RQK5UPMP.js → chunk-H62XQZUM.js} +4 -3
  54. package/dist/chunk-H62XQZUM.js.map +1 -0
  55. package/dist/{chunk-UT2OPSN4.js → chunk-HCU3B6FW.js} +1 -2
  56. package/dist/chunk-HCU3B6FW.js.map +1 -0
  57. package/dist/chunk-HEDE2377.js +754 -0
  58. package/dist/chunk-HEDE2377.js.map +1 -0
  59. package/dist/{chunk-RNQN2FOU.js → chunk-HGIPWY5Y.js} +21 -10
  60. package/dist/chunk-HGIPWY5Y.js.map +1 -0
  61. package/dist/{chunk-Q2IAILVC.js → chunk-HSD24IP2.js} +8 -4
  62. package/dist/chunk-HSD24IP2.js.map +1 -0
  63. package/dist/{chunk-SWCDFEUK.js → chunk-HWQPEBID.js} +18 -14
  64. package/dist/chunk-HWQPEBID.js.map +1 -0
  65. package/dist/{chunk-SFUCUARB.js → chunk-IEHPTILN.js} +4 -4
  66. package/dist/chunk-IEHPTILN.js.map +1 -0
  67. package/dist/{chunk-M5FVUIYP.js → chunk-IEVLWEBO.js} +14 -13
  68. package/dist/chunk-IEVLWEBO.js.map +1 -0
  69. package/dist/{chunk-YUK3X3B4.js → chunk-IKJQOYI4.js} +1 -2
  70. package/dist/{chunk-YUK3X3B4.js.map → chunk-IKJQOYI4.js.map} +1 -1
  71. package/dist/{chunk-TA3WMOMU.js → chunk-IUXXZHY3.js} +16 -22
  72. package/dist/chunk-IUXXZHY3.js.map +1 -0
  73. package/dist/{chunk-EZQ5HBAC.js → chunk-JBDFYIN2.js} +12 -13
  74. package/dist/chunk-JBDFYIN2.js.map +1 -0
  75. package/dist/{chunk-JCC4CU2I.js → chunk-JEBH5APX.js} +14 -14
  76. package/dist/chunk-JEBH5APX.js.map +1 -0
  77. package/dist/{chunk-H3BST2LI.js → chunk-JHI2PHHD.js} +1 -2
  78. package/dist/{chunk-H3BST2LI.js.map → chunk-JHI2PHHD.js.map} +1 -1
  79. package/dist/{chunk-EGB7V74Z.js → chunk-KAWDDS27.js} +1 -3
  80. package/dist/chunk-KAWDDS27.js.map +1 -0
  81. package/dist/{chunk-DP2PP5V2.js → chunk-KGC2OGXI.js} +5 -4
  82. package/dist/chunk-KGC2OGXI.js.map +1 -0
  83. package/dist/{chunk-3WIO7NBR.js → chunk-L4GMDSMB.js} +3 -3
  84. package/dist/{chunk-47AVIIOT.js → chunk-L7FEZ7LU.js} +3 -3
  85. package/dist/{chunk-54NTYJEO.js → chunk-LPDLPRPS.js} +1 -3
  86. package/dist/{chunk-54NTYJEO.js.map → chunk-LPDLPRPS.js.map} +1 -1
  87. package/dist/{chunk-UGK4TAVK.js → chunk-LPLZLSMK.js} +1 -2
  88. package/dist/chunk-LPLZLSMK.js.map +1 -0
  89. package/dist/{chunk-EM4J5EQS.js → chunk-M6E7VK4D.js} +13 -13
  90. package/dist/chunk-M6E7VK4D.js.map +1 -0
  91. package/dist/{chunk-2CC5VW7K.js → chunk-MIQ3ECZM.js} +4 -2
  92. package/dist/chunk-MIQ3ECZM.js.map +1 -0
  93. package/dist/chunk-MRXTUFBZ.js +30 -0
  94. package/dist/chunk-MRXTUFBZ.js.map +1 -0
  95. package/dist/{chunk-RO5IQEDQ.js → chunk-NJ42VNXG.js} +1 -2
  96. package/dist/chunk-NJ42VNXG.js.map +1 -0
  97. package/dist/{chunk-AUHSTJJ3.js → chunk-NLXJMXVE.js} +3 -3
  98. package/dist/{chunk-E2ISWXLB.js → chunk-OQKNDS66.js} +1 -1
  99. package/dist/{chunk-E2ISWXLB.js.map → chunk-OQKNDS66.js.map} +1 -1
  100. package/dist/{chunk-IDYHQQOH.js → chunk-OSVZKYXS.js} +229 -378
  101. package/dist/chunk-OSVZKYXS.js.map +1 -0
  102. package/dist/{chunk-JAGJTM3Q.js → chunk-RHUEV4I7.js} +11 -12
  103. package/dist/chunk-RHUEV4I7.js.map +1 -0
  104. package/dist/{chunk-JALIYI6M.js → chunk-S4KVLPBR.js} +7 -2
  105. package/dist/chunk-S4KVLPBR.js.map +1 -0
  106. package/dist/{chunk-ZEGAMJO2.js → chunk-SAOQW6ZJ.js} +14 -14
  107. package/dist/chunk-SAOQW6ZJ.js.map +1 -0
  108. package/dist/{chunk-NOHWIBRX.js → chunk-SI4GMRXD.js} +13 -14
  109. package/dist/chunk-SI4GMRXD.js.map +1 -0
  110. package/dist/{chunk-X3G37FXT.js → chunk-SYMNWNC3.js} +3 -3
  111. package/dist/{chunk-DM4GSE26.js → chunk-TUNR4VUM.js} +3 -3
  112. package/dist/{chunk-XHCBHYN4.js → chunk-UAJYJP5C.js} +7 -2
  113. package/dist/chunk-UAJYJP5C.js.map +1 -0
  114. package/dist/{chunk-OPYQ5KIO.js → chunk-UYA3XL3J.js} +4 -2
  115. package/dist/chunk-UYA3XL3J.js.map +1 -0
  116. package/dist/{chunk-UINQOUZR.js → chunk-V7JVMG63.js} +3 -3
  117. package/dist/{chunk-LAJJPLEV.js → chunk-VBYIDRNU.js} +7 -3
  118. package/dist/chunk-VBYIDRNU.js.map +1 -0
  119. package/dist/{chunk-GS5AUKUO.js → chunk-VHED2STW.js} +10 -7
  120. package/dist/chunk-VHED2STW.js.map +1 -0
  121. package/dist/{chunk-JZT4QGIP.js → chunk-VIICUPWQ.js} +1 -2
  122. package/dist/{chunk-JZT4QGIP.js.map → chunk-VIICUPWQ.js.map} +1 -1
  123. package/dist/{chunk-QCZ2XUKH.js → chunk-VLRSOWHP.js} +16 -14
  124. package/dist/chunk-VLRSOWHP.js.map +1 -0
  125. package/dist/{chunk-XWVDS66D.js → chunk-W5ZLIQFR.js} +182 -381
  126. package/dist/chunk-W5ZLIQFR.js.map +1 -0
  127. package/dist/{chunk-YGZMVNN5.js → chunk-WTSSEUOZ.js} +7 -2
  128. package/dist/chunk-WTSSEUOZ.js.map +1 -0
  129. package/dist/{chunk-OHROA3FQ.js → chunk-WWP2STF5.js} +7 -2
  130. package/dist/chunk-WWP2STF5.js.map +1 -0
  131. package/dist/{chunk-IK2L4EN3.js → chunk-XADEMW6B.js} +3 -3
  132. package/dist/{chunk-FQ33BYFR.js → chunk-XEMLYWHK.js} +3 -3
  133. package/dist/{chunk-OZAEWZZ3.js → chunk-XFSEADPC.js} +6 -2
  134. package/dist/chunk-XFSEADPC.js.map +1 -0
  135. package/dist/{chunk-TWGVQLG2.js → chunk-XUUSWR4U.js} +1 -2
  136. package/dist/{chunk-TWGVQLG2.js.map → chunk-XUUSWR4U.js.map} +1 -1
  137. package/dist/{chunk-XLQI4IT2.js → chunk-YBVMZ7SR.js} +7 -2
  138. package/dist/chunk-YBVMZ7SR.js.map +1 -0
  139. package/dist/{chunk-A7IVFIOP.js → chunk-YRJICL2Q.js} +14 -14
  140. package/dist/chunk-YRJICL2Q.js.map +1 -0
  141. package/dist/{chunk-ZGSER5TG.js → chunk-ZM44MGC5.js} +3 -3
  142. package/dist/{chunk-G2WCEUQL.js → chunk-ZMREYTHA.js} +15 -14
  143. package/dist/chunk-ZMREYTHA.js.map +1 -0
  144. package/dist/{chunk-H3I2KZIY.js → chunk-ZPB3SLPK.js} +1 -2
  145. package/dist/{chunk-H3I2KZIY.js.map → chunk-ZPB3SLPK.js.map} +1 -1
  146. package/dist/chunk-ZPZQXHW2.js +1230 -0
  147. package/dist/chunk-ZPZQXHW2.js.map +1 -0
  148. package/dist/{config-34LHOGLM.js → config-2LASFFRD.js} +2 -4
  149. package/dist/config-3WDIJPTG.js +9 -0
  150. package/dist/config-4QV4QYI5.js +9 -0
  151. package/dist/{config-ZFJYQZCH.js → config-54USUVSE.js} +2 -4
  152. package/dist/config-5ZXN2T2H.js +9 -0
  153. package/dist/config-A2GQYJDB.js +9 -0
  154. package/dist/config-BBOLI7VE.js +9 -0
  155. package/dist/{config-VM526IKB.js → config-BIBFLUIR.js} +2 -4
  156. package/dist/{config-EO23EY62.js → config-CPYFOUQO.js} +2 -4
  157. package/dist/{config-3IVQJBNW.js → config-DWSJL3NH.js} +2 -4
  158. package/dist/config-E22XAGYN.js +9 -0
  159. package/dist/config-EHE52ZTK.js +9 -0
  160. package/dist/{config-GE4W4ZJC.js → config-EX3ZJTZI.js} +2 -4
  161. package/dist/{config-QNMKWJ4M.js → config-FRK7ZL37.js} +2 -4
  162. package/dist/{config-LHFFXVYI.js → config-HQXNFQZS.js} +2 -4
  163. package/dist/config-HTXOOAOD.js +9 -0
  164. package/dist/{config-HKRMKD76.js → config-IPNWAJHH.js} +2 -4
  165. package/dist/config-J2C53GOT.js +9 -0
  166. package/dist/config-K63RX6EU.js +9 -0
  167. package/dist/config-L7SBSH5L.js +9 -0
  168. package/dist/config-LEALEMKA.js +9 -0
  169. package/dist/{config-IVY5EQQ2.js → config-M3Z47VYU.js} +2 -4
  170. package/dist/{config-EIHSP5DZ.js → config-MZM3IPFM.js} +2 -4
  171. package/dist/{config-GHRUKEQ6.js → config-OJ2BPESH.js} +2 -4
  172. package/dist/{config-WDAZFXYD.js → config-QO2XUME4.js} +2 -4
  173. package/dist/config-QWQGOXQ5.js +9 -0
  174. package/dist/config-RI7IEZUF.js +9 -0
  175. package/dist/{config-CVZ2AGCO.js → config-SPW6NESU.js} +2 -6
  176. package/dist/{config-QAA646XB.js → config-T2IUIU5C.js} +2 -4
  177. package/dist/{config-NV5WXP64.js → config-UU27ALAA.js} +2 -4
  178. package/dist/config-VKKZGC7V.js +9 -0
  179. package/dist/config-W7EVPJNK.js +11 -0
  180. package/dist/config-WKQ3FGTZ.js +9 -0
  181. package/dist/config-WVILHDFV.js +11 -0
  182. package/dist/{config-Q45Y46YT.js → config-XU6D5C7E.js} +2 -4
  183. package/dist/databricks_volume-ETRDJVVQ.js +7 -0
  184. package/dist/digitalocean-QP72DR4J.js +10 -0
  185. package/dist/discord-BSN5RB3E.js +8 -0
  186. package/dist/disk-24NWTN2I.js +7 -0
  187. package/dist/dropbox-OSTZXSIE.js +8 -0
  188. package/dist/email-4ZFPSWIN.js +8 -0
  189. package/dist/gcs-PFWR6MIW.js +10 -0
  190. package/dist/gdocs-GPAZRQG5.js +8 -0
  191. package/dist/gdrive-XSX6A7B3.js +8 -0
  192. package/dist/github-EQ4NXUTA.js +8 -0
  193. package/dist/github_ci-QL5B2Q2N.js +8 -0
  194. package/dist/gmail-2TBT4CVH.js +8 -0
  195. package/dist/gridfs-KZRZ6SIB.js +9 -0
  196. package/dist/gsheets-N53WEXN2.js +8 -0
  197. package/dist/gslides-TATSARTH.js +8 -0
  198. package/dist/hf_buckets-BK7NGJWS.js +10 -0
  199. package/dist/hf_datasets-UQ5QGM4L.js +10 -0
  200. package/dist/hf_models-75LFCQCS.js +10 -0
  201. package/dist/hf_spaces-6T2KB3UC.js +10 -0
  202. package/dist/index.d.ts +494 -40
  203. package/dist/index.js +1193 -388
  204. package/dist/index.js.map +1 -1
  205. package/dist/langfuse-AMQCQWNE.js +8 -0
  206. package/dist/linear-V3TXO6CV.js +8 -0
  207. package/dist/minio-IZRZY4C5.js +10 -0
  208. package/dist/mongodb-VMKPQCPX.js +7 -0
  209. package/dist/nextcloud-5RHQCGDO.js +9 -0
  210. package/dist/notion-6PPNTQFM.js +8 -0
  211. package/dist/oci-CKYBSFZJ.js +10 -0
  212. package/dist/postgres-WIQBVL5M.js +7 -0
  213. package/dist/qingstor-AP4IIPLY.js +10 -0
  214. package/dist/r2-C4XGEWQY.js +10 -0
  215. package/dist/redis-6D55Q2WB.js +8 -0
  216. package/dist/s3-XQBI2CXN.js +8 -0
  217. package/dist/scaleway-SEZJVURB.js +10 -0
  218. package/dist/seaweedfs-3XYIAFU2.js +10 -0
  219. package/dist/slack-ZHXDJQY4.js +8 -0
  220. package/dist/ssh-X2MO7JOV.js +8 -0
  221. package/dist/supabase-BBM44UTM.js +10 -0
  222. package/dist/supabase-BBM44UTM.js.map +1 -0
  223. package/dist/tencent-X72USLJ7.js +10 -0
  224. package/dist/tencent-X72USLJ7.js.map +1 -0
  225. package/dist/trello-EER5NG7L.js +8 -0
  226. package/dist/trello-EER5NG7L.js.map +1 -0
  227. package/dist/wasabi-O4MVIUFG.js +10 -0
  228. package/dist/wasabi-O4MVIUFG.js.map +1 -0
  229. package/package.json +4 -2
  230. package/dist/aliyun-JMJ3PFYY.js +0 -10
  231. package/dist/backblaze-TDFD23QO.js +0 -10
  232. package/dist/box-GQ2U2R6R.js +0 -8
  233. package/dist/ceph-S2VOYO6G.js +0 -10
  234. package/dist/chunk-2CC5VW7K.js.map +0 -1
  235. package/dist/chunk-A7IVFIOP.js.map +0 -1
  236. package/dist/chunk-B2ZOKNN4.js.map +0 -1
  237. package/dist/chunk-DP2PP5V2.js.map +0 -1
  238. package/dist/chunk-DYXEITK3.js.map +0 -1
  239. package/dist/chunk-EGB7V74Z.js.map +0 -1
  240. package/dist/chunk-EM4J5EQS.js.map +0 -1
  241. package/dist/chunk-EZQ5HBAC.js.map +0 -1
  242. package/dist/chunk-G2WCEUQL.js.map +0 -1
  243. package/dist/chunk-GCFYZSVR.js.map +0 -1
  244. package/dist/chunk-GS5AUKUO.js.map +0 -1
  245. package/dist/chunk-IDYHQQOH.js.map +0 -1
  246. package/dist/chunk-JAGJTM3Q.js.map +0 -1
  247. package/dist/chunk-JALIYI6M.js.map +0 -1
  248. package/dist/chunk-JCC4CU2I.js.map +0 -1
  249. package/dist/chunk-LAJJPLEV.js.map +0 -1
  250. package/dist/chunk-LV2G7VHL.js.map +0 -1
  251. package/dist/chunk-M5FVUIYP.js.map +0 -1
  252. package/dist/chunk-MPCCRRE6.js.map +0 -1
  253. package/dist/chunk-NJMGCT63.js.map +0 -1
  254. package/dist/chunk-NOHWIBRX.js.map +0 -1
  255. package/dist/chunk-OHROA3FQ.js.map +0 -1
  256. package/dist/chunk-OPYQ5KIO.js.map +0 -1
  257. package/dist/chunk-OZAEWZZ3.js.map +0 -1
  258. package/dist/chunk-Q2IAILVC.js.map +0 -1
  259. package/dist/chunk-QCZ2XUKH.js.map +0 -1
  260. package/dist/chunk-QGRDPSAH.js.map +0 -1
  261. package/dist/chunk-RNQN2FOU.js.map +0 -1
  262. package/dist/chunk-RO5IQEDQ.js.map +0 -1
  263. package/dist/chunk-RQK5UPMP.js.map +0 -1
  264. package/dist/chunk-S5OVP467.js.map +0 -1
  265. package/dist/chunk-SFUCUARB.js.map +0 -1
  266. package/dist/chunk-SWCDFEUK.js.map +0 -1
  267. package/dist/chunk-TA3WMOMU.js.map +0 -1
  268. package/dist/chunk-TURD42QO.js +0 -1782
  269. package/dist/chunk-TURD42QO.js.map +0 -1
  270. package/dist/chunk-U6QSXTUS.js +0 -7
  271. package/dist/chunk-U6QSXTUS.js.map +0 -1
  272. package/dist/chunk-UGK4TAVK.js.map +0 -1
  273. package/dist/chunk-UT2OPSN4.js.map +0 -1
  274. package/dist/chunk-VGLHY6BK.js.map +0 -1
  275. package/dist/chunk-VWKUT4CW.js.map +0 -1
  276. package/dist/chunk-WAR4Q2NM.js.map +0 -1
  277. package/dist/chunk-WHFUWWI6.js +0 -2097
  278. package/dist/chunk-WHFUWWI6.js.map +0 -1
  279. package/dist/chunk-XGJ2QERC.js.map +0 -1
  280. package/dist/chunk-XHCBHYN4.js.map +0 -1
  281. package/dist/chunk-XLQI4IT2.js.map +0 -1
  282. package/dist/chunk-XWVDS66D.js.map +0 -1
  283. package/dist/chunk-YGZMVNN5.js.map +0 -1
  284. package/dist/chunk-ZEGAMJO2.js.map +0 -1
  285. package/dist/chunk-ZNWVJ6UW.js.map +0 -1
  286. package/dist/config-3BBWD5AB.js +0 -11
  287. package/dist/config-4UDVSUQJ.js +0 -11
  288. package/dist/config-CMDBAPDH.js +0 -11
  289. package/dist/config-D3RLSPNF.js +0 -11
  290. package/dist/config-DG65OEG3.js +0 -11
  291. package/dist/config-GCQK6NJY.js +0 -11
  292. package/dist/config-GVH27UPE.js +0 -11
  293. package/dist/config-HXVYIXP5.js +0 -11
  294. package/dist/config-IDZMEW73.js +0 -11
  295. package/dist/config-IJJXGLBQ.js +0 -11
  296. package/dist/config-KJOLGVB2.js +0 -11
  297. package/dist/config-KMVCVBYN.js +0 -15
  298. package/dist/config-KYTRXAB2.js +0 -15
  299. package/dist/config-OT2TQQCN.js +0 -11
  300. package/dist/config-QWCY3LBQ.js +0 -11
  301. package/dist/config-ZV6G2ZEC.js +0 -11
  302. package/dist/databricks_volume-7XOUYSTY.js +0 -7
  303. package/dist/digitalocean-3CQ4CPPZ.js +0 -10
  304. package/dist/discord-BG7OSRJG.js +0 -8
  305. package/dist/disk-XVLBCVKE.js +0 -8
  306. package/dist/dropbox-74GYLV3R.js +0 -8
  307. package/dist/email-5IZ7OBQ4.js +0 -8
  308. package/dist/gcs-EMEYU2XT.js +0 -10
  309. package/dist/gdocs-R67TDPON.js +0 -8
  310. package/dist/gdrive-PRN2ALRK.js +0 -8
  311. package/dist/github-DV7E6OFV.js +0 -8
  312. package/dist/github_ci-Q554V5PA.js +0 -8
  313. package/dist/gmail-OLN2LT4O.js +0 -8
  314. package/dist/gsheets-H4RYMQJ5.js +0 -8
  315. package/dist/gslides-YLCHKJOM.js +0 -8
  316. package/dist/hf_buckets-DTKXKKFF.js +0 -10
  317. package/dist/hf_datasets-55C4APKR.js +0 -10
  318. package/dist/hf_models-RO5JR36V.js +0 -10
  319. package/dist/hf_spaces-ZVZ3EDRX.js +0 -10
  320. package/dist/langfuse-ACASJZ7O.js +0 -8
  321. package/dist/linear-IC37LZV7.js +0 -8
  322. package/dist/minio-HZ576XFQ.js +0 -10
  323. package/dist/mongodb-JVR62OIO.js +0 -7
  324. package/dist/notion-HKRPQMJS.js +0 -8
  325. package/dist/oci-ZLVECXTW.js +0 -10
  326. package/dist/postgres-P36Z2YN4.js +0 -7
  327. package/dist/qingstor-YLP6K3L4.js +0 -10
  328. package/dist/r2-RPK25ANI.js +0 -10
  329. package/dist/redis-V5ULXULL.js +0 -8
  330. package/dist/s3-4OIOCAAT.js +0 -8
  331. package/dist/scaleway-CCWCLUHB.js +0 -10
  332. package/dist/seaweedfs-QSWKF2FN.js +0 -10
  333. package/dist/slack-YPS7PII3.js +0 -8
  334. package/dist/ssh-YFP3SMTJ.js +0 -9
  335. package/dist/supabase-6CFTOKGZ.js +0 -10
  336. package/dist/tencent-IWZZOSQ4.js +0 -10
  337. package/dist/trello-XYKWZD6P.js +0 -8
  338. package/dist/wasabi-6Z4DC5S5.js +0 -10
  339. /package/dist/{aliyun-JMJ3PFYY.js.map → aliyun-PGI57A43.js.map} +0 -0
  340. /package/dist/{backblaze-TDFD23QO.js.map → backblaze-TSPL6Y56.js.map} +0 -0
  341. /package/dist/{box-GQ2U2R6R.js.map → box-7XTZYDSO.js.map} +0 -0
  342. /package/dist/{ceph-S2VOYO6G.js.map → ceph-C265UI5T.js.map} +0 -0
  343. /package/dist/{chunk-I5THIMPP.js.map → chunk-25W4XQJZ.js.map} +0 -0
  344. /package/dist/{chunk-HJJMP6IX.js.map → chunk-4M73WHIE.js.map} +0 -0
  345. /package/dist/{chunk-7CW3BMPH.js.map → chunk-4X6CLF4F.js.map} +0 -0
  346. /package/dist/{chunk-QQBJC2FQ.js.map → chunk-5I7Q7RHW.js.map} +0 -0
  347. /package/dist/{chunk-X5HF2OFP.js.map → chunk-BWWU5T2D.js.map} +0 -0
  348. /package/dist/{chunk-KPULTUOK.js.map → chunk-CXQGMFI7.js.map} +0 -0
  349. /package/dist/{chunk-N5FSLVKO.js.map → chunk-DXU7NZPH.js.map} +0 -0
  350. /package/dist/{chunk-YAHRT6MB.js.map → chunk-EGZNOUMH.js.map} +0 -0
  351. /package/dist/{chunk-HGCRXJGP.js.map → chunk-F5NWRF32.js.map} +0 -0
  352. /package/dist/{chunk-3WIO7NBR.js.map → chunk-L4GMDSMB.js.map} +0 -0
  353. /package/dist/{chunk-47AVIIOT.js.map → chunk-L7FEZ7LU.js.map} +0 -0
  354. /package/dist/{chunk-AUHSTJJ3.js.map → chunk-NLXJMXVE.js.map} +0 -0
  355. /package/dist/{chunk-X3G37FXT.js.map → chunk-SYMNWNC3.js.map} +0 -0
  356. /package/dist/{chunk-DM4GSE26.js.map → chunk-TUNR4VUM.js.map} +0 -0
  357. /package/dist/{chunk-UINQOUZR.js.map → chunk-V7JVMG63.js.map} +0 -0
  358. /package/dist/{chunk-IK2L4EN3.js.map → chunk-XADEMW6B.js.map} +0 -0
  359. /package/dist/{chunk-FQ33BYFR.js.map → chunk-XEMLYWHK.js.map} +0 -0
  360. /package/dist/{chunk-ZGSER5TG.js.map → chunk-ZM44MGC5.js.map} +0 -0
  361. /package/dist/{config-34LHOGLM.js.map → config-2LASFFRD.js.map} +0 -0
  362. /package/dist/{config-3BBWD5AB.js.map → config-3WDIJPTG.js.map} +0 -0
  363. /package/dist/{config-3IVQJBNW.js.map → config-4QV4QYI5.js.map} +0 -0
  364. /package/dist/{config-4UDVSUQJ.js.map → config-54USUVSE.js.map} +0 -0
  365. /package/dist/{config-CMDBAPDH.js.map → config-5ZXN2T2H.js.map} +0 -0
  366. /package/dist/{config-CVZ2AGCO.js.map → config-A2GQYJDB.js.map} +0 -0
  367. /package/dist/{config-D3RLSPNF.js.map → config-BBOLI7VE.js.map} +0 -0
  368. /package/dist/{config-DG65OEG3.js.map → config-BIBFLUIR.js.map} +0 -0
  369. /package/dist/{config-EIHSP5DZ.js.map → config-CPYFOUQO.js.map} +0 -0
  370. /package/dist/{config-EO23EY62.js.map → config-DWSJL3NH.js.map} +0 -0
  371. /package/dist/{config-GCQK6NJY.js.map → config-E22XAGYN.js.map} +0 -0
  372. /package/dist/{config-GE4W4ZJC.js.map → config-EHE52ZTK.js.map} +0 -0
  373. /package/dist/{config-GHRUKEQ6.js.map → config-EX3ZJTZI.js.map} +0 -0
  374. /package/dist/{config-GVH27UPE.js.map → config-FRK7ZL37.js.map} +0 -0
  375. /package/dist/{config-HKRMKD76.js.map → config-HQXNFQZS.js.map} +0 -0
  376. /package/dist/{config-HXVYIXP5.js.map → config-HTXOOAOD.js.map} +0 -0
  377. /package/dist/{config-IDZMEW73.js.map → config-IPNWAJHH.js.map} +0 -0
  378. /package/dist/{config-IJJXGLBQ.js.map → config-J2C53GOT.js.map} +0 -0
  379. /package/dist/{config-IVY5EQQ2.js.map → config-K63RX6EU.js.map} +0 -0
  380. /package/dist/{config-KJOLGVB2.js.map → config-L7SBSH5L.js.map} +0 -0
  381. /package/dist/{config-KMVCVBYN.js.map → config-LEALEMKA.js.map} +0 -0
  382. /package/dist/{config-KYTRXAB2.js.map → config-M3Z47VYU.js.map} +0 -0
  383. /package/dist/{config-LHFFXVYI.js.map → config-MZM3IPFM.js.map} +0 -0
  384. /package/dist/{config-NV5WXP64.js.map → config-OJ2BPESH.js.map} +0 -0
  385. /package/dist/{config-OT2TQQCN.js.map → config-QO2XUME4.js.map} +0 -0
  386. /package/dist/{config-Q45Y46YT.js.map → config-QWQGOXQ5.js.map} +0 -0
  387. /package/dist/{config-QAA646XB.js.map → config-RI7IEZUF.js.map} +0 -0
  388. /package/dist/{config-QNMKWJ4M.js.map → config-SPW6NESU.js.map} +0 -0
  389. /package/dist/{config-QWCY3LBQ.js.map → config-T2IUIU5C.js.map} +0 -0
  390. /package/dist/{config-VM526IKB.js.map → config-UU27ALAA.js.map} +0 -0
  391. /package/dist/{config-WDAZFXYD.js.map → config-VKKZGC7V.js.map} +0 -0
  392. /package/dist/{config-ZFJYQZCH.js.map → config-W7EVPJNK.js.map} +0 -0
  393. /package/dist/{config-ZV6G2ZEC.js.map → config-WKQ3FGTZ.js.map} +0 -0
  394. /package/dist/{databricks_volume-7XOUYSTY.js.map → config-WVILHDFV.js.map} +0 -0
  395. /package/dist/{digitalocean-3CQ4CPPZ.js.map → config-XU6D5C7E.js.map} +0 -0
  396. /package/dist/{discord-BG7OSRJG.js.map → databricks_volume-ETRDJVVQ.js.map} +0 -0
  397. /package/dist/{disk-XVLBCVKE.js.map → digitalocean-QP72DR4J.js.map} +0 -0
  398. /package/dist/{dropbox-74GYLV3R.js.map → discord-BSN5RB3E.js.map} +0 -0
  399. /package/dist/{email-5IZ7OBQ4.js.map → disk-24NWTN2I.js.map} +0 -0
  400. /package/dist/{gcs-EMEYU2XT.js.map → dropbox-OSTZXSIE.js.map} +0 -0
  401. /package/dist/{gdocs-R67TDPON.js.map → email-4ZFPSWIN.js.map} +0 -0
  402. /package/dist/{gdrive-PRN2ALRK.js.map → gcs-PFWR6MIW.js.map} +0 -0
  403. /package/dist/{github-DV7E6OFV.js.map → gdocs-GPAZRQG5.js.map} +0 -0
  404. /package/dist/{github_ci-Q554V5PA.js.map → gdrive-XSX6A7B3.js.map} +0 -0
  405. /package/dist/{gmail-OLN2LT4O.js.map → github-EQ4NXUTA.js.map} +0 -0
  406. /package/dist/{gsheets-H4RYMQJ5.js.map → github_ci-QL5B2Q2N.js.map} +0 -0
  407. /package/dist/{gslides-YLCHKJOM.js.map → gmail-2TBT4CVH.js.map} +0 -0
  408. /package/dist/{hf_buckets-DTKXKKFF.js.map → gridfs-KZRZ6SIB.js.map} +0 -0
  409. /package/dist/{hf_datasets-55C4APKR.js.map → gsheets-N53WEXN2.js.map} +0 -0
  410. /package/dist/{hf_models-RO5JR36V.js.map → gslides-TATSARTH.js.map} +0 -0
  411. /package/dist/{hf_spaces-ZVZ3EDRX.js.map → hf_buckets-BK7NGJWS.js.map} +0 -0
  412. /package/dist/{langfuse-ACASJZ7O.js.map → hf_datasets-UQ5QGM4L.js.map} +0 -0
  413. /package/dist/{linear-IC37LZV7.js.map → hf_models-75LFCQCS.js.map} +0 -0
  414. /package/dist/{minio-HZ576XFQ.js.map → hf_spaces-6T2KB3UC.js.map} +0 -0
  415. /package/dist/{mongodb-JVR62OIO.js.map → langfuse-AMQCQWNE.js.map} +0 -0
  416. /package/dist/{notion-HKRPQMJS.js.map → linear-V3TXO6CV.js.map} +0 -0
  417. /package/dist/{oci-ZLVECXTW.js.map → minio-IZRZY4C5.js.map} +0 -0
  418. /package/dist/{postgres-P36Z2YN4.js.map → mongodb-VMKPQCPX.js.map} +0 -0
  419. /package/dist/{qingstor-YLP6K3L4.js.map → nextcloud-5RHQCGDO.js.map} +0 -0
  420. /package/dist/{r2-RPK25ANI.js.map → notion-6PPNTQFM.js.map} +0 -0
  421. /package/dist/{redis-V5ULXULL.js.map → oci-CKYBSFZJ.js.map} +0 -0
  422. /package/dist/{s3-4OIOCAAT.js.map → postgres-WIQBVL5M.js.map} +0 -0
  423. /package/dist/{scaleway-CCWCLUHB.js.map → qingstor-AP4IIPLY.js.map} +0 -0
  424. /package/dist/{seaweedfs-QSWKF2FN.js.map → r2-C4XGEWQY.js.map} +0 -0
  425. /package/dist/{slack-YPS7PII3.js.map → redis-6D55Q2WB.js.map} +0 -0
  426. /package/dist/{ssh-YFP3SMTJ.js.map → s3-XQBI2CXN.js.map} +0 -0
  427. /package/dist/{supabase-6CFTOKGZ.js.map → scaleway-SEZJVURB.js.map} +0 -0
  428. /package/dist/{tencent-IWZZOSQ4.js.map → seaweedfs-3XYIAFU2.js.map} +0 -0
  429. /package/dist/{trello-XYKWZD6P.js.map → slack-ZHXDJQY4.js.map} +0 -0
  430. /package/dist/{wasabi-6Z4DC5S5.js.map → ssh-X2MO7JOV.js.map} +0 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/workspace.ts","../src/workspace/fuse.ts","../src/fuse/mount.ts","../src/fuse/fs.ts","../src/fuse/platform/macos.ts","../src/workspace/mount_spec.ts","../src/compression_codecs.ts","../src/observe/disk_store.ts","../src/observe/redis_store.ts","../src/fs_monkey.ts","../src/commands/builtin/redis/provision.ts","../src/cache/redis/file.ts","../src/resource/hf_models/config.ts","../src/resource/lancedb/lancedb.ts","../src/resource/lancedb/store.ts","../src/resource/registry.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nexport * from '@struktoai/mirage-core'\nexport { Workspace, type NodeWorkspaceOptions } from './workspace.ts'\nexport { Mount, type MountSpecOptions } from './workspace/mount_spec.ts'\nexport {\n DiskResource,\n type DiskResourceOptions,\n type DiskResourceState,\n} from './resource/disk/disk.ts'\nexport { DISK_PROMPT } from './resource/disk/prompt.ts'\nexport { DISK_OPS } from './ops/disk/index.ts'\nexport { DiskObserverStore } from './observe/disk_store.ts'\nexport { RedisObserverStore, type RedisObserverStoreOptions } from './observe/redis_store.ts'\nexport { patchNodeFs } from './fs_monkey.ts'\nexport {\n RedisResource,\n type RedisResourceOptions,\n type RedisResourceState,\n} from './resource/redis/redis.ts'\nexport { REDIS_PROMPT } from './resource/redis/prompt.ts'\nexport { RedisStore, type RedisStoreOptions } from './resource/redis/store.ts'\nexport { RedisAccessor } from './accessor/redis.ts'\nexport { REDIS_OPS } from './ops/redis/index.ts'\nexport {\n fileReadProvision,\n headTailProvision,\n metadataProvision,\n type RedisResourceLike,\n} from './commands/builtin/redis/provision.ts'\nexport { RedisFileCacheStore, type RedisFileCacheOptions } from './cache/redis/file.ts'\nexport { FuseManager } from './workspace/fuse.ts'\nexport { MirageFS, type MirageFSOptions, type FuseAttr } from './fuse/fs.ts'\nexport {\n mount as fuseMount,\n mountBackground as fuseMountBackground,\n type FuseHandle,\n type MountOptions as FuseMountOptions,\n} from './fuse/mount.ts'\nexport { isMacosMetadata } from './fuse/platform/macos.ts'\nexport { S3Resource, type S3ResourceState } from './resource/s3/s3.ts'\nexport {\n DatabricksVolumeResource,\n type DatabricksVolumeResourceState,\n} from './resource/databricks_volume/databricks_volume.ts'\nexport {\n loadDatabricksProfile,\n parseDatabricksCfg,\n type DatabricksProfile,\n} from './resource/databricks_volume/profile.ts'\nexport {\n redactConfig as redactS3Config,\n type S3Config,\n type S3ConfigRedacted,\n} from './resource/s3/config.ts'\nexport { GCSResource, type GCSResourceState } from './resource/gcs/gcs.ts'\nexport {\n GCS_ENDPOINT,\n redactGcsConfig,\n type GCSConfig,\n type GCSConfigRedacted,\n} from './resource/gcs/config.ts'\nexport { GCS_PROMPT } from './resource/gcs/prompt.ts'\nexport { OCIResource, type OCIResourceState } from './resource/oci/oci.ts'\nexport { redactOciConfig, type OCIConfig, type OCIConfigRedacted } from './resource/oci/config.ts'\nexport { OCI_PROMPT } from './resource/oci/prompt.ts'\nexport { R2Resource, type R2ResourceState } from './resource/r2/r2.ts'\nexport { redactR2Config, type R2Config, type R2ConfigRedacted } from './resource/r2/config.ts'\nexport { R2_PROMPT } from './resource/r2/prompt.ts'\nexport { SupabaseResource, type SupabaseResourceState } from './resource/supabase/supabase.ts'\nexport {\n redactSupabaseConfig,\n resolvedSupabaseEndpoint,\n type SupabaseConfig,\n type SupabaseConfigRedacted,\n} from './resource/supabase/config.ts'\nexport { SUPABASE_PROMPT } from './resource/supabase/prompt.ts'\nexport {\n HF_RESOURCES,\n HfAccessor,\n HfBucketsAccessor,\n HfDatasetsAccessor,\n HfModelsAccessor,\n HfSpacesAccessor,\n} from './accessor/hf.ts'\nexport { HfBucketsResource, type HfBucketsResourceState } from './resource/hf_buckets/hf_buckets.ts'\nexport {\n assertHfRepoId,\n HF_ENDPOINT,\n normalizeHfBucketsConfig,\n normalizeHfRepoConfig,\n redactHfBucketsConfig,\n redactHfRepoConfig,\n type HfBucketsConfig,\n type HfBucketsConfigRedacted,\n type HfRepoConfig,\n type HfRepoConfigRedacted,\n} from './resource/hf_buckets/config.ts'\nexport { HF_BUCKETS_PROMPT } from './resource/hf_buckets/prompt.ts'\nexport {\n HfDatasetsResource,\n type HfDatasetsResourceState,\n} from './resource/hf_datasets/hf_datasets.ts'\nexport { HF_DATASETS_PROMPT } from './resource/hf_datasets/prompt.ts'\nexport { HfModelsResource, type HfModelsResourceState } from './resource/hf_models/hf_models.ts'\nexport {\n normalizeHfModelsConfig,\n redactHfModelsConfig,\n type HfModelsConfig,\n type HfModelsConfigRedacted,\n} from './resource/hf_models/config.ts'\nexport { HF_MODELS_PROMPT } from './resource/hf_models/prompt.ts'\nexport { HfSpacesResource, type HfSpacesResourceState } from './resource/hf_spaces/hf_spaces.ts'\nexport { HF_SPACES_PROMPT } from './resource/hf_spaces/prompt.ts'\nexport { HF_COMMANDS } from './commands/builtin/hf/index.ts'\nexport { HF_OPS } from './ops/hf/index.ts'\nexport { MinIOResource, type MinIOResourceState } from './resource/minio/minio.ts'\nexport {\n redactMinIOConfig,\n type MinIOConfig,\n type MinIOConfigRedacted,\n} from './resource/minio/config.ts'\nexport { MINIO_PROMPT } from './resource/minio/prompt.ts'\nexport { SeaweedFSResource, type SeaweedFSResourceState } from './resource/seaweedfs/seaweedfs.ts'\nexport {\n redactSeaweedFSConfig,\n type SeaweedFSConfig,\n type SeaweedFSConfigRedacted,\n} from './resource/seaweedfs/config.ts'\nexport { SEAWEEDFS_PROMPT } from './resource/seaweedfs/prompt.ts'\nexport { CephResource, type CephResourceState } from './resource/ceph/ceph.ts'\nexport {\n redactCephConfig,\n type CephConfig,\n type CephConfigRedacted,\n} from './resource/ceph/config.ts'\nexport { CEPH_PROMPT } from './resource/ceph/prompt.ts'\nexport { WasabiResource, type WasabiResourceState } from './resource/wasabi/wasabi.ts'\nexport {\n redactWasabiConfig,\n resolvedWasabiEndpoint,\n type WasabiConfig,\n type WasabiConfigRedacted,\n} from './resource/wasabi/config.ts'\nexport { WASABI_PROMPT } from './resource/wasabi/prompt.ts'\nexport { BackblazeResource, type BackblazeResourceState } from './resource/backblaze/backblaze.ts'\nexport {\n redactBackblazeConfig,\n resolvedBackblazeEndpoint,\n type BackblazeConfig,\n type BackblazeConfigRedacted,\n} from './resource/backblaze/config.ts'\nexport { BACKBLAZE_PROMPT } from './resource/backblaze/prompt.ts'\nexport {\n DigitalOceanResource,\n type DigitalOceanResourceState,\n} from './resource/digitalocean/digitalocean.ts'\nexport {\n redactDigitalOceanConfig,\n resolvedDigitalOceanEndpoint,\n type DigitalOceanConfig,\n type DigitalOceanConfigRedacted,\n} from './resource/digitalocean/config.ts'\nexport { DIGITALOCEAN_PROMPT } from './resource/digitalocean/prompt.ts'\nexport { TencentResource, type TencentResourceState } from './resource/tencent/tencent.ts'\nexport {\n redactTencentConfig,\n resolvedTencentEndpoint,\n type TencentConfig,\n type TencentConfigRedacted,\n} from './resource/tencent/config.ts'\nexport { TENCENT_PROMPT } from './resource/tencent/prompt.ts'\nexport { AliyunResource, type AliyunResourceState } from './resource/aliyun/aliyun.ts'\nexport {\n redactAliyunConfig,\n resolvedAliyunEndpoint,\n type AliyunConfig,\n type AliyunConfigRedacted,\n} from './resource/aliyun/config.ts'\nexport { ALIYUN_PROMPT } from './resource/aliyun/prompt.ts'\nexport { ScalewayResource, type ScalewayResourceState } from './resource/scaleway/scaleway.ts'\nexport {\n redactScalewayConfig,\n resolvedScalewayEndpoint,\n type ScalewayConfig,\n type ScalewayConfigRedacted,\n} from './resource/scaleway/config.ts'\nexport { SCALEWAY_PROMPT } from './resource/scaleway/prompt.ts'\nexport { QingStorResource, type QingStorResourceState } from './resource/qingstor/qingstor.ts'\nexport {\n redactQingStorConfig,\n resolvedQingStorEndpoint,\n type QingStorConfig,\n type QingStorConfigRedacted,\n} from './resource/qingstor/config.ts'\nexport { QINGSTOR_PROMPT } from './resource/qingstor/prompt.ts'\nexport { PostgresResource, type PostgresResourceOptions } from './resource/postgres/postgres.ts'\nexport { PostgresStore } from './resource/postgres/store.ts'\nexport { MongoDBResource, type MongoDBResourceOptions } from './resource/mongodb/mongodb.ts'\nexport { MongoDBStore } from './resource/mongodb/store.ts'\nexport { LanceDBResource, type LanceDBResourceOptions } from './resource/lancedb/lancedb.ts'\nexport { LanceDBStore } from './resource/lancedb/store.ts'\nexport { SlackResource, type SlackResourceState } from './resource/slack/slack.ts'\nexport {\n normalizeSlackConfig,\n redactSlackConfig,\n type SlackConfig,\n type SlackConfigRedacted,\n} from './resource/slack/config.ts'\nexport { SSHResource, type SSHResourceState } from './resource/ssh/ssh.ts'\nexport {\n normalizeSshConfig,\n redactSshConfig,\n type SSHConfig,\n type SSHConfigRedacted,\n} from './resource/ssh/config.ts'\nexport { SSHAccessor } from './accessor/ssh.ts'\nexport { SSH_PROMPT } from './resource/ssh/prompt.ts'\nexport { SSH_COMMANDS } from './commands/builtin/ssh/index.ts'\nexport { SSH_OPS } from './ops/ssh/index.ts'\nexport { DiscordResource, type DiscordResourceState } from './resource/discord/discord.ts'\nexport {\n normalizeDiscordConfig,\n redactDiscordConfig,\n type DiscordConfig,\n type DiscordConfigRedacted,\n} from './resource/discord/config.ts'\nexport { TrelloResource, type TrelloResourceState } from './resource/trello/trello.ts'\nexport {\n normalizeTrelloConfig,\n redactTrelloConfig,\n type TrelloConfig,\n type TrelloConfigRedacted,\n} from './resource/trello/config.ts'\nexport { LinearResource, type LinearResourceState } from './resource/linear/linear.ts'\nexport {\n normalizeLinearConfig,\n redactLinearConfig,\n type LinearConfig,\n type LinearConfigRedacted,\n} from './resource/linear/config.ts'\nexport { NotionResource, type NotionResourceState } from './resource/notion/notion.ts'\nexport {\n normalizeNotionConfig,\n redactNotionConfig,\n type NotionConfig,\n type NotionConfigRedacted,\n} from './resource/notion/config.ts'\nexport { LangfuseResource, type LangfuseResourceState } from './resource/langfuse/langfuse.ts'\nexport {\n normalizeLangfuseConfig,\n redactLangfuseConfig,\n type LangfuseConfig,\n type LangfuseConfigRedacted,\n} from './resource/langfuse/config.ts'\nexport { GitHubResource, type GitHubResourceState } from './resource/github/github.ts'\nexport {\n normalizeGitHubConfig,\n redactGitHubConfig,\n type GitHubConfig,\n type GitHubConfigRedacted,\n} from './resource/github/config.ts'\nexport { GitHubCIResource, type GitHubCIResourceState } from './resource/github_ci/github_ci.ts'\nexport {\n normalizeGitHubCIConfig,\n redactGitHubCIConfig,\n type GitHubCIConfig,\n type GitHubCIConfigRedacted,\n} from './resource/github_ci/config.ts'\nexport { GDocsResource, type GDocsResourceState } from './resource/gdocs/gdocs.ts'\nexport {\n normalizeGDocsConfig,\n redactGDocsConfig,\n type GDocsConfig,\n type GDocsConfigRedacted,\n} from './resource/gdocs/config.ts'\nexport { GSheetsResource, type GSheetsResourceState } from './resource/gsheets/gsheets.ts'\nexport {\n normalizeGSheetsConfig,\n redactGSheetsConfig,\n type GSheetsConfig,\n type GSheetsConfigRedacted,\n} from './resource/gsheets/config.ts'\nexport { GSlidesResource, type GSlidesResourceState } from './resource/gslides/gslides.ts'\nexport {\n normalizeGSlidesConfig,\n redactGSlidesConfig,\n type GSlidesConfig,\n type GSlidesConfigRedacted,\n} from './resource/gslides/config.ts'\nexport { GDriveResource, type GDriveResourceState } from './resource/gdrive/gdrive.ts'\nexport {\n normalizeGDriveConfig,\n redactGDriveConfig,\n type GDriveConfig,\n type GDriveConfigRedacted,\n} from './resource/gdrive/config.ts'\nexport { DropboxResource, type DropboxResourceState } from './resource/dropbox/dropbox.ts'\nexport {\n normalizeDropboxConfig,\n redactDropboxConfig,\n type DropboxConfig,\n type DropboxConfigRedacted,\n} from './resource/dropbox/config.ts'\nexport { BoxResource, type BoxResourceState } from './resource/box/box.ts'\nexport {\n normalizeBoxConfig,\n redactBoxConfig,\n type BoxConfig,\n type BoxConfigRedacted,\n} from './resource/box/config.ts'\nexport { GmailResource, type GmailResourceState } from './resource/gmail/gmail.ts'\nexport {\n normalizeGmailConfig,\n redactGmailConfig,\n type GmailConfig,\n type GmailConfigRedacted,\n} from './resource/gmail/config.ts'\nexport { EmailResource, type EmailResourceState } from './resource/email/email.ts'\nexport {\n buildEmailConfig,\n normalizeEmailConfig,\n redactEmailConfig,\n type EmailConfig,\n type EmailConfigInput,\n type EmailConfigRedacted,\n EMAIL_PROMPT,\n EMAIL_WRITE_PROMPT,\n} from './resource/email/index.ts'\nexport { EmailAccessor } from './accessor/email.ts'\nexport { EMAIL_COMMANDS } from './commands/builtin/email/index.ts'\nexport { EMAIL_OPS } from './ops/email/index.ts'\nexport {\n buildResource,\n knownResources,\n register as registerResourceFactory,\n type ResourceFactory,\n} from './resource/registry.ts'\nexport { DISK_COMMANDS } from './commands/builtin/disk/index.ts'\nexport { REDIS_COMMANDS } from './commands/builtin/redis/index.ts'\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { readFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport {\n type CommandSafeguard,\n createShellParser,\n type ExecuteOptions,\n type ExecuteResult,\n type MountMode,\n type ProvisionResult,\n type Resource,\n type ShellParser,\n Workspace as CoreWorkspace,\n type WorkspaceOptions,\n} from '@struktoai/mirage-core'\nimport { FuseManager } from './workspace/fuse.ts'\nimport { Mount } from './workspace/mount_spec.ts'\nimport './compression_codecs.ts'\n\nconst requireCjs = createRequire(import.meta.url)\n\nlet cachedParser: Promise<ShellParser> | null = null\n\nfunction loadShellParser(): Promise<ShellParser> {\n if (cachedParser !== null) return cachedParser\n const enginePath = requireCjs.resolve('web-tree-sitter/web-tree-sitter.wasm')\n const grammarPath = requireCjs.resolve('tree-sitter-bash/tree-sitter-bash.wasm')\n cachedParser = createShellParser({\n engineWasm: readFileSync(enginePath),\n grammarWasm: readFileSync(grammarPath),\n })\n return cachedParser\n}\n\nexport type NodeWorkspaceOptions = WorkspaceOptions\n\nexport class Workspace extends CoreWorkspace {\n private fuseSetupPromise: Promise<void> | null = null\n private readonly fuseMountpointsMap = new Map<string, string>()\n private readonly fuseManagers = new Map<string, FuseManager>()\n\n constructor(resources: Record<string, Resource | Mount>, options: NodeWorkspaceOptions = {}) {\n const bareResources: Record<string, Resource> = {}\n const modeOverrides: Record<string, MountMode> = { ...(options.modeOverrides ?? {}) }\n const commandSafeguards: Record<string, Record<string, CommandSafeguard>> = {\n ...(options.commandSafeguards ?? {}),\n }\n const fuseTargets: [string, boolean | string][] = []\n for (const [prefix, value] of Object.entries(resources)) {\n if (value instanceof Mount) {\n bareResources[prefix] = value.resource\n if (value.options.mode !== undefined) modeOverrides[prefix] = value.options.mode\n if (value.options.commandSafeguards !== undefined)\n commandSafeguards[prefix] = value.options.commandSafeguards\n if (value.options.fuse !== undefined && value.options.fuse !== false)\n fuseTargets.push([prefix, value.options.fuse])\n } else {\n bareResources[prefix] = value\n }\n }\n super(bareResources, {\n ...options,\n ...(Object.keys(modeOverrides).length > 0 ? { modeOverrides } : {}),\n ...(Object.keys(commandSafeguards).length > 0 ? { commandSafeguards } : {}),\n shellParserFactory: options.shellParserFactory ?? loadShellParser,\n })\n if (fuseTargets.length > 0) {\n // Kick off mounts eagerly; await inside fuseReady() / execute() / close()\n // so callers don't need to await the constructor (Python mirrors this).\n //\n // A failed auto-mount (e.g. libfuse absent on the host) degrades to an\n // unmounted but fully usable workspace, mirroring Python: there the mount\n // runs on a daemon thread so its failure never reaches the main process.\n // On Node's single event loop we swallow it here, otherwise the unhandled\n // rejection would terminate the process under Node's default policy.\n const setups = fuseTargets.map(([prefix, target]) =>\n this.addFuseMount(prefix, typeof target === 'string' ? target : undefined).then(\n () => undefined,\n (err: unknown) => {\n process.stderr.write(\n `mirage: FUSE auto-mount failed for ${prefix}, continuing without it: ${\n err instanceof Error ? err.message : String(err)\n }\\n`,\n )\n },\n ),\n )\n this.fuseSetupPromise = Promise.all(setups).then(() => undefined)\n }\n }\n\n private registerFuseMount(prefix: string, mountpoint: string): void {\n for (const [otherPrefix, otherMp] of this.fuseMountpointsMap) {\n if (otherMp === mountpoint && otherPrefix !== prefix) {\n throw new Error(\n `FUSE mountpoint ${mountpoint} already used by prefix ${otherPrefix}; mounts need distinct paths`,\n )\n }\n }\n this.fuseMountpointsMap.set(prefix, mountpoint)\n }\n\n /**\n * Mount a workspace subtree under FUSE and own its lifecycle. Each mount gets\n * its own {@link FuseManager}, so a workspace can expose any number of FUSE\n * subtrees at once. A pinned mountpoint is collision-checked BEFORE mounting,\n * so a clash never leaves a partial kernel mount.\n */\n async addFuseMount(prefix: string, mountpoint?: string): Promise<string> {\n if (mountpoint !== undefined) this.registerFuseMount(prefix, mountpoint)\n const fm = new FuseManager()\n this.fuseManagers.set(prefix, fm)\n try {\n const mp = await fm.setup(this, {\n rootPrefix: prefix,\n ...(mountpoint !== undefined ? { mountpoint } : {}),\n })\n if (mountpoint === undefined) this.registerFuseMount(prefix, mp)\n return mp\n } catch (err) {\n // The mount never came up; drop the manager and any registered path so\n // fuseMountpoints does not misreport it as live.\n this.fuseManagers.delete(prefix)\n this.fuseMountpointsMap.delete(prefix)\n throw err\n }\n }\n\n async removeFuseMount(prefix: string): Promise<void> {\n const fm = this.fuseManagers.get(prefix)\n this.fuseManagers.delete(prefix)\n if (fm !== undefined) await fm.unmount()\n this.fuseMountpointsMap.delete(prefix)\n }\n\n get fuseMountpoints(): Record<string, string> {\n return Object.fromEntries(this.fuseMountpointsMap)\n }\n\n get fuseMountpoint(): string | null {\n if (this.fuseMountpointsMap.size === 0) return null\n if (this.fuseMountpointsMap.size > 1) {\n throw new Error('multiple FUSE mounts active; use fuseMountpoints to select one by prefix')\n }\n return this.fuseMountpointsMap.values().next().value ?? null\n }\n\n /** Await the eager per-mount fuse mounts started in the constructor. */\n async fuseReady(): Promise<void> {\n if (this.fuseSetupPromise !== null) {\n await this.fuseSetupPromise\n this.fuseSetupPromise = null\n }\n }\n\n override execute(\n command: string,\n options?: ExecuteOptions & { provision?: false | undefined },\n ): Promise<ExecuteResult>\n override execute(\n command: string,\n options: ExecuteOptions & { provision: true },\n ): Promise<ProvisionResult>\n override execute(\n command: string,\n options: ExecuteOptions,\n ): Promise<ExecuteResult | ProvisionResult>\n override async execute(\n command: string,\n options: ExecuteOptions = {},\n ): Promise<ExecuteResult | ProvisionResult> {\n await this.fuseReady()\n return super.execute(command, options)\n }\n\n override async close(): Promise<void> {\n await this.fuseReady().catch(() => undefined)\n for (const fm of this.fuseManagers.values()) await fm.unmount()\n this.fuseManagers.clear()\n this.fuseMountpointsMap.clear()\n await super.close()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { rmdirSync } from 'node:fs'\nimport type { Workspace } from '@struktoai/mirage-core'\nimport { forceUnmount, mount, type FuseHandle, type MountOptions } from '../fuse/mount.ts'\n\nconst SIGNALS = ['SIGINT', 'SIGTERM', 'SIGHUP'] as const\ntype Signal = (typeof SIGNALS)[number]\ninterface CleanupEntry {\n mountpoint: string\n handle: FuseHandle\n // Cleanup owns only generated temp directories, never explicit mountpoints.\n ownsMountpoint: boolean\n}\n\nfunction removeMountpointIfOwned(entry: { mountpoint: string; ownsMountpoint: boolean }): void {\n if (!entry.ownsMountpoint) return\n try {\n // Empty-directory cleanup only. Recursive removal is unsafe because a\n // still-mounted FUSE path can make deletes hit the mounted backend.\n rmdirSync(entry.mountpoint)\n } catch {\n // mountpoint may still be busy, non-empty, or already gone; caller can retry\n }\n}\n\n/**\n * Tracks auto-mounted FUSE handles and installs a single process-wide cleanup\n * path on SIGINT / SIGTERM / SIGHUP / `process.exit` so the kernel never ends\n * up with a stale mountpoint after the node process dies. Mirrors Python's\n * KeyboardInterrupt → `diskutil unmount force` / `fusermount -u` in mount.py.\n */\nclass FuseCleanupRegistry {\n private readonly mounts = new Set<CleanupEntry>()\n private installed = false\n private exiting = false\n\n register(entry: CleanupEntry): void {\n this.mounts.add(entry)\n this.install()\n }\n\n unregister(entry: CleanupEntry): void {\n this.mounts.delete(entry)\n }\n\n private install(): void {\n if (this.installed) return\n this.installed = true\n for (const sig of SIGNALS) {\n process.on(sig, this.onSignal)\n }\n process.on('beforeExit', this.onExit)\n process.on('exit', this.onExit)\n }\n\n private readonly onSignal = (sig: Signal): void => {\n if (this.exiting) return\n this.exiting = true\n this.drainSync()\n // Re-raise the signal so the default termination action runs after we've\n // unmounted. Node suppresses the default when a listener is attached.\n process.kill(process.pid, sig)\n }\n\n private readonly onExit = (): void => {\n if (this.exiting) return\n this.exiting = true\n this.drainSync()\n }\n\n private drainSync(): void {\n for (const entry of this.mounts) {\n forceUnmount(entry.mountpoint)\n removeMountpointIfOwned(entry)\n }\n this.mounts.clear()\n }\n}\n\nconst CLEANUP = new FuseCleanupRegistry()\n\n// Passive mounting primitive: it mounts a workspace subtree and tears it down.\n// Registry/lifecycle ownership lives on the node Workspace (addFuseMount /\n// removeFuseMount), mirroring Python's FuseManager.\nexport class FuseManager {\n private handle: FuseHandle | null = null\n private cleanupEntry: CleanupEntry | null = null\n\n get mountpoint(): string | null {\n return this.handle?.mountpoint ?? null\n }\n\n async setup(ws: Workspace, options: MountOptions = {}): Promise<string> {\n if (this.handle !== null) return this.handle.mountpoint\n const handle = await mount(ws, options)\n this.handle = handle\n this.cleanupEntry = {\n mountpoint: handle.mountpoint,\n handle,\n // Preserve the ownership decision made by mount(); unmount cleanup must\n // not infer ownership from path shape or whether the directory exists.\n ownsMountpoint: handle.ownsMountpoint,\n }\n CLEANUP.register(this.cleanupEntry)\n return handle.mountpoint\n }\n\n async unmount(): Promise<void> {\n if (this.handle === null) {\n return\n }\n const mp = this.handle.mountpoint\n try {\n await this.handle.unmount()\n } finally {\n const cleanupEntry = this.cleanupEntry\n if (cleanupEntry !== null) {\n CLEANUP.unregister(cleanupEntry)\n this.cleanupEntry = null\n }\n this.handle = null\n removeMountpointIfOwned({\n mountpoint: mp,\n ownsMountpoint: cleanupEntry?.ownsMountpoint ?? false,\n })\n }\n }\n\n async close(): Promise<void> {\n await this.unmount()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { execSync } from 'node:child_process'\nimport { mkdirSync, mkdtempSync } from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport type { Workspace } from '@struktoai/mirage-core'\nimport { loadOptionalPeer } from '../optional_peer.ts'\nimport { MirageFS } from './fs.ts'\n\nexport interface FuseHandle {\n mountpoint: string\n /** Whether Mirage created this mountpoint directory and may remove it later. */\n ownsMountpoint: boolean\n unmount: () => Promise<void>\n}\n\nexport interface MountOptions {\n /** Caller/deployment-owned mountpoint. Mirage mounts here but does not delete it. */\n mountpoint?: string\n agentId?: string\n /** Scope the mount to a single workspace mount prefix (subtree exposure). */\n rootPrefix?: string\n /**\n * When true, `@zkochan/fuse-native`'s `autoUnmount` flag is set so the\n * kernel releases the mount if the process exits abnormally. Defaults to\n * `true` on Linux, `false` on darwin — macFUSE rejects the option with\n * \"unknown option `auto_unmount'\". On darwin the SIGINT cleanup in\n * FuseManager runs `diskutil unmount force` instead.\n */\n autoUnmount?: boolean\n /** Extra options forwarded verbatim to `@zkochan/fuse-native`. */\n fuseOptions?: Record<string, unknown>\n}\n\ntype FuseConstructor = new (\n mountpoint: string,\n ops: Record<string, unknown>,\n options?: Record<string, unknown>,\n) => {\n mount: (cb: (err: Error | null) => void) => void\n unmount: (cb: (err: Error | null) => void) => void\n}\n\nasync function loadFuse(): Promise<FuseConstructor> {\n const mod = await loadOptionalPeer(\n () => import('@zkochan/fuse-native') as unknown as Promise<{ default?: FuseConstructor }>,\n {\n feature: 'FUSE support',\n packageName: '@zkochan/fuse-native',\n docsUrl: 'https://mirage.dev/typescript/setup/fuse',\n },\n )\n const Fuse = (mod.default ?? mod) as unknown as FuseConstructor\n if (typeof Fuse !== 'function') {\n throw new Error('@zkochan/fuse-native did not export a constructor')\n }\n return Fuse\n}\n\n/** Fallback unmount via platform tools — mirrors Python's SIGINT handler. */\nexport function forceUnmount(mountpoint: string): void {\n try {\n if (process.platform === 'darwin') {\n execSync(`diskutil unmount force ${JSON.stringify(mountpoint)}`, { stdio: 'ignore' })\n } else {\n execSync(`fusermount -u ${JSON.stringify(mountpoint)}`, { stdio: 'ignore' })\n }\n } catch {\n // best-effort; caller already tried the clean path\n }\n}\n\nexport async function mount(ws: Workspace, options: MountOptions = {}): Promise<FuseHandle> {\n const Fuse = await loadFuse()\n let mountpoint: string\n let ownsMountpoint = false\n if (options.mountpoint !== undefined) {\n // Pinned path: create if missing, but keep ownership with the caller.\n mkdirSync(options.mountpoint, { recursive: true })\n mountpoint = options.mountpoint\n } else {\n mountpoint = mkdtempSync(join(tmpdir(), 'mirage-fuse-'))\n ownsMountpoint = true\n }\n const agentId = options.agentId\n const mfs = new MirageFS(ws, {\n ...(agentId !== undefined ? { agentId } : {}),\n ...(options.rootPrefix !== undefined ? { rootPrefix: options.rootPrefix } : {}),\n })\n const autoUnmount = options.autoUnmount ?? process.platform === 'linux'\n // attr_timeout=0 (string: the option serializer drops falsy values) keeps\n // the kernel from caching the UNKNOWN_SIZE_SENTINEL that getattr reports\n // for size-unknown API files; the post-open fstat then reaches fgetattr,\n // which answers with the prefetched real size.\n const fuseOpts: Record<string, unknown> = {\n force: true,\n mkdir: true,\n attrTimeout: '0',\n ...(autoUnmount ? { autoUnmount: true } : {}),\n ...(options.fuseOptions ?? {}),\n }\n const fuse = new Fuse(mountpoint, mfs.ops(), fuseOpts)\n await new Promise<void>((resolve, reject) => {\n fuse.mount((err) => {\n if (err === null) resolve()\n else reject(err)\n })\n })\n return {\n mountpoint,\n ownsMountpoint,\n unmount: () =>\n new Promise<void>((resolve, reject) => {\n fuse.unmount((err) => {\n if (err === null) resolve()\n else reject(err)\n })\n }),\n }\n}\n\nexport function mountBackground(ws: Workspace, options: MountOptions = {}): Promise<FuseHandle> {\n return mount(ws, options)\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { FileType, type OpRecord, type Workspace, rstripSlash } from '@struktoai/mirage-core'\nimport { isMacosMetadata } from './platform/macos.ts'\n\nconst ENV_AGENT_ID = 'MIRAGE_AGENT_ID'\nconst MIRAGE_DIR = '/.mirage'\nconst MIRAGE_WHOAMI = '/.mirage/whoami'\n\n// FUSE errno values (negative for fuse-native callbacks; positive for errors thrown).\nconst ENOENT = -2\nconst EACCES = -13\nconst ENOTDIR = -20\nconst EEXIST = -17\nconst ENOTEMPTY = -66 // macOS; Linux is -39 — fuse-native normalizes.\nconst EIO = -5\n\nexport interface FuseAttr {\n mtime: Date\n atime: Date\n ctime: Date\n nlink: number\n size: number\n mode: number\n uid: number\n gid: number\n}\n\ninterface Handle {\n path: string\n data?: Uint8Array\n writeBuf?: [number, Uint8Array][]\n}\n\ninterface PrefetchEntry {\n data: Uint8Array\n expires: number\n}\n\nconst PREFETCH_TTL_MS = 30_000\n\n/**\n * Sentinel size reported by getattr for API-backed files where the resource\n * returns size=null up front (Trello, Linear, Slack…). Python uses libfuse's\n * `direct_io` flag to make the kernel ignore reported size and issue read()\n * regardless; @zkochan/fuse-native doesn't expose direct_io, so we instead\n * report a deliberately-large size. The read handler returns 0 once the\n * actual bytes are exhausted, which surfaces as EOF to userspace.\n *\n * Reporting a real size requires fetching the bytes — fine for `cat`, but\n * disastrous for `ls`/`ls -l` because macOS's FUSE layer calls getattr per\n * directory entry. Using a sentinel keeps `ls` cheap (no API calls) while\n * still letting `cat` work. Once a file has been opened (and its bytes\n * cached), subsequent getattrs return the real size via cachedSize().\n *\n * The cap is bounded by Node's `fs/promises` readFile path: it allocates a\n * buffer of the reported size and converts it to a utf-8 string at the end,\n * which fails with `RangeError: Invalid string length` past V8's ~512 MiB\n * string limit. 100 MiB sits well under that, covers very busy Slack\n * channels' daily history, and bounds Buffer allocation per stat.\n */\nconst UNKNOWN_SIZE_SENTINEL = 100 * 1024 * 1024 // 100 MiB\n\ntype Cb<T> = (code: number, result?: T) => void\n\nfunction classifyError(err: unknown): number {\n const code = (err as { code?: string }).code\n if (code === 'ENOTEMPTY') return ENOTEMPTY\n if (code === 'ENOTDIR') return ENOTDIR\n if (code === 'EACCES') return EACCES\n if (code === 'EEXIST') return EEXIST\n if (code === 'ENOENT') return ENOENT\n const msg = (err instanceof Error ? err.message : String(err)).toLowerCase()\n if (msg.includes('not empty') || msg.includes('enotempty')) return ENOTEMPTY\n if (msg.includes('not a directory') || msg.includes('enotdir')) return ENOTDIR\n if (msg.includes('permission') || msg.includes('eacces') || msg.includes('read-only'))\n return EACCES\n if (msg.includes('file exists') || msg.includes('eexist')) return EEXIST\n if (\n msg.includes('not found') ||\n msg.includes('no such') ||\n msg.includes('enoent') ||\n msg.includes('no mount')\n )\n return ENOENT\n return EIO\n}\n\nexport interface MirageFSOptions {\n agentId?: string\n rootPrefix?: string\n}\n\nexport class MirageFS {\n private readonly ws: Workspace\n readonly agentId: string\n private readonly now: Date\n private readonly root: string\n private readonly prefixes: string[]\n private readonly handles = new Map<number, Handle>()\n // In-memory extended attributes, keyed by FUSE path. Backends have no POSIX\n // xattrs, so these are advisory and never persisted; see setxattr.\n private readonly xattrs = new Map<string, Map<string, Buffer>>()\n private readonly prefetchCache = new Map<string, PrefetchEntry>()\n private readonly prefetchInflight = new Map<string, Promise<Uint8Array | null>>()\n private nextFh = 1\n private readonly uid: number\n private readonly gid: number\n\n constructor(ws: Workspace, options: MirageFSOptions = {}) {\n this.ws = ws\n this.agentId =\n options.agentId ??\n process.env[ENV_AGENT_ID] ??\n `agent-${Math.random().toString(36).slice(2, 10)}`\n this.now = new Date()\n this.root = options.rootPrefix !== undefined ? rstripSlash(options.rootPrefix) : ''\n // When scoped to a single mount, the FUSE root maps onto that mount and\n // there are no virtual intermediate directories to synthesize.\n this.prefixes = this.root === '' ? ws.mounts().map((m) => m.prefix) : []\n this.uid = typeof process.getuid === 'function' ? process.getuid() : 0\n this.gid = typeof process.getgid === 'function' ? process.getgid() : 0\n }\n\n // ── helpers ──────────────────────────────────────────────────────\n\n private resolve(path: string): string {\n if (this.root === '') return path\n return path === '/' ? this.root : this.root + path\n }\n\n private whoamiContent(): Uint8Array {\n const lines = [`agent: ${this.agentId}`, 'cwd: /', `mounts: ${this.prefixes.join(', ')}`]\n return new TextEncoder().encode(lines.join('\\n') + '\\n')\n }\n\n private dirStat(): FuseAttr {\n return {\n mtime: this.now,\n atime: this.now,\n ctime: this.now,\n nlink: 2,\n size: 0,\n mode: 0o040755,\n uid: this.uid,\n gid: this.gid,\n }\n }\n\n private fileStat(size: number): FuseAttr {\n return {\n mtime: this.now,\n atime: this.now,\n ctime: this.now,\n nlink: 1,\n size,\n mode: 0o100644,\n uid: this.uid,\n gid: this.gid,\n }\n }\n\n private isVirtualDir(path: string): boolean {\n const bare = rstripSlash(path)\n const normalized = bare + '/'\n for (const p of this.prefixes) {\n const pBare = rstripSlash(p)\n if (p.startsWith(normalized) || pBare === bare) return true\n }\n return false\n }\n\n private virtualChildren(path: string): string[] {\n const normalized = path === '/' ? '/' : rstripSlash(path) + '/'\n const children = new Set<string>()\n for (const p of this.prefixes) {\n if (p.startsWith(normalized) && p !== normalized) {\n const rest = p.slice(normalized.length)\n const child = rest.split('/')[0]\n if (child !== undefined && child !== '') children.add(child)\n }\n }\n return [...children].sort()\n }\n\n private cachedSize(path: string): number | null {\n for (const ctx of this.handles.values()) {\n if (ctx.path === path && ctx.data !== undefined) return ctx.data.byteLength\n }\n const entry = this.prefetchCache.get(path)\n if (entry !== undefined && entry.expires > Date.now()) return entry.data.byteLength\n return null\n }\n\n private cachedData(path: string): Uint8Array | null {\n for (const ctx of this.handles.values()) {\n if (ctx.path === path && ctx.data !== undefined) return ctx.data\n }\n const entry = this.prefetchCache.get(path)\n if (entry !== undefined && entry.expires > Date.now()) return entry.data\n if (entry !== undefined) this.prefetchCache.delete(path)\n return null\n }\n\n /**\n * Fetch bytes for a size-unknown file and cache them so the immediate\n * getattr → open → read burst (and subsequent stats within the TTL) reuse\n * the same fetch. Required because @zkochan/fuse-native doesn't expose\n * libfuse's `direct_io` flag — without a real size from getattr, the kernel\n * decides the file is empty and never issues read().\n */\n private async prefetch(path: string): Promise<Uint8Array | null> {\n const cached = this.cachedData(path)\n if (cached !== null) return cached\n const inflight = this.prefetchInflight.get(path)\n if (inflight !== undefined) return inflight\n const promise = (async (): Promise<Uint8Array | null> => {\n try {\n const data = await this.ws.fs.readFile(this.resolve(path))\n this.prefetchCache.set(path, { data, expires: Date.now() + PREFETCH_TTL_MS })\n return data\n } catch {\n return null\n } finally {\n this.prefetchInflight.delete(path)\n }\n })()\n this.prefetchInflight.set(path, promise)\n return promise\n }\n\n /** Drain and return accumulated op records (mirrors Python's drain_ops). */\n drainOps(): OpRecord[] {\n const records = [...this.ws.records]\n this.ws.records.length = 0\n return records\n }\n\n private async writeFile(path: string, data: Uint8Array): Promise<void> {\n // Keep FUSE writes on Workspace.dispatch rather than Workspace.fs.writeFile:\n // dispatch is where Mirage enforces mount modes, revision tracking, and\n // post-write invalidation. The lower-level fs helper is useful internally,\n // but using it from FUSE made READ-mode mounts reject create while still\n // allowing buffered overwrite on flush.\n await this.ws.dispatch('write', this.resolve(path), [data])\n }\n\n // ── FUSE op surface (mirrors mfusepy Operations) ─────────────────\n\n ops(): Record<string, unknown> {\n return {\n readdir: this.readdir.bind(this),\n getattr: this.getattr.bind(this),\n fgetattr: this.fgetattr.bind(this),\n open: this.open.bind(this),\n read: this.read.bind(this),\n write: this.write.bind(this),\n create: this.create.bind(this),\n unlink: this.unlink.bind(this),\n mkdir: this.mkdir.bind(this),\n rmdir: this.rmdir.bind(this),\n rename: this.rename.bind(this),\n release: this.release.bind(this),\n truncate: this.truncate.bind(this),\n flush: this.flush.bind(this),\n fsync: this.fsync.bind(this),\n utimens: this.utimens.bind(this),\n chmod: this.chmod.bind(this),\n chown: this.chown.bind(this),\n access: this.access.bind(this),\n setxattr: this.setxattr.bind(this),\n getxattr: this.getxattr.bind(this),\n listxattr: this.listxattr.bind(this),\n removexattr: this.removexattr.bind(this),\n statfs: this.statfs.bind(this),\n }\n }\n\n private getattr(path: string, cb: Cb<FuseAttr>): void {\n void (async () => {\n if (path === '/' || path === MIRAGE_DIR) {\n cb(0, this.dirStat())\n return\n }\n if (path === MIRAGE_WHOAMI) {\n cb(0, this.fileStat(this.whoamiContent().byteLength))\n return\n }\n // macOS Finder/Spotlight probes .DS_Store, ._*, .Spotlight-V100, etc.\n // Reject early to avoid hitting the ops layer.\n const name = path.slice(path.lastIndexOf('/') + 1)\n if (isMacosMetadata(name)) {\n cb(ENOENT)\n return\n }\n if (this.isVirtualDir(path)) {\n cb(0, this.dirStat())\n return\n }\n try {\n const s = await this.ws.fs.stat(this.resolve(path))\n if (s.type === FileType.DIRECTORY) {\n cb(0, this.dirStat())\n return\n }\n let size = s.size\n size ??= this.cachedSize(path) ?? UNKNOWN_SIZE_SENTINEL\n cb(0, this.fileStat(size))\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private fgetattr(path: string, fd: number, cb: Cb<FuseAttr>): void {\n // fstat(fd) after open: the open handler prefetched size-unknown files\n // into the handle, so answer with the real byte length instead of the\n // sentinel that path-based getattr reported before open.\n const ctx = this.handles.get(fd)\n if (ctx?.data !== undefined) {\n cb(0, this.fileStat(ctx.data.byteLength))\n return\n }\n this.getattr(path, cb)\n }\n\n private readdir(path: string, cb: Cb<string[]>): void {\n void (async () => {\n // `/.mirage/` virtual dir — a single pseudo file.\n if (path === MIRAGE_DIR) {\n cb(0, ['.', '..', 'whoami'])\n return\n }\n const names = new Set(this.virtualChildren(path))\n if (path === '/') names.add('.mirage')\n try {\n const entries = await this.ws.fs.readdir(this.resolve(path))\n for (const e of entries) {\n const part = rstripSlash(e).split('/').pop() ?? ''\n if (part !== '' && !isMacosMetadata(part)) names.add(part)\n }\n } catch {\n if (names.size === 0) {\n cb(ENOENT)\n return\n }\n }\n cb(0, ['.', '..', ...[...names].sort()])\n })()\n }\n\n private read(\n path: string,\n fd: number,\n buf: Buffer,\n len: number,\n pos: number,\n cb: (result: number) => void,\n ): void {\n void (async () => {\n if (path === MIRAGE_WHOAMI) {\n const data = this.whoamiContent()\n const slice = data.subarray(pos, pos + len)\n buf.set(slice, 0)\n cb(slice.byteLength)\n return\n }\n const ctx = this.handles.get(fd)\n try {\n // Filetype-aware read: no `raw: true`, so parquet/feather/hdf5/etc.\n // get routed through their read ops and surface as rendered text —\n // matches Python's `self._ops.read(path)` which also goes through\n // filetype dispatch.\n if (ctx !== undefined && ctx.data === undefined) {\n const cached = this.cachedData(path)\n ctx.data = cached ?? (await this.ws.fs.readFile(this.resolve(path)))\n }\n const data =\n ctx?.data ?? this.cachedData(path) ?? (await this.ws.fs.readFile(this.resolve(path)))\n const slice = data.subarray(pos, pos + len)\n buf.set(slice, 0)\n cb(slice.byteLength)\n } catch {\n cb(0)\n }\n })()\n }\n\n private write(\n path: string,\n fd: number,\n buf: Buffer,\n len: number,\n pos: number,\n cb: (result: number) => void,\n ): void {\n const ctx = this.handles.get(fd)\n const data = new Uint8Array(buf.subarray(0, len))\n if (ctx !== undefined) {\n ctx.writeBuf ??= []\n ctx.writeBuf.push([pos, data])\n cb(len)\n return\n }\n void (async () => {\n try {\n let existing: Uint8Array = new Uint8Array(0)\n try {\n existing = await this.ws.fs.readFile(this.resolve(path), { raw: true })\n } catch {\n // file may not exist yet\n }\n let merged = existing\n if (pos > merged.byteLength) {\n // zero-pad from end-of-file up to the write offset (sparse write).\n const padded = new Uint8Array(pos + data.byteLength)\n padded.set(merged, 0)\n padded.set(data, pos)\n merged = padded\n } else {\n const size = Math.max(merged.byteLength, pos + data.byteLength)\n const out = new Uint8Array(size)\n out.set(merged.subarray(0, pos), 0)\n out.set(data, pos)\n if (pos + data.byteLength < merged.byteLength) {\n out.set(merged.subarray(pos + data.byteLength), pos + data.byteLength)\n }\n merged = out\n }\n await this.writeFile(path, merged)\n cb(len)\n } catch {\n cb(0)\n }\n })()\n }\n\n private create(path: string, _mode: number, cb: Cb<number>): void {\n void (async () => {\n try {\n // Route through the resource's `create` op so backends that distinguish\n // \"create empty\" from \"write bytes\" get the right code path. Falls back\n // to writeFile(empty) when the resource doesn't expose `create`.\n try {\n await this.ws.dispatch('create', this.resolve(path))\n } catch (dispatchErr) {\n const msg = (\n dispatchErr instanceof Error ? dispatchErr.message : String(dispatchErr)\n ).toLowerCase()\n if (!msg.includes('no op')) throw dispatchErr\n await this.writeFile(path, new Uint8Array(0))\n }\n const fh = this.nextFh++\n this.handles.set(fh, { path })\n cb(0, fh)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private mkdir(path: string, _mode: number, cb: (code: number) => void): void {\n void (async () => {\n try {\n await this.ws.fs.mkdir(this.resolve(path))\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private unlink(path: string, cb: (code: number) => void): void {\n void (async () => {\n try {\n await this.ws.fs.unlink(this.resolve(path))\n this.xattrs.delete(path)\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private rename(src: string, dst: string, cb: (code: number) => void): void {\n void (async () => {\n try {\n await this.ws.fs.rename(this.resolve(src), this.resolve(dst))\n const moved = this.xattrs.get(src)\n if (moved !== undefined) {\n this.xattrs.delete(src)\n this.xattrs.set(dst, moved)\n }\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private rmdir(path: string, cb: (code: number) => void): void {\n void (async () => {\n try {\n // Detect non-empty directories up front so we can map to ENOTEMPTY\n // cleanly. Message-string sniffing alone (classifyError) is unreliable\n // across backends; check contents first.\n try {\n const entries = await this.ws.fs.readdir(this.resolve(path))\n if (entries.length > 0) {\n cb(ENOTEMPTY)\n return\n }\n } catch {\n // readdir failure — fall through to rmdir and let it raise the real\n // error (e.g. ENOENT for missing path).\n }\n await this.ws.fs.rmdir(this.resolve(path))\n this.xattrs.delete(path)\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private truncate(path: string, size: number, cb: (code: number) => void): void {\n void (async () => {\n try {\n // Prefer the resource's dedicated `truncate` op (atomic on most\n // backends). Fall back to read/resize/write for resources that don't\n // expose one.\n try {\n await this.ws.dispatch('truncate', this.resolve(path), [size])\n } catch (dispatchErr) {\n const msg = (\n dispatchErr instanceof Error ? dispatchErr.message : String(dispatchErr)\n ).toLowerCase()\n if (!msg.includes('no op')) throw dispatchErr\n const data = await this.ws.fs\n .readFile(this.resolve(path), { raw: true })\n .catch(() => new Uint8Array(0))\n const out = new Uint8Array(size)\n out.set(data.subarray(0, Math.min(data.byteLength, size)), 0)\n await this.writeFile(path, out)\n }\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private statfs(_path: string, cb: Cb<Record<string, number>>): void {\n cb(0, {\n bsize: 4096,\n frsize: 4096,\n blocks: 1024 * 1024,\n bfree: 1024 * 1024,\n bavail: 1024 * 1024,\n files: 1_000_000,\n ffree: 1_000_000,\n favail: 1_000_000,\n namemax: 255,\n })\n }\n\n // chmod / chown / utimens / access are no-ops for the filesystem but must\n // validate path existence — callers like `touch`/`chmod` on a missing file\n // should fail with ENOENT, not silently succeed.\n\n private chmod(path: string, _mode: number, cb: (code: number) => void): void {\n this.getattrValidate(path, cb)\n }\n\n private chown(path: string, _uid: number, _gid: number, cb: (code: number) => void): void {\n this.getattrValidate(path, cb)\n }\n\n private utimens(path: string, _atime: Date, _mtime: Date, cb: (code: number) => void): void {\n this.getattrValidate(path, cb)\n }\n\n private access(path: string, _amode: number, cb: (code: number) => void): void {\n this.getattrValidate(path, cb)\n }\n\n // Mirage backends (S3, etc.) have no POSIX extended attributes, so there is\n // nothing to persist xattrs to. We keep them in memory per mount so tools that\n // probe or set xattrs (sandbox runtimes, rsync -aX, tar --xattrs, cp -p, macOS\n // Finder writing com.apple.*) succeed instead of failing with ENOTSUP. The\n // values live only for the mount's lifetime and are never written to the\n // backend.\n private setxattr(\n path: string,\n name: string,\n value: Buffer,\n _position: number,\n _flags: number,\n cb: (code: number) => void,\n ): void {\n this.getattr(path, (code) => {\n if (code !== 0) {\n cb(code)\n return\n }\n let attrs = this.xattrs.get(path)\n if (attrs === undefined) {\n attrs = new Map()\n this.xattrs.set(path, attrs)\n }\n attrs.set(name, Buffer.from(value))\n cb(0)\n })\n }\n\n private getxattr(\n path: string,\n name: string,\n _position: number,\n cb: (code: number, value?: Buffer) => void,\n ): void {\n this.getattr(path, (code) => {\n if (code !== 0) {\n cb(code)\n return\n }\n // A missing value tells fuse-native to report ENOATTR/ENODATA.\n cb(0, this.xattrs.get(path)?.get(name))\n })\n }\n\n private listxattr(path: string, cb: (code: number, list?: string[]) => void): void {\n this.getattr(path, (code) => {\n if (code !== 0) {\n cb(code)\n return\n }\n const attrs = this.xattrs.get(path)\n cb(0, attrs ? [...attrs.keys()] : [])\n })\n }\n\n private removexattr(path: string, name: string, cb: (code: number) => void): void {\n this.getattr(path, (code) => {\n if (code !== 0) {\n cb(code)\n return\n }\n this.xattrs.get(path)?.delete(name)\n cb(0)\n })\n }\n\n private getattrValidate(path: string, cb: (code: number) => void): void {\n // getattr's callback returns 0 on success and a negative errno on failure\n // (FUSE convention). Pass the code straight through so missing paths\n // surface as ENOENT instead of silently succeeding.\n this.getattr(path, (code) => {\n cb(code)\n })\n }\n\n private open(path: string, _flags: number, cb: Cb<number>): void {\n void (async () => {\n if (path === MIRAGE_WHOAMI) {\n const fh = this.nextFh++\n this.handles.set(fh, { path })\n cb(0, fh)\n return\n }\n try {\n const s = await this.ws.fs.stat(this.resolve(path))\n const ctx: Handle = { path }\n if (s.size === null && s.type !== FileType.DIRECTORY) {\n const data = await this.prefetch(path)\n if (data !== null) ctx.data = data\n }\n const fh = this.nextFh++\n this.handles.set(fh, ctx)\n cb(0, fh)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private release(_path: string, fd: number, cb: (code: number) => void): void {\n // Python does NOT flush on release — the kernel always issues flush first.\n // Auto-flushing here would conflict on error paths and hide real failures.\n this.handles.delete(fd)\n cb(0)\n }\n\n private flush(path: string, fd: number, cb: (code: number) => void): void {\n const ctx = this.handles.get(fd)\n if (ctx?.writeBuf === undefined || ctx.writeBuf.length === 0) {\n cb(0)\n return\n }\n const writes = ctx.writeBuf\n ctx.writeBuf = []\n void (async () => {\n try {\n let existing: Uint8Array = new Uint8Array(0)\n try {\n existing = await this.ws.fs.readFile(this.resolve(path), { raw: true })\n } catch {\n // ignore\n }\n let total = existing.byteLength\n for (const [off, chunk] of writes) {\n total = Math.max(total, off + chunk.byteLength)\n }\n const merged = new Uint8Array(total)\n merged.set(existing, 0)\n for (const [off, chunk] of writes) {\n merged.set(chunk, off)\n }\n await this.writeFile(path, merged)\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private fsync(path: string, _datasync: number, fd: number, cb: (code: number) => void): void {\n this.flush(path, fd, cb)\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nconst MACOS_METADATA: ReadonlySet<string> = new Set([\n '.DS_Store',\n '.Spotlight-V100',\n '.fseventsd',\n '.Trashes',\n])\n\nexport function isMacosMetadata(name: string): boolean {\n return MACOS_METADATA.has(name) || name.startsWith('._')\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { CommandSafeguard, MountMode, Resource } from '@struktoai/mirage-core'\n\nexport interface MountSpecOptions {\n /** Per-mount mode override; falls back to the workspace default when unset. */\n mode?: MountMode\n /** `true` mounts at a temp dir; a string pins the mountpoint to that path. */\n fuse?: boolean | string\n commandSafeguards?: Record<string, CommandSafeguard>\n}\n\nexport class Mount {\n constructor(\n readonly resource: Resource,\n readonly options: MountSpecOptions = {},\n ) {}\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { createRequire } from 'node:module'\nimport { registerCompressionCodec } from '@struktoai/mirage-core'\n\ninterface Bzip2Module {\n compressFile(input: Uint8Array): Uint8Array\n decompressFile(input: Uint8Array): Uint8Array\n}\n\ninterface XzModule {\n compress(input: Uint8Array): Promise<Uint8Array>\n decompress(input: Uint8Array): Promise<Uint8Array>\n}\n\n// compressjs and @napi-rs/lzma are CommonJS; load them via createRequire so\n// the built ESM output resolves their exports without named-import interop\n// pitfalls (mirrors the createRequire usage in workspace.ts).\nconst requireCjs = createRequire(import.meta.url)\nconst { Bzip2 } = requireCjs('compressjs') as { Bzip2: Bzip2Module }\nconst { xz } = requireCjs('@napi-rs/lzma') as { xz: XzModule }\n\nregisterCompressionCodec('bzip2', {\n compress: (bytes) => Promise.resolve(Uint8Array.from(Bzip2.compressFile(bytes))),\n decompress: (bytes) => Promise.resolve(Uint8Array.from(Bzip2.decompressFile(bytes))),\n})\n\nregisterCompressionCodec('xz', {\n compress: async (bytes) => new Uint8Array(await xz.compress(Buffer.from(bytes))),\n decompress: async (bytes) => new Uint8Array(await xz.decompress(Buffer.from(bytes))),\n})\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { appendFile, mkdir, readdir, readFile, rmdir, unlink, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\nimport type { ObserverStore } from '@struktoai/mirage-core'\n\n/**\n * ObserverStore backed by a directory of JSONL files. Created lazily on\n * first append. Mirrors the Python DiskObserverStore.\n */\nexport class DiskObserverStore implements ObserverStore {\n private readonly root: string\n\n constructor(root: string) {\n this.root = root\n }\n\n private abs(key: string): string {\n return path.join(this.root, key.replace(/^\\/+/, ''))\n }\n\n async append(key: string, data: Uint8Array): Promise<void> {\n const absPath = this.abs(key)\n await mkdir(path.dirname(absPath), { recursive: true })\n await appendFile(absPath, data)\n }\n\n async write(key: string, data: Uint8Array): Promise<void> {\n const absPath = this.abs(key)\n await mkdir(path.dirname(absPath), { recursive: true })\n await writeFile(absPath, data)\n }\n\n readAll(): Promise<Map<string, Uint8Array>> {\n return this.readMatching('')\n }\n\n async readMatching(suffix: string): Promise<Map<string, Uint8Array>> {\n const out = new Map<string, Uint8Array>()\n const { files } = await this.walk()\n for (const absPath of files) {\n const rel = '/' + path.relative(this.root, absPath)\n if (!rel.endsWith(suffix)) continue\n out.set(rel, new Uint8Array(await readFile(absPath)))\n }\n return out\n }\n\n async clear(): Promise<void> {\n const { files, dirs } = await this.walk()\n for (const absPath of files) await unlink(absPath)\n for (const d of [...dirs].reverse()) await rmdir(d)\n }\n\n close(): Promise<void> {\n return Promise.resolve()\n }\n\n private async walk(): Promise<{ files: string[]; dirs: string[] }> {\n const files: string[] = []\n const dirs: string[] = []\n const stack: string[] = [this.root]\n while (stack.length > 0) {\n const d = stack.pop()\n if (d === undefined) break\n let entries\n try {\n entries = await readdir(d, { withFileTypes: true })\n } catch {\n continue\n }\n dirs.push(d)\n for (const entry of entries) {\n const full = path.join(d, entry.name)\n if (entry.isDirectory()) stack.push(full)\n else files.push(full)\n }\n }\n return { files, dirs }\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { RedisClientType } from 'redis'\nimport type { ObserverStore } from '@struktoai/mirage-core'\nimport { loadOptionalPeer } from '../optional_peer.ts'\n\nexport interface RedisObserverStoreOptions {\n url?: string\n keyPrefix?: string\n}\n\n/**\n * ObserverStore backed by Redis strings (one key per JSONL file).\n *\n * Appends use the atomic Redis APPEND command; an index set tracks which\n * file keys exist so readAll needs no SCAN. Mirrors the Python\n * RedisObserverStore.\n */\nexport class RedisObserverStore implements ObserverStore {\n readonly url: string\n private readonly prefix: string\n private readonly indexKey: string\n private clientPromise: Promise<RedisClientType> | null = null\n\n constructor(options: RedisObserverStoreOptions = {}) {\n this.url = options.url ?? 'redis://localhost:6379/0'\n this.prefix = options.keyPrefix ?? 'mirage:observer:'\n this.indexKey = `${this.prefix}keys`\n }\n\n private async client(): Promise<RedisClientType> {\n this.clientPromise ??= (async () => {\n const mod = await loadOptionalPeer(\n () =>\n import('redis') as unknown as Promise<{\n createClient: (o: { url: string }) => RedisClientType\n }>,\n { feature: 'RedisObserverStore', packageName: 'redis' },\n )\n const c = mod.createClient({\n url: this.url,\n socket: { reconnectStrategy: false },\n } as Parameters<typeof mod.createClient>[0])\n await c.connect()\n return c\n })()\n return this.clientPromise\n }\n\n async append(key: string, data: Uint8Array): Promise<void> {\n const c = await this.client()\n const buf = Buffer.from(data.buffer, data.byteOffset, data.byteLength)\n await c.multi().append(`${this.prefix}${key}`, buf).sAdd(this.indexKey, key).exec()\n }\n\n async write(key: string, data: Uint8Array): Promise<void> {\n const c = await this.client()\n const buf = Buffer.from(data.buffer, data.byteOffset, data.byteLength)\n await c.multi().set(`${this.prefix}${key}`, buf).sAdd(this.indexKey, key).exec()\n }\n\n readAll(): Promise<Map<string, Uint8Array>> {\n return this.readMatching('')\n }\n\n async readMatching(suffix: string): Promise<Map<string, Uint8Array>> {\n const paths = (await this.indexedPaths()).filter((p) => p.endsWith(suffix))\n return this.readPaths(paths)\n }\n\n private async indexedPaths(): Promise<string[]> {\n const c = await this.client()\n const members = await c.sMembers(this.indexKey)\n return [...members].sort()\n }\n\n private async readPaths(paths: string[]): Promise<Map<string, Uint8Array>> {\n const out = new Map<string, Uint8Array>()\n if (paths.length === 0) return out\n const c = await this.client()\n const mod = (await import('redis')) as unknown as {\n RESP_TYPES: { readonly BLOB_STRING: number }\n }\n const mapping: Record<number, unknown> = { [mod.RESP_TYPES.BLOB_STRING]: Buffer }\n const typed = c as unknown as {\n withTypeMapping: (m: Record<number, unknown>) => {\n mGet: (keys: string[]) => Promise<(Buffer | null)[]>\n }\n }\n const values = await typed.withTypeMapping(mapping).mGet(paths.map((p) => `${this.prefix}${p}`))\n paths.forEach((p, i) => {\n const raw = values[i]\n out.set(p, raw === null || raw === undefined ? new Uint8Array() : new Uint8Array(raw))\n })\n return out\n }\n\n async clear(): Promise<void> {\n const c = await this.client()\n const paths = await this.indexedPaths()\n const keys = [...paths.map((p) => `${this.prefix}${p}`), this.indexKey]\n if (keys.length > 0) await c.del(keys)\n }\n\n async close(): Promise<void> {\n if (this.clientPromise === null) return\n const c = await this.clientPromise\n await c.quit()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { Buffer } from 'node:buffer'\nimport { createRequire } from 'node:module'\nimport { FileType, type Workspace } from '@struktoai/mirage-core'\n\nconst requireCjs = createRequire(import.meta.url)\nconst fs = requireCjs('node:fs') as Record<string, unknown>\n// fs-monkey ships no types\nconst fsMonkey = requireCjs('fs-monkey') as {\n patchFs: (vol: unknown, target?: unknown) => void\n}\nconst { patchFs } = fsMonkey\n\ntype Cb<T> = (err: NodeJS.ErrnoException | null, value?: T) => void\n\ntype FsLike = Record<string, unknown>\n\nfunction mountedPath(ws: Workspace, p: string): boolean {\n try {\n return ws.registry.mountFor(p) !== null\n } catch {\n return false\n }\n}\n\nasync function mirageStat(ws: Workspace, p: string): Promise<unknown> {\n const s = await ws.fs.stat(p)\n const isDir = s.type === FileType.DIRECTORY\n const mtime = s.modified !== null ? new Date(s.modified) : new Date(0)\n return {\n isFile: () => !isDir,\n isDirectory: () => isDir,\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isSymbolicLink: () => false,\n isFIFO: () => false,\n isSocket: () => false,\n size: s.size ?? 0,\n mtime,\n mtimeMs: mtime.getTime(),\n atime: mtime,\n atimeMs: mtime.getTime(),\n ctime: mtime,\n ctimeMs: mtime.getTime(),\n birthtime: mtime,\n birthtimeMs: mtime.getTime(),\n mode: 0,\n nlink: 1,\n uid: 0,\n gid: 0,\n rdev: 0,\n blksize: 0,\n blocks: 0,\n dev: 0,\n ino: 0,\n }\n}\n\n/**\n * Monkey-patch Node's `fs` module so that paths under any mirage mount\n * route through the workspace. Paths NOT under a mount fall through to\n * the real native fs. CJS-friendly; for ESM code you still need to use\n * `ws.fs.*` directly since ESM bindings are frozen.\n *\n * Returns a `restore()` function that undoes the patch.\n */\nexport function patchNodeFs(ws: Workspace): () => void {\n const originalFs: FsLike = { ...(fs as unknown as FsLike) }\n\n const vol: FsLike = {\n promises: {\n readFile: async (p: string, opts?: { encoding?: BufferEncoding } | BufferEncoding) => {\n if (mountedPath(ws, p)) {\n const bytes = await ws.fs.readFile(p)\n const encoding = typeof opts === 'string' ? opts : opts?.encoding\n if (encoding !== undefined) return Buffer.from(bytes).toString(encoding)\n return Buffer.from(bytes)\n }\n const native = (originalFs.promises as FsLike).readFile as (\n path: string,\n opts?: unknown,\n ) => Promise<Uint8Array | string>\n return native(p, opts)\n },\n writeFile: async (p: string, data: Uint8Array | string): Promise<void> => {\n if (mountedPath(ws, p)) {\n await ws.fs.writeFile(p, typeof data === 'string' ? data : data)\n return\n }\n const native = (originalFs.promises as FsLike).writeFile as (\n path: string,\n data: Uint8Array | string,\n ) => Promise<void>\n await native(p, data)\n },\n readdir: async (p: string): Promise<string[]> => {\n if (mountedPath(ws, p)) {\n // Workspace returns full paths; Node's fs.promises.readdir returns basenames.\n // Strip trailing slash on directory entries before slicing so dirs\n // don't collapse to ''.\n const entries = await ws.fs.readdir(p)\n return entries.map((e) => {\n const trimmed = e.endsWith('/') ? e.slice(0, -1) : e\n return trimmed.slice(trimmed.lastIndexOf('/') + 1)\n })\n }\n const native = (originalFs.promises as FsLike).readdir as (\n path: string,\n ) => Promise<string[]>\n return native(p)\n },\n stat: async (p: string): Promise<unknown> => {\n if (mountedPath(ws, p)) return mirageStat(ws, p)\n const native = (originalFs.promises as FsLike).stat as (path: string) => Promise<unknown>\n return native(p)\n },\n unlink: async (p: string): Promise<void> => {\n if (mountedPath(ws, p)) return ws.fs.unlink(p)\n const native = (originalFs.promises as FsLike).unlink as (path: string) => Promise<void>\n await native(p)\n },\n mkdir: async (p: string): Promise<void> => {\n if (mountedPath(ws, p)) return ws.fs.mkdir(p)\n const native = (originalFs.promises as FsLike).mkdir as (path: string) => Promise<void>\n await native(p)\n },\n rmdir: async (p: string): Promise<void> => {\n if (mountedPath(ws, p)) return ws.fs.rmdir(p)\n const native = (originalFs.promises as FsLike).rmdir as (path: string) => Promise<void>\n await native(p)\n },\n },\n readFileSync: (): Uint8Array => {\n throw new Error('mirage.patchNodeFs: sync fs methods not supported — use fs.promises.*')\n },\n readFile: (p: string, cb: Cb<Uint8Array>) => {\n if (mountedPath(ws, p)) {\n ws.fs\n .readFile(p)\n .then((data) => {\n cb(null, Buffer.from(data))\n })\n .catch((err: unknown) => {\n cb(err as NodeJS.ErrnoException)\n })\n return\n }\n const native = originalFs.readFile as (path: string, cb: Cb<Uint8Array>) => void\n native(p, cb)\n },\n readdir: (p: string, cb: Cb<string[]>) => {\n if (mountedPath(ws, p)) {\n ws.fs\n .readdir(p)\n .then((entries) => {\n cb(\n null,\n entries.map((e) => {\n const trimmed = e.endsWith('/') ? e.slice(0, -1) : e\n return trimmed.slice(trimmed.lastIndexOf('/') + 1)\n }),\n )\n })\n .catch((err: unknown) => {\n cb(err as NodeJS.ErrnoException)\n })\n return\n }\n const native = originalFs.readdir as (path: string, cb: Cb<string[]>) => void\n native(p, cb)\n },\n }\n\n patchFs(vol, fs)\n return function restore(): void {\n for (const [k, v] of Object.entries(originalFs)) {\n const desc = Object.getOwnPropertyDescriptor(fs, k)\n if (desc?.writable === false && desc.set === undefined) continue\n try {\n fs[k] = v\n } catch {\n // some fs properties are accessor-only and can't be reassigned; skip\n }\n }\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n type Accessor,\n type CommandOpts,\n type IndexCacheStore,\n type PathSpec,\n Precision,\n ProvisionResult,\n type Resource,\n} from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../../accessor/redis.ts'\nimport { stat as redisStat } from '../../../core/redis/stat.ts'\n\nexport interface RedisResourceLike extends Resource {\n readonly accessor: RedisAccessor\n}\n\ninterface ResolvedSizes {\n resolved: [string, number][]\n missing: number\n}\n\nasync function resolveSizes(\n accessor: RedisAccessor,\n paths: readonly PathSpec[],\n index: IndexCacheStore | undefined,\n): Promise<ResolvedSizes> {\n const resolved: [string, number][] = []\n let missing = 0\n for (const p of paths) {\n const pathStr = p.original\n let size: number | null = null\n if (index !== undefined) {\n const lookup = await index.get(pathStr)\n if (lookup.entry !== undefined && lookup.entry !== null) {\n size = lookup.entry.size\n }\n }\n if (size === null) {\n try {\n const fileStat = await redisStat(accessor, p)\n size = fileStat.size\n } catch {\n // fall through — size stays null\n }\n }\n if (size !== null) {\n resolved.push([pathStr, size])\n } else {\n missing += 1\n }\n }\n return { resolved, missing }\n}\n\nexport async function fileReadProvision(\n accessor: Accessor,\n paths: PathSpec[],\n _texts: string[],\n _opts: CommandOpts,\n): Promise<ProvisionResult> {\n if (paths.length === 0) {\n return new ProvisionResult({ precision: Precision.UNKNOWN })\n }\n const { resolved, missing } = await resolveSizes(accessor as RedisAccessor, paths, undefined)\n if (missing > 0 || resolved.length === 0) {\n return new ProvisionResult({ precision: Precision.UNKNOWN })\n }\n const total = resolved.reduce((sum, [, size]) => sum + size, 0)\n return new ProvisionResult({\n networkReadLow: total,\n networkReadHigh: total,\n readOps: resolved.length,\n precision: Precision.EXACT,\n })\n}\n\nexport async function headTailProvision(\n accessor: Accessor,\n paths: PathSpec[],\n _texts: string[],\n _opts: CommandOpts,\n): Promise<ProvisionResult> {\n if (paths.length === 0) {\n return new ProvisionResult({ precision: Precision.UNKNOWN })\n }\n const { resolved, missing } = await resolveSizes(accessor as RedisAccessor, paths, undefined)\n if (missing > 0 || resolved.length === 0) {\n return new ProvisionResult({ precision: Precision.UNKNOWN })\n }\n const total = resolved.reduce((sum, [, size]) => sum + size, 0)\n return new ProvisionResult({\n networkReadLow: total,\n networkReadHigh: total,\n readOps: resolved.length,\n precision: Precision.EXACT,\n })\n}\n\nexport function metadataProvision(\n _accessor: Accessor,\n paths: PathSpec[],\n _texts: string[],\n _opts: CommandOpts,\n): ProvisionResult {\n const n = Math.max(1, paths.length > 0 ? paths.length : 1)\n return new ProvisionResult({\n networkReadLow: 0,\n networkReadHigh: 0,\n readOps: n,\n precision: Precision.EXACT,\n })\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n type FileCache,\n defaultFingerprint,\n parseLimit,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { RedisClientType } from 'redis'\nimport { RedisResource, type RedisResourceOptions } from '../../resource/redis/redis.ts'\n\nexport interface RedisFileCacheOptions extends RedisResourceOptions {\n cacheLimit?: string | number\n maxDrainBytes?: number | null\n}\n\nexport class RedisFileCacheStore extends RedisResource implements FileCache {\n private readonly limit: number\n private readonly dataPrefix: string\n private readonly metaPrefix: string\n maxDrainBytes: number | null\n\n constructor(options: RedisFileCacheOptions = {}) {\n super({\n url: options.url ?? 'redis://localhost:6379/0',\n keyPrefix: options.keyPrefix ?? 'mirage:cache:',\n })\n this.limit = parseLimit(options.cacheLimit ?? '512MB')\n this.dataPrefix = `${this.keyPrefix}data:`\n this.metaPrefix = `${this.keyPrefix}meta:`\n this.maxDrainBytes = options.maxDrainBytes ?? null\n }\n\n readonly cacheSize = 0\n\n get cacheLimit(): number {\n return this.limit\n }\n\n cacheClient(): Promise<RedisClientType> {\n return this.store.client()\n }\n\n async get(key: string): Promise<Uint8Array | null> {\n const c = await this.cacheClient()\n const mod = await this.module()\n const blob = mod.RESP_TYPES.BLOB_STRING\n const mapping: Record<number, unknown> = { [blob]: Buffer }\n const typed = c as unknown as {\n withTypeMapping: (m: Record<number, unknown>) => {\n get: (k: string) => Promise<Buffer | null>\n }\n }\n const raw = await typed.withTypeMapping(mapping).get(`${this.dataPrefix}${key}`)\n if (raw === null) return null\n return new Uint8Array(raw.buffer, raw.byteOffset, raw.byteLength)\n }\n\n async set(\n key: string,\n data: Uint8Array,\n options: { fingerprint?: string | null; ttl?: number | null } = {},\n ): Promise<void> {\n const fp = options.fingerprint ?? defaultFingerprint(data)\n const c = await this.cacheClient()\n const dk = `${this.dataPrefix}${key}`\n const mk = `${this.metaPrefix}${key}`\n const pipe = c.multi()\n pipe.set(dk, Buffer.from(data.buffer, data.byteOffset, data.byteLength))\n pipe.set(mk, fp)\n if (options.ttl !== null && options.ttl !== undefined) {\n pipe.expire(dk, options.ttl)\n pipe.expire(mk, options.ttl)\n }\n await pipe.exec()\n }\n\n async add(\n key: string,\n data: Uint8Array,\n options: { fingerprint?: string | null; ttl?: number | null } = {},\n ): Promise<boolean> {\n const c = await this.cacheClient()\n const exists = await c.exists(`${this.dataPrefix}${key}`)\n if (exists) return false\n await this.set(key, data, options)\n return true\n }\n\n async remove(key: string): Promise<void> {\n const c = await this.cacheClient()\n const pipe = c.multi()\n pipe.del(`${this.dataPrefix}${key}`)\n pipe.del(`${this.metaPrefix}${key}`)\n await pipe.exec()\n }\n\n async exists(key: string | PathSpec): Promise<boolean> {\n const k = typeof key === 'string' ? key : key.stripPrefix\n const c = await this.cacheClient()\n return (await c.exists(`${this.dataPrefix}${k}`)) > 0\n }\n\n async isFresh(key: string, remoteFingerprint: string): Promise<boolean> {\n const c = await this.cacheClient()\n const fp = await c.get(`${this.metaPrefix}${key}`)\n if (fp === null) return false\n return fp === remoteFingerprint\n }\n\n async clear(): Promise<void> {\n const c = await this.cacheClient()\n for (const pattern of [`${this.dataPrefix}*`, `${this.metaPrefix}*`]) {\n const batch: string[] = []\n for await (const k of c.scanIterator({ MATCH: pattern })) {\n if (Array.isArray(k)) batch.push(...k)\n else batch.push(k)\n }\n if (batch.length > 0) await c.del(batch)\n }\n }\n\n async allCached(keys: readonly string[]): Promise<boolean> {\n for (const k of keys) {\n if (!(await this.exists(k))) return false\n }\n return true\n }\n\n async multiGet(keys: readonly string[]): Promise<(Uint8Array | null)[]> {\n const out: (Uint8Array | null)[] = []\n for (const k of keys) out.push(await this.get(k))\n return out\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n type HfRepoConfig,\n type HfRepoConfigRedacted,\n normalizeHfRepoConfig,\n redactHfRepoConfig,\n} from '../hf_buckets/config.ts'\n\nexport type HfModelsConfig = HfRepoConfig\nexport type HfModelsConfigRedacted = HfRepoConfigRedacted\n\nexport const normalizeHfModelsConfig = normalizeHfRepoConfig\nexport const redactHfModelsConfig = redactHfRepoConfig\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n BaseResource,\n type FileStat,\n LANCEDB_COMMANDS,\n LANCEDB_OPS,\n LANCEDB_PROMPT,\n LanceDBAccessor,\n type LanceDBConfig,\n type LanceDBConfigResolved,\n lanceRead,\n lanceReaddir,\n lanceStat,\n type PathSpec,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n ResourceName,\n resolveLanceDBConfig,\n} from '@struktoai/mirage-core'\nimport { LanceDBStore } from './store.ts'\n\nconst REMOTE_SCHEMES = ['s3://', 'gs://', 'az://', 'hf://', 'db://']\n\nexport interface LanceDBResourceOptions {\n config: LanceDBConfig\n}\n\nexport class LanceDBResource extends BaseResource implements Resource {\n readonly kind: string = ResourceName.LANCEDB\n readonly cachesReads: boolean\n readonly indexTtl: number = 0\n readonly prompt: string = LANCEDB_PROMPT\n readonly config: LanceDBConfigResolved\n readonly store: LanceDBStore\n readonly accessor: LanceDBAccessor\n\n constructor(options: LanceDBResourceOptions | LanceDBConfig) {\n super()\n const config = 'config' in options ? options.config : options\n this.config = resolveLanceDBConfig(config)\n this.cachesReads = REMOTE_SCHEMES.some((scheme) => this.config.uri.startsWith(scheme))\n this.store = new LanceDBStore(this.config)\n this.accessor = new LanceDBAccessor(this.store, this.config)\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n async close(): Promise<void> {\n await this.store.close()\n }\n\n ops(): readonly RegisteredOp[] {\n return LANCEDB_OPS\n }\n\n commands(): readonly RegisteredCommand[] {\n return LANCEDB_COMMANDS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return lanceRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return lanceReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return lanceStat(this.accessor, p, this.index)\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { Connection, Table } from '@lancedb/lancedb'\nimport {\n loadOptionalPeer,\n type LanceDriver,\n type LanceRow,\n type LanceDBConfigResolved,\n} from '@struktoai/mirage-core'\n\nfunction toStr(value: unknown): string {\n if (value === null || value === undefined) return ''\n if (typeof value === 'object') return JSON.stringify(value)\n return String(value as string | number | boolean | bigint)\n}\n\nfunction eqClause(column: string, value: string): string {\n if (/^-?\\d+$/.test(value)) return `${column} = ${value}`\n return `${column} = '${value.replace(/'/g, \"''\")}'`\n}\n\nfunction whereClause(filters: Record<string, string>): string {\n return Object.entries(filters)\n .map(([col, val]) => eqClause(col, val))\n .join(' AND ')\n}\n\nexport class LanceDBStore implements LanceDriver {\n private readonly config: LanceDBConfigResolved\n private db: Connection | null = null\n private readonly tables = new Map<string, Table>()\n\n constructor(config: LanceDBConfigResolved) {\n this.config = config\n }\n\n private async connection(): Promise<Connection> {\n if (this.db === null) {\n const options: Record<string, unknown> = {}\n if (this.config.apiKey !== null) options.apiKey = this.config.apiKey\n if (this.config.storageOptions !== null) options.storageOptions = this.config.storageOptions\n if (this.config.uri.startsWith('db://')) {\n options.region = this.config.region\n if (this.config.hostOverride !== null) options.hostOverride = this.config.hostOverride\n }\n const { connect } = await loadOptionalPeer(() => import('@lancedb/lancedb'), {\n feature: 'LanceDBResource',\n packageName: '@lancedb/lancedb',\n })\n this.db = await connect(this.config.uri, options)\n }\n return this.db\n }\n\n private async table(name: string): Promise<Table> {\n const cached = this.tables.get(name)\n if (cached !== undefined) return cached\n const db = await this.connection()\n const tbl = await db.openTable(name)\n this.tables.set(name, tbl)\n return tbl\n }\n\n async listTables(): Promise<string[]> {\n const db = await this.connection()\n const names = await db.tableNames()\n return [...names].sort()\n }\n\n async distinct(\n table: string,\n column: string,\n filters: Record<string, string>,\n limit: number,\n ): Promise<string[]> {\n const tbl = await this.table(table)\n let query = tbl.query().select([column]).limit(limit)\n if (Object.keys(filters).length > 0) query = query.where(whereClause(filters))\n const rows = (await query.toArray()) as LanceRow[]\n const values = new Set<string>()\n for (const row of rows) {\n const v = row[column]\n if (v !== null && v !== undefined) values.add(toStr(v))\n }\n return [...values].sort()\n }\n\n async rowsMatching(\n table: string,\n filters: Record<string, string>,\n columns: string[],\n limit: number,\n ): Promise<LanceRow[]> {\n const tbl = await this.table(table)\n let query = tbl.query().select(columns).limit(limit)\n if (Object.keys(filters).length > 0) query = query.where(whereClause(filters))\n return (await query.toArray()) as LanceRow[]\n }\n\n async rowRecord(table: string, idColumn: string, rowId: string): Promise<LanceRow | null> {\n const tbl = await this.table(table)\n const rows = (await tbl\n .query()\n .where(eqClause(idColumn, rowId))\n .limit(1)\n .toArray()) as LanceRow[]\n return rows[0] ?? null\n }\n\n async search(table: string, query: string, limit: number): Promise<LanceRow[]> {\n const tbl = await this.table(table)\n return (await tbl.search(query).limit(limit).toArray()) as LanceRow[]\n }\n\n close(): Promise<void> {\n if (this.db !== null) {\n this.db.close()\n this.db = null\n }\n this.tables.clear()\n return Promise.resolve()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { normalizeFields, type Resource } from '@struktoai/mirage-core'\n\n/**\n * Construct a resource by registry name. Mirrors Python's\n * `mirage.resource.registry.build_resource`.\n *\n * Each entry is an async factory that lazy-imports its module so that\n * importing this file doesn't pull in every backend's dependencies.\n * Only the resource you actually request gets loaded — important for\n * S3/Redis whose peer deps (`@aws-sdk/client-s3`, `redis`) are optional.\n *\n * Configs are normalized from Python-style snake_case (used in YAML and\n * by the Python `mirage.config` loader) to TS-idiomatic camelCase. So\n * the same YAML file works in both Python and TS.\n */\nexport type ResourceFactory = (config: Record<string, unknown>) => Promise<Resource>\n\nconst REGISTRY: Record<string, ResourceFactory> = {\n ram: async (_config) => {\n const { RAMResource } = await import('@struktoai/mirage-core')\n return new RAMResource()\n },\n disk: async (config) => {\n const { DiskResource } = await import('./disk/disk.ts')\n const norm = normalizeFields(config) as { root: string }\n return new DiskResource(norm)\n },\n redis: async (config) => {\n const { RedisResource } = await import('./redis/redis.ts')\n const norm = normalizeFields(config)\n return new RedisResource(norm)\n },\n s3: async (config) => {\n const { S3Resource } = await import('./s3/s3.ts')\n const { normalizeS3Config } = await import('./s3/config.ts')\n return new S3Resource(normalizeS3Config(config))\n },\n gcs: async (config) => {\n const { GCSResource } = await import('./gcs/gcs.ts')\n const { normalizeGcsConfig } = await import('./gcs/config.ts')\n return new GCSResource(normalizeGcsConfig(config))\n },\n oci: async (config) => {\n const { OCIResource } = await import('./oci/oci.ts')\n const { normalizeOciConfig } = await import('./oci/config.ts')\n return new OCIResource(normalizeOciConfig(config))\n },\n r2: async (config) => {\n const { R2Resource } = await import('./r2/r2.ts')\n const { normalizeR2Config } = await import('./r2/config.ts')\n return new R2Resource(normalizeR2Config(config))\n },\n hf_buckets: async (config) => {\n const { HfBucketsResource } = await import('./hf_buckets/hf_buckets.ts')\n const { normalizeHfBucketsConfig } = await import('./hf_buckets/config.ts')\n return new HfBucketsResource(normalizeHfBucketsConfig(config))\n },\n hf_datasets: async (config) => {\n const { HfDatasetsResource } = await import('./hf_datasets/hf_datasets.ts')\n const { normalizeHfRepoConfig } = await import('./hf_buckets/config.ts')\n return new HfDatasetsResource(normalizeHfRepoConfig(config))\n },\n hf_models: async (config) => {\n const { HfModelsResource } = await import('./hf_models/hf_models.ts')\n const { normalizeHfRepoConfig } = await import('./hf_buckets/config.ts')\n return new HfModelsResource(normalizeHfRepoConfig(config))\n },\n hf_spaces: async (config) => {\n const { HfSpacesResource } = await import('./hf_spaces/hf_spaces.ts')\n const { normalizeHfRepoConfig } = await import('./hf_buckets/config.ts')\n return new HfSpacesResource(normalizeHfRepoConfig(config))\n },\n supabase: async (config) => {\n const { SupabaseResource } = await import('./supabase/supabase.ts')\n const { normalizeSupabaseConfig } = await import('./supabase/config.ts')\n return new SupabaseResource(normalizeSupabaseConfig(config))\n },\n databricks_volume: async (config) => {\n const { DatabricksVolumeResource } = await import('./databricks_volume/databricks_volume.ts')\n const { normalizeDatabricksVolumeConfig } = await import('@struktoai/mirage-core')\n return DatabricksVolumeResource.create(normalizeDatabricksVolumeConfig(config))\n },\n minio: async (config) => {\n const { MinIOResource } = await import('./minio/minio.ts')\n const { normalizeMinIOConfig } = await import('./minio/config.ts')\n return new MinIOResource(normalizeMinIOConfig(config))\n },\n ceph: async (config) => {\n const { CephResource } = await import('./ceph/ceph.ts')\n const { normalizeCephConfig } = await import('./ceph/config.ts')\n return new CephResource(normalizeCephConfig(config))\n },\n seaweedfs: async (config) => {\n const { SeaweedFSResource } = await import('./seaweedfs/seaweedfs.ts')\n const { normalizeSeaweedFSConfig } = await import('./seaweedfs/config.ts')\n return new SeaweedFSResource(normalizeSeaweedFSConfig(config))\n },\n wasabi: async (config) => {\n const { WasabiResource } = await import('./wasabi/wasabi.ts')\n const { normalizeWasabiConfig } = await import('./wasabi/config.ts')\n return new WasabiResource(normalizeWasabiConfig(config))\n },\n backblaze: async (config) => {\n const { BackblazeResource } = await import('./backblaze/backblaze.ts')\n const { normalizeBackblazeConfig } = await import('./backblaze/config.ts')\n return new BackblazeResource(normalizeBackblazeConfig(config))\n },\n digitalocean: async (config) => {\n const { DigitalOceanResource } = await import('./digitalocean/digitalocean.ts')\n const { normalizeDigitalOceanConfig } = await import('./digitalocean/config.ts')\n return new DigitalOceanResource(normalizeDigitalOceanConfig(config))\n },\n tencent: async (config) => {\n const { TencentResource } = await import('./tencent/tencent.ts')\n const { normalizeTencentConfig } = await import('./tencent/config.ts')\n return new TencentResource(normalizeTencentConfig(config))\n },\n aliyun: async (config) => {\n const { AliyunResource } = await import('./aliyun/aliyun.ts')\n const { normalizeAliyunConfig } = await import('./aliyun/config.ts')\n return new AliyunResource(normalizeAliyunConfig(config))\n },\n scaleway: async (config) => {\n const { ScalewayResource } = await import('./scaleway/scaleway.ts')\n const { normalizeScalewayConfig } = await import('./scaleway/config.ts')\n return new ScalewayResource(normalizeScalewayConfig(config))\n },\n qingstor: async (config) => {\n const { QingStorResource } = await import('./qingstor/qingstor.ts')\n const { normalizeQingStorConfig } = await import('./qingstor/config.ts')\n return new QingStorResource(normalizeQingStorConfig(config))\n },\n postgres: async (config) => {\n const { PostgresResource } = await import('./postgres/postgres.ts')\n const { normalizePostgresConfig } = await import('@struktoai/mirage-core')\n return new PostgresResource(normalizePostgresConfig(config))\n },\n mongodb: async (config) => {\n const { MongoDBResource } = await import('./mongodb/mongodb.ts')\n const { normalizeMongoDBConfig } = await import('@struktoai/mirage-core')\n return new MongoDBResource(normalizeMongoDBConfig(config))\n },\n slack: async (config) => {\n const { SlackResource } = await import('./slack/slack.ts')\n const { normalizeSlackConfig } = await import('./slack/config.ts')\n return new SlackResource(normalizeSlackConfig(config))\n },\n ssh: async (config) => {\n const { SSHResource } = await import('./ssh/ssh.ts')\n const { normalizeSshConfig } = await import('./ssh/config.ts')\n return new SSHResource(normalizeSshConfig(config))\n },\n discord: async (config) => {\n const { DiscordResource } = await import('./discord/discord.ts')\n const { normalizeDiscordConfig } = await import('./discord/config.ts')\n return new DiscordResource(normalizeDiscordConfig(config))\n },\n trello: async (config) => {\n const { TrelloResource } = await import('./trello/trello.ts')\n const { normalizeTrelloConfig } = await import('./trello/config.ts')\n return new TrelloResource(normalizeTrelloConfig(config))\n },\n linear: async (config) => {\n const { LinearResource } = await import('./linear/linear.ts')\n const { normalizeLinearConfig } = await import('./linear/config.ts')\n return new LinearResource(normalizeLinearConfig(config))\n },\n notion: async (config) => {\n const { NotionResource } = await import('./notion/notion.ts')\n const { normalizeNotionConfig } = await import('./notion/config.ts')\n return new NotionResource(normalizeNotionConfig(config))\n },\n langfuse: async (config) => {\n const { LangfuseResource } = await import('./langfuse/langfuse.ts')\n const { normalizeLangfuseConfig } = await import('./langfuse/config.ts')\n return new LangfuseResource(normalizeLangfuseConfig(config))\n },\n github: async (config) => {\n const { GitHubResource } = await import('./github/github.ts')\n const { normalizeGitHubConfig } = await import('./github/config.ts')\n return GitHubResource.create(normalizeGitHubConfig(config))\n },\n github_ci: async (config) => {\n const { GitHubCIResource } = await import('./github_ci/github_ci.ts')\n const { normalizeGitHubCIConfig } = await import('./github_ci/config.ts')\n return new GitHubCIResource(normalizeGitHubCIConfig(config))\n },\n gdocs: async (config) => {\n const { GDocsResource } = await import('./gdocs/gdocs.ts')\n const { normalizeGDocsConfig } = await import('./gdocs/config.ts')\n return new GDocsResource(normalizeGDocsConfig(config))\n },\n gsheets: async (config) => {\n const { GSheetsResource } = await import('./gsheets/gsheets.ts')\n const { normalizeGSheetsConfig } = await import('./gsheets/config.ts')\n return new GSheetsResource(normalizeGSheetsConfig(config))\n },\n gslides: async (config) => {\n const { GSlidesResource } = await import('./gslides/gslides.ts')\n const { normalizeGSlidesConfig } = await import('./gslides/config.ts')\n return new GSlidesResource(normalizeGSlidesConfig(config))\n },\n gdrive: async (config) => {\n const { GDriveResource } = await import('./gdrive/gdrive.ts')\n const { normalizeGDriveConfig } = await import('./gdrive/config.ts')\n return new GDriveResource(normalizeGDriveConfig(config))\n },\n dropbox: async (config) => {\n const { DropboxResource } = await import('./dropbox/dropbox.ts')\n const { normalizeDropboxConfig } = await import('./dropbox/config.ts')\n return new DropboxResource(normalizeDropboxConfig(config))\n },\n box: async (config) => {\n const { BoxResource } = await import('./box/box.ts')\n const { normalizeBoxConfig } = await import('./box/config.ts')\n return new BoxResource(normalizeBoxConfig(config))\n },\n gmail: async (config) => {\n const { GmailResource } = await import('./gmail/gmail.ts')\n const { normalizeGmailConfig } = await import('./gmail/config.ts')\n return new GmailResource(normalizeGmailConfig(config))\n },\n email: async (config) => {\n const { EmailResource } = await import('./email/email.ts')\n const { normalizeEmailConfig } = await import('./email/config.ts')\n return new EmailResource(normalizeEmailConfig(config))\n },\n}\n\n/**\n * Look up the registered names. Lazily-mutated by `register()` so users\n * can extend the registry with custom resources.\n */\nexport function knownResources(): string[] {\n return Object.keys(REGISTRY).sort()\n}\n\n/**\n * Register a custom resource factory under `name`. Existing entries\n * are overwritten, mirroring Python's mutable REGISTRY dict.\n */\nexport function register(name: string, factory: ResourceFactory): void {\n REGISTRY[name] = factory\n}\n\n/**\n * Build a resource instance by registry name. Throws if the name is\n * unknown.\n */\nexport async function buildResource(\n name: string,\n config: Record<string, unknown> = {},\n): Promise<Resource> {\n const factory = REGISTRY[name]\n if (factory === undefined) {\n throw new Error(\n `unknown resource ${JSON.stringify(name)}; known: ${knownResources().join(', ')}`,\n )\n }\n return factory(config)\n}\n"],"mappings":"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","names":["createRequire","path","requireCjs","createRequire","Buffer","createRequire","FileType","requireCjs","loadOptionalPeer","DiskResource","RedisResource","S3Resource","GCSResource","OCIResource","R2Resource","HfBucketsResource","normalizeHfBucketsConfig","HfDatasetsResource","normalizeHfRepoConfig","HfModelsResource","HfSpacesResource","SupabaseResource","DatabricksVolumeResource","MinIOResource","CephResource","SeaweedFSResource","WasabiResource","BackblazeResource","DigitalOceanResource","TencentResource","AliyunResource","ScalewayResource","QingStorResource","PostgresResource","MongoDBResource","SlackResource","normalizeSlackConfig","SSHResource","normalizeSshConfig","DiscordResource","normalizeDiscordConfig","TrelloResource","normalizeTrelloConfig","LinearResource","normalizeLinearConfig","NotionResource","normalizeNotionConfig","LangfuseResource","normalizeLangfuseConfig","GitHubResource","normalizeGitHubConfig","GitHubCIResource","normalizeGitHubCIConfig","GDocsResource","normalizeGDocsConfig","GSheetsResource","normalizeGSheetsConfig","GSlidesResource","normalizeGSlidesConfig","GDriveResource","normalizeGDriveConfig","DropboxResource","normalizeDropboxConfig","BoxResource","normalizeBoxConfig","GmailResource","EmailResource","normalizeEmailConfig"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/workspace.ts","../src/workspace/fuse.ts","../src/fuse/mount.ts","../src/fuse/fs.ts","../src/fuse/platform/macos.ts","../src/workspace/mount_spec.ts","../src/compression_codecs.ts","../src/observe/disk_store.ts","../src/observe/redis_store.ts","../src/workspace/namespace/disk.ts","../src/workspace/session/disk.ts","../src/workspace/namespace/redis.ts","../src/workspace/session/redis.ts","../src/workspace/store/disk.ts","../src/workspace/store/redis.ts","../src/fs_monkey.ts","../src/commands/builtin/redis/provision.ts","../src/cache/redis/file.ts","../src/resource/hf_models/config.ts","../src/resource/lancedb/lancedb.ts","../src/resource/lancedb/store.ts","../src/resource/registry.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nexport * from '@struktoai/mirage-core'\nexport { Workspace, type NodeWorkspaceOptions } from './workspace.ts'\nexport { Mount, type MountSpecOptions } from './workspace/mount_spec.ts'\nexport {\n DiskResource,\n type DiskResourceOptions,\n type DiskResourceState,\n} from './resource/disk/disk.ts'\nexport { DISK_PROMPT } from './resource/disk/prompt.ts'\nexport { DISK_OPS } from './ops/disk/index.ts'\nexport { DiskObserverStore } from './observe/disk_store.ts'\nexport { RedisObserverStore, type RedisObserverStoreOptions } from './observe/redis_store.ts'\nexport { DiskNamespaceStore } from './workspace/namespace/disk.ts'\nexport {\n RedisNamespaceStore,\n type RedisNamespaceStoreOptions,\n} from './workspace/namespace/redis.ts'\nexport { DiskRecordClient, DiskSessionStore } from './workspace/session/disk.ts'\nexport { RedisSessionStore, type RedisSessionStoreOptions } from './workspace/session/redis.ts'\nexport {\n DEFAULT_STATE_ROOT,\n DiskWorkspaceStateStore,\n type DiskWorkspaceStateStoreOptions,\n} from './workspace/store/disk.ts'\nexport {\n RedisWorkspaceStateStore,\n type RedisWorkspaceStateStoreOptions,\n} from './workspace/store/redis.ts'\nexport { patchNodeFs } from './fs_monkey.ts'\nexport {\n RedisResource,\n type RedisResourceOptions,\n type RedisResourceState,\n} from './resource/redis/redis.ts'\nexport { REDIS_PROMPT } from './resource/redis/prompt.ts'\nexport { RedisStore, type RedisStoreOptions } from './resource/redis/store.ts'\nexport { RedisAccessor } from './accessor/redis.ts'\nexport { REDIS_OPS } from './ops/redis/index.ts'\nexport {\n fileReadProvision,\n headTailProvision,\n metadataProvision,\n type RedisResourceLike,\n} from './commands/builtin/redis/provision.ts'\nexport { RedisFileCacheStore, type RedisFileCacheOptions } from './cache/redis/file.ts'\nexport { FuseManager } from './workspace/fuse.ts'\nexport { MirageFS, type MirageFSOptions, type FuseAttr } from './fuse/fs.ts'\nexport {\n mount as fuseMount,\n mountBackground as fuseMountBackground,\n type FuseHandle,\n type MountOptions as FuseMountOptions,\n} from './fuse/mount.ts'\nexport { isMacosMetadata } from './fuse/platform/macos.ts'\nexport { S3Resource, type S3ResourceState } from './resource/s3/s3.ts'\nexport { GridFSResource, type GridFSResourceState } from './resource/gridfs/gridfs.ts'\nexport {\n normalizeGridFSConfig,\n type GridFSConfig,\n type GridFSConfigRedacted,\n} from './resource/gridfs/config.ts'\nexport { GridFSAccessor } from './accessor/gridfs.ts'\nexport {\n DatabricksVolumeResource,\n type DatabricksVolumeResourceState,\n} from './resource/databricks_volume/databricks_volume.ts'\nexport {\n loadDatabricksProfile,\n parseDatabricksCfg,\n type DatabricksProfile,\n} from './resource/databricks_volume/profile.ts'\nexport {\n redactConfig as redactS3Config,\n type S3Config,\n type S3ConfigRedacted,\n} from './resource/s3/config.ts'\nexport { GCSResource, type GCSResourceState } from './resource/gcs/gcs.ts'\nexport {\n GCS_ENDPOINT,\n redactGcsConfig,\n type GCSConfig,\n type GCSConfigRedacted,\n} from './resource/gcs/config.ts'\nexport { GCS_PROMPT } from './resource/gcs/prompt.ts'\nexport { OCIResource, type OCIResourceState } from './resource/oci/oci.ts'\nexport { redactOciConfig, type OCIConfig, type OCIConfigRedacted } from './resource/oci/config.ts'\nexport { OCI_PROMPT } from './resource/oci/prompt.ts'\nexport { R2Resource, type R2ResourceState } from './resource/r2/r2.ts'\nexport { redactR2Config, type R2Config, type R2ConfigRedacted } from './resource/r2/config.ts'\nexport { R2_PROMPT } from './resource/r2/prompt.ts'\nexport { SupabaseResource, type SupabaseResourceState } from './resource/supabase/supabase.ts'\nexport {\n redactSupabaseConfig,\n resolvedSupabaseEndpoint,\n type SupabaseConfig,\n type SupabaseConfigRedacted,\n} from './resource/supabase/config.ts'\nexport { SUPABASE_PROMPT } from './resource/supabase/prompt.ts'\nexport {\n HF_RESOURCES,\n HfAccessor,\n HfBucketsAccessor,\n HfDatasetsAccessor,\n HfModelsAccessor,\n HfSpacesAccessor,\n} from './accessor/hf.ts'\nexport { HfBucketsResource, type HfBucketsResourceState } from './resource/hf_buckets/hf_buckets.ts'\nexport {\n assertHfRepoId,\n HF_ENDPOINT,\n normalizeHfBucketsConfig,\n normalizeHfRepoConfig,\n redactHfBucketsConfig,\n redactHfRepoConfig,\n type HfBucketsConfig,\n type HfBucketsConfigRedacted,\n type HfRepoConfig,\n type HfRepoConfigRedacted,\n} from './resource/hf_buckets/config.ts'\nexport { HF_BUCKETS_PROMPT } from './resource/hf_buckets/prompt.ts'\nexport {\n HfDatasetsResource,\n type HfDatasetsResourceState,\n} from './resource/hf_datasets/hf_datasets.ts'\nexport { HF_DATASETS_PROMPT } from './resource/hf_datasets/prompt.ts'\nexport { HfModelsResource, type HfModelsResourceState } from './resource/hf_models/hf_models.ts'\nexport {\n normalizeHfModelsConfig,\n redactHfModelsConfig,\n type HfModelsConfig,\n type HfModelsConfigRedacted,\n} from './resource/hf_models/config.ts'\nexport { HF_MODELS_PROMPT } from './resource/hf_models/prompt.ts'\nexport { HfSpacesResource, type HfSpacesResourceState } from './resource/hf_spaces/hf_spaces.ts'\nexport { HF_SPACES_PROMPT } from './resource/hf_spaces/prompt.ts'\nexport { HF_COMMANDS } from './commands/builtin/hf/index.ts'\nexport { HF_OPS } from './ops/hf/index.ts'\nexport { MinIOResource, type MinIOResourceState } from './resource/minio/minio.ts'\nexport {\n redactMinIOConfig,\n type MinIOConfig,\n type MinIOConfigRedacted,\n} from './resource/minio/config.ts'\nexport { MINIO_PROMPT } from './resource/minio/prompt.ts'\nexport { SeaweedFSResource, type SeaweedFSResourceState } from './resource/seaweedfs/seaweedfs.ts'\nexport {\n redactSeaweedFSConfig,\n type SeaweedFSConfig,\n type SeaweedFSConfigRedacted,\n} from './resource/seaweedfs/config.ts'\nexport { SEAWEEDFS_PROMPT } from './resource/seaweedfs/prompt.ts'\nexport { CephResource, type CephResourceState } from './resource/ceph/ceph.ts'\nexport {\n redactCephConfig,\n type CephConfig,\n type CephConfigRedacted,\n} from './resource/ceph/config.ts'\nexport { CEPH_PROMPT } from './resource/ceph/prompt.ts'\nexport { WasabiResource, type WasabiResourceState } from './resource/wasabi/wasabi.ts'\nexport {\n redactWasabiConfig,\n resolvedWasabiEndpoint,\n type WasabiConfig,\n type WasabiConfigRedacted,\n} from './resource/wasabi/config.ts'\nexport { WASABI_PROMPT } from './resource/wasabi/prompt.ts'\nexport { BackblazeResource, type BackblazeResourceState } from './resource/backblaze/backblaze.ts'\nexport {\n redactBackblazeConfig,\n resolvedBackblazeEndpoint,\n type BackblazeConfig,\n type BackblazeConfigRedacted,\n} from './resource/backblaze/config.ts'\nexport { BACKBLAZE_PROMPT } from './resource/backblaze/prompt.ts'\nexport {\n DigitalOceanResource,\n type DigitalOceanResourceState,\n} from './resource/digitalocean/digitalocean.ts'\nexport {\n redactDigitalOceanConfig,\n resolvedDigitalOceanEndpoint,\n type DigitalOceanConfig,\n type DigitalOceanConfigRedacted,\n} from './resource/digitalocean/config.ts'\nexport { DIGITALOCEAN_PROMPT } from './resource/digitalocean/prompt.ts'\nexport { TencentResource, type TencentResourceState } from './resource/tencent/tencent.ts'\nexport {\n redactTencentConfig,\n resolvedTencentEndpoint,\n type TencentConfig,\n type TencentConfigRedacted,\n} from './resource/tencent/config.ts'\nexport { TENCENT_PROMPT } from './resource/tencent/prompt.ts'\nexport { AliyunResource, type AliyunResourceState } from './resource/aliyun/aliyun.ts'\nexport {\n redactAliyunConfig,\n resolvedAliyunEndpoint,\n type AliyunConfig,\n type AliyunConfigRedacted,\n} from './resource/aliyun/config.ts'\nexport { ALIYUN_PROMPT } from './resource/aliyun/prompt.ts'\nexport { ScalewayResource, type ScalewayResourceState } from './resource/scaleway/scaleway.ts'\nexport {\n redactScalewayConfig,\n resolvedScalewayEndpoint,\n type ScalewayConfig,\n type ScalewayConfigRedacted,\n} from './resource/scaleway/config.ts'\nexport { SCALEWAY_PROMPT } from './resource/scaleway/prompt.ts'\nexport { QingStorResource, type QingStorResourceState } from './resource/qingstor/qingstor.ts'\nexport {\n redactQingStorConfig,\n resolvedQingStorEndpoint,\n type QingStorConfig,\n type QingStorConfigRedacted,\n} from './resource/qingstor/config.ts'\nexport { QINGSTOR_PROMPT } from './resource/qingstor/prompt.ts'\nexport { PostgresResource, type PostgresResourceOptions } from './resource/postgres/postgres.ts'\nexport { PostgresStore } from './resource/postgres/store.ts'\nexport { MongoDBResource, type MongoDBResourceOptions } from './resource/mongodb/mongodb.ts'\nexport { MongoDBStore } from './resource/mongodb/store.ts'\nexport { LanceDBResource, type LanceDBResourceOptions } from './resource/lancedb/lancedb.ts'\nexport { LanceDBStore } from './resource/lancedb/store.ts'\nexport { SlackResource, type SlackResourceState } from './resource/slack/slack.ts'\nexport {\n normalizeSlackConfig,\n redactSlackConfig,\n type SlackConfig,\n type SlackConfigRedacted,\n} from './resource/slack/config.ts'\nexport { SSHResource, type SSHResourceState } from './resource/ssh/ssh.ts'\nexport {\n normalizeSshConfig,\n redactSshConfig,\n type SSHConfig,\n type SSHConfigRedacted,\n} from './resource/ssh/config.ts'\nexport { SSHAccessor } from './accessor/ssh.ts'\nexport { SSH_PROMPT } from './resource/ssh/prompt.ts'\nexport { SSH_COMMANDS } from './commands/builtin/ssh/index.ts'\nexport { SSH_OPS } from './ops/ssh/index.ts'\nexport { NextcloudAccessor } from './accessor/nextcloud.ts'\nexport { NextcloudResource, type NextcloudResourceState } from './resource/nextcloud/nextcloud.ts'\nexport {\n normalizeNextcloudConfig,\n redactNextcloudConfig,\n type NextcloudConfig,\n type NextcloudConfigRedacted,\n} from './resource/nextcloud/config.ts'\nexport { NEXTCLOUD_PROMPT } from './resource/nextcloud/prompt.ts'\nexport { NEXTCLOUD_COMMANDS } from './commands/builtin/nextcloud/index.ts'\nexport { NEXTCLOUD_OPS } from './ops/nextcloud/index.ts'\nexport { DiscordResource, type DiscordResourceState } from './resource/discord/discord.ts'\nexport {\n normalizeDiscordConfig,\n redactDiscordConfig,\n type DiscordConfig,\n type DiscordConfigRedacted,\n} from './resource/discord/config.ts'\nexport { TrelloResource, type TrelloResourceState } from './resource/trello/trello.ts'\nexport {\n normalizeTrelloConfig,\n redactTrelloConfig,\n type TrelloConfig,\n type TrelloConfigRedacted,\n} from './resource/trello/config.ts'\nexport { LinearResource, type LinearResourceState } from './resource/linear/linear.ts'\nexport {\n normalizeLinearConfig,\n redactLinearConfig,\n type LinearConfig,\n type LinearConfigRedacted,\n} from './resource/linear/config.ts'\nexport { NotionResource, type NotionResourceState } from './resource/notion/notion.ts'\nexport {\n normalizeNotionConfig,\n redactNotionConfig,\n type NotionConfig,\n type NotionConfigRedacted,\n} from './resource/notion/config.ts'\nexport { LangfuseResource, type LangfuseResourceState } from './resource/langfuse/langfuse.ts'\nexport {\n normalizeLangfuseConfig,\n redactLangfuseConfig,\n type LangfuseConfig,\n type LangfuseConfigRedacted,\n} from './resource/langfuse/config.ts'\nexport { GitHubResource, type GitHubResourceState } from './resource/github/github.ts'\nexport {\n normalizeGitHubConfig,\n redactGitHubConfig,\n type GitHubConfig,\n type GitHubConfigRedacted,\n} from './resource/github/config.ts'\nexport { GitHubCIResource, type GitHubCIResourceState } from './resource/github_ci/github_ci.ts'\nexport {\n normalizeGitHubCIConfig,\n redactGitHubCIConfig,\n type GitHubCIConfig,\n type GitHubCIConfigRedacted,\n} from './resource/github_ci/config.ts'\nexport { GDocsResource, type GDocsResourceState } from './resource/gdocs/gdocs.ts'\nexport {\n normalizeGDocsConfig,\n redactGDocsConfig,\n type GDocsConfig,\n type GDocsConfigRedacted,\n} from './resource/gdocs/config.ts'\nexport { GSheetsResource, type GSheetsResourceState } from './resource/gsheets/gsheets.ts'\nexport {\n normalizeGSheetsConfig,\n redactGSheetsConfig,\n type GSheetsConfig,\n type GSheetsConfigRedacted,\n} from './resource/gsheets/config.ts'\nexport { GSlidesResource, type GSlidesResourceState } from './resource/gslides/gslides.ts'\nexport {\n normalizeGSlidesConfig,\n redactGSlidesConfig,\n type GSlidesConfig,\n type GSlidesConfigRedacted,\n} from './resource/gslides/config.ts'\nexport { GDriveResource, type GDriveResourceState } from './resource/gdrive/gdrive.ts'\nexport {\n normalizeGDriveConfig,\n redactGDriveConfig,\n type GDriveConfig,\n type GDriveConfigRedacted,\n} from './resource/gdrive/config.ts'\nexport { DropboxResource, type DropboxResourceState } from './resource/dropbox/dropbox.ts'\nexport {\n normalizeDropboxConfig,\n redactDropboxConfig,\n type DropboxConfig,\n type DropboxConfigRedacted,\n} from './resource/dropbox/config.ts'\nexport { BoxResource, type BoxResourceState } from './resource/box/box.ts'\nexport {\n normalizeBoxConfig,\n redactBoxConfig,\n type BoxConfig,\n type BoxConfigRedacted,\n} from './resource/box/config.ts'\nexport { GmailResource, type GmailResourceState } from './resource/gmail/gmail.ts'\nexport {\n normalizeGmailConfig,\n redactGmailConfig,\n type GmailConfig,\n type GmailConfigRedacted,\n} from './resource/gmail/config.ts'\nexport { EmailResource, type EmailResourceState } from './resource/email/email.ts'\nexport {\n buildEmailConfig,\n normalizeEmailConfig,\n redactEmailConfig,\n type EmailConfig,\n type EmailConfigInput,\n type EmailConfigRedacted,\n EMAIL_PROMPT,\n EMAIL_WRITE_PROMPT,\n} from './resource/email/index.ts'\nexport { EmailAccessor } from './accessor/email.ts'\nexport { EMAIL_COMMANDS } from './commands/builtin/email/index.ts'\nexport { EMAIL_OPS } from './ops/email/index.ts'\nexport {\n buildResource,\n knownResources,\n register as registerResourceFactory,\n type ResourceFactory,\n} from './resource/registry.ts'\nexport { DISK_COMMANDS } from './commands/builtin/disk/index.ts'\nexport { REDIS_COMMANDS } from './commands/builtin/redis/index.ts'\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { readFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport {\n type CommandSafeguard,\n createShellParser,\n type ExecuteOptions,\n type ExecuteResult,\n type MountSpec,\n type ProvisionResult,\n type ShellParser,\n Workspace as CoreWorkspace,\n type WorkspaceOptions,\n} from '@struktoai/mirage-core'\nimport { FuseManager } from './workspace/fuse.ts'\nimport { Mount } from './workspace/mount_spec.ts'\nimport './compression_codecs.ts'\n\nconst requireCjs = createRequire(import.meta.url)\n\nlet cachedParser: Promise<ShellParser> | null = null\n\nfunction loadShellParser(): Promise<ShellParser> {\n if (cachedParser !== null) return cachedParser\n const enginePath = requireCjs.resolve('web-tree-sitter/web-tree-sitter.wasm')\n const grammarPath = requireCjs.resolve('tree-sitter-bash/tree-sitter-bash.wasm')\n cachedParser = createShellParser({\n engineWasm: readFileSync(enginePath),\n grammarWasm: readFileSync(grammarPath),\n })\n return cachedParser\n}\n\nexport type NodeWorkspaceOptions = WorkspaceOptions\n\nexport class Workspace extends CoreWorkspace {\n private fuseSetupPromise: Promise<void> | null = null\n private readonly fuseMountpointsMap = new Map<string, string>()\n private readonly fuseManagers = new Map<string, FuseManager>()\n\n constructor(resources: Record<string, MountSpec | Mount>, options: NodeWorkspaceOptions = {}) {\n const specs: Record<string, MountSpec> = {}\n const commandSafeguards: Record<string, Record<string, CommandSafeguard>> = {\n ...(options.commandSafeguards ?? {}),\n }\n const fuseTargets: [string, boolean | string][] = []\n for (const [prefix, value] of Object.entries(resources)) {\n if (value instanceof Mount) {\n specs[prefix] =\n value.options.mode !== undefined ? [value.resource, value.options.mode] : value.resource\n if (value.options.commandSafeguards !== undefined)\n commandSafeguards[prefix] = value.options.commandSafeguards\n if (value.options.fuse !== undefined && value.options.fuse !== false)\n fuseTargets.push([prefix, value.options.fuse])\n } else {\n specs[prefix] = value\n }\n }\n super(specs, {\n ...options,\n ...(Object.keys(commandSafeguards).length > 0 ? { commandSafeguards } : {}),\n shellParserFactory: options.shellParserFactory ?? loadShellParser,\n })\n if (fuseTargets.length > 0) {\n // Kick off mounts eagerly; await inside fuseReady() / execute() / close()\n // so callers don't need to await the constructor (Python mirrors this).\n //\n // A failed auto-mount (e.g. libfuse absent on the host) degrades to an\n // unmounted but fully usable workspace, mirroring Python: there the mount\n // runs on a daemon thread so its failure never reaches the main process.\n // On Node's single event loop we swallow it here, otherwise the unhandled\n // rejection would terminate the process under Node's default policy.\n const setups = fuseTargets.map(([prefix, target]) =>\n this.addFuseMount(prefix, typeof target === 'string' ? target : undefined).then(\n () => undefined,\n (err: unknown) => {\n process.stderr.write(\n `mirage: FUSE auto-mount failed for ${prefix}, continuing without it: ${\n err instanceof Error ? err.message : String(err)\n }\\n`,\n )\n },\n ),\n )\n this.fuseSetupPromise = Promise.all(setups).then(() => undefined)\n }\n }\n\n private registerFuseMount(prefix: string, mountpoint: string): void {\n for (const [otherPrefix, otherMp] of this.fuseMountpointsMap) {\n if (otherMp === mountpoint && otherPrefix !== prefix) {\n throw new Error(\n `FUSE mountpoint ${mountpoint} already used by prefix ${otherPrefix}; mounts need distinct paths`,\n )\n }\n }\n this.fuseMountpointsMap.set(prefix, mountpoint)\n }\n\n /**\n * Mount a workspace subtree under FUSE and own its lifecycle. Each mount gets\n * its own {@link FuseManager}, so a workspace can expose any number of FUSE\n * subtrees at once. A pinned mountpoint is collision-checked BEFORE mounting,\n * so a clash never leaves a partial kernel mount.\n *\n * A session-bound mount (`sessionId` given) runs every op under that\n * session's mount grants (the kernel-tier primitive: bind-mount the tree\n * into a container and the narrowing travels with it); it is keyed\n * separately so the same prefix can also be exposed unbound.\n */\n async addFuseMount(prefix: string, mountpoint?: string, sessionId?: string): Promise<string> {\n const session = sessionId !== undefined ? this.getSession(sessionId) : undefined\n const key = sessionId === undefined ? prefix : `${prefix}@${sessionId}`\n if (mountpoint !== undefined) this.registerFuseMount(key, mountpoint)\n const fm = new FuseManager()\n this.fuseManagers.set(key, fm)\n try {\n const mp = await fm.setup(this, {\n rootPrefix: prefix,\n ...(mountpoint !== undefined ? { mountpoint } : {}),\n ...(session !== undefined ? { session } : {}),\n })\n if (mountpoint === undefined) this.registerFuseMount(key, mp)\n return mp\n } catch (err) {\n // The mount never came up; drop the manager and any registered path so\n // fuseMountpoints does not misreport it as live.\n this.fuseManagers.delete(key)\n this.fuseMountpointsMap.delete(key)\n throw err\n }\n }\n\n async removeFuseMount(prefix: string, sessionId?: string): Promise<void> {\n const key = sessionId === undefined ? prefix : `${prefix}@${sessionId}`\n const fm = this.fuseManagers.get(key)\n this.fuseManagers.delete(key)\n if (fm !== undefined) await fm.unmount()\n this.fuseMountpointsMap.delete(key)\n }\n\n get fuseMountpoints(): Record<string, string> {\n return Object.fromEntries(this.fuseMountpointsMap)\n }\n\n get fuseMountpoint(): string | null {\n if (this.fuseMountpointsMap.size === 0) return null\n if (this.fuseMountpointsMap.size > 1) {\n throw new Error('multiple FUSE mounts active; use fuseMountpoints to select one by prefix')\n }\n return this.fuseMountpointsMap.values().next().value ?? null\n }\n\n /** Await the eager per-mount fuse mounts started in the constructor. */\n async fuseReady(): Promise<void> {\n if (this.fuseSetupPromise !== null) {\n await this.fuseSetupPromise\n this.fuseSetupPromise = null\n }\n }\n\n override execute(\n command: string,\n options?: ExecuteOptions & { provision?: false | undefined },\n ): Promise<ExecuteResult>\n override execute(\n command: string,\n options: ExecuteOptions & { provision: true },\n ): Promise<ProvisionResult>\n override execute(\n command: string,\n options: ExecuteOptions,\n ): Promise<ExecuteResult | ProvisionResult>\n override async execute(\n command: string,\n options: ExecuteOptions = {},\n ): Promise<ExecuteResult | ProvisionResult> {\n await this.fuseReady()\n return super.execute(command, options)\n }\n\n override async close(): Promise<void> {\n await this.fuseReady().catch(() => undefined)\n for (const fm of this.fuseManagers.values()) await fm.unmount()\n this.fuseManagers.clear()\n this.fuseMountpointsMap.clear()\n await super.close()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { rmdirSync } from 'node:fs'\nimport type { Workspace } from '@struktoai/mirage-core'\nimport { forceUnmount, mount, type FuseHandle, type MountOptions } from '../fuse/mount.ts'\n\nconst SIGNALS = ['SIGINT', 'SIGTERM', 'SIGHUP'] as const\ntype Signal = (typeof SIGNALS)[number]\ninterface CleanupEntry {\n mountpoint: string\n handle: FuseHandle\n // Cleanup owns only generated temp directories, never explicit mountpoints.\n ownsMountpoint: boolean\n}\n\nfunction removeMountpointIfOwned(entry: { mountpoint: string; ownsMountpoint: boolean }): void {\n if (!entry.ownsMountpoint) return\n try {\n // Empty-directory cleanup only. Recursive removal is unsafe because a\n // still-mounted FUSE path can make deletes hit the mounted backend.\n rmdirSync(entry.mountpoint)\n } catch {\n // mountpoint may still be busy, non-empty, or already gone; caller can retry\n }\n}\n\n/**\n * Tracks auto-mounted FUSE handles and installs a single process-wide cleanup\n * path on SIGINT / SIGTERM / SIGHUP / `process.exit` so the kernel never ends\n * up with a stale mountpoint after the node process dies. Mirrors Python's\n * KeyboardInterrupt → `diskutil unmount force` / `fusermount -u` in mount.py.\n */\nclass FuseCleanupRegistry {\n private readonly mounts = new Set<CleanupEntry>()\n private installed = false\n private exiting = false\n\n register(entry: CleanupEntry): void {\n this.mounts.add(entry)\n this.install()\n }\n\n unregister(entry: CleanupEntry): void {\n this.mounts.delete(entry)\n }\n\n private install(): void {\n if (this.installed) return\n this.installed = true\n for (const sig of SIGNALS) {\n process.on(sig, this.onSignal)\n }\n process.on('beforeExit', this.onExit)\n process.on('exit', this.onExit)\n }\n\n private readonly onSignal = (sig: Signal): void => {\n if (this.exiting) return\n this.exiting = true\n this.drainSync()\n // Re-raise the signal so the default termination action runs after we've\n // unmounted. Node suppresses the default when a listener is attached.\n process.kill(process.pid, sig)\n }\n\n private readonly onExit = (): void => {\n if (this.exiting) return\n this.exiting = true\n this.drainSync()\n }\n\n private drainSync(): void {\n for (const entry of this.mounts) {\n forceUnmount(entry.mountpoint)\n removeMountpointIfOwned(entry)\n }\n this.mounts.clear()\n }\n}\n\nconst CLEANUP = new FuseCleanupRegistry()\n\n// Passive mounting primitive: it mounts a workspace subtree and tears it down.\n// Registry/lifecycle ownership lives on the node Workspace (addFuseMount /\n// removeFuseMount), mirroring Python's FuseManager.\nexport class FuseManager {\n private handle: FuseHandle | null = null\n private cleanupEntry: CleanupEntry | null = null\n\n get mountpoint(): string | null {\n return this.handle?.mountpoint ?? null\n }\n\n async setup(ws: Workspace, options: MountOptions = {}): Promise<string> {\n if (this.handle !== null) return this.handle.mountpoint\n const handle = await mount(ws, options)\n this.handle = handle\n this.cleanupEntry = {\n mountpoint: handle.mountpoint,\n handle,\n // Preserve the ownership decision made by mount(); unmount cleanup must\n // not infer ownership from path shape or whether the directory exists.\n ownsMountpoint: handle.ownsMountpoint,\n }\n CLEANUP.register(this.cleanupEntry)\n return handle.mountpoint\n }\n\n async unmount(): Promise<void> {\n if (this.handle === null) {\n return\n }\n const mp = this.handle.mountpoint\n try {\n await this.handle.unmount()\n } finally {\n const cleanupEntry = this.cleanupEntry\n if (cleanupEntry !== null) {\n CLEANUP.unregister(cleanupEntry)\n this.cleanupEntry = null\n }\n this.handle = null\n removeMountpointIfOwned({\n mountpoint: mp,\n ownsMountpoint: cleanupEntry?.ownsMountpoint ?? false,\n })\n }\n }\n\n async close(): Promise<void> {\n await this.unmount()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { execSync } from 'node:child_process'\nimport { mkdirSync, mkdtempSync } from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport type { Session, Workspace } from '@struktoai/mirage-core'\nimport { loadOptionalPeer } from '../optional_peer.ts'\nimport { MirageFS } from './fs.ts'\n\nexport interface FuseHandle {\n mountpoint: string\n /** Whether Mirage created this mountpoint directory and may remove it later. */\n ownsMountpoint: boolean\n unmount: () => Promise<void>\n}\n\nexport interface MountOptions {\n /** Caller/deployment-owned mountpoint. Mirage mounts here but does not delete it. */\n mountpoint?: string\n /** Scope the mount to a single workspace mount prefix (subtree exposure). */\n rootPrefix?: string\n /** Run every op under this session's mount grants (session-bound mountpoint). */\n session?: Session\n /**\n * When true, `@zkochan/fuse-native`'s `autoUnmount` flag is set so the\n * kernel releases the mount if the process exits abnormally. Defaults to\n * `true` on Linux, `false` on darwin — macFUSE rejects the option with\n * \"unknown option `auto_unmount'\". On darwin the SIGINT cleanup in\n * FuseManager runs `diskutil unmount force` instead.\n */\n autoUnmount?: boolean\n /**\n * Extra options forwarded verbatim to `@zkochan/fuse-native`.\n * `directIO: false` additionally skips the `direct_io` mount option that\n * Mirage appends by default (see appendDirectIO).\n */\n fuseOptions?: Record<string, unknown>\n}\n\ninterface FuseInstance {\n mount: (cb: (err: Error | null) => void) => void\n unmount: (cb: (err: Error | null) => void) => void\n _fuseOptions?: () => string\n}\n\ntype FuseConstructor = new (\n mountpoint: string,\n ops: Record<string, unknown>,\n options?: Record<string, unknown>,\n) => FuseInstance\n\n/**\n * Append libfuse's `direct_io` to the mount option string.\n * `@zkochan/fuse-native` serializes a fixed allowlist of options in\n * `_fuseOptions()` that doesn't include `direct_io`, so we wrap the\n * serializer at runtime — this ships to consumers, unlike a pnpm patch,\n * which would only apply inside this repository. direct_io is load-bearing\n * for size-unknown API files: getattr reports 0 pre-open and the kernel\n * must read to EOF regardless (verified on the macOS kext: without it,\n * `cat` reads 0 bytes; see the CLAUDE.md FUSE section).\n */\nexport function appendDirectIO(fuse: FuseInstance): void {\n const orig = fuse._fuseOptions?.bind(fuse)\n if (orig === undefined) {\n throw new Error(\n '@zkochan/fuse-native no longer exposes _fuseOptions(); the direct_io ' +\n 'mount option cannot be applied. Update appendDirectIO in mount.ts ' +\n 'for the new fuse-native version.',\n )\n }\n fuse._fuseOptions = () => {\n const serialized = orig()\n if (serialized === '') return '-odirect_io'\n return serialized.includes('direct_io') ? serialized : `${serialized},direct_io`\n }\n}\n\nasync function loadFuse(): Promise<FuseConstructor> {\n const mod = await loadOptionalPeer(\n () => import('@zkochan/fuse-native') as unknown as Promise<{ default?: FuseConstructor }>,\n {\n feature: 'FUSE support',\n packageName: '@zkochan/fuse-native',\n docsUrl: 'https://mirage.dev/typescript/setup/fuse',\n },\n )\n const Fuse = (mod.default ?? mod) as unknown as FuseConstructor\n if (typeof Fuse !== 'function') {\n throw new Error('@zkochan/fuse-native did not export a constructor')\n }\n return Fuse\n}\n\n/** Fallback unmount via platform tools — mirrors Python's SIGINT handler. */\nexport function forceUnmount(mountpoint: string): void {\n try {\n if (process.platform === 'darwin') {\n execSync(`diskutil unmount force ${JSON.stringify(mountpoint)}`, { stdio: 'ignore' })\n } else {\n execSync(`fusermount -u ${JSON.stringify(mountpoint)}`, { stdio: 'ignore' })\n }\n } catch {\n // best-effort; caller already tried the clean path\n }\n}\n\nexport async function mount(ws: Workspace, options: MountOptions = {}): Promise<FuseHandle> {\n const Fuse = await loadFuse()\n let mountpoint: string\n let ownsMountpoint = false\n if (options.mountpoint !== undefined) {\n // Pinned path: create if missing, but keep ownership with the caller.\n mkdirSync(options.mountpoint, { recursive: true })\n mountpoint = options.mountpoint\n } else {\n mountpoint = mkdtempSync(join(tmpdir(), 'mirage-fuse-'))\n ownsMountpoint = true\n }\n const mfs = new MirageFS(ws, {\n ...(options.rootPrefix !== undefined ? { rootPrefix: options.rootPrefix } : {}),\n ...(options.session !== undefined ? { session: options.session } : {}),\n })\n const autoUnmount = options.autoUnmount ?? process.platform === 'linux'\n // Size-unknown recipe, mirroring Python's mount.py: direct_io (appended\n // below) makes the kernel read to EOF even though getattr reports 0\n // pre-open, and attrTimeout '0' (string: the option serializer drops falsy\n // values) keeps the kernel from caching that 0, so the post-open fstat\n // reaches fgetattr, which answers with the prefetched real size. Both are\n // load-bearing on the macOS kext; see the CLAUDE.md FUSE section.\n const fuseOpts: Record<string, unknown> = {\n force: true,\n mkdir: true,\n attrTimeout: '0',\n ...(autoUnmount ? { autoUnmount: true } : {}),\n ...(options.fuseOptions ?? {}),\n }\n const fuse = new Fuse(mountpoint, mfs.ops(), fuseOpts)\n if (fuseOpts.directIO !== false) appendDirectIO(fuse)\n await new Promise<void>((resolve, reject) => {\n fuse.mount((err) => {\n if (err === null) resolve()\n else reject(err)\n })\n })\n return {\n mountpoint,\n ownsMountpoint,\n unmount: () =>\n new Promise<void>((resolve, reject) => {\n fuse.unmount((err) => {\n if (err === null) resolve()\n else reject(err)\n })\n }),\n }\n}\n\nexport function mountBackground(ws: Workspace, options: MountOptions = {}): Promise<FuseHandle> {\n return mount(ws, options)\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { posix } from 'node:path'\nimport {\n type FileStat,\n FileType,\n isMissingOp,\n type OpRecord,\n PathSpec,\n runWithSession,\n type Session,\n type Workspace,\n rstripSlash,\n} from '@struktoai/mirage-core'\nimport { isMacosMetadata } from './platform/macos.ts'\n\n// FUSE errno values (negative for fuse-native callbacks; positive for errors thrown).\nconst ENOENT = -2\nconst EACCES = -13\nconst ENOTDIR = -20\nconst EEXIST = -17\nconst ENOTEMPTY = -66 // macOS; Linux is -39 — fuse-native normalizes.\nconst EIO = -5\nconst EINVAL = -22\nconst EROFS = -30\n\nexport interface FuseAttr {\n mtime: Date\n atime: Date\n ctime: Date\n nlink: number\n size: number\n mode: number\n uid: number\n gid: number\n}\n\ninterface Handle {\n path: string\n data?: Uint8Array\n writeBuf?: [number, Uint8Array][]\n}\n\ninterface PrefetchEntry {\n data: Uint8Array\n expires: number\n}\n\nconst PREFETCH_TTL_MS = 30_000\n\ntype Cb<T> = (code: number, result?: T) => void\n\nfunction classifyError(err: unknown): number {\n const code = (err as { code?: string }).code\n if (code === 'ENOTEMPTY') return ENOTEMPTY\n if (code === 'ENOTDIR') return ENOTDIR\n if (code === 'EACCES') return EACCES\n if (code === 'EEXIST') return EEXIST\n if (code === 'ENOENT') return ENOENT\n const msg = (err instanceof Error ? err.message : String(err)).toLowerCase()\n if (msg.includes('not empty') || msg.includes('enotempty')) return ENOTEMPTY\n if (msg.includes('not a directory') || msg.includes('enotdir')) return ENOTDIR\n // A session capability rejection (MountNotAllowedError) is a permission\n // failure, mirroring Python's PermissionError -> EACCES.\n if (msg.includes('not allowed to access mount')) return EACCES\n if (msg.includes('permission') || msg.includes('eacces') || msg.includes('read-only'))\n return EACCES\n if (msg.includes('file exists') || msg.includes('eexist')) return EEXIST\n if (\n msg.includes('not found') ||\n msg.includes('no such') ||\n msg.includes('enoent') ||\n msg.includes('no mount')\n )\n return ENOENT\n return EIO\n}\n\nexport interface MirageFSOptions {\n rootPrefix?: string\n /**\n * Bind every FUSE op to this session's mount grants. The kernel-tier\n * primitive: bind-mount the tree into a container and the narrowing\n * travels with it. Enforcement happens inside dispatch/Ops via the\n * session context, so binding at the op entry point is sufficient.\n */\n session?: Session\n}\n\nexport class MirageFS {\n private readonly ws: Workspace\n private readonly now: Date\n private readonly root: string\n private readonly prefixes: string[]\n private readonly handles = new Map<number, Handle>()\n // In-memory extended attributes, keyed by FUSE path. Backends have no POSIX\n // xattrs, so these are advisory and never persisted; see setxattr.\n private readonly xattrs = new Map<string, Map<string, Buffer>>()\n private readonly prefetchCache = new Map<string, PrefetchEntry>()\n private readonly prefetchInflight = new Map<string, Promise<Uint8Array | null>>()\n private nextFh = 1\n private readonly uid: number\n private readonly gid: number\n private readonly session: Session | null\n\n constructor(ws: Workspace, options: MirageFSOptions = {}) {\n this.ws = ws\n this.now = new Date()\n this.root = options.rootPrefix !== undefined ? rstripSlash(options.rootPrefix) : ''\n // When scoped to a single mount, the FUSE root maps onto that mount and\n // there are no virtual intermediate directories to synthesize.\n this.prefixes = this.root === '' ? ws.mounts().map((m) => m.prefix) : []\n this.uid = typeof process.getuid === 'function' ? process.getuid() : 0\n this.gid = typeof process.getgid === 'function' ? process.getgid() : 0\n this.session = options.session ?? null\n }\n\n // ── helpers ──────────────────────────────────────────────────────\n\n private resolve(path: string): string {\n if (this.root === '') return path\n return path === '/' ? this.root : this.root + path\n }\n\n private dirStat(): FuseAttr {\n return {\n mtime: this.now,\n atime: this.now,\n ctime: this.now,\n nlink: 2,\n size: 0,\n mode: 0o040755,\n uid: this.uid,\n gid: this.gid,\n }\n }\n\n private fileStat(size: number): FuseAttr {\n return {\n mtime: this.now,\n atime: this.now,\n ctime: this.now,\n nlink: 1,\n size,\n mode: 0o100644,\n uid: this.uid,\n gid: this.gid,\n }\n }\n\n /**\n * Fold merged stat attributes into a FUSE attr. The workspace stat\n * already carries the namespace overlay (chmod bits, chown ids, touched\n * mtime), so honoring these fields here is what makes metadata ops\n * visible over FUSE. String uid/gid (names) are skipped: FUSE wants\n * numeric ids and there is no user db to map against.\n */\n private applyStatAttrs(entry: FuseAttr, s: FileStat): FuseAttr {\n if (s.mode !== null) {\n entry.mode = (entry.mode & ~0o7777) | (s.mode & 0o7777)\n }\n if (typeof s.uid === 'number') entry.uid = s.uid\n if (typeof s.gid === 'number') entry.gid = s.gid\n if (s.modified !== null) {\n const ts = new Date(s.modified)\n if (!Number.isNaN(ts.getTime())) {\n entry.mtime = ts\n entry.ctime = ts\n }\n }\n return entry\n }\n\n /**\n * The target to present for a namespace link at a FUSE path, or null\n * when not a link. Relative targets are stored verbatim and returned\n * as-is. Absolute targets name virtual paths, so they are rewritten\n * relative to the link's directory: returned raw, the kernel would\n * resolve them against the host root and escape the mountpoint.\n */\n private linkTarget(path: string): string | null {\n const links = this.ws.fs.links\n if (links === null) return null\n const target = links.readlink(this.resolve(path))\n if (target === null) return null\n if (!target.startsWith('/')) return target\n let fuseTarget = target\n if (this.root !== '') {\n if (target === this.root) {\n fuseTarget = '/'\n } else if (target.startsWith(this.root + '/')) {\n fuseTarget = target.slice(this.root.length)\n } else {\n // points outside the scoped root: unreachable through this\n // mount, keep the stored form (a dangling link is legal)\n return target\n }\n }\n const slash = path.lastIndexOf('/')\n const parent = slash <= 0 ? '/' : path.slice(0, slash)\n return posix.relative(parent, fuseTarget)\n }\n\n private linkStat(target: string): FuseAttr {\n const entry = this.fileStat(new TextEncoder().encode(target).byteLength)\n entry.mode = 0o120777\n return entry\n }\n\n private isVirtualDir(path: string): boolean {\n const bare = rstripSlash(path)\n const normalized = bare + '/'\n for (const p of this.prefixes) {\n const pBare = rstripSlash(p)\n if (p.startsWith(normalized) || pBare === bare) return true\n }\n return false\n }\n\n private virtualChildren(path: string): string[] {\n const normalized = path === '/' ? '/' : rstripSlash(path) + '/'\n const children = new Set<string>()\n for (const p of this.prefixes) {\n if (p.startsWith(normalized) && p !== normalized) {\n const rest = p.slice(normalized.length)\n const child = rest.split('/')[0]\n if (child !== undefined && child !== '') children.add(child)\n }\n }\n return [...children].sort()\n }\n\n private cachedSize(path: string): number | null {\n for (const ctx of this.handles.values()) {\n if (ctx.path === path && ctx.data !== undefined) return ctx.data.byteLength\n }\n const entry = this.prefetchCache.get(path)\n if (entry !== undefined && entry.expires > Date.now()) return entry.data.byteLength\n return null\n }\n\n private cachedData(path: string): Uint8Array | null {\n for (const ctx of this.handles.values()) {\n if (ctx.path === path && ctx.data !== undefined) return ctx.data\n }\n const entry = this.prefetchCache.get(path)\n if (entry !== undefined && entry.expires > Date.now()) return entry.data\n if (entry !== undefined) this.prefetchCache.delete(path)\n return null\n }\n\n /**\n * Fetch bytes for a size-unknown file and cache them so the open → read →\n * fstat burst (and subsequent stats within the TTL) reuse the same fetch.\n * With getattr reporting 0 pre-open, this hydration is what lets fgetattr\n * answer with the real byte length after open (mirrors Python's\n * `_prefetch_read`).\n */\n private async prefetch(path: string): Promise<Uint8Array | null> {\n const cached = this.cachedData(path)\n if (cached !== null) return cached\n const inflight = this.prefetchInflight.get(path)\n if (inflight !== undefined) return inflight\n const promise = (async (): Promise<Uint8Array | null> => {\n try {\n const data = await this.ws.fs.readFile(this.resolve(path))\n this.prefetchCache.set(path, { data, expires: Date.now() + PREFETCH_TTL_MS })\n return data\n } catch {\n return null\n } finally {\n this.prefetchInflight.delete(path)\n }\n })()\n this.prefetchInflight.set(path, promise)\n return promise\n }\n\n /** Drain and return accumulated op records (mirrors Python's drain_ops). */\n drainOps(): OpRecord[] {\n const records = [...this.ws.records]\n this.ws.records.length = 0\n return records\n }\n\n private async writeFile(path: string, data: Uint8Array): Promise<void> {\n // Keep FUSE writes on Workspace.dispatch rather than Workspace.fs.writeFile:\n // dispatch is where Mirage enforces mount modes, revision tracking, and\n // post-write invalidation. The lower-level fs helper is useful internally,\n // but using it from FUSE made READ-mode mounts reject create while still\n // allowing buffered overwrite on flush.\n await this.ws.dispatch('write', this.resolve(path), [data])\n }\n\n // ── FUSE op surface (mirrors mfusepy Operations) ─────────────────\n\n ops(): Record<string, unknown> {\n const table: Record<string, (...args: never[]) => void> = {\n readdir: this.readdir.bind(this),\n getattr: this.getattr.bind(this),\n fgetattr: this.fgetattr.bind(this),\n open: this.open.bind(this),\n read: this.read.bind(this),\n write: this.write.bind(this),\n create: this.create.bind(this),\n readlink: this.readlink.bind(this),\n symlink: this.symlink.bind(this),\n unlink: this.unlink.bind(this),\n mkdir: this.mkdir.bind(this),\n rmdir: this.rmdir.bind(this),\n rename: this.rename.bind(this),\n release: this.release.bind(this),\n truncate: this.truncate.bind(this),\n flush: this.flush.bind(this),\n fsync: this.fsync.bind(this),\n utimens: this.utimens.bind(this),\n chmod: this.chmod.bind(this),\n chown: this.chown.bind(this),\n access: this.access.bind(this),\n setxattr: this.setxattr.bind(this),\n getxattr: this.getxattr.bind(this),\n listxattr: this.listxattr.bind(this),\n removexattr: this.removexattr.bind(this),\n statfs: this.statfs.bind(this),\n }\n const session = this.session\n if (session === null) return table\n // A session-bound tree enters the session context before every op,\n // mirroring Python's MirageFS._bind_session: the async work each\n // callback starts inherits the context, so dispatch/Ops enforce the\n // session's mount grants for kernel-originated I/O too.\n const bound: Record<string, unknown> = {}\n for (const [name, fn] of Object.entries(table)) {\n bound[name] = (...args: never[]) => {\n void runWithSession(session, () => {\n fn(...args)\n return Promise.resolve()\n })\n }\n }\n return bound\n }\n\n private getattr(path: string, cb: Cb<FuseAttr>): void {\n void (async () => {\n if (path === '/') {\n cb(0, this.dirStat())\n return\n }\n // macOS Finder/Spotlight probes .DS_Store, ._*, .Spotlight-V100, etc.\n // Reject early to avoid hitting the ops layer.\n const name = path.slice(path.lastIndexOf('/') + 1)\n if (isMacosMetadata(name)) {\n cb(ENOENT)\n return\n }\n // Link check must precede the workspace stat: the fs facade follows\n // namespace links, so stat on a link path reports the target.\n const target = this.linkTarget(path)\n if (target !== null) {\n cb(0, this.linkStat(target))\n return\n }\n if (this.isVirtualDir(path)) {\n cb(0, this.dirStat())\n return\n }\n try {\n const s = await this.ws.fs.stat(this.resolve(path))\n if (s.type === FileType.DIRECTORY) {\n cb(0, this.applyStatAttrs(this.dirStat(), s))\n return\n }\n // Size-unknown API files stat as 0 before open (never a fake size):\n // the mount's direct_io makes the kernel read to EOF regardless, and\n // attrTimeout '0' routes the post-open fstat to fgetattr, which\n // serves the real hydrated size. Mirrors Python's fs.py; see the\n // CLAUDE.md FUSE section.\n let size = s.size\n size ??= this.cachedSize(path) ?? 0\n cb(0, this.applyStatAttrs(this.fileStat(size), s))\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private fgetattr(path: string, fd: number, cb: Cb<FuseAttr>): void {\n // fstat(fd) after open: the open handler prefetched size-unknown files\n // into the handle, so answer with the real byte length instead of the\n // 0 that path-based getattr reported before open.\n const ctx = this.handles.get(fd)\n if (ctx?.data !== undefined) {\n cb(0, this.fileStat(ctx.data.byteLength))\n return\n }\n this.getattr(path, cb)\n }\n\n private readdir(path: string, cb: Cb<string[]>): void {\n void (async () => {\n const names = new Set(this.virtualChildren(path))\n const links = this.ws.fs.links\n if (links !== null) {\n for (const linkName of links.linksUnder(this.resolve(path)).keys()) {\n if (linkName !== '' && !isMacosMetadata(linkName)) names.add(linkName)\n }\n }\n try {\n const entries = await this.ws.fs.readdir(this.resolve(path))\n for (const e of entries) {\n const part = rstripSlash(e).split('/').pop() ?? ''\n if (part !== '' && !isMacosMetadata(part)) names.add(part)\n }\n } catch {\n if (names.size === 0) {\n cb(ENOENT)\n return\n }\n }\n cb(0, ['.', '..', ...[...names].sort()])\n })()\n }\n\n private read(\n path: string,\n fd: number,\n buf: Buffer,\n len: number,\n pos: number,\n cb: (result: number) => void,\n ): void {\n void (async () => {\n const ctx = this.handles.get(fd)\n try {\n // Filetype-aware read: no `raw: true`, so parquet/feather/hdf5/etc.\n // get routed through their read ops and surface as rendered text —\n // matches Python's `self._ops.read(path)` which also goes through\n // filetype dispatch.\n if (ctx !== undefined && ctx.data === undefined) {\n const cached = this.cachedData(path)\n ctx.data = cached ?? (await this.ws.fs.readFile(this.resolve(path)))\n }\n const data =\n ctx?.data ?? this.cachedData(path) ?? (await this.ws.fs.readFile(this.resolve(path)))\n const slice = data.subarray(pos, pos + len)\n buf.set(slice, 0)\n cb(slice.byteLength)\n } catch {\n cb(0)\n }\n })()\n }\n\n private write(\n path: string,\n fd: number,\n buf: Buffer,\n len: number,\n pos: number,\n cb: (result: number) => void,\n ): void {\n const ctx = this.handles.get(fd)\n const data = new Uint8Array(buf.subarray(0, len))\n if (ctx !== undefined) {\n ctx.writeBuf ??= []\n ctx.writeBuf.push([pos, data])\n cb(len)\n return\n }\n void (async () => {\n try {\n let existing: Uint8Array = new Uint8Array(0)\n try {\n existing = await this.ws.fs.readFile(this.resolve(path), { raw: true })\n } catch {\n // file may not exist yet\n }\n let merged = existing\n if (pos > merged.byteLength) {\n // zero-pad from end-of-file up to the write offset (sparse write).\n const padded = new Uint8Array(pos + data.byteLength)\n padded.set(merged, 0)\n padded.set(data, pos)\n merged = padded\n } else {\n const size = Math.max(merged.byteLength, pos + data.byteLength)\n const out = new Uint8Array(size)\n out.set(merged.subarray(0, pos), 0)\n out.set(data, pos)\n if (pos + data.byteLength < merged.byteLength) {\n out.set(merged.subarray(pos + data.byteLength), pos + data.byteLength)\n }\n merged = out\n }\n await this.writeFile(path, merged)\n cb(len)\n } catch {\n cb(0)\n }\n })()\n }\n\n private create(path: string, _mode: number, cb: Cb<number>): void {\n void (async () => {\n try {\n // Route through the resource's `create` op so backends that distinguish\n // \"create empty\" from \"write bytes\" get the right code path. Falls back\n // to writeFile(empty) when the resource doesn't expose `create`.\n try {\n await this.ws.dispatch('create', this.resolve(path))\n } catch (dispatchErr) {\n if (!isMissingOp(dispatchErr, 'create')) throw dispatchErr\n await this.writeFile(path, new Uint8Array(0))\n }\n const fh = this.nextFh++\n this.handles.set(fh, { path })\n cb(0, fh)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private mkdir(path: string, _mode: number, cb: (code: number) => void): void {\n void (async () => {\n try {\n // Metadata ops route through dispatch (not ws.fs) so the file\n // cache and readdir index are invalidated like any other write.\n await this.ws.dispatch('mkdir', this.resolve(path))\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private readlink(path: string, cb: Cb<string>): void {\n const target = this.linkTarget(path)\n if (target === null) {\n cb(EINVAL)\n return\n }\n cb(0, target)\n }\n\n /**\n * Create namespace link `dest -> src` (ln -s src dest; libfuse passes\n * the pointee first). Relative sources are stored verbatim (resolved\n * at follow time, exactly like the shell `ln -s`); absolute sources\n * are mapped into virtual space so a scoped mount stores the path it\n * will later follow.\n */\n private symlink(src: string, dest: string, cb: (code: number) => void): void {\n void (async () => {\n const links = this.ws.fs.links\n if (links === null) {\n cb(EROFS)\n return\n }\n const stored = src.startsWith('/') ? this.resolve(src) : src\n try {\n await links.symlink(this.resolve(dest), stored, Date.now() / 1000)\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private unlink(path: string, cb: (code: number) => void): void {\n void (async () => {\n const links = this.ws.fs.links\n if (links?.isLink(this.resolve(path)) === true) {\n await links.unlink(this.resolve(path))\n this.xattrs.delete(path)\n this.prefetchCache.delete(path)\n cb(0)\n return\n }\n try {\n await this.ws.dispatch('unlink', this.resolve(path))\n this.xattrs.delete(path)\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private rename(src: string, dst: string, cb: (code: number) => void): void {\n void (async () => {\n try {\n await this.ws.dispatch('rename', this.resolve(src), [\n PathSpec.fromStrPath(this.resolve(dst)),\n ])\n const moved = this.xattrs.get(src)\n if (moved !== undefined) {\n this.xattrs.delete(src)\n this.xattrs.set(dst, moved)\n }\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private rmdir(path: string, cb: (code: number) => void): void {\n void (async () => {\n try {\n // Detect non-empty directories up front so we can map to ENOTEMPTY\n // cleanly. Message-string sniffing alone (classifyError) is unreliable\n // across backends; check contents first.\n try {\n const entries = await this.ws.fs.readdir(this.resolve(path))\n if (entries.length > 0) {\n cb(ENOTEMPTY)\n return\n }\n } catch {\n // readdir failure — fall through to rmdir and let it raise the real\n // error (e.g. ENOENT for missing path).\n }\n await this.ws.dispatch('rmdir', this.resolve(path))\n this.xattrs.delete(path)\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private truncate(path: string, size: number, cb: (code: number) => void): void {\n void (async () => {\n try {\n // Prefer the resource's dedicated `truncate` op (atomic on most\n // backends). Fall back to read/resize/write for resources that don't\n // expose one.\n try {\n await this.ws.dispatch('truncate', this.resolve(path), [size])\n } catch (dispatchErr) {\n if (!isMissingOp(dispatchErr, 'truncate')) throw dispatchErr\n const data = await this.ws.fs\n .readFile(this.resolve(path), { raw: true })\n .catch(() => new Uint8Array(0))\n const out = new Uint8Array(size)\n out.set(data.subarray(0, Math.min(data.byteLength, size)), 0)\n await this.writeFile(path, out)\n }\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private statfs(_path: string, cb: Cb<Record<string, number>>): void {\n cb(0, {\n bsize: 4096,\n frsize: 4096,\n blocks: 1024 * 1024,\n bfree: 1024 * 1024,\n bavail: 1024 * 1024,\n files: 1_000_000,\n ffree: 1_000_000,\n favail: 1_000_000,\n namemax: 255,\n })\n }\n\n // chmod / chown / utimens / access are no-ops for the filesystem but must\n // validate path existence — callers like `touch`/`chmod` on a missing file\n // should fail with ENOENT, not silently succeed.\n\n private chmod(path: string, _mode: number, cb: (code: number) => void): void {\n this.getattrValidate(path, cb)\n }\n\n private chown(path: string, _uid: number, _gid: number, cb: (code: number) => void): void {\n this.getattrValidate(path, cb)\n }\n\n private utimens(path: string, _atime: Date, _mtime: Date, cb: (code: number) => void): void {\n this.getattrValidate(path, cb)\n }\n\n private access(path: string, _amode: number, cb: (code: number) => void): void {\n this.getattrValidate(path, cb)\n }\n\n // Mirage backends (S3, etc.) have no POSIX extended attributes, so there is\n // nothing to persist xattrs to. We keep them in memory per mount so tools that\n // probe or set xattrs (sandbox runtimes, rsync -aX, tar --xattrs, cp -p, macOS\n // Finder writing com.apple.*) succeed instead of failing with ENOTSUP. The\n // values live only for the mount's lifetime and are never written to the\n // backend.\n private setxattr(\n path: string,\n name: string,\n value: Buffer,\n _position: number,\n _flags: number,\n cb: (code: number) => void,\n ): void {\n this.getattr(path, (code) => {\n if (code !== 0) {\n cb(code)\n return\n }\n let attrs = this.xattrs.get(path)\n if (attrs === undefined) {\n attrs = new Map()\n this.xattrs.set(path, attrs)\n }\n attrs.set(name, Buffer.from(value))\n cb(0)\n })\n }\n\n private getxattr(\n path: string,\n name: string,\n _position: number,\n cb: (code: number, value?: Buffer) => void,\n ): void {\n this.getattr(path, (code) => {\n if (code !== 0) {\n cb(code)\n return\n }\n // A missing value tells fuse-native to report ENOATTR/ENODATA.\n cb(0, this.xattrs.get(path)?.get(name))\n })\n }\n\n private listxattr(path: string, cb: (code: number, list?: string[]) => void): void {\n this.getattr(path, (code) => {\n if (code !== 0) {\n cb(code)\n return\n }\n const attrs = this.xattrs.get(path)\n cb(0, attrs ? [...attrs.keys()] : [])\n })\n }\n\n private removexattr(path: string, name: string, cb: (code: number) => void): void {\n this.getattr(path, (code) => {\n if (code !== 0) {\n cb(code)\n return\n }\n this.xattrs.get(path)?.delete(name)\n cb(0)\n })\n }\n\n private getattrValidate(path: string, cb: (code: number) => void): void {\n // getattr's callback returns 0 on success and a negative errno on failure\n // (FUSE convention). Pass the code straight through so missing paths\n // surface as ENOENT instead of silently succeeding.\n this.getattr(path, (code) => {\n cb(code)\n })\n }\n\n private open(path: string, _flags: number, cb: Cb<number>): void {\n void (async () => {\n try {\n const s = await this.ws.fs.stat(this.resolve(path))\n const ctx: Handle = { path }\n if (s.size === null && s.type !== FileType.DIRECTORY) {\n const data = await this.prefetch(path)\n if (data !== null) ctx.data = data\n }\n const fh = this.nextFh++\n this.handles.set(fh, ctx)\n cb(0, fh)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private release(_path: string, fd: number, cb: (code: number) => void): void {\n // Python does NOT flush on release — the kernel always issues flush first.\n // Auto-flushing here would conflict on error paths and hide real failures.\n this.handles.delete(fd)\n cb(0)\n }\n\n private flush(path: string, fd: number, cb: (code: number) => void): void {\n const ctx = this.handles.get(fd)\n if (ctx?.writeBuf === undefined || ctx.writeBuf.length === 0) {\n cb(0)\n return\n }\n const writes = ctx.writeBuf\n ctx.writeBuf = []\n void (async () => {\n try {\n let existing: Uint8Array = new Uint8Array(0)\n try {\n existing = await this.ws.fs.readFile(this.resolve(path), { raw: true })\n } catch {\n // ignore\n }\n let total = existing.byteLength\n for (const [off, chunk] of writes) {\n total = Math.max(total, off + chunk.byteLength)\n }\n const merged = new Uint8Array(total)\n merged.set(existing, 0)\n for (const [off, chunk] of writes) {\n merged.set(chunk, off)\n }\n await this.writeFile(path, merged)\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private fsync(path: string, _datasync: number, fd: number, cb: (code: number) => void): void {\n this.flush(path, fd, cb)\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nconst MACOS_METADATA: ReadonlySet<string> = new Set([\n '.DS_Store',\n '.Spotlight-V100',\n '.fseventsd',\n '.Trashes',\n])\n\nexport function isMacosMetadata(name: string): boolean {\n return MACOS_METADATA.has(name) || name.startsWith('._')\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { CommandSafeguard, MountMode, Resource } from '@struktoai/mirage-core'\n\nexport interface MountSpecOptions {\n /** Per-mount mode override; falls back to the workspace default when unset. */\n mode?: MountMode\n /** `true` mounts at a temp dir; a string pins the mountpoint to that path. */\n fuse?: boolean | string\n commandSafeguards?: Record<string, CommandSafeguard>\n}\n\nexport class Mount {\n constructor(\n readonly resource: Resource,\n readonly options: MountSpecOptions = {},\n ) {}\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { createRequire } from 'node:module'\nimport { registerCompressionCodec } from '@struktoai/mirage-core'\n\ninterface Bzip2Module {\n compressFile(input: Uint8Array): Uint8Array\n decompressFile(input: Uint8Array): Uint8Array\n}\n\ninterface XzModule {\n compress(input: Uint8Array): Promise<Uint8Array>\n decompress(input: Uint8Array): Promise<Uint8Array>\n}\n\n// compressjs and @napi-rs/lzma are CommonJS; load them via createRequire so\n// the built ESM output resolves their exports without named-import interop\n// pitfalls (mirrors the createRequire usage in workspace.ts).\nconst requireCjs = createRequire(import.meta.url)\nconst { Bzip2 } = requireCjs('compressjs') as { Bzip2: Bzip2Module }\nconst { xz } = requireCjs('@napi-rs/lzma') as { xz: XzModule }\n\nregisterCompressionCodec('bzip2', {\n compress: (bytes) => Promise.resolve(Uint8Array.from(Bzip2.compressFile(bytes))),\n decompress: (bytes) => Promise.resolve(Uint8Array.from(Bzip2.decompressFile(bytes))),\n})\n\nregisterCompressionCodec('xz', {\n compress: async (bytes) => new Uint8Array(await xz.compress(Buffer.from(bytes))),\n decompress: async (bytes) => new Uint8Array(await xz.decompress(Buffer.from(bytes))),\n})\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { appendFile, mkdir, readdir, readFile, rmdir, unlink, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\nimport type { ObserverStore } from '@struktoai/mirage-core'\n\n/**\n * ObserverStore backed by a directory of JSONL files. Created lazily on\n * first append. Mirrors the Python DiskObserverStore.\n */\nexport class DiskObserverStore implements ObserverStore {\n private readonly root: string\n\n constructor(root: string) {\n this.root = root\n }\n\n private abs(key: string): string {\n return path.join(this.root, key.replace(/^\\/+/, ''))\n }\n\n async append(key: string, data: Uint8Array): Promise<void> {\n const absPath = this.abs(key)\n await mkdir(path.dirname(absPath), { recursive: true })\n await appendFile(absPath, data)\n }\n\n async write(key: string, data: Uint8Array): Promise<void> {\n const absPath = this.abs(key)\n await mkdir(path.dirname(absPath), { recursive: true })\n await writeFile(absPath, data)\n }\n\n readAll(): Promise<Map<string, Uint8Array>> {\n return this.readMatching('')\n }\n\n async readMatching(suffix: string): Promise<Map<string, Uint8Array>> {\n const out = new Map<string, Uint8Array>()\n const { files } = await this.walk()\n for (const absPath of files) {\n const rel = '/' + path.relative(this.root, absPath)\n if (!rel.endsWith(suffix)) continue\n out.set(rel, new Uint8Array(await readFile(absPath)))\n }\n return out\n }\n\n async clear(): Promise<void> {\n const { files, dirs } = await this.walk()\n for (const absPath of files) await unlink(absPath)\n for (const d of [...dirs].reverse()) await rmdir(d)\n }\n\n close(): Promise<void> {\n return Promise.resolve()\n }\n\n private async walk(): Promise<{ files: string[]; dirs: string[] }> {\n const files: string[] = []\n const dirs: string[] = []\n const stack: string[] = [this.root]\n while (stack.length > 0) {\n const d = stack.pop()\n if (d === undefined) break\n let entries\n try {\n entries = await readdir(d, { withFileTypes: true })\n } catch {\n continue\n }\n dirs.push(d)\n for (const entry of entries) {\n const full = path.join(d, entry.name)\n if (entry.isDirectory()) stack.push(full)\n else files.push(full)\n }\n }\n return { files, dirs }\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { RedisClientType } from 'redis'\nimport type { ObserverStore } from '@struktoai/mirage-core'\nimport { loadOptionalPeer } from '../optional_peer.ts'\n\nexport interface RedisObserverStoreOptions {\n url?: string\n keyPrefix?: string\n}\n\n/**\n * ObserverStore backed by Redis strings (one key per JSONL file).\n *\n * Appends use the atomic Redis APPEND command; an index set tracks which\n * file keys exist so readAll needs no SCAN. Mirrors the Python\n * RedisObserverStore.\n */\nexport class RedisObserverStore implements ObserverStore {\n readonly url: string\n private readonly prefix: string\n private readonly indexKey: string\n private clientPromise: Promise<RedisClientType> | null = null\n\n constructor(options: RedisObserverStoreOptions = {}) {\n this.url = options.url ?? 'redis://localhost:6379/0'\n this.prefix = options.keyPrefix ?? 'mirage:observer:'\n this.indexKey = `${this.prefix}keys`\n }\n\n private async client(): Promise<RedisClientType> {\n this.clientPromise ??= (async () => {\n const mod = await loadOptionalPeer(\n () =>\n import('redis') as unknown as Promise<{\n createClient: (o: { url: string }) => RedisClientType\n }>,\n { feature: 'RedisObserverStore', packageName: 'redis' },\n )\n const c = mod.createClient({\n url: this.url,\n socket: { reconnectStrategy: false },\n } as Parameters<typeof mod.createClient>[0])\n await c.connect()\n return c\n })()\n return this.clientPromise\n }\n\n async append(key: string, data: Uint8Array): Promise<void> {\n const c = await this.client()\n const buf = Buffer.from(data.buffer, data.byteOffset, data.byteLength)\n await c.multi().append(`${this.prefix}${key}`, buf).sAdd(this.indexKey, key).exec()\n }\n\n async write(key: string, data: Uint8Array): Promise<void> {\n const c = await this.client()\n const buf = Buffer.from(data.buffer, data.byteOffset, data.byteLength)\n await c.multi().set(`${this.prefix}${key}`, buf).sAdd(this.indexKey, key).exec()\n }\n\n readAll(): Promise<Map<string, Uint8Array>> {\n return this.readMatching('')\n }\n\n async readMatching(suffix: string): Promise<Map<string, Uint8Array>> {\n const paths = (await this.indexedPaths()).filter((p) => p.endsWith(suffix))\n return this.readPaths(paths)\n }\n\n private async indexedPaths(): Promise<string[]> {\n const c = await this.client()\n const members = await c.sMembers(this.indexKey)\n return [...members].sort()\n }\n\n private async readPaths(paths: string[]): Promise<Map<string, Uint8Array>> {\n const out = new Map<string, Uint8Array>()\n if (paths.length === 0) return out\n const c = await this.client()\n const mod = (await import('redis')) as unknown as {\n RESP_TYPES: { readonly BLOB_STRING: number }\n }\n const mapping: Record<number, unknown> = { [mod.RESP_TYPES.BLOB_STRING]: Buffer }\n const typed = c as unknown as {\n withTypeMapping: (m: Record<number, unknown>) => {\n mGet: (keys: string[]) => Promise<(Buffer | null)[]>\n }\n }\n const values = await typed.withTypeMapping(mapping).mGet(paths.map((p) => `${this.prefix}${p}`))\n paths.forEach((p, i) => {\n const raw = values[i]\n out.set(p, raw === null || raw === undefined ? new Uint8Array() : new Uint8Array(raw))\n })\n return out\n }\n\n async clear(): Promise<void> {\n const c = await this.client()\n const paths = await this.indexedPaths()\n const keys = [...paths.map((p) => `${this.prefix}${p}`), this.indexKey]\n if (keys.length > 0) await c.del(keys)\n }\n\n async close(): Promise<void> {\n // Idempotent: the workspace closes the plane store it consumed and the\n // owning WorkspaceStateStore closes every plane it built; the second\n // close must be a no-op, not a crash on an already-quit client.\n if (this.clientPromise === null) return\n const pending = this.clientPromise\n this.clientPromise = null\n const c = await pending\n await c.quit()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { NamespaceStore, type NodeFields } from '@struktoai/mirage-core'\nimport { DiskRecordClient } from '../session/disk.ts'\n\nconst NAMESPACE_RECORD = 'namespace'\n\ninterface NamespaceState {\n nodes: Record<string, NodeFields>\n user: string | null\n}\n\n/**\n * NamespaceStore backed by one `namespace.json` per workspace.\n *\n * The whole plane is one human-readable record\n * `{\"nodes\": {path: fields}, \"user\": ...}`: the namespace is bound to\n * the workspace, so it serializes as one JSON file, not per-node\n * files. Read-modify-writes take the record's lockfile so concurrent\n * local processes never lose a node upsert; the write itself stays\n * tmp-then-rename atomic, so readers never see a torn file. Mirrors\n * the Python DiskNamespaceStore byte-for-byte on disk.\n */\nexport class DiskNamespaceStore extends NamespaceStore {\n private readonly records: DiskRecordClient\n\n constructor(root: string) {\n super()\n this.records = new DiskRecordClient(root, '')\n }\n\n private async state(): Promise<NamespaceState> {\n const [fields] = await this.records.get(NAMESPACE_RECORD)\n if (fields === null) return { nodes: {}, user: null }\n return {\n nodes: (fields.nodes as Record<string, NodeFields> | undefined) ?? {},\n user: typeof fields.user === 'string' ? fields.user : null,\n }\n }\n\n private async write(state: NamespaceState): Promise<void> {\n await this.records.put(NAMESPACE_RECORD, { nodes: state.nodes, user: state.user })\n }\n\n async load(): Promise<Map<string, NodeFields>> {\n return new Map(Object.entries((await this.state()).nodes))\n }\n\n async set(path: string, fields: NodeFields): Promise<void> {\n const fh = await this.records.lock(NAMESPACE_RECORD)\n try {\n const state = await this.state()\n state.nodes[path] = fields\n await this.write(state)\n } finally {\n await this.records.unlock(NAMESPACE_RECORD, fh)\n }\n }\n\n async delete(paths: readonly string[]): Promise<void> {\n const fh = await this.records.lock(NAMESPACE_RECORD)\n try {\n const state = await this.state()\n const drop = new Set(paths)\n state.nodes = Object.fromEntries(\n Object.entries(state.nodes).filter(([path]) => !drop.has(path)),\n )\n await this.write(state)\n } finally {\n await this.records.unlock(NAMESPACE_RECORD, fh)\n }\n }\n\n async replaceAll(entries: Map<string, NodeFields>): Promise<void> {\n const fh = await this.records.lock(NAMESPACE_RECORD)\n try {\n const state = await this.state()\n state.nodes = Object.fromEntries(entries)\n await this.write(state)\n } finally {\n await this.records.unlock(NAMESPACE_RECORD, fh)\n }\n }\n\n async loadUser(): Promise<string | null> {\n return (await this.state()).user\n }\n\n async setUser(user: string): Promise<void> {\n const fh = await this.records.lock(NAMESPACE_RECORD)\n try {\n const state = await this.state()\n state.user = user\n await this.write(state)\n } finally {\n await this.records.unlock(NAMESPACE_RECORD, fh)\n }\n }\n\n async clear(): Promise<void> {\n const fh = await this.records.lock(NAMESPACE_RECORD)\n try {\n await this.write({ nodes: {}, user: null })\n } finally {\n await this.records.unlock(NAMESPACE_RECORD, fh)\n }\n }\n\n async close(): Promise<void> {\n await this.records.close()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { mkdir, open, readFile, readdir, rename, stat, unlink, writeFile } from 'node:fs/promises'\nimport type { FileHandle } from 'node:fs/promises'\nimport path from 'node:path'\nimport { generationOf, SessionStore, type SessionFields } from '@struktoai/mirage-core'\n\n// A .lock older than this is presumed abandoned by a crashed writer and\n// reclaimed (loudly). Live CAS critical sections are milliseconds.\nconst LOCK_STALE_SECONDS = 10\nconst LOCK_RETRY_SLEEP_MS = 5\nconst LOCK_RETRY_LIMIT = 2000\n\nlet tmpCounter = 0\n\n// Match Python's urllib quote(safe=\"\"): percent-encode everything\n// outside the unreserved set, so both runtimes produce byte-identical\n// filenames over one shared state directory.\nfunction quoteName(name: string): string {\n return encodeURIComponent(name).replace(\n /[!'()*]/g,\n (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`,\n )\n}\n\nfunction isMissing(e: unknown): boolean {\n return (e as NodeJS.ErrnoException).code === 'ENOENT'\n}\n\n/**\n * One JSON-record-per-file client with lockfile CAS.\n *\n * The disk twin of `S3RecordClient`: a record is one file at\n * `{root}/{prefix}{name}.json`, written atomically (tmp then rename(2))\n * so readers never see a torn record. The conditional write serializes\n * on a `{record}.lock` created with O_CREAT|O_EXCL, so compare and\n * write hit the same stored version. Record names are percent-encoded\n * into filenames, so any id is safe. Mirrors the Python\n * DiskRecordClient byte-for-byte on disk.\n */\nexport class DiskRecordClient {\n private readonly dir: string\n\n constructor(root: string, prefix: string) {\n this.dir = path.join(root, prefix)\n }\n\n recordPath(name: string): string {\n return path.join(this.dir, `${quoteName(name)}.json`)\n }\n\n // The token slot mirrors the S3 client's ETag but stays empty: disk\n // CAS anchors on the lockfile, not on a version token.\n async get(name: string): Promise<[Record<string, unknown> | null, string]> {\n let body: Buffer\n try {\n body = await readFile(this.recordPath(name))\n } catch (e) {\n if (isMissing(e)) return [null, '']\n throw e\n }\n return [JSON.parse(body.toString()) as Record<string, unknown>, '']\n }\n\n async put(name: string, fields: Record<string, unknown>): Promise<void> {\n await mkdir(this.dir, { recursive: true })\n await this.writeRecord(this.recordPath(name), fields)\n }\n\n /**\n * Write one record iff its stored generation matches.\n *\n * Take the record's lockfile, re-read under the lock, check the\n * generation, then tmp-write + rename. Losing the lock race or the\n * generation check resolves false; the caller adopts and retries.\n */\n async casPut(\n name: string,\n fields: Record<string, unknown>,\n expectedGeneration: number,\n ): Promise<boolean> {\n await mkdir(this.dir, { recursive: true })\n const target = this.recordPath(name)\n const lockPath = `${target}.lock`\n let fh = await this.acquireLock(lockPath)\n if (fh === null) {\n if (!(await this.reclaimStaleLock(lockPath))) return false\n fh = await this.acquireLock(lockPath)\n if (fh === null) return false\n }\n try {\n const [stored] = await this.get(name)\n if (generationOf(stored) !== expectedGeneration) return false\n await this.writeRecord(target, fields)\n return true\n } finally {\n await this.releaseLock(fh, lockPath)\n }\n }\n\n async listNames(): Promise<string[]> {\n let entries: string[]\n try {\n entries = await readdir(this.dir)\n } catch (e) {\n if (isMissing(e)) return []\n throw e\n }\n return entries\n .filter((n) => n.endsWith('.json'))\n .map((n) => decodeURIComponent(n.slice(0, -'.json'.length)))\n }\n\n async loadAll(): Promise<Map<string, Record<string, unknown>>> {\n const names = await this.listNames()\n const records = await Promise.all(names.map((name) => this.get(name)))\n const out = new Map<string, Record<string, unknown>>()\n for (let i = 0; i < names.length; i++) {\n const name = names[i]\n const fields = records[i]?.[0]\n if (name !== undefined && fields != null) out.set(name, fields)\n }\n return out\n }\n\n async delete(names: Iterable<string>): Promise<void> {\n for (const name of names) {\n try {\n await unlink(this.recordPath(name))\n } catch (e) {\n // Delete promises absence; already-absent is success.\n if (!isMissing(e)) throw e\n }\n }\n }\n\n async clear(): Promise<void> {\n await this.delete(await this.listNames())\n }\n\n async close(): Promise<void> {\n // Nothing held open between calls.\n }\n\n /**\n * Block until this record's lockfile is held; handle to release.\n *\n * For callers doing a read-modify-write that is not generation-CAS\n * (e.g. the single-file namespace plane); spins past contention and\n * reclaims stale locks, throwing only if a live writer holds the\n * lock for the whole retry budget (~10s).\n */\n async lock(name: string): Promise<FileHandle> {\n await mkdir(this.dir, { recursive: true })\n const lockPath = `${this.recordPath(name)}.lock`\n for (let i = 0; i < LOCK_RETRY_LIMIT; i++) {\n const fh = await this.acquireLock(lockPath)\n if (fh !== null) return fh\n if (await this.reclaimStaleLock(lockPath)) continue\n await new Promise((r) => setTimeout(r, LOCK_RETRY_SLEEP_MS))\n }\n throw new Error(`could not acquire lock ${lockPath}`)\n }\n\n async unlock(name: string, fh: FileHandle): Promise<void> {\n await this.releaseLock(fh, `${this.recordPath(name)}.lock`)\n }\n\n // O_CREAT|O_EXCL ('wx'): filesystem-atomic mutex, the git protocol.\n // Local filesystems only (O_EXCL is unreliable on ancient NFS, the\n // same caveat git ships with).\n private async acquireLock(lockPath: string): Promise<FileHandle | null> {\n let fh: FileHandle\n try {\n fh = await open(lockPath, 'wx')\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'EEXIST') return null\n throw e\n }\n await fh.write(String(process.pid))\n return fh\n }\n\n // True when the lock is gone or was stale and removed; false when a\n // live writer still holds it.\n private async reclaimStaleLock(lockPath: string): Promise<boolean> {\n let mtimeMs: number\n try {\n mtimeMs = (await stat(lockPath)).mtimeMs\n } catch (e) {\n if (isMissing(e)) return true\n throw e\n }\n const age = (Date.now() - mtimeMs) / 1000\n if (age <= LOCK_STALE_SECONDS) return false\n console.warn(`mirage: reclaiming stale lock ${lockPath} (age ${age.toFixed(1)}s)`)\n try {\n await unlink(lockPath)\n } catch (e) {\n // The holder released it between the stat and the unlink; the\n // lock is gone either way, which is all this method promises.\n if (!isMissing(e)) throw e\n }\n return true\n }\n\n private async releaseLock(fh: FileHandle, lockPath: string): Promise<void> {\n await fh.close()\n try {\n await unlink(lockPath)\n } catch (e) {\n // Only reachable when another writer reclaimed this lock as\n // stale; the record write already landed, nothing to undo.\n if (!isMissing(e)) throw e\n console.warn(`mirage: lock ${lockPath} vanished before release (reclaimed?)`)\n }\n }\n\n private async writeRecord(target: string, fields: Record<string, unknown>): Promise<void> {\n const tmp = `${target}.${String(process.pid)}.${String(tmpCounter++)}.tmp`\n await writeFile(tmp, JSON.stringify(fields))\n await rename(tmp, target)\n }\n}\n\n/**\n * SessionStore backed by per-session files under one directory.\n *\n * One file per session at `{root}/sessions/{session_id}.json`, lockfile\n * CAS per record, so multiple local processes share one session table\n * with the same generation contract as the Redis Lua script, with zero\n * infrastructure. Mirrors the Python DiskSessionStore.\n */\nexport class DiskSessionStore extends SessionStore {\n private readonly records: DiskRecordClient\n\n constructor(root: string) {\n super()\n this.records = new DiskRecordClient(root, 'sessions/')\n }\n\n async load(): Promise<Map<string, SessionFields>> {\n return await this.records.loadAll()\n }\n\n async set(sessionId: string, fields: SessionFields): Promise<void> {\n await this.records.put(sessionId, fields)\n }\n\n async casSet(\n sessionId: string,\n fields: SessionFields,\n expectedGeneration: number,\n ): Promise<boolean> {\n return await this.records.casPut(sessionId, fields, expectedGeneration)\n }\n\n async delete(sessionIds: readonly string[]): Promise<void> {\n await this.records.delete(sessionIds)\n }\n\n async replaceAll(entries: Map<string, SessionFields>): Promise<void> {\n const stale = (await this.records.listNames()).filter((n) => !entries.has(n))\n await this.records.delete(stale)\n await Promise.all([...entries].map(([sid, fields]) => this.records.put(sid, fields)))\n }\n\n async clear(): Promise<void> {\n await this.records.clear()\n }\n\n async close(): Promise<void> {\n await this.records.close()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { RedisClientType } from 'redis'\nimport { NamespaceStore, type NodeFields } from '@struktoai/mirage-core'\nimport { loadOptionalPeer } from '../../optional_peer.ts'\n\nexport interface RedisNamespaceStoreOptions {\n url?: string\n keyPrefix?: string\n}\n\n/**\n * NamespaceStore backed by one Redis hash (path -> JSON fields).\n *\n * Symlinks and attribute overlays survive process restarts and are visible\n * to any workspace pointed at the same key prefix. Writes are\n * single-command (HSET/HDEL) so mutations stay one round trip. Mirrors the\n * Python RedisNamespaceStore.\n */\nexport class RedisNamespaceStore extends NamespaceStore {\n readonly url: string\n private readonly key: string\n private readonly userKey: string\n private clientPromise: Promise<RedisClientType> | null = null\n\n constructor(options: RedisNamespaceStoreOptions = {}) {\n super()\n this.url = options.url ?? 'redis://localhost:6379/0'\n const prefix = options.keyPrefix ?? 'mirage:namespace:'\n this.key = `${prefix}nodes`\n this.userKey = `${prefix}user`\n }\n\n private async client(): Promise<RedisClientType> {\n this.clientPromise ??= (async () => {\n const mod = await loadOptionalPeer(\n () =>\n import('redis') as unknown as Promise<{\n createClient: (o: { url: string }) => RedisClientType\n }>,\n { feature: 'RedisNamespaceStore', packageName: 'redis' },\n )\n const c = mod.createClient({\n url: this.url,\n socket: { reconnectStrategy: false },\n } as Parameters<typeof mod.createClient>[0])\n await c.connect()\n return c\n })()\n return this.clientPromise\n }\n\n async load(): Promise<Map<string, NodeFields>> {\n const c = await this.client()\n const raw = await c.hGetAll(this.key)\n const out = new Map<string, NodeFields>()\n for (const [path, value] of Object.entries(raw)) {\n out.set(path, JSON.parse(value) as NodeFields)\n }\n return out\n }\n\n async set(path: string, fields: NodeFields): Promise<void> {\n const c = await this.client()\n await c.hSet(this.key, path, JSON.stringify(fields))\n }\n\n async delete(paths: readonly string[]): Promise<void> {\n if (paths.length === 0) return\n const c = await this.client()\n await c.hDel(this.key, [...paths])\n }\n\n async replaceAll(entries: Map<string, NodeFields>): Promise<void> {\n const c = await this.client()\n const multi = c.multi().del(this.key)\n for (const [path, fields] of entries) {\n multi.hSet(this.key, path, JSON.stringify(fields))\n }\n await multi.exec()\n }\n\n async loadUser(): Promise<string | null> {\n const c = await this.client()\n return c.get(this.userKey)\n }\n\n async setUser(user: string): Promise<void> {\n const c = await this.client()\n await c.set(this.userKey, user)\n }\n\n async clear(): Promise<void> {\n const c = await this.client()\n await c.del([this.key, this.userKey])\n }\n\n async close(): Promise<void> {\n // Idempotent: the workspace closes the plane store it consumed and the\n // owning WorkspaceStateStore closes every plane it built; the second\n // close must be a no-op, not a crash on an already-quit client.\n if (this.clientPromise === null) return\n const pending = this.clientPromise\n this.clientPromise = null\n const c = await pending\n await c.quit()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { readFileSync } from 'node:fs'\nimport type { RedisClientType } from 'redis'\nimport { SessionStore, type SessionFields } from '@struktoai/mirage-core'\nimport { loadOptionalPeer } from '../../optional_peer.ts'\n\n// Shipped next to this module in src and copied beside the bundle in\n// dist (tsup onSuccess); byte-identical to the Python cas.lua. Generic\n// hash-field CAS, shared with the workspace meta record.\nexport const CAS_SCRIPT = readFileSync(new URL('./cas.lua', import.meta.url), 'utf8')\n\nexport interface RedisSessionStoreOptions {\n url?: string\n keyPrefix?: string\n}\n\n/**\n * SessionStore backed by one Redis hash (session id -> JSON fields).\n *\n * Sessions and the mount grants they carry survive restarts and are\n * visible to every workspace pointed at the same key prefix — the seam\n * that lets one process create a session and another (a kernel tier, a\n * sibling daemon) bind a mountpoint to it. Writes are single-command\n * (HSET/HDEL) so mutations stay one round trip. Mirrors the Python\n * RedisSessionStore.\n */\nexport class RedisSessionStore extends SessionStore {\n readonly url: string\n private readonly key: string\n private clientPromise: Promise<RedisClientType> | null = null\n\n constructor(options: RedisSessionStoreOptions = {}) {\n super()\n this.url = options.url ?? 'redis://localhost:6379/0'\n const prefix = options.keyPrefix ?? 'mirage:session:'\n this.key = `${prefix}sessions`\n }\n\n private async client(): Promise<RedisClientType> {\n this.clientPromise ??= (async () => {\n const mod = await loadOptionalPeer(\n () =>\n import('redis') as unknown as Promise<{\n createClient: (o: { url: string }) => RedisClientType\n }>,\n { feature: 'RedisSessionStore', packageName: 'redis' },\n )\n const c = mod.createClient({\n url: this.url,\n socket: { reconnectStrategy: false },\n } as Parameters<typeof mod.createClient>[0])\n await c.connect()\n return c\n })()\n return this.clientPromise\n }\n\n // One atomic server-side compare-and-set: Lua reads the stored\n // record's generation and writes only on a match.\n async casSet(\n sessionId: string,\n fields: SessionFields,\n expectedGeneration: number,\n ): Promise<boolean> {\n const c = await this.client()\n const result = await c.eval(CAS_SCRIPT, {\n keys: [this.key],\n arguments: [sessionId, JSON.stringify(fields), String(expectedGeneration)],\n })\n return result === 1\n }\n\n async load(): Promise<Map<string, SessionFields>> {\n const c = await this.client()\n const raw = await c.hGetAll(this.key)\n const out = new Map<string, SessionFields>()\n for (const [sid, value] of Object.entries(raw)) {\n out.set(sid, JSON.parse(value) as SessionFields)\n }\n return out\n }\n\n async set(sessionId: string, fields: SessionFields): Promise<void> {\n const c = await this.client()\n await c.hSet(this.key, sessionId, JSON.stringify(fields))\n }\n\n async delete(sessionIds: readonly string[]): Promise<void> {\n if (sessionIds.length === 0) return\n const c = await this.client()\n await c.hDel(this.key, [...sessionIds])\n }\n\n async replaceAll(entries: Map<string, SessionFields>): Promise<void> {\n const c = await this.client()\n const multi = c.multi().del(this.key)\n for (const [sid, fields] of entries) {\n multi.hSet(this.key, sid, JSON.stringify(fields))\n }\n await multi.exec()\n }\n\n async clear(): Promise<void> {\n const c = await this.client()\n await c.del(this.key)\n }\n\n async close(): Promise<void> {\n // Idempotent: the workspace closes the plane store it consumed and the\n // owning WorkspaceStateStore closes every plane it built; the second\n // close must be a no-op, not a crash on an already-quit client.\n if (this.clientPromise === null) return\n const pending = this.clientPromise\n this.clientPromise = null\n const c = await pending\n await c.quit()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { homedir } from 'node:os'\nimport path from 'node:path'\nimport {\n WorkspaceStateStore,\n type NamespaceStore,\n type ObserverStore,\n type SessionStore,\n type WorkspaceFields,\n type WorkspaceStateStoreOverrides,\n} from '@struktoai/mirage-core'\nimport { DiskObserverStore } from '../../observe/disk_store.ts'\nimport { DiskNamespaceStore } from '../namespace/disk.ts'\nimport { DiskRecordClient, DiskSessionStore } from '../session/disk.ts'\n\nexport const DEFAULT_STATE_ROOT = '~/.mirage/state'\n\nfunction expandHome(p: string): string {\n if (p === '~') return homedir()\n if (p.startsWith('~/')) return path.join(homedir(), p.slice(2))\n return p\n}\n\n// Match Python's urllib quote(safe=\"\") for the workspace path segment.\nfunction quoteSegment(name: string): string {\n return encodeURIComponent(name).replace(\n /[!'()*]/g,\n (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`,\n )\n}\n\nexport interface DiskWorkspaceStateStoreOptions extends WorkspaceStateStoreOverrides {\n root?: string\n}\n\n/**\n * WorkspaceStateStore backed by a directory tree.\n *\n * Each workspace is one self-contained directory (delete a workspace\n * by removing its folder):\n *\n * - `{root}/workspaces/{ws}/workspace.json` — metadata record\n * - `{root}/workspaces/{ws}/sessions/{sid}.json` — session table\n * - `{root}/workspaces/{ws}/namespace.json` — nodes + user, one JSON\n * - `{root}/workspaces/{ws}/history/<day>/<sid>.jsonl` — history\n *\n * The layout mirrors the S3 store file-for-object; mutable records get\n * the same generation-CAS contract via the lockfile protocol\n * (O_CREAT|O_EXCL mutex, tmp write, rename(2)), so multiple local\n * processes share one workspace with zero infrastructure: a CLI-created\n * workspace survives restart like `git init`. Local filesystems only;\n * anything cross-machine belongs on redis or s3. Mirrors the Python\n * DiskWorkspaceStateStore byte-for-byte on disk.\n */\nexport class DiskWorkspaceStateStore extends WorkspaceStateStore {\n private readonly root: string\n private readonly meta = new Map<string, DiskRecordClient>()\n private readonly namespaces = new Map<string, DiskNamespaceStore>()\n private readonly observers = new Map<string, DiskObserverStore>()\n private readonly sessionTables = new Map<string, DiskSessionStore>()\n\n constructor(options: DiskWorkspaceStateStoreOptions = {}) {\n const { root, ...overrides } = options\n super(overrides)\n this.root = expandHome(root ?? DEFAULT_STATE_ROOT)\n }\n\n private wsRoot(workspaceId: string): string {\n return path.join(this.root, 'workspaces', quoteSegment(workspaceId))\n }\n\n private metaClient(workspaceId: string): DiskRecordClient {\n let client = this.meta.get(workspaceId)\n if (client === undefined) {\n client = new DiskRecordClient(this.wsRoot(workspaceId), '')\n this.meta.set(workspaceId, client)\n }\n return client\n }\n\n protected makeNamespace(workspaceId: string): NamespaceStore {\n let ns = this.namespaces.get(workspaceId)\n if (ns === undefined) {\n ns = new DiskNamespaceStore(this.wsRoot(workspaceId))\n this.namespaces.set(workspaceId, ns)\n }\n return ns\n }\n\n protected makeObserver(workspaceId: string): ObserverStore {\n let ob = this.observers.get(workspaceId)\n if (ob === undefined) {\n ob = new DiskObserverStore(path.join(this.wsRoot(workspaceId), 'history'))\n this.observers.set(workspaceId, ob)\n }\n return ob\n }\n\n protected makeSessions(workspaceId: string): SessionStore {\n let table = this.sessionTables.get(workspaceId)\n if (table === undefined) {\n table = new DiskSessionStore(this.wsRoot(workspaceId))\n this.sessionTables.set(workspaceId, table)\n }\n return table\n }\n\n protected async readMeta(workspaceId: string): Promise<WorkspaceFields | null> {\n const [fields] = await this.metaClient(workspaceId).get('workspace')\n return fields\n }\n\n protected async writeMeta(workspaceId: string, fields: WorkspaceFields): Promise<void> {\n await this.metaClient(workspaceId).put('workspace', fields)\n }\n\n protected async casWriteMeta(\n workspaceId: string,\n fields: WorkspaceFields,\n expectedGeneration: number,\n ): Promise<boolean> {\n return await this.metaClient(workspaceId).casPut('workspace', fields, expectedGeneration)\n }\n\n protected async closeSelf(): Promise<void> {\n for (const ns of this.namespaces.values()) await ns.close()\n for (const ob of this.observers.values()) await ob.close()\n for (const table of this.sessionTables.values()) await table.close()\n for (const client of this.meta.values()) await client.close()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { RedisClientType } from 'redis'\nimport {\n WorkspaceStateStore,\n type NamespaceStore,\n type ObserverStore,\n type SessionStore,\n type WorkspaceFields,\n type WorkspaceStateStoreOverrides,\n} from '@struktoai/mirage-core'\nimport { RedisObserverStore } from '../../observe/redis_store.ts'\nimport { loadOptionalPeer } from '../../optional_peer.ts'\nimport { RedisNamespaceStore } from '../namespace/redis.ts'\nimport { CAS_SCRIPT, RedisSessionStore } from '../session/redis.ts'\n\nexport interface RedisWorkspaceStateStoreOptions extends WorkspaceStateStoreOverrides {\n url?: string\n keyPrefix?: string\n}\n\n/**\n * WorkspaceStateStore backed by one Redis server.\n *\n * Key layout under one prefix, everything scoped by workspace id:\n *\n * - `{prefix}workspaces` — hash, workspace id -> metadata JSON\n * - `{prefix}{ws}:namespace:nodes` (+ `:user`) — namespace plane\n * - `{prefix}{ws}:observer:*` — observer plane\n * - `{prefix}{ws}:sessions` — session table\n *\n * All plane state survives restarts and is visible to every process\n * pointed at the same url and prefix, so a workspace rebuilt from its\n * config alone gets identical overlays, history, sessions, and grants.\n * Mirrors the Python RedisWorkspaceStateStore.\n */\nexport class RedisWorkspaceStateStore extends WorkspaceStateStore {\n readonly url: string\n private readonly prefix: string\n private readonly metaKey: string\n private clientPromise: Promise<RedisClientType> | null = null\n private readonly namespaces = new Map<string, RedisNamespaceStore>()\n private readonly observers = new Map<string, RedisObserverStore>()\n private readonly sessionTables = new Map<string, RedisSessionStore>()\n\n constructor(options: RedisWorkspaceStateStoreOptions = {}) {\n const { url, keyPrefix, ...overrides } = options\n super(overrides)\n this.url = url ?? 'redis://localhost:6379/0'\n this.prefix = keyPrefix ?? 'mirage:'\n this.metaKey = `${this.prefix}workspaces`\n }\n\n private async client(): Promise<RedisClientType> {\n this.clientPromise ??= (async () => {\n const mod = await loadOptionalPeer(\n () =>\n import('redis') as unknown as Promise<{\n createClient: (o: { url: string }) => RedisClientType\n }>,\n { feature: 'RedisWorkspaceStateStore', packageName: 'redis' },\n )\n const c = mod.createClient({\n url: this.url,\n socket: { reconnectStrategy: false },\n } as Parameters<typeof mod.createClient>[0])\n await c.connect()\n return c\n })()\n return this.clientPromise\n }\n\n protected makeNamespace(workspaceId: string): NamespaceStore {\n let ns = this.namespaces.get(workspaceId)\n if (ns === undefined) {\n ns = new RedisNamespaceStore({\n url: this.url,\n keyPrefix: `${this.prefix}${workspaceId}:namespace:`,\n })\n this.namespaces.set(workspaceId, ns)\n }\n return ns\n }\n\n protected makeObserver(workspaceId: string): ObserverStore {\n let ob = this.observers.get(workspaceId)\n if (ob === undefined) {\n ob = new RedisObserverStore({\n url: this.url,\n keyPrefix: `${this.prefix}${workspaceId}:observer:`,\n })\n this.observers.set(workspaceId, ob)\n }\n return ob\n }\n\n protected makeSessions(workspaceId: string): SessionStore {\n let table = this.sessionTables.get(workspaceId)\n if (table === undefined) {\n table = new RedisSessionStore({\n url: this.url,\n keyPrefix: `${this.prefix}${workspaceId}:`,\n })\n this.sessionTables.set(workspaceId, table)\n }\n return table\n }\n\n protected async readMeta(workspaceId: string): Promise<WorkspaceFields | null> {\n const c = await this.client()\n const raw = await c.hGet(this.metaKey, workspaceId)\n return raw != null ? (JSON.parse(raw) as WorkspaceFields) : null\n }\n\n protected async writeMeta(workspaceId: string, fields: WorkspaceFields): Promise<void> {\n const c = await this.client()\n await c.hSet(this.metaKey, workspaceId, JSON.stringify(fields))\n }\n\n // Same generic hash-field CAS the session store uses: the meta hash\n // is keyed by workspace id instead of session id.\n protected async casWriteMeta(\n workspaceId: string,\n fields: WorkspaceFields,\n expectedGeneration: number,\n ): Promise<boolean> {\n const c = await this.client()\n const result = await c.eval(CAS_SCRIPT, {\n keys: [this.metaKey],\n arguments: [workspaceId, JSON.stringify(fields), String(expectedGeneration)],\n })\n return result === 1\n }\n\n protected async closeSelf(): Promise<void> {\n for (const ns of this.namespaces.values()) await ns.close()\n for (const ob of this.observers.values()) await ob.close()\n for (const table of this.sessionTables.values()) await table.close()\n if (this.clientPromise !== null) {\n const c = await this.clientPromise\n await c.quit()\n }\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { Buffer } from 'node:buffer'\nimport { createRequire } from 'node:module'\nimport { FileType, type Workspace } from '@struktoai/mirage-core'\n\nconst requireCjs = createRequire(import.meta.url)\nconst fs = requireCjs('node:fs') as Record<string, unknown>\n// fs-monkey ships no types\nconst fsMonkey = requireCjs('fs-monkey') as {\n patchFs: (vol: unknown, target?: unknown) => void\n}\nconst { patchFs } = fsMonkey\n\ntype Cb<T> = (err: NodeJS.ErrnoException | null, value?: T) => void\n\ntype FsLike = Record<string, unknown>\n\nfunction mountedPath(ws: Workspace, p: string): boolean {\n try {\n const m = ws.registry.mountFor(p)\n if (m === null) return false\n // The synthetic root anchor is an empty internal mount that matches every\n // path; it does not back real files, so paths caught only by it fall\n // through to the native fs. A user-provided `/` mount is honored.\n if (ws.syntheticRoot && m === ws.registry.rootMount) return false\n return true\n } catch {\n return false\n }\n}\n\nasync function mirageStat(ws: Workspace, p: string): Promise<unknown> {\n const s = await ws.fs.stat(p)\n const isDir = s.type === FileType.DIRECTORY\n const mtime = s.modified !== null ? new Date(s.modified) : new Date(0)\n return {\n isFile: () => !isDir,\n isDirectory: () => isDir,\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isSymbolicLink: () => false,\n isFIFO: () => false,\n isSocket: () => false,\n size: s.size ?? 0,\n mtime,\n mtimeMs: mtime.getTime(),\n atime: mtime,\n atimeMs: mtime.getTime(),\n ctime: mtime,\n ctimeMs: mtime.getTime(),\n birthtime: mtime,\n birthtimeMs: mtime.getTime(),\n mode: 0,\n nlink: 1,\n uid: 0,\n gid: 0,\n rdev: 0,\n blksize: 0,\n blocks: 0,\n dev: 0,\n ino: 0,\n }\n}\n\n/**\n * Monkey-patch Node's `fs` module so that paths under any mirage mount\n * route through the workspace. Paths NOT under a mount fall through to\n * the real native fs. CJS-friendly; for ESM code you still need to use\n * `ws.fs.*` directly since ESM bindings are frozen.\n *\n * Returns a `restore()` function that undoes the patch.\n */\nexport function patchNodeFs(ws: Workspace): () => void {\n const originalFs: FsLike = { ...(fs as unknown as FsLike) }\n\n const vol: FsLike = {\n promises: {\n readFile: async (p: string, opts?: { encoding?: BufferEncoding } | BufferEncoding) => {\n if (mountedPath(ws, p)) {\n const bytes = await ws.fs.readFile(p)\n const encoding = typeof opts === 'string' ? opts : opts?.encoding\n if (encoding !== undefined) return Buffer.from(bytes).toString(encoding)\n return Buffer.from(bytes)\n }\n const native = (originalFs.promises as FsLike).readFile as (\n path: string,\n opts?: unknown,\n ) => Promise<Uint8Array | string>\n return native(p, opts)\n },\n writeFile: async (p: string, data: Uint8Array | string): Promise<void> => {\n if (mountedPath(ws, p)) {\n await ws.fs.writeFile(p, typeof data === 'string' ? data : data)\n return\n }\n const native = (originalFs.promises as FsLike).writeFile as (\n path: string,\n data: Uint8Array | string,\n ) => Promise<void>\n await native(p, data)\n },\n readdir: async (p: string): Promise<string[]> => {\n if (mountedPath(ws, p)) {\n // Workspace returns full paths; Node's fs.promises.readdir returns basenames.\n // Strip trailing slash on directory entries before slicing so dirs\n // don't collapse to ''.\n const entries = await ws.fs.readdir(p)\n return entries.map((e) => {\n const trimmed = e.endsWith('/') ? e.slice(0, -1) : e\n return trimmed.slice(trimmed.lastIndexOf('/') + 1)\n })\n }\n const native = (originalFs.promises as FsLike).readdir as (\n path: string,\n ) => Promise<string[]>\n return native(p)\n },\n stat: async (p: string): Promise<unknown> => {\n if (mountedPath(ws, p)) return mirageStat(ws, p)\n const native = (originalFs.promises as FsLike).stat as (path: string) => Promise<unknown>\n return native(p)\n },\n unlink: async (p: string): Promise<void> => {\n if (mountedPath(ws, p)) return ws.fs.unlink(p)\n const native = (originalFs.promises as FsLike).unlink as (path: string) => Promise<void>\n await native(p)\n },\n mkdir: async (p: string): Promise<void> => {\n if (mountedPath(ws, p)) return ws.fs.mkdir(p)\n const native = (originalFs.promises as FsLike).mkdir as (path: string) => Promise<void>\n await native(p)\n },\n rmdir: async (p: string): Promise<void> => {\n if (mountedPath(ws, p)) return ws.fs.rmdir(p)\n const native = (originalFs.promises as FsLike).rmdir as (path: string) => Promise<void>\n await native(p)\n },\n },\n readFileSync: (): Uint8Array => {\n throw new Error('mirage.patchNodeFs: sync fs methods not supported — use fs.promises.*')\n },\n readFile: (p: string, cb: Cb<Uint8Array>) => {\n if (mountedPath(ws, p)) {\n ws.fs\n .readFile(p)\n .then((data) => {\n cb(null, Buffer.from(data))\n })\n .catch((err: unknown) => {\n cb(err as NodeJS.ErrnoException)\n })\n return\n }\n const native = originalFs.readFile as (path: string, cb: Cb<Uint8Array>) => void\n native(p, cb)\n },\n readdir: (p: string, cb: Cb<string[]>) => {\n if (mountedPath(ws, p)) {\n ws.fs\n .readdir(p)\n .then((entries) => {\n cb(\n null,\n entries.map((e) => {\n const trimmed = e.endsWith('/') ? e.slice(0, -1) : e\n return trimmed.slice(trimmed.lastIndexOf('/') + 1)\n }),\n )\n })\n .catch((err: unknown) => {\n cb(err as NodeJS.ErrnoException)\n })\n return\n }\n const native = originalFs.readdir as (path: string, cb: Cb<string[]>) => void\n native(p, cb)\n },\n }\n\n patchFs(vol, fs)\n return function restore(): void {\n for (const [k, v] of Object.entries(originalFs)) {\n const desc = Object.getOwnPropertyDescriptor(fs, k)\n if (desc?.writable === false && desc.set === undefined) continue\n try {\n fs[k] = v\n } catch {\n // some fs properties are accessor-only and can't be reassigned; skip\n }\n }\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n type Accessor,\n type CommandOpts,\n type IndexCacheStore,\n type PathSpec,\n Precision,\n ProvisionResult,\n type Resource,\n} from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../../accessor/redis.ts'\nimport { stat as redisStat } from '../../../core/redis/stat.ts'\n\nexport interface RedisResourceLike extends Resource {\n readonly accessor: RedisAccessor\n}\n\ninterface ResolvedSizes {\n resolved: [string, number][]\n missing: number\n}\n\nasync function resolveSizes(\n accessor: RedisAccessor,\n paths: readonly PathSpec[],\n index: IndexCacheStore | undefined,\n): Promise<ResolvedSizes> {\n const resolved: [string, number][] = []\n let missing = 0\n for (const p of paths) {\n const pathStr = p.virtual\n let size: number | null = null\n if (index !== undefined) {\n const lookup = await index.get(pathStr)\n if (lookup.entry !== undefined && lookup.entry !== null) {\n size = lookup.entry.size\n }\n }\n if (size === null) {\n try {\n const fileStat = await redisStat(accessor, p)\n size = fileStat.size\n } catch {\n // fall through — size stays null\n }\n }\n if (size !== null) {\n resolved.push([pathStr, size])\n } else {\n missing += 1\n }\n }\n return { resolved, missing }\n}\n\nexport async function fileReadProvision(\n accessor: Accessor,\n paths: PathSpec[],\n _texts: string[],\n _opts: CommandOpts,\n): Promise<ProvisionResult> {\n if (paths.length === 0) {\n return new ProvisionResult({ precision: Precision.UNKNOWN })\n }\n const { resolved, missing } = await resolveSizes(accessor as RedisAccessor, paths, undefined)\n if (missing > 0 || resolved.length === 0) {\n return new ProvisionResult({ precision: Precision.UNKNOWN })\n }\n const total = resolved.reduce((sum, [, size]) => sum + size, 0)\n return new ProvisionResult({\n networkReadLow: total,\n networkReadHigh: total,\n readOps: resolved.length,\n precision: Precision.EXACT,\n })\n}\n\nexport async function headTailProvision(\n accessor: Accessor,\n paths: PathSpec[],\n _texts: string[],\n _opts: CommandOpts,\n): Promise<ProvisionResult> {\n if (paths.length === 0) {\n return new ProvisionResult({ precision: Precision.UNKNOWN })\n }\n const { resolved, missing } = await resolveSizes(accessor as RedisAccessor, paths, undefined)\n if (missing > 0 || resolved.length === 0) {\n return new ProvisionResult({ precision: Precision.UNKNOWN })\n }\n const total = resolved.reduce((sum, [, size]) => sum + size, 0)\n return new ProvisionResult({\n networkReadLow: total,\n networkReadHigh: total,\n readOps: resolved.length,\n precision: Precision.EXACT,\n })\n}\n\nexport function metadataProvision(\n _accessor: Accessor,\n paths: PathSpec[],\n _texts: string[],\n _opts: CommandOpts,\n): ProvisionResult {\n const n = Math.max(1, paths.length > 0 ? paths.length : 1)\n return new ProvisionResult({\n networkReadLow: 0,\n networkReadHigh: 0,\n readOps: n,\n precision: Precision.EXACT,\n })\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n type FileCache,\n defaultFingerprint,\n parseLimit,\n type PathSpec,\n validateMaxDrainBytes,\n} from '@struktoai/mirage-core'\nimport type { RedisClientType } from 'redis'\nimport { RedisResource, type RedisResourceOptions } from '../../resource/redis/redis.ts'\n\nexport interface RedisFileCacheOptions extends RedisResourceOptions {\n cacheLimit?: string | number\n maxDrainBytes?: number | null\n}\n\nexport class RedisFileCacheStore extends RedisResource implements FileCache {\n // Advisory only: unlike the RAM store there is no client-side LRU, so\n // nothing evicts on overflow. Cap memory on the Redis server instead\n // (maxmemory + maxmemory-policy allkeys-lru) to approximate the RAM\n // store's eviction behavior.\n private readonly limit: number\n private readonly dataPrefix: string\n private readonly metaPrefix: string\n private maxDrainBytesValue: number | null = null\n readonly drainTasks = new Map<string, Promise<void>>()\n\n constructor(options: RedisFileCacheOptions = {}) {\n super({\n url: options.url ?? 'redis://localhost:6379/0',\n keyPrefix: options.keyPrefix ?? 'mirage:cache:',\n })\n this.limit = parseLimit(options.cacheLimit ?? '512MB')\n this.dataPrefix = `${this.keyPrefix}data:`\n this.metaPrefix = `${this.keyPrefix}meta:`\n this.maxDrainBytes = options.maxDrainBytes ?? null\n }\n\n get maxDrainBytes(): number | null {\n return this.maxDrainBytesValue\n }\n\n set maxDrainBytes(value: number | null) {\n validateMaxDrainBytes(this.limit, value)\n this.maxDrainBytesValue = value\n }\n\n // Size lives in the redis server and is not tracked client-side.\n readonly cacheSize: number | null = null\n readonly cacheEntries: number | null = null\n\n get cacheLimit(): number {\n return this.limit\n }\n\n cacheClient(): Promise<RedisClientType> {\n return this.store.client()\n }\n\n async get(key: string): Promise<Uint8Array | null> {\n const c = await this.cacheClient()\n const mod = await this.module()\n const blob = mod.RESP_TYPES.BLOB_STRING\n const mapping: Record<number, unknown> = { [blob]: Buffer }\n const typed = c as unknown as {\n withTypeMapping: (m: Record<number, unknown>) => {\n get: (k: string) => Promise<Buffer | null>\n }\n }\n const raw = await typed.withTypeMapping(mapping).get(`${this.dataPrefix}${key}`)\n if (raw === null) return null\n return new Uint8Array(raw.buffer, raw.byteOffset, raw.byteLength)\n }\n\n async set(\n key: string,\n data: Uint8Array,\n options: { fingerprint?: string | null; ttl?: number | null } = {},\n ): Promise<void> {\n const fp = options.fingerprint ?? defaultFingerprint(data)\n const c = await this.cacheClient()\n const dk = `${this.dataPrefix}${key}`\n const mk = `${this.metaPrefix}${key}`\n const pipe = c.multi()\n pipe.set(dk, Buffer.from(data.buffer, data.byteOffset, data.byteLength))\n pipe.set(mk, fp)\n if (options.ttl !== null && options.ttl !== undefined) {\n pipe.expire(dk, options.ttl)\n pipe.expire(mk, options.ttl)\n }\n await pipe.exec()\n }\n\n async add(\n key: string,\n data: Uint8Array,\n options: { fingerprint?: string | null; ttl?: number | null } = {},\n ): Promise<boolean> {\n const c = await this.cacheClient()\n const exists = await c.exists(`${this.dataPrefix}${key}`)\n if (exists) return false\n await this.set(key, data, options)\n return true\n }\n\n async remove(key: string): Promise<void> {\n // Promises cannot be cancelled: dropping the map entry makes the\n // pending backgroundDrain skip its cache fill, mirroring the RAM\n // store's task cancel.\n this.drainTasks.delete(key)\n const c = await this.cacheClient()\n const pipe = c.multi()\n pipe.del(`${this.dataPrefix}${key}`)\n pipe.del(`${this.metaPrefix}${key}`)\n await pipe.exec()\n }\n\n override async exists(key: string | PathSpec): Promise<boolean> {\n const k = typeof key === 'string' ? key : key.mountPath\n const c = await this.cacheClient()\n return (await c.exists(`${this.dataPrefix}${k}`)) > 0\n }\n\n async isFresh(key: string, remoteFingerprint: string): Promise<boolean> {\n const c = await this.cacheClient()\n const fp = await c.get(`${this.metaPrefix}${key}`)\n if (fp === null) return false\n return fp === remoteFingerprint\n }\n\n async clear(): Promise<void> {\n this.drainTasks.clear()\n const c = await this.cacheClient()\n for (const pattern of [`${this.dataPrefix}*`, `${this.metaPrefix}*`]) {\n const batch: string[] = []\n for await (const k of c.scanIterator({ MATCH: pattern })) {\n if (Array.isArray(k)) batch.push(...k)\n else batch.push(k)\n }\n if (batch.length > 0) await c.del(batch)\n }\n }\n\n async allCached(keys: readonly string[]): Promise<boolean> {\n for (const k of keys) {\n if (!(await this.exists(k))) return false\n }\n return true\n }\n\n async multiGet(keys: readonly string[]): Promise<(Uint8Array | null)[]> {\n const out: (Uint8Array | null)[] = []\n for (const k of keys) out.push(await this.get(k))\n return out\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n type HfRepoConfig,\n type HfRepoConfigRedacted,\n normalizeHfRepoConfig,\n redactHfRepoConfig,\n} from '../hf_buckets/config.ts'\n\nexport type HfModelsConfig = HfRepoConfig\nexport type HfModelsConfigRedacted = HfRepoConfigRedacted\n\nexport const normalizeHfModelsConfig = normalizeHfRepoConfig\nexport const redactHfModelsConfig = redactHfRepoConfig\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n BaseResource,\n type FileStat,\n LANCEDB_COMMANDS,\n LANCEDB_OPS,\n LANCEDB_PROMPT,\n LanceDBAccessor,\n type LanceDBConfig,\n type LanceDBConfigResolved,\n lanceRead,\n lanceReaddir,\n lanceStat,\n type PathSpec,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n ResourceName,\n resolveLanceDBConfig,\n} from '@struktoai/mirage-core'\nimport { LanceDBStore } from './store.ts'\n\nconst REMOTE_SCHEMES = ['s3://', 'gs://', 'az://', 'hf://', 'db://']\n\nexport interface LanceDBResourceOptions {\n config: LanceDBConfig\n}\n\nexport class LanceDBResource extends BaseResource implements Resource {\n readonly kind: string = ResourceName.LANCEDB\n readonly cachesReads: boolean\n override readonly indexTtl: number = 0\n readonly prompt: string = LANCEDB_PROMPT\n readonly config: LanceDBConfigResolved\n readonly store: LanceDBStore\n readonly accessor: LanceDBAccessor\n\n constructor(options: LanceDBResourceOptions | LanceDBConfig) {\n super()\n const config = 'config' in options ? options.config : options\n this.config = resolveLanceDBConfig(config)\n this.cachesReads = REMOTE_SCHEMES.some((scheme) => this.config.uri.startsWith(scheme))\n this.store = new LanceDBStore(this.config)\n this.accessor = new LanceDBAccessor(this.store, this.config)\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n async close(): Promise<void> {\n await this.store.close()\n }\n\n ops(): readonly RegisteredOp[] {\n return LANCEDB_OPS\n }\n\n commands(): readonly RegisteredCommand[] {\n return LANCEDB_COMMANDS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return lanceRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return lanceReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return lanceStat(this.accessor, p, this.index)\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { Connection, Table } from '@lancedb/lancedb'\nimport {\n loadOptionalPeer,\n type LanceDriver,\n type LanceRow,\n type LanceDBConfigResolved,\n} from '@struktoai/mirage-core'\n\nfunction toStr(value: unknown): string {\n if (value === null || value === undefined) return ''\n if (typeof value === 'object') return JSON.stringify(value)\n return String(value as string | number | boolean | bigint)\n}\n\nfunction eqClause(column: string, value: string): string {\n if (/^-?\\d+$/.test(value)) return `${column} = ${value}`\n return `${column} = '${value.replace(/'/g, \"''\")}'`\n}\n\nfunction whereClause(filters: Record<string, string>): string {\n return Object.entries(filters)\n .map(([col, val]) => eqClause(col, val))\n .join(' AND ')\n}\n\nexport class LanceDBStore implements LanceDriver {\n private readonly config: LanceDBConfigResolved\n private db: Connection | null = null\n private readonly tables = new Map<string, Table>()\n\n constructor(config: LanceDBConfigResolved) {\n this.config = config\n }\n\n private async connection(): Promise<Connection> {\n if (this.db === null) {\n const options: Record<string, unknown> = {}\n if (this.config.apiKey !== null) options.apiKey = this.config.apiKey\n if (this.config.storageOptions !== null) options.storageOptions = this.config.storageOptions\n if (this.config.uri.startsWith('db://')) {\n options.region = this.config.region\n if (this.config.hostOverride !== null) options.hostOverride = this.config.hostOverride\n }\n const { connect } = await loadOptionalPeer(() => import('@lancedb/lancedb'), {\n feature: 'LanceDBResource',\n packageName: '@lancedb/lancedb',\n })\n this.db = await connect(this.config.uri, options)\n }\n return this.db\n }\n\n private async table(name: string): Promise<Table> {\n const cached = this.tables.get(name)\n if (cached !== undefined) return cached\n const db = await this.connection()\n const tbl = await db.openTable(name)\n this.tables.set(name, tbl)\n return tbl\n }\n\n async listTables(): Promise<string[]> {\n const db = await this.connection()\n const names = await db.tableNames()\n return [...names].sort()\n }\n\n async distinct(\n table: string,\n column: string,\n filters: Record<string, string>,\n limit: number,\n ): Promise<string[]> {\n const tbl = await this.table(table)\n let query = tbl.query().select([column]).limit(limit)\n if (Object.keys(filters).length > 0) query = query.where(whereClause(filters))\n const rows = (await query.toArray()) as LanceRow[]\n const values = new Set<string>()\n for (const row of rows) {\n const v = row[column]\n if (v !== null && v !== undefined) values.add(toStr(v))\n }\n return [...values].sort()\n }\n\n async rowsMatching(\n table: string,\n filters: Record<string, string>,\n columns: string[],\n limit: number,\n ): Promise<LanceRow[]> {\n const tbl = await this.table(table)\n let query = tbl.query().select(columns).limit(limit)\n if (Object.keys(filters).length > 0) query = query.where(whereClause(filters))\n return (await query.toArray()) as LanceRow[]\n }\n\n async rowRecord(table: string, idColumn: string, rowId: string): Promise<LanceRow | null> {\n const tbl = await this.table(table)\n const rows = (await tbl\n .query()\n .where(eqClause(idColumn, rowId))\n .limit(1)\n .toArray()) as LanceRow[]\n return rows[0] ?? null\n }\n\n async search(table: string, query: string, limit: number): Promise<LanceRow[]> {\n const tbl = await this.table(table)\n return (await tbl.search(query).limit(limit).toArray()) as LanceRow[]\n }\n\n close(): Promise<void> {\n if (this.db !== null) {\n this.db.close()\n this.db = null\n }\n this.tables.clear()\n return Promise.resolve()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { normalizeFields, type Resource } from '@struktoai/mirage-core'\n\n/**\n * Construct a resource by registry name. Mirrors Python's\n * `mirage.resource.registry.build_resource`.\n *\n * Each entry is an async factory that lazy-imports its module so that\n * importing this file doesn't pull in every backend's dependencies.\n * Only the resource you actually request gets loaded — important for\n * S3/Redis whose peer deps (`@aws-sdk/client-s3`, `redis`) are optional.\n *\n * Configs are normalized from Python-style snake_case (used in YAML and\n * by the Python `mirage.config` loader) to TS-idiomatic camelCase. So\n * the same YAML file works in both Python and TS.\n */\nexport type ResourceFactory = (config: Record<string, unknown>) => Promise<Resource>\n\nconst REGISTRY: Record<string, ResourceFactory> = {\n ram: async (_config) => {\n const { RAMResource } = await import('@struktoai/mirage-core')\n return new RAMResource()\n },\n disk: async (config) => {\n const { DiskResource } = await import('./disk/disk.ts')\n const norm = normalizeFields(config) as { root: string }\n return new DiskResource(norm)\n },\n redis: async (config) => {\n const { RedisResource } = await import('./redis/redis.ts')\n const norm = normalizeFields(config)\n return new RedisResource(norm)\n },\n s3: async (config) => {\n const { S3Resource } = await import('./s3/s3.ts')\n const { normalizeS3Config } = await import('./s3/config.ts')\n return new S3Resource(normalizeS3Config(config))\n },\n gridfs: async (config) => {\n const { GridFSResource } = await import('./gridfs/gridfs.ts')\n const { normalizeGridFSConfig } = await import('./gridfs/config.ts')\n return new GridFSResource(normalizeGridFSConfig(config))\n },\n gcs: async (config) => {\n const { GCSResource } = await import('./gcs/gcs.ts')\n const { normalizeGcsConfig } = await import('./gcs/config.ts')\n return new GCSResource(normalizeGcsConfig(config))\n },\n oci: async (config) => {\n const { OCIResource } = await import('./oci/oci.ts')\n const { normalizeOciConfig } = await import('./oci/config.ts')\n return new OCIResource(normalizeOciConfig(config))\n },\n r2: async (config) => {\n const { R2Resource } = await import('./r2/r2.ts')\n const { normalizeR2Config } = await import('./r2/config.ts')\n return new R2Resource(normalizeR2Config(config))\n },\n hf_buckets: async (config) => {\n const { HfBucketsResource } = await import('./hf_buckets/hf_buckets.ts')\n const { normalizeHfBucketsConfig } = await import('./hf_buckets/config.ts')\n return new HfBucketsResource(normalizeHfBucketsConfig(config))\n },\n hf_datasets: async (config) => {\n const { HfDatasetsResource } = await import('./hf_datasets/hf_datasets.ts')\n const { normalizeHfRepoConfig } = await import('./hf_buckets/config.ts')\n return new HfDatasetsResource(normalizeHfRepoConfig(config))\n },\n hf_models: async (config) => {\n const { HfModelsResource } = await import('./hf_models/hf_models.ts')\n const { normalizeHfRepoConfig } = await import('./hf_buckets/config.ts')\n return new HfModelsResource(normalizeHfRepoConfig(config))\n },\n hf_spaces: async (config) => {\n const { HfSpacesResource } = await import('./hf_spaces/hf_spaces.ts')\n const { normalizeHfRepoConfig } = await import('./hf_buckets/config.ts')\n return new HfSpacesResource(normalizeHfRepoConfig(config))\n },\n supabase: async (config) => {\n const { SupabaseResource } = await import('./supabase/supabase.ts')\n const { normalizeSupabaseConfig } = await import('./supabase/config.ts')\n return new SupabaseResource(normalizeSupabaseConfig(config))\n },\n databricks_volume: async (config) => {\n const { DatabricksVolumeResource } = await import('./databricks_volume/databricks_volume.ts')\n const { normalizeDatabricksVolumeConfig } = await import('@struktoai/mirage-core')\n return DatabricksVolumeResource.create(normalizeDatabricksVolumeConfig(config))\n },\n minio: async (config) => {\n const { MinIOResource } = await import('./minio/minio.ts')\n const { normalizeMinIOConfig } = await import('./minio/config.ts')\n return new MinIOResource(normalizeMinIOConfig(config))\n },\n ceph: async (config) => {\n const { CephResource } = await import('./ceph/ceph.ts')\n const { normalizeCephConfig } = await import('./ceph/config.ts')\n return new CephResource(normalizeCephConfig(config))\n },\n seaweedfs: async (config) => {\n const { SeaweedFSResource } = await import('./seaweedfs/seaweedfs.ts')\n const { normalizeSeaweedFSConfig } = await import('./seaweedfs/config.ts')\n return new SeaweedFSResource(normalizeSeaweedFSConfig(config))\n },\n wasabi: async (config) => {\n const { WasabiResource } = await import('./wasabi/wasabi.ts')\n const { normalizeWasabiConfig } = await import('./wasabi/config.ts')\n return new WasabiResource(normalizeWasabiConfig(config))\n },\n backblaze: async (config) => {\n const { BackblazeResource } = await import('./backblaze/backblaze.ts')\n const { normalizeBackblazeConfig } = await import('./backblaze/config.ts')\n return new BackblazeResource(normalizeBackblazeConfig(config))\n },\n digitalocean: async (config) => {\n const { DigitalOceanResource } = await import('./digitalocean/digitalocean.ts')\n const { normalizeDigitalOceanConfig } = await import('./digitalocean/config.ts')\n return new DigitalOceanResource(normalizeDigitalOceanConfig(config))\n },\n tencent: async (config) => {\n const { TencentResource } = await import('./tencent/tencent.ts')\n const { normalizeTencentConfig } = await import('./tencent/config.ts')\n return new TencentResource(normalizeTencentConfig(config))\n },\n aliyun: async (config) => {\n const { AliyunResource } = await import('./aliyun/aliyun.ts')\n const { normalizeAliyunConfig } = await import('./aliyun/config.ts')\n return new AliyunResource(normalizeAliyunConfig(config))\n },\n scaleway: async (config) => {\n const { ScalewayResource } = await import('./scaleway/scaleway.ts')\n const { normalizeScalewayConfig } = await import('./scaleway/config.ts')\n return new ScalewayResource(normalizeScalewayConfig(config))\n },\n qingstor: async (config) => {\n const { QingStorResource } = await import('./qingstor/qingstor.ts')\n const { normalizeQingStorConfig } = await import('./qingstor/config.ts')\n return new QingStorResource(normalizeQingStorConfig(config))\n },\n postgres: async (config) => {\n const { PostgresResource } = await import('./postgres/postgres.ts')\n const { normalizePostgresConfig } = await import('@struktoai/mirage-core')\n return new PostgresResource(normalizePostgresConfig(config))\n },\n mongodb: async (config) => {\n const { MongoDBResource } = await import('./mongodb/mongodb.ts')\n const { normalizeMongoDBConfig } = await import('@struktoai/mirage-core')\n return new MongoDBResource(normalizeMongoDBConfig(config))\n },\n slack: async (config) => {\n const { SlackResource } = await import('./slack/slack.ts')\n const { normalizeSlackConfig } = await import('./slack/config.ts')\n return new SlackResource(normalizeSlackConfig(config))\n },\n ssh: async (config) => {\n const { SSHResource } = await import('./ssh/ssh.ts')\n const { normalizeSshConfig } = await import('./ssh/config.ts')\n return new SSHResource(normalizeSshConfig(config))\n },\n nextcloud: async (config) => {\n const { NextcloudResource } = await import('./nextcloud/nextcloud.ts')\n const { normalizeNextcloudConfig } = await import('./nextcloud/config.ts')\n return new NextcloudResource(normalizeNextcloudConfig(config))\n },\n discord: async (config) => {\n const { DiscordResource } = await import('./discord/discord.ts')\n const { normalizeDiscordConfig } = await import('./discord/config.ts')\n return new DiscordResource(normalizeDiscordConfig(config))\n },\n trello: async (config) => {\n const { TrelloResource } = await import('./trello/trello.ts')\n const { normalizeTrelloConfig } = await import('./trello/config.ts')\n return new TrelloResource(normalizeTrelloConfig(config))\n },\n linear: async (config) => {\n const { LinearResource } = await import('./linear/linear.ts')\n const { normalizeLinearConfig } = await import('./linear/config.ts')\n return new LinearResource(normalizeLinearConfig(config))\n },\n notion: async (config) => {\n const { NotionResource } = await import('./notion/notion.ts')\n const { normalizeNotionConfig } = await import('./notion/config.ts')\n return new NotionResource(normalizeNotionConfig(config))\n },\n langfuse: async (config) => {\n const { LangfuseResource } = await import('./langfuse/langfuse.ts')\n const { normalizeLangfuseConfig } = await import('./langfuse/config.ts')\n return new LangfuseResource(normalizeLangfuseConfig(config))\n },\n github: async (config) => {\n const { GitHubResource } = await import('./github/github.ts')\n const { normalizeGitHubConfig } = await import('./github/config.ts')\n return GitHubResource.create(normalizeGitHubConfig(config))\n },\n github_ci: async (config) => {\n const { GitHubCIResource } = await import('./github_ci/github_ci.ts')\n const { normalizeGitHubCIConfig } = await import('./github_ci/config.ts')\n return new GitHubCIResource(normalizeGitHubCIConfig(config))\n },\n gdocs: async (config) => {\n const { GDocsResource } = await import('./gdocs/gdocs.ts')\n const { normalizeGDocsConfig } = await import('./gdocs/config.ts')\n return new GDocsResource(normalizeGDocsConfig(config))\n },\n gsheets: async (config) => {\n const { GSheetsResource } = await import('./gsheets/gsheets.ts')\n const { normalizeGSheetsConfig } = await import('./gsheets/config.ts')\n return new GSheetsResource(normalizeGSheetsConfig(config))\n },\n gslides: async (config) => {\n const { GSlidesResource } = await import('./gslides/gslides.ts')\n const { normalizeGSlidesConfig } = await import('./gslides/config.ts')\n return new GSlidesResource(normalizeGSlidesConfig(config))\n },\n gdrive: async (config) => {\n const { GDriveResource } = await import('./gdrive/gdrive.ts')\n const { normalizeGDriveConfig } = await import('./gdrive/config.ts')\n return new GDriveResource(normalizeGDriveConfig(config))\n },\n dropbox: async (config) => {\n const { DropboxResource } = await import('./dropbox/dropbox.ts')\n const { normalizeDropboxConfig } = await import('./dropbox/config.ts')\n return new DropboxResource(normalizeDropboxConfig(config))\n },\n box: async (config) => {\n const { BoxResource } = await import('./box/box.ts')\n const { normalizeBoxConfig } = await import('./box/config.ts')\n return new BoxResource(normalizeBoxConfig(config))\n },\n gmail: async (config) => {\n const { GmailResource } = await import('./gmail/gmail.ts')\n const { normalizeGmailConfig } = await import('./gmail/config.ts')\n return new GmailResource(normalizeGmailConfig(config))\n },\n email: async (config) => {\n const { EmailResource } = await import('./email/email.ts')\n const { normalizeEmailConfig } = await import('./email/config.ts')\n return new EmailResource(normalizeEmailConfig(config))\n },\n}\n\n/**\n * Look up the registered names. Lazily-mutated by `register()` so users\n * can extend the registry with custom resources.\n */\nexport function knownResources(): string[] {\n return Object.keys(REGISTRY).sort()\n}\n\n/**\n * Register a custom resource factory under `name`. Existing entries\n * are overwritten, mirroring Python's mutable REGISTRY dict.\n */\nexport function register(name: string, factory: ResourceFactory): void {\n REGISTRY[name] = factory\n}\n\n/**\n * Build a resource instance by registry name. Throws if the name is\n * unknown.\n */\nexport async function buildResource(\n name: string,\n config: Record<string, unknown> = {},\n): Promise<Resource> {\n const factory = REGISTRY[name]\n if (factory === undefined) {\n throw new Error(\n `unknown resource ${JSON.stringify(name)}; known: ${knownResources().join(', ')}`,\n )\n }\n return factory(config)\n}\n"],"mappings":"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","names":["createRequire","path","requireCjs","createRequire","mkdir","readFile","readdir","stat","unlink","writeFile","path","path","NamespaceStore","NamespaceStore","path","readFileSync","SessionStore","readFileSync","SessionStore","path","path","WorkspaceStateStore","WorkspaceStateStore","Buffer","createRequire","FileType","requireCjs","loadOptionalPeer","DiskResource","RedisResource","S3Resource","GridFSResource","normalizeGridFSConfig","GCSResource","OCIResource","R2Resource","HfBucketsResource","normalizeHfBucketsConfig","HfDatasetsResource","normalizeHfRepoConfig","HfModelsResource","HfSpacesResource","SupabaseResource","DatabricksVolumeResource","MinIOResource","CephResource","SeaweedFSResource","WasabiResource","BackblazeResource","DigitalOceanResource","TencentResource","AliyunResource","ScalewayResource","QingStorResource","PostgresResource","MongoDBResource","SlackResource","normalizeSlackConfig","SSHResource","normalizeSshConfig","NextcloudResource","normalizeNextcloudConfig","DiscordResource","normalizeDiscordConfig","TrelloResource","normalizeTrelloConfig","LinearResource","normalizeLinearConfig","NotionResource","normalizeNotionConfig","LangfuseResource","normalizeLangfuseConfig","GitHubResource","normalizeGitHubConfig","GitHubCIResource","normalizeGitHubCIConfig","GDocsResource","normalizeGDocsConfig","GSheetsResource","normalizeGSheetsConfig","GSlidesResource","normalizeGSlidesConfig","GDriveResource","normalizeGDriveConfig","DropboxResource","normalizeDropboxConfig","BoxResource","normalizeBoxConfig","GmailResource","EmailResource","normalizeEmailConfig"]}