@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 CHANGED
@@ -1,6 +1,20 @@
1
+ import {
2
+ DropboxResource
3
+ } from "./chunk-HWQPEBID.js";
4
+ import {
5
+ BoxResource
6
+ } from "./chunk-BWLUBJQG.js";
7
+ import {
8
+ normalizeBoxConfig,
9
+ redactBoxConfig
10
+ } from "./chunk-XFSEADPC.js";
1
11
  import {
2
12
  GmailResource
3
- } from "./chunk-MPCCRRE6.js";
13
+ } from "./chunk-CB76WPUS.js";
14
+ import {
15
+ normalizeGoogleConfig,
16
+ redactGoogleConfig
17
+ } from "./chunk-LPDLPRPS.js";
4
18
  import {
5
19
  EMAIL_COMMANDS,
6
20
  EMAIL_OPS,
@@ -8,273 +22,277 @@ import {
8
22
  EMAIL_WRITE_PROMPT,
9
23
  EmailAccessor,
10
24
  EmailResource
11
- } from "./chunk-S5OVP467.js";
25
+ } from "./chunk-4GYB7DGC.js";
12
26
  import {
13
27
  buildEmailConfig,
14
28
  normalizeEmailConfig,
15
29
  redactEmailConfig
16
- } from "./chunk-B2ZOKNN4.js";
30
+ } from "./chunk-CQCTCW4S.js";
31
+ import {
32
+ GDocsResource
33
+ } from "./chunk-JEBH5APX.js";
34
+ import {
35
+ GSheetsResource
36
+ } from "./chunk-SAOQW6ZJ.js";
37
+ import {
38
+ normalizeGSheetsConfig,
39
+ redactGSheetsConfig
40
+ } from "./chunk-D3U7VQCG.js";
17
41
  import {
18
42
  GSlidesResource
19
- } from "./chunk-A7IVFIOP.js";
43
+ } from "./chunk-YRJICL2Q.js";
44
+ import {
45
+ normalizeGSlidesConfig,
46
+ redactGSlidesConfig
47
+ } from "./chunk-GTAS3QVC.js";
20
48
  import {
21
49
  GDriveResource
22
- } from "./chunk-QCZ2XUKH.js";
50
+ } from "./chunk-VLRSOWHP.js";
23
51
  import {
24
52
  normalizeGDriveConfig,
25
53
  redactGDriveConfig
26
- } from "./chunk-DP2PP5V2.js";
27
- import {
28
- DropboxResource
29
- } from "./chunk-SWCDFEUK.js";
54
+ } from "./chunk-KGC2OGXI.js";
30
55
  import {
31
56
  normalizeDropboxConfig,
32
57
  redactDropboxConfig
33
- } from "./chunk-Q2IAILVC.js";
58
+ } from "./chunk-HSD24IP2.js";
34
59
  import {
35
- BoxResource
36
- } from "./chunk-VWKUT4CW.js";
60
+ NotionResource
61
+ } from "./chunk-SI4GMRXD.js";
37
62
  import {
38
- normalizeBoxConfig,
39
- redactBoxConfig
40
- } from "./chunk-OZAEWZZ3.js";
63
+ LangfuseResource
64
+ } from "./chunk-M6E7VK4D.js";
41
65
  import {
42
- normalizeGoogleConfig,
43
- redactGoogleConfig
44
- } from "./chunk-54NTYJEO.js";
66
+ normalizeLangfuseConfig,
67
+ redactLangfuseConfig
68
+ } from "./chunk-AULFV3KY.js";
45
69
  import {
46
70
  GitHubResource
47
- } from "./chunk-LV2G7VHL.js";
71
+ } from "./chunk-5YRWF5RP.js";
72
+ import {
73
+ normalizeGitHubConfig,
74
+ redactGitHubConfig
75
+ } from "./chunk-XUUSWR4U.js";
48
76
  import {
49
77
  GitHubCIResource
50
- } from "./chunk-EZQ5HBAC.js";
78
+ } from "./chunk-JBDFYIN2.js";
51
79
  import {
52
80
  normalizeGitHubCIConfig,
53
81
  redactGitHubCIConfig
54
- } from "./chunk-H3I2KZIY.js";
55
- import {
56
- GDocsResource
57
- } from "./chunk-JCC4CU2I.js";
82
+ } from "./chunk-ZPB3SLPK.js";
58
83
  import {
59
84
  normalizeGDocsConfig,
60
85
  redactGDocsConfig
61
- } from "./chunk-H3BST2LI.js";
86
+ } from "./chunk-JHI2PHHD.js";
62
87
  import {
63
- GSheetsResource
64
- } from "./chunk-ZEGAMJO2.js";
88
+ NEXTCLOUD_COMMANDS,
89
+ NEXTCLOUD_OPS,
90
+ NEXTCLOUD_PROMPT,
91
+ NextcloudAccessor,
92
+ NextcloudResource
93
+ } from "./chunk-ZPZQXHW2.js";
65
94
  import {
66
- normalizeGSheetsConfig,
67
- redactGSheetsConfig
68
- } from "./chunk-LW25LMIH.js";
95
+ DiscordResource
96
+ } from "./chunk-RHUEV4I7.js";
69
97
  import {
70
- normalizeGSlidesConfig,
71
- redactGSlidesConfig
72
- } from "./chunk-W7FLHT65.js";
98
+ normalizeDiscordConfig,
99
+ redactDiscordConfig
100
+ } from "./chunk-EVK6HH6Z.js";
73
101
  import {
74
102
  TrelloResource
75
- } from "./chunk-WAR4Q2NM.js";
103
+ } from "./chunk-3JZN3GYO.js";
104
+ import {
105
+ normalizeTrelloConfig,
106
+ redactTrelloConfig
107
+ } from "./chunk-NJ42VNXG.js";
76
108
  import {
77
109
  LinearResource
78
- } from "./chunk-G2WCEUQL.js";
110
+ } from "./chunk-ZMREYTHA.js";
79
111
  import {
80
112
  normalizeLinearConfig,
81
113
  redactLinearConfig
82
- } from "./chunk-YUK3X3B4.js";
83
- import {
84
- NotionResource
85
- } from "./chunk-NOHWIBRX.js";
114
+ } from "./chunk-IKJQOYI4.js";
86
115
  import {
87
116
  normalizeNotionConfig,
88
117
  redactNotionConfig
89
- } from "./chunk-JZT4QGIP.js";
90
- import {
91
- LangfuseResource
92
- } from "./chunk-EM4J5EQS.js";
118
+ } from "./chunk-VIICUPWQ.js";
93
119
  import {
94
- normalizeLangfuseConfig,
95
- redactLangfuseConfig
96
- } from "./chunk-VGLHY6BK.js";
120
+ QINGSTOR_PROMPT,
121
+ QingStorResource
122
+ } from "./chunk-5I7Q7RHW.js";
97
123
  import {
98
- normalizeGitHubConfig,
99
- redactGitHubConfig
100
- } from "./chunk-TWGVQLG2.js";
124
+ PostgresResource,
125
+ PostgresStore
126
+ } from "./chunk-VHED2STW.js";
101
127
  import {
102
128
  MongoDBResource,
103
129
  MongoDBStore
104
- } from "./chunk-GCFYZSVR.js";
130
+ } from "./chunk-FRGTDZQT.js";
105
131
  import {
106
132
  SlackResource
107
- } from "./chunk-M5FVUIYP.js";
133
+ } from "./chunk-IEVLWEBO.js";
108
134
  import {
109
135
  normalizeSlackConfig,
110
136
  redactSlackConfig
111
- } from "./chunk-SFUCUARB.js";
137
+ } from "./chunk-IEHPTILN.js";
112
138
  import {
113
139
  SSHAccessor,
114
140
  SSHResource,
115
141
  SSH_COMMANDS,
116
142
  SSH_OPS,
117
143
  SSH_PROMPT
118
- } from "./chunk-WHFUWWI6.js";
144
+ } from "./chunk-5ZHNPNDD.js";
119
145
  import {
120
146
  normalizeSshConfig,
121
147
  redactSshConfig
122
- } from "./chunk-UGK4TAVK.js";
123
- import {
124
- DiscordResource
125
- } from "./chunk-JAGJTM3Q.js";
148
+ } from "./chunk-LPLZLSMK.js";
126
149
  import {
127
- normalizeDiscordConfig,
128
- redactDiscordConfig
129
- } from "./chunk-DNBAMB5J.js";
150
+ normalizeNextcloudConfig,
151
+ redactNextcloudConfig
152
+ } from "./chunk-MRXTUFBZ.js";
130
153
  import {
131
- normalizeTrelloConfig,
132
- redactTrelloConfig
133
- } from "./chunk-RO5IQEDQ.js";
154
+ DIGITALOCEAN_PROMPT,
155
+ DigitalOceanResource
156
+ } from "./chunk-CXQGMFI7.js";
134
157
  import {
135
158
  TENCENT_PROMPT,
136
159
  TencentResource
137
- } from "./chunk-YAHRT6MB.js";
160
+ } from "./chunk-EGZNOUMH.js";
161
+ import {
162
+ redactTencentConfig,
163
+ resolvedTencentEndpoint
164
+ } from "./chunk-WTSSEUOZ.js";
138
165
  import {
139
166
  ALIYUN_PROMPT,
140
167
  AliyunResource
141
- } from "./chunk-FQ33BYFR.js";
168
+ } from "./chunk-XEMLYWHK.js";
142
169
  import {
143
170
  redactAliyunConfig,
144
171
  resolvedAliyunEndpoint
145
- } from "./chunk-NJMGCT63.js";
172
+ } from "./chunk-2QNPKPZZ.js";
146
173
  import {
147
174
  SCALEWAY_PROMPT,
148
175
  ScalewayResource
149
- } from "./chunk-3WIO7NBR.js";
176
+ } from "./chunk-L4GMDSMB.js";
150
177
  import {
151
178
  redactScalewayConfig,
152
179
  resolvedScalewayEndpoint
153
- } from "./chunk-XLQI4IT2.js";
154
- import {
155
- QINGSTOR_PROMPT,
156
- QingStorResource
157
- } from "./chunk-QQBJC2FQ.js";
180
+ } from "./chunk-YBVMZ7SR.js";
158
181
  import {
159
182
  redactQingStorConfig,
160
183
  resolvedQingStorEndpoint
161
- } from "./chunk-OHROA3FQ.js";
184
+ } from "./chunk-WWP2STF5.js";
162
185
  import {
163
- PostgresResource,
164
- PostgresStore
165
- } from "./chunk-GS5AUKUO.js";
186
+ SEAWEEDFS_PROMPT,
187
+ SeaweedFSResource
188
+ } from "./chunk-NLXJMXVE.js";
166
189
  import {
167
190
  CEPH_PROMPT,
168
191
  CephResource
169
- } from "./chunk-IK2L4EN3.js";
192
+ } from "./chunk-XADEMW6B.js";
193
+ import {
194
+ redactCephConfig
195
+ } from "./chunk-UYA3XL3J.js";
170
196
  import {
171
197
  WASABI_PROMPT,
172
198
  WasabiResource
173
- } from "./chunk-47AVIIOT.js";
199
+ } from "./chunk-L7FEZ7LU.js";
174
200
  import {
175
201
  redactWasabiConfig,
176
202
  resolvedWasabiEndpoint
177
- } from "./chunk-JALIYI6M.js";
203
+ } from "./chunk-S4KVLPBR.js";
178
204
  import {
179
205
  BACKBLAZE_PROMPT,
180
206
  BackblazeResource
181
- } from "./chunk-X3G37FXT.js";
207
+ } from "./chunk-SYMNWNC3.js";
182
208
  import {
183
209
  redactBackblazeConfig,
184
210
  resolvedBackblazeEndpoint
185
- } from "./chunk-XHCBHYN4.js";
186
- import {
187
- DIGITALOCEAN_PROMPT,
188
- DigitalOceanResource
189
- } from "./chunk-KPULTUOK.js";
211
+ } from "./chunk-UAJYJP5C.js";
190
212
  import {
191
213
  redactDigitalOceanConfig,
192
214
  resolvedDigitalOceanEndpoint
193
- } from "./chunk-ZNWVJ6UW.js";
215
+ } from "./chunk-3ASOQTZB.js";
194
216
  import {
195
- redactTencentConfig,
196
- resolvedTencentEndpoint
197
- } from "./chunk-YGZMVNN5.js";
217
+ HF_BUCKETS_PROMPT,
218
+ HfBucketsResource
219
+ } from "./chunk-4M73WHIE.js";
198
220
  import {
199
221
  HF_DATASETS_PROMPT,
200
222
  HfDatasetsResource
201
- } from "./chunk-N5FSLVKO.js";
223
+ } from "./chunk-DXU7NZPH.js";
202
224
  import {
203
225
  HF_MODELS_PROMPT,
204
226
  HfModelsResource
205
- } from "./chunk-UINQOUZR.js";
227
+ } from "./chunk-V7JVMG63.js";
206
228
  import {
207
229
  HF_SPACES_PROMPT,
208
230
  HfSpacesResource
209
- } from "./chunk-X5HF2OFP.js";
231
+ } from "./chunk-BWWU5T2D.js";
232
+ import {
233
+ HF_COMMANDS,
234
+ HF_OPS,
235
+ HF_RESOURCES,
236
+ HfAccessor,
237
+ HfBucketsAccessor,
238
+ HfDatasetsAccessor,
239
+ HfModelsAccessor,
240
+ HfSpacesAccessor
241
+ } from "./chunk-HEDE2377.js";
242
+ import {
243
+ HF_ENDPOINT,
244
+ assertHfRepoId,
245
+ normalizeHfBucketsConfig,
246
+ normalizeHfRepoConfig,
247
+ redactHfBucketsConfig,
248
+ redactHfRepoConfig
249
+ } from "./chunk-KAWDDS27.js";
210
250
  import {
211
251
  MINIO_PROMPT,
212
252
  MinIOResource
213
- } from "./chunk-7CW3BMPH.js";
253
+ } from "./chunk-4X6CLF4F.js";
214
254
  import {
215
255
  redactMinIOConfig
216
- } from "./chunk-DYXEITK3.js";
217
- import {
218
- SEAWEEDFS_PROMPT,
219
- SeaweedFSResource
220
- } from "./chunk-AUHSTJJ3.js";
256
+ } from "./chunk-GF75O2EN.js";
221
257
  import {
222
258
  redactSeaweedFSConfig
223
- } from "./chunk-2CC5VW7K.js";
259
+ } from "./chunk-MIQ3ECZM.js";
224
260
  import {
225
- redactCephConfig
226
- } from "./chunk-OPYQ5KIO.js";
261
+ GCSResource,
262
+ GCS_PROMPT
263
+ } from "./chunk-25W4XQJZ.js";
264
+ import {
265
+ GCS_ENDPOINT,
266
+ redactGcsConfig
267
+ } from "./chunk-E3KXVEYI.js";
227
268
  import {
228
269
  OCIResource,
229
270
  OCI_PROMPT
230
- } from "./chunk-DM4GSE26.js";
271
+ } from "./chunk-TUNR4VUM.js";
231
272
  import {
232
273
  redactOciConfig
233
- } from "./chunk-RQK5UPMP.js";
274
+ } from "./chunk-H62XQZUM.js";
234
275
  import {
235
276
  R2Resource,
236
277
  R2_PROMPT
237
- } from "./chunk-ZGSER5TG.js";
278
+ } from "./chunk-ZM44MGC5.js";
238
279
  import {
239
280
  redactR2Config
240
- } from "./chunk-LAJJPLEV.js";
281
+ } from "./chunk-VBYIDRNU.js";
241
282
  import {
242
283
  SUPABASE_PROMPT,
243
284
  SupabaseResource
244
- } from "./chunk-HGCRXJGP.js";
285
+ } from "./chunk-F5NWRF32.js";
245
286
  import {
246
287
  redactSupabaseConfig,
247
288
  resolvedSupabaseEndpoint
248
- } from "./chunk-QGRDPSAH.js";
249
- import {
250
- HF_BUCKETS_PROMPT,
251
- HfBucketsResource
252
- } from "./chunk-HJJMP6IX.js";
253
- import {
254
- HF_COMMANDS,
255
- HF_OPS,
256
- HF_RESOURCES,
257
- HfAccessor,
258
- HfBucketsAccessor,
259
- HfDatasetsAccessor,
260
- HfModelsAccessor,
261
- HfSpacesAccessor
262
- } from "./chunk-TURD42QO.js";
263
- import {
264
- HF_ENDPOINT,
265
- assertHfRepoId,
266
- normalizeHfBucketsConfig,
267
- normalizeHfRepoConfig,
268
- redactHfBucketsConfig,
269
- redactHfRepoConfig
270
- } from "./chunk-EGB7V74Z.js";
289
+ } from "./chunk-2ERLWAGG.js";
271
290
  import {
272
291
  DISK_COMMANDS,
273
292
  DISK_OPS,
274
293
  DISK_PROMPT,
275
294
  DiskResource
276
- } from "./chunk-XWVDS66D.js";
277
- import "./chunk-U6QSXTUS.js";
295
+ } from "./chunk-W5ZLIQFR.js";
278
296
  import {
279
297
  REDIS_COMMANDS,
280
298
  REDIS_OPS,
@@ -283,29 +301,28 @@ import {
283
301
  RedisResource,
284
302
  RedisStore,
285
303
  stat
286
- } from "./chunk-IDYHQQOH.js";
304
+ } from "./chunk-OSVZKYXS.js";
287
305
  import {
288
- loadOptionalPeer
289
- } from "./chunk-E2ISWXLB.js";
306
+ S3Resource
307
+ } from "./chunk-IUXXZHY3.js";
290
308
  import {
291
- DatabricksVolumeResource,
292
- loadDatabricksProfile,
293
- parseDatabricksCfg
294
- } from "./chunk-RNQN2FOU.js";
309
+ redactConfig
310
+ } from "./chunk-HCU3B6FW.js";
295
311
  import {
296
- GCSResource,
297
- GCS_PROMPT
298
- } from "./chunk-I5THIMPP.js";
312
+ GridFSAccessor,
313
+ GridFSResource
314
+ } from "./chunk-CGGO5NKD.js";
299
315
  import {
300
- S3Resource
301
- } from "./chunk-TA3WMOMU.js";
316
+ loadOptionalPeer
317
+ } from "./chunk-OQKNDS66.js";
302
318
  import {
303
- redactConfig
304
- } from "./chunk-UT2OPSN4.js";
319
+ normalizeGridFSConfig
320
+ } from "./chunk-C7TNKIK5.js";
305
321
  import {
306
- GCS_ENDPOINT,
307
- redactGcsConfig
308
- } from "./chunk-XGJ2QERC.js";
322
+ DatabricksVolumeResource,
323
+ loadDatabricksProfile,
324
+ parseDatabricksCfg
325
+ } from "./chunk-HGIPWY5Y.js";
309
326
 
310
327
  // src/index.ts
311
328
  export * from "@struktoai/mirage-core";
@@ -328,7 +345,14 @@ import { tmpdir } from "os";
328
345
  import { join } from "path";
329
346
 
330
347
  // src/fuse/fs.ts
331
- import { FileType, rstripSlash } from "@struktoai/mirage-core";
348
+ import { posix } from "path";
349
+ import {
350
+ FileType,
351
+ isMissingOp,
352
+ PathSpec,
353
+ runWithSession,
354
+ rstripSlash
355
+ } from "@struktoai/mirage-core";
332
356
 
333
357
  // src/fuse/platform/macos.ts
334
358
  var MACOS_METADATA = /* @__PURE__ */ new Set([
@@ -342,17 +366,15 @@ function isMacosMetadata(name) {
342
366
  }
343
367
 
344
368
  // src/fuse/fs.ts
345
- var ENV_AGENT_ID = "MIRAGE_AGENT_ID";
346
- var MIRAGE_DIR = "/.mirage";
347
- var MIRAGE_WHOAMI = "/.mirage/whoami";
348
369
  var ENOENT = -2;
349
370
  var EACCES = -13;
350
371
  var ENOTDIR = -20;
351
372
  var EEXIST = -17;
352
373
  var ENOTEMPTY = -66;
353
374
  var EIO = -5;
375
+ var EINVAL = -22;
376
+ var EROFS = -30;
354
377
  var PREFETCH_TTL_MS = 3e4;
355
- var UNKNOWN_SIZE_SENTINEL = 100 * 1024 * 1024;
356
378
  function classifyError(err) {
357
379
  const code = err.code;
358
380
  if (code === "ENOTEMPTY") return ENOTEMPTY;
@@ -363,6 +385,7 @@ function classifyError(err) {
363
385
  const msg = (err instanceof Error ? err.message : String(err)).toLowerCase();
364
386
  if (msg.includes("not empty") || msg.includes("enotempty")) return ENOTEMPTY;
365
387
  if (msg.includes("not a directory") || msg.includes("enotdir")) return ENOTDIR;
388
+ if (msg.includes("not allowed to access mount")) return EACCES;
366
389
  if (msg.includes("permission") || msg.includes("eacces") || msg.includes("read-only"))
367
390
  return EACCES;
368
391
  if (msg.includes("file exists") || msg.includes("eexist")) return EEXIST;
@@ -372,7 +395,6 @@ function classifyError(err) {
372
395
  }
373
396
  var MirageFS = class {
374
397
  ws;
375
- agentId;
376
398
  now;
377
399
  root;
378
400
  prefixes;
@@ -385,23 +407,20 @@ var MirageFS = class {
385
407
  nextFh = 1;
386
408
  uid;
387
409
  gid;
410
+ session;
388
411
  constructor(ws, options = {}) {
389
412
  this.ws = ws;
390
- this.agentId = options.agentId ?? process.env[ENV_AGENT_ID] ?? `agent-${Math.random().toString(36).slice(2, 10)}`;
391
413
  this.now = /* @__PURE__ */ new Date();
392
414
  this.root = options.rootPrefix !== void 0 ? rstripSlash(options.rootPrefix) : "";
393
415
  this.prefixes = this.root === "" ? ws.mounts().map((m) => m.prefix) : [];
394
416
  this.uid = typeof process.getuid === "function" ? process.getuid() : 0;
395
417
  this.gid = typeof process.getgid === "function" ? process.getgid() : 0;
418
+ this.session = options.session ?? null;
396
419
  }
397
420
  // ── helpers ──────────────────────────────────────────────────────
398
- resolve(path2) {
399
- if (this.root === "") return path2;
400
- return path2 === "/" ? this.root : this.root + path2;
401
- }
402
- whoamiContent() {
403
- const lines = [`agent: ${this.agentId}`, "cwd: /", `mounts: ${this.prefixes.join(", ")}`];
404
- return new TextEncoder().encode(lines.join("\n") + "\n");
421
+ resolve(path4) {
422
+ if (this.root === "") return path4;
423
+ return path4 === "/" ? this.root : this.root + path4;
405
424
  }
406
425
  dirStat() {
407
426
  return {
@@ -427,8 +446,62 @@ var MirageFS = class {
427
446
  gid: this.gid
428
447
  };
429
448
  }
430
- isVirtualDir(path2) {
431
- const bare = rstripSlash(path2);
449
+ /**
450
+ * Fold merged stat attributes into a FUSE attr. The workspace stat
451
+ * already carries the namespace overlay (chmod bits, chown ids, touched
452
+ * mtime), so honoring these fields here is what makes metadata ops
453
+ * visible over FUSE. String uid/gid (names) are skipped: FUSE wants
454
+ * numeric ids and there is no user db to map against.
455
+ */
456
+ applyStatAttrs(entry, s) {
457
+ if (s.mode !== null) {
458
+ entry.mode = entry.mode & ~4095 | s.mode & 4095;
459
+ }
460
+ if (typeof s.uid === "number") entry.uid = s.uid;
461
+ if (typeof s.gid === "number") entry.gid = s.gid;
462
+ if (s.modified !== null) {
463
+ const ts = new Date(s.modified);
464
+ if (!Number.isNaN(ts.getTime())) {
465
+ entry.mtime = ts;
466
+ entry.ctime = ts;
467
+ }
468
+ }
469
+ return entry;
470
+ }
471
+ /**
472
+ * The target to present for a namespace link at a FUSE path, or null
473
+ * when not a link. Relative targets are stored verbatim and returned
474
+ * as-is. Absolute targets name virtual paths, so they are rewritten
475
+ * relative to the link's directory: returned raw, the kernel would
476
+ * resolve them against the host root and escape the mountpoint.
477
+ */
478
+ linkTarget(path4) {
479
+ const links = this.ws.fs.links;
480
+ if (links === null) return null;
481
+ const target = links.readlink(this.resolve(path4));
482
+ if (target === null) return null;
483
+ if (!target.startsWith("/")) return target;
484
+ let fuseTarget = target;
485
+ if (this.root !== "") {
486
+ if (target === this.root) {
487
+ fuseTarget = "/";
488
+ } else if (target.startsWith(this.root + "/")) {
489
+ fuseTarget = target.slice(this.root.length);
490
+ } else {
491
+ return target;
492
+ }
493
+ }
494
+ const slash = path4.lastIndexOf("/");
495
+ const parent = slash <= 0 ? "/" : path4.slice(0, slash);
496
+ return posix.relative(parent, fuseTarget);
497
+ }
498
+ linkStat(target) {
499
+ const entry = this.fileStat(new TextEncoder().encode(target).byteLength);
500
+ entry.mode = 41471;
501
+ return entry;
502
+ }
503
+ isVirtualDir(path4) {
504
+ const bare = rstripSlash(path4);
432
505
  const normalized = bare + "/";
433
506
  for (const p of this.prefixes) {
434
507
  const pBare = rstripSlash(p);
@@ -436,8 +509,8 @@ var MirageFS = class {
436
509
  }
437
510
  return false;
438
511
  }
439
- virtualChildren(path2) {
440
- const normalized = path2 === "/" ? "/" : rstripSlash(path2) + "/";
512
+ virtualChildren(path4) {
513
+ const normalized = path4 === "/" ? "/" : rstripSlash(path4) + "/";
441
514
  const children = /* @__PURE__ */ new Set();
442
515
  for (const p of this.prefixes) {
443
516
  if (p.startsWith(normalized) && p !== normalized) {
@@ -448,47 +521,47 @@ var MirageFS = class {
448
521
  }
449
522
  return [...children].sort();
450
523
  }
451
- cachedSize(path2) {
524
+ cachedSize(path4) {
452
525
  for (const ctx of this.handles.values()) {
453
- if (ctx.path === path2 && ctx.data !== void 0) return ctx.data.byteLength;
526
+ if (ctx.path === path4 && ctx.data !== void 0) return ctx.data.byteLength;
454
527
  }
455
- const entry = this.prefetchCache.get(path2);
528
+ const entry = this.prefetchCache.get(path4);
456
529
  if (entry !== void 0 && entry.expires > Date.now()) return entry.data.byteLength;
457
530
  return null;
458
531
  }
459
- cachedData(path2) {
532
+ cachedData(path4) {
460
533
  for (const ctx of this.handles.values()) {
461
- if (ctx.path === path2 && ctx.data !== void 0) return ctx.data;
534
+ if (ctx.path === path4 && ctx.data !== void 0) return ctx.data;
462
535
  }
463
- const entry = this.prefetchCache.get(path2);
536
+ const entry = this.prefetchCache.get(path4);
464
537
  if (entry !== void 0 && entry.expires > Date.now()) return entry.data;
465
- if (entry !== void 0) this.prefetchCache.delete(path2);
538
+ if (entry !== void 0) this.prefetchCache.delete(path4);
466
539
  return null;
467
540
  }
468
541
  /**
469
- * Fetch bytes for a size-unknown file and cache them so the immediate
470
- * getattr → open → read burst (and subsequent stats within the TTL) reuse
471
- * the same fetch. Required because @zkochan/fuse-native doesn't expose
472
- * libfuse's `direct_io` flag — without a real size from getattr, the kernel
473
- * decides the file is empty and never issues read().
542
+ * Fetch bytes for a size-unknown file and cache them so the open → read →
543
+ * fstat burst (and subsequent stats within the TTL) reuse the same fetch.
544
+ * With getattr reporting 0 pre-open, this hydration is what lets fgetattr
545
+ * answer with the real byte length after open (mirrors Python's
546
+ * `_prefetch_read`).
474
547
  */
475
- async prefetch(path2) {
476
- const cached = this.cachedData(path2);
548
+ async prefetch(path4) {
549
+ const cached = this.cachedData(path4);
477
550
  if (cached !== null) return cached;
478
- const inflight = this.prefetchInflight.get(path2);
551
+ const inflight = this.prefetchInflight.get(path4);
479
552
  if (inflight !== void 0) return inflight;
480
553
  const promise = (async () => {
481
554
  try {
482
- const data = await this.ws.fs.readFile(this.resolve(path2));
483
- this.prefetchCache.set(path2, { data, expires: Date.now() + PREFETCH_TTL_MS });
555
+ const data = await this.ws.fs.readFile(this.resolve(path4));
556
+ this.prefetchCache.set(path4, { data, expires: Date.now() + PREFETCH_TTL_MS });
484
557
  return data;
485
558
  } catch {
486
559
  return null;
487
560
  } finally {
488
- this.prefetchInflight.delete(path2);
561
+ this.prefetchInflight.delete(path4);
489
562
  }
490
563
  })();
491
- this.prefetchInflight.set(path2, promise);
564
+ this.prefetchInflight.set(path4, promise);
492
565
  return promise;
493
566
  }
494
567
  /** Drain and return accumulated op records (mirrors Python's drain_ops). */
@@ -497,12 +570,12 @@ var MirageFS = class {
497
570
  this.ws.records.length = 0;
498
571
  return records;
499
572
  }
500
- async writeFile(path2, data) {
501
- await this.ws.dispatch("write", this.resolve(path2), [data]);
573
+ async writeFile(path4, data) {
574
+ await this.ws.dispatch("write", this.resolve(path4), [data]);
502
575
  }
503
576
  // ── FUSE op surface (mirrors mfusepy Operations) ─────────────────
504
577
  ops() {
505
- return {
578
+ const table = {
506
579
  readdir: this.readdir.bind(this),
507
580
  getattr: this.getattr.bind(this),
508
581
  fgetattr: this.fgetattr.bind(this),
@@ -510,6 +583,8 @@ var MirageFS = class {
510
583
  read: this.read.bind(this),
511
584
  write: this.write.bind(this),
512
585
  create: this.create.bind(this),
586
+ readlink: this.readlink.bind(this),
587
+ symlink: this.symlink.bind(this),
513
588
  unlink: this.unlink.bind(this),
514
589
  mkdir: this.mkdir.bind(this),
515
590
  rmdir: this.rmdir.bind(this),
@@ -528,58 +603,72 @@ var MirageFS = class {
528
603
  removexattr: this.removexattr.bind(this),
529
604
  statfs: this.statfs.bind(this)
530
605
  };
606
+ const session = this.session;
607
+ if (session === null) return table;
608
+ const bound = {};
609
+ for (const [name, fn] of Object.entries(table)) {
610
+ bound[name] = (...args) => {
611
+ void runWithSession(session, () => {
612
+ fn(...args);
613
+ return Promise.resolve();
614
+ });
615
+ };
616
+ }
617
+ return bound;
531
618
  }
532
- getattr(path2, cb) {
619
+ getattr(path4, cb) {
533
620
  void (async () => {
534
- if (path2 === "/" || path2 === MIRAGE_DIR) {
621
+ if (path4 === "/") {
535
622
  cb(0, this.dirStat());
536
623
  return;
537
624
  }
538
- if (path2 === MIRAGE_WHOAMI) {
539
- cb(0, this.fileStat(this.whoamiContent().byteLength));
540
- return;
541
- }
542
- const name = path2.slice(path2.lastIndexOf("/") + 1);
625
+ const name = path4.slice(path4.lastIndexOf("/") + 1);
543
626
  if (isMacosMetadata(name)) {
544
627
  cb(ENOENT);
545
628
  return;
546
629
  }
547
- if (this.isVirtualDir(path2)) {
630
+ const target = this.linkTarget(path4);
631
+ if (target !== null) {
632
+ cb(0, this.linkStat(target));
633
+ return;
634
+ }
635
+ if (this.isVirtualDir(path4)) {
548
636
  cb(0, this.dirStat());
549
637
  return;
550
638
  }
551
639
  try {
552
- const s = await this.ws.fs.stat(this.resolve(path2));
640
+ const s = await this.ws.fs.stat(this.resolve(path4));
553
641
  if (s.type === FileType.DIRECTORY) {
554
- cb(0, this.dirStat());
642
+ cb(0, this.applyStatAttrs(this.dirStat(), s));
555
643
  return;
556
644
  }
557
645
  let size = s.size;
558
- size ??= this.cachedSize(path2) ?? UNKNOWN_SIZE_SENTINEL;
559
- cb(0, this.fileStat(size));
646
+ size ??= this.cachedSize(path4) ?? 0;
647
+ cb(0, this.applyStatAttrs(this.fileStat(size), s));
560
648
  } catch (err) {
561
649
  cb(classifyError(err));
562
650
  }
563
651
  })();
564
652
  }
565
- fgetattr(path2, fd, cb) {
653
+ fgetattr(path4, fd, cb) {
566
654
  const ctx = this.handles.get(fd);
567
655
  if (ctx?.data !== void 0) {
568
656
  cb(0, this.fileStat(ctx.data.byteLength));
569
657
  return;
570
658
  }
571
- this.getattr(path2, cb);
659
+ this.getattr(path4, cb);
572
660
  }
573
- readdir(path2, cb) {
661
+ readdir(path4, cb) {
574
662
  void (async () => {
575
- if (path2 === MIRAGE_DIR) {
576
- cb(0, [".", "..", "whoami"]);
577
- return;
663
+ const names = new Set(this.virtualChildren(path4));
664
+ const links = this.ws.fs.links;
665
+ if (links !== null) {
666
+ for (const linkName of links.linksUnder(this.resolve(path4)).keys()) {
667
+ if (linkName !== "" && !isMacosMetadata(linkName)) names.add(linkName);
668
+ }
578
669
  }
579
- const names = new Set(this.virtualChildren(path2));
580
- if (path2 === "/") names.add(".mirage");
581
670
  try {
582
- const entries = await this.ws.fs.readdir(this.resolve(path2));
671
+ const entries = await this.ws.fs.readdir(this.resolve(path4));
583
672
  for (const e of entries) {
584
673
  const part = rstripSlash(e).split("/").pop() ?? "";
585
674
  if (part !== "" && !isMacosMetadata(part)) names.add(part);
@@ -593,22 +682,15 @@ var MirageFS = class {
593
682
  cb(0, [".", "..", ...[...names].sort()]);
594
683
  })();
595
684
  }
596
- read(path2, fd, buf, len, pos, cb) {
685
+ read(path4, fd, buf, len, pos, cb) {
597
686
  void (async () => {
598
- if (path2 === MIRAGE_WHOAMI) {
599
- const data = this.whoamiContent();
600
- const slice = data.subarray(pos, pos + len);
601
- buf.set(slice, 0);
602
- cb(slice.byteLength);
603
- return;
604
- }
605
687
  const ctx = this.handles.get(fd);
606
688
  try {
607
689
  if (ctx !== void 0 && ctx.data === void 0) {
608
- const cached = this.cachedData(path2);
609
- ctx.data = cached ?? await this.ws.fs.readFile(this.resolve(path2));
690
+ const cached = this.cachedData(path4);
691
+ ctx.data = cached ?? await this.ws.fs.readFile(this.resolve(path4));
610
692
  }
611
- const data = ctx?.data ?? this.cachedData(path2) ?? await this.ws.fs.readFile(this.resolve(path2));
693
+ const data = ctx?.data ?? this.cachedData(path4) ?? await this.ws.fs.readFile(this.resolve(path4));
612
694
  const slice = data.subarray(pos, pos + len);
613
695
  buf.set(slice, 0);
614
696
  cb(slice.byteLength);
@@ -617,7 +699,7 @@ var MirageFS = class {
617
699
  }
618
700
  })();
619
701
  }
620
- write(path2, fd, buf, len, pos, cb) {
702
+ write(path4, fd, buf, len, pos, cb) {
621
703
  const ctx = this.handles.get(fd);
622
704
  const data = new Uint8Array(buf.subarray(0, len));
623
705
  if (ctx !== void 0) {
@@ -630,7 +712,7 @@ var MirageFS = class {
630
712
  try {
631
713
  let existing = new Uint8Array(0);
632
714
  try {
633
- existing = await this.ws.fs.readFile(this.resolve(path2), { raw: true });
715
+ existing = await this.ws.fs.readFile(this.resolve(path4), { raw: true });
634
716
  } catch {
635
717
  }
636
718
  let merged = existing;
@@ -649,46 +731,84 @@ var MirageFS = class {
649
731
  }
650
732
  merged = out;
651
733
  }
652
- await this.writeFile(path2, merged);
734
+ await this.writeFile(path4, merged);
653
735
  cb(len);
654
736
  } catch {
655
737
  cb(0);
656
738
  }
657
739
  })();
658
740
  }
659
- create(path2, _mode, cb) {
741
+ create(path4, _mode, cb) {
660
742
  void (async () => {
661
743
  try {
662
744
  try {
663
- await this.ws.dispatch("create", this.resolve(path2));
745
+ await this.ws.dispatch("create", this.resolve(path4));
664
746
  } catch (dispatchErr) {
665
- const msg = (dispatchErr instanceof Error ? dispatchErr.message : String(dispatchErr)).toLowerCase();
666
- if (!msg.includes("no op")) throw dispatchErr;
667
- await this.writeFile(path2, new Uint8Array(0));
747
+ if (!isMissingOp(dispatchErr, "create")) throw dispatchErr;
748
+ await this.writeFile(path4, new Uint8Array(0));
668
749
  }
669
750
  const fh = this.nextFh++;
670
- this.handles.set(fh, { path: path2 });
751
+ this.handles.set(fh, { path: path4 });
671
752
  cb(0, fh);
672
753
  } catch (err) {
673
754
  cb(classifyError(err));
674
755
  }
675
756
  })();
676
757
  }
677
- mkdir(path2, _mode, cb) {
758
+ mkdir(path4, _mode, cb) {
678
759
  void (async () => {
679
760
  try {
680
- await this.ws.fs.mkdir(this.resolve(path2));
761
+ await this.ws.dispatch("mkdir", this.resolve(path4));
681
762
  cb(0);
682
763
  } catch (err) {
683
764
  cb(classifyError(err));
684
765
  }
685
766
  })();
686
767
  }
687
- unlink(path2, cb) {
768
+ readlink(path4, cb) {
769
+ const target = this.linkTarget(path4);
770
+ if (target === null) {
771
+ cb(EINVAL);
772
+ return;
773
+ }
774
+ cb(0, target);
775
+ }
776
+ /**
777
+ * Create namespace link `dest -> src` (ln -s src dest; libfuse passes
778
+ * the pointee first). Relative sources are stored verbatim (resolved
779
+ * at follow time, exactly like the shell `ln -s`); absolute sources
780
+ * are mapped into virtual space so a scoped mount stores the path it
781
+ * will later follow.
782
+ */
783
+ symlink(src, dest, cb) {
688
784
  void (async () => {
785
+ const links = this.ws.fs.links;
786
+ if (links === null) {
787
+ cb(EROFS);
788
+ return;
789
+ }
790
+ const stored = src.startsWith("/") ? this.resolve(src) : src;
689
791
  try {
690
- await this.ws.fs.unlink(this.resolve(path2));
691
- this.xattrs.delete(path2);
792
+ await links.symlink(this.resolve(dest), stored, Date.now() / 1e3);
793
+ cb(0);
794
+ } catch (err) {
795
+ cb(classifyError(err));
796
+ }
797
+ })();
798
+ }
799
+ unlink(path4, cb) {
800
+ void (async () => {
801
+ const links = this.ws.fs.links;
802
+ if (links?.isLink(this.resolve(path4)) === true) {
803
+ await links.unlink(this.resolve(path4));
804
+ this.xattrs.delete(path4);
805
+ this.prefetchCache.delete(path4);
806
+ cb(0);
807
+ return;
808
+ }
809
+ try {
810
+ await this.ws.dispatch("unlink", this.resolve(path4));
811
+ this.xattrs.delete(path4);
692
812
  cb(0);
693
813
  } catch (err) {
694
814
  cb(classifyError(err));
@@ -698,7 +818,9 @@ var MirageFS = class {
698
818
  rename(src, dst, cb) {
699
819
  void (async () => {
700
820
  try {
701
- await this.ws.fs.rename(this.resolve(src), this.resolve(dst));
821
+ await this.ws.dispatch("rename", this.resolve(src), [
822
+ PathSpec.fromStrPath(this.resolve(dst))
823
+ ]);
702
824
  const moved = this.xattrs.get(src);
703
825
  if (moved !== void 0) {
704
826
  this.xattrs.delete(src);
@@ -710,37 +832,36 @@ var MirageFS = class {
710
832
  }
711
833
  })();
712
834
  }
713
- rmdir(path2, cb) {
835
+ rmdir(path4, cb) {
714
836
  void (async () => {
715
837
  try {
716
838
  try {
717
- const entries = await this.ws.fs.readdir(this.resolve(path2));
839
+ const entries = await this.ws.fs.readdir(this.resolve(path4));
718
840
  if (entries.length > 0) {
719
841
  cb(ENOTEMPTY);
720
842
  return;
721
843
  }
722
844
  } catch {
723
845
  }
724
- await this.ws.fs.rmdir(this.resolve(path2));
725
- this.xattrs.delete(path2);
846
+ await this.ws.dispatch("rmdir", this.resolve(path4));
847
+ this.xattrs.delete(path4);
726
848
  cb(0);
727
849
  } catch (err) {
728
850
  cb(classifyError(err));
729
851
  }
730
852
  })();
731
853
  }
732
- truncate(path2, size, cb) {
854
+ truncate(path4, size, cb) {
733
855
  void (async () => {
734
856
  try {
735
857
  try {
736
- await this.ws.dispatch("truncate", this.resolve(path2), [size]);
858
+ await this.ws.dispatch("truncate", this.resolve(path4), [size]);
737
859
  } catch (dispatchErr) {
738
- const msg = (dispatchErr instanceof Error ? dispatchErr.message : String(dispatchErr)).toLowerCase();
739
- if (!msg.includes("no op")) throw dispatchErr;
740
- const data = await this.ws.fs.readFile(this.resolve(path2), { raw: true }).catch(() => new Uint8Array(0));
860
+ if (!isMissingOp(dispatchErr, "truncate")) throw dispatchErr;
861
+ const data = await this.ws.fs.readFile(this.resolve(path4), { raw: true }).catch(() => new Uint8Array(0));
741
862
  const out = new Uint8Array(size);
742
863
  out.set(data.subarray(0, Math.min(data.byteLength, size)), 0);
743
- await this.writeFile(path2, out);
864
+ await this.writeFile(path4, out);
744
865
  }
745
866
  cb(0);
746
867
  } catch (err) {
@@ -764,17 +885,17 @@ var MirageFS = class {
764
885
  // chmod / chown / utimens / access are no-ops for the filesystem but must
765
886
  // validate path existence — callers like `touch`/`chmod` on a missing file
766
887
  // should fail with ENOENT, not silently succeed.
767
- chmod(path2, _mode, cb) {
768
- this.getattrValidate(path2, cb);
888
+ chmod(path4, _mode, cb) {
889
+ this.getattrValidate(path4, cb);
769
890
  }
770
- chown(path2, _uid, _gid, cb) {
771
- this.getattrValidate(path2, cb);
891
+ chown(path4, _uid, _gid, cb) {
892
+ this.getattrValidate(path4, cb);
772
893
  }
773
- utimens(path2, _atime, _mtime, cb) {
774
- this.getattrValidate(path2, cb);
894
+ utimens(path4, _atime, _mtime, cb) {
895
+ this.getattrValidate(path4, cb);
775
896
  }
776
- access(path2, _amode, cb) {
777
- this.getattrValidate(path2, cb);
897
+ access(path4, _amode, cb) {
898
+ this.getattrValidate(path4, cb);
778
899
  }
779
900
  // Mirage backends (S3, etc.) have no POSIX extended attributes, so there is
780
901
  // nothing to persist xattrs to. We keep them in memory per mount so tools that
@@ -782,68 +903,62 @@ var MirageFS = class {
782
903
  // Finder writing com.apple.*) succeed instead of failing with ENOTSUP. The
783
904
  // values live only for the mount's lifetime and are never written to the
784
905
  // backend.
785
- setxattr(path2, name, value, _position, _flags, cb) {
786
- this.getattr(path2, (code) => {
906
+ setxattr(path4, name, value, _position, _flags, cb) {
907
+ this.getattr(path4, (code) => {
787
908
  if (code !== 0) {
788
909
  cb(code);
789
910
  return;
790
911
  }
791
- let attrs = this.xattrs.get(path2);
912
+ let attrs = this.xattrs.get(path4);
792
913
  if (attrs === void 0) {
793
914
  attrs = /* @__PURE__ */ new Map();
794
- this.xattrs.set(path2, attrs);
915
+ this.xattrs.set(path4, attrs);
795
916
  }
796
917
  attrs.set(name, Buffer.from(value));
797
918
  cb(0);
798
919
  });
799
920
  }
800
- getxattr(path2, name, _position, cb) {
801
- this.getattr(path2, (code) => {
921
+ getxattr(path4, name, _position, cb) {
922
+ this.getattr(path4, (code) => {
802
923
  if (code !== 0) {
803
924
  cb(code);
804
925
  return;
805
926
  }
806
- cb(0, this.xattrs.get(path2)?.get(name));
927
+ cb(0, this.xattrs.get(path4)?.get(name));
807
928
  });
808
929
  }
809
- listxattr(path2, cb) {
810
- this.getattr(path2, (code) => {
930
+ listxattr(path4, cb) {
931
+ this.getattr(path4, (code) => {
811
932
  if (code !== 0) {
812
933
  cb(code);
813
934
  return;
814
935
  }
815
- const attrs = this.xattrs.get(path2);
936
+ const attrs = this.xattrs.get(path4);
816
937
  cb(0, attrs ? [...attrs.keys()] : []);
817
938
  });
818
939
  }
819
- removexattr(path2, name, cb) {
820
- this.getattr(path2, (code) => {
940
+ removexattr(path4, name, cb) {
941
+ this.getattr(path4, (code) => {
821
942
  if (code !== 0) {
822
943
  cb(code);
823
944
  return;
824
945
  }
825
- this.xattrs.get(path2)?.delete(name);
946
+ this.xattrs.get(path4)?.delete(name);
826
947
  cb(0);
827
948
  });
828
949
  }
829
- getattrValidate(path2, cb) {
830
- this.getattr(path2, (code) => {
950
+ getattrValidate(path4, cb) {
951
+ this.getattr(path4, (code) => {
831
952
  cb(code);
832
953
  });
833
954
  }
834
- open(path2, _flags, cb) {
955
+ open(path4, _flags, cb) {
835
956
  void (async () => {
836
- if (path2 === MIRAGE_WHOAMI) {
837
- const fh = this.nextFh++;
838
- this.handles.set(fh, { path: path2 });
839
- cb(0, fh);
840
- return;
841
- }
842
957
  try {
843
- const s = await this.ws.fs.stat(this.resolve(path2));
844
- const ctx = { path: path2 };
958
+ const s = await this.ws.fs.stat(this.resolve(path4));
959
+ const ctx = { path: path4 };
845
960
  if (s.size === null && s.type !== FileType.DIRECTORY) {
846
- const data = await this.prefetch(path2);
961
+ const data = await this.prefetch(path4);
847
962
  if (data !== null) ctx.data = data;
848
963
  }
849
964
  const fh = this.nextFh++;
@@ -858,7 +973,7 @@ var MirageFS = class {
858
973
  this.handles.delete(fd);
859
974
  cb(0);
860
975
  }
861
- flush(path2, fd, cb) {
976
+ flush(path4, fd, cb) {
862
977
  const ctx = this.handles.get(fd);
863
978
  if (ctx?.writeBuf === void 0 || ctx.writeBuf.length === 0) {
864
979
  cb(0);
@@ -870,7 +985,7 @@ var MirageFS = class {
870
985
  try {
871
986
  let existing = new Uint8Array(0);
872
987
  try {
873
- existing = await this.ws.fs.readFile(this.resolve(path2), { raw: true });
988
+ existing = await this.ws.fs.readFile(this.resolve(path4), { raw: true });
874
989
  } catch {
875
990
  }
876
991
  let total = existing.byteLength;
@@ -882,19 +997,32 @@ var MirageFS = class {
882
997
  for (const [off, chunk] of writes) {
883
998
  merged.set(chunk, off);
884
999
  }
885
- await this.writeFile(path2, merged);
1000
+ await this.writeFile(path4, merged);
886
1001
  cb(0);
887
1002
  } catch (err) {
888
1003
  cb(classifyError(err));
889
1004
  }
890
1005
  })();
891
1006
  }
892
- fsync(path2, _datasync, fd, cb) {
893
- this.flush(path2, fd, cb);
1007
+ fsync(path4, _datasync, fd, cb) {
1008
+ this.flush(path4, fd, cb);
894
1009
  }
895
1010
  };
896
1011
 
897
1012
  // src/fuse/mount.ts
1013
+ function appendDirectIO(fuse) {
1014
+ const orig = fuse._fuseOptions?.bind(fuse);
1015
+ if (orig === void 0) {
1016
+ throw new Error(
1017
+ "@zkochan/fuse-native no longer exposes _fuseOptions(); the direct_io mount option cannot be applied. Update appendDirectIO in mount.ts for the new fuse-native version."
1018
+ );
1019
+ }
1020
+ fuse._fuseOptions = () => {
1021
+ const serialized = orig();
1022
+ if (serialized === "") return "-odirect_io";
1023
+ return serialized.includes("direct_io") ? serialized : `${serialized},direct_io`;
1024
+ };
1025
+ }
898
1026
  async function loadFuse() {
899
1027
  const mod = await loadOptionalPeer(
900
1028
  () => import("@zkochan/fuse-native"),
@@ -931,10 +1059,9 @@ async function mount(ws, options = {}) {
931
1059
  mountpoint = mkdtempSync(join(tmpdir(), "mirage-fuse-"));
932
1060
  ownsMountpoint = true;
933
1061
  }
934
- const agentId = options.agentId;
935
1062
  const mfs = new MirageFS(ws, {
936
- ...agentId !== void 0 ? { agentId } : {},
937
- ...options.rootPrefix !== void 0 ? { rootPrefix: options.rootPrefix } : {}
1063
+ ...options.rootPrefix !== void 0 ? { rootPrefix: options.rootPrefix } : {},
1064
+ ...options.session !== void 0 ? { session: options.session } : {}
938
1065
  });
939
1066
  const autoUnmount = options.autoUnmount ?? process.platform === "linux";
940
1067
  const fuseOpts = {
@@ -945,6 +1072,7 @@ async function mount(ws, options = {}) {
945
1072
  ...options.fuseOptions ?? {}
946
1073
  };
947
1074
  const fuse = new Fuse(mountpoint, mfs.ops(), fuseOpts);
1075
+ if (fuseOpts.directIO !== false) appendDirectIO(fuse);
948
1076
  await new Promise((resolve, reject) => {
949
1077
  fuse.mount((err) => {
950
1078
  if (err === null) resolve();
@@ -1103,27 +1231,24 @@ var Workspace = class extends CoreWorkspace {
1103
1231
  fuseMountpointsMap = /* @__PURE__ */ new Map();
1104
1232
  fuseManagers = /* @__PURE__ */ new Map();
1105
1233
  constructor(resources, options = {}) {
1106
- const bareResources = {};
1107
- const modeOverrides = { ...options.modeOverrides ?? {} };
1234
+ const specs = {};
1108
1235
  const commandSafeguards = {
1109
1236
  ...options.commandSafeguards ?? {}
1110
1237
  };
1111
1238
  const fuseTargets = [];
1112
1239
  for (const [prefix, value] of Object.entries(resources)) {
1113
1240
  if (value instanceof Mount) {
1114
- bareResources[prefix] = value.resource;
1115
- if (value.options.mode !== void 0) modeOverrides[prefix] = value.options.mode;
1241
+ specs[prefix] = value.options.mode !== void 0 ? [value.resource, value.options.mode] : value.resource;
1116
1242
  if (value.options.commandSafeguards !== void 0)
1117
1243
  commandSafeguards[prefix] = value.options.commandSafeguards;
1118
1244
  if (value.options.fuse !== void 0 && value.options.fuse !== false)
1119
1245
  fuseTargets.push([prefix, value.options.fuse]);
1120
1246
  } else {
1121
- bareResources[prefix] = value;
1247
+ specs[prefix] = value;
1122
1248
  }
1123
1249
  }
1124
- super(bareResources, {
1250
+ super(specs, {
1125
1251
  ...options,
1126
- ...Object.keys(modeOverrides).length > 0 ? { modeOverrides } : {},
1127
1252
  ...Object.keys(commandSafeguards).length > 0 ? { commandSafeguards } : {},
1128
1253
  shellParserFactory: options.shellParserFactory ?? loadShellParser
1129
1254
  });
@@ -1157,29 +1282,38 @@ var Workspace = class extends CoreWorkspace {
1157
1282
  * its own {@link FuseManager}, so a workspace can expose any number of FUSE
1158
1283
  * subtrees at once. A pinned mountpoint is collision-checked BEFORE mounting,
1159
1284
  * so a clash never leaves a partial kernel mount.
1285
+ *
1286
+ * A session-bound mount (`sessionId` given) runs every op under that
1287
+ * session's mount grants (the kernel-tier primitive: bind-mount the tree
1288
+ * into a container and the narrowing travels with it); it is keyed
1289
+ * separately so the same prefix can also be exposed unbound.
1160
1290
  */
1161
- async addFuseMount(prefix, mountpoint) {
1162
- if (mountpoint !== void 0) this.registerFuseMount(prefix, mountpoint);
1291
+ async addFuseMount(prefix, mountpoint, sessionId) {
1292
+ const session = sessionId !== void 0 ? this.getSession(sessionId) : void 0;
1293
+ const key = sessionId === void 0 ? prefix : `${prefix}@${sessionId}`;
1294
+ if (mountpoint !== void 0) this.registerFuseMount(key, mountpoint);
1163
1295
  const fm = new FuseManager();
1164
- this.fuseManagers.set(prefix, fm);
1296
+ this.fuseManagers.set(key, fm);
1165
1297
  try {
1166
1298
  const mp = await fm.setup(this, {
1167
1299
  rootPrefix: prefix,
1168
- ...mountpoint !== void 0 ? { mountpoint } : {}
1300
+ ...mountpoint !== void 0 ? { mountpoint } : {},
1301
+ ...session !== void 0 ? { session } : {}
1169
1302
  });
1170
- if (mountpoint === void 0) this.registerFuseMount(prefix, mp);
1303
+ if (mountpoint === void 0) this.registerFuseMount(key, mp);
1171
1304
  return mp;
1172
1305
  } catch (err) {
1173
- this.fuseManagers.delete(prefix);
1174
- this.fuseMountpointsMap.delete(prefix);
1306
+ this.fuseManagers.delete(key);
1307
+ this.fuseMountpointsMap.delete(key);
1175
1308
  throw err;
1176
1309
  }
1177
1310
  }
1178
- async removeFuseMount(prefix) {
1179
- const fm = this.fuseManagers.get(prefix);
1180
- this.fuseManagers.delete(prefix);
1311
+ async removeFuseMount(prefix, sessionId) {
1312
+ const key = sessionId === void 0 ? prefix : `${prefix}@${sessionId}`;
1313
+ const fm = this.fuseManagers.get(key);
1314
+ this.fuseManagers.delete(key);
1181
1315
  if (fm !== void 0) await fm.unmount();
1182
- this.fuseMountpointsMap.delete(prefix);
1316
+ this.fuseMountpointsMap.delete(key);
1183
1317
  }
1184
1318
  get fuseMountpoints() {
1185
1319
  return Object.fromEntries(this.fuseMountpointsMap);
@@ -1347,11 +1481,634 @@ var RedisObserverStore = class {
1347
1481
  }
1348
1482
  async close() {
1349
1483
  if (this.clientPromise === null) return;
1350
- const c = await this.clientPromise;
1484
+ const pending = this.clientPromise;
1485
+ this.clientPromise = null;
1486
+ const c = await pending;
1351
1487
  await c.quit();
1352
1488
  }
1353
1489
  };
1354
1490
 
1491
+ // src/workspace/namespace/disk.ts
1492
+ import { NamespaceStore } from "@struktoai/mirage-core";
1493
+
1494
+ // src/workspace/session/disk.ts
1495
+ import { mkdir as mkdir2, open, readFile as readFile2, readdir as readdir2, rename, stat as stat2, unlink as unlink2, writeFile as writeFile2 } from "fs/promises";
1496
+ import path2 from "path";
1497
+ import { generationOf, SessionStore } from "@struktoai/mirage-core";
1498
+ var LOCK_STALE_SECONDS = 10;
1499
+ var LOCK_RETRY_SLEEP_MS = 5;
1500
+ var LOCK_RETRY_LIMIT = 2e3;
1501
+ var tmpCounter = 0;
1502
+ function quoteName(name) {
1503
+ return encodeURIComponent(name).replace(
1504
+ /[!'()*]/g,
1505
+ (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`
1506
+ );
1507
+ }
1508
+ function isMissing(e) {
1509
+ return e.code === "ENOENT";
1510
+ }
1511
+ var DiskRecordClient = class {
1512
+ dir;
1513
+ constructor(root, prefix) {
1514
+ this.dir = path2.join(root, prefix);
1515
+ }
1516
+ recordPath(name) {
1517
+ return path2.join(this.dir, `${quoteName(name)}.json`);
1518
+ }
1519
+ // The token slot mirrors the S3 client's ETag but stays empty: disk
1520
+ // CAS anchors on the lockfile, not on a version token.
1521
+ async get(name) {
1522
+ let body;
1523
+ try {
1524
+ body = await readFile2(this.recordPath(name));
1525
+ } catch (e) {
1526
+ if (isMissing(e)) return [null, ""];
1527
+ throw e;
1528
+ }
1529
+ return [JSON.parse(body.toString()), ""];
1530
+ }
1531
+ async put(name, fields) {
1532
+ await mkdir2(this.dir, { recursive: true });
1533
+ await this.writeRecord(this.recordPath(name), fields);
1534
+ }
1535
+ /**
1536
+ * Write one record iff its stored generation matches.
1537
+ *
1538
+ * Take the record's lockfile, re-read under the lock, check the
1539
+ * generation, then tmp-write + rename. Losing the lock race or the
1540
+ * generation check resolves false; the caller adopts and retries.
1541
+ */
1542
+ async casPut(name, fields, expectedGeneration) {
1543
+ await mkdir2(this.dir, { recursive: true });
1544
+ const target = this.recordPath(name);
1545
+ const lockPath = `${target}.lock`;
1546
+ let fh = await this.acquireLock(lockPath);
1547
+ if (fh === null) {
1548
+ if (!await this.reclaimStaleLock(lockPath)) return false;
1549
+ fh = await this.acquireLock(lockPath);
1550
+ if (fh === null) return false;
1551
+ }
1552
+ try {
1553
+ const [stored] = await this.get(name);
1554
+ if (generationOf(stored) !== expectedGeneration) return false;
1555
+ await this.writeRecord(target, fields);
1556
+ return true;
1557
+ } finally {
1558
+ await this.releaseLock(fh, lockPath);
1559
+ }
1560
+ }
1561
+ async listNames() {
1562
+ let entries;
1563
+ try {
1564
+ entries = await readdir2(this.dir);
1565
+ } catch (e) {
1566
+ if (isMissing(e)) return [];
1567
+ throw e;
1568
+ }
1569
+ return entries.filter((n) => n.endsWith(".json")).map((n) => decodeURIComponent(n.slice(0, -".json".length)));
1570
+ }
1571
+ async loadAll() {
1572
+ const names = await this.listNames();
1573
+ const records = await Promise.all(names.map((name) => this.get(name)));
1574
+ const out = /* @__PURE__ */ new Map();
1575
+ for (let i = 0; i < names.length; i++) {
1576
+ const name = names[i];
1577
+ const fields = records[i]?.[0];
1578
+ if (name !== void 0 && fields != null) out.set(name, fields);
1579
+ }
1580
+ return out;
1581
+ }
1582
+ async delete(names) {
1583
+ for (const name of names) {
1584
+ try {
1585
+ await unlink2(this.recordPath(name));
1586
+ } catch (e) {
1587
+ if (!isMissing(e)) throw e;
1588
+ }
1589
+ }
1590
+ }
1591
+ async clear() {
1592
+ await this.delete(await this.listNames());
1593
+ }
1594
+ async close() {
1595
+ }
1596
+ /**
1597
+ * Block until this record's lockfile is held; handle to release.
1598
+ *
1599
+ * For callers doing a read-modify-write that is not generation-CAS
1600
+ * (e.g. the single-file namespace plane); spins past contention and
1601
+ * reclaims stale locks, throwing only if a live writer holds the
1602
+ * lock for the whole retry budget (~10s).
1603
+ */
1604
+ async lock(name) {
1605
+ await mkdir2(this.dir, { recursive: true });
1606
+ const lockPath = `${this.recordPath(name)}.lock`;
1607
+ for (let i = 0; i < LOCK_RETRY_LIMIT; i++) {
1608
+ const fh = await this.acquireLock(lockPath);
1609
+ if (fh !== null) return fh;
1610
+ if (await this.reclaimStaleLock(lockPath)) continue;
1611
+ await new Promise((r) => setTimeout(r, LOCK_RETRY_SLEEP_MS));
1612
+ }
1613
+ throw new Error(`could not acquire lock ${lockPath}`);
1614
+ }
1615
+ async unlock(name, fh) {
1616
+ await this.releaseLock(fh, `${this.recordPath(name)}.lock`);
1617
+ }
1618
+ // O_CREAT|O_EXCL ('wx'): filesystem-atomic mutex, the git protocol.
1619
+ // Local filesystems only (O_EXCL is unreliable on ancient NFS, the
1620
+ // same caveat git ships with).
1621
+ async acquireLock(lockPath) {
1622
+ let fh;
1623
+ try {
1624
+ fh = await open(lockPath, "wx");
1625
+ } catch (e) {
1626
+ if (e.code === "EEXIST") return null;
1627
+ throw e;
1628
+ }
1629
+ await fh.write(String(process.pid));
1630
+ return fh;
1631
+ }
1632
+ // True when the lock is gone or was stale and removed; false when a
1633
+ // live writer still holds it.
1634
+ async reclaimStaleLock(lockPath) {
1635
+ let mtimeMs;
1636
+ try {
1637
+ mtimeMs = (await stat2(lockPath)).mtimeMs;
1638
+ } catch (e) {
1639
+ if (isMissing(e)) return true;
1640
+ throw e;
1641
+ }
1642
+ const age = (Date.now() - mtimeMs) / 1e3;
1643
+ if (age <= LOCK_STALE_SECONDS) return false;
1644
+ console.warn(`mirage: reclaiming stale lock ${lockPath} (age ${age.toFixed(1)}s)`);
1645
+ try {
1646
+ await unlink2(lockPath);
1647
+ } catch (e) {
1648
+ if (!isMissing(e)) throw e;
1649
+ }
1650
+ return true;
1651
+ }
1652
+ async releaseLock(fh, lockPath) {
1653
+ await fh.close();
1654
+ try {
1655
+ await unlink2(lockPath);
1656
+ } catch (e) {
1657
+ if (!isMissing(e)) throw e;
1658
+ console.warn(`mirage: lock ${lockPath} vanished before release (reclaimed?)`);
1659
+ }
1660
+ }
1661
+ async writeRecord(target, fields) {
1662
+ const tmp = `${target}.${String(process.pid)}.${String(tmpCounter++)}.tmp`;
1663
+ await writeFile2(tmp, JSON.stringify(fields));
1664
+ await rename(tmp, target);
1665
+ }
1666
+ };
1667
+ var DiskSessionStore = class extends SessionStore {
1668
+ records;
1669
+ constructor(root) {
1670
+ super();
1671
+ this.records = new DiskRecordClient(root, "sessions/");
1672
+ }
1673
+ async load() {
1674
+ return await this.records.loadAll();
1675
+ }
1676
+ async set(sessionId, fields) {
1677
+ await this.records.put(sessionId, fields);
1678
+ }
1679
+ async casSet(sessionId, fields, expectedGeneration) {
1680
+ return await this.records.casPut(sessionId, fields, expectedGeneration);
1681
+ }
1682
+ async delete(sessionIds) {
1683
+ await this.records.delete(sessionIds);
1684
+ }
1685
+ async replaceAll(entries) {
1686
+ const stale = (await this.records.listNames()).filter((n) => !entries.has(n));
1687
+ await this.records.delete(stale);
1688
+ await Promise.all([...entries].map(([sid, fields]) => this.records.put(sid, fields)));
1689
+ }
1690
+ async clear() {
1691
+ await this.records.clear();
1692
+ }
1693
+ async close() {
1694
+ await this.records.close();
1695
+ }
1696
+ };
1697
+
1698
+ // src/workspace/namespace/disk.ts
1699
+ var NAMESPACE_RECORD = "namespace";
1700
+ var DiskNamespaceStore = class extends NamespaceStore {
1701
+ records;
1702
+ constructor(root) {
1703
+ super();
1704
+ this.records = new DiskRecordClient(root, "");
1705
+ }
1706
+ async state() {
1707
+ const [fields] = await this.records.get(NAMESPACE_RECORD);
1708
+ if (fields === null) return { nodes: {}, user: null };
1709
+ return {
1710
+ nodes: fields.nodes ?? {},
1711
+ user: typeof fields.user === "string" ? fields.user : null
1712
+ };
1713
+ }
1714
+ async write(state) {
1715
+ await this.records.put(NAMESPACE_RECORD, { nodes: state.nodes, user: state.user });
1716
+ }
1717
+ async load() {
1718
+ return new Map(Object.entries((await this.state()).nodes));
1719
+ }
1720
+ async set(path4, fields) {
1721
+ const fh = await this.records.lock(NAMESPACE_RECORD);
1722
+ try {
1723
+ const state = await this.state();
1724
+ state.nodes[path4] = fields;
1725
+ await this.write(state);
1726
+ } finally {
1727
+ await this.records.unlock(NAMESPACE_RECORD, fh);
1728
+ }
1729
+ }
1730
+ async delete(paths) {
1731
+ const fh = await this.records.lock(NAMESPACE_RECORD);
1732
+ try {
1733
+ const state = await this.state();
1734
+ const drop = new Set(paths);
1735
+ state.nodes = Object.fromEntries(
1736
+ Object.entries(state.nodes).filter(([path4]) => !drop.has(path4))
1737
+ );
1738
+ await this.write(state);
1739
+ } finally {
1740
+ await this.records.unlock(NAMESPACE_RECORD, fh);
1741
+ }
1742
+ }
1743
+ async replaceAll(entries) {
1744
+ const fh = await this.records.lock(NAMESPACE_RECORD);
1745
+ try {
1746
+ const state = await this.state();
1747
+ state.nodes = Object.fromEntries(entries);
1748
+ await this.write(state);
1749
+ } finally {
1750
+ await this.records.unlock(NAMESPACE_RECORD, fh);
1751
+ }
1752
+ }
1753
+ async loadUser() {
1754
+ return (await this.state()).user;
1755
+ }
1756
+ async setUser(user) {
1757
+ const fh = await this.records.lock(NAMESPACE_RECORD);
1758
+ try {
1759
+ const state = await this.state();
1760
+ state.user = user;
1761
+ await this.write(state);
1762
+ } finally {
1763
+ await this.records.unlock(NAMESPACE_RECORD, fh);
1764
+ }
1765
+ }
1766
+ async clear() {
1767
+ const fh = await this.records.lock(NAMESPACE_RECORD);
1768
+ try {
1769
+ await this.write({ nodes: {}, user: null });
1770
+ } finally {
1771
+ await this.records.unlock(NAMESPACE_RECORD, fh);
1772
+ }
1773
+ }
1774
+ async close() {
1775
+ await this.records.close();
1776
+ }
1777
+ };
1778
+
1779
+ // src/workspace/namespace/redis.ts
1780
+ import { NamespaceStore as NamespaceStore2 } from "@struktoai/mirage-core";
1781
+ var RedisNamespaceStore = class extends NamespaceStore2 {
1782
+ url;
1783
+ key;
1784
+ userKey;
1785
+ clientPromise = null;
1786
+ constructor(options = {}) {
1787
+ super();
1788
+ this.url = options.url ?? "redis://localhost:6379/0";
1789
+ const prefix = options.keyPrefix ?? "mirage:namespace:";
1790
+ this.key = `${prefix}nodes`;
1791
+ this.userKey = `${prefix}user`;
1792
+ }
1793
+ async client() {
1794
+ this.clientPromise ??= (async () => {
1795
+ const mod = await loadOptionalPeer(
1796
+ () => import("redis"),
1797
+ { feature: "RedisNamespaceStore", packageName: "redis" }
1798
+ );
1799
+ const c = mod.createClient({
1800
+ url: this.url,
1801
+ socket: { reconnectStrategy: false }
1802
+ });
1803
+ await c.connect();
1804
+ return c;
1805
+ })();
1806
+ return this.clientPromise;
1807
+ }
1808
+ async load() {
1809
+ const c = await this.client();
1810
+ const raw = await c.hGetAll(this.key);
1811
+ const out = /* @__PURE__ */ new Map();
1812
+ for (const [path4, value] of Object.entries(raw)) {
1813
+ out.set(path4, JSON.parse(value));
1814
+ }
1815
+ return out;
1816
+ }
1817
+ async set(path4, fields) {
1818
+ const c = await this.client();
1819
+ await c.hSet(this.key, path4, JSON.stringify(fields));
1820
+ }
1821
+ async delete(paths) {
1822
+ if (paths.length === 0) return;
1823
+ const c = await this.client();
1824
+ await c.hDel(this.key, [...paths]);
1825
+ }
1826
+ async replaceAll(entries) {
1827
+ const c = await this.client();
1828
+ const multi = c.multi().del(this.key);
1829
+ for (const [path4, fields] of entries) {
1830
+ multi.hSet(this.key, path4, JSON.stringify(fields));
1831
+ }
1832
+ await multi.exec();
1833
+ }
1834
+ async loadUser() {
1835
+ const c = await this.client();
1836
+ return c.get(this.userKey);
1837
+ }
1838
+ async setUser(user) {
1839
+ const c = await this.client();
1840
+ await c.set(this.userKey, user);
1841
+ }
1842
+ async clear() {
1843
+ const c = await this.client();
1844
+ await c.del([this.key, this.userKey]);
1845
+ }
1846
+ async close() {
1847
+ if (this.clientPromise === null) return;
1848
+ const pending = this.clientPromise;
1849
+ this.clientPromise = null;
1850
+ const c = await pending;
1851
+ await c.quit();
1852
+ }
1853
+ };
1854
+
1855
+ // src/workspace/session/redis.ts
1856
+ import { readFileSync as readFileSync2 } from "fs";
1857
+ import { SessionStore as SessionStore2 } from "@struktoai/mirage-core";
1858
+ var CAS_SCRIPT = readFileSync2(new URL("./cas.lua", import.meta.url), "utf8");
1859
+ var RedisSessionStore = class extends SessionStore2 {
1860
+ url;
1861
+ key;
1862
+ clientPromise = null;
1863
+ constructor(options = {}) {
1864
+ super();
1865
+ this.url = options.url ?? "redis://localhost:6379/0";
1866
+ const prefix = options.keyPrefix ?? "mirage:session:";
1867
+ this.key = `${prefix}sessions`;
1868
+ }
1869
+ async client() {
1870
+ this.clientPromise ??= (async () => {
1871
+ const mod = await loadOptionalPeer(
1872
+ () => import("redis"),
1873
+ { feature: "RedisSessionStore", packageName: "redis" }
1874
+ );
1875
+ const c = mod.createClient({
1876
+ url: this.url,
1877
+ socket: { reconnectStrategy: false }
1878
+ });
1879
+ await c.connect();
1880
+ return c;
1881
+ })();
1882
+ return this.clientPromise;
1883
+ }
1884
+ // One atomic server-side compare-and-set: Lua reads the stored
1885
+ // record's generation and writes only on a match.
1886
+ async casSet(sessionId, fields, expectedGeneration) {
1887
+ const c = await this.client();
1888
+ const result = await c.eval(CAS_SCRIPT, {
1889
+ keys: [this.key],
1890
+ arguments: [sessionId, JSON.stringify(fields), String(expectedGeneration)]
1891
+ });
1892
+ return result === 1;
1893
+ }
1894
+ async load() {
1895
+ const c = await this.client();
1896
+ const raw = await c.hGetAll(this.key);
1897
+ const out = /* @__PURE__ */ new Map();
1898
+ for (const [sid, value] of Object.entries(raw)) {
1899
+ out.set(sid, JSON.parse(value));
1900
+ }
1901
+ return out;
1902
+ }
1903
+ async set(sessionId, fields) {
1904
+ const c = await this.client();
1905
+ await c.hSet(this.key, sessionId, JSON.stringify(fields));
1906
+ }
1907
+ async delete(sessionIds) {
1908
+ if (sessionIds.length === 0) return;
1909
+ const c = await this.client();
1910
+ await c.hDel(this.key, [...sessionIds]);
1911
+ }
1912
+ async replaceAll(entries) {
1913
+ const c = await this.client();
1914
+ const multi = c.multi().del(this.key);
1915
+ for (const [sid, fields] of entries) {
1916
+ multi.hSet(this.key, sid, JSON.stringify(fields));
1917
+ }
1918
+ await multi.exec();
1919
+ }
1920
+ async clear() {
1921
+ const c = await this.client();
1922
+ await c.del(this.key);
1923
+ }
1924
+ async close() {
1925
+ if (this.clientPromise === null) return;
1926
+ const pending = this.clientPromise;
1927
+ this.clientPromise = null;
1928
+ const c = await pending;
1929
+ await c.quit();
1930
+ }
1931
+ };
1932
+
1933
+ // src/workspace/store/disk.ts
1934
+ import { homedir } from "os";
1935
+ import path3 from "path";
1936
+ import {
1937
+ WorkspaceStateStore
1938
+ } from "@struktoai/mirage-core";
1939
+ var DEFAULT_STATE_ROOT = "~/.mirage/state";
1940
+ function expandHome(p) {
1941
+ if (p === "~") return homedir();
1942
+ if (p.startsWith("~/")) return path3.join(homedir(), p.slice(2));
1943
+ return p;
1944
+ }
1945
+ function quoteSegment(name) {
1946
+ return encodeURIComponent(name).replace(
1947
+ /[!'()*]/g,
1948
+ (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`
1949
+ );
1950
+ }
1951
+ var DiskWorkspaceStateStore = class extends WorkspaceStateStore {
1952
+ root;
1953
+ meta = /* @__PURE__ */ new Map();
1954
+ namespaces = /* @__PURE__ */ new Map();
1955
+ observers = /* @__PURE__ */ new Map();
1956
+ sessionTables = /* @__PURE__ */ new Map();
1957
+ constructor(options = {}) {
1958
+ const { root, ...overrides } = options;
1959
+ super(overrides);
1960
+ this.root = expandHome(root ?? DEFAULT_STATE_ROOT);
1961
+ }
1962
+ wsRoot(workspaceId) {
1963
+ return path3.join(this.root, "workspaces", quoteSegment(workspaceId));
1964
+ }
1965
+ metaClient(workspaceId) {
1966
+ let client = this.meta.get(workspaceId);
1967
+ if (client === void 0) {
1968
+ client = new DiskRecordClient(this.wsRoot(workspaceId), "");
1969
+ this.meta.set(workspaceId, client);
1970
+ }
1971
+ return client;
1972
+ }
1973
+ makeNamespace(workspaceId) {
1974
+ let ns = this.namespaces.get(workspaceId);
1975
+ if (ns === void 0) {
1976
+ ns = new DiskNamespaceStore(this.wsRoot(workspaceId));
1977
+ this.namespaces.set(workspaceId, ns);
1978
+ }
1979
+ return ns;
1980
+ }
1981
+ makeObserver(workspaceId) {
1982
+ let ob = this.observers.get(workspaceId);
1983
+ if (ob === void 0) {
1984
+ ob = new DiskObserverStore(path3.join(this.wsRoot(workspaceId), "history"));
1985
+ this.observers.set(workspaceId, ob);
1986
+ }
1987
+ return ob;
1988
+ }
1989
+ makeSessions(workspaceId) {
1990
+ let table = this.sessionTables.get(workspaceId);
1991
+ if (table === void 0) {
1992
+ table = new DiskSessionStore(this.wsRoot(workspaceId));
1993
+ this.sessionTables.set(workspaceId, table);
1994
+ }
1995
+ return table;
1996
+ }
1997
+ async readMeta(workspaceId) {
1998
+ const [fields] = await this.metaClient(workspaceId).get("workspace");
1999
+ return fields;
2000
+ }
2001
+ async writeMeta(workspaceId, fields) {
2002
+ await this.metaClient(workspaceId).put("workspace", fields);
2003
+ }
2004
+ async casWriteMeta(workspaceId, fields, expectedGeneration) {
2005
+ return await this.metaClient(workspaceId).casPut("workspace", fields, expectedGeneration);
2006
+ }
2007
+ async closeSelf() {
2008
+ for (const ns of this.namespaces.values()) await ns.close();
2009
+ for (const ob of this.observers.values()) await ob.close();
2010
+ for (const table of this.sessionTables.values()) await table.close();
2011
+ for (const client of this.meta.values()) await client.close();
2012
+ }
2013
+ };
2014
+
2015
+ // src/workspace/store/redis.ts
2016
+ import {
2017
+ WorkspaceStateStore as WorkspaceStateStore2
2018
+ } from "@struktoai/mirage-core";
2019
+ var RedisWorkspaceStateStore = class extends WorkspaceStateStore2 {
2020
+ url;
2021
+ prefix;
2022
+ metaKey;
2023
+ clientPromise = null;
2024
+ namespaces = /* @__PURE__ */ new Map();
2025
+ observers = /* @__PURE__ */ new Map();
2026
+ sessionTables = /* @__PURE__ */ new Map();
2027
+ constructor(options = {}) {
2028
+ const { url, keyPrefix, ...overrides } = options;
2029
+ super(overrides);
2030
+ this.url = url ?? "redis://localhost:6379/0";
2031
+ this.prefix = keyPrefix ?? "mirage:";
2032
+ this.metaKey = `${this.prefix}workspaces`;
2033
+ }
2034
+ async client() {
2035
+ this.clientPromise ??= (async () => {
2036
+ const mod = await loadOptionalPeer(
2037
+ () => import("redis"),
2038
+ { feature: "RedisWorkspaceStateStore", packageName: "redis" }
2039
+ );
2040
+ const c = mod.createClient({
2041
+ url: this.url,
2042
+ socket: { reconnectStrategy: false }
2043
+ });
2044
+ await c.connect();
2045
+ return c;
2046
+ })();
2047
+ return this.clientPromise;
2048
+ }
2049
+ makeNamespace(workspaceId) {
2050
+ let ns = this.namespaces.get(workspaceId);
2051
+ if (ns === void 0) {
2052
+ ns = new RedisNamespaceStore({
2053
+ url: this.url,
2054
+ keyPrefix: `${this.prefix}${workspaceId}:namespace:`
2055
+ });
2056
+ this.namespaces.set(workspaceId, ns);
2057
+ }
2058
+ return ns;
2059
+ }
2060
+ makeObserver(workspaceId) {
2061
+ let ob = this.observers.get(workspaceId);
2062
+ if (ob === void 0) {
2063
+ ob = new RedisObserverStore({
2064
+ url: this.url,
2065
+ keyPrefix: `${this.prefix}${workspaceId}:observer:`
2066
+ });
2067
+ this.observers.set(workspaceId, ob);
2068
+ }
2069
+ return ob;
2070
+ }
2071
+ makeSessions(workspaceId) {
2072
+ let table = this.sessionTables.get(workspaceId);
2073
+ if (table === void 0) {
2074
+ table = new RedisSessionStore({
2075
+ url: this.url,
2076
+ keyPrefix: `${this.prefix}${workspaceId}:`
2077
+ });
2078
+ this.sessionTables.set(workspaceId, table);
2079
+ }
2080
+ return table;
2081
+ }
2082
+ async readMeta(workspaceId) {
2083
+ const c = await this.client();
2084
+ const raw = await c.hGet(this.metaKey, workspaceId);
2085
+ return raw != null ? JSON.parse(raw) : null;
2086
+ }
2087
+ async writeMeta(workspaceId, fields) {
2088
+ const c = await this.client();
2089
+ await c.hSet(this.metaKey, workspaceId, JSON.stringify(fields));
2090
+ }
2091
+ // Same generic hash-field CAS the session store uses: the meta hash
2092
+ // is keyed by workspace id instead of session id.
2093
+ async casWriteMeta(workspaceId, fields, expectedGeneration) {
2094
+ const c = await this.client();
2095
+ const result = await c.eval(CAS_SCRIPT, {
2096
+ keys: [this.metaKey],
2097
+ arguments: [workspaceId, JSON.stringify(fields), String(expectedGeneration)]
2098
+ });
2099
+ return result === 1;
2100
+ }
2101
+ async closeSelf() {
2102
+ for (const ns of this.namespaces.values()) await ns.close();
2103
+ for (const ob of this.observers.values()) await ob.close();
2104
+ for (const table of this.sessionTables.values()) await table.close();
2105
+ if (this.clientPromise !== null) {
2106
+ const c = await this.clientPromise;
2107
+ await c.quit();
2108
+ }
2109
+ }
2110
+ };
2111
+
1355
2112
  // src/fs_monkey.ts
1356
2113
  import { Buffer as Buffer2 } from "buffer";
1357
2114
  import { createRequire as createRequire3 } from "module";
@@ -1362,7 +2119,10 @@ var fsMonkey = requireCjs3("fs-monkey");
1362
2119
  var { patchFs } = fsMonkey;
1363
2120
  function mountedPath(ws, p) {
1364
2121
  try {
1365
- return ws.registry.mountFor(p) !== null;
2122
+ const m = ws.registry.mountFor(p);
2123
+ if (m === null) return false;
2124
+ if (ws.syntheticRoot && m === ws.registry.rootMount) return false;
2125
+ return true;
1366
2126
  } catch {
1367
2127
  return false;
1368
2128
  }
@@ -1509,7 +2269,7 @@ async function resolveSizes(accessor, paths, index) {
1509
2269
  const resolved = [];
1510
2270
  let missing = 0;
1511
2271
  for (const p of paths) {
1512
- const pathStr = p.original;
2272
+ const pathStr = p.virtual;
1513
2273
  let size = null;
1514
2274
  if (index !== void 0) {
1515
2275
  const lookup = await index.get(pathStr);
@@ -1577,13 +2337,19 @@ function metadataProvision(_accessor, paths, _texts, _opts) {
1577
2337
  // src/cache/redis/file.ts
1578
2338
  import {
1579
2339
  defaultFingerprint,
1580
- parseLimit
2340
+ parseLimit,
2341
+ validateMaxDrainBytes
1581
2342
  } from "@struktoai/mirage-core";
1582
2343
  var RedisFileCacheStore = class extends RedisResource {
2344
+ // Advisory only: unlike the RAM store there is no client-side LRU, so
2345
+ // nothing evicts on overflow. Cap memory on the Redis server instead
2346
+ // (maxmemory + maxmemory-policy allkeys-lru) to approximate the RAM
2347
+ // store's eviction behavior.
1583
2348
  limit;
1584
2349
  dataPrefix;
1585
2350
  metaPrefix;
1586
- maxDrainBytes;
2351
+ maxDrainBytesValue = null;
2352
+ drainTasks = /* @__PURE__ */ new Map();
1587
2353
  constructor(options = {}) {
1588
2354
  super({
1589
2355
  url: options.url ?? "redis://localhost:6379/0",
@@ -1594,7 +2360,16 @@ var RedisFileCacheStore = class extends RedisResource {
1594
2360
  this.metaPrefix = `${this.keyPrefix}meta:`;
1595
2361
  this.maxDrainBytes = options.maxDrainBytes ?? null;
1596
2362
  }
1597
- cacheSize = 0;
2363
+ get maxDrainBytes() {
2364
+ return this.maxDrainBytesValue;
2365
+ }
2366
+ set maxDrainBytes(value) {
2367
+ validateMaxDrainBytes(this.limit, value);
2368
+ this.maxDrainBytesValue = value;
2369
+ }
2370
+ // Size lives in the redis server and is not tracked client-side.
2371
+ cacheSize = null;
2372
+ cacheEntries = null;
1598
2373
  get cacheLimit() {
1599
2374
  return this.limit;
1600
2375
  }
@@ -1633,6 +2408,7 @@ var RedisFileCacheStore = class extends RedisResource {
1633
2408
  return true;
1634
2409
  }
1635
2410
  async remove(key) {
2411
+ this.drainTasks.delete(key);
1636
2412
  const c = await this.cacheClient();
1637
2413
  const pipe = c.multi();
1638
2414
  pipe.del(`${this.dataPrefix}${key}`);
@@ -1640,7 +2416,7 @@ var RedisFileCacheStore = class extends RedisResource {
1640
2416
  await pipe.exec();
1641
2417
  }
1642
2418
  async exists(key) {
1643
- const k = typeof key === "string" ? key : key.stripPrefix;
2419
+ const k = typeof key === "string" ? key : key.mountPath;
1644
2420
  const c = await this.cacheClient();
1645
2421
  return await c.exists(`${this.dataPrefix}${k}`) > 0;
1646
2422
  }
@@ -1651,6 +2427,7 @@ var RedisFileCacheStore = class extends RedisResource {
1651
2427
  return fp === remoteFingerprint;
1652
2428
  }
1653
2429
  async clear() {
2430
+ this.drainTasks.clear();
1654
2431
  const c = await this.cacheClient();
1655
2432
  for (const pattern of [`${this.dataPrefix}*`, `${this.metaPrefix}*`]) {
1656
2433
  const batch = [];
@@ -1831,208 +2608,218 @@ var REGISTRY = {
1831
2608
  return new RAMResource();
1832
2609
  },
1833
2610
  disk: async (config) => {
1834
- const { DiskResource: DiskResource2 } = await import("./disk-XVLBCVKE.js");
2611
+ const { DiskResource: DiskResource2 } = await import("./disk-24NWTN2I.js");
1835
2612
  const norm = normalizeFields(config);
1836
2613
  return new DiskResource2(norm);
1837
2614
  },
1838
2615
  redis: async (config) => {
1839
- const { RedisResource: RedisResource2 } = await import("./redis-V5ULXULL.js");
2616
+ const { RedisResource: RedisResource2 } = await import("./redis-6D55Q2WB.js");
1840
2617
  const norm = normalizeFields(config);
1841
2618
  return new RedisResource2(norm);
1842
2619
  },
1843
2620
  s3: async (config) => {
1844
- const { S3Resource: S3Resource2 } = await import("./s3-4OIOCAAT.js");
1845
- const { normalizeS3Config } = await import("./config-QWCY3LBQ.js");
2621
+ const { S3Resource: S3Resource2 } = await import("./s3-XQBI2CXN.js");
2622
+ const { normalizeS3Config } = await import("./config-BBOLI7VE.js");
1846
2623
  return new S3Resource2(normalizeS3Config(config));
1847
2624
  },
2625
+ gridfs: async (config) => {
2626
+ const { GridFSResource: GridFSResource2 } = await import("./gridfs-KZRZ6SIB.js");
2627
+ const { normalizeGridFSConfig: normalizeGridFSConfig2 } = await import("./config-J2C53GOT.js");
2628
+ return new GridFSResource2(normalizeGridFSConfig2(config));
2629
+ },
1848
2630
  gcs: async (config) => {
1849
- const { GCSResource: GCSResource2 } = await import("./gcs-EMEYU2XT.js");
1850
- const { normalizeGcsConfig } = await import("./config-VM526IKB.js");
2631
+ const { GCSResource: GCSResource2 } = await import("./gcs-PFWR6MIW.js");
2632
+ const { normalizeGcsConfig } = await import("./config-BIBFLUIR.js");
1851
2633
  return new GCSResource2(normalizeGcsConfig(config));
1852
2634
  },
1853
2635
  oci: async (config) => {
1854
- const { OCIResource: OCIResource2 } = await import("./oci-ZLVECXTW.js");
1855
- const { normalizeOciConfig } = await import("./config-KYTRXAB2.js");
2636
+ const { OCIResource: OCIResource2 } = await import("./oci-CKYBSFZJ.js");
2637
+ const { normalizeOciConfig } = await import("./config-W7EVPJNK.js");
1856
2638
  return new OCIResource2(normalizeOciConfig(config));
1857
2639
  },
1858
2640
  r2: async (config) => {
1859
- const { R2Resource: R2Resource2 } = await import("./r2-RPK25ANI.js");
1860
- const { normalizeR2Config } = await import("./config-KMVCVBYN.js");
2641
+ const { R2Resource: R2Resource2 } = await import("./r2-C4XGEWQY.js");
2642
+ const { normalizeR2Config } = await import("./config-WVILHDFV.js");
1861
2643
  return new R2Resource2(normalizeR2Config(config));
1862
2644
  },
1863
2645
  hf_buckets: async (config) => {
1864
- const { HfBucketsResource: HfBucketsResource2 } = await import("./hf_buckets-DTKXKKFF.js");
1865
- const { normalizeHfBucketsConfig: normalizeHfBucketsConfig2 } = await import("./config-CVZ2AGCO.js");
2646
+ const { HfBucketsResource: HfBucketsResource2 } = await import("./hf_buckets-BK7NGJWS.js");
2647
+ const { normalizeHfBucketsConfig: normalizeHfBucketsConfig2 } = await import("./config-SPW6NESU.js");
1866
2648
  return new HfBucketsResource2(normalizeHfBucketsConfig2(config));
1867
2649
  },
1868
2650
  hf_datasets: async (config) => {
1869
- const { HfDatasetsResource: HfDatasetsResource2 } = await import("./hf_datasets-55C4APKR.js");
1870
- const { normalizeHfRepoConfig: normalizeHfRepoConfig2 } = await import("./config-CVZ2AGCO.js");
2651
+ const { HfDatasetsResource: HfDatasetsResource2 } = await import("./hf_datasets-UQ5QGM4L.js");
2652
+ const { normalizeHfRepoConfig: normalizeHfRepoConfig2 } = await import("./config-SPW6NESU.js");
1871
2653
  return new HfDatasetsResource2(normalizeHfRepoConfig2(config));
1872
2654
  },
1873
2655
  hf_models: async (config) => {
1874
- const { HfModelsResource: HfModelsResource2 } = await import("./hf_models-RO5JR36V.js");
1875
- const { normalizeHfRepoConfig: normalizeHfRepoConfig2 } = await import("./config-CVZ2AGCO.js");
2656
+ const { HfModelsResource: HfModelsResource2 } = await import("./hf_models-75LFCQCS.js");
2657
+ const { normalizeHfRepoConfig: normalizeHfRepoConfig2 } = await import("./config-SPW6NESU.js");
1876
2658
  return new HfModelsResource2(normalizeHfRepoConfig2(config));
1877
2659
  },
1878
2660
  hf_spaces: async (config) => {
1879
- const { HfSpacesResource: HfSpacesResource2 } = await import("./hf_spaces-ZVZ3EDRX.js");
1880
- const { normalizeHfRepoConfig: normalizeHfRepoConfig2 } = await import("./config-CVZ2AGCO.js");
2661
+ const { HfSpacesResource: HfSpacesResource2 } = await import("./hf_spaces-6T2KB3UC.js");
2662
+ const { normalizeHfRepoConfig: normalizeHfRepoConfig2 } = await import("./config-SPW6NESU.js");
1881
2663
  return new HfSpacesResource2(normalizeHfRepoConfig2(config));
1882
2664
  },
1883
2665
  supabase: async (config) => {
1884
- const { SupabaseResource: SupabaseResource2 } = await import("./supabase-6CFTOKGZ.js");
1885
- const { normalizeSupabaseConfig } = await import("./config-GE4W4ZJC.js");
2666
+ const { SupabaseResource: SupabaseResource2 } = await import("./supabase-BBM44UTM.js");
2667
+ const { normalizeSupabaseConfig } = await import("./config-EX3ZJTZI.js");
1886
2668
  return new SupabaseResource2(normalizeSupabaseConfig(config));
1887
2669
  },
1888
2670
  databricks_volume: async (config) => {
1889
- const { DatabricksVolumeResource: DatabricksVolumeResource2 } = await import("./databricks_volume-7XOUYSTY.js");
2671
+ const { DatabricksVolumeResource: DatabricksVolumeResource2 } = await import("./databricks_volume-ETRDJVVQ.js");
1890
2672
  const { normalizeDatabricksVolumeConfig } = await import("@struktoai/mirage-core");
1891
2673
  return DatabricksVolumeResource2.create(normalizeDatabricksVolumeConfig(config));
1892
2674
  },
1893
2675
  minio: async (config) => {
1894
- const { MinIOResource: MinIOResource2 } = await import("./minio-HZ576XFQ.js");
1895
- const { normalizeMinIOConfig } = await import("./config-34LHOGLM.js");
2676
+ const { MinIOResource: MinIOResource2 } = await import("./minio-IZRZY4C5.js");
2677
+ const { normalizeMinIOConfig } = await import("./config-2LASFFRD.js");
1896
2678
  return new MinIOResource2(normalizeMinIOConfig(config));
1897
2679
  },
1898
2680
  ceph: async (config) => {
1899
- const { CephResource: CephResource2 } = await import("./ceph-S2VOYO6G.js");
1900
- const { normalizeCephConfig } = await import("./config-ZFJYQZCH.js");
2681
+ const { CephResource: CephResource2 } = await import("./ceph-C265UI5T.js");
2682
+ const { normalizeCephConfig } = await import("./config-54USUVSE.js");
1901
2683
  return new CephResource2(normalizeCephConfig(config));
1902
2684
  },
1903
2685
  seaweedfs: async (config) => {
1904
- const { SeaweedFSResource: SeaweedFSResource2 } = await import("./seaweedfs-QSWKF2FN.js");
1905
- const { normalizeSeaweedFSConfig } = await import("./config-GHRUKEQ6.js");
2686
+ const { SeaweedFSResource: SeaweedFSResource2 } = await import("./seaweedfs-3XYIAFU2.js");
2687
+ const { normalizeSeaweedFSConfig } = await import("./config-OJ2BPESH.js");
1906
2688
  return new SeaweedFSResource2(normalizeSeaweedFSConfig(config));
1907
2689
  },
1908
2690
  wasabi: async (config) => {
1909
- const { WasabiResource: WasabiResource2 } = await import("./wasabi-6Z4DC5S5.js");
1910
- const { normalizeWasabiConfig } = await import("./config-QAA646XB.js");
2691
+ const { WasabiResource: WasabiResource2 } = await import("./wasabi-O4MVIUFG.js");
2692
+ const { normalizeWasabiConfig } = await import("./config-T2IUIU5C.js");
1911
2693
  return new WasabiResource2(normalizeWasabiConfig(config));
1912
2694
  },
1913
2695
  backblaze: async (config) => {
1914
- const { BackblazeResource: BackblazeResource2 } = await import("./backblaze-TDFD23QO.js");
1915
- const { normalizeBackblazeConfig } = await import("./config-WDAZFXYD.js");
2696
+ const { BackblazeResource: BackblazeResource2 } = await import("./backblaze-TSPL6Y56.js");
2697
+ const { normalizeBackblazeConfig } = await import("./config-QO2XUME4.js");
1916
2698
  return new BackblazeResource2(normalizeBackblazeConfig(config));
1917
2699
  },
1918
2700
  digitalocean: async (config) => {
1919
- const { DigitalOceanResource: DigitalOceanResource2 } = await import("./digitalocean-3CQ4CPPZ.js");
1920
- const { normalizeDigitalOceanConfig } = await import("./config-Q45Y46YT.js");
2701
+ const { DigitalOceanResource: DigitalOceanResource2 } = await import("./digitalocean-QP72DR4J.js");
2702
+ const { normalizeDigitalOceanConfig } = await import("./config-XU6D5C7E.js");
1921
2703
  return new DigitalOceanResource2(normalizeDigitalOceanConfig(config));
1922
2704
  },
1923
2705
  tencent: async (config) => {
1924
- const { TencentResource: TencentResource2 } = await import("./tencent-IWZZOSQ4.js");
1925
- const { normalizeTencentConfig } = await import("./config-QNMKWJ4M.js");
2706
+ const { TencentResource: TencentResource2 } = await import("./tencent-X72USLJ7.js");
2707
+ const { normalizeTencentConfig } = await import("./config-FRK7ZL37.js");
1926
2708
  return new TencentResource2(normalizeTencentConfig(config));
1927
2709
  },
1928
2710
  aliyun: async (config) => {
1929
- const { AliyunResource: AliyunResource2 } = await import("./aliyun-JMJ3PFYY.js");
1930
- const { normalizeAliyunConfig } = await import("./config-HKRMKD76.js");
2711
+ const { AliyunResource: AliyunResource2 } = await import("./aliyun-PGI57A43.js");
2712
+ const { normalizeAliyunConfig } = await import("./config-IPNWAJHH.js");
1931
2713
  return new AliyunResource2(normalizeAliyunConfig(config));
1932
2714
  },
1933
2715
  scaleway: async (config) => {
1934
- const { ScalewayResource: ScalewayResource2 } = await import("./scaleway-CCWCLUHB.js");
1935
- const { normalizeScalewayConfig } = await import("./config-EO23EY62.js");
2716
+ const { ScalewayResource: ScalewayResource2 } = await import("./scaleway-SEZJVURB.js");
2717
+ const { normalizeScalewayConfig } = await import("./config-CPYFOUQO.js");
1936
2718
  return new ScalewayResource2(normalizeScalewayConfig(config));
1937
2719
  },
1938
2720
  qingstor: async (config) => {
1939
- const { QingStorResource: QingStorResource2 } = await import("./qingstor-YLP6K3L4.js");
1940
- const { normalizeQingStorConfig } = await import("./config-IVY5EQQ2.js");
2721
+ const { QingStorResource: QingStorResource2 } = await import("./qingstor-AP4IIPLY.js");
2722
+ const { normalizeQingStorConfig } = await import("./config-M3Z47VYU.js");
1941
2723
  return new QingStorResource2(normalizeQingStorConfig(config));
1942
2724
  },
1943
2725
  postgres: async (config) => {
1944
- const { PostgresResource: PostgresResource2 } = await import("./postgres-P36Z2YN4.js");
2726
+ const { PostgresResource: PostgresResource2 } = await import("./postgres-WIQBVL5M.js");
1945
2727
  const { normalizePostgresConfig } = await import("@struktoai/mirage-core");
1946
2728
  return new PostgresResource2(normalizePostgresConfig(config));
1947
2729
  },
1948
2730
  mongodb: async (config) => {
1949
- const { MongoDBResource: MongoDBResource2 } = await import("./mongodb-JVR62OIO.js");
2731
+ const { MongoDBResource: MongoDBResource2 } = await import("./mongodb-VMKPQCPX.js");
1950
2732
  const { normalizeMongoDBConfig } = await import("@struktoai/mirage-core");
1951
2733
  return new MongoDBResource2(normalizeMongoDBConfig(config));
1952
2734
  },
1953
2735
  slack: async (config) => {
1954
- const { SlackResource: SlackResource2 } = await import("./slack-YPS7PII3.js");
1955
- const { normalizeSlackConfig: normalizeSlackConfig2 } = await import("./config-ZV6G2ZEC.js");
2736
+ const { SlackResource: SlackResource2 } = await import("./slack-ZHXDJQY4.js");
2737
+ const { normalizeSlackConfig: normalizeSlackConfig2 } = await import("./config-4QV4QYI5.js");
1956
2738
  return new SlackResource2(normalizeSlackConfig2(config));
1957
2739
  },
1958
2740
  ssh: async (config) => {
1959
- const { SSHResource: SSHResource2 } = await import("./ssh-YFP3SMTJ.js");
1960
- const { normalizeSshConfig: normalizeSshConfig2 } = await import("./config-KJOLGVB2.js");
2741
+ const { SSHResource: SSHResource2 } = await import("./ssh-X2MO7JOV.js");
2742
+ const { normalizeSshConfig: normalizeSshConfig2 } = await import("./config-VKKZGC7V.js");
1961
2743
  return new SSHResource2(normalizeSshConfig2(config));
1962
2744
  },
2745
+ nextcloud: async (config) => {
2746
+ const { NextcloudResource: NextcloudResource2 } = await import("./nextcloud-5RHQCGDO.js");
2747
+ const { normalizeNextcloudConfig: normalizeNextcloudConfig2 } = await import("./config-E22XAGYN.js");
2748
+ return new NextcloudResource2(normalizeNextcloudConfig2(config));
2749
+ },
1963
2750
  discord: async (config) => {
1964
- const { DiscordResource: DiscordResource2 } = await import("./discord-BG7OSRJG.js");
1965
- const { normalizeDiscordConfig: normalizeDiscordConfig2 } = await import("./config-DG65OEG3.js");
2751
+ const { DiscordResource: DiscordResource2 } = await import("./discord-BSN5RB3E.js");
2752
+ const { normalizeDiscordConfig: normalizeDiscordConfig2 } = await import("./config-EHE52ZTK.js");
1966
2753
  return new DiscordResource2(normalizeDiscordConfig2(config));
1967
2754
  },
1968
2755
  trello: async (config) => {
1969
- const { TrelloResource: TrelloResource2 } = await import("./trello-XYKWZD6P.js");
1970
- const { normalizeTrelloConfig: normalizeTrelloConfig2 } = await import("./config-GVH27UPE.js");
2756
+ const { TrelloResource: TrelloResource2 } = await import("./trello-EER5NG7L.js");
2757
+ const { normalizeTrelloConfig: normalizeTrelloConfig2 } = await import("./config-QWQGOXQ5.js");
1971
2758
  return new TrelloResource2(normalizeTrelloConfig2(config));
1972
2759
  },
1973
2760
  linear: async (config) => {
1974
- const { LinearResource: LinearResource2 } = await import("./linear-IC37LZV7.js");
1975
- const { normalizeLinearConfig: normalizeLinearConfig2 } = await import("./config-GCQK6NJY.js");
2761
+ const { LinearResource: LinearResource2 } = await import("./linear-V3TXO6CV.js");
2762
+ const { normalizeLinearConfig: normalizeLinearConfig2 } = await import("./config-LEALEMKA.js");
1976
2763
  return new LinearResource2(normalizeLinearConfig2(config));
1977
2764
  },
1978
2765
  notion: async (config) => {
1979
- const { NotionResource: NotionResource2 } = await import("./notion-HKRPQMJS.js");
1980
- const { normalizeNotionConfig: normalizeNotionConfig2 } = await import("./config-IJJXGLBQ.js");
2766
+ const { NotionResource: NotionResource2 } = await import("./notion-6PPNTQFM.js");
2767
+ const { normalizeNotionConfig: normalizeNotionConfig2 } = await import("./config-HTXOOAOD.js");
1981
2768
  return new NotionResource2(normalizeNotionConfig2(config));
1982
2769
  },
1983
2770
  langfuse: async (config) => {
1984
- const { LangfuseResource: LangfuseResource2 } = await import("./langfuse-ACASJZ7O.js");
1985
- const { normalizeLangfuseConfig: normalizeLangfuseConfig2 } = await import("./config-LHFFXVYI.js");
2771
+ const { LangfuseResource: LangfuseResource2 } = await import("./langfuse-AMQCQWNE.js");
2772
+ const { normalizeLangfuseConfig: normalizeLangfuseConfig2 } = await import("./config-HQXNFQZS.js");
1986
2773
  return new LangfuseResource2(normalizeLangfuseConfig2(config));
1987
2774
  },
1988
2775
  github: async (config) => {
1989
- const { GitHubResource: GitHubResource2 } = await import("./github-DV7E6OFV.js");
1990
- const { normalizeGitHubConfig: normalizeGitHubConfig2 } = await import("./config-3BBWD5AB.js");
2776
+ const { GitHubResource: GitHubResource2 } = await import("./github-EQ4NXUTA.js");
2777
+ const { normalizeGitHubConfig: normalizeGitHubConfig2 } = await import("./config-WKQ3FGTZ.js");
1991
2778
  return GitHubResource2.create(normalizeGitHubConfig2(config));
1992
2779
  },
1993
2780
  github_ci: async (config) => {
1994
- const { GitHubCIResource: GitHubCIResource2 } = await import("./github_ci-Q554V5PA.js");
1995
- const { normalizeGitHubCIConfig: normalizeGitHubCIConfig2 } = await import("./config-EIHSP5DZ.js");
2781
+ const { GitHubCIResource: GitHubCIResource2 } = await import("./github_ci-QL5B2Q2N.js");
2782
+ const { normalizeGitHubCIConfig: normalizeGitHubCIConfig2 } = await import("./config-MZM3IPFM.js");
1996
2783
  return new GitHubCIResource2(normalizeGitHubCIConfig2(config));
1997
2784
  },
1998
2785
  gdocs: async (config) => {
1999
- const { GDocsResource: GDocsResource2 } = await import("./gdocs-R67TDPON.js");
2000
- const { normalizeGDocsConfig: normalizeGDocsConfig2 } = await import("./config-D3RLSPNF.js");
2786
+ const { GDocsResource: GDocsResource2 } = await import("./gdocs-GPAZRQG5.js");
2787
+ const { normalizeGDocsConfig: normalizeGDocsConfig2 } = await import("./config-3WDIJPTG.js");
2001
2788
  return new GDocsResource2(normalizeGDocsConfig2(config));
2002
2789
  },
2003
2790
  gsheets: async (config) => {
2004
- const { GSheetsResource: GSheetsResource2 } = await import("./gsheets-H4RYMQJ5.js");
2005
- const { normalizeGSheetsConfig: normalizeGSheetsConfig2 } = await import("./config-OT2TQQCN.js");
2791
+ const { GSheetsResource: GSheetsResource2 } = await import("./gsheets-N53WEXN2.js");
2792
+ const { normalizeGSheetsConfig: normalizeGSheetsConfig2 } = await import("./config-5ZXN2T2H.js");
2006
2793
  return new GSheetsResource2(normalizeGSheetsConfig2(config));
2007
2794
  },
2008
2795
  gslides: async (config) => {
2009
- const { GSlidesResource: GSlidesResource2 } = await import("./gslides-YLCHKJOM.js");
2010
- const { normalizeGSlidesConfig: normalizeGSlidesConfig2 } = await import("./config-IDZMEW73.js");
2796
+ const { GSlidesResource: GSlidesResource2 } = await import("./gslides-TATSARTH.js");
2797
+ const { normalizeGSlidesConfig: normalizeGSlidesConfig2 } = await import("./config-RI7IEZUF.js");
2011
2798
  return new GSlidesResource2(normalizeGSlidesConfig2(config));
2012
2799
  },
2013
2800
  gdrive: async (config) => {
2014
- const { GDriveResource: GDriveResource2 } = await import("./gdrive-PRN2ALRK.js");
2015
- const { normalizeGDriveConfig: normalizeGDriveConfig2 } = await import("./config-HXVYIXP5.js");
2801
+ const { GDriveResource: GDriveResource2 } = await import("./gdrive-XSX6A7B3.js");
2802
+ const { normalizeGDriveConfig: normalizeGDriveConfig2 } = await import("./config-K63RX6EU.js");
2016
2803
  return new GDriveResource2(normalizeGDriveConfig2(config));
2017
2804
  },
2018
2805
  dropbox: async (config) => {
2019
- const { DropboxResource: DropboxResource2 } = await import("./dropbox-74GYLV3R.js");
2020
- const { normalizeDropboxConfig: normalizeDropboxConfig2 } = await import("./config-4UDVSUQJ.js");
2806
+ const { DropboxResource: DropboxResource2 } = await import("./dropbox-OSTZXSIE.js");
2807
+ const { normalizeDropboxConfig: normalizeDropboxConfig2 } = await import("./config-L7SBSH5L.js");
2021
2808
  return new DropboxResource2(normalizeDropboxConfig2(config));
2022
2809
  },
2023
2810
  box: async (config) => {
2024
- const { BoxResource: BoxResource2 } = await import("./box-GQ2U2R6R.js");
2025
- const { normalizeBoxConfig: normalizeBoxConfig2 } = await import("./config-CMDBAPDH.js");
2811
+ const { BoxResource: BoxResource2 } = await import("./box-7XTZYDSO.js");
2812
+ const { normalizeBoxConfig: normalizeBoxConfig2 } = await import("./config-A2GQYJDB.js");
2026
2813
  return new BoxResource2(normalizeBoxConfig2(config));
2027
2814
  },
2028
2815
  gmail: async (config) => {
2029
- const { GmailResource: GmailResource2 } = await import("./gmail-OLN2LT4O.js");
2030
- const { normalizeGmailConfig } = await import("./config-NV5WXP64.js");
2816
+ const { GmailResource: GmailResource2 } = await import("./gmail-2TBT4CVH.js");
2817
+ const { normalizeGmailConfig } = await import("./config-UU27ALAA.js");
2031
2818
  return new GmailResource2(normalizeGmailConfig(config));
2032
2819
  },
2033
2820
  email: async (config) => {
2034
- const { EmailResource: EmailResource2 } = await import("./email-5IZ7OBQ4.js");
2035
- const { normalizeEmailConfig: normalizeEmailConfig2 } = await import("./config-3IVQJBNW.js");
2821
+ const { EmailResource: EmailResource2 } = await import("./email-4ZFPSWIN.js");
2822
+ const { normalizeEmailConfig: normalizeEmailConfig2 } = await import("./config-DWSJL3NH.js");
2036
2823
  return new EmailResource2(normalizeEmailConfig2(config));
2037
2824
  }
2038
2825
  };
@@ -2059,6 +2846,7 @@ export {
2059
2846
  BoxResource,
2060
2847
  CEPH_PROMPT,
2061
2848
  CephResource,
2849
+ DEFAULT_STATE_ROOT,
2062
2850
  DIGITALOCEAN_PROMPT,
2063
2851
  DISK_COMMANDS,
2064
2852
  DISK_OPS,
@@ -2066,8 +2854,12 @@ export {
2066
2854
  DatabricksVolumeResource,
2067
2855
  DigitalOceanResource,
2068
2856
  DiscordResource,
2857
+ DiskNamespaceStore,
2069
2858
  DiskObserverStore,
2859
+ DiskRecordClient,
2070
2860
  DiskResource,
2861
+ DiskSessionStore,
2862
+ DiskWorkspaceStateStore,
2071
2863
  DropboxResource,
2072
2864
  EMAIL_COMMANDS,
2073
2865
  EMAIL_OPS,
@@ -2086,6 +2878,8 @@ export {
2086
2878
  GitHubCIResource,
2087
2879
  GitHubResource,
2088
2880
  GmailResource,
2881
+ GridFSAccessor,
2882
+ GridFSResource,
2089
2883
  HF_BUCKETS_PROMPT,
2090
2884
  HF_COMMANDS,
2091
2885
  HF_DATASETS_PROMPT,
@@ -2113,6 +2907,11 @@ export {
2113
2907
  MongoDBResource,
2114
2908
  MongoDBStore,
2115
2909
  Mount,
2910
+ NEXTCLOUD_COMMANDS,
2911
+ NEXTCLOUD_OPS,
2912
+ NEXTCLOUD_PROMPT,
2913
+ NextcloudAccessor,
2914
+ NextcloudResource,
2116
2915
  NotionResource,
2117
2916
  OCIResource,
2118
2917
  OCI_PROMPT,
@@ -2127,9 +2926,12 @@ export {
2127
2926
  REDIS_PROMPT,
2128
2927
  RedisAccessor,
2129
2928
  RedisFileCacheStore,
2929
+ RedisNamespaceStore,
2130
2930
  RedisObserverStore,
2131
2931
  RedisResource,
2932
+ RedisSessionStore,
2132
2933
  RedisStore,
2934
+ RedisWorkspaceStateStore,
2133
2935
  S3Resource,
2134
2936
  SCALEWAY_PROMPT,
2135
2937
  SEAWEEDFS_PROMPT,
@@ -2171,11 +2973,13 @@ export {
2171
2973
  normalizeGitHubCIConfig,
2172
2974
  normalizeGitHubConfig,
2173
2975
  normalizeGoogleConfig as normalizeGmailConfig,
2976
+ normalizeGridFSConfig,
2174
2977
  normalizeHfBucketsConfig,
2175
2978
  normalizeHfModelsConfig,
2176
2979
  normalizeHfRepoConfig,
2177
2980
  normalizeLangfuseConfig,
2178
2981
  normalizeLinearConfig,
2982
+ normalizeNextcloudConfig,
2179
2983
  normalizeNotionConfig,
2180
2984
  normalizeSlackConfig,
2181
2985
  normalizeSshConfig,
@@ -2204,6 +3008,7 @@ export {
2204
3008
  redactLangfuseConfig,
2205
3009
  redactLinearConfig,
2206
3010
  redactMinIOConfig,
3011
+ redactNextcloudConfig,
2207
3012
  redactNotionConfig,
2208
3013
  redactOciConfig,
2209
3014
  redactQingStorConfig,