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

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 (232) hide show
  1. package/README.md +61 -127
  2. package/dist/aliyun-F2ORS3KZ.js +8 -0
  3. package/dist/backblaze-HOVWPSV7.js +8 -0
  4. package/dist/box-VJSE5N7P.js +8 -0
  5. package/dist/ceph-CQKQ4NWW.js +8 -0
  6. package/dist/chunk-2H4KUUFP.js +26 -0
  7. package/dist/chunk-2H4KUUFP.js.map +1 -0
  8. package/dist/chunk-32VC36P4.js +89 -0
  9. package/dist/chunk-32VC36P4.js.map +1 -0
  10. package/dist/{chunk-MSNVGH6T.js → chunk-4YJMDF2S.js} +2 -4
  11. package/dist/chunk-4YJMDF2S.js.map +1 -0
  12. package/dist/chunk-54NTYJEO.js +13 -0
  13. package/dist/chunk-54NTYJEO.js.map +1 -0
  14. package/dist/chunk-63GZEZW4.js +79 -0
  15. package/dist/chunk-63GZEZW4.js.map +1 -0
  16. package/dist/{chunk-UW3D2AF6.js → chunk-6K57U6CM.js} +2 -4
  17. package/dist/chunk-6K57U6CM.js.map +1 -0
  18. package/dist/chunk-72GY5B23.js +89 -0
  19. package/dist/chunk-72GY5B23.js.map +1 -0
  20. package/dist/{chunk-QYFCHCGX.js → chunk-ATLYBQSC.js} +14 -29
  21. package/dist/chunk-ATLYBQSC.js.map +1 -0
  22. package/dist/{chunk-ONQ5JGPR.js → chunk-BUXWUKN7.js} +9 -6
  23. package/dist/chunk-BUXWUKN7.js.map +1 -0
  24. package/dist/chunk-CAKSQ2LV.js +85 -0
  25. package/dist/chunk-CAKSQ2LV.js.map +1 -0
  26. package/dist/chunk-CO4FMKOF.js +89 -0
  27. package/dist/chunk-CO4FMKOF.js.map +1 -0
  28. package/dist/{chunk-5Q5GJUAF.js → chunk-D3JDGGKO.js} +19 -18
  29. package/dist/chunk-D3JDGGKO.js.map +1 -0
  30. package/dist/{chunk-DDM2Z7YA.js → chunk-D6HF462C.js} +2 -4
  31. package/dist/chunk-D6HF462C.js.map +1 -0
  32. package/dist/{chunk-27UVUTJH.js → chunk-EH2BN4JC.js} +34 -3
  33. package/dist/chunk-EH2BN4JC.js.map +1 -0
  34. package/dist/chunk-EUKHGXCE.js +89 -0
  35. package/dist/chunk-EUKHGXCE.js.map +1 -0
  36. package/dist/chunk-GHKX2BA3.js +89 -0
  37. package/dist/chunk-GHKX2BA3.js.map +1 -0
  38. package/dist/{chunk-FL7YLP7D.js → chunk-HGSTRD7H.js} +10 -8
  39. package/dist/chunk-HGSTRD7H.js.map +1 -0
  40. package/dist/chunk-HYUESAQS.js +24 -0
  41. package/dist/chunk-HYUESAQS.js.map +1 -0
  42. package/dist/{chunk-ZJ6ROCTP.js → chunk-INLL7LRM.js} +11 -14
  43. package/dist/chunk-INLL7LRM.js.map +1 -0
  44. package/dist/chunk-J54OBIJA.js +29 -0
  45. package/dist/chunk-J54OBIJA.js.map +1 -0
  46. package/dist/{chunk-DPC7QRYO.js → chunk-JCS5EG5A.js} +9 -6
  47. package/dist/chunk-JCS5EG5A.js.map +1 -0
  48. package/dist/chunk-JSAQMYPK.js +26 -0
  49. package/dist/chunk-JSAQMYPK.js.map +1 -0
  50. package/dist/{chunk-CZOTICOC.js → chunk-JVTKE6DB.js} +2 -4
  51. package/dist/chunk-JVTKE6DB.js.map +1 -0
  52. package/dist/{chunk-3PWPFOPS.js → chunk-MO5DGX42.js} +19 -18
  53. package/dist/chunk-MO5DGX42.js.map +1 -0
  54. package/dist/{chunk-LZRPA2P7.js → chunk-N43C6XFP.js} +9 -6
  55. package/dist/chunk-N43C6XFP.js.map +1 -0
  56. package/dist/chunk-NMZBJOFW.js +26 -0
  57. package/dist/chunk-NMZBJOFW.js.map +1 -0
  58. package/dist/chunk-O5ONB7QT.js +26 -0
  59. package/dist/chunk-O5ONB7QT.js.map +1 -0
  60. package/dist/{chunk-LSSB3AEW.js → chunk-RD7ED27I.js} +5 -12
  61. package/dist/chunk-RD7ED27I.js.map +1 -0
  62. package/dist/chunk-RJ4RR3BR.js +92 -0
  63. package/dist/chunk-RJ4RR3BR.js.map +1 -0
  64. package/dist/chunk-RJ5FBBL6.js +79 -0
  65. package/dist/chunk-RJ5FBBL6.js.map +1 -0
  66. package/dist/{chunk-SQQI4A6Y.js → chunk-RZRXEXHM.js} +2 -4
  67. package/dist/chunk-RZRXEXHM.js.map +1 -0
  68. package/dist/{chunk-CQJTW45B.js → chunk-SBAUYZJB.js} +2 -4
  69. package/dist/chunk-SBAUYZJB.js.map +1 -0
  70. package/dist/chunk-SJB2KXDM.js +2109 -0
  71. package/dist/chunk-SJB2KXDM.js.map +1 -0
  72. package/dist/{chunk-33SBWNB4.js → chunk-T43CZ3IZ.js} +9 -8
  73. package/dist/chunk-T43CZ3IZ.js.map +1 -0
  74. package/dist/{chunk-LG6GVNOL.js → chunk-TPFH5V4D.js} +2 -4
  75. package/dist/chunk-TPFH5V4D.js.map +1 -0
  76. package/dist/{chunk-LUDXUYIA.js → chunk-WEJGUCCL.js} +19 -18
  77. package/dist/chunk-WEJGUCCL.js.map +1 -0
  78. package/dist/{chunk-UFXEZ56G.js → chunk-WZ53HLH6.js} +18 -18
  79. package/dist/chunk-WZ53HLH6.js.map +1 -0
  80. package/dist/{chunk-VLFE4FGD.js → chunk-XFREXNA2.js} +2 -3
  81. package/dist/chunk-XFREXNA2.js.map +1 -0
  82. package/dist/chunk-YEDSFMWK.js +79 -0
  83. package/dist/chunk-YEDSFMWK.js.map +1 -0
  84. package/dist/chunk-YGRKFONX.js +26 -0
  85. package/dist/chunk-YGRKFONX.js.map +1 -0
  86. package/dist/config-7IZCGWKX.js +11 -0
  87. package/dist/config-AT74FARJ.js +11 -0
  88. package/dist/config-C2AYHACT.js +11 -0
  89. package/dist/{config-U4UI4OKA.js → config-ET26F632.js} +4 -2
  90. package/dist/config-GHJOYNM6.js +11 -0
  91. package/dist/config-L55UXIF4.js +11 -0
  92. package/dist/config-NV5WXP64.js +11 -0
  93. package/dist/config-V7BLK5WP.js +11 -0
  94. package/dist/digitalocean-KC7VIWZK.js +8 -0
  95. package/dist/discord-W3DSEXKN.js +7 -0
  96. package/dist/dropbox-GI273OVA.js +8 -0
  97. package/dist/gcs-WRQTU27E.js +8 -0
  98. package/dist/gdocs-EI2EFVKG.js +8 -0
  99. package/dist/gdrive-62HD67IP.js +8 -0
  100. package/dist/github-SWLYD3LS.js +7 -0
  101. package/dist/github_ci-7P7VGBKM.js +8 -0
  102. package/dist/gmail-B7HXHZ7D.js +8 -0
  103. package/dist/gsheets-OTBW2JWG.js +8 -0
  104. package/dist/gslides-MXSR4HRY.js +8 -0
  105. package/dist/index.d.ts +342 -166
  106. package/dist/index.js +264 -373
  107. package/dist/index.js.map +1 -1
  108. package/dist/langfuse-FWKU6E3F.js +7 -0
  109. package/dist/linear-SHVG3XVT.js +7 -0
  110. package/dist/minio-246KOHBJ.js +8 -0
  111. package/dist/mongodb-2ITJUDCF.js +7 -0
  112. package/dist/notion-BOBBSJSG.js +7 -0
  113. package/dist/oci-T7VREPQW.js +8 -0
  114. package/dist/opfs-3XNAXR5B.js +7 -0
  115. package/dist/qingstor-WIC27LS3.js +8 -0
  116. package/dist/qingstor-WIC27LS3.js.map +1 -0
  117. package/dist/r2-EAX6KHEI.js +8 -0
  118. package/dist/r2-EAX6KHEI.js.map +1 -0
  119. package/dist/{s3-A4XFE6QV.js → s3-GD2WKLWR.js} +2 -2
  120. package/dist/s3-GD2WKLWR.js.map +1 -0
  121. package/dist/scaleway-OVFRZBKW.js +8 -0
  122. package/dist/scaleway-OVFRZBKW.js.map +1 -0
  123. package/dist/seaweedfs-EOJVO432.js +8 -0
  124. package/dist/seaweedfs-EOJVO432.js.map +1 -0
  125. package/dist/slack-RNXMU5OC.js +7 -0
  126. package/dist/slack-RNXMU5OC.js.map +1 -0
  127. package/dist/supabase-VSUNLIJ6.js +8 -0
  128. package/dist/supabase-VSUNLIJ6.js.map +1 -0
  129. package/dist/tencent-YYM5WUVU.js +8 -0
  130. package/dist/tencent-YYM5WUVU.js.map +1 -0
  131. package/dist/trello-MNR3VPTT.js +7 -0
  132. package/dist/trello-MNR3VPTT.js.map +1 -0
  133. package/dist/wasabi-K5ANTZ2C.js +8 -0
  134. package/dist/wasabi-K5ANTZ2C.js.map +1 -0
  135. package/package.json +3 -3
  136. package/dist/box-Y2SJWAAO.js +0 -8
  137. package/dist/chunk-27UVUTJH.js.map +0 -1
  138. package/dist/chunk-33SBWNB4.js.map +0 -1
  139. package/dist/chunk-3PWPFOPS.js.map +0 -1
  140. package/dist/chunk-5Q5GJUAF.js.map +0 -1
  141. package/dist/chunk-7GZXXXAS.js +0 -24
  142. package/dist/chunk-7GZXXXAS.js.map +0 -1
  143. package/dist/chunk-B4SYG2FD.js +0 -24
  144. package/dist/chunk-B4SYG2FD.js.map +0 -1
  145. package/dist/chunk-BIZONEJC.js +0 -24
  146. package/dist/chunk-BIZONEJC.js.map +0 -1
  147. package/dist/chunk-CQJTW45B.js.map +0 -1
  148. package/dist/chunk-CZOTICOC.js.map +0 -1
  149. package/dist/chunk-DDM2Z7YA.js.map +0 -1
  150. package/dist/chunk-DPC7QRYO.js.map +0 -1
  151. package/dist/chunk-FL7YLP7D.js.map +0 -1
  152. package/dist/chunk-GFWWDQUZ.js +0 -24
  153. package/dist/chunk-GFWWDQUZ.js.map +0 -1
  154. package/dist/chunk-LG6GVNOL.js.map +0 -1
  155. package/dist/chunk-LSSB3AEW.js.map +0 -1
  156. package/dist/chunk-LUDXUYIA.js.map +0 -1
  157. package/dist/chunk-LZRPA2P7.js.map +0 -1
  158. package/dist/chunk-ML57VOCK.js +0 -7590
  159. package/dist/chunk-ML57VOCK.js.map +0 -1
  160. package/dist/chunk-MSNVGH6T.js.map +0 -1
  161. package/dist/chunk-NBWTZXH2.js +0 -27
  162. package/dist/chunk-NBWTZXH2.js.map +0 -1
  163. package/dist/chunk-ONQ5JGPR.js.map +0 -1
  164. package/dist/chunk-OPROOV6J.js +0 -24
  165. package/dist/chunk-OPROOV6J.js.map +0 -1
  166. package/dist/chunk-QARIHW3I.js +0 -23
  167. package/dist/chunk-QARIHW3I.js.map +0 -1
  168. package/dist/chunk-QYFCHCGX.js.map +0 -1
  169. package/dist/chunk-SQQI4A6Y.js.map +0 -1
  170. package/dist/chunk-UFXEZ56G.js.map +0 -1
  171. package/dist/chunk-UW3D2AF6.js.map +0 -1
  172. package/dist/chunk-VLFE4FGD.js.map +0 -1
  173. package/dist/chunk-XIURBEVZ.js +0 -24
  174. package/dist/chunk-XIURBEVZ.js.map +0 -1
  175. package/dist/chunk-ZJ6ROCTP.js.map +0 -1
  176. package/dist/config-4FABMWVK.js +0 -9
  177. package/dist/config-DGIUMGBB.js +0 -9
  178. package/dist/config-G3TTNXLY.js +0 -9
  179. package/dist/config-GPCEEKCB.js +0 -9
  180. package/dist/config-KQ5VR2KZ.js +0 -9
  181. package/dist/config-LPMMVXLS.js +0 -9
  182. package/dist/config-VZGK63Z5.js +0 -9
  183. package/dist/discord-RG6URXXS.js +0 -7
  184. package/dist/dropbox-P7SOL7GN.js +0 -8
  185. package/dist/gcs-2QHB4CBT.js +0 -8
  186. package/dist/gdocs-JNZTOZ33.js +0 -8
  187. package/dist/gdrive-6MEIVN2F.js +0 -8
  188. package/dist/github-M7WODJR2.js +0 -7
  189. package/dist/github_ci-4XELEFSZ.js +0 -8
  190. package/dist/gmail-AO6A3URH.js +0 -8
  191. package/dist/gsheets-RFOKXMOJ.js +0 -8
  192. package/dist/gslides-GTVZPLLB.js +0 -8
  193. package/dist/langfuse-CDOLELMB.js +0 -7
  194. package/dist/linear-SXOQGG6B.js +0 -7
  195. package/dist/mongodb-HA7FAKDJ.js +0 -7
  196. package/dist/notion-ANZNMM3L.js +0 -7
  197. package/dist/oci-ML5ZRVZ2.js +0 -8
  198. package/dist/opfs-57XFMWWE.js +0 -7
  199. package/dist/r2-56O4Q2J4.js +0 -8
  200. package/dist/slack-QA7H7WLM.js +0 -7
  201. package/dist/supabase-NNK2RWG3.js +0 -8
  202. package/dist/trello-H6PZT2IT.js +0 -7
  203. /package/dist/{box-Y2SJWAAO.js.map → aliyun-F2ORS3KZ.js.map} +0 -0
  204. /package/dist/{config-4FABMWVK.js.map → backblaze-HOVWPSV7.js.map} +0 -0
  205. /package/dist/{config-DGIUMGBB.js.map → box-VJSE5N7P.js.map} +0 -0
  206. /package/dist/{config-G3TTNXLY.js.map → ceph-CQKQ4NWW.js.map} +0 -0
  207. /package/dist/{config-GPCEEKCB.js.map → config-7IZCGWKX.js.map} +0 -0
  208. /package/dist/{config-KQ5VR2KZ.js.map → config-AT74FARJ.js.map} +0 -0
  209. /package/dist/{config-LPMMVXLS.js.map → config-C2AYHACT.js.map} +0 -0
  210. /package/dist/{config-U4UI4OKA.js.map → config-ET26F632.js.map} +0 -0
  211. /package/dist/{config-VZGK63Z5.js.map → config-GHJOYNM6.js.map} +0 -0
  212. /package/dist/{discord-RG6URXXS.js.map → config-L55UXIF4.js.map} +0 -0
  213. /package/dist/{dropbox-P7SOL7GN.js.map → config-NV5WXP64.js.map} +0 -0
  214. /package/dist/{gcs-2QHB4CBT.js.map → config-V7BLK5WP.js.map} +0 -0
  215. /package/dist/{gdocs-JNZTOZ33.js.map → digitalocean-KC7VIWZK.js.map} +0 -0
  216. /package/dist/{gdrive-6MEIVN2F.js.map → discord-W3DSEXKN.js.map} +0 -0
  217. /package/dist/{github-M7WODJR2.js.map → dropbox-GI273OVA.js.map} +0 -0
  218. /package/dist/{github_ci-4XELEFSZ.js.map → gcs-WRQTU27E.js.map} +0 -0
  219. /package/dist/{gmail-AO6A3URH.js.map → gdocs-EI2EFVKG.js.map} +0 -0
  220. /package/dist/{gsheets-RFOKXMOJ.js.map → gdrive-62HD67IP.js.map} +0 -0
  221. /package/dist/{gslides-GTVZPLLB.js.map → github-SWLYD3LS.js.map} +0 -0
  222. /package/dist/{langfuse-CDOLELMB.js.map → github_ci-7P7VGBKM.js.map} +0 -0
  223. /package/dist/{linear-SXOQGG6B.js.map → gmail-B7HXHZ7D.js.map} +0 -0
  224. /package/dist/{mongodb-HA7FAKDJ.js.map → gsheets-OTBW2JWG.js.map} +0 -0
  225. /package/dist/{notion-ANZNMM3L.js.map → gslides-MXSR4HRY.js.map} +0 -0
  226. /package/dist/{oci-ML5ZRVZ2.js.map → langfuse-FWKU6E3F.js.map} +0 -0
  227. /package/dist/{opfs-57XFMWWE.js.map → linear-SHVG3XVT.js.map} +0 -0
  228. /package/dist/{r2-56O4Q2J4.js.map → minio-246KOHBJ.js.map} +0 -0
  229. /package/dist/{s3-A4XFE6QV.js.map → mongodb-2ITJUDCF.js.map} +0 -0
  230. /package/dist/{slack-QA7H7WLM.js.map → notion-BOBBSJSG.js.map} +0 -0
  231. /package/dist/{supabase-NNK2RWG3.js.map → oci-T7VREPQW.js.map} +0 -0
  232. /package/dist/{trello-H6PZT2IT.js.map → opfs-3XNAXR5B.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  redactGDocsConfig
3
- } from "./chunk-GFWWDQUZ.js";
3
+ } from "./chunk-2H4KUUFP.js";
4
4
 
5
5
  // src/resource/gdocs/gdocs.ts
6
6
  import {
@@ -78,8 +78,6 @@ var GDocsResource = class {
78
78
  getState() {
79
79
  return Promise.resolve({
80
80
  type: this.kind,
81
- needsOverride: true,
82
- redactedFields: ["clientSecret", "refreshToken"],
83
81
  config: redactGDocsConfig(this.config)
84
82
  });
85
83
  }
@@ -91,4 +89,4 @@ var GDocsResource = class {
91
89
  export {
92
90
  GDocsResource
93
91
  };
94
- //# sourceMappingURL=chunk-UW3D2AF6.js.map
92
+ //# sourceMappingURL=chunk-6K57U6CM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/gdocs/gdocs.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n type FileStat,\n GDOCS_COMMANDS,\n GDOCS_PROMPT,\n GDOCS_VFS_OPS,\n GDOCS_WRITE_PROMPT,\n GDocsAccessor,\n type IndexCacheStore,\n PathSpec,\n RAMIndexCacheStore,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n ResourceName,\n TokenManager,\n gdocsRead,\n gdocsReaddir,\n gdocsResolveGlob,\n gdocsStat,\n} from '@struktoai/mirage-core'\nimport { redactGDocsConfig, type GDocsConfig, type GDocsConfigRedacted } from './config.ts'\n\nexport interface GDocsResourceState {\n type: string\n config: GDocsConfigRedacted\n}\n\nexport class GDocsResource implements Resource {\n readonly kind: string = ResourceName.GDOCS\n readonly isRemote: boolean = true\n readonly indexTtl: number = 86_400\n readonly prompt: string = GDOCS_PROMPT\n readonly writePrompt: string = GDOCS_WRITE_PROMPT\n readonly config: GDocsConfig\n readonly accessor: GDocsAccessor\n readonly index: IndexCacheStore\n\n constructor(config: GDocsConfig) {\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 GDocsAccessor({ 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 GDOCS_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return GDOCS_VFS_OPS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return gdocsRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return gdocsReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return gdocsStat(this.accessor, p, this.index)\n }\n\n async fingerprint(p: PathSpec): Promise<string | null> {\n const lookup = await this.index.get(p.original)\n return lookup.entry?.remoteTime ?? null\n }\n\n glob(paths: readonly PathSpec[], prefix = ''): Promise<PathSpec[]> {\n const effective =\n prefix !== ''\n ? paths.map((p) =>\n p.prefix !== ''\n ? p\n : new PathSpec({\n original: p.original,\n directory: p.directory,\n ...(p.pattern !== null ? { pattern: p.pattern } : {}),\n resolved: p.resolved,\n prefix,\n }),\n )\n : paths\n return gdocsResolveGlob(this.accessor, effective, this.index)\n }\n\n getState(): Promise<GDocsResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactGDocsConfig(this.config),\n })\n }\n\n loadState(_state: GDocsResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n"],"mappings":";;;;;AAcA;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;AAQA,IAAM,gBAAN,MAAwC;AAAA,EACpC,OAAe,aAAa;AAAA,EAC5B,WAAoB;AAAA,EACpB,WAAmB;AAAA,EACnB,SAAiB;AAAA,EACjB,cAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAAqB;AAC/B,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,cAAc,EAAE,cAAc,GAAG,CAAC;AACtD,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,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,MAAM,YAAY,GAAqC;AACrD,UAAM,SAAS,MAAM,KAAK,MAAM,IAAI,EAAE,QAAQ;AAC9C,WAAO,OAAO,OAAO,cAAc;AAAA,EACrC;AAAA,EAEA,KAAK,OAA4B,SAAS,IAAyB;AACjE,UAAM,YACJ,WAAW,KACP,MAAM;AAAA,MAAI,CAAC,MACT,EAAE,WAAW,KACT,IACA,IAAI,SAAS;AAAA,QACX,UAAU,EAAE;AAAA,QACZ,WAAW,EAAE;AAAA,QACb,GAAI,EAAE,YAAY,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,QACnD,UAAU,EAAE;AAAA,QACZ;AAAA,MACF,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":[]}
@@ -0,0 +1,89 @@
1
+ import {
2
+ S3Resource
3
+ } from "./chunk-XFREXNA2.js";
4
+
5
+ // src/resource/scaleway/scaleway.ts
6
+ import {
7
+ remapCommandsResource,
8
+ remapOpsResource,
9
+ ResourceName
10
+ } from "@struktoai/mirage-core";
11
+
12
+ // src/resource/scaleway/config.ts
13
+ import { redactConfigWithSchema, secretSchema, z } from "@struktoai/mirage-core";
14
+ var ScalewayConfigSchema = z.object({
15
+ bucket: z.string(),
16
+ presignedUrlProvider: secretSchema(
17
+ z.custom((value) => typeof value === "function")
18
+ ),
19
+ region: z.string().optional(),
20
+ endpoint: z.string().optional(),
21
+ defaultContentType: z.string().optional()
22
+ });
23
+ function resolvedScalewayEndpoint(config) {
24
+ if (config.endpoint !== void 0 && config.endpoint !== "") return config.endpoint;
25
+ if (config.region !== void 0 && config.region !== "") {
26
+ const region = config.region;
27
+ return `https://s3.${region}.scw.cloud`;
28
+ }
29
+ return void 0;
30
+ }
31
+ function scalewayToS3Config(config) {
32
+ const endpoint = resolvedScalewayEndpoint(config);
33
+ return {
34
+ bucket: config.bucket,
35
+ presignedUrlProvider: config.presignedUrlProvider,
36
+ ...config.region !== void 0 ? { region: config.region } : {},
37
+ ...endpoint !== void 0 ? { endpoint } : {},
38
+ ...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {}
39
+ };
40
+ }
41
+ function redactScalewayConfig(config) {
42
+ return redactConfigWithSchema(ScalewayConfigSchema, config);
43
+ }
44
+
45
+ // src/resource/scaleway/prompt.ts
46
+ var SCALEWAY_BROWSER_PROMPT = `{prefix}
47
+ Remote Scaleway Object Storage bucket (S3-compatible) accessed via presigned URLs (browser runtime).
48
+ Supports the full filesystem command set: ls/tree/cat/grep/find/du/cp/mv/rm/etc.
49
+ Listing operations require the presigner to sign LIST/COPY operations in
50
+ addition to GET/PUT/HEAD/DELETE \u2014 see S3BrowserPresignedUrlProvider docs.`;
51
+
52
+ // src/resource/scaleway/scaleway.ts
53
+ var ScalewayResource = class extends S3Resource {
54
+ kind = ResourceName.SCALEWAY;
55
+ prompt = SCALEWAY_BROWSER_PROMPT;
56
+ scalewayConfig;
57
+ scalewayOps;
58
+ scalewayCommands;
59
+ constructor(config) {
60
+ super(scalewayToS3Config(config));
61
+ this.scalewayConfig = config;
62
+ this.scalewayOps = remapOpsResource(super.ops(), ResourceName.SCALEWAY);
63
+ this.scalewayCommands = remapCommandsResource(super.commands(), ResourceName.SCALEWAY);
64
+ }
65
+ ops() {
66
+ return this.scalewayOps;
67
+ }
68
+ commands() {
69
+ return this.scalewayCommands;
70
+ }
71
+ getState() {
72
+ return Promise.resolve({
73
+ type: this.kind,
74
+ config: redactScalewayConfig(this.scalewayConfig)
75
+ });
76
+ }
77
+ loadState(_state) {
78
+ return Promise.resolve();
79
+ }
80
+ };
81
+
82
+ export {
83
+ resolvedScalewayEndpoint,
84
+ scalewayToS3Config,
85
+ redactScalewayConfig,
86
+ SCALEWAY_BROWSER_PROMPT,
87
+ ScalewayResource
88
+ };
89
+ //# sourceMappingURL=chunk-72GY5B23.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}\n\nexport interface ScalewayConfigRedacted extends Omit<ScalewayConfig, 'presignedUrlProvider'> {\n presignedUrlProvider: '<REDACTED>'\n}\n\nexport const 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})\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 }\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;AAejD,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,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;AAC1C,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,EACP;AACF;AAEO,SAAS,qBAAqB,QAAgD;AACnF,SAAO,uBAAuB,sBAAsB,MAAM;AAC5D;;;ACjDO,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":[]}
@@ -10,8 +10,8 @@ import {
10
10
  PathSpec,
11
11
  RAMIndexCacheStore,
12
12
  ResourceName,
13
- githubIndexEntryFromTree,
14
- githubMakeTreeEntry,
13
+ githubBuildTreeMap,
14
+ githubPopulateIndex,
15
15
  githubRead,
16
16
  githubReaddir,
17
17
  githubResolveGlob,
@@ -19,16 +19,16 @@ import {
19
19
  } from "@struktoai/mirage-core";
20
20
 
21
21
  // src/resource/github/config.ts
22
- import { normalizeFields } from "@struktoai/mirage-core";
22
+ import { normalizeFields, redactConfigWithSchema, secretStr, z } from "@struktoai/mirage-core";
23
+ var GitHubConfigSchema = z.object({
24
+ token: secretStr(),
25
+ owner: z.string(),
26
+ repo: z.string(),
27
+ ref: z.string().optional(),
28
+ baseUrl: z.string().optional()
29
+ });
23
30
  function redactGitHubConfig(config) {
24
- const out = {
25
- token: "<REDACTED>",
26
- owner: config.owner,
27
- repo: config.repo
28
- };
29
- if (config.ref !== void 0) out.ref = config.ref;
30
- if (config.baseUrl !== void 0) out.baseUrl = config.baseUrl;
31
- return out;
31
+ return redactConfigWithSchema(GitHubConfigSchema, config);
32
32
  }
33
33
  function normalizeGitHubConfig(input) {
34
34
  return normalizeFields(input, {
@@ -57,8 +57,7 @@ var GitHubResource = class _GitHubResource {
57
57
  const repoInfo = await fetchGitHubRepoInfo(transport, config.owner, config.repo);
58
58
  const ref = config.ref ?? repoInfo.default_branch;
59
59
  const { tree, truncated } = await fetchGitHubTree(transport, config.owner, config.repo, ref);
60
- const treeMap = {};
61
- for (const item of tree) treeMap[item.path] = githubMakeTreeEntry(item);
60
+ const treeMap = githubBuildTreeMap(tree);
62
61
  const accessor = new GitHubAccessor({
63
62
  transport,
64
63
  owner: config.owner,
@@ -69,7 +68,7 @@ var GitHubResource = class _GitHubResource {
69
68
  tree: treeMap
70
69
  });
71
70
  const index = new RAMIndexCacheStore({ ttl: 86400 });
72
- await populateIndex(index, tree);
71
+ await githubPopulateIndex(index, tree);
73
72
  return new _GitHubResource(config, accessor, index);
74
73
  }
75
74
  open() {
@@ -112,8 +111,6 @@ var GitHubResource = class _GitHubResource {
112
111
  getState() {
113
112
  return Promise.resolve({
114
113
  type: this.kind,
115
- needsOverride: true,
116
- redactedFields: ["token"],
117
114
  config: redactGitHubConfig(this.config),
118
115
  defaultBranch: this.accessor.defaultBranch,
119
116
  truncated: this.accessor.truncated
@@ -123,22 +120,10 @@ var GitHubResource = class _GitHubResource {
123
120
  return Promise.resolve();
124
121
  }
125
122
  };
126
- async function populateIndex(index, tree) {
127
- const dirs = /* @__PURE__ */ new Map();
128
- for (const item of tree) {
129
- const parts = item.path.split("/");
130
- const name = parts[parts.length - 1] ?? item.path;
131
- const parent = parts.length > 1 ? `/${parts.slice(0, -1).join("/")}` : "/";
132
- const arr = dirs.get(parent) ?? [];
133
- arr.push([name, githubIndexEntryFromTree(item)]);
134
- dirs.set(parent, arr);
135
- }
136
- await Promise.all([...dirs].map(([parent, entries]) => index.setDir(parent, entries)));
137
- }
138
123
 
139
124
  export {
140
125
  redactGitHubConfig,
141
126
  normalizeGitHubConfig,
142
127
  GitHubResource
143
128
  };
144
- //# sourceMappingURL=chunk-QYFCHCGX.js.map
129
+ //# sourceMappingURL=chunk-ATLYBQSC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/github/github.ts","../src/resource/github/config.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n fetchGitHubRepoInfo,\n fetchGitHubTree,\n type FileStat,\n GITHUB_COMMANDS,\n GITHUB_PROMPT,\n GITHUB_VFS_OPS,\n GitHubAccessor,\n HttpGitHubTransport,\n type IndexCacheStore,\n PathSpec,\n RAMIndexCacheStore,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n ResourceName,\n githubBuildTreeMap,\n githubPopulateIndex,\n githubRead,\n githubReaddir,\n githubResolveGlob,\n githubStat,\n} from '@struktoai/mirage-core'\nimport { redactGitHubConfig, type GitHubConfig, type GitHubConfigRedacted } from './config.ts'\n\nexport interface GitHubResourceState {\n type: string\n config: GitHubConfigRedacted\n defaultBranch: string\n truncated: boolean\n}\n\nexport class GitHubResource implements Resource {\n readonly kind: string = ResourceName.GITHUB\n readonly isRemote: boolean = true\n readonly indexTtl: number = 86_400\n readonly prompt: string = GITHUB_PROMPT\n readonly config: GitHubConfig\n readonly accessor: GitHubAccessor\n readonly index: IndexCacheStore\n\n private constructor(config: GitHubConfig, accessor: GitHubAccessor, index: IndexCacheStore) {\n this.config = config\n this.accessor = accessor\n this.index = index\n }\n\n static async create(config: GitHubConfig): Promise<GitHubResource> {\n const transportOpts: { token: string; baseUrl?: string } = { token: config.token }\n if (config.baseUrl !== undefined) transportOpts.baseUrl = config.baseUrl\n const transport = new HttpGitHubTransport(transportOpts)\n const repoInfo = await fetchGitHubRepoInfo(transport, config.owner, config.repo)\n const ref = config.ref ?? repoInfo.default_branch\n const { tree, truncated } = await fetchGitHubTree(transport, config.owner, config.repo, ref)\n const treeMap = githubBuildTreeMap(tree)\n const accessor = new GitHubAccessor({\n transport,\n owner: config.owner,\n repo: config.repo,\n ref,\n defaultBranch: repoInfo.default_branch,\n truncated,\n tree: treeMap,\n })\n const index = new RAMIndexCacheStore({ ttl: 86_400 })\n await githubPopulateIndex(index, tree)\n return new GitHubResource(config, accessor, index)\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n close(): Promise<void> {\n return Promise.resolve()\n }\n\n commands(): readonly RegisteredCommand[] {\n return GITHUB_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return GITHUB_VFS_OPS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return githubRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return githubReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return githubStat(this.accessor, p, this.index)\n }\n\n async fingerprint(p: PathSpec): Promise<string | null> {\n const lookup = await this.index.get(p.original)\n return lookup.entry?.id ?? null\n }\n\n glob(paths: readonly PathSpec[], prefix = ''): Promise<PathSpec[]> {\n const effective =\n prefix !== ''\n ? paths.map((p) =>\n p.prefix !== ''\n ? p\n : new PathSpec({\n original: p.original,\n directory: p.directory,\n ...(p.pattern !== null ? { pattern: p.pattern } : {}),\n resolved: p.resolved,\n prefix,\n }),\n )\n : paths\n return githubResolveGlob(this.accessor, effective, this.index)\n }\n\n getState(): Promise<GitHubResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactGitHubConfig(this.config),\n defaultBranch: this.accessor.defaultBranch,\n truncated: this.accessor.truncated,\n })\n }\n\n loadState(_state: GitHubResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n","// ========= 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 GitHubConfig {\n token: string\n owner: string\n repo: string\n ref?: string\n baseUrl?: string\n}\n\nexport interface GitHubConfigRedacted {\n token: '<REDACTED>'\n owner: string\n repo: string\n ref?: string\n baseUrl?: string\n}\n\nexport const GitHubConfigSchema = z.object({\n token: secretStr(),\n owner: z.string(),\n repo: z.string(),\n ref: z.string().optional(),\n baseUrl: z.string().optional(),\n})\n\nexport function redactGitHubConfig(config: GitHubConfig): GitHubConfigRedacted {\n return redactConfigWithSchema(GitHubConfigSchema, config) as unknown as GitHubConfigRedacted\n}\n\nexport function normalizeGitHubConfig(input: Record<string, unknown>): GitHubConfig {\n return normalizeFields(input, {\n rename: { base_url: 'baseUrl' },\n }) as unknown as GitHubConfig\n}\n"],"mappings":";AAcA;AAAA,EACE;AAAA,EACA;AAAA,EAEA;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,EACA;AAAA,OACK;;;ACtBP,SAAS,iBAAiB,wBAAwB,WAAW,SAAS;AAkB/D,IAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,OAAO,UAAU;AAAA,EACjB,OAAO,EAAE,OAAO;AAAA,EAChB,MAAM,EAAE,OAAO;AAAA,EACf,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,EACzB,SAAS,EAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAEM,SAAS,mBAAmB,QAA4C;AAC7E,SAAO,uBAAuB,oBAAoB,MAAM;AAC1D;AAEO,SAAS,sBAAsB,OAA8C;AAClF,SAAO,gBAAgB,OAAO;AAAA,IAC5B,QAAQ,EAAE,UAAU,UAAU;AAAA,EAChC,CAAC;AACH;;;ADFO,IAAM,iBAAN,MAAM,gBAAmC;AAAA,EACrC,OAAe,aAAa;AAAA,EAC5B,WAAoB;AAAA,EACpB,WAAmB;AAAA,EACnB,SAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EAED,YAAY,QAAsB,UAA0B,OAAwB;AAC1F,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,aAAa,OAAO,QAA+C;AACjE,UAAM,gBAAqD,EAAE,OAAO,OAAO,MAAM;AACjF,QAAI,OAAO,YAAY,OAAW,eAAc,UAAU,OAAO;AACjE,UAAM,YAAY,IAAI,oBAAoB,aAAa;AACvD,UAAM,WAAW,MAAM,oBAAoB,WAAW,OAAO,OAAO,OAAO,IAAI;AAC/E,UAAM,MAAM,OAAO,OAAO,SAAS;AACnC,UAAM,EAAE,MAAM,UAAU,IAAI,MAAM,gBAAgB,WAAW,OAAO,OAAO,OAAO,MAAM,GAAG;AAC3F,UAAM,UAAU,mBAAmB,IAAI;AACvC,UAAM,WAAW,IAAI,eAAe;AAAA,MAClC;AAAA,MACA,OAAO,OAAO;AAAA,MACd,MAAM,OAAO;AAAA,MACb;AAAA,MACA,eAAe,SAAS;AAAA,MACxB;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AACD,UAAM,QAAQ,IAAI,mBAAmB,EAAE,KAAK,MAAO,CAAC;AACpD,UAAM,oBAAoB,OAAO,IAAI;AACrC,WAAO,IAAI,gBAAe,QAAQ,UAAU,KAAK;AAAA,EACnD;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,WAAW,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EAChD;AAAA,EAEA,QAAQ,GAAgC;AACtC,WAAO,cAAc,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACnD;AAAA,EAEA,KAAK,GAAgC;AACnC,WAAO,WAAW,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EAChD;AAAA,EAEA,MAAM,YAAY,GAAqC;AACrD,UAAM,SAAS,MAAM,KAAK,MAAM,IAAI,EAAE,QAAQ;AAC9C,WAAO,OAAO,OAAO,MAAM;AAAA,EAC7B;AAAA,EAEA,KAAK,OAA4B,SAAS,IAAyB;AACjE,UAAM,YACJ,WAAW,KACP,MAAM;AAAA,MAAI,CAAC,MACT,EAAE,WAAW,KACT,IACA,IAAI,SAAS;AAAA,QACX,UAAU,EAAE;AAAA,QACZ,WAAW,EAAE;AAAA,QACb,GAAI,EAAE,YAAY,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,QACnD,UAAU,EAAE;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACP,IACA;AACN,WAAO,kBAAkB,KAAK,UAAU,WAAW,KAAK,KAAK;AAAA,EAC/D;AAAA,EAEA,WAAyC;AACvC,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,mBAAmB,KAAK,MAAM;AAAA,MACtC,eAAe,KAAK,SAAS;AAAA,MAC7B,WAAW,KAAK,SAAS;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,QAA4C;AACpD,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -16,10 +16,15 @@ import {
16
16
  } from "@struktoai/mirage-core";
17
17
 
18
18
  // src/resource/notion/config.ts
19
+ import { redactConfigWithSchema, secretSchema, z } from "@struktoai/mirage-core";
20
+ var NotionConfigSchema = z.object({
21
+ authProvider: secretSchema(
22
+ z.custom((value) => value !== null && typeof value === "object")
23
+ ),
24
+ serverUrl: z.string().optional()
25
+ });
19
26
  function redactNotionConfig(config) {
20
- const out = { authProvider: "<REDACTED>" };
21
- if (config.serverUrl !== void 0) out.serverUrl = config.serverUrl;
22
- return out;
27
+ return redactConfigWithSchema(NotionConfigSchema, config);
23
28
  }
24
29
 
25
30
  // src/resource/notion/notion.ts
@@ -79,8 +84,6 @@ var NotionResource = class {
79
84
  getState() {
80
85
  return Promise.resolve({
81
86
  type: this.kind,
82
- needsOverride: true,
83
- redactedFields: ["authProvider"],
84
87
  config: redactNotionConfig(this.config)
85
88
  });
86
89
  }
@@ -93,4 +96,4 @@ export {
93
96
  redactNotionConfig,
94
97
  NotionResource
95
98
  };
96
- //# sourceMappingURL=chunk-ONQ5JGPR.js.map
99
+ //# sourceMappingURL=chunk-BUXWUKN7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/notion/notion.ts","../src/resource/notion/config.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n type FileStat,\n type IndexCacheStore,\n MCPNotionTransport,\n type MCPNotionTransportOptions,\n NOTION_COMMANDS,\n NOTION_PROMPT,\n NOTION_VFS_OPS,\n NOTION_WRITE_PROMPT,\n NotionAccessor,\n notionRead,\n notionReaddir,\n notionStat,\n PathSpec,\n RAMIndexCacheStore,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n ResourceName,\n resolveNotionGlob,\n} from '@struktoai/mirage-core'\nimport { redactNotionConfig, type NotionConfig, type NotionConfigRedacted } from './config.ts'\n\nexport interface NotionResourceState {\n type: string\n config: NotionConfigRedacted\n}\n\nexport class NotionResource implements Resource {\n readonly kind: string = ResourceName.NOTION\n readonly isRemote: boolean = true\n readonly indexTtl: number = 600\n readonly prompt: string = NOTION_PROMPT\n readonly writePrompt: string = NOTION_WRITE_PROMPT\n readonly config: NotionConfig\n readonly accessor: NotionAccessor\n readonly index: IndexCacheStore\n\n constructor(config: NotionConfig) {\n this.config = config\n const opts: MCPNotionTransportOptions = { authProvider: config.authProvider }\n if (config.serverUrl !== undefined) opts.serverUrl = config.serverUrl\n this.accessor = new NotionAccessor(new MCPNotionTransport(opts))\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 NOTION_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return NOTION_VFS_OPS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return notionRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return notionReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return notionStat(this.accessor, p, this.index)\n }\n\n async fingerprint(p: PathSpec): Promise<string | null> {\n const lookup = await this.index.get(p.original)\n return lookup.entry?.remoteTime ?? null\n }\n\n glob(paths: readonly PathSpec[], prefix = ''): Promise<PathSpec[]> {\n const effective =\n prefix !== ''\n ? paths.map((p) =>\n p.prefix !== ''\n ? p\n : new PathSpec({\n original: p.original,\n directory: p.directory,\n ...(p.pattern !== null ? { pattern: p.pattern } : {}),\n resolved: p.resolved,\n prefix,\n }),\n )\n : paths\n return resolveNotionGlob(this.accessor, effective, this.index)\n }\n\n getState(): Promise<NotionResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactNotionConfig(this.config),\n })\n }\n\n loadState(_state: NotionResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js'\nimport { redactConfigWithSchema, secretSchema, z } from '@struktoai/mirage-core'\n\nexport interface NotionConfig {\n authProvider: OAuthClientProvider\n serverUrl?: string\n}\n\nexport interface NotionConfigRedacted {\n authProvider: '<REDACTED>'\n serverUrl?: string\n}\n\nexport const NotionConfigSchema = z.object({\n authProvider: secretSchema(\n z.custom<OAuthClientProvider>((value) => value !== null && typeof value === 'object'),\n ),\n serverUrl: z.string().optional(),\n})\n\nexport function redactNotionConfig(config: NotionConfig): NotionConfigRedacted {\n return redactConfigWithSchema(NotionConfigSchema, config) as unknown as NotionConfigRedacted\n}\n"],"mappings":";AAcA;AAAA,EAGE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA,OACK;;;ACnBP,SAAS,wBAAwB,cAAc,SAAS;AAYjD,IAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,cAAc;AAAA,IACZ,EAAE,OAA4B,CAAC,UAAU,UAAU,QAAQ,OAAO,UAAU,QAAQ;AAAA,EACtF;AAAA,EACA,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAEM,SAAS,mBAAmB,QAA4C;AAC7E,SAAO,uBAAuB,oBAAoB,MAAM;AAC1D;;;ADMO,IAAM,iBAAN,MAAyC;AAAA,EACrC,OAAe,aAAa;AAAA,EAC5B,WAAoB;AAAA,EACpB,WAAmB;AAAA,EACnB,SAAiB;AAAA,EACjB,cAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAAsB;AAChC,SAAK,SAAS;AACd,UAAM,OAAkC,EAAE,cAAc,OAAO,aAAa;AAC5E,QAAI,OAAO,cAAc,OAAW,MAAK,YAAY,OAAO;AAC5D,SAAK,WAAW,IAAI,eAAe,IAAI,mBAAmB,IAAI,CAAC;AAC/D,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,WAAW,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EAChD;AAAA,EAEA,QAAQ,GAAgC;AACtC,WAAO,cAAc,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACnD;AAAA,EAEA,KAAK,GAAgC;AACnC,WAAO,WAAW,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EAChD;AAAA,EAEA,MAAM,YAAY,GAAqC;AACrD,UAAM,SAAS,MAAM,KAAK,MAAM,IAAI,EAAE,QAAQ;AAC9C,WAAO,OAAO,OAAO,cAAc;AAAA,EACrC;AAAA,EAEA,KAAK,OAA4B,SAAS,IAAyB;AACjE,UAAM,YACJ,WAAW,KACP,MAAM;AAAA,MAAI,CAAC,MACT,EAAE,WAAW,KACT,IACA,IAAI,SAAS;AAAA,QACX,UAAU,EAAE;AAAA,QACZ,WAAW,EAAE;AAAA,QACb,GAAI,EAAE,YAAY,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,QACnD,UAAU,EAAE;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACP,IACA;AACN,WAAO,kBAAkB,KAAK,UAAU,WAAW,KAAK,KAAK;AAAA,EAC/D;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":[]}
@@ -0,0 +1,85 @@
1
+ import {
2
+ S3Resource
3
+ } from "./chunk-XFREXNA2.js";
4
+
5
+ // src/resource/wasabi/wasabi.ts
6
+ import {
7
+ remapCommandsResource,
8
+ remapOpsResource,
9
+ ResourceName
10
+ } from "@struktoai/mirage-core";
11
+
12
+ // src/resource/wasabi/config.ts
13
+ import { redactConfigWithSchema, secretSchema, z } from "@struktoai/mirage-core";
14
+ var WasabiConfigSchema = z.object({
15
+ bucket: z.string(),
16
+ presignedUrlProvider: secretSchema(
17
+ z.custom((value) => typeof value === "function")
18
+ ),
19
+ region: z.string().optional(),
20
+ endpoint: z.string().optional(),
21
+ defaultContentType: z.string().optional()
22
+ });
23
+ function resolvedWasabiEndpoint(config) {
24
+ if (config.endpoint !== void 0 && config.endpoint !== "") return config.endpoint;
25
+ const region = config.region ?? "us-east-1";
26
+ return region === "us-east-1" ? "https://s3.wasabisys.com" : `https://s3.${region}.wasabisys.com`;
27
+ }
28
+ function wasabiToS3Config(config) {
29
+ return {
30
+ bucket: config.bucket,
31
+ presignedUrlProvider: config.presignedUrlProvider,
32
+ ...config.region !== void 0 ? { region: config.region } : {},
33
+ endpoint: resolvedWasabiEndpoint(config),
34
+ ...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {}
35
+ };
36
+ }
37
+ function redactWasabiConfig(config) {
38
+ return redactConfigWithSchema(WasabiConfigSchema, config);
39
+ }
40
+
41
+ // src/resource/wasabi/prompt.ts
42
+ var WASABI_BROWSER_PROMPT = `{prefix}
43
+ Remote Wasabi bucket (S3-compatible) accessed via presigned URLs (browser runtime).
44
+ Supports the full filesystem command set: ls/tree/cat/grep/find/du/cp/mv/rm/etc.
45
+ Listing operations require the presigner to sign LIST/COPY operations in
46
+ addition to GET/PUT/HEAD/DELETE \u2014 see S3BrowserPresignedUrlProvider docs.`;
47
+
48
+ // src/resource/wasabi/wasabi.ts
49
+ var WasabiResource = class extends S3Resource {
50
+ kind = ResourceName.WASABI;
51
+ prompt = WASABI_BROWSER_PROMPT;
52
+ wasabiConfig;
53
+ wasabiOps;
54
+ wasabiCommands;
55
+ constructor(config) {
56
+ super(wasabiToS3Config(config));
57
+ this.wasabiConfig = config;
58
+ this.wasabiOps = remapOpsResource(super.ops(), ResourceName.WASABI);
59
+ this.wasabiCommands = remapCommandsResource(super.commands(), ResourceName.WASABI);
60
+ }
61
+ ops() {
62
+ return this.wasabiOps;
63
+ }
64
+ commands() {
65
+ return this.wasabiCommands;
66
+ }
67
+ getState() {
68
+ return Promise.resolve({
69
+ type: this.kind,
70
+ config: redactWasabiConfig(this.wasabiConfig)
71
+ });
72
+ }
73
+ loadState(_state) {
74
+ return Promise.resolve();
75
+ }
76
+ };
77
+
78
+ export {
79
+ resolvedWasabiEndpoint,
80
+ wasabiToS3Config,
81
+ redactWasabiConfig,
82
+ WASABI_BROWSER_PROMPT,
83
+ WasabiResource
84
+ };
85
+ //# sourceMappingURL=chunk-CAKSQ2LV.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}\n\nexport interface WasabiConfigRedacted extends Omit<WasabiConfig, 'presignedUrlProvider'> {\n presignedUrlProvider: '<REDACTED>'\n}\n\nexport const 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})\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 }\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;AAejD,IAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,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;AAC1C,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,EACP;AACF;AAEO,SAAS,mBAAmB,QAA4C;AAC7E,SAAO,uBAAuB,oBAAoB,MAAM;AAC1D;;;AC7CO,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":[]}
@@ -0,0 +1,89 @@
1
+ import {
2
+ S3Resource
3
+ } from "./chunk-XFREXNA2.js";
4
+
5
+ // src/resource/tencent/tencent.ts
6
+ import {
7
+ remapCommandsResource,
8
+ remapOpsResource,
9
+ ResourceName
10
+ } from "@struktoai/mirage-core";
11
+
12
+ // src/resource/tencent/config.ts
13
+ import { redactConfigWithSchema, secretSchema, z } from "@struktoai/mirage-core";
14
+ var TencentConfigSchema = z.object({
15
+ bucket: z.string(),
16
+ presignedUrlProvider: secretSchema(
17
+ z.custom((value) => typeof value === "function")
18
+ ),
19
+ region: z.string().optional(),
20
+ endpoint: z.string().optional(),
21
+ defaultContentType: z.string().optional()
22
+ });
23
+ function resolvedTencentEndpoint(config) {
24
+ if (config.endpoint !== void 0 && config.endpoint !== "") return config.endpoint;
25
+ if (config.region !== void 0 && config.region !== "") {
26
+ const region = config.region;
27
+ return `https://cos.${region}.myqcloud.com`;
28
+ }
29
+ return void 0;
30
+ }
31
+ function tencentToS3Config(config) {
32
+ const endpoint = resolvedTencentEndpoint(config);
33
+ return {
34
+ bucket: config.bucket,
35
+ presignedUrlProvider: config.presignedUrlProvider,
36
+ ...config.region !== void 0 ? { region: config.region } : {},
37
+ ...endpoint !== void 0 ? { endpoint } : {},
38
+ ...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {}
39
+ };
40
+ }
41
+ function redactTencentConfig(config) {
42
+ return redactConfigWithSchema(TencentConfigSchema, config);
43
+ }
44
+
45
+ // src/resource/tencent/prompt.ts
46
+ var TENCENT_BROWSER_PROMPT = `{prefix}
47
+ Remote Tencent Cloud COS bucket (S3-compatible) accessed via presigned URLs (browser runtime).
48
+ Supports the full filesystem command set: ls/tree/cat/grep/find/du/cp/mv/rm/etc.
49
+ Listing operations require the presigner to sign LIST/COPY operations in
50
+ addition to GET/PUT/HEAD/DELETE \u2014 see S3BrowserPresignedUrlProvider docs.`;
51
+
52
+ // src/resource/tencent/tencent.ts
53
+ var TencentResource = class extends S3Resource {
54
+ kind = ResourceName.TENCENT;
55
+ prompt = TENCENT_BROWSER_PROMPT;
56
+ tencentConfig;
57
+ tencentOps;
58
+ tencentCommands;
59
+ constructor(config) {
60
+ super(tencentToS3Config(config));
61
+ this.tencentConfig = config;
62
+ this.tencentOps = remapOpsResource(super.ops(), ResourceName.TENCENT);
63
+ this.tencentCommands = remapCommandsResource(super.commands(), ResourceName.TENCENT);
64
+ }
65
+ ops() {
66
+ return this.tencentOps;
67
+ }
68
+ commands() {
69
+ return this.tencentCommands;
70
+ }
71
+ getState() {
72
+ return Promise.resolve({
73
+ type: this.kind,
74
+ config: redactTencentConfig(this.tencentConfig)
75
+ });
76
+ }
77
+ loadState(_state) {
78
+ return Promise.resolve();
79
+ }
80
+ };
81
+
82
+ export {
83
+ resolvedTencentEndpoint,
84
+ tencentToS3Config,
85
+ redactTencentConfig,
86
+ TENCENT_BROWSER_PROMPT,
87
+ TencentResource
88
+ };
89
+ //# sourceMappingURL=chunk-CO4FMKOF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/tencent/tencent.ts","../src/resource/tencent/config.ts","../src/resource/tencent/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 redactTencentConfig,\n tencentToS3Config,\n type TencentConfig,\n type TencentConfigRedacted,\n} from './config.ts'\nimport { TENCENT_BROWSER_PROMPT } from './prompt.ts'\n\nexport interface TencentResourceState {\n type: string\n config: TencentConfigRedacted\n}\n\nexport class TencentResource extends S3Resource {\n override readonly kind: string = ResourceName.TENCENT\n override readonly prompt: string = TENCENT_BROWSER_PROMPT\n readonly tencentConfig: TencentConfig\n private readonly tencentOps: readonly RegisteredOp[]\n private readonly tencentCommands: readonly RegisteredCommand[]\n\n constructor(config: TencentConfig) {\n super(tencentToS3Config(config))\n this.tencentConfig = config\n this.tencentOps = remapOpsResource(super.ops(), ResourceName.TENCENT)\n this.tencentCommands = remapCommandsResource(super.commands(), ResourceName.TENCENT)\n }\n\n override ops(): readonly RegisteredOp[] {\n return this.tencentOps\n }\n\n override commands(): readonly RegisteredCommand[] {\n return this.tencentCommands\n }\n\n override getState(): Promise<TencentResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactTencentConfig(this.tencentConfig),\n })\n }\n\n override loadState(_state: TencentResourceState): 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 TencentConfig {\n bucket: string\n presignedUrlProvider: S3BrowserPresignedUrlProvider\n region?: string\n endpoint?: string\n defaultContentType?: string\n}\n\nexport interface TencentConfigRedacted extends Omit<TencentConfig, 'presignedUrlProvider'> {\n presignedUrlProvider: '<REDACTED>'\n}\n\nexport const TencentConfigSchema = 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})\n\nexport function resolvedTencentEndpoint(config: TencentConfig): 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://cos.${region}.myqcloud.com`\n }\n return undefined\n}\n\nexport function tencentToS3Config(config: TencentConfig): S3Config {\n const endpoint = resolvedTencentEndpoint(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 }\n}\n\nexport function redactTencentConfig(config: TencentConfig): TencentConfigRedacted {\n return redactConfigWithSchema(TencentConfigSchema, config) as unknown as TencentConfigRedacted\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 TENCENT_BROWSER_PROMPT = `{prefix}\n Remote Tencent Cloud COS 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;AAejD,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,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;AAC1C,CAAC;AAEM,SAAS,wBAAwB,QAA2C;AACjF,MAAI,OAAO,aAAa,UAAa,OAAO,aAAa,GAAI,QAAO,OAAO;AAC3E,MAAI,OAAO,WAAW,UAAa,OAAO,WAAW,IAAI;AACvD,UAAM,SAAS,OAAO;AACtB,WAAO,eAAe,MAAM;AAAA,EAC9B;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,QAAiC;AACjE,QAAM,WAAW,wBAAwB,MAAM;AAC/C,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,EACP;AACF;AAEO,SAAS,oBAAoB,QAA8C;AAChF,SAAO,uBAAuB,qBAAqB,MAAM;AAC3D;;;ACjDO,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;;;AFqB/B,IAAM,kBAAN,cAA8B,WAAW;AAAA,EAC5B,OAAe,aAAa;AAAA,EAC5B,SAAiB;AAAA,EAC1B;AAAA,EACQ;AAAA,EACA;AAAA,EAEjB,YAAY,QAAuB;AACjC,UAAM,kBAAkB,MAAM,CAAC;AAC/B,SAAK,gBAAgB;AACrB,SAAK,aAAa,iBAAiB,MAAM,IAAI,GAAG,aAAa,OAAO;AACpE,SAAK,kBAAkB,sBAAsB,MAAM,SAAS,GAAG,aAAa,OAAO;AAAA,EACrF;AAAA,EAES,MAA+B;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAyC;AAChD,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAA0C;AACjD,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,oBAAoB,KAAK,aAAa;AAAA,IAChD,CAAC;AAAA,EACH;AAAA,EAES,UAAU,QAA6C;AAC9D,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -1,11 +1,26 @@
1
1
  import {
2
2
  S3Resource
3
- } from "./chunk-VLFE4FGD.js";
3
+ } from "./chunk-XFREXNA2.js";
4
4
 
5
5
  // src/resource/oci/oci.ts
6
- import { ResourceName } from "@struktoai/mirage-core";
6
+ import {
7
+ remapCommandsResource,
8
+ remapOpsResource,
9
+ ResourceName
10
+ } from "@struktoai/mirage-core";
7
11
 
8
12
  // src/resource/oci/config.ts
13
+ import { redactConfigWithSchema, secretSchema, z } from "@struktoai/mirage-core";
14
+ var OCIConfigSchema = z.object({
15
+ bucket: z.string(),
16
+ presignedUrlProvider: secretSchema(
17
+ z.custom((value) => typeof value === "function")
18
+ ),
19
+ namespace: z.string().optional(),
20
+ region: z.string().optional(),
21
+ endpoint: z.string().optional(),
22
+ defaultContentType: z.string().optional()
23
+ });
9
24
  function resolvedOciEndpoint(config) {
10
25
  if (config.endpoint !== void 0 && config.endpoint !== "") return config.endpoint;
11
26
  if (config.namespace !== void 0 && config.namespace !== "" && config.region !== void 0 && config.region !== "") {
@@ -24,7 +39,7 @@ function ociToS3Config(config) {
24
39
  };
25
40
  }
26
41
  function redactOciConfig(config) {
27
- return { ...config, presignedUrlProvider: "<REDACTED>" };
42
+ return redactConfigWithSchema(OCIConfigSchema, config);
28
43
  }
29
44
 
30
45
  // src/resource/oci/prompt.ts
@@ -35,18 +50,6 @@ var OCI_BROWSER_PROMPT = `{prefix}
35
50
  addition to GET/PUT/HEAD/DELETE \u2014 see S3BrowserPresignedUrlProvider docs.`;
36
51
 
37
52
  // src/resource/oci/oci.ts
38
- function remapOpsResource(ops, to) {
39
- return ops.map((op) => op.resource === ResourceName.S3 ? { ...op, resource: to } : op);
40
- }
41
- function remapCommandsResource(commands, to) {
42
- return commands.map((cmd) => {
43
- if (cmd.resource !== ResourceName.S3) return cmd;
44
- const proto = Object.getPrototypeOf(cmd);
45
- const copy = Object.assign(Object.create(proto), cmd);
46
- Object.assign(copy, { resource: to });
47
- return copy;
48
- });
49
- }
50
53
  var OCIResource = class extends S3Resource {
51
54
  kind = ResourceName.OCI;
52
55
  prompt = OCI_BROWSER_PROMPT;
@@ -68,8 +71,6 @@ var OCIResource = class extends S3Resource {
68
71
  getState() {
69
72
  return Promise.resolve({
70
73
  type: this.kind,
71
- needsOverride: true,
72
- redactedFields: ["presignedUrlProvider"],
73
74
  config: redactOciConfig(this.ociConfig)
74
75
  });
75
76
  }
@@ -85,4 +86,4 @@ export {
85
86
  OCI_BROWSER_PROMPT,
86
87
  OCIResource
87
88
  };
88
- //# sourceMappingURL=chunk-5Q5GJUAF.js.map
89
+ //# sourceMappingURL=chunk-D3JDGGKO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/oci/oci.ts","../src/resource/oci/config.ts","../src/resource/oci/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 { ociToS3Config, redactOciConfig, type OCIConfig, type OCIConfigRedacted } from './config.ts'\nimport { OCI_BROWSER_PROMPT } from './prompt.ts'\n\nexport interface OCIResourceState {\n type: string\n config: OCIConfigRedacted\n}\n\nexport class OCIResource extends S3Resource {\n override readonly kind: string = ResourceName.OCI\n override readonly prompt: string = OCI_BROWSER_PROMPT\n readonly ociConfig: OCIConfig\n private readonly ociOps: readonly RegisteredOp[]\n private readonly ociCommands: readonly RegisteredCommand[]\n\n constructor(config: OCIConfig) {\n super(ociToS3Config(config))\n this.ociConfig = config\n this.ociOps = remapOpsResource(super.ops(), ResourceName.OCI)\n this.ociCommands = remapCommandsResource(super.commands(), ResourceName.OCI)\n }\n\n override ops(): readonly RegisteredOp[] {\n return this.ociOps\n }\n\n override commands(): readonly RegisteredCommand[] {\n return this.ociCommands\n }\n\n override getState(): Promise<OCIResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactOciConfig(this.ociConfig),\n })\n }\n\n override loadState(_state: OCIResourceState): 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 OCIConfig {\n bucket: string\n presignedUrlProvider: S3BrowserPresignedUrlProvider\n namespace?: string\n region?: string\n endpoint?: string\n defaultContentType?: string\n}\n\nexport interface OCIConfigRedacted extends Omit<OCIConfig, 'presignedUrlProvider'> {\n presignedUrlProvider: '<REDACTED>'\n}\n\nexport const OCIConfigSchema = z.object({\n bucket: z.string(),\n presignedUrlProvider: secretSchema(\n z.custom<S3BrowserPresignedUrlProvider>((value) => typeof value === 'function'),\n ),\n namespace: z.string().optional(),\n region: z.string().optional(),\n endpoint: z.string().optional(),\n defaultContentType: z.string().optional(),\n})\n\nexport function resolvedOciEndpoint(config: OCIConfig): string | undefined {\n if (config.endpoint !== undefined && config.endpoint !== '') return config.endpoint\n if (\n config.namespace !== undefined &&\n config.namespace !== '' &&\n config.region !== undefined &&\n config.region !== ''\n ) {\n return `https://${config.namespace}.compat.objectstorage.${config.region}.oci.customer-oci.com`\n }\n return undefined\n}\n\nexport function ociToS3Config(config: OCIConfig): S3Config {\n const endpoint = resolvedOciEndpoint(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 }\n}\n\nexport function redactOciConfig(config: OCIConfig): OCIConfigRedacted {\n return redactConfigWithSchema(OCIConfigSchema, config) as unknown as OCIConfigRedacted\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 OCI_BROWSER_PROMPT = `{prefix}\n Remote Oracle Cloud Object Storage 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;AAgBjD,IAAM,kBAAkB,EAAE,OAAO;AAAA,EACtC,QAAQ,EAAE,OAAO;AAAA,EACjB,sBAAsB;AAAA,IACpB,EAAE,OAAsC,CAAC,UAAU,OAAO,UAAU,UAAU;AAAA,EAChF;AAAA,EACA,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAC1C,CAAC;AAEM,SAAS,oBAAoB,QAAuC;AACzE,MAAI,OAAO,aAAa,UAAa,OAAO,aAAa,GAAI,QAAO,OAAO;AAC3E,MACE,OAAO,cAAc,UACrB,OAAO,cAAc,MACrB,OAAO,WAAW,UAClB,OAAO,WAAW,IAClB;AACA,WAAO,WAAW,OAAO,SAAS,yBAAyB,OAAO,MAAM;AAAA,EAC1E;AACA,SAAO;AACT;AAEO,SAAS,cAAc,QAA6B;AACzD,QAAM,WAAW,oBAAoB,MAAM;AAC3C,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,EACP;AACF;AAEO,SAAS,gBAAgB,QAAsC;AACpE,SAAO,uBAAuB,iBAAiB,MAAM;AACvD;;;ACvDO,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
  redactBoxConfig
3
- } from "./chunk-NBWTZXH2.js";
3
+ } from "./chunk-J54OBIJA.js";
4
4
 
5
5
  // src/resource/box/box.ts
6
6
  import {
@@ -78,8 +78,6 @@ var BoxResource = class {
78
78
  getState() {
79
79
  return Promise.resolve({
80
80
  type: this.kind,
81
- needsOverride: true,
82
- redactedFields: ["clientSecret", "refreshToken", "accessToken"],
83
81
  config: redactBoxConfig(this.config)
84
82
  });
85
83
  }
@@ -91,4 +89,4 @@ var BoxResource = class {
91
89
  export {
92
90
  BoxResource
93
91
  };
94
- //# sourceMappingURL=chunk-DDM2Z7YA.js.map
92
+ //# sourceMappingURL=chunk-D6HF462C.js.map