@struktoai/mirage-node 0.0.3 → 0.0.5-alpha.1
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.
- package/README.md +2 -1
- package/dist/aliyun-S62BR3TB.js +11 -0
- package/dist/append.lua +17 -0
- package/dist/backblaze-4EKSW63F.js +11 -0
- package/dist/box-ZPLZAGMK.js +8 -0
- package/dist/cas.lua +15 -0
- package/dist/ceph-ALKLD3MO.js +11 -0
- package/dist/{chunk-QCZ2XUKH.js → chunk-2A4YGVBM.js} +16 -23
- package/dist/chunk-2A4YGVBM.js.map +1 -0
- package/dist/chunk-2HCYLVGY.js +28 -0
- package/dist/chunk-2HCYLVGY.js.map +1 -0
- package/dist/chunk-2VPZAH5Q.js +20 -0
- package/dist/chunk-2VPZAH5Q.js.map +1 -0
- package/dist/{chunk-UT2OPSN4.js → chunk-3JZQ6VSZ.js} +5 -5
- package/dist/chunk-3JZQ6VSZ.js.map +1 -0
- package/dist/chunk-4IF4TGAI.js +11 -0
- package/dist/chunk-4IF4TGAI.js.map +1 -0
- package/dist/{chunk-47AVIIOT.js → chunk-5H6KNEPP.js} +4 -5
- package/dist/{chunk-47AVIIOT.js.map → chunk-5H6KNEPP.js.map} +1 -1
- package/dist/{chunk-I5THIMPP.js → chunk-5K2MWDCE.js} +6 -7
- package/dist/{chunk-I5THIMPP.js.map → chunk-5K2MWDCE.js.map} +1 -1
- package/dist/{chunk-3WIO7NBR.js → chunk-6SVXWRKX.js} +4 -5
- package/dist/{chunk-3WIO7NBR.js.map → chunk-6SVXWRKX.js.map} +1 -1
- package/dist/{chunk-RQK5UPMP.js → chunk-6VOIUGAD.js} +25 -12
- package/dist/chunk-6VOIUGAD.js.map +1 -0
- package/dist/{chunk-NOHWIBRX.js → chunk-7JYHFXXC.js} +15 -20
- package/dist/chunk-7JYHFXXC.js.map +1 -0
- package/dist/chunk-7VQQFWV6.js +20 -0
- package/dist/chunk-7VQQFWV6.js.map +1 -0
- package/dist/chunk-7ZP6TPHX.js +87 -0
- package/dist/chunk-7ZP6TPHX.js.map +1 -0
- package/dist/{chunk-SWCDFEUK.js → chunk-ADEXNSYU.js} +20 -22
- package/dist/chunk-ADEXNSYU.js.map +1 -0
- package/dist/chunk-AQSYAXL4.js +16 -0
- package/dist/chunk-AQSYAXL4.js.map +1 -0
- package/dist/{chunk-RO5IQEDQ.js → chunk-ATLXMNKD.js} +8 -4
- package/dist/chunk-ATLXMNKD.js.map +1 -0
- package/dist/{chunk-MPCCRRE6.js → chunk-BYCUGFRF.js} +16 -16
- package/dist/chunk-BYCUGFRF.js.map +1 -0
- package/dist/{chunk-HJJMP6IX.js → chunk-BZTVYOES.js} +3 -3
- package/dist/{chunk-B2ZOKNN4.js → chunk-CRC4YWXB.js} +27 -9
- package/dist/chunk-CRC4YWXB.js.map +1 -0
- package/dist/chunk-CTGXJHO5.js +39 -0
- package/dist/chunk-CTGXJHO5.js.map +1 -0
- package/dist/{chunk-Q2IAILVC.js → chunk-DCDBIXVZ.js} +14 -5
- package/dist/chunk-DCDBIXVZ.js.map +1 -0
- package/dist/chunk-DDAFNROK.js +750 -0
- package/dist/chunk-DDAFNROK.js.map +1 -0
- package/dist/chunk-DQIEWEAW.js +85 -0
- package/dist/chunk-DQIEWEAW.js.map +1 -0
- package/dist/{chunk-QGRDPSAH.js → chunk-EBI4IHDC.js} +23 -12
- package/dist/chunk-EBI4IHDC.js.map +1 -0
- package/dist/{chunk-JAGJTM3Q.js → chunk-EIUTZ6N7.js} +19 -34
- package/dist/chunk-EIUTZ6N7.js.map +1 -0
- package/dist/{chunk-TA3WMOMU.js → chunk-EJZG5VUF.js} +38 -32
- package/dist/chunk-EJZG5VUF.js.map +1 -0
- package/dist/{chunk-X5HF2OFP.js → chunk-ENW5BVYN.js} +3 -3
- package/dist/{chunk-HGCRXJGP.js → chunk-ETIAW4YD.js} +3 -3
- package/dist/chunk-EUPXAYPB.js +20 -0
- package/dist/chunk-EUPXAYPB.js.map +1 -0
- package/dist/{chunk-YAHRT6MB.js → chunk-FA6YNU75.js} +4 -5
- package/dist/{chunk-YAHRT6MB.js.map → chunk-FA6YNU75.js.map} +1 -1
- package/dist/{chunk-TWGVQLG2.js → chunk-FFH6R5VQ.js} +7 -3
- package/dist/chunk-FFH6R5VQ.js.map +1 -0
- package/dist/{chunk-JCC4CU2I.js → chunk-GE6H2COM.js} +15 -23
- package/dist/chunk-GE6H2COM.js.map +1 -0
- package/dist/{chunk-DM4GSE26.js → chunk-GMMQ3ZK4.js} +3 -3
- package/dist/{chunk-ZEGAMJO2.js → chunk-GSGE3M5P.js} +15 -23
- package/dist/chunk-GSGE3M5P.js.map +1 -0
- package/dist/{chunk-GCFYZSVR.js → chunk-H64SB6VO.js} +32 -13
- package/dist/chunk-H64SB6VO.js.map +1 -0
- package/dist/{chunk-N5FSLVKO.js → chunk-HCRYAFBI.js} +3 -3
- package/dist/{chunk-IDYHQQOH.js → chunk-HOPUP6LA.js} +358 -471
- package/dist/chunk-HOPUP6LA.js.map +1 -0
- package/dist/chunk-HS24BL6W.js +160 -0
- package/dist/chunk-HS24BL6W.js.map +1 -0
- package/dist/chunk-HVYVG5KQ.js +16 -0
- package/dist/chunk-HVYVG5KQ.js.map +1 -0
- package/dist/{chunk-FQ33BYFR.js → chunk-I7CPLZNW.js} +4 -5
- package/dist/{chunk-FQ33BYFR.js.map → chunk-I7CPLZNW.js.map} +1 -1
- package/dist/{chunk-VGLHY6BK.js → chunk-IFUCGI4I.js} +7 -3
- package/dist/chunk-IFUCGI4I.js.map +1 -0
- package/dist/{chunk-RNQN2FOU.js → chunk-IFYXSSKR.js} +24 -13
- package/dist/chunk-IFYXSSKR.js.map +1 -0
- package/dist/chunk-IXA4DQE4.js +20 -0
- package/dist/chunk-IXA4DQE4.js.map +1 -0
- package/dist/chunk-IZMKMD3O.js +11 -0
- package/dist/chunk-IZMKMD3O.js.map +1 -0
- package/dist/{chunk-7CW3BMPH.js → chunk-JJERW2BI.js} +4 -5
- package/dist/{chunk-7CW3BMPH.js.map → chunk-JJERW2BI.js.map} +1 -1
- package/dist/{chunk-EM4J5EQS.js → chunk-JQR4HVUX.js} +13 -16
- package/dist/chunk-JQR4HVUX.js.map +1 -0
- package/dist/{chunk-VWKUT4CW.js → chunk-JXOMDLFS.js} +21 -26
- package/dist/chunk-JXOMDLFS.js.map +1 -0
- package/dist/chunk-KIX6N7NT.js +1001 -0
- package/dist/chunk-KIX6N7NT.js.map +1 -0
- package/dist/{chunk-OZAEWZZ3.js → chunk-L42UTDFK.js} +12 -3
- package/dist/chunk-L42UTDFK.js.map +1 -0
- package/dist/{chunk-54NTYJEO.js → chunk-LPDLPRPS.js} +1 -3
- package/dist/{chunk-54NTYJEO.js.map → chunk-LPDLPRPS.js.map} +1 -1
- package/dist/chunk-M2UF2JHJ.js +11 -0
- package/dist/chunk-M2UF2JHJ.js.map +1 -0
- package/dist/{chunk-UGK4TAVK.js → chunk-MONC734W.js} +7 -3
- package/dist/chunk-MONC734W.js.map +1 -0
- package/dist/{chunk-IK2L4EN3.js → chunk-N72RLCMU.js} +4 -5
- package/dist/{chunk-IK2L4EN3.js.map → chunk-N72RLCMU.js.map} +1 -1
- package/dist/{chunk-H3I2KZIY.js → chunk-ND4IWJ4V.js} +7 -3
- package/dist/chunk-ND4IWJ4V.js.map +1 -0
- package/dist/chunk-NZ3EKGW4.js +1312 -0
- package/dist/chunk-NZ3EKGW4.js.map +1 -0
- package/dist/{chunk-XGJ2QERC.js → chunk-OAE57MNL.js} +27 -11
- package/dist/chunk-OAE57MNL.js.map +1 -0
- package/dist/{chunk-EZQ5HBAC.js → chunk-OHKGIQB4.js} +12 -16
- package/dist/chunk-OHKGIQB4.js.map +1 -0
- package/dist/{chunk-E2ISWXLB.js → chunk-OQKNDS66.js} +1 -1
- package/dist/{chunk-E2ISWXLB.js.map → chunk-OQKNDS66.js.map} +1 -1
- package/dist/{chunk-UINQOUZR.js → chunk-OXEQSPND.js} +3 -3
- package/dist/{chunk-A7IVFIOP.js → chunk-PKNE5J2B.js} +15 -23
- package/dist/chunk-PKNE5J2B.js.map +1 -0
- package/dist/chunk-PSXXEGYQ.js +16 -0
- package/dist/chunk-PSXXEGYQ.js.map +1 -0
- package/dist/{chunk-EGB7V74Z.js → chunk-QAOVABCR.js} +7 -4
- package/dist/chunk-QAOVABCR.js.map +1 -0
- package/dist/{chunk-X3G37FXT.js → chunk-QQ7FP4GD.js} +4 -5
- package/dist/{chunk-X3G37FXT.js.map → chunk-QQ7FP4GD.js.map} +1 -1
- package/dist/{chunk-WAR4Q2NM.js → chunk-QYLVMC6B.js} +13 -15
- package/dist/chunk-QYLVMC6B.js.map +1 -0
- package/dist/{chunk-KPULTUOK.js → chunk-RX3XR65X.js} +4 -5
- package/dist/{chunk-KPULTUOK.js.map → chunk-RX3XR65X.js.map} +1 -1
- package/dist/chunk-RYQJJB4C.js +30 -0
- package/dist/chunk-RYQJJB4C.js.map +1 -0
- package/dist/{chunk-QQBJC2FQ.js → chunk-TUF7TCN7.js} +4 -5
- package/dist/{chunk-QQBJC2FQ.js.map → chunk-TUF7TCN7.js.map} +1 -1
- package/dist/{chunk-AUHSTJJ3.js → chunk-TUX36JY5.js} +4 -5
- package/dist/{chunk-AUHSTJJ3.js.map → chunk-TUX36JY5.js.map} +1 -1
- package/dist/chunk-TWRQCQWU.js +1153 -0
- package/dist/chunk-TWRQCQWU.js.map +1 -0
- package/dist/chunk-U6DFQRG3.js +20 -0
- package/dist/chunk-U6DFQRG3.js.map +1 -0
- package/dist/chunk-VI5YTKNY.js +20 -0
- package/dist/chunk-VI5YTKNY.js.map +1 -0
- package/dist/chunk-WG5YS6TC.js +872 -0
- package/dist/chunk-WG5YS6TC.js.map +1 -0
- package/dist/{chunk-ZGSER5TG.js → chunk-WMJJ4WGF.js} +4 -5
- package/dist/{chunk-ZGSER5TG.js.map → chunk-WMJJ4WGF.js.map} +1 -1
- package/dist/{chunk-LV2G7VHL.js → chunk-WY4FNH42.js} +21 -18
- package/dist/chunk-WY4FNH42.js.map +1 -0
- package/dist/{chunk-LAJJPLEV.js → chunk-XIG5BWWH.js} +25 -12
- package/dist/chunk-XIG5BWWH.js.map +1 -0
- package/dist/chunk-XJBC3OYX.js +11 -0
- package/dist/chunk-XJBC3OYX.js.map +1 -0
- package/dist/{chunk-G2WCEUQL.js → chunk-XPRDXWK7.js} +21 -20
- package/dist/chunk-XPRDXWK7.js.map +1 -0
- package/dist/chunk-YKRQSZS7.js +96 -0
- package/dist/chunk-YKRQSZS7.js.map +1 -0
- package/dist/{chunk-M5FVUIYP.js → chunk-YMBL3VJB.js} +21 -19
- package/dist/chunk-YMBL3VJB.js.map +1 -0
- package/dist/chunk-YUJBXFYK.js +1205 -0
- package/dist/chunk-YUJBXFYK.js.map +1 -0
- package/dist/{chunk-JALIYI6M.js → chunk-YZ4ZJNOL.js} +28 -11
- package/dist/chunk-YZ4ZJNOL.js.map +1 -0
- package/dist/chunk-ZTHVEXIV.js +11 -0
- package/dist/chunk-ZTHVEXIV.js.map +1 -0
- package/dist/{chunk-GS5AUKUO.js → chunk-ZVSYUCYS.js} +11 -7
- package/dist/chunk-ZVSYUCYS.js.map +1 -0
- package/dist/{config-QAA646XB.js → config-2YBCHU2W.js} +2 -4
- package/dist/{config-IVY5EQQ2.js → config-3YRGRW72.js} +3 -4
- package/dist/config-4GSOMUMF.js +9 -0
- package/dist/config-5YBUWFUP.js +9 -0
- package/dist/{config-34LHOGLM.js → config-5ZRKJTKG.js} +3 -4
- package/dist/config-A25LTL5W.js +11 -0
- package/dist/config-CLU7JABG.js +9 -0
- package/dist/config-D2RF7L3N.js +9 -0
- package/dist/{config-LHFFXVYI.js → config-E55TKM6K.js} +2 -4
- package/dist/config-ELDOFRJW.js +9 -0
- package/dist/{config-GE4W4ZJC.js → config-FPC3RBFD.js} +2 -4
- package/dist/config-FPM3LAW7.js +9 -0
- package/dist/{config-HKRMKD76.js → config-G3F54CS4.js} +3 -4
- package/dist/config-G43HRUI3.js +9 -0
- package/dist/{config-WDAZFXYD.js → config-GG3WO5PB.js} +3 -4
- package/dist/config-JUYBWAZE.js +9 -0
- package/dist/{config-CVZ2AGCO.js → config-LJ5T6TVA.js} +2 -6
- package/dist/config-MDSAE4O3.js +11 -0
- package/dist/{config-EIHSP5DZ.js → config-NRIOKK5T.js} +2 -4
- package/dist/config-OYK2BSJK.js +9 -0
- package/dist/config-PB3KA2CE.js +9 -0
- package/dist/{config-ZFJYQZCH.js → config-QY4IL3PH.js} +3 -4
- package/dist/config-R4LAOEDS.js +9 -0
- package/dist/{config-QNMKWJ4M.js → config-RIAAD6RW.js} +3 -4
- package/dist/config-SYNEQAUB.js +9 -0
- package/dist/{config-Q45Y46YT.js → config-TJKGYA2B.js} +3 -4
- package/dist/{config-NV5WXP64.js → config-UU27ALAA.js} +2 -4
- package/dist/{config-3IVQJBNW.js → config-UURRGA7U.js} +2 -2
- package/dist/{config-VM526IKB.js → config-VPLHQXVE.js} +2 -4
- package/dist/config-WRACCRPN.js +9 -0
- package/dist/{config-GHRUKEQ6.js → config-WVHKXEVE.js} +3 -4
- package/dist/{config-EO23EY62.js → config-XU7R36IE.js} +3 -4
- package/dist/config-Y2KOUYSS.js +9 -0
- package/dist/databricks_volume-CNCPTZHS.js +7 -0
- package/dist/digitalocean-DJZOUB6Q.js +11 -0
- package/dist/discord-ETB2CADR.js +7 -0
- package/dist/disk-WEHSTK3F.js +7 -0
- package/dist/dropbox-XN6PGLNE.js +8 -0
- package/dist/email-OV7XCP3T.js +8 -0
- package/dist/gcal-P56MRCGU.js +8 -0
- package/dist/gcs-HFBIAE2C.js +10 -0
- package/dist/gdocs-LQ3UXP3J.js +8 -0
- package/dist/gdrive-N6UBYLON.js +8 -0
- package/dist/github-BPZREGPI.js +8 -0
- package/dist/github_ci-7A4LUIZ7.js +8 -0
- package/dist/gmail-YED2MF6H.js +8 -0
- package/dist/gridfs-CPLQ4G62.js +9 -0
- package/dist/gsheets-4BNIJPQ6.js +8 -0
- package/dist/gslides-GDBYLO5A.js +8 -0
- package/dist/hf_buckets-FTJITQ3P.js +10 -0
- package/dist/hf_datasets-6GXVKQD7.js +10 -0
- package/dist/hf_models-PJPGZAC5.js +10 -0
- package/dist/hf_spaces-LFNFOLBF.js +10 -0
- package/dist/index.d.ts +1311 -569
- package/dist/index.js +3359 -964
- package/dist/index.js.map +1 -1
- package/dist/jaeger-GCA6MJ6E.js +8 -0
- package/dist/lancedb-TJ5YSJY5.js +7 -0
- package/dist/langfuse-RUMTUMXS.js +8 -0
- package/dist/linear-BCE4KEAC.js +7 -0
- package/dist/minio-5SO6KBTK.js +11 -0
- package/dist/mongodb-L5CMN2EE.js +7 -0
- package/dist/nextcloud-4O2LZVW2.js +9 -0
- package/dist/notion-RVKEAQ2M.js +7 -0
- package/dist/oci-OQXOIC62.js +10 -0
- package/dist/postgres-AV45GNRS.js +7 -0
- package/dist/qingstor-W277YA4K.js +11 -0
- package/dist/r2-FUA4IORE.js +10 -0
- package/dist/redis-LPS357NF.js +8 -0
- package/dist/s3-FPNWWIVM.js +8 -0
- package/dist/scaleway-BP3732U7.js +11 -0
- package/dist/seaweedfs-MC6HIEP4.js +11 -0
- package/dist/slack-JFGW7VLN.js +7 -0
- package/dist/ssh-UYPG42LM.js +8 -0
- package/dist/ssh-UYPG42LM.js.map +1 -0
- package/dist/supabase-A3KUFMDC.js +10 -0
- package/dist/supabase-A3KUFMDC.js.map +1 -0
- package/dist/tencent-5464UQ2X.js +11 -0
- package/dist/tencent-5464UQ2X.js.map +1 -0
- package/dist/trello-O2KB3FUO.js +8 -0
- package/dist/trello-O2KB3FUO.js.map +1 -0
- package/dist/wasabi-2IKBIWNO.js +10 -0
- package/dist/wasabi-2IKBIWNO.js.map +1 -0
- package/package.json +17 -3
- package/dist/aliyun-JMJ3PFYY.js +0 -10
- package/dist/backblaze-TDFD23QO.js +0 -10
- package/dist/box-GQ2U2R6R.js +0 -8
- package/dist/ceph-S2VOYO6G.js +0 -10
- package/dist/chunk-2CC5VW7K.js +0 -52
- package/dist/chunk-2CC5VW7K.js.map +0 -1
- package/dist/chunk-A7IVFIOP.js.map +0 -1
- package/dist/chunk-B2ZOKNN4.js.map +0 -1
- package/dist/chunk-DNBAMB5J.js +0 -18
- package/dist/chunk-DNBAMB5J.js.map +0 -1
- package/dist/chunk-DP2PP5V2.js +0 -26
- package/dist/chunk-DP2PP5V2.js.map +0 -1
- package/dist/chunk-DYXEITK3.js +0 -52
- package/dist/chunk-DYXEITK3.js.map +0 -1
- package/dist/chunk-EGB7V74Z.js.map +0 -1
- package/dist/chunk-EM4J5EQS.js.map +0 -1
- package/dist/chunk-EZQ5HBAC.js.map +0 -1
- package/dist/chunk-G2WCEUQL.js.map +0 -1
- package/dist/chunk-GCFYZSVR.js.map +0 -1
- package/dist/chunk-GS5AUKUO.js.map +0 -1
- package/dist/chunk-H3BST2LI.js +0 -26
- package/dist/chunk-H3BST2LI.js.map +0 -1
- package/dist/chunk-H3I2KZIY.js.map +0 -1
- package/dist/chunk-IDYHQQOH.js.map +0 -1
- package/dist/chunk-JAGJTM3Q.js.map +0 -1
- package/dist/chunk-JALIYI6M.js.map +0 -1
- package/dist/chunk-JCC4CU2I.js.map +0 -1
- package/dist/chunk-JZT4QGIP.js +0 -24
- package/dist/chunk-JZT4QGIP.js.map +0 -1
- package/dist/chunk-LAJJPLEV.js.map +0 -1
- package/dist/chunk-LV2G7VHL.js.map +0 -1
- package/dist/chunk-LW25LMIH.js +0 -26
- package/dist/chunk-LW25LMIH.js.map +0 -1
- package/dist/chunk-M5FVUIYP.js.map +0 -1
- package/dist/chunk-MPCCRRE6.js.map +0 -1
- package/dist/chunk-NJMGCT63.js +0 -54
- package/dist/chunk-NJMGCT63.js.map +0 -1
- package/dist/chunk-NOHWIBRX.js.map +0 -1
- package/dist/chunk-OHROA3FQ.js +0 -54
- package/dist/chunk-OHROA3FQ.js.map +0 -1
- package/dist/chunk-OPYQ5KIO.js +0 -52
- package/dist/chunk-OPYQ5KIO.js.map +0 -1
- package/dist/chunk-OZAEWZZ3.js.map +0 -1
- package/dist/chunk-Q2IAILVC.js.map +0 -1
- package/dist/chunk-QCZ2XUKH.js.map +0 -1
- package/dist/chunk-QGRDPSAH.js.map +0 -1
- package/dist/chunk-RNQN2FOU.js.map +0 -1
- package/dist/chunk-RO5IQEDQ.js.map +0 -1
- package/dist/chunk-RQK5UPMP.js.map +0 -1
- package/dist/chunk-S5OVP467.js +0 -1795
- package/dist/chunk-S5OVP467.js.map +0 -1
- package/dist/chunk-SFUCUARB.js +0 -21
- package/dist/chunk-SFUCUARB.js.map +0 -1
- package/dist/chunk-SWCDFEUK.js.map +0 -1
- package/dist/chunk-TA3WMOMU.js.map +0 -1
- package/dist/chunk-TURD42QO.js +0 -1782
- package/dist/chunk-TURD42QO.js.map +0 -1
- package/dist/chunk-TWGVQLG2.js.map +0 -1
- package/dist/chunk-U6QSXTUS.js +0 -7
- package/dist/chunk-U6QSXTUS.js.map +0 -1
- package/dist/chunk-UGK4TAVK.js.map +0 -1
- package/dist/chunk-UT2OPSN4.js.map +0 -1
- package/dist/chunk-VGLHY6BK.js.map +0 -1
- package/dist/chunk-VWKUT4CW.js.map +0 -1
- package/dist/chunk-W7FLHT65.js +0 -26
- package/dist/chunk-W7FLHT65.js.map +0 -1
- package/dist/chunk-WAR4Q2NM.js.map +0 -1
- package/dist/chunk-WHFUWWI6.js +0 -2097
- package/dist/chunk-WHFUWWI6.js.map +0 -1
- package/dist/chunk-XGJ2QERC.js.map +0 -1
- package/dist/chunk-XHCBHYN4.js +0 -54
- package/dist/chunk-XHCBHYN4.js.map +0 -1
- package/dist/chunk-XLQI4IT2.js +0 -54
- package/dist/chunk-XLQI4IT2.js.map +0 -1
- package/dist/chunk-XWVDS66D.js +0 -963
- package/dist/chunk-XWVDS66D.js.map +0 -1
- package/dist/chunk-YGZMVNN5.js +0 -54
- package/dist/chunk-YGZMVNN5.js.map +0 -1
- package/dist/chunk-YUK3X3B4.js +0 -27
- package/dist/chunk-YUK3X3B4.js.map +0 -1
- package/dist/chunk-ZEGAMJO2.js.map +0 -1
- package/dist/chunk-ZNWVJ6UW.js +0 -54
- package/dist/chunk-ZNWVJ6UW.js.map +0 -1
- package/dist/config-3BBWD5AB.js +0 -11
- package/dist/config-4UDVSUQJ.js +0 -11
- package/dist/config-CMDBAPDH.js +0 -11
- package/dist/config-D3RLSPNF.js +0 -11
- package/dist/config-DG65OEG3.js +0 -11
- package/dist/config-GCQK6NJY.js +0 -11
- package/dist/config-GVH27UPE.js +0 -11
- package/dist/config-HXVYIXP5.js +0 -11
- package/dist/config-IDZMEW73.js +0 -11
- package/dist/config-IJJXGLBQ.js +0 -11
- package/dist/config-KJOLGVB2.js +0 -11
- package/dist/config-KMVCVBYN.js +0 -15
- package/dist/config-KYTRXAB2.js +0 -15
- package/dist/config-OT2TQQCN.js +0 -11
- package/dist/config-QWCY3LBQ.js +0 -11
- package/dist/config-ZV6G2ZEC.js +0 -11
- package/dist/databricks_volume-7XOUYSTY.js +0 -7
- package/dist/digitalocean-3CQ4CPPZ.js +0 -10
- package/dist/discord-BG7OSRJG.js +0 -8
- package/dist/disk-XVLBCVKE.js +0 -8
- package/dist/dropbox-74GYLV3R.js +0 -8
- package/dist/email-5IZ7OBQ4.js +0 -8
- package/dist/gcs-EMEYU2XT.js +0 -10
- package/dist/gdocs-R67TDPON.js +0 -8
- package/dist/gdrive-PRN2ALRK.js +0 -8
- package/dist/github-DV7E6OFV.js +0 -8
- package/dist/github_ci-Q554V5PA.js +0 -8
- package/dist/gmail-OLN2LT4O.js +0 -8
- package/dist/gsheets-H4RYMQJ5.js +0 -8
- package/dist/gslides-YLCHKJOM.js +0 -8
- package/dist/hf_buckets-DTKXKKFF.js +0 -10
- package/dist/hf_datasets-55C4APKR.js +0 -10
- package/dist/hf_models-RO5JR36V.js +0 -10
- package/dist/hf_spaces-ZVZ3EDRX.js +0 -10
- package/dist/langfuse-ACASJZ7O.js +0 -8
- package/dist/linear-IC37LZV7.js +0 -8
- package/dist/minio-HZ576XFQ.js +0 -10
- package/dist/mongodb-JVR62OIO.js +0 -7
- package/dist/notion-HKRPQMJS.js +0 -8
- package/dist/oci-ZLVECXTW.js +0 -10
- package/dist/postgres-P36Z2YN4.js +0 -7
- package/dist/qingstor-YLP6K3L4.js +0 -10
- package/dist/r2-RPK25ANI.js +0 -10
- package/dist/redis-V5ULXULL.js +0 -8
- package/dist/s3-4OIOCAAT.js +0 -8
- package/dist/scaleway-CCWCLUHB.js +0 -10
- package/dist/seaweedfs-QSWKF2FN.js +0 -10
- package/dist/slack-YPS7PII3.js +0 -8
- package/dist/ssh-YFP3SMTJ.js +0 -9
- package/dist/supabase-6CFTOKGZ.js +0 -10
- package/dist/tencent-IWZZOSQ4.js +0 -10
- package/dist/trello-XYKWZD6P.js +0 -8
- package/dist/wasabi-6Z4DC5S5.js +0 -10
- /package/dist/{aliyun-JMJ3PFYY.js.map → aliyun-S62BR3TB.js.map} +0 -0
- /package/dist/{backblaze-TDFD23QO.js.map → backblaze-4EKSW63F.js.map} +0 -0
- /package/dist/{box-GQ2U2R6R.js.map → box-ZPLZAGMK.js.map} +0 -0
- /package/dist/{ceph-S2VOYO6G.js.map → ceph-ALKLD3MO.js.map} +0 -0
- /package/dist/{chunk-HJJMP6IX.js.map → chunk-BZTVYOES.js.map} +0 -0
- /package/dist/{chunk-X5HF2OFP.js.map → chunk-ENW5BVYN.js.map} +0 -0
- /package/dist/{chunk-HGCRXJGP.js.map → chunk-ETIAW4YD.js.map} +0 -0
- /package/dist/{chunk-DM4GSE26.js.map → chunk-GMMQ3ZK4.js.map} +0 -0
- /package/dist/{chunk-N5FSLVKO.js.map → chunk-HCRYAFBI.js.map} +0 -0
- /package/dist/{chunk-UINQOUZR.js.map → chunk-OXEQSPND.js.map} +0 -0
- /package/dist/{config-34LHOGLM.js.map → config-2YBCHU2W.js.map} +0 -0
- /package/dist/{config-3BBWD5AB.js.map → config-3YRGRW72.js.map} +0 -0
- /package/dist/{config-3IVQJBNW.js.map → config-4GSOMUMF.js.map} +0 -0
- /package/dist/{config-4UDVSUQJ.js.map → config-5YBUWFUP.js.map} +0 -0
- /package/dist/{config-CMDBAPDH.js.map → config-5ZRKJTKG.js.map} +0 -0
- /package/dist/{config-CVZ2AGCO.js.map → config-A25LTL5W.js.map} +0 -0
- /package/dist/{config-D3RLSPNF.js.map → config-CLU7JABG.js.map} +0 -0
- /package/dist/{config-DG65OEG3.js.map → config-D2RF7L3N.js.map} +0 -0
- /package/dist/{config-EIHSP5DZ.js.map → config-E55TKM6K.js.map} +0 -0
- /package/dist/{config-EO23EY62.js.map → config-ELDOFRJW.js.map} +0 -0
- /package/dist/{config-GCQK6NJY.js.map → config-FPC3RBFD.js.map} +0 -0
- /package/dist/{config-GE4W4ZJC.js.map → config-FPM3LAW7.js.map} +0 -0
- /package/dist/{config-GHRUKEQ6.js.map → config-G3F54CS4.js.map} +0 -0
- /package/dist/{config-GVH27UPE.js.map → config-G43HRUI3.js.map} +0 -0
- /package/dist/{config-HKRMKD76.js.map → config-GG3WO5PB.js.map} +0 -0
- /package/dist/{config-HXVYIXP5.js.map → config-JUYBWAZE.js.map} +0 -0
- /package/dist/{config-IDZMEW73.js.map → config-LJ5T6TVA.js.map} +0 -0
- /package/dist/{config-IJJXGLBQ.js.map → config-MDSAE4O3.js.map} +0 -0
- /package/dist/{config-IVY5EQQ2.js.map → config-NRIOKK5T.js.map} +0 -0
- /package/dist/{config-KJOLGVB2.js.map → config-OYK2BSJK.js.map} +0 -0
- /package/dist/{config-KMVCVBYN.js.map → config-PB3KA2CE.js.map} +0 -0
- /package/dist/{config-KYTRXAB2.js.map → config-QY4IL3PH.js.map} +0 -0
- /package/dist/{config-LHFFXVYI.js.map → config-R4LAOEDS.js.map} +0 -0
- /package/dist/{config-NV5WXP64.js.map → config-RIAAD6RW.js.map} +0 -0
- /package/dist/{config-OT2TQQCN.js.map → config-SYNEQAUB.js.map} +0 -0
- /package/dist/{config-Q45Y46YT.js.map → config-TJKGYA2B.js.map} +0 -0
- /package/dist/{config-QAA646XB.js.map → config-UU27ALAA.js.map} +0 -0
- /package/dist/{config-QNMKWJ4M.js.map → config-UURRGA7U.js.map} +0 -0
- /package/dist/{config-QWCY3LBQ.js.map → config-VPLHQXVE.js.map} +0 -0
- /package/dist/{config-VM526IKB.js.map → config-WRACCRPN.js.map} +0 -0
- /package/dist/{config-WDAZFXYD.js.map → config-WVHKXEVE.js.map} +0 -0
- /package/dist/{config-ZFJYQZCH.js.map → config-XU7R36IE.js.map} +0 -0
- /package/dist/{config-ZV6G2ZEC.js.map → config-Y2KOUYSS.js.map} +0 -0
- /package/dist/{databricks_volume-7XOUYSTY.js.map → databricks_volume-CNCPTZHS.js.map} +0 -0
- /package/dist/{digitalocean-3CQ4CPPZ.js.map → digitalocean-DJZOUB6Q.js.map} +0 -0
- /package/dist/{discord-BG7OSRJG.js.map → discord-ETB2CADR.js.map} +0 -0
- /package/dist/{disk-XVLBCVKE.js.map → disk-WEHSTK3F.js.map} +0 -0
- /package/dist/{dropbox-74GYLV3R.js.map → dropbox-XN6PGLNE.js.map} +0 -0
- /package/dist/{email-5IZ7OBQ4.js.map → email-OV7XCP3T.js.map} +0 -0
- /package/dist/{gcs-EMEYU2XT.js.map → gcal-P56MRCGU.js.map} +0 -0
- /package/dist/{gdocs-R67TDPON.js.map → gcs-HFBIAE2C.js.map} +0 -0
- /package/dist/{gdrive-PRN2ALRK.js.map → gdocs-LQ3UXP3J.js.map} +0 -0
- /package/dist/{github-DV7E6OFV.js.map → gdrive-N6UBYLON.js.map} +0 -0
- /package/dist/{github_ci-Q554V5PA.js.map → github-BPZREGPI.js.map} +0 -0
- /package/dist/{gmail-OLN2LT4O.js.map → github_ci-7A4LUIZ7.js.map} +0 -0
- /package/dist/{gsheets-H4RYMQJ5.js.map → gmail-YED2MF6H.js.map} +0 -0
- /package/dist/{gslides-YLCHKJOM.js.map → gridfs-CPLQ4G62.js.map} +0 -0
- /package/dist/{hf_buckets-DTKXKKFF.js.map → gsheets-4BNIJPQ6.js.map} +0 -0
- /package/dist/{hf_datasets-55C4APKR.js.map → gslides-GDBYLO5A.js.map} +0 -0
- /package/dist/{hf_models-RO5JR36V.js.map → hf_buckets-FTJITQ3P.js.map} +0 -0
- /package/dist/{hf_spaces-ZVZ3EDRX.js.map → hf_datasets-6GXVKQD7.js.map} +0 -0
- /package/dist/{langfuse-ACASJZ7O.js.map → hf_models-PJPGZAC5.js.map} +0 -0
- /package/dist/{linear-IC37LZV7.js.map → hf_spaces-LFNFOLBF.js.map} +0 -0
- /package/dist/{minio-HZ576XFQ.js.map → jaeger-GCA6MJ6E.js.map} +0 -0
- /package/dist/{mongodb-JVR62OIO.js.map → lancedb-TJ5YSJY5.js.map} +0 -0
- /package/dist/{notion-HKRPQMJS.js.map → langfuse-RUMTUMXS.js.map} +0 -0
- /package/dist/{oci-ZLVECXTW.js.map → linear-BCE4KEAC.js.map} +0 -0
- /package/dist/{postgres-P36Z2YN4.js.map → minio-5SO6KBTK.js.map} +0 -0
- /package/dist/{qingstor-YLP6K3L4.js.map → mongodb-L5CMN2EE.js.map} +0 -0
- /package/dist/{r2-RPK25ANI.js.map → nextcloud-4O2LZVW2.js.map} +0 -0
- /package/dist/{redis-V5ULXULL.js.map → notion-RVKEAQ2M.js.map} +0 -0
- /package/dist/{s3-4OIOCAAT.js.map → oci-OQXOIC62.js.map} +0 -0
- /package/dist/{scaleway-CCWCLUHB.js.map → postgres-AV45GNRS.js.map} +0 -0
- /package/dist/{seaweedfs-QSWKF2FN.js.map → qingstor-W277YA4K.js.map} +0 -0
- /package/dist/{slack-YPS7PII3.js.map → r2-FUA4IORE.js.map} +0 -0
- /package/dist/{ssh-YFP3SMTJ.js.map → redis-LPS357NF.js.map} +0 -0
- /package/dist/{supabase-6CFTOKGZ.js.map → s3-FPNWWIVM.js.map} +0 -0
- /package/dist/{tencent-IWZZOSQ4.js.map → scaleway-BP3732U7.js.map} +0 -0
- /package/dist/{trello-XYKWZD6P.js.map → seaweedfs-MC6HIEP4.js.map} +0 -0
- /package/dist/{wasabi-6Z4DC5S5.js.map → slack-JFGW7VLN.js.map} +0 -0
|
@@ -0,0 +1,1001 @@
|
|
|
1
|
+
import {
|
|
2
|
+
redactSshConfig
|
|
3
|
+
} from "./chunk-MONC734W.js";
|
|
4
|
+
|
|
5
|
+
// src/resource/ssh/ssh.ts
|
|
6
|
+
import {
|
|
7
|
+
BaseResource,
|
|
8
|
+
PathSpec,
|
|
9
|
+
ResourceName as ResourceName4,
|
|
10
|
+
makeResolveGlob,
|
|
11
|
+
mountKey,
|
|
12
|
+
mountPrefixOf as mountPrefixOf3
|
|
13
|
+
} from "@struktoai/mirage-core";
|
|
14
|
+
|
|
15
|
+
// src/accessor/ssh.ts
|
|
16
|
+
import { Accessor } from "@struktoai/mirage-core";
|
|
17
|
+
import { homedir } from "os";
|
|
18
|
+
import { readFileSync } from "fs";
|
|
19
|
+
import { resolve } from "path";
|
|
20
|
+
function expandHome(p) {
|
|
21
|
+
if (p === "~") return homedir();
|
|
22
|
+
if (p.startsWith("~/")) return resolve(homedir(), p.slice(2));
|
|
23
|
+
return p;
|
|
24
|
+
}
|
|
25
|
+
var SSHAccessor = class extends Accessor {
|
|
26
|
+
constructor(config) {
|
|
27
|
+
super();
|
|
28
|
+
this.config = config;
|
|
29
|
+
}
|
|
30
|
+
config;
|
|
31
|
+
client = null;
|
|
32
|
+
sftpClient = null;
|
|
33
|
+
connectPromise = null;
|
|
34
|
+
async sftp() {
|
|
35
|
+
if (this.sftpClient !== null) return this.sftpClient;
|
|
36
|
+
if (this.connectPromise !== null) return this.connectPromise;
|
|
37
|
+
this.connectPromise = this.connect();
|
|
38
|
+
try {
|
|
39
|
+
return await this.connectPromise;
|
|
40
|
+
} finally {
|
|
41
|
+
this.connectPromise = null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async connect() {
|
|
45
|
+
let ssh2Mod;
|
|
46
|
+
try {
|
|
47
|
+
ssh2Mod = await import("ssh2");
|
|
48
|
+
} catch (err) {
|
|
49
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
50
|
+
throw new Error(`ssh2 is required for the SSH resource \u2014 install it as a peer dep: ${msg}`);
|
|
51
|
+
}
|
|
52
|
+
const { Client: ClientCtor } = ssh2Mod;
|
|
53
|
+
const c = new ClientCtor();
|
|
54
|
+
const opts = {
|
|
55
|
+
host: this.config.hostname ?? this.config.host,
|
|
56
|
+
port: this.config.port ?? 22,
|
|
57
|
+
readyTimeout: (this.config.timeout ?? 30) * 1e3
|
|
58
|
+
};
|
|
59
|
+
if (this.config.username !== void 0) opts.username = this.config.username;
|
|
60
|
+
if (this.config.password !== void 0) opts.password = this.config.password;
|
|
61
|
+
if (this.config.identityFile !== void 0) {
|
|
62
|
+
opts.privateKey = readFileSync(expandHome(this.config.identityFile));
|
|
63
|
+
if (this.config.passphrase !== void 0) opts.passphrase = this.config.passphrase;
|
|
64
|
+
}
|
|
65
|
+
return new Promise((resolveFn, rejectFn) => {
|
|
66
|
+
c.on("ready", () => {
|
|
67
|
+
c.sftp((err, sftp) => {
|
|
68
|
+
if (err !== void 0) {
|
|
69
|
+
rejectFn(err);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
this.client = c;
|
|
73
|
+
this.sftpClient = sftp;
|
|
74
|
+
resolveFn(sftp);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
c.on("error", rejectFn);
|
|
78
|
+
c.connect(opts);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
close() {
|
|
82
|
+
if (this.client !== null) {
|
|
83
|
+
this.client.end();
|
|
84
|
+
this.client = null;
|
|
85
|
+
this.sftpClient = null;
|
|
86
|
+
}
|
|
87
|
+
return Promise.resolve();
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// src/commands/builtin/ssh/index.ts
|
|
92
|
+
import { ResourceName as ResourceName2, makeGenericCommands } from "@struktoai/mirage-core";
|
|
93
|
+
|
|
94
|
+
// src/core/ssh/append.ts
|
|
95
|
+
import { invalidateAfterWrite } from "@struktoai/mirage-core";
|
|
96
|
+
|
|
97
|
+
// src/core/ssh/utils.ts
|
|
98
|
+
import { lstripSlash, mountPrefixOf, rstripSlash } from "@struktoai/mirage-core";
|
|
99
|
+
var S_IFMT = 61440;
|
|
100
|
+
var S_IFDIR = 16384;
|
|
101
|
+
var S_IFREG = 32768;
|
|
102
|
+
function stripPrefix(p) {
|
|
103
|
+
if (mountPrefixOf(p.virtual, p.resourcePath) && p.virtual.startsWith(mountPrefixOf(p.virtual, p.resourcePath))) {
|
|
104
|
+
return p.virtual.slice(mountPrefixOf(p.virtual, p.resourcePath).length) || "/";
|
|
105
|
+
}
|
|
106
|
+
return p.virtual;
|
|
107
|
+
}
|
|
108
|
+
function joinRoot(root, rel) {
|
|
109
|
+
const r = rstripSlash(root);
|
|
110
|
+
const stripped = lstripSlash(rel);
|
|
111
|
+
if (stripped === "") return r === "" ? "/" : r;
|
|
112
|
+
if (r === "") return `/${stripped}`;
|
|
113
|
+
return `${r}/${stripped}`;
|
|
114
|
+
}
|
|
115
|
+
function isNoSuchFile(err) {
|
|
116
|
+
if (err === null || err === void 0) return false;
|
|
117
|
+
if (typeof err !== "object") return false;
|
|
118
|
+
const code = err.code;
|
|
119
|
+
return code === 2;
|
|
120
|
+
}
|
|
121
|
+
function isDirectoryAttrs(attrs) {
|
|
122
|
+
if (attrs.mode === void 0) return false;
|
|
123
|
+
return (attrs.mode & S_IFMT) === S_IFDIR;
|
|
124
|
+
}
|
|
125
|
+
function isFileAttrs(attrs) {
|
|
126
|
+
if (attrs.mode === void 0) return false;
|
|
127
|
+
return (attrs.mode & S_IFMT) === S_IFREG;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// src/core/ssh/append.ts
|
|
131
|
+
async function appendBytes(accessor, p, data) {
|
|
132
|
+
const sftp = await accessor.sftp();
|
|
133
|
+
const virtual = stripPrefix(p);
|
|
134
|
+
const remote = joinRoot(accessor.config.root ?? "/", virtual);
|
|
135
|
+
await new Promise((resolveFn, rejectFn) => {
|
|
136
|
+
sftp.appendFile(remote, Buffer.from(data), (err) => {
|
|
137
|
+
if (err) rejectFn(err);
|
|
138
|
+
else resolveFn();
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
await invalidateAfterWrite(p);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// src/core/ssh/constants.ts
|
|
145
|
+
var SCOPE_ERROR = 5e3;
|
|
146
|
+
|
|
147
|
+
// src/core/ssh/read.ts
|
|
148
|
+
import { enoent as enoent2 } from "@struktoai/mirage-core";
|
|
149
|
+
|
|
150
|
+
// src/core/ssh/stream.ts
|
|
151
|
+
import { once } from "events";
|
|
152
|
+
import { enoent } from "@struktoai/mirage-core";
|
|
153
|
+
async function waitForClose(rs) {
|
|
154
|
+
try {
|
|
155
|
+
await once(rs, "close");
|
|
156
|
+
return null;
|
|
157
|
+
} catch (error) {
|
|
158
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
async function* readChunks(rs) {
|
|
162
|
+
const closed = waitForClose(rs);
|
|
163
|
+
let closeError = null;
|
|
164
|
+
try {
|
|
165
|
+
for await (const chunk of rs) {
|
|
166
|
+
const buf = chunk;
|
|
167
|
+
yield new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
168
|
+
}
|
|
169
|
+
} finally {
|
|
170
|
+
if (!rs.destroyed) rs.destroy();
|
|
171
|
+
closeError = await closed;
|
|
172
|
+
}
|
|
173
|
+
if (closeError !== null) throw closeError;
|
|
174
|
+
}
|
|
175
|
+
async function* stream(accessor, p) {
|
|
176
|
+
const sftp = await accessor.sftp();
|
|
177
|
+
const virtual = stripPrefix(p);
|
|
178
|
+
const remote = joinRoot(accessor.config.root ?? "/", virtual);
|
|
179
|
+
const rs = sftp.createReadStream(remote);
|
|
180
|
+
try {
|
|
181
|
+
yield* readChunks(rs);
|
|
182
|
+
} catch (err) {
|
|
183
|
+
if (isNoSuchFile(err)) throw enoent(p);
|
|
184
|
+
throw err;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
async function rangeRead(accessor, p, start, end) {
|
|
188
|
+
const sftp = await accessor.sftp();
|
|
189
|
+
const virtual = stripPrefix(p);
|
|
190
|
+
const remote = joinRoot(accessor.config.root ?? "/", virtual);
|
|
191
|
+
const rs = sftp.createReadStream(remote, { start, end: end - 1 });
|
|
192
|
+
const chunks = [];
|
|
193
|
+
let total = 0;
|
|
194
|
+
try {
|
|
195
|
+
for await (const u8 of readChunks(rs)) {
|
|
196
|
+
chunks.push(u8);
|
|
197
|
+
total += u8.byteLength;
|
|
198
|
+
}
|
|
199
|
+
} catch (err) {
|
|
200
|
+
if (isNoSuchFile(err)) throw enoent(p);
|
|
201
|
+
throw err;
|
|
202
|
+
}
|
|
203
|
+
const out = new Uint8Array(total);
|
|
204
|
+
let offset = 0;
|
|
205
|
+
for (const c of chunks) {
|
|
206
|
+
out.set(c, offset);
|
|
207
|
+
offset += c.byteLength;
|
|
208
|
+
}
|
|
209
|
+
return out;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// src/core/ssh/read.ts
|
|
213
|
+
async function read(accessor, p) {
|
|
214
|
+
const sftp = await accessor.sftp();
|
|
215
|
+
const virtual = stripPrefix(p);
|
|
216
|
+
const remote = joinRoot(accessor.config.root ?? "/", virtual);
|
|
217
|
+
const rs = sftp.createReadStream(remote);
|
|
218
|
+
const chunks = [];
|
|
219
|
+
let total = 0;
|
|
220
|
+
try {
|
|
221
|
+
for await (const u8 of readChunks(rs)) {
|
|
222
|
+
chunks.push(u8);
|
|
223
|
+
total += u8.byteLength;
|
|
224
|
+
}
|
|
225
|
+
} catch (err) {
|
|
226
|
+
if (isNoSuchFile(err)) throw enoent2(p);
|
|
227
|
+
throw err;
|
|
228
|
+
}
|
|
229
|
+
const out = new Uint8Array(total);
|
|
230
|
+
let offset = 0;
|
|
231
|
+
for (const c of chunks) {
|
|
232
|
+
out.set(c, offset);
|
|
233
|
+
offset += c.byteLength;
|
|
234
|
+
}
|
|
235
|
+
return out;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// src/core/ssh/write.ts
|
|
239
|
+
import { ResourceName, invalidateAfterWrite as invalidateAfterWrite2, record } from "@struktoai/mirage-core";
|
|
240
|
+
async function writeBytes(accessor, p, data) {
|
|
241
|
+
const start = performance.now();
|
|
242
|
+
const sftp = await accessor.sftp();
|
|
243
|
+
const virtual = stripPrefix(p);
|
|
244
|
+
const remote = joinRoot(accessor.config.root ?? "/", virtual);
|
|
245
|
+
await new Promise((resolveFn, rejectFn) => {
|
|
246
|
+
sftp.writeFile(remote, Buffer.from(data), (err) => {
|
|
247
|
+
if (err) rejectFn(err);
|
|
248
|
+
else resolveFn();
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
record("write", virtual, ResourceName.SSH, data.byteLength, start);
|
|
252
|
+
await invalidateAfterWrite2(p);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// src/core/ssh/copy.ts
|
|
256
|
+
async function copy(accessor, src, dst) {
|
|
257
|
+
const data = await read(accessor, src);
|
|
258
|
+
await writeBytes(accessor, dst, data);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// src/core/ssh/create.ts
|
|
262
|
+
function create(accessor, path) {
|
|
263
|
+
return writeBytes(accessor, path, new Uint8Array());
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// src/core/ssh/du/entries.ts
|
|
267
|
+
import { compareCodePoints, norm } from "@struktoai/mirage-core";
|
|
268
|
+
|
|
269
|
+
// src/core/ssh/du/walk.ts
|
|
270
|
+
async function readRemoteDir(accessor, remote) {
|
|
271
|
+
const sftp = await accessor.sftp();
|
|
272
|
+
return new Promise((resolveFn, rejectFn) => {
|
|
273
|
+
sftp.readdir(remote, (err, entries2) => {
|
|
274
|
+
if (err !== void 0) {
|
|
275
|
+
const code = err.code;
|
|
276
|
+
if (code === 2) {
|
|
277
|
+
resolveFn(null);
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
rejectFn(err);
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
resolveFn(entries2);
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
async function statRemote(accessor, remote) {
|
|
288
|
+
const sftp = await accessor.sftp();
|
|
289
|
+
return new Promise((resolveFn, rejectFn) => {
|
|
290
|
+
sftp.lstat(remote, (err, stats) => {
|
|
291
|
+
if (err !== void 0) {
|
|
292
|
+
const code = err.code;
|
|
293
|
+
if (code === 2) {
|
|
294
|
+
resolveFn(null);
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
rejectFn(err);
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
resolveFn({ mode: stats.mode, size: stats.size });
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
async function walkSizes(accessor, virtual) {
|
|
305
|
+
const remote = joinRoot(accessor.config.root ?? "/", virtual);
|
|
306
|
+
const st = await statRemote(accessor, remote);
|
|
307
|
+
if (st === null) return 0;
|
|
308
|
+
if (isFileAttrs(st)) return st.size;
|
|
309
|
+
if (!isDirectoryAttrs(st)) return 0;
|
|
310
|
+
const entries2 = await readRemoteDir(accessor, remote);
|
|
311
|
+
if (entries2 === null) return 0;
|
|
312
|
+
let total = 0;
|
|
313
|
+
for (const entry of entries2) {
|
|
314
|
+
if (entry.filename === "." || entry.filename === "..") continue;
|
|
315
|
+
const child = virtual === "/" ? `/${entry.filename}` : `${virtual}/${entry.filename}`;
|
|
316
|
+
if (isDirectoryAttrs(entry.attrs)) {
|
|
317
|
+
total += await walkSizes(accessor, child);
|
|
318
|
+
} else {
|
|
319
|
+
total += entry.attrs.size;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return total;
|
|
323
|
+
}
|
|
324
|
+
async function walkAll(accessor, virtual, entries2) {
|
|
325
|
+
const remote = joinRoot(accessor.config.root ?? "/", virtual);
|
|
326
|
+
const st = await statRemote(accessor, remote);
|
|
327
|
+
if (st === null) return 0;
|
|
328
|
+
if (isFileAttrs(st)) {
|
|
329
|
+
entries2.push([virtual, st.size]);
|
|
330
|
+
return st.size;
|
|
331
|
+
}
|
|
332
|
+
if (!isDirectoryAttrs(st)) return 0;
|
|
333
|
+
const list = await readRemoteDir(accessor, remote);
|
|
334
|
+
if (list === null) return 0;
|
|
335
|
+
let total = 0;
|
|
336
|
+
for (const entry of list) {
|
|
337
|
+
if (entry.filename === "." || entry.filename === "..") continue;
|
|
338
|
+
const child = virtual === "/" ? `/${entry.filename}` : `${virtual}/${entry.filename}`;
|
|
339
|
+
if (isDirectoryAttrs(entry.attrs)) {
|
|
340
|
+
total += await walkAll(accessor, child, entries2);
|
|
341
|
+
} else {
|
|
342
|
+
const size2 = entry.attrs.size;
|
|
343
|
+
entries2.push([child, size2]);
|
|
344
|
+
total += size2;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return total;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// src/core/ssh/du/entries.ts
|
|
351
|
+
async function entries(accessor, p) {
|
|
352
|
+
const virtual = norm(stripPrefix(p));
|
|
353
|
+
const entries2 = [];
|
|
354
|
+
const total = await walkAll(accessor, virtual, entries2);
|
|
355
|
+
entries2.sort((a, b) => compareCodePoints(a[0], b[0]));
|
|
356
|
+
return [entries2, total];
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// src/core/ssh/du/size.ts
|
|
360
|
+
async function size(accessor, p) {
|
|
361
|
+
const virtual = stripPrefix(p);
|
|
362
|
+
return walkSizes(accessor, virtual);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// src/core/ssh/exists.ts
|
|
366
|
+
async function exists(accessor, p) {
|
|
367
|
+
const sftp = await accessor.sftp();
|
|
368
|
+
const remote = joinRoot(accessor.config.root ?? "/", stripPrefix(p));
|
|
369
|
+
return new Promise((resolveFn) => {
|
|
370
|
+
sftp.exists(remote, (yes) => {
|
|
371
|
+
resolveFn(yes);
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// src/core/ssh/find.ts
|
|
377
|
+
import { compareCodePoints as compareCodePoints2, norm as norm2 } from "@struktoai/mirage-core";
|
|
378
|
+
import {
|
|
379
|
+
buildTree,
|
|
380
|
+
emitStartPath,
|
|
381
|
+
keep,
|
|
382
|
+
startBasename
|
|
383
|
+
} from "@struktoai/mirage-core";
|
|
384
|
+
function isFileType(t) {
|
|
385
|
+
return t === "f" || t === "file";
|
|
386
|
+
}
|
|
387
|
+
function isDirType(t) {
|
|
388
|
+
return t === "d" || t === "directory";
|
|
389
|
+
}
|
|
390
|
+
function matches(entry, entryPath, isDir, depth, opts, tree) {
|
|
391
|
+
if (opts.maxDepth !== null && opts.maxDepth !== void 0 && depth > opts.maxDepth) return false;
|
|
392
|
+
const basename = entryPath.slice(entryPath.lastIndexOf("/") + 1);
|
|
393
|
+
const isEmpty = isDir ? false : entry.attrs.size === 0;
|
|
394
|
+
if (!keep(
|
|
395
|
+
{ key: entryPath, name: basename, kind: isDir ? "d" : "f", depth, isEmpty },
|
|
396
|
+
tree,
|
|
397
|
+
opts.minDepth
|
|
398
|
+
)) {
|
|
399
|
+
return false;
|
|
400
|
+
}
|
|
401
|
+
if (opts.minSize != null || opts.maxSize != null) {
|
|
402
|
+
const size2 = isDir ? 0 : entry.attrs.size;
|
|
403
|
+
if (opts.minSize != null && size2 < opts.minSize) return false;
|
|
404
|
+
if (opts.maxSize != null && size2 > opts.maxSize) return false;
|
|
405
|
+
}
|
|
406
|
+
if (opts.mtimeMin !== null && opts.mtimeMin !== void 0 || opts.mtimeMax !== null && opts.mtimeMax !== void 0) {
|
|
407
|
+
const mtime = entry.attrs.mtime;
|
|
408
|
+
if (opts.mtimeMin !== null && opts.mtimeMin !== void 0 && mtime < opts.mtimeMin) return false;
|
|
409
|
+
if (opts.mtimeMax !== null && opts.mtimeMax !== void 0 && mtime > opts.mtimeMax) return false;
|
|
410
|
+
}
|
|
411
|
+
return true;
|
|
412
|
+
}
|
|
413
|
+
async function readRemoteDir2(accessor, remote) {
|
|
414
|
+
const sftp = await accessor.sftp();
|
|
415
|
+
return new Promise((resolveFn, rejectFn) => {
|
|
416
|
+
sftp.readdir(remote, (err, entries2) => {
|
|
417
|
+
if (err !== void 0) {
|
|
418
|
+
const code = err.code;
|
|
419
|
+
if (code === 2) {
|
|
420
|
+
resolveFn(null);
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
rejectFn(err);
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
resolveFn(entries2);
|
|
427
|
+
});
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
async function statRemote2(accessor, remote) {
|
|
431
|
+
const sftp = await accessor.sftp();
|
|
432
|
+
return new Promise((resolveFn, rejectFn) => {
|
|
433
|
+
sftp.stat(remote, (err, stats) => {
|
|
434
|
+
if (err !== void 0) {
|
|
435
|
+
const code = err.code;
|
|
436
|
+
if (code === 2) {
|
|
437
|
+
resolveFn(null);
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
rejectFn(err);
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
resolveFn({ isDir: stats.isDirectory(), size: stats.size });
|
|
444
|
+
});
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
async function walk(ctx, virtual, depth) {
|
|
448
|
+
const opts = ctx.options;
|
|
449
|
+
if (opts.maxDepth !== null && opts.maxDepth !== void 0 && depth > opts.maxDepth) return;
|
|
450
|
+
const remote = joinRoot(ctx.accessor.config.root ?? "/", virtual);
|
|
451
|
+
const entries2 = await readRemoteDir2(ctx.accessor, remote);
|
|
452
|
+
if (entries2 === null) return;
|
|
453
|
+
for (const entry of entries2) {
|
|
454
|
+
if (entry.filename === "." || entry.filename === "..") continue;
|
|
455
|
+
const childPath = virtual === "/" ? `/${entry.filename}` : `${virtual}/${entry.filename}`;
|
|
456
|
+
const isDir = isDirectoryAttrs(entry.attrs);
|
|
457
|
+
if (matches(entry, childPath, isDir, depth + 1, opts, ctx.tree)) {
|
|
458
|
+
ctx.results.push(childPath);
|
|
459
|
+
}
|
|
460
|
+
if (isDir) {
|
|
461
|
+
await walk(ctx, childPath, depth + 1);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
async function find(accessor, p, options = {}) {
|
|
466
|
+
const virtual = norm2(stripPrefix(p));
|
|
467
|
+
const startName = startBasename(p.virtual);
|
|
468
|
+
const results = [];
|
|
469
|
+
const baseDepth = (virtual.match(/\//g) ?? []).length;
|
|
470
|
+
const typeKind = isFileType(options.type) ? "f" : isDirType(options.type) ? "d" : null;
|
|
471
|
+
const tree = options.tree ?? buildTree({
|
|
472
|
+
name: options.name,
|
|
473
|
+
iname: options.iname,
|
|
474
|
+
pathPattern: options.pathPattern,
|
|
475
|
+
type: typeKind,
|
|
476
|
+
nameExclude: options.nameExclude,
|
|
477
|
+
orNames: options.orNames
|
|
478
|
+
});
|
|
479
|
+
if (options.maxDepth == null || options.maxDepth >= 0) {
|
|
480
|
+
const st = await statRemote2(accessor, joinRoot(accessor.config.root ?? "/", virtual));
|
|
481
|
+
emitStartPath(results, virtual, startName, {
|
|
482
|
+
kind: st?.isDir ? "d" : "f",
|
|
483
|
+
isEmpty: st === null ? null : st.isDir ? false : st.size === 0,
|
|
484
|
+
exists: st !== null,
|
|
485
|
+
tree,
|
|
486
|
+
maxDepth: options.maxDepth,
|
|
487
|
+
minDepth: options.minDepth,
|
|
488
|
+
size: st === null || st.isDir ? null : st.size,
|
|
489
|
+
minSize: options.minSize,
|
|
490
|
+
maxSize: options.maxSize
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
await walk({ accessor, options, results, baseDepth, tree }, virtual, 0);
|
|
494
|
+
results.sort(compareCodePoints2);
|
|
495
|
+
return results;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
// src/core/ssh/mkdir.ts
|
|
499
|
+
import { invalidateAfterWrite as invalidateAfterWrite3, invalidateAncestors } from "@struktoai/mirage-core";
|
|
500
|
+
import { enoent as enoent3, stripSlash } from "@struktoai/mirage-core";
|
|
501
|
+
async function statRemote3(sftp, remote) {
|
|
502
|
+
return new Promise((resolveFn) => {
|
|
503
|
+
sftp.lstat(remote, (err, stats) => {
|
|
504
|
+
if (err) resolveFn(null);
|
|
505
|
+
else resolveFn(stats);
|
|
506
|
+
});
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
async function mkdirOne(sftp, remote, ignoreExisting) {
|
|
510
|
+
return new Promise((resolveFn, rejectFn) => {
|
|
511
|
+
sftp.mkdir(remote, (err) => {
|
|
512
|
+
if (!err) {
|
|
513
|
+
resolveFn();
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
if (ignoreExisting) {
|
|
517
|
+
resolveFn();
|
|
518
|
+
return;
|
|
519
|
+
}
|
|
520
|
+
rejectFn(err);
|
|
521
|
+
});
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
async function mkdir(accessor, p, recursive) {
|
|
525
|
+
const sftp = await accessor.sftp();
|
|
526
|
+
const virtual = stripPrefix(p);
|
|
527
|
+
const root = accessor.config.root ?? "/";
|
|
528
|
+
const remote = joinRoot(root, virtual);
|
|
529
|
+
if (!recursive) {
|
|
530
|
+
try {
|
|
531
|
+
await mkdirOne(sftp, remote, false);
|
|
532
|
+
} catch (err) {
|
|
533
|
+
if (isNoSuchFile(err)) throw enoent3(p);
|
|
534
|
+
throw err;
|
|
535
|
+
}
|
|
536
|
+
return;
|
|
537
|
+
}
|
|
538
|
+
const cleaned = stripSlash(virtual);
|
|
539
|
+
if (cleaned.length === 0) return;
|
|
540
|
+
const parts = cleaned.split("/");
|
|
541
|
+
let cur = "";
|
|
542
|
+
for (const part of parts) {
|
|
543
|
+
cur = cur === "" ? `/${part}` : `${cur}/${part}`;
|
|
544
|
+
const stepRemote = joinRoot(root, cur);
|
|
545
|
+
const existing = await statRemote3(sftp, stepRemote);
|
|
546
|
+
if (existing?.isDirectory()) continue;
|
|
547
|
+
await mkdirOne(sftp, stepRemote, true);
|
|
548
|
+
}
|
|
549
|
+
await invalidateAfterWrite3(p);
|
|
550
|
+
await invalidateAncestors(p);
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
// src/core/ssh/readdir.ts
|
|
554
|
+
import { compareCodePoints as compareCodePoints3, enoent as enoent4, mountPrefixOf as mountPrefixOf2, stripSlash as stripSlash2 } from "@struktoai/mirage-core";
|
|
555
|
+
async function readdir(accessor, p) {
|
|
556
|
+
const sftp = await accessor.sftp();
|
|
557
|
+
const virtual = p.pattern !== null ? p.directory.slice(mountPrefixOf2(p.virtual, p.resourcePath).length) || "/" : stripPrefix(p);
|
|
558
|
+
const remote = joinRoot(accessor.config.root ?? "/", virtual);
|
|
559
|
+
const list = await new Promise((resolveFn, rejectFn) => {
|
|
560
|
+
sftp.readdir(remote, (err, entries2) => {
|
|
561
|
+
if (err !== void 0) {
|
|
562
|
+
if (isNoSuchFile(err)) rejectFn(enoent4(p));
|
|
563
|
+
else rejectFn(err);
|
|
564
|
+
return;
|
|
565
|
+
}
|
|
566
|
+
resolveFn(entries2);
|
|
567
|
+
});
|
|
568
|
+
});
|
|
569
|
+
const base = `/${stripSlash2(virtual)}`;
|
|
570
|
+
const dirPrefix = base === "/" ? "/" : `${base}/`;
|
|
571
|
+
const mountPrefix = mountPrefixOf2(p.virtual, p.resourcePath);
|
|
572
|
+
const names = [];
|
|
573
|
+
for (const entry of list) {
|
|
574
|
+
if (entry.filename === "." || entry.filename === "..") continue;
|
|
575
|
+
names.push(`${mountPrefix}${dirPrefix}${entry.filename}`);
|
|
576
|
+
}
|
|
577
|
+
names.sort(compareCodePoints3);
|
|
578
|
+
return names;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
// src/core/ssh/rename.ts
|
|
582
|
+
import { invalidateAfterUnlink, invalidateAfterWrite as invalidateAfterWrite4 } from "@struktoai/mirage-core";
|
|
583
|
+
import { enoent as enoent5 } from "@struktoai/mirage-core";
|
|
584
|
+
async function rename(accessor, src, dst) {
|
|
585
|
+
const sftp = await accessor.sftp();
|
|
586
|
+
const root = accessor.config.root ?? "/";
|
|
587
|
+
const srcVirtual = stripPrefix(src);
|
|
588
|
+
const dstVirtual = stripPrefix(dst);
|
|
589
|
+
const remoteSrc = joinRoot(root, srcVirtual);
|
|
590
|
+
const remoteDst = joinRoot(root, dstVirtual);
|
|
591
|
+
await new Promise((resolveFn, rejectFn) => {
|
|
592
|
+
const done = (err) => {
|
|
593
|
+
if (!err) resolveFn();
|
|
594
|
+
else if (isNoSuchFile(err)) rejectFn(enoent5(src));
|
|
595
|
+
else rejectFn(err);
|
|
596
|
+
};
|
|
597
|
+
try {
|
|
598
|
+
sftp.ext_openssh_rename(remoteSrc, remoteDst, done);
|
|
599
|
+
} catch {
|
|
600
|
+
sftp.rename(remoteSrc, remoteDst, done);
|
|
601
|
+
}
|
|
602
|
+
});
|
|
603
|
+
await invalidateAfterWrite4(dst);
|
|
604
|
+
await invalidateAfterUnlink(src);
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
// src/core/ssh/rm.ts
|
|
608
|
+
import { enoent as enoent6, invalidateAfterUnlink as invalidateAfterUnlink2 } from "@struktoai/mirage-core";
|
|
609
|
+
async function statRemote4(sftp, remote) {
|
|
610
|
+
return new Promise((resolveFn, rejectFn) => {
|
|
611
|
+
sftp.lstat(remote, (err, stats) => {
|
|
612
|
+
if (err !== void 0) rejectFn(err);
|
|
613
|
+
else resolveFn(stats);
|
|
614
|
+
});
|
|
615
|
+
});
|
|
616
|
+
}
|
|
617
|
+
async function readdirRemote(sftp, remote) {
|
|
618
|
+
return new Promise((resolveFn, rejectFn) => {
|
|
619
|
+
sftp.readdir(remote, (err, list) => {
|
|
620
|
+
if (err !== void 0) rejectFn(err);
|
|
621
|
+
else resolveFn(list);
|
|
622
|
+
});
|
|
623
|
+
});
|
|
624
|
+
}
|
|
625
|
+
async function unlinkRemote(sftp, remote) {
|
|
626
|
+
return new Promise((resolveFn, rejectFn) => {
|
|
627
|
+
sftp.unlink(remote, (err) => {
|
|
628
|
+
if (err) rejectFn(err);
|
|
629
|
+
else resolveFn();
|
|
630
|
+
});
|
|
631
|
+
});
|
|
632
|
+
}
|
|
633
|
+
async function rmdirRemote(sftp, remote) {
|
|
634
|
+
return new Promise((resolveFn, rejectFn) => {
|
|
635
|
+
sftp.rmdir(remote, (err) => {
|
|
636
|
+
if (err) rejectFn(err);
|
|
637
|
+
else resolveFn();
|
|
638
|
+
});
|
|
639
|
+
});
|
|
640
|
+
}
|
|
641
|
+
async function rmRecurse(sftp, remote) {
|
|
642
|
+
const stats = await statRemote4(sftp, remote);
|
|
643
|
+
if (isDirectoryAttrs(stats)) {
|
|
644
|
+
const entries2 = await readdirRemote(sftp, remote);
|
|
645
|
+
for (const entry of entries2) {
|
|
646
|
+
if (entry.filename === "." || entry.filename === "..") continue;
|
|
647
|
+
const child = remote === "/" ? `/${entry.filename}` : `${remote}/${entry.filename}`;
|
|
648
|
+
await rmRecurse(sftp, child);
|
|
649
|
+
}
|
|
650
|
+
await rmdirRemote(sftp, remote);
|
|
651
|
+
return;
|
|
652
|
+
}
|
|
653
|
+
await unlinkRemote(sftp, remote);
|
|
654
|
+
}
|
|
655
|
+
async function rmR(accessor, p) {
|
|
656
|
+
const sftp = await accessor.sftp();
|
|
657
|
+
const virtual = stripPrefix(p);
|
|
658
|
+
const remote = joinRoot(accessor.config.root ?? "/", virtual);
|
|
659
|
+
try {
|
|
660
|
+
await rmRecurse(sftp, remote);
|
|
661
|
+
} catch (err) {
|
|
662
|
+
if (isNoSuchFile(err)) throw enoent6(p);
|
|
663
|
+
throw err;
|
|
664
|
+
}
|
|
665
|
+
await invalidateAfterUnlink2(p);
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
// src/core/ssh/rmdir.ts
|
|
669
|
+
import { enoent as enoent7, invalidateAfterUnlink as invalidateAfterUnlink3 } from "@struktoai/mirage-core";
|
|
670
|
+
async function rmdir(accessor, p) {
|
|
671
|
+
const sftp = await accessor.sftp();
|
|
672
|
+
const virtual = stripPrefix(p);
|
|
673
|
+
const remote = joinRoot(accessor.config.root ?? "/", virtual);
|
|
674
|
+
await new Promise((resolveFn, rejectFn) => {
|
|
675
|
+
sftp.rmdir(remote, (err) => {
|
|
676
|
+
if (!err) {
|
|
677
|
+
resolveFn();
|
|
678
|
+
return;
|
|
679
|
+
}
|
|
680
|
+
if (isNoSuchFile(err)) rejectFn(enoent7(p));
|
|
681
|
+
else rejectFn(err);
|
|
682
|
+
});
|
|
683
|
+
});
|
|
684
|
+
await invalidateAfterUnlink3(p);
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
// src/core/ssh/set_attrs.ts
|
|
688
|
+
import { enoent as enoent8 } from "@struktoai/mirage-core";
|
|
689
|
+
function sftpStat(sftp, remote, p) {
|
|
690
|
+
return new Promise((resolveFn, rejectFn) => {
|
|
691
|
+
sftp.stat(remote, (err, stats) => {
|
|
692
|
+
if (err !== void 0) {
|
|
693
|
+
if (isNoSuchFile(err)) rejectFn(enoent8(p));
|
|
694
|
+
else rejectFn(err);
|
|
695
|
+
return;
|
|
696
|
+
}
|
|
697
|
+
resolveFn(stats);
|
|
698
|
+
});
|
|
699
|
+
});
|
|
700
|
+
}
|
|
701
|
+
function sftpChmod(sftp, remote, mode) {
|
|
702
|
+
return new Promise((resolveFn, rejectFn) => {
|
|
703
|
+
sftp.chmod(remote, mode, (err) => {
|
|
704
|
+
if (err !== void 0 && err !== null) rejectFn(err);
|
|
705
|
+
else resolveFn();
|
|
706
|
+
});
|
|
707
|
+
});
|
|
708
|
+
}
|
|
709
|
+
function sftpUtimes(sftp, remote, atime, mtime) {
|
|
710
|
+
return new Promise((resolveFn, rejectFn) => {
|
|
711
|
+
sftp.utimes(remote, atime, mtime, (err) => {
|
|
712
|
+
if (err !== void 0 && err !== null) rejectFn(err);
|
|
713
|
+
else resolveFn();
|
|
714
|
+
});
|
|
715
|
+
});
|
|
716
|
+
}
|
|
717
|
+
async function setAttrs(accessor, path, fields) {
|
|
718
|
+
const sftp = await accessor.sftp();
|
|
719
|
+
const remote = joinRoot(accessor.config.root ?? "/", stripPrefix(path));
|
|
720
|
+
const st = await sftpStat(sftp, remote, path);
|
|
721
|
+
const residual = {};
|
|
722
|
+
if (fields.mode !== void 0) {
|
|
723
|
+
const keep2 = st.isDirectory() ? 448 : 384;
|
|
724
|
+
await sftpChmod(sftp, remote, fields.mode | keep2);
|
|
725
|
+
if ((fields.mode | keep2) !== fields.mode) residual.mode = fields.mode;
|
|
726
|
+
}
|
|
727
|
+
if (fields.uid !== void 0) residual.uid = fields.uid;
|
|
728
|
+
if (fields.gid !== void 0) residual.gid = fields.gid;
|
|
729
|
+
if (fields.atime !== void 0 || fields.mtime !== void 0) {
|
|
730
|
+
const newAtime = fields.atime !== void 0 ? Math.floor(Date.parse(fields.atime) / 1e3) : st.atime;
|
|
731
|
+
const newMtime = fields.mtime !== void 0 ? Math.floor(Date.parse(fields.mtime) / 1e3) : st.mtime;
|
|
732
|
+
await sftpUtimes(sftp, remote, newAtime, newMtime);
|
|
733
|
+
}
|
|
734
|
+
return residual;
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
// src/core/ssh/entry.ts
|
|
738
|
+
import { FileStat, FileType, guessType } from "@struktoai/mirage-core";
|
|
739
|
+
function attrsToFileStat(name, attrs) {
|
|
740
|
+
const modified = attrs.mtime !== void 0 ? new Date(attrs.mtime * 1e3).toISOString() : null;
|
|
741
|
+
const extra = {};
|
|
742
|
+
if (attrs.mode !== void 0) extra.mode = attrs.mode;
|
|
743
|
+
if (attrs.uid !== void 0) extra.uid = attrs.uid;
|
|
744
|
+
if (attrs.gid !== void 0) extra.gid = attrs.gid;
|
|
745
|
+
const mode = attrs.mode !== void 0 ? attrs.mode & 4095 : null;
|
|
746
|
+
const atime = attrs.atime !== void 0 ? new Date(attrs.atime * 1e3).toISOString() : null;
|
|
747
|
+
if (isDirectoryAttrs(attrs)) {
|
|
748
|
+
return new FileStat({
|
|
749
|
+
name,
|
|
750
|
+
size: null,
|
|
751
|
+
modified,
|
|
752
|
+
fingerprint: modified,
|
|
753
|
+
type: FileType.DIRECTORY,
|
|
754
|
+
mode,
|
|
755
|
+
atime,
|
|
756
|
+
extra
|
|
757
|
+
});
|
|
758
|
+
}
|
|
759
|
+
return new FileStat({
|
|
760
|
+
name,
|
|
761
|
+
size: attrs.size ?? null,
|
|
762
|
+
modified,
|
|
763
|
+
fingerprint: modified,
|
|
764
|
+
type: guessType(name),
|
|
765
|
+
mode,
|
|
766
|
+
atime,
|
|
767
|
+
extra
|
|
768
|
+
});
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
// src/core/ssh/stat.ts
|
|
772
|
+
import { enoent as enoent9, rstripSlash as rstripSlash2 } from "@struktoai/mirage-core";
|
|
773
|
+
async function stat(accessor, p) {
|
|
774
|
+
const sftp = await accessor.sftp();
|
|
775
|
+
const virtual = stripPrefix(p);
|
|
776
|
+
const remote = joinRoot(accessor.config.root ?? "/", virtual);
|
|
777
|
+
const attrs = await new Promise((resolveFn, rejectFn) => {
|
|
778
|
+
sftp.stat(remote, (err, stats) => {
|
|
779
|
+
if (err !== void 0) {
|
|
780
|
+
if (isNoSuchFile(err)) rejectFn(enoent9(p));
|
|
781
|
+
else rejectFn(err);
|
|
782
|
+
return;
|
|
783
|
+
}
|
|
784
|
+
resolveFn(stats);
|
|
785
|
+
});
|
|
786
|
+
});
|
|
787
|
+
const cleaned = rstripSlash2(virtual);
|
|
788
|
+
const name = cleaned.length === 0 ? "/" : cleaned.split("/").pop() ?? "/";
|
|
789
|
+
return attrsToFileStat(name, attrs);
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
// src/core/ssh/truncate.ts
|
|
793
|
+
async function truncate(accessor, p, length) {
|
|
794
|
+
let data;
|
|
795
|
+
try {
|
|
796
|
+
data = await read(accessor, p);
|
|
797
|
+
} catch (err) {
|
|
798
|
+
if (err.code === "ENOENT") {
|
|
799
|
+
data = new Uint8Array(0);
|
|
800
|
+
} else {
|
|
801
|
+
throw err;
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
const out = new Uint8Array(length);
|
|
805
|
+
out.set(data.subarray(0, Math.min(data.byteLength, length)));
|
|
806
|
+
await writeBytes(accessor, p, out);
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
// src/core/ssh/unlink.ts
|
|
810
|
+
import { invalidateAfterUnlink as invalidateAfterUnlink4 } from "@struktoai/mirage-core";
|
|
811
|
+
import { enoent as enoent10 } from "@struktoai/mirage-core";
|
|
812
|
+
async function unlink(accessor, p) {
|
|
813
|
+
const sftp = await accessor.sftp();
|
|
814
|
+
const virtual = stripPrefix(p);
|
|
815
|
+
const remote = joinRoot(accessor.config.root ?? "/", virtual);
|
|
816
|
+
await new Promise((resolveFn, rejectFn) => {
|
|
817
|
+
sftp.unlink(remote, (err) => {
|
|
818
|
+
if (!err) {
|
|
819
|
+
resolveFn();
|
|
820
|
+
return;
|
|
821
|
+
}
|
|
822
|
+
if (isNoSuchFile(err)) rejectFn(enoent10(p));
|
|
823
|
+
else rejectFn(err);
|
|
824
|
+
});
|
|
825
|
+
});
|
|
826
|
+
await invalidateAfterUnlink4(p);
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
// src/commands/builtin/ssh/io.ts
|
|
830
|
+
var SSH_IO = {
|
|
831
|
+
maxGlobMatches: SCOPE_ERROR,
|
|
832
|
+
readdir,
|
|
833
|
+
readBytes: read,
|
|
834
|
+
readStream: stream,
|
|
835
|
+
stat,
|
|
836
|
+
isMounted: () => true,
|
|
837
|
+
local: false,
|
|
838
|
+
write: writeBytes,
|
|
839
|
+
exists,
|
|
840
|
+
mkdir: (accessor, path, parents) => mkdir(accessor, path, parents === true),
|
|
841
|
+
unlink,
|
|
842
|
+
rmdir,
|
|
843
|
+
rmR,
|
|
844
|
+
rename,
|
|
845
|
+
copy,
|
|
846
|
+
create,
|
|
847
|
+
truncate,
|
|
848
|
+
append: appendBytes,
|
|
849
|
+
find,
|
|
850
|
+
du: { size, entries },
|
|
851
|
+
setAttrs
|
|
852
|
+
};
|
|
853
|
+
|
|
854
|
+
// src/commands/builtin/ssh/index.ts
|
|
855
|
+
var SSH_COMMANDS = [
|
|
856
|
+
...makeGenericCommands(ResourceName2.SSH, SSH_IO)
|
|
857
|
+
];
|
|
858
|
+
|
|
859
|
+
// src/ops/ssh/index.ts
|
|
860
|
+
import { ResourceName as ResourceName3, makeGenericOps } from "@struktoai/mirage-core";
|
|
861
|
+
var SSH_OPS = makeGenericOps(ResourceName3.SSH, SSH_IO, {
|
|
862
|
+
mkdirParents: true
|
|
863
|
+
});
|
|
864
|
+
|
|
865
|
+
// src/resource/ssh/prompt.ts
|
|
866
|
+
var SSH_PROMPT = `{prefix}
|
|
867
|
+
Remote filesystem via SSH/SFTP.
|
|
868
|
+
IMPORTANT: This is a remote mount. Prefer targeted reads over full scans.
|
|
869
|
+
Supports: ls, cat, head, tail, grep, rg, wc, find, tree, stat, mkdir, touch, cp, mv, rm, tee.`;
|
|
870
|
+
|
|
871
|
+
// src/resource/ssh/ssh.ts
|
|
872
|
+
var globCore = makeResolveGlob(readdir, SCOPE_ERROR);
|
|
873
|
+
var SSHResource = class extends BaseResource {
|
|
874
|
+
kind = ResourceName4.SSH;
|
|
875
|
+
cachesReads = true;
|
|
876
|
+
// SFTP stat/readdir report the remote inode's exact byte size for every
|
|
877
|
+
// file; reads are the same raw bytes.
|
|
878
|
+
sizesAlwaysKnown = true;
|
|
879
|
+
indexTtl = 60;
|
|
880
|
+
prompt = SSH_PROMPT;
|
|
881
|
+
config;
|
|
882
|
+
accessor;
|
|
883
|
+
opsMap = {
|
|
884
|
+
read_bytes: read,
|
|
885
|
+
write: writeBytes,
|
|
886
|
+
readdir,
|
|
887
|
+
stat,
|
|
888
|
+
unlink,
|
|
889
|
+
rmdir,
|
|
890
|
+
copy,
|
|
891
|
+
rename,
|
|
892
|
+
mkdir,
|
|
893
|
+
read_stream: stream,
|
|
894
|
+
range_read: rangeRead,
|
|
895
|
+
rm_recursive: rmR,
|
|
896
|
+
du_size: size,
|
|
897
|
+
du_entries: entries,
|
|
898
|
+
create,
|
|
899
|
+
truncate,
|
|
900
|
+
exists,
|
|
901
|
+
find_flat: find,
|
|
902
|
+
append: appendBytes
|
|
903
|
+
};
|
|
904
|
+
constructor(config) {
|
|
905
|
+
super();
|
|
906
|
+
this.config = config;
|
|
907
|
+
this.accessor = new SSHAccessor(config);
|
|
908
|
+
}
|
|
909
|
+
open() {
|
|
910
|
+
return Promise.resolve();
|
|
911
|
+
}
|
|
912
|
+
async close() {
|
|
913
|
+
await this.accessor.close();
|
|
914
|
+
await super.close();
|
|
915
|
+
}
|
|
916
|
+
ops() {
|
|
917
|
+
return SSH_OPS;
|
|
918
|
+
}
|
|
919
|
+
commands() {
|
|
920
|
+
return SSH_COMMANDS;
|
|
921
|
+
}
|
|
922
|
+
streamPath(p) {
|
|
923
|
+
return stream(this.accessor, p);
|
|
924
|
+
}
|
|
925
|
+
readFile(p) {
|
|
926
|
+
return read(this.accessor, p);
|
|
927
|
+
}
|
|
928
|
+
writeFile(p, data) {
|
|
929
|
+
return writeBytes(this.accessor, p, data);
|
|
930
|
+
}
|
|
931
|
+
appendFile(p, data) {
|
|
932
|
+
return appendBytes(this.accessor, p, data);
|
|
933
|
+
}
|
|
934
|
+
readdir(p) {
|
|
935
|
+
return readdir(this.accessor, p);
|
|
936
|
+
}
|
|
937
|
+
stat(p) {
|
|
938
|
+
return stat(this.accessor, p);
|
|
939
|
+
}
|
|
940
|
+
exists(p) {
|
|
941
|
+
return exists(this.accessor, p);
|
|
942
|
+
}
|
|
943
|
+
mkdir(p, options) {
|
|
944
|
+
return mkdir(this.accessor, p, options?.recursive === true);
|
|
945
|
+
}
|
|
946
|
+
rmdir(p) {
|
|
947
|
+
return rmdir(this.accessor, p);
|
|
948
|
+
}
|
|
949
|
+
unlink(p) {
|
|
950
|
+
return unlink(this.accessor, p);
|
|
951
|
+
}
|
|
952
|
+
rename(src, dst) {
|
|
953
|
+
return rename(this.accessor, src, dst);
|
|
954
|
+
}
|
|
955
|
+
truncate(p, length) {
|
|
956
|
+
return truncate(this.accessor, p, length);
|
|
957
|
+
}
|
|
958
|
+
copy(src, dst) {
|
|
959
|
+
return copy(this.accessor, src, dst);
|
|
960
|
+
}
|
|
961
|
+
rmR(p) {
|
|
962
|
+
return rmR(this.accessor, p);
|
|
963
|
+
}
|
|
964
|
+
du(p) {
|
|
965
|
+
return size(this.accessor, p);
|
|
966
|
+
}
|
|
967
|
+
find(p, options = {}) {
|
|
968
|
+
return find(this.accessor, p, options);
|
|
969
|
+
}
|
|
970
|
+
glob(paths, prefix = "") {
|
|
971
|
+
const effective = prefix ? paths.map(
|
|
972
|
+
(p) => mountPrefixOf3(p.virtual, p.resourcePath) ? p : new PathSpec({
|
|
973
|
+
virtual: p.virtual,
|
|
974
|
+
directory: p.directory,
|
|
975
|
+
...p.pattern !== null ? { pattern: p.pattern } : {},
|
|
976
|
+
resolved: p.resolved,
|
|
977
|
+
resourcePath: mountKey(p.virtual, prefix)
|
|
978
|
+
})
|
|
979
|
+
) : paths;
|
|
980
|
+
return globCore(this.accessor, effective);
|
|
981
|
+
}
|
|
982
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
983
|
+
async getState() {
|
|
984
|
+
return {
|
|
985
|
+
type: this.kind,
|
|
986
|
+
config: redactSshConfig(this.config)
|
|
987
|
+
};
|
|
988
|
+
}
|
|
989
|
+
loadState(_state) {
|
|
990
|
+
return Promise.resolve();
|
|
991
|
+
}
|
|
992
|
+
};
|
|
993
|
+
|
|
994
|
+
export {
|
|
995
|
+
SSHAccessor,
|
|
996
|
+
SSH_COMMANDS,
|
|
997
|
+
SSH_OPS,
|
|
998
|
+
SSH_PROMPT,
|
|
999
|
+
SSHResource
|
|
1000
|
+
};
|
|
1001
|
+
//# sourceMappingURL=chunk-KIX6N7NT.js.map
|