@struktoai/mirage-browser 0.0.3 → 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 (241) hide show
  1. package/dist/aliyun-YEWHEWCL.js +8 -0
  2. package/dist/backblaze-LWE2HEDK.js +8 -0
  3. package/dist/box-GTWWIB6F.js +8 -0
  4. package/dist/ceph-ATSCSVGU.js +8 -0
  5. package/dist/{chunk-YGRKFONX.js → chunk-23NO22WD.js} +1 -2
  6. package/dist/{chunk-YGRKFONX.js.map → chunk-23NO22WD.js.map} +1 -1
  7. package/dist/{chunk-OSMEXGRN.js → chunk-2R7SPBTM.js} +10 -12
  8. package/dist/chunk-2R7SPBTM.js.map +1 -0
  9. package/dist/{chunk-SOF74I3T.js → chunk-37WKCB2E.js} +7 -5
  10. package/dist/chunk-37WKCB2E.js.map +1 -0
  11. package/dist/{chunk-NLBT6TBM.js → chunk-3FZ3GHZO.js} +6 -4
  12. package/dist/chunk-3FZ3GHZO.js.map +1 -0
  13. package/dist/{chunk-KV2DM5H6.js → chunk-4YUYQTRN.js} +616 -398
  14. package/dist/chunk-4YUYQTRN.js.map +1 -0
  15. package/dist/{chunk-KNJKYCTA.js → chunk-5ZNWDS5I.js} +9 -11
  16. package/dist/chunk-5ZNWDS5I.js.map +1 -0
  17. package/dist/{chunk-PV53AX35.js → chunk-6BXVYCIC.js} +9 -11
  18. package/dist/chunk-6BXVYCIC.js.map +1 -0
  19. package/dist/{chunk-BJHHL4UT.js → chunk-6ETIHSTA.js} +9 -10
  20. package/dist/chunk-6ETIHSTA.js.map +1 -0
  21. package/dist/{chunk-XBOJZZRT.js → chunk-AAJQ6AQT.js} +10 -12
  22. package/dist/chunk-AAJQ6AQT.js.map +1 -0
  23. package/dist/{chunk-DHZMC42C.js → chunk-AUKVYHNZ.js} +6 -4
  24. package/dist/chunk-AUKVYHNZ.js.map +1 -0
  25. package/dist/{chunk-DA5EW34P.js → chunk-AUXZEXCG.js} +11 -11
  26. package/dist/chunk-AUXZEXCG.js.map +1 -0
  27. package/dist/{chunk-2AEAISO2.js → chunk-CQERQTAZ.js} +16 -13
  28. package/dist/chunk-CQERQTAZ.js.map +1 -0
  29. package/dist/{chunk-RQ273N5K.js → chunk-DC6VA36O.js} +8 -15
  30. package/dist/chunk-DC6VA36O.js.map +1 -0
  31. package/dist/{chunk-HYUESAQS.js → chunk-DGP3N4WM.js} +1 -2
  32. package/dist/{chunk-HYUESAQS.js.map → chunk-DGP3N4WM.js.map} +1 -1
  33. package/dist/{chunk-ROHDW6KT.js → chunk-DKPDXQML.js} +6 -4
  34. package/dist/chunk-DKPDXQML.js.map +1 -0
  35. package/dist/{chunk-2H4KUUFP.js → chunk-DQK6H5LW.js} +1 -2
  36. package/dist/{chunk-2H4KUUFP.js.map → chunk-DQK6H5LW.js.map} +1 -1
  37. package/dist/{chunk-KTE5PB2D.js → chunk-E77ESWWV.js} +12 -12
  38. package/dist/chunk-E77ESWWV.js.map +1 -0
  39. package/dist/{chunk-F5QWZ7GM.js → chunk-EDS5Q5B7.js} +6 -4
  40. package/dist/chunk-EDS5Q5B7.js.map +1 -0
  41. package/dist/{chunk-K2S42IR4.js → chunk-EHTYPBGX.js} +6 -4
  42. package/dist/chunk-EHTYPBGX.js.map +1 -0
  43. package/dist/{chunk-DVXOMWD4.js → chunk-GENFT46X.js} +6 -4
  44. package/dist/chunk-GENFT46X.js.map +1 -0
  45. package/dist/{chunk-J54OBIJA.js → chunk-GQVJTQXU.js} +6 -2
  46. package/dist/chunk-GQVJTQXU.js.map +1 -0
  47. package/dist/{chunk-J7PLA5S3.js → chunk-GZFNGV55.js} +6 -4
  48. package/dist/chunk-GZFNGV55.js.map +1 -0
  49. package/dist/{chunk-DFHFILVF.js → chunk-HPID7BWJ.js} +10 -12
  50. package/dist/chunk-HPID7BWJ.js.map +1 -0
  51. package/dist/{chunk-57QQAM7V.js → chunk-HTQ4GBKM.js} +6 -4
  52. package/dist/chunk-HTQ4GBKM.js.map +1 -0
  53. package/dist/{chunk-NWZNQ3RC.js → chunk-JV4T5HNB.js} +6 -4
  54. package/dist/chunk-JV4T5HNB.js.map +1 -0
  55. package/dist/{chunk-BIIG7ZAQ.js → chunk-KL2VFYUV.js} +7 -5
  56. package/dist/chunk-KL2VFYUV.js.map +1 -0
  57. package/dist/{chunk-54NTYJEO.js → chunk-LPDLPRPS.js} +1 -3
  58. package/dist/{chunk-54NTYJEO.js.map → chunk-LPDLPRPS.js.map} +1 -1
  59. package/dist/{chunk-CGZGX2GO.js → chunk-LW56WZDS.js} +10 -12
  60. package/dist/chunk-LW56WZDS.js.map +1 -0
  61. package/dist/{chunk-QLLRQNOJ.js → chunk-MB4TUUJQ.js} +6 -4
  62. package/dist/chunk-MB4TUUJQ.js.map +1 -0
  63. package/dist/{chunk-O5ONB7QT.js → chunk-MQMUOJZ2.js} +8 -4
  64. package/dist/chunk-MQMUOJZ2.js.map +1 -0
  65. package/dist/{chunk-4NLXLDMV.js → chunk-N5VRBFRT.js} +10 -12
  66. package/dist/chunk-N5VRBFRT.js.map +1 -0
  67. package/dist/{chunk-LSURHXZH.js → chunk-NVGB3B7J.js} +6 -4
  68. package/dist/chunk-NVGB3B7J.js.map +1 -0
  69. package/dist/{chunk-HXQ7HDA6.js → chunk-NYTRDAWX.js} +16 -13
  70. package/dist/chunk-NYTRDAWX.js.map +1 -0
  71. package/dist/{chunk-CNDGXKMU.js → chunk-PCC6EZIE.js} +6 -4
  72. package/dist/chunk-PCC6EZIE.js.map +1 -0
  73. package/dist/{chunk-TQ6VRUEI.js → chunk-PDZSZ5CB.js} +9 -11
  74. package/dist/chunk-PDZSZ5CB.js.map +1 -0
  75. package/dist/{chunk-XYKNXGPR.js → chunk-POJ3IQMQ.js} +13 -13
  76. package/dist/chunk-POJ3IQMQ.js.map +1 -0
  77. package/dist/{chunk-X2CCEHOR.js → chunk-PSEXJ5S5.js} +12 -11
  78. package/dist/chunk-PSEXJ5S5.js.map +1 -0
  79. package/dist/{chunk-NMZBJOFW.js → chunk-QXJP6TWI.js} +5 -4
  80. package/dist/chunk-QXJP6TWI.js.map +1 -0
  81. package/dist/{chunk-6YP3B7UK.js → chunk-TCFD6YJ5.js} +6 -4
  82. package/dist/chunk-TCFD6YJ5.js.map +1 -0
  83. package/dist/{chunk-G26SGOFR.js → chunk-VASFK7V6.js} +6 -4
  84. package/dist/chunk-VASFK7V6.js.map +1 -0
  85. package/dist/{chunk-JSAQMYPK.js → chunk-ZLHC2CZ6.js} +1 -2
  86. package/dist/{chunk-JSAQMYPK.js.map → chunk-ZLHC2CZ6.js.map} +1 -1
  87. package/dist/config-22T7HJBJ.js +9 -0
  88. package/dist/config-A56HUM6C.js +9 -0
  89. package/dist/config-DIWQZBOK.js +9 -0
  90. package/dist/config-HGJ2MGAC.js +9 -0
  91. package/dist/{config-ET26F632.js → config-MHBKYS53.js} +2 -4
  92. package/dist/config-PAHALM2T.js +9 -0
  93. package/dist/config-PWZXYJOI.js +9 -0
  94. package/dist/{config-NV5WXP64.js → config-UU27ALAA.js} +2 -4
  95. package/dist/digitalocean-SQA6MJJQ.js +8 -0
  96. package/dist/discord-ASNFJP6A.js +7 -0
  97. package/dist/dropbox-VV2WZE6I.js +8 -0
  98. package/dist/gcs-2W6DDWM7.js +8 -0
  99. package/dist/gdocs-QPM7VXXE.js +8 -0
  100. package/dist/gdrive-KT6R7EVB.js +8 -0
  101. package/dist/github-3IFZGW6I.js +7 -0
  102. package/dist/github_ci-CKKF2Y4S.js +8 -0
  103. package/dist/gmail-HLZIMKQU.js +8 -0
  104. package/dist/gsheets-HF4YPIEF.js +8 -0
  105. package/dist/gslides-EV2JJH7I.js +8 -0
  106. package/dist/index.d.ts +28 -16
  107. package/dist/index.js +82 -82
  108. package/dist/langfuse-74ZCR6QL.js +7 -0
  109. package/dist/linear-XABGTU6E.js +7 -0
  110. package/dist/minio-JPNSX2NP.js +8 -0
  111. package/dist/mongodb-YZP643ZU.js +7 -0
  112. package/dist/notion-YJOTGH7J.js +7 -0
  113. package/dist/oci-R4VYQKGJ.js +8 -0
  114. package/dist/opfs-4RWMJBCI.js +7 -0
  115. package/dist/postgres-HPOMN2AR.js +7 -0
  116. package/dist/qingstor-ZWWK2ZGV.js +8 -0
  117. package/dist/r2-PZAN2YFG.js +8 -0
  118. package/dist/{s3-GI7SDKGR.js → s3-CSFY3PLT.js} +2 -2
  119. package/dist/scaleway-BFROPDBB.js +8 -0
  120. package/dist/seaweedfs-X6THZT26.js +8 -0
  121. package/dist/slack-O7BTJ4YR.js +7 -0
  122. package/dist/supabase-PHN3MIXW.js +8 -0
  123. package/dist/tencent-JGCJEKHV.js +8 -0
  124. package/dist/trello-QUDOP3M2.js +7 -0
  125. package/dist/wasabi-5VMNAFOC.js +8 -0
  126. package/package.json +2 -3
  127. package/dist/aliyun-GMNRT7BJ.js +0 -8
  128. package/dist/backblaze-O6CLR73B.js +0 -8
  129. package/dist/box-GXWDWZRN.js +0 -8
  130. package/dist/ceph-SM7MXDAY.js +0 -8
  131. package/dist/chunk-2AEAISO2.js.map +0 -1
  132. package/dist/chunk-4NLXLDMV.js.map +0 -1
  133. package/dist/chunk-57QQAM7V.js.map +0 -1
  134. package/dist/chunk-6YP3B7UK.js.map +0 -1
  135. package/dist/chunk-BIIG7ZAQ.js.map +0 -1
  136. package/dist/chunk-BJHHL4UT.js.map +0 -1
  137. package/dist/chunk-CGZGX2GO.js.map +0 -1
  138. package/dist/chunk-CNDGXKMU.js.map +0 -1
  139. package/dist/chunk-DA5EW34P.js.map +0 -1
  140. package/dist/chunk-DFHFILVF.js.map +0 -1
  141. package/dist/chunk-DHZMC42C.js.map +0 -1
  142. package/dist/chunk-DVXOMWD4.js.map +0 -1
  143. package/dist/chunk-F5QWZ7GM.js.map +0 -1
  144. package/dist/chunk-G26SGOFR.js.map +0 -1
  145. package/dist/chunk-HXQ7HDA6.js.map +0 -1
  146. package/dist/chunk-J54OBIJA.js.map +0 -1
  147. package/dist/chunk-J7PLA5S3.js.map +0 -1
  148. package/dist/chunk-K2S42IR4.js.map +0 -1
  149. package/dist/chunk-KNJKYCTA.js.map +0 -1
  150. package/dist/chunk-KTE5PB2D.js.map +0 -1
  151. package/dist/chunk-KV2DM5H6.js.map +0 -1
  152. package/dist/chunk-LSURHXZH.js.map +0 -1
  153. package/dist/chunk-NLBT6TBM.js.map +0 -1
  154. package/dist/chunk-NMZBJOFW.js.map +0 -1
  155. package/dist/chunk-NWZNQ3RC.js.map +0 -1
  156. package/dist/chunk-O5ONB7QT.js.map +0 -1
  157. package/dist/chunk-OSMEXGRN.js.map +0 -1
  158. package/dist/chunk-PV53AX35.js.map +0 -1
  159. package/dist/chunk-QLLRQNOJ.js.map +0 -1
  160. package/dist/chunk-ROHDW6KT.js.map +0 -1
  161. package/dist/chunk-RQ273N5K.js.map +0 -1
  162. package/dist/chunk-SOF74I3T.js.map +0 -1
  163. package/dist/chunk-TQ6VRUEI.js.map +0 -1
  164. package/dist/chunk-X2CCEHOR.js.map +0 -1
  165. package/dist/chunk-XBOJZZRT.js.map +0 -1
  166. package/dist/chunk-XYKNXGPR.js.map +0 -1
  167. package/dist/config-7IZCGWKX.js +0 -11
  168. package/dist/config-AT74FARJ.js +0 -11
  169. package/dist/config-C2AYHACT.js +0 -11
  170. package/dist/config-GHJOYNM6.js +0 -11
  171. package/dist/config-L55UXIF4.js +0 -11
  172. package/dist/config-V7BLK5WP.js +0 -11
  173. package/dist/digitalocean-XFH2V2A3.js +0 -8
  174. package/dist/discord-OQMSHM3L.js +0 -7
  175. package/dist/dropbox-IAOKM7G5.js +0 -8
  176. package/dist/gcs-JYZB6CVP.js +0 -8
  177. package/dist/gdocs-PHKQGLZL.js +0 -8
  178. package/dist/gdrive-4JQLGOOP.js +0 -8
  179. package/dist/github-DU7Z4RSU.js +0 -7
  180. package/dist/github_ci-XSAJDNXC.js +0 -8
  181. package/dist/gmail-DEQP2M7T.js +0 -8
  182. package/dist/gsheets-KCIHSMOK.js +0 -8
  183. package/dist/gslides-2KBUKKM5.js +0 -8
  184. package/dist/langfuse-FNCMKFSL.js +0 -7
  185. package/dist/linear-XTFO4WKD.js +0 -7
  186. package/dist/minio-NGPBAJY3.js +0 -8
  187. package/dist/mongodb-PGOX6QSY.js +0 -7
  188. package/dist/notion-HYYNQ7KI.js +0 -7
  189. package/dist/oci-EGDBSMLM.js +0 -8
  190. package/dist/opfs-5WGXB5OG.js +0 -7
  191. package/dist/postgres-5HYED4AC.js +0 -7
  192. package/dist/qingstor-2T4Y6MEG.js +0 -8
  193. package/dist/r2-3B45S2KV.js +0 -8
  194. package/dist/scaleway-ICCXVAY6.js +0 -8
  195. package/dist/seaweedfs-MF77EC33.js +0 -8
  196. package/dist/slack-6LGQERIU.js +0 -7
  197. package/dist/supabase-XTOVMHXU.js +0 -8
  198. package/dist/tencent-FXFKSOTN.js +0 -8
  199. package/dist/trello-DZK4NEVY.js +0 -7
  200. package/dist/wasabi-KVE2B6RB.js +0 -8
  201. /package/dist/{aliyun-GMNRT7BJ.js.map → aliyun-YEWHEWCL.js.map} +0 -0
  202. /package/dist/{backblaze-O6CLR73B.js.map → backblaze-LWE2HEDK.js.map} +0 -0
  203. /package/dist/{box-GXWDWZRN.js.map → box-GTWWIB6F.js.map} +0 -0
  204. /package/dist/{ceph-SM7MXDAY.js.map → ceph-ATSCSVGU.js.map} +0 -0
  205. /package/dist/{config-7IZCGWKX.js.map → config-22T7HJBJ.js.map} +0 -0
  206. /package/dist/{config-AT74FARJ.js.map → config-A56HUM6C.js.map} +0 -0
  207. /package/dist/{config-C2AYHACT.js.map → config-DIWQZBOK.js.map} +0 -0
  208. /package/dist/{config-ET26F632.js.map → config-HGJ2MGAC.js.map} +0 -0
  209. /package/dist/{config-GHJOYNM6.js.map → config-MHBKYS53.js.map} +0 -0
  210. /package/dist/{config-L55UXIF4.js.map → config-PAHALM2T.js.map} +0 -0
  211. /package/dist/{config-NV5WXP64.js.map → config-PWZXYJOI.js.map} +0 -0
  212. /package/dist/{config-V7BLK5WP.js.map → config-UU27ALAA.js.map} +0 -0
  213. /package/dist/{digitalocean-XFH2V2A3.js.map → digitalocean-SQA6MJJQ.js.map} +0 -0
  214. /package/dist/{discord-OQMSHM3L.js.map → discord-ASNFJP6A.js.map} +0 -0
  215. /package/dist/{dropbox-IAOKM7G5.js.map → dropbox-VV2WZE6I.js.map} +0 -0
  216. /package/dist/{gcs-JYZB6CVP.js.map → gcs-2W6DDWM7.js.map} +0 -0
  217. /package/dist/{gdocs-PHKQGLZL.js.map → gdocs-QPM7VXXE.js.map} +0 -0
  218. /package/dist/{gdrive-4JQLGOOP.js.map → gdrive-KT6R7EVB.js.map} +0 -0
  219. /package/dist/{github-DU7Z4RSU.js.map → github-3IFZGW6I.js.map} +0 -0
  220. /package/dist/{github_ci-XSAJDNXC.js.map → github_ci-CKKF2Y4S.js.map} +0 -0
  221. /package/dist/{gmail-DEQP2M7T.js.map → gmail-HLZIMKQU.js.map} +0 -0
  222. /package/dist/{gsheets-KCIHSMOK.js.map → gsheets-HF4YPIEF.js.map} +0 -0
  223. /package/dist/{gslides-2KBUKKM5.js.map → gslides-EV2JJH7I.js.map} +0 -0
  224. /package/dist/{langfuse-FNCMKFSL.js.map → langfuse-74ZCR6QL.js.map} +0 -0
  225. /package/dist/{linear-XTFO4WKD.js.map → linear-XABGTU6E.js.map} +0 -0
  226. /package/dist/{minio-NGPBAJY3.js.map → minio-JPNSX2NP.js.map} +0 -0
  227. /package/dist/{mongodb-PGOX6QSY.js.map → mongodb-YZP643ZU.js.map} +0 -0
  228. /package/dist/{notion-HYYNQ7KI.js.map → notion-YJOTGH7J.js.map} +0 -0
  229. /package/dist/{oci-EGDBSMLM.js.map → oci-R4VYQKGJ.js.map} +0 -0
  230. /package/dist/{opfs-5WGXB5OG.js.map → opfs-4RWMJBCI.js.map} +0 -0
  231. /package/dist/{postgres-5HYED4AC.js.map → postgres-HPOMN2AR.js.map} +0 -0
  232. /package/dist/{qingstor-2T4Y6MEG.js.map → qingstor-ZWWK2ZGV.js.map} +0 -0
  233. /package/dist/{r2-3B45S2KV.js.map → r2-PZAN2YFG.js.map} +0 -0
  234. /package/dist/{s3-GI7SDKGR.js.map → s3-CSFY3PLT.js.map} +0 -0
  235. /package/dist/{scaleway-ICCXVAY6.js.map → scaleway-BFROPDBB.js.map} +0 -0
  236. /package/dist/{seaweedfs-MF77EC33.js.map → seaweedfs-X6THZT26.js.map} +0 -0
  237. /package/dist/{slack-6LGQERIU.js.map → slack-O7BTJ4YR.js.map} +0 -0
  238. /package/dist/{supabase-XTOVMHXU.js.map → supabase-PHN3MIXW.js.map} +0 -0
  239. /package/dist/{tencent-FXFKSOTN.js.map → tencent-JGCJEKHV.js.map} +0 -0
  240. /package/dist/{trello-DZK4NEVY.js.map → trello-QUDOP3M2.js.map} +0 -0
  241. /package/dist/{wasabi-KVE2B6RB.js.map → wasabi-5VMNAFOC.js.map} +0 -0
@@ -1,13 +1,14 @@
1
1
  // src/resource/slack/slack.ts
2
+ import { mountKey, mountPrefixOf } from "@struktoai/mirage-core";
2
3
  import {
3
4
  BrowserSlackTransport,
4
5
  PathSpec,
5
6
  RAMIndexCacheStore,
6
7
  ResourceName,
7
- resolveSlackGlob,
8
+ makeResolveGlob,
8
9
  SLACK_COMMANDS,
9
10
  SLACK_PROMPT,
10
- SLACK_VFS_OPS,
11
+ SLACK_OPS,
11
12
  SLACK_WRITE_PROMPT,
12
13
  SlackAccessor,
13
14
  slackRead,
@@ -28,6 +29,7 @@ function redactSlackConfig(config) {
28
29
  }
29
30
 
30
31
  // src/resource/slack/slack.ts
32
+ var resolveSlackGlob = makeResolveGlob(slackReaddir);
31
33
  var SlackResource = class {
32
34
  kind = ResourceName.SLACK;
33
35
  cachesReads = true;
@@ -57,7 +59,7 @@ var SlackResource = class {
57
59
  return SLACK_COMMANDS;
58
60
  }
59
61
  ops() {
60
- return SLACK_VFS_OPS;
62
+ return SLACK_OPS;
61
63
  }
62
64
  readFile(p) {
63
65
  return slackRead(this.accessor, p, this.index);
@@ -68,18 +70,14 @@ var SlackResource = class {
68
70
  stat(p) {
69
71
  return slackStat(this.accessor, p, this.index);
70
72
  }
71
- async fingerprint(p) {
72
- const lookup = await this.index.get(p.original);
73
- return lookup.entry?.remoteTime ?? null;
74
- }
75
73
  glob(paths, prefix = "") {
76
74
  const effective = prefix !== "" ? paths.map(
77
- (p) => p.prefix !== "" ? p : new PathSpec({
78
- original: p.original,
75
+ (p) => mountPrefixOf(p.virtual, p.resourcePath) !== "" ? p : new PathSpec({
76
+ virtual: p.virtual,
79
77
  directory: p.directory,
80
78
  ...p.pattern !== null ? { pattern: p.pattern } : {},
81
79
  resolved: p.resolved,
82
- prefix
80
+ resourcePath: mountKey(p.virtual, prefix)
83
81
  })
84
82
  ) : paths;
85
83
  return resolveSlackGlob(this.accessor, effective, this.index);
@@ -99,4 +97,4 @@ export {
99
97
  redactSlackConfig,
100
98
  SlackResource
101
99
  };
102
- //# sourceMappingURL=chunk-KNJKYCTA.js.map
100
+ //# sourceMappingURL=chunk-5ZNWDS5I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/slack/slack.ts","../src/resource/slack/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 BrowserSlackTransport,\n type FileStat,\n type IndexCacheStore,\n PathSpec,\n RAMIndexCacheStore,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n ResourceName,\n makeResolveGlob,\n SLACK_COMMANDS,\n SLACK_PROMPT,\n SLACK_OPS,\n SLACK_WRITE_PROMPT,\n SlackAccessor,\n slackRead,\n slackReaddir,\n slackStat,\n} from '@struktoai/mirage-core'\nimport { redactSlackConfig, type SlackConfig, type SlackConfigRedacted } from './config.ts'\n\nconst resolveSlackGlob = makeResolveGlob(slackReaddir)\n\nexport interface SlackResourceState {\n type: string\n config: SlackConfigRedacted\n}\n\nexport class SlackResource implements Resource {\n readonly kind: string = ResourceName.SLACK\n readonly cachesReads: boolean = true\n readonly indexTtl: number = 600\n readonly prompt: string = SLACK_PROMPT\n readonly writePrompt: string = SLACK_WRITE_PROMPT\n readonly config: SlackConfig\n readonly accessor: SlackAccessor\n readonly index: IndexCacheStore\n\n constructor(config: SlackConfig) {\n this.config = config\n this.accessor = new SlackAccessor(\n new BrowserSlackTransport({\n proxyUrl: config.proxyUrl,\n ...(config.getHeaders !== undefined ? { getHeaders: config.getHeaders } : {}),\n }),\n )\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 SLACK_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return SLACK_OPS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return slackRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return slackReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return slackStat(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 resolveSlackGlob(this.accessor, effective, this.index)\n }\n\n getState(): Promise<SlackResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactSlackConfig(this.config),\n })\n }\n\n loadState(_state: SlackResourceState): 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'\n\nexport interface SlackConfig {\n proxyUrl: string\n getHeaders?: () => Promise<Record<string, string>> | Record<string, string>\n}\n\nexport interface SlackConfigRedacted {\n proxyUrl: string\n getHeaders?: '<REDACTED>'\n}\n\nconst SlackConfigSchema = z.object({\n proxyUrl: z.string(),\n getHeaders: secretSchema(\n z.custom<SlackConfig['getHeaders']>((value) => typeof value === 'function'),\n ).optional(),\n})\n\nexport function redactSlackConfig(config: SlackConfig): SlackConfigRedacted {\n return redactConfigWithSchema(SlackConfigSchema, config) as unknown as SlackConfigRedacted\n}\n"],"mappings":";AAcA,SAAS,UAAU,qBAAqB;AACxC;AAAA,EACE;AAAA,EAGA;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACpBP,SAAS,wBAAwB,cAAc,SAAS;AAYxD,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACjC,UAAU,EAAE,OAAO;AAAA,EACnB,YAAY;AAAA,IACV,EAAE,OAAkC,CAAC,UAAU,OAAO,UAAU,UAAU;AAAA,EAC5E,EAAE,SAAS;AACb,CAAC;AAEM,SAAS,kBAAkB,QAA0C;AAC1E,SAAO,uBAAuB,mBAAmB,MAAM;AACzD;;;ADEA,IAAM,mBAAmB,gBAAgB,YAAY;AAO9C,IAAM,gBAAN,MAAwC;AAAA,EACpC,OAAe,aAAa;AAAA,EAC5B,cAAuB;AAAA,EACvB,WAAmB;AAAA,EACnB,SAAiB;AAAA,EACjB,cAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAAqB;AAC/B,SAAK,SAAS;AACd,SAAK,WAAW,IAAI;AAAA,MAClB,IAAI,sBAAsB;AAAA,QACxB,UAAU,OAAO;AAAA,QACjB,GAAI,OAAO,eAAe,SAAY,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;AAAA,MAC7E,CAAC;AAAA,IACH;AACA,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,EAEA,SAAS,GAAkC;AACzC,WAAO,UAAU,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EAC/C;AAAA,EAEA,QAAQ,GAAgC;AACtC,WAAO,aAAa,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EAClD;AAAA,EAEA,KAAK,GAAgC;AACnC,WAAO,UAAU,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EAC/C;AAAA,EAEA,KAAK,OAA4B,SAAS,IAAyB;AACjE,UAAM,YACJ,WAAW,KACP,MAAM;AAAA,MAAI,CAAC,MACT,cAAc,EAAE,SAAS,EAAE,YAAY,MAAM,KACzC,IACA,IAAI,SAAS;AAAA,QACX,SAAS,EAAE;AAAA,QACX,WAAW,EAAE;AAAA,QACb,GAAI,EAAE,YAAY,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,QACnD,UAAU,EAAE;AAAA,QACZ,cAAc,SAAS,EAAE,SAAS,MAAM;AAAA,MAC1C,CAAC;AAAA,IACP,IACA;AACN,WAAO,iBAAiB,KAAK,UAAU,WAAW,KAAK,KAAK;AAAA,EAC9D;AAAA,EAEA,WAAwC;AACtC,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,kBAAkB,KAAK,MAAM;AAAA,IACvC,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,QAA2C;AACnD,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -1,9 +1,10 @@
1
1
  // src/resource/discord/discord.ts
2
+ import { mountKey, mountPrefixOf } from "@struktoai/mirage-core";
2
3
  import {
3
4
  BrowserDiscordTransport,
4
5
  DISCORD_COMMANDS,
5
6
  DISCORD_PROMPT,
6
- DISCORD_VFS_OPS,
7
+ DISCORD_OPS,
7
8
  DISCORD_WRITE_PROMPT,
8
9
  DiscordAccessor,
9
10
  PathSpec,
@@ -12,7 +13,7 @@ import {
12
13
  discordRead,
13
14
  discordReaddir,
14
15
  discordStat,
15
- resolveDiscordGlob
16
+ makeResolveGlob
16
17
  } from "@struktoai/mirage-core";
17
18
 
18
19
  // src/resource/discord/config.ts
@@ -28,6 +29,7 @@ function redactDiscordConfig(config) {
28
29
  }
29
30
 
30
31
  // src/resource/discord/discord.ts
32
+ var resolveDiscordGlob = makeResolveGlob(discordReaddir);
31
33
  var DiscordResource = class {
32
34
  kind = ResourceName.DISCORD;
33
35
  cachesReads = true;
@@ -57,7 +59,7 @@ var DiscordResource = class {
57
59
  return DISCORD_COMMANDS;
58
60
  }
59
61
  ops() {
60
- return DISCORD_VFS_OPS;
62
+ return DISCORD_OPS;
61
63
  }
62
64
  readFile(p) {
63
65
  return discordRead(this.accessor, p, this.index);
@@ -68,18 +70,14 @@ var DiscordResource = class {
68
70
  stat(p) {
69
71
  return discordStat(this.accessor, p, this.index);
70
72
  }
71
- async fingerprint(p) {
72
- const lookup = await this.index.get(p.original);
73
- return lookup.entry?.remoteTime ?? null;
74
- }
75
73
  glob(paths, prefix = "") {
76
74
  const effective = prefix !== "" ? paths.map(
77
- (p) => p.prefix !== "" ? p : new PathSpec({
78
- original: p.original,
75
+ (p) => mountPrefixOf(p.virtual, p.resourcePath) !== "" ? p : new PathSpec({
76
+ virtual: p.virtual,
79
77
  directory: p.directory,
80
78
  ...p.pattern !== null ? { pattern: p.pattern } : {},
81
79
  resolved: p.resolved,
82
- prefix
80
+ resourcePath: mountKey(p.virtual, prefix)
83
81
  })
84
82
  ) : paths;
85
83
  return resolveDiscordGlob(this.accessor, effective, this.index);
@@ -99,4 +97,4 @@ export {
99
97
  redactDiscordConfig,
100
98
  DiscordResource
101
99
  };
102
- //# sourceMappingURL=chunk-PV53AX35.js.map
100
+ //# sourceMappingURL=chunk-6BXVYCIC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/discord/discord.ts","../src/resource/discord/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 BrowserDiscordTransport,\n DISCORD_COMMANDS,\n DISCORD_PROMPT,\n DISCORD_OPS,\n DISCORD_WRITE_PROMPT,\n DiscordAccessor,\n type FileStat,\n type IndexCacheStore,\n PathSpec,\n RAMIndexCacheStore,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n ResourceName,\n discordRead,\n discordReaddir,\n discordStat,\n makeResolveGlob,\n} from '@struktoai/mirage-core'\nimport { redactDiscordConfig, type DiscordConfig, type DiscordConfigRedacted } from './config.ts'\n\nconst resolveDiscordGlob = makeResolveGlob(discordReaddir)\n\nexport interface DiscordResourceState {\n type: string\n config: DiscordConfigRedacted\n}\n\nexport class DiscordResource implements Resource {\n readonly kind: string = ResourceName.DISCORD\n readonly cachesReads: boolean = true\n readonly indexTtl: number = 600\n readonly prompt: string = DISCORD_PROMPT\n readonly writePrompt: string = DISCORD_WRITE_PROMPT\n readonly config: DiscordConfig\n readonly accessor: DiscordAccessor\n readonly index: IndexCacheStore\n\n constructor(config: DiscordConfig) {\n this.config = config\n this.accessor = new DiscordAccessor(\n new BrowserDiscordTransport({\n proxyUrl: config.proxyUrl,\n ...(config.getHeaders !== undefined ? { getHeaders: config.getHeaders } : {}),\n }),\n )\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 DISCORD_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return DISCORD_OPS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return discordRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return discordReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return discordStat(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 resolveDiscordGlob(this.accessor, effective, this.index)\n }\n\n getState(): Promise<DiscordResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactDiscordConfig(this.config),\n })\n }\n\n loadState(_state: DiscordResourceState): 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'\n\nexport interface DiscordConfig {\n proxyUrl: string\n getHeaders?: () => Promise<Record<string, string>> | Record<string, string>\n}\n\nexport interface DiscordConfigRedacted {\n proxyUrl: string\n getHeaders?: '<REDACTED>'\n}\n\nconst DiscordConfigSchema = z.object({\n proxyUrl: z.string(),\n getHeaders: secretSchema(\n z.custom<DiscordConfig['getHeaders']>((value) => typeof value === 'function'),\n ).optional(),\n})\n\nexport function redactDiscordConfig(config: DiscordConfig): DiscordConfigRedacted {\n return redactConfigWithSchema(DiscordConfigSchema, config) as unknown as DiscordConfigRedacted\n}\n"],"mappings":";AAcA,SAAS,UAAU,qBAAqB;AACxC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACpBP,SAAS,wBAAwB,cAAc,SAAS;AAYxD,IAAM,sBAAsB,EAAE,OAAO;AAAA,EACnC,UAAU,EAAE,OAAO;AAAA,EACnB,YAAY;AAAA,IACV,EAAE,OAAoC,CAAC,UAAU,OAAO,UAAU,UAAU;AAAA,EAC9E,EAAE,SAAS;AACb,CAAC;AAEM,SAAS,oBAAoB,QAA8C;AAChF,SAAO,uBAAuB,qBAAqB,MAAM;AAC3D;;;ADEA,IAAM,qBAAqB,gBAAgB,cAAc;AAOlD,IAAM,kBAAN,MAA0C;AAAA,EACtC,OAAe,aAAa;AAAA,EAC5B,cAAuB;AAAA,EACvB,WAAmB;AAAA,EACnB,SAAiB;AAAA,EACjB,cAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAAuB;AACjC,SAAK,SAAS;AACd,SAAK,WAAW,IAAI;AAAA,MAClB,IAAI,wBAAwB;AAAA,QAC1B,UAAU,OAAO;AAAA,QACjB,GAAI,OAAO,eAAe,SAAY,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;AAAA,MAC7E,CAAC;AAAA,IACH;AACA,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,EAEA,SAAS,GAAkC;AACzC,WAAO,YAAY,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACjD;AAAA,EAEA,QAAQ,GAAgC;AACtC,WAAO,eAAe,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACpD;AAAA,EAEA,KAAK,GAAgC;AACnC,WAAO,YAAY,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACjD;AAAA,EAEA,KAAK,OAA4B,SAAS,IAAyB;AACjE,UAAM,YACJ,WAAW,KACP,MAAM;AAAA,MAAI,CAAC,MACT,cAAc,EAAE,SAAS,EAAE,YAAY,MAAM,KACzC,IACA,IAAI,SAAS;AAAA,QACX,SAAS,EAAE;AAAA,QACX,WAAW,EAAE;AAAA,QACb,GAAI,EAAE,YAAY,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,QACnD,UAAU,EAAE;AAAA,QACZ,cAAc,SAAS,EAAE,SAAS,MAAM;AAAA,MAC1C,CAAC;AAAA,IACP,IACA;AACN,WAAO,mBAAmB,KAAK,UAAU,WAAW,KAAK,KAAK;AAAA,EAChE;AAAA,EAEA,WAA0C;AACxC,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,oBAAoB,KAAK,MAAM;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,QAA6C;AACrD,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -1,9 +1,10 @@
1
1
  // src/resource/langfuse/langfuse.ts
2
+ import { mountKey, mountPrefixOf } from "@struktoai/mirage-core";
2
3
  import {
3
4
  HttpLangfuseTransport,
4
5
  LANGFUSE_COMMANDS,
5
6
  LANGFUSE_PROMPT,
6
- LANGFUSE_VFS_OPS,
7
+ LANGFUSE_OPS,
7
8
  LangfuseAccessor,
8
9
  langfuseRead,
9
10
  langfuseReaddir,
@@ -11,7 +12,7 @@ import {
11
12
  PathSpec,
12
13
  RAMIndexCacheStore,
13
14
  ResourceName,
14
- resolveLangfuseGlob
15
+ makeResolveGlob
15
16
  } from "@struktoai/mirage-core";
16
17
 
17
18
  // src/resource/langfuse/config.ts
@@ -29,6 +30,7 @@ function redactLangfuseConfig(config) {
29
30
  }
30
31
 
31
32
  // src/resource/langfuse/langfuse.ts
33
+ var resolveLangfuseGlob = makeResolveGlob(langfuseReaddir);
32
34
  var LangfuseResource = class {
33
35
  kind = ResourceName.LANGFUSE;
34
36
  cachesReads = true;
@@ -67,7 +69,7 @@ var LangfuseResource = class {
67
69
  return LANGFUSE_COMMANDS;
68
70
  }
69
71
  ops() {
70
- return LANGFUSE_VFS_OPS;
72
+ return LANGFUSE_OPS;
71
73
  }
72
74
  readFile(p) {
73
75
  return langfuseRead(this.accessor, p, this.index);
@@ -78,17 +80,14 @@ var LangfuseResource = class {
78
80
  stat(p) {
79
81
  return langfuseStat(this.accessor, p, this.index);
80
82
  }
81
- fingerprint(_p) {
82
- return Promise.resolve(null);
83
- }
84
83
  glob(paths, prefix = "") {
85
84
  const effective = prefix !== "" ? paths.map(
86
- (p) => p.prefix !== "" ? p : new PathSpec({
87
- original: p.original,
85
+ (p) => mountPrefixOf(p.virtual, p.resourcePath) !== "" ? p : new PathSpec({
86
+ virtual: p.virtual,
88
87
  directory: p.directory,
89
88
  ...p.pattern !== null ? { pattern: p.pattern } : {},
90
89
  resolved: p.resolved,
91
- prefix
90
+ resourcePath: mountKey(p.virtual, prefix)
92
91
  })
93
92
  ) : paths;
94
93
  return resolveLangfuseGlob(this.accessor, effective, this.index);
@@ -108,4 +107,4 @@ export {
108
107
  redactLangfuseConfig,
109
108
  LangfuseResource
110
109
  };
111
- //# sourceMappingURL=chunk-BJHHL4UT.js.map
110
+ //# sourceMappingURL=chunk-6ETIHSTA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/langfuse/langfuse.ts","../src/resource/langfuse/config.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { mountKey, mountPrefixOf } from '@struktoai/mirage-core'\nimport {\n type FileStat,\n HttpLangfuseTransport,\n type IndexCacheStore,\n LANGFUSE_COMMANDS,\n LANGFUSE_PROMPT,\n LANGFUSE_OPS,\n LangfuseAccessor,\n langfuseRead,\n langfuseReaddir,\n langfuseStat,\n PathSpec,\n RAMIndexCacheStore,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n ResourceName,\n makeResolveGlob,\n} from '@struktoai/mirage-core'\nimport { redactLangfuseConfig, type LangfuseConfig, type LangfuseConfigRedacted } from './config.ts'\n\nconst resolveLangfuseGlob = makeResolveGlob(langfuseReaddir)\n\nexport interface LangfuseResourceState {\n type: string\n config: LangfuseConfigRedacted\n}\n\nexport class LangfuseResource implements Resource {\n readonly kind: string = ResourceName.LANGFUSE\n readonly cachesReads: boolean = true\n readonly indexTtl: number = 600\n readonly prompt: string = LANGFUSE_PROMPT\n readonly config: LangfuseConfig\n readonly accessor: LangfuseAccessor\n readonly index: IndexCacheStore\n\n constructor(config: LangfuseConfig) {\n this.config = config\n const transportOpts: { publicKey: string; secretKey: string; host?: string } = {\n publicKey: config.publicKey,\n secretKey: config.secretKey,\n }\n if (config.host !== undefined) transportOpts.host = config.host\n const accessorConfig: {\n defaultTraceLimit?: number\n defaultSearchLimit?: number\n defaultFromTimestamp?: string\n } = {}\n if (config.defaultTraceLimit !== undefined) {\n accessorConfig.defaultTraceLimit = config.defaultTraceLimit\n }\n if (config.defaultSearchLimit !== undefined) {\n accessorConfig.defaultSearchLimit = config.defaultSearchLimit\n }\n if (config.defaultFromTimestamp !== undefined) {\n accessorConfig.defaultFromTimestamp = config.defaultFromTimestamp\n }\n this.accessor = new LangfuseAccessor(new HttpLangfuseTransport(transportOpts), accessorConfig)\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 LANGFUSE_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return LANGFUSE_OPS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return langfuseRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return langfuseReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return langfuseStat(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 resolveLangfuseGlob(this.accessor, effective, this.index)\n }\n\n getState(): Promise<LangfuseResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactLangfuseConfig(this.config),\n })\n }\n\n loadState(_state: LangfuseResourceState): 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 LangfuseConfig {\n publicKey: string\n secretKey: string\n host?: string\n defaultTraceLimit?: number\n defaultSearchLimit?: number\n defaultFromTimestamp?: string\n}\n\nexport interface LangfuseConfigRedacted {\n publicKey: string\n secretKey: '<REDACTED>'\n host?: string\n defaultTraceLimit?: number\n defaultSearchLimit?: number\n defaultFromTimestamp?: string\n}\n\nconst LangfuseConfigSchema = z.object({\n publicKey: z.string(),\n secretKey: secretStr(),\n host: z.string().optional(),\n defaultTraceLimit: z.number().optional(),\n defaultSearchLimit: z.number().optional(),\n defaultFromTimestamp: z.string().optional(),\n})\n\nexport function redactLangfuseConfig(config: LangfuseConfig): LangfuseConfigRedacted {\n return redactConfigWithSchema(LangfuseConfigSchema, config) as unknown as LangfuseConfigRedacted\n}\n"],"mappings":"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","names":[]}
@@ -1,12 +1,13 @@
1
1
  import {
2
2
  redactGSheetsConfig
3
- } from "./chunk-YGRKFONX.js";
3
+ } from "./chunk-23NO22WD.js";
4
4
 
5
5
  // src/resource/gsheets/gsheets.ts
6
+ import { mountKey, mountPrefixOf } from "@struktoai/mirage-core";
6
7
  import {
7
8
  GSHEETS_COMMANDS,
8
9
  GSHEETS_PROMPT,
9
- GSHEETS_VFS_OPS,
10
+ GSHEETS_OPS,
10
11
  GSHEETS_WRITE_PROMPT,
11
12
  GSheetsAccessor,
12
13
  PathSpec,
@@ -15,9 +16,10 @@ import {
15
16
  TokenManager,
16
17
  gsheetsRead,
17
18
  gsheetsReaddir,
18
- gsheetsResolveGlob,
19
+ makeResolveGlob,
19
20
  gsheetsStat
20
21
  } from "@struktoai/mirage-core";
22
+ var gsheetsResolveGlob = makeResolveGlob(gsheetsReaddir);
21
23
  var GSheetsResource = class {
22
24
  kind = ResourceName.GSHEETS;
23
25
  cachesReads = true;
@@ -48,7 +50,7 @@ var GSheetsResource = class {
48
50
  return GSHEETS_COMMANDS;
49
51
  }
50
52
  ops() {
51
- return GSHEETS_VFS_OPS;
53
+ return GSHEETS_OPS;
52
54
  }
53
55
  readFile(p) {
54
56
  return gsheetsRead(this.accessor, p, this.index);
@@ -59,18 +61,14 @@ var GSheetsResource = class {
59
61
  stat(p) {
60
62
  return gsheetsStat(this.accessor, p, this.index);
61
63
  }
62
- async fingerprint(p) {
63
- const lookup = await this.index.get(p.original);
64
- return lookup.entry?.remoteTime ?? null;
65
- }
66
64
  glob(paths, prefix = "") {
67
65
  const effective = prefix !== "" ? paths.map(
68
- (p) => p.prefix !== "" ? p : new PathSpec({
69
- original: p.original,
66
+ (p) => mountPrefixOf(p.virtual, p.resourcePath) !== "" ? p : new PathSpec({
67
+ virtual: p.virtual,
70
68
  directory: p.directory,
71
69
  ...p.pattern !== null ? { pattern: p.pattern } : {},
72
70
  resolved: p.resolved,
73
- prefix
71
+ resourcePath: mountKey(p.virtual, prefix)
74
72
  })
75
73
  ) : paths;
76
74
  return gsheetsResolveGlob(this.accessor, effective, this.index);
@@ -89,4 +87,4 @@ var GSheetsResource = class {
89
87
  export {
90
88
  GSheetsResource
91
89
  };
92
- //# sourceMappingURL=chunk-XBOJZZRT.js.map
90
+ //# sourceMappingURL=chunk-AAJQ6AQT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/gsheets/gsheets.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 GSHEETS_COMMANDS,\n GSHEETS_PROMPT,\n GSHEETS_OPS,\n GSHEETS_WRITE_PROMPT,\n GSheetsAccessor,\n type IndexCacheStore,\n PathSpec,\n RAMIndexCacheStore,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n ResourceName,\n TokenManager,\n gsheetsRead,\n gsheetsReaddir,\n makeResolveGlob,\n gsheetsStat,\n} from '@struktoai/mirage-core'\nimport { redactGSheetsConfig, type GSheetsConfig, type GSheetsConfigRedacted } from './config.ts'\n\nconst gsheetsResolveGlob = makeResolveGlob(gsheetsReaddir)\n\nexport interface GSheetsResourceState {\n type: string\n config: GSheetsConfigRedacted\n}\n\nexport class GSheetsResource implements Resource {\n readonly kind: string = ResourceName.GSHEETS\n readonly cachesReads: boolean = true\n readonly indexTtl: number = 86_400\n readonly prompt: string = GSHEETS_PROMPT\n readonly writePrompt: string = GSHEETS_WRITE_PROMPT\n readonly config: GSheetsConfig\n readonly accessor: GSheetsAccessor\n readonly index: IndexCacheStore\n\n constructor(config: GSheetsConfig) {\n this.config = config\n const tm = new TokenManager({\n clientId: config.clientId,\n ...(config.clientSecret !== undefined ? { clientSecret: config.clientSecret } : {}),\n refreshToken: config.refreshToken,\n ...(config.refreshFn !== undefined ? { refreshFn: config.refreshFn } : {}),\n })\n this.accessor = new GSheetsAccessor({ tokenManager: tm })\n this.index = new RAMIndexCacheStore({ ttl: 86_400 })\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 GSHEETS_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return GSHEETS_OPS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return gsheetsRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return gsheetsReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return gsheetsStat(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 gsheetsResolveGlob(this.accessor, effective, this.index)\n }\n\n getState(): Promise<GSheetsResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactGSheetsConfig(this.config),\n })\n }\n\n loadState(_state: GSheetsResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n"],"mappings":";;;;;AAcA,SAAS,UAAU,qBAAqB;AACxC;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,IAAM,qBAAqB,gBAAgB,cAAc;AAOlD,IAAM,kBAAN,MAA0C;AAAA,EACtC,OAAe,aAAa;AAAA,EAC5B,cAAuB;AAAA,EACvB,WAAmB;AAAA,EACnB,SAAiB;AAAA,EACjB,cAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAAuB;AACjC,SAAK,SAAS;AACd,UAAM,KAAK,IAAI,aAAa;AAAA,MAC1B,UAAU,OAAO;AAAA,MACjB,GAAI,OAAO,iBAAiB,SAAY,EAAE,cAAc,OAAO,aAAa,IAAI,CAAC;AAAA,MACjF,cAAc,OAAO;AAAA,MACrB,GAAI,OAAO,cAAc,SAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,IAC1E,CAAC;AACD,SAAK,WAAW,IAAI,gBAAgB,EAAE,cAAc,GAAG,CAAC;AACxD,SAAK,QAAQ,IAAI,mBAAmB,EAAE,KAAK,MAAO,CAAC;AAAA,EACrD;AAAA,EAEA,OAAsB;AACpB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,QAAuB;AACrB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,WAAyC;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,MAA+B;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,GAAkC;AACzC,WAAO,YAAY,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACjD;AAAA,EAEA,QAAQ,GAAgC;AACtC,WAAO,eAAe,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACpD;AAAA,EAEA,KAAK,GAAgC;AACnC,WAAO,YAAY,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACjD;AAAA,EAEA,KAAK,OAA4B,SAAS,IAAyB;AACjE,UAAM,YACJ,WAAW,KACP,MAAM;AAAA,MAAI,CAAC,MACT,cAAc,EAAE,SAAS,EAAE,YAAY,MAAM,KACzC,IACA,IAAI,SAAS;AAAA,QACX,SAAS,EAAE;AAAA,QACX,WAAW,EAAE;AAAA,QACb,GAAI,EAAE,YAAY,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,QACnD,UAAU,EAAE;AAAA,QACZ,cAAc,SAAS,EAAE,SAAS,MAAM;AAAA,MAC1C,CAAC;AAAA,IACP,IACA;AACN,WAAO,mBAAmB,KAAK,UAAU,WAAW,KAAK,KAAK;AAAA,EAChE;AAAA,EAEA,WAA0C;AACxC,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,oBAAoB,KAAK,MAAM;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,QAA6C;AACrD,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  S3Resource
3
- } from "./chunk-RQ273N5K.js";
3
+ } from "./chunk-DC6VA36O.js";
4
4
 
5
5
  // src/resource/wasabi/wasabi.ts
6
6
  import {
@@ -18,7 +18,8 @@ var WasabiConfigSchema = 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 resolvedWasabiEndpoint(config) {
24
25
  if (config.endpoint !== void 0 && config.endpoint !== "") return config.endpoint;
@@ -31,7 +32,8 @@ function wasabiToS3Config(config) {
31
32
  presignedUrlProvider: config.presignedUrlProvider,
32
33
  ...config.region !== void 0 ? { region: config.region } : {},
33
34
  endpoint: resolvedWasabiEndpoint(config),
34
- ...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {}
35
+ ...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {},
36
+ ...config.keyPrefix !== void 0 ? { keyPrefix: config.keyPrefix } : {}
35
37
  };
36
38
  }
37
39
  function redactWasabiConfig(config) {
@@ -82,4 +84,4 @@ export {
82
84
  WASABI_BROWSER_PROMPT,
83
85
  WasabiResource
84
86
  };
85
- //# sourceMappingURL=chunk-DHZMC42C.js.map
87
+ //# sourceMappingURL=chunk-AUKVYHNZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/wasabi/wasabi.ts","../src/resource/wasabi/config.ts","../src/resource/wasabi/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 redactWasabiConfig,\n wasabiToS3Config,\n type WasabiConfig,\n type WasabiConfigRedacted,\n} from './config.ts'\nimport { WASABI_BROWSER_PROMPT } from './prompt.ts'\n\nexport interface WasabiResourceState {\n type: string\n config: WasabiConfigRedacted\n}\n\nexport class WasabiResource extends S3Resource {\n override readonly kind: string = ResourceName.WASABI\n override readonly prompt: string = WASABI_BROWSER_PROMPT\n readonly wasabiConfig: WasabiConfig\n private readonly wasabiOps: readonly RegisteredOp[]\n private readonly wasabiCommands: readonly RegisteredCommand[]\n\n constructor(config: WasabiConfig) {\n super(wasabiToS3Config(config))\n this.wasabiConfig = config\n this.wasabiOps = remapOpsResource(super.ops(), ResourceName.WASABI)\n this.wasabiCommands = remapCommandsResource(super.commands(), ResourceName.WASABI)\n }\n\n override ops(): readonly RegisteredOp[] {\n return this.wasabiOps\n }\n\n override commands(): readonly RegisteredCommand[] {\n return this.wasabiCommands\n }\n\n override getState(): Promise<WasabiResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactWasabiConfig(this.wasabiConfig),\n })\n }\n\n override loadState(_state: WasabiResourceState): 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 WasabiConfig {\n bucket: string\n presignedUrlProvider: S3BrowserPresignedUrlProvider\n region?: string\n endpoint?: string\n defaultContentType?: string\n keyPrefix?: string\n}\n\nexport interface WasabiConfigRedacted extends Omit<WasabiConfig, 'presignedUrlProvider'> {\n presignedUrlProvider: '<REDACTED>'\n}\n\nconst WasabiConfigSchema = 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 resolvedWasabiEndpoint(config: WasabiConfig): string {\n if (config.endpoint !== undefined && config.endpoint !== '') return config.endpoint\n const region = config.region ?? 'us-east-1'\n return region === 'us-east-1' ? 'https://s3.wasabisys.com' : `https://s3.${region}.wasabisys.com`\n}\n\nexport function wasabiToS3Config(config: WasabiConfig): S3Config {\n return {\n bucket: config.bucket,\n presignedUrlProvider: config.presignedUrlProvider,\n ...(config.region !== undefined ? { region: config.region } : {}),\n endpoint: resolvedWasabiEndpoint(config),\n ...(config.defaultContentType !== undefined\n ? { defaultContentType: config.defaultContentType }\n : {}),\n ...(config.keyPrefix !== undefined ? { keyPrefix: config.keyPrefix } : {}),\n }\n}\n\nexport function redactWasabiConfig(config: WasabiConfig): WasabiConfigRedacted {\n return redactConfigWithSchema(WasabiConfigSchema, config) as unknown as WasabiConfigRedacted\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 WASABI_BROWSER_PROMPT = `{prefix}\n Remote Wasabi 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,qBAAqB,EAAE,OAAO;AAAA,EAClC,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,uBAAuB,QAA8B;AACnE,MAAI,OAAO,aAAa,UAAa,OAAO,aAAa,GAAI,QAAO,OAAO;AAC3E,QAAM,SAAS,OAAO,UAAU;AAChC,SAAO,WAAW,cAAc,6BAA6B,cAAc,MAAM;AACnF;AAEO,SAAS,iBAAiB,QAAgC;AAC/D,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,sBAAsB,OAAO;AAAA,IAC7B,GAAI,OAAO,WAAW,SAAY,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,IAC/D,UAAU,uBAAuB,MAAM;AAAA,IACvC,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,mBAAmB,QAA4C;AAC7E,SAAO,uBAAuB,oBAAoB,MAAM;AAC1D;;;AChDO,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;;;AFqB9B,IAAM,iBAAN,cAA6B,WAAW;AAAA,EAC3B,OAAe,aAAa;AAAA,EAC5B,SAAiB;AAAA,EAC1B;AAAA,EACQ;AAAA,EACA;AAAA,EAEjB,YAAY,QAAsB;AAChC,UAAM,iBAAiB,MAAM,CAAC;AAC9B,SAAK,eAAe;AACpB,SAAK,YAAY,iBAAiB,MAAM,IAAI,GAAG,aAAa,MAAM;AAClE,SAAK,iBAAiB,sBAAsB,MAAM,SAAS,GAAG,aAAa,MAAM;AAAA,EACnF;AAAA,EAES,MAA+B;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAyC;AAChD,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAyC;AAChD,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,mBAAmB,KAAK,YAAY;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA,EAES,UAAU,QAA4C;AAC7D,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -1,13 +1,14 @@
1
1
  // src/resource/trello/trello.ts
2
+ import { mountKey, mountPrefixOf } from "@struktoai/mirage-core";
2
3
  import {
3
4
  HttpTrelloTransport,
4
5
  PathSpec,
5
6
  RAMIndexCacheStore,
6
7
  ResourceName,
7
- resolveTrelloGlob,
8
+ makeResolveGlob,
8
9
  TRELLO_COMMANDS,
9
10
  TRELLO_PROMPT,
10
- TRELLO_VFS_OPS,
11
+ TRELLO_OPS,
11
12
  TRELLO_WRITE_PROMPT,
12
13
  TrelloAccessor,
13
14
  trelloRead,
@@ -29,6 +30,9 @@ function redactTrelloConfig(config) {
29
30
  }
30
31
 
31
32
  // src/resource/trello/trello.ts
33
+ var resolveTrelloGlob = (accessor, paths, index, filter) => makeResolveGlob(
34
+ (a, p, i) => trelloReaddir(a, p, i, filter)
35
+ )(accessor, paths, index);
32
36
  var TrelloResource = class {
33
37
  kind = ResourceName.TRELLO;
34
38
  cachesReads = true;
@@ -58,7 +62,7 @@ var TrelloResource = class {
58
62
  return TRELLO_COMMANDS;
59
63
  }
60
64
  ops() {
61
- return TRELLO_VFS_OPS;
65
+ return TRELLO_OPS;
62
66
  }
63
67
  filter() {
64
68
  const out = {};
@@ -75,18 +79,14 @@ var TrelloResource = class {
75
79
  stat(p) {
76
80
  return trelloStat(this.accessor, p, this.index);
77
81
  }
78
- async fingerprint(p) {
79
- const lookup = await this.index.get(p.original);
80
- return lookup.entry?.remoteTime ?? null;
81
- }
82
82
  glob(paths, prefix = "") {
83
83
  const effective = prefix !== "" ? paths.map(
84
- (p) => p.prefix !== "" ? p : new PathSpec({
85
- original: p.original,
84
+ (p) => mountPrefixOf(p.virtual, p.resourcePath) !== "" ? p : new PathSpec({
85
+ virtual: p.virtual,
86
86
  directory: p.directory,
87
87
  ...p.pattern !== null ? { pattern: p.pattern } : {},
88
88
  resolved: p.resolved,
89
- prefix
89
+ resourcePath: mountKey(p.virtual, prefix)
90
90
  })
91
91
  ) : paths;
92
92
  return resolveTrelloGlob(this.accessor, effective, this.index, this.filter());
@@ -106,4 +106,4 @@ export {
106
106
  redactTrelloConfig,
107
107
  TrelloResource
108
108
  };
109
- //# sourceMappingURL=chunk-DA5EW34P.js.map
109
+ //# sourceMappingURL=chunk-AUXZEXCG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/trello/trello.ts","../src/resource/trello/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 HttpTrelloTransport,\n type IndexCacheStore,\n PathSpec,\n RAMIndexCacheStore,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n ResourceName,\n makeResolveGlob,\n TRELLO_COMMANDS,\n TRELLO_PROMPT,\n TRELLO_OPS,\n TRELLO_WRITE_PROMPT,\n TrelloAccessor,\n type TrelloReaddirFilter,\n trelloRead,\n trelloReaddir,\n trelloStat,\n} from '@struktoai/mirage-core'\nimport { redactTrelloConfig, type TrelloConfig, type TrelloConfigRedacted } from './config.ts'\n\nconst resolveTrelloGlob = (\n accessor: TrelloAccessor,\n paths: readonly PathSpec[],\n index: IndexCacheStore | undefined,\n filter: TrelloReaddirFilter,\n): Promise<PathSpec[]> =>\n makeResolveGlob((a: TrelloAccessor, p: PathSpec, i?: IndexCacheStore) =>\n trelloReaddir(a, p, i, filter),\n )(accessor, paths, index)\n\nexport interface TrelloResourceState {\n type: string\n config: TrelloConfigRedacted\n}\n\nexport class TrelloResource implements Resource {\n readonly kind: string = ResourceName.TRELLO\n readonly cachesReads: boolean = true\n readonly indexTtl: number = 600\n readonly prompt: string = TRELLO_PROMPT\n readonly writePrompt: string = TRELLO_WRITE_PROMPT\n readonly config: TrelloConfig\n readonly accessor: TrelloAccessor\n readonly index: IndexCacheStore\n\n constructor(config: TrelloConfig) {\n this.config = config\n const transportOpts: { apiKey: string; apiToken: string; baseUrl?: string } = {\n apiKey: config.apiKey,\n apiToken: config.apiToken,\n }\n if (config.baseUrl !== undefined) transportOpts.baseUrl = config.baseUrl\n this.accessor = new TrelloAccessor(new HttpTrelloTransport(transportOpts))\n 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 TRELLO_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return TRELLO_OPS\n }\n\n private filter(): TrelloReaddirFilter {\n const out: TrelloReaddirFilter = {}\n if (this.config.workspaceId !== undefined) out.workspaceId = this.config.workspaceId\n if (this.config.boardIds !== undefined) out.boardIds = this.config.boardIds\n return out\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return trelloRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return trelloReaddir(this.accessor, p, this.index, this.filter())\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return trelloStat(this.accessor, p, this.index)\n }\n\n glob(paths: readonly PathSpec[], prefix = ''): Promise<PathSpec[]> {\n const effective =\n prefix !== ''\n ? paths.map((p) =>\n mountPrefixOf(p.virtual, p.resourcePath) !== ''\n ? p\n : new PathSpec({\n virtual: p.virtual,\n directory: p.directory,\n ...(p.pattern !== null ? { pattern: p.pattern } : {}),\n resolved: p.resolved,\n resourcePath: mountKey(p.virtual, prefix),\n }),\n )\n : paths\n return resolveTrelloGlob(this.accessor, effective, this.index, this.filter())\n }\n\n getState(): Promise<TrelloResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactTrelloConfig(this.config),\n })\n }\n\n loadState(_state: TrelloResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n","// ========= 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 TrelloConfig {\n apiKey: string\n apiToken: string\n workspaceId?: string\n boardIds?: readonly string[]\n baseUrl?: string\n}\n\nexport interface TrelloConfigRedacted {\n apiKey: '<REDACTED>'\n apiToken: '<REDACTED>'\n workspaceId?: string\n boardIds?: readonly string[]\n baseUrl?: string\n}\n\nconst TrelloConfigSchema = z.object({\n apiKey: secretStr(),\n apiToken: secretStr(),\n workspaceId: z.string().optional(),\n boardIds: z.array(z.string()).optional(),\n baseUrl: z.string().optional(),\n})\n\nexport function redactTrelloConfig(config: TrelloConfig): TrelloConfigRedacted {\n return redactConfigWithSchema(TrelloConfigSchema, config) as unknown as TrelloConfigRedacted\n}\n"],"mappings":"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","names":[]}
@@ -1,12 +1,13 @@
1
1
  import {
2
2
  redactDropboxConfig
3
- } from "./chunk-O5ONB7QT.js";
3
+ } from "./chunk-MQMUOJZ2.js";
4
4
 
5
5
  // src/resource/dropbox/dropbox.ts
6
+ import { mountKey, mountPrefixOf } from "@struktoai/mirage-core";
6
7
  import {
7
8
  DROPBOX_COMMANDS,
8
9
  DROPBOX_PROMPT,
9
- DROPBOX_VFS_OPS,
10
+ DROPBOX_OPS,
10
11
  DropboxAccessor,
11
12
  DropboxTokenManager,
12
13
  PathSpec,
@@ -14,9 +15,10 @@ import {
14
15
  ResourceName,
15
16
  dropboxRead,
16
17
  dropboxReaddir,
17
- dropboxResolveGlob,
18
+ makeResolveGlob,
18
19
  dropboxStat
19
20
  } from "@struktoai/mirage-core";
21
+ var dropboxResolveGlob = makeResolveGlob(dropboxReaddir);
20
22
  var DropboxResource = class {
21
23
  kind = ResourceName.DROPBOX;
22
24
  cachesReads = true;
@@ -31,9 +33,14 @@ var DropboxResource = class {
31
33
  clientId: config.clientId,
32
34
  ...config.clientSecret !== void 0 ? { clientSecret: config.clientSecret } : {},
33
35
  refreshToken: config.refreshToken,
36
+ ...config.endpoint !== void 0 ? { endpoint: config.endpoint } : {},
34
37
  ...config.refreshFn !== void 0 ? { refreshFn: config.refreshFn } : {}
35
38
  });
36
- this.accessor = new DropboxAccessor({ tokenManager: tm });
39
+ this.accessor = new DropboxAccessor({
40
+ tokenManager: tm,
41
+ ...config.rootPath !== void 0 ? { rootPath: config.rootPath } : {},
42
+ ...config.contentSearch !== void 0 ? { contentSearch: config.contentSearch } : {}
43
+ });
37
44
  this.index = new RAMIndexCacheStore({ ttl: 86400 });
38
45
  }
39
46
  open() {
@@ -46,7 +53,7 @@ var DropboxResource = class {
46
53
  return DROPBOX_COMMANDS;
47
54
  }
48
55
  ops() {
49
- return DROPBOX_VFS_OPS;
56
+ return DROPBOX_OPS;
50
57
  }
51
58
  readFile(p) {
52
59
  return dropboxRead(this.accessor, p, this.index);
@@ -57,18 +64,14 @@ var DropboxResource = class {
57
64
  stat(p) {
58
65
  return dropboxStat(this.accessor, p, this.index);
59
66
  }
60
- async fingerprint(p) {
61
- const lookup = await this.index.get(p.original);
62
- return lookup.entry?.remoteTime ?? null;
63
- }
64
67
  glob(paths, prefix = "") {
65
68
  const effective = prefix !== "" ? paths.map(
66
- (p) => p.prefix !== "" ? p : new PathSpec({
67
- original: p.original,
69
+ (p) => mountPrefixOf(p.virtual, p.resourcePath) !== "" ? p : new PathSpec({
70
+ virtual: p.virtual,
68
71
  directory: p.directory,
69
72
  ...p.pattern !== null ? { pattern: p.pattern } : {},
70
73
  resolved: p.resolved,
71
- prefix
74
+ resourcePath: mountKey(p.virtual, prefix)
72
75
  })
73
76
  ) : paths;
74
77
  return dropboxResolveGlob(this.accessor, effective, this.index);
@@ -87,4 +90,4 @@ var DropboxResource = class {
87
90
  export {
88
91
  DropboxResource
89
92
  };
90
- //# sourceMappingURL=chunk-2AEAISO2.js.map
93
+ //# sourceMappingURL=chunk-CQERQTAZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/dropbox/dropbox.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 DROPBOX_COMMANDS,\n DROPBOX_PROMPT,\n DROPBOX_OPS,\n DropboxAccessor,\n DropboxTokenManager,\n type IndexCacheStore,\n PathSpec,\n RAMIndexCacheStore,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n ResourceName,\n dropboxRead,\n dropboxReaddir,\n makeResolveGlob,\n dropboxStat,\n} from '@struktoai/mirage-core'\nimport { redactDropboxConfig, type DropboxConfig, type DropboxConfigRedacted } from './config.ts'\n\nconst dropboxResolveGlob = makeResolveGlob(dropboxReaddir)\n\nexport interface DropboxResourceState {\n type: string\n config: DropboxConfigRedacted\n}\n\nexport class DropboxResource implements Resource {\n readonly kind: string = ResourceName.DROPBOX\n readonly cachesReads: boolean = true\n readonly indexTtl: number = 86_400\n readonly prompt: string = DROPBOX_PROMPT\n readonly config: DropboxConfig\n readonly accessor: DropboxAccessor\n readonly index: IndexCacheStore\n\n constructor(config: DropboxConfig) {\n this.config = config\n const tm = new DropboxTokenManager({\n clientId: config.clientId,\n ...(config.clientSecret !== undefined ? { clientSecret: config.clientSecret } : {}),\n refreshToken: config.refreshToken,\n ...(config.endpoint !== undefined ? { endpoint: config.endpoint } : {}),\n ...(config.refreshFn !== undefined ? { refreshFn: config.refreshFn } : {}),\n })\n this.accessor = new DropboxAccessor({\n tokenManager: tm,\n ...(config.rootPath !== undefined ? { rootPath: config.rootPath } : {}),\n ...(config.contentSearch !== undefined ? { contentSearch: config.contentSearch } : {}),\n })\n this.index = new RAMIndexCacheStore({ ttl: 86_400 })\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 DROPBOX_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return DROPBOX_OPS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return dropboxRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return dropboxReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return dropboxStat(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 dropboxResolveGlob(this.accessor, effective, this.index)\n }\n\n getState(): Promise<DropboxResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactDropboxConfig(this.config),\n })\n }\n\n loadState(_state: DropboxResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n"],"mappings":";;;;;AAcA,SAAS,UAAU,qBAAqB;AACxC;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,IAAM,qBAAqB,gBAAgB,cAAc;AAOlD,IAAM,kBAAN,MAA0C;AAAA,EACtC,OAAe,aAAa;AAAA,EAC5B,cAAuB;AAAA,EACvB,WAAmB;AAAA,EACnB,SAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAAuB;AACjC,SAAK,SAAS;AACd,UAAM,KAAK,IAAI,oBAAoB;AAAA,MACjC,UAAU,OAAO;AAAA,MACjB,GAAI,OAAO,iBAAiB,SAAY,EAAE,cAAc,OAAO,aAAa,IAAI,CAAC;AAAA,MACjF,cAAc,OAAO;AAAA,MACrB,GAAI,OAAO,aAAa,SAAY,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,MACrE,GAAI,OAAO,cAAc,SAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,IAC1E,CAAC;AACD,SAAK,WAAW,IAAI,gBAAgB;AAAA,MAClC,cAAc;AAAA,MACd,GAAI,OAAO,aAAa,SAAY,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,MACrE,GAAI,OAAO,kBAAkB,SAAY,EAAE,eAAe,OAAO,cAAc,IAAI,CAAC;AAAA,IACtF,CAAC;AACD,SAAK,QAAQ,IAAI,mBAAmB,EAAE,KAAK,MAAO,CAAC;AAAA,EACrD;AAAA,EAEA,OAAsB;AACpB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,QAAuB;AACrB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,WAAyC;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,MAA+B;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,GAAkC;AACzC,WAAO,YAAY,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACjD;AAAA,EAEA,QAAQ,GAAgC;AACtC,WAAO,eAAe,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACpD;AAAA,EAEA,KAAK,GAAgC;AACnC,WAAO,YAAY,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACjD;AAAA,EAEA,KAAK,OAA4B,SAAS,IAAyB;AACjE,UAAM,YACJ,WAAW,KACP,MAAM;AAAA,MAAI,CAAC,MACT,cAAc,EAAE,SAAS,EAAE,YAAY,MAAM,KACzC,IACA,IAAI,SAAS;AAAA,QACX,SAAS,EAAE;AAAA,QACX,WAAW,EAAE;AAAA,QACb,GAAI,EAAE,YAAY,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,QACnD,UAAU,EAAE;AAAA,QACZ,cAAc,SAAS,EAAE,SAAS,MAAM;AAAA,MAC1C,CAAC;AAAA,IACP,IACA;AACN,WAAO,mBAAmB,KAAK,UAAU,WAAW,KAAK,KAAK;AAAA,EAChE;AAAA,EAEA,WAA0C;AACxC,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,oBAAoB,KAAK,MAAM;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,QAA6C;AACrD,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -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.
@@ -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-RQ273N5K.js.map
170
+ //# sourceMappingURL=chunk-DC6VA36O.js.map