@struktoai/mirage-node 0.0.4 → 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/ceph-ALKLD3MO.js +11 -0
- package/dist/{chunk-VLRSOWHP.js → chunk-2A4YGVBM.js} +5 -14
- 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-HCU3B6FW.js → chunk-3JZQ6VSZ.js} +5 -4
- 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-L7FEZ7LU.js → chunk-5H6KNEPP.js} +4 -5
- package/dist/{chunk-L7FEZ7LU.js.map → chunk-5H6KNEPP.js.map} +1 -1
- package/dist/{chunk-25W4XQJZ.js → chunk-5K2MWDCE.js} +4 -5
- package/dist/{chunk-25W4XQJZ.js.map → chunk-5K2MWDCE.js.map} +1 -1
- package/dist/{chunk-L4GMDSMB.js → chunk-6SVXWRKX.js} +4 -5
- package/dist/{chunk-L4GMDSMB.js.map → chunk-6SVXWRKX.js.map} +1 -1
- package/dist/{chunk-H62XQZUM.js → chunk-6VOIUGAD.js} +22 -10
- package/dist/chunk-6VOIUGAD.js.map +1 -0
- package/dist/{chunk-SI4GMRXD.js → chunk-7JYHFXXC.js} +4 -8
- 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-HWQPEBID.js → chunk-ADEXNSYU.js} +6 -12
- 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-NJ42VNXG.js → chunk-ATLXMNKD.js} +8 -3
- package/dist/chunk-ATLXMNKD.js.map +1 -0
- package/dist/{chunk-CB76WPUS.js → chunk-BYCUGFRF.js} +5 -4
- package/dist/chunk-BYCUGFRF.js.map +1 -0
- package/dist/{chunk-4M73WHIE.js → chunk-BZTVYOES.js} +3 -3
- package/dist/{chunk-CQCTCW4S.js → chunk-CRC4YWXB.js} +28 -9
- package/dist/chunk-CRC4YWXB.js.map +1 -0
- package/dist/{chunk-C7TNKIK5.js → chunk-CTGXJHO5.js} +1 -1
- package/dist/chunk-CTGXJHO5.js.map +1 -0
- package/dist/{chunk-HSD24IP2.js → chunk-DCDBIXVZ.js} +7 -2
- package/dist/chunk-DCDBIXVZ.js.map +1 -0
- package/dist/{chunk-HEDE2377.js → chunk-DDAFNROK.js} +318 -322
- 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-2ERLWAGG.js → chunk-EBI4IHDC.js} +20 -11
- package/dist/chunk-EBI4IHDC.js.map +1 -0
- package/dist/{chunk-RHUEV4I7.js → chunk-EIUTZ6N7.js} +10 -24
- package/dist/chunk-EIUTZ6N7.js.map +1 -0
- package/dist/{chunk-IUXXZHY3.js → chunk-EJZG5VUF.js} +24 -12
- package/dist/chunk-EJZG5VUF.js.map +1 -0
- package/dist/{chunk-BWWU5T2D.js → chunk-ENW5BVYN.js} +3 -3
- package/dist/{chunk-F5NWRF32.js → chunk-ETIAW4YD.js} +3 -3
- package/dist/chunk-EUPXAYPB.js +20 -0
- package/dist/chunk-EUPXAYPB.js.map +1 -0
- package/dist/{chunk-EGZNOUMH.js → chunk-FA6YNU75.js} +4 -5
- package/dist/{chunk-EGZNOUMH.js.map → chunk-FA6YNU75.js.map} +1 -1
- package/dist/{chunk-XUUSWR4U.js → chunk-FFH6R5VQ.js} +7 -2
- package/dist/{chunk-XUUSWR4U.js.map → chunk-FFH6R5VQ.js.map} +1 -1
- package/dist/{chunk-JEBH5APX.js → chunk-GE6H2COM.js} +5 -13
- package/dist/chunk-GE6H2COM.js.map +1 -0
- package/dist/{chunk-TUNR4VUM.js → chunk-GMMQ3ZK4.js} +3 -3
- package/dist/{chunk-SAOQW6ZJ.js → chunk-GSGE3M5P.js} +5 -13
- package/dist/chunk-GSGE3M5P.js.map +1 -0
- package/dist/{chunk-FRGTDZQT.js → chunk-H64SB6VO.js} +19 -5
- package/dist/chunk-H64SB6VO.js.map +1 -0
- package/dist/{chunk-DXU7NZPH.js → chunk-HCRYAFBI.js} +3 -3
- package/dist/{chunk-OSVZKYXS.js → chunk-HOPUP6LA.js} +192 -156
- 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-XEMLYWHK.js → chunk-I7CPLZNW.js} +4 -5
- package/dist/{chunk-XEMLYWHK.js.map → chunk-I7CPLZNW.js.map} +1 -1
- package/dist/{chunk-AULFV3KY.js → chunk-IFUCGI4I.js} +7 -2
- package/dist/chunk-IFUCGI4I.js.map +1 -0
- package/dist/{chunk-HGIPWY5Y.js → chunk-IFYXSSKR.js} +6 -6
- 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-4X6CLF4F.js → chunk-JJERW2BI.js} +4 -5
- package/dist/{chunk-4X6CLF4F.js.map → chunk-JJERW2BI.js.map} +1 -1
- package/dist/{chunk-M6E7VK4D.js → chunk-JQR4HVUX.js} +2 -5
- package/dist/chunk-JQR4HVUX.js.map +1 -0
- package/dist/{chunk-BWLUBJQG.js → chunk-JXOMDLFS.js} +6 -15
- package/dist/chunk-JXOMDLFS.js.map +1 -0
- package/dist/{chunk-5ZHNPNDD.js → chunk-KIX6N7NT.js} +198 -141
- package/dist/chunk-KIX6N7NT.js.map +1 -0
- package/dist/{chunk-XFSEADPC.js → chunk-L42UTDFK.js} +7 -2
- package/dist/chunk-L42UTDFK.js.map +1 -0
- package/dist/chunk-M2UF2JHJ.js +11 -0
- package/dist/chunk-M2UF2JHJ.js.map +1 -0
- package/dist/{chunk-LPLZLSMK.js → chunk-MONC734W.js} +7 -2
- package/dist/chunk-MONC734W.js.map +1 -0
- package/dist/{chunk-XADEMW6B.js → chunk-N72RLCMU.js} +4 -5
- package/dist/{chunk-XADEMW6B.js.map → chunk-N72RLCMU.js.map} +1 -1
- package/dist/{chunk-ZPB3SLPK.js → chunk-ND4IWJ4V.js} +7 -2
- package/dist/chunk-ND4IWJ4V.js.map +1 -0
- package/dist/{chunk-ZPZQXHW2.js → chunk-NZ3EKGW4.js} +260 -178
- package/dist/chunk-NZ3EKGW4.js.map +1 -0
- package/dist/{chunk-E3KXVEYI.js → chunk-OAE57MNL.js} +22 -10
- package/dist/chunk-OAE57MNL.js.map +1 -0
- package/dist/{chunk-JBDFYIN2.js → chunk-OHKGIQB4.js} +2 -5
- package/dist/chunk-OHKGIQB4.js.map +1 -0
- package/dist/{chunk-V7JVMG63.js → chunk-OXEQSPND.js} +3 -3
- package/dist/{chunk-YRJICL2Q.js → chunk-PKNE5J2B.js} +5 -13
- 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-KAWDDS27.js → chunk-QAOVABCR.js} +7 -2
- package/dist/chunk-QAOVABCR.js.map +1 -0
- package/dist/{chunk-SYMNWNC3.js → chunk-QQ7FP4GD.js} +4 -5
- package/dist/{chunk-SYMNWNC3.js.map → chunk-QQ7FP4GD.js.map} +1 -1
- package/dist/{chunk-3JZN3GYO.js → chunk-QYLVMC6B.js} +2 -5
- package/dist/chunk-QYLVMC6B.js.map +1 -0
- package/dist/{chunk-CXQGMFI7.js → chunk-RX3XR65X.js} +4 -5
- package/dist/{chunk-CXQGMFI7.js.map → chunk-RX3XR65X.js.map} +1 -1
- package/dist/{chunk-MRXTUFBZ.js → chunk-RYQJJB4C.js} +1 -1
- package/dist/chunk-RYQJJB4C.js.map +1 -0
- package/dist/{chunk-5I7Q7RHW.js → chunk-TUF7TCN7.js} +4 -5
- package/dist/{chunk-5I7Q7RHW.js.map → chunk-TUF7TCN7.js.map} +1 -1
- package/dist/{chunk-NLXJMXVE.js → chunk-TUX36JY5.js} +4 -5
- package/dist/{chunk-NLXJMXVE.js.map → chunk-TUX36JY5.js.map} +1 -1
- package/dist/{chunk-4GYB7DGC.js → chunk-TWRQCQWU.js} +327 -558
- 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-W5ZLIQFR.js → chunk-WG5YS6TC.js} +308 -200
- package/dist/chunk-WG5YS6TC.js.map +1 -0
- package/dist/{chunk-ZM44MGC5.js → chunk-WMJJ4WGF.js} +4 -5
- package/dist/{chunk-ZM44MGC5.js.map → chunk-WMJJ4WGF.js.map} +1 -1
- package/dist/{chunk-5YRWF5RP.js → chunk-WY4FNH42.js} +6 -5
- package/dist/chunk-WY4FNH42.js.map +1 -0
- package/dist/{chunk-VBYIDRNU.js → chunk-XIG5BWWH.js} +19 -10
- 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-ZMREYTHA.js → chunk-XPRDXWK7.js} +8 -8
- 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-IEVLWEBO.js → chunk-YMBL3VJB.js} +9 -8
- package/dist/chunk-YMBL3VJB.js.map +1 -0
- package/dist/{chunk-CGGO5NKD.js → chunk-YUJBXFYK.js} +357 -346
- package/dist/chunk-YUJBXFYK.js.map +1 -0
- package/dist/{chunk-S4KVLPBR.js → chunk-YZ4ZJNOL.js} +22 -10
- 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-VHED2STW.js → chunk-ZVSYUCYS.js} +2 -1
- package/dist/chunk-ZVSYUCYS.js.map +1 -0
- package/dist/{config-T2IUIU5C.js → config-2YBCHU2W.js} +2 -2
- package/dist/{config-M3Z47VYU.js → config-3YRGRW72.js} +3 -2
- package/dist/config-4GSOMUMF.js +9 -0
- package/dist/config-5YBUWFUP.js +9 -0
- package/dist/{config-2LASFFRD.js → config-5ZRKJTKG.js} +3 -2
- package/dist/{config-W7EVPJNK.js → config-A25LTL5W.js} +2 -2
- package/dist/{config-WKQ3FGTZ.js → config-CLU7JABG.js} +2 -2
- package/dist/{config-E22XAGYN.js → config-D2RF7L3N.js} +2 -2
- package/dist/{config-HQXNFQZS.js → config-E55TKM6K.js} +2 -2
- package/dist/config-ELDOFRJW.js +9 -0
- package/dist/{config-EX3ZJTZI.js → config-FPC3RBFD.js} +2 -2
- package/dist/config-FPM3LAW7.js +9 -0
- package/dist/{config-IPNWAJHH.js → config-G3F54CS4.js} +3 -2
- package/dist/{config-BBOLI7VE.js → config-G43HRUI3.js} +2 -2
- package/dist/{config-QO2XUME4.js → config-GG3WO5PB.js} +3 -2
- package/dist/{config-QWQGOXQ5.js → config-JUYBWAZE.js} +2 -2
- package/dist/{config-SPW6NESU.js → config-LJ5T6TVA.js} +2 -2
- package/dist/{config-WVILHDFV.js → config-MDSAE4O3.js} +2 -2
- package/dist/{config-MZM3IPFM.js → config-NRIOKK5T.js} +2 -2
- package/dist/{config-L7SBSH5L.js → config-OYK2BSJK.js} +2 -2
- package/dist/config-PB3KA2CE.js +9 -0
- package/dist/{config-54USUVSE.js → config-QY4IL3PH.js} +3 -2
- package/dist/{config-VKKZGC7V.js → config-R4LAOEDS.js} +2 -2
- package/dist/{config-FRK7ZL37.js → config-RIAAD6RW.js} +3 -2
- package/dist/{config-J2C53GOT.js → config-SYNEQAUB.js} +2 -2
- package/dist/{config-XU6D5C7E.js → config-TJKGYA2B.js} +3 -2
- package/dist/{config-DWSJL3NH.js → config-UURRGA7U.js} +4 -2
- package/dist/{config-BIBFLUIR.js → config-VPLHQXVE.js} +2 -2
- package/dist/config-WRACCRPN.js +9 -0
- package/dist/{config-OJ2BPESH.js → config-WVHKXEVE.js} +3 -2
- package/dist/{config-CPYFOUQO.js → config-XU7R36IE.js} +3 -2
- package/dist/{config-A2GQYJDB.js → config-Y2KOUYSS.js} +2 -2
- 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-2TBT4CVH.js → gmail-YED2MF6H.js} +2 -2
- 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 +897 -609
- package/dist/index.js +2371 -781
- 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-6D55Q2WB.js → redis-LPS357NF.js} +2 -2
- 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/supabase-A3KUFMDC.js +10 -0
- package/dist/tencent-5464UQ2X.js +11 -0
- package/dist/trello-O2KB3FUO.js +8 -0
- package/dist/wasabi-2IKBIWNO.js +10 -0
- package/dist/wasabi-2IKBIWNO.js.map +1 -0
- package/package.json +15 -3
- package/dist/aliyun-PGI57A43.js +0 -10
- package/dist/backblaze-TSPL6Y56.js +0 -10
- package/dist/box-7XTZYDSO.js +0 -8
- package/dist/ceph-C265UI5T.js +0 -10
- package/dist/chunk-2ERLWAGG.js.map +0 -1
- package/dist/chunk-2QNPKPZZ.js +0 -59
- package/dist/chunk-2QNPKPZZ.js.map +0 -1
- package/dist/chunk-3ASOQTZB.js +0 -59
- package/dist/chunk-3ASOQTZB.js.map +0 -1
- package/dist/chunk-3JZN3GYO.js.map +0 -1
- package/dist/chunk-4GYB7DGC.js.map +0 -1
- package/dist/chunk-5YRWF5RP.js.map +0 -1
- package/dist/chunk-5ZHNPNDD.js.map +0 -1
- package/dist/chunk-AULFV3KY.js.map +0 -1
- package/dist/chunk-BWLUBJQG.js.map +0 -1
- package/dist/chunk-C7TNKIK5.js.map +0 -1
- package/dist/chunk-CB76WPUS.js.map +0 -1
- package/dist/chunk-CGGO5NKD.js.map +0 -1
- package/dist/chunk-CQCTCW4S.js.map +0 -1
- package/dist/chunk-D3U7VQCG.js +0 -25
- package/dist/chunk-D3U7VQCG.js.map +0 -1
- package/dist/chunk-E3KXVEYI.js.map +0 -1
- package/dist/chunk-EVK6HH6Z.js +0 -17
- package/dist/chunk-EVK6HH6Z.js.map +0 -1
- package/dist/chunk-FRGTDZQT.js.map +0 -1
- package/dist/chunk-GF75O2EN.js +0 -54
- package/dist/chunk-GF75O2EN.js.map +0 -1
- package/dist/chunk-GTAS3QVC.js +0 -25
- package/dist/chunk-GTAS3QVC.js.map +0 -1
- package/dist/chunk-H62XQZUM.js.map +0 -1
- package/dist/chunk-HCU3B6FW.js.map +0 -1
- package/dist/chunk-HEDE2377.js.map +0 -1
- package/dist/chunk-HGIPWY5Y.js.map +0 -1
- package/dist/chunk-HSD24IP2.js.map +0 -1
- package/dist/chunk-HWQPEBID.js.map +0 -1
- package/dist/chunk-IEHPTILN.js +0 -21
- package/dist/chunk-IEHPTILN.js.map +0 -1
- package/dist/chunk-IEVLWEBO.js.map +0 -1
- package/dist/chunk-IKJQOYI4.js +0 -26
- package/dist/chunk-IKJQOYI4.js.map +0 -1
- package/dist/chunk-IUXXZHY3.js.map +0 -1
- package/dist/chunk-JBDFYIN2.js.map +0 -1
- package/dist/chunk-JEBH5APX.js.map +0 -1
- package/dist/chunk-JHI2PHHD.js +0 -25
- package/dist/chunk-JHI2PHHD.js.map +0 -1
- package/dist/chunk-KAWDDS27.js.map +0 -1
- package/dist/chunk-KGC2OGXI.js +0 -27
- package/dist/chunk-KGC2OGXI.js.map +0 -1
- package/dist/chunk-LPLZLSMK.js.map +0 -1
- package/dist/chunk-M6E7VK4D.js.map +0 -1
- package/dist/chunk-MIQ3ECZM.js +0 -54
- package/dist/chunk-MIQ3ECZM.js.map +0 -1
- package/dist/chunk-MRXTUFBZ.js.map +0 -1
- package/dist/chunk-NJ42VNXG.js.map +0 -1
- package/dist/chunk-OSVZKYXS.js.map +0 -1
- package/dist/chunk-RHUEV4I7.js.map +0 -1
- package/dist/chunk-S4KVLPBR.js.map +0 -1
- package/dist/chunk-SAOQW6ZJ.js.map +0 -1
- package/dist/chunk-SI4GMRXD.js.map +0 -1
- package/dist/chunk-UAJYJP5C.js +0 -59
- package/dist/chunk-UAJYJP5C.js.map +0 -1
- package/dist/chunk-UYA3XL3J.js +0 -54
- package/dist/chunk-UYA3XL3J.js.map +0 -1
- package/dist/chunk-VBYIDRNU.js.map +0 -1
- package/dist/chunk-VHED2STW.js.map +0 -1
- package/dist/chunk-VIICUPWQ.js +0 -23
- package/dist/chunk-VIICUPWQ.js.map +0 -1
- package/dist/chunk-VLRSOWHP.js.map +0 -1
- package/dist/chunk-W5ZLIQFR.js.map +0 -1
- package/dist/chunk-WTSSEUOZ.js +0 -59
- package/dist/chunk-WTSSEUOZ.js.map +0 -1
- package/dist/chunk-WWP2STF5.js +0 -59
- package/dist/chunk-WWP2STF5.js.map +0 -1
- package/dist/chunk-XFSEADPC.js.map +0 -1
- package/dist/chunk-YBVMZ7SR.js +0 -59
- package/dist/chunk-YBVMZ7SR.js.map +0 -1
- package/dist/chunk-YRJICL2Q.js.map +0 -1
- package/dist/chunk-ZMREYTHA.js.map +0 -1
- package/dist/chunk-ZPB3SLPK.js.map +0 -1
- package/dist/chunk-ZPZQXHW2.js.map +0 -1
- package/dist/config-3WDIJPTG.js +0 -9
- package/dist/config-4QV4QYI5.js +0 -9
- package/dist/config-5ZXN2T2H.js +0 -9
- package/dist/config-EHE52ZTK.js +0 -9
- package/dist/config-HTXOOAOD.js +0 -9
- package/dist/config-K63RX6EU.js +0 -9
- package/dist/config-LEALEMKA.js +0 -9
- package/dist/config-RI7IEZUF.js +0 -9
- package/dist/databricks_volume-ETRDJVVQ.js +0 -7
- package/dist/digitalocean-QP72DR4J.js +0 -10
- package/dist/discord-BSN5RB3E.js +0 -8
- package/dist/disk-24NWTN2I.js +0 -7
- package/dist/dropbox-OSTZXSIE.js +0 -8
- package/dist/email-4ZFPSWIN.js +0 -8
- package/dist/gcs-PFWR6MIW.js +0 -10
- package/dist/gdocs-GPAZRQG5.js +0 -8
- package/dist/gdrive-XSX6A7B3.js +0 -8
- package/dist/github-EQ4NXUTA.js +0 -8
- package/dist/github_ci-QL5B2Q2N.js +0 -8
- package/dist/gridfs-KZRZ6SIB.js +0 -9
- package/dist/gsheets-N53WEXN2.js +0 -8
- package/dist/gslides-TATSARTH.js +0 -8
- package/dist/hf_buckets-BK7NGJWS.js +0 -10
- package/dist/hf_datasets-UQ5QGM4L.js +0 -10
- package/dist/hf_models-75LFCQCS.js +0 -10
- package/dist/hf_spaces-6T2KB3UC.js +0 -10
- package/dist/langfuse-AMQCQWNE.js +0 -8
- package/dist/linear-V3TXO6CV.js +0 -8
- package/dist/minio-IZRZY4C5.js +0 -10
- package/dist/mongodb-VMKPQCPX.js +0 -7
- package/dist/nextcloud-5RHQCGDO.js +0 -9
- package/dist/notion-6PPNTQFM.js +0 -8
- package/dist/oci-CKYBSFZJ.js +0 -10
- package/dist/postgres-WIQBVL5M.js +0 -7
- package/dist/qingstor-AP4IIPLY.js +0 -10
- package/dist/r2-C4XGEWQY.js +0 -10
- package/dist/s3-XQBI2CXN.js +0 -8
- package/dist/scaleway-SEZJVURB.js +0 -10
- package/dist/seaweedfs-3XYIAFU2.js +0 -10
- package/dist/slack-ZHXDJQY4.js +0 -8
- package/dist/ssh-X2MO7JOV.js +0 -8
- package/dist/supabase-BBM44UTM.js +0 -10
- package/dist/tencent-X72USLJ7.js +0 -10
- package/dist/trello-EER5NG7L.js +0 -8
- package/dist/wasabi-O4MVIUFG.js +0 -10
- /package/dist/{aliyun-PGI57A43.js.map → aliyun-S62BR3TB.js.map} +0 -0
- /package/dist/{backblaze-TSPL6Y56.js.map → backblaze-4EKSW63F.js.map} +0 -0
- /package/dist/{box-7XTZYDSO.js.map → box-ZPLZAGMK.js.map} +0 -0
- /package/dist/{ceph-C265UI5T.js.map → ceph-ALKLD3MO.js.map} +0 -0
- /package/dist/{chunk-4M73WHIE.js.map → chunk-BZTVYOES.js.map} +0 -0
- /package/dist/{chunk-BWWU5T2D.js.map → chunk-ENW5BVYN.js.map} +0 -0
- /package/dist/{chunk-F5NWRF32.js.map → chunk-ETIAW4YD.js.map} +0 -0
- /package/dist/{chunk-TUNR4VUM.js.map → chunk-GMMQ3ZK4.js.map} +0 -0
- /package/dist/{chunk-DXU7NZPH.js.map → chunk-HCRYAFBI.js.map} +0 -0
- /package/dist/{chunk-V7JVMG63.js.map → chunk-OXEQSPND.js.map} +0 -0
- /package/dist/{config-2LASFFRD.js.map → config-2YBCHU2W.js.map} +0 -0
- /package/dist/{config-3WDIJPTG.js.map → config-3YRGRW72.js.map} +0 -0
- /package/dist/{config-4QV4QYI5.js.map → config-4GSOMUMF.js.map} +0 -0
- /package/dist/{config-54USUVSE.js.map → config-5YBUWFUP.js.map} +0 -0
- /package/dist/{config-5ZXN2T2H.js.map → config-5ZRKJTKG.js.map} +0 -0
- /package/dist/{config-A2GQYJDB.js.map → config-A25LTL5W.js.map} +0 -0
- /package/dist/{config-BBOLI7VE.js.map → config-CLU7JABG.js.map} +0 -0
- /package/dist/{config-BIBFLUIR.js.map → config-D2RF7L3N.js.map} +0 -0
- /package/dist/{config-CPYFOUQO.js.map → config-E55TKM6K.js.map} +0 -0
- /package/dist/{config-DWSJL3NH.js.map → config-ELDOFRJW.js.map} +0 -0
- /package/dist/{config-E22XAGYN.js.map → config-FPC3RBFD.js.map} +0 -0
- /package/dist/{config-EHE52ZTK.js.map → config-FPM3LAW7.js.map} +0 -0
- /package/dist/{config-EX3ZJTZI.js.map → config-G3F54CS4.js.map} +0 -0
- /package/dist/{config-FRK7ZL37.js.map → config-G43HRUI3.js.map} +0 -0
- /package/dist/{config-HQXNFQZS.js.map → config-GG3WO5PB.js.map} +0 -0
- /package/dist/{config-HTXOOAOD.js.map → config-JUYBWAZE.js.map} +0 -0
- /package/dist/{config-IPNWAJHH.js.map → config-LJ5T6TVA.js.map} +0 -0
- /package/dist/{config-J2C53GOT.js.map → config-MDSAE4O3.js.map} +0 -0
- /package/dist/{config-K63RX6EU.js.map → config-NRIOKK5T.js.map} +0 -0
- /package/dist/{config-L7SBSH5L.js.map → config-OYK2BSJK.js.map} +0 -0
- /package/dist/{config-LEALEMKA.js.map → config-PB3KA2CE.js.map} +0 -0
- /package/dist/{config-M3Z47VYU.js.map → config-QY4IL3PH.js.map} +0 -0
- /package/dist/{config-MZM3IPFM.js.map → config-R4LAOEDS.js.map} +0 -0
- /package/dist/{config-OJ2BPESH.js.map → config-RIAAD6RW.js.map} +0 -0
- /package/dist/{config-QO2XUME4.js.map → config-SYNEQAUB.js.map} +0 -0
- /package/dist/{config-QWQGOXQ5.js.map → config-TJKGYA2B.js.map} +0 -0
- /package/dist/{config-RI7IEZUF.js.map → config-UURRGA7U.js.map} +0 -0
- /package/dist/{config-SPW6NESU.js.map → config-VPLHQXVE.js.map} +0 -0
- /package/dist/{config-T2IUIU5C.js.map → config-WRACCRPN.js.map} +0 -0
- /package/dist/{config-VKKZGC7V.js.map → config-WVHKXEVE.js.map} +0 -0
- /package/dist/{config-W7EVPJNK.js.map → config-XU7R36IE.js.map} +0 -0
- /package/dist/{config-WKQ3FGTZ.js.map → config-Y2KOUYSS.js.map} +0 -0
- /package/dist/{config-WVILHDFV.js.map → databricks_volume-CNCPTZHS.js.map} +0 -0
- /package/dist/{config-XU6D5C7E.js.map → digitalocean-DJZOUB6Q.js.map} +0 -0
- /package/dist/{databricks_volume-ETRDJVVQ.js.map → discord-ETB2CADR.js.map} +0 -0
- /package/dist/{digitalocean-QP72DR4J.js.map → disk-WEHSTK3F.js.map} +0 -0
- /package/dist/{discord-BSN5RB3E.js.map → dropbox-XN6PGLNE.js.map} +0 -0
- /package/dist/{disk-24NWTN2I.js.map → email-OV7XCP3T.js.map} +0 -0
- /package/dist/{dropbox-OSTZXSIE.js.map → gcal-P56MRCGU.js.map} +0 -0
- /package/dist/{email-4ZFPSWIN.js.map → gcs-HFBIAE2C.js.map} +0 -0
- /package/dist/{gcs-PFWR6MIW.js.map → gdocs-LQ3UXP3J.js.map} +0 -0
- /package/dist/{gdocs-GPAZRQG5.js.map → gdrive-N6UBYLON.js.map} +0 -0
- /package/dist/{gdrive-XSX6A7B3.js.map → github-BPZREGPI.js.map} +0 -0
- /package/dist/{github-EQ4NXUTA.js.map → github_ci-7A4LUIZ7.js.map} +0 -0
- /package/dist/{github_ci-QL5B2Q2N.js.map → gmail-YED2MF6H.js.map} +0 -0
- /package/dist/{gmail-2TBT4CVH.js.map → gridfs-CPLQ4G62.js.map} +0 -0
- /package/dist/{gridfs-KZRZ6SIB.js.map → gsheets-4BNIJPQ6.js.map} +0 -0
- /package/dist/{gsheets-N53WEXN2.js.map → gslides-GDBYLO5A.js.map} +0 -0
- /package/dist/{gslides-TATSARTH.js.map → hf_buckets-FTJITQ3P.js.map} +0 -0
- /package/dist/{hf_buckets-BK7NGJWS.js.map → hf_datasets-6GXVKQD7.js.map} +0 -0
- /package/dist/{hf_datasets-UQ5QGM4L.js.map → hf_models-PJPGZAC5.js.map} +0 -0
- /package/dist/{hf_models-75LFCQCS.js.map → hf_spaces-LFNFOLBF.js.map} +0 -0
- /package/dist/{hf_spaces-6T2KB3UC.js.map → jaeger-GCA6MJ6E.js.map} +0 -0
- /package/dist/{langfuse-AMQCQWNE.js.map → lancedb-TJ5YSJY5.js.map} +0 -0
- /package/dist/{linear-V3TXO6CV.js.map → langfuse-RUMTUMXS.js.map} +0 -0
- /package/dist/{minio-IZRZY4C5.js.map → linear-BCE4KEAC.js.map} +0 -0
- /package/dist/{mongodb-VMKPQCPX.js.map → minio-5SO6KBTK.js.map} +0 -0
- /package/dist/{nextcloud-5RHQCGDO.js.map → mongodb-L5CMN2EE.js.map} +0 -0
- /package/dist/{notion-6PPNTQFM.js.map → nextcloud-4O2LZVW2.js.map} +0 -0
- /package/dist/{oci-CKYBSFZJ.js.map → notion-RVKEAQ2M.js.map} +0 -0
- /package/dist/{postgres-WIQBVL5M.js.map → oci-OQXOIC62.js.map} +0 -0
- /package/dist/{qingstor-AP4IIPLY.js.map → postgres-AV45GNRS.js.map} +0 -0
- /package/dist/{r2-C4XGEWQY.js.map → qingstor-W277YA4K.js.map} +0 -0
- /package/dist/{redis-6D55Q2WB.js.map → r2-FUA4IORE.js.map} +0 -0
- /package/dist/{s3-XQBI2CXN.js.map → redis-LPS357NF.js.map} +0 -0
- /package/dist/{scaleway-SEZJVURB.js.map → s3-FPNWWIVM.js.map} +0 -0
- /package/dist/{seaweedfs-3XYIAFU2.js.map → scaleway-BP3732U7.js.map} +0 -0
- /package/dist/{slack-ZHXDJQY4.js.map → seaweedfs-MC6HIEP4.js.map} +0 -0
- /package/dist/{ssh-X2MO7JOV.js.map → slack-JFGW7VLN.js.map} +0 -0
- /package/dist/{supabase-BBM44UTM.js.map → ssh-UYPG42LM.js.map} +0 -0
- /package/dist/{tencent-X72USLJ7.js.map → supabase-A3KUFMDC.js.map} +0 -0
- /package/dist/{trello-EER5NG7L.js.map → tencent-5464UQ2X.js.map} +0 -0
- /package/dist/{wasabi-O4MVIUFG.js.map → trello-O2KB3FUO.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/resource/email/email.ts","../src/accessor/email.ts","../src/commands/builtin/email/index.ts","../src/commands/builtin/email/find.ts","../src/core/email/readdir.ts","../src/core/email/_parse.ts","../src/core/email/_client.ts","../src/core/email/folders.ts","../src/core/email/stat.ts","../src/core/email/read.ts","../src/commands/builtin/email/io.ts","../src/commands/builtin/email/provision.ts","../src/commands/builtin/email/email_forward.ts","../src/core/email/send.ts","../src/commands/builtin/email/grep.ts","../src/core/email/scope.ts","../src/core/email/search.ts","../src/commands/builtin/email/email_read.ts","../src/commands/builtin/email/email_reply.ts","../src/commands/builtin/email/rg.ts","../src/commands/builtin/email/email_send.ts","../src/commands/builtin/email/email_triage.ts","../src/ops/email/index.ts","../src/resource/email/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 RegisteredCommand,\n type RegisteredOp,\n type Resource,\n} from '@struktoai/mirage-core'\nimport { EmailAccessor } from '../../accessor/email.ts'\nimport { EMAIL_COMMANDS } from '../../commands/builtin/email/index.ts'\nimport { read as emailRead } from '../../core/email/read.ts'\nimport { readdir as emailReaddir } from '../../core/email/readdir.ts'\nimport { stat as emailStat } from '../../core/email/stat.ts'\nimport { EMAIL_OPS } from '../../ops/email/index.ts'\nimport { redactEmailConfig, type EmailConfig, type EmailConfigRedacted } from './config.ts'\nimport { EMAIL_PROMPT } from './prompt.ts'\n\nconst resolveGlob = makeResolveGlob(emailReaddir)\n\nexport interface EmailResourceState {\n type: string\n config: EmailConfigRedacted\n}\n\nexport class EmailResource extends BaseResource implements Resource {\n readonly kind: string = ResourceName.EMAIL\n readonly cachesReads: boolean = true\n override readonly indexTtl: number = 86_400\n readonly prompt: string = EMAIL_PROMPT\n readonly config: EmailConfig\n readonly accessor: EmailAccessor\n\n constructor(config: EmailConfig) {\n super()\n this.config = config\n this.accessor = new EmailAccessor(config)\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n async close(): Promise<void> {\n await this.accessor.close()\n }\n\n commands(): readonly RegisteredCommand[] {\n return EMAIL_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return EMAIL_OPS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return emailRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return emailReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return emailStat(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 resolveGlob(this.accessor, effective, this.index)\n }\n\n getState(): Promise<EmailResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactEmailConfig(this.config),\n })\n }\n\n loadState(_state: EmailResourceState): 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 { Accessor, loadOptionalPeer } from '@struktoai/mirage-core'\nimport type { ImapFlow } from 'imapflow'\nimport type { EmailConfig } from '../resource/email/config.ts'\n\nexport class EmailAccessor extends Accessor {\n readonly config: EmailConfig\n private clientPromise: Promise<ImapFlow> | null = null\n\n constructor(config: EmailConfig) {\n super()\n this.config = config\n }\n\n async getImap(): Promise<ImapFlow> {\n this.clientPromise ??= (async () => {\n const mod = await loadOptionalPeer(\n () =>\n import('imapflow') as unknown as Promise<{\n ImapFlow: typeof ImapFlow\n }>,\n { feature: 'EmailAccessor', packageName: 'imapflow' },\n )\n const client = new mod.ImapFlow({\n host: this.config.imapHost,\n port: this.config.imapPort,\n secure: this.config.useSsl,\n auth: { user: this.config.username, pass: this.config.password },\n logger: false,\n })\n await client.connect()\n return client\n })()\n try {\n return await this.clientPromise\n } catch (err) {\n this.clientPromise = null\n throw err\n }\n }\n\n async close(): Promise<void> {\n if (this.clientPromise === null) return\n try {\n const c = await this.clientPromise\n await c.logout()\n } catch {\n // ignore — best-effort cleanup\n }\n this.clientPromise = null\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 RegisteredCommand, ResourceName, makeGenericCommands } from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { EMAIL_FIND } from './find.ts'\nimport { EMAIL_FORWARD } from './email_forward.ts'\nimport { EMAIL_GREP } from './grep.ts'\nimport { EMAIL_IO } from './io.ts'\nimport { EMAIL_READ } from './email_read.ts'\nimport { EMAIL_REPLY } from './email_reply.ts'\nimport { EMAIL_RG } from './rg.ts'\nimport { EMAIL_SEND } from './email_send.ts'\nimport { EMAIL_TRIAGE } from './email_triage.ts'\n\nconst EMAIL_OVERRIDES = new Set(['find', 'grep', 'rg'])\n\nexport const EMAIL_COMMANDS: readonly RegisteredCommand[] = [\n ...makeGenericCommands<EmailAccessor>(ResourceName.EMAIL, EMAIL_IO, {\n overrides: EMAIL_OVERRIDES,\n }),\n ...EMAIL_FIND,\n ...EMAIL_GREP,\n ...EMAIL_RG,\n ...EMAIL_SEND,\n ...EMAIL_REPLY,\n ...EMAIL_FORWARD,\n ...EMAIL_TRIAGE,\n ...EMAIL_READ,\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 FileType,\n IOResult,\n PathSpec,\n ResourceName,\n command,\n formatRecords,\n mountKey,\n mountPrefixOf,\n resolveGlobOf,\n rstripSlash,\n specOf,\n stripSlash,\n type ByteSource,\n type CommandFnResult,\n type CommandOpts,\n type FileStat,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { readdir as emailReaddir } from '../../../core/email/readdir.ts'\nimport { stat as emailStat } from '../../../core/email/stat.ts'\nimport { EMAIL_IO } from './io.ts'\nimport { metadataProvision } from './provision.ts'\nimport { fnmatch } from '@struktoai/mirage-core'\nimport { findSizeMtimeError, invalidFindArg } from '@struktoai/mirage-core'\n\nconst resolveGlob = resolveGlobOf(EMAIL_IO)\n\nasync function walk(\n accessor: EmailAccessor,\n path: PathSpec,\n index: CommandOpts['index'],\n maxDepth: number | null,\n depth: number,\n): Promise<string[]> {\n if (maxDepth !== null && depth > maxDepth) return []\n let children: string[]\n try {\n children = await emailReaddir(accessor, path, index ?? undefined)\n } catch {\n return []\n }\n const results: string[] = []\n for (const child of children) {\n const trimmed = rstripSlash(child)\n results.push(trimmed)\n const childSpec = new PathSpec({\n virtual: trimmed,\n directory: trimmed,\n resolved: false,\n resourcePath: mountKey(trimmed, mountPrefixOf(path.virtual, path.resourcePath)),\n })\n // readdir emits plain names, so directory-ness comes from stat (served\n // from the index entries the readdir above just wrote).\n let st: FileStat\n try {\n st = await emailStat(accessor, childSpec, index ?? undefined)\n } catch {\n continue\n }\n if (st.type === FileType.DIRECTORY) {\n const sub = await walk(accessor, childSpec, index, maxDepth, depth + 1)\n results.push(...sub)\n }\n }\n return results\n}\n\nasync function findCommand(\n accessor: EmailAccessor,\n paths: PathSpec[],\n _texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const resolved = await resolveGlob(accessor, paths, opts.index ?? undefined)\n const p0 =\n resolved[0] ??\n new PathSpec({\n virtual: '/',\n directory: '/',\n resolved: false,\n resourcePath: '',\n })\n const nameFlag = typeof opts.flags.name === 'string' ? opts.flags.name : null\n const inameFlag = typeof opts.flags.iname === 'string' ? opts.flags.iname : null\n const maxDepthRaw = typeof opts.flags.maxdepth === 'string' ? opts.flags.maxdepth : null\n const minDepthRaw = typeof opts.flags.mindepth === 'string' ? opts.flags.mindepth : null\n const maxDepth = maxDepthRaw !== null ? Number.parseInt(maxDepthRaw, 10) : null\n const minDepth = minDepthRaw !== null ? Number.parseInt(minDepthRaw, 10) : null\n if (maxDepthRaw !== null && Number.isNaN(maxDepth))\n return invalidFindArg(maxDepthRaw, '-maxdepth')\n if (minDepthRaw !== null && Number.isNaN(minDepth))\n return invalidFindArg(minDepthRaw, '-mindepth')\n const sizeFlag = typeof opts.flags.size === 'string' ? opts.flags.size : null\n const mtimeFlag = typeof opts.flags.mtime === 'string' ? opts.flags.mtime : null\n const sizeMtimeErr = findSizeMtimeError(sizeFlag, mtimeFlag)\n if (sizeMtimeErr !== null) return sizeMtimeErr\n\n const allPaths = await walk(accessor, p0, opts.index, maxDepth, 0)\n const searchKey = stripSlash(p0.mountPath)\n const baseDepth = searchKey === '' ? -1 : searchKey.split('/').length - 1\n const results: string[] = []\n for (const p of [...allPaths].sort()) {\n const stripped = p.startsWith(mountPrefixOf(p0.virtual, p0.resourcePath))\n ? p.slice(mountPrefixOf(p0.virtual, p0.resourcePath).length)\n : p\n const trimmed = stripSlash(stripped)\n const depth = trimmed === '' ? -1 : trimmed.split('/').length - (baseDepth + 2)\n if (minDepth !== null && depth < minDepth) continue\n const entryName = p.split('/').pop() ?? p\n if (nameFlag !== null && !fnmatch(entryName, nameFlag)) continue\n if (inameFlag !== null && !fnmatch(entryName.toLowerCase(), inameFlag.toLowerCase())) continue\n results.push(p)\n }\n const out: ByteSource = formatRecords(results)\n return [out, new IOResult()]\n}\n\nexport const EMAIL_FIND = command({\n name: 'find',\n resource: ResourceName.EMAIL,\n spec: specOf('find'),\n fn: findCommand,\n provision: metadataProvision,\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 { IndexCacheStore, PathSpec } from '@struktoai/mirage-core'\nimport {\n IndexEntry,\n PathSpec as PathSpecCtor,\n mountKey,\n mountPrefixOf,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../accessor/email.ts'\nimport { fetchHeaders, listMessageUids } from './_client.ts'\nimport { listFolders } from './folders.ts'\nimport type { ParsedAttachment } from './_parse.ts'\n\nconst TITLE_MAX = 80\nconst UNSAFE = /[^\\w\\s\\-.]/g\nconst MULTI_UNDERSCORE = /_+/g\n\nfunction sanitize(text: string): string {\n if (text.trim() === '') return 'No_Subject'\n let cleaned = text.replace(UNSAFE, '_').replace(/ /g, '_')\n cleaned = cleaned.replace(MULTI_UNDERSCORE, '_').replace(/^_+|_+$/g, '')\n if (cleaned.length > TITLE_MAX) cleaned = `${cleaned.slice(0, TITLE_MAX - 3)}...`\n return cleaned\n}\n\nfunction msgFilename(subject: string, uid: string): string {\n return `${sanitize(subject)}__${uid}.email.json`\n}\n\nfunction dateFromHeader(dateStr: string): string {\n if (dateStr === '') return '1970-01-01'\n const d = new Date(dateStr)\n if (Number.isNaN(d.getTime())) return '1970-01-01'\n const yyyy = d.getUTCFullYear().toString().padStart(4, '0')\n const mm = (d.getUTCMonth() + 1).toString().padStart(2, '0')\n const dd = d.getUTCDate().toString().padStart(2, '0')\n return `${yyyy}-${mm}-${dd}`\n}\n\nfunction enoent(p: string): Error {\n const e = new Error(`ENOENT: ${p}`) as Error & { code: string }\n e.code = 'ENOENT'\n return e\n}\n\nexport async function readdir(\n accessor: EmailAccessor,\n path: PathSpec,\n index?: IndexCacheStore,\n): Promise<string[]> {\n const prefix = mountPrefixOf(path.virtual, path.resourcePath)\n const key = (path.pattern !== null ? path.dir : path).resourcePath\n const virtualKey = key !== '' ? `${prefix}/${key}` : prefix !== '' ? prefix : '/'\n const parts = key === '' ? [] : key.split('/')\n const depth = parts.length\n\n if (depth === 0) {\n if (index !== undefined) {\n const cached = await index.listDir(virtualKey)\n if (cached.entries !== undefined && cached.entries !== null) return cached.entries\n }\n const folders = await listFolders(accessor)\n const entries: [string, IndexEntry][] = []\n for (const folderName of folders) {\n const entry = new IndexEntry({\n id: folderName,\n name: folderName,\n resourceType: 'email/folder',\n vfsName: folderName,\n })\n entries.push([folderName, entry])\n }\n if (index !== undefined) await index.setDir(virtualKey, entries)\n return entries.map(([name]) => `${prefix}/${name}`)\n }\n\n if (depth === 1) {\n const folderName = parts[0] ?? ''\n if (index !== undefined) {\n const cached = await index.listDir(virtualKey)\n if (cached.entries !== undefined && cached.entries !== null) return cached.entries\n }\n if (index === undefined) throw enoent(path.virtual)\n const maxMessages = accessor.config.maxMessages\n const uids = await listMessageUids(accessor, folderName, 'ALL', maxMessages)\n const headersList = await fetchHeaders(accessor, folderName, uids)\n const dateGroups = new Map<string, typeof headersList>()\n for (const hdr of headersList) {\n const dateStr = dateFromHeader(hdr.date)\n let bucket = dateGroups.get(dateStr)\n if (bucket === undefined) {\n bucket = []\n dateGroups.set(dateStr, bucket)\n }\n bucket.push(hdr)\n }\n const sortedDates = [...dateGroups.keys()].sort().reverse()\n const dateEntries: [string, IndexEntry][] = []\n for (const dateStr of sortedDates) {\n const dateEntry = new IndexEntry({\n id: dateStr,\n name: dateStr,\n resourceType: 'email/date',\n vfsName: dateStr,\n })\n dateEntries.push([dateStr, dateEntry])\n const msgEntries: [string, IndexEntry][] = []\n for (const hdr of dateGroups.get(dateStr) ?? []) {\n const uid = hdr.uid\n const subject = hdr.subject || 'No Subject'\n const filename = msgFilename(subject, uid)\n const msgEntry = new IndexEntry({\n id: uid,\n name: subject,\n resourceType: 'email/message',\n vfsName: filename,\n })\n msgEntries.push([filename, msgEntry])\n const attachments: ParsedAttachment[] = hdr.attachments\n if (attachments.length > 0) {\n const attDirName = filename.replace('.email.json', '')\n const attDirEntry = new IndexEntry({\n id: uid,\n name: attDirName,\n resourceType: 'email/attachment_dir',\n vfsName: attDirName,\n })\n msgEntries.push([attDirName, attDirEntry])\n const attEntries: [string, IndexEntry][] = []\n for (const att of attachments) {\n const attEntry = new IndexEntry({\n id: att.filename,\n name: att.filename,\n resourceType: 'email/attachment',\n vfsName: att.filename,\n size: att.size,\n })\n attEntries.push([att.filename, attEntry])\n }\n const attDirVKey = `${virtualKey}/${dateStr}/${attDirName}`\n await index.setDir(attDirVKey, attEntries)\n }\n }\n const dateVKey = `${virtualKey}/${dateStr}`\n await index.setDir(dateVKey, msgEntries)\n }\n await index.setDir(virtualKey, dateEntries)\n return dateEntries.map(([name]) => `${prefix}/${key}/${name}`)\n }\n\n if (depth === 2 || depth === 3) {\n if (index === undefined) throw enoent(path.virtual)\n let cached = await index.listDir(virtualKey)\n if (cached.entries !== undefined && cached.entries !== null) return cached.entries\n const folderPath = prefix !== '' ? `${prefix}/${parts[0] ?? ''}` : `/${parts[0] ?? ''}`\n const folderSpec = new PathSpecCtor({\n virtual: folderPath,\n directory: folderPath,\n resourcePath: mountKey(folderPath, prefix),\n })\n await readdir(accessor, folderSpec, index)\n cached = await index.listDir(virtualKey)\n if (cached.entries !== undefined && cached.entries !== null) return cached.entries\n throw enoent(path.virtual)\n }\n\n throw enoent(path.virtual)\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 { loadOptionalPeer } from '@struktoai/mirage-core'\nimport type {\n AddressObject,\n EmailAddress as MailparserEmailAddress,\n ParsedMail,\n simpleParser,\n} from 'mailparser'\n\ninterface EmailAddress {\n name: string\n email: string\n}\n\nexport interface ParsedAttachment {\n filename: string\n content_type: string\n size: number\n}\n\nexport interface ParsedAttachmentWithPayload extends ParsedAttachment {\n payload: Uint8Array\n}\n\nexport interface ParsedRfc822 {\n from: EmailAddress\n to: EmailAddress[]\n cc: EmailAddress[]\n subject: string\n date: string\n body_text: string\n body_html: string\n snippet: string\n message_id: string\n in_reply_to: string | null\n references: string[]\n has_attachments: boolean\n attachments: ParsedAttachment[]\n}\n\nlet parserPromise: Promise<typeof simpleParser> | null = null\n\nasync function getParser(): Promise<typeof simpleParser> {\n parserPromise ??= (async () => {\n const mod = await loadOptionalPeer(\n () =>\n import('mailparser') as unknown as Promise<{\n simpleParser: typeof simpleParser\n }>,\n { feature: 'parseRfc822', packageName: 'mailparser' },\n )\n return mod.simpleParser\n })()\n return parserPromise\n}\n\nfunction toAddr(a: MailparserEmailAddress | undefined): EmailAddress {\n if (a === undefined) return { name: '', email: '' }\n return { name: a.name, email: a.address ?? '' }\n}\n\nfunction toAddrList(list: AddressObject | AddressObject[] | undefined): EmailAddress[] {\n if (list === undefined) return []\n const objs = Array.isArray(list) ? list : [list]\n return objs.flatMap((obj) => obj.value.map((a) => toAddr(a)))\n}\n\n// The rendered date must be the raw Date header text (python serves the\n// header untouched); mailparser's parsed.date would re-format it.\nfunction rawDateHeader(parsed: ParsedMail): string {\n const found = parsed.headerLines.find((h) => h.key === 'date')\n if (found === undefined) return ''\n const colon = found.line.indexOf(':')\n return colon === -1 ? '' : found.line.slice(colon + 1).trim()\n}\n\nfunction fromParsed(parsed: ParsedMail, headersOnly: boolean): ParsedRfc822 {\n const text = headersOnly ? '' : (parsed.text ?? '')\n const html = headersOnly ? '' : typeof parsed.html === 'string' ? parsed.html : ''\n const attachments = headersOnly\n ? []\n : parsed.attachments.map((a) => ({\n filename: a.filename ?? 'unnamed',\n content_type: a.contentType,\n size: a.size,\n }))\n const refsRaw = parsed.references\n const references =\n typeof refsRaw === 'string' ? refsRaw.split(/\\s+/).filter((s) => s !== '') : (refsRaw ?? [])\n return {\n from: toAddr(parsed.from?.value[0]),\n to: toAddrList(parsed.to),\n cc: toAddrList(parsed.cc),\n subject: parsed.subject ?? '',\n date: rawDateHeader(parsed),\n body_text: text,\n body_html: html,\n snippet: text.slice(0, 100),\n message_id: parsed.messageId ?? '',\n in_reply_to:\n typeof parsed.inReplyTo === 'string' && parsed.inReplyTo !== '' ? parsed.inReplyTo : null,\n references,\n has_attachments: attachments.length > 0,\n attachments,\n }\n}\n\nexport async function parseRfc822(raw: Uint8Array, headersOnly = false): Promise<ParsedRfc822> {\n const parser = await getParser()\n const parsed = await parser(Buffer.from(raw), { skipHtmlToText: false })\n return fromParsed(parsed, headersOnly)\n}\n\nexport async function parseWithPayloads(raw: Uint8Array): Promise<ParsedAttachmentWithPayload[]> {\n const parser = await getParser()\n const parsed = await parser(Buffer.from(raw))\n return parsed.attachments.map((a) => ({\n filename: a.filename ?? 'unnamed',\n content_type: a.contentType,\n size: a.size,\n payload: new Uint8Array(a.content),\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 { EmailAccessor } from '../../accessor/email.ts'\nimport { parseRfc822, parseWithPayloads, type ParsedRfc822 } from './_parse.ts'\n\nexport interface FetchedMessage extends ParsedRfc822 {\n uid: string\n flags: string[]\n}\n\nexport async function listFolders(accessor: EmailAccessor): Promise<string[]> {\n const imap = await accessor.getImap()\n const tree = await imap.list()\n return tree.map((m) => m.pathAsListed)\n}\n\nexport async function listMessageUids(\n accessor: EmailAccessor,\n folder: string,\n searchCriteria = 'ALL',\n maxResults: number | null = null,\n): Promise<string[]> {\n const imap = await accessor.getImap()\n const lock = await imap.getMailboxLock(folder)\n try {\n const query = parseSearchCriteria(searchCriteria)\n const uidsRaw = await imap.search(query, { uid: true })\n if (uidsRaw === false) return []\n const uids = uidsRaw.map((n) => String(n))\n if (maxResults !== null && uids.length > maxResults) {\n return uids.slice(uids.length - maxResults)\n }\n return uids\n } finally {\n lock.release()\n }\n}\n\ninterface SearchQuery {\n all?: boolean\n unseen?: boolean\n body?: string\n text?: string\n subject?: string\n from?: string\n to?: string\n since?: Date\n before?: Date\n}\n\nfunction parseSearchCriteria(criteria: string): SearchQuery {\n if (criteria === 'ALL' || criteria === '') return { all: true }\n const out: SearchQuery = {}\n const tokens = tokenizeCriteria(criteria)\n let i = 0\n while (i < tokens.length) {\n const tok = (tokens[i] ?? '').toUpperCase()\n if (tok === 'UNSEEN') {\n out.unseen = true\n i += 1\n continue\n }\n if (\n tok === 'TEXT' ||\n tok === 'SUBJECT' ||\n tok === 'FROM' ||\n tok === 'TO' ||\n tok === 'SINCE' ||\n tok === 'BEFORE'\n ) {\n const v = tokens[i + 1] ?? ''\n if (tok === 'TEXT') out.text = v\n else if (tok === 'SUBJECT') out.subject = v\n else if (tok === 'FROM') out.from = v\n else if (tok === 'TO') out.to = v\n else if (tok === 'SINCE') {\n const d = parseImapDate(v)\n if (d !== null) out.since = d\n } else {\n const d = parseImapDate(v)\n if (d !== null) out.before = d\n }\n i += 2\n continue\n }\n i += 1\n }\n return out\n}\n\nfunction tokenizeCriteria(criteria: string): string[] {\n const tokens: string[] = []\n let i = 0\n while (i < criteria.length) {\n if (criteria[i] === ' ') {\n i += 1\n continue\n }\n if (criteria[i] === '\"') {\n const end = criteria.indexOf('\"', i + 1)\n if (end === -1) {\n tokens.push(criteria.slice(i + 1))\n break\n }\n tokens.push(criteria.slice(i + 1, end))\n i = end + 1\n continue\n }\n let end = criteria.indexOf(' ', i)\n if (end === -1) end = criteria.length\n tokens.push(criteria.slice(i, end))\n i = end\n }\n return tokens\n}\n\nfunction parseImapDate(s: string): Date | null {\n const m = /^(\\d{1,2})-([A-Za-z]{3})-(\\d{4})$/.exec(s)\n if (m === null) return null\n const months: Record<string, number> = {\n Jan: 0,\n Feb: 1,\n Mar: 2,\n Apr: 3,\n May: 4,\n Jun: 5,\n Jul: 6,\n Aug: 7,\n Sep: 8,\n Oct: 9,\n Nov: 10,\n Dec: 11,\n }\n const day = Number.parseInt(m[1] ?? '0', 10)\n const monKey = (m[2] ?? '').slice(0, 1).toUpperCase() + (m[2] ?? '').slice(1).toLowerCase()\n const mon = months[monKey] ?? 0\n const year = Number.parseInt(m[3] ?? '1970', 10)\n return new Date(Date.UTC(year, mon, day))\n}\n\nexport async function fetchMessage(\n accessor: EmailAccessor,\n folder: string,\n uid: string,\n): Promise<FetchedMessage> {\n const imap = await accessor.getImap()\n const lock = await imap.getMailboxLock(folder)\n try {\n const msg = await imap.fetchOne(uid, { source: true, flags: true, uid: true }, { uid: true })\n if (msg === false) {\n throw new Error(`email: uid ${uid} not found in ${folder}`)\n }\n const source = msg.source instanceof Buffer ? new Uint8Array(msg.source) : new Uint8Array(0)\n const parsed = await parseRfc822(source)\n return {\n ...parsed,\n uid,\n flags: msg.flags !== undefined ? [...msg.flags] : [],\n }\n } finally {\n lock.release()\n }\n}\n\nexport async function fetchHeaders(\n accessor: EmailAccessor,\n folder: string,\n uids: readonly string[],\n): Promise<FetchedMessage[]> {\n if (uids.length === 0) return []\n const imap = await accessor.getImap()\n const lock = await imap.getMailboxLock(folder)\n try {\n const results: FetchedMessage[] = []\n for (const uid of uids) {\n // Full source (not headers-only): listings need the MIME structure\n // to surface attachment dirs, mirroring the python backend.\n const msg = await imap.fetchOne(uid, { source: true, flags: true, uid: true }, { uid: true })\n if (msg === false) continue\n const source = msg.source instanceof Buffer ? new Uint8Array(msg.source) : new Uint8Array(0)\n const parsed = await parseRfc822(source)\n results.push({\n ...parsed,\n uid,\n flags: msg.flags !== undefined ? [...msg.flags] : [],\n })\n }\n return results\n } finally {\n lock.release()\n }\n}\n\nexport async function fetchAttachment(\n accessor: EmailAccessor,\n folder: string,\n uid: string,\n filename: string,\n): Promise<Uint8Array | null> {\n const imap = await accessor.getImap()\n const lock = await imap.getMailboxLock(folder)\n try {\n const msg = await imap.fetchOne(uid, { source: true }, { uid: true })\n if (msg === false) return null\n const source = msg.source instanceof Buffer ? new Uint8Array(msg.source) : new Uint8Array(0)\n const attachments = await parseWithPayloads(source)\n for (const att of attachments) {\n if (att.filename === filename) return att.payload\n }\n return null\n } finally {\n lock.release()\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 { EmailAccessor } from '../../accessor/email.ts'\nimport { listFolders as clientListFolders } from './_client.ts'\n\nexport async function listFolders(accessor: EmailAccessor): Promise<string[]> {\n return clientListFolders(accessor)\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 { IndexCacheStore } from '@struktoai/mirage-core'\nimport { FileStat, FileType, PathSpec, mountKey, mountPrefixOf } from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../accessor/email.ts'\nimport { listFolders } from './folders.ts'\nimport { readdir } from './readdir.ts'\n\nfunction guessType(name: string): FileType {\n const lower = name.toLowerCase()\n if (lower.endsWith('.json') || lower.endsWith('.email.json')) return FileType.JSON\n if (lower.endsWith('.csv')) return FileType.CSV\n if (lower.endsWith('.png')) return FileType.IMAGE_PNG\n if (lower.endsWith('.jpg') || lower.endsWith('.jpeg')) return FileType.IMAGE_JPEG\n if (lower.endsWith('.gif')) return FileType.IMAGE_GIF\n if (lower.endsWith('.zip')) return FileType.ZIP\n if (lower.endsWith('.gz') || lower.endsWith('.gzip')) return FileType.GZIP\n if (lower.endsWith('.pdf')) return FileType.PDF\n if (lower.endsWith('.txt') || lower.endsWith('.md') || lower.endsWith('.log')) {\n return FileType.TEXT\n }\n return FileType.BINARY\n}\n\nfunction enoent(p: string): Error {\n const e = new Error(`ENOENT: ${p}`) as Error & { code: string }\n e.code = 'ENOENT'\n return e\n}\n\nexport async function stat(\n accessor: EmailAccessor,\n path: PathSpec,\n index?: IndexCacheStore,\n): Promise<FileStat> {\n const prefix = mountPrefixOf(path.virtual, path.resourcePath)\n const key = path.resourcePath\n if (key === '') return new FileStat({ name: '/', type: FileType.DIRECTORY })\n\n if (index === undefined) throw enoent(path.virtual)\n const virtualKey = prefix !== '' ? `${prefix}/${key}` : `/${key}`\n let result = await index.get(virtualKey)\n if (result.entry === undefined || result.entry === null) {\n if (!key.includes('/')) {\n const folders = await listFolders(accessor)\n if (folders.includes(key)) return new FileStat({ name: key, type: FileType.DIRECTORY })\n throw enoent(path.virtual)\n }\n // Cold index: populate by listing the parent, mirroring the python\n // backend's stat fallback.\n const parentVirtual = virtualKey.slice(0, virtualKey.lastIndexOf('/')) || '/'\n try {\n await readdir(\n accessor,\n new PathSpec({\n virtual: parentVirtual,\n directory: parentVirtual,\n resolved: false,\n resourcePath: mountKey(parentVirtual, prefix),\n }),\n index,\n )\n } catch {\n throw enoent(path.virtual)\n }\n result = await index.get(virtualKey)\n if (result.entry === undefined || result.entry === null) throw enoent(path.virtual)\n }\n const rt = result.entry.resourceType\n const vfsName = result.entry.vfsName !== '' ? result.entry.vfsName : result.entry.name\n if (rt === 'email/folder') return new FileStat({ name: vfsName, type: FileType.DIRECTORY })\n if (rt === 'email/date') return new FileStat({ name: vfsName, type: FileType.DIRECTORY })\n if (rt === 'email/message') {\n return new FileStat({\n name: vfsName,\n type: FileType.JSON,\n size: result.entry.size,\n extra: { uid: result.entry.id },\n })\n }\n if (rt === 'email/attachment_dir') {\n return new FileStat({\n name: vfsName,\n type: FileType.DIRECTORY,\n extra: { uid: result.entry.id },\n })\n }\n if (rt === 'email/attachment') {\n return new FileStat({\n name: vfsName,\n type: guessType(vfsName),\n size: result.entry.size,\n extra: { attachment_id: result.entry.id },\n })\n }\n return new FileStat({ name: vfsName, type: FileType.JSON, extra: { uid: result.entry.id } })\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 { IndexCacheStore, PathSpec } from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../accessor/email.ts'\nimport { fetchAttachment, fetchMessage } from './_client.ts'\nimport { gnuDirname, mountPrefixOf, stripSlash } from '@struktoai/mirage-core'\n\nconst ENC = new TextEncoder()\n\nfunction enoent(p: string): Error {\n const e = new Error(`ENOENT: ${p}`) as Error & { code: string }\n e.code = 'ENOENT'\n return e\n}\n\nfunction eisdir(p: string): Error {\n const e = new Error(`EISDIR: ${p}`) as Error & { code: string }\n e.code = 'EISDIR'\n return e\n}\n\nexport async function read(\n accessor: EmailAccessor,\n path: PathSpec,\n index?: IndexCacheStore,\n): Promise<Uint8Array> {\n const prefix = mountPrefixOf(path.virtual, path.resourcePath)\n const key = path.resourcePath\n if (index === undefined) throw enoent(path.virtual)\n const virtualKey = prefix !== '' ? `${prefix}/${key}` : `/${key}`\n const result = await index.get(virtualKey)\n if (result.entry === undefined || result.entry === null) throw enoent(path.virtual)\n const rt = result.entry.resourceType\n if (rt === 'email/folder' || rt === 'email/date' || rt === 'email/attachment_dir') {\n throw eisdir(path.virtual)\n }\n if (rt === 'email/attachment') {\n const parentKey = gnuDirname(virtualKey)\n const parentResult = await index.get(parentKey)\n if (parentResult.entry === undefined || parentResult.entry === null) {\n throw enoent(path.virtual)\n }\n const uid = parentResult.entry.id\n const parts = stripSlash(virtualKey).split('/')\n const folder = prefix !== '' ? (parts[1] ?? '') : (parts[0] ?? '')\n const filename = result.entry.vfsName !== '' ? result.entry.vfsName : result.entry.name\n const data = await fetchAttachment(accessor, folder, uid, filename)\n if (data === null) throw enoent(path.virtual)\n return data\n }\n const parts = stripSlash(virtualKey).split('/')\n const folder = prefix !== '' ? (parts[1] ?? '') : (parts[0] ?? '')\n const uid = result.entry.id\n const msg = await fetchMessage(accessor, folder, uid)\n return ENC.encode(JSON.stringify(msg))\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, IndexCacheStore, PathSpec } from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { read as emailRead } from '../../../core/email/read.ts'\nimport { readdir as emailReaddir } from '../../../core/email/readdir.ts'\nimport { stat as emailStat } from '../../../core/email/stat.ts'\n\nasync function* emailReadStream(\n accessor: EmailAccessor,\n path: PathSpec,\n index?: IndexCacheStore,\n): AsyncIterable<Uint8Array> {\n yield await emailRead(accessor, path, index)\n}\n\nexport const EMAIL_IO: CommandIO<EmailAccessor> = {\n readdir: emailReaddir,\n readBytes: emailRead,\n readStream: emailReadStream,\n stat: emailStat,\n isMounted: () => true,\n local: 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\nimport {\n Precision,\n ProvisionResult,\n type Accessor,\n type CommandOpts,\n type IndexCacheStore,\n type PathSpec,\n} from '@struktoai/mirage-core'\n\nexport async function fileReadProvision(\n _accessor: Accessor,\n paths: PathSpec[],\n _texts: string[],\n opts: CommandOpts,\n): Promise<ProvisionResult> {\n if (paths.length === 0) return new ProvisionResult({ precision: Precision.UNKNOWN })\n const index: IndexCacheStore | undefined = opts.index ?? undefined\n let ops = 0\n if (index !== undefined) {\n for (const p of paths) {\n const lookup = await index.get(p.virtual)\n if (lookup.entry !== undefined && lookup.entry !== null) ops += 1\n }\n }\n return new ProvisionResult({\n networkReadLow: 0,\n networkReadHigh: 0,\n readOps: ops,\n precision: Precision.EXACT,\n })\n}\n\nexport function metadataProvision(\n _accessor: Accessor,\n _paths: PathSpec[],\n _texts: string[],\n _opts: CommandOpts,\n): ProvisionResult {\n return new ProvisionResult({\n networkReadLow: 0,\n networkReadHigh: 0,\n readOps: 0,\n precision: Precision.EXACT,\n })\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n CommandSpec,\n IOResult,\n OperandKind,\n Option,\n ResourceName,\n command,\n type ByteSource,\n type CommandFnResult,\n type CommandOpts,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { fetchMessage } from '../../../core/email/_client.ts'\nimport { forwardMessage } from '../../../core/email/send.ts'\n\nconst ENC = new TextEncoder()\n\nconst SPEC = new CommandSpec({\n options: [\n new Option({ long: '--uid', valueKind: OperandKind.TEXT }),\n new Option({ long: '--folder', valueKind: OperandKind.TEXT }),\n new Option({ long: '--to', valueKind: OperandKind.TEXT }),\n ],\n})\n\nasync function emailForwardCommand(\n accessor: EmailAccessor,\n _paths: PathSpec[],\n _texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const uid = typeof opts.flags.uid === 'string' ? opts.flags.uid : ''\n const folder = typeof opts.flags.folder === 'string' ? opts.flags.folder : ''\n const to = typeof opts.flags.to === 'string' ? opts.flags.to : ''\n if (uid === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--uid is required\\n') })]\n }\n if (folder === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--folder is required\\n') })]\n }\n if (to === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--to is required\\n') })]\n }\n const original = await fetchMessage(accessor, folder, uid)\n const result = await forwardMessage(accessor.config, original, to)\n const out: ByteSource = ENC.encode(JSON.stringify(result))\n return [out, new IOResult()]\n}\n\nexport const EMAIL_FORWARD = command({\n name: 'himalaya message forward',\n resource: ResourceName.EMAIL,\n spec: SPEC,\n fn: emailForwardCommand,\n write: true,\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 { loadOptionalPeer } from '@struktoai/mirage-core'\nimport type * as Nodemailer from 'nodemailer'\nimport type { EmailConfig } from '../../resource/email/config.ts'\nimport type { FetchedMessage } from './_client.ts'\n\nconst transporterCache = new WeakMap<EmailConfig, Nodemailer.Transporter>()\n\nasync function getTransporter(config: EmailConfig): Promise<Nodemailer.Transporter> {\n const existing = transporterCache.get(config)\n if (existing !== undefined) return existing\n const mod = await loadOptionalPeer(\n () => import('nodemailer') as unknown as Promise<typeof Nodemailer>,\n { feature: 'email send/reply/forward', packageName: 'nodemailer' },\n )\n const transporter = mod.createTransport({\n host: config.smtpHost,\n port: config.smtpPort,\n secure: config.smtpPort === 465,\n auth: { user: config.username, pass: config.password },\n })\n transporterCache.set(config, transporter)\n return transporter\n}\n\nexport interface SendResult {\n status: string\n to: string | string[]\n subject: string\n}\n\nexport async function sendMessage(\n config: EmailConfig,\n to: string,\n subject: string,\n body: string,\n): Promise<SendResult> {\n const t = await getTransporter(config)\n await t.sendMail({ from: config.username, to, subject, text: body })\n return { status: 'sent', to, subject }\n}\n\nexport async function replyMessage(\n config: EmailConfig,\n original: FetchedMessage,\n body: string,\n): Promise<SendResult> {\n const t = await getTransporter(config)\n const refs = [...original.references]\n if (original.message_id !== '') refs.push(original.message_id)\n const subject = `Re: ${original.subject}`\n await t.sendMail({\n from: config.username,\n to: original.from.email,\n subject,\n text: body,\n inReplyTo: original.message_id,\n references: refs,\n })\n return { status: 'sent', to: original.from.email, subject }\n}\n\nexport async function replyAllMessage(\n config: EmailConfig,\n original: FetchedMessage,\n body: string,\n): Promise<SendResult> {\n const t = await getTransporter(config)\n const all = new Set<string>()\n if (original.from.email !== '') all.add(original.from.email)\n for (const r of original.to) if (r.email !== '') all.add(r.email)\n for (const r of original.cc) if (r.email !== '') all.add(r.email)\n all.delete(config.username)\n const recipients = [...all].sort()\n const refs = [...original.references]\n if (original.message_id !== '') refs.push(original.message_id)\n const subject = `Re: ${original.subject}`\n await t.sendMail({\n from: config.username,\n to: recipients,\n subject,\n text: body,\n inReplyTo: original.message_id,\n references: refs,\n })\n return { status: 'sent', to: recipients, subject }\n}\n\nexport async function forwardMessage(\n config: EmailConfig,\n original: FetchedMessage,\n to: string,\n): Promise<SendResult> {\n const t = await getTransporter(config)\n const subject = `Fwd: ${original.subject}`\n const fwdBody =\n `---------- Forwarded message ----------\\n` +\n `From: ${original.from.name} <${original.from.email}>\\n` +\n `Date: ${original.date}\\n` +\n `Subject: ${original.subject}\\n\\n` +\n original.body_text\n await t.sendMail({ from: config.username, to, subject, text: fwdBody })\n return { status: 'sent', to, subject }\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 IOResult,\n ResourceName,\n command,\n compilePattern,\n grepGeneric,\n grepLines,\n mountPrefixOf,\n prefixAggregate,\n resolveGlobOf,\n specOf,\n type ByteSource,\n type CommandFnResult,\n type CommandOpts,\n type FileStat,\n type IndexCacheStore,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { read as emailRead } from '../../../core/email/read.ts'\nimport { readdir as emailReaddir } from '../../../core/email/readdir.ts'\nimport { stat as emailStat } from '../../../core/email/stat.ts'\nimport { detectScope } from '../../../core/email/scope.ts'\nimport { searchAndFormat } from '../../../core/email/search.ts'\nimport { EMAIL_IO } from './io.ts'\nimport { fileReadProvision } from './provision.ts'\n\nconst resolveGlob = resolveGlobOf(EMAIL_IO)\n\nconst ENC = new TextEncoder()\n\nasync function* emailStream(\n accessor: EmailAccessor,\n p: PathSpec,\n index?: IndexCacheStore,\n): AsyncIterable<Uint8Array> {\n yield await emailRead(accessor, p, index)\n}\n\ninterface FlagSet {\n ignoreCase: boolean\n invert: boolean\n lineNumbers: boolean\n countOnly: boolean\n filesOnly: boolean\n wholeWord: boolean\n fixedString: boolean\n onlyMatching: boolean\n maxCount: number | null\n quiet: boolean\n afterContext: number\n beforeContext: number\n}\n\nfunction parseFlags(flags: Record<string, string | boolean | string[]>): FlagSet {\n const toInt = (v: string | boolean | string[] | undefined): number | null =>\n typeof v === 'string' ? Number.parseInt(v, 10) : null\n const aCtx = toInt(flags.A)\n const bCtx = toInt(flags.B)\n const cCtx = toInt(flags.C)\n return {\n ignoreCase: flags.i === true,\n invert: flags.v === true,\n lineNumbers: flags.n === true,\n countOnly: flags.c === true,\n filesOnly: flags.args_l === true || flags.l === true,\n wholeWord: flags.w === true,\n fixedString: flags.F === true,\n onlyMatching: flags.o === true,\n maxCount: toInt(flags.m),\n quiet: flags.q === true,\n afterContext: aCtx ?? cCtx ?? 0,\n beforeContext: bCtx ?? cCtx ?? 0,\n }\n}\n\nfunction getPattern(\n texts: readonly string[],\n flags: Record<string, string | boolean | string[]>,\n): string {\n if (typeof flags.e === 'string') return flags.e\n if (texts.length > 0 && texts[0] !== undefined) return texts[0]\n throw new Error('grep: usage: grep [flags] pattern [path]')\n}\n\nasync function grepCommand(\n accessor: EmailAccessor,\n paths: PathSpec[],\n texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n let pattern: string\n try {\n pattern = getPattern(texts, opts.flags)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode(`${msg}\\n`) })]\n }\n const f = parseFlags(opts.flags)\n\n if (paths.length > 0) {\n const first = paths[0]\n if (first !== undefined) {\n const scope = detectScope(first)\n if (scope.useNative && !pattern.includes('\\n')) {\n const filePrefix =\n mountPrefixOf(first.virtual, first.resourcePath) !== ''\n ? mountPrefixOf(first.virtual, first.resourcePath)\n : ''\n const pairs = await searchAndFormat(accessor, scope, pattern, filePrefix, f.maxCount ?? 50)\n const lines: string[] = []\n for (const [vfsPath, msgText] of pairs) {\n const matched = grepLines(\n vfsPath,\n [msgText],\n compilePattern(pattern, f.ignoreCase, f.fixedString, f.wholeWord),\n f,\n )\n for (const line of matched) lines.push(`${vfsPath}:${line}`)\n }\n if (lines.length === 0) return [new Uint8Array(0), new IOResult({ exitCode: 1 })]\n const out: ByteSource = ENC.encode(lines.join('\\n') + '\\n')\n return [out, new IOResult()]\n }\n }\n }\n\n const resolved =\n paths.length > 0 ? await resolveGlob(accessor, paths, opts.index ?? undefined) : []\n const stat = (p: PathSpec): Promise<FileStat> => emailStat(accessor, p, opts.index ?? undefined)\n const readdir = (p: PathSpec): Promise<string[]> =>\n emailReaddir(accessor, p, opts.index ?? undefined)\n return grepGeneric('grep', resolved, texts, opts, stat, readdir, (p) =>\n emailStream(accessor, p, opts.index ?? undefined),\n )\n}\n\nexport const EMAIL_GREP = command({\n name: 'grep',\n resource: ResourceName.EMAIL,\n spec: specOf('grep'),\n fn: grepCommand,\n aggregate: prefixAggregate,\n provision: fileReadProvision,\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 { stripSlash } from '@struktoai/mirage-core'\n\nexport interface EmailScope {\n useNative: boolean\n folder: string | null\n resourcePath: string\n}\n\nexport function detectScope(path: PathSpec): EmailScope {\n const key = stripSlash(path.mountPath)\n if (key === '') {\n return { useNative: false, folder: null, resourcePath: '/' }\n }\n const parts = key.split('/').filter((s) => s !== '')\n if (parts.length === 0) {\n return { useNative: false, folder: null, resourcePath: '/' }\n }\n if (key.endsWith('.email.json')) {\n return { useNative: false, folder: parts[0] ?? null, resourcePath: key }\n }\n if (parts.length <= 2) {\n return { useNative: true, folder: parts[0] ?? null, resourcePath: key }\n }\n return { useNative: false, folder: parts[0] ?? null, resourcePath: key }\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 { EmailAccessor } from '../../accessor/email.ts'\nimport { fetchMessage, listMessageUids, type FetchedMessage } from './_client.ts'\nimport type { EmailScope } from './scope.ts'\n\nconst TITLE_MAX = 80\nconst UNSAFE = /[^\\w\\s\\-.]/g\nconst MULTI_UNDERSCORE = /_+/g\n\nfunction sanitize(text: string): string {\n if (text.trim() === '') return 'No_Subject'\n let cleaned = text.replace(UNSAFE, '_').replace(/ /g, '_')\n cleaned = cleaned.replace(MULTI_UNDERSCORE, '_').replace(/^_+|_+$/g, '')\n if (cleaned.length > TITLE_MAX) cleaned = `${cleaned.slice(0, TITLE_MAX - 3)}...`\n return cleaned\n}\n\nfunction dateFromHeader(dateStr: string): string {\n if (dateStr === '') return '1970-01-01'\n const d = new Date(dateStr)\n if (Number.isNaN(d.getTime())) return '1970-01-01'\n const yyyy = d.getUTCFullYear().toString().padStart(4, '0')\n const mm = (d.getUTCMonth() + 1).toString().padStart(2, '0')\n const dd = d.getUTCDate().toString().padStart(2, '0')\n return `${yyyy}-${mm}-${dd}`\n}\n\nexport interface SearchOptions {\n text?: string | null\n subject?: string | null\n fromAddr?: string | null\n toAddr?: string | null\n since?: string | null\n before?: string | null\n unseen?: boolean\n}\n\nfunction buildSearchCriteria(opts: SearchOptions): string {\n const parts: string[] = []\n if (opts.unseen === true) parts.push('UNSEEN')\n if (opts.text !== undefined && opts.text !== null && opts.text !== '') {\n parts.push(`TEXT \"${opts.text}\"`)\n }\n if (opts.subject !== undefined && opts.subject !== null && opts.subject !== '') {\n parts.push(`SUBJECT \"${opts.subject}\"`)\n }\n if (opts.fromAddr !== undefined && opts.fromAddr !== null && opts.fromAddr !== '') {\n parts.push(`FROM \"${opts.fromAddr}\"`)\n }\n if (opts.toAddr !== undefined && opts.toAddr !== null && opts.toAddr !== '') {\n parts.push(`TO \"${opts.toAddr}\"`)\n }\n if (opts.since !== undefined && opts.since !== null && opts.since !== '') {\n parts.push(`SINCE ${opts.since}`)\n }\n if (opts.before !== undefined && opts.before !== null && opts.before !== '') {\n parts.push(`BEFORE ${opts.before}`)\n }\n return parts.length > 0 ? parts.join(' ') : 'ALL'\n}\n\nexport async function searchMessages(\n accessor: EmailAccessor,\n folder: string,\n opts: SearchOptions = {},\n maxResults: number | null = null,\n): Promise<string[]> {\n const criteria = buildSearchCriteria(opts)\n return listMessageUids(accessor, folder, criteria, maxResults)\n}\n\nfunction buildVfsPath(prefix: string, folder: string, msg: FetchedMessage): string {\n const dateStr = dateFromHeader(msg.date)\n const subject = sanitize(msg.subject !== '' ? msg.subject : 'No Subject')\n const filename = `${subject}__${msg.uid}.email.json`\n return [prefix, folder, dateStr, filename].filter((p) => p !== '').join('/')\n}\n\nexport async function searchAndFormat(\n accessor: EmailAccessor,\n scope: EmailScope,\n pattern: string,\n prefix: string,\n maxResults: number | null = null,\n): Promise<[string, string][]> {\n const folder = scope.folder ?? ''\n if (folder === '') return []\n const uids = await searchMessages(accessor, folder, { text: pattern }, maxResults)\n const pairs: [string, string][] = []\n for (const uid of uids) {\n const msg = await fetchMessage(accessor, folder, uid)\n const msgText = JSON.stringify(msg)\n const vfsPath = buildVfsPath(prefix, folder, msg)\n pairs.push([vfsPath, msgText])\n }\n return pairs\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 CommandSpec,\n IOResult,\n OperandKind,\n Option,\n ResourceName,\n command,\n type ByteSource,\n type CommandFnResult,\n type CommandOpts,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { fetchMessage } from '../../../core/email/_client.ts'\n\nconst ENC = new TextEncoder()\n\nconst SPEC = new CommandSpec({\n options: [\n new Option({ long: '--uid', valueKind: OperandKind.TEXT }),\n new Option({ long: '--folder', valueKind: OperandKind.TEXT }),\n ],\n})\n\nasync function emailReadCommand(\n accessor: EmailAccessor,\n _paths: PathSpec[],\n _texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const uid = typeof opts.flags.uid === 'string' ? opts.flags.uid : ''\n const folder = typeof opts.flags.folder === 'string' ? opts.flags.folder : ''\n if (uid === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--uid is required\\n') })]\n }\n if (folder === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--folder is required\\n') })]\n }\n const processed = await fetchMessage(accessor, folder, uid)\n const out: ByteSource = ENC.encode(JSON.stringify(processed))\n return [out, new IOResult()]\n}\n\nexport const EMAIL_READ = command({\n name: 'himalaya message read',\n resource: ResourceName.EMAIL,\n spec: SPEC,\n fn: emailReadCommand,\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 CommandSpec,\n IOResult,\n OperandKind,\n Option,\n ResourceName,\n command,\n type ByteSource,\n type CommandFnResult,\n type CommandOpts,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { fetchMessage } from '../../../core/email/_client.ts'\nimport { replyAllMessage, replyMessage } from '../../../core/email/send.ts'\n\nconst ENC = new TextEncoder()\n\nconst SPEC = new CommandSpec({\n options: [\n new Option({ long: '--uid', valueKind: OperandKind.TEXT }),\n new Option({ long: '--folder', valueKind: OperandKind.TEXT }),\n new Option({ long: '--body', valueKind: OperandKind.TEXT }),\n new Option({ long: '--all' }),\n ],\n})\n\nasync function emailReplyCommand(\n accessor: EmailAccessor,\n _paths: PathSpec[],\n _texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const uid = typeof opts.flags.uid === 'string' ? opts.flags.uid : ''\n const folder = typeof opts.flags.folder === 'string' ? opts.flags.folder : ''\n const body = typeof opts.flags.body === 'string' ? opts.flags.body : ''\n if (uid === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--uid is required\\n') })]\n }\n if (folder === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--folder is required\\n') })]\n }\n if (body === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--body is required\\n') })]\n }\n const original = await fetchMessage(accessor, folder, uid)\n const result =\n opts.flags.all === true\n ? await replyAllMessage(accessor.config, original, body)\n : await replyMessage(accessor.config, original, body)\n const out: ByteSource = ENC.encode(JSON.stringify(result))\n return [out, new IOResult()]\n}\n\nexport const EMAIL_REPLY = command({\n name: 'himalaya message reply',\n resource: ResourceName.EMAIL,\n spec: SPEC,\n fn: emailReplyCommand,\n write: true,\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 IOResult,\n ResourceName,\n command,\n compilePattern,\n grepLines,\n mountPrefixOf,\n patternArg,\n resolveGlobOf,\n rgGeneric,\n specOf,\n type ByteSource,\n type CommandFnResult,\n type CommandOpts,\n type FileStat,\n type GrepLinesOptions,\n type IndexCacheStore,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { read as emailRead } from '../../../core/email/read.ts'\nimport { readdir as emailReaddir } from '../../../core/email/readdir.ts'\nimport { stat as emailStat } from '../../../core/email/stat.ts'\nimport { detectScope } from '../../../core/email/scope.ts'\nimport { searchAndFormat } from '../../../core/email/search.ts'\nimport { EMAIL_IO } from './io.ts'\n\nconst resolveGlob = resolveGlobOf(EMAIL_IO)\n\nconst ENC = new TextEncoder()\n\nasync function* emailStream(\n accessor: EmailAccessor,\n p: PathSpec,\n index: IndexCacheStore | undefined,\n): AsyncIterable<Uint8Array> {\n yield await emailRead(accessor, p, index)\n}\n\nasync function rgCommand(\n accessor: EmailAccessor,\n paths: PathSpec[],\n texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const pattern = patternArg(texts, opts.flags)\n if (pattern === null) {\n return [\n null,\n new IOResult({ exitCode: 2, stderr: ENC.encode('rg: usage: rg [flags] pattern [path]\\n') }),\n ]\n }\n const ignoreCase = opts.flags.i === true\n const invert = opts.flags.v === true\n const lineNumbers = opts.flags.n === true\n const countOnly = opts.flags.c === true\n const filesOnly = opts.flags.args_l === true || opts.flags.l === true\n const wholeWord = opts.flags.w === true\n const fixedString = opts.flags.F === true\n const onlyMatching = opts.flags.o === true\n const maxCount = typeof opts.flags.m === 'string' ? Number.parseInt(opts.flags.m, 10) : null\n const pat = compilePattern(pattern, ignoreCase, fixedString, wholeWord)\n\n const lineOpts: GrepLinesOptions = {\n invert,\n lineNumbers,\n countOnly,\n filesOnly,\n onlyMatching,\n maxCount,\n }\n\n if (paths.length > 0) {\n const first = paths[0]\n if (first !== undefined) {\n const scope = detectScope(first)\n if (scope.useNative && !pattern.includes('\\n')) {\n const filePrefix =\n mountPrefixOf(first.virtual, first.resourcePath) !== ''\n ? mountPrefixOf(first.virtual, first.resourcePath)\n : ''\n const pairs = await searchAndFormat(accessor, scope, pattern, filePrefix, maxCount ?? 50)\n const lines: string[] = []\n for (const [vfsPath, msgText] of pairs) {\n const matched = grepLines(vfsPath, [msgText], pat, lineOpts)\n for (const line of matched) lines.push(`${vfsPath}:${line}`)\n }\n if (lines.length === 0) return [new Uint8Array(0), new IOResult({ exitCode: 1 })]\n const out: ByteSource = ENC.encode(lines.join('\\n') + '\\n')\n return [out, new IOResult()]\n }\n }\n }\n\n const resolved =\n paths.length > 0 ? await resolveGlob(accessor, paths, opts.index ?? undefined) : []\n const stat = (p: PathSpec): Promise<FileStat> => emailStat(accessor, p, opts.index ?? undefined)\n const readdir = (p: PathSpec): Promise<string[]> =>\n emailReaddir(accessor, p, opts.index ?? undefined)\n return rgGeneric(resolved, texts, opts, stat, readdir, (p) =>\n emailStream(accessor, p, opts.index ?? undefined),\n )\n}\n\nexport const EMAIL_RG = command({\n name: 'rg',\n resource: ResourceName.EMAIL,\n spec: specOf('rg'),\n fn: rgCommand,\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 CommandSpec,\n IOResult,\n OperandKind,\n Option,\n ResourceName,\n command,\n type ByteSource,\n type CommandFnResult,\n type CommandOpts,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { sendMessage } from '../../../core/email/send.ts'\n\nconst ENC = new TextEncoder()\n\nconst SPEC = new CommandSpec({\n options: [\n new Option({ long: '--to', valueKind: OperandKind.TEXT }),\n new Option({ long: '--subject', valueKind: OperandKind.TEXT }),\n new Option({ long: '--body', valueKind: OperandKind.TEXT }),\n ],\n})\n\nasync function emailSendCommand(\n accessor: EmailAccessor,\n _paths: PathSpec[],\n _texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const to = typeof opts.flags.to === 'string' ? opts.flags.to : ''\n const subject = typeof opts.flags.subject === 'string' ? opts.flags.subject : ''\n const body = typeof opts.flags.body === 'string' ? opts.flags.body : ''\n if (to === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--to is required\\n') })]\n }\n if (subject === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--subject is required\\n') })]\n }\n if (body === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--body is required\\n') })]\n }\n const result = await sendMessage(accessor.config, to, subject, body)\n const out: ByteSource = ENC.encode(JSON.stringify(result))\n return [out, new IOResult()]\n}\n\nexport const EMAIL_SEND = command({\n name: 'himalaya message send',\n resource: ResourceName.EMAIL,\n spec: SPEC,\n fn: emailSendCommand,\n write: true,\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 CommandSpec,\n IOResult,\n OperandKind,\n Option,\n ResourceName,\n command,\n type ByteSource,\n type CommandFnResult,\n type CommandOpts,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { fetchHeaders } from '../../../core/email/_client.ts'\nimport { searchMessages } from '../../../core/email/search.ts'\n\nconst ENC = new TextEncoder()\n\nconst SPEC = new CommandSpec({\n options: [\n new Option({ long: '--folder', valueKind: OperandKind.TEXT }),\n new Option({ long: '--max', valueKind: OperandKind.TEXT }),\n new Option({ long: '--unseen' }),\n new Option({ long: '--subject', valueKind: OperandKind.TEXT }),\n new Option({ long: '--from', valueKind: OperandKind.TEXT }),\n new Option({ long: '--to', valueKind: OperandKind.TEXT }),\n new Option({ long: '--body', valueKind: OperandKind.TEXT }),\n new Option({ long: '--since', valueKind: OperandKind.TEXT }),\n new Option({ long: '--before', valueKind: OperandKind.TEXT }),\n ],\n})\n\nasync function emailTriageCommand(\n accessor: EmailAccessor,\n _paths: PathSpec[],\n _texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const folder = typeof opts.flags.folder === 'string' ? opts.flags.folder : 'INBOX'\n const maxResults = typeof opts.flags.max === 'string' ? Number.parseInt(opts.flags.max, 10) : 20\n const uids = await searchMessages(\n accessor,\n folder,\n {\n text: typeof opts.flags.body === 'string' ? opts.flags.body : null,\n subject: typeof opts.flags.subject === 'string' ? opts.flags.subject : null,\n fromAddr: typeof opts.flags.from === 'string' ? opts.flags.from : null,\n toAddr: typeof opts.flags.to === 'string' ? opts.flags.to : null,\n since: typeof opts.flags.since === 'string' ? opts.flags.since : null,\n before: typeof opts.flags.before === 'string' ? opts.flags.before : null,\n unseen: opts.flags.unseen === true,\n },\n maxResults,\n )\n if (uids.length === 0) {\n const out: ByteSource = ENC.encode('[]')\n return [out, new IOResult()]\n }\n const headers = await fetchHeaders(accessor, folder, uids)\n const out: ByteSource = ENC.encode(JSON.stringify(headers))\n return [out, new IOResult()]\n}\n\nexport const EMAIL_TRIAGE = command({\n name: 'himalaya envelope list',\n resource: ResourceName.EMAIL,\n spec: SPEC,\n fn: emailTriageCommand,\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 { EMAIL_IO } from '../../commands/builtin/email/io.ts'\n\nexport const EMAIL_OPS: readonly RegisteredOp[] = makeGenericOps(ResourceName.EMAIL, EMAIL_IO)\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 EMAIL_PROMPT = `{prefix}\n <folder>/\n <yyyy-mm-dd>/\n <subject>__<uid>.email.json\n <subject>__<uid>/ # if attachments exist\n <attachment-filename>\n Folders include: INBOX, Sent, Drafts, etc. cat shows email as JSON.\n\n Read commands:\n himalaya envelope list --folder INBOX --unseen # id/from/subject/date\n himalaya message read --folder INBOX --uid <uid> # one message as JSON`\n\nexport const EMAIL_WRITE_PROMPT = ` Write commands:\n himalaya message send --to \"to@email.com\" --subject \"Hi\" --body \"...\"\n himalaya message reply --folder INBOX --uid <uid> --body \"...\" [--all]\n himalaya message forward --folder INBOX --uid <uid> --to \"to@email.com\"`\n"],"mappings":"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","names":["PathSpec","ResourceName","mountKey","mountPrefixOf","ResourceName","FileType","PathSpec","mountKey","mountPrefixOf","stripSlash","loadOptionalPeer","end","listFolders","listFolders","mountKey","mountPrefixOf","enoent","mountPrefixOf","listFolders","mountKey","mountPrefixOf","enoent","uid","parts","folder","PathSpec","mountKey","mountPrefixOf","FileType","stripSlash","IOResult","ResourceName","command","loadOptionalPeer","ENC","IOResult","command","ResourceName","IOResult","ResourceName","command","mountPrefixOf","resolveGlobOf","specOf","stripSlash","TITLE_MAX","UNSAFE","MULTI_UNDERSCORE","sanitize","dateFromHeader","resolveGlob","resolveGlobOf","ENC","IOResult","mountPrefixOf","stat","readdir","command","ResourceName","specOf","CommandSpec","IOResult","OperandKind","Option","ResourceName","command","ENC","SPEC","CommandSpec","Option","OperandKind","IOResult","command","ResourceName","CommandSpec","IOResult","OperandKind","Option","ResourceName","command","ENC","SPEC","CommandSpec","Option","OperandKind","IOResult","command","ResourceName","IOResult","ResourceName","command","compilePattern","grepLines","mountPrefixOf","resolveGlobOf","specOf","resolveGlob","resolveGlobOf","ENC","emailStream","IOResult","compilePattern","mountPrefixOf","grepLines","stat","readdir","command","ResourceName","specOf","CommandSpec","IOResult","OperandKind","Option","ResourceName","command","ENC","SPEC","CommandSpec","Option","OperandKind","IOResult","command","ResourceName","CommandSpec","IOResult","OperandKind","Option","ResourceName","command","ENC","SPEC","CommandSpec","Option","OperandKind","out","IOResult","command","ResourceName","ResourceName","ResourceName","ResourceName","resolveGlob","ResourceName","mountPrefixOf","PathSpec","mountKey"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/resource/github/github.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 GITHUB_COMMANDS,\n GITHUB_OPS,\n GitHubAccessor,\n HttpGitHubTransport,\n PathSpec,\n RAMIndexCacheStore,\n ResourceName,\n fetchGitHubRepoInfo,\n fetchGitHubTree,\n githubBuildTreeMap,\n githubPopulateIndex,\n githubRead,\n githubReaddir,\n makeResolveGlob,\n githubStat,\n mountKey,\n mountPrefixOf,\n type FileStat,\n type IndexCacheStore,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n} from '@struktoai/mirage-core'\nimport { redactGitHubConfig, type GitHubConfig, type GitHubConfigRedacted } from './config.ts'\n\nconst githubResolveGlob = makeResolveGlob(githubReaddir)\n\nexport interface GitHubResourceState {\n type: string\n config: GitHubConfigRedacted\n defaultBranch: string\n truncated: boolean\n}\n\nexport class GitHubResource extends BaseResource implements Resource {\n readonly kind: string = ResourceName.GITHUB\n readonly cachesReads: boolean = true\n // Blob shas are stable per-path markers, so cached reads can be\n // probe-verified under ALWAYS and snapshots carry drift fingerprints.\n readonly supportsSnapshot: boolean = true\n override readonly indexTtl: number = 86_400\n readonly config: GitHubConfig\n readonly accessor: GitHubAccessor\n\n private constructor(config: GitHubConfig, accessor: GitHubAccessor, index: IndexCacheStore) {\n super()\n this.config = config\n this.accessor = accessor\n this._index = index\n }\n\n static async create(config: GitHubConfig): Promise<GitHubResource> {\n const transportOpts: { token: string; baseUrl?: string } = { token: config.token }\n if (config.baseUrl !== undefined) transportOpts.baseUrl = config.baseUrl\n const transport = new HttpGitHubTransport(transportOpts)\n const repoInfo = await fetchGitHubRepoInfo(transport, config.owner, config.repo)\n const ref = config.ref ?? repoInfo.default_branch\n const { tree, truncated } = await fetchGitHubTree(transport, config.owner, config.repo, ref)\n const treeMap = githubBuildTreeMap(tree)\n const accessor = new GitHubAccessor({\n transport,\n owner: config.owner,\n repo: config.repo,\n ref,\n defaultBranch: repoInfo.default_branch,\n truncated,\n tree: treeMap,\n })\n const index = new RAMIndexCacheStore({ ttl: 86_400 })\n await githubPopulateIndex(index, tree)\n return new GitHubResource(config, accessor, index)\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 GITHUB_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return GITHUB_OPS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return githubRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return githubReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return githubStat(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 githubResolveGlob(this.accessor, effective, this.index)\n }\n\n getState(): Promise<GitHubResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactGitHubConfig(this.config),\n defaultBranch: this.accessor.defaultBranch,\n truncated: this.accessor.truncated,\n })\n }\n\n loadState(_state: GitHubResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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":[]}
|