@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.
Files changed (447) hide show
  1. package/README.md +2 -1
  2. package/dist/aliyun-S62BR3TB.js +11 -0
  3. package/dist/append.lua +17 -0
  4. package/dist/backblaze-4EKSW63F.js +11 -0
  5. package/dist/box-ZPLZAGMK.js +8 -0
  6. package/dist/ceph-ALKLD3MO.js +11 -0
  7. package/dist/{chunk-VLRSOWHP.js → chunk-2A4YGVBM.js} +5 -14
  8. package/dist/chunk-2A4YGVBM.js.map +1 -0
  9. package/dist/chunk-2HCYLVGY.js +28 -0
  10. package/dist/chunk-2HCYLVGY.js.map +1 -0
  11. package/dist/chunk-2VPZAH5Q.js +20 -0
  12. package/dist/chunk-2VPZAH5Q.js.map +1 -0
  13. package/dist/{chunk-HCU3B6FW.js → chunk-3JZQ6VSZ.js} +5 -4
  14. package/dist/chunk-3JZQ6VSZ.js.map +1 -0
  15. package/dist/chunk-4IF4TGAI.js +11 -0
  16. package/dist/chunk-4IF4TGAI.js.map +1 -0
  17. package/dist/{chunk-L7FEZ7LU.js → chunk-5H6KNEPP.js} +4 -5
  18. package/dist/{chunk-L7FEZ7LU.js.map → chunk-5H6KNEPP.js.map} +1 -1
  19. package/dist/{chunk-25W4XQJZ.js → chunk-5K2MWDCE.js} +4 -5
  20. package/dist/{chunk-25W4XQJZ.js.map → chunk-5K2MWDCE.js.map} +1 -1
  21. package/dist/{chunk-L4GMDSMB.js → chunk-6SVXWRKX.js} +4 -5
  22. package/dist/{chunk-L4GMDSMB.js.map → chunk-6SVXWRKX.js.map} +1 -1
  23. package/dist/{chunk-H62XQZUM.js → chunk-6VOIUGAD.js} +22 -10
  24. package/dist/chunk-6VOIUGAD.js.map +1 -0
  25. package/dist/{chunk-SI4GMRXD.js → chunk-7JYHFXXC.js} +4 -8
  26. package/dist/chunk-7JYHFXXC.js.map +1 -0
  27. package/dist/chunk-7VQQFWV6.js +20 -0
  28. package/dist/chunk-7VQQFWV6.js.map +1 -0
  29. package/dist/chunk-7ZP6TPHX.js +87 -0
  30. package/dist/chunk-7ZP6TPHX.js.map +1 -0
  31. package/dist/{chunk-HWQPEBID.js → chunk-ADEXNSYU.js} +6 -12
  32. package/dist/chunk-ADEXNSYU.js.map +1 -0
  33. package/dist/chunk-AQSYAXL4.js +16 -0
  34. package/dist/chunk-AQSYAXL4.js.map +1 -0
  35. package/dist/{chunk-NJ42VNXG.js → chunk-ATLXMNKD.js} +8 -3
  36. package/dist/chunk-ATLXMNKD.js.map +1 -0
  37. package/dist/{chunk-CB76WPUS.js → chunk-BYCUGFRF.js} +5 -4
  38. package/dist/chunk-BYCUGFRF.js.map +1 -0
  39. package/dist/{chunk-4M73WHIE.js → chunk-BZTVYOES.js} +3 -3
  40. package/dist/{chunk-CQCTCW4S.js → chunk-CRC4YWXB.js} +28 -9
  41. package/dist/chunk-CRC4YWXB.js.map +1 -0
  42. package/dist/{chunk-C7TNKIK5.js → chunk-CTGXJHO5.js} +1 -1
  43. package/dist/chunk-CTGXJHO5.js.map +1 -0
  44. package/dist/{chunk-HSD24IP2.js → chunk-DCDBIXVZ.js} +7 -2
  45. package/dist/chunk-DCDBIXVZ.js.map +1 -0
  46. package/dist/{chunk-HEDE2377.js → chunk-DDAFNROK.js} +318 -322
  47. package/dist/chunk-DDAFNROK.js.map +1 -0
  48. package/dist/chunk-DQIEWEAW.js +85 -0
  49. package/dist/chunk-DQIEWEAW.js.map +1 -0
  50. package/dist/{chunk-2ERLWAGG.js → chunk-EBI4IHDC.js} +20 -11
  51. package/dist/chunk-EBI4IHDC.js.map +1 -0
  52. package/dist/{chunk-RHUEV4I7.js → chunk-EIUTZ6N7.js} +10 -24
  53. package/dist/chunk-EIUTZ6N7.js.map +1 -0
  54. package/dist/{chunk-IUXXZHY3.js → chunk-EJZG5VUF.js} +24 -12
  55. package/dist/chunk-EJZG5VUF.js.map +1 -0
  56. package/dist/{chunk-BWWU5T2D.js → chunk-ENW5BVYN.js} +3 -3
  57. package/dist/{chunk-F5NWRF32.js → chunk-ETIAW4YD.js} +3 -3
  58. package/dist/chunk-EUPXAYPB.js +20 -0
  59. package/dist/chunk-EUPXAYPB.js.map +1 -0
  60. package/dist/{chunk-EGZNOUMH.js → chunk-FA6YNU75.js} +4 -5
  61. package/dist/{chunk-EGZNOUMH.js.map → chunk-FA6YNU75.js.map} +1 -1
  62. package/dist/{chunk-XUUSWR4U.js → chunk-FFH6R5VQ.js} +7 -2
  63. package/dist/{chunk-XUUSWR4U.js.map → chunk-FFH6R5VQ.js.map} +1 -1
  64. package/dist/{chunk-JEBH5APX.js → chunk-GE6H2COM.js} +5 -13
  65. package/dist/chunk-GE6H2COM.js.map +1 -0
  66. package/dist/{chunk-TUNR4VUM.js → chunk-GMMQ3ZK4.js} +3 -3
  67. package/dist/{chunk-SAOQW6ZJ.js → chunk-GSGE3M5P.js} +5 -13
  68. package/dist/chunk-GSGE3M5P.js.map +1 -0
  69. package/dist/{chunk-FRGTDZQT.js → chunk-H64SB6VO.js} +19 -5
  70. package/dist/chunk-H64SB6VO.js.map +1 -0
  71. package/dist/{chunk-DXU7NZPH.js → chunk-HCRYAFBI.js} +3 -3
  72. package/dist/{chunk-OSVZKYXS.js → chunk-HOPUP6LA.js} +192 -156
  73. package/dist/chunk-HOPUP6LA.js.map +1 -0
  74. package/dist/chunk-HS24BL6W.js +160 -0
  75. package/dist/chunk-HS24BL6W.js.map +1 -0
  76. package/dist/chunk-HVYVG5KQ.js +16 -0
  77. package/dist/chunk-HVYVG5KQ.js.map +1 -0
  78. package/dist/{chunk-XEMLYWHK.js → chunk-I7CPLZNW.js} +4 -5
  79. package/dist/{chunk-XEMLYWHK.js.map → chunk-I7CPLZNW.js.map} +1 -1
  80. package/dist/{chunk-AULFV3KY.js → chunk-IFUCGI4I.js} +7 -2
  81. package/dist/chunk-IFUCGI4I.js.map +1 -0
  82. package/dist/{chunk-HGIPWY5Y.js → chunk-IFYXSSKR.js} +6 -6
  83. package/dist/chunk-IFYXSSKR.js.map +1 -0
  84. package/dist/chunk-IXA4DQE4.js +20 -0
  85. package/dist/chunk-IXA4DQE4.js.map +1 -0
  86. package/dist/chunk-IZMKMD3O.js +11 -0
  87. package/dist/chunk-IZMKMD3O.js.map +1 -0
  88. package/dist/{chunk-4X6CLF4F.js → chunk-JJERW2BI.js} +4 -5
  89. package/dist/{chunk-4X6CLF4F.js.map → chunk-JJERW2BI.js.map} +1 -1
  90. package/dist/{chunk-M6E7VK4D.js → chunk-JQR4HVUX.js} +2 -5
  91. package/dist/chunk-JQR4HVUX.js.map +1 -0
  92. package/dist/{chunk-BWLUBJQG.js → chunk-JXOMDLFS.js} +6 -15
  93. package/dist/chunk-JXOMDLFS.js.map +1 -0
  94. package/dist/{chunk-5ZHNPNDD.js → chunk-KIX6N7NT.js} +198 -141
  95. package/dist/chunk-KIX6N7NT.js.map +1 -0
  96. package/dist/{chunk-XFSEADPC.js → chunk-L42UTDFK.js} +7 -2
  97. package/dist/chunk-L42UTDFK.js.map +1 -0
  98. package/dist/chunk-M2UF2JHJ.js +11 -0
  99. package/dist/chunk-M2UF2JHJ.js.map +1 -0
  100. package/dist/{chunk-LPLZLSMK.js → chunk-MONC734W.js} +7 -2
  101. package/dist/chunk-MONC734W.js.map +1 -0
  102. package/dist/{chunk-XADEMW6B.js → chunk-N72RLCMU.js} +4 -5
  103. package/dist/{chunk-XADEMW6B.js.map → chunk-N72RLCMU.js.map} +1 -1
  104. package/dist/{chunk-ZPB3SLPK.js → chunk-ND4IWJ4V.js} +7 -2
  105. package/dist/chunk-ND4IWJ4V.js.map +1 -0
  106. package/dist/{chunk-ZPZQXHW2.js → chunk-NZ3EKGW4.js} +260 -178
  107. package/dist/chunk-NZ3EKGW4.js.map +1 -0
  108. package/dist/{chunk-E3KXVEYI.js → chunk-OAE57MNL.js} +22 -10
  109. package/dist/chunk-OAE57MNL.js.map +1 -0
  110. package/dist/{chunk-JBDFYIN2.js → chunk-OHKGIQB4.js} +2 -5
  111. package/dist/chunk-OHKGIQB4.js.map +1 -0
  112. package/dist/{chunk-V7JVMG63.js → chunk-OXEQSPND.js} +3 -3
  113. package/dist/{chunk-YRJICL2Q.js → chunk-PKNE5J2B.js} +5 -13
  114. package/dist/chunk-PKNE5J2B.js.map +1 -0
  115. package/dist/chunk-PSXXEGYQ.js +16 -0
  116. package/dist/chunk-PSXXEGYQ.js.map +1 -0
  117. package/dist/{chunk-KAWDDS27.js → chunk-QAOVABCR.js} +7 -2
  118. package/dist/chunk-QAOVABCR.js.map +1 -0
  119. package/dist/{chunk-SYMNWNC3.js → chunk-QQ7FP4GD.js} +4 -5
  120. package/dist/{chunk-SYMNWNC3.js.map → chunk-QQ7FP4GD.js.map} +1 -1
  121. package/dist/{chunk-3JZN3GYO.js → chunk-QYLVMC6B.js} +2 -5
  122. package/dist/chunk-QYLVMC6B.js.map +1 -0
  123. package/dist/{chunk-CXQGMFI7.js → chunk-RX3XR65X.js} +4 -5
  124. package/dist/{chunk-CXQGMFI7.js.map → chunk-RX3XR65X.js.map} +1 -1
  125. package/dist/{chunk-MRXTUFBZ.js → chunk-RYQJJB4C.js} +1 -1
  126. package/dist/chunk-RYQJJB4C.js.map +1 -0
  127. package/dist/{chunk-5I7Q7RHW.js → chunk-TUF7TCN7.js} +4 -5
  128. package/dist/{chunk-5I7Q7RHW.js.map → chunk-TUF7TCN7.js.map} +1 -1
  129. package/dist/{chunk-NLXJMXVE.js → chunk-TUX36JY5.js} +4 -5
  130. package/dist/{chunk-NLXJMXVE.js.map → chunk-TUX36JY5.js.map} +1 -1
  131. package/dist/{chunk-4GYB7DGC.js → chunk-TWRQCQWU.js} +327 -558
  132. package/dist/chunk-TWRQCQWU.js.map +1 -0
  133. package/dist/chunk-U6DFQRG3.js +20 -0
  134. package/dist/chunk-U6DFQRG3.js.map +1 -0
  135. package/dist/chunk-VI5YTKNY.js +20 -0
  136. package/dist/chunk-VI5YTKNY.js.map +1 -0
  137. package/dist/{chunk-W5ZLIQFR.js → chunk-WG5YS6TC.js} +308 -200
  138. package/dist/chunk-WG5YS6TC.js.map +1 -0
  139. package/dist/{chunk-ZM44MGC5.js → chunk-WMJJ4WGF.js} +4 -5
  140. package/dist/{chunk-ZM44MGC5.js.map → chunk-WMJJ4WGF.js.map} +1 -1
  141. package/dist/{chunk-5YRWF5RP.js → chunk-WY4FNH42.js} +6 -5
  142. package/dist/chunk-WY4FNH42.js.map +1 -0
  143. package/dist/{chunk-VBYIDRNU.js → chunk-XIG5BWWH.js} +19 -10
  144. package/dist/chunk-XIG5BWWH.js.map +1 -0
  145. package/dist/chunk-XJBC3OYX.js +11 -0
  146. package/dist/chunk-XJBC3OYX.js.map +1 -0
  147. package/dist/{chunk-ZMREYTHA.js → chunk-XPRDXWK7.js} +8 -8
  148. package/dist/chunk-XPRDXWK7.js.map +1 -0
  149. package/dist/chunk-YKRQSZS7.js +96 -0
  150. package/dist/chunk-YKRQSZS7.js.map +1 -0
  151. package/dist/{chunk-IEVLWEBO.js → chunk-YMBL3VJB.js} +9 -8
  152. package/dist/chunk-YMBL3VJB.js.map +1 -0
  153. package/dist/{chunk-CGGO5NKD.js → chunk-YUJBXFYK.js} +357 -346
  154. package/dist/chunk-YUJBXFYK.js.map +1 -0
  155. package/dist/{chunk-S4KVLPBR.js → chunk-YZ4ZJNOL.js} +22 -10
  156. package/dist/chunk-YZ4ZJNOL.js.map +1 -0
  157. package/dist/chunk-ZTHVEXIV.js +11 -0
  158. package/dist/chunk-ZTHVEXIV.js.map +1 -0
  159. package/dist/{chunk-VHED2STW.js → chunk-ZVSYUCYS.js} +2 -1
  160. package/dist/chunk-ZVSYUCYS.js.map +1 -0
  161. package/dist/{config-T2IUIU5C.js → config-2YBCHU2W.js} +2 -2
  162. package/dist/{config-M3Z47VYU.js → config-3YRGRW72.js} +3 -2
  163. package/dist/config-4GSOMUMF.js +9 -0
  164. package/dist/config-5YBUWFUP.js +9 -0
  165. package/dist/{config-2LASFFRD.js → config-5ZRKJTKG.js} +3 -2
  166. package/dist/{config-W7EVPJNK.js → config-A25LTL5W.js} +2 -2
  167. package/dist/{config-WKQ3FGTZ.js → config-CLU7JABG.js} +2 -2
  168. package/dist/{config-E22XAGYN.js → config-D2RF7L3N.js} +2 -2
  169. package/dist/{config-HQXNFQZS.js → config-E55TKM6K.js} +2 -2
  170. package/dist/config-ELDOFRJW.js +9 -0
  171. package/dist/{config-EX3ZJTZI.js → config-FPC3RBFD.js} +2 -2
  172. package/dist/config-FPM3LAW7.js +9 -0
  173. package/dist/{config-IPNWAJHH.js → config-G3F54CS4.js} +3 -2
  174. package/dist/{config-BBOLI7VE.js → config-G43HRUI3.js} +2 -2
  175. package/dist/{config-QO2XUME4.js → config-GG3WO5PB.js} +3 -2
  176. package/dist/{config-QWQGOXQ5.js → config-JUYBWAZE.js} +2 -2
  177. package/dist/{config-SPW6NESU.js → config-LJ5T6TVA.js} +2 -2
  178. package/dist/{config-WVILHDFV.js → config-MDSAE4O3.js} +2 -2
  179. package/dist/{config-MZM3IPFM.js → config-NRIOKK5T.js} +2 -2
  180. package/dist/{config-L7SBSH5L.js → config-OYK2BSJK.js} +2 -2
  181. package/dist/config-PB3KA2CE.js +9 -0
  182. package/dist/{config-54USUVSE.js → config-QY4IL3PH.js} +3 -2
  183. package/dist/{config-VKKZGC7V.js → config-R4LAOEDS.js} +2 -2
  184. package/dist/{config-FRK7ZL37.js → config-RIAAD6RW.js} +3 -2
  185. package/dist/{config-J2C53GOT.js → config-SYNEQAUB.js} +2 -2
  186. package/dist/{config-XU6D5C7E.js → config-TJKGYA2B.js} +3 -2
  187. package/dist/{config-DWSJL3NH.js → config-UURRGA7U.js} +4 -2
  188. package/dist/{config-BIBFLUIR.js → config-VPLHQXVE.js} +2 -2
  189. package/dist/config-WRACCRPN.js +9 -0
  190. package/dist/{config-OJ2BPESH.js → config-WVHKXEVE.js} +3 -2
  191. package/dist/{config-CPYFOUQO.js → config-XU7R36IE.js} +3 -2
  192. package/dist/{config-A2GQYJDB.js → config-Y2KOUYSS.js} +2 -2
  193. package/dist/databricks_volume-CNCPTZHS.js +7 -0
  194. package/dist/digitalocean-DJZOUB6Q.js +11 -0
  195. package/dist/discord-ETB2CADR.js +7 -0
  196. package/dist/disk-WEHSTK3F.js +7 -0
  197. package/dist/dropbox-XN6PGLNE.js +8 -0
  198. package/dist/email-OV7XCP3T.js +8 -0
  199. package/dist/gcal-P56MRCGU.js +8 -0
  200. package/dist/gcs-HFBIAE2C.js +10 -0
  201. package/dist/gdocs-LQ3UXP3J.js +8 -0
  202. package/dist/gdrive-N6UBYLON.js +8 -0
  203. package/dist/github-BPZREGPI.js +8 -0
  204. package/dist/github_ci-7A4LUIZ7.js +8 -0
  205. package/dist/{gmail-2TBT4CVH.js → gmail-YED2MF6H.js} +2 -2
  206. package/dist/gridfs-CPLQ4G62.js +9 -0
  207. package/dist/gsheets-4BNIJPQ6.js +8 -0
  208. package/dist/gslides-GDBYLO5A.js +8 -0
  209. package/dist/hf_buckets-FTJITQ3P.js +10 -0
  210. package/dist/hf_datasets-6GXVKQD7.js +10 -0
  211. package/dist/hf_models-PJPGZAC5.js +10 -0
  212. package/dist/hf_spaces-LFNFOLBF.js +10 -0
  213. package/dist/index.d.ts +897 -609
  214. package/dist/index.js +2371 -781
  215. package/dist/index.js.map +1 -1
  216. package/dist/jaeger-GCA6MJ6E.js +8 -0
  217. package/dist/lancedb-TJ5YSJY5.js +7 -0
  218. package/dist/langfuse-RUMTUMXS.js +8 -0
  219. package/dist/linear-BCE4KEAC.js +7 -0
  220. package/dist/minio-5SO6KBTK.js +11 -0
  221. package/dist/mongodb-L5CMN2EE.js +7 -0
  222. package/dist/nextcloud-4O2LZVW2.js +9 -0
  223. package/dist/notion-RVKEAQ2M.js +7 -0
  224. package/dist/oci-OQXOIC62.js +10 -0
  225. package/dist/postgres-AV45GNRS.js +7 -0
  226. package/dist/qingstor-W277YA4K.js +11 -0
  227. package/dist/r2-FUA4IORE.js +10 -0
  228. package/dist/{redis-6D55Q2WB.js → redis-LPS357NF.js} +2 -2
  229. package/dist/s3-FPNWWIVM.js +8 -0
  230. package/dist/scaleway-BP3732U7.js +11 -0
  231. package/dist/seaweedfs-MC6HIEP4.js +11 -0
  232. package/dist/slack-JFGW7VLN.js +7 -0
  233. package/dist/ssh-UYPG42LM.js +8 -0
  234. package/dist/supabase-A3KUFMDC.js +10 -0
  235. package/dist/tencent-5464UQ2X.js +11 -0
  236. package/dist/trello-O2KB3FUO.js +8 -0
  237. package/dist/wasabi-2IKBIWNO.js +10 -0
  238. package/dist/wasabi-2IKBIWNO.js.map +1 -0
  239. package/package.json +15 -3
  240. package/dist/aliyun-PGI57A43.js +0 -10
  241. package/dist/backblaze-TSPL6Y56.js +0 -10
  242. package/dist/box-7XTZYDSO.js +0 -8
  243. package/dist/ceph-C265UI5T.js +0 -10
  244. package/dist/chunk-2ERLWAGG.js.map +0 -1
  245. package/dist/chunk-2QNPKPZZ.js +0 -59
  246. package/dist/chunk-2QNPKPZZ.js.map +0 -1
  247. package/dist/chunk-3ASOQTZB.js +0 -59
  248. package/dist/chunk-3ASOQTZB.js.map +0 -1
  249. package/dist/chunk-3JZN3GYO.js.map +0 -1
  250. package/dist/chunk-4GYB7DGC.js.map +0 -1
  251. package/dist/chunk-5YRWF5RP.js.map +0 -1
  252. package/dist/chunk-5ZHNPNDD.js.map +0 -1
  253. package/dist/chunk-AULFV3KY.js.map +0 -1
  254. package/dist/chunk-BWLUBJQG.js.map +0 -1
  255. package/dist/chunk-C7TNKIK5.js.map +0 -1
  256. package/dist/chunk-CB76WPUS.js.map +0 -1
  257. package/dist/chunk-CGGO5NKD.js.map +0 -1
  258. package/dist/chunk-CQCTCW4S.js.map +0 -1
  259. package/dist/chunk-D3U7VQCG.js +0 -25
  260. package/dist/chunk-D3U7VQCG.js.map +0 -1
  261. package/dist/chunk-E3KXVEYI.js.map +0 -1
  262. package/dist/chunk-EVK6HH6Z.js +0 -17
  263. package/dist/chunk-EVK6HH6Z.js.map +0 -1
  264. package/dist/chunk-FRGTDZQT.js.map +0 -1
  265. package/dist/chunk-GF75O2EN.js +0 -54
  266. package/dist/chunk-GF75O2EN.js.map +0 -1
  267. package/dist/chunk-GTAS3QVC.js +0 -25
  268. package/dist/chunk-GTAS3QVC.js.map +0 -1
  269. package/dist/chunk-H62XQZUM.js.map +0 -1
  270. package/dist/chunk-HCU3B6FW.js.map +0 -1
  271. package/dist/chunk-HEDE2377.js.map +0 -1
  272. package/dist/chunk-HGIPWY5Y.js.map +0 -1
  273. package/dist/chunk-HSD24IP2.js.map +0 -1
  274. package/dist/chunk-HWQPEBID.js.map +0 -1
  275. package/dist/chunk-IEHPTILN.js +0 -21
  276. package/dist/chunk-IEHPTILN.js.map +0 -1
  277. package/dist/chunk-IEVLWEBO.js.map +0 -1
  278. package/dist/chunk-IKJQOYI4.js +0 -26
  279. package/dist/chunk-IKJQOYI4.js.map +0 -1
  280. package/dist/chunk-IUXXZHY3.js.map +0 -1
  281. package/dist/chunk-JBDFYIN2.js.map +0 -1
  282. package/dist/chunk-JEBH5APX.js.map +0 -1
  283. package/dist/chunk-JHI2PHHD.js +0 -25
  284. package/dist/chunk-JHI2PHHD.js.map +0 -1
  285. package/dist/chunk-KAWDDS27.js.map +0 -1
  286. package/dist/chunk-KGC2OGXI.js +0 -27
  287. package/dist/chunk-KGC2OGXI.js.map +0 -1
  288. package/dist/chunk-LPLZLSMK.js.map +0 -1
  289. package/dist/chunk-M6E7VK4D.js.map +0 -1
  290. package/dist/chunk-MIQ3ECZM.js +0 -54
  291. package/dist/chunk-MIQ3ECZM.js.map +0 -1
  292. package/dist/chunk-MRXTUFBZ.js.map +0 -1
  293. package/dist/chunk-NJ42VNXG.js.map +0 -1
  294. package/dist/chunk-OSVZKYXS.js.map +0 -1
  295. package/dist/chunk-RHUEV4I7.js.map +0 -1
  296. package/dist/chunk-S4KVLPBR.js.map +0 -1
  297. package/dist/chunk-SAOQW6ZJ.js.map +0 -1
  298. package/dist/chunk-SI4GMRXD.js.map +0 -1
  299. package/dist/chunk-UAJYJP5C.js +0 -59
  300. package/dist/chunk-UAJYJP5C.js.map +0 -1
  301. package/dist/chunk-UYA3XL3J.js +0 -54
  302. package/dist/chunk-UYA3XL3J.js.map +0 -1
  303. package/dist/chunk-VBYIDRNU.js.map +0 -1
  304. package/dist/chunk-VHED2STW.js.map +0 -1
  305. package/dist/chunk-VIICUPWQ.js +0 -23
  306. package/dist/chunk-VIICUPWQ.js.map +0 -1
  307. package/dist/chunk-VLRSOWHP.js.map +0 -1
  308. package/dist/chunk-W5ZLIQFR.js.map +0 -1
  309. package/dist/chunk-WTSSEUOZ.js +0 -59
  310. package/dist/chunk-WTSSEUOZ.js.map +0 -1
  311. package/dist/chunk-WWP2STF5.js +0 -59
  312. package/dist/chunk-WWP2STF5.js.map +0 -1
  313. package/dist/chunk-XFSEADPC.js.map +0 -1
  314. package/dist/chunk-YBVMZ7SR.js +0 -59
  315. package/dist/chunk-YBVMZ7SR.js.map +0 -1
  316. package/dist/chunk-YRJICL2Q.js.map +0 -1
  317. package/dist/chunk-ZMREYTHA.js.map +0 -1
  318. package/dist/chunk-ZPB3SLPK.js.map +0 -1
  319. package/dist/chunk-ZPZQXHW2.js.map +0 -1
  320. package/dist/config-3WDIJPTG.js +0 -9
  321. package/dist/config-4QV4QYI5.js +0 -9
  322. package/dist/config-5ZXN2T2H.js +0 -9
  323. package/dist/config-EHE52ZTK.js +0 -9
  324. package/dist/config-HTXOOAOD.js +0 -9
  325. package/dist/config-K63RX6EU.js +0 -9
  326. package/dist/config-LEALEMKA.js +0 -9
  327. package/dist/config-RI7IEZUF.js +0 -9
  328. package/dist/databricks_volume-ETRDJVVQ.js +0 -7
  329. package/dist/digitalocean-QP72DR4J.js +0 -10
  330. package/dist/discord-BSN5RB3E.js +0 -8
  331. package/dist/disk-24NWTN2I.js +0 -7
  332. package/dist/dropbox-OSTZXSIE.js +0 -8
  333. package/dist/email-4ZFPSWIN.js +0 -8
  334. package/dist/gcs-PFWR6MIW.js +0 -10
  335. package/dist/gdocs-GPAZRQG5.js +0 -8
  336. package/dist/gdrive-XSX6A7B3.js +0 -8
  337. package/dist/github-EQ4NXUTA.js +0 -8
  338. package/dist/github_ci-QL5B2Q2N.js +0 -8
  339. package/dist/gridfs-KZRZ6SIB.js +0 -9
  340. package/dist/gsheets-N53WEXN2.js +0 -8
  341. package/dist/gslides-TATSARTH.js +0 -8
  342. package/dist/hf_buckets-BK7NGJWS.js +0 -10
  343. package/dist/hf_datasets-UQ5QGM4L.js +0 -10
  344. package/dist/hf_models-75LFCQCS.js +0 -10
  345. package/dist/hf_spaces-6T2KB3UC.js +0 -10
  346. package/dist/langfuse-AMQCQWNE.js +0 -8
  347. package/dist/linear-V3TXO6CV.js +0 -8
  348. package/dist/minio-IZRZY4C5.js +0 -10
  349. package/dist/mongodb-VMKPQCPX.js +0 -7
  350. package/dist/nextcloud-5RHQCGDO.js +0 -9
  351. package/dist/notion-6PPNTQFM.js +0 -8
  352. package/dist/oci-CKYBSFZJ.js +0 -10
  353. package/dist/postgres-WIQBVL5M.js +0 -7
  354. package/dist/qingstor-AP4IIPLY.js +0 -10
  355. package/dist/r2-C4XGEWQY.js +0 -10
  356. package/dist/s3-XQBI2CXN.js +0 -8
  357. package/dist/scaleway-SEZJVURB.js +0 -10
  358. package/dist/seaweedfs-3XYIAFU2.js +0 -10
  359. package/dist/slack-ZHXDJQY4.js +0 -8
  360. package/dist/ssh-X2MO7JOV.js +0 -8
  361. package/dist/supabase-BBM44UTM.js +0 -10
  362. package/dist/tencent-X72USLJ7.js +0 -10
  363. package/dist/trello-EER5NG7L.js +0 -8
  364. package/dist/wasabi-O4MVIUFG.js +0 -10
  365. /package/dist/{aliyun-PGI57A43.js.map → aliyun-S62BR3TB.js.map} +0 -0
  366. /package/dist/{backblaze-TSPL6Y56.js.map → backblaze-4EKSW63F.js.map} +0 -0
  367. /package/dist/{box-7XTZYDSO.js.map → box-ZPLZAGMK.js.map} +0 -0
  368. /package/dist/{ceph-C265UI5T.js.map → ceph-ALKLD3MO.js.map} +0 -0
  369. /package/dist/{chunk-4M73WHIE.js.map → chunk-BZTVYOES.js.map} +0 -0
  370. /package/dist/{chunk-BWWU5T2D.js.map → chunk-ENW5BVYN.js.map} +0 -0
  371. /package/dist/{chunk-F5NWRF32.js.map → chunk-ETIAW4YD.js.map} +0 -0
  372. /package/dist/{chunk-TUNR4VUM.js.map → chunk-GMMQ3ZK4.js.map} +0 -0
  373. /package/dist/{chunk-DXU7NZPH.js.map → chunk-HCRYAFBI.js.map} +0 -0
  374. /package/dist/{chunk-V7JVMG63.js.map → chunk-OXEQSPND.js.map} +0 -0
  375. /package/dist/{config-2LASFFRD.js.map → config-2YBCHU2W.js.map} +0 -0
  376. /package/dist/{config-3WDIJPTG.js.map → config-3YRGRW72.js.map} +0 -0
  377. /package/dist/{config-4QV4QYI5.js.map → config-4GSOMUMF.js.map} +0 -0
  378. /package/dist/{config-54USUVSE.js.map → config-5YBUWFUP.js.map} +0 -0
  379. /package/dist/{config-5ZXN2T2H.js.map → config-5ZRKJTKG.js.map} +0 -0
  380. /package/dist/{config-A2GQYJDB.js.map → config-A25LTL5W.js.map} +0 -0
  381. /package/dist/{config-BBOLI7VE.js.map → config-CLU7JABG.js.map} +0 -0
  382. /package/dist/{config-BIBFLUIR.js.map → config-D2RF7L3N.js.map} +0 -0
  383. /package/dist/{config-CPYFOUQO.js.map → config-E55TKM6K.js.map} +0 -0
  384. /package/dist/{config-DWSJL3NH.js.map → config-ELDOFRJW.js.map} +0 -0
  385. /package/dist/{config-E22XAGYN.js.map → config-FPC3RBFD.js.map} +0 -0
  386. /package/dist/{config-EHE52ZTK.js.map → config-FPM3LAW7.js.map} +0 -0
  387. /package/dist/{config-EX3ZJTZI.js.map → config-G3F54CS4.js.map} +0 -0
  388. /package/dist/{config-FRK7ZL37.js.map → config-G43HRUI3.js.map} +0 -0
  389. /package/dist/{config-HQXNFQZS.js.map → config-GG3WO5PB.js.map} +0 -0
  390. /package/dist/{config-HTXOOAOD.js.map → config-JUYBWAZE.js.map} +0 -0
  391. /package/dist/{config-IPNWAJHH.js.map → config-LJ5T6TVA.js.map} +0 -0
  392. /package/dist/{config-J2C53GOT.js.map → config-MDSAE4O3.js.map} +0 -0
  393. /package/dist/{config-K63RX6EU.js.map → config-NRIOKK5T.js.map} +0 -0
  394. /package/dist/{config-L7SBSH5L.js.map → config-OYK2BSJK.js.map} +0 -0
  395. /package/dist/{config-LEALEMKA.js.map → config-PB3KA2CE.js.map} +0 -0
  396. /package/dist/{config-M3Z47VYU.js.map → config-QY4IL3PH.js.map} +0 -0
  397. /package/dist/{config-MZM3IPFM.js.map → config-R4LAOEDS.js.map} +0 -0
  398. /package/dist/{config-OJ2BPESH.js.map → config-RIAAD6RW.js.map} +0 -0
  399. /package/dist/{config-QO2XUME4.js.map → config-SYNEQAUB.js.map} +0 -0
  400. /package/dist/{config-QWQGOXQ5.js.map → config-TJKGYA2B.js.map} +0 -0
  401. /package/dist/{config-RI7IEZUF.js.map → config-UURRGA7U.js.map} +0 -0
  402. /package/dist/{config-SPW6NESU.js.map → config-VPLHQXVE.js.map} +0 -0
  403. /package/dist/{config-T2IUIU5C.js.map → config-WRACCRPN.js.map} +0 -0
  404. /package/dist/{config-VKKZGC7V.js.map → config-WVHKXEVE.js.map} +0 -0
  405. /package/dist/{config-W7EVPJNK.js.map → config-XU7R36IE.js.map} +0 -0
  406. /package/dist/{config-WKQ3FGTZ.js.map → config-Y2KOUYSS.js.map} +0 -0
  407. /package/dist/{config-WVILHDFV.js.map → databricks_volume-CNCPTZHS.js.map} +0 -0
  408. /package/dist/{config-XU6D5C7E.js.map → digitalocean-DJZOUB6Q.js.map} +0 -0
  409. /package/dist/{databricks_volume-ETRDJVVQ.js.map → discord-ETB2CADR.js.map} +0 -0
  410. /package/dist/{digitalocean-QP72DR4J.js.map → disk-WEHSTK3F.js.map} +0 -0
  411. /package/dist/{discord-BSN5RB3E.js.map → dropbox-XN6PGLNE.js.map} +0 -0
  412. /package/dist/{disk-24NWTN2I.js.map → email-OV7XCP3T.js.map} +0 -0
  413. /package/dist/{dropbox-OSTZXSIE.js.map → gcal-P56MRCGU.js.map} +0 -0
  414. /package/dist/{email-4ZFPSWIN.js.map → gcs-HFBIAE2C.js.map} +0 -0
  415. /package/dist/{gcs-PFWR6MIW.js.map → gdocs-LQ3UXP3J.js.map} +0 -0
  416. /package/dist/{gdocs-GPAZRQG5.js.map → gdrive-N6UBYLON.js.map} +0 -0
  417. /package/dist/{gdrive-XSX6A7B3.js.map → github-BPZREGPI.js.map} +0 -0
  418. /package/dist/{github-EQ4NXUTA.js.map → github_ci-7A4LUIZ7.js.map} +0 -0
  419. /package/dist/{github_ci-QL5B2Q2N.js.map → gmail-YED2MF6H.js.map} +0 -0
  420. /package/dist/{gmail-2TBT4CVH.js.map → gridfs-CPLQ4G62.js.map} +0 -0
  421. /package/dist/{gridfs-KZRZ6SIB.js.map → gsheets-4BNIJPQ6.js.map} +0 -0
  422. /package/dist/{gsheets-N53WEXN2.js.map → gslides-GDBYLO5A.js.map} +0 -0
  423. /package/dist/{gslides-TATSARTH.js.map → hf_buckets-FTJITQ3P.js.map} +0 -0
  424. /package/dist/{hf_buckets-BK7NGJWS.js.map → hf_datasets-6GXVKQD7.js.map} +0 -0
  425. /package/dist/{hf_datasets-UQ5QGM4L.js.map → hf_models-PJPGZAC5.js.map} +0 -0
  426. /package/dist/{hf_models-75LFCQCS.js.map → hf_spaces-LFNFOLBF.js.map} +0 -0
  427. /package/dist/{hf_spaces-6T2KB3UC.js.map → jaeger-GCA6MJ6E.js.map} +0 -0
  428. /package/dist/{langfuse-AMQCQWNE.js.map → lancedb-TJ5YSJY5.js.map} +0 -0
  429. /package/dist/{linear-V3TXO6CV.js.map → langfuse-RUMTUMXS.js.map} +0 -0
  430. /package/dist/{minio-IZRZY4C5.js.map → linear-BCE4KEAC.js.map} +0 -0
  431. /package/dist/{mongodb-VMKPQCPX.js.map → minio-5SO6KBTK.js.map} +0 -0
  432. /package/dist/{nextcloud-5RHQCGDO.js.map → mongodb-L5CMN2EE.js.map} +0 -0
  433. /package/dist/{notion-6PPNTQFM.js.map → nextcloud-4O2LZVW2.js.map} +0 -0
  434. /package/dist/{oci-CKYBSFZJ.js.map → notion-RVKEAQ2M.js.map} +0 -0
  435. /package/dist/{postgres-WIQBVL5M.js.map → oci-OQXOIC62.js.map} +0 -0
  436. /package/dist/{qingstor-AP4IIPLY.js.map → postgres-AV45GNRS.js.map} +0 -0
  437. /package/dist/{r2-C4XGEWQY.js.map → qingstor-W277YA4K.js.map} +0 -0
  438. /package/dist/{redis-6D55Q2WB.js.map → r2-FUA4IORE.js.map} +0 -0
  439. /package/dist/{s3-XQBI2CXN.js.map → redis-LPS357NF.js.map} +0 -0
  440. /package/dist/{scaleway-SEZJVURB.js.map → s3-FPNWWIVM.js.map} +0 -0
  441. /package/dist/{seaweedfs-3XYIAFU2.js.map → scaleway-BP3732U7.js.map} +0 -0
  442. /package/dist/{slack-ZHXDJQY4.js.map → seaweedfs-MC6HIEP4.js.map} +0 -0
  443. /package/dist/{ssh-X2MO7JOV.js.map → slack-JFGW7VLN.js.map} +0 -0
  444. /package/dist/{supabase-BBM44UTM.js.map → ssh-UYPG42LM.js.map} +0 -0
  445. /package/dist/{tencent-X72USLJ7.js.map → supabase-A3KUFMDC.js.map} +0 -0
  446. /package/dist/{trello-EER5NG7L.js.map → tencent-5464UQ2X.js.map} +0 -0
  447. /package/dist/{wasabi-O4MVIUFG.js.map → trello-O2KB3FUO.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/nextcloud/nextcloud.ts","../src/accessor/nextcloud.ts","../src/commands/builtin/nextcloud/index.ts","../src/commands/builtin/nextcloud/io.ts","../src/core/nextcloud/constants.ts","../src/core/nextcloud/copy.ts","../src/core/nextcloud/util.ts","../src/core/nextcloud/write.ts","../src/core/nextcloud/create.ts","../src/core/nextcloud/du/entries.ts","../src/core/nextcloud/du/walk.ts","../src/core/nextcloud/stat.ts","../src/core/nextcloud/du/size.ts","../src/core/nextcloud/exists.ts","../src/core/nextcloud/find.ts","../src/core/nextcloud/search/types.ts","../src/core/nextcloud/search/constants.ts","../src/core/nextcloud/search/target.ts","../src/core/nextcloud/search/query.ts","../src/core/nextcloud/search/response.ts","../src/core/nextcloud/search/client.ts","../src/core/nextcloud/mkdir.ts","../src/core/nextcloud/read.ts","../src/core/nextcloud/readdir.ts","../src/core/nextcloud/rename.ts","../src/core/nextcloud/rm.ts","../src/core/nextcloud/rmdir.ts","../src/core/nextcloud/stream.ts","../src/core/nextcloud/truncate.ts","../src/core/nextcloud/unlink.ts","../src/core/nextcloud/watch.ts","../src/ops/nextcloud/index.ts","../src/resource/nextcloud/prompt.ts"],"sourcesContent":["import {\n BaseResource,\n makeResolveGlob,\n mountKey,\n mountPrefixOf,\n PathSpec,\n ResourceName,\n type DeltaHook,\n type FileStat,\n type FindOptions,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n} from '@struktoai/mirage-core'\nimport { NextcloudAccessor } from '../../accessor/nextcloud.ts'\nimport { NEXTCLOUD_COMMANDS } from '../../commands/builtin/nextcloud/index.ts'\nimport { SCOPE_ERROR } from '../../core/nextcloud/constants.ts'\nimport { copy as copyCore } from '../../core/nextcloud/copy.ts'\nimport { create as createCore } from '../../core/nextcloud/create.ts'\nimport { size as duSizeCore, entries as duEntriesCore } from '../../core/nextcloud/du/index.ts'\nimport { exists as existsCore } from '../../core/nextcloud/exists.ts'\nimport { find as findCore } from '../../core/nextcloud/find.ts'\nimport { mkdir as mkdirCore } from '../../core/nextcloud/mkdir.ts'\nimport { read as readCore } from '../../core/nextcloud/read.ts'\nimport { readdir as readdirCore } from '../../core/nextcloud/readdir.ts'\nimport { rename as renameCore } from '../../core/nextcloud/rename.ts'\nimport { rmR as rmRCore } from '../../core/nextcloud/rm.ts'\nimport { rmdir as rmdirCore } from '../../core/nextcloud/rmdir.ts'\nimport { stat as statCore } from '../../core/nextcloud/stat.ts'\nimport { rangeRead as rangeReadCore, stream as streamCore } from '../../core/nextcloud/stream.ts'\nimport { truncate as truncateCore } from '../../core/nextcloud/truncate.ts'\nimport { unlink as unlinkCore } from '../../core/nextcloud/unlink.ts'\nimport { write as writeCore } from '../../core/nextcloud/write.ts'\nimport { buildDeltaHook } from '../../core/nextcloud/watch.ts'\nimport { NEXTCLOUD_OPS } from '../../ops/nextcloud/index.ts'\nimport {\n redactNextcloudConfig,\n type NextcloudConfig,\n type NextcloudConfigRedacted,\n} from './config.ts'\nimport { NEXTCLOUD_PROMPT } from './prompt.ts'\n\nconst resolveGlobCore = makeResolveGlob(readdirCore, SCOPE_ERROR)\n\nexport interface NextcloudResourceState {\n type: string\n config: NextcloudConfigRedacted\n}\n\nexport class NextcloudResource extends BaseResource implements Resource {\n readonly kind = ResourceName.NEXTCLOUD\n readonly cachesReads = true\n // WebDAV PROPFIND carries getcontentlength for every file; readdir\n // backfills any lister-omitted size with one stat per affected file.\n readonly sizesAlwaysKnown: boolean = true\n readonly supportsSnapshot = true\n readonly prompt = NEXTCLOUD_PROMPT\n readonly accessor: NextcloudAccessor\n readonly opsMap: Record<string, unknown> = {\n read_bytes: readCore,\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_size: duSizeCore,\n du_entries: duEntriesCore,\n create: createCore,\n truncate: truncateCore,\n exists: existsCore,\n find_flat: findCore,\n }\n\n constructor(readonly config: NextcloudConfig) {\n super()\n this.accessor = new NextcloudAccessor(config)\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n commands(): readonly RegisteredCommand[] {\n return NEXTCLOUD_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return NEXTCLOUD_OPS\n }\n\n streamPath(path: PathSpec): AsyncIterable<Uint8Array> {\n return streamCore(this.accessor, path, this.index)\n }\n\n readFile(path: PathSpec): Promise<Uint8Array> {\n return readCore(this.accessor, path, this.index)\n }\n\n writeFile(path: PathSpec, data: Uint8Array): Promise<void> {\n return writeCore(this.accessor, path, data, this.index)\n }\n\n async appendFile(path: PathSpec, data: Uint8Array): Promise<void> {\n let existing: Uint8Array\n try {\n existing = await readCore(this.accessor, path, this.index)\n } catch (error) {\n if ((error as { code?: string } | null)?.code !== 'ENOENT') throw error\n existing = new Uint8Array()\n }\n const merged = new Uint8Array(existing.byteLength + data.byteLength)\n merged.set(existing)\n merged.set(data, existing.byteLength)\n await writeCore(this.accessor, path, merged, this.index)\n }\n\n readdir(path: PathSpec): Promise<string[]> {\n return readdirCore(this.accessor, path, this.index)\n }\n\n stat(path: PathSpec): Promise<FileStat> {\n return statCore(this.accessor, path, this.index)\n }\n\n exists(path: PathSpec): Promise<boolean> {\n return existsCore(this.accessor, path)\n }\n\n mkdir(path: PathSpec): Promise<void> {\n return mkdirCore(this.accessor, path)\n }\n\n rmdir(path: PathSpec): Promise<void> {\n return rmdirCore(this.accessor, path)\n }\n\n unlink(path: PathSpec): Promise<void> {\n return unlinkCore(this.accessor, path)\n }\n\n rename(source: PathSpec, destination: PathSpec): Promise<void> {\n return renameCore(this.accessor, source, destination)\n }\n\n truncate(path: PathSpec, length: number): Promise<void> {\n return truncateCore(this.accessor, path, length)\n }\n\n copy(source: PathSpec, destination: PathSpec): Promise<void> {\n return copyCore(this.accessor, source, destination)\n }\n\n rmR(path: PathSpec): Promise<void> {\n return rmRCore(this.accessor, path)\n }\n\n du(path: PathSpec): Promise<number> {\n return duSizeCore(this.accessor, path)\n }\n\n find(path: PathSpec, options: FindOptions = {}): Promise<string[]> {\n return findCore(this.accessor, path, options)\n }\n\n glob(paths: readonly PathSpec[], prefix = ''): Promise<PathSpec[]> {\n const effective = prefix\n ? paths.map((path) =>\n mountPrefixOf(path.virtual, path.resourcePath)\n ? path\n : new PathSpec({\n virtual: path.virtual,\n directory: path.directory,\n ...(path.pattern !== null ? { pattern: path.pattern } : {}),\n resolved: path.resolved,\n resourcePath: mountKey(path.virtual, prefix),\n }),\n )\n : paths\n return resolveGlobCore(this.accessor, effective, this.index)\n }\n\n deltaHook(): DeltaHook {\n return buildDeltaHook(this.accessor)\n }\n\n getState(): Promise<NextcloudResourceState> {\n return Promise.resolve({ type: this.kind, config: redactNextcloudConfig(this.config) })\n }\n\n loadState(_state: NextcloudResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n","import type { Operator } from 'opendal'\nimport { Accessor, ResourceName } from '@struktoai/mirage-core'\nimport { loadOptionalPeer } from '../optional_peer.ts'\nimport type { NextcloudConfig } from '../resource/nextcloud/config.ts'\n\nexport class NextcloudAccessor extends Accessor {\n readonly resourceName = ResourceName.NEXTCLOUD\n private operatorPromise: Promise<Operator> | null = null\n\n constructor(readonly config: NextcloudConfig) {\n super()\n }\n\n operator(): Promise<Operator> {\n this.operatorPromise ??= this.createOperator()\n return this.operatorPromise\n }\n\n private async createOperator(): Promise<Operator> {\n const mod = await loadOptionalPeer(\n () => import('opendal') as Promise<{ Operator: typeof Operator }>,\n { feature: 'Nextcloud resources', packageName: 'opendal' },\n )\n const options: Record<string, string> = { endpoint: this.config.url }\n if (this.config.username !== undefined) options.username = this.config.username\n if (this.config.password !== undefined) options.password = this.config.password\n return new mod.Operator('webdav', options)\n }\n}\n","import { makeGenericCommands, ResourceName, type RegisteredCommand } from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../../accessor/nextcloud.ts'\nimport { NEXTCLOUD_IO } from './io.ts'\n\nexport const NEXTCLOUD_COMMANDS: readonly RegisteredCommand[] = [\n ...makeGenericCommands<NextcloudAccessor>(ResourceName.NEXTCLOUD, NEXTCLOUD_IO),\n]\n","import { type CommandIO, rangeOf } from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../../accessor/nextcloud.ts'\nimport { SCOPE_ERROR } from '../../../core/nextcloud/constants.ts'\nimport { copy } from '../../../core/nextcloud/copy.ts'\nimport { create } from '../../../core/nextcloud/create.ts'\nimport {\n size as nextcloudDuSize,\n entries as nextcloudDuEntries,\n} from '../../../core/nextcloud/du/index.ts'\nimport { exists } from '../../../core/nextcloud/exists.ts'\nimport { find } from '../../../core/nextcloud/find.ts'\nimport { mkdir } from '../../../core/nextcloud/mkdir.ts'\nimport { read } from '../../../core/nextcloud/read.ts'\nimport { readdir } from '../../../core/nextcloud/readdir.ts'\nimport { rename } from '../../../core/nextcloud/rename.ts'\nimport { rmR } from '../../../core/nextcloud/rm.ts'\nimport { rmdir } from '../../../core/nextcloud/rmdir.ts'\nimport { stat } from '../../../core/nextcloud/stat.ts'\nimport { stream } from '../../../core/nextcloud/stream.ts'\nimport { truncate } from '../../../core/nextcloud/truncate.ts'\nimport { unlink } from '../../../core/nextcloud/unlink.ts'\nimport { write } from '../../../core/nextcloud/write.ts'\n\nexport const NEXTCLOUD_IO: CommandIO<NextcloudAccessor> = {\n maxGlobMatches: SCOPE_ERROR,\n readdir,\n readBytes: read,\n readRange: rangeOf(read),\n readStream: stream,\n stat,\n isMounted: () => true,\n local: false,\n write,\n exists,\n mkdir,\n unlink,\n rmdir,\n rmR,\n rename,\n copy,\n create,\n truncate,\n find,\n du: { size: nextcloudDuSize, entries: nextcloudDuEntries },\n}\n","export const SCOPE_ERROR = 5000\nexport const DEFAULT_CHUNK_SIZE = 8192\n","import { enoent, invalidateAfterWrite, type PathSpec } from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../accessor/nextcloud.ts'\nimport { isNotFound, nextcloudKey } from './util.ts'\n\nexport async function copy(\n accessor: NextcloudAccessor,\n source: PathSpec,\n destination: PathSpec,\n): Promise<void> {\n const op = await accessor.operator()\n try {\n await op.copy(nextcloudKey(source), nextcloudKey(destination))\n } catch (error) {\n if (isNotFound(error)) throw enoent(source)\n throw error\n }\n await invalidateAfterWrite(destination)\n}\n","import { lstripSlash, mountPrefixOf, type PathSpec } from '@struktoai/mirage-core'\n\nexport function rawPathOf(path: PathSpec): string {\n const prefix = mountPrefixOf(path.virtual, path.resourcePath)\n return prefix !== '' && path.virtual.startsWith(prefix)\n ? path.virtual.slice(prefix.length) || '/'\n : path.virtual\n}\n\nexport function nextcloudKey(path: PathSpec): string {\n return lstripSlash(rawPathOf(path))\n}\n\nexport function isNotFound(error: unknown): boolean {\n return error instanceof Error && error.message.startsWith('NotFound')\n}\n","import {\n enoent,\n invalidateAfterWrite,\n record,\n ResourceName,\n type IndexCacheStore,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../accessor/nextcloud.ts'\nimport { isNotFound, nextcloudKey } from './util.ts'\n\nexport async function write(\n accessor: NextcloudAccessor,\n path: PathSpec,\n data: Uint8Array,\n _index?: IndexCacheStore,\n): Promise<void> {\n const startMs = performance.now()\n try {\n const op = await accessor.operator()\n await op.write(nextcloudKey(path), Buffer.from(data))\n } catch (error) {\n if (isNotFound(error)) throw enoent(path)\n throw error\n }\n record('write', path.virtual, ResourceName.NEXTCLOUD, data.byteLength, startMs)\n await invalidateAfterWrite(path)\n}\n","import type { IndexCacheStore, PathSpec } from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../accessor/nextcloud.ts'\nimport { write } from './write.ts'\n\nexport function create(\n accessor: NextcloudAccessor,\n path: PathSpec,\n index?: IndexCacheStore,\n): Promise<void> {\n return write(accessor, path, new Uint8Array(), index)\n}\n","import { FileType, lstripSlash, stripSlash, type PathSpec } from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../../accessor/nextcloud.ts'\nimport { isNotFound, rawPathOf } from '../util.ts'\nimport { statOrNull } from './walk.ts'\nimport { compareCodePoints } from '@struktoai/mirage-core'\n\nexport async function entries(\n accessor: NextcloudAccessor,\n path: PathSpec,\n): Promise<[[string, number][], number]> {\n const info = await statOrNull(accessor, path)\n if (info !== null && info.type !== FileType.DIRECTORY) return [[], info.size ?? 0]\n const prefix = stripSlash(rawPathOf(path))\n const scanPath = prefix !== '' ? `${prefix}/` : '/'\n const op = await accessor.operator()\n const found: [string, number][] = []\n let total = 0\n try {\n for (const entry of await op.list(scanPath, { recursive: true })) {\n const key = entry.path()\n const metadata = entry.metadata()\n if (key === '' || key.endsWith('/') || metadata.isDirectory()) continue\n const size = metadata.contentLength !== null ? Number(metadata.contentLength) : 0\n found.push([`/${lstripSlash(key)}`, size])\n total += size\n }\n } catch (error) {\n if (!isNotFound(error)) throw error\n }\n // Python is `found.sort()`, a code-point tuple sort. localeCompare applies\n // ICU collation, which reorders ASCII (punctuation carries less weight)\n // and disagrees with Python on far more than astral names.\n found.sort(([left], [right]) => compareCodePoints(left, right))\n return [found, total]\n}\n","import { type FileStat, type PathSpec } from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../../accessor/nextcloud.ts'\nimport { stat } from '../stat.ts'\n\nexport async function statOrNull(\n accessor: NextcloudAccessor,\n path: PathSpec,\n): Promise<FileStat | null> {\n try {\n return await stat(accessor, path)\n } catch (error) {\n if ((error as { code?: string } | null)?.code === 'ENOENT') return null\n throw error\n }\n}\n","import type { Metadata } from 'opendal'\nimport {\n enoent,\n FileStat,\n FileType,\n guessType,\n mountPrefixOf,\n ResourceType,\n stripSlash,\n type IndexCacheStore,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../accessor/nextcloud.ts'\nimport { isNotFound, rawPathOf } from './util.ts'\n\nexport async function stat(\n accessor: NextcloudAccessor,\n path: PathSpec,\n index?: IndexCacheStore,\n): Promise<FileStat> {\n const prefix = mountPrefixOf(path.virtual, path.resourcePath)\n const raw = rawPathOf(path)\n const key = stripSlash(raw)\n if (key === '') return new FileStat({ name: '/', type: FileType.DIRECTORY })\n const virtualKey = prefix !== '' ? `${prefix}/${key}` : `/${key}`\n if (index !== undefined) {\n const lookup = await index.get(virtualKey)\n if (lookup.entry !== undefined && lookup.entry !== null) {\n const entry = lookup.entry\n if (entry.resourceType === ResourceType.FOLDER) {\n return new FileStat({\n name: entry.name,\n type: FileType.DIRECTORY,\n modified: entry.remoteTime || null,\n })\n }\n return new FileStat({\n name: entry.name,\n size: entry.size ?? null,\n modified: entry.remoteTime || null,\n type: guessType(entry.name),\n })\n }\n const parent = virtualKey.slice(0, virtualKey.lastIndexOf('/')) || '/'\n const listing = await index.listDir(parent)\n if (listing.entries !== undefined && listing.entries !== null) throw enoent(path)\n }\n const op = await accessor.operator()\n let metadata: Metadata | null = null\n try {\n metadata = await op.stat(key)\n } catch (error) {\n if (!isNotFound(error)) throw error\n }\n if (metadata !== null && !metadata.isDirectory()) return fileStat(key, raw, metadata)\n try {\n const directory = await op.stat(`${key}/`)\n if (directory.isDirectory()) {\n return new FileStat({\n name: key.split('/').pop() ?? '/',\n type: FileType.DIRECTORY,\n modified: directory.lastModified,\n })\n }\n } catch (error) {\n if (!isNotFound(error)) throw error\n }\n throw enoent(path)\n}\n\nfunction fileStat(key: string, raw: string, metadata: Metadata): FileStat {\n const etag = metadata.etag\n return new FileStat({\n name: key.split('/').pop() ?? key,\n size: metadata.contentLength !== null ? Number(metadata.contentLength) : null,\n modified: metadata.lastModified,\n type: guessType(raw),\n fingerprint: etag,\n extra: etag !== null && etag !== '' ? { etag } : {},\n })\n}\n","import { FileType, stripSlash, type PathSpec } from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../../accessor/nextcloud.ts'\nimport { isNotFound, rawPathOf } from '../util.ts'\nimport { statOrNull } from './walk.ts'\n\nexport async function size(accessor: NextcloudAccessor, path: PathSpec): Promise<number> {\n const info = await statOrNull(accessor, path)\n if (info !== null && info.type !== FileType.DIRECTORY) return info.size ?? 0\n const prefix = stripSlash(rawPathOf(path))\n const scanPath = prefix !== '' ? `${prefix}/` : '/'\n const op = await accessor.operator()\n let total = 0\n try {\n for (const entry of await op.list(scanPath, { recursive: true })) {\n const metadata = entry.metadata()\n if (entry.path().endsWith('/') || metadata.isDirectory()) continue\n total += metadata.contentLength !== null ? Number(metadata.contentLength) : 0\n }\n } catch (error) {\n if (isNotFound(error)) return 0\n throw error\n }\n return total\n}\n","import type { PathSpec } from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../accessor/nextcloud.ts'\nimport { stat } from './stat.ts'\n\nexport async function exists(accessor: NextcloudAccessor, path: PathSpec): Promise<boolean> {\n try {\n await stat(accessor, path)\n return true\n } catch (error) {\n if ((error as { code?: string } | null)?.code === 'ENOENT') return false\n throw error\n }\n}\n","import type { Metadata } from 'opendal'\nimport {\n keep,\n optionsTree,\n rstripSlash,\n startBasename,\n stripSlash,\n treeHasEmpty,\n type FindEntry,\n type FindOptions,\n type PathSpec,\n type PredNode,\n compareCodePoints,\n} from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../accessor/nextcloud.ts'\nimport {\n searchFiles,\n supportsQuery,\n type Bounds,\n type FilesSearchQuery,\n type SearchEntry,\n} from './search/index.ts'\nimport { isNotFound, rawPathOf } from './util.ts'\n\ninterface FindScope {\n baseKey: string\n scanKey: string\n startName: string\n}\n\ninterface Candidate {\n key: string\n name: string\n kind: 'f' | 'd'\n size: number | null\n modified: number | null\n isEmpty: boolean | null\n}\n\ninterface FindCriteria {\n predicate: PredNode\n size: Bounds\n modified: Bounds\n minDepth: number | null\n maxDepth: number | null\n}\n\nfunction findScope(path: PathSpec): FindScope {\n const relative = stripSlash(rawPathOf(path))\n return {\n baseKey: relative !== '' ? `/${relative}` : '/',\n scanKey: relative !== '' ? `${relative}/` : '/',\n startName: startBasename(path.virtual),\n }\n}\n\nfunction constrained(bounds: Bounds): boolean {\n return bounds.lower !== null || bounds.upper !== null\n}\n\nfunction contains(bounds: Bounds, value: number): boolean {\n if (bounds.lower !== null && value < bounds.lower) return false\n if (bounds.upper !== null && value > bounds.upper) return false\n return true\n}\n\nfunction scopeContains(scope: FindScope, key: string): boolean {\n if (scope.baseKey === '/') return key.startsWith('/')\n return key === scope.baseKey || key.startsWith(`${scope.baseKey}/`)\n}\n\nfunction depth(scope: FindScope, key: string): number {\n if (key === scope.baseKey) return 0\n const baseDepth = scope.baseKey === '/' ? 0 : (scope.baseKey.match(/\\//g) ?? []).length\n return (key.match(/\\//g) ?? []).length - baseDepth\n}\n\nfunction parentKeys(scope: FindScope, key: string): string[] {\n const keys: string[] = []\n let parent = key.slice(0, key.lastIndexOf('/')) || '/'\n while (scopeContains(scope, parent)) {\n keys.push(parent)\n if (parent === scope.baseKey) break\n parent = parent.slice(0, parent.lastIndexOf('/')) || '/'\n }\n return keys\n}\n\nfunction basename(key: string): string {\n return rstripSlash(key).split('/').pop() ?? ''\n}\n\nfunction modifiedTimestamp(metadata: Metadata): number | null {\n if (metadata.lastModified === null) return null\n const milliseconds = Date.parse(metadata.lastModified)\n return Number.isNaN(milliseconds) ? null : milliseconds / 1000\n}\n\nfunction candidateFromMetadata(key: string, name: string, metadata: Metadata): Candidate {\n const isDirectory = metadata.isDirectory()\n return {\n key,\n name,\n kind: isDirectory ? 'd' : 'f',\n size: isDirectory ? 0 : metadata.contentLength !== null ? Number(metadata.contentLength) : null,\n modified: modifiedTimestamp(metadata),\n isEmpty: null,\n }\n}\n\nfunction candidateFromSearch(entry: SearchEntry): Candidate {\n return { ...entry, isEmpty: null }\n}\n\nasync function statCandidate(\n accessor: NextcloudAccessor,\n key: string,\n name: string,\n): Promise<Candidate | null> {\n if (key === '/') {\n return { key, name, kind: 'd', size: 0, modified: null, isEmpty: null }\n }\n const op = await accessor.operator()\n const relative = stripSlash(key)\n let metadata: Metadata\n try {\n metadata = await op.stat(relative)\n } catch (error) {\n if (!isNotFound(error)) throw error\n try {\n metadata = await op.stat(`${relative}/`)\n } catch (directoryError) {\n if (isNotFound(directoryError)) return null\n throw directoryError\n }\n }\n return candidateFromMetadata(key, name, metadata)\n}\n\nfunction matches(candidate: Candidate, scope: FindScope, criteria: FindCriteria): boolean {\n if (!scopeContains(scope, candidate.key)) {\n throw new Error(`Nextcloud Files Search returned an out-of-scope path: ${candidate.key}`)\n }\n const candidateDepth = depth(scope, candidate.key)\n if (criteria.maxDepth !== null && candidateDepth > criteria.maxDepth) return false\n const entry: FindEntry = {\n key: candidate.key,\n name: candidate.name,\n kind: candidate.kind,\n depth: candidateDepth,\n isEmpty: candidate.isEmpty,\n }\n if (!keep(entry, criteria.predicate, criteria.minDepth)) return false\n if (constrained(criteria.size)) {\n const size = candidate.kind === 'd' ? 0 : (candidate.size ?? 0)\n if (!contains(criteria.size, size)) return false\n }\n if (constrained(criteria.modified)) {\n if (candidate.modified === null || !contains(criteria.modified, candidate.modified))\n return false\n }\n return true\n}\n\nfunction matchingKeys(\n candidates: Map<string, Candidate>,\n scope: FindScope,\n criteria: FindCriteria,\n): string[] {\n return [...candidates.values()]\n .filter((candidate) => matches(candidate, scope, criteria))\n .map((candidate) => candidate.key)\n .sort(compareCodePoints)\n}\n\nfunction searchQuery(criteria: FindCriteria): FilesSearchQuery {\n return {\n tree: criteria.predicate,\n size: criteria.size,\n modified: criteria.modified,\n }\n}\n\nasync function findWithSearch(\n accessor: NextcloudAccessor,\n path: PathSpec,\n scope: FindScope,\n criteria: FindCriteria,\n): Promise<string[] | null> {\n if (criteria.maxDepth === 0 && !treeHasEmpty(criteria.predicate)) {\n const start = await statCandidate(accessor, scope.baseKey, scope.startName)\n if (start === null) return []\n return matchingKeys(new Map([[scope.baseKey, start]]), scope, criteria)\n }\n const query = searchQuery(criteria)\n if (!supportsQuery(query)) return null\n const start = await statCandidate(accessor, scope.baseKey, scope.startName)\n if (start === null) return []\n if (start.kind !== 'd') return null\n const candidates = new Map<string, Candidate>([[scope.baseKey, start]])\n if (criteria.maxDepth !== 0) {\n const found = await searchFiles(accessor, path, query)\n if (found === null) return null\n for (const entry of found) {\n if (!candidates.has(entry.key)) candidates.set(entry.key, candidateFromSearch(entry))\n }\n }\n return matchingKeys(candidates, scope, criteria)\n}\n\nfunction scanKey(rawKey: string): string {\n return `/${stripSlash(rawKey)}`\n}\n\nfunction directoryCandidate(key: string): Candidate {\n return { key, name: basename(key), kind: 'd', size: 0, modified: null, isEmpty: null }\n}\n\nasync function collectScanCandidates(\n accessor: NextcloudAccessor,\n scope: FindScope,\n): Promise<{ candidates: Map<string, Candidate>; nonemptyDirectories: Set<string> }> {\n const candidates = new Map<string, Candidate>()\n const nonemptyDirectories = new Set<string>()\n const op = await accessor.operator()\n let entries\n try {\n entries = await op.list(scope.scanKey, { recursive: true })\n } catch (error) {\n if (isNotFound(error)) return { candidates, nonemptyDirectories }\n throw error\n }\n for (const entry of entries) {\n const rawKey = entry.path()\n if (rawKey === '') continue\n const key = scanKey(rawKey)\n candidates.set(key, candidateFromMetadata(key, basename(key), entry.metadata()))\n for (const parent of parentKeys(scope, key)) {\n nonemptyDirectories.add(parent)\n if (!candidates.has(parent)) candidates.set(parent, directoryCandidate(parent))\n }\n }\n return { candidates, nonemptyDirectories }\n}\n\nfunction emptyState(candidate: Candidate, nonemptyDirectories: Set<string>): boolean {\n return candidate.kind === 'd'\n ? !nonemptyDirectories.has(candidate.key)\n : (candidate.size ?? 0) === 0\n}\n\nasync function hydrateScanCandidate(\n accessor: NextcloudAccessor,\n candidate: Candidate,\n nonemptyDirectories: Set<string>,\n criteria: FindCriteria,\n): Promise<Candidate> {\n let hydrated = candidate\n if (constrained(criteria.modified) && candidate.kind === 'd' && candidate.modified === null) {\n hydrated = (await statCandidate(accessor, candidate.key, candidate.name)) ?? candidate\n }\n return { ...hydrated, isEmpty: emptyState(hydrated, nonemptyDirectories) }\n}\n\nasync function findWithScan(\n accessor: NextcloudAccessor,\n scope: FindScope,\n criteria: FindCriteria,\n): Promise<string[]> {\n const { candidates, nonemptyDirectories } = await collectScanCandidates(accessor, scope)\n const start = await statCandidate(accessor, scope.baseKey, scope.startName)\n if (start === null) return []\n candidates.set(scope.baseKey, start)\n const hydrated = new Map<string, Candidate>()\n for (const candidate of candidates.values()) {\n const entry = await hydrateScanCandidate(accessor, candidate, nonemptyDirectories, criteria)\n hydrated.set(entry.key, entry)\n }\n return matchingKeys(hydrated, scope, criteria)\n}\n\nexport async function find(\n accessor: NextcloudAccessor,\n path: PathSpec,\n options: FindOptions = {},\n): Promise<string[]> {\n const scope = findScope(path)\n const criteria: FindCriteria = {\n predicate: optionsTree(options),\n size: { lower: options.minSize ?? null, upper: options.maxSize ?? null },\n modified: { lower: options.mtimeMin ?? null, upper: options.mtimeMax ?? null },\n minDepth: options.minDepth ?? null,\n maxDepth: options.maxDepth ?? null,\n }\n const searchResults = await findWithSearch(accessor, path, scope, criteria)\n return searchResults ?? findWithScan(accessor, scope, criteria)\n}\n","import type { PredNode } from '@struktoai/mirage-core'\n\nexport const Namespace = {\n DAV: 'DAV:',\n OWNCLOUD: 'http://owncloud.org/ns',\n SEARCHDAV: 'https://github.com/icewind1991/SearchDAV/ns',\n} as const\n\nexport const Comparison = {\n EQUAL: 'eq',\n GREATER_THAN_OR_EQUAL: 'gte',\n LESS_THAN_OR_EQUAL: 'lte',\n LIKE: 'like',\n} as const\n\nexport const BooleanOperation = {\n AND: 'and',\n OR: 'or',\n} as const\n\nexport interface Property {\n namespace: (typeof Namespace)[keyof typeof Namespace]\n prefix: 'd' | 'oc'\n name: string\n}\n\nexport interface Bounds {\n lower: number | null\n upper: number | null\n}\n\nexport interface FilesSearchQuery {\n tree: PredNode\n size?: Bounds\n modified?: Bounds\n}\n\nexport interface SearchEntry {\n key: string\n name: string\n kind: 'f' | 'd'\n size: number | null\n modified: number | null\n}\n\nexport interface SearchTarget {\n endpoint: string\n resourceScope: string\n}\n\nexport interface CompiledPredicate {\n condition: string | null\n negatable: boolean\n}\n\nexport type ComparisonOperator = (typeof Comparison)[keyof typeof Comparison]\nexport type BooleanOperator = (typeof BooleanOperation)[keyof typeof BooleanOperation]\nexport type XmlRecord = Record<string, unknown>\n","import { Namespace, type Property } from './types.ts'\n\nexport const DISPLAY_NAME: Property = {\n namespace: Namespace.DAV,\n prefix: 'd',\n name: 'displayname',\n}\nexport const RESOURCE_TYPE: Property = {\n namespace: Namespace.DAV,\n prefix: 'd',\n name: 'resourcetype',\n}\nexport const CONTENT_LENGTH: Property = {\n namespace: Namespace.DAV,\n prefix: 'd',\n name: 'getcontentlength',\n}\nexport const LAST_MODIFIED: Property = {\n namespace: Namespace.DAV,\n prefix: 'd',\n name: 'getlastmodified',\n}\nexport const SIZE: Property = {\n namespace: Namespace.OWNCLOUD,\n prefix: 'oc',\n name: 'size',\n}\nexport const SELECT_PROPERTIES = [DISPLAY_NAME, RESOURCE_TYPE, CONTENT_LENGTH, LAST_MODIFIED, SIZE]\nexport const ORDER_PROPERTIES = [DISPLAY_NAME, LAST_MODIFIED, SIZE]\nexport const SEARCH_METHOD = 'SEARCH'\nexport const SEARCH_ENDPOINT_PATH = '/remote.php/dav/'\nexport const SEARCH_DEPTH = 'infinity'\nexport const SEARCH_PAGE_SIZE = 100\nexport const SEARCH_HEADERS = {\n Accept: 'application/xml',\n 'Content-Type': 'text/xml; charset=utf-8',\n}\nexport const UNAVAILABLE_STATUS_CODES = new Set([404, 405, 501])\n","import { rstripSlash, stripSlash, type PathSpec } from '@struktoai/mirage-core'\nimport { rawPathOf } from '../util.ts'\nimport { SEARCH_ENDPOINT_PATH } from './constants.ts'\nimport type { SearchTarget } from './types.ts'\n\nfunction decodePath(path: string): string {\n try {\n return decodeURIComponent(path)\n } catch (error) {\n throw new Error(`invalid percent-encoding in Nextcloud path: ${path}`, { cause: error })\n }\n}\n\nexport function searchTarget(url: string): SearchTarget | null {\n const parsed = new URL(url)\n const marker = parsed.pathname.indexOf(SEARCH_ENDPOINT_PATH)\n if (marker < 0) return null\n const davEnd = marker + SEARCH_ENDPOINT_PATH.length\n const relative = stripSlash(parsed.pathname.slice(davEnd))\n const parts = relative === '' ? [] : relative.split('/')\n if (parts.length < 2 || parts[0] !== 'files') return null\n const endpoint = new URL(parsed.toString())\n endpoint.pathname = parsed.pathname.slice(0, davEnd)\n endpoint.search = ''\n endpoint.hash = ''\n return {\n endpoint: endpoint.toString(),\n resourceScope: decodePath(`/${parts.join('/')}`),\n }\n}\n\nexport function scopePath(target: SearchTarget, path: PathSpec): string {\n const relative = stripSlash(rawPathOf(path))\n return relative === '' ? target.resourceScope : `${rstripSlash(target.resourceScope)}/${relative}`\n}\n\nfunction stripScope(path: string, scope: string): string | null {\n if (path === scope) return ''\n const prefix = `${rstripSlash(scope)}/`\n return path.startsWith(prefix) ? path.slice(prefix.length) : null\n}\n\nexport function relativePath(href: string, target: SearchTarget): string {\n const hrefPath = rstripSlash(decodePath(new URL(href, target.endpoint).pathname))\n const resourceScope = rstripSlash(target.resourceScope)\n let relative = stripScope(hrefPath, resourceScope)\n if (relative === null) {\n const davRoot = rstripSlash(decodePath(new URL(target.endpoint).pathname))\n relative = stripScope(hrefPath, `${davRoot}${resourceScope}`)\n }\n if (relative === null) {\n throw new Error(`Nextcloud Files Search returned an out-of-scope href: ${href}`)\n }\n return relative !== '' ? `/${relative}` : '/'\n}\n","import type { PathSpec, PredNode } from '@struktoai/mirage-core'\nimport {\n DISPLAY_NAME,\n LAST_MODIFIED,\n ORDER_PROPERTIES,\n SEARCH_DEPTH,\n SEARCH_PAGE_SIZE,\n SELECT_PROPERTIES,\n SIZE,\n} from './constants.ts'\nimport { scopePath } from './target.ts'\nimport {\n BooleanOperation,\n Comparison,\n Namespace,\n type BooleanOperator,\n type ComparisonOperator,\n type CompiledPredicate,\n type FilesSearchQuery,\n type Property,\n type SearchTarget,\n} from './types.ts'\n\nfunction escapeXml(value: string | number): string {\n return String(value)\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&apos;')\n}\n\nfunction propertyTag(field: Property): string {\n return `<${field.prefix}:${field.name}/>`\n}\n\nfunction property(field: Property): string {\n return `<d:prop>${propertyTag(field)}</d:prop>`\n}\n\nfunction comparison(\n operation: ComparisonOperator,\n field: Property,\n value: string | number,\n): string {\n return `<d:${operation}>${property(field)}<d:literal>${escapeXml(value)}</d:literal></d:${operation}>`\n}\n\nfunction isCollection(): string {\n return '<d:is-collection/>'\n}\n\nfunction negate(condition: string): string {\n return `<d:not>${condition}</d:not>`\n}\n\nfunction combine(operation: BooleanOperator, conditions: string[]): string {\n const [only] = conditions\n if (only !== undefined && conditions.length === 1) return only\n return `<d:${operation}>${conditions.join('')}</d:${operation}>`\n}\n\nexport function globToLike(pattern: string): string {\n let translated = ''\n for (const character of pattern) {\n if (character === '*') translated += '%'\n else if (character === '?') translated += '_'\n else if (character === '\\\\') translated += '%'\n else translated += character\n }\n return translated\n}\n\nfunction nameOperation(node: Extract<PredNode, { op: 'name' }>): ComparisonOperator {\n const wildcard = node.pattern.includes('*') || node.pattern.includes('?')\n return wildcard || node.icase ? Comparison.LIKE : Comparison.EQUAL\n}\n\nfunction nameCondition(node: Extract<PredNode, { op: 'name' }>): string {\n const operation = nameOperation(node)\n const value = operation === Comparison.LIKE ? globToLike(node.pattern) : node.pattern\n return comparison(operation, DISPLAY_NAME, value)\n}\n\nfunction compilePredicate(node: PredNode): CompiledPredicate | null {\n switch (node.op) {\n case 'true':\n return { condition: null, negatable: false }\n case 'name': {\n // A class has no LIKE spelling, and a backslash escapes the next\n // character out of the glob (`-name 'a\\b'` matches `ab`), so the literal\n // the server would compare is not the name being matched.\n if (node.pattern.includes('[') || node.pattern.includes('\\\\')) return null\n // LIKE is a deliberate superset (case-insensitive, and a literal `%`/`_`\n // in the pattern stays a wildcard) that the client-side keep()\n // re-filters. Negation has nothing to re-filter with: NOT(superset)\n // withholds rows the true predicate keeps and no client pass can add\n // them back, so only the exact comparison is safe to negate.\n return {\n condition: nameCondition(node),\n negatable: nameOperation(node) === Comparison.EQUAL,\n }\n }\n case 'type':\n if (node.kind === 'd') return { condition: isCollection(), negatable: true }\n if (node.kind === 'f') return { condition: negate(isCollection()), negatable: false }\n return null\n case 'not': {\n const compiled = compilePredicate(node.kid)\n if (compiled?.condition == null) return null\n // Nextcloud inverts a `<d:not>` by swapping the comparison inside it\n // for its opposite, so the only thing it can negate is a single\n // comparison; anything else raises server-side and comes back as a 500.\n // Refusing here is what falls the whole find back to the scan walk,\n // which has no such limit.\n if (!compiled.negatable) return null\n return { condition: negate(compiled.condition), negatable: false }\n }\n case 'and':\n case 'or': {\n const conditions: string[] = []\n let negatable = false\n for (const kid of node.kids) {\n const compiled = compilePredicate(kid)\n if (compiled === null) return null\n if (compiled.condition === null) {\n if (node.op === 'or') return null\n continue\n }\n conditions.push(compiled.condition)\n negatable = compiled.negatable\n }\n if (conditions.length === 0)\n return node.op === 'and' ? { condition: null, negatable: false } : null\n const operation = node.op === 'and' ? BooleanOperation.AND : BooleanOperation.OR\n // `combine` returns a lone condition unwrapped, so a one-armed group is\n // still exactly whatever that arm was, negatable included. With two or\n // more arms the result is a `<d:and>`/`<d:or>`, which is not.\n return {\n condition: combine(operation, conditions),\n negatable: conditions.length === 1 && negatable,\n }\n }\n case 'path':\n case 'empty':\n return null\n }\n}\n\nfunction sizeCondition(query: FilesSearchQuery): string | null {\n const size = query.size\n if (size === undefined) return null\n const conditions: string[] = []\n if (size.lower !== null && size.lower === size.upper) {\n conditions.push(comparison(Comparison.EQUAL, SIZE, size.lower))\n } else {\n if (size.lower !== null) {\n conditions.push(comparison(Comparison.GREATER_THAN_OR_EQUAL, SIZE, size.lower))\n }\n if (size.upper !== null) {\n conditions.push(comparison(Comparison.LESS_THAN_OR_EQUAL, SIZE, size.upper))\n }\n }\n if (conditions.length === 0) return null\n const fileBounds = combine(BooleanOperation.AND, [negate(isCollection()), ...conditions])\n const includesZero =\n (size.lower === null || size.lower <= 0) && (size.upper === null || size.upper >= 0)\n return includesZero ? combine(BooleanOperation.OR, [isCollection(), fileBounds]) : fileBounds\n}\n\nfunction whereCondition(query: FilesSearchQuery): string | null {\n const compiled = compilePredicate(query.tree)\n if (compiled === null) return null\n const conditions: string[] = []\n if (compiled.condition !== null) conditions.push(compiled.condition)\n const size = sizeCondition(query)\n if (size !== null) conditions.push(size)\n if (query.modified?.lower != null) {\n conditions.push(\n comparison(Comparison.GREATER_THAN_OR_EQUAL, LAST_MODIFIED, Math.floor(query.modified.lower)),\n )\n }\n if (query.modified?.upper != null) {\n conditions.push(\n comparison(Comparison.LESS_THAN_OR_EQUAL, LAST_MODIFIED, Math.ceil(query.modified.upper)),\n )\n }\n return conditions.length > 0 ? combine(BooleanOperation.AND, conditions) : null\n}\n\nexport function supportsQuery(query: FilesSearchQuery): boolean {\n return whereCondition(query) !== null\n}\n\nfunction order(field: Property): string {\n return `<d:order>${property(field)}<d:ascending/></d:order>`\n}\n\nexport function requestBody(\n target: SearchTarget,\n path: PathSpec,\n query: FilesSearchQuery,\n offset: number,\n): string {\n const condition = whereCondition(query)\n if (condition === null) throw new Error('Nextcloud Files Search requires a supported query')\n const selected = SELECT_PROPERTIES.map(propertyTag).join('')\n const ordered = ORDER_PROPERTIES.map(order).join('')\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?><d:searchrequest xmlns:d=\"${Namespace.DAV}\" xmlns:oc=\"${Namespace.OWNCLOUD}\" xmlns:sd=\"${Namespace.SEARCHDAV}\"><d:basicsearch><d:select><d:prop>${selected}</d:prop></d:select><d:from><d:scope><d:href>${escapeXml(scopePath(target, path))}</d:href><d:depth>${SEARCH_DEPTH}</d:depth></d:scope></d:from><d:where>${condition}</d:where><d:orderby>${ordered}</d:orderby><d:limit><d:nresults>${String(SEARCH_PAGE_SIZE)}</d:nresults><sd:firstresult>${String(offset)}</sd:firstresult></d:limit></d:basicsearch></d:searchrequest>`\n}\n","import { XMLParser } from 'fast-xml-parser'\nimport { SyntaxValidator } from 'fast-xml-validator'\nimport { rstripSlash } from '@struktoai/mirage-core'\nimport { CONTENT_LENGTH, DISPLAY_NAME, LAST_MODIFIED, RESOURCE_TYPE, SIZE } from './constants.ts'\nimport { relativePath } from './target.ts'\nimport type { Property, SearchEntry, SearchTarget, XmlRecord } from './types.ts'\n\nconst parser = new XMLParser({\n ignoreAttributes: false,\n removeNSPrefix: true,\n parseTagValue: false,\n trimValues: false,\n})\n\nfunction isRecord(value: unknown): value is XmlRecord {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction records(value: unknown): XmlRecord[] {\n if (Array.isArray(value)) return value.filter(isRecord)\n return isRecord(value) ? [value] : []\n}\n\nfunction stringValue(value: unknown): string | null {\n if (typeof value === 'string' || typeof value === 'number') return String(value)\n return null\n}\n\nfunction successfulProperties(response: XmlRecord): XmlRecord[] {\n const properties: XmlRecord[] = []\n for (const propstat of records(response.propstat)) {\n const status = stringValue(propstat.status) ?? ''\n const fields = status.split(/\\s+/)\n if (fields[1] === '200' && isRecord(propstat.prop)) properties.push(propstat.prop)\n }\n if (properties.length === 0) {\n throw new Error('Nextcloud Files Search result has no successful properties')\n }\n return properties\n}\n\nfunction findText(properties: XmlRecord[], field: Property): string | null {\n for (const propertySet of properties) {\n const value = stringValue(propertySet[field.name])\n if (value !== null) return value\n }\n return null\n}\n\nfunction hasCollection(properties: XmlRecord[]): boolean {\n return properties.some((propertySet) => {\n const resourceType = propertySet[RESOURCE_TYPE.name]\n return isRecord(resourceType) && 'collection' in resourceType\n })\n}\n\nfunction modifiedTimestamp(value: string | null): number | null {\n if (value === null) return null\n const milliseconds = Date.parse(value)\n if (Number.isNaN(milliseconds)) {\n throw new Error(`invalid Nextcloud Files Search timestamp: ${value}`)\n }\n return milliseconds / 1000\n}\n\nfunction entrySize(properties: XmlRecord[]): number | null {\n const value = findText(properties, SIZE) ?? findText(properties, CONTENT_LENGTH)\n if (value === null) return null\n const size = Number(value)\n if (!Number.isInteger(size)) throw new Error(`invalid Nextcloud Files Search size: ${value}`)\n return size\n}\n\nfunction parseResponse(response: XmlRecord, target: SearchTarget): SearchEntry {\n const href = stringValue(response.href)\n if (href === null) throw new Error('Nextcloud Files Search result is missing href')\n const properties = successfulProperties(response)\n const key = relativePath(href, target)\n return {\n key,\n name: findText(properties, DISPLAY_NAME) ?? rstripSlash(key).split('/').pop() ?? '',\n kind: hasCollection(properties) ? 'd' : 'f',\n size: entrySize(properties),\n modified: modifiedTimestamp(findText(properties, LAST_MODIFIED)),\n }\n}\n\nfunction validateXml(content: string): void {\n try {\n const validation = SyntaxValidator.validate(content)\n if (validation !== true) throw new Error(validation.err.msg)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new Error(`invalid Nextcloud Files Search XML: ${message}`, { cause: error })\n }\n}\n\nexport function parsePage(content: string, target: SearchTarget): SearchEntry[] {\n validateXml(content)\n const parsed = parser.parse(content) as unknown\n if (!isRecord(parsed) || !('multistatus' in parsed)) {\n throw new Error('invalid Nextcloud Files Search response')\n }\n const multistatus = parsed.multistatus\n if (multistatus === '') return []\n if (!isRecord(multistatus)) throw new Error('invalid Nextcloud Files Search response')\n return records(multistatus.response).map((response) => parseResponse(response, target))\n}\n","import type { PathSpec } from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../../accessor/nextcloud.ts'\nimport {\n SEARCH_HEADERS,\n SEARCH_METHOD,\n SEARCH_PAGE_SIZE,\n UNAVAILABLE_STATUS_CODES,\n} from './constants.ts'\nimport { requestBody, supportsQuery } from './query.ts'\nimport { parsePage } from './response.ts'\nimport { searchTarget } from './target.ts'\nimport type { FilesSearchQuery, SearchEntry } from './types.ts'\n\nfunction authorization(accessor: NextcloudAccessor): string | null {\n const username = accessor.config.username\n if (username === undefined || username === '') return null\n return `Basic ${Buffer.from(`${username}:${accessor.config.password ?? ''}`).toString('base64')}`\n}\n\nexport async function searchFiles(\n accessor: NextcloudAccessor,\n path: PathSpec,\n query: FilesSearchQuery,\n): Promise<SearchEntry[] | null> {\n if (!supportsQuery(query)) return null\n const target = searchTarget(accessor.config.url)\n if (target === null) return null\n const headers: Record<string, string> = { ...SEARCH_HEADERS }\n const auth = authorization(accessor)\n if (auth !== null) headers.Authorization = auth\n const entries = new Map<string, SearchEntry>()\n let offset = 0\n for (;;) {\n const response = await fetch(target.endpoint, {\n method: SEARCH_METHOD,\n headers,\n body: requestBody(target, path, query, offset),\n signal: AbortSignal.timeout((accessor.config.timeout ?? 30) * 1000),\n })\n if (UNAVAILABLE_STATUS_CODES.has(response.status)) return null\n if (!response.ok) {\n throw new Error(`Nextcloud Files Search returned HTTP ${String(response.status)}`)\n }\n if (response.status !== 207) {\n throw new Error(\n `Nextcloud Files Search returned HTTP ${String(response.status)}, expected 207`,\n )\n }\n const page = parsePage(await response.text(), target)\n const previousSize = entries.size\n for (const entry of page) if (!entries.has(entry.key)) entries.set(entry.key, entry)\n if (page.length > 0 && entries.size === previousSize) return null\n if (page.length < SEARCH_PAGE_SIZE) break\n offset += page.length\n }\n return [...entries.values()]\n}\n","import {\n invalidateAfterWrite,\n invalidateAncestors,\n rstripSlash,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../accessor/nextcloud.ts'\nimport { nextcloudKey } from './util.ts'\n\nexport async function mkdir(\n accessor: NextcloudAccessor,\n path: PathSpec,\n parents = false,\n): Promise<void> {\n const key = `${rstripSlash(nextcloudKey(path))}/`\n const op = await accessor.operator()\n await op.createDir(key)\n await invalidateAfterWrite(path)\n if (parents) await invalidateAncestors(path)\n}\n","import {\n enoent,\n record,\n ResourceName,\n type IndexCacheStore,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../accessor/nextcloud.ts'\nimport { isNotFound, nextcloudKey } from './util.ts'\n\nexport interface NextcloudReadOptions {\n offset?: number\n size?: number\n}\n\nexport async function read(\n accessor: NextcloudAccessor,\n path: PathSpec,\n _index?: IndexCacheStore,\n options: NextcloudReadOptions = {},\n): Promise<Uint8Array> {\n const op = await accessor.operator()\n const readOptions: { offset?: bigint; size?: bigint } = {}\n if (options.offset !== undefined && options.offset > 0) {\n readOptions.offset = BigInt(options.offset)\n }\n if (options.size !== undefined) {\n readOptions.offset ??= 0n\n readOptions.size = BigInt(options.size)\n }\n const startMs = performance.now()\n try {\n const data =\n readOptions.offset !== undefined || readOptions.size !== undefined\n ? await op.read(nextcloudKey(path), readOptions)\n : await op.read(nextcloudKey(path))\n const bytes = new Uint8Array(data)\n record('read', path.virtual, ResourceName.NEXTCLOUD, bytes.byteLength, startMs)\n return bytes\n } catch (error) {\n if (isNotFound(error)) throw enoent(path)\n throw error\n }\n}\n","import {\n enotdir,\n enoent,\n IndexEntry,\n mountPrefixOf,\n ResourceType,\n rstripSlash,\n stripSlash,\n type IndexCacheStore,\n type PathSpec,\n compareCodePoints,\n} from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../accessor/nextcloud.ts'\nimport { SCOPE_ERROR } from './constants.ts'\nimport { isNotFound } from './util.ts'\n\nexport async function readdir(\n accessor: NextcloudAccessor,\n path: PathSpec,\n index?: IndexCacheStore,\n): Promise<string[]> {\n const prefix = mountPrefixOf(path.virtual, path.resourcePath)\n let target = path.pattern !== null ? path.directory : path.virtual\n if (prefix !== '' && target.startsWith(prefix)) {\n const rest = target.slice(prefix.length)\n if (prefix.endsWith('/') || rest === '' || rest.startsWith('/')) target = rest || '/'\n }\n const virtualKey = rstripSlash(prefix !== '' ? `${prefix}${target}` : target) || '/'\n if (index !== undefined) {\n const listing = await index.listDir(virtualKey)\n if (listing.entries !== undefined && listing.entries !== null) return listing.entries\n }\n const stripped = stripSlash(target)\n const listPath = stripped !== '' ? `${stripped}/` : '/'\n const op = await accessor.operator()\n let entries\n try {\n entries = await op.list(listPath)\n } catch (error) {\n if (isNotFound(error)) throw enoent(path)\n throw error\n }\n const names: string[] = []\n const directories = new Set<string>()\n const metadata = new Map<string, { size: number | null; modified: string }>()\n for (const entry of entries) {\n const relative = entry.path()\n if (relative === '' || relative === listPath) continue\n const info = entry.metadata()\n const isDirectory = relative.endsWith('/') || info.isDirectory()\n const key = `/${rstripSlash(relative)}`\n names.push(key)\n if (isDirectory) directories.add(key)\n metadata.set(key, {\n size: info.contentLength !== null ? Number(info.contentLength) : null,\n modified: info.lastModified ?? '',\n })\n }\n // PROPFIND normally carries getcontentlength for every file; when the\n // lister omits the metadata, one stat per affected file fills the gap so\n // the index never caches an unknown size.\n for (const [key, info] of metadata) {\n if (directories.has(key) || info.size !== null) continue\n const md = await op.stat(stripSlash(key))\n info.size = md.contentLength !== null ? Number(md.contentLength) : null\n if (info.modified === '' && md.lastModified !== null) info.modified = md.lastModified\n }\n const targetKey = `/${stripSlash(target)}`\n if (names.length === 1 && names[0] === targetKey && !directories.has(targetKey)) {\n throw enotdir(path)\n }\n names.sort(compareCodePoints)\n if (names.length > SCOPE_ERROR) {\n console.warn(\n `nextcloud readdir: ${virtualKey} returned ${String(names.length)} entries (limit ${String(SCOPE_ERROR)})`,\n )\n }\n if (index !== undefined) {\n await index.setDir(\n virtualKey,\n names.map((key) => {\n const name = key.split('/').pop() ?? key\n const info = metadata.get(key)\n return [\n name,\n new IndexEntry({\n id: key,\n name,\n resourceType: directories.has(key) ? ResourceType.FOLDER : ResourceType.FILE,\n size: directories.has(key) ? null : (info?.size ?? null),\n remoteTime: info?.modified ?? '',\n }),\n ]\n }),\n )\n }\n return names.map((key) => (prefix !== '' ? `${prefix}${key}` : key)).sort(compareCodePoints)\n}\n","import {\n enoent,\n invalidateAfterUnlink,\n invalidateAfterWrite,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../accessor/nextcloud.ts'\nimport { isNotFound, nextcloudKey } from './util.ts'\n\nexport async function rename(\n accessor: NextcloudAccessor,\n source: PathSpec,\n destination: PathSpec,\n): Promise<void> {\n const op = await accessor.operator()\n try {\n await op.rename(nextcloudKey(source), nextcloudKey(destination))\n } catch (error) {\n if (isNotFound(error)) throw enoent(source)\n throw error\n }\n await invalidateAfterWrite(destination)\n await invalidateAfterUnlink(source)\n}\n","import { enoent, invalidateAfterUnlink, rstripSlash, type PathSpec } from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../accessor/nextcloud.ts'\nimport { isNotFound, nextcloudKey } from './util.ts'\n\nexport async function rmR(accessor: NextcloudAccessor, path: PathSpec): Promise<void> {\n const key = `${rstripSlash(nextcloudKey(path))}/`\n const op = await accessor.operator()\n try {\n await op.removeAll(key)\n } catch (error) {\n if (isNotFound(error)) throw enoent(path)\n throw error\n }\n await invalidateAfterUnlink(path)\n}\n","import { enoent, invalidateAfterUnlink, rstripSlash, type PathSpec } from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../accessor/nextcloud.ts'\nimport { isNotFound, nextcloudKey } from './util.ts'\n\nexport async function rmdir(accessor: NextcloudAccessor, path: PathSpec): Promise<void> {\n const key = `${rstripSlash(nextcloudKey(path))}/`\n const op = await accessor.operator()\n try {\n await op.delete(key)\n } catch (error) {\n if (isNotFound(error)) throw enoent(path)\n throw error\n }\n await invalidateAfterUnlink(path)\n}\n","import { enoent, recordStream, type IndexCacheStore, type PathSpec } from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../accessor/nextcloud.ts'\nimport { DEFAULT_CHUNK_SIZE } from './constants.ts'\nimport { read } from './read.ts'\nimport { isNotFound, nextcloudKey } from './util.ts'\n\nexport function rangeRead(\n accessor: NextcloudAccessor,\n path: PathSpec,\n start: number,\n end: number,\n): Promise<Uint8Array> {\n return read(accessor, path, undefined, { offset: start, size: end - start })\n}\n\nexport async function* stream(\n accessor: NextcloudAccessor,\n path: PathSpec,\n _index?: IndexCacheStore,\n chunkSize = DEFAULT_CHUNK_SIZE,\n): AsyncIterable<Uint8Array> {\n const op = await accessor.operator()\n const rec = recordStream('read', path.virtual, accessor.resourceName)\n let reader\n try {\n reader = await op.reader(nextcloudKey(path))\n } catch (error) {\n if (isNotFound(error)) throw enoent(path)\n throw error\n }\n const buffer = Buffer.alloc(chunkSize)\n for (;;) {\n const size = Number(await reader.read(buffer))\n if (size <= 0) break\n const chunk = new Uint8Array(buffer.subarray(0, size))\n if (rec !== null) rec.bytes += chunk.byteLength\n yield chunk\n }\n}\n","import { ResourceName, invalidateAfterWrite, record, type PathSpec } from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../accessor/nextcloud.ts'\nimport { isNotFound, nextcloudKey } from './util.ts'\n\nexport async function truncate(\n accessor: NextcloudAccessor,\n path: PathSpec,\n length: number,\n): Promise<void> {\n const start = performance.now()\n const op = await accessor.operator()\n const key = nextcloudKey(path)\n let current: Buffer\n try {\n current = await op.read(key)\n } catch (error) {\n if (!isNotFound(error)) throw error\n current = Buffer.alloc(0)\n }\n const next = Buffer.alloc(length)\n current.copy(next, 0, 0, Math.min(current.byteLength, length))\n await op.write(key, next)\n record('truncate', path.virtual, ResourceName.NEXTCLOUD, 0, start)\n await invalidateAfterWrite(path)\n}\n","import {\n enoent,\n invalidateAfterUnlink,\n record,\n ResourceName,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../accessor/nextcloud.ts'\nimport { isNotFound, nextcloudKey } from './util.ts'\n\nexport async function unlink(accessor: NextcloudAccessor, path: PathSpec): Promise<void> {\n const op = await accessor.operator()\n const startMs = performance.now()\n try {\n await op.delete(nextcloudKey(path))\n } catch (error) {\n if (isNotFound(error)) throw enoent(path)\n throw error\n }\n record('unlink', path.virtual, ResourceName.NEXTCLOUD, 0, startMs)\n await invalidateAfterUnlink(path)\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 ListingDeltaHook,\n mountPrefixOf,\n statFingerprint,\n stripSlash,\n type DeltaHook,\n type PathSpec,\n type WalkEntry,\n} from '@struktoai/mirage-core'\nimport type { NextcloudAccessor } from '../../accessor/nextcloud.ts'\nimport { isNotFound } from './util.ts'\n\nexport class NextcloudWalk {\n private readonly accessor: NextcloudAccessor\n\n constructor(accessor: NextcloudAccessor) {\n this.accessor = accessor\n }\n\n async *walk(root: PathSpec): AsyncGenerator<WalkEntry> {\n const prefix = mountPrefixOf(root.virtual, root.resourcePath)\n const base = stripSlash(root.resourcePath)\n const listPath = base !== '' ? `${base}/` : '/'\n const operator = await this.accessor.operator()\n let entries\n try {\n entries = await operator.list(listPath, { recursive: true })\n } catch (error) {\n if (isNotFound(error)) return\n throw error\n }\n for (const entry of entries) {\n const relative = entry.path()\n if (relative === '' || relative === listPath) continue\n const metadata = entry.metadata()\n const isDir = relative.endsWith('/') || metadata.isDirectory()\n const resourcePath = stripSlash(relative)\n const virtual = prefix !== '' ? `${prefix}/${resourcePath}` : `/${resourcePath}`\n if (isDir) {\n yield { virtual, isDir: true, fingerprint: null }\n continue\n }\n const modified = metadata.lastModified\n const size = metadata.contentLength === null ? null : Number(metadata.contentLength)\n yield {\n virtual,\n isDir: false,\n fingerprint: statFingerprint(metadata.etag, modified, size),\n size,\n modified,\n }\n }\n }\n}\n\nexport function buildDeltaHook(accessor: NextcloudAccessor): DeltaHook {\n const walk = new NextcloudWalk(accessor)\n return new ListingDeltaHook(walk.walk.bind(walk))\n}\n","import { makeGenericOps, ResourceName, type RegisteredOp } from '@struktoai/mirage-core'\nimport { NEXTCLOUD_IO } from '../../commands/builtin/nextcloud/io.ts'\n\nexport const NEXTCLOUD_OPS: readonly RegisteredOp[] = makeGenericOps(\n ResourceName.NEXTCLOUD,\n NEXTCLOUD_IO,\n)\n","export const NEXTCLOUD_PROMPT = 'You have access to files stored in Nextcloud.'\n"],"mappings":"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","names":["mountPrefixOf","ResourceName","ResourceName","enoent","invalidateAfterWrite","ResourceName","enoent","ResourceName","invalidateAfterWrite","FileType","lstripSlash","stripSlash","enoent","mountPrefixOf","mountPrefixOf","enoent","FileType","stripSlash","size","lstripSlash","FileType","stripSlash","FileType","stripSlash","rstripSlash","stripSlash","compareCodePoints","stripSlash","stripSlash","size","rstripSlash","size","rstripSlash","entries","stripSlash","rstripSlash","modifiedTimestamp","size","compareCodePoints","start","entries","invalidateAfterWrite","rstripSlash","rstripSlash","invalidateAfterWrite","enoent","record","ResourceName","record","ResourceName","enoent","enoent","mountPrefixOf","ResourceType","rstripSlash","stripSlash","compareCodePoints","mountPrefixOf","rstripSlash","stripSlash","entries","enoent","compareCodePoints","ResourceType","enoent","invalidateAfterWrite","enoent","invalidateAfterWrite","enoent","invalidateAfterUnlink","rstripSlash","rstripSlash","enoent","invalidateAfterUnlink","enoent","invalidateAfterUnlink","rstripSlash","rstripSlash","enoent","invalidateAfterUnlink","enoent","enoent","size","ResourceName","invalidateAfterWrite","record","record","ResourceName","invalidateAfterWrite","enoent","invalidateAfterUnlink","record","ResourceName","enoent","record","ResourceName","invalidateAfterUnlink","ResourceName","mountPrefixOf","stripSlash","mountPrefixOf","stripSlash","entries","size","ResourceName","ResourceName","ResourceName","mountPrefixOf"]}
@@ -1,26 +1,37 @@
1
1
  // src/resource/gcs/config.ts
2
- import { normalizeFields, redactConfigWithSchema, secretStr, z } from "@struktoai/mirage-core";
2
+ import {
3
+ normalizeFields,
4
+ redactConfigWithSchema,
5
+ secretStr,
6
+ z
7
+ } from "@struktoai/mirage-core";
3
8
  var GCS_ENDPOINT = "https://storage.googleapis.com";
4
9
  var GCSConfigSchema = z.object({
5
10
  bucket: z.string(),
6
- accessKeyId: secretStr(),
7
- secretAccessKey: secretStr(),
11
+ accessKeyId: secretStr().optional(),
12
+ secretAccessKey: secretStr().optional(),
13
+ sessionToken: secretStr().optional(),
14
+ profile: z.string().optional(),
8
15
  endpoint: z.string(),
9
16
  region: z.string(),
10
17
  timeoutMs: z.number().optional(),
11
18
  forcePathStyle: z.boolean().optional(),
12
- keyPrefix: z.string().optional()
19
+ keyPrefix: z.string().optional(),
20
+ proxy: secretStr().optional()
13
21
  });
14
22
  function gcsToS3Config(config) {
15
23
  return {
16
24
  bucket: config.bucket,
17
25
  region: config.region ?? "auto",
18
26
  endpoint: config.endpoint ?? GCS_ENDPOINT,
19
- accessKeyId: config.accessKeyId,
20
- secretAccessKey: config.secretAccessKey,
27
+ ...config.accessKeyId !== void 0 ? { accessKeyId: config.accessKeyId } : {},
28
+ ...config.secretAccessKey !== void 0 ? { secretAccessKey: config.secretAccessKey } : {},
29
+ ...config.sessionToken !== void 0 ? { sessionToken: config.sessionToken } : {},
30
+ ...config.profile !== void 0 ? { profile: config.profile } : {},
21
31
  ...config.timeoutMs !== void 0 ? { timeoutMs: config.timeoutMs } : {},
22
32
  ...config.forcePathStyle !== void 0 ? { forcePathStyle: config.forcePathStyle } : {},
23
- ...config.keyPrefix !== void 0 ? { keyPrefix: config.keyPrefix } : {}
33
+ ...config.keyPrefix !== void 0 ? { keyPrefix: config.keyPrefix } : {},
34
+ ...config.proxy !== void 0 ? { proxy: config.proxy } : {}
24
35
  };
25
36
  }
26
37
  function redactGcsConfig(config) {
@@ -35,6 +46,8 @@ function normalizeGcsConfig(input) {
35
46
  rename: {
36
47
  access_key_id: "accessKeyId",
37
48
  secret_access_key: "secretAccessKey",
49
+ session_token: "sessionToken",
50
+ aws_profile: "profile",
38
51
  endpoint_url: "endpoint",
39
52
  path_style: "forcePathStyle",
40
53
  key_prefix: "keyPrefix",
@@ -42,8 +55,7 @@ function normalizeGcsConfig(input) {
42
55
  },
43
56
  transform: {
44
57
  timeout: (v) => typeof v === "number" ? v * 1e3 : v
45
- },
46
- drop: ["proxy"]
58
+ }
47
59
  });
48
60
  }
49
61
 
@@ -53,4 +65,4 @@ export {
53
65
  redactGcsConfig,
54
66
  normalizeGcsConfig
55
67
  };
56
- //# sourceMappingURL=chunk-E3KXVEYI.js.map
68
+ //# sourceMappingURL=chunk-OAE57MNL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/gcs/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 redactConfigWithSchema,\n type ConfigOf,\n type RedactedConfig,\n secretStr,\n z,\n} from '@struktoai/mirage-core'\nimport type { S3Config } from '../s3/config.ts'\n\nexport const GCS_ENDPOINT = 'https://storage.googleapis.com'\n\nexport interface GCSConfig {\n bucket: string\n accessKeyId?: string\n secretAccessKey?: string\n sessionToken?: string\n profile?: string\n endpoint?: string\n region?: string\n timeoutMs?: number\n forcePathStyle?: boolean\n keyPrefix?: string\n proxy?: string\n}\n\nconst GCSConfigSchema = z.object({\n bucket: z.string(),\n accessKeyId: secretStr().optional(),\n secretAccessKey: secretStr().optional(),\n sessionToken: secretStr().optional(),\n profile: z.string().optional(),\n endpoint: z.string(),\n region: z.string(),\n timeoutMs: z.number().optional(),\n forcePathStyle: z.boolean().optional(),\n keyPrefix: z.string().optional(),\n proxy: secretStr().optional(),\n})\n\n// Only the redacted twin derives: the schema is the resolved shape, with\n// the region and endpoint the redactor fills in.\nexport type GCSConfigRedacted = RedactedConfig<\n ConfigOf<typeof GCSConfigSchema>,\n 'accessKeyId' | 'secretAccessKey' | 'sessionToken' | 'proxy'\n>\n\nexport function gcsToS3Config(config: GCSConfig): S3Config {\n return {\n bucket: config.bucket,\n region: config.region ?? 'auto',\n endpoint: config.endpoint ?? GCS_ENDPOINT,\n ...(config.accessKeyId !== undefined ? { accessKeyId: config.accessKeyId } : {}),\n ...(config.secretAccessKey !== undefined ? { secretAccessKey: config.secretAccessKey } : {}),\n ...(config.sessionToken !== undefined ? { sessionToken: config.sessionToken } : {}),\n ...(config.profile !== undefined ? { profile: config.profile } : {}),\n ...(config.timeoutMs !== undefined ? { timeoutMs: config.timeoutMs } : {}),\n ...(config.forcePathStyle !== undefined ? { forcePathStyle: config.forcePathStyle } : {}),\n ...(config.keyPrefix !== undefined ? { keyPrefix: config.keyPrefix } : {}),\n ...(config.proxy !== undefined ? { proxy: config.proxy } : {}),\n }\n}\n\nexport function redactGcsConfig(config: GCSConfig): GCSConfigRedacted {\n return redactConfigWithSchema(GCSConfigSchema, {\n ...config,\n endpoint: config.endpoint ?? GCS_ENDPOINT,\n region: config.region ?? 'auto',\n }) as unknown as GCSConfigRedacted\n}\n\nexport function normalizeGcsConfig(input: Record<string, unknown>): GCSConfig {\n return normalizeFields(input, {\n rename: {\n access_key_id: 'accessKeyId',\n secret_access_key: 'secretAccessKey',\n session_token: 'sessionToken',\n aws_profile: 'profile',\n endpoint_url: 'endpoint',\n path_style: 'forcePathStyle',\n key_prefix: 'keyPrefix',\n timeout: 'timeoutMs',\n },\n transform: {\n timeout: (v: unknown) => (typeof v === 'number' ? v * 1000 : v),\n },\n }) as unknown as GCSConfig\n}\n"],"mappings":";AAcA;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,OACK;AAGA,IAAM,eAAe;AAgB5B,IAAM,kBAAkB,EAAE,OAAO;AAAA,EAC/B,QAAQ,EAAE,OAAO;AAAA,EACjB,aAAa,UAAU,EAAE,SAAS;AAAA,EAClC,iBAAiB,UAAU,EAAE,SAAS;AAAA,EACtC,cAAc,UAAU,EAAE,SAAS;AAAA,EACnC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,UAAU,EAAE,OAAO;AAAA,EACnB,QAAQ,EAAE,OAAO;AAAA,EACjB,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,gBAAgB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACrC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,OAAO,UAAU,EAAE,SAAS;AAC9B,CAAC;AASM,SAAS,cAAc,QAA6B;AACzD,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO,UAAU;AAAA,IACzB,UAAU,OAAO,YAAY;AAAA,IAC7B,GAAI,OAAO,gBAAgB,SAAY,EAAE,aAAa,OAAO,YAAY,IAAI,CAAC;AAAA,IAC9E,GAAI,OAAO,oBAAoB,SAAY,EAAE,iBAAiB,OAAO,gBAAgB,IAAI,CAAC;AAAA,IAC1F,GAAI,OAAO,iBAAiB,SAAY,EAAE,cAAc,OAAO,aAAa,IAAI,CAAC;AAAA,IACjF,GAAI,OAAO,YAAY,SAAY,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AAAA,IAClE,GAAI,OAAO,cAAc,SAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,IACxE,GAAI,OAAO,mBAAmB,SAAY,EAAE,gBAAgB,OAAO,eAAe,IAAI,CAAC;AAAA,IACvF,GAAI,OAAO,cAAc,SAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,IACxE,GAAI,OAAO,UAAU,SAAY,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,EAC9D;AACF;AAEO,SAAS,gBAAgB,QAAsC;AACpE,SAAO,uBAAuB,iBAAiB;AAAA,IAC7C,GAAG;AAAA,IACH,UAAU,OAAO,YAAY;AAAA,IAC7B,QAAQ,OAAO,UAAU;AAAA,EAC3B,CAAC;AACH;AAEO,SAAS,mBAAmB,OAA2C;AAC5E,SAAO,gBAAgB,OAAO;AAAA,IAC5B,QAAQ;AAAA,MACN,eAAe;AAAA,MACf,mBAAmB;AAAA,MACnB,eAAe;AAAA,MACf,aAAa;AAAA,MACb,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,IACA,WAAW;AAAA,MACT,SAAS,CAAC,MAAgB,OAAO,MAAM,WAAW,IAAI,MAAO;AAAA,IAC/D;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  redactGitHubCIConfig
3
- } from "./chunk-ZPB3SLPK.js";
3
+ } from "./chunk-ND4IWJ4V.js";
4
4
 
5
5
  // src/resource/github_ci/github_ci.ts
6
6
  import {
@@ -43,9 +43,6 @@ var GitHubCIResource = class extends BaseResource {
43
43
  open() {
44
44
  return Promise.resolve();
45
45
  }
46
- close() {
47
- return Promise.resolve();
48
- }
49
46
  commands() {
50
47
  return GITHUB_CI_COMMANDS;
51
48
  }
@@ -87,4 +84,4 @@ var GitHubCIResource = class extends BaseResource {
87
84
  export {
88
85
  GitHubCIResource
89
86
  };
90
- //# sourceMappingURL=chunk-JBDFYIN2.js.map
87
+ //# sourceMappingURL=chunk-OHKGIQB4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/github_ci/github_ci.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_CI_COMMANDS,\n GITHUB_CI_PROMPT,\n GITHUB_CI_OPS,\n GitHubCIAccessor,\n HttpCITransport,\n PathSpec,\n ResourceName,\n githubCiRead,\n githubCiReaddir,\n makeResolveGlob,\n githubCiStat,\n mountKey,\n mountPrefixOf,\n type FileStat,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n} from '@struktoai/mirage-core'\nimport { redactGitHubCIConfig, type GitHubCIConfig, type GitHubCIConfigRedacted } from './config.ts'\n\nconst githubCiResolveGlob = makeResolveGlob(githubCiReaddir)\n\nexport interface GitHubCIResourceState {\n type: string\n config: GitHubCIConfigRedacted\n}\n\nexport class GitHubCIResource extends BaseResource implements Resource {\n readonly kind: string = ResourceName.GITHUB_CI\n readonly cachesReads: boolean = true\n override readonly indexTtl: number = 86_400\n readonly prompt: string = GITHUB_CI_PROMPT\n readonly config: GitHubCIConfig\n readonly accessor: GitHubCIAccessor\n\n constructor(config: GitHubCIConfig) {\n super()\n this.config = config\n const transportOpts: { token: string; baseUrl?: string } = { token: config.token }\n if (config.baseUrl !== undefined) transportOpts.baseUrl = config.baseUrl\n this.accessor = new GitHubCIAccessor({\n transport: new HttpCITransport(transportOpts),\n owner: config.owner,\n repo: config.repo,\n days: config.days ?? 30,\n maxRuns: config.maxRuns ?? 300,\n })\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n commands(): readonly RegisteredCommand[] {\n return GITHUB_CI_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return GITHUB_CI_OPS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return githubCiRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return githubCiReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return githubCiStat(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 githubCiResolveGlob(this.accessor, effective, this.index)\n }\n\n getState(): Promise<GitHubCIResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactGitHubCIConfig(this.config),\n })\n }\n\n loadState(_state: GitHubCIResourceState): 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,OAKK;AAGP,IAAM,sBAAsB,gBAAgB,eAAe;AAOpD,IAAM,mBAAN,cAA+B,aAAiC;AAAA,EAC5D,OAAe,aAAa;AAAA,EAC5B,cAAuB;AAAA,EACd,WAAmB;AAAA,EAC5B,SAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EAET,YAAY,QAAwB;AAClC,UAAM;AACN,SAAK,SAAS;AACd,UAAM,gBAAqD,EAAE,OAAO,OAAO,MAAM;AACjF,QAAI,OAAO,YAAY,OAAW,eAAc,UAAU,OAAO;AACjE,SAAK,WAAW,IAAI,iBAAiB;AAAA,MACnC,WAAW,IAAI,gBAAgB,aAAa;AAAA,MAC5C,OAAO,OAAO;AAAA,MACd,MAAM,OAAO;AAAA,MACb,MAAM,OAAO,QAAQ;AAAA,MACrB,SAAS,OAAO,WAAW;AAAA,IAC7B,CAAC;AAAA,EACH;AAAA,EAEA,OAAsB;AACpB,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,aAAa,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EAClD;AAAA,EAEA,QAAQ,GAAgC;AACtC,WAAO,gBAAgB,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACrD;AAAA,EAEA,KAAK,GAAgC;AACnC,WAAO,aAAa,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EAClD;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,oBAAoB,KAAK,UAAU,WAAW,KAAK,KAAK;AAAA,EACjE;AAAA,EAEA,WAA2C;AACzC,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,qBAAqB,KAAK,MAAM;AAAA,IAC1C,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,QAA8C;AACtD,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  HfModelsAccessor,
3
3
  HfResource
4
- } from "./chunk-HEDE2377.js";
4
+ } from "./chunk-DDAFNROK.js";
5
5
  import {
6
6
  assertHfRepoId,
7
7
  redactHfRepoConfig
8
- } from "./chunk-KAWDDS27.js";
8
+ } from "./chunk-QAOVABCR.js";
9
9
 
10
10
  // src/resource/hf_models/hf_models.ts
11
11
  import { normalizeKeyPrefix, ResourceName } from "@struktoai/mirage-core";
@@ -47,4 +47,4 @@ export {
47
47
  HF_MODELS_PROMPT,
48
48
  HfModelsResource
49
49
  };
50
- //# sourceMappingURL=chunk-V7JVMG63.js.map
50
+ //# sourceMappingURL=chunk-OXEQSPND.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
- redactGSlidesConfig
3
- } from "./chunk-GTAS3QVC.js";
2
+ redactGoogleConfig
3
+ } from "./chunk-4IF4TGAI.js";
4
4
 
5
5
  // src/resource/gslides/gslides.ts
6
6
  import {
@@ -32,20 +32,12 @@ var GSlidesResource = class extends BaseResource {
32
32
  constructor(config) {
33
33
  super();
34
34
  this.config = config;
35
- const tm = new TokenManager({
36
- clientId: config.clientId,
37
- clientSecret: config.clientSecret,
38
- refreshToken: config.refreshToken,
39
- ...config.refreshFn !== void 0 ? { refreshFn: config.refreshFn } : {}
40
- });
35
+ const tm = new TokenManager(config);
41
36
  this.accessor = new GSlidesAccessor({ tokenManager: tm });
42
37
  }
43
38
  open() {
44
39
  return Promise.resolve();
45
40
  }
46
- close() {
47
- return Promise.resolve();
48
- }
49
41
  commands() {
50
42
  return GSLIDES_COMMANDS;
51
43
  }
@@ -76,7 +68,7 @@ var GSlidesResource = class extends BaseResource {
76
68
  getState() {
77
69
  return Promise.resolve({
78
70
  type: this.kind,
79
- config: redactGSlidesConfig(this.config)
71
+ config: redactGoogleConfig(this.config)
80
72
  });
81
73
  }
82
74
  loadState(_state) {
@@ -87,4 +79,4 @@ var GSlidesResource = class extends BaseResource {
87
79
  export {
88
80
  GSlidesResource
89
81
  };
90
- //# sourceMappingURL=chunk-YRJICL2Q.js.map
82
+ //# sourceMappingURL=chunk-PKNE5J2B.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/gslides/gslides.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 GSLIDES_COMMANDS,\n GSLIDES_PROMPT,\n GSLIDES_OPS,\n GSLIDES_WRITE_PROMPT,\n GSlidesAccessor,\n PathSpec,\n ResourceName,\n TokenManager,\n gslidesRead,\n gslidesReaddir,\n makeResolveGlob,\n gslidesStat,\n mountKey,\n mountPrefixOf,\n type FileStat,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n} from '@struktoai/mirage-core'\nimport { redactGSlidesConfig, type GSlidesConfig, type GSlidesConfigRedacted } from './config.ts'\n\nconst gslidesResolveGlob = makeResolveGlob(gslidesReaddir)\n\nexport interface GSlidesResourceState {\n type: string\n config: GSlidesConfigRedacted\n}\n\nexport class GSlidesResource extends BaseResource implements Resource {\n readonly kind: string = ResourceName.GSLIDES\n readonly cachesReads: boolean = true\n override readonly indexTtl: number = 86_400\n readonly prompt: string = GSLIDES_PROMPT\n readonly writePrompt: string = GSLIDES_WRITE_PROMPT\n readonly config: GSlidesConfig\n readonly accessor: GSlidesAccessor\n\n constructor(config: GSlidesConfig) {\n super()\n this.config = config\n const tm = new TokenManager(config)\n this.accessor = new GSlidesAccessor({ tokenManager: tm })\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n commands(): readonly RegisteredCommand[] {\n return GSLIDES_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return GSLIDES_OPS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return gslidesRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return gslidesReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return gslidesStat(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 gslidesResolveGlob(this.accessor, effective, this.index)\n }\n\n getState(): Promise<GSlidesResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactGSlidesConfig(this.config),\n })\n }\n\n loadState(_state: GSlidesResourceState): 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,qBAAqB,gBAAgB,cAAc;AAOlD,IAAM,kBAAN,cAA8B,aAAiC;AAAA,EAC3D,OAAe,aAAa;AAAA,EAC5B,cAAuB;AAAA,EACd,WAAmB;AAAA,EAC5B,SAAiB;AAAA,EACjB,cAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EAET,YAAY,QAAuB;AACjC,UAAM;AACN,SAAK,SAAS;AACd,UAAM,KAAK,IAAI,aAAa,MAAM;AAClC,SAAK,WAAW,IAAI,gBAAgB,EAAE,cAAc,GAAG,CAAC;AAAA,EAC1D;AAAA,EAEA,OAAsB;AACpB,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,YAAY,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACjD;AAAA,EAEA,QAAQ,GAAgC;AACtC,WAAO,eAAe,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACpD;AAAA,EAEA,KAAK,GAAgC;AACnC,WAAO,YAAY,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACjD;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,mBAAmB,KAAK,UAAU,WAAW,KAAK,KAAK;AAAA,EAChE;AAAA,EAEA,WAA0C;AACxC,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,mBAAoB,KAAK,MAAM;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,QAA6C;AACrD,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -0,0 +1,16 @@
1
+ import {
2
+ makeFixedAlias
3
+ } from "./chunk-7ZP6TPHX.js";
4
+
5
+ // src/resource/ceph/config.ts
6
+ var alias = makeFixedAlias();
7
+ var cephToS3Config = alias.toS3Config;
8
+ var redactCephConfig = alias.redact;
9
+ var normalizeCephConfig = alias.normalize;
10
+
11
+ export {
12
+ cephToS3Config,
13
+ redactCephConfig,
14
+ normalizeCephConfig
15
+ };
16
+ //# sourceMappingURL=chunk-PSXXEGYQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/ceph/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 { makeFixedAlias, type S3AliasConfig, type S3AliasConfigRedacted } from '../s3_alias.ts'\n\nexport interface CephConfig extends S3AliasConfig {\n endpoint: string\n}\n\nexport type CephConfigRedacted = S3AliasConfigRedacted\n\nconst alias = makeFixedAlias<CephConfig, CephConfigRedacted>()\n\nexport const cephToS3Config = alias.toS3Config\nexport const redactCephConfig = alias.redact\nexport const normalizeCephConfig = alias.normalize\n"],"mappings":";;;;;AAsBA,IAAM,QAAQ,eAA+C;AAEtD,IAAM,iBAAiB,MAAM;AAC7B,IAAM,mBAAmB,MAAM;AAC/B,IAAM,sBAAsB,MAAM;","names":[]}
@@ -1,5 +1,10 @@
1
1
  // src/resource/hf_buckets/config.ts
2
- import { normalizeFields, redactConfigWithSchema, secretStr, z } from "@struktoai/mirage-core";
2
+ import {
3
+ normalizeFields,
4
+ redactConfigWithSchema,
5
+ secretStr,
6
+ z
7
+ } from "@struktoai/mirage-core";
3
8
  var HF_ENDPOINT = "https://huggingface.co";
4
9
  function assertHfRepoId(value, field) {
5
10
  const parts = value.split("/");
@@ -71,4 +76,4 @@ export {
71
76
  redactHfRepoConfig,
72
77
  normalizeHfRepoConfig
73
78
  };
74
- //# sourceMappingURL=chunk-KAWDDS27.js.map
79
+ //# sourceMappingURL=chunk-QAOVABCR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/hf_buckets/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 type ConfigOf,\n normalizeFields,\n redactConfigWithSchema,\n type RedactedConfig,\n secretStr,\n z,\n} from '@struktoai/mirage-core'\n\nexport const HF_ENDPOINT = 'https://huggingface.co'\n\nexport function assertHfRepoId(value: string, field: string): string {\n const parts = value.split('/')\n if (parts.length !== 2 || parts[0] === '' || parts[1] === '') {\n throw new Error(`${field} must be in 'namespace/name' form; got ${JSON.stringify(value)}`)\n }\n return value\n}\n\nexport interface HfBucketsConfig {\n bucket: string\n token?: string\n endpoint?: string\n timeoutMs?: number\n keyPrefix?: string\n}\n\nconst HfBucketsConfigSchema = z.object({\n bucket: z.string(),\n token: secretStr().optional(),\n endpoint: z.string(),\n timeoutMs: z.number().optional(),\n keyPrefix: z.string().optional(),\n})\n\n// Only the redacted twin derives: the schema is the resolved shape, with\n// the endpoint the redactor fills in.\nexport type HfBucketsConfigRedacted = RedactedConfig<\n ConfigOf<typeof HfBucketsConfigSchema>,\n 'token'\n>\n\nexport function redactHfBucketsConfig(config: HfBucketsConfig): HfBucketsConfigRedacted {\n return redactConfigWithSchema(HfBucketsConfigSchema, {\n ...config,\n endpoint: config.endpoint ?? HF_ENDPOINT,\n }) as unknown as HfBucketsConfigRedacted\n}\n\nexport function normalizeHfBucketsConfig(input: Record<string, unknown>): HfBucketsConfig {\n const config = normalizeFields(input, {\n rename: {\n key_prefix: 'keyPrefix',\n timeout: 'timeoutMs',\n },\n transform: {\n timeout: (v: unknown) => (typeof v === 'number' ? v * 1000 : v),\n },\n }) as unknown as HfBucketsConfig\n assertHfRepoId(config.bucket, 'bucket')\n return config\n}\n\nexport interface HfRepoConfig {\n repoId: string\n token?: string\n endpoint?: string\n timeoutMs?: number\n keyPrefix?: string\n revision?: string\n}\n\nconst HfRepoConfigSchema = z.object({\n repoId: z.string(),\n token: secretStr().optional(),\n endpoint: z.string(),\n timeoutMs: z.number().optional(),\n keyPrefix: z.string().optional(),\n revision: z.string().optional(),\n})\n\n// Only the redacted twin derives: the schema is the resolved shape, with\n// the endpoint the redactor fills in.\nexport type HfRepoConfigRedacted = RedactedConfig<ConfigOf<typeof HfRepoConfigSchema>, 'token'>\n\nexport function redactHfRepoConfig(config: HfRepoConfig): HfRepoConfigRedacted {\n return redactConfigWithSchema(HfRepoConfigSchema, {\n ...config,\n endpoint: config.endpoint ?? HF_ENDPOINT,\n }) as unknown as HfRepoConfigRedacted\n}\n\nexport function normalizeHfRepoConfig(input: Record<string, unknown>): HfRepoConfig {\n const config = normalizeFields(input, {\n rename: {\n repo_id: 'repoId',\n key_prefix: 'keyPrefix',\n timeout: 'timeoutMs',\n },\n transform: {\n timeout: (v: unknown) => (typeof v === 'number' ? v * 1000 : v),\n },\n }) as unknown as HfRepoConfig\n assertHfRepoId(config.repoId, 'repo_id')\n return config\n}\n"],"mappings":";AAcA;AAAA,EAEE;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AAEA,IAAM,cAAc;AAEpB,SAAS,eAAe,OAAe,OAAuB;AACnE,QAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,MAAI,MAAM,WAAW,KAAK,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,MAAM,IAAI;AAC5D,UAAM,IAAI,MAAM,GAAG,KAAK,0CAA0C,KAAK,UAAU,KAAK,CAAC,EAAE;AAAA,EAC3F;AACA,SAAO;AACT;AAUA,IAAM,wBAAwB,EAAE,OAAO;AAAA,EACrC,QAAQ,EAAE,OAAO;AAAA,EACjB,OAAO,UAAU,EAAE,SAAS;AAAA,EAC5B,UAAU,EAAE,OAAO;AAAA,EACnB,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AASM,SAAS,sBAAsB,QAAkD;AACtF,SAAO,uBAAuB,uBAAuB;AAAA,IACnD,GAAG;AAAA,IACH,UAAU,OAAO,YAAY;AAAA,EAC/B,CAAC;AACH;AAEO,SAAS,yBAAyB,OAAiD;AACxF,QAAM,SAAS,gBAAgB,OAAO;AAAA,IACpC,QAAQ;AAAA,MACN,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,IACA,WAAW;AAAA,MACT,SAAS,CAAC,MAAgB,OAAO,MAAM,WAAW,IAAI,MAAO;AAAA,IAC/D;AAAA,EACF,CAAC;AACD,iBAAe,OAAO,QAAQ,QAAQ;AACtC,SAAO;AACT;AAWA,IAAM,qBAAqB,EAAE,OAAO;AAAA,EAClC,QAAQ,EAAE,OAAO;AAAA,EACjB,OAAO,UAAU,EAAE,SAAS;AAAA,EAC5B,UAAU,EAAE,OAAO;AAAA,EACnB,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,UAAU,EAAE,OAAO,EAAE,SAAS;AAChC,CAAC;AAMM,SAAS,mBAAmB,QAA4C;AAC7E,SAAO,uBAAuB,oBAAoB;AAAA,IAChD,GAAG;AAAA,IACH,UAAU,OAAO,YAAY;AAAA,EAC/B,CAAC;AACH;AAEO,SAAS,sBAAsB,OAA8C;AAClF,QAAM,SAAS,gBAAgB,OAAO;AAAA,IACpC,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,IACA,WAAW;AAAA,MACT,SAAS,CAAC,MAAgB,OAAO,MAAM,WAAW,IAAI,MAAO;AAAA,IAC/D;AAAA,EACF,CAAC;AACD,iBAAe,OAAO,QAAQ,SAAS;AACvC,SAAO;AACT;","names":[]}
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  backblazeToS3Config,
3
3
  redactBackblazeConfig
4
- } from "./chunk-UAJYJP5C.js";
4
+ } from "./chunk-EUPXAYPB.js";
5
5
  import {
6
6
  S3Resource
7
- } from "./chunk-IUXXZHY3.js";
7
+ } from "./chunk-EJZG5VUF.js";
8
8
 
9
9
  // src/resource/backblaze/backblaze.ts
10
10
  import {
@@ -17,8 +17,7 @@ import {
17
17
  var BACKBLAZE_PROMPT = `{prefix}
18
18
  Remote Backblaze B2 bucket (S3-compatible).
19
19
  IMPORTANT: This is a remote mount. Prefer targeted reads over full scans.
20
- Supports: ls, cat, head, tail, grep, rg, wc, find, tree, jq, stat.
21
- cat on .parquet/.orc/.feather returns a formatted table.`;
20
+ Supports: ls, cat, head, tail, grep, rg, wc, find, tree, jq, stat.`;
22
21
 
23
22
  // src/resource/backblaze/backblaze.ts
24
23
  var BackblazeResource = class extends S3Resource {
@@ -54,4 +53,4 @@ export {
54
53
  BACKBLAZE_PROMPT,
55
54
  BackblazeResource
56
55
  };
57
- //# sourceMappingURL=chunk-SYMNWNC3.js.map
56
+ //# sourceMappingURL=chunk-QQ7FP4GD.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/resource/backblaze/backblaze.ts","../src/resource/backblaze/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 remapCommandsResource,\n remapOpsResource,\n ResourceName,\n type RegisteredCommand,\n type RegisteredOp,\n} from '@struktoai/mirage-core'\nimport { S3Resource } from '../s3/s3.ts'\nimport {\n backblazeToS3Config,\n redactBackblazeConfig,\n type BackblazeConfig,\n type BackblazeConfigRedacted,\n} from './config.ts'\nimport { BACKBLAZE_PROMPT } from './prompt.ts'\n\nexport interface BackblazeResourceState {\n type: string\n config: BackblazeConfigRedacted\n}\n\nexport class BackblazeResource extends S3Resource {\n override readonly kind: string = ResourceName.BACKBLAZE\n override readonly prompt: string = BACKBLAZE_PROMPT\n readonly backblazeConfig: BackblazeConfig\n private readonly backblazeOps: readonly RegisteredOp[]\n private readonly backblazeCommands: readonly RegisteredCommand[]\n\n constructor(config: BackblazeConfig) {\n super(backblazeToS3Config(config))\n this.backblazeConfig = config\n this.backblazeOps = remapOpsResource(super.ops(), ResourceName.BACKBLAZE)\n this.backblazeCommands = remapCommandsResource(super.commands(), ResourceName.BACKBLAZE)\n }\n\n override ops(): readonly RegisteredOp[] {\n return this.backblazeOps\n }\n\n override commands(): readonly RegisteredCommand[] {\n return this.backblazeCommands\n }\n\n override getState(): Promise<BackblazeResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactBackblazeConfig(this.backblazeConfig),\n })\n }\n\n override loadState(_state: BackblazeResourceState): 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\nexport const BACKBLAZE_PROMPT = `\\\n{prefix}\n Remote Backblaze B2 bucket (S3-compatible).\n IMPORTANT: This is a remote mount. Prefer targeted reads over full scans.\n Supports: ls, cat, head, tail, grep, rg, wc, find, tree, jq, stat.\n cat on .parquet/.orc/.feather returns a formatted table.`\n"],"mappings":";;;;;;;;;AAcA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;;;ACNA,IAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;;;ADqBzB,IAAM,oBAAN,cAAgC,WAAW;AAAA,EAC9B,OAAe,aAAa;AAAA,EAC5B,SAAiB;AAAA,EAC1B;AAAA,EACQ;AAAA,EACA;AAAA,EAEjB,YAAY,QAAyB;AACnC,UAAM,oBAAoB,MAAM,CAAC;AACjC,SAAK,kBAAkB;AACvB,SAAK,eAAe,iBAAiB,MAAM,IAAI,GAAG,aAAa,SAAS;AACxE,SAAK,oBAAoB,sBAAsB,MAAM,SAAS,GAAG,aAAa,SAAS;AAAA,EACzF;AAAA,EAES,MAA+B;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAyC;AAChD,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAA4C;AACnD,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,sBAAsB,KAAK,eAAe;AAAA,IACpD,CAAC;AAAA,EACH;AAAA,EAES,UAAU,QAA+C;AAChE,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/resource/backblaze/backblaze.ts","../src/resource/backblaze/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 remapCommandsResource,\n remapOpsResource,\n ResourceName,\n type RegisteredCommand,\n type RegisteredOp,\n} from '@struktoai/mirage-core'\nimport { S3Resource } from '../s3/s3.ts'\nimport {\n backblazeToS3Config,\n redactBackblazeConfig,\n type BackblazeConfig,\n type BackblazeConfigRedacted,\n} from './config.ts'\nimport { BACKBLAZE_PROMPT } from './prompt.ts'\n\nexport interface BackblazeResourceState {\n type: string\n config: BackblazeConfigRedacted\n}\n\nexport class BackblazeResource extends S3Resource {\n override readonly kind: string = ResourceName.BACKBLAZE\n override readonly prompt: string = BACKBLAZE_PROMPT\n readonly backblazeConfig: BackblazeConfig\n private readonly backblazeOps: readonly RegisteredOp[]\n private readonly backblazeCommands: readonly RegisteredCommand[]\n\n constructor(config: BackblazeConfig) {\n super(backblazeToS3Config(config))\n this.backblazeConfig = config\n this.backblazeOps = remapOpsResource(super.ops(), ResourceName.BACKBLAZE)\n this.backblazeCommands = remapCommandsResource(super.commands(), ResourceName.BACKBLAZE)\n }\n\n override ops(): readonly RegisteredOp[] {\n return this.backblazeOps\n }\n\n override commands(): readonly RegisteredCommand[] {\n return this.backblazeCommands\n }\n\n override getState(): Promise<BackblazeResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactBackblazeConfig(this.backblazeConfig),\n })\n }\n\n override loadState(_state: BackblazeResourceState): 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\nexport const BACKBLAZE_PROMPT = `\\\n{prefix}\n Remote Backblaze B2 bucket (S3-compatible).\n IMPORTANT: This is a remote mount. Prefer targeted reads over full scans.\n Supports: ls, cat, head, tail, grep, rg, wc, find, tree, jq, stat.`\n"],"mappings":";;;;;;;;;AAcA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;;;ACNA,IAAM,mBAAmB;AAAA;AAAA;AAAA;;;ADqBzB,IAAM,oBAAN,cAAgC,WAAW;AAAA,EAC9B,OAAe,aAAa;AAAA,EAC5B,SAAiB;AAAA,EAC1B;AAAA,EACQ;AAAA,EACA;AAAA,EAEjB,YAAY,QAAyB;AACnC,UAAM,oBAAoB,MAAM,CAAC;AACjC,SAAK,kBAAkB;AACvB,SAAK,eAAe,iBAAiB,MAAM,IAAI,GAAG,aAAa,SAAS;AACxE,SAAK,oBAAoB,sBAAsB,MAAM,SAAS,GAAG,aAAa,SAAS;AAAA,EACzF;AAAA,EAES,MAA+B;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAyC;AAChD,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAA4C;AACnD,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,sBAAsB,KAAK,eAAe;AAAA,IACpD,CAAC;AAAA,EACH;AAAA,EAES,UAAU,QAA+C;AAChE,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  redactTrelloConfig
3
- } from "./chunk-NJ42VNXG.js";
3
+ } from "./chunk-ATLXMNKD.js";
4
4
 
5
5
  // src/resource/trello/trello.ts
6
6
  import {
@@ -44,9 +44,6 @@ var TrelloResource = class extends BaseResource {
44
44
  open() {
45
45
  return Promise.resolve();
46
46
  }
47
- close() {
48
- return Promise.resolve();
49
- }
50
47
  commands() {
51
48
  return TRELLO_COMMANDS;
52
49
  }
@@ -94,4 +91,4 @@ var TrelloResource = class extends BaseResource {
94
91
  export {
95
92
  TrelloResource
96
93
  };
97
- //# sourceMappingURL=chunk-3JZN3GYO.js.map
94
+ //# sourceMappingURL=chunk-QYLVMC6B.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/trello/trello.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 HttpTrelloTransport,\n PathSpec,\n ResourceName,\n TRELLO_COMMANDS,\n TRELLO_PROMPT,\n TRELLO_OPS,\n TRELLO_WRITE_PROMPT,\n TrelloAccessor,\n makeResolveGlob,\n mountKey,\n mountPrefixOf,\n trelloRead,\n trelloReaddir,\n trelloStat,\n type FileStat,\n type IndexCacheStore,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n type TrelloReaddirFilter,\n} from '@struktoai/mirage-core'\nimport { redactTrelloConfig, type TrelloConfig, type TrelloConfigRedacted } from './config.ts'\n\nconst resolveTrelloGlob = (\n accessor: TrelloAccessor,\n paths: readonly PathSpec[],\n index: IndexCacheStore | undefined,\n filter: TrelloReaddirFilter,\n): Promise<PathSpec[]> =>\n makeResolveGlob((a: TrelloAccessor, p: PathSpec, i?: IndexCacheStore) =>\n trelloReaddir(a, p, i, filter),\n )(accessor, paths, index)\n\nexport interface TrelloResourceState {\n type: string\n config: TrelloConfigRedacted\n}\n\nexport class TrelloResource extends BaseResource implements Resource {\n readonly kind: string = ResourceName.TRELLO\n readonly cachesReads: boolean = true\n override readonly indexTtl: number = 600\n readonly prompt: string = TRELLO_PROMPT\n readonly writePrompt: string = TRELLO_WRITE_PROMPT\n readonly config: TrelloConfig\n readonly accessor: TrelloAccessor\n\n constructor(config: TrelloConfig) {\n super()\n this.config = config\n const transportOpts: { apiKey: string; apiToken: string; baseUrl?: string } = {\n apiKey: config.apiKey,\n apiToken: config.apiToken,\n }\n if (config.baseUrl !== undefined) transportOpts.baseUrl = config.baseUrl\n this.accessor = new TrelloAccessor(new HttpTrelloTransport(transportOpts))\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n commands(): readonly RegisteredCommand[] {\n return TRELLO_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return TRELLO_OPS\n }\n\n private filter(): TrelloReaddirFilter {\n const out: TrelloReaddirFilter = {}\n if (this.config.workspaceId !== undefined) out.workspaceId = this.config.workspaceId\n if (this.config.boardIds !== undefined) out.boardIds = this.config.boardIds\n return out\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return trelloRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return trelloReaddir(this.accessor, p, this.index, this.filter())\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return trelloStat(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 resolveTrelloGlob(this.accessor, effective, this.index, this.filter())\n }\n\n getState(): Promise<TrelloResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactTrelloConfig(this.config),\n })\n }\n\n loadState(_state: TrelloResourceState): 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,OAOK;AAGP,IAAM,oBAAoB,CACxB,UACA,OACA,OACA,WAEA;AAAA,EAAgB,CAAC,GAAmB,GAAa,MAC/C,cAAc,GAAG,GAAG,GAAG,MAAM;AAC/B,EAAE,UAAU,OAAO,KAAK;AAOnB,IAAM,iBAAN,cAA6B,aAAiC;AAAA,EAC1D,OAAe,aAAa;AAAA,EAC5B,cAAuB;AAAA,EACd,WAAmB;AAAA,EAC5B,SAAiB;AAAA,EACjB,cAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EAET,YAAY,QAAsB;AAChC,UAAM;AACN,SAAK,SAAS;AACd,UAAM,gBAAwE;AAAA,MAC5E,QAAQ,OAAO;AAAA,MACf,UAAU,OAAO;AAAA,IACnB;AACA,QAAI,OAAO,YAAY,OAAW,eAAc,UAAU,OAAO;AACjE,SAAK,WAAW,IAAI,eAAe,IAAI,oBAAoB,aAAa,CAAC;AAAA,EAC3E;AAAA,EAEA,OAAsB;AACpB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,WAAyC;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,MAA+B;AAC7B,WAAO;AAAA,EACT;AAAA,EAEQ,SAA8B;AACpC,UAAM,MAA2B,CAAC;AAClC,QAAI,KAAK,OAAO,gBAAgB,OAAW,KAAI,cAAc,KAAK,OAAO;AACzE,QAAI,KAAK,OAAO,aAAa,OAAW,KAAI,WAAW,KAAK,OAAO;AACnE,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,GAAkC;AACzC,WAAO,WAAW,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EAChD;AAAA,EAEA,QAAQ,GAAgC;AACtC,WAAO,cAAc,KAAK,UAAU,GAAG,KAAK,OAAO,KAAK,OAAO,CAAC;AAAA,EAClE;AAAA,EAEA,KAAK,GAAgC;AACnC,WAAO,WAAW,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EAChD;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,kBAAkB,KAAK,UAAU,WAAW,KAAK,OAAO,KAAK,OAAO,CAAC;AAAA,EAC9E;AAAA,EAEA,WAAyC;AACvC,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,mBAAmB,KAAK,MAAM;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,QAA4C;AACpD,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  digitalOceanToS3Config,
3
3
  redactDigitalOceanConfig
4
- } from "./chunk-3ASOQTZB.js";
4
+ } from "./chunk-VI5YTKNY.js";
5
5
  import {
6
6
  S3Resource
7
- } from "./chunk-IUXXZHY3.js";
7
+ } from "./chunk-EJZG5VUF.js";
8
8
 
9
9
  // src/resource/digitalocean/digitalocean.ts
10
10
  import {
@@ -17,8 +17,7 @@ import {
17
17
  var DIGITALOCEAN_PROMPT = `{prefix}
18
18
  Remote DigitalOcean Spaces bucket (S3-compatible).
19
19
  IMPORTANT: This is a remote mount. Prefer targeted reads over full scans.
20
- Supports: ls, cat, head, tail, grep, rg, wc, find, tree, jq, stat.
21
- cat on .parquet/.orc/.feather returns a formatted table.`;
20
+ Supports: ls, cat, head, tail, grep, rg, wc, find, tree, jq, stat.`;
22
21
 
23
22
  // src/resource/digitalocean/digitalocean.ts
24
23
  var DigitalOceanResource = class extends S3Resource {
@@ -54,4 +53,4 @@ export {
54
53
  DIGITALOCEAN_PROMPT,
55
54
  DigitalOceanResource
56
55
  };
57
- //# sourceMappingURL=chunk-CXQGMFI7.js.map
56
+ //# sourceMappingURL=chunk-RX3XR65X.js.map