@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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/ssh/ssh.ts","../src/accessor/ssh.ts","../src/commands/builtin/ssh/index.ts","../src/core/ssh/read.ts","../src/core/ssh/stream.ts","../src/core/ssh/utils.ts","../src/core/ssh/entry.ts","../src/core/ssh/stat.ts","../src/core/ssh/append.ts","../src/core/ssh/constants.ts","../src/core/ssh/write.ts","../src/core/ssh/copy.ts","../src/core/ssh/create.ts","../src/core/ssh/du.ts","../src/core/ssh/exists.ts","../src/core/ssh/find.ts","../src/core/ssh/mkdir.ts","../src/core/ssh/readdir.ts","../src/core/ssh/rename.ts","../src/core/ssh/rm.ts","../src/core/ssh/rmdir.ts","../src/core/ssh/truncate.ts","../src/core/ssh/unlink.ts","../src/commands/builtin/ssh/io.ts","../src/ops/ssh/index.ts","../src/resource/ssh/prompt.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n BaseResource,\n PathSpec,\n ResourceName,\n makeResolveGlob,\n mountKey,\n mountPrefixOf,\n type FileStat,\n type FindOptions,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n} from '@struktoai/mirage-core'\nimport { SSHAccessor } from '../../accessor/ssh.ts'\nimport { SSH_COMMANDS } from '../../commands/builtin/ssh/index.ts'\nimport { appendBytes as appendCore } from '../../core/ssh/append.ts'\nimport { copy as copyCore } from '../../core/ssh/copy.ts'\nimport { create as createCore } from '../../core/ssh/create.ts'\nimport { du as duCore, duAll as duAllCore } from '../../core/ssh/du.ts'\nimport { exists as existsCore } from '../../core/ssh/exists.ts'\nimport { find as findCore, type FindOptions as SshFindOptions } from '../../core/ssh/find.ts'\nimport { mkdir as mkdirCore } from '../../core/ssh/mkdir.ts'\nimport { read as readCoreFn } from '../../core/ssh/read.ts'\nimport { SCOPE_ERROR } from '../../core/ssh/constants.ts'\nimport { readdir as readdirCore } from '../../core/ssh/readdir.ts'\nimport { rename as renameCore } from '../../core/ssh/rename.ts'\nimport { rmR as rmRCore } from '../../core/ssh/rm.ts'\nimport { rmdir as rmdirCore } from '../../core/ssh/rmdir.ts'\nimport { stat as statCore } from '../../core/ssh/stat.ts'\nimport { rangeRead as rangeReadCore, stream as streamCore } from '../../core/ssh/stream.ts'\nimport { truncate as truncateCore } from '../../core/ssh/truncate.ts'\nimport { unlink as unlinkCore } from '../../core/ssh/unlink.ts'\nimport { writeBytes as writeCore } from '../../core/ssh/write.ts'\nimport { SSH_OPS } from '../../ops/ssh/index.ts'\nimport { type SSHConfig, type SSHConfigRedacted, redactSshConfig } from './config.ts'\nimport { SSH_PROMPT } from './prompt.ts'\n\nconst globCore = makeResolveGlob(readdirCore, SCOPE_ERROR)\n\nexport interface SSHResourceState {\n type: string\n config: SSHConfigRedacted\n}\n\nexport class SSHResource extends BaseResource implements Resource {\n readonly kind = ResourceName.SSH\n readonly cachesReads: boolean = true\n override readonly indexTtl: number = 60\n readonly prompt = SSH_PROMPT\n readonly config: SSHConfig\n readonly accessor: SSHAccessor\n readonly opsMap: Record<string, unknown> = {\n read_bytes: readCoreFn,\n write: writeCore,\n readdir: readdirCore,\n stat: statCore,\n unlink: unlinkCore,\n rmdir: rmdirCore,\n copy: copyCore,\n rename: renameCore,\n mkdir: mkdirCore,\n read_stream: streamCore,\n range_read: rangeReadCore,\n rm_recursive: rmRCore,\n du_total: duCore,\n du_all: duAllCore,\n create: createCore,\n truncate: truncateCore,\n exists: existsCore,\n find_flat: findCore,\n append: appendCore,\n }\n\n constructor(config: SSHConfig) {\n super()\n this.config = config\n this.accessor = new SSHAccessor(config)\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n close(): Promise<void> {\n return this.accessor.close()\n }\n\n ops(): readonly RegisteredOp[] {\n return SSH_OPS\n }\n\n commands(): readonly RegisteredCommand[] {\n return SSH_COMMANDS\n }\n\n streamPath(p: PathSpec): AsyncIterable<Uint8Array> {\n return streamCore(this.accessor, p)\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return readCoreFn(this.accessor, p)\n }\n\n writeFile(p: PathSpec, data: Uint8Array): Promise<void> {\n return writeCore(this.accessor, p, data)\n }\n\n appendFile(p: PathSpec, data: Uint8Array): Promise<void> {\n return appendCore(this.accessor, p, data)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return readdirCore(this.accessor, p)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return statCore(this.accessor, p)\n }\n\n exists(p: PathSpec): Promise<boolean> {\n return existsCore(this.accessor, p)\n }\n\n mkdir(p: PathSpec, options?: { recursive?: boolean }): Promise<void> {\n return mkdirCore(this.accessor, p, options?.recursive === true)\n }\n\n rmdir(p: PathSpec): Promise<void> {\n return rmdirCore(this.accessor, p)\n }\n\n unlink(p: PathSpec): Promise<void> {\n return unlinkCore(this.accessor, p)\n }\n\n rename(src: PathSpec, dst: PathSpec): Promise<void> {\n return renameCore(this.accessor, src, dst)\n }\n\n truncate(p: PathSpec, length: number): Promise<void> {\n return truncateCore(this.accessor, p, length)\n }\n\n copy(src: PathSpec, dst: PathSpec): Promise<void> {\n return copyCore(this.accessor, src, dst)\n }\n\n rmR(p: PathSpec): Promise<void> {\n return rmRCore(this.accessor, p)\n }\n\n du(p: PathSpec): Promise<number> {\n return duCore(this.accessor, p)\n }\n\n find(p: PathSpec, options: FindOptions = {}): Promise<string[]> {\n return findCore(this.accessor, p, options as SshFindOptions)\n }\n\n glob(paths: readonly PathSpec[], prefix = ''): Promise<PathSpec[]> {\n const effective = prefix\n ? paths.map((p) =>\n mountPrefixOf(p.virtual, p.resourcePath)\n ? p\n : new PathSpec({\n virtual: p.virtual,\n directory: p.directory,\n ...(p.pattern !== null ? { pattern: p.pattern } : {}),\n resolved: p.resolved,\n resourcePath: mountKey(p.virtual, prefix),\n }),\n )\n : paths\n return globCore(this.accessor, effective)\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async getState(): Promise<SSHResourceState> {\n return {\n type: this.kind,\n config: redactSshConfig(this.config),\n }\n }\n\n loadState(_state: SSHResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type * as Ssh2Mod from 'ssh2'\nimport type { Client, SFTPWrapper } from 'ssh2'\nimport { Accessor } from '@struktoai/mirage-core'\nimport { homedir } from 'node:os'\nimport { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport type { SSHConfig } from '../resource/ssh/config.ts'\n\nfunction expandHome(p: string): string {\n if (p === '~') return homedir()\n if (p.startsWith('~/')) return resolve(homedir(), p.slice(2))\n return p\n}\n\nexport class SSHAccessor extends Accessor {\n private client: Client | null = null\n private sftpClient: SFTPWrapper | null = null\n private connectPromise: Promise<SFTPWrapper> | null = null\n\n constructor(public readonly config: SSHConfig) {\n super()\n }\n\n async sftp(): Promise<SFTPWrapper> {\n if (this.sftpClient !== null) return this.sftpClient\n if (this.connectPromise !== null) return this.connectPromise\n this.connectPromise = this.connect()\n try {\n return await this.connectPromise\n } finally {\n this.connectPromise = null\n }\n }\n\n private async connect(): Promise<SFTPWrapper> {\n let ssh2Mod: typeof Ssh2Mod\n try {\n ssh2Mod = await import('ssh2')\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n throw new Error(`ssh2 is required for the SSH resource — install it as a peer dep: ${msg}`)\n }\n const { Client: ClientCtor } = ssh2Mod\n const c = new ClientCtor()\n const opts: Record<string, unknown> = {\n host: this.config.hostname ?? this.config.host,\n port: this.config.port ?? 22,\n readyTimeout: (this.config.timeout ?? 30) * 1000,\n }\n if (this.config.username !== undefined) opts.username = this.config.username\n if (this.config.password !== undefined) opts.password = this.config.password\n if (this.config.identityFile !== undefined) {\n opts.privateKey = readFileSync(expandHome(this.config.identityFile))\n if (this.config.passphrase !== undefined) opts.passphrase = this.config.passphrase\n }\n return new Promise<SFTPWrapper>((resolveFn, rejectFn) => {\n c.on('ready', () => {\n c.sftp((err: Error | undefined, sftp: SFTPWrapper) => {\n if (err !== undefined) {\n rejectFn(err)\n return\n }\n this.client = c\n this.sftpClient = sftp\n resolveFn(sftp)\n })\n })\n c.on('error', rejectFn)\n c.connect(opts as Parameters<Client['connect']>[0])\n })\n }\n\n close(): Promise<void> {\n if (this.client !== null) {\n this.client.end()\n this.client = null\n this.sftpClient = null\n }\n return Promise.resolve()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n type RegisteredCommand,\n ResourceName,\n makeFiletypeCommands,\n makeGenericCommands,\n} from '@struktoai/mirage-core'\nimport type { SSHAccessor } from '../../../accessor/ssh.ts'\nimport { read as sshRead } from '../../../core/ssh/read.ts'\nimport { stat as sshStat } from '../../../core/ssh/stat.ts'\nimport { SSH_IO } from './io.ts'\n\nexport const SSH_COMMANDS: readonly RegisteredCommand[] = [\n ...makeFiletypeCommands<SSHAccessor>({\n resource: ResourceName.SSH,\n readBytes: sshRead,\n statEntry: sshStat,\n }),\n ...makeGenericCommands<SSHAccessor>(ResourceName.SSH, SSH_IO),\n]\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport { enoent } from '@struktoai/mirage-core'\nimport type { SSHAccessor } from '../../accessor/ssh.ts'\nimport { readChunks } from './stream.ts'\nimport { isNoSuchFile, joinRoot, stripPrefix } from './utils.ts'\n\nexport async function read(accessor: SSHAccessor, p: PathSpec): Promise<Uint8Array> {\n const sftp = await accessor.sftp()\n const virtual = stripPrefix(p)\n const remote = joinRoot(accessor.config.root ?? '/', virtual)\n // ssh2's readFile stats the file and issues a single READ for the whole\n // size; servers that honor large reads (asyncssh) reply with a packet over\n // ssh2's 256 KiB cap, a fatal protocol error that strands the pending\n // callback. Stream in bounded chunks instead.\n const rs = sftp.createReadStream(remote)\n const chunks: Uint8Array[] = []\n let total = 0\n try {\n for await (const u8 of readChunks(rs)) {\n chunks.push(u8)\n total += u8.byteLength\n }\n } catch (err) {\n if (isNoSuchFile(err)) throw enoent(p)\n throw err\n }\n const out = new Uint8Array(total)\n let offset = 0\n for (const c of chunks) {\n out.set(c, offset)\n offset += c.byteLength\n }\n return out\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { once } from 'node:events'\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport { enoent } from '@struktoai/mirage-core'\nimport type { ReadStream } from 'ssh2'\nimport type { SSHAccessor } from '../../accessor/ssh.ts'\nimport { isNoSuchFile, joinRoot, stripPrefix } from './utils.ts'\n\nasync function waitForClose(rs: ReadStream): Promise<Error | null> {\n try {\n await once(rs, 'close')\n return null\n } catch (error) {\n return error instanceof Error ? error : new Error(String(error))\n }\n}\n\nexport async function* readChunks(rs: ReadStream): AsyncIterable<Uint8Array> {\n const closed = waitForClose(rs)\n let closeError: Error | null = null\n try {\n for await (const chunk of rs) {\n const buf = chunk as Buffer\n yield new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength)\n }\n } finally {\n if (!rs.destroyed) rs.destroy()\n closeError = await closed\n }\n if (closeError !== null) throw closeError\n}\n\nexport async function* stream(accessor: SSHAccessor, p: PathSpec): AsyncIterable<Uint8Array> {\n const sftp = await accessor.sftp()\n const virtual = stripPrefix(p)\n const remote = joinRoot(accessor.config.root ?? '/', virtual)\n const rs = sftp.createReadStream(remote)\n try {\n yield* readChunks(rs)\n } catch (err) {\n if (isNoSuchFile(err)) throw enoent(p)\n throw err\n }\n}\n\nexport async function rangeRead(\n accessor: SSHAccessor,\n p: PathSpec,\n start: number,\n end: number,\n): Promise<Uint8Array> {\n const sftp = await accessor.sftp()\n const virtual = stripPrefix(p)\n const remote = joinRoot(accessor.config.root ?? '/', virtual)\n const rs = sftp.createReadStream(remote, { start, end: end - 1 })\n const chunks: Uint8Array[] = []\n let total = 0\n try {\n for await (const u8 of readChunks(rs)) {\n chunks.push(u8)\n total += u8.byteLength\n }\n } catch (err) {\n if (isNoSuchFile(err)) throw enoent(p)\n throw err\n }\n const out = new Uint8Array(total)\n let offset = 0\n for (const c of chunks) {\n out.set(c, offset)\n offset += c.byteLength\n }\n return out\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport { lstripSlash, mountPrefixOf, rstripSlash } from '@struktoai/mirage-core'\n\nconst S_IFMT = 0o170000\nconst S_IFDIR = 0o040000\nconst S_IFREG = 0o100000\n\nexport function stripPrefix(p: PathSpec): string {\n if (\n mountPrefixOf(p.virtual, p.resourcePath) &&\n p.virtual.startsWith(mountPrefixOf(p.virtual, p.resourcePath))\n ) {\n return p.virtual.slice(mountPrefixOf(p.virtual, p.resourcePath).length) || '/'\n }\n return p.virtual\n}\n\nexport function joinRoot(root: string, rel: string): string {\n const r = rstripSlash(root)\n const stripped = lstripSlash(rel)\n if (stripped === '') return r === '' ? '/' : r\n if (r === '') return `/${stripped}`\n return `${r}/${stripped}`\n}\n\nexport function isNoSuchFile(err: unknown): boolean {\n if (err === null || err === undefined) return false\n if (typeof err !== 'object') return false\n const code = (err as { code?: unknown }).code\n return code === 2\n}\n\nexport function isDirectoryAttrs(attrs: { mode?: number }): boolean {\n if (attrs.mode === undefined) return false\n return (attrs.mode & S_IFMT) === S_IFDIR\n}\n\nexport function isFileAttrs(attrs: { mode?: number }): boolean {\n if (attrs.mode === undefined) return false\n return (attrs.mode & S_IFMT) === S_IFREG\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { FileStat, FileType, guessType } from '@struktoai/mirage-core'\nimport { isDirectoryAttrs } from './utils.ts'\n\nexport interface SshAttrs {\n size?: number\n mode?: number\n mtime?: number\n atime?: number\n uid?: number\n gid?: number\n}\n\nexport function attrsToFileStat(name: string, attrs: SshAttrs): FileStat {\n const modified = attrs.mtime !== undefined ? new Date(attrs.mtime * 1000).toISOString() : null\n const extra: Record<string, unknown> = {}\n if (attrs.mode !== undefined) extra.mode = attrs.mode\n if (attrs.uid !== undefined) extra.uid = attrs.uid\n if (attrs.gid !== undefined) extra.gid = attrs.gid\n if (isDirectoryAttrs(attrs)) {\n return new FileStat({\n name,\n size: null,\n modified,\n type: FileType.DIRECTORY,\n extra,\n })\n }\n return new FileStat({\n name,\n size: attrs.size ?? null,\n modified,\n fingerprint: null,\n type: guessType(name),\n extra,\n })\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { FileStat, PathSpec } from '@struktoai/mirage-core'\nimport type { Stats } from 'ssh2'\nimport type { SSHAccessor } from '../../accessor/ssh.ts'\nimport { attrsToFileStat } from './entry.ts'\nimport { isNoSuchFile, joinRoot, stripPrefix } from './utils.ts'\nimport { enoent, rstripSlash } from '@struktoai/mirage-core'\n\nexport async function stat(accessor: SSHAccessor, p: PathSpec): Promise<FileStat> {\n const sftp = await accessor.sftp()\n const virtual = stripPrefix(p)\n const remote = joinRoot(accessor.config.root ?? '/', virtual)\n const attrs = await new Promise<Stats>((resolveFn, rejectFn) => {\n sftp.lstat(remote, (err, stats) => {\n if (err !== undefined) {\n if (isNoSuchFile(err)) rejectFn(enoent(p))\n else rejectFn(err)\n return\n }\n resolveFn(stats)\n })\n })\n const cleaned = rstripSlash(virtual)\n const name = cleaned.length === 0 ? '/' : (cleaned.split('/').pop() ?? '/')\n return attrsToFileStat(name, attrs)\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { invalidateAfterWrite } from '@struktoai/mirage-core'\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport type { SSHAccessor } from '../../accessor/ssh.ts'\nimport { joinRoot, stripPrefix } from './utils.ts'\n\nexport async function appendBytes(\n accessor: SSHAccessor,\n p: PathSpec,\n data: Uint8Array,\n): Promise<void> {\n const sftp = await accessor.sftp()\n const virtual = stripPrefix(p)\n const remote = joinRoot(accessor.config.root ?? '/', virtual)\n await new Promise<void>((resolveFn, rejectFn) => {\n sftp.appendFile(remote, Buffer.from(data), (err) => {\n if (err) rejectFn(err)\n else resolveFn()\n })\n })\n await invalidateAfterWrite(p)\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nexport const SCOPE_WARN = 500\nexport const SCOPE_ERROR = 5000\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { ResourceName, invalidateAfterWrite, record } from '@struktoai/mirage-core'\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport type { SSHAccessor } from '../../accessor/ssh.ts'\nimport { joinRoot, stripPrefix } from './utils.ts'\n\nexport async function writeBytes(\n accessor: SSHAccessor,\n p: PathSpec,\n data: Uint8Array,\n): Promise<void> {\n const start = performance.now()\n const sftp = await accessor.sftp()\n const virtual = stripPrefix(p)\n const remote = joinRoot(accessor.config.root ?? '/', virtual)\n await new Promise<void>((resolveFn, rejectFn) => {\n sftp.writeFile(remote, Buffer.from(data), (err) => {\n if (err) rejectFn(err)\n else resolveFn()\n })\n })\n record('write', virtual, ResourceName.SSH, data.byteLength, start)\n await invalidateAfterWrite(p)\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport type { SSHAccessor } from '../../accessor/ssh.ts'\nimport { read } from './read.ts'\nimport { writeBytes } from './write.ts'\n\nexport async function copy(accessor: SSHAccessor, src: PathSpec, dst: PathSpec): Promise<void> {\n const data = await read(accessor, src)\n await writeBytes(accessor, dst, data)\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport type { SSHAccessor } from '../../accessor/ssh.ts'\nimport { writeBytes } from './write.ts'\n\nexport function create(accessor: SSHAccessor, path: PathSpec): Promise<void> {\n return writeBytes(accessor, path, new Uint8Array())\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { FileEntryWithStats } from 'ssh2'\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport type { SSHAccessor } from '../../accessor/ssh.ts'\nimport { isDirectoryAttrs, isFileAttrs, joinRoot, stripPrefix } from './utils.ts'\nimport { norm } from '@struktoai/mirage-core'\n\nasync function readRemoteDir(\n accessor: SSHAccessor,\n remote: string,\n): Promise<FileEntryWithStats[] | null> {\n const sftp = await accessor.sftp()\n return new Promise<FileEntryWithStats[] | null>((resolveFn, rejectFn) => {\n sftp.readdir(remote, (err, entries) => {\n if (err !== undefined) {\n const code = (err as { code?: unknown }).code\n if (code === 2) {\n resolveFn(null)\n return\n }\n rejectFn(err)\n return\n }\n resolveFn(entries)\n })\n })\n}\n\nasync function statRemote(\n accessor: SSHAccessor,\n remote: string,\n): Promise<{ mode: number; size: number } | null> {\n const sftp = await accessor.sftp()\n return new Promise<{ mode: number; size: number } | null>((resolveFn, rejectFn) => {\n sftp.lstat(remote, (err, stats) => {\n if (err !== undefined) {\n const code = (err as { code?: unknown }).code\n if (code === 2) {\n resolveFn(null)\n return\n }\n rejectFn(err)\n return\n }\n resolveFn({ mode: stats.mode, size: stats.size })\n })\n })\n}\n\nasync function walkSizes(accessor: SSHAccessor, virtual: string): Promise<number> {\n const remote = joinRoot(accessor.config.root ?? '/', virtual)\n const st = await statRemote(accessor, remote)\n if (st === null) return 0\n if (isFileAttrs(st)) return st.size\n if (!isDirectoryAttrs(st)) return 0\n const entries = await readRemoteDir(accessor, remote)\n if (entries === null) return 0\n let total = 0\n for (const entry of entries) {\n if (entry.filename === '.' || entry.filename === '..') continue\n const child = virtual === '/' ? `/${entry.filename}` : `${virtual}/${entry.filename}`\n if (isDirectoryAttrs(entry.attrs)) {\n total += await walkSizes(accessor, child)\n } else {\n total += entry.attrs.size\n }\n }\n return total\n}\n\nasync function walkAll(\n accessor: SSHAccessor,\n virtual: string,\n entries: [string, number][],\n): Promise<number> {\n const remote = joinRoot(accessor.config.root ?? '/', virtual)\n const st = await statRemote(accessor, remote)\n if (st === null) return 0\n if (isFileAttrs(st)) {\n entries.push([virtual, st.size])\n return st.size\n }\n if (!isDirectoryAttrs(st)) return 0\n const list = await readRemoteDir(accessor, remote)\n if (list === null) return 0\n let total = 0\n for (const entry of list) {\n if (entry.filename === '.' || entry.filename === '..') continue\n const child = virtual === '/' ? `/${entry.filename}` : `${virtual}/${entry.filename}`\n if (isDirectoryAttrs(entry.attrs)) {\n total += await walkAll(accessor, child, entries)\n } else {\n const size = entry.attrs.size\n entries.push([child, size])\n total += size\n }\n }\n return total\n}\n\nexport async function du(accessor: SSHAccessor, p: PathSpec): Promise<number> {\n const virtual = stripPrefix(p)\n return walkSizes(accessor, virtual)\n}\n\nexport async function duAll(\n accessor: SSHAccessor,\n p: PathSpec,\n): Promise<[entries: [string, number][], total: number]> {\n const virtual = norm(stripPrefix(p))\n const entries: [string, number][] = []\n const total = await walkAll(accessor, virtual, entries)\n entries.sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0))\n return [entries, total]\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport type { SSHAccessor } from '../../accessor/ssh.ts'\nimport { joinRoot, stripPrefix } from './utils.ts'\n\nexport async function exists(accessor: SSHAccessor, p: PathSpec): Promise<boolean> {\n const sftp = await accessor.sftp()\n const remote = joinRoot(accessor.config.root ?? '/', stripPrefix(p))\n return new Promise<boolean>((resolveFn) => {\n sftp.exists(remote, (yes) => {\n resolveFn(yes)\n })\n })\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { FileEntryWithStats } from 'ssh2'\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport type { SSHAccessor } from '../../accessor/ssh.ts'\nimport { isDirectoryAttrs, joinRoot, stripPrefix } from './utils.ts'\nimport { norm } from '@struktoai/mirage-core'\nimport {\n buildTree,\n emitStartPath,\n keep,\n type PredNode,\n startBasename,\n} from '@struktoai/mirage-core'\n\nexport interface FindOptions {\n name?: string | null\n type?: 'f' | 'd' | 'file' | 'directory' | null\n minSize?: number | null\n maxSize?: number | null\n maxDepth?: number | null\n minDepth?: number | null\n nameExclude?: string | null\n orNames?: string[] | null\n iname?: string | null\n pathPattern?: string | null\n empty?: boolean | null\n tree?: PredNode | null\n mtimeMin?: number | null\n mtimeMax?: number | null\n}\n\ninterface WalkCtx {\n accessor: SSHAccessor\n options: FindOptions\n results: string[]\n baseDepth: number\n tree: PredNode\n}\n\nfunction isFileType(t: FindOptions['type']): boolean {\n return t === 'f' || t === 'file'\n}\n\nfunction isDirType(t: FindOptions['type']): boolean {\n return t === 'd' || t === 'directory'\n}\n\nfunction matches(\n entry: FileEntryWithStats,\n entryPath: string,\n isDir: boolean,\n depth: number,\n opts: FindOptions,\n tree: PredNode,\n): boolean {\n if (opts.maxDepth !== null && opts.maxDepth !== undefined && depth > opts.maxDepth) return false\n const basename = entryPath.slice(entryPath.lastIndexOf('/') + 1)\n const isEmpty = isDir ? false : entry.attrs.size === 0\n if (\n !keep(\n { key: entryPath, name: basename, kind: isDir ? 'd' : 'f', depth, isEmpty },\n tree,\n opts.minDepth,\n )\n ) {\n return false\n }\n if (opts.minSize != null || opts.maxSize != null) {\n // Directories count as size 0 for -size (deliberate GNU divergence).\n const size = isDir ? 0 : entry.attrs.size\n if (opts.minSize != null && size < opts.minSize) return false\n if (opts.maxSize != null && size > opts.maxSize) return false\n }\n if (\n (opts.mtimeMin !== null && opts.mtimeMin !== undefined) ||\n (opts.mtimeMax !== null && opts.mtimeMax !== undefined)\n ) {\n const mtime = entry.attrs.mtime\n if (opts.mtimeMin !== null && opts.mtimeMin !== undefined && mtime < opts.mtimeMin) return false\n if (opts.mtimeMax !== null && opts.mtimeMax !== undefined && mtime > opts.mtimeMax) return false\n }\n return true\n}\n\nasync function readRemoteDir(\n accessor: SSHAccessor,\n remote: string,\n): Promise<FileEntryWithStats[] | null> {\n const sftp = await accessor.sftp()\n return new Promise<FileEntryWithStats[] | null>((resolveFn, rejectFn) => {\n sftp.readdir(remote, (err, entries) => {\n if (err !== undefined) {\n const code = (err as { code?: unknown }).code\n if (code === 2) {\n resolveFn(null)\n return\n }\n rejectFn(err)\n return\n }\n resolveFn(entries)\n })\n })\n}\n\nasync function statRemote(\n accessor: SSHAccessor,\n remote: string,\n): Promise<{ isDir: boolean; size: number } | null> {\n const sftp = await accessor.sftp()\n return new Promise<{ isDir: boolean; size: number } | null>((resolveFn, rejectFn) => {\n sftp.stat(remote, (err, stats) => {\n if (err !== undefined) {\n const code = (err as { code?: unknown }).code\n if (code === 2) {\n resolveFn(null)\n return\n }\n rejectFn(err)\n return\n }\n resolveFn({ isDir: stats.isDirectory(), size: stats.size })\n })\n })\n}\n\nasync function walk(ctx: WalkCtx, virtual: string, depth: number): Promise<void> {\n const opts = ctx.options\n if (opts.maxDepth !== null && opts.maxDepth !== undefined && depth > opts.maxDepth) return\n const remote = joinRoot(ctx.accessor.config.root ?? '/', virtual)\n const entries = await readRemoteDir(ctx.accessor, remote)\n if (entries === null) return\n for (const entry of entries) {\n if (entry.filename === '.' || entry.filename === '..') continue\n const childPath = virtual === '/' ? `/${entry.filename}` : `${virtual}/${entry.filename}`\n const isDir = isDirectoryAttrs(entry.attrs)\n if (matches(entry, childPath, isDir, depth + 1, opts, ctx.tree)) {\n ctx.results.push(childPath)\n }\n if (isDir) {\n await walk(ctx, childPath, depth + 1)\n }\n }\n}\n\nexport async function find(\n accessor: SSHAccessor,\n p: PathSpec,\n options: FindOptions = {},\n): Promise<string[]> {\n const virtual = norm(stripPrefix(p))\n const startName = startBasename(p.virtual)\n const results: string[] = []\n const baseDepth = (virtual.match(/\\//g) ?? []).length\n const typeKind: 'f' | 'd' | null = isFileType(options.type)\n ? 'f'\n : isDirType(options.type)\n ? 'd'\n : null\n const tree =\n options.tree ??\n buildTree({\n name: options.name,\n iname: options.iname,\n pathPattern: options.pathPattern,\n type: typeKind,\n nameExclude: options.nameExclude,\n orNames: options.orNames,\n })\n if (options.maxDepth == null || options.maxDepth >= 0) {\n const st = await statRemote(accessor, joinRoot(accessor.config.root ?? '/', virtual))\n emitStartPath(results, virtual, startName, {\n kind: st?.isDir ? 'd' : 'f',\n isEmpty: st === null ? null : st.isDir ? false : st.size === 0,\n exists: st !== null,\n tree,\n maxDepth: options.maxDepth,\n minDepth: options.minDepth,\n size: st === null || st.isDir ? null : st.size,\n minSize: options.minSize,\n maxSize: options.maxSize,\n })\n }\n await walk({ accessor, options, results, baseDepth, tree }, virtual, 0)\n results.sort()\n return results\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { invalidateAfterWrite, invalidateAncestors } from '@struktoai/mirage-core'\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport type { SFTPWrapper, Stats } from 'ssh2'\nimport type { SSHAccessor } from '../../accessor/ssh.ts'\nimport { isNoSuchFile, joinRoot, stripPrefix } from './utils.ts'\nimport { enoent, stripSlash } from '@struktoai/mirage-core'\n\nasync function statRemote(sftp: SFTPWrapper, remote: string): Promise<Stats | null> {\n return new Promise<Stats | null>((resolveFn) => {\n sftp.lstat(remote, (err, stats) => {\n if (err) resolveFn(null)\n else resolveFn(stats)\n })\n })\n}\n\nasync function mkdirOne(sftp: SFTPWrapper, remote: string, ignoreExisting: boolean): Promise<void> {\n return new Promise<void>((resolveFn, rejectFn) => {\n sftp.mkdir(remote, (err) => {\n if (!err) {\n resolveFn()\n return\n }\n if (ignoreExisting) {\n // ignore: dir already exists\n resolveFn()\n return\n }\n rejectFn(err)\n })\n })\n}\n\nexport async function mkdir(accessor: SSHAccessor, p: PathSpec, recursive: boolean): Promise<void> {\n const sftp = await accessor.sftp()\n const virtual = stripPrefix(p)\n const root = accessor.config.root ?? '/'\n const remote = joinRoot(root, virtual)\n if (!recursive) {\n try {\n await mkdirOne(sftp, remote, false)\n } catch (err) {\n if (isNoSuchFile(err)) throw enoent(p)\n throw err\n }\n return\n }\n const cleaned = stripSlash(virtual)\n if (cleaned.length === 0) return\n const parts = cleaned.split('/')\n let cur = ''\n for (const part of parts) {\n cur = cur === '' ? `/${part}` : `${cur}/${part}`\n const stepRemote = joinRoot(root, cur)\n const existing = await statRemote(sftp, stepRemote)\n if (existing?.isDirectory()) continue\n await mkdirOne(sftp, stepRemote, true)\n }\n await invalidateAfterWrite(p)\n await invalidateAncestors(p)\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { FileEntryWithStats } from 'ssh2'\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport type { SSHAccessor } from '../../accessor/ssh.ts'\nimport { isNoSuchFile, joinRoot, stripPrefix } from './utils.ts'\nimport { enoent, mountPrefixOf, stripSlash } from '@struktoai/mirage-core'\n\nexport async function readdir(accessor: SSHAccessor, p: PathSpec): Promise<string[]> {\n const sftp = await accessor.sftp()\n const virtual =\n p.pattern !== null\n ? p.directory.slice(mountPrefixOf(p.virtual, p.resourcePath).length) || '/'\n : stripPrefix(p)\n const remote = joinRoot(accessor.config.root ?? '/', virtual)\n const list = await new Promise<FileEntryWithStats[]>((resolveFn, rejectFn) => {\n sftp.readdir(remote, (err, entries) => {\n if (err !== undefined) {\n if (isNoSuchFile(err)) rejectFn(enoent(p))\n else rejectFn(err)\n return\n }\n resolveFn(entries)\n })\n })\n const base = `/${stripSlash(virtual)}`\n const dirPrefix = base === '/' ? '/' : `${base}/`\n const mountPrefix = mountPrefixOf(p.virtual, p.resourcePath)\n const names: string[] = []\n for (const entry of list) {\n if (entry.filename === '.' || entry.filename === '..') continue\n names.push(`${mountPrefix}${dirPrefix}${entry.filename}`)\n }\n names.sort()\n return names\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { invalidateAfterUnlink, invalidateAfterWrite } from '@struktoai/mirage-core'\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport { enoent } from '@struktoai/mirage-core'\nimport type { SSHAccessor } from '../../accessor/ssh.ts'\nimport { isNoSuchFile, joinRoot, stripPrefix } from './utils.ts'\n\nexport async function rename(accessor: SSHAccessor, src: PathSpec, dst: PathSpec): Promise<void> {\n const sftp = await accessor.sftp()\n const root = accessor.config.root ?? '/'\n const srcVirtual = stripPrefix(src)\n const dstVirtual = stripPrefix(dst)\n const remoteSrc = joinRoot(root, srcVirtual)\n const remoteDst = joinRoot(root, dstVirtual)\n // POSIX rename semantics (replace an existing destination); plain SFTP\n // rename refuses to overwrite, so prefer posix-rename@openssh.com. ssh2\n // throws synchronously when the server lacks the extension — only then\n // fall back to the plain rename.\n await new Promise<void>((resolveFn, rejectFn) => {\n const done = (err: unknown): void => {\n if (!err) resolveFn()\n else if (isNoSuchFile(err)) rejectFn(enoent(src))\n else rejectFn(err as Error)\n }\n try {\n sftp.ext_openssh_rename(remoteSrc, remoteDst, done)\n } catch {\n sftp.rename(remoteSrc, remoteDst, done)\n }\n })\n await invalidateAfterWrite(dst)\n await invalidateAfterUnlink(src)\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { FileEntryWithStats, SFTPWrapper, Stats } from 'ssh2'\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport { enoent, invalidateAfterUnlink } from '@struktoai/mirage-core'\nimport type { SSHAccessor } from '../../accessor/ssh.ts'\nimport { isDirectoryAttrs, isNoSuchFile, joinRoot, stripPrefix } from './utils.ts'\n\nasync function statRemote(sftp: SFTPWrapper, remote: string): Promise<Stats> {\n return new Promise<Stats>((resolveFn, rejectFn) => {\n sftp.lstat(remote, (err, stats) => {\n if (err !== undefined) rejectFn(err)\n else resolveFn(stats)\n })\n })\n}\n\nasync function readdirRemote(sftp: SFTPWrapper, remote: string): Promise<FileEntryWithStats[]> {\n return new Promise<FileEntryWithStats[]>((resolveFn, rejectFn) => {\n sftp.readdir(remote, (err, list) => {\n if (err !== undefined) rejectFn(err)\n else resolveFn(list)\n })\n })\n}\n\nasync function unlinkRemote(sftp: SFTPWrapper, remote: string): Promise<void> {\n return new Promise<void>((resolveFn, rejectFn) => {\n sftp.unlink(remote, (err) => {\n if (err) rejectFn(err)\n else resolveFn()\n })\n })\n}\n\nasync function rmdirRemote(sftp: SFTPWrapper, remote: string): Promise<void> {\n return new Promise<void>((resolveFn, rejectFn) => {\n sftp.rmdir(remote, (err) => {\n if (err) rejectFn(err)\n else resolveFn()\n })\n })\n}\n\nasync function rmRecurse(sftp: SFTPWrapper, remote: string): Promise<void> {\n const stats = await statRemote(sftp, remote)\n if (isDirectoryAttrs(stats)) {\n const entries = await readdirRemote(sftp, remote)\n for (const entry of entries) {\n if (entry.filename === '.' || entry.filename === '..') continue\n const child = remote === '/' ? `/${entry.filename}` : `${remote}/${entry.filename}`\n await rmRecurse(sftp, child)\n }\n await rmdirRemote(sftp, remote)\n return\n }\n await unlinkRemote(sftp, remote)\n}\n\nexport async function rmR(accessor: SSHAccessor, p: PathSpec): Promise<void> {\n const sftp = await accessor.sftp()\n const virtual = stripPrefix(p)\n const remote = joinRoot(accessor.config.root ?? '/', virtual)\n try {\n await rmRecurse(sftp, remote)\n } catch (err) {\n if (isNoSuchFile(err)) throw enoent(p)\n throw err\n }\n await invalidateAfterUnlink(p)\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport { enoent, invalidateAfterUnlink } from '@struktoai/mirage-core'\nimport type { SSHAccessor } from '../../accessor/ssh.ts'\nimport { isNoSuchFile, joinRoot, stripPrefix } from './utils.ts'\n\nexport async function rmdir(accessor: SSHAccessor, p: PathSpec): Promise<void> {\n const sftp = await accessor.sftp()\n const virtual = stripPrefix(p)\n const remote = joinRoot(accessor.config.root ?? '/', virtual)\n await new Promise<void>((resolveFn, rejectFn) => {\n sftp.rmdir(remote, (err) => {\n if (!err) {\n resolveFn()\n return\n }\n if (isNoSuchFile(err)) rejectFn(enoent(p))\n else rejectFn(err)\n })\n })\n await invalidateAfterUnlink(p)\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport type { SSHAccessor } from '../../accessor/ssh.ts'\nimport { read } from './read.ts'\nimport { writeBytes } from './write.ts'\n\nexport async function truncate(accessor: SSHAccessor, p: PathSpec, length: number): Promise<void> {\n let data: Uint8Array\n try {\n data = await read(accessor, p)\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n data = new Uint8Array(0)\n } else {\n throw err\n }\n }\n const out = new Uint8Array(length)\n out.set(data.subarray(0, Math.min(data.byteLength, length)))\n await writeBytes(accessor, p, out)\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { invalidateAfterUnlink } from '@struktoai/mirage-core'\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport { enoent } from '@struktoai/mirage-core'\nimport type { SSHAccessor } from '../../accessor/ssh.ts'\nimport { isNoSuchFile, joinRoot, stripPrefix } from './utils.ts'\n\nexport async function unlink(accessor: SSHAccessor, p: PathSpec): Promise<void> {\n const sftp = await accessor.sftp()\n const virtual = stripPrefix(p)\n const remote = joinRoot(accessor.config.root ?? '/', virtual)\n await new Promise<void>((resolveFn, rejectFn) => {\n sftp.unlink(remote, (err) => {\n if (!err) {\n resolveFn()\n return\n }\n if (isNoSuchFile(err)) rejectFn(enoent(p))\n else rejectFn(err)\n })\n })\n await invalidateAfterUnlink(p)\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { CommandIO } from '@struktoai/mirage-core'\nimport type { SSHAccessor } from '../../../accessor/ssh.ts'\nimport { appendBytes as sshAppend } from '../../../core/ssh/append.ts'\nimport { SCOPE_ERROR } from '../../../core/ssh/constants.ts'\nimport { copy as sshCopy } from '../../../core/ssh/copy.ts'\nimport { create as sshCreate } from '../../../core/ssh/create.ts'\nimport { du as sshDu, duAll as sshDuAll } from '../../../core/ssh/du.ts'\nimport { exists as sshExists } from '../../../core/ssh/exists.ts'\nimport { find as sshFind } from '../../../core/ssh/find.ts'\nimport { mkdir as sshMkdir } from '../../../core/ssh/mkdir.ts'\nimport { read as sshRead } from '../../../core/ssh/read.ts'\nimport { readdir as sshReaddir } from '../../../core/ssh/readdir.ts'\nimport { rename as sshRename } from '../../../core/ssh/rename.ts'\nimport { rmR as sshRmR } from '../../../core/ssh/rm.ts'\nimport { rmdir as sshRmdir } from '../../../core/ssh/rmdir.ts'\nimport { stat as sshStat } from '../../../core/ssh/stat.ts'\nimport { stream as sshStream } from '../../../core/ssh/stream.ts'\nimport { truncate as sshTruncate } from '../../../core/ssh/truncate.ts'\nimport { unlink as sshUnlink } from '../../../core/ssh/unlink.ts'\nimport { writeBytes as sshWrite } from '../../../core/ssh/write.ts'\n\nexport const SSH_IO: CommandIO<SSHAccessor> = {\n maxGlobMatches: SCOPE_ERROR,\n readdir: sshReaddir,\n readBytes: sshRead,\n readStream: sshStream,\n stat: sshStat,\n isMounted: () => true,\n local: false,\n write: sshWrite,\n exists: sshExists,\n mkdir: (accessor, path, parents) => sshMkdir(accessor, path, parents === true),\n unlink: sshUnlink,\n rmdir: sshRmdir,\n rmR: sshRmR,\n rename: sshRename,\n copy: sshCopy,\n create: sshCreate,\n truncate: sshTruncate,\n append: sshAppend,\n find: sshFind,\n duTotal: sshDu,\n duAll: sshDuAll,\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { RegisteredOp } from '@struktoai/mirage-core'\nimport { ResourceName, makeGenericOps } from '@struktoai/mirage-core'\nimport { SSH_IO } from '../../commands/builtin/ssh/io.ts'\n\nexport const SSH_OPS: readonly RegisteredOp[] = makeGenericOps(ResourceName.SSH, SSH_IO, {\n mkdirParents: true,\n forwardIndex: false,\n})\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nexport const SSH_PROMPT = `{prefix}\n Remote filesystem via SSH/SFTP.\n IMPORTANT: This is a remote mount. Prefer targeted reads over full scans.\n Supports: ls, cat, head, tail, grep, rg, wc, find, tree, stat, mkdir, touch, cp, mv, rm, tee.`\n"],"mappings":"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","names":["ResourceName","mountPrefixOf","ResourceName","enoent","enoent","enoent","rstripSlash","invalidateAfterWrite","invalidateAfterWrite","norm","readRemoteDir","statRemote","invalidateAfterWrite","enoent","statRemote","invalidateAfterWrite","enoent","mountPrefixOf","stripSlash","invalidateAfterWrite","enoent","enoent","invalidateAfterWrite","enoent","invalidateAfterUnlink","statRemote","enoent","invalidateAfterUnlink","enoent","invalidateAfterUnlink","enoent","invalidateAfterUnlink","invalidateAfterUnlink","enoent","enoent","invalidateAfterUnlink","ResourceName","ResourceName","ResourceName","ResourceName","mountPrefixOf"]}
@@ -24,8 +24,7 @@ function normalizeLangfuseConfig(input) {
24
24
  }
25
25
 
26
26
  export {
27
- LangfuseConfigSchema,
28
27
  redactLangfuseConfig,
29
28
  normalizeLangfuseConfig
30
29
  };
31
- //# sourceMappingURL=chunk-VGLHY6BK.js.map
30
+ //# sourceMappingURL=chunk-AULFV3KY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/langfuse/config.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { normalizeFields, redactConfigWithSchema, secretStr, z } from '@struktoai/mirage-core'\n\nexport interface LangfuseConfig {\n publicKey: string\n secretKey: string\n host?: string\n defaultTraceLimit?: number\n defaultSearchLimit?: number\n defaultFromTimestamp?: string\n}\n\nexport interface LangfuseConfigRedacted {\n publicKey: string\n secretKey: '<REDACTED>'\n host?: string\n defaultTraceLimit?: number\n defaultSearchLimit?: number\n defaultFromTimestamp?: string\n}\n\nconst LangfuseConfigSchema = z.object({\n publicKey: z.string(),\n secretKey: secretStr(),\n host: z.string().optional(),\n defaultTraceLimit: z.number().optional(),\n defaultSearchLimit: z.number().optional(),\n defaultFromTimestamp: z.string().optional(),\n})\n\nexport function redactLangfuseConfig(config: LangfuseConfig): LangfuseConfigRedacted {\n return redactConfigWithSchema(LangfuseConfigSchema, config) as unknown as LangfuseConfigRedacted\n}\n\nexport function normalizeLangfuseConfig(input: Record<string, unknown>): LangfuseConfig {\n return normalizeFields(input, {\n rename: {\n public_key: 'publicKey',\n secret_key: 'secretKey',\n default_trace_limit: 'defaultTraceLimit',\n default_search_limit: 'defaultSearchLimit',\n default_from_timestamp: 'defaultFromTimestamp',\n },\n }) as unknown as LangfuseConfig\n}\n"],"mappings":";AAcA,SAAS,iBAAiB,wBAAwB,WAAW,SAAS;AAoBtE,IAAM,uBAAuB,EAAE,OAAO;AAAA,EACpC,WAAW,EAAE,OAAO;AAAA,EACpB,WAAW,UAAU;AAAA,EACrB,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,EACxC,sBAAsB,EAAE,OAAO,EAAE,SAAS;AAC5C,CAAC;AAEM,SAAS,qBAAqB,QAAgD;AACnF,SAAO,uBAAuB,sBAAsB,MAAM;AAC5D;AAEO,SAAS,wBAAwB,OAAgD;AACtF,SAAO,gBAAgB,OAAO;AAAA,IAC5B,QAAQ;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,qBAAqB;AAAA,MACrB,sBAAsB;AAAA,MACtB,wBAAwB;AAAA,IAC1B;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -1,22 +1,25 @@
1
1
  import {
2
2
  redactBoxConfig
3
- } from "./chunk-OZAEWZZ3.js";
3
+ } from "./chunk-XFSEADPC.js";
4
4
 
5
5
  // src/resource/box/box.ts
6
6
  import {
7
- BaseResource,
8
7
  BOX_COMMANDS,
9
8
  BOX_PROMPT,
10
- BOX_VFS_OPS,
9
+ BOX_OPS,
10
+ BaseResource,
11
11
  BoxAccessor,
12
12
  BoxTokenManager,
13
13
  PathSpec,
14
14
  ResourceName,
15
15
  boxRead,
16
16
  boxReaddir,
17
- boxResolveGlob,
18
- boxStat
17
+ makeResolveGlob,
18
+ boxStat,
19
+ mountKey,
20
+ mountPrefixOf
19
21
  } from "@struktoai/mirage-core";
22
+ var boxResolveGlob = makeResolveGlob(boxReaddir);
20
23
  var BoxResource = class extends BaseResource {
21
24
  kind = ResourceName.BOX;
22
25
  cachesReads = true;
@@ -28,6 +31,7 @@ var BoxResource = class extends BaseResource {
28
31
  super();
29
32
  this.config = config;
30
33
  const tm = new BoxTokenManager({
34
+ ...config.endpoint !== void 0 ? { endpoint: config.endpoint } : {},
31
35
  ...config.clientId !== void 0 ? { clientId: config.clientId } : {},
32
36
  ...config.clientSecret !== void 0 ? { clientSecret: config.clientSecret } : {},
33
37
  ...config.refreshToken !== void 0 ? { refreshToken: config.refreshToken } : {},
@@ -36,7 +40,11 @@ var BoxResource = class extends BaseResource {
36
40
  ...config.refreshFn !== void 0 ? { refreshFn: config.refreshFn } : {},
37
41
  ...config.onRefreshTokenRotated !== void 0 ? { onRefreshTokenRotated: config.onRefreshTokenRotated } : {}
38
42
  });
39
- this.accessor = new BoxAccessor({ tokenManager: tm });
43
+ this.accessor = new BoxAccessor({
44
+ tokenManager: tm,
45
+ ...config.rootFolderId !== void 0 ? { rootFolderId: config.rootFolderId } : {},
46
+ ...config.contentSearch !== void 0 ? { contentSearch: config.contentSearch } : {}
47
+ });
40
48
  }
41
49
  open() {
42
50
  return Promise.resolve();
@@ -48,7 +56,7 @@ var BoxResource = class extends BaseResource {
48
56
  return BOX_COMMANDS;
49
57
  }
50
58
  ops() {
51
- return BOX_VFS_OPS;
59
+ return BOX_OPS;
52
60
  }
53
61
  readFile(p) {
54
62
  return boxRead(this.accessor, p, this.index);
@@ -59,18 +67,14 @@ var BoxResource = class extends BaseResource {
59
67
  stat(p) {
60
68
  return boxStat(this.accessor, p, this.index);
61
69
  }
62
- async fingerprint(p) {
63
- const lookup = await this.index.get(p.original);
64
- return lookup.entry?.remoteTime ?? null;
65
- }
66
70
  glob(paths, prefix = "") {
67
71
  const effective = prefix !== "" ? paths.map(
68
- (p) => p.prefix !== "" ? p : new PathSpec({
69
- original: p.original,
72
+ (p) => mountPrefixOf(p.virtual, p.resourcePath) !== "" ? p : new PathSpec({
73
+ virtual: p.virtual,
70
74
  directory: p.directory,
71
75
  ...p.pattern !== null ? { pattern: p.pattern } : {},
72
76
  resolved: p.resolved,
73
- prefix
77
+ resourcePath: mountKey(p.virtual, prefix)
74
78
  })
75
79
  ) : paths;
76
80
  return boxResolveGlob(this.accessor, effective, this.index);
@@ -89,4 +93,4 @@ var BoxResource = class extends BaseResource {
89
93
  export {
90
94
  BoxResource
91
95
  };
92
- //# sourceMappingURL=chunk-VWKUT4CW.js.map
96
+ //# sourceMappingURL=chunk-BWLUBJQG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/box/box.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n BOX_COMMANDS,\n BOX_PROMPT,\n BOX_OPS,\n BaseResource,\n BoxAccessor,\n BoxTokenManager,\n PathSpec,\n ResourceName,\n boxRead,\n boxReaddir,\n makeResolveGlob,\n boxStat,\n mountKey,\n mountPrefixOf,\n type FileStat,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n} from '@struktoai/mirage-core'\nimport { redactBoxConfig, type BoxConfig, type BoxConfigRedacted } from './config.ts'\n\nconst boxResolveGlob = makeResolveGlob(boxReaddir)\n\nexport interface BoxResourceState {\n type: string\n config: BoxConfigRedacted\n}\n\nexport class BoxResource extends BaseResource implements Resource {\n readonly kind: string = ResourceName.BOX\n readonly cachesReads: boolean = true\n override readonly indexTtl: number = 86_400\n readonly prompt: string = BOX_PROMPT\n readonly config: BoxConfig\n readonly accessor: BoxAccessor\n\n constructor(config: BoxConfig) {\n super()\n this.config = config\n const tm = new BoxTokenManager({\n ...(config.endpoint !== undefined ? { endpoint: config.endpoint } : {}),\n ...(config.clientId !== undefined ? { clientId: config.clientId } : {}),\n ...(config.clientSecret !== undefined ? { clientSecret: config.clientSecret } : {}),\n ...(config.refreshToken !== undefined ? { refreshToken: config.refreshToken } : {}),\n ...(config.enterpriseId !== undefined ? { enterpriseId: config.enterpriseId } : {}),\n ...(config.accessToken !== undefined ? { accessToken: config.accessToken } : {}),\n ...(config.refreshFn !== undefined ? { refreshFn: config.refreshFn } : {}),\n ...(config.onRefreshTokenRotated !== undefined\n ? { onRefreshTokenRotated: config.onRefreshTokenRotated }\n : {}),\n })\n this.accessor = new BoxAccessor({\n tokenManager: tm,\n ...(config.rootFolderId !== undefined ? { rootFolderId: config.rootFolderId } : {}),\n ...(config.contentSearch !== undefined ? { contentSearch: config.contentSearch } : {}),\n })\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n close(): Promise<void> {\n return Promise.resolve()\n }\n\n commands(): readonly RegisteredCommand[] {\n return BOX_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return BOX_OPS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return boxRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return boxReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return boxStat(this.accessor, p, this.index)\n }\n\n glob(paths: readonly PathSpec[], prefix = ''): Promise<PathSpec[]> {\n const effective =\n prefix !== ''\n ? paths.map((p) =>\n mountPrefixOf(p.virtual, p.resourcePath) !== ''\n ? p\n : new PathSpec({\n virtual: p.virtual,\n directory: p.directory,\n ...(p.pattern !== null ? { pattern: p.pattern } : {}),\n resolved: p.resolved,\n resourcePath: mountKey(p.virtual, prefix),\n }),\n )\n : paths\n return boxResolveGlob(this.accessor, effective, this.index)\n }\n\n getState(): Promise<BoxResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactBoxConfig(this.config),\n })\n }\n\n loadState(_state: BoxResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  HfResource,
3
3
  HfSpacesAccessor
4
- } from "./chunk-TURD42QO.js";
4
+ } from "./chunk-HEDE2377.js";
5
5
  import {
6
6
  assertHfRepoId,
7
7
  redactHfRepoConfig
8
- } from "./chunk-EGB7V74Z.js";
8
+ } from "./chunk-KAWDDS27.js";
9
9
 
10
10
  // src/resource/hf_spaces/hf_spaces.ts
11
11
  import { normalizeKeyPrefix, ResourceName } from "@struktoai/mirage-core";
@@ -47,4 +47,4 @@ export {
47
47
  HF_SPACES_PROMPT,
48
48
  HfSpacesResource
49
49
  };
50
- //# sourceMappingURL=chunk-X5HF2OFP.js.map
50
+ //# sourceMappingURL=chunk-BWWU5T2D.js.map
@@ -0,0 +1,39 @@
1
+ // src/resource/gridfs/config.ts
2
+ import {
3
+ normalizeFields,
4
+ normalizeKeyPrefix,
5
+ redactConfigWithSchema,
6
+ secretStr,
7
+ z
8
+ } from "@struktoai/mirage-core";
9
+ var GridFSConfigSchema = z.object({
10
+ uri: secretStr(),
11
+ database: z.string(),
12
+ bucket: z.string().optional(),
13
+ keyPrefix: z.string().optional(),
14
+ chunkSizeBytes: z.number().optional()
15
+ });
16
+ function redactConfig(config) {
17
+ return redactConfigWithSchema(GridFSConfigSchema, config);
18
+ }
19
+ function normalizeGridFSConfig(input) {
20
+ const norm = normalizeFields(input, {
21
+ rename: {
22
+ key_prefix: "keyPrefix",
23
+ chunk_size_bytes: "chunkSizeBytes"
24
+ }
25
+ });
26
+ const prefix = normalizeKeyPrefix(norm.keyPrefix);
27
+ if (prefix !== void 0) {
28
+ norm.keyPrefix = prefix;
29
+ } else {
30
+ delete norm.keyPrefix;
31
+ }
32
+ return norm;
33
+ }
34
+
35
+ export {
36
+ redactConfig,
37
+ normalizeGridFSConfig
38
+ };
39
+ //# sourceMappingURL=chunk-C7TNKIK5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/gridfs/config.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n normalizeFields,\n normalizeKeyPrefix,\n redactConfigWithSchema,\n secretStr,\n z,\n} from '@struktoai/mirage-core'\n\nexport interface GridFSConfig {\n uri: string\n database: string\n bucket?: string\n keyPrefix?: string\n chunkSizeBytes?: number\n}\n\nconst GridFSConfigSchema = z.object({\n uri: secretStr(),\n database: z.string(),\n bucket: z.string().optional(),\n keyPrefix: z.string().optional(),\n chunkSizeBytes: z.number().optional(),\n})\n\nexport interface GridFSConfigRedacted extends Omit<GridFSConfig, 'uri'> {\n uri?: string\n}\n\nexport function redactConfig(config: GridFSConfig): GridFSConfigRedacted {\n return redactConfigWithSchema(GridFSConfigSchema, config) as unknown as GridFSConfigRedacted\n}\n\n/**\n * Translate Python-style snake_case keys (as used in YAML configs and the\n * Python `GridFSConfig`) to the TS-idiomatic camelCase fields, and\n * normalize the key prefix the way the accessor expects.\n */\nexport function normalizeGridFSConfig(input: Record<string, unknown>): GridFSConfig {\n const norm = normalizeFields(input, {\n rename: {\n key_prefix: 'keyPrefix',\n chunk_size_bytes: 'chunkSizeBytes',\n },\n }) as unknown as GridFSConfig\n const prefix = normalizeKeyPrefix(norm.keyPrefix)\n if (prefix !== undefined) {\n norm.keyPrefix = prefix\n } else {\n delete norm.keyPrefix\n }\n return norm\n}\n"],"mappings":";AAcA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAUP,IAAM,qBAAqB,EAAE,OAAO;AAAA,EAClC,KAAK,UAAU;AAAA,EACf,UAAU,EAAE,OAAO;AAAA,EACnB,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,gBAAgB,EAAE,OAAO,EAAE,SAAS;AACtC,CAAC;AAMM,SAAS,aAAa,QAA4C;AACvE,SAAO,uBAAuB,oBAAoB,MAAM;AAC1D;AAOO,SAAS,sBAAsB,OAA8C;AAClF,QAAM,OAAO,gBAAgB,OAAO;AAAA,IAClC,QAAQ;AAAA,MACN,YAAY;AAAA,MACZ,kBAAkB;AAAA,IACpB;AAAA,EACF,CAAC;AACD,QAAM,SAAS,mBAAmB,KAAK,SAAS;AAChD,MAAI,WAAW,QAAW;AACxB,SAAK,YAAY;AAAA,EACnB,OAAO;AACL,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AACT;","names":[]}
@@ -1,23 +1,26 @@
1
1
  import {
2
2
  redactGoogleConfig
3
- } from "./chunk-54NTYJEO.js";
3
+ } from "./chunk-LPDLPRPS.js";
4
4
 
5
5
  // src/resource/gmail/gmail.ts
6
6
  import {
7
7
  BaseResource,
8
8
  GMAIL_COMMANDS,
9
9
  GMAIL_PROMPT,
10
+ GMAIL_OPS,
10
11
  GMAIL_WRITE_PROMPT,
11
- GMAIL_VFS_OPS,
12
12
  GmailAccessor,
13
13
  PathSpec,
14
14
  ResourceName,
15
15
  TokenManager,
16
16
  gmailRead,
17
17
  gmailReaddir,
18
- gmailResolveGlob,
19
- gmailStat
18
+ makeResolveGlob,
19
+ gmailStat,
20
+ mountKey,
21
+ mountPrefixOf
20
22
  } from "@struktoai/mirage-core";
23
+ var gmailResolveGlob = makeResolveGlob(gmailReaddir);
21
24
  var GmailResource = class extends BaseResource {
22
25
  kind = ResourceName.GMAIL;
23
26
  cachesReads = true;
@@ -42,7 +45,7 @@ var GmailResource = class extends BaseResource {
42
45
  return GMAIL_COMMANDS;
43
46
  }
44
47
  ops() {
45
- return GMAIL_VFS_OPS;
48
+ return GMAIL_OPS;
46
49
  }
47
50
  readFile(p) {
48
51
  return gmailRead(this.accessor, p, this.index);
@@ -53,18 +56,14 @@ var GmailResource = class extends BaseResource {
53
56
  stat(p) {
54
57
  return gmailStat(this.accessor, p, this.index);
55
58
  }
56
- async fingerprint(p) {
57
- const lookup = await this.index.get(p.original);
58
- return lookup.entry?.remoteTime ?? null;
59
- }
60
59
  glob(paths, prefix = "") {
61
60
  const effective = prefix !== "" ? paths.map(
62
- (p) => p.prefix !== "" ? p : new PathSpec({
63
- original: p.original,
61
+ (p) => mountPrefixOf(p.virtual, p.resourcePath) !== "" ? p : new PathSpec({
62
+ virtual: p.virtual,
64
63
  directory: p.directory,
65
64
  ...p.pattern !== null ? { pattern: p.pattern } : {},
66
65
  resolved: p.resolved,
67
- prefix
66
+ resourcePath: mountKey(p.virtual, prefix)
68
67
  })
69
68
  ) : paths;
70
69
  return gmailResolveGlob(this.accessor, effective, this.index);
@@ -83,4 +82,4 @@ var GmailResource = class extends BaseResource {
83
82
  export {
84
83
  GmailResource
85
84
  };
86
- //# sourceMappingURL=chunk-MPCCRRE6.js.map
85
+ //# sourceMappingURL=chunk-CB76WPUS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/gmail/gmail.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n BaseResource,\n GMAIL_COMMANDS,\n GMAIL_PROMPT,\n GMAIL_OPS,\n GMAIL_WRITE_PROMPT,\n GmailAccessor,\n PathSpec,\n ResourceName,\n TokenManager,\n gmailRead,\n gmailReaddir,\n makeResolveGlob,\n gmailStat,\n mountKey,\n mountPrefixOf,\n type FileStat,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n} from '@struktoai/mirage-core'\nimport { redactGmailConfig, type GmailConfig, type GmailConfigRedacted } from './config.ts'\n\nconst gmailResolveGlob = makeResolveGlob(gmailReaddir)\n\nexport interface GmailResourceState {\n type: string\n config: GmailConfigRedacted\n}\n\nexport class GmailResource extends BaseResource implements Resource {\n readonly kind: string = ResourceName.GMAIL\n readonly cachesReads: boolean = true\n override readonly indexTtl: number = 86_400\n readonly prompt: string = GMAIL_PROMPT\n readonly writePrompt: string = GMAIL_WRITE_PROMPT\n readonly config: GmailConfig\n readonly accessor: GmailAccessor\n\n constructor(config: GmailConfig) {\n super()\n this.config = config\n const tm = new TokenManager(config)\n this.accessor = new GmailAccessor({ tokenManager: tm })\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n close(): Promise<void> {\n return Promise.resolve()\n }\n\n commands(): readonly RegisteredCommand[] {\n return GMAIL_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return GMAIL_OPS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return gmailRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return gmailReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return gmailStat(this.accessor, p, this.index)\n }\n\n glob(paths: readonly PathSpec[], prefix = ''): Promise<PathSpec[]> {\n const effective =\n prefix !== ''\n ? paths.map((p) =>\n mountPrefixOf(p.virtual, p.resourcePath) !== ''\n ? p\n : new PathSpec({\n virtual: p.virtual,\n directory: p.directory,\n ...(p.pattern !== null ? { pattern: p.pattern } : {}),\n resolved: p.resolved,\n resourcePath: mountKey(p.virtual, prefix),\n }),\n )\n : paths\n return gmailResolveGlob(this.accessor, effective, this.index)\n }\n\n getState(): Promise<GmailResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactGmailConfig(this.config),\n })\n }\n\n loadState(_state: GmailResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n"],"mappings":";;;;;AAcA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAKK;AAGP,IAAM,mBAAmB,gBAAgB,YAAY;AAO9C,IAAM,gBAAN,cAA4B,aAAiC;AAAA,EACzD,OAAe,aAAa;AAAA,EAC5B,cAAuB;AAAA,EACd,WAAmB;AAAA,EAC5B,SAAiB;AAAA,EACjB,cAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EAET,YAAY,QAAqB;AAC/B,UAAM;AACN,SAAK,SAAS;AACd,UAAM,KAAK,IAAI,aAAa,MAAM;AAClC,SAAK,WAAW,IAAI,cAAc,EAAE,cAAc,GAAG,CAAC;AAAA,EACxD;AAAA,EAEA,OAAsB;AACpB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,QAAuB;AACrB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,WAAyC;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,MAA+B;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,GAAkC;AACzC,WAAO,UAAU,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EAC/C;AAAA,EAEA,QAAQ,GAAgC;AACtC,WAAO,aAAa,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EAClD;AAAA,EAEA,KAAK,GAAgC;AACnC,WAAO,UAAU,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EAC/C;AAAA,EAEA,KAAK,OAA4B,SAAS,IAAyB;AACjE,UAAM,YACJ,WAAW,KACP,MAAM;AAAA,MAAI,CAAC,MACT,cAAc,EAAE,SAAS,EAAE,YAAY,MAAM,KACzC,IACA,IAAI,SAAS;AAAA,QACX,SAAS,EAAE;AAAA,QACX,WAAW,EAAE;AAAA,QACb,GAAI,EAAE,YAAY,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,QACnD,UAAU,EAAE;AAAA,QACZ,cAAc,SAAS,EAAE,SAAS,MAAM;AAAA,MAC1C,CAAC;AAAA,IACP,IACA;AACN,WAAO,iBAAiB,KAAK,UAAU,WAAW,KAAK,KAAK;AAAA,EAC9D;AAAA,EAEA,WAAwC;AACtC,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,mBAAkB,KAAK,MAAM;AAAA,IACvC,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,QAA2C;AACnD,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}