@struktoai/mirage-node 0.0.3 → 0.0.5-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (465) 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/cas.lua +15 -0
  7. package/dist/ceph-ALKLD3MO.js +11 -0
  8. package/dist/{chunk-QCZ2XUKH.js → chunk-2A4YGVBM.js} +16 -23
  9. package/dist/chunk-2A4YGVBM.js.map +1 -0
  10. package/dist/chunk-2HCYLVGY.js +28 -0
  11. package/dist/chunk-2HCYLVGY.js.map +1 -0
  12. package/dist/chunk-2VPZAH5Q.js +20 -0
  13. package/dist/chunk-2VPZAH5Q.js.map +1 -0
  14. package/dist/{chunk-UT2OPSN4.js → chunk-3JZQ6VSZ.js} +5 -5
  15. package/dist/chunk-3JZQ6VSZ.js.map +1 -0
  16. package/dist/chunk-4IF4TGAI.js +11 -0
  17. package/dist/chunk-4IF4TGAI.js.map +1 -0
  18. package/dist/{chunk-47AVIIOT.js → chunk-5H6KNEPP.js} +4 -5
  19. package/dist/{chunk-47AVIIOT.js.map → chunk-5H6KNEPP.js.map} +1 -1
  20. package/dist/{chunk-I5THIMPP.js → chunk-5K2MWDCE.js} +6 -7
  21. package/dist/{chunk-I5THIMPP.js.map → chunk-5K2MWDCE.js.map} +1 -1
  22. package/dist/{chunk-3WIO7NBR.js → chunk-6SVXWRKX.js} +4 -5
  23. package/dist/{chunk-3WIO7NBR.js.map → chunk-6SVXWRKX.js.map} +1 -1
  24. package/dist/{chunk-RQK5UPMP.js → chunk-6VOIUGAD.js} +25 -12
  25. package/dist/chunk-6VOIUGAD.js.map +1 -0
  26. package/dist/{chunk-NOHWIBRX.js → chunk-7JYHFXXC.js} +15 -20
  27. package/dist/chunk-7JYHFXXC.js.map +1 -0
  28. package/dist/chunk-7VQQFWV6.js +20 -0
  29. package/dist/chunk-7VQQFWV6.js.map +1 -0
  30. package/dist/chunk-7ZP6TPHX.js +87 -0
  31. package/dist/chunk-7ZP6TPHX.js.map +1 -0
  32. package/dist/{chunk-SWCDFEUK.js → chunk-ADEXNSYU.js} +20 -22
  33. package/dist/chunk-ADEXNSYU.js.map +1 -0
  34. package/dist/chunk-AQSYAXL4.js +16 -0
  35. package/dist/chunk-AQSYAXL4.js.map +1 -0
  36. package/dist/{chunk-RO5IQEDQ.js → chunk-ATLXMNKD.js} +8 -4
  37. package/dist/chunk-ATLXMNKD.js.map +1 -0
  38. package/dist/{chunk-MPCCRRE6.js → chunk-BYCUGFRF.js} +16 -16
  39. package/dist/chunk-BYCUGFRF.js.map +1 -0
  40. package/dist/{chunk-HJJMP6IX.js → chunk-BZTVYOES.js} +3 -3
  41. package/dist/{chunk-B2ZOKNN4.js → chunk-CRC4YWXB.js} +27 -9
  42. package/dist/chunk-CRC4YWXB.js.map +1 -0
  43. package/dist/chunk-CTGXJHO5.js +39 -0
  44. package/dist/chunk-CTGXJHO5.js.map +1 -0
  45. package/dist/{chunk-Q2IAILVC.js → chunk-DCDBIXVZ.js} +14 -5
  46. package/dist/chunk-DCDBIXVZ.js.map +1 -0
  47. package/dist/chunk-DDAFNROK.js +750 -0
  48. package/dist/chunk-DDAFNROK.js.map +1 -0
  49. package/dist/chunk-DQIEWEAW.js +85 -0
  50. package/dist/chunk-DQIEWEAW.js.map +1 -0
  51. package/dist/{chunk-QGRDPSAH.js → chunk-EBI4IHDC.js} +23 -12
  52. package/dist/chunk-EBI4IHDC.js.map +1 -0
  53. package/dist/{chunk-JAGJTM3Q.js → chunk-EIUTZ6N7.js} +19 -34
  54. package/dist/chunk-EIUTZ6N7.js.map +1 -0
  55. package/dist/{chunk-TA3WMOMU.js → chunk-EJZG5VUF.js} +38 -32
  56. package/dist/chunk-EJZG5VUF.js.map +1 -0
  57. package/dist/{chunk-X5HF2OFP.js → chunk-ENW5BVYN.js} +3 -3
  58. package/dist/{chunk-HGCRXJGP.js → chunk-ETIAW4YD.js} +3 -3
  59. package/dist/chunk-EUPXAYPB.js +20 -0
  60. package/dist/chunk-EUPXAYPB.js.map +1 -0
  61. package/dist/{chunk-YAHRT6MB.js → chunk-FA6YNU75.js} +4 -5
  62. package/dist/{chunk-YAHRT6MB.js.map → chunk-FA6YNU75.js.map} +1 -1
  63. package/dist/{chunk-TWGVQLG2.js → chunk-FFH6R5VQ.js} +7 -3
  64. package/dist/chunk-FFH6R5VQ.js.map +1 -0
  65. package/dist/{chunk-JCC4CU2I.js → chunk-GE6H2COM.js} +15 -23
  66. package/dist/chunk-GE6H2COM.js.map +1 -0
  67. package/dist/{chunk-DM4GSE26.js → chunk-GMMQ3ZK4.js} +3 -3
  68. package/dist/{chunk-ZEGAMJO2.js → chunk-GSGE3M5P.js} +15 -23
  69. package/dist/chunk-GSGE3M5P.js.map +1 -0
  70. package/dist/{chunk-GCFYZSVR.js → chunk-H64SB6VO.js} +32 -13
  71. package/dist/chunk-H64SB6VO.js.map +1 -0
  72. package/dist/{chunk-N5FSLVKO.js → chunk-HCRYAFBI.js} +3 -3
  73. package/dist/{chunk-IDYHQQOH.js → chunk-HOPUP6LA.js} +358 -471
  74. package/dist/chunk-HOPUP6LA.js.map +1 -0
  75. package/dist/chunk-HS24BL6W.js +160 -0
  76. package/dist/chunk-HS24BL6W.js.map +1 -0
  77. package/dist/chunk-HVYVG5KQ.js +16 -0
  78. package/dist/chunk-HVYVG5KQ.js.map +1 -0
  79. package/dist/{chunk-FQ33BYFR.js → chunk-I7CPLZNW.js} +4 -5
  80. package/dist/{chunk-FQ33BYFR.js.map → chunk-I7CPLZNW.js.map} +1 -1
  81. package/dist/{chunk-VGLHY6BK.js → chunk-IFUCGI4I.js} +7 -3
  82. package/dist/chunk-IFUCGI4I.js.map +1 -0
  83. package/dist/{chunk-RNQN2FOU.js → chunk-IFYXSSKR.js} +24 -13
  84. package/dist/chunk-IFYXSSKR.js.map +1 -0
  85. package/dist/chunk-IXA4DQE4.js +20 -0
  86. package/dist/chunk-IXA4DQE4.js.map +1 -0
  87. package/dist/chunk-IZMKMD3O.js +11 -0
  88. package/dist/chunk-IZMKMD3O.js.map +1 -0
  89. package/dist/{chunk-7CW3BMPH.js → chunk-JJERW2BI.js} +4 -5
  90. package/dist/{chunk-7CW3BMPH.js.map → chunk-JJERW2BI.js.map} +1 -1
  91. package/dist/{chunk-EM4J5EQS.js → chunk-JQR4HVUX.js} +13 -16
  92. package/dist/chunk-JQR4HVUX.js.map +1 -0
  93. package/dist/{chunk-VWKUT4CW.js → chunk-JXOMDLFS.js} +21 -26
  94. package/dist/chunk-JXOMDLFS.js.map +1 -0
  95. package/dist/chunk-KIX6N7NT.js +1001 -0
  96. package/dist/chunk-KIX6N7NT.js.map +1 -0
  97. package/dist/{chunk-OZAEWZZ3.js → chunk-L42UTDFK.js} +12 -3
  98. package/dist/chunk-L42UTDFK.js.map +1 -0
  99. package/dist/{chunk-54NTYJEO.js → chunk-LPDLPRPS.js} +1 -3
  100. package/dist/{chunk-54NTYJEO.js.map → chunk-LPDLPRPS.js.map} +1 -1
  101. package/dist/chunk-M2UF2JHJ.js +11 -0
  102. package/dist/chunk-M2UF2JHJ.js.map +1 -0
  103. package/dist/{chunk-UGK4TAVK.js → chunk-MONC734W.js} +7 -3
  104. package/dist/chunk-MONC734W.js.map +1 -0
  105. package/dist/{chunk-IK2L4EN3.js → chunk-N72RLCMU.js} +4 -5
  106. package/dist/{chunk-IK2L4EN3.js.map → chunk-N72RLCMU.js.map} +1 -1
  107. package/dist/{chunk-H3I2KZIY.js → chunk-ND4IWJ4V.js} +7 -3
  108. package/dist/chunk-ND4IWJ4V.js.map +1 -0
  109. package/dist/chunk-NZ3EKGW4.js +1312 -0
  110. package/dist/chunk-NZ3EKGW4.js.map +1 -0
  111. package/dist/{chunk-XGJ2QERC.js → chunk-OAE57MNL.js} +27 -11
  112. package/dist/chunk-OAE57MNL.js.map +1 -0
  113. package/dist/{chunk-EZQ5HBAC.js → chunk-OHKGIQB4.js} +12 -16
  114. package/dist/chunk-OHKGIQB4.js.map +1 -0
  115. package/dist/{chunk-E2ISWXLB.js → chunk-OQKNDS66.js} +1 -1
  116. package/dist/{chunk-E2ISWXLB.js.map → chunk-OQKNDS66.js.map} +1 -1
  117. package/dist/{chunk-UINQOUZR.js → chunk-OXEQSPND.js} +3 -3
  118. package/dist/{chunk-A7IVFIOP.js → chunk-PKNE5J2B.js} +15 -23
  119. package/dist/chunk-PKNE5J2B.js.map +1 -0
  120. package/dist/chunk-PSXXEGYQ.js +16 -0
  121. package/dist/chunk-PSXXEGYQ.js.map +1 -0
  122. package/dist/{chunk-EGB7V74Z.js → chunk-QAOVABCR.js} +7 -4
  123. package/dist/chunk-QAOVABCR.js.map +1 -0
  124. package/dist/{chunk-X3G37FXT.js → chunk-QQ7FP4GD.js} +4 -5
  125. package/dist/{chunk-X3G37FXT.js.map → chunk-QQ7FP4GD.js.map} +1 -1
  126. package/dist/{chunk-WAR4Q2NM.js → chunk-QYLVMC6B.js} +13 -15
  127. package/dist/chunk-QYLVMC6B.js.map +1 -0
  128. package/dist/{chunk-KPULTUOK.js → chunk-RX3XR65X.js} +4 -5
  129. package/dist/{chunk-KPULTUOK.js.map → chunk-RX3XR65X.js.map} +1 -1
  130. package/dist/chunk-RYQJJB4C.js +30 -0
  131. package/dist/chunk-RYQJJB4C.js.map +1 -0
  132. package/dist/{chunk-QQBJC2FQ.js → chunk-TUF7TCN7.js} +4 -5
  133. package/dist/{chunk-QQBJC2FQ.js.map → chunk-TUF7TCN7.js.map} +1 -1
  134. package/dist/{chunk-AUHSTJJ3.js → chunk-TUX36JY5.js} +4 -5
  135. package/dist/{chunk-AUHSTJJ3.js.map → chunk-TUX36JY5.js.map} +1 -1
  136. package/dist/chunk-TWRQCQWU.js +1153 -0
  137. package/dist/chunk-TWRQCQWU.js.map +1 -0
  138. package/dist/chunk-U6DFQRG3.js +20 -0
  139. package/dist/chunk-U6DFQRG3.js.map +1 -0
  140. package/dist/chunk-VI5YTKNY.js +20 -0
  141. package/dist/chunk-VI5YTKNY.js.map +1 -0
  142. package/dist/chunk-WG5YS6TC.js +872 -0
  143. package/dist/chunk-WG5YS6TC.js.map +1 -0
  144. package/dist/{chunk-ZGSER5TG.js → chunk-WMJJ4WGF.js} +4 -5
  145. package/dist/{chunk-ZGSER5TG.js.map → chunk-WMJJ4WGF.js.map} +1 -1
  146. package/dist/{chunk-LV2G7VHL.js → chunk-WY4FNH42.js} +21 -18
  147. package/dist/chunk-WY4FNH42.js.map +1 -0
  148. package/dist/{chunk-LAJJPLEV.js → chunk-XIG5BWWH.js} +25 -12
  149. package/dist/chunk-XIG5BWWH.js.map +1 -0
  150. package/dist/chunk-XJBC3OYX.js +11 -0
  151. package/dist/chunk-XJBC3OYX.js.map +1 -0
  152. package/dist/{chunk-G2WCEUQL.js → chunk-XPRDXWK7.js} +21 -20
  153. package/dist/chunk-XPRDXWK7.js.map +1 -0
  154. package/dist/chunk-YKRQSZS7.js +96 -0
  155. package/dist/chunk-YKRQSZS7.js.map +1 -0
  156. package/dist/{chunk-M5FVUIYP.js → chunk-YMBL3VJB.js} +21 -19
  157. package/dist/chunk-YMBL3VJB.js.map +1 -0
  158. package/dist/chunk-YUJBXFYK.js +1205 -0
  159. package/dist/chunk-YUJBXFYK.js.map +1 -0
  160. package/dist/{chunk-JALIYI6M.js → chunk-YZ4ZJNOL.js} +28 -11
  161. package/dist/chunk-YZ4ZJNOL.js.map +1 -0
  162. package/dist/chunk-ZTHVEXIV.js +11 -0
  163. package/dist/chunk-ZTHVEXIV.js.map +1 -0
  164. package/dist/{chunk-GS5AUKUO.js → chunk-ZVSYUCYS.js} +11 -7
  165. package/dist/chunk-ZVSYUCYS.js.map +1 -0
  166. package/dist/{config-QAA646XB.js → config-2YBCHU2W.js} +2 -4
  167. package/dist/{config-IVY5EQQ2.js → config-3YRGRW72.js} +3 -4
  168. package/dist/config-4GSOMUMF.js +9 -0
  169. package/dist/config-5YBUWFUP.js +9 -0
  170. package/dist/{config-34LHOGLM.js → config-5ZRKJTKG.js} +3 -4
  171. package/dist/config-A25LTL5W.js +11 -0
  172. package/dist/config-CLU7JABG.js +9 -0
  173. package/dist/config-D2RF7L3N.js +9 -0
  174. package/dist/{config-LHFFXVYI.js → config-E55TKM6K.js} +2 -4
  175. package/dist/config-ELDOFRJW.js +9 -0
  176. package/dist/{config-GE4W4ZJC.js → config-FPC3RBFD.js} +2 -4
  177. package/dist/config-FPM3LAW7.js +9 -0
  178. package/dist/{config-HKRMKD76.js → config-G3F54CS4.js} +3 -4
  179. package/dist/config-G43HRUI3.js +9 -0
  180. package/dist/{config-WDAZFXYD.js → config-GG3WO5PB.js} +3 -4
  181. package/dist/config-JUYBWAZE.js +9 -0
  182. package/dist/{config-CVZ2AGCO.js → config-LJ5T6TVA.js} +2 -6
  183. package/dist/config-MDSAE4O3.js +11 -0
  184. package/dist/{config-EIHSP5DZ.js → config-NRIOKK5T.js} +2 -4
  185. package/dist/config-OYK2BSJK.js +9 -0
  186. package/dist/config-PB3KA2CE.js +9 -0
  187. package/dist/{config-ZFJYQZCH.js → config-QY4IL3PH.js} +3 -4
  188. package/dist/config-R4LAOEDS.js +9 -0
  189. package/dist/{config-QNMKWJ4M.js → config-RIAAD6RW.js} +3 -4
  190. package/dist/config-SYNEQAUB.js +9 -0
  191. package/dist/{config-Q45Y46YT.js → config-TJKGYA2B.js} +3 -4
  192. package/dist/{config-NV5WXP64.js → config-UU27ALAA.js} +2 -4
  193. package/dist/{config-3IVQJBNW.js → config-UURRGA7U.js} +2 -2
  194. package/dist/{config-VM526IKB.js → config-VPLHQXVE.js} +2 -4
  195. package/dist/config-WRACCRPN.js +9 -0
  196. package/dist/{config-GHRUKEQ6.js → config-WVHKXEVE.js} +3 -4
  197. package/dist/{config-EO23EY62.js → config-XU7R36IE.js} +3 -4
  198. package/dist/config-Y2KOUYSS.js +9 -0
  199. package/dist/databricks_volume-CNCPTZHS.js +7 -0
  200. package/dist/digitalocean-DJZOUB6Q.js +11 -0
  201. package/dist/discord-ETB2CADR.js +7 -0
  202. package/dist/disk-WEHSTK3F.js +7 -0
  203. package/dist/dropbox-XN6PGLNE.js +8 -0
  204. package/dist/email-OV7XCP3T.js +8 -0
  205. package/dist/gcal-P56MRCGU.js +8 -0
  206. package/dist/gcs-HFBIAE2C.js +10 -0
  207. package/dist/gdocs-LQ3UXP3J.js +8 -0
  208. package/dist/gdrive-N6UBYLON.js +8 -0
  209. package/dist/github-BPZREGPI.js +8 -0
  210. package/dist/github_ci-7A4LUIZ7.js +8 -0
  211. package/dist/gmail-YED2MF6H.js +8 -0
  212. package/dist/gridfs-CPLQ4G62.js +9 -0
  213. package/dist/gsheets-4BNIJPQ6.js +8 -0
  214. package/dist/gslides-GDBYLO5A.js +8 -0
  215. package/dist/hf_buckets-FTJITQ3P.js +10 -0
  216. package/dist/hf_datasets-6GXVKQD7.js +10 -0
  217. package/dist/hf_models-PJPGZAC5.js +10 -0
  218. package/dist/hf_spaces-LFNFOLBF.js +10 -0
  219. package/dist/index.d.ts +1311 -569
  220. package/dist/index.js +3359 -964
  221. package/dist/index.js.map +1 -1
  222. package/dist/jaeger-GCA6MJ6E.js +8 -0
  223. package/dist/lancedb-TJ5YSJY5.js +7 -0
  224. package/dist/langfuse-RUMTUMXS.js +8 -0
  225. package/dist/linear-BCE4KEAC.js +7 -0
  226. package/dist/minio-5SO6KBTK.js +11 -0
  227. package/dist/mongodb-L5CMN2EE.js +7 -0
  228. package/dist/nextcloud-4O2LZVW2.js +9 -0
  229. package/dist/notion-RVKEAQ2M.js +7 -0
  230. package/dist/oci-OQXOIC62.js +10 -0
  231. package/dist/postgres-AV45GNRS.js +7 -0
  232. package/dist/qingstor-W277YA4K.js +11 -0
  233. package/dist/r2-FUA4IORE.js +10 -0
  234. package/dist/redis-LPS357NF.js +8 -0
  235. package/dist/s3-FPNWWIVM.js +8 -0
  236. package/dist/scaleway-BP3732U7.js +11 -0
  237. package/dist/seaweedfs-MC6HIEP4.js +11 -0
  238. package/dist/slack-JFGW7VLN.js +7 -0
  239. package/dist/ssh-UYPG42LM.js +8 -0
  240. package/dist/ssh-UYPG42LM.js.map +1 -0
  241. package/dist/supabase-A3KUFMDC.js +10 -0
  242. package/dist/supabase-A3KUFMDC.js.map +1 -0
  243. package/dist/tencent-5464UQ2X.js +11 -0
  244. package/dist/tencent-5464UQ2X.js.map +1 -0
  245. package/dist/trello-O2KB3FUO.js +8 -0
  246. package/dist/trello-O2KB3FUO.js.map +1 -0
  247. package/dist/wasabi-2IKBIWNO.js +10 -0
  248. package/dist/wasabi-2IKBIWNO.js.map +1 -0
  249. package/package.json +17 -3
  250. package/dist/aliyun-JMJ3PFYY.js +0 -10
  251. package/dist/backblaze-TDFD23QO.js +0 -10
  252. package/dist/box-GQ2U2R6R.js +0 -8
  253. package/dist/ceph-S2VOYO6G.js +0 -10
  254. package/dist/chunk-2CC5VW7K.js +0 -52
  255. package/dist/chunk-2CC5VW7K.js.map +0 -1
  256. package/dist/chunk-A7IVFIOP.js.map +0 -1
  257. package/dist/chunk-B2ZOKNN4.js.map +0 -1
  258. package/dist/chunk-DNBAMB5J.js +0 -18
  259. package/dist/chunk-DNBAMB5J.js.map +0 -1
  260. package/dist/chunk-DP2PP5V2.js +0 -26
  261. package/dist/chunk-DP2PP5V2.js.map +0 -1
  262. package/dist/chunk-DYXEITK3.js +0 -52
  263. package/dist/chunk-DYXEITK3.js.map +0 -1
  264. package/dist/chunk-EGB7V74Z.js.map +0 -1
  265. package/dist/chunk-EM4J5EQS.js.map +0 -1
  266. package/dist/chunk-EZQ5HBAC.js.map +0 -1
  267. package/dist/chunk-G2WCEUQL.js.map +0 -1
  268. package/dist/chunk-GCFYZSVR.js.map +0 -1
  269. package/dist/chunk-GS5AUKUO.js.map +0 -1
  270. package/dist/chunk-H3BST2LI.js +0 -26
  271. package/dist/chunk-H3BST2LI.js.map +0 -1
  272. package/dist/chunk-H3I2KZIY.js.map +0 -1
  273. package/dist/chunk-IDYHQQOH.js.map +0 -1
  274. package/dist/chunk-JAGJTM3Q.js.map +0 -1
  275. package/dist/chunk-JALIYI6M.js.map +0 -1
  276. package/dist/chunk-JCC4CU2I.js.map +0 -1
  277. package/dist/chunk-JZT4QGIP.js +0 -24
  278. package/dist/chunk-JZT4QGIP.js.map +0 -1
  279. package/dist/chunk-LAJJPLEV.js.map +0 -1
  280. package/dist/chunk-LV2G7VHL.js.map +0 -1
  281. package/dist/chunk-LW25LMIH.js +0 -26
  282. package/dist/chunk-LW25LMIH.js.map +0 -1
  283. package/dist/chunk-M5FVUIYP.js.map +0 -1
  284. package/dist/chunk-MPCCRRE6.js.map +0 -1
  285. package/dist/chunk-NJMGCT63.js +0 -54
  286. package/dist/chunk-NJMGCT63.js.map +0 -1
  287. package/dist/chunk-NOHWIBRX.js.map +0 -1
  288. package/dist/chunk-OHROA3FQ.js +0 -54
  289. package/dist/chunk-OHROA3FQ.js.map +0 -1
  290. package/dist/chunk-OPYQ5KIO.js +0 -52
  291. package/dist/chunk-OPYQ5KIO.js.map +0 -1
  292. package/dist/chunk-OZAEWZZ3.js.map +0 -1
  293. package/dist/chunk-Q2IAILVC.js.map +0 -1
  294. package/dist/chunk-QCZ2XUKH.js.map +0 -1
  295. package/dist/chunk-QGRDPSAH.js.map +0 -1
  296. package/dist/chunk-RNQN2FOU.js.map +0 -1
  297. package/dist/chunk-RO5IQEDQ.js.map +0 -1
  298. package/dist/chunk-RQK5UPMP.js.map +0 -1
  299. package/dist/chunk-S5OVP467.js +0 -1795
  300. package/dist/chunk-S5OVP467.js.map +0 -1
  301. package/dist/chunk-SFUCUARB.js +0 -21
  302. package/dist/chunk-SFUCUARB.js.map +0 -1
  303. package/dist/chunk-SWCDFEUK.js.map +0 -1
  304. package/dist/chunk-TA3WMOMU.js.map +0 -1
  305. package/dist/chunk-TURD42QO.js +0 -1782
  306. package/dist/chunk-TURD42QO.js.map +0 -1
  307. package/dist/chunk-TWGVQLG2.js.map +0 -1
  308. package/dist/chunk-U6QSXTUS.js +0 -7
  309. package/dist/chunk-U6QSXTUS.js.map +0 -1
  310. package/dist/chunk-UGK4TAVK.js.map +0 -1
  311. package/dist/chunk-UT2OPSN4.js.map +0 -1
  312. package/dist/chunk-VGLHY6BK.js.map +0 -1
  313. package/dist/chunk-VWKUT4CW.js.map +0 -1
  314. package/dist/chunk-W7FLHT65.js +0 -26
  315. package/dist/chunk-W7FLHT65.js.map +0 -1
  316. package/dist/chunk-WAR4Q2NM.js.map +0 -1
  317. package/dist/chunk-WHFUWWI6.js +0 -2097
  318. package/dist/chunk-WHFUWWI6.js.map +0 -1
  319. package/dist/chunk-XGJ2QERC.js.map +0 -1
  320. package/dist/chunk-XHCBHYN4.js +0 -54
  321. package/dist/chunk-XHCBHYN4.js.map +0 -1
  322. package/dist/chunk-XLQI4IT2.js +0 -54
  323. package/dist/chunk-XLQI4IT2.js.map +0 -1
  324. package/dist/chunk-XWVDS66D.js +0 -963
  325. package/dist/chunk-XWVDS66D.js.map +0 -1
  326. package/dist/chunk-YGZMVNN5.js +0 -54
  327. package/dist/chunk-YGZMVNN5.js.map +0 -1
  328. package/dist/chunk-YUK3X3B4.js +0 -27
  329. package/dist/chunk-YUK3X3B4.js.map +0 -1
  330. package/dist/chunk-ZEGAMJO2.js.map +0 -1
  331. package/dist/chunk-ZNWVJ6UW.js +0 -54
  332. package/dist/chunk-ZNWVJ6UW.js.map +0 -1
  333. package/dist/config-3BBWD5AB.js +0 -11
  334. package/dist/config-4UDVSUQJ.js +0 -11
  335. package/dist/config-CMDBAPDH.js +0 -11
  336. package/dist/config-D3RLSPNF.js +0 -11
  337. package/dist/config-DG65OEG3.js +0 -11
  338. package/dist/config-GCQK6NJY.js +0 -11
  339. package/dist/config-GVH27UPE.js +0 -11
  340. package/dist/config-HXVYIXP5.js +0 -11
  341. package/dist/config-IDZMEW73.js +0 -11
  342. package/dist/config-IJJXGLBQ.js +0 -11
  343. package/dist/config-KJOLGVB2.js +0 -11
  344. package/dist/config-KMVCVBYN.js +0 -15
  345. package/dist/config-KYTRXAB2.js +0 -15
  346. package/dist/config-OT2TQQCN.js +0 -11
  347. package/dist/config-QWCY3LBQ.js +0 -11
  348. package/dist/config-ZV6G2ZEC.js +0 -11
  349. package/dist/databricks_volume-7XOUYSTY.js +0 -7
  350. package/dist/digitalocean-3CQ4CPPZ.js +0 -10
  351. package/dist/discord-BG7OSRJG.js +0 -8
  352. package/dist/disk-XVLBCVKE.js +0 -8
  353. package/dist/dropbox-74GYLV3R.js +0 -8
  354. package/dist/email-5IZ7OBQ4.js +0 -8
  355. package/dist/gcs-EMEYU2XT.js +0 -10
  356. package/dist/gdocs-R67TDPON.js +0 -8
  357. package/dist/gdrive-PRN2ALRK.js +0 -8
  358. package/dist/github-DV7E6OFV.js +0 -8
  359. package/dist/github_ci-Q554V5PA.js +0 -8
  360. package/dist/gmail-OLN2LT4O.js +0 -8
  361. package/dist/gsheets-H4RYMQJ5.js +0 -8
  362. package/dist/gslides-YLCHKJOM.js +0 -8
  363. package/dist/hf_buckets-DTKXKKFF.js +0 -10
  364. package/dist/hf_datasets-55C4APKR.js +0 -10
  365. package/dist/hf_models-RO5JR36V.js +0 -10
  366. package/dist/hf_spaces-ZVZ3EDRX.js +0 -10
  367. package/dist/langfuse-ACASJZ7O.js +0 -8
  368. package/dist/linear-IC37LZV7.js +0 -8
  369. package/dist/minio-HZ576XFQ.js +0 -10
  370. package/dist/mongodb-JVR62OIO.js +0 -7
  371. package/dist/notion-HKRPQMJS.js +0 -8
  372. package/dist/oci-ZLVECXTW.js +0 -10
  373. package/dist/postgres-P36Z2YN4.js +0 -7
  374. package/dist/qingstor-YLP6K3L4.js +0 -10
  375. package/dist/r2-RPK25ANI.js +0 -10
  376. package/dist/redis-V5ULXULL.js +0 -8
  377. package/dist/s3-4OIOCAAT.js +0 -8
  378. package/dist/scaleway-CCWCLUHB.js +0 -10
  379. package/dist/seaweedfs-QSWKF2FN.js +0 -10
  380. package/dist/slack-YPS7PII3.js +0 -8
  381. package/dist/ssh-YFP3SMTJ.js +0 -9
  382. package/dist/supabase-6CFTOKGZ.js +0 -10
  383. package/dist/tencent-IWZZOSQ4.js +0 -10
  384. package/dist/trello-XYKWZD6P.js +0 -8
  385. package/dist/wasabi-6Z4DC5S5.js +0 -10
  386. /package/dist/{aliyun-JMJ3PFYY.js.map → aliyun-S62BR3TB.js.map} +0 -0
  387. /package/dist/{backblaze-TDFD23QO.js.map → backblaze-4EKSW63F.js.map} +0 -0
  388. /package/dist/{box-GQ2U2R6R.js.map → box-ZPLZAGMK.js.map} +0 -0
  389. /package/dist/{ceph-S2VOYO6G.js.map → ceph-ALKLD3MO.js.map} +0 -0
  390. /package/dist/{chunk-HJJMP6IX.js.map → chunk-BZTVYOES.js.map} +0 -0
  391. /package/dist/{chunk-X5HF2OFP.js.map → chunk-ENW5BVYN.js.map} +0 -0
  392. /package/dist/{chunk-HGCRXJGP.js.map → chunk-ETIAW4YD.js.map} +0 -0
  393. /package/dist/{chunk-DM4GSE26.js.map → chunk-GMMQ3ZK4.js.map} +0 -0
  394. /package/dist/{chunk-N5FSLVKO.js.map → chunk-HCRYAFBI.js.map} +0 -0
  395. /package/dist/{chunk-UINQOUZR.js.map → chunk-OXEQSPND.js.map} +0 -0
  396. /package/dist/{config-34LHOGLM.js.map → config-2YBCHU2W.js.map} +0 -0
  397. /package/dist/{config-3BBWD5AB.js.map → config-3YRGRW72.js.map} +0 -0
  398. /package/dist/{config-3IVQJBNW.js.map → config-4GSOMUMF.js.map} +0 -0
  399. /package/dist/{config-4UDVSUQJ.js.map → config-5YBUWFUP.js.map} +0 -0
  400. /package/dist/{config-CMDBAPDH.js.map → config-5ZRKJTKG.js.map} +0 -0
  401. /package/dist/{config-CVZ2AGCO.js.map → config-A25LTL5W.js.map} +0 -0
  402. /package/dist/{config-D3RLSPNF.js.map → config-CLU7JABG.js.map} +0 -0
  403. /package/dist/{config-DG65OEG3.js.map → config-D2RF7L3N.js.map} +0 -0
  404. /package/dist/{config-EIHSP5DZ.js.map → config-E55TKM6K.js.map} +0 -0
  405. /package/dist/{config-EO23EY62.js.map → config-ELDOFRJW.js.map} +0 -0
  406. /package/dist/{config-GCQK6NJY.js.map → config-FPC3RBFD.js.map} +0 -0
  407. /package/dist/{config-GE4W4ZJC.js.map → config-FPM3LAW7.js.map} +0 -0
  408. /package/dist/{config-GHRUKEQ6.js.map → config-G3F54CS4.js.map} +0 -0
  409. /package/dist/{config-GVH27UPE.js.map → config-G43HRUI3.js.map} +0 -0
  410. /package/dist/{config-HKRMKD76.js.map → config-GG3WO5PB.js.map} +0 -0
  411. /package/dist/{config-HXVYIXP5.js.map → config-JUYBWAZE.js.map} +0 -0
  412. /package/dist/{config-IDZMEW73.js.map → config-LJ5T6TVA.js.map} +0 -0
  413. /package/dist/{config-IJJXGLBQ.js.map → config-MDSAE4O3.js.map} +0 -0
  414. /package/dist/{config-IVY5EQQ2.js.map → config-NRIOKK5T.js.map} +0 -0
  415. /package/dist/{config-KJOLGVB2.js.map → config-OYK2BSJK.js.map} +0 -0
  416. /package/dist/{config-KMVCVBYN.js.map → config-PB3KA2CE.js.map} +0 -0
  417. /package/dist/{config-KYTRXAB2.js.map → config-QY4IL3PH.js.map} +0 -0
  418. /package/dist/{config-LHFFXVYI.js.map → config-R4LAOEDS.js.map} +0 -0
  419. /package/dist/{config-NV5WXP64.js.map → config-RIAAD6RW.js.map} +0 -0
  420. /package/dist/{config-OT2TQQCN.js.map → config-SYNEQAUB.js.map} +0 -0
  421. /package/dist/{config-Q45Y46YT.js.map → config-TJKGYA2B.js.map} +0 -0
  422. /package/dist/{config-QAA646XB.js.map → config-UU27ALAA.js.map} +0 -0
  423. /package/dist/{config-QNMKWJ4M.js.map → config-UURRGA7U.js.map} +0 -0
  424. /package/dist/{config-QWCY3LBQ.js.map → config-VPLHQXVE.js.map} +0 -0
  425. /package/dist/{config-VM526IKB.js.map → config-WRACCRPN.js.map} +0 -0
  426. /package/dist/{config-WDAZFXYD.js.map → config-WVHKXEVE.js.map} +0 -0
  427. /package/dist/{config-ZFJYQZCH.js.map → config-XU7R36IE.js.map} +0 -0
  428. /package/dist/{config-ZV6G2ZEC.js.map → config-Y2KOUYSS.js.map} +0 -0
  429. /package/dist/{databricks_volume-7XOUYSTY.js.map → databricks_volume-CNCPTZHS.js.map} +0 -0
  430. /package/dist/{digitalocean-3CQ4CPPZ.js.map → digitalocean-DJZOUB6Q.js.map} +0 -0
  431. /package/dist/{discord-BG7OSRJG.js.map → discord-ETB2CADR.js.map} +0 -0
  432. /package/dist/{disk-XVLBCVKE.js.map → disk-WEHSTK3F.js.map} +0 -0
  433. /package/dist/{dropbox-74GYLV3R.js.map → dropbox-XN6PGLNE.js.map} +0 -0
  434. /package/dist/{email-5IZ7OBQ4.js.map → email-OV7XCP3T.js.map} +0 -0
  435. /package/dist/{gcs-EMEYU2XT.js.map → gcal-P56MRCGU.js.map} +0 -0
  436. /package/dist/{gdocs-R67TDPON.js.map → gcs-HFBIAE2C.js.map} +0 -0
  437. /package/dist/{gdrive-PRN2ALRK.js.map → gdocs-LQ3UXP3J.js.map} +0 -0
  438. /package/dist/{github-DV7E6OFV.js.map → gdrive-N6UBYLON.js.map} +0 -0
  439. /package/dist/{github_ci-Q554V5PA.js.map → github-BPZREGPI.js.map} +0 -0
  440. /package/dist/{gmail-OLN2LT4O.js.map → github_ci-7A4LUIZ7.js.map} +0 -0
  441. /package/dist/{gsheets-H4RYMQJ5.js.map → gmail-YED2MF6H.js.map} +0 -0
  442. /package/dist/{gslides-YLCHKJOM.js.map → gridfs-CPLQ4G62.js.map} +0 -0
  443. /package/dist/{hf_buckets-DTKXKKFF.js.map → gsheets-4BNIJPQ6.js.map} +0 -0
  444. /package/dist/{hf_datasets-55C4APKR.js.map → gslides-GDBYLO5A.js.map} +0 -0
  445. /package/dist/{hf_models-RO5JR36V.js.map → hf_buckets-FTJITQ3P.js.map} +0 -0
  446. /package/dist/{hf_spaces-ZVZ3EDRX.js.map → hf_datasets-6GXVKQD7.js.map} +0 -0
  447. /package/dist/{langfuse-ACASJZ7O.js.map → hf_models-PJPGZAC5.js.map} +0 -0
  448. /package/dist/{linear-IC37LZV7.js.map → hf_spaces-LFNFOLBF.js.map} +0 -0
  449. /package/dist/{minio-HZ576XFQ.js.map → jaeger-GCA6MJ6E.js.map} +0 -0
  450. /package/dist/{mongodb-JVR62OIO.js.map → lancedb-TJ5YSJY5.js.map} +0 -0
  451. /package/dist/{notion-HKRPQMJS.js.map → langfuse-RUMTUMXS.js.map} +0 -0
  452. /package/dist/{oci-ZLVECXTW.js.map → linear-BCE4KEAC.js.map} +0 -0
  453. /package/dist/{postgres-P36Z2YN4.js.map → minio-5SO6KBTK.js.map} +0 -0
  454. /package/dist/{qingstor-YLP6K3L4.js.map → mongodb-L5CMN2EE.js.map} +0 -0
  455. /package/dist/{r2-RPK25ANI.js.map → nextcloud-4O2LZVW2.js.map} +0 -0
  456. /package/dist/{redis-V5ULXULL.js.map → notion-RVKEAQ2M.js.map} +0 -0
  457. /package/dist/{s3-4OIOCAAT.js.map → oci-OQXOIC62.js.map} +0 -0
  458. /package/dist/{scaleway-CCWCLUHB.js.map → postgres-AV45GNRS.js.map} +0 -0
  459. /package/dist/{seaweedfs-QSWKF2FN.js.map → qingstor-W277YA4K.js.map} +0 -0
  460. /package/dist/{slack-YPS7PII3.js.map → r2-FUA4IORE.js.map} +0 -0
  461. /package/dist/{ssh-YFP3SMTJ.js.map → redis-LPS357NF.js.map} +0 -0
  462. /package/dist/{supabase-6CFTOKGZ.js.map → s3-FPNWWIVM.js.map} +0 -0
  463. /package/dist/{tencent-IWZZOSQ4.js.map → scaleway-BP3732U7.js.map} +0 -0
  464. /package/dist/{trello-XYKWZD6P.js.map → seaweedfs-MC6HIEP4.js.map} +0 -0
  465. /package/dist/{wasabi-6Z4DC5S5.js.map → slack-JFGW7VLN.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/redis/redis.ts","../src/commands/builtin/redis/index.ts","../src/core/redis/append.ts","../src/core/redis/dest.ts","../src/core/redis/utils.ts","../src/core/redis/constants.ts","../src/core/redis/copy.ts","../src/core/redis/create.ts","../src/core/redis/du/entries.ts","../src/core/redis/du/size.ts","../src/core/redis/exists.ts","../src/core/redis/find.ts","../src/core/redis/mkdir.ts","../src/core/redis/read.ts","../src/core/redis/readdir.ts","../src/core/redis/entry.ts","../src/core/redis/rename.ts","../src/core/redis/rm.ts","../src/core/redis/rmdir.ts","../src/core/redis/set_attrs.ts","../src/core/redis/stat.ts","../src/core/redis/stream.ts","../src/core/redis/truncate.ts","../src/core/redis/unlink.ts","../src/core/redis/write.ts","../src/commands/builtin/redis/io.ts","../src/accessor/redis.ts","../src/ops/redis/index.ts","../src/resource/redis/prompt.ts","../src/resource/redis/store.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n BaseResource,\n PathSpec,\n REDACTED_SECRET,\n ResourceName,\n makeResolveGlob,\n mountKey,\n mountPrefixOf,\n type FileStat,\n type FindOptions,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n stripSlash,\n compareCodePoints,\n} from '@struktoai/mirage-core'\nimport { REDIS_COMMANDS } from '../../commands/builtin/redis/index.ts'\nimport type { RedisClientType } from 'redis'\nimport { RedisAccessor } from '../../accessor/redis.ts'\nimport { appendBytes } from '../../core/redis/append.ts'\nimport { SCOPE_ERROR } from '../../core/redis/constants.ts'\nimport { copy as copyCore } from '../../core/redis/copy.ts'\nimport { create as createCore } from '../../core/redis/create.ts'\nimport { size as duSizeCore, entries as duEntriesCore } from '../../core/redis/du/index.ts'\nimport { exists as existsCore } from '../../core/redis/exists.ts'\nimport { find as findCore, type FindOptions as RedisFindOptions } from '../../core/redis/find.ts'\nimport { mkdir as mkdirCore } from '../../core/redis/mkdir.ts'\nimport { read as readCore } from '../../core/redis/read.ts'\nimport { readdir as readdirCore } from '../../core/redis/readdir.ts'\nimport { rename as renameCore } from '../../core/redis/rename.ts'\nimport { rmR as rmRCore } from '../../core/redis/rm.ts'\nimport { rmdir as rmdirCore } from '../../core/redis/rmdir.ts'\nimport { stat as statCore } from '../../core/redis/stat.ts'\nimport { stream as streamCore } from '../../core/redis/stream.ts'\nimport { truncate as truncateCore } from '../../core/redis/truncate.ts'\nimport { unlink as unlinkCore } from '../../core/redis/unlink.ts'\nimport { writeBytes as writeCore } from '../../core/redis/write.ts'\nimport { REDIS_OPS } from '../../ops/redis/index.ts'\nimport { REDIS_PROMPT } from './prompt.ts'\nimport { RedisStore } from './store.ts'\n\nconst globCore = makeResolveGlob(readdirCore, SCOPE_ERROR)\n\nexport interface RedisResourceOptions {\n url?: string\n keyPrefix?: string\n}\n\nexport interface RedisModule {\n createClient: (options: { url: string }) => RedisClientType\n RESP_TYPES: { readonly BLOB_STRING: number }\n}\n\nexport interface RedisResourceState {\n type: string\n config: {\n url: typeof REDACTED_SECRET\n keyPrefix: string\n }\n keyPrefix: string\n files: Record<string, Uint8Array>\n dirs: string[]\n attrs?: Record<string, Record<string, string>>\n modified?: Record<string, string>\n}\n\nexport class RedisResource extends BaseResource implements Resource {\n readonly kind: string = ResourceName.REDIS\n readonly cachesReads: boolean = false\n // byte store: stat() sizes every file from metadata\n readonly sizesAlwaysKnown: boolean = true\n override readonly indexTtl: number = 0\n readonly prompt: string = REDIS_PROMPT\n readonly url: string\n readonly keyPrefix: string\n readonly store: RedisStore\n readonly accessor: RedisAccessor\n\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 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 append: appendBytes,\n }\n\n constructor(options: RedisResourceOptions = {}) {\n super()\n this.url = options.url ?? 'redis://localhost:6379/0'\n this.keyPrefix = options.keyPrefix ?? 'mirage:fs:'\n this.store = new RedisStore({ url: this.url, keyPrefix: this.keyPrefix })\n this.accessor = new RedisAccessor(this.store)\n }\n\n // The server URL (host, port and db) plus the key prefix pin the keyspace\n // two mounts would share. The prefix is joined path-like so nested\n // prefixes collapse onto one key.\n override storageId(): string {\n const prefix = stripSlash(this.keyPrefix)\n const base = `${this.kind}:${this.url}`\n return prefix === '' ? base : `${base}/${prefix}`\n }\n\n async open(): Promise<void> {\n await this.store.client()\n }\n\n override async close(): Promise<void> {\n await this.store.close()\n await super.close()\n }\n\n client(): Promise<RedisClientType> {\n return this.store.client()\n }\n\n protected module(): Promise<RedisModule> {\n return import('redis') as unknown as Promise<RedisModule>\n }\n\n ops(): readonly RegisteredOp[] {\n return REDIS_OPS\n }\n\n commands(): readonly RegisteredCommand[] {\n return REDIS_COMMANDS\n }\n\n streamPath(p: PathSpec): AsyncIterable<Uint8Array> {\n return streamCore(this.accessor, p)\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return readCore(this.accessor, p)\n }\n\n writeFile(p: PathSpec, data: Uint8Array): Promise<void> {\n return writeCore(this.accessor, p, data)\n }\n\n appendFile(p: PathSpec, data: Uint8Array): Promise<void> {\n return appendBytes(this.accessor, p, data)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return readdirCore(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return statCore(this.accessor, p)\n }\n\n exists(p: PathSpec): Promise<boolean> {\n return existsCore(this.accessor, p)\n }\n\n mkdir(p: PathSpec, options?: { recursive?: boolean }): Promise<void> {\n return mkdirCore(this.accessor, p, options?.recursive === true)\n }\n\n rmdir(p: PathSpec): Promise<void> {\n return rmdirCore(this.accessor, p)\n }\n\n unlink(p: PathSpec): Promise<void> {\n return unlinkCore(this.accessor, p)\n }\n\n rename(src: PathSpec, dst: PathSpec): Promise<void> {\n return renameCore(this.accessor, src, dst)\n }\n\n truncate(p: PathSpec, length: number): Promise<void> {\n return truncateCore(this.accessor, p, length)\n }\n\n copy(src: PathSpec, dst: PathSpec): Promise<void> {\n return copyCore(this.accessor, src, dst)\n }\n\n rmR(p: PathSpec): Promise<void> {\n return rmRCore(this.accessor, p)\n }\n\n du(p: PathSpec): Promise<number> {\n return duSizeCore(this.accessor, p)\n }\n\n find(p: PathSpec, options: FindOptions = {}): Promise<string[]> {\n return findCore(this.accessor, p, options as RedisFindOptions)\n }\n\n glob(paths: readonly PathSpec[], prefix = ''): Promise<PathSpec[]> {\n const effective = prefix\n ? paths.map((p) =>\n mountPrefixOf(p.virtual, p.resourcePath)\n ? p\n : new PathSpec({\n virtual: p.virtual,\n directory: p.directory,\n ...(p.pattern !== null ? { pattern: p.pattern } : {}),\n resolved: p.resolved,\n resourcePath: mountKey(p.virtual, prefix),\n }),\n )\n : paths\n return globCore(this.accessor, effective, this.index)\n }\n\n async getState(): Promise<RedisResourceState> {\n const files: Record<string, Uint8Array> = {}\n for (const key of await this.store.listFiles()) {\n const data = await this.store.getFile(key)\n if (data !== null) files[key] = data\n }\n const dirs = [...(await this.store.listDirs())].sort(compareCodePoints)\n const c = await this.store.client()\n const attrs: Record<string, Record<string, string>> = {}\n const attrsStrip = `${this.keyPrefix}attrs:`.length\n for await (const key of c.scanIterator({ MATCH: `${this.keyPrefix}attrs:*` })) {\n for (const k of Array.isArray(key) ? key : [key]) {\n attrs[k.slice(attrsStrip)] = { ...(await c.hGetAll(k)) }\n }\n }\n const modified: Record<string, string> = {}\n const modStrip = `${this.keyPrefix}modified:`.length\n for await (const key of c.scanIterator({ MATCH: `${this.keyPrefix}modified:*` })) {\n for (const k of Array.isArray(key) ? key : [key]) {\n const val = await c.get(k)\n if (val !== null) modified[k.slice(modStrip)] = val\n }\n }\n return {\n type: this.kind,\n config: {\n url: REDACTED_SECRET,\n keyPrefix: this.keyPrefix,\n },\n keyPrefix: this.keyPrefix,\n files,\n dirs,\n attrs,\n modified,\n }\n }\n\n async loadState(state: RedisResourceState): Promise<void> {\n const c = await this.store.client()\n const pipe = c.multi()\n const dirKey = `${this.keyPrefix}dir`\n for (const [path, data] of Object.entries(state.files)) {\n pipe.set(\n `${this.keyPrefix}file:${path}`,\n Buffer.from(data.buffer, data.byteOffset, data.byteLength),\n )\n }\n for (const dir of state.dirs) {\n pipe.sAdd(dirKey, dir)\n }\n for (const [path, fields] of Object.entries(state.attrs ?? {})) {\n if (Object.keys(fields).length > 0) {\n pipe.hSet(`${this.keyPrefix}attrs:${path}`, fields)\n }\n }\n for (const [path, ts] of Object.entries(state.modified ?? {})) {\n pipe.set(`${this.keyPrefix}modified:${path}`, ts)\n }\n await pipe.exec()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { type RegisteredCommand, ResourceName, makeGenericCommands } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../../accessor/redis.ts'\nimport { REDIS_IO } from './io.ts'\n\nexport const REDIS_COMMANDS: readonly RegisteredCommand[] = [\n ...makeGenericCommands<RedisAccessor>(ResourceName.REDIS, REDIS_IO),\n]\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { ResourceName, invalidateAfterWrite, record, type PathSpec } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../accessor/redis.ts'\nimport { checkDestParents } from './dest.ts'\nimport { norm, nowIso } from './utils.ts'\n\nexport async function appendBytes(\n accessor: RedisAccessor,\n path: PathSpec,\n data: Uint8Array,\n): Promise<void> {\n const start = performance.now()\n const p = norm(path.mountPath)\n const store = accessor.store\n await checkDestParents(store, path, p)\n const existing = await store.getFile(p)\n if (existing !== null) {\n const merged = new Uint8Array(existing.byteLength + data.byteLength)\n merged.set(existing, 0)\n merged.set(data, existing.byteLength)\n await store.setFile(p, merged)\n } else {\n await store.setFile(p, data)\n }\n await store.setModified(p, nowIso())\n record('append', p, ResourceName.REDIS, data.byteLength, start)\n await invalidateAfterWrite(p)\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n ancestors,\n eexist,\n enoent,\n enotdir,\n mountedPath,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { RedisStore } from '../../resource/redis/store.ts'\n\n// Reject a destination whose parent chain is not all directories. Mirrors how\n// rename(2) resolves the destination: a component that does not exist is\n// ENOENT, a component that is a plain file is ENOTDIR (at any depth). Without\n// this the store grows a key under a directory it never recorded, and that\n// orphan makes both the phantom directory and its real parent unlistable.\n// Shared by every op that places a key at a caller-supplied path (rename,\n// copy, create, write, append, mkdir): none of them creates parents (that is\n// `mkdir -p`), so all owe the destination the same probe. The real-filesystem\n// backends get this from the kernel.\n//\n// Components are probed one at a time rather than by pulling the whole\n// directory set: this runs on every write, so a set membership test per\n// component (O(1), and a path is only a few components deep) beats\n// transferring every directory in the mount.\nexport async function checkDestParents(store: RedisStore, dst: PathSpec, d: string): Promise<void> {\n for (const ancestor of ancestors(d)) {\n if (await store.hasDir(ancestor)) continue\n if (await store.hasFile(ancestor)) throw enotdir(dst)\n throw enoent(dst)\n }\n}\n\n// Reject a `mkdir` the store cannot satisfy. The companion of\n// checkDestParents for the one op that may create its own parents, and the two\n// flag modes fail differently because GNU implements them differently:\n//\n// * Plain mkdir issues one mkdir(2) on the whole path, so an existing target\n// is EEXIST whichever kind it is. Its parent chain stays checkDestParents'\n// job, which reports the operand because that is what the kernel resolves.\n// * mkdir -p walks the chain itself, creating as it goes, so it reports the\n// *component* it tripped on rather than the operand: `mkdir -p a.txt/sub`\n// is \"cannot create directory 'a.txt': Not a directory\". Reaching the\n// target itself as a plain file is EEXIST, not ENOTDIR. An existing\n// directory anywhere in the chain is success, which is what makes -p\n// idempotent.\n//\n// Without this a store has no kernel to refuse a directory key that collides\n// with a file key: -p added it anyway, the directory shadowed the file, and\n// reading it started reporting EISDIR while the bytes stayed orphaned in the\n// store. Pinned against GNU coreutils in docker.\nexport async function checkMkdirTarget(\n store: RedisStore,\n spec: PathSpec,\n key: string,\n parents: boolean,\n): Promise<void> {\n if (!parents) {\n if ((await store.hasDir(key)) || (await store.hasFile(key))) throw eexist(spec)\n return\n }\n for (const component of [...ancestors(key), key]) {\n if (!(await store.hasFile(component))) continue\n const named = mountedPath(spec, component)\n throw component === key ? eexist(named) : enotdir(named)\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 { norm, gnuBasename as basename } from '@struktoai/mirage-core'\n\nexport function nowIso(): string {\n return new Date().toISOString()\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nexport const SCOPE_WARN = 5000\nexport const SCOPE_ERROR = 50000\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 { enoent, invalidateAfterWrite, type PathSpec } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../accessor/redis.ts'\nimport { norm, nowIso } from './utils.ts'\nimport { checkDestParents } from './dest.ts'\n\nexport async function copy(accessor: RedisAccessor, src: PathSpec, dst: PathSpec): Promise<void> {\n const s = norm(src.mountPath)\n const d = norm(dst.mountPath)\n const store = accessor.store\n await checkDestParents(store, dst, d)\n const data = await store.getFile(s)\n if (data === null) throw enoent(src)\n await store.setFile(d, data)\n await store.setModified(d, nowIso())\n await invalidateAfterWrite(dst)\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 { ResourceName, invalidateAfterWrite, record, type PathSpec } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../accessor/redis.ts'\nimport { checkDestParents } from './dest.ts'\nimport { norm, nowIso } from './utils.ts'\n\nexport async function create(accessor: RedisAccessor, path: PathSpec): Promise<void> {\n const start = performance.now()\n const p = norm(path.mountPath)\n const store = accessor.store\n await checkDestParents(store, path, p)\n await store.setFile(p, new Uint8Array(0))\n await store.setModified(p, nowIso())\n record('create', p, ResourceName.REDIS, 0, start)\n await invalidateAfterWrite(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 type { PathSpec } from '@struktoai/mirage-core'\nimport { compareCodePoints, rstripSlash } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../../accessor/redis.ts'\nimport { norm } from '../utils.ts'\n\nexport async function entries(\n accessor: RedisAccessor,\n path: PathSpec,\n): Promise<[entries: [string, number][], total: number]> {\n const p = norm(path.mountPath)\n const store = accessor.store\n const prefix = rstripSlash(p) + '/'\n const found: [string, number][] = []\n let total = 0\n for (const key of [...(await store.listFiles())].sort(compareCodePoints)) {\n if (key === p || key.startsWith(prefix)) {\n const size = await store.fileLen(key)\n found.push([key, size])\n total += size\n }\n }\n return [found, total]\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport { rstripSlash } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../../accessor/redis.ts'\nimport { norm } from '../utils.ts'\n\nexport async function size(accessor: RedisAccessor, path: PathSpec): Promise<number> {\n const p = norm(path.mountPath)\n const store = accessor.store\n const prefix = rstripSlash(p) + '/'\n let total = 0\n for (const key of await store.listFiles()) {\n if (key === p || key.startsWith(prefix)) {\n total += await store.fileLen(key)\n }\n }\n return total\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../accessor/redis.ts'\nimport { norm } from './utils.ts'\n\nexport async function exists(accessor: RedisAccessor, path: PathSpec): Promise<boolean> {\n const p = norm(path.mountPath)\n const store = accessor.store\n return (await store.hasFile(p)) || (await store.hasDir(p))\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../accessor/redis.ts'\nimport { norm } from './utils.ts'\nimport {\n buildTree,\n computeNonemptyDirs,\n emitStartPath,\n keep,\n type PredNode,\n rstripSlash,\n startBasename,\n compareCodePoints,\n} from '@struktoai/mirage-core'\n\nexport interface FindOptions {\n name?: string | null\n type?: string | null\n minSize?: number | null\n maxSize?: number | null\n maxDepth?: number | null\n minDepth?: number | null\n nameExclude?: string | null\n orNames?: string[] | null\n iname?: string | null\n pathPattern?: string | null\n empty?: boolean | null\n tree?: PredNode | null\n}\n\nexport async function find(\n accessor: RedisAccessor,\n path: PathSpec,\n options: FindOptions = {},\n): Promise<string[]> {\n const p = norm(path.mountPath)\n const startName = startBasename(path.virtual)\n const store = accessor.store\n const prefix = rstripSlash(p) + '/'\n const baseDepth = p === '/' ? 0 : (p.match(/\\//g) ?? []).length\n const results: string[] = []\n const tree =\n options.tree ??\n buildTree({\n name: options.name,\n iname: options.iname,\n pathPattern: options.pathPattern,\n type: options.type,\n nameExclude: options.nameExclude,\n orNames: options.orNames,\n empty: options.empty,\n })\n const empty = options.empty === true\n const allFiles = await store.listFiles()\n const allDirs = await store.listDirs()\n const nonempty = empty\n ? computeNonemptyDirs([...allFiles, ...[...allDirs].filter((k) => k !== '/')])\n : new Set<string>()\n const candidates: [string, 'f' | 'd'][] = []\n if (options.type !== 'd') {\n for (const key of allFiles) candidates.push([key, 'f'])\n }\n if (options.type !== 'f') {\n for (const key of allDirs) {\n candidates.push([key, 'd'])\n }\n }\n let rootKind: 'f' | 'd' | null = null\n let rootIsEmpty: boolean | null = null\n let rootSize: number | null = null\n for (const [key, kind] of candidates) {\n if (key !== p && !key.startsWith(prefix)) continue\n if (key === p) {\n rootKind = kind\n if (empty) {\n rootIsEmpty = kind === 'f' ? (await store.fileLen(key)) === 0 : !nonempty.has(key)\n }\n if (kind === 'f') rootSize = await store.fileLen(key)\n continue\n }\n const depth = (key.match(/\\//g) ?? []).length - baseDepth\n if (options.maxDepth !== null && options.maxDepth !== undefined && depth > options.maxDepth)\n continue\n const basename = key.slice(key.lastIndexOf('/') + 1)\n let isEmpty: boolean | null = null\n if (empty) {\n isEmpty = kind === 'f' ? (await store.fileLen(key)) === 0 : !nonempty.has(key)\n }\n if (!keep({ key, name: basename, kind, depth, isEmpty }, tree, options.minDepth)) continue\n if (options.minSize != null || options.maxSize != null) {\n // Directories count as size 0 for -size (deliberate GNU divergence).\n const size = kind === 'f' ? await store.fileLen(key) : 0\n if (options.minSize != null && size < options.minSize) continue\n if (options.maxSize != null && size > options.maxSize) continue\n }\n results.push(key)\n }\n if (rootKind !== null) {\n emitStartPath(results, p, startName, {\n kind: rootKind,\n isEmpty: rootIsEmpty,\n exists: true,\n tree,\n maxDepth: options.maxDepth,\n minDepth: options.minDepth,\n size: rootSize,\n minSize: options.minSize,\n maxSize: options.maxSize,\n })\n }\n results.sort(compareCodePoints)\n return results\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { type PathSpec, invalidateAfterWrite, invalidateAncestors } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../accessor/redis.ts'\nimport { checkDestParents, checkMkdirTarget } from './dest.ts'\nimport { norm, nowIso } from './utils.ts'\nimport { stripSlash } from '@struktoai/mirage-core'\n\nexport async function mkdir(\n accessor: RedisAccessor,\n path: PathSpec,\n parents = false,\n): Promise<void> {\n const p = norm(path.mountPath)\n const store = accessor.store\n await checkMkdirTarget(store, path, p, parents)\n if (parents) {\n const parts = stripSlash(p).split('/')\n let current = ''\n const now = nowIso()\n for (const part of parts) {\n current += `/${part}`\n await store.addDir(current)\n const mod = await store.getModified(current)\n if (mod === null) {\n await store.setModified(current, now)\n }\n }\n await invalidateAfterWrite(p)\n await invalidateAncestors(path)\n return\n }\n await checkDestParents(store, path, p)\n await store.addDir(p)\n await store.setModified(p, nowIso())\n await invalidateAfterWrite(p)\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { type IndexCacheStore, record, ResourceName, type PathSpec } from '@struktoai/mirage-core'\nimport { enoent } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../accessor/redis.ts'\nimport { norm } from './utils.ts'\n\nexport async function read(\n accessor: RedisAccessor,\n path: PathSpec,\n _index?: IndexCacheStore,\n): Promise<Uint8Array> {\n const start = performance.now()\n const p = norm(path.mountPath)\n const data = await accessor.store.getFile(p)\n if (data === null) {\n throw enoent(path)\n }\n record('read', p, ResourceName.REDIS, data.byteLength, start)\n return data\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n mountPrefixOf,\n type IndexCacheStore,\n type PathSpec,\n rstripSlash,\n compareCodePoints,\n} from '@struktoai/mirage-core'\nimport { readdirError } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../accessor/redis.ts'\nimport { RedisIndexEntry } from './entry.ts'\nimport { norm } from './utils.ts'\n\nexport async function readdir(\n accessor: RedisAccessor,\n path: PathSpec,\n index?: IndexCacheStore,\n): Promise<string[]> {\n const virtual = path.pattern !== null ? path.directory : path.mountPath\n const mountPrefix = mountPrefixOf(path.virtual, path.resourcePath)\n // Canonical key: no trailing slash (except root), or the same dir\n // indexes under two keys and cache hits return doubled-slash entries.\n const virtualKey = rstripSlash(mountPrefix + virtual) || '/'\n if (index !== undefined) {\n const cached = await index.listDir(virtualKey)\n if (cached.entries !== undefined && cached.entries !== null) {\n return cached.entries\n }\n }\n const store = accessor.store\n const p = norm(virtual)\n if (!(await store.hasDir(p))) {\n throw await readdirError(\n path,\n p,\n (k) => store.hasFile(k),\n (k) => store.hasDir(k),\n )\n }\n const dirPrefix = p === '/' ? '/' : `${p}/`\n const seen = new Set<string>()\n const files = await store.listFiles()\n const dirs = await store.listDirs()\n for (const key of [...files, ...dirs]) {\n if (key === p) continue\n if (!key.startsWith(dirPrefix)) continue\n const remainder = key.slice(dirPrefix.length)\n const first = remainder.split('/')[0]\n if (first !== undefined && first.length > 0) seen.add(dirPrefix + first)\n }\n const sorted = [...seen].sort(compareCodePoints)\n const virtualEntries = sorted.map((entry) => `${mountPrefix}${entry}`)\n if (index !== undefined) {\n const fileSet = new Set(files)\n const entries: [string, RedisIndexEntry][] = sorted.map((e) => {\n const name = e.slice(e.lastIndexOf('/') + 1)\n return [name, fileSet.has(e) ? RedisIndexEntry.file(e) : RedisIndexEntry.folder(e)]\n })\n await index.setDir(virtualKey, entries)\n }\n return virtualEntries\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 { IndexEntry } from '@struktoai/mirage-core'\n\nconst RedisResourceType = Object.freeze({\n FILE: 'file',\n FOLDER: 'folder',\n} as const)\n\ntype RedisResourceType = (typeof RedisResourceType)[keyof typeof RedisResourceType]\n\nexport class RedisIndexEntry extends IndexEntry {\n // size defaults to null, not 0: a readdir knows a key exists but not\n // its length, and a lying 0 would be trusted by index-first size\n // lookups (provision estimates) over a real stat.\n static file(path: string, size: number | null = null): RedisIndexEntry {\n const name = path.slice(path.lastIndexOf('/') + 1)\n return new RedisIndexEntry({\n id: path,\n name,\n resourceType: RedisResourceType.FILE,\n vfsName: name,\n size,\n })\n }\n\n static folder(path: string): RedisIndexEntry {\n const name = path.slice(path.lastIndexOf('/') + 1)\n return new RedisIndexEntry({\n id: path,\n name,\n resourceType: RedisResourceType.FOLDER,\n vfsName: name,\n })\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { type PathSpec, invalidateAfterUnlink, invalidateAfterWrite } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../accessor/redis.ts'\nimport { norm, nowIso } from './utils.ts'\nimport { checkDestParents } from './dest.ts'\nimport { enoent, rstripSlash } from '@struktoai/mirage-core'\n\nexport async function rename(accessor: RedisAccessor, src: PathSpec, dst: PathSpec): Promise<void> {\n const s = norm(src.mountPath)\n const d = norm(dst.mountPath)\n const now = nowIso()\n const store = accessor.store\n await checkDestParents(store, dst, d)\n if (await store.hasFile(s)) {\n const data = await store.getFile(s)\n const mod = await store.getModified(s)\n const attrs = await store.getAttrs(s)\n if (data === null) throw enoent(src)\n await store.delFile(s)\n await store.delModified(s)\n await store.delAttrs(s)\n await store.setFile(d, data)\n await store.setModified(d, mod ?? now)\n if (Object.keys(attrs).length > 0) await store.setAttrs(d, attrs)\n await invalidateAfterUnlink(s)\n await invalidateAfterWrite(d)\n return\n }\n if (await store.hasDir(s)) {\n const mod = await store.getModified(s)\n const attrs = await store.getAttrs(s)\n await store.removeDir(s)\n await store.delModified(s)\n await store.delAttrs(s)\n await store.addDir(d)\n await store.setModified(d, mod ?? now)\n if (Object.keys(attrs).length > 0) await store.setAttrs(d, attrs)\n const prefix = rstripSlash(s) + '/'\n const dPrefix = rstripSlash(d) + '/'\n const files = await store.listFiles()\n for (const key of files) {\n if (key.startsWith(prefix)) {\n const newKey = dPrefix + key.slice(prefix.length)\n const data = await store.getFile(key)\n if (data === null) continue\n const subAttrs = await store.getAttrs(key)\n await store.delFile(key)\n await store.delAttrs(key)\n await store.setFile(newKey, data)\n if (Object.keys(subAttrs).length > 0) await store.setAttrs(newKey, subAttrs)\n }\n }\n await invalidateAfterUnlink(s)\n await invalidateAfterWrite(d)\n return\n }\n throw enoent(src)\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../accessor/redis.ts'\nimport { norm } from './utils.ts'\nimport { invalidateAfterUnlink, rstripSlash } from '@struktoai/mirage-core'\n\nexport async function rmR(accessor: RedisAccessor, path: PathSpec): Promise<void> {\n const p = norm(path.mountPath)\n const store = accessor.store\n const prefix = rstripSlash(p) + '/'\n const files = await store.listFiles()\n for (const key of files) {\n if (key === p || key.startsWith(prefix)) {\n await store.delFile(key)\n await store.delModified(key)\n await store.delAttrs(key)\n }\n }\n const dirs = await store.listDirs()\n for (const key of dirs) {\n if (key === p || key.startsWith(prefix)) {\n await store.removeDir(key)\n await store.delModified(key)\n await store.delAttrs(key)\n }\n }\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 type { PathSpec } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../accessor/redis.ts'\nimport { norm } from './utils.ts'\nimport { invalidateAfterUnlink, rstripSlash } from '@struktoai/mirage-core'\n\nexport async function rmdir(accessor: RedisAccessor, path: PathSpec): Promise<void> {\n const p = norm(path.mountPath)\n const store = accessor.store\n if (!(await store.hasDir(p))) {\n throw new Error(`not a directory: ${p}`)\n }\n const prefix = rstripSlash(p) + '/'\n const files = await store.listFiles()\n const dirs = await store.listDirs()\n const candidates = [...files, ...dirs]\n for (const k of candidates) {\n if (k !== p && k.startsWith(prefix)) {\n throw new Error(`directory not empty: ${p}`)\n }\n }\n await store.removeDir(p)\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 { enoent, type PathSpec } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../accessor/redis.ts'\nimport { norm } from './utils.ts'\n\nexport interface SetAttrsFields {\n mode?: number\n uid?: number | string\n gid?: number | string\n atime?: string\n mtime?: string\n}\n\n// Write metadata fields on an existing entry (the write side of stat).\n// Fields live in a per-path attrs hash; values are stored as strings\n// (redis hashes are string-valued) and decoded by stat. Stored, not\n// enforced: mount mode does real access control. Returns the residual\n// (always empty; every field applies natively).\nexport async function setAttrs(\n accessor: RedisAccessor,\n path: PathSpec,\n fields: SetAttrsFields,\n): Promise<Record<string, number | string>> {\n const store = accessor.store\n const p = norm(path.mountPath)\n if (!(await store.hasFile(p)) && !(await store.hasDir(p))) {\n throw enoent(path)\n }\n const encoded: Record<string, string> = {}\n if (fields.mode !== undefined) encoded.mode = String(fields.mode)\n if (fields.uid !== undefined) encoded.uid = String(fields.uid)\n if (fields.gid !== undefined) encoded.gid = String(fields.gid)\n if (fields.atime !== undefined) encoded.atime = fields.atime\n if (Object.keys(encoded).length > 0) {\n await store.setAttrs(p, encoded)\n }\n if (fields.mtime !== undefined) {\n await store.setModified(p, fields.mtime)\n }\n return {}\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 FileStat,\n FileType,\n guessType,\n type IndexCacheStore,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport { enoent } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../accessor/redis.ts'\nimport { basename, norm } from './utils.ts'\n\nfunction decodeAttrs(raw: Record<string, string>): {\n mode?: number\n uid?: number | string\n gid?: number | string\n atime?: string\n} {\n const out: { mode?: number; uid?: number | string; gid?: number | string; atime?: string } = {}\n if (raw.mode !== undefined) out.mode = parseInt(raw.mode, 10)\n for (const key of ['uid', 'gid'] as const) {\n const val = raw[key]\n if (val !== undefined) out[key] = /^\\d+$/.test(val) ? parseInt(val, 10) : val\n }\n if (raw.atime !== undefined) out.atime = raw.atime\n return out\n}\n\nexport async function stat(\n accessor: RedisAccessor,\n path: PathSpec,\n _index?: IndexCacheStore,\n): Promise<FileStat> {\n const p = norm(path.mountPath)\n const store = accessor.store\n if (await store.hasDir(p)) {\n const attrs = decodeAttrs(await store.getAttrs(p))\n return new FileStat({\n name: basename(p),\n modified: await store.getModified(p),\n type: FileType.DIRECTORY,\n mode: attrs.mode ?? null,\n uid: attrs.uid ?? null,\n gid: attrs.gid ?? null,\n atime: attrs.atime ?? null,\n })\n }\n if (await store.hasFile(p)) {\n const size = await store.fileLen(p)\n const attrs = decodeAttrs(await store.getAttrs(p))\n return new FileStat({\n name: basename(p),\n size,\n modified: await store.getModified(p),\n type: guessType(p),\n mode: attrs.mode ?? null,\n uid: attrs.uid ?? null,\n gid: attrs.gid ?? null,\n atime: attrs.atime ?? null,\n })\n }\n throw enoent(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 type IndexCacheStore,\n recordStream,\n ResourceName,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport { enoent } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../accessor/redis.ts'\nimport { norm } from './utils.ts'\n\nexport async function* stream(\n accessor: RedisAccessor,\n path: PathSpec,\n _index?: IndexCacheStore,\n): AsyncIterable<Uint8Array> {\n const p = norm(path.mountPath)\n const data = await accessor.store.getFile(p)\n if (data === null) throw enoent(path)\n const rec = recordStream('read', p, ResourceName.REDIS)\n if (rec !== null) rec.bytes = data.byteLength\n yield data\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { ResourceName, invalidateAfterWrite, record, type PathSpec } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../accessor/redis.ts'\nimport { norm, nowIso } from './utils.ts'\n\nexport async function truncate(\n accessor: RedisAccessor,\n path: PathSpec,\n length: number,\n): Promise<void> {\n const start = performance.now()\n const p = norm(path.mountPath)\n const store = accessor.store\n const existing = await store.getFile(p)\n const data = existing ?? new Uint8Array(0)\n const out = new Uint8Array(length)\n const copyLen = Math.min(data.byteLength, length)\n out.set(data.subarray(0, copyLen), 0)\n await store.setFile(p, out)\n await store.setModified(p, nowIso())\n record('truncate', p, ResourceName.REDIS, 0, start)\n await invalidateAfterWrite(p)\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { type PathSpec, invalidateAfterUnlink } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../accessor/redis.ts'\nimport { norm } from './utils.ts'\n\nexport async function unlink(accessor: RedisAccessor, path: PathSpec): Promise<void> {\n const p = norm(path.mountPath)\n const store = accessor.store\n if (!(await store.hasFile(p))) {\n throw new Error(`file not found: ${p}`)\n }\n await store.delFile(p)\n await store.delModified(p)\n await store.delAttrs(p)\n await invalidateAfterUnlink(p)\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { ResourceName, invalidateAfterWrite, record, type PathSpec } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../accessor/redis.ts'\nimport { checkDestParents } from './dest.ts'\nimport { norm, nowIso } from './utils.ts'\n\nexport async function writeBytes(\n accessor: RedisAccessor,\n path: PathSpec,\n data: Uint8Array,\n): Promise<void> {\n const start = performance.now()\n const p = norm(path.mountPath)\n const store = accessor.store\n await checkDestParents(store, path, p)\n await store.setFile(p, data)\n await store.setModified(p, nowIso())\n record('write', p, ResourceName.REDIS, data.byteLength, start)\n await invalidateAfterWrite(p)\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { CommandIO } from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../../accessor/redis.ts'\nimport { appendBytes as redisAppend } from '../../../core/redis/append.ts'\nimport { SCOPE_ERROR } from '../../../core/redis/constants.ts'\nimport { copy as redisCopy } from '../../../core/redis/copy.ts'\nimport { create as redisCreate } from '../../../core/redis/create.ts'\nimport { size as redisDu, entries as redisDuEntries } from '../../../core/redis/du/index.ts'\nimport { exists as redisExists } from '../../../core/redis/exists.ts'\nimport { find as redisFind } from '../../../core/redis/find.ts'\nimport { mkdir as redisMkdir } from '../../../core/redis/mkdir.ts'\nimport { read as redisRead } from '../../../core/redis/read.ts'\nimport { readdir as redisReaddir } from '../../../core/redis/readdir.ts'\nimport { rename as redisRename } from '../../../core/redis/rename.ts'\nimport { rmR as redisRmR } from '../../../core/redis/rm.ts'\nimport { rmdir as redisRmdir } from '../../../core/redis/rmdir.ts'\nimport { setAttrs as redisSetAttrs } from '../../../core/redis/set_attrs.ts'\nimport { stat as redisStat } from '../../../core/redis/stat.ts'\nimport { stream as redisStream } from '../../../core/redis/stream.ts'\nimport { truncate as redisTruncate } from '../../../core/redis/truncate.ts'\nimport { unlink as redisUnlink } from '../../../core/redis/unlink.ts'\nimport { writeBytes as redisWrite } from '../../../core/redis/write.ts'\n\nexport const REDIS_IO: CommandIO<RedisAccessor> = {\n readdir: redisReaddir,\n readBytes: redisRead,\n readStream: redisStream,\n stat: redisStat,\n isMounted: () => true,\n local: true,\n maxGlobMatches: SCOPE_ERROR,\n write: redisWrite,\n exists: redisExists,\n mkdir: redisMkdir,\n unlink: redisUnlink,\n rmdir: redisRmdir,\n rmR: redisRmR,\n rename: redisRename,\n copy: redisCopy,\n create: redisCreate,\n truncate: redisTruncate,\n append: redisAppend,\n setAttrs: redisSetAttrs,\n find: redisFind,\n du: { size: redisDu, entries: redisDuEntries },\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { Accessor } from '@struktoai/mirage-core'\nimport type { RedisStore } from '../resource/redis/store.ts'\n\nexport class RedisAccessor extends Accessor {\n readonly store: RedisStore\n\n constructor(store: RedisStore) {\n super()\n this.store = store\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { RegisteredOp } from '@struktoai/mirage-core'\nimport { ResourceName, makeGenericOps } from '@struktoai/mirage-core'\nimport { REDIS_IO } from '../../commands/builtin/redis/io.ts'\n\nexport const REDIS_OPS: readonly RegisteredOp[] = makeGenericOps(ResourceName.REDIS, REDIS_IO)\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nexport const REDIS_PROMPT = `Redis-backed persistent filesystem. Behaves like a standard filesystem.\nStandard commands: ls, cat, head, tail, grep, wc, find, tree, mkdir, touch, cp, mv, rm, tee.`\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { RedisClientType } from 'redis'\nimport { loadOptionalPeer } from '../../optional_peer.ts'\nimport { compareCodePoints } from '@struktoai/mirage-core'\n\nexport interface RedisStoreOptions {\n url?: string\n client?: RedisClientType\n keyPrefix?: string\n}\n\nexport class RedisStore {\n readonly url: string\n readonly keyPrefix: string\n private readonly providedClient: RedisClientType | null\n private clientPromise: Promise<RedisClientType> | null = null\n\n constructor(options: RedisStoreOptions = {}) {\n this.url = options.url ?? 'redis://localhost:6379/0'\n this.keyPrefix = options.keyPrefix ?? 'mirage:fs:'\n this.providedClient = options.client ?? null\n }\n\n fk(path: string): string {\n return `${this.keyPrefix}file:${path}`\n }\n\n dk(): string {\n return `${this.keyPrefix}dir`\n }\n\n mk(path: string): string {\n return `${this.keyPrefix}modified:${path}`\n }\n\n ak(path: string): string {\n return `${this.keyPrefix}attrs:${path}`\n }\n\n async client(): Promise<RedisClientType> {\n if (this.providedClient !== null) return this.providedClient\n this.clientPromise ??= (async () => {\n const mod = await loadOptionalPeer(\n () =>\n import('redis') as unknown as Promise<{\n createClient: (o: { url: string }) => RedisClientType\n }>,\n { feature: 'RedisResource / RedisFileCacheStore', packageName: 'redis' },\n )\n const c = mod.createClient({\n url: this.url,\n socket: { reconnectStrategy: false },\n } as Parameters<typeof mod.createClient>[0])\n await c.connect()\n await c.sAdd(this.dk(), '/')\n return c\n })()\n return this.clientPromise\n }\n\n async getFile(path: string): Promise<Uint8Array | null> {\n const c = await this.client()\n const typed = c as unknown as {\n withTypeMapping: (m: Record<number, unknown>) => {\n get: (k: string) => Promise<Buffer | null>\n }\n }\n const mod = (await import('redis')) as unknown as {\n RESP_TYPES: { readonly BLOB_STRING: number }\n }\n const blob = mod.RESP_TYPES.BLOB_STRING\n const mapping: Record<number, unknown> = { [blob]: Buffer }\n const raw = await typed.withTypeMapping(mapping).get(this.fk(path))\n if (raw === null) return null\n return new Uint8Array(raw.buffer, raw.byteOffset, raw.byteLength)\n }\n\n async setFile(path: string, data: Uint8Array): Promise<void> {\n const c = await this.client()\n await c.set(this.fk(path), Buffer.from(data.buffer, data.byteOffset, data.byteLength))\n }\n\n async delFile(path: string): Promise<void> {\n const c = await this.client()\n await c.del(this.fk(path))\n }\n\n async hasFile(path: string): Promise<boolean> {\n const c = await this.client()\n return (await c.exists(this.fk(path))) > 0\n }\n\n async listFiles(prefix = ''): Promise<string[]> {\n const c = await this.client()\n const pattern = `${this.keyPrefix}file:${prefix}*`\n const strip = `${this.keyPrefix}file:`.length\n const result: string[] = []\n for await (const k of c.scanIterator({ MATCH: pattern })) {\n const keys = Array.isArray(k) ? k : [k]\n for (const key of keys) result.push(key.slice(strip))\n }\n return result.sort(compareCodePoints)\n }\n\n async fileLen(path: string): Promise<number> {\n const c = await this.client()\n return c.strLen(this.fk(path))\n }\n\n async hasDir(path: string): Promise<boolean> {\n const c = await this.client()\n return (await c.sIsMember(this.dk(), path)) === 1\n }\n\n async addDir(path: string): Promise<void> {\n const c = await this.client()\n await c.sAdd(this.dk(), path)\n }\n\n async removeDir(path: string): Promise<void> {\n const c = await this.client()\n await c.sRem(this.dk(), path)\n }\n\n async listDirs(): Promise<Set<string>> {\n const c = await this.client()\n const members = await c.sMembers(this.dk())\n return new Set(members)\n }\n\n async getModified(path: string): Promise<string | null> {\n const c = await this.client()\n return c.get(this.mk(path))\n }\n\n async setModified(path: string, ts: string): Promise<void> {\n const c = await this.client()\n await c.set(this.mk(path), ts)\n }\n\n async delModified(path: string): Promise<void> {\n const c = await this.client()\n await c.del(this.mk(path))\n }\n\n async getAttrs(path: string): Promise<Record<string, string>> {\n const c = await this.client()\n const raw = await c.hGetAll(this.ak(path))\n return { ...raw }\n }\n\n async setAttrs(path: string, fields: Record<string, string>): Promise<void> {\n const c = await this.client()\n await c.hSet(this.ak(path), fields)\n }\n\n async delAttrs(path: string): Promise<void> {\n const c = await this.client()\n await c.del(this.ak(path))\n }\n\n async clear(): Promise<void> {\n const c = await this.client()\n for (const pattern of [\n `${this.keyPrefix}file:*`,\n `${this.keyPrefix}modified:*`,\n `${this.keyPrefix}attrs:*`,\n ]) {\n const keys: string[] = []\n for await (const k of c.scanIterator({ MATCH: pattern })) {\n if (Array.isArray(k)) keys.push(...k)\n else keys.push(k)\n }\n if (keys.length > 0) await c.del(keys)\n }\n await c.del(this.dk())\n }\n\n async close(): Promise<void> {\n if (this.providedClient !== null) return\n if (this.clientPromise === null) return\n const c = await this.clientPromise\n const typed = c as unknown as { destroy?: () => void }\n if (typeof typed.destroy === 'function') typed.destroy()\n else if (c.isOpen) await c.quit()\n this.clientPromise = null\n }\n}\n"],"mappings":"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","names":["ResourceName","mountPrefixOf","stripSlash","compareCodePoints","ResourceName","enoent","invalidateAfterWrite","enoent","invalidateAfterWrite","ResourceName","invalidateAfterWrite","record","record","ResourceName","invalidateAfterWrite","size","rstripSlash","rstripSlash","rstripSlash","compareCodePoints","size","invalidateAfterWrite","invalidateAfterWrite","record","ResourceName","enoent","enoent","record","ResourceName","rstripSlash","compareCodePoints","size","rstripSlash","compareCodePoints","entries","invalidateAfterWrite","enoent","rstripSlash","invalidateAfterWrite","invalidateAfterUnlink","rstripSlash","invalidateAfterUnlink","rstripSlash","enoent","enoent","enoent","size","enoent","ResourceName","enoent","enoent","ResourceName","ResourceName","invalidateAfterWrite","record","record","ResourceName","invalidateAfterWrite","invalidateAfterUnlink","invalidateAfterUnlink","ResourceName","invalidateAfterWrite","record","record","ResourceName","invalidateAfterWrite","ResourceName","ResourceName","ResourceName","compareCodePoints","ResourceName","stripSlash","mountPrefixOf","compareCodePoints"]}
@@ -0,0 +1,160 @@
1
+ // src/resource/lancedb/lancedb.ts
2
+ import {
3
+ BaseResource,
4
+ LANCEDB_COMMANDS,
5
+ LANCEDB_OPS,
6
+ LANCEDB_PROMPT,
7
+ LanceDBAccessor,
8
+ lanceRead,
9
+ lanceReaddir,
10
+ lanceStat,
11
+ ResourceName,
12
+ resolveLanceDBConfig
13
+ } from "@struktoai/mirage-core";
14
+
15
+ // src/resource/lancedb/store.ts
16
+ import {
17
+ loadOptionalPeer,
18
+ compareCodePoints
19
+ } from "@struktoai/mirage-core";
20
+ function toStr(value) {
21
+ if (value === null || value === void 0) return "";
22
+ if (typeof value === "object") return JSON.stringify(value);
23
+ return String(value);
24
+ }
25
+ function eqClause(column, value) {
26
+ if (/^-?\d+$/.test(value)) return `${column} = ${value}`;
27
+ return `${column} = '${value.replace(/'/g, "''")}'`;
28
+ }
29
+ function whereClause(filters) {
30
+ return Object.entries(filters).map(([col, val]) => eqClause(col, val)).join(" AND ");
31
+ }
32
+ var LanceDBStore = class {
33
+ config;
34
+ db = null;
35
+ tables = /* @__PURE__ */ new Map();
36
+ constructor(config) {
37
+ this.config = config;
38
+ }
39
+ async connection() {
40
+ if (this.db === null) {
41
+ const options = {};
42
+ if (this.config.apiKey !== null) options.apiKey = this.config.apiKey;
43
+ if (this.config.storageOptions !== null) options.storageOptions = this.config.storageOptions;
44
+ if (this.config.uri.startsWith("db://")) {
45
+ options.region = this.config.region;
46
+ if (this.config.hostOverride !== null) options.hostOverride = this.config.hostOverride;
47
+ }
48
+ const { connect } = await loadOptionalPeer(() => import("@lancedb/lancedb"), {
49
+ feature: "LanceDBResource",
50
+ packageName: "@lancedb/lancedb"
51
+ });
52
+ this.db = await connect(this.config.uri, options);
53
+ }
54
+ return this.db;
55
+ }
56
+ async table(name) {
57
+ const cached = this.tables.get(name);
58
+ if (cached !== void 0) return cached;
59
+ const db = await this.connection();
60
+ const tbl = await db.openTable(name);
61
+ this.tables.set(name, tbl);
62
+ return tbl;
63
+ }
64
+ async listTables() {
65
+ const db = await this.connection();
66
+ const names = await db.tableNames();
67
+ return [...names].sort(compareCodePoints);
68
+ }
69
+ async distinct(table, column, filters, limit) {
70
+ const tbl = await this.table(table);
71
+ let query = tbl.query().select([column]).limit(limit);
72
+ if (Object.keys(filters).length > 0) query = query.where(whereClause(filters));
73
+ const rows = await query.toArray();
74
+ const values = /* @__PURE__ */ new Set();
75
+ for (const row of rows) {
76
+ const v = row[column];
77
+ if (v !== null && v !== void 0) values.add(toStr(v));
78
+ }
79
+ return [...values].sort(compareCodePoints);
80
+ }
81
+ async tableColumns(table) {
82
+ const tbl = await this.table(table);
83
+ const schema = await tbl.schema();
84
+ return schema.fields.map((field) => field.name);
85
+ }
86
+ async rowsMatching(table, filters, columns, limit) {
87
+ const tbl = await this.table(table);
88
+ let query = tbl.query().select(columns).limit(limit);
89
+ if (Object.keys(filters).length > 0) query = query.where(whereClause(filters));
90
+ return await query.toArray();
91
+ }
92
+ async rowRecord(table, idColumn, rowId) {
93
+ const tbl = await this.table(table);
94
+ const rows = await tbl.query().where(eqClause(idColumn, rowId)).limit(1).toArray();
95
+ return rows[0] ?? null;
96
+ }
97
+ async search(table, query, limit) {
98
+ const tbl = await this.table(table);
99
+ return await tbl.search(query).limit(limit).toArray();
100
+ }
101
+ close() {
102
+ if (this.db !== null) {
103
+ this.db.close();
104
+ this.db = null;
105
+ }
106
+ this.tables.clear();
107
+ return Promise.resolve();
108
+ }
109
+ };
110
+
111
+ // src/resource/lancedb/lancedb.ts
112
+ var REMOTE_SCHEMES = ["s3://", "gs://", "az://", "hf://", "db://"];
113
+ var LanceDBResource = class extends BaseResource {
114
+ kind = ResourceName.LANCEDB;
115
+ cachesReads;
116
+ // readdir seeds exact card sizes from the widened select and stat falls
117
+ // back to rendering the row itself, so sizes are exact either way.
118
+ sizesAlwaysKnown = true;
119
+ indexTtl = 0;
120
+ prompt = LANCEDB_PROMPT;
121
+ config;
122
+ store;
123
+ accessor;
124
+ constructor(options) {
125
+ super();
126
+ const config = "config" in options ? options.config : options;
127
+ this.config = resolveLanceDBConfig(config);
128
+ this.cachesReads = REMOTE_SCHEMES.some((scheme) => this.config.uri.startsWith(scheme));
129
+ this.store = new LanceDBStore(this.config);
130
+ this.accessor = new LanceDBAccessor(this.store, this.config);
131
+ }
132
+ open() {
133
+ return Promise.resolve();
134
+ }
135
+ async close() {
136
+ await this.store.close();
137
+ await super.close();
138
+ }
139
+ ops() {
140
+ return LANCEDB_OPS;
141
+ }
142
+ commands() {
143
+ return LANCEDB_COMMANDS;
144
+ }
145
+ readFile(p) {
146
+ return lanceRead(this.accessor, p, this.index);
147
+ }
148
+ readdir(p) {
149
+ return lanceReaddir(this.accessor, p, this.index);
150
+ }
151
+ stat(p) {
152
+ return lanceStat(this.accessor, p, this.index);
153
+ }
154
+ };
155
+
156
+ export {
157
+ LanceDBStore,
158
+ LanceDBResource
159
+ };
160
+ //# sourceMappingURL=chunk-HS24BL6W.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/lancedb/lancedb.ts","../src/resource/lancedb/store.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 type FileStat,\n LANCEDB_COMMANDS,\n LANCEDB_OPS,\n LANCEDB_PROMPT,\n LanceDBAccessor,\n type LanceDBConfig,\n type LanceDBConfigResolved,\n lanceRead,\n lanceReaddir,\n lanceStat,\n type PathSpec,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n ResourceName,\n resolveLanceDBConfig,\n} from '@struktoai/mirage-core'\nimport { LanceDBStore } from './store.ts'\n\nconst REMOTE_SCHEMES = ['s3://', 'gs://', 'az://', 'hf://', 'db://']\n\nexport interface LanceDBResourceOptions {\n config: LanceDBConfig\n}\n\nexport class LanceDBResource extends BaseResource implements Resource {\n readonly kind: string = ResourceName.LANCEDB\n readonly cachesReads: boolean\n // readdir seeds exact card sizes from the widened select and stat falls\n // back to rendering the row itself, so sizes are exact either way.\n readonly sizesAlwaysKnown: boolean = true\n override readonly indexTtl: number = 0\n readonly prompt: string = LANCEDB_PROMPT\n readonly config: LanceDBConfigResolved\n readonly store: LanceDBStore\n readonly accessor: LanceDBAccessor\n\n constructor(options: LanceDBResourceOptions | LanceDBConfig) {\n super()\n const config = 'config' in options ? options.config : options\n this.config = resolveLanceDBConfig(config)\n this.cachesReads = REMOTE_SCHEMES.some((scheme) => this.config.uri.startsWith(scheme))\n this.store = new LanceDBStore(this.config)\n this.accessor = new LanceDBAccessor(this.store, this.config)\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n override async close(): Promise<void> {\n await this.store.close()\n await super.close()\n }\n\n ops(): readonly RegisteredOp[] {\n return LANCEDB_OPS\n }\n\n commands(): readonly RegisteredCommand[] {\n return LANCEDB_COMMANDS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return lanceRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return lanceReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return lanceStat(this.accessor, p, this.index)\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { Connection, Table } from '@lancedb/lancedb'\nimport {\n loadOptionalPeer,\n type LanceDriver,\n type LanceRow,\n type LanceDBConfigResolved,\n compareCodePoints,\n} from '@struktoai/mirage-core'\n\nfunction toStr(value: unknown): string {\n if (value === null || value === undefined) return ''\n if (typeof value === 'object') return JSON.stringify(value)\n return String(value as string | number | boolean | bigint)\n}\n\nfunction eqClause(column: string, value: string): string {\n if (/^-?\\d+$/.test(value)) return `${column} = ${value}`\n return `${column} = '${value.replace(/'/g, \"''\")}'`\n}\n\nfunction whereClause(filters: Record<string, string>): string {\n return Object.entries(filters)\n .map(([col, val]) => eqClause(col, val))\n .join(' AND ')\n}\n\nexport class LanceDBStore implements LanceDriver {\n private readonly config: LanceDBConfigResolved\n private db: Connection | null = null\n private readonly tables = new Map<string, Table>()\n\n constructor(config: LanceDBConfigResolved) {\n this.config = config\n }\n\n private async connection(): Promise<Connection> {\n if (this.db === null) {\n const options: Record<string, unknown> = {}\n if (this.config.apiKey !== null) options.apiKey = this.config.apiKey\n if (this.config.storageOptions !== null) options.storageOptions = this.config.storageOptions\n if (this.config.uri.startsWith('db://')) {\n options.region = this.config.region\n if (this.config.hostOverride !== null) options.hostOverride = this.config.hostOverride\n }\n const { connect } = await loadOptionalPeer(() => import('@lancedb/lancedb'), {\n feature: 'LanceDBResource',\n packageName: '@lancedb/lancedb',\n })\n this.db = await connect(this.config.uri, options)\n }\n return this.db\n }\n\n private async table(name: string): Promise<Table> {\n const cached = this.tables.get(name)\n if (cached !== undefined) return cached\n const db = await this.connection()\n const tbl = await db.openTable(name)\n this.tables.set(name, tbl)\n return tbl\n }\n\n async listTables(): Promise<string[]> {\n const db = await this.connection()\n const names = await db.tableNames()\n return [...names].sort(compareCodePoints)\n }\n\n async distinct(\n table: string,\n column: string,\n filters: Record<string, string>,\n limit: number,\n ): Promise<string[]> {\n const tbl = await this.table(table)\n let query = tbl.query().select([column]).limit(limit)\n if (Object.keys(filters).length > 0) query = query.where(whereClause(filters))\n const rows = (await query.toArray()) as LanceRow[]\n const values = new Set<string>()\n for (const row of rows) {\n const v = row[column]\n if (v !== null && v !== undefined) values.add(toStr(v))\n }\n return [...values].sort(compareCodePoints)\n }\n\n async tableColumns(table: string): Promise<string[]> {\n const tbl = await this.table(table)\n const schema = await tbl.schema()\n return schema.fields.map((field) => field.name)\n }\n\n async rowsMatching(\n table: string,\n filters: Record<string, string>,\n columns: string[],\n limit: number,\n ): Promise<LanceRow[]> {\n const tbl = await this.table(table)\n let query = tbl.query().select(columns).limit(limit)\n if (Object.keys(filters).length > 0) query = query.where(whereClause(filters))\n return (await query.toArray()) as LanceRow[]\n }\n\n async rowRecord(table: string, idColumn: string, rowId: string): Promise<LanceRow | null> {\n const tbl = await this.table(table)\n const rows = (await tbl\n .query()\n .where(eqClause(idColumn, rowId))\n .limit(1)\n .toArray()) as LanceRow[]\n return rows[0] ?? null\n }\n\n async search(table: string, query: string, limit: number): Promise<LanceRow[]> {\n const tbl = await this.table(table)\n return (await tbl.search(query).limit(limit).toArray()) as LanceRow[]\n }\n\n close(): Promise<void> {\n if (this.db !== null) {\n this.db.close()\n this.db = null\n }\n this.tables.clear()\n return Promise.resolve()\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,16 @@
1
+ import {
2
+ makeFixedAlias
3
+ } from "./chunk-7ZP6TPHX.js";
4
+
5
+ // src/resource/minio/config.ts
6
+ var alias = makeFixedAlias();
7
+ var minioToS3Config = alias.toS3Config;
8
+ var redactMinIOConfig = alias.redact;
9
+ var normalizeMinIOConfig = alias.normalize;
10
+
11
+ export {
12
+ minioToS3Config,
13
+ redactMinIOConfig,
14
+ normalizeMinIOConfig
15
+ };
16
+ //# sourceMappingURL=chunk-HVYVG5KQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/minio/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 MinIOConfig extends S3AliasConfig {\n endpoint: string\n}\n\nexport type MinIOConfigRedacted = S3AliasConfigRedacted\n\nconst alias = makeFixedAlias<MinIOConfig, MinIOConfigRedacted>()\n\nexport const minioToS3Config = alias.toS3Config\nexport const redactMinIOConfig = alias.redact\nexport const normalizeMinIOConfig = alias.normalize\n"],"mappings":";;;;;AAsBA,IAAM,QAAQ,eAAiD;AAExD,IAAM,kBAAkB,MAAM;AAC9B,IAAM,oBAAoB,MAAM;AAChC,IAAM,uBAAuB,MAAM;","names":[]}
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  aliyunToS3Config,
3
3
  redactAliyunConfig
4
- } from "./chunk-NJMGCT63.js";
4
+ } from "./chunk-U6DFQRG3.js";
5
5
  import {
6
6
  S3Resource
7
- } from "./chunk-TA3WMOMU.js";
7
+ } from "./chunk-EJZG5VUF.js";
8
8
 
9
9
  // src/resource/aliyun/aliyun.ts
10
10
  import {
@@ -17,8 +17,7 @@ import {
17
17
  var ALIYUN_PROMPT = `{prefix}
18
18
  Remote Alibaba Cloud OSS 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/aliyun/aliyun.ts
24
23
  var AliyunResource = class extends S3Resource {
@@ -54,4 +53,4 @@ export {
54
53
  ALIYUN_PROMPT,
55
54
  AliyunResource
56
55
  };
57
- //# sourceMappingURL=chunk-FQ33BYFR.js.map
56
+ //# sourceMappingURL=chunk-I7CPLZNW.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/resource/aliyun/aliyun.ts","../src/resource/aliyun/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 aliyunToS3Config,\n redactAliyunConfig,\n type AliyunConfig,\n type AliyunConfigRedacted,\n} from './config.ts'\nimport { ALIYUN_PROMPT } from './prompt.ts'\n\nexport interface AliyunResourceState {\n type: string\n config: AliyunConfigRedacted\n}\n\nexport class AliyunResource extends S3Resource {\n override readonly kind: string = ResourceName.ALIYUN\n override readonly prompt: string = ALIYUN_PROMPT\n readonly aliyunConfig: AliyunConfig\n private readonly aliyunOps: readonly RegisteredOp[]\n private readonly aliyunCommands: readonly RegisteredCommand[]\n\n constructor(config: AliyunConfig) {\n super(aliyunToS3Config(config))\n this.aliyunConfig = config\n this.aliyunOps = remapOpsResource(super.ops(), ResourceName.ALIYUN)\n this.aliyunCommands = remapCommandsResource(super.commands(), ResourceName.ALIYUN)\n }\n\n override ops(): readonly RegisteredOp[] {\n return this.aliyunOps\n }\n\n override commands(): readonly RegisteredCommand[] {\n return this.aliyunCommands\n }\n\n override getState(): Promise<AliyunResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactAliyunConfig(this.aliyunConfig),\n })\n }\n\n override loadState(_state: AliyunResourceState): 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 ALIYUN_PROMPT = `\\\n{prefix}\n Remote Alibaba Cloud OSS 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,gBAAgB;AAAA;AAAA;AAAA;AAAA;;;ADqBtB,IAAM,iBAAN,cAA6B,WAAW;AAAA,EAC3B,OAAe,aAAa;AAAA,EAC5B,SAAiB;AAAA,EAC1B;AAAA,EACQ;AAAA,EACA;AAAA,EAEjB,YAAY,QAAsB;AAChC,UAAM,iBAAiB,MAAM,CAAC;AAC9B,SAAK,eAAe;AACpB,SAAK,YAAY,iBAAiB,MAAM,IAAI,GAAG,aAAa,MAAM;AAClE,SAAK,iBAAiB,sBAAsB,MAAM,SAAS,GAAG,aAAa,MAAM;AAAA,EACnF;AAAA,EAES,MAA+B;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAyC;AAChD,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAyC;AAChD,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,mBAAmB,KAAK,YAAY;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA,EAES,UAAU,QAA4C;AAC7D,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/resource/aliyun/aliyun.ts","../src/resource/aliyun/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 aliyunToS3Config,\n redactAliyunConfig,\n type AliyunConfig,\n type AliyunConfigRedacted,\n} from './config.ts'\nimport { ALIYUN_PROMPT } from './prompt.ts'\n\nexport interface AliyunResourceState {\n type: string\n config: AliyunConfigRedacted\n}\n\nexport class AliyunResource extends S3Resource {\n override readonly kind: string = ResourceName.ALIYUN\n override readonly prompt: string = ALIYUN_PROMPT\n readonly aliyunConfig: AliyunConfig\n private readonly aliyunOps: readonly RegisteredOp[]\n private readonly aliyunCommands: readonly RegisteredCommand[]\n\n constructor(config: AliyunConfig) {\n super(aliyunToS3Config(config))\n this.aliyunConfig = config\n this.aliyunOps = remapOpsResource(super.ops(), ResourceName.ALIYUN)\n this.aliyunCommands = remapCommandsResource(super.commands(), ResourceName.ALIYUN)\n }\n\n override ops(): readonly RegisteredOp[] {\n return this.aliyunOps\n }\n\n override commands(): readonly RegisteredCommand[] {\n return this.aliyunCommands\n }\n\n override getState(): Promise<AliyunResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactAliyunConfig(this.aliyunConfig),\n })\n }\n\n override loadState(_state: AliyunResourceState): 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 ALIYUN_PROMPT = `\\\n{prefix}\n Remote Alibaba Cloud OSS 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,gBAAgB;AAAA;AAAA;AAAA;;;ADqBtB,IAAM,iBAAN,cAA6B,WAAW;AAAA,EAC3B,OAAe,aAAa;AAAA,EAC5B,SAAiB;AAAA,EAC1B;AAAA,EACQ;AAAA,EACA;AAAA,EAEjB,YAAY,QAAsB;AAChC,UAAM,iBAAiB,MAAM,CAAC;AAC9B,SAAK,eAAe;AACpB,SAAK,YAAY,iBAAiB,MAAM,IAAI,GAAG,aAAa,MAAM;AAClE,SAAK,iBAAiB,sBAAsB,MAAM,SAAS,GAAG,aAAa,MAAM;AAAA,EACnF;AAAA,EAES,MAA+B;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAyC;AAChD,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAyC;AAChD,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,mBAAmB,KAAK,YAAY;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA,EAES,UAAU,QAA4C;AAC7D,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -1,5 +1,10 @@
1
1
  // src/resource/langfuse/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 LangfuseConfigSchema = z.object({
4
9
  publicKey: z.string(),
5
10
  secretKey: secretStr(),
@@ -24,8 +29,7 @@ function normalizeLangfuseConfig(input) {
24
29
  }
25
30
 
26
31
  export {
27
- LangfuseConfigSchema,
28
32
  redactLangfuseConfig,
29
33
  normalizeLangfuseConfig
30
34
  };
31
- //# sourceMappingURL=chunk-VGLHY6BK.js.map
35
+ //# sourceMappingURL=chunk-IFUCGI4I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/langfuse/config.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n normalizeFields,\n redactConfigWithSchema,\n type ConfigOf,\n type RedactedConfig,\n secretStr,\n z,\n} from '@struktoai/mirage-core'\n\nconst LangfuseConfigSchema = z.object({\n publicKey: z.string(),\n secretKey: secretStr(),\n host: z.string().optional(),\n defaultTraceLimit: z.number().optional(),\n defaultSearchLimit: z.number().optional(),\n defaultFromTimestamp: z.string().optional(),\n})\n\nexport type LangfuseConfig = ConfigOf<typeof LangfuseConfigSchema>\n\nexport type LangfuseConfigRedacted = RedactedConfig<LangfuseConfig, 'secretKey'>\n\nexport function redactLangfuseConfig(config: LangfuseConfig): LangfuseConfigRedacted {\n return redactConfigWithSchema(LangfuseConfigSchema, config) as unknown as LangfuseConfigRedacted\n}\n\nexport function normalizeLangfuseConfig(input: Record<string, unknown>): LangfuseConfig {\n return normalizeFields(input, {\n rename: {\n public_key: 'publicKey',\n secret_key: 'secretKey',\n default_trace_limit: 'defaultTraceLimit',\n default_search_limit: 'defaultSearchLimit',\n default_from_timestamp: 'defaultFromTimestamp',\n },\n }) as unknown as LangfuseConfig\n}\n"],"mappings":";AAcA;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,OACK;AAEP,IAAM,uBAAuB,EAAE,OAAO;AAAA,EACpC,WAAW,EAAE,OAAO;AAAA,EACpB,WAAW,UAAU;AAAA,EACrB,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,EACxC,sBAAsB,EAAE,OAAO,EAAE,SAAS;AAC5C,CAAC;AAMM,SAAS,qBAAqB,QAAgD;AACnF,SAAO,uBAAuB,sBAAsB,MAAM;AAC5D;AAEO,SAAS,wBAAwB,OAAgD;AACtF,SAAO,gBAAgB,OAAO;AAAA,IAC5B,QAAQ;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,qBAAqB;AAAA,MACrB,sBAAsB;AAAA,MACtB,wBAAwB;AAAA,IAC1B;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -5,10 +5,11 @@ import {
5
5
  DATABRICKS_VOLUME_OPS,
6
6
  DATABRICKS_VOLUME_PROMPT,
7
7
  DatabricksVolumeAccessor,
8
+ PathSpec,
9
+ ResourceName,
8
10
  databricksVolumeCopy,
9
11
  databricksVolumeCreate,
10
12
  databricksVolumeExists,
11
- databricksVolumeFind,
12
13
  databricksVolumeMkdir,
13
14
  databricksVolumeRangeRead,
14
15
  databricksVolumeRead,
@@ -20,14 +21,14 @@ import {
20
21
  databricksVolumeStat,
21
22
  databricksVolumeUnlink,
22
23
  databricksVolumeWrite,
23
- PathSpec,
24
- ResourceName,
25
- resolveDatabricksVolumeGlob
24
+ mountKey,
25
+ mountPrefixOf,
26
+ makeResolveGlob,
27
+ walkFind
26
28
  } from "@struktoai/mirage-core";
27
29
 
28
30
  // src/resource/databricks_volume/config.ts
29
31
  import {
30
- DatabricksVolumeConfigSchema,
31
32
  normalizeDatabricksVolumeConfig,
32
33
  redactDatabricksVolumeConfig
33
34
  } from "@struktoai/mirage-core";
@@ -69,6 +70,7 @@ async function loadDatabricksProfile(profile) {
69
70
  }
70
71
 
71
72
  // src/resource/databricks_volume/databricks_volume.ts
73
+ var resolveDatabricksVolumeGlob = makeResolveGlob(databricksVolumeReaddir);
72
74
  async function resolveAuth(config) {
73
75
  let host = config.host ?? process.env.DATABRICKS_HOST;
74
76
  let token = config.token ?? process.env.DATABRICKS_TOKEN;
@@ -88,6 +90,10 @@ async function resolveAuth(config) {
88
90
  var DatabricksVolumeResource = class _DatabricksVolumeResource extends BaseResource {
89
91
  kind = ResourceName.DATABRICKS_VOLUME;
90
92
  cachesReads = true;
93
+ // The Files API lists DirectoryEntry.file_size and stat HEADs report
94
+ // Content-Length, both the exact byte count the download returns;
95
+ // readdir backfills any lister-omitted size with one HEAD.
96
+ sizesAlwaysKnown = true;
91
97
  indexTtl = 600;
92
98
  prompt = DATABRICKS_VOLUME_PROMPT;
93
99
  config;
@@ -121,9 +127,6 @@ var DatabricksVolumeResource = class _DatabricksVolumeResource extends BaseResou
121
127
  open() {
122
128
  return Promise.resolve();
123
129
  }
124
- close() {
125
- return Promise.resolve();
126
- }
127
130
  commands() {
128
131
  return DATABRICKS_VOLUME_COMMANDS;
129
132
  }
@@ -183,16 +186,24 @@ var DatabricksVolumeResource = class _DatabricksVolumeResource extends BaseResou
183
186
  await databricksVolumeRmRecursive(this.accessor, p);
184
187
  }
185
188
  find(p, options = {}) {
186
- return databricksVolumeFind(this.accessor, p, options, this.index);
189
+ return walkFind(
190
+ p,
191
+ {
192
+ readdir: (spec, idx) => databricksVolumeReaddir(this.accessor, spec, idx),
193
+ stat: (spec, idx) => databricksVolumeStat(this.accessor, spec, idx)
194
+ },
195
+ options,
196
+ this.index
197
+ );
187
198
  }
188
199
  glob(paths, prefix = "") {
189
200
  const effective = prefix ? paths.map(
190
- (p) => p.prefix ? p : new PathSpec({
191
- original: p.original,
201
+ (p) => mountPrefixOf(p.virtual, p.resourcePath) ? p : new PathSpec({
202
+ virtual: p.virtual,
192
203
  directory: p.directory,
193
204
  ...p.pattern !== null ? { pattern: p.pattern } : {},
194
205
  resolved: p.resolved,
195
- prefix
206
+ resourcePath: mountKey(p.virtual, prefix)
196
207
  })
197
208
  ) : paths;
198
209
  return resolveDatabricksVolumeGlob(this.accessor, effective, this.index);
@@ -213,4 +224,4 @@ export {
213
224
  loadDatabricksProfile,
214
225
  DatabricksVolumeResource
215
226
  };
216
- //# sourceMappingURL=chunk-RNQN2FOU.js.map
227
+ //# sourceMappingURL=chunk-IFYXSSKR.js.map