@struktoai/mirage-browser 0.0.3-alpha.0 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/README.md +1 -1
  2. package/dist/aliyun-YEWHEWCL.js +8 -0
  3. package/dist/backblaze-LWE2HEDK.js +8 -0
  4. package/dist/box-GTWWIB6F.js +8 -0
  5. package/dist/ceph-ATSCSVGU.js +8 -0
  6. package/dist/{chunk-YGRKFONX.js → chunk-23NO22WD.js} +1 -2
  7. package/dist/{chunk-YGRKFONX.js.map → chunk-23NO22WD.js.map} +1 -1
  8. package/dist/{chunk-TPFH5V4D.js → chunk-2R7SPBTM.js} +11 -13
  9. package/dist/chunk-2R7SPBTM.js.map +1 -0
  10. package/dist/{chunk-UZWJ462U.js → chunk-37WKCB2E.js} +8 -6
  11. package/dist/chunk-37WKCB2E.js.map +1 -0
  12. package/dist/{chunk-GHKX2BA3.js → chunk-3FZ3GHZO.js} +6 -4
  13. package/dist/chunk-3FZ3GHZO.js.map +1 -0
  14. package/dist/{chunk-SJB2KXDM.js → chunk-4YUYQTRN.js} +649 -424
  15. package/dist/chunk-4YUYQTRN.js.map +1 -0
  16. package/dist/{chunk-JCS5EG5A.js → chunk-5ZNWDS5I.js} +10 -12
  17. package/dist/chunk-5ZNWDS5I.js.map +1 -0
  18. package/dist/{chunk-N43C6XFP.js → chunk-6BXVYCIC.js} +10 -12
  19. package/dist/chunk-6BXVYCIC.js.map +1 -0
  20. package/dist/{chunk-INLL7LRM.js → chunk-6ETIHSTA.js} +10 -11
  21. package/dist/chunk-6ETIHSTA.js.map +1 -0
  22. package/dist/{chunk-RZRXEXHM.js → chunk-AAJQ6AQT.js} +11 -13
  23. package/dist/chunk-AAJQ6AQT.js.map +1 -0
  24. package/dist/{chunk-CAKSQ2LV.js → chunk-AUKVYHNZ.js} +6 -4
  25. package/dist/chunk-AUKVYHNZ.js.map +1 -0
  26. package/dist/{chunk-HGSTRD7H.js → chunk-AUXZEXCG.js} +12 -12
  27. package/dist/chunk-AUXZEXCG.js.map +1 -0
  28. package/dist/{chunk-SBAUYZJB.js → chunk-CQERQTAZ.js} +17 -14
  29. package/dist/chunk-CQERQTAZ.js.map +1 -0
  30. package/dist/{chunk-XFREXNA2.js → chunk-DC6VA36O.js} +9 -16
  31. package/dist/chunk-DC6VA36O.js.map +1 -0
  32. package/dist/{chunk-HYUESAQS.js → chunk-DGP3N4WM.js} +1 -2
  33. package/dist/{chunk-HYUESAQS.js.map → chunk-DGP3N4WM.js.map} +1 -1
  34. package/dist/{chunk-WEJGUCCL.js → chunk-DKPDXQML.js} +6 -4
  35. package/dist/chunk-DKPDXQML.js.map +1 -0
  36. package/dist/{chunk-2H4KUUFP.js → chunk-DQK6H5LW.js} +1 -2
  37. package/dist/{chunk-2H4KUUFP.js.map → chunk-DQK6H5LW.js.map} +1 -1
  38. package/dist/{chunk-T43CZ3IZ.js → chunk-E77ESWWV.js} +13 -13
  39. package/dist/chunk-E77ESWWV.js.map +1 -0
  40. package/dist/{chunk-WZ53HLH6.js → chunk-EDS5Q5B7.js} +6 -4
  41. package/dist/chunk-EDS5Q5B7.js.map +1 -0
  42. package/dist/{chunk-32VC36P4.js → chunk-EHTYPBGX.js} +6 -4
  43. package/dist/chunk-EHTYPBGX.js.map +1 -0
  44. package/dist/{chunk-72GY5B23.js → chunk-GENFT46X.js} +6 -4
  45. package/dist/chunk-GENFT46X.js.map +1 -0
  46. package/dist/{chunk-J54OBIJA.js → chunk-GQVJTQXU.js} +6 -2
  47. package/dist/chunk-GQVJTQXU.js.map +1 -0
  48. package/dist/{chunk-RJ5FBBL6.js → chunk-GZFNGV55.js} +6 -4
  49. package/dist/chunk-GZFNGV55.js.map +1 -0
  50. package/dist/{chunk-RD7ED27I.js → chunk-HPID7BWJ.js} +11 -13
  51. package/dist/chunk-HPID7BWJ.js.map +1 -0
  52. package/dist/{chunk-D3JDGGKO.js → chunk-HTQ4GBKM.js} +6 -4
  53. package/dist/chunk-HTQ4GBKM.js.map +1 -0
  54. package/dist/{chunk-RJ4RR3BR.js → chunk-JV4T5HNB.js} +6 -4
  55. package/dist/chunk-JV4T5HNB.js.map +1 -0
  56. package/dist/{chunk-EH2BN4JC.js → chunk-KL2VFYUV.js} +8 -6
  57. package/dist/chunk-KL2VFYUV.js.map +1 -0
  58. package/dist/{chunk-54NTYJEO.js → chunk-LPDLPRPS.js} +1 -3
  59. package/dist/{chunk-54NTYJEO.js.map → chunk-LPDLPRPS.js.map} +1 -1
  60. package/dist/{chunk-JVTKE6DB.js → chunk-LW56WZDS.js} +11 -13
  61. package/dist/chunk-LW56WZDS.js.map +1 -0
  62. package/dist/{chunk-63GZEZW4.js → chunk-MB4TUUJQ.js} +6 -4
  63. package/dist/chunk-MB4TUUJQ.js.map +1 -0
  64. package/dist/{chunk-O5ONB7QT.js → chunk-MQMUOJZ2.js} +8 -4
  65. package/dist/chunk-MQMUOJZ2.js.map +1 -0
  66. package/dist/{chunk-6K57U6CM.js → chunk-N5VRBFRT.js} +11 -13
  67. package/dist/chunk-N5VRBFRT.js.map +1 -0
  68. package/dist/{chunk-EUKHGXCE.js → chunk-NVGB3B7J.js} +6 -4
  69. package/dist/chunk-NVGB3B7J.js.map +1 -0
  70. package/dist/{chunk-D6HF462C.js → chunk-NYTRDAWX.js} +17 -14
  71. package/dist/chunk-NYTRDAWX.js.map +1 -0
  72. package/dist/{chunk-MO5DGX42.js → chunk-PCC6EZIE.js} +6 -4
  73. package/dist/chunk-PCC6EZIE.js.map +1 -0
  74. package/dist/{chunk-BUXWUKN7.js → chunk-PDZSZ5CB.js} +10 -12
  75. package/dist/chunk-PDZSZ5CB.js.map +1 -0
  76. package/dist/{chunk-4YJMDF2S.js → chunk-POJ3IQMQ.js} +14 -14
  77. package/dist/chunk-POJ3IQMQ.js.map +1 -0
  78. package/dist/{chunk-ATLYBQSC.js → chunk-PSEXJ5S5.js} +13 -12
  79. package/dist/chunk-PSEXJ5S5.js.map +1 -0
  80. package/dist/{chunk-NMZBJOFW.js → chunk-QXJP6TWI.js} +5 -4
  81. package/dist/chunk-QXJP6TWI.js.map +1 -0
  82. package/dist/{chunk-YEDSFMWK.js → chunk-TCFD6YJ5.js} +6 -4
  83. package/dist/chunk-TCFD6YJ5.js.map +1 -0
  84. package/dist/{chunk-CO4FMKOF.js → chunk-VASFK7V6.js} +6 -4
  85. package/dist/chunk-VASFK7V6.js.map +1 -0
  86. package/dist/{chunk-JSAQMYPK.js → chunk-ZLHC2CZ6.js} +1 -2
  87. package/dist/{chunk-JSAQMYPK.js.map → chunk-ZLHC2CZ6.js.map} +1 -1
  88. package/dist/config-22T7HJBJ.js +9 -0
  89. package/dist/config-A56HUM6C.js +9 -0
  90. package/dist/config-DIWQZBOK.js +9 -0
  91. package/dist/config-HGJ2MGAC.js +9 -0
  92. package/dist/{config-ET26F632.js → config-MHBKYS53.js} +2 -4
  93. package/dist/config-PAHALM2T.js +9 -0
  94. package/dist/config-PWZXYJOI.js +9 -0
  95. package/dist/{config-NV5WXP64.js → config-UU27ALAA.js} +2 -4
  96. package/dist/digitalocean-SQA6MJJQ.js +8 -0
  97. package/dist/discord-ASNFJP6A.js +7 -0
  98. package/dist/dropbox-VV2WZE6I.js +8 -0
  99. package/dist/gcs-2W6DDWM7.js +8 -0
  100. package/dist/gdocs-QPM7VXXE.js +8 -0
  101. package/dist/gdrive-KT6R7EVB.js +8 -0
  102. package/dist/github-3IFZGW6I.js +7 -0
  103. package/dist/github_ci-CKKF2Y4S.js +8 -0
  104. package/dist/gmail-HLZIMKQU.js +8 -0
  105. package/dist/gsheets-HF4YPIEF.js +8 -0
  106. package/dist/gslides-EV2JJH7I.js +8 -0
  107. package/dist/index.d.ts +46 -34
  108. package/dist/index.js +87 -83
  109. package/dist/index.js.map +1 -1
  110. package/dist/langfuse-74ZCR6QL.js +7 -0
  111. package/dist/linear-XABGTU6E.js +7 -0
  112. package/dist/minio-JPNSX2NP.js +8 -0
  113. package/dist/mongodb-YZP643ZU.js +7 -0
  114. package/dist/notion-YJOTGH7J.js +7 -0
  115. package/dist/oci-R4VYQKGJ.js +8 -0
  116. package/dist/opfs-4RWMJBCI.js +7 -0
  117. package/dist/postgres-HPOMN2AR.js +7 -0
  118. package/dist/qingstor-ZWWK2ZGV.js +8 -0
  119. package/dist/r2-PZAN2YFG.js +8 -0
  120. package/dist/{s3-GD2WKLWR.js → s3-CSFY3PLT.js} +2 -2
  121. package/dist/scaleway-BFROPDBB.js +8 -0
  122. package/dist/seaweedfs-X6THZT26.js +8 -0
  123. package/dist/slack-O7BTJ4YR.js +7 -0
  124. package/dist/supabase-PHN3MIXW.js +8 -0
  125. package/dist/tencent-JGCJEKHV.js +8 -0
  126. package/dist/trello-QUDOP3M2.js +7 -0
  127. package/dist/wasabi-5VMNAFOC.js +8 -0
  128. package/package.json +2 -3
  129. package/dist/aliyun-F2ORS3KZ.js +0 -8
  130. package/dist/backblaze-HOVWPSV7.js +0 -8
  131. package/dist/box-VJSE5N7P.js +0 -8
  132. package/dist/ceph-CQKQ4NWW.js +0 -8
  133. package/dist/chunk-32VC36P4.js.map +0 -1
  134. package/dist/chunk-4YJMDF2S.js.map +0 -1
  135. package/dist/chunk-63GZEZW4.js.map +0 -1
  136. package/dist/chunk-6K57U6CM.js.map +0 -1
  137. package/dist/chunk-72GY5B23.js.map +0 -1
  138. package/dist/chunk-ATLYBQSC.js.map +0 -1
  139. package/dist/chunk-BUXWUKN7.js.map +0 -1
  140. package/dist/chunk-CAKSQ2LV.js.map +0 -1
  141. package/dist/chunk-CO4FMKOF.js.map +0 -1
  142. package/dist/chunk-D3JDGGKO.js.map +0 -1
  143. package/dist/chunk-D6HF462C.js.map +0 -1
  144. package/dist/chunk-EH2BN4JC.js.map +0 -1
  145. package/dist/chunk-EUKHGXCE.js.map +0 -1
  146. package/dist/chunk-GHKX2BA3.js.map +0 -1
  147. package/dist/chunk-HGSTRD7H.js.map +0 -1
  148. package/dist/chunk-INLL7LRM.js.map +0 -1
  149. package/dist/chunk-J54OBIJA.js.map +0 -1
  150. package/dist/chunk-JCS5EG5A.js.map +0 -1
  151. package/dist/chunk-JVTKE6DB.js.map +0 -1
  152. package/dist/chunk-MO5DGX42.js.map +0 -1
  153. package/dist/chunk-N43C6XFP.js.map +0 -1
  154. package/dist/chunk-NMZBJOFW.js.map +0 -1
  155. package/dist/chunk-O5ONB7QT.js.map +0 -1
  156. package/dist/chunk-RD7ED27I.js.map +0 -1
  157. package/dist/chunk-RJ4RR3BR.js.map +0 -1
  158. package/dist/chunk-RJ5FBBL6.js.map +0 -1
  159. package/dist/chunk-RZRXEXHM.js.map +0 -1
  160. package/dist/chunk-SBAUYZJB.js.map +0 -1
  161. package/dist/chunk-SJB2KXDM.js.map +0 -1
  162. package/dist/chunk-T43CZ3IZ.js.map +0 -1
  163. package/dist/chunk-TPFH5V4D.js.map +0 -1
  164. package/dist/chunk-UZWJ462U.js.map +0 -1
  165. package/dist/chunk-WEJGUCCL.js.map +0 -1
  166. package/dist/chunk-WZ53HLH6.js.map +0 -1
  167. package/dist/chunk-XFREXNA2.js.map +0 -1
  168. package/dist/chunk-YEDSFMWK.js.map +0 -1
  169. package/dist/config-7IZCGWKX.js +0 -11
  170. package/dist/config-AT74FARJ.js +0 -11
  171. package/dist/config-C2AYHACT.js +0 -11
  172. package/dist/config-GHJOYNM6.js +0 -11
  173. package/dist/config-L55UXIF4.js +0 -11
  174. package/dist/config-V7BLK5WP.js +0 -11
  175. package/dist/digitalocean-KC7VIWZK.js +0 -8
  176. package/dist/discord-W3DSEXKN.js +0 -7
  177. package/dist/dropbox-GI273OVA.js +0 -8
  178. package/dist/gcs-WRQTU27E.js +0 -8
  179. package/dist/gdocs-EI2EFVKG.js +0 -8
  180. package/dist/gdrive-62HD67IP.js +0 -8
  181. package/dist/github-SWLYD3LS.js +0 -7
  182. package/dist/github_ci-7P7VGBKM.js +0 -8
  183. package/dist/gmail-B7HXHZ7D.js +0 -8
  184. package/dist/gsheets-OTBW2JWG.js +0 -8
  185. package/dist/gslides-MXSR4HRY.js +0 -8
  186. package/dist/langfuse-FWKU6E3F.js +0 -7
  187. package/dist/linear-SHVG3XVT.js +0 -7
  188. package/dist/minio-246KOHBJ.js +0 -8
  189. package/dist/mongodb-2ITJUDCF.js +0 -7
  190. package/dist/notion-BOBBSJSG.js +0 -7
  191. package/dist/oci-T7VREPQW.js +0 -8
  192. package/dist/opfs-3XNAXR5B.js +0 -7
  193. package/dist/postgres-CK4HWZSL.js +0 -7
  194. package/dist/qingstor-WIC27LS3.js +0 -8
  195. package/dist/r2-EAX6KHEI.js +0 -8
  196. package/dist/scaleway-OVFRZBKW.js +0 -8
  197. package/dist/seaweedfs-EOJVO432.js +0 -8
  198. package/dist/slack-RNXMU5OC.js +0 -7
  199. package/dist/supabase-VSUNLIJ6.js +0 -8
  200. package/dist/tencent-YYM5WUVU.js +0 -8
  201. package/dist/trello-MNR3VPTT.js +0 -7
  202. package/dist/wasabi-K5ANTZ2C.js +0 -8
  203. /package/dist/{aliyun-F2ORS3KZ.js.map → aliyun-YEWHEWCL.js.map} +0 -0
  204. /package/dist/{backblaze-HOVWPSV7.js.map → backblaze-LWE2HEDK.js.map} +0 -0
  205. /package/dist/{box-VJSE5N7P.js.map → box-GTWWIB6F.js.map} +0 -0
  206. /package/dist/{ceph-CQKQ4NWW.js.map → ceph-ATSCSVGU.js.map} +0 -0
  207. /package/dist/{config-7IZCGWKX.js.map → config-22T7HJBJ.js.map} +0 -0
  208. /package/dist/{config-AT74FARJ.js.map → config-A56HUM6C.js.map} +0 -0
  209. /package/dist/{config-C2AYHACT.js.map → config-DIWQZBOK.js.map} +0 -0
  210. /package/dist/{config-ET26F632.js.map → config-HGJ2MGAC.js.map} +0 -0
  211. /package/dist/{config-GHJOYNM6.js.map → config-MHBKYS53.js.map} +0 -0
  212. /package/dist/{config-L55UXIF4.js.map → config-PAHALM2T.js.map} +0 -0
  213. /package/dist/{config-NV5WXP64.js.map → config-PWZXYJOI.js.map} +0 -0
  214. /package/dist/{config-V7BLK5WP.js.map → config-UU27ALAA.js.map} +0 -0
  215. /package/dist/{digitalocean-KC7VIWZK.js.map → digitalocean-SQA6MJJQ.js.map} +0 -0
  216. /package/dist/{discord-W3DSEXKN.js.map → discord-ASNFJP6A.js.map} +0 -0
  217. /package/dist/{dropbox-GI273OVA.js.map → dropbox-VV2WZE6I.js.map} +0 -0
  218. /package/dist/{gcs-WRQTU27E.js.map → gcs-2W6DDWM7.js.map} +0 -0
  219. /package/dist/{gdocs-EI2EFVKG.js.map → gdocs-QPM7VXXE.js.map} +0 -0
  220. /package/dist/{gdrive-62HD67IP.js.map → gdrive-KT6R7EVB.js.map} +0 -0
  221. /package/dist/{github-SWLYD3LS.js.map → github-3IFZGW6I.js.map} +0 -0
  222. /package/dist/{github_ci-7P7VGBKM.js.map → github_ci-CKKF2Y4S.js.map} +0 -0
  223. /package/dist/{gmail-B7HXHZ7D.js.map → gmail-HLZIMKQU.js.map} +0 -0
  224. /package/dist/{gsheets-OTBW2JWG.js.map → gsheets-HF4YPIEF.js.map} +0 -0
  225. /package/dist/{gslides-MXSR4HRY.js.map → gslides-EV2JJH7I.js.map} +0 -0
  226. /package/dist/{langfuse-FWKU6E3F.js.map → langfuse-74ZCR6QL.js.map} +0 -0
  227. /package/dist/{linear-SHVG3XVT.js.map → linear-XABGTU6E.js.map} +0 -0
  228. /package/dist/{minio-246KOHBJ.js.map → minio-JPNSX2NP.js.map} +0 -0
  229. /package/dist/{mongodb-2ITJUDCF.js.map → mongodb-YZP643ZU.js.map} +0 -0
  230. /package/dist/{notion-BOBBSJSG.js.map → notion-YJOTGH7J.js.map} +0 -0
  231. /package/dist/{oci-T7VREPQW.js.map → oci-R4VYQKGJ.js.map} +0 -0
  232. /package/dist/{opfs-3XNAXR5B.js.map → opfs-4RWMJBCI.js.map} +0 -0
  233. /package/dist/{postgres-CK4HWZSL.js.map → postgres-HPOMN2AR.js.map} +0 -0
  234. /package/dist/{qingstor-WIC27LS3.js.map → qingstor-ZWWK2ZGV.js.map} +0 -0
  235. /package/dist/{r2-EAX6KHEI.js.map → r2-PZAN2YFG.js.map} +0 -0
  236. /package/dist/{s3-GD2WKLWR.js.map → s3-CSFY3PLT.js.map} +0 -0
  237. /package/dist/{scaleway-OVFRZBKW.js.map → scaleway-BFROPDBB.js.map} +0 -0
  238. /package/dist/{seaweedfs-EOJVO432.js.map → seaweedfs-X6THZT26.js.map} +0 -0
  239. /package/dist/{slack-RNXMU5OC.js.map → slack-O7BTJ4YR.js.map} +0 -0
  240. /package/dist/{supabase-VSUNLIJ6.js.map → supabase-PHN3MIXW.js.map} +0 -0
  241. /package/dist/{tencent-YYM5WUVU.js.map → tencent-JGCJEKHV.js.map} +0 -0
  242. /package/dist/{trello-MNR3VPTT.js.map → trello-QUDOP3M2.js.map} +0 -0
  243. /package/dist/{wasabi-K5ANTZ2C.js.map → wasabi-5VMNAFOC.js.map} +0 -0
@@ -1,4 +1,5 @@
1
1
  // src/resource/s3/s3.ts
2
+ import { mountKey, mountPrefixOf } from "@struktoai/mirage-core";
2
3
  import {
3
4
  copy as copyCore,
4
5
  create as createCore,
@@ -6,6 +7,7 @@ import {
6
7
  duAll as duAllCore,
7
8
  exists as existsCore,
8
9
  find as findCore,
10
+ makeResolveGlob,
9
11
  mkdir as mkdirCore,
10
12
  PathSpec,
11
13
  RAMIndexCacheStore,
@@ -15,7 +17,7 @@ import {
15
17
  readdir as readdirCore,
16
18
  rename as renameCore,
17
19
  ResourceName,
18
- resolveS3Glob as globCore,
20
+ S3_SCOPE_ERROR,
19
21
  rmR as rmRCore,
20
22
  rmdir as rmdirCore,
21
23
  S3_OPS,
@@ -33,6 +35,7 @@ import {
33
35
  } from "@struktoai/mirage-core";
34
36
 
35
37
  // src/resource/s3/s3.ts
38
+ var globCore = makeResolveGlob(readdirCore, S3_SCOPE_ERROR);
36
39
  var S3_BROWSER_PROMPT = `{prefix}
37
40
  Remote S3 bucket accessed via presigned URLs (browser runtime).
38
41
  Supports the full filesystem command set: ls/tree/cat/grep/find/du/cp/mv/rm/etc.
@@ -41,7 +44,7 @@ var S3_BROWSER_PROMPT = `{prefix}
41
44
  var S3Resource = class {
42
45
  supportsSnapshot = true;
43
46
  kind = ResourceName.S3;
44
- isRemote = true;
47
+ cachesReads = true;
45
48
  indexTtl = 600;
46
49
  prompt = S3_BROWSER_PROMPT;
47
50
  config;
@@ -127,26 +130,16 @@ var S3Resource = class {
127
130
  }
128
131
  glob(paths, prefix = "") {
129
132
  const effective = prefix ? paths.map(
130
- (p) => p.prefix ? p : new PathSpec({
131
- original: p.original,
133
+ (p) => mountPrefixOf(p.virtual, p.resourcePath) ? p : new PathSpec({
134
+ virtual: p.virtual,
132
135
  directory: p.directory,
133
136
  ...p.pattern !== null ? { pattern: p.pattern } : {},
134
137
  resolved: p.resolved,
135
- prefix
138
+ resourcePath: mountKey(p.virtual, prefix)
136
139
  })
137
140
  ) : paths;
138
141
  return globCore(this.accessor, effective, this.index);
139
142
  }
140
- async fingerprint(p) {
141
- try {
142
- const s = await statCore(this.accessor, p, this.index);
143
- const etag = s.extra.etag;
144
- return typeof etag === "string" && etag !== "" ? etag : null;
145
- } catch (err) {
146
- if (err?.code === "ENOENT") return null;
147
- throw err;
148
- }
149
- }
150
143
  getState() {
151
144
  return Promise.resolve({
152
145
  type: this.kind,
@@ -174,4 +167,4 @@ export {
174
167
  S3_BROWSER_PROMPT,
175
168
  S3Resource
176
169
  };
177
- //# sourceMappingURL=chunk-XFREXNA2.js.map
170
+ //# sourceMappingURL=chunk-DC6VA36O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/s3/s3.ts","../src/resource/s3/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 { mountKey, mountPrefixOf } from '@struktoai/mirage-core'\nimport {\n copy as copyCore,\n create as createCore,\n du as duCore,\n duAll as duAllCore,\n exists as existsCore,\n type FileStat,\n type FindOptions,\n find as findCore,\n type IndexCacheStore,\n makeResolveGlob,\n mkdir as mkdirCore,\n PathSpec,\n RAMIndexCacheStore,\n rangeRead as rangeReadCore,\n S3_COMMANDS,\n read as readCore,\n readdir as readdirCore,\n type RegisteredCommand,\n type RegisteredOp,\n rename as renameCore,\n type Resource,\n ResourceName,\n S3_SCOPE_ERROR,\n rmR as rmRCore,\n rmdir as rmdirCore,\n S3_OPS,\n S3Accessor,\n stat as statCore,\n stream as streamCore,\n truncate as truncateCore,\n unlink as unlinkCore,\n write as writeCore,\n} from '@struktoai/mirage-core'\nimport { redactConfig, type S3Config, type S3ConfigRedacted } from './config.ts'\n\nconst globCore = makeResolveGlob(readdirCore, S3_SCOPE_ERROR)\n\nexport const S3_BROWSER_PROMPT = `{prefix}\n Remote S3 bucket accessed via presigned URLs (browser runtime).\n Supports the full filesystem command set: ls/tree/cat/grep/find/du/cp/mv/rm/etc.\n Listing operations require the presigner to sign LIST/COPY operations in\n addition to GET/PUT/HEAD/DELETE — see S3BrowserPresignedUrlProvider docs.`\n\nexport interface S3ResourceState {\n type: string\n config: S3ConfigRedacted\n}\n\nexport class S3Resource implements Resource {\n readonly supportsSnapshot: boolean = true\n readonly kind: string = ResourceName.S3\n readonly cachesReads: boolean = true\n readonly indexTtl: number = 600\n readonly prompt: string = S3_BROWSER_PROMPT\n readonly config: S3Config\n readonly accessor: S3Accessor\n readonly index: IndexCacheStore\n\n constructor(config: S3Config) {\n this.config = config\n this.accessor = new S3Accessor(this.config)\n this.index = new RAMIndexCacheStore({ ttl: this.indexTtl })\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n close(): Promise<void> {\n return Promise.resolve()\n }\n\n commands(): readonly RegisteredCommand[] {\n return S3_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return S3_OPS\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 async appendFile(p: PathSpec, data: Uint8Array): Promise<void> {\n let existing: Uint8Array\n try {\n existing = await readCore(this.accessor, p)\n } catch (err) {\n if ((err as { code?: string } | null)?.code === 'ENOENT') {\n existing = new Uint8Array()\n } else {\n throw err\n }\n }\n const merged = new Uint8Array(existing.byteLength + data.byteLength)\n merged.set(existing, 0)\n merged.set(data, existing.byteLength)\n await writeCore(this.accessor, p, merged)\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, this.index)\n }\n\n exists(p: PathSpec): Promise<boolean> {\n return existsCore(this.accessor, p)\n }\n\n mkdir(p: PathSpec): Promise<void> {\n return mkdirCore(this.accessor, p)\n }\n\n rmdir(p: PathSpec): Promise<void> {\n return rmdirCore(this.accessor, p)\n }\n\n unlink(p: PathSpec): Promise<void> {\n return unlinkCore(this.accessor, p)\n }\n\n rename(src: PathSpec, dst: PathSpec): Promise<void> {\n return renameCore(this.accessor, src, dst)\n }\n\n truncate(p: PathSpec, length: number): Promise<void> {\n return truncateCore(this.accessor, p, length)\n }\n\n copy(src: PathSpec, dst: PathSpec): Promise<void> {\n return copyCore(this.accessor, src, dst)\n }\n\n rmR(p: PathSpec): Promise<void> {\n return rmRCore(this.accessor, p)\n }\n\n du(p: PathSpec): Promise<number> {\n return duCore(this.accessor, p)\n }\n\n find(p: PathSpec, options: FindOptions = {}): Promise<string[]> {\n return findCore(this.accessor, p, options)\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 getState(): Promise<S3ResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactConfig(this.config),\n })\n }\n\n loadState(_state: S3ResourceState): Promise<void> {\n return Promise.resolve()\n }\n\n // Ignored — duAll is not yet on the public Resource interface, but keeping\n // it around matches the node-side S3Resource.opsMap hook for completeness.\n _duAll(p: PathSpec): Promise<[[string, number][], number]> {\n return duAllCore(this.accessor, p)\n }\n\n _rangeRead(p: PathSpec, offset: number, size: number): Promise<Uint8Array> {\n return rangeReadCore(this.accessor, p, offset, size)\n }\n\n _create(p: PathSpec): Promise<void> {\n return createCore(this.accessor, p)\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 {\n redactS3Config as redactConfig,\n type S3BrowserOperation,\n type S3BrowserPresignedUrlProvider,\n type S3BrowserSignOptions,\n type S3Config,\n type S3ConfigRedacted,\n} from '@struktoai/mirage-core'\n"],"mappings":"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","names":[]}
@@ -17,8 +17,7 @@ function normalizeGitHubCIConfig(input) {
17
17
  }
18
18
 
19
19
  export {
20
- GitHubCIConfigSchema,
21
20
  redactGitHubCIConfig,
22
21
  normalizeGitHubCIConfig
23
22
  };
24
- //# sourceMappingURL=chunk-HYUESAQS.js.map
23
+ //# sourceMappingURL=chunk-DGP3N4WM.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/resource/github_ci/config.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { normalizeFields, redactConfigWithSchema, secretStr, z } from '@struktoai/mirage-core'\n\nexport interface GitHubCIConfig {\n token: string\n owner: string\n repo: string\n days?: number\n baseUrl?: string\n}\n\nexport interface GitHubCIConfigRedacted {\n token: '<REDACTED>'\n owner: string\n repo: string\n days?: number\n baseUrl?: string\n}\n\nexport const GitHubCIConfigSchema = z.object({\n token: secretStr(),\n owner: z.string(),\n repo: z.string(),\n days: z.number().optional(),\n baseUrl: z.string().optional(),\n})\n\nexport function redactGitHubCIConfig(config: GitHubCIConfig): GitHubCIConfigRedacted {\n return redactConfigWithSchema(GitHubCIConfigSchema, config) as unknown as GitHubCIConfigRedacted\n}\n\nexport function normalizeGitHubCIConfig(input: Record<string, unknown>): GitHubCIConfig {\n return normalizeFields(input, {\n rename: { base_url: 'baseUrl' },\n }) as unknown as GitHubCIConfig\n}\n"],"mappings":";AAcA,SAAS,iBAAiB,wBAAwB,WAAW,SAAS;AAkB/D,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,OAAO,UAAU;AAAA,EACjB,OAAO,EAAE,OAAO;AAAA,EAChB,MAAM,EAAE,OAAO;AAAA,EACf,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,SAAS,EAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAEM,SAAS,qBAAqB,QAAgD;AACnF,SAAO,uBAAuB,sBAAsB,MAAM;AAC5D;AAEO,SAAS,wBAAwB,OAAgD;AACtF,SAAO,gBAAgB,OAAO;AAAA,IAC5B,QAAQ,EAAE,UAAU,UAAU;AAAA,EAChC,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../src/resource/github_ci/config.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { normalizeFields, redactConfigWithSchema, secretStr, z } from '@struktoai/mirage-core'\n\nexport interface GitHubCIConfig {\n token: string\n owner: string\n repo: string\n days?: number\n baseUrl?: string\n}\n\nexport interface GitHubCIConfigRedacted {\n token: '<REDACTED>'\n owner: string\n repo: string\n days?: number\n baseUrl?: string\n}\n\nconst GitHubCIConfigSchema = z.object({\n token: secretStr(),\n owner: z.string(),\n repo: z.string(),\n days: z.number().optional(),\n baseUrl: z.string().optional(),\n})\n\nexport function redactGitHubCIConfig(config: GitHubCIConfig): GitHubCIConfigRedacted {\n return redactConfigWithSchema(GitHubCIConfigSchema, config) as unknown as GitHubCIConfigRedacted\n}\n\nexport function normalizeGitHubCIConfig(input: Record<string, unknown>): GitHubCIConfig {\n return normalizeFields(input, {\n rename: { base_url: 'baseUrl' },\n }) as unknown as GitHubCIConfig\n}\n"],"mappings":";AAcA,SAAS,iBAAiB,wBAAwB,WAAW,SAAS;AAkBtE,IAAM,uBAAuB,EAAE,OAAO;AAAA,EACpC,OAAO,UAAU;AAAA,EACjB,OAAO,EAAE,OAAO;AAAA,EAChB,MAAM,EAAE,OAAO;AAAA,EACf,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,SAAS,EAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAEM,SAAS,qBAAqB,QAAgD;AACnF,SAAO,uBAAuB,sBAAsB,MAAM;AAC5D;AAEO,SAAS,wBAAwB,OAAgD;AACtF,SAAO,gBAAgB,OAAO;AAAA,IAC5B,QAAQ,EAAE,UAAU,UAAU;AAAA,EAChC,CAAC;AACH;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  S3Resource
3
- } from "./chunk-XFREXNA2.js";
3
+ } from "./chunk-DC6VA36O.js";
4
4
 
5
5
  // src/resource/supabase/supabase.ts
6
6
  import {
@@ -19,7 +19,8 @@ var SupabaseConfigSchema = z.object({
19
19
  projectRef: z.string().optional(),
20
20
  region: z.string().optional(),
21
21
  endpoint: z.string().optional(),
22
- defaultContentType: z.string().optional()
22
+ defaultContentType: z.string().optional(),
23
+ keyPrefix: z.string().optional()
23
24
  });
24
25
  function resolvedSupabaseEndpoint(config) {
25
26
  if (config.endpoint !== void 0 && config.endpoint !== "") return config.endpoint;
@@ -36,7 +37,8 @@ function supabaseToS3Config(config) {
36
37
  ...config.region !== void 0 ? { region: config.region } : {},
37
38
  ...endpoint !== void 0 ? { endpoint } : {},
38
39
  forcePathStyle: true,
39
- ...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {}
40
+ ...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {},
41
+ ...config.keyPrefix !== void 0 ? { keyPrefix: config.keyPrefix } : {}
40
42
  };
41
43
  }
42
44
  function redactSupabaseConfig(config) {
@@ -87,4 +89,4 @@ export {
87
89
  SUPABASE_BROWSER_PROMPT,
88
90
  SupabaseResource
89
91
  };
90
- //# sourceMappingURL=chunk-WEJGUCCL.js.map
92
+ //# sourceMappingURL=chunk-DKPDXQML.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/supabase/supabase.ts","../src/resource/supabase/config.ts","../src/resource/supabase/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 redactSupabaseConfig,\n supabaseToS3Config,\n type SupabaseConfig,\n type SupabaseConfigRedacted,\n} from './config.ts'\nimport { SUPABASE_BROWSER_PROMPT } from './prompt.ts'\n\nexport interface SupabaseResourceState {\n type: string\n config: SupabaseConfigRedacted\n}\n\nexport class SupabaseResource extends S3Resource {\n override readonly kind: string = ResourceName.SUPABASE\n override readonly prompt: string = SUPABASE_BROWSER_PROMPT\n readonly supabaseConfig: SupabaseConfig\n private readonly supabaseOps: readonly RegisteredOp[]\n private readonly supabaseCommands: readonly RegisteredCommand[]\n\n constructor(config: SupabaseConfig) {\n super(supabaseToS3Config(config))\n this.supabaseConfig = config\n this.supabaseOps = remapOpsResource(super.ops(), ResourceName.SUPABASE)\n this.supabaseCommands = remapCommandsResource(super.commands(), ResourceName.SUPABASE)\n }\n\n override ops(): readonly RegisteredOp[] {\n return this.supabaseOps\n }\n\n override commands(): readonly RegisteredCommand[] {\n return this.supabaseCommands\n }\n\n override getState(): Promise<SupabaseResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactSupabaseConfig(this.supabaseConfig),\n })\n }\n\n override loadState(_state: SupabaseResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { redactConfigWithSchema, secretSchema, z } from '@struktoai/mirage-core'\nimport type { S3BrowserPresignedUrlProvider, S3Config } from '../s3/config.ts'\n\nexport interface SupabaseConfig {\n bucket: string\n presignedUrlProvider: S3BrowserPresignedUrlProvider\n projectRef?: string\n region?: string\n endpoint?: string\n defaultContentType?: string\n keyPrefix?: string\n}\n\nexport interface SupabaseConfigRedacted extends Omit<SupabaseConfig, 'presignedUrlProvider'> {\n presignedUrlProvider: '<REDACTED>'\n}\n\nconst SupabaseConfigSchema = z.object({\n bucket: z.string(),\n presignedUrlProvider: secretSchema(\n z.custom<S3BrowserPresignedUrlProvider>((value) => typeof value === 'function'),\n ),\n projectRef: z.string().optional(),\n region: z.string().optional(),\n endpoint: z.string().optional(),\n defaultContentType: z.string().optional(),\n keyPrefix: z.string().optional(),\n})\n\nexport function resolvedSupabaseEndpoint(config: SupabaseConfig): string | undefined {\n if (config.endpoint !== undefined && config.endpoint !== '') return config.endpoint\n if (config.projectRef !== undefined && config.projectRef !== '') {\n return `https://${config.projectRef}.storage.supabase.co/storage/v1/s3`\n }\n return undefined\n}\n\nexport function supabaseToS3Config(config: SupabaseConfig): S3Config {\n const endpoint = resolvedSupabaseEndpoint(config)\n return {\n bucket: config.bucket,\n presignedUrlProvider: config.presignedUrlProvider,\n ...(config.region !== undefined ? { region: config.region } : {}),\n ...(endpoint !== undefined ? { endpoint } : {}),\n forcePathStyle: true,\n ...(config.defaultContentType !== undefined\n ? { defaultContentType: config.defaultContentType }\n : {}),\n ...(config.keyPrefix !== undefined ? { keyPrefix: config.keyPrefix } : {}),\n }\n}\n\nexport function redactSupabaseConfig(config: SupabaseConfig): SupabaseConfigRedacted {\n return redactConfigWithSchema(SupabaseConfigSchema, config) as unknown as SupabaseConfigRedacted\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 SUPABASE_BROWSER_PROMPT = `{prefix}\n Remote Supabase Storage bucket accessed via presigned URLs (browser runtime).\n Supports the full filesystem command set: ls/tree/cat/grep/find/du/cp/mv/rm/etc.\n Listing operations require the presigner to sign LIST/COPY operations in\n addition to GET/PUT/HEAD/DELETE — see S3BrowserPresignedUrlProvider docs.`\n"],"mappings":";;;;;AAcA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;;;ACNP,SAAS,wBAAwB,cAAc,SAAS;AAiBxD,IAAM,uBAAuB,EAAE,OAAO;AAAA,EACpC,QAAQ,EAAE,OAAO;AAAA,EACjB,sBAAsB;AAAA,IACpB,EAAE,OAAsC,CAAC,UAAU,OAAO,UAAU,UAAU;AAAA,EAChF;AAAA,EACA,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,EACxC,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAEM,SAAS,yBAAyB,QAA4C;AACnF,MAAI,OAAO,aAAa,UAAa,OAAO,aAAa,GAAI,QAAO,OAAO;AAC3E,MAAI,OAAO,eAAe,UAAa,OAAO,eAAe,IAAI;AAC/D,WAAO,WAAW,OAAO,UAAU;AAAA,EACrC;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,QAAkC;AACnE,QAAM,WAAW,yBAAyB,MAAM;AAChD,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,sBAAsB,OAAO;AAAA,IAC7B,GAAI,OAAO,WAAW,SAAY,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,IAC/D,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,IAC7C,gBAAgB;AAAA,IAChB,GAAI,OAAO,uBAAuB,SAC9B,EAAE,oBAAoB,OAAO,mBAAmB,IAChD,CAAC;AAAA,IACL,GAAI,OAAO,cAAc,SAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,EAC1E;AACF;AAEO,SAAS,qBAAqB,QAAgD;AACnF,SAAO,uBAAuB,sBAAsB,MAAM;AAC5D;;;ACtDO,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;;;AFqBhC,IAAM,mBAAN,cAA+B,WAAW;AAAA,EAC7B,OAAe,aAAa;AAAA,EAC5B,SAAiB;AAAA,EAC1B;AAAA,EACQ;AAAA,EACA;AAAA,EAEjB,YAAY,QAAwB;AAClC,UAAM,mBAAmB,MAAM,CAAC;AAChC,SAAK,iBAAiB;AACtB,SAAK,cAAc,iBAAiB,MAAM,IAAI,GAAG,aAAa,QAAQ;AACtE,SAAK,mBAAmB,sBAAsB,MAAM,SAAS,GAAG,aAAa,QAAQ;AAAA,EACvF;AAAA,EAES,MAA+B;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAyC;AAChD,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAA2C;AAClD,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,qBAAqB,KAAK,cAAc;AAAA,IAClD,CAAC;AAAA,EACH;AAAA,EAES,UAAU,QAA8C;AAC/D,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -19,8 +19,7 @@ function normalizeGDocsConfig(input) {
19
19
  }
20
20
 
21
21
  export {
22
- GDocsConfigSchema,
23
22
  redactGDocsConfig,
24
23
  normalizeGDocsConfig
25
24
  };
26
- //# sourceMappingURL=chunk-2H4KUUFP.js.map
25
+ //# sourceMappingURL=chunk-DQK6H5LW.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/resource/gdocs/config.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { normalizeFields, redactConfigWithSchema, secretStr, z } from '@struktoai/mirage-core'\n\nexport interface GDocsConfig {\n clientId: string\n clientSecret?: string\n refreshToken: string\n refreshFn?: (refreshToken: string) => Promise<{ accessToken: string; expiresIn: number }>\n}\n\nexport interface GDocsConfigRedacted {\n clientId: string\n clientSecret?: '<REDACTED>'\n refreshToken: '<REDACTED>'\n}\n\nexport const GDocsConfigSchema = z.object({\n clientId: z.string(),\n clientSecret: secretStr().optional(),\n refreshToken: secretStr(),\n})\n\nexport function redactGDocsConfig(config: GDocsConfig): GDocsConfigRedacted {\n return redactConfigWithSchema(GDocsConfigSchema, config) as unknown as GDocsConfigRedacted\n}\n\nexport function normalizeGDocsConfig(input: Record<string, unknown>): GDocsConfig {\n return normalizeFields(input, {\n rename: {\n client_id: 'clientId',\n client_secret: 'clientSecret',\n refresh_token: 'refreshToken',\n },\n }) as unknown as GDocsConfig\n}\n"],"mappings":";AAcA,SAAS,iBAAiB,wBAAwB,WAAW,SAAS;AAe/D,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,UAAU,EAAE,OAAO;AAAA,EACnB,cAAc,UAAU,EAAE,SAAS;AAAA,EACnC,cAAc,UAAU;AAC1B,CAAC;AAEM,SAAS,kBAAkB,QAA0C;AAC1E,SAAO,uBAAuB,mBAAmB,MAAM;AACzD;AAEO,SAAS,qBAAqB,OAA6C;AAChF,SAAO,gBAAgB,OAAO;AAAA,IAC5B,QAAQ;AAAA,MACN,WAAW;AAAA,MACX,eAAe;AAAA,MACf,eAAe;AAAA,IACjB;AAAA,EACF,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../src/resource/gdocs/config.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { normalizeFields, redactConfigWithSchema, secretStr, z } from '@struktoai/mirage-core'\n\nexport interface GDocsConfig {\n clientId: string\n clientSecret?: string\n refreshToken: string\n refreshFn?: (refreshToken: string) => Promise<{ accessToken: string; expiresIn: number }>\n}\n\nexport interface GDocsConfigRedacted {\n clientId: string\n clientSecret?: '<REDACTED>'\n refreshToken: '<REDACTED>'\n}\n\nconst GDocsConfigSchema = z.object({\n clientId: z.string(),\n clientSecret: secretStr().optional(),\n refreshToken: secretStr(),\n})\n\nexport function redactGDocsConfig(config: GDocsConfig): GDocsConfigRedacted {\n return redactConfigWithSchema(GDocsConfigSchema, config) as unknown as GDocsConfigRedacted\n}\n\nexport function normalizeGDocsConfig(input: Record<string, unknown>): GDocsConfig {\n return normalizeFields(input, {\n rename: {\n client_id: 'clientId',\n client_secret: 'clientSecret',\n refresh_token: 'refreshToken',\n },\n }) as unknown as GDocsConfig\n}\n"],"mappings":";AAcA,SAAS,iBAAiB,wBAAwB,WAAW,SAAS;AAetE,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACjC,UAAU,EAAE,OAAO;AAAA,EACnB,cAAc,UAAU,EAAE,SAAS;AAAA,EACnC,cAAc,UAAU;AAC1B,CAAC;AAEM,SAAS,kBAAkB,QAA0C;AAC1E,SAAO,uBAAuB,mBAAmB,MAAM;AACzD;AAEO,SAAS,qBAAqB,OAA6C;AAChF,SAAO,gBAAgB,OAAO;AAAA,IAC5B,QAAQ;AAAA,MACN,WAAW;AAAA,MACX,eAAe;AAAA,MACf,eAAe;AAAA,IACjB;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -1,18 +1,19 @@
1
1
  // src/resource/linear/linear.ts
2
+ import { mountKey, mountPrefixOf } from "@struktoai/mirage-core";
2
3
  import {
3
4
  HttpLinearTransport,
4
5
  LINEAR_COMMANDS,
5
6
  LINEAR_PROMPT,
6
- LINEAR_VFS_OPS,
7
+ LINEAR_OPS,
7
8
  LINEAR_WRITE_PROMPT,
8
9
  LinearAccessor,
9
10
  linearRead,
10
11
  linearReaddir,
11
12
  linearStat,
13
+ makeResolveGlob,
12
14
  PathSpec,
13
15
  RAMIndexCacheStore,
14
- ResourceName,
15
- resolveLinearGlob
16
+ ResourceName
16
17
  } from "@struktoai/mirage-core";
17
18
 
18
19
  // src/resource/linear/config.ts
@@ -28,9 +29,12 @@ function redactLinearConfig(config) {
28
29
  }
29
30
 
30
31
  // src/resource/linear/linear.ts
32
+ var resolveLinearGlob = (accessor, paths, index, filter) => makeResolveGlob(
33
+ (a, p, i) => linearReaddir(a, p, i, filter)
34
+ )(accessor, paths, index);
31
35
  var LinearResource = class {
32
36
  kind = ResourceName.LINEAR;
33
- isRemote = true;
37
+ cachesReads = true;
34
38
  indexTtl = 600;
35
39
  prompt = LINEAR_PROMPT;
36
40
  writePrompt = LINEAR_WRITE_PROMPT;
@@ -54,7 +58,7 @@ var LinearResource = class {
54
58
  return LINEAR_COMMANDS;
55
59
  }
56
60
  ops() {
57
- return LINEAR_VFS_OPS;
61
+ return LINEAR_OPS;
58
62
  }
59
63
  filter() {
60
64
  const out = {};
@@ -70,18 +74,14 @@ var LinearResource = class {
70
74
  stat(p) {
71
75
  return linearStat(this.accessor, p, this.index);
72
76
  }
73
- async fingerprint(p) {
74
- const lookup = await this.index.get(p.original);
75
- return lookup.entry?.remoteTime ?? null;
76
- }
77
77
  glob(paths, prefix = "") {
78
78
  const effective = prefix !== "" ? paths.map(
79
- (p) => p.prefix !== "" ? p : new PathSpec({
80
- original: p.original,
79
+ (p) => mountPrefixOf(p.virtual, p.resourcePath) !== "" ? p : new PathSpec({
80
+ virtual: p.virtual,
81
81
  directory: p.directory,
82
82
  ...p.pattern !== null ? { pattern: p.pattern } : {},
83
83
  resolved: p.resolved,
84
- prefix
84
+ resourcePath: mountKey(p.virtual, prefix)
85
85
  })
86
86
  ) : paths;
87
87
  return resolveLinearGlob(this.accessor, effective, this.index, this.filter());
@@ -101,4 +101,4 @@ export {
101
101
  redactLinearConfig,
102
102
  LinearResource
103
103
  };
104
- //# sourceMappingURL=chunk-T43CZ3IZ.js.map
104
+ //# sourceMappingURL=chunk-E77ESWWV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/linear/linear.ts","../src/resource/linear/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 { mountKey, mountPrefixOf } from '@struktoai/mirage-core'\nimport {\n type FileStat,\n HttpLinearTransport,\n type IndexCacheStore,\n LINEAR_COMMANDS,\n LINEAR_PROMPT,\n LINEAR_OPS,\n LINEAR_WRITE_PROMPT,\n LinearAccessor,\n type LinearReaddirFilter,\n linearRead,\n linearReaddir,\n linearStat,\n makeResolveGlob,\n PathSpec,\n RAMIndexCacheStore,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n ResourceName,\n} from '@struktoai/mirage-core'\nimport { redactLinearConfig, type LinearConfig, type LinearConfigRedacted } from './config.ts'\n\nconst resolveLinearGlob = (\n accessor: LinearAccessor,\n paths: readonly PathSpec[],\n index: IndexCacheStore | undefined,\n filter: LinearReaddirFilter,\n): Promise<PathSpec[]> =>\n makeResolveGlob((a: LinearAccessor, p: PathSpec, i?: IndexCacheStore) =>\n linearReaddir(a, p, i, filter),\n )(accessor, paths, index)\n\nexport interface LinearResourceState {\n type: string\n config: LinearConfigRedacted\n}\n\nexport class LinearResource implements Resource {\n readonly kind: string = ResourceName.LINEAR\n readonly cachesReads: boolean = true\n readonly indexTtl: number = 600\n readonly prompt: string = LINEAR_PROMPT\n readonly writePrompt: string = LINEAR_WRITE_PROMPT\n readonly config: LinearConfig\n readonly accessor: LinearAccessor\n readonly index: IndexCacheStore\n\n constructor(config: LinearConfig) {\n this.config = config\n const transportOpts: { apiKey: string; baseUrl?: string } = { apiKey: config.apiKey }\n if (config.baseUrl !== undefined) transportOpts.baseUrl = config.baseUrl\n this.accessor = new LinearAccessor(new HttpLinearTransport(transportOpts))\n this.index = new RAMIndexCacheStore({ ttl: this.indexTtl })\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n close(): Promise<void> {\n return Promise.resolve()\n }\n\n commands(): readonly RegisteredCommand[] {\n return LINEAR_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return LINEAR_OPS\n }\n\n private filter(): LinearReaddirFilter {\n const out: LinearReaddirFilter = {}\n if (this.config.teamIds !== undefined) out.teamIds = this.config.teamIds\n return out\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return linearRead(this.accessor, p, this.index, this.filter())\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return linearReaddir(this.accessor, p, this.index, this.filter())\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return linearStat(this.accessor, p, this.index)\n }\n\n glob(paths: readonly PathSpec[], prefix = ''): Promise<PathSpec[]> {\n const effective =\n prefix !== ''\n ? paths.map((p) =>\n mountPrefixOf(p.virtual, p.resourcePath) !== ''\n ? p\n : new PathSpec({\n virtual: p.virtual,\n directory: p.directory,\n ...(p.pattern !== null ? { pattern: p.pattern } : {}),\n resolved: p.resolved,\n resourcePath: mountKey(p.virtual, prefix),\n }),\n )\n : paths\n return resolveLinearGlob(this.accessor, effective, this.index, this.filter())\n }\n\n getState(): Promise<LinearResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactLinearConfig(this.config),\n })\n }\n\n loadState(_state: LinearResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { redactConfigWithSchema, secretStr, z } from '@struktoai/mirage-core'\n\nexport interface LinearConfig {\n apiKey: string\n workspace?: string\n teamIds?: readonly string[]\n baseUrl?: string\n}\n\nexport interface LinearConfigRedacted {\n apiKey: '<REDACTED>'\n workspace?: string\n teamIds?: readonly string[]\n baseUrl?: string\n}\n\nconst LinearConfigSchema = z.object({\n apiKey: secretStr(),\n workspace: z.string().optional(),\n teamIds: z.array(z.string()).optional(),\n baseUrl: z.string().optional(),\n})\n\nexport function redactLinearConfig(config: LinearConfig): LinearConfigRedacted {\n return redactConfigWithSchema(LinearConfigSchema, config) as unknown as LinearConfigRedacted\n}\n"],"mappings":";AAcA,SAAS,UAAU,qBAAqB;AACxC;AAAA,EAEE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAIA;AAAA,OACK;;;ACrBP,SAAS,wBAAwB,WAAW,SAAS;AAgBrD,IAAM,qBAAqB,EAAE,OAAO;AAAA,EAClC,QAAQ,UAAU;AAAA,EAClB,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACtC,SAAS,EAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAEM,SAAS,mBAAmB,QAA4C;AAC7E,SAAO,uBAAuB,oBAAoB,MAAM;AAC1D;;;ADDA,IAAM,oBAAoB,CACxB,UACA,OACA,OACA,WAEA;AAAA,EAAgB,CAAC,GAAmB,GAAa,MAC/C,cAAc,GAAG,GAAG,GAAG,MAAM;AAC/B,EAAE,UAAU,OAAO,KAAK;AAOnB,IAAM,iBAAN,MAAyC;AAAA,EACrC,OAAe,aAAa;AAAA,EAC5B,cAAuB;AAAA,EACvB,WAAmB;AAAA,EACnB,SAAiB;AAAA,EACjB,cAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAAsB;AAChC,SAAK,SAAS;AACd,UAAM,gBAAsD,EAAE,QAAQ,OAAO,OAAO;AACpF,QAAI,OAAO,YAAY,OAAW,eAAc,UAAU,OAAO;AACjE,SAAK,WAAW,IAAI,eAAe,IAAI,oBAAoB,aAAa,CAAC;AACzE,SAAK,QAAQ,IAAI,mBAAmB,EAAE,KAAK,KAAK,SAAS,CAAC;AAAA,EAC5D;AAAA,EAEA,OAAsB;AACpB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,QAAuB;AACrB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,WAAyC;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,MAA+B;AAC7B,WAAO;AAAA,EACT;AAAA,EAEQ,SAA8B;AACpC,UAAM,MAA2B,CAAC;AAClC,QAAI,KAAK,OAAO,YAAY,OAAW,KAAI,UAAU,KAAK,OAAO;AACjE,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,GAAkC;AACzC,WAAO,WAAW,KAAK,UAAU,GAAG,KAAK,OAAO,KAAK,OAAO,CAAC;AAAA,EAC/D;AAAA,EAEA,QAAQ,GAAgC;AACtC,WAAO,cAAc,KAAK,UAAU,GAAG,KAAK,OAAO,KAAK,OAAO,CAAC;AAAA,EAClE;AAAA,EAEA,KAAK,GAAgC;AACnC,WAAO,WAAW,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EAChD;AAAA,EAEA,KAAK,OAA4B,SAAS,IAAyB;AACjE,UAAM,YACJ,WAAW,KACP,MAAM;AAAA,MAAI,CAAC,MACT,cAAc,EAAE,SAAS,EAAE,YAAY,MAAM,KACzC,IACA,IAAI,SAAS;AAAA,QACX,SAAS,EAAE;AAAA,QACX,WAAW,EAAE;AAAA,QACb,GAAI,EAAE,YAAY,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,QACnD,UAAU,EAAE;AAAA,QACZ,cAAc,SAAS,EAAE,SAAS,MAAM;AAAA,MAC1C,CAAC;AAAA,IACP,IACA;AACN,WAAO,kBAAkB,KAAK,UAAU,WAAW,KAAK,OAAO,KAAK,OAAO,CAAC;AAAA,EAC9E;AAAA,EAEA,WAAyC;AACvC,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,mBAAmB,KAAK,MAAM;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,QAA4C;AACpD,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  S3Resource
3
- } from "./chunk-XFREXNA2.js";
3
+ } from "./chunk-DC6VA36O.js";
4
4
 
5
5
  // src/resource/gcs/gcs.ts
6
6
  import {
@@ -18,7 +18,8 @@ var GCSConfigSchema = z.object({
18
18
  ),
19
19
  region: z.string().optional(),
20
20
  endpoint: z.string().optional(),
21
- defaultContentType: z.string().optional()
21
+ defaultContentType: z.string().optional(),
22
+ keyPrefix: z.string().optional()
22
23
  });
23
24
  function gcsToS3Config(config) {
24
25
  return {
@@ -26,7 +27,8 @@ function gcsToS3Config(config) {
26
27
  presignedUrlProvider: config.presignedUrlProvider,
27
28
  ...config.region !== void 0 ? { region: config.region } : { region: "auto" },
28
29
  ...config.endpoint !== void 0 ? { endpoint: config.endpoint } : { endpoint: "https://storage.googleapis.com" },
29
- ...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {}
30
+ ...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {},
31
+ ...config.keyPrefix !== void 0 ? { keyPrefix: config.keyPrefix } : {}
30
32
  };
31
33
  }
32
34
  function redactGcsConfig(config) {
@@ -76,4 +78,4 @@ export {
76
78
  GCS_BROWSER_PROMPT,
77
79
  GCSResource
78
80
  };
79
- //# sourceMappingURL=chunk-WZ53HLH6.js.map
81
+ //# sourceMappingURL=chunk-EDS5Q5B7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/gcs/gcs.ts","../src/resource/gcs/config.ts","../src/resource/gcs/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 { gcsToS3Config, redactGcsConfig, type GCSConfig, type GCSConfigRedacted } from './config.ts'\nimport { GCS_BROWSER_PROMPT } from './prompt.ts'\n\nexport interface GCSResourceState {\n type: string\n config: GCSConfigRedacted\n}\n\nexport class GCSResource extends S3Resource {\n override readonly kind: string = ResourceName.GCS\n override readonly prompt: string = GCS_BROWSER_PROMPT\n readonly gcsConfig: GCSConfig\n private readonly gcsOps: readonly RegisteredOp[]\n private readonly gcsCommands: readonly RegisteredCommand[]\n\n constructor(config: GCSConfig) {\n super(gcsToS3Config(config))\n this.gcsConfig = config\n this.gcsOps = remapOpsResource(super.ops(), ResourceName.GCS)\n this.gcsCommands = remapCommandsResource(super.commands(), ResourceName.GCS)\n }\n\n override ops(): readonly RegisteredOp[] {\n return this.gcsOps\n }\n\n override commands(): readonly RegisteredCommand[] {\n return this.gcsCommands\n }\n\n override getState(): Promise<GCSResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactGcsConfig(this.gcsConfig),\n })\n }\n\n override loadState(_state: GCSResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { redactConfigWithSchema, secretSchema, z } from '@struktoai/mirage-core'\nimport type { S3BrowserPresignedUrlProvider, S3Config } from '../s3/config.ts'\n\nexport interface GCSConfig {\n bucket: string\n presignedUrlProvider: S3BrowserPresignedUrlProvider\n region?: string\n endpoint?: string\n defaultContentType?: string\n keyPrefix?: string\n}\n\nexport interface GCSConfigRedacted extends Omit<GCSConfig, 'presignedUrlProvider'> {\n presignedUrlProvider: '<REDACTED>'\n}\n\nconst GCSConfigSchema = z.object({\n bucket: z.string(),\n presignedUrlProvider: secretSchema(\n z.custom<S3BrowserPresignedUrlProvider>((value) => typeof value === 'function'),\n ),\n region: z.string().optional(),\n endpoint: z.string().optional(),\n defaultContentType: z.string().optional(),\n keyPrefix: z.string().optional(),\n})\n\nexport function gcsToS3Config(config: GCSConfig): S3Config {\n return {\n bucket: config.bucket,\n presignedUrlProvider: config.presignedUrlProvider,\n ...(config.region !== undefined ? { region: config.region } : { region: 'auto' }),\n ...(config.endpoint !== undefined\n ? { endpoint: config.endpoint }\n : { endpoint: 'https://storage.googleapis.com' }),\n ...(config.defaultContentType !== undefined\n ? { defaultContentType: config.defaultContentType }\n : {}),\n ...(config.keyPrefix !== undefined ? { keyPrefix: config.keyPrefix } : {}),\n }\n}\n\nexport function redactGcsConfig(config: GCSConfig): GCSConfigRedacted {\n return redactConfigWithSchema(GCSConfigSchema, config) as unknown as GCSConfigRedacted\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 GCS_BROWSER_PROMPT = `{prefix}\n Remote Google Cloud Storage bucket accessed via presigned URLs (browser runtime).\n Supports the full filesystem command set: ls/tree/cat/grep/find/du/cp/mv/rm/etc.\n Listing operations require the presigner to sign LIST/COPY operations in\n addition to GET/PUT/HEAD/DELETE — see S3BrowserPresignedUrlProvider docs.`\n"],"mappings":";;;;;AAcA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;;;ACNP,SAAS,wBAAwB,cAAc,SAAS;AAgBxD,IAAM,kBAAkB,EAAE,OAAO;AAAA,EAC/B,QAAQ,EAAE,OAAO;AAAA,EACjB,sBAAsB;AAAA,IACpB,EAAE,OAAsC,CAAC,UAAU,OAAO,UAAU,UAAU;AAAA,EAChF;AAAA,EACA,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,EACxC,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAEM,SAAS,cAAc,QAA6B;AACzD,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,sBAAsB,OAAO;AAAA,IAC7B,GAAI,OAAO,WAAW,SAAY,EAAE,QAAQ,OAAO,OAAO,IAAI,EAAE,QAAQ,OAAO;AAAA,IAC/E,GAAI,OAAO,aAAa,SACpB,EAAE,UAAU,OAAO,SAAS,IAC5B,EAAE,UAAU,iCAAiC;AAAA,IACjD,GAAI,OAAO,uBAAuB,SAC9B,EAAE,oBAAoB,OAAO,mBAAmB,IAChD,CAAC;AAAA,IACL,GAAI,OAAO,cAAc,SAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,EAC1E;AACF;AAEO,SAAS,gBAAgB,QAAsC;AACpE,SAAO,uBAAuB,iBAAiB,MAAM;AACvD;;;AC5CO,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;;;AFgB3B,IAAM,cAAN,cAA0B,WAAW;AAAA,EACxB,OAAe,aAAa;AAAA,EAC5B,SAAiB;AAAA,EAC1B;AAAA,EACQ;AAAA,EACA;AAAA,EAEjB,YAAY,QAAmB;AAC7B,UAAM,cAAc,MAAM,CAAC;AAC3B,SAAK,YAAY;AACjB,SAAK,SAAS,iBAAiB,MAAM,IAAI,GAAG,aAAa,GAAG;AAC5D,SAAK,cAAc,sBAAsB,MAAM,SAAS,GAAG,aAAa,GAAG;AAAA,EAC7E;AAAA,EAES,MAA+B;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAyC;AAChD,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAsC;AAC7C,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,gBAAgB,KAAK,SAAS;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAES,UAAU,QAAyC;AAC1D,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  S3Resource
3
- } from "./chunk-XFREXNA2.js";
3
+ } from "./chunk-DC6VA36O.js";
4
4
 
5
5
  // src/resource/qingstor/qingstor.ts
6
6
  import {
@@ -18,7 +18,8 @@ var QingStorConfigSchema = z.object({
18
18
  ),
19
19
  region: z.string().optional(),
20
20
  endpoint: z.string().optional(),
21
- defaultContentType: z.string().optional()
21
+ defaultContentType: z.string().optional(),
22
+ keyPrefix: z.string().optional()
22
23
  });
23
24
  function resolvedQingStorEndpoint(config) {
24
25
  if (config.endpoint !== void 0 && config.endpoint !== "") return config.endpoint;
@@ -35,7 +36,8 @@ function qingStorToS3Config(config) {
35
36
  presignedUrlProvider: config.presignedUrlProvider,
36
37
  ...config.region !== void 0 ? { region: config.region } : {},
37
38
  ...endpoint !== void 0 ? { endpoint } : {},
38
- ...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {}
39
+ ...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {},
40
+ ...config.keyPrefix !== void 0 ? { keyPrefix: config.keyPrefix } : {}
39
41
  };
40
42
  }
41
43
  function redactQingStorConfig(config) {
@@ -86,4 +88,4 @@ export {
86
88
  QINGSTOR_BROWSER_PROMPT,
87
89
  QingStorResource
88
90
  };
89
- //# sourceMappingURL=chunk-32VC36P4.js.map
91
+ //# sourceMappingURL=chunk-EHTYPBGX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/qingstor/qingstor.ts","../src/resource/qingstor/config.ts","../src/resource/qingstor/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 qingStorToS3Config,\n redactQingStorConfig,\n type QingStorConfig,\n type QingStorConfigRedacted,\n} from './config.ts'\nimport { QINGSTOR_BROWSER_PROMPT } from './prompt.ts'\n\nexport interface QingStorResourceState {\n type: string\n config: QingStorConfigRedacted\n}\n\nexport class QingStorResource extends S3Resource {\n override readonly kind: string = ResourceName.QINGSTOR\n override readonly prompt: string = QINGSTOR_BROWSER_PROMPT\n readonly qingStorConfig: QingStorConfig\n private readonly qingStorOps: readonly RegisteredOp[]\n private readonly qingStorCommands: readonly RegisteredCommand[]\n\n constructor(config: QingStorConfig) {\n super(qingStorToS3Config(config))\n this.qingStorConfig = config\n this.qingStorOps = remapOpsResource(super.ops(), ResourceName.QINGSTOR)\n this.qingStorCommands = remapCommandsResource(super.commands(), ResourceName.QINGSTOR)\n }\n\n override ops(): readonly RegisteredOp[] {\n return this.qingStorOps\n }\n\n override commands(): readonly RegisteredCommand[] {\n return this.qingStorCommands\n }\n\n override getState(): Promise<QingStorResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactQingStorConfig(this.qingStorConfig),\n })\n }\n\n override loadState(_state: QingStorResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { redactConfigWithSchema, secretSchema, z } from '@struktoai/mirage-core'\nimport type { S3BrowserPresignedUrlProvider, S3Config } from '../s3/config.ts'\n\nexport interface QingStorConfig {\n bucket: string\n presignedUrlProvider: S3BrowserPresignedUrlProvider\n region?: string\n endpoint?: string\n defaultContentType?: string\n keyPrefix?: string\n}\n\nexport interface QingStorConfigRedacted extends Omit<QingStorConfig, 'presignedUrlProvider'> {\n presignedUrlProvider: '<REDACTED>'\n}\n\nconst QingStorConfigSchema = z.object({\n bucket: z.string(),\n presignedUrlProvider: secretSchema(\n z.custom<S3BrowserPresignedUrlProvider>((value) => typeof value === 'function'),\n ),\n region: z.string().optional(),\n endpoint: z.string().optional(),\n defaultContentType: z.string().optional(),\n keyPrefix: z.string().optional(),\n})\n\nexport function resolvedQingStorEndpoint(config: QingStorConfig): string | undefined {\n if (config.endpoint !== undefined && config.endpoint !== '') return config.endpoint\n if (config.region !== undefined && config.region !== '') {\n const region = config.region\n return `https://s3.${region}.qingstor.com`\n }\n return undefined\n}\n\nexport function qingStorToS3Config(config: QingStorConfig): S3Config {\n const endpoint = resolvedQingStorEndpoint(config)\n return {\n bucket: config.bucket,\n presignedUrlProvider: config.presignedUrlProvider,\n ...(config.region !== undefined ? { region: config.region } : {}),\n ...(endpoint !== undefined ? { endpoint } : {}),\n ...(config.defaultContentType !== undefined\n ? { defaultContentType: config.defaultContentType }\n : {}),\n ...(config.keyPrefix !== undefined ? { keyPrefix: config.keyPrefix } : {}),\n }\n}\n\nexport function redactQingStorConfig(config: QingStorConfig): QingStorConfigRedacted {\n return redactConfigWithSchema(QingStorConfigSchema, config) as unknown as QingStorConfigRedacted\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 QINGSTOR_BROWSER_PROMPT = `{prefix}\n Remote QingStor bucket (S3-compatible) accessed via presigned URLs (browser runtime).\n Supports the full filesystem command set: ls/tree/cat/grep/find/du/cp/mv/rm/etc.\n Listing operations require the presigner to sign LIST/COPY operations in\n addition to GET/PUT/HEAD/DELETE — see S3BrowserPresignedUrlProvider docs.`\n"],"mappings":";;;;;AAcA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;;;ACNP,SAAS,wBAAwB,cAAc,SAAS;AAgBxD,IAAM,uBAAuB,EAAE,OAAO;AAAA,EACpC,QAAQ,EAAE,OAAO;AAAA,EACjB,sBAAsB;AAAA,IACpB,EAAE,OAAsC,CAAC,UAAU,OAAO,UAAU,UAAU;AAAA,EAChF;AAAA,EACA,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,EACxC,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAEM,SAAS,yBAAyB,QAA4C;AACnF,MAAI,OAAO,aAAa,UAAa,OAAO,aAAa,GAAI,QAAO,OAAO;AAC3E,MAAI,OAAO,WAAW,UAAa,OAAO,WAAW,IAAI;AACvD,UAAM,SAAS,OAAO;AACtB,WAAO,cAAc,MAAM;AAAA,EAC7B;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,QAAkC;AACnE,QAAM,WAAW,yBAAyB,MAAM;AAChD,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,sBAAsB,OAAO;AAAA,IAC7B,GAAI,OAAO,WAAW,SAAY,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,IAC/D,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,IAC7C,GAAI,OAAO,uBAAuB,SAC9B,EAAE,oBAAoB,OAAO,mBAAmB,IAChD,CAAC;AAAA,IACL,GAAI,OAAO,cAAc,SAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,EAC1E;AACF;AAEO,SAAS,qBAAqB,QAAgD;AACnF,SAAO,uBAAuB,sBAAsB,MAAM;AAC5D;;;ACpDO,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;;;AFqBhC,IAAM,mBAAN,cAA+B,WAAW;AAAA,EAC7B,OAAe,aAAa;AAAA,EAC5B,SAAiB;AAAA,EAC1B;AAAA,EACQ;AAAA,EACA;AAAA,EAEjB,YAAY,QAAwB;AAClC,UAAM,mBAAmB,MAAM,CAAC;AAChC,SAAK,iBAAiB;AACtB,SAAK,cAAc,iBAAiB,MAAM,IAAI,GAAG,aAAa,QAAQ;AACtE,SAAK,mBAAmB,sBAAsB,MAAM,SAAS,GAAG,aAAa,QAAQ;AAAA,EACvF;AAAA,EAES,MAA+B;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAyC;AAChD,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAA2C;AAClD,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,qBAAqB,KAAK,cAAc;AAAA,IAClD,CAAC;AAAA,EACH;AAAA,EAES,UAAU,QAA8C;AAC/D,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  S3Resource
3
- } from "./chunk-XFREXNA2.js";
3
+ } from "./chunk-DC6VA36O.js";
4
4
 
5
5
  // src/resource/scaleway/scaleway.ts
6
6
  import {
@@ -18,7 +18,8 @@ var ScalewayConfigSchema = z.object({
18
18
  ),
19
19
  region: z.string().optional(),
20
20
  endpoint: z.string().optional(),
21
- defaultContentType: z.string().optional()
21
+ defaultContentType: z.string().optional(),
22
+ keyPrefix: z.string().optional()
22
23
  });
23
24
  function resolvedScalewayEndpoint(config) {
24
25
  if (config.endpoint !== void 0 && config.endpoint !== "") return config.endpoint;
@@ -35,7 +36,8 @@ function scalewayToS3Config(config) {
35
36
  presignedUrlProvider: config.presignedUrlProvider,
36
37
  ...config.region !== void 0 ? { region: config.region } : {},
37
38
  ...endpoint !== void 0 ? { endpoint } : {},
38
- ...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {}
39
+ ...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {},
40
+ ...config.keyPrefix !== void 0 ? { keyPrefix: config.keyPrefix } : {}
39
41
  };
40
42
  }
41
43
  function redactScalewayConfig(config) {
@@ -86,4 +88,4 @@ export {
86
88
  SCALEWAY_BROWSER_PROMPT,
87
89
  ScalewayResource
88
90
  };
89
- //# sourceMappingURL=chunk-72GY5B23.js.map
91
+ //# sourceMappingURL=chunk-GENFT46X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/scaleway/scaleway.ts","../src/resource/scaleway/config.ts","../src/resource/scaleway/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 redactScalewayConfig,\n scalewayToS3Config,\n type ScalewayConfig,\n type ScalewayConfigRedacted,\n} from './config.ts'\nimport { SCALEWAY_BROWSER_PROMPT } from './prompt.ts'\n\nexport interface ScalewayResourceState {\n type: string\n config: ScalewayConfigRedacted\n}\n\nexport class ScalewayResource extends S3Resource {\n override readonly kind: string = ResourceName.SCALEWAY\n override readonly prompt: string = SCALEWAY_BROWSER_PROMPT\n readonly scalewayConfig: ScalewayConfig\n private readonly scalewayOps: readonly RegisteredOp[]\n private readonly scalewayCommands: readonly RegisteredCommand[]\n\n constructor(config: ScalewayConfig) {\n super(scalewayToS3Config(config))\n this.scalewayConfig = config\n this.scalewayOps = remapOpsResource(super.ops(), ResourceName.SCALEWAY)\n this.scalewayCommands = remapCommandsResource(super.commands(), ResourceName.SCALEWAY)\n }\n\n override ops(): readonly RegisteredOp[] {\n return this.scalewayOps\n }\n\n override commands(): readonly RegisteredCommand[] {\n return this.scalewayCommands\n }\n\n override getState(): Promise<ScalewayResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactScalewayConfig(this.scalewayConfig),\n })\n }\n\n override loadState(_state: ScalewayResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { redactConfigWithSchema, secretSchema, z } from '@struktoai/mirage-core'\nimport type { S3BrowserPresignedUrlProvider, S3Config } from '../s3/config.ts'\n\nexport interface ScalewayConfig {\n bucket: string\n presignedUrlProvider: S3BrowserPresignedUrlProvider\n region?: string\n endpoint?: string\n defaultContentType?: string\n keyPrefix?: string\n}\n\nexport interface ScalewayConfigRedacted extends Omit<ScalewayConfig, 'presignedUrlProvider'> {\n presignedUrlProvider: '<REDACTED>'\n}\n\nconst ScalewayConfigSchema = z.object({\n bucket: z.string(),\n presignedUrlProvider: secretSchema(\n z.custom<S3BrowserPresignedUrlProvider>((value) => typeof value === 'function'),\n ),\n region: z.string().optional(),\n endpoint: z.string().optional(),\n defaultContentType: z.string().optional(),\n keyPrefix: z.string().optional(),\n})\n\nexport function resolvedScalewayEndpoint(config: ScalewayConfig): string | undefined {\n if (config.endpoint !== undefined && config.endpoint !== '') return config.endpoint\n if (config.region !== undefined && config.region !== '') {\n const region = config.region\n return `https://s3.${region}.scw.cloud`\n }\n return undefined\n}\n\nexport function scalewayToS3Config(config: ScalewayConfig): S3Config {\n const endpoint = resolvedScalewayEndpoint(config)\n return {\n bucket: config.bucket,\n presignedUrlProvider: config.presignedUrlProvider,\n ...(config.region !== undefined ? { region: config.region } : {}),\n ...(endpoint !== undefined ? { endpoint } : {}),\n ...(config.defaultContentType !== undefined\n ? { defaultContentType: config.defaultContentType }\n : {}),\n ...(config.keyPrefix !== undefined ? { keyPrefix: config.keyPrefix } : {}),\n }\n}\n\nexport function redactScalewayConfig(config: ScalewayConfig): ScalewayConfigRedacted {\n return redactConfigWithSchema(ScalewayConfigSchema, config) as unknown as ScalewayConfigRedacted\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 SCALEWAY_BROWSER_PROMPT = `{prefix}\n Remote Scaleway Object Storage bucket (S3-compatible) accessed via presigned URLs (browser runtime).\n Supports the full filesystem command set: ls/tree/cat/grep/find/du/cp/mv/rm/etc.\n Listing operations require the presigner to sign LIST/COPY operations in\n addition to GET/PUT/HEAD/DELETE — see S3BrowserPresignedUrlProvider docs.`\n"],"mappings":";;;;;AAcA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;;;ACNP,SAAS,wBAAwB,cAAc,SAAS;AAgBxD,IAAM,uBAAuB,EAAE,OAAO;AAAA,EACpC,QAAQ,EAAE,OAAO;AAAA,EACjB,sBAAsB;AAAA,IACpB,EAAE,OAAsC,CAAC,UAAU,OAAO,UAAU,UAAU;AAAA,EAChF;AAAA,EACA,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,EACxC,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAEM,SAAS,yBAAyB,QAA4C;AACnF,MAAI,OAAO,aAAa,UAAa,OAAO,aAAa,GAAI,QAAO,OAAO;AAC3E,MAAI,OAAO,WAAW,UAAa,OAAO,WAAW,IAAI;AACvD,UAAM,SAAS,OAAO;AACtB,WAAO,cAAc,MAAM;AAAA,EAC7B;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,QAAkC;AACnE,QAAM,WAAW,yBAAyB,MAAM;AAChD,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,sBAAsB,OAAO;AAAA,IAC7B,GAAI,OAAO,WAAW,SAAY,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,IAC/D,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,IAC7C,GAAI,OAAO,uBAAuB,SAC9B,EAAE,oBAAoB,OAAO,mBAAmB,IAChD,CAAC;AAAA,IACL,GAAI,OAAO,cAAc,SAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,EAC1E;AACF;AAEO,SAAS,qBAAqB,QAAgD;AACnF,SAAO,uBAAuB,sBAAsB,MAAM;AAC5D;;;ACpDO,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;;;AFqBhC,IAAM,mBAAN,cAA+B,WAAW;AAAA,EAC7B,OAAe,aAAa;AAAA,EAC5B,SAAiB;AAAA,EAC1B;AAAA,EACQ;AAAA,EACA;AAAA,EAEjB,YAAY,QAAwB;AAClC,UAAM,mBAAmB,MAAM,CAAC;AAChC,SAAK,iBAAiB;AACtB,SAAK,cAAc,iBAAiB,MAAM,IAAI,GAAG,aAAa,QAAQ;AACtE,SAAK,mBAAmB,sBAAsB,MAAM,SAAS,GAAG,aAAa,QAAQ;AAAA,EACvF;AAAA,EAES,MAA+B;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAyC;AAChD,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAA2C;AAClD,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,qBAAqB,KAAK,cAAc;AAAA,IAClD,CAAC;AAAA,EACH;AAAA,EAES,UAAU,QAA8C;AAC/D,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -1,6 +1,9 @@
1
1
  // src/resource/box/config.ts
2
2
  import { normalizeFields, redactConfigWithSchema, secretStr, z } from "@struktoai/mirage-core";
3
3
  var BoxConfigSchema = z.object({
4
+ endpoint: z.string().optional(),
5
+ rootFolderId: z.string().optional(),
6
+ contentSearch: z.boolean().optional(),
4
7
  clientId: z.string().optional(),
5
8
  clientSecret: secretStr().optional(),
6
9
  refreshToken: secretStr().optional(),
@@ -12,6 +15,8 @@ function redactBoxConfig(config) {
12
15
  function normalizeBoxConfig(input) {
13
16
  return normalizeFields(input, {
14
17
  rename: {
18
+ root_folder_id: "rootFolderId",
19
+ content_search: "contentSearch",
15
20
  client_id: "clientId",
16
21
  client_secret: "clientSecret",
17
22
  refresh_token: "refreshToken",
@@ -22,8 +27,7 @@ function normalizeBoxConfig(input) {
22
27
  }
23
28
 
24
29
  export {
25
- BoxConfigSchema,
26
30
  redactBoxConfig,
27
31
  normalizeBoxConfig
28
32
  };
29
- //# sourceMappingURL=chunk-J54OBIJA.js.map
33
+ //# sourceMappingURL=chunk-GQVJTQXU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/box/config.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { normalizeFields, redactConfigWithSchema, secretStr, z } from '@struktoai/mirage-core'\n\nexport interface BoxConfig {\n // API origin override (e.g. an integ fake). Defaults to api.box.com.\n endpoint?: string\n // Box folder id to mount as the workspace root instead of the account\n // root (\"0\"). Folder ids are stable across renames/moves and visible in\n // the Box web URL (box.com/folder/<id>), so a subfolder mount survives\n // reorganization that a path prefix would not.\n rootFolderId?: string\n // Opt in to grep/rg content-search push-down: route recursive literal\n // scans through Box search to narrow the file set before scanning locally.\n // Off by default because Box's search index lags recent writes.\n contentSearch?: boolean\n clientId?: string\n clientSecret?: string\n refreshToken?: string\n accessToken?: string\n refreshFn?: (\n refreshToken: string,\n ) => Promise<{ accessToken: string; refreshToken: string; expiresIn: number }>\n onRefreshTokenRotated?: (newRefreshToken: string) => void | Promise<void>\n}\n\nexport interface BoxConfigRedacted {\n endpoint?: string\n rootFolderId?: string\n clientId?: string\n clientSecret?: '<REDACTED>'\n refreshToken?: '<REDACTED>'\n accessToken?: '<REDACTED>'\n}\n\nconst BoxConfigSchema = z.object({\n endpoint: z.string().optional(),\n rootFolderId: z.string().optional(),\n contentSearch: z.boolean().optional(),\n clientId: z.string().optional(),\n clientSecret: secretStr().optional(),\n refreshToken: secretStr().optional(),\n accessToken: secretStr().optional(),\n})\n\nexport function redactBoxConfig(config: BoxConfig): BoxConfigRedacted {\n return redactConfigWithSchema(BoxConfigSchema, config) as unknown as BoxConfigRedacted\n}\n\nexport function normalizeBoxConfig(input: Record<string, unknown>): BoxConfig {\n return normalizeFields(input, {\n rename: {\n root_folder_id: 'rootFolderId',\n content_search: 'contentSearch',\n client_id: 'clientId',\n client_secret: 'clientSecret',\n refresh_token: 'refreshToken',\n access_token: 'accessToken',\n developer_token: 'accessToken',\n },\n }) as unknown as BoxConfig\n}\n"],"mappings":";AAcA,SAAS,iBAAiB,wBAAwB,WAAW,SAAS;AAiCtE,IAAM,kBAAkB,EAAE,OAAO;AAAA,EAC/B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,eAAe,EAAE,QAAQ,EAAE,SAAS;AAAA,EACpC,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,cAAc,UAAU,EAAE,SAAS;AAAA,EACnC,cAAc,UAAU,EAAE,SAAS;AAAA,EACnC,aAAa,UAAU,EAAE,SAAS;AACpC,CAAC;AAEM,SAAS,gBAAgB,QAAsC;AACpE,SAAO,uBAAuB,iBAAiB,MAAM;AACvD;AAEO,SAAS,mBAAmB,OAA2C;AAC5E,SAAO,gBAAgB,OAAO;AAAA,IAC5B,QAAQ;AAAA,MACN,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,WAAW;AAAA,MACX,eAAe;AAAA,MACf,eAAe;AAAA,MACf,cAAc;AAAA,MACd,iBAAiB;AAAA,IACnB;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  S3Resource
3
- } from "./chunk-XFREXNA2.js";
3
+ } from "./chunk-DC6VA36O.js";
4
4
 
5
5
  // src/resource/ceph/ceph.ts
6
6
  import {
@@ -18,7 +18,8 @@ var CephConfigSchema = z.object({
18
18
  ),
19
19
  endpoint: z.string().optional(),
20
20
  region: z.string().optional(),
21
- defaultContentType: z.string().optional()
21
+ defaultContentType: z.string().optional(),
22
+ keyPrefix: z.string().optional()
22
23
  });
23
24
  function cephToS3Config(config) {
24
25
  return {
@@ -26,7 +27,8 @@ function cephToS3Config(config) {
26
27
  presignedUrlProvider: config.presignedUrlProvider,
27
28
  ...config.region !== void 0 ? { region: config.region } : {},
28
29
  ...config.endpoint !== void 0 ? { endpoint: config.endpoint } : {},
29
- ...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {}
30
+ ...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {},
31
+ ...config.keyPrefix !== void 0 ? { keyPrefix: config.keyPrefix } : {}
30
32
  };
31
33
  }
32
34
  function redactCephConfig(config) {
@@ -76,4 +78,4 @@ export {
76
78
  CEPH_BROWSER_PROMPT,
77
79
  CephResource
78
80
  };
79
- //# sourceMappingURL=chunk-RJ5FBBL6.js.map
81
+ //# sourceMappingURL=chunk-GZFNGV55.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/ceph/ceph.ts","../src/resource/ceph/config.ts","../src/resource/ceph/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 cephToS3Config,\n redactCephConfig,\n type CephConfig,\n type CephConfigRedacted,\n} from './config.ts'\nimport { CEPH_BROWSER_PROMPT } from './prompt.ts'\n\nexport interface CephResourceState {\n type: string\n config: CephConfigRedacted\n}\n\nexport class CephResource extends S3Resource {\n override readonly kind: string = ResourceName.CEPH\n override readonly prompt: string = CEPH_BROWSER_PROMPT\n readonly cephConfig: CephConfig\n private readonly cephOps: readonly RegisteredOp[]\n private readonly cephCommands: readonly RegisteredCommand[]\n\n constructor(config: CephConfig) {\n super(cephToS3Config(config))\n this.cephConfig = config\n this.cephOps = remapOpsResource(super.ops(), ResourceName.CEPH)\n this.cephCommands = remapCommandsResource(super.commands(), ResourceName.CEPH)\n }\n\n override ops(): readonly RegisteredOp[] {\n return this.cephOps\n }\n\n override commands(): readonly RegisteredCommand[] {\n return this.cephCommands\n }\n\n override getState(): Promise<CephResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactCephConfig(this.cephConfig),\n })\n }\n\n override loadState(_state: CephResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { redactConfigWithSchema, secretSchema, z } from '@struktoai/mirage-core'\nimport type { S3BrowserPresignedUrlProvider, S3Config } from '../s3/config.ts'\n\nexport interface CephConfig {\n bucket: string\n presignedUrlProvider: S3BrowserPresignedUrlProvider\n endpoint?: string\n region?: string\n defaultContentType?: string\n keyPrefix?: string\n}\n\nexport interface CephConfigRedacted extends Omit<CephConfig, 'presignedUrlProvider'> {\n presignedUrlProvider: '<REDACTED>'\n}\n\nconst CephConfigSchema = z.object({\n bucket: z.string(),\n presignedUrlProvider: secretSchema(\n z.custom<S3BrowserPresignedUrlProvider>((value) => typeof value === 'function'),\n ),\n endpoint: z.string().optional(),\n region: z.string().optional(),\n defaultContentType: z.string().optional(),\n keyPrefix: z.string().optional(),\n})\n\nexport function cephToS3Config(config: CephConfig): S3Config {\n return {\n bucket: config.bucket,\n presignedUrlProvider: config.presignedUrlProvider,\n ...(config.region !== undefined ? { region: config.region } : {}),\n ...(config.endpoint !== undefined ? { endpoint: config.endpoint } : {}),\n ...(config.defaultContentType !== undefined\n ? { defaultContentType: config.defaultContentType }\n : {}),\n ...(config.keyPrefix !== undefined ? { keyPrefix: config.keyPrefix } : {}),\n }\n}\n\nexport function redactCephConfig(config: CephConfig): CephConfigRedacted {\n return redactConfigWithSchema(CephConfigSchema, config) as unknown as CephConfigRedacted\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 CEPH_BROWSER_PROMPT = `{prefix}\n Remote Ceph Rados Gateway bucket (S3-compatible) accessed via presigned URLs (browser runtime).\n Supports the full filesystem command set: ls/tree/cat/grep/find/du/cp/mv/rm/etc.\n Listing operations require the presigner to sign LIST/COPY operations in\n addition to GET/PUT/HEAD/DELETE — see S3BrowserPresignedUrlProvider docs.`\n"],"mappings":";;;;;AAcA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;;;ACNP,SAAS,wBAAwB,cAAc,SAAS;AAgBxD,IAAM,mBAAmB,EAAE,OAAO;AAAA,EAChC,QAAQ,EAAE,OAAO;AAAA,EACjB,sBAAsB;AAAA,IACpB,EAAE,OAAsC,CAAC,UAAU,OAAO,UAAU,UAAU;AAAA,EAChF;AAAA,EACA,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,EACxC,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAEM,SAAS,eAAe,QAA8B;AAC3D,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,sBAAsB,OAAO;AAAA,IAC7B,GAAI,OAAO,WAAW,SAAY,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,IAC/D,GAAI,OAAO,aAAa,SAAY,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,IACrE,GAAI,OAAO,uBAAuB,SAC9B,EAAE,oBAAoB,OAAO,mBAAmB,IAChD,CAAC;AAAA,IACL,GAAI,OAAO,cAAc,SAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,EAC1E;AACF;AAEO,SAAS,iBAAiB,QAAwC;AACvE,SAAO,uBAAuB,kBAAkB,MAAM;AACxD;;;AC1CO,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;;;AFqB5B,IAAM,eAAN,cAA2B,WAAW;AAAA,EACzB,OAAe,aAAa;AAAA,EAC5B,SAAiB;AAAA,EAC1B;AAAA,EACQ;AAAA,EACA;AAAA,EAEjB,YAAY,QAAoB;AAC9B,UAAM,eAAe,MAAM,CAAC;AAC5B,SAAK,aAAa;AAClB,SAAK,UAAU,iBAAiB,MAAM,IAAI,GAAG,aAAa,IAAI;AAC9D,SAAK,eAAe,sBAAsB,MAAM,SAAS,GAAG,aAAa,IAAI;AAAA,EAC/E;AAAA,EAES,MAA+B;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAyC;AAChD,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAuC;AAC9C,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,iBAAiB,KAAK,UAAU;AAAA,IAC1C,CAAC;AAAA,EACH;AAAA,EAES,UAAU,QAA0C;AAC3D,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -1,13 +1,14 @@
1
1
  import {
2
2
  redactGoogleConfig
3
- } from "./chunk-54NTYJEO.js";
3
+ } from "./chunk-LPDLPRPS.js";
4
4
 
5
5
  // src/resource/gmail/gmail.ts
6
+ import { mountKey, mountPrefixOf } from "@struktoai/mirage-core";
6
7
  import {
7
8
  GMAIL_COMMANDS,
8
9
  GMAIL_PROMPT,
9
10
  GMAIL_WRITE_PROMPT,
10
- GMAIL_VFS_OPS,
11
+ GMAIL_OPS,
11
12
  GmailAccessor,
12
13
  PathSpec,
13
14
  RAMIndexCacheStore,
@@ -15,12 +16,13 @@ import {
15
16
  TokenManager,
16
17
  gmailRead,
17
18
  gmailReaddir,
18
- gmailResolveGlob,
19
+ makeResolveGlob,
19
20
  gmailStat
20
21
  } from "@struktoai/mirage-core";
22
+ var gmailResolveGlob = makeResolveGlob(gmailReaddir);
21
23
  var GmailResource = class {
22
24
  kind = ResourceName.GMAIL;
23
- isRemote = true;
25
+ cachesReads = true;
24
26
  indexTtl = 86400;
25
27
  prompt = GMAIL_PROMPT;
26
28
  writePrompt = GMAIL_WRITE_PROMPT;
@@ -43,7 +45,7 @@ var GmailResource = class {
43
45
  return GMAIL_COMMANDS;
44
46
  }
45
47
  ops() {
46
- return GMAIL_VFS_OPS;
48
+ return GMAIL_OPS;
47
49
  }
48
50
  readFile(p) {
49
51
  return gmailRead(this.accessor, p, this.index);
@@ -54,18 +56,14 @@ var GmailResource = class {
54
56
  stat(p) {
55
57
  return gmailStat(this.accessor, p, this.index);
56
58
  }
57
- async fingerprint(p) {
58
- const lookup = await this.index.get(p.original);
59
- return lookup.entry?.remoteTime ?? null;
60
- }
61
59
  glob(paths, prefix = "") {
62
60
  const effective = prefix !== "" ? paths.map(
63
- (p) => p.prefix !== "" ? p : new PathSpec({
64
- original: p.original,
61
+ (p) => mountPrefixOf(p.virtual, p.resourcePath) !== "" ? p : new PathSpec({
62
+ virtual: p.virtual,
65
63
  directory: p.directory,
66
64
  ...p.pattern !== null ? { pattern: p.pattern } : {},
67
65
  resolved: p.resolved,
68
- prefix
66
+ resourcePath: mountKey(p.virtual, prefix)
69
67
  })
70
68
  ) : paths;
71
69
  return gmailResolveGlob(this.accessor, effective, this.index);
@@ -84,4 +82,4 @@ var GmailResource = class {
84
82
  export {
85
83
  GmailResource
86
84
  };
87
- //# sourceMappingURL=chunk-RD7ED27I.js.map
85
+ //# sourceMappingURL=chunk-HPID7BWJ.js.map