@struktoai/mirage-node 0.0.2 → 0.0.3

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 (200) hide show
  1. package/README.md +1 -1
  2. package/dist/{aliyun-TMZRUYCG.js → aliyun-JMJ3PFYY.js} +3 -3
  3. package/dist/{backblaze-OHW57DLK.js → backblaze-TDFD23QO.js} +3 -3
  4. package/dist/{box-UXTCAFOZ.js → box-GQ2U2R6R.js} +2 -2
  5. package/dist/{ceph-TNN4I2FT.js → ceph-S2VOYO6G.js} +3 -3
  6. package/dist/{chunk-FXFDBF3P.js → chunk-3WIO7NBR.js} +2 -2
  7. package/dist/{chunk-O7ODGJYL.js → chunk-47AVIIOT.js} +2 -2
  8. package/dist/{chunk-Q6CDMOM6.js → chunk-7CW3BMPH.js} +2 -2
  9. package/dist/{chunk-E7RW3SBV.js → chunk-A7IVFIOP.js} +2 -2
  10. package/dist/chunk-A7IVFIOP.js.map +1 -0
  11. package/dist/{chunk-3T3RMDNX.js → chunk-AUHSTJJ3.js} +2 -2
  12. package/dist/{chunk-PJBQKMCD.js → chunk-DM4GSE26.js} +2 -2
  13. package/dist/{chunk-5DLOHQJ2.js → chunk-EM4J5EQS.js} +2 -2
  14. package/dist/chunk-EM4J5EQS.js.map +1 -0
  15. package/dist/{chunk-ABTEGAFB.js → chunk-EZQ5HBAC.js} +2 -2
  16. package/dist/chunk-EZQ5HBAC.js.map +1 -0
  17. package/dist/{chunk-KTNDT45N.js → chunk-FQ33BYFR.js} +2 -2
  18. package/dist/{chunk-YAVGCQUP.js → chunk-G2WCEUQL.js} +2 -2
  19. package/dist/chunk-G2WCEUQL.js.map +1 -0
  20. package/dist/{chunk-RLGWMJD3.js → chunk-GCFYZSVR.js} +133 -3
  21. package/dist/chunk-GCFYZSVR.js.map +1 -0
  22. package/dist/{chunk-NHS7WLEQ.js → chunk-GS5AUKUO.js} +2 -2
  23. package/dist/chunk-GS5AUKUO.js.map +1 -0
  24. package/dist/{chunk-BYTU2YC3.js → chunk-HGCRXJGP.js} +2 -2
  25. package/dist/{chunk-G5BZE7UA.js → chunk-HJJMP6IX.js} +2 -2
  26. package/dist/{chunk-IQVNVTOP.js → chunk-I5THIMPP.js} +2 -2
  27. package/dist/chunk-IDYHQQOH.js +1095 -0
  28. package/dist/chunk-IDYHQQOH.js.map +1 -0
  29. package/dist/{chunk-C6NHFMIP.js → chunk-IK2L4EN3.js} +2 -2
  30. package/dist/{chunk-LYDMMNL2.js → chunk-JAGJTM3Q.js} +2 -2
  31. package/dist/chunk-JAGJTM3Q.js.map +1 -0
  32. package/dist/{chunk-A7X4L4JM.js → chunk-JCC4CU2I.js} +2 -2
  33. package/dist/chunk-JCC4CU2I.js.map +1 -0
  34. package/dist/{chunk-AJICZLHT.js → chunk-KPULTUOK.js} +2 -2
  35. package/dist/{chunk-YPT4JBUY.js → chunk-LV2G7VHL.js} +2 -2
  36. package/dist/chunk-LV2G7VHL.js.map +1 -0
  37. package/dist/{chunk-C6NHEDHY.js → chunk-M5FVUIYP.js} +2 -2
  38. package/dist/chunk-M5FVUIYP.js.map +1 -0
  39. package/dist/{chunk-HEHERHQ5.js → chunk-MPCCRRE6.js} +2 -2
  40. package/dist/chunk-MPCCRRE6.js.map +1 -0
  41. package/dist/{chunk-RQYEEA2O.js → chunk-N5FSLVKO.js} +2 -2
  42. package/dist/{chunk-CASCUFK2.js → chunk-NOHWIBRX.js} +2 -2
  43. package/dist/chunk-NOHWIBRX.js.map +1 -0
  44. package/dist/{chunk-TRTUHCS4.js → chunk-QCZ2XUKH.js} +2 -2
  45. package/dist/chunk-QCZ2XUKH.js.map +1 -0
  46. package/dist/{chunk-3IJSIVKT.js → chunk-QQBJC2FQ.js} +2 -2
  47. package/dist/{chunk-JZQHKDSY.js → chunk-RNQN2FOU.js} +2 -2
  48. package/dist/chunk-RNQN2FOU.js.map +1 -0
  49. package/dist/{chunk-DTAY7LPC.js → chunk-S5OVP467.js} +2 -2
  50. package/dist/chunk-S5OVP467.js.map +1 -0
  51. package/dist/{chunk-5YOCVEUB.js → chunk-SWCDFEUK.js} +2 -2
  52. package/dist/chunk-SWCDFEUK.js.map +1 -0
  53. package/dist/{chunk-MHCMHKM6.js → chunk-TA3WMOMU.js} +2 -2
  54. package/dist/chunk-TA3WMOMU.js.map +1 -0
  55. package/dist/{chunk-WSGEIVY3.js → chunk-TURD42QO.js} +101 -85
  56. package/dist/chunk-TURD42QO.js.map +1 -0
  57. package/dist/{chunk-WL7HS7EM.js → chunk-UINQOUZR.js} +2 -2
  58. package/dist/{chunk-A4Z6DZ22.js → chunk-VWKUT4CW.js} +2 -2
  59. package/dist/chunk-VWKUT4CW.js.map +1 -0
  60. package/dist/{chunk-ERELJ7BS.js → chunk-WAR4Q2NM.js} +2 -2
  61. package/dist/chunk-WAR4Q2NM.js.map +1 -0
  62. package/dist/{chunk-5HCVKTP3.js → chunk-WHFUWWI6.js} +92 -81
  63. package/dist/chunk-WHFUWWI6.js.map +1 -0
  64. package/dist/{chunk-HQ4KWN76.js → chunk-X3G37FXT.js} +2 -2
  65. package/dist/{chunk-OYV2DN66.js → chunk-X5HF2OFP.js} +2 -2
  66. package/dist/chunk-XWVDS66D.js +963 -0
  67. package/dist/chunk-XWVDS66D.js.map +1 -0
  68. package/dist/{chunk-L6JPBJAS.js → chunk-YAHRT6MB.js} +2 -2
  69. package/dist/{chunk-XRU5WXZX.js → chunk-ZEGAMJO2.js} +2 -2
  70. package/dist/chunk-ZEGAMJO2.js.map +1 -0
  71. package/dist/{chunk-B6SXRCBO.js → chunk-ZGSER5TG.js} +2 -2
  72. package/dist/databricks_volume-7XOUYSTY.js +7 -0
  73. package/dist/{digitalocean-6SPR4S7V.js → digitalocean-3CQ4CPPZ.js} +3 -3
  74. package/dist/{discord-SAV2RBJV.js → discord-BG7OSRJG.js} +2 -2
  75. package/dist/{disk-POACMF4G.js → disk-XVLBCVKE.js} +2 -2
  76. package/dist/{dropbox-CQ7MTYX2.js → dropbox-74GYLV3R.js} +2 -2
  77. package/dist/{email-KBQ7CXS7.js → email-5IZ7OBQ4.js} +2 -2
  78. package/dist/{gcs-SMIE4VMT.js → gcs-EMEYU2XT.js} +3 -3
  79. package/dist/{gdocs-X5Y2SIQX.js → gdocs-R67TDPON.js} +2 -2
  80. package/dist/{gdrive-SIQPRIGI.js → gdrive-PRN2ALRK.js} +2 -2
  81. package/dist/{github-KBHWANKQ.js → github-DV7E6OFV.js} +2 -2
  82. package/dist/{github_ci-HPITNK37.js → github_ci-Q554V5PA.js} +2 -2
  83. package/dist/{gmail-DKHAGJNX.js → gmail-OLN2LT4O.js} +2 -2
  84. package/dist/{gsheets-ZSUDIWGK.js → gsheets-H4RYMQJ5.js} +2 -2
  85. package/dist/{gslides-GYXM7IMJ.js → gslides-YLCHKJOM.js} +2 -2
  86. package/dist/{hf_buckets-RIOMV7WG.js → hf_buckets-DTKXKKFF.js} +3 -3
  87. package/dist/{hf_datasets-QF4BQ3OK.js → hf_datasets-55C4APKR.js} +3 -3
  88. package/dist/{hf_models-62GC2HPZ.js → hf_models-RO5JR36V.js} +3 -3
  89. package/dist/{hf_spaces-NVSMUNRM.js → hf_spaces-ZVZ3EDRX.js} +3 -3
  90. package/dist/index.d.ts +110 -44
  91. package/dist/index.js +520 -232
  92. package/dist/index.js.map +1 -1
  93. package/dist/{langfuse-HUAYVPHF.js → langfuse-ACASJZ7O.js} +2 -2
  94. package/dist/{linear-2MM55KBC.js → linear-IC37LZV7.js} +2 -2
  95. package/dist/{minio-L3XE6PQS.js → minio-HZ576XFQ.js} +3 -3
  96. package/dist/mongodb-JVR62OIO.js +7 -0
  97. package/dist/{notion-UK4GTMT4.js → notion-HKRPQMJS.js} +2 -2
  98. package/dist/{oci-NURLWPL2.js → oci-ZLVECXTW.js} +3 -3
  99. package/dist/postgres-P36Z2YN4.js +7 -0
  100. package/dist/{qingstor-W55D5YFO.js → qingstor-YLP6K3L4.js} +3 -3
  101. package/dist/{r2-FSZK7IFI.js → r2-RPK25ANI.js} +3 -3
  102. package/dist/{redis-S6GIPA4Z.js → redis-V5ULXULL.js} +2 -2
  103. package/dist/{s3-GMPUJ65D.js → s3-4OIOCAAT.js} +2 -2
  104. package/dist/{scaleway-5VM55Y6D.js → scaleway-CCWCLUHB.js} +3 -3
  105. package/dist/{seaweedfs-J3EPUEPE.js → seaweedfs-QSWKF2FN.js} +3 -3
  106. package/dist/{slack-FVBXY7KD.js → slack-YPS7PII3.js} +2 -2
  107. package/dist/{ssh-GCXETJ3Z.js → ssh-YFP3SMTJ.js} +2 -2
  108. package/dist/{supabase-HLWNHBBE.js → supabase-6CFTOKGZ.js} +3 -3
  109. package/dist/{tencent-YDO73XBD.js → tencent-IWZZOSQ4.js} +3 -3
  110. package/dist/{trello-CQ53BQUL.js → trello-XYKWZD6P.js} +2 -2
  111. package/dist/{wasabi-SOZKPMRQ.js → wasabi-6Z4DC5S5.js} +3 -3
  112. package/package.json +7 -5
  113. package/dist/chunk-5DLOHQJ2.js.map +0 -1
  114. package/dist/chunk-5HCVKTP3.js.map +0 -1
  115. package/dist/chunk-5YOCVEUB.js.map +0 -1
  116. package/dist/chunk-A4Z6DZ22.js.map +0 -1
  117. package/dist/chunk-A7X4L4JM.js.map +0 -1
  118. package/dist/chunk-ABTEGAFB.js.map +0 -1
  119. package/dist/chunk-C6NHEDHY.js.map +0 -1
  120. package/dist/chunk-CASCUFK2.js.map +0 -1
  121. package/dist/chunk-DTAY7LPC.js.map +0 -1
  122. package/dist/chunk-E7RW3SBV.js.map +0 -1
  123. package/dist/chunk-ERELJ7BS.js.map +0 -1
  124. package/dist/chunk-HEHERHQ5.js.map +0 -1
  125. package/dist/chunk-JZQHKDSY.js.map +0 -1
  126. package/dist/chunk-LYDMMNL2.js.map +0 -1
  127. package/dist/chunk-MHCMHKM6.js.map +0 -1
  128. package/dist/chunk-N72CAZEH.js +0 -1990
  129. package/dist/chunk-N72CAZEH.js.map +0 -1
  130. package/dist/chunk-NHS7WLEQ.js.map +0 -1
  131. package/dist/chunk-PBBG7VFT.js +0 -1896
  132. package/dist/chunk-PBBG7VFT.js.map +0 -1
  133. package/dist/chunk-RLGWMJD3.js.map +0 -1
  134. package/dist/chunk-TRTUHCS4.js.map +0 -1
  135. package/dist/chunk-WSGEIVY3.js.map +0 -1
  136. package/dist/chunk-XRU5WXZX.js.map +0 -1
  137. package/dist/chunk-YAVGCQUP.js.map +0 -1
  138. package/dist/chunk-YPT4JBUY.js.map +0 -1
  139. package/dist/databricks_volume-HNQ4DJVJ.js +0 -7
  140. package/dist/mongodb-ZOX4FRHJ.js +0 -7
  141. package/dist/postgres-JNFMPAO2.js +0 -7
  142. /package/dist/{aliyun-TMZRUYCG.js.map → aliyun-JMJ3PFYY.js.map} +0 -0
  143. /package/dist/{backblaze-OHW57DLK.js.map → backblaze-TDFD23QO.js.map} +0 -0
  144. /package/dist/{box-UXTCAFOZ.js.map → box-GQ2U2R6R.js.map} +0 -0
  145. /package/dist/{ceph-TNN4I2FT.js.map → ceph-S2VOYO6G.js.map} +0 -0
  146. /package/dist/{chunk-FXFDBF3P.js.map → chunk-3WIO7NBR.js.map} +0 -0
  147. /package/dist/{chunk-O7ODGJYL.js.map → chunk-47AVIIOT.js.map} +0 -0
  148. /package/dist/{chunk-Q6CDMOM6.js.map → chunk-7CW3BMPH.js.map} +0 -0
  149. /package/dist/{chunk-3T3RMDNX.js.map → chunk-AUHSTJJ3.js.map} +0 -0
  150. /package/dist/{chunk-PJBQKMCD.js.map → chunk-DM4GSE26.js.map} +0 -0
  151. /package/dist/{chunk-KTNDT45N.js.map → chunk-FQ33BYFR.js.map} +0 -0
  152. /package/dist/{chunk-BYTU2YC3.js.map → chunk-HGCRXJGP.js.map} +0 -0
  153. /package/dist/{chunk-G5BZE7UA.js.map → chunk-HJJMP6IX.js.map} +0 -0
  154. /package/dist/{chunk-IQVNVTOP.js.map → chunk-I5THIMPP.js.map} +0 -0
  155. /package/dist/{chunk-C6NHFMIP.js.map → chunk-IK2L4EN3.js.map} +0 -0
  156. /package/dist/{chunk-AJICZLHT.js.map → chunk-KPULTUOK.js.map} +0 -0
  157. /package/dist/{chunk-RQYEEA2O.js.map → chunk-N5FSLVKO.js.map} +0 -0
  158. /package/dist/{chunk-3IJSIVKT.js.map → chunk-QQBJC2FQ.js.map} +0 -0
  159. /package/dist/{chunk-WL7HS7EM.js.map → chunk-UINQOUZR.js.map} +0 -0
  160. /package/dist/{chunk-HQ4KWN76.js.map → chunk-X3G37FXT.js.map} +0 -0
  161. /package/dist/{chunk-OYV2DN66.js.map → chunk-X5HF2OFP.js.map} +0 -0
  162. /package/dist/{chunk-L6JPBJAS.js.map → chunk-YAHRT6MB.js.map} +0 -0
  163. /package/dist/{chunk-B6SXRCBO.js.map → chunk-ZGSER5TG.js.map} +0 -0
  164. /package/dist/{databricks_volume-HNQ4DJVJ.js.map → databricks_volume-7XOUYSTY.js.map} +0 -0
  165. /package/dist/{digitalocean-6SPR4S7V.js.map → digitalocean-3CQ4CPPZ.js.map} +0 -0
  166. /package/dist/{discord-SAV2RBJV.js.map → discord-BG7OSRJG.js.map} +0 -0
  167. /package/dist/{disk-POACMF4G.js.map → disk-XVLBCVKE.js.map} +0 -0
  168. /package/dist/{dropbox-CQ7MTYX2.js.map → dropbox-74GYLV3R.js.map} +0 -0
  169. /package/dist/{email-KBQ7CXS7.js.map → email-5IZ7OBQ4.js.map} +0 -0
  170. /package/dist/{gcs-SMIE4VMT.js.map → gcs-EMEYU2XT.js.map} +0 -0
  171. /package/dist/{gdocs-X5Y2SIQX.js.map → gdocs-R67TDPON.js.map} +0 -0
  172. /package/dist/{gdrive-SIQPRIGI.js.map → gdrive-PRN2ALRK.js.map} +0 -0
  173. /package/dist/{github-KBHWANKQ.js.map → github-DV7E6OFV.js.map} +0 -0
  174. /package/dist/{github_ci-HPITNK37.js.map → github_ci-Q554V5PA.js.map} +0 -0
  175. /package/dist/{gmail-DKHAGJNX.js.map → gmail-OLN2LT4O.js.map} +0 -0
  176. /package/dist/{gsheets-ZSUDIWGK.js.map → gsheets-H4RYMQJ5.js.map} +0 -0
  177. /package/dist/{gslides-GYXM7IMJ.js.map → gslides-YLCHKJOM.js.map} +0 -0
  178. /package/dist/{hf_buckets-RIOMV7WG.js.map → hf_buckets-DTKXKKFF.js.map} +0 -0
  179. /package/dist/{hf_datasets-QF4BQ3OK.js.map → hf_datasets-55C4APKR.js.map} +0 -0
  180. /package/dist/{hf_models-62GC2HPZ.js.map → hf_models-RO5JR36V.js.map} +0 -0
  181. /package/dist/{hf_spaces-NVSMUNRM.js.map → hf_spaces-ZVZ3EDRX.js.map} +0 -0
  182. /package/dist/{langfuse-HUAYVPHF.js.map → langfuse-ACASJZ7O.js.map} +0 -0
  183. /package/dist/{linear-2MM55KBC.js.map → linear-IC37LZV7.js.map} +0 -0
  184. /package/dist/{minio-L3XE6PQS.js.map → minio-HZ576XFQ.js.map} +0 -0
  185. /package/dist/{mongodb-ZOX4FRHJ.js.map → mongodb-JVR62OIO.js.map} +0 -0
  186. /package/dist/{notion-UK4GTMT4.js.map → notion-HKRPQMJS.js.map} +0 -0
  187. /package/dist/{oci-NURLWPL2.js.map → oci-ZLVECXTW.js.map} +0 -0
  188. /package/dist/{postgres-JNFMPAO2.js.map → postgres-P36Z2YN4.js.map} +0 -0
  189. /package/dist/{qingstor-W55D5YFO.js.map → qingstor-YLP6K3L4.js.map} +0 -0
  190. /package/dist/{r2-FSZK7IFI.js.map → r2-RPK25ANI.js.map} +0 -0
  191. /package/dist/{redis-S6GIPA4Z.js.map → redis-V5ULXULL.js.map} +0 -0
  192. /package/dist/{s3-GMPUJ65D.js.map → s3-4OIOCAAT.js.map} +0 -0
  193. /package/dist/{scaleway-5VM55Y6D.js.map → scaleway-CCWCLUHB.js.map} +0 -0
  194. /package/dist/{seaweedfs-J3EPUEPE.js.map → seaweedfs-QSWKF2FN.js.map} +0 -0
  195. /package/dist/{slack-FVBXY7KD.js.map → slack-YPS7PII3.js.map} +0 -0
  196. /package/dist/{ssh-GCXETJ3Z.js.map → ssh-YFP3SMTJ.js.map} +0 -0
  197. /package/dist/{supabase-HLWNHBBE.js.map → supabase-6CFTOKGZ.js.map} +0 -0
  198. /package/dist/{tencent-YDO73XBD.js.map → tencent-IWZZOSQ4.js.map} +0 -0
  199. /package/dist/{trello-CQ53BQUL.js.map → trello-XYKWZD6P.js.map} +0 -0
  200. /package/dist/{wasabi-SOZKPMRQ.js.map → wasabi-6Z4DC5S5.js.map} +0 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/workspace.ts","../src/workspace/fuse.ts","../src/fuse/mount.ts","../src/fuse/fs.ts","../src/fuse/platform/macos.ts","../src/fs_monkey.ts","../src/commands/builtin/redis/provision.ts","../src/cache/redis/file.ts","../src/resource/hf_models/config.ts","../src/resource/lancedb/lancedb.ts","../src/resource/lancedb/store.ts","../src/resource/registry.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\nexport * from '@struktoai/mirage-core'\nexport { Workspace } from './workspace.ts'\nexport {\n DiskResource,\n type DiskResourceOptions,\n type DiskResourceState,\n} from './resource/disk/disk.ts'\nexport { DISK_PROMPT } from './resource/disk/prompt.ts'\nexport { DISK_OPS } from './ops/disk/index.ts'\nexport { patchNodeFs } from './fs_monkey.ts'\nexport {\n RedisResource,\n type RedisResourceOptions,\n type RedisResourceState,\n} from './resource/redis/redis.ts'\nexport { REDIS_PROMPT } from './resource/redis/prompt.ts'\nexport { RedisStore, type RedisStoreOptions } from './resource/redis/store.ts'\nexport { RedisAccessor } from './accessor/redis.ts'\nexport { REDIS_OPS } from './ops/redis/index.ts'\nexport {\n fileReadProvision,\n headTailProvision,\n metadataProvision,\n type RedisResourceLike,\n} from './commands/builtin/redis/provision.ts'\nexport { RedisFileCacheStore, type RedisFileCacheOptions } from './cache/redis/file.ts'\nexport { FuseManager } from './workspace/fuse.ts'\nexport { MirageFS, type MirageFSOptions, type FuseAttr } from './fuse/fs.ts'\nexport {\n mount as fuseMount,\n mountBackground as fuseMountBackground,\n type FuseHandle,\n type MountOptions as FuseMountOptions,\n} from './fuse/mount.ts'\nexport { isMacosMetadata } from './fuse/platform/macos.ts'\nexport { S3Resource, type S3ResourceState } from './resource/s3/s3.ts'\nexport {\n DatabricksVolumeResource,\n type DatabricksVolumeResourceState,\n} from './resource/databricks_volume/databricks_volume.ts'\nexport {\n loadDatabricksProfile,\n parseDatabricksCfg,\n type DatabricksProfile,\n} from './resource/databricks_volume/profile.ts'\nexport {\n redactConfig as redactS3Config,\n type S3Config,\n type S3ConfigRedacted,\n} from './resource/s3/config.ts'\nexport { GCSResource, type GCSResourceState } from './resource/gcs/gcs.ts'\nexport {\n GCS_ENDPOINT,\n redactGcsConfig,\n type GCSConfig,\n type GCSConfigRedacted,\n} from './resource/gcs/config.ts'\nexport { GCS_PROMPT } from './resource/gcs/prompt.ts'\nexport { OCIResource, type OCIResourceState } from './resource/oci/oci.ts'\nexport { redactOciConfig, type OCIConfig, type OCIConfigRedacted } from './resource/oci/config.ts'\nexport { OCI_PROMPT } from './resource/oci/prompt.ts'\nexport { R2Resource, type R2ResourceState } from './resource/r2/r2.ts'\nexport { redactR2Config, type R2Config, type R2ConfigRedacted } from './resource/r2/config.ts'\nexport { R2_PROMPT } from './resource/r2/prompt.ts'\nexport { SupabaseResource, type SupabaseResourceState } from './resource/supabase/supabase.ts'\nexport {\n redactSupabaseConfig,\n resolvedSupabaseEndpoint,\n type SupabaseConfig,\n type SupabaseConfigRedacted,\n} from './resource/supabase/config.ts'\nexport { SUPABASE_PROMPT } from './resource/supabase/prompt.ts'\nexport {\n HF_RESOURCES,\n HfAccessor,\n HfBucketsAccessor,\n HfDatasetsAccessor,\n HfModelsAccessor,\n HfSpacesAccessor,\n} from './accessor/hf.ts'\nexport { HfBucketsResource, type HfBucketsResourceState } from './resource/hf_buckets/hf_buckets.ts'\nexport {\n assertHfRepoId,\n HF_ENDPOINT,\n normalizeHfBucketsConfig,\n normalizeHfRepoConfig,\n redactHfBucketsConfig,\n redactHfRepoConfig,\n type HfBucketsConfig,\n type HfBucketsConfigRedacted,\n type HfRepoConfig,\n type HfRepoConfigRedacted,\n} from './resource/hf_buckets/config.ts'\nexport { HF_BUCKETS_PROMPT } from './resource/hf_buckets/prompt.ts'\nexport {\n HfDatasetsResource,\n type HfDatasetsResourceState,\n} from './resource/hf_datasets/hf_datasets.ts'\nexport { HF_DATASETS_PROMPT } from './resource/hf_datasets/prompt.ts'\nexport { HfModelsResource, type HfModelsResourceState } from './resource/hf_models/hf_models.ts'\nexport {\n normalizeHfModelsConfig,\n redactHfModelsConfig,\n type HfModelsConfig,\n type HfModelsConfigRedacted,\n} from './resource/hf_models/config.ts'\nexport { HF_MODELS_PROMPT } from './resource/hf_models/prompt.ts'\nexport { HfSpacesResource, type HfSpacesResourceState } from './resource/hf_spaces/hf_spaces.ts'\nexport { HF_SPACES_PROMPT } from './resource/hf_spaces/prompt.ts'\nexport { HF_COMMANDS } from './commands/builtin/hf/index.ts'\nexport { HF_OPS } from './ops/hf/index.ts'\nexport { MinIOResource, type MinIOResourceState } from './resource/minio/minio.ts'\nexport {\n redactMinIOConfig,\n type MinIOConfig,\n type MinIOConfigRedacted,\n} from './resource/minio/config.ts'\nexport { MINIO_PROMPT } from './resource/minio/prompt.ts'\nexport { SeaweedFSResource, type SeaweedFSResourceState } from './resource/seaweedfs/seaweedfs.ts'\nexport {\n redactSeaweedFSConfig,\n type SeaweedFSConfig,\n type SeaweedFSConfigRedacted,\n} from './resource/seaweedfs/config.ts'\nexport { SEAWEEDFS_PROMPT } from './resource/seaweedfs/prompt.ts'\nexport { CephResource, type CephResourceState } from './resource/ceph/ceph.ts'\nexport {\n redactCephConfig,\n type CephConfig,\n type CephConfigRedacted,\n} from './resource/ceph/config.ts'\nexport { CEPH_PROMPT } from './resource/ceph/prompt.ts'\nexport { WasabiResource, type WasabiResourceState } from './resource/wasabi/wasabi.ts'\nexport {\n redactWasabiConfig,\n resolvedWasabiEndpoint,\n type WasabiConfig,\n type WasabiConfigRedacted,\n} from './resource/wasabi/config.ts'\nexport { WASABI_PROMPT } from './resource/wasabi/prompt.ts'\nexport { BackblazeResource, type BackblazeResourceState } from './resource/backblaze/backblaze.ts'\nexport {\n redactBackblazeConfig,\n resolvedBackblazeEndpoint,\n type BackblazeConfig,\n type BackblazeConfigRedacted,\n} from './resource/backblaze/config.ts'\nexport { BACKBLAZE_PROMPT } from './resource/backblaze/prompt.ts'\nexport {\n DigitalOceanResource,\n type DigitalOceanResourceState,\n} from './resource/digitalocean/digitalocean.ts'\nexport {\n redactDigitalOceanConfig,\n resolvedDigitalOceanEndpoint,\n type DigitalOceanConfig,\n type DigitalOceanConfigRedacted,\n} from './resource/digitalocean/config.ts'\nexport { DIGITALOCEAN_PROMPT } from './resource/digitalocean/prompt.ts'\nexport { TencentResource, type TencentResourceState } from './resource/tencent/tencent.ts'\nexport {\n redactTencentConfig,\n resolvedTencentEndpoint,\n type TencentConfig,\n type TencentConfigRedacted,\n} from './resource/tencent/config.ts'\nexport { TENCENT_PROMPT } from './resource/tencent/prompt.ts'\nexport { AliyunResource, type AliyunResourceState } from './resource/aliyun/aliyun.ts'\nexport {\n redactAliyunConfig,\n resolvedAliyunEndpoint,\n type AliyunConfig,\n type AliyunConfigRedacted,\n} from './resource/aliyun/config.ts'\nexport { ALIYUN_PROMPT } from './resource/aliyun/prompt.ts'\nexport { ScalewayResource, type ScalewayResourceState } from './resource/scaleway/scaleway.ts'\nexport {\n redactScalewayConfig,\n resolvedScalewayEndpoint,\n type ScalewayConfig,\n type ScalewayConfigRedacted,\n} from './resource/scaleway/config.ts'\nexport { SCALEWAY_PROMPT } from './resource/scaleway/prompt.ts'\nexport { QingStorResource, type QingStorResourceState } from './resource/qingstor/qingstor.ts'\nexport {\n redactQingStorConfig,\n resolvedQingStorEndpoint,\n type QingStorConfig,\n type QingStorConfigRedacted,\n} from './resource/qingstor/config.ts'\nexport { QINGSTOR_PROMPT } from './resource/qingstor/prompt.ts'\nexport { PostgresResource, type PostgresResourceOptions } from './resource/postgres/postgres.ts'\nexport { PostgresStore } from './resource/postgres/store.ts'\nexport { MongoDBResource, type MongoDBResourceOptions } from './resource/mongodb/mongodb.ts'\nexport { MongoDBStore } from './resource/mongodb/store.ts'\nexport { LanceDBResource, type LanceDBResourceOptions } from './resource/lancedb/lancedb.ts'\nexport { LanceDBStore } from './resource/lancedb/store.ts'\nexport { SlackResource, type SlackResourceState } from './resource/slack/slack.ts'\nexport {\n normalizeSlackConfig,\n redactSlackConfig,\n type SlackConfig,\n type SlackConfigRedacted,\n} from './resource/slack/config.ts'\nexport { SSHResource, type SSHResourceState } from './resource/ssh/ssh.ts'\nexport {\n normalizeSshConfig,\n redactSshConfig,\n type SSHConfig,\n type SSHConfigRedacted,\n} from './resource/ssh/config.ts'\nexport { SSHAccessor } from './accessor/ssh.ts'\nexport { SSH_PROMPT } from './resource/ssh/prompt.ts'\nexport { SSH_COMMANDS } from './commands/builtin/ssh/index.ts'\nexport { SSH_OPS } from './ops/ssh/index.ts'\nexport { DiscordResource, type DiscordResourceState } from './resource/discord/discord.ts'\nexport {\n normalizeDiscordConfig,\n redactDiscordConfig,\n type DiscordConfig,\n type DiscordConfigRedacted,\n} from './resource/discord/config.ts'\nexport { TrelloResource, type TrelloResourceState } from './resource/trello/trello.ts'\nexport {\n normalizeTrelloConfig,\n redactTrelloConfig,\n type TrelloConfig,\n type TrelloConfigRedacted,\n} from './resource/trello/config.ts'\nexport { LinearResource, type LinearResourceState } from './resource/linear/linear.ts'\nexport {\n normalizeLinearConfig,\n redactLinearConfig,\n type LinearConfig,\n type LinearConfigRedacted,\n} from './resource/linear/config.ts'\nexport { NotionResource, type NotionResourceState } from './resource/notion/notion.ts'\nexport {\n normalizeNotionConfig,\n redactNotionConfig,\n type NotionConfig,\n type NotionConfigRedacted,\n} from './resource/notion/config.ts'\nexport { LangfuseResource, type LangfuseResourceState } from './resource/langfuse/langfuse.ts'\nexport {\n normalizeLangfuseConfig,\n redactLangfuseConfig,\n type LangfuseConfig,\n type LangfuseConfigRedacted,\n} from './resource/langfuse/config.ts'\nexport { GitHubResource, type GitHubResourceState } from './resource/github/github.ts'\nexport {\n normalizeGitHubConfig,\n redactGitHubConfig,\n type GitHubConfig,\n type GitHubConfigRedacted,\n} from './resource/github/config.ts'\nexport { GitHubCIResource, type GitHubCIResourceState } from './resource/github_ci/github_ci.ts'\nexport {\n normalizeGitHubCIConfig,\n redactGitHubCIConfig,\n type GitHubCIConfig,\n type GitHubCIConfigRedacted,\n} from './resource/github_ci/config.ts'\nexport { GDocsResource, type GDocsResourceState } from './resource/gdocs/gdocs.ts'\nexport {\n normalizeGDocsConfig,\n redactGDocsConfig,\n type GDocsConfig,\n type GDocsConfigRedacted,\n} from './resource/gdocs/config.ts'\nexport { GSheetsResource, type GSheetsResourceState } from './resource/gsheets/gsheets.ts'\nexport {\n normalizeGSheetsConfig,\n redactGSheetsConfig,\n type GSheetsConfig,\n type GSheetsConfigRedacted,\n} from './resource/gsheets/config.ts'\nexport { GSlidesResource, type GSlidesResourceState } from './resource/gslides/gslides.ts'\nexport {\n normalizeGSlidesConfig,\n redactGSlidesConfig,\n type GSlidesConfig,\n type GSlidesConfigRedacted,\n} from './resource/gslides/config.ts'\nexport { GDriveResource, type GDriveResourceState } from './resource/gdrive/gdrive.ts'\nexport {\n normalizeGDriveConfig,\n redactGDriveConfig,\n type GDriveConfig,\n type GDriveConfigRedacted,\n} from './resource/gdrive/config.ts'\nexport { DropboxResource, type DropboxResourceState } from './resource/dropbox/dropbox.ts'\nexport {\n normalizeDropboxConfig,\n redactDropboxConfig,\n type DropboxConfig,\n type DropboxConfigRedacted,\n} from './resource/dropbox/config.ts'\nexport { BoxResource, type BoxResourceState } from './resource/box/box.ts'\nexport {\n normalizeBoxConfig,\n redactBoxConfig,\n type BoxConfig,\n type BoxConfigRedacted,\n} from './resource/box/config.ts'\nexport { GmailResource, type GmailResourceState } from './resource/gmail/gmail.ts'\nexport {\n normalizeGmailConfig,\n redactGmailConfig,\n type GmailConfig,\n type GmailConfigRedacted,\n} from './resource/gmail/config.ts'\nexport { EmailResource, type EmailResourceState } from './resource/email/email.ts'\nexport {\n buildEmailConfig,\n normalizeEmailConfig,\n redactEmailConfig,\n type EmailConfig,\n type EmailConfigInput,\n type EmailConfigRedacted,\n EMAIL_PROMPT,\n EMAIL_WRITE_PROMPT,\n} from './resource/email/index.ts'\nexport { EmailAccessor } from './accessor/email.ts'\nexport { EMAIL_COMMANDS } from './commands/builtin/email/index.ts'\nexport { EMAIL_OPS } from './ops/email/index.ts'\nexport {\n buildResource,\n knownResources,\n register as registerResourceFactory,\n type ResourceFactory,\n} from './resource/registry.ts'\nexport { DISK_COMMANDS } from './commands/builtin/disk/index.ts'\nexport { REDIS_COMMANDS } from './commands/builtin/redis/index.ts'\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 { readFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport {\n createShellParser,\n type ExecuteOptions,\n type ExecuteResult,\n type ProvisionResult,\n type Resource,\n type ShellParser,\n Workspace as CoreWorkspace,\n type WorkspaceOptions,\n} from '@struktoai/mirage-core'\nimport { FuseManager } from './workspace/fuse.ts'\n\nconst requireCjs = createRequire(import.meta.url)\n\nlet cachedParser: Promise<ShellParser> | null = null\n\nfunction loadShellParser(): Promise<ShellParser> {\n if (cachedParser !== null) return cachedParser\n const enginePath = requireCjs.resolve('web-tree-sitter/web-tree-sitter.wasm')\n const grammarPath = requireCjs.resolve('tree-sitter-bash/tree-sitter-bash.wasm')\n cachedParser = createShellParser({\n engineWasm: readFileSync(enginePath),\n grammarWasm: readFileSync(grammarPath),\n })\n return cachedParser\n}\n\nexport interface NodeWorkspaceOptions extends WorkspaceOptions {\n /**\n * Per-mount FUSE exposure: `{ '/data': true, '/s3': '/tmp/s3' }`. A value of\n * `true` mounts at a fresh temp dir; a string pins the mountpoint (created if\n * missing). Each entry becomes its own FUSE mount scoped to that prefix.\n */\n fuseMounts?: Record<string, boolean | string>\n}\n\nexport class Workspace extends CoreWorkspace {\n private readonly autoFuseManagers = new Map<string, FuseManager>()\n private readonly fuseMountpointsMap = new Map<string, string>()\n private fuseSetupPromise: Promise<void> | null = null\n\n constructor(resources: Record<string, Resource>, options: NodeWorkspaceOptions = {}) {\n super(resources, {\n ...options,\n shellParserFactory: options.shellParserFactory ?? loadShellParser,\n })\n const fuseMounts = options.fuseMounts ?? {}\n const setups: Promise<void>[] = []\n for (const [prefix, target] of Object.entries(fuseMounts)) {\n if (target === false) continue\n const fm = new FuseManager()\n this.autoFuseManagers.set(prefix, fm)\n const opts = {\n rootPrefix: prefix,\n ...(typeof target === 'string' ? { mountpoint: target } : {}),\n }\n // Kick off mount eagerly; await inside execute() / close() so callers\n // don't need to await the constructor (Python mirrors this).\n //\n // A failed auto-mount (e.g. libfuse absent on the host) degrades to an\n // unmounted but fully usable workspace, mirroring Python: there the mount\n // runs on a daemon thread so its failure never reaches the main process.\n // On Node's single event loop we must swallow it here, otherwise the\n // unhandled rejection would terminate the process under Node's default\n // unhandled-rejection policy.\n setups.push(\n fm.setup(this, opts).then(\n (mountpoint) => {\n this.fuseMountpointsMap.set(prefix, mountpoint)\n },\n (err: unknown) => {\n process.stderr.write(\n `mirage: FUSE auto-mount failed for ${prefix}, continuing without it: ${\n err instanceof Error ? err.message : String(err)\n }\\n`,\n )\n },\n ),\n )\n }\n if (setups.length > 0) {\n this.fuseSetupPromise = Promise.all(setups).then(() => undefined)\n }\n }\n\n /** Map each FUSE-exposed mount prefix to its live mountpoint. */\n get fuseMountpoints(): Record<string, string> {\n return Object.fromEntries(this.fuseMountpointsMap)\n }\n\n private async ensureFuseReady(): Promise<void> {\n if (this.fuseSetupPromise !== null) {\n await this.fuseSetupPromise\n this.fuseSetupPromise = null\n }\n }\n\n override execute(\n command: string,\n options?: ExecuteOptions & { provision?: false | undefined },\n ): Promise<ExecuteResult>\n override execute(\n command: string,\n options: ExecuteOptions & { provision: true },\n ): Promise<ProvisionResult>\n override execute(\n command: string,\n options: ExecuteOptions,\n ): Promise<ExecuteResult | ProvisionResult>\n override async execute(\n command: string,\n options: ExecuteOptions = {},\n ): Promise<ExecuteResult | ProvisionResult> {\n await this.ensureFuseReady()\n return super.execute(command, options)\n }\n\n override async close(): Promise<void> {\n await this.ensureFuseReady().catch(() => undefined)\n for (const fm of this.autoFuseManagers.values()) {\n await fm.close(this)\n }\n await super.close()\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 { rmSync } from 'node:fs'\nimport type { Workspace } from '@struktoai/mirage-core'\nimport { forceUnmount, mount, type FuseHandle, type MountOptions } from '../fuse/mount.ts'\n\nconst SIGNALS = ['SIGINT', 'SIGTERM', 'SIGHUP'] as const\ntype Signal = (typeof SIGNALS)[number]\n\n/**\n * Tracks auto-mounted FUSE handles and installs a single process-wide cleanup\n * path on SIGINT / SIGTERM / SIGHUP / `process.exit` so the kernel never ends\n * up with a stale mountpoint after the node process dies. Mirrors Python's\n * KeyboardInterrupt → `diskutil unmount force` / `fusermount -u` in mount.py.\n */\nclass FuseCleanupRegistry {\n private readonly mounts = new Set<{ mountpoint: string; handle: FuseHandle }>()\n private installed = false\n private exiting = false\n\n register(entry: { mountpoint: string; handle: FuseHandle }): void {\n this.mounts.add(entry)\n this.install()\n }\n\n unregister(entry: { mountpoint: string; handle: FuseHandle }): void {\n this.mounts.delete(entry)\n }\n\n private install(): void {\n if (this.installed) return\n this.installed = true\n for (const sig of SIGNALS) {\n process.on(sig, this.onSignal)\n }\n process.on('beforeExit', this.onExit)\n process.on('exit', this.onExit)\n }\n\n private readonly onSignal = (sig: Signal): void => {\n if (this.exiting) return\n this.exiting = true\n this.drainSync()\n // Re-raise the signal so the default termination action runs after we've\n // unmounted. Node suppresses the default when a listener is attached.\n process.kill(process.pid, sig)\n }\n\n private readonly onExit = (): void => {\n if (this.exiting) return\n this.exiting = true\n this.drainSync()\n }\n\n private drainSync(): void {\n for (const entry of this.mounts) {\n forceUnmount(entry.mountpoint)\n try {\n rmSync(entry.mountpoint, { recursive: true, force: true })\n } catch {\n // best-effort\n }\n }\n this.mounts.clear()\n }\n}\n\nconst CLEANUP = new FuseCleanupRegistry()\n\nexport class FuseManager {\n private handle: FuseHandle | null = null\n private externalMountpoint: string | null = null\n private auto = false\n private cleanupEntry: { mountpoint: string; handle: FuseHandle } | null = null\n\n get mountpoint(): string | null {\n if (this.handle !== null) return this.handle.mountpoint\n return this.externalMountpoint\n }\n\n set mountpoint(path: string | null) {\n this.externalMountpoint = path\n }\n\n async setup(ws: Workspace, options: MountOptions = {}): Promise<string> {\n if (this.handle !== null) return this.handle.mountpoint\n this.handle = await mount(ws, options)\n this.auto = true\n this.externalMountpoint = null\n this.cleanupEntry = { mountpoint: this.handle.mountpoint, handle: this.handle }\n CLEANUP.register(this.cleanupEntry)\n ws.setFuseMountpoint(this.handle.mountpoint, { owned: true })\n return this.handle.mountpoint\n }\n\n async unmount(ws?: Workspace): Promise<void> {\n if (this.handle === null) {\n if (ws !== undefined) ws.setFuseMountpoint(null)\n this.externalMountpoint = null\n return\n }\n const mp = this.handle.mountpoint\n try {\n await this.handle.unmount()\n } finally {\n if (this.cleanupEntry !== null) {\n CLEANUP.unregister(this.cleanupEntry)\n this.cleanupEntry = null\n }\n this.handle = null\n this.auto = false\n ws?.setFuseMountpoint(null)\n try {\n rmSync(mp, { recursive: true, force: true })\n } catch {\n // mountpoint may still be busy; caller can retry\n }\n }\n }\n\n async close(ws?: Workspace): Promise<void> {\n if (this.auto) await this.unmount(ws)\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 { execSync } from 'node:child_process'\nimport { mkdirSync, mkdtempSync } from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport type { Workspace } from '@struktoai/mirage-core'\nimport { loadOptionalPeer } from '../optional_peer.ts'\nimport { MirageFS } from './fs.ts'\n\nexport interface FuseHandle {\n mountpoint: string\n unmount: () => Promise<void>\n}\n\nexport interface MountOptions {\n mountpoint?: string\n agentId?: string\n /** Scope the mount to a single workspace mount prefix (subtree exposure). */\n rootPrefix?: string\n /**\n * When true, `@zkochan/fuse-native`'s `autoUnmount` flag is set so the\n * kernel releases the mount if the process exits abnormally. Defaults to\n * `true` on Linux, `false` on darwin — macFUSE rejects the option with\n * \"unknown option `auto_unmount'\". On darwin the SIGINT cleanup in\n * FuseManager runs `diskutil unmount force` instead.\n */\n autoUnmount?: boolean\n /** Extra options forwarded verbatim to `@zkochan/fuse-native`. */\n fuseOptions?: Record<string, unknown>\n}\n\ntype FuseConstructor = new (\n mountpoint: string,\n ops: Record<string, unknown>,\n options?: Record<string, unknown>,\n) => {\n mount: (cb: (err: Error | null) => void) => void\n unmount: (cb: (err: Error | null) => void) => void\n}\n\nasync function loadFuse(): Promise<FuseConstructor> {\n const mod = await loadOptionalPeer(\n () => import('@zkochan/fuse-native') as unknown as Promise<{ default?: FuseConstructor }>,\n {\n feature: 'FUSE support',\n packageName: '@zkochan/fuse-native',\n docsUrl: 'https://mirage.dev/typescript/setup/fuse',\n },\n )\n const Fuse = (mod.default ?? mod) as unknown as FuseConstructor\n if (typeof Fuse !== 'function') {\n throw new Error('@zkochan/fuse-native did not export a constructor')\n }\n return Fuse\n}\n\n/** Fallback unmount via platform tools — mirrors Python's SIGINT handler. */\nexport function forceUnmount(mountpoint: string): void {\n try {\n if (process.platform === 'darwin') {\n execSync(`diskutil unmount force ${JSON.stringify(mountpoint)}`, { stdio: 'ignore' })\n } else {\n execSync(`fusermount -u ${JSON.stringify(mountpoint)}`, { stdio: 'ignore' })\n }\n } catch {\n // best-effort; caller already tried the clean path\n }\n}\n\nexport async function mount(ws: Workspace, options: MountOptions = {}): Promise<FuseHandle> {\n const Fuse = await loadFuse()\n let mountpoint: string\n if (options.mountpoint !== undefined) {\n // Pinned path: create it if missing, mirroring Python's os.makedirs.\n mkdirSync(options.mountpoint, { recursive: true })\n mountpoint = options.mountpoint\n } else {\n mountpoint = mkdtempSync(join(tmpdir(), 'mirage-fuse-'))\n }\n const agentId = options.agentId\n const mfs = new MirageFS(ws, {\n ...(agentId !== undefined ? { agentId } : {}),\n ...(options.rootPrefix !== undefined ? { rootPrefix: options.rootPrefix } : {}),\n })\n const autoUnmount = options.autoUnmount ?? process.platform === 'linux'\n // attr_timeout=0 (string: the option serializer drops falsy values) keeps\n // the kernel from caching the UNKNOWN_SIZE_SENTINEL that getattr reports\n // for size-unknown API files; the post-open fstat then reaches fgetattr,\n // which answers with the prefetched real size.\n const fuseOpts: Record<string, unknown> = {\n force: true,\n mkdir: true,\n attrTimeout: '0',\n ...(autoUnmount ? { autoUnmount: true } : {}),\n ...(options.fuseOptions ?? {}),\n }\n const fuse = new Fuse(mountpoint, mfs.ops(), fuseOpts)\n await new Promise<void>((resolve, reject) => {\n fuse.mount((err) => {\n if (err === null) resolve()\n else reject(err)\n })\n })\n return {\n mountpoint,\n unmount: () =>\n new Promise<void>((resolve, reject) => {\n fuse.unmount((err) => {\n if (err === null) resolve()\n else reject(err)\n })\n }),\n }\n}\n\nexport function mountBackground(ws: Workspace, options: MountOptions = {}): Promise<FuseHandle> {\n return mount(ws, options)\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 { FileType, type OpRecord, type Workspace, rstripSlash } from '@struktoai/mirage-core'\nimport { isMacosMetadata } from './platform/macos.ts'\n\nconst ENV_AGENT_ID = 'MIRAGE_AGENT_ID'\nconst MIRAGE_DIR = '/.mirage'\nconst MIRAGE_WHOAMI = '/.mirage/whoami'\n\n// FUSE errno values (negative for fuse-native callbacks; positive for errors thrown).\nconst ENOENT = -2\nconst EACCES = -13\nconst ENOTDIR = -20\nconst EEXIST = -17\nconst ENOTEMPTY = -66 // macOS; Linux is -39 — fuse-native normalizes.\nconst EIO = -5\n\nexport interface FuseAttr {\n mtime: Date\n atime: Date\n ctime: Date\n nlink: number\n size: number\n mode: number\n uid: number\n gid: number\n}\n\ninterface Handle {\n path: string\n data?: Uint8Array\n writeBuf?: [number, Uint8Array][]\n}\n\ninterface PrefetchEntry {\n data: Uint8Array\n expires: number\n}\n\nconst PREFETCH_TTL_MS = 30_000\n\n/**\n * Sentinel size reported by getattr for API-backed files where the resource\n * returns size=null up front (Trello, Linear, Slack…). Python uses libfuse's\n * `direct_io` flag to make the kernel ignore reported size and issue read()\n * regardless; @zkochan/fuse-native doesn't expose direct_io, so we instead\n * report a deliberately-large size. The read handler returns 0 once the\n * actual bytes are exhausted, which surfaces as EOF to userspace.\n *\n * Reporting a real size requires fetching the bytes — fine for `cat`, but\n * disastrous for `ls`/`ls -l` because macOS's FUSE layer calls getattr per\n * directory entry. Using a sentinel keeps `ls` cheap (no API calls) while\n * still letting `cat` work. Once a file has been opened (and its bytes\n * cached), subsequent getattrs return the real size via cachedSize().\n *\n * The cap is bounded by Node's `fs/promises` readFile path: it allocates a\n * buffer of the reported size and converts it to a utf-8 string at the end,\n * which fails with `RangeError: Invalid string length` past V8's ~512 MiB\n * string limit. 100 MiB sits well under that, covers very busy Slack\n * channels' daily history, and bounds Buffer allocation per stat.\n */\nconst UNKNOWN_SIZE_SENTINEL = 100 * 1024 * 1024 // 100 MiB\n\ntype Cb<T> = (code: number, result?: T) => void\n\nfunction classifyError(err: unknown): number {\n const code = (err as { code?: string }).code\n if (code === 'ENOTEMPTY') return ENOTEMPTY\n if (code === 'ENOTDIR') return ENOTDIR\n if (code === 'EACCES') return EACCES\n if (code === 'EEXIST') return EEXIST\n if (code === 'ENOENT') return ENOENT\n const msg = (err instanceof Error ? err.message : String(err)).toLowerCase()\n if (msg.includes('not empty') || msg.includes('enotempty')) return ENOTEMPTY\n if (msg.includes('not a directory') || msg.includes('enotdir')) return ENOTDIR\n if (msg.includes('permission') || msg.includes('eacces') || msg.includes('read-only'))\n return EACCES\n if (msg.includes('file exists') || msg.includes('eexist')) return EEXIST\n if (\n msg.includes('not found') ||\n msg.includes('no such') ||\n msg.includes('enoent') ||\n msg.includes('no mount')\n )\n return ENOENT\n return EIO\n}\n\nexport interface MirageFSOptions {\n agentId?: string\n rootPrefix?: string\n}\n\nexport class MirageFS {\n private readonly ws: Workspace\n readonly agentId: string\n private readonly now: Date\n private readonly root: string\n private readonly prefixes: string[]\n private readonly handles = new Map<number, Handle>()\n private readonly prefetchCache = new Map<string, PrefetchEntry>()\n private readonly prefetchInflight = new Map<string, Promise<Uint8Array | null>>()\n private nextFh = 1\n private readonly uid: number\n private readonly gid: number\n\n constructor(ws: Workspace, options: MirageFSOptions = {}) {\n this.ws = ws\n this.agentId =\n options.agentId ??\n process.env[ENV_AGENT_ID] ??\n `agent-${Math.random().toString(36).slice(2, 10)}`\n this.now = new Date()\n this.root = options.rootPrefix !== undefined ? rstripSlash(options.rootPrefix) : ''\n // When scoped to a single mount, the FUSE root maps onto that mount and\n // there are no virtual intermediate directories to synthesize.\n this.prefixes = this.root === '' ? ws.mounts().map((m) => m.prefix) : []\n this.uid = typeof process.getuid === 'function' ? process.getuid() : 0\n this.gid = typeof process.getgid === 'function' ? process.getgid() : 0\n }\n\n // ── helpers ──────────────────────────────────────────────────────\n\n private resolve(path: string): string {\n if (this.root === '') return path\n return path === '/' ? this.root : this.root + path\n }\n\n private whoamiContent(): Uint8Array {\n const lines = [`agent: ${this.agentId}`, 'cwd: /', `mounts: ${this.prefixes.join(', ')}`]\n return new TextEncoder().encode(lines.join('\\n') + '\\n')\n }\n\n private dirStat(): FuseAttr {\n return {\n mtime: this.now,\n atime: this.now,\n ctime: this.now,\n nlink: 2,\n size: 0,\n mode: 0o040755,\n uid: this.uid,\n gid: this.gid,\n }\n }\n\n private fileStat(size: number): FuseAttr {\n return {\n mtime: this.now,\n atime: this.now,\n ctime: this.now,\n nlink: 1,\n size,\n mode: 0o100644,\n uid: this.uid,\n gid: this.gid,\n }\n }\n\n private isVirtualDir(path: string): boolean {\n const bare = rstripSlash(path)\n const normalized = bare + '/'\n for (const p of this.prefixes) {\n const pBare = rstripSlash(p)\n if (p.startsWith(normalized) || pBare === bare) return true\n }\n return false\n }\n\n private virtualChildren(path: string): string[] {\n const normalized = path === '/' ? '/' : rstripSlash(path) + '/'\n const children = new Set<string>()\n for (const p of this.prefixes) {\n if (p.startsWith(normalized) && p !== normalized) {\n const rest = p.slice(normalized.length)\n const child = rest.split('/')[0]\n if (child !== undefined && child !== '') children.add(child)\n }\n }\n return [...children].sort()\n }\n\n private cachedSize(path: string): number | null {\n for (const ctx of this.handles.values()) {\n if (ctx.path === path && ctx.data !== undefined) return ctx.data.byteLength\n }\n const entry = this.prefetchCache.get(path)\n if (entry !== undefined && entry.expires > Date.now()) return entry.data.byteLength\n return null\n }\n\n private cachedData(path: string): Uint8Array | null {\n for (const ctx of this.handles.values()) {\n if (ctx.path === path && ctx.data !== undefined) return ctx.data\n }\n const entry = this.prefetchCache.get(path)\n if (entry !== undefined && entry.expires > Date.now()) return entry.data\n if (entry !== undefined) this.prefetchCache.delete(path)\n return null\n }\n\n /**\n * Fetch bytes for a size-unknown file and cache them so the immediate\n * getattr → open → read burst (and subsequent stats within the TTL) reuse\n * the same fetch. Required because @zkochan/fuse-native doesn't expose\n * libfuse's `direct_io` flag — without a real size from getattr, the kernel\n * decides the file is empty and never issues read().\n */\n private async prefetch(path: string): Promise<Uint8Array | null> {\n const cached = this.cachedData(path)\n if (cached !== null) return cached\n const inflight = this.prefetchInflight.get(path)\n if (inflight !== undefined) return inflight\n const promise = (async (): Promise<Uint8Array | null> => {\n try {\n const data = await this.ws.fs.readFile(this.resolve(path))\n this.prefetchCache.set(path, { data, expires: Date.now() + PREFETCH_TTL_MS })\n return data\n } catch {\n return null\n } finally {\n this.prefetchInflight.delete(path)\n }\n })()\n this.prefetchInflight.set(path, promise)\n return promise\n }\n\n /** Drain and return accumulated op records (mirrors Python's drain_ops). */\n drainOps(): OpRecord[] {\n const records = [...this.ws.records]\n this.ws.records.length = 0\n return records\n }\n\n private async writeFile(path: string, data: Uint8Array): Promise<void> {\n // Keep FUSE writes on Workspace.dispatch rather than Workspace.fs.writeFile:\n // dispatch is where Mirage enforces mount modes, revision tracking, and\n // post-write invalidation. The lower-level fs helper is useful internally,\n // but using it from FUSE made READ-mode mounts reject create while still\n // allowing buffered overwrite on flush.\n await this.ws.dispatch('write', this.resolve(path), [data])\n }\n\n // ── FUSE op surface (mirrors mfusepy Operations) ─────────────────\n\n ops(): Record<string, unknown> {\n return {\n readdir: this.readdir.bind(this),\n getattr: this.getattr.bind(this),\n fgetattr: this.fgetattr.bind(this),\n open: this.open.bind(this),\n read: this.read.bind(this),\n write: this.write.bind(this),\n create: this.create.bind(this),\n unlink: this.unlink.bind(this),\n mkdir: this.mkdir.bind(this),\n rmdir: this.rmdir.bind(this),\n rename: this.rename.bind(this),\n release: this.release.bind(this),\n truncate: this.truncate.bind(this),\n flush: this.flush.bind(this),\n fsync: this.fsync.bind(this),\n utimens: this.utimens.bind(this),\n chmod: this.chmod.bind(this),\n chown: this.chown.bind(this),\n access: this.access.bind(this),\n statfs: this.statfs.bind(this),\n }\n }\n\n private getattr(path: string, cb: Cb<FuseAttr>): void {\n void (async () => {\n if (path === '/' || path === MIRAGE_DIR) {\n cb(0, this.dirStat())\n return\n }\n if (path === MIRAGE_WHOAMI) {\n cb(0, this.fileStat(this.whoamiContent().byteLength))\n return\n }\n // macOS Finder/Spotlight probes .DS_Store, ._*, .Spotlight-V100, etc.\n // Reject early to avoid hitting the ops layer.\n const name = path.slice(path.lastIndexOf('/') + 1)\n if (isMacosMetadata(name)) {\n cb(ENOENT)\n return\n }\n if (this.isVirtualDir(path)) {\n cb(0, this.dirStat())\n return\n }\n try {\n const s = await this.ws.fs.stat(this.resolve(path))\n if (s.type === FileType.DIRECTORY) {\n cb(0, this.dirStat())\n return\n }\n let size = s.size\n size ??= this.cachedSize(path) ?? UNKNOWN_SIZE_SENTINEL\n cb(0, this.fileStat(size))\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private fgetattr(path: string, fd: number, cb: Cb<FuseAttr>): void {\n // fstat(fd) after open: the open handler prefetched size-unknown files\n // into the handle, so answer with the real byte length instead of the\n // sentinel that path-based getattr reported before open.\n const ctx = this.handles.get(fd)\n if (ctx?.data !== undefined) {\n cb(0, this.fileStat(ctx.data.byteLength))\n return\n }\n this.getattr(path, cb)\n }\n\n private readdir(path: string, cb: Cb<string[]>): void {\n void (async () => {\n // `/.mirage/` virtual dir — a single pseudo file.\n if (path === MIRAGE_DIR) {\n cb(0, ['.', '..', 'whoami'])\n return\n }\n const names = new Set(this.virtualChildren(path))\n if (path === '/') names.add('.mirage')\n try {\n const entries = await this.ws.fs.readdir(this.resolve(path))\n for (const e of entries) {\n const part = rstripSlash(e).split('/').pop() ?? ''\n if (part !== '' && !isMacosMetadata(part)) names.add(part)\n }\n } catch {\n if (names.size === 0) {\n cb(ENOENT)\n return\n }\n }\n cb(0, ['.', '..', ...[...names].sort()])\n })()\n }\n\n private read(\n path: string,\n fd: number,\n buf: Buffer,\n len: number,\n pos: number,\n cb: (result: number) => void,\n ): void {\n void (async () => {\n if (path === MIRAGE_WHOAMI) {\n const data = this.whoamiContent()\n const slice = data.subarray(pos, pos + len)\n buf.set(slice, 0)\n cb(slice.byteLength)\n return\n }\n const ctx = this.handles.get(fd)\n try {\n // Filetype-aware read: no `raw: true`, so parquet/feather/hdf5/etc.\n // get routed through their read ops and surface as rendered text —\n // matches Python's `self._ops.read(path)` which also goes through\n // filetype dispatch.\n if (ctx !== undefined && ctx.data === undefined) {\n const cached = this.cachedData(path)\n ctx.data = cached ?? (await this.ws.fs.readFile(this.resolve(path)))\n }\n const data =\n ctx?.data ?? this.cachedData(path) ?? (await this.ws.fs.readFile(this.resolve(path)))\n const slice = data.subarray(pos, pos + len)\n buf.set(slice, 0)\n cb(slice.byteLength)\n } catch {\n cb(0)\n }\n })()\n }\n\n private write(\n path: string,\n fd: number,\n buf: Buffer,\n len: number,\n pos: number,\n cb: (result: number) => void,\n ): void {\n const ctx = this.handles.get(fd)\n const data = new Uint8Array(buf.subarray(0, len))\n if (ctx !== undefined) {\n ctx.writeBuf ??= []\n ctx.writeBuf.push([pos, data])\n cb(len)\n return\n }\n void (async () => {\n try {\n let existing: Uint8Array = new Uint8Array(0)\n try {\n existing = await this.ws.fs.readFile(this.resolve(path), { raw: true })\n } catch {\n // file may not exist yet\n }\n let merged = existing\n if (pos > merged.byteLength) {\n // zero-pad from end-of-file up to the write offset (sparse write).\n const padded = new Uint8Array(pos + data.byteLength)\n padded.set(merged, 0)\n padded.set(data, pos)\n merged = padded\n } else {\n const size = Math.max(merged.byteLength, pos + data.byteLength)\n const out = new Uint8Array(size)\n out.set(merged.subarray(0, pos), 0)\n out.set(data, pos)\n if (pos + data.byteLength < merged.byteLength) {\n out.set(merged.subarray(pos + data.byteLength), pos + data.byteLength)\n }\n merged = out\n }\n await this.writeFile(path, merged)\n cb(len)\n } catch {\n cb(0)\n }\n })()\n }\n\n private create(path: string, _mode: number, cb: Cb<number>): void {\n void (async () => {\n try {\n // Route through the resource's `create` op so backends that distinguish\n // \"create empty\" from \"write bytes\" get the right code path. Falls back\n // to writeFile(empty) when the resource doesn't expose `create`.\n try {\n await this.ws.dispatch('create', this.resolve(path))\n } catch (dispatchErr) {\n const msg = (\n dispatchErr instanceof Error ? dispatchErr.message : String(dispatchErr)\n ).toLowerCase()\n if (!msg.includes('no op')) throw dispatchErr\n await this.writeFile(path, new Uint8Array(0))\n }\n const fh = this.nextFh++\n this.handles.set(fh, { path })\n cb(0, fh)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private mkdir(path: string, _mode: number, cb: (code: number) => void): void {\n void (async () => {\n try {\n await this.ws.fs.mkdir(this.resolve(path))\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private unlink(path: string, cb: (code: number) => void): void {\n void (async () => {\n try {\n await this.ws.fs.unlink(this.resolve(path))\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private rename(src: string, dst: string, cb: (code: number) => void): void {\n void (async () => {\n try {\n await this.ws.fs.rename(this.resolve(src), this.resolve(dst))\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private rmdir(path: string, cb: (code: number) => void): void {\n void (async () => {\n try {\n // Detect non-empty directories up front so we can map to ENOTEMPTY\n // cleanly. Message-string sniffing alone (classifyError) is unreliable\n // across backends; check contents first.\n try {\n const entries = await this.ws.fs.readdir(this.resolve(path))\n if (entries.length > 0) {\n cb(ENOTEMPTY)\n return\n }\n } catch {\n // readdir failure — fall through to rmdir and let it raise the real\n // error (e.g. ENOENT for missing path).\n }\n await this.ws.fs.rmdir(this.resolve(path))\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private truncate(path: string, size: number, cb: (code: number) => void): void {\n void (async () => {\n try {\n // Prefer the resource's dedicated `truncate` op (atomic on most\n // backends). Fall back to read/resize/write for resources that don't\n // expose one.\n try {\n await this.ws.dispatch('truncate', this.resolve(path), [size])\n } catch (dispatchErr) {\n const msg = (\n dispatchErr instanceof Error ? dispatchErr.message : String(dispatchErr)\n ).toLowerCase()\n if (!msg.includes('no op')) throw dispatchErr\n const data = await this.ws.fs\n .readFile(this.resolve(path), { raw: true })\n .catch(() => new Uint8Array(0))\n const out = new Uint8Array(size)\n out.set(data.subarray(0, Math.min(data.byteLength, size)), 0)\n await this.writeFile(path, out)\n }\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private statfs(_path: string, cb: Cb<Record<string, number>>): void {\n cb(0, {\n bsize: 4096,\n frsize: 4096,\n blocks: 1024 * 1024,\n bfree: 1024 * 1024,\n bavail: 1024 * 1024,\n files: 1_000_000,\n ffree: 1_000_000,\n favail: 1_000_000,\n namemax: 255,\n })\n }\n\n // chmod / chown / utimens / access are no-ops for the filesystem but must\n // validate path existence — callers like `touch`/`chmod` on a missing file\n // should fail with ENOENT, not silently succeed.\n\n private chmod(path: string, _mode: number, cb: (code: number) => void): void {\n this.getattrValidate(path, cb)\n }\n\n private chown(path: string, _uid: number, _gid: number, cb: (code: number) => void): void {\n this.getattrValidate(path, cb)\n }\n\n private utimens(path: string, _atime: Date, _mtime: Date, cb: (code: number) => void): void {\n this.getattrValidate(path, cb)\n }\n\n private access(path: string, _amode: number, cb: (code: number) => void): void {\n this.getattrValidate(path, cb)\n }\n\n private getattrValidate(path: string, cb: (code: number) => void): void {\n // getattr's callback returns 0 on success and a negative errno on failure\n // (FUSE convention). Pass the code straight through so missing paths\n // surface as ENOENT instead of silently succeeding.\n this.getattr(path, (code) => {\n cb(code)\n })\n }\n\n private open(path: string, _flags: number, cb: Cb<number>): void {\n void (async () => {\n if (path === MIRAGE_WHOAMI) {\n const fh = this.nextFh++\n this.handles.set(fh, { path })\n cb(0, fh)\n return\n }\n try {\n const s = await this.ws.fs.stat(this.resolve(path))\n const ctx: Handle = { path }\n if (s.size === null && s.type !== FileType.DIRECTORY) {\n const data = await this.prefetch(path)\n if (data !== null) ctx.data = data\n }\n const fh = this.nextFh++\n this.handles.set(fh, ctx)\n cb(0, fh)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private release(_path: string, fd: number, cb: (code: number) => void): void {\n // Python does NOT flush on release — the kernel always issues flush first.\n // Auto-flushing here would conflict on error paths and hide real failures.\n this.handles.delete(fd)\n cb(0)\n }\n\n private flush(path: string, fd: number, cb: (code: number) => void): void {\n const ctx = this.handles.get(fd)\n if (ctx?.writeBuf === undefined || ctx.writeBuf.length === 0) {\n cb(0)\n return\n }\n const writes = ctx.writeBuf\n ctx.writeBuf = []\n void (async () => {\n try {\n let existing: Uint8Array = new Uint8Array(0)\n try {\n existing = await this.ws.fs.readFile(this.resolve(path), { raw: true })\n } catch {\n // ignore\n }\n let total = existing.byteLength\n for (const [off, chunk] of writes) {\n total = Math.max(total, off + chunk.byteLength)\n }\n const merged = new Uint8Array(total)\n merged.set(existing, 0)\n for (const [off, chunk] of writes) {\n merged.set(chunk, off)\n }\n await this.writeFile(path, merged)\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private fsync(path: string, _datasync: number, fd: number, cb: (code: number) => void): void {\n this.flush(path, fd, cb)\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\nconst MACOS_METADATA: ReadonlySet<string> = new Set([\n '.DS_Store',\n '.Spotlight-V100',\n '.fseventsd',\n '.Trashes',\n])\n\nexport function isMacosMetadata(name: string): boolean {\n return MACOS_METADATA.has(name) || name.startsWith('._')\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 { Buffer } from 'node:buffer'\nimport { createRequire } from 'node:module'\nimport { FileType, type Workspace } from '@struktoai/mirage-core'\n\nconst requireCjs = createRequire(import.meta.url)\nconst fs = requireCjs('node:fs') as Record<string, unknown>\n// fs-monkey ships no types\nconst fsMonkey = requireCjs('fs-monkey') as {\n patchFs: (vol: unknown, target?: unknown) => void\n}\nconst { patchFs } = fsMonkey\n\ntype Cb<T> = (err: NodeJS.ErrnoException | null, value?: T) => void\n\ntype FsLike = Record<string, unknown>\n\nfunction mountedPath(ws: Workspace, p: string): boolean {\n try {\n return ws.registry.mountFor(p) !== null\n } catch {\n return false\n }\n}\n\nasync function mirageStat(ws: Workspace, p: string): Promise<unknown> {\n const s = await ws.fs.stat(p)\n const isDir = s.type === FileType.DIRECTORY\n const mtime = s.modified !== null ? new Date(s.modified) : new Date(0)\n return {\n isFile: () => !isDir,\n isDirectory: () => isDir,\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isSymbolicLink: () => false,\n isFIFO: () => false,\n isSocket: () => false,\n size: s.size ?? 0,\n mtime,\n mtimeMs: mtime.getTime(),\n atime: mtime,\n atimeMs: mtime.getTime(),\n ctime: mtime,\n ctimeMs: mtime.getTime(),\n birthtime: mtime,\n birthtimeMs: mtime.getTime(),\n mode: 0,\n nlink: 1,\n uid: 0,\n gid: 0,\n rdev: 0,\n blksize: 0,\n blocks: 0,\n dev: 0,\n ino: 0,\n }\n}\n\n/**\n * Monkey-patch Node's `fs` module so that paths under any mirage mount\n * route through the workspace. Paths NOT under a mount fall through to\n * the real native fs. CJS-friendly; for ESM code you still need to use\n * `ws.fs.*` directly since ESM bindings are frozen.\n *\n * Returns a `restore()` function that undoes the patch.\n */\nexport function patchNodeFs(ws: Workspace): () => void {\n const originalFs: FsLike = { ...(fs as unknown as FsLike) }\n\n const vol: FsLike = {\n promises: {\n readFile: async (p: string, opts?: { encoding?: BufferEncoding } | BufferEncoding) => {\n if (mountedPath(ws, p)) {\n const bytes = await ws.fs.readFile(p)\n const encoding = typeof opts === 'string' ? opts : opts?.encoding\n if (encoding !== undefined) return Buffer.from(bytes).toString(encoding)\n return Buffer.from(bytes)\n }\n const native = (originalFs.promises as FsLike).readFile as (\n path: string,\n opts?: unknown,\n ) => Promise<Uint8Array | string>\n return native(p, opts)\n },\n writeFile: async (p: string, data: Uint8Array | string): Promise<void> => {\n if (mountedPath(ws, p)) {\n await ws.fs.writeFile(p, typeof data === 'string' ? data : data)\n return\n }\n const native = (originalFs.promises as FsLike).writeFile as (\n path: string,\n data: Uint8Array | string,\n ) => Promise<void>\n await native(p, data)\n },\n readdir: async (p: string): Promise<string[]> => {\n if (mountedPath(ws, p)) {\n // Workspace returns full paths; Node's fs.promises.readdir returns basenames.\n // Strip trailing slash on directory entries before slicing so dirs\n // don't collapse to ''.\n const entries = await ws.fs.readdir(p)\n return entries.map((e) => {\n const trimmed = e.endsWith('/') ? e.slice(0, -1) : e\n return trimmed.slice(trimmed.lastIndexOf('/') + 1)\n })\n }\n const native = (originalFs.promises as FsLike).readdir as (\n path: string,\n ) => Promise<string[]>\n return native(p)\n },\n stat: async (p: string): Promise<unknown> => {\n if (mountedPath(ws, p)) return mirageStat(ws, p)\n const native = (originalFs.promises as FsLike).stat as (path: string) => Promise<unknown>\n return native(p)\n },\n unlink: async (p: string): Promise<void> => {\n if (mountedPath(ws, p)) return ws.fs.unlink(p)\n const native = (originalFs.promises as FsLike).unlink as (path: string) => Promise<void>\n await native(p)\n },\n mkdir: async (p: string): Promise<void> => {\n if (mountedPath(ws, p)) return ws.fs.mkdir(p)\n const native = (originalFs.promises as FsLike).mkdir as (path: string) => Promise<void>\n await native(p)\n },\n rmdir: async (p: string): Promise<void> => {\n if (mountedPath(ws, p)) return ws.fs.rmdir(p)\n const native = (originalFs.promises as FsLike).rmdir as (path: string) => Promise<void>\n await native(p)\n },\n },\n readFileSync: (): Uint8Array => {\n throw new Error('mirage.patchNodeFs: sync fs methods not supported — use fs.promises.*')\n },\n readFile: (p: string, cb: Cb<Uint8Array>) => {\n if (mountedPath(ws, p)) {\n ws.fs\n .readFile(p)\n .then((data) => {\n cb(null, Buffer.from(data))\n })\n .catch((err: unknown) => {\n cb(err as NodeJS.ErrnoException)\n })\n return\n }\n const native = originalFs.readFile as (path: string, cb: Cb<Uint8Array>) => void\n native(p, cb)\n },\n readdir: (p: string, cb: Cb<string[]>) => {\n if (mountedPath(ws, p)) {\n ws.fs\n .readdir(p)\n .then((entries) => {\n cb(\n null,\n entries.map((e) => {\n const trimmed = e.endsWith('/') ? e.slice(0, -1) : e\n return trimmed.slice(trimmed.lastIndexOf('/') + 1)\n }),\n )\n })\n .catch((err: unknown) => {\n cb(err as NodeJS.ErrnoException)\n })\n return\n }\n const native = originalFs.readdir as (path: string, cb: Cb<string[]>) => void\n native(p, cb)\n },\n }\n\n patchFs(vol, fs)\n return function restore(): void {\n for (const [k, v] of Object.entries(originalFs)) {\n const desc = Object.getOwnPropertyDescriptor(fs, k)\n if (desc?.writable === false && desc.set === undefined) continue\n try {\n fs[k] = v\n } catch {\n // some fs properties are accessor-only and can't be reassigned; skip\n }\n }\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n type Accessor,\n type CommandOpts,\n type IndexCacheStore,\n type PathSpec,\n Precision,\n ProvisionResult,\n type Resource,\n} from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../../accessor/redis.ts'\nimport { stat as redisStat } from '../../../core/redis/stat.ts'\n\nexport interface RedisResourceLike extends Resource {\n readonly accessor: RedisAccessor\n}\n\ninterface ResolvedSizes {\n resolved: [string, number][]\n missing: number\n}\n\nasync function resolveSizes(\n accessor: RedisAccessor,\n paths: readonly PathSpec[],\n index: IndexCacheStore | undefined,\n): Promise<ResolvedSizes> {\n const resolved: [string, number][] = []\n let missing = 0\n for (const p of paths) {\n const pathStr = p.original\n let size: number | null = null\n if (index !== undefined) {\n const lookup = await index.get(pathStr)\n if (lookup.entry !== undefined && lookup.entry !== null) {\n size = lookup.entry.size\n }\n }\n if (size === null) {\n try {\n const fileStat = await redisStat(accessor, p)\n size = fileStat.size\n } catch {\n // fall through — size stays null\n }\n }\n if (size !== null) {\n resolved.push([pathStr, size])\n } else {\n missing += 1\n }\n }\n return { resolved, missing }\n}\n\nexport async function fileReadProvision(\n accessor: Accessor,\n paths: PathSpec[],\n _texts: string[],\n _opts: CommandOpts,\n): Promise<ProvisionResult> {\n if (paths.length === 0) {\n return new ProvisionResult({ precision: Precision.UNKNOWN })\n }\n const { resolved, missing } = await resolveSizes(accessor as RedisAccessor, paths, undefined)\n if (missing > 0 || resolved.length === 0) {\n return new ProvisionResult({ precision: Precision.UNKNOWN })\n }\n const total = resolved.reduce((sum, [, size]) => sum + size, 0)\n return new ProvisionResult({\n networkReadLow: total,\n networkReadHigh: total,\n readOps: resolved.length,\n precision: Precision.EXACT,\n })\n}\n\nexport async function headTailProvision(\n accessor: Accessor,\n paths: PathSpec[],\n _texts: string[],\n _opts: CommandOpts,\n): Promise<ProvisionResult> {\n if (paths.length === 0) {\n return new ProvisionResult({ precision: Precision.UNKNOWN })\n }\n const { resolved, missing } = await resolveSizes(accessor as RedisAccessor, paths, undefined)\n if (missing > 0 || resolved.length === 0) {\n return new ProvisionResult({ precision: Precision.UNKNOWN })\n }\n const total = resolved.reduce((sum, [, size]) => sum + size, 0)\n return new ProvisionResult({\n networkReadLow: total,\n networkReadHigh: total,\n readOps: resolved.length,\n precision: Precision.EXACT,\n })\n}\n\nexport function metadataProvision(\n _accessor: Accessor,\n paths: PathSpec[],\n _texts: string[],\n _opts: CommandOpts,\n): ProvisionResult {\n const n = Math.max(1, paths.length > 0 ? paths.length : 1)\n return new ProvisionResult({\n networkReadLow: 0,\n networkReadHigh: 0,\n readOps: n,\n precision: Precision.EXACT,\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 {\n type FileCache,\n defaultFingerprint,\n parseLimit,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { RedisClientType } from 'redis'\nimport { RedisResource, type RedisResourceOptions } from '../../resource/redis/redis.ts'\n\nexport interface RedisFileCacheOptions extends RedisResourceOptions {\n cacheLimit?: string | number\n maxDrainBytes?: number | null\n}\n\nexport class RedisFileCacheStore extends RedisResource implements FileCache {\n private readonly limit: number\n private readonly dataPrefix: string\n private readonly metaPrefix: string\n maxDrainBytes: number | null\n\n constructor(options: RedisFileCacheOptions = {}) {\n super({\n url: options.url ?? 'redis://localhost:6379/0',\n keyPrefix: options.keyPrefix ?? 'mirage:cache:',\n })\n this.limit = parseLimit(options.cacheLimit ?? '512MB')\n this.dataPrefix = `${this.keyPrefix}data:`\n this.metaPrefix = `${this.keyPrefix}meta:`\n this.maxDrainBytes = options.maxDrainBytes ?? null\n }\n\n readonly cacheSize = 0\n\n get cacheLimit(): number {\n return this.limit\n }\n\n cacheClient(): Promise<RedisClientType> {\n return this.store.client()\n }\n\n async get(key: string): Promise<Uint8Array | null> {\n const c = await this.cacheClient()\n const mod = await this.module()\n const blob = mod.RESP_TYPES.BLOB_STRING\n const mapping: Record<number, unknown> = { [blob]: Buffer }\n const typed = c as unknown as {\n withTypeMapping: (m: Record<number, unknown>) => {\n get: (k: string) => Promise<Buffer | null>\n }\n }\n const raw = await typed.withTypeMapping(mapping).get(`${this.dataPrefix}${key}`)\n if (raw === null) return null\n return new Uint8Array(raw.buffer, raw.byteOffset, raw.byteLength)\n }\n\n async set(\n key: string,\n data: Uint8Array,\n options: { fingerprint?: string | null; ttl?: number | null } = {},\n ): Promise<void> {\n const fp = options.fingerprint ?? defaultFingerprint(data)\n const c = await this.cacheClient()\n const dk = `${this.dataPrefix}${key}`\n const mk = `${this.metaPrefix}${key}`\n const pipe = c.multi()\n pipe.set(dk, Buffer.from(data.buffer, data.byteOffset, data.byteLength))\n pipe.set(mk, fp)\n if (options.ttl !== null && options.ttl !== undefined) {\n pipe.expire(dk, options.ttl)\n pipe.expire(mk, options.ttl)\n }\n await pipe.exec()\n }\n\n async add(\n key: string,\n data: Uint8Array,\n options: { fingerprint?: string | null; ttl?: number | null } = {},\n ): Promise<boolean> {\n const c = await this.cacheClient()\n const exists = await c.exists(`${this.dataPrefix}${key}`)\n if (exists) return false\n await this.set(key, data, options)\n return true\n }\n\n async remove(key: string): Promise<void> {\n const c = await this.cacheClient()\n const pipe = c.multi()\n pipe.del(`${this.dataPrefix}${key}`)\n pipe.del(`${this.metaPrefix}${key}`)\n await pipe.exec()\n }\n\n async exists(key: string | PathSpec): Promise<boolean> {\n const k = typeof key === 'string' ? key : key.stripPrefix\n const c = await this.cacheClient()\n return (await c.exists(`${this.dataPrefix}${k}`)) > 0\n }\n\n async isFresh(key: string, remoteFingerprint: string): Promise<boolean> {\n const c = await this.cacheClient()\n const fp = await c.get(`${this.metaPrefix}${key}`)\n if (fp === null) return false\n return fp === remoteFingerprint\n }\n\n async clear(): Promise<void> {\n const c = await this.cacheClient()\n for (const pattern of [`${this.dataPrefix}*`, `${this.metaPrefix}*`]) {\n const batch: string[] = []\n for await (const k of c.scanIterator({ MATCH: pattern })) {\n if (Array.isArray(k)) batch.push(...k)\n else batch.push(k)\n }\n if (batch.length > 0) await c.del(batch)\n }\n }\n\n async allCached(keys: readonly string[]): Promise<boolean> {\n for (const k of keys) {\n if (!(await this.exists(k))) return false\n }\n return true\n }\n\n async multiGet(keys: readonly string[]): Promise<(Uint8Array | null)[]> {\n const out: (Uint8Array | null)[] = []\n for (const k of keys) out.push(await this.get(k))\n return out\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 {\n type HfRepoConfig,\n type HfRepoConfigRedacted,\n normalizeHfRepoConfig,\n redactHfRepoConfig,\n} from '../hf_buckets/config.ts'\n\nexport type HfModelsConfig = HfRepoConfig\nexport type HfModelsConfigRedacted = HfRepoConfigRedacted\n\nexport const normalizeHfModelsConfig = normalizeHfRepoConfig\nexport const redactHfModelsConfig = redactHfRepoConfig\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n BaseResource,\n type FileStat,\n LANCEDB_COMMANDS,\n LANCEDB_OPS,\n LANCEDB_PROMPT,\n LanceDBAccessor,\n type LanceDBConfig,\n type LanceDBConfigResolved,\n lanceRead,\n lanceReaddir,\n lanceStat,\n type PathSpec,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n ResourceName,\n resolveLanceDBConfig,\n} from '@struktoai/mirage-core'\nimport { LanceDBStore } from './store.ts'\n\nconst REMOTE_SCHEMES = ['s3://', 'gs://', 'az://', 'hf://', 'db://']\n\nexport interface LanceDBResourceOptions {\n config: LanceDBConfig\n}\n\nexport class LanceDBResource extends BaseResource implements Resource {\n readonly kind: string = ResourceName.LANCEDB\n readonly isRemote: boolean\n readonly indexTtl: number = 0\n readonly prompt: string = LANCEDB_PROMPT\n readonly config: LanceDBConfigResolved\n readonly store: LanceDBStore\n readonly accessor: LanceDBAccessor\n\n constructor(options: LanceDBResourceOptions | LanceDBConfig) {\n super()\n const config = 'config' in options ? options.config : options\n this.config = resolveLanceDBConfig(config)\n this.isRemote = REMOTE_SCHEMES.some((scheme) => this.config.uri.startsWith(scheme))\n this.store = new LanceDBStore(this.config)\n this.accessor = new LanceDBAccessor(this.store, this.config)\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n async close(): Promise<void> {\n await this.store.close()\n }\n\n ops(): readonly RegisteredOp[] {\n return LANCEDB_OPS\n }\n\n commands(): readonly RegisteredCommand[] {\n return LANCEDB_COMMANDS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return lanceRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return lanceReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return lanceStat(this.accessor, p, this.index)\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { Connection, Table } from '@lancedb/lancedb'\nimport {\n loadOptionalPeer,\n type LanceDriver,\n type LanceRow,\n type LanceDBConfigResolved,\n} from '@struktoai/mirage-core'\n\nfunction toStr(value: unknown): string {\n if (value === null || value === undefined) return ''\n if (typeof value === 'object') return JSON.stringify(value)\n return String(value as string | number | boolean | bigint)\n}\n\nfunction eqClause(column: string, value: string): string {\n if (/^-?\\d+$/.test(value)) return `${column} = ${value}`\n return `${column} = '${value.replace(/'/g, \"''\")}'`\n}\n\nfunction whereClause(filters: Record<string, string>): string {\n return Object.entries(filters)\n .map(([col, val]) => eqClause(col, val))\n .join(' AND ')\n}\n\nexport class LanceDBStore implements LanceDriver {\n private readonly config: LanceDBConfigResolved\n private db: Connection | null = null\n private readonly tables = new Map<string, Table>()\n\n constructor(config: LanceDBConfigResolved) {\n this.config = config\n }\n\n private async connection(): Promise<Connection> {\n if (this.db === null) {\n const options: Record<string, unknown> = {}\n if (this.config.apiKey !== null) options.apiKey = this.config.apiKey\n if (this.config.storageOptions !== null) options.storageOptions = this.config.storageOptions\n if (this.config.uri.startsWith('db://')) {\n options.region = this.config.region\n if (this.config.hostOverride !== null) options.hostOverride = this.config.hostOverride\n }\n const { connect } = await loadOptionalPeer(() => import('@lancedb/lancedb'), {\n feature: 'LanceDBResource',\n packageName: '@lancedb/lancedb',\n })\n this.db = await connect(this.config.uri, options)\n }\n return this.db\n }\n\n private async table(name: string): Promise<Table> {\n const cached = this.tables.get(name)\n if (cached !== undefined) return cached\n const db = await this.connection()\n const tbl = await db.openTable(name)\n this.tables.set(name, tbl)\n return tbl\n }\n\n async listTables(): Promise<string[]> {\n const db = await this.connection()\n const names = await db.tableNames()\n return [...names].sort()\n }\n\n async distinct(\n table: string,\n column: string,\n filters: Record<string, string>,\n limit: number,\n ): Promise<string[]> {\n const tbl = await this.table(table)\n let query = tbl.query().select([column]).limit(limit)\n if (Object.keys(filters).length > 0) query = query.where(whereClause(filters))\n const rows = (await query.toArray()) as LanceRow[]\n const values = new Set<string>()\n for (const row of rows) {\n const v = row[column]\n if (v !== null && v !== undefined) values.add(toStr(v))\n }\n return [...values].sort()\n }\n\n async rowsMatching(\n table: string,\n filters: Record<string, string>,\n columns: string[],\n limit: number,\n ): Promise<LanceRow[]> {\n const tbl = await this.table(table)\n let query = tbl.query().select(columns).limit(limit)\n if (Object.keys(filters).length > 0) query = query.where(whereClause(filters))\n return (await query.toArray()) as LanceRow[]\n }\n\n async rowRecord(table: string, idColumn: string, rowId: string): Promise<LanceRow | null> {\n const tbl = await this.table(table)\n const rows = (await tbl\n .query()\n .where(eqClause(idColumn, rowId))\n .limit(1)\n .toArray()) as LanceRow[]\n return rows[0] ?? null\n }\n\n async search(table: string, query: string, limit: number): Promise<LanceRow[]> {\n const tbl = await this.table(table)\n return (await tbl.search(query).limit(limit).toArray()) as LanceRow[]\n }\n\n close(): Promise<void> {\n if (this.db !== null) {\n this.db.close()\n this.db = null\n }\n this.tables.clear()\n return Promise.resolve()\n }\n}\n","// ========= 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, type Resource } from '@struktoai/mirage-core'\n\n/**\n * Construct a resource by registry name. Mirrors Python's\n * `mirage.resource.registry.build_resource`.\n *\n * Each entry is an async factory that lazy-imports its module so that\n * importing this file doesn't pull in every backend's dependencies.\n * Only the resource you actually request gets loaded — important for\n * S3/Redis whose peer deps (`@aws-sdk/client-s3`, `redis`) are optional.\n *\n * Configs are normalized from Python-style snake_case (used in YAML and\n * by the Python `mirage.config` loader) to TS-idiomatic camelCase. So\n * the same YAML file works in both Python and TS.\n */\nexport type ResourceFactory = (config: Record<string, unknown>) => Promise<Resource>\n\nconst REGISTRY: Record<string, ResourceFactory> = {\n ram: async (_config) => {\n const { RAMResource } = await import('@struktoai/mirage-core')\n return new RAMResource()\n },\n disk: async (config) => {\n const { DiskResource } = await import('./disk/disk.ts')\n const norm = normalizeFields(config) as { root: string }\n return new DiskResource(norm)\n },\n redis: async (config) => {\n const { RedisResource } = await import('./redis/redis.ts')\n const norm = normalizeFields(config)\n return new RedisResource(norm)\n },\n s3: async (config) => {\n const { S3Resource } = await import('./s3/s3.ts')\n const { normalizeS3Config } = await import('./s3/config.ts')\n return new S3Resource(normalizeS3Config(config))\n },\n gcs: async (config) => {\n const { GCSResource } = await import('./gcs/gcs.ts')\n const { normalizeGcsConfig } = await import('./gcs/config.ts')\n return new GCSResource(normalizeGcsConfig(config))\n },\n oci: async (config) => {\n const { OCIResource } = await import('./oci/oci.ts')\n const { normalizeOciConfig } = await import('./oci/config.ts')\n return new OCIResource(normalizeOciConfig(config))\n },\n r2: async (config) => {\n const { R2Resource } = await import('./r2/r2.ts')\n const { normalizeR2Config } = await import('./r2/config.ts')\n return new R2Resource(normalizeR2Config(config))\n },\n hf_buckets: async (config) => {\n const { HfBucketsResource } = await import('./hf_buckets/hf_buckets.ts')\n const { normalizeHfBucketsConfig } = await import('./hf_buckets/config.ts')\n return new HfBucketsResource(normalizeHfBucketsConfig(config))\n },\n hf_datasets: async (config) => {\n const { HfDatasetsResource } = await import('./hf_datasets/hf_datasets.ts')\n const { normalizeHfRepoConfig } = await import('./hf_buckets/config.ts')\n return new HfDatasetsResource(normalizeHfRepoConfig(config))\n },\n hf_models: async (config) => {\n const { HfModelsResource } = await import('./hf_models/hf_models.ts')\n const { normalizeHfRepoConfig } = await import('./hf_buckets/config.ts')\n return new HfModelsResource(normalizeHfRepoConfig(config))\n },\n hf_spaces: async (config) => {\n const { HfSpacesResource } = await import('./hf_spaces/hf_spaces.ts')\n const { normalizeHfRepoConfig } = await import('./hf_buckets/config.ts')\n return new HfSpacesResource(normalizeHfRepoConfig(config))\n },\n supabase: async (config) => {\n const { SupabaseResource } = await import('./supabase/supabase.ts')\n const { normalizeSupabaseConfig } = await import('./supabase/config.ts')\n return new SupabaseResource(normalizeSupabaseConfig(config))\n },\n databricks_volume: async (config) => {\n const { DatabricksVolumeResource } = await import('./databricks_volume/databricks_volume.ts')\n const { normalizeDatabricksVolumeConfig } = await import('@struktoai/mirage-core')\n return DatabricksVolumeResource.create(normalizeDatabricksVolumeConfig(config))\n },\n minio: async (config) => {\n const { MinIOResource } = await import('./minio/minio.ts')\n const { normalizeMinIOConfig } = await import('./minio/config.ts')\n return new MinIOResource(normalizeMinIOConfig(config))\n },\n ceph: async (config) => {\n const { CephResource } = await import('./ceph/ceph.ts')\n const { normalizeCephConfig } = await import('./ceph/config.ts')\n return new CephResource(normalizeCephConfig(config))\n },\n seaweedfs: async (config) => {\n const { SeaweedFSResource } = await import('./seaweedfs/seaweedfs.ts')\n const { normalizeSeaweedFSConfig } = await import('./seaweedfs/config.ts')\n return new SeaweedFSResource(normalizeSeaweedFSConfig(config))\n },\n wasabi: async (config) => {\n const { WasabiResource } = await import('./wasabi/wasabi.ts')\n const { normalizeWasabiConfig } = await import('./wasabi/config.ts')\n return new WasabiResource(normalizeWasabiConfig(config))\n },\n backblaze: async (config) => {\n const { BackblazeResource } = await import('./backblaze/backblaze.ts')\n const { normalizeBackblazeConfig } = await import('./backblaze/config.ts')\n return new BackblazeResource(normalizeBackblazeConfig(config))\n },\n digitalocean: async (config) => {\n const { DigitalOceanResource } = await import('./digitalocean/digitalocean.ts')\n const { normalizeDigitalOceanConfig } = await import('./digitalocean/config.ts')\n return new DigitalOceanResource(normalizeDigitalOceanConfig(config))\n },\n tencent: async (config) => {\n const { TencentResource } = await import('./tencent/tencent.ts')\n const { normalizeTencentConfig } = await import('./tencent/config.ts')\n return new TencentResource(normalizeTencentConfig(config))\n },\n aliyun: async (config) => {\n const { AliyunResource } = await import('./aliyun/aliyun.ts')\n const { normalizeAliyunConfig } = await import('./aliyun/config.ts')\n return new AliyunResource(normalizeAliyunConfig(config))\n },\n scaleway: async (config) => {\n const { ScalewayResource } = await import('./scaleway/scaleway.ts')\n const { normalizeScalewayConfig } = await import('./scaleway/config.ts')\n return new ScalewayResource(normalizeScalewayConfig(config))\n },\n qingstor: async (config) => {\n const { QingStorResource } = await import('./qingstor/qingstor.ts')\n const { normalizeQingStorConfig } = await import('./qingstor/config.ts')\n return new QingStorResource(normalizeQingStorConfig(config))\n },\n postgres: async (config) => {\n const { PostgresResource } = await import('./postgres/postgres.ts')\n const { normalizePostgresConfig } = await import('@struktoai/mirage-core')\n return new PostgresResource(normalizePostgresConfig(config))\n },\n mongodb: async (config) => {\n const { MongoDBResource } = await import('./mongodb/mongodb.ts')\n const { normalizeMongoDBConfig } = await import('@struktoai/mirage-core')\n return new MongoDBResource(normalizeMongoDBConfig(config))\n },\n slack: async (config) => {\n const { SlackResource } = await import('./slack/slack.ts')\n const { normalizeSlackConfig } = await import('./slack/config.ts')\n return new SlackResource(normalizeSlackConfig(config))\n },\n ssh: async (config) => {\n const { SSHResource } = await import('./ssh/ssh.ts')\n const { normalizeSshConfig } = await import('./ssh/config.ts')\n return new SSHResource(normalizeSshConfig(config))\n },\n discord: async (config) => {\n const { DiscordResource } = await import('./discord/discord.ts')\n const { normalizeDiscordConfig } = await import('./discord/config.ts')\n return new DiscordResource(normalizeDiscordConfig(config))\n },\n trello: async (config) => {\n const { TrelloResource } = await import('./trello/trello.ts')\n const { normalizeTrelloConfig } = await import('./trello/config.ts')\n return new TrelloResource(normalizeTrelloConfig(config))\n },\n linear: async (config) => {\n const { LinearResource } = await import('./linear/linear.ts')\n const { normalizeLinearConfig } = await import('./linear/config.ts')\n return new LinearResource(normalizeLinearConfig(config))\n },\n notion: async (config) => {\n const { NotionResource } = await import('./notion/notion.ts')\n const { normalizeNotionConfig } = await import('./notion/config.ts')\n return new NotionResource(normalizeNotionConfig(config))\n },\n langfuse: async (config) => {\n const { LangfuseResource } = await import('./langfuse/langfuse.ts')\n const { normalizeLangfuseConfig } = await import('./langfuse/config.ts')\n return new LangfuseResource(normalizeLangfuseConfig(config))\n },\n github: async (config) => {\n const { GitHubResource } = await import('./github/github.ts')\n const { normalizeGitHubConfig } = await import('./github/config.ts')\n return GitHubResource.create(normalizeGitHubConfig(config))\n },\n github_ci: async (config) => {\n const { GitHubCIResource } = await import('./github_ci/github_ci.ts')\n const { normalizeGitHubCIConfig } = await import('./github_ci/config.ts')\n return new GitHubCIResource(normalizeGitHubCIConfig(config))\n },\n gdocs: async (config) => {\n const { GDocsResource } = await import('./gdocs/gdocs.ts')\n const { normalizeGDocsConfig } = await import('./gdocs/config.ts')\n return new GDocsResource(normalizeGDocsConfig(config))\n },\n gsheets: async (config) => {\n const { GSheetsResource } = await import('./gsheets/gsheets.ts')\n const { normalizeGSheetsConfig } = await import('./gsheets/config.ts')\n return new GSheetsResource(normalizeGSheetsConfig(config))\n },\n gslides: async (config) => {\n const { GSlidesResource } = await import('./gslides/gslides.ts')\n const { normalizeGSlidesConfig } = await import('./gslides/config.ts')\n return new GSlidesResource(normalizeGSlidesConfig(config))\n },\n gdrive: async (config) => {\n const { GDriveResource } = await import('./gdrive/gdrive.ts')\n const { normalizeGDriveConfig } = await import('./gdrive/config.ts')\n return new GDriveResource(normalizeGDriveConfig(config))\n },\n dropbox: async (config) => {\n const { DropboxResource } = await import('./dropbox/dropbox.ts')\n const { normalizeDropboxConfig } = await import('./dropbox/config.ts')\n return new DropboxResource(normalizeDropboxConfig(config))\n },\n box: async (config) => {\n const { BoxResource } = await import('./box/box.ts')\n const { normalizeBoxConfig } = await import('./box/config.ts')\n return new BoxResource(normalizeBoxConfig(config))\n },\n gmail: async (config) => {\n const { GmailResource } = await import('./gmail/gmail.ts')\n const { normalizeGmailConfig } = await import('./gmail/config.ts')\n return new GmailResource(normalizeGmailConfig(config))\n },\n email: async (config) => {\n const { EmailResource } = await import('./email/email.ts')\n const { normalizeEmailConfig } = await import('./email/config.ts')\n return new EmailResource(normalizeEmailConfig(config))\n },\n}\n\n/**\n * Look up the registered names. Lazily-mutated by `register()` so users\n * can extend the registry with custom resources.\n */\nexport function knownResources(): string[] {\n return Object.keys(REGISTRY).sort()\n}\n\n/**\n * Register a custom resource factory under `name`. Existing entries\n * are overwritten, mirroring Python's mutable REGISTRY dict.\n */\nexport function register(name: string, factory: ResourceFactory): void {\n REGISTRY[name] = factory\n}\n\n/**\n * Build a resource instance by registry name. Throws if the name is\n * unknown.\n */\nexport async function buildResource(\n name: string,\n config: Record<string, unknown> = {},\n): Promise<Resource> {\n const factory = REGISTRY[name]\n if (factory === undefined) {\n throw new Error(\n `unknown resource ${JSON.stringify(name)}; known: ${knownResources().join(', ')}`,\n )\n }\n return factory(config)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,cAAc;;;ACAd,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B;AAAA,EACE;AAAA,EAMA,aAAa;AAAA,OAER;;;ACXP,SAAS,cAAc;;;ACAvB,SAAS,gBAAgB;AACzB,SAAS,WAAW,mBAAmB;AACvC,SAAS,cAAc;AACvB,SAAS,YAAY;;;ACHrB,SAAS,UAAyC,mBAAmB;;;ACArE,IAAM,iBAAsC,oBAAI,IAAI;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,gBAAgB,MAAuB;AACrD,SAAO,eAAe,IAAI,IAAI,KAAK,KAAK,WAAW,IAAI;AACzD;;;ADNA,IAAM,eAAe;AACrB,IAAM,aAAa;AACnB,IAAM,gBAAgB;AAGtB,IAAM,SAAS;AACf,IAAM,SAAS;AACf,IAAM,UAAU;AAChB,IAAM,SAAS;AACf,IAAM,YAAY;AAClB,IAAM,MAAM;AAwBZ,IAAM,kBAAkB;AAsBxB,IAAM,wBAAwB,MAAM,OAAO;AAI3C,SAAS,cAAc,KAAsB;AAC3C,QAAM,OAAQ,IAA0B;AACxC,MAAI,SAAS,YAAa,QAAO;AACjC,MAAI,SAAS,UAAW,QAAO;AAC/B,MAAI,SAAS,SAAU,QAAO;AAC9B,MAAI,SAAS,SAAU,QAAO;AAC9B,MAAI,SAAS,SAAU,QAAO;AAC9B,QAAM,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,YAAY;AAC3E,MAAI,IAAI,SAAS,WAAW,KAAK,IAAI,SAAS,WAAW,EAAG,QAAO;AACnE,MAAI,IAAI,SAAS,iBAAiB,KAAK,IAAI,SAAS,SAAS,EAAG,QAAO;AACvE,MAAI,IAAI,SAAS,YAAY,KAAK,IAAI,SAAS,QAAQ,KAAK,IAAI,SAAS,WAAW;AAClF,WAAO;AACT,MAAI,IAAI,SAAS,aAAa,KAAK,IAAI,SAAS,QAAQ,EAAG,QAAO;AAClE,MACE,IAAI,SAAS,WAAW,KACxB,IAAI,SAAS,SAAS,KACtB,IAAI,SAAS,QAAQ,KACrB,IAAI,SAAS,UAAU;AAEvB,WAAO;AACT,SAAO;AACT;AAOO,IAAM,WAAN,MAAe;AAAA,EACH;AAAA,EACR;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU,oBAAI,IAAoB;AAAA,EAClC,gBAAgB,oBAAI,IAA2B;AAAA,EAC/C,mBAAmB,oBAAI,IAAwC;AAAA,EACxE,SAAS;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,IAAe,UAA2B,CAAC,GAAG;AACxD,SAAK,KAAK;AACV,SAAK,UACH,QAAQ,WACR,QAAQ,IAAI,YAAY,KACxB,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAClD,SAAK,MAAM,oBAAI,KAAK;AACpB,SAAK,OAAO,QAAQ,eAAe,SAAY,YAAY,QAAQ,UAAU,IAAI;AAGjF,SAAK,WAAW,KAAK,SAAS,KAAK,GAAG,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;AACvE,SAAK,MAAM,OAAO,QAAQ,WAAW,aAAa,QAAQ,OAAO,IAAI;AACrE,SAAK,MAAM,OAAO,QAAQ,WAAW,aAAa,QAAQ,OAAO,IAAI;AAAA,EACvE;AAAA;AAAA,EAIQ,QAAQ,MAAsB;AACpC,QAAI,KAAK,SAAS,GAAI,QAAO;AAC7B,WAAO,SAAS,MAAM,KAAK,OAAO,KAAK,OAAO;AAAA,EAChD;AAAA,EAEQ,gBAA4B;AAClC,UAAM,QAAQ,CAAC,UAAU,KAAK,OAAO,IAAI,UAAU,WAAW,KAAK,SAAS,KAAK,IAAI,CAAC,EAAE;AACxF,WAAO,IAAI,YAAY,EAAE,OAAO,MAAM,KAAK,IAAI,IAAI,IAAI;AAAA,EACzD;AAAA,EAEQ,UAAoB;AAC1B,WAAO;AAAA,MACL,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK,KAAK;AAAA,MACV,KAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA,EAEQ,SAAS,MAAwB;AACvC,WAAO;AAAA,MACL,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,OAAO;AAAA,MACP;AAAA,MACA,MAAM;AAAA,MACN,KAAK,KAAK;AAAA,MACV,KAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA,EAEQ,aAAa,MAAuB;AAC1C,UAAM,OAAO,YAAY,IAAI;AAC7B,UAAM,aAAa,OAAO;AAC1B,eAAW,KAAK,KAAK,UAAU;AAC7B,YAAM,QAAQ,YAAY,CAAC;AAC3B,UAAI,EAAE,WAAW,UAAU,KAAK,UAAU,KAAM,QAAO;AAAA,IACzD;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,MAAwB;AAC9C,UAAM,aAAa,SAAS,MAAM,MAAM,YAAY,IAAI,IAAI;AAC5D,UAAM,WAAW,oBAAI,IAAY;AACjC,eAAW,KAAK,KAAK,UAAU;AAC7B,UAAI,EAAE,WAAW,UAAU,KAAK,MAAM,YAAY;AAChD,cAAM,OAAO,EAAE,MAAM,WAAW,MAAM;AACtC,cAAM,QAAQ,KAAK,MAAM,GAAG,EAAE,CAAC;AAC/B,YAAI,UAAU,UAAa,UAAU,GAAI,UAAS,IAAI,KAAK;AAAA,MAC7D;AAAA,IACF;AACA,WAAO,CAAC,GAAG,QAAQ,EAAE,KAAK;AAAA,EAC5B;AAAA,EAEQ,WAAW,MAA6B;AAC9C,eAAW,OAAO,KAAK,QAAQ,OAAO,GAAG;AACvC,UAAI,IAAI,SAAS,QAAQ,IAAI,SAAS,OAAW,QAAO,IAAI,KAAK;AAAA,IACnE;AACA,UAAM,QAAQ,KAAK,cAAc,IAAI,IAAI;AACzC,QAAI,UAAU,UAAa,MAAM,UAAU,KAAK,IAAI,EAAG,QAAO,MAAM,KAAK;AACzE,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,MAAiC;AAClD,eAAW,OAAO,KAAK,QAAQ,OAAO,GAAG;AACvC,UAAI,IAAI,SAAS,QAAQ,IAAI,SAAS,OAAW,QAAO,IAAI;AAAA,IAC9D;AACA,UAAM,QAAQ,KAAK,cAAc,IAAI,IAAI;AACzC,QAAI,UAAU,UAAa,MAAM,UAAU,KAAK,IAAI,EAAG,QAAO,MAAM;AACpE,QAAI,UAAU,OAAW,MAAK,cAAc,OAAO,IAAI;AACvD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,SAAS,MAA0C;AAC/D,UAAM,SAAS,KAAK,WAAW,IAAI;AACnC,QAAI,WAAW,KAAM,QAAO;AAC5B,UAAM,WAAW,KAAK,iBAAiB,IAAI,IAAI;AAC/C,QAAI,aAAa,OAAW,QAAO;AACnC,UAAM,WAAW,YAAwC;AACvD,UAAI;AACF,cAAM,OAAO,MAAM,KAAK,GAAG,GAAG,SAAS,KAAK,QAAQ,IAAI,CAAC;AACzD,aAAK,cAAc,IAAI,MAAM,EAAE,MAAM,SAAS,KAAK,IAAI,IAAI,gBAAgB,CAAC;AAC5E,eAAO;AAAA,MACT,QAAQ;AACN,eAAO;AAAA,MACT,UAAE;AACA,aAAK,iBAAiB,OAAO,IAAI;AAAA,MACnC;AAAA,IACF,GAAG;AACH,SAAK,iBAAiB,IAAI,MAAM,OAAO;AACvC,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,WAAuB;AACrB,UAAM,UAAU,CAAC,GAAG,KAAK,GAAG,OAAO;AACnC,SAAK,GAAG,QAAQ,SAAS;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,UAAU,MAAc,MAAiC;AAMrE,UAAM,KAAK,GAAG,SAAS,SAAS,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC;AAAA,EAC5D;AAAA;AAAA,EAIA,MAA+B;AAC7B,WAAO;AAAA,MACL,SAAS,KAAK,QAAQ,KAAK,IAAI;AAAA,MAC/B,SAAS,KAAK,QAAQ,KAAK,IAAI;AAAA,MAC/B,UAAU,KAAK,SAAS,KAAK,IAAI;AAAA,MACjC,MAAM,KAAK,KAAK,KAAK,IAAI;AAAA,MACzB,MAAM,KAAK,KAAK,KAAK,IAAI;AAAA,MACzB,OAAO,KAAK,MAAM,KAAK,IAAI;AAAA,MAC3B,QAAQ,KAAK,OAAO,KAAK,IAAI;AAAA,MAC7B,QAAQ,KAAK,OAAO,KAAK,IAAI;AAAA,MAC7B,OAAO,KAAK,MAAM,KAAK,IAAI;AAAA,MAC3B,OAAO,KAAK,MAAM,KAAK,IAAI;AAAA,MAC3B,QAAQ,KAAK,OAAO,KAAK,IAAI;AAAA,MAC7B,SAAS,KAAK,QAAQ,KAAK,IAAI;AAAA,MAC/B,UAAU,KAAK,SAAS,KAAK,IAAI;AAAA,MACjC,OAAO,KAAK,MAAM,KAAK,IAAI;AAAA,MAC3B,OAAO,KAAK,MAAM,KAAK,IAAI;AAAA,MAC3B,SAAS,KAAK,QAAQ,KAAK,IAAI;AAAA,MAC/B,OAAO,KAAK,MAAM,KAAK,IAAI;AAAA,MAC3B,OAAO,KAAK,MAAM,KAAK,IAAI;AAAA,MAC3B,QAAQ,KAAK,OAAO,KAAK,IAAI;AAAA,MAC7B,QAAQ,KAAK,OAAO,KAAK,IAAI;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,QAAQ,MAAc,IAAwB;AACpD,UAAM,YAAY;AAChB,UAAI,SAAS,OAAO,SAAS,YAAY;AACvC,WAAG,GAAG,KAAK,QAAQ,CAAC;AACpB;AAAA,MACF;AACA,UAAI,SAAS,eAAe;AAC1B,WAAG,GAAG,KAAK,SAAS,KAAK,cAAc,EAAE,UAAU,CAAC;AACpD;AAAA,MACF;AAGA,YAAM,OAAO,KAAK,MAAM,KAAK,YAAY,GAAG,IAAI,CAAC;AACjD,UAAI,gBAAgB,IAAI,GAAG;AACzB,WAAG,MAAM;AACT;AAAA,MACF;AACA,UAAI,KAAK,aAAa,IAAI,GAAG;AAC3B,WAAG,GAAG,KAAK,QAAQ,CAAC;AACpB;AAAA,MACF;AACA,UAAI;AACF,cAAM,IAAI,MAAM,KAAK,GAAG,GAAG,KAAK,KAAK,QAAQ,IAAI,CAAC;AAClD,YAAI,EAAE,SAAS,SAAS,WAAW;AACjC,aAAG,GAAG,KAAK,QAAQ,CAAC;AACpB;AAAA,QACF;AACA,YAAI,OAAO,EAAE;AACb,iBAAS,KAAK,WAAW,IAAI,KAAK;AAClC,WAAG,GAAG,KAAK,SAAS,IAAI,CAAC;AAAA,MAC3B,SAAS,KAAK;AACZ,WAAG,cAAc,GAAG,CAAC;AAAA,MACvB;AAAA,IACF,GAAG;AAAA,EACL;AAAA,EAEQ,SAAS,MAAc,IAAY,IAAwB;AAIjE,UAAM,MAAM,KAAK,QAAQ,IAAI,EAAE;AAC/B,QAAI,KAAK,SAAS,QAAW;AAC3B,SAAG,GAAG,KAAK,SAAS,IAAI,KAAK,UAAU,CAAC;AACxC;AAAA,IACF;AACA,SAAK,QAAQ,MAAM,EAAE;AAAA,EACvB;AAAA,EAEQ,QAAQ,MAAc,IAAwB;AACpD,UAAM,YAAY;AAEhB,UAAI,SAAS,YAAY;AACvB,WAAG,GAAG,CAAC,KAAK,MAAM,QAAQ,CAAC;AAC3B;AAAA,MACF;AACA,YAAM,QAAQ,IAAI,IAAI,KAAK,gBAAgB,IAAI,CAAC;AAChD,UAAI,SAAS,IAAK,OAAM,IAAI,SAAS;AACrC,UAAI;AACF,cAAM,UAAU,MAAM,KAAK,GAAG,GAAG,QAAQ,KAAK,QAAQ,IAAI,CAAC;AAC3D,mBAAW,KAAK,SAAS;AACvB,gBAAM,OAAO,YAAY,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AAChD,cAAI,SAAS,MAAM,CAAC,gBAAgB,IAAI,EAAG,OAAM,IAAI,IAAI;AAAA,QAC3D;AAAA,MACF,QAAQ;AACN,YAAI,MAAM,SAAS,GAAG;AACpB,aAAG,MAAM;AACT;AAAA,QACF;AAAA,MACF;AACA,SAAG,GAAG,CAAC,KAAK,MAAM,GAAG,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;AAAA,IACzC,GAAG;AAAA,EACL;AAAA,EAEQ,KACN,MACA,IACA,KACA,KACA,KACA,IACM;AACN,UAAM,YAAY;AAChB,UAAI,SAAS,eAAe;AAC1B,cAAM,OAAO,KAAK,cAAc;AAChC,cAAM,QAAQ,KAAK,SAAS,KAAK,MAAM,GAAG;AAC1C,YAAI,IAAI,OAAO,CAAC;AAChB,WAAG,MAAM,UAAU;AACnB;AAAA,MACF;AACA,YAAM,MAAM,KAAK,QAAQ,IAAI,EAAE;AAC/B,UAAI;AAKF,YAAI,QAAQ,UAAa,IAAI,SAAS,QAAW;AAC/C,gBAAM,SAAS,KAAK,WAAW,IAAI;AACnC,cAAI,OAAO,UAAW,MAAM,KAAK,GAAG,GAAG,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,QACpE;AACA,cAAM,OACJ,KAAK,QAAQ,KAAK,WAAW,IAAI,KAAM,MAAM,KAAK,GAAG,GAAG,SAAS,KAAK,QAAQ,IAAI,CAAC;AACrF,cAAM,QAAQ,KAAK,SAAS,KAAK,MAAM,GAAG;AAC1C,YAAI,IAAI,OAAO,CAAC;AAChB,WAAG,MAAM,UAAU;AAAA,MACrB,QAAQ;AACN,WAAG,CAAC;AAAA,MACN;AAAA,IACF,GAAG;AAAA,EACL;AAAA,EAEQ,MACN,MACA,IACA,KACA,KACA,KACA,IACM;AACN,UAAM,MAAM,KAAK,QAAQ,IAAI,EAAE;AAC/B,UAAM,OAAO,IAAI,WAAW,IAAI,SAAS,GAAG,GAAG,CAAC;AAChD,QAAI,QAAQ,QAAW;AACrB,UAAI,aAAa,CAAC;AAClB,UAAI,SAAS,KAAK,CAAC,KAAK,IAAI,CAAC;AAC7B,SAAG,GAAG;AACN;AAAA,IACF;AACA,UAAM,YAAY;AAChB,UAAI;AACF,YAAI,WAAuB,IAAI,WAAW,CAAC;AAC3C,YAAI;AACF,qBAAW,MAAM,KAAK,GAAG,GAAG,SAAS,KAAK,QAAQ,IAAI,GAAG,EAAE,KAAK,KAAK,CAAC;AAAA,QACxE,QAAQ;AAAA,QAER;AACA,YAAI,SAAS;AACb,YAAI,MAAM,OAAO,YAAY;AAE3B,gBAAM,SAAS,IAAI,WAAW,MAAM,KAAK,UAAU;AACnD,iBAAO,IAAI,QAAQ,CAAC;AACpB,iBAAO,IAAI,MAAM,GAAG;AACpB,mBAAS;AAAA,QACX,OAAO;AACL,gBAAM,OAAO,KAAK,IAAI,OAAO,YAAY,MAAM,KAAK,UAAU;AAC9D,gBAAM,MAAM,IAAI,WAAW,IAAI;AAC/B,cAAI,IAAI,OAAO,SAAS,GAAG,GAAG,GAAG,CAAC;AAClC,cAAI,IAAI,MAAM,GAAG;AACjB,cAAI,MAAM,KAAK,aAAa,OAAO,YAAY;AAC7C,gBAAI,IAAI,OAAO,SAAS,MAAM,KAAK,UAAU,GAAG,MAAM,KAAK,UAAU;AAAA,UACvE;AACA,mBAAS;AAAA,QACX;AACA,cAAM,KAAK,UAAU,MAAM,MAAM;AACjC,WAAG,GAAG;AAAA,MACR,QAAQ;AACN,WAAG,CAAC;AAAA,MACN;AAAA,IACF,GAAG;AAAA,EACL;AAAA,EAEQ,OAAO,MAAc,OAAe,IAAsB;AAChE,UAAM,YAAY;AAChB,UAAI;AAIF,YAAI;AACF,gBAAM,KAAK,GAAG,SAAS,UAAU,KAAK,QAAQ,IAAI,CAAC;AAAA,QACrD,SAAS,aAAa;AACpB,gBAAM,OACJ,uBAAuB,QAAQ,YAAY,UAAU,OAAO,WAAW,GACvE,YAAY;AACd,cAAI,CAAC,IAAI,SAAS,OAAO,EAAG,OAAM;AAClC,gBAAM,KAAK,UAAU,MAAM,IAAI,WAAW,CAAC,CAAC;AAAA,QAC9C;AACA,cAAM,KAAK,KAAK;AAChB,aAAK,QAAQ,IAAI,IAAI,EAAE,KAAK,CAAC;AAC7B,WAAG,GAAG,EAAE;AAAA,MACV,SAAS,KAAK;AACZ,WAAG,cAAc,GAAG,CAAC;AAAA,MACvB;AAAA,IACF,GAAG;AAAA,EACL;AAAA,EAEQ,MAAM,MAAc,OAAe,IAAkC;AAC3E,UAAM,YAAY;AAChB,UAAI;AACF,cAAM,KAAK,GAAG,GAAG,MAAM,KAAK,QAAQ,IAAI,CAAC;AACzC,WAAG,CAAC;AAAA,MACN,SAAS,KAAK;AACZ,WAAG,cAAc,GAAG,CAAC;AAAA,MACvB;AAAA,IACF,GAAG;AAAA,EACL;AAAA,EAEQ,OAAO,MAAc,IAAkC;AAC7D,UAAM,YAAY;AAChB,UAAI;AACF,cAAM,KAAK,GAAG,GAAG,OAAO,KAAK,QAAQ,IAAI,CAAC;AAC1C,WAAG,CAAC;AAAA,MACN,SAAS,KAAK;AACZ,WAAG,cAAc,GAAG,CAAC;AAAA,MACvB;AAAA,IACF,GAAG;AAAA,EACL;AAAA,EAEQ,OAAO,KAAa,KAAa,IAAkC;AACzE,UAAM,YAAY;AAChB,UAAI;AACF,cAAM,KAAK,GAAG,GAAG,OAAO,KAAK,QAAQ,GAAG,GAAG,KAAK,QAAQ,GAAG,CAAC;AAC5D,WAAG,CAAC;AAAA,MACN,SAAS,KAAK;AACZ,WAAG,cAAc,GAAG,CAAC;AAAA,MACvB;AAAA,IACF,GAAG;AAAA,EACL;AAAA,EAEQ,MAAM,MAAc,IAAkC;AAC5D,UAAM,YAAY;AAChB,UAAI;AAIF,YAAI;AACF,gBAAM,UAAU,MAAM,KAAK,GAAG,GAAG,QAAQ,KAAK,QAAQ,IAAI,CAAC;AAC3D,cAAI,QAAQ,SAAS,GAAG;AACtB,eAAG,SAAS;AACZ;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAGR;AACA,cAAM,KAAK,GAAG,GAAG,MAAM,KAAK,QAAQ,IAAI,CAAC;AACzC,WAAG,CAAC;AAAA,MACN,SAAS,KAAK;AACZ,WAAG,cAAc,GAAG,CAAC;AAAA,MACvB;AAAA,IACF,GAAG;AAAA,EACL;AAAA,EAEQ,SAAS,MAAc,MAAc,IAAkC;AAC7E,UAAM,YAAY;AAChB,UAAI;AAIF,YAAI;AACF,gBAAM,KAAK,GAAG,SAAS,YAAY,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC;AAAA,QAC/D,SAAS,aAAa;AACpB,gBAAM,OACJ,uBAAuB,QAAQ,YAAY,UAAU,OAAO,WAAW,GACvE,YAAY;AACd,cAAI,CAAC,IAAI,SAAS,OAAO,EAAG,OAAM;AAClC,gBAAM,OAAO,MAAM,KAAK,GAAG,GACxB,SAAS,KAAK,QAAQ,IAAI,GAAG,EAAE,KAAK,KAAK,CAAC,EAC1C,MAAM,MAAM,IAAI,WAAW,CAAC,CAAC;AAChC,gBAAM,MAAM,IAAI,WAAW,IAAI;AAC/B,cAAI,IAAI,KAAK,SAAS,GAAG,KAAK,IAAI,KAAK,YAAY,IAAI,CAAC,GAAG,CAAC;AAC5D,gBAAM,KAAK,UAAU,MAAM,GAAG;AAAA,QAChC;AACA,WAAG,CAAC;AAAA,MACN,SAAS,KAAK;AACZ,WAAG,cAAc,GAAG,CAAC;AAAA,MACvB;AAAA,IACF,GAAG;AAAA,EACL;AAAA,EAEQ,OAAO,OAAe,IAAsC;AAClE,OAAG,GAAG;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMQ,MAAM,MAAc,OAAe,IAAkC;AAC3E,SAAK,gBAAgB,MAAM,EAAE;AAAA,EAC/B;AAAA,EAEQ,MAAM,MAAc,MAAc,MAAc,IAAkC;AACxF,SAAK,gBAAgB,MAAM,EAAE;AAAA,EAC/B;AAAA,EAEQ,QAAQ,MAAc,QAAc,QAAc,IAAkC;AAC1F,SAAK,gBAAgB,MAAM,EAAE;AAAA,EAC/B;AAAA,EAEQ,OAAO,MAAc,QAAgB,IAAkC;AAC7E,SAAK,gBAAgB,MAAM,EAAE;AAAA,EAC/B;AAAA,EAEQ,gBAAgB,MAAc,IAAkC;AAItE,SAAK,QAAQ,MAAM,CAAC,SAAS;AAC3B,SAAG,IAAI;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEQ,KAAK,MAAc,QAAgB,IAAsB;AAC/D,UAAM,YAAY;AAChB,UAAI,SAAS,eAAe;AAC1B,cAAM,KAAK,KAAK;AAChB,aAAK,QAAQ,IAAI,IAAI,EAAE,KAAK,CAAC;AAC7B,WAAG,GAAG,EAAE;AACR;AAAA,MACF;AACA,UAAI;AACF,cAAM,IAAI,MAAM,KAAK,GAAG,GAAG,KAAK,KAAK,QAAQ,IAAI,CAAC;AAClD,cAAM,MAAc,EAAE,KAAK;AAC3B,YAAI,EAAE,SAAS,QAAQ,EAAE,SAAS,SAAS,WAAW;AACpD,gBAAM,OAAO,MAAM,KAAK,SAAS,IAAI;AACrC,cAAI,SAAS,KAAM,KAAI,OAAO;AAAA,QAChC;AACA,cAAM,KAAK,KAAK;AAChB,aAAK,QAAQ,IAAI,IAAI,GAAG;AACxB,WAAG,GAAG,EAAE;AAAA,MACV,SAAS,KAAK;AACZ,WAAG,cAAc,GAAG,CAAC;AAAA,MACvB;AAAA,IACF,GAAG;AAAA,EACL;AAAA,EAEQ,QAAQ,OAAe,IAAY,IAAkC;AAG3E,SAAK,QAAQ,OAAO,EAAE;AACtB,OAAG,CAAC;AAAA,EACN;AAAA,EAEQ,MAAM,MAAc,IAAY,IAAkC;AACxE,UAAM,MAAM,KAAK,QAAQ,IAAI,EAAE;AAC/B,QAAI,KAAK,aAAa,UAAa,IAAI,SAAS,WAAW,GAAG;AAC5D,SAAG,CAAC;AACJ;AAAA,IACF;AACA,UAAM,SAAS,IAAI;AACnB,QAAI,WAAW,CAAC;AAChB,UAAM,YAAY;AAChB,UAAI;AACF,YAAI,WAAuB,IAAI,WAAW,CAAC;AAC3C,YAAI;AACF,qBAAW,MAAM,KAAK,GAAG,GAAG,SAAS,KAAK,QAAQ,IAAI,GAAG,EAAE,KAAK,KAAK,CAAC;AAAA,QACxE,QAAQ;AAAA,QAER;AACA,YAAI,QAAQ,SAAS;AACrB,mBAAW,CAAC,KAAK,KAAK,KAAK,QAAQ;AACjC,kBAAQ,KAAK,IAAI,OAAO,MAAM,MAAM,UAAU;AAAA,QAChD;AACA,cAAM,SAAS,IAAI,WAAW,KAAK;AACnC,eAAO,IAAI,UAAU,CAAC;AACtB,mBAAW,CAAC,KAAK,KAAK,KAAK,QAAQ;AACjC,iBAAO,IAAI,OAAO,GAAG;AAAA,QACvB;AACA,cAAM,KAAK,UAAU,MAAM,MAAM;AACjC,WAAG,CAAC;AAAA,MACN,SAAS,KAAK;AACZ,WAAG,cAAc,GAAG,CAAC;AAAA,MACvB;AAAA,IACF,GAAG;AAAA,EACL;AAAA,EAEQ,MAAM,MAAc,WAAmB,IAAY,IAAkC;AAC3F,SAAK,MAAM,MAAM,IAAI,EAAE;AAAA,EACzB;AACF;;;AD/lBA,eAAe,WAAqC;AAClD,QAAM,MAAM,MAAM;AAAA,IAChB,MAAM,OAAO,sBAAsB;AAAA,IACnC;AAAA,MACE,SAAS;AAAA,MACT,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AACA,QAAM,OAAQ,IAAI,WAAW;AAC7B,MAAI,OAAO,SAAS,YAAY;AAC9B,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACA,SAAO;AACT;AAGO,SAAS,aAAa,YAA0B;AACrD,MAAI;AACF,QAAI,QAAQ,aAAa,UAAU;AACjC,eAAS,0BAA0B,KAAK,UAAU,UAAU,CAAC,IAAI,EAAE,OAAO,SAAS,CAAC;AAAA,IACtF,OAAO;AACL,eAAS,iBAAiB,KAAK,UAAU,UAAU,CAAC,IAAI,EAAE,OAAO,SAAS,CAAC;AAAA,IAC7E;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAEA,eAAsB,MAAM,IAAe,UAAwB,CAAC,GAAwB;AAC1F,QAAM,OAAO,MAAM,SAAS;AAC5B,MAAI;AACJ,MAAI,QAAQ,eAAe,QAAW;AAEpC,cAAU,QAAQ,YAAY,EAAE,WAAW,KAAK,CAAC;AACjD,iBAAa,QAAQ;AAAA,EACvB,OAAO;AACL,iBAAa,YAAY,KAAK,OAAO,GAAG,cAAc,CAAC;AAAA,EACzD;AACA,QAAM,UAAU,QAAQ;AACxB,QAAM,MAAM,IAAI,SAAS,IAAI;AAAA,IAC3B,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC3C,GAAI,QAAQ,eAAe,SAAY,EAAE,YAAY,QAAQ,WAAW,IAAI,CAAC;AAAA,EAC/E,CAAC;AACD,QAAM,cAAc,QAAQ,eAAe,QAAQ,aAAa;AAKhE,QAAM,WAAoC;AAAA,IACxC,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,IACb,GAAI,cAAc,EAAE,aAAa,KAAK,IAAI,CAAC;AAAA,IAC3C,GAAI,QAAQ,eAAe,CAAC;AAAA,EAC9B;AACA,QAAM,OAAO,IAAI,KAAK,YAAY,IAAI,IAAI,GAAG,QAAQ;AACrD,QAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,SAAK,MAAM,CAAC,QAAQ;AAClB,UAAI,QAAQ,KAAM,SAAQ;AAAA,UACrB,QAAO,GAAG;AAAA,IACjB,CAAC;AAAA,EACH,CAAC;AACD,SAAO;AAAA,IACL;AAAA,IACA,SAAS,MACP,IAAI,QAAc,CAAC,SAAS,WAAW;AACrC,WAAK,QAAQ,CAAC,QAAQ;AACpB,YAAI,QAAQ,KAAM,SAAQ;AAAA,YACrB,QAAO,GAAG;AAAA,MACjB,CAAC;AAAA,IACH,CAAC;AAAA,EACL;AACF;AAEO,SAAS,gBAAgB,IAAe,UAAwB,CAAC,GAAwB;AAC9F,SAAO,MAAM,IAAI,OAAO;AAC1B;;;ADhHA,IAAM,UAAU,CAAC,UAAU,WAAW,QAAQ;AAS9C,IAAM,sBAAN,MAA0B;AAAA,EACP,SAAS,oBAAI,IAAgD;AAAA,EACtE,YAAY;AAAA,EACZ,UAAU;AAAA,EAElB,SAAS,OAAyD;AAChE,SAAK,OAAO,IAAI,KAAK;AACrB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,WAAW,OAAyD;AAClE,SAAK,OAAO,OAAO,KAAK;AAAA,EAC1B;AAAA,EAEQ,UAAgB;AACtB,QAAI,KAAK,UAAW;AACpB,SAAK,YAAY;AACjB,eAAW,OAAO,SAAS;AACzB,cAAQ,GAAG,KAAK,KAAK,QAAQ;AAAA,IAC/B;AACA,YAAQ,GAAG,cAAc,KAAK,MAAM;AACpC,YAAQ,GAAG,QAAQ,KAAK,MAAM;AAAA,EAChC;AAAA,EAEiB,WAAW,CAAC,QAAsB;AACjD,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU;AACf,SAAK,UAAU;AAGf,YAAQ,KAAK,QAAQ,KAAK,GAAG;AAAA,EAC/B;AAAA,EAEiB,SAAS,MAAY;AACpC,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,EACjB;AAAA,EAEQ,YAAkB;AACxB,eAAW,SAAS,KAAK,QAAQ;AAC/B,mBAAa,MAAM,UAAU;AAC7B,UAAI;AACF,eAAO,MAAM,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MAC3D,QAAQ;AAAA,MAER;AAAA,IACF;AACA,SAAK,OAAO,MAAM;AAAA,EACpB;AACF;AAEA,IAAM,UAAU,IAAI,oBAAoB;AAEjC,IAAM,cAAN,MAAkB;AAAA,EACf,SAA4B;AAAA,EAC5B,qBAAoC;AAAA,EACpC,OAAO;AAAA,EACP,eAAkE;AAAA,EAE1E,IAAI,aAA4B;AAC9B,QAAI,KAAK,WAAW,KAAM,QAAO,KAAK,OAAO;AAC7C,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,WAAW,MAAqB;AAClC,SAAK,qBAAqB;AAAA,EAC5B;AAAA,EAEA,MAAM,MAAM,IAAe,UAAwB,CAAC,GAAoB;AACtE,QAAI,KAAK,WAAW,KAAM,QAAO,KAAK,OAAO;AAC7C,SAAK,SAAS,MAAM,MAAM,IAAI,OAAO;AACrC,SAAK,OAAO;AACZ,SAAK,qBAAqB;AAC1B,SAAK,eAAe,EAAE,YAAY,KAAK,OAAO,YAAY,QAAQ,KAAK,OAAO;AAC9E,YAAQ,SAAS,KAAK,YAAY;AAClC,OAAG,kBAAkB,KAAK,OAAO,YAAY,EAAE,OAAO,KAAK,CAAC;AAC5D,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,MAAM,QAAQ,IAA+B;AAC3C,QAAI,KAAK,WAAW,MAAM;AACxB,UAAI,OAAO,OAAW,IAAG,kBAAkB,IAAI;AAC/C,WAAK,qBAAqB;AAC1B;AAAA,IACF;AACA,UAAM,KAAK,KAAK,OAAO;AACvB,QAAI;AACF,YAAM,KAAK,OAAO,QAAQ;AAAA,IAC5B,UAAE;AACA,UAAI,KAAK,iBAAiB,MAAM;AAC9B,gBAAQ,WAAW,KAAK,YAAY;AACpC,aAAK,eAAe;AAAA,MACtB;AACA,WAAK,SAAS;AACd,WAAK,OAAO;AACZ,UAAI,kBAAkB,IAAI;AAC1B,UAAI;AACF,eAAO,IAAI,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MAC7C,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,IAA+B;AACzC,QAAI,KAAK,KAAM,OAAM,KAAK,QAAQ,EAAE;AAAA,EACtC;AACF;;;AD3GA,IAAM,aAAa,cAAc,YAAY,GAAG;AAEhD,IAAI,eAA4C;AAEhD,SAAS,kBAAwC;AAC/C,MAAI,iBAAiB,KAAM,QAAO;AAClC,QAAM,aAAa,WAAW,QAAQ,sCAAsC;AAC5E,QAAM,cAAc,WAAW,QAAQ,wCAAwC;AAC/E,iBAAe,kBAAkB;AAAA,IAC/B,YAAY,aAAa,UAAU;AAAA,IACnC,aAAa,aAAa,WAAW;AAAA,EACvC,CAAC;AACD,SAAO;AACT;AAWO,IAAM,YAAN,cAAwB,cAAc;AAAA,EAC1B,mBAAmB,oBAAI,IAAyB;AAAA,EAChD,qBAAqB,oBAAI,IAAoB;AAAA,EACtD,mBAAyC;AAAA,EAEjD,YAAY,WAAqC,UAAgC,CAAC,GAAG;AACnF,UAAM,WAAW;AAAA,MACf,GAAG;AAAA,MACH,oBAAoB,QAAQ,sBAAsB;AAAA,IACpD,CAAC;AACD,UAAM,aAAa,QAAQ,cAAc,CAAC;AAC1C,UAAM,SAA0B,CAAC;AACjC,eAAW,CAAC,QAAQ,MAAM,KAAK,OAAO,QAAQ,UAAU,GAAG;AACzD,UAAI,WAAW,MAAO;AACtB,YAAM,KAAK,IAAI,YAAY;AAC3B,WAAK,iBAAiB,IAAI,QAAQ,EAAE;AACpC,YAAM,OAAO;AAAA,QACX,YAAY;AAAA,QACZ,GAAI,OAAO,WAAW,WAAW,EAAE,YAAY,OAAO,IAAI,CAAC;AAAA,MAC7D;AAUA,aAAO;AAAA,QACL,GAAG,MAAM,MAAM,IAAI,EAAE;AAAA,UACnB,CAAC,eAAe;AACd,iBAAK,mBAAmB,IAAI,QAAQ,UAAU;AAAA,UAChD;AAAA,UACA,CAAC,QAAiB;AAChB,oBAAQ,OAAO;AAAA,cACb,sCAAsC,MAAM,4BAC1C,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CACjD;AAAA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,SAAS,GAAG;AACrB,WAAK,mBAAmB,QAAQ,IAAI,MAAM,EAAE,KAAK,MAAM,MAAS;AAAA,IAClE;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,kBAA0C;AAC5C,WAAO,OAAO,YAAY,KAAK,kBAAkB;AAAA,EACnD;AAAA,EAEA,MAAc,kBAAiC;AAC7C,QAAI,KAAK,qBAAqB,MAAM;AAClC,YAAM,KAAK;AACX,WAAK,mBAAmB;AAAA,IAC1B;AAAA,EACF;AAAA,EAcA,MAAe,QACb,SACA,UAA0B,CAAC,GACe;AAC1C,UAAM,KAAK,gBAAgB;AAC3B,WAAO,MAAM,QAAQ,SAAS,OAAO;AAAA,EACvC;AAAA,EAEA,MAAe,QAAuB;AACpC,UAAM,KAAK,gBAAgB,EAAE,MAAM,MAAM,MAAS;AAClD,eAAW,MAAM,KAAK,iBAAiB,OAAO,GAAG;AAC/C,YAAM,GAAG,MAAM,IAAI;AAAA,IACrB;AACA,UAAM,MAAM,MAAM;AAAA,EACpB;AACF;;;AK9HA,SAAS,UAAAA,eAAc;AACvB,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,YAAAC,iBAAgC;AAEzC,IAAMC,cAAaF,eAAc,YAAY,GAAG;AAChD,IAAM,KAAKE,YAAW,SAAS;AAE/B,IAAM,WAAWA,YAAW,WAAW;AAGvC,IAAM,EAAE,QAAQ,IAAI;AAMpB,SAAS,YAAY,IAAe,GAAoB;AACtD,MAAI;AACF,WAAO,GAAG,SAAS,SAAS,CAAC,MAAM;AAAA,EACrC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,WAAW,IAAe,GAA6B;AACpE,QAAM,IAAI,MAAM,GAAG,GAAG,KAAK,CAAC;AAC5B,QAAM,QAAQ,EAAE,SAASD,UAAS;AAClC,QAAM,QAAQ,EAAE,aAAa,OAAO,IAAI,KAAK,EAAE,QAAQ,IAAI,oBAAI,KAAK,CAAC;AACrE,SAAO;AAAA,IACL,QAAQ,MAAM,CAAC;AAAA,IACf,aAAa,MAAM;AAAA,IACnB,eAAe,MAAM;AAAA,IACrB,mBAAmB,MAAM;AAAA,IACzB,gBAAgB,MAAM;AAAA,IACtB,QAAQ,MAAM;AAAA,IACd,UAAU,MAAM;AAAA,IAChB,MAAM,EAAE,QAAQ;AAAA,IAChB;AAAA,IACA,SAAS,MAAM,QAAQ;AAAA,IACvB,OAAO;AAAA,IACP,SAAS,MAAM,QAAQ;AAAA,IACvB,OAAO;AAAA,IACP,SAAS,MAAM,QAAQ;AAAA,IACvB,WAAW;AAAA,IACX,aAAa,MAAM,QAAQ;AAAA,IAC3B,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACF;AAUO,SAAS,YAAY,IAA2B;AACrD,QAAM,aAAqB,EAAE,GAAI,GAAyB;AAE1D,QAAM,MAAc;AAAA,IAClB,UAAU;AAAA,MACR,UAAU,OAAO,GAAW,SAA0D;AACpF,YAAI,YAAY,IAAI,CAAC,GAAG;AACtB,gBAAM,QAAQ,MAAM,GAAG,GAAG,SAAS,CAAC;AACpC,gBAAM,WAAW,OAAO,SAAS,WAAW,OAAO,MAAM;AACzD,cAAI,aAAa,OAAW,QAAOF,QAAO,KAAK,KAAK,EAAE,SAAS,QAAQ;AACvE,iBAAOA,QAAO,KAAK,KAAK;AAAA,QAC1B;AACA,cAAM,SAAU,WAAW,SAAoB;AAI/C,eAAO,OAAO,GAAG,IAAI;AAAA,MACvB;AAAA,MACA,WAAW,OAAO,GAAW,SAA6C;AACxE,YAAI,YAAY,IAAI,CAAC,GAAG;AACtB,gBAAM,GAAG,GAAG,UAAU,GAAG,OAAO,SAAS,WAAW,OAAO,IAAI;AAC/D;AAAA,QACF;AACA,cAAM,SAAU,WAAW,SAAoB;AAI/C,cAAM,OAAO,GAAG,IAAI;AAAA,MACtB;AAAA,MACA,SAAS,OAAO,MAAiC;AAC/C,YAAI,YAAY,IAAI,CAAC,GAAG;AAItB,gBAAM,UAAU,MAAM,GAAG,GAAG,QAAQ,CAAC;AACrC,iBAAO,QAAQ,IAAI,CAAC,MAAM;AACxB,kBAAM,UAAU,EAAE,SAAS,GAAG,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI;AACnD,mBAAO,QAAQ,MAAM,QAAQ,YAAY,GAAG,IAAI,CAAC;AAAA,UACnD,CAAC;AAAA,QACH;AACA,cAAM,SAAU,WAAW,SAAoB;AAG/C,eAAO,OAAO,CAAC;AAAA,MACjB;AAAA,MACA,MAAM,OAAO,MAAgC;AAC3C,YAAI,YAAY,IAAI,CAAC,EAAG,QAAO,WAAW,IAAI,CAAC;AAC/C,cAAM,SAAU,WAAW,SAAoB;AAC/C,eAAO,OAAO,CAAC;AAAA,MACjB;AAAA,MACA,QAAQ,OAAO,MAA6B;AAC1C,YAAI,YAAY,IAAI,CAAC,EAAG,QAAO,GAAG,GAAG,OAAO,CAAC;AAC7C,cAAM,SAAU,WAAW,SAAoB;AAC/C,cAAM,OAAO,CAAC;AAAA,MAChB;AAAA,MACA,OAAO,OAAO,MAA6B;AACzC,YAAI,YAAY,IAAI,CAAC,EAAG,QAAO,GAAG,GAAG,MAAM,CAAC;AAC5C,cAAM,SAAU,WAAW,SAAoB;AAC/C,cAAM,OAAO,CAAC;AAAA,MAChB;AAAA,MACA,OAAO,OAAO,MAA6B;AACzC,YAAI,YAAY,IAAI,CAAC,EAAG,QAAO,GAAG,GAAG,MAAM,CAAC;AAC5C,cAAM,SAAU,WAAW,SAAoB;AAC/C,cAAM,OAAO,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,IACA,cAAc,MAAkB;AAC9B,YAAM,IAAI,MAAM,4EAAuE;AAAA,IACzF;AAAA,IACA,UAAU,CAAC,GAAW,OAAuB;AAC3C,UAAI,YAAY,IAAI,CAAC,GAAG;AACtB,WAAG,GACA,SAAS,CAAC,EACV,KAAK,CAAC,SAAS;AACd,aAAG,MAAMA,QAAO,KAAK,IAAI,CAAC;AAAA,QAC5B,CAAC,EACA,MAAM,CAAC,QAAiB;AACvB,aAAG,GAA4B;AAAA,QACjC,CAAC;AACH;AAAA,MACF;AACA,YAAM,SAAS,WAAW;AAC1B,aAAO,GAAG,EAAE;AAAA,IACd;AAAA,IACA,SAAS,CAAC,GAAW,OAAqB;AACxC,UAAI,YAAY,IAAI,CAAC,GAAG;AACtB,WAAG,GACA,QAAQ,CAAC,EACT,KAAK,CAAC,YAAY;AACjB;AAAA,YACE;AAAA,YACA,QAAQ,IAAI,CAAC,MAAM;AACjB,oBAAM,UAAU,EAAE,SAAS,GAAG,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI;AACnD,qBAAO,QAAQ,MAAM,QAAQ,YAAY,GAAG,IAAI,CAAC;AAAA,YACnD,CAAC;AAAA,UACH;AAAA,QACF,CAAC,EACA,MAAM,CAAC,QAAiB;AACvB,aAAG,GAA4B;AAAA,QACjC,CAAC;AACH;AAAA,MACF;AACA,YAAM,SAAS,WAAW;AAC1B,aAAO,GAAG,EAAE;AAAA,IACd;AAAA,EACF;AAEA,UAAQ,KAAK,EAAE;AACf,SAAO,SAAS,UAAgB;AAC9B,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC/C,YAAM,OAAO,OAAO,yBAAyB,IAAI,CAAC;AAClD,UAAI,MAAM,aAAa,SAAS,KAAK,QAAQ,OAAW;AACxD,UAAI;AACF,WAAG,CAAC,IAAI;AAAA,MACV,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;;;ACxLA;AAAA,EAKE;AAAA,EACA;AAAA,OAEK;AAaP,eAAe,aACb,UACA,OACA,OACwB;AACxB,QAAM,WAA+B,CAAC;AACtC,MAAI,UAAU;AACd,aAAW,KAAK,OAAO;AACrB,UAAM,UAAU,EAAE;AAClB,QAAI,OAAsB;AAC1B,QAAI,UAAU,QAAW;AACvB,YAAM,SAAS,MAAM,MAAM,IAAI,OAAO;AACtC,UAAI,OAAO,UAAU,UAAa,OAAO,UAAU,MAAM;AACvD,eAAO,OAAO,MAAM;AAAA,MACtB;AAAA,IACF;AACA,QAAI,SAAS,MAAM;AACjB,UAAI;AACF,cAAM,WAAW,MAAM,KAAU,UAAU,CAAC;AAC5C,eAAO,SAAS;AAAA,MAClB,QAAQ;AAAA,MAER;AAAA,IACF;AACA,QAAI,SAAS,MAAM;AACjB,eAAS,KAAK,CAAC,SAAS,IAAI,CAAC;AAAA,IAC/B,OAAO;AACL,iBAAW;AAAA,IACb;AAAA,EACF;AACA,SAAO,EAAE,UAAU,QAAQ;AAC7B;AAEA,eAAsB,kBACpB,UACA,OACA,QACA,OAC0B;AAC1B,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,IAAI,gBAAgB,EAAE,WAAW,UAAU,QAAQ,CAAC;AAAA,EAC7D;AACA,QAAM,EAAE,UAAU,QAAQ,IAAI,MAAM,aAAa,UAA2B,OAAO,MAAS;AAC5F,MAAI,UAAU,KAAK,SAAS,WAAW,GAAG;AACxC,WAAO,IAAI,gBAAgB,EAAE,WAAW,UAAU,QAAQ,CAAC;AAAA,EAC7D;AACA,QAAM,QAAQ,SAAS,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,MAAM,MAAM,MAAM,CAAC;AAC9D,SAAO,IAAI,gBAAgB;AAAA,IACzB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,SAAS,SAAS;AAAA,IAClB,WAAW,UAAU;AAAA,EACvB,CAAC;AACH;AAEA,eAAsB,kBACpB,UACA,OACA,QACA,OAC0B;AAC1B,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,IAAI,gBAAgB,EAAE,WAAW,UAAU,QAAQ,CAAC;AAAA,EAC7D;AACA,QAAM,EAAE,UAAU,QAAQ,IAAI,MAAM,aAAa,UAA2B,OAAO,MAAS;AAC5F,MAAI,UAAU,KAAK,SAAS,WAAW,GAAG;AACxC,WAAO,IAAI,gBAAgB,EAAE,WAAW,UAAU,QAAQ,CAAC;AAAA,EAC7D;AACA,QAAM,QAAQ,SAAS,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,MAAM,MAAM,MAAM,CAAC;AAC9D,SAAO,IAAI,gBAAgB;AAAA,IACzB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,SAAS,SAAS;AAAA,IAClB,WAAW,UAAU;AAAA,EACvB,CAAC;AACH;AAEO,SAAS,kBACd,WACA,OACA,QACA,OACiB;AACjB,QAAM,IAAI,KAAK,IAAI,GAAG,MAAM,SAAS,IAAI,MAAM,SAAS,CAAC;AACzD,SAAO,IAAI,gBAAgB;AAAA,IACzB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,WAAW,UAAU;AAAA,EACvB,CAAC;AACH;;;AC/GA;AAAA,EAEE;AAAA,EACA;AAAA,OAEK;AASA,IAAM,sBAAN,cAAkC,cAAmC;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AAAA,EACjB;AAAA,EAEA,YAAY,UAAiC,CAAC,GAAG;AAC/C,UAAM;AAAA,MACJ,KAAK,QAAQ,OAAO;AAAA,MACpB,WAAW,QAAQ,aAAa;AAAA,IAClC,CAAC;AACD,SAAK,QAAQ,WAAW,QAAQ,cAAc,OAAO;AACrD,SAAK,aAAa,GAAG,KAAK,SAAS;AACnC,SAAK,aAAa,GAAG,KAAK,SAAS;AACnC,SAAK,gBAAgB,QAAQ,iBAAiB;AAAA,EAChD;AAAA,EAES,YAAY;AAAA,EAErB,IAAI,aAAqB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAwC;AACtC,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B;AAAA,EAEA,MAAM,IAAI,KAAyC;AACjD,UAAM,IAAI,MAAM,KAAK,YAAY;AACjC,UAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,UAAM,OAAO,IAAI,WAAW;AAC5B,UAAM,UAAmC,EAAE,CAAC,IAAI,GAAG,OAAO;AAC1D,UAAM,QAAQ;AAKd,UAAM,MAAM,MAAM,MAAM,gBAAgB,OAAO,EAAE,IAAI,GAAG,KAAK,UAAU,GAAG,GAAG,EAAE;AAC/E,QAAI,QAAQ,KAAM,QAAO;AACzB,WAAO,IAAI,WAAW,IAAI,QAAQ,IAAI,YAAY,IAAI,UAAU;AAAA,EAClE;AAAA,EAEA,MAAM,IACJ,KACA,MACA,UAAgE,CAAC,GAClD;AACf,UAAM,KAAK,QAAQ,eAAe,mBAAmB,IAAI;AACzD,UAAM,IAAI,MAAM,KAAK,YAAY;AACjC,UAAM,KAAK,GAAG,KAAK,UAAU,GAAG,GAAG;AACnC,UAAM,KAAK,GAAG,KAAK,UAAU,GAAG,GAAG;AACnC,UAAM,OAAO,EAAE,MAAM;AACrB,SAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU,CAAC;AACvE,SAAK,IAAI,IAAI,EAAE;AACf,QAAI,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAW;AACrD,WAAK,OAAO,IAAI,QAAQ,GAAG;AAC3B,WAAK,OAAO,IAAI,QAAQ,GAAG;AAAA,IAC7B;AACA,UAAM,KAAK,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,IACJ,KACA,MACA,UAAgE,CAAC,GAC/C;AAClB,UAAM,IAAI,MAAM,KAAK,YAAY;AACjC,UAAM,SAAS,MAAM,EAAE,OAAO,GAAG,KAAK,UAAU,GAAG,GAAG,EAAE;AACxD,QAAI,OAAQ,QAAO;AACnB,UAAM,KAAK,IAAI,KAAK,MAAM,OAAO;AACjC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,KAA4B;AACvC,UAAM,IAAI,MAAM,KAAK,YAAY;AACjC,UAAM,OAAO,EAAE,MAAM;AACrB,SAAK,IAAI,GAAG,KAAK,UAAU,GAAG,GAAG,EAAE;AACnC,SAAK,IAAI,GAAG,KAAK,UAAU,GAAG,GAAG,EAAE;AACnC,UAAM,KAAK,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,OAAO,KAA0C;AACrD,UAAM,IAAI,OAAO,QAAQ,WAAW,MAAM,IAAI;AAC9C,UAAM,IAAI,MAAM,KAAK,YAAY;AACjC,WAAQ,MAAM,EAAE,OAAO,GAAG,KAAK,UAAU,GAAG,CAAC,EAAE,IAAK;AAAA,EACtD;AAAA,EAEA,MAAM,QAAQ,KAAa,mBAA6C;AACtE,UAAM,IAAI,MAAM,KAAK,YAAY;AACjC,UAAM,KAAK,MAAM,EAAE,IAAI,GAAG,KAAK,UAAU,GAAG,GAAG,EAAE;AACjD,QAAI,OAAO,KAAM,QAAO;AACxB,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,IAAI,MAAM,KAAK,YAAY;AACjC,eAAW,WAAW,CAAC,GAAG,KAAK,UAAU,KAAK,GAAG,KAAK,UAAU,GAAG,GAAG;AACpE,YAAM,QAAkB,CAAC;AACzB,uBAAiB,KAAK,EAAE,aAAa,EAAE,OAAO,QAAQ,CAAC,GAAG;AACxD,YAAI,MAAM,QAAQ,CAAC,EAAG,OAAM,KAAK,GAAG,CAAC;AAAA,YAChC,OAAM,KAAK,CAAC;AAAA,MACnB;AACA,UAAI,MAAM,SAAS,EAAG,OAAM,EAAE,IAAI,KAAK;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,MAA2C;AACzD,eAAW,KAAK,MAAM;AACpB,UAAI,CAAE,MAAM,KAAK,OAAO,CAAC,EAAI,QAAO;AAAA,IACtC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,MAAyD;AACtE,UAAM,MAA6B,CAAC;AACpC,eAAW,KAAK,KAAM,KAAI,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC;AAChD,WAAO;AAAA,EACT;AACF;;;AC1HO,IAAM,0BAA0B;AAChC,IAAM,uBAAuB;;;ACXpC;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EAKA;AAAA,EACA;AAAA,OACK;;;ACjBP;AAAA,EACE,oBAAAI;AAAA,OAIK;AAEP,SAAS,MAAM,OAAwB;AACrC,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO,KAAK,UAAU,KAAK;AAC1D,SAAO,OAAO,KAA2C;AAC3D;AAEA,SAAS,SAAS,QAAgB,OAAuB;AACvD,MAAI,UAAU,KAAK,KAAK,EAAG,QAAO,GAAG,MAAM,MAAM,KAAK;AACtD,SAAO,GAAG,MAAM,OAAO,MAAM,QAAQ,MAAM,IAAI,CAAC;AAClD;AAEA,SAAS,YAAY,SAAyC;AAC5D,SAAO,OAAO,QAAQ,OAAO,EAC1B,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM,SAAS,KAAK,GAAG,CAAC,EACtC,KAAK,OAAO;AACjB;AAEO,IAAM,eAAN,MAA0C;AAAA,EAC9B;AAAA,EACT,KAAwB;AAAA,EACf,SAAS,oBAAI,IAAmB;AAAA,EAEjD,YAAY,QAA+B;AACzC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAc,aAAkC;AAC9C,QAAI,KAAK,OAAO,MAAM;AACpB,YAAM,UAAmC,CAAC;AAC1C,UAAI,KAAK,OAAO,WAAW,KAAM,SAAQ,SAAS,KAAK,OAAO;AAC9D,UAAI,KAAK,OAAO,mBAAmB,KAAM,SAAQ,iBAAiB,KAAK,OAAO;AAC9E,UAAI,KAAK,OAAO,IAAI,WAAW,OAAO,GAAG;AACvC,gBAAQ,SAAS,KAAK,OAAO;AAC7B,YAAI,KAAK,OAAO,iBAAiB,KAAM,SAAQ,eAAe,KAAK,OAAO;AAAA,MAC5E;AACA,YAAM,EAAE,QAAQ,IAAI,MAAMA,kBAAiB,MAAM,OAAO,kBAAkB,GAAG;AAAA,QAC3E,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AACD,WAAK,KAAK,MAAM,QAAQ,KAAK,OAAO,KAAK,OAAO;AAAA,IAClD;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,MAAM,MAA8B;AAChD,UAAM,SAAS,KAAK,OAAO,IAAI,IAAI;AACnC,QAAI,WAAW,OAAW,QAAO;AACjC,UAAM,KAAK,MAAM,KAAK,WAAW;AACjC,UAAM,MAAM,MAAM,GAAG,UAAU,IAAI;AACnC,SAAK,OAAO,IAAI,MAAM,GAAG;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAgC;AACpC,UAAM,KAAK,MAAM,KAAK,WAAW;AACjC,UAAM,QAAQ,MAAM,GAAG,WAAW;AAClC,WAAO,CAAC,GAAG,KAAK,EAAE,KAAK;AAAA,EACzB;AAAA,EAEA,MAAM,SACJ,OACA,QACA,SACA,OACmB;AACnB,UAAM,MAAM,MAAM,KAAK,MAAM,KAAK;AAClC,QAAI,QAAQ,IAAI,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK;AACpD,QAAI,OAAO,KAAK,OAAO,EAAE,SAAS,EAAG,SAAQ,MAAM,MAAM,YAAY,OAAO,CAAC;AAC7E,UAAM,OAAQ,MAAM,MAAM,QAAQ;AAClC,UAAM,SAAS,oBAAI,IAAY;AAC/B,eAAW,OAAO,MAAM;AACtB,YAAM,IAAI,IAAI,MAAM;AACpB,UAAI,MAAM,QAAQ,MAAM,OAAW,QAAO,IAAI,MAAM,CAAC,CAAC;AAAA,IACxD;AACA,WAAO,CAAC,GAAG,MAAM,EAAE,KAAK;AAAA,EAC1B;AAAA,EAEA,MAAM,aACJ,OACA,SACA,SACA,OACqB;AACrB,UAAM,MAAM,MAAM,KAAK,MAAM,KAAK;AAClC,QAAI,QAAQ,IAAI,MAAM,EAAE,OAAO,OAAO,EAAE,MAAM,KAAK;AACnD,QAAI,OAAO,KAAK,OAAO,EAAE,SAAS,EAAG,SAAQ,MAAM,MAAM,YAAY,OAAO,CAAC;AAC7E,WAAQ,MAAM,MAAM,QAAQ;AAAA,EAC9B;AAAA,EAEA,MAAM,UAAU,OAAe,UAAkB,OAAyC;AACxF,UAAM,MAAM,MAAM,KAAK,MAAM,KAAK;AAClC,UAAM,OAAQ,MAAM,IACjB,MAAM,EACN,MAAM,SAAS,UAAU,KAAK,CAAC,EAC/B,MAAM,CAAC,EACP,QAAQ;AACX,WAAO,KAAK,CAAC,KAAK;AAAA,EACpB;AAAA,EAEA,MAAM,OAAO,OAAe,OAAe,OAAoC;AAC7E,UAAM,MAAM,MAAM,KAAK,MAAM,KAAK;AAClC,WAAQ,MAAM,IAAI,OAAO,KAAK,EAAE,MAAM,KAAK,EAAE,QAAQ;AAAA,EACvD;AAAA,EAEA,QAAuB;AACrB,QAAI,KAAK,OAAO,MAAM;AACpB,WAAK,GAAG,MAAM;AACd,WAAK,KAAK;AAAA,IACZ;AACA,SAAK,OAAO,MAAM;AAClB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;;;ADnGA,IAAM,iBAAiB,CAAC,SAAS,SAAS,SAAS,SAAS,OAAO;AAM5D,IAAM,kBAAN,cAA8B,aAAiC;AAAA,EAC3D,OAAe,aAAa;AAAA,EAC5B;AAAA,EACA,WAAmB;AAAA,EACnB,SAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAAiD;AAC3D,UAAM;AACN,UAAM,SAAS,YAAY,UAAU,QAAQ,SAAS;AACtD,SAAK,SAAS,qBAAqB,MAAM;AACzC,SAAK,WAAW,eAAe,KAAK,CAAC,WAAW,KAAK,OAAO,IAAI,WAAW,MAAM,CAAC;AAClF,SAAK,QAAQ,IAAI,aAAa,KAAK,MAAM;AACzC,SAAK,WAAW,IAAI,gBAAgB,KAAK,OAAO,KAAK,MAAM;AAAA,EAC7D;AAAA,EAEA,OAAsB;AACpB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,MAAM,MAAM;AAAA,EACzB;AAAA,EAEA,MAA+B;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,WAAyC;AACvC,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;AACF;;;AExEA,SAAS,uBAAsC;AAiB/C,IAAM,WAA4C;AAAA,EAChD,KAAK,OAAO,YAAY;AACtB,UAAM,EAAE,YAAY,IAAI,MAAM,OAAO,wBAAwB;AAC7D,WAAO,IAAI,YAAY;AAAA,EACzB;AAAA,EACA,MAAM,OAAO,WAAW;AACtB,UAAM,EAAE,cAAAC,cAAa,IAAI,MAAM,OAAO,oBAAgB;AACtD,UAAM,OAAO,gBAAgB,MAAM;AACnC,WAAO,IAAIA,cAAa,IAAI;AAAA,EAC9B;AAAA,EACA,OAAO,OAAO,WAAW;AACvB,UAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,qBAAkB;AACzD,UAAM,OAAO,gBAAgB,MAAM;AACnC,WAAO,IAAIA,eAAc,IAAI;AAAA,EAC/B;AAAA,EACA,IAAI,OAAO,WAAW;AACpB,UAAM,EAAE,YAAAC,YAAW,IAAI,MAAM,OAAO,kBAAY;AAChD,UAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,sBAAgB;AAC3D,WAAO,IAAIA,YAAW,kBAAkB,MAAM,CAAC;AAAA,EACjD;AAAA,EACA,KAAK,OAAO,WAAW;AACrB,UAAM,EAAE,aAAAC,aAAY,IAAI,MAAM,OAAO,mBAAc;AACnD,UAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,sBAAiB;AAC7D,WAAO,IAAIA,aAAY,mBAAmB,MAAM,CAAC;AAAA,EACnD;AAAA,EACA,KAAK,OAAO,WAAW;AACrB,UAAM,EAAE,aAAAC,aAAY,IAAI,MAAM,OAAO,mBAAc;AACnD,UAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,sBAAiB;AAC7D,WAAO,IAAIA,aAAY,mBAAmB,MAAM,CAAC;AAAA,EACnD;AAAA,EACA,IAAI,OAAO,WAAW;AACpB,UAAM,EAAE,YAAAC,YAAW,IAAI,MAAM,OAAO,kBAAY;AAChD,UAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,sBAAgB;AAC3D,WAAO,IAAIA,YAAW,kBAAkB,MAAM,CAAC;AAAA,EACjD;AAAA,EACA,YAAY,OAAO,WAAW;AAC5B,UAAM,EAAE,mBAAAC,mBAAkB,IAAI,MAAM,OAAO,0BAA4B;AACvE,UAAM,EAAE,0BAAAC,0BAAyB,IAAI,MAAM,OAAO,sBAAwB;AAC1E,WAAO,IAAID,mBAAkBC,0BAAyB,MAAM,CAAC;AAAA,EAC/D;AAAA,EACA,aAAa,OAAO,WAAW;AAC7B,UAAM,EAAE,oBAAAC,oBAAmB,IAAI,MAAM,OAAO,2BAA8B;AAC1E,UAAM,EAAE,uBAAAC,uBAAsB,IAAI,MAAM,OAAO,sBAAwB;AACvE,WAAO,IAAID,oBAAmBC,uBAAsB,MAAM,CAAC;AAAA,EAC7D;AAAA,EACA,WAAW,OAAO,WAAW;AAC3B,UAAM,EAAE,kBAAAC,kBAAiB,IAAI,MAAM,OAAO,yBAA0B;AACpE,UAAM,EAAE,uBAAAD,uBAAsB,IAAI,MAAM,OAAO,sBAAwB;AACvE,WAAO,IAAIC,kBAAiBD,uBAAsB,MAAM,CAAC;AAAA,EAC3D;AAAA,EACA,WAAW,OAAO,WAAW;AAC3B,UAAM,EAAE,kBAAAE,kBAAiB,IAAI,MAAM,OAAO,yBAA0B;AACpE,UAAM,EAAE,uBAAAF,uBAAsB,IAAI,MAAM,OAAO,sBAAwB;AACvE,WAAO,IAAIE,kBAAiBF,uBAAsB,MAAM,CAAC;AAAA,EAC3D;AAAA,EACA,UAAU,OAAO,WAAW;AAC1B,UAAM,EAAE,kBAAAG,kBAAiB,IAAI,MAAM,OAAO,wBAAwB;AAClE,UAAM,EAAE,wBAAwB,IAAI,MAAM,OAAO,sBAAsB;AACvE,WAAO,IAAIA,kBAAiB,wBAAwB,MAAM,CAAC;AAAA,EAC7D;AAAA,EACA,mBAAmB,OAAO,WAAW;AACnC,UAAM,EAAE,0BAAAC,0BAAyB,IAAI,MAAM,OAAO,iCAA0C;AAC5F,UAAM,EAAE,gCAAgC,IAAI,MAAM,OAAO,wBAAwB;AACjF,WAAOA,0BAAyB,OAAO,gCAAgC,MAAM,CAAC;AAAA,EAChF;AAAA,EACA,OAAO,OAAO,WAAW;AACvB,UAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,qBAAkB;AACzD,UAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,sBAAmB;AACjE,WAAO,IAAIA,eAAc,qBAAqB,MAAM,CAAC;AAAA,EACvD;AAAA,EACA,MAAM,OAAO,WAAW;AACtB,UAAM,EAAE,cAAAC,cAAa,IAAI,MAAM,OAAO,oBAAgB;AACtD,UAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,sBAAkB;AAC/D,WAAO,IAAIA,cAAa,oBAAoB,MAAM,CAAC;AAAA,EACrD;AAAA,EACA,WAAW,OAAO,WAAW;AAC3B,UAAM,EAAE,mBAAAC,mBAAkB,IAAI,MAAM,OAAO,yBAA0B;AACrE,UAAM,EAAE,yBAAyB,IAAI,MAAM,OAAO,sBAAuB;AACzE,WAAO,IAAIA,mBAAkB,yBAAyB,MAAM,CAAC;AAAA,EAC/D;AAAA,EACA,QAAQ,OAAO,WAAW;AACxB,UAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM,OAAO,sBAAoB;AAC5D,UAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,sBAAoB;AACnE,WAAO,IAAIA,gBAAe,sBAAsB,MAAM,CAAC;AAAA,EACzD;AAAA,EACA,WAAW,OAAO,WAAW;AAC3B,UAAM,EAAE,mBAAAC,mBAAkB,IAAI,MAAM,OAAO,yBAA0B;AACrE,UAAM,EAAE,yBAAyB,IAAI,MAAM,OAAO,sBAAuB;AACzE,WAAO,IAAIA,mBAAkB,yBAAyB,MAAM,CAAC;AAAA,EAC/D;AAAA,EACA,cAAc,OAAO,WAAW;AAC9B,UAAM,EAAE,sBAAAC,sBAAqB,IAAI,MAAM,OAAO,4BAAgC;AAC9E,UAAM,EAAE,4BAA4B,IAAI,MAAM,OAAO,sBAA0B;AAC/E,WAAO,IAAIA,sBAAqB,4BAA4B,MAAM,CAAC;AAAA,EACrE;AAAA,EACA,SAAS,OAAO,WAAW;AACzB,UAAM,EAAE,iBAAAC,iBAAgB,IAAI,MAAM,OAAO,uBAAsB;AAC/D,UAAM,EAAE,uBAAuB,IAAI,MAAM,OAAO,sBAAqB;AACrE,WAAO,IAAIA,iBAAgB,uBAAuB,MAAM,CAAC;AAAA,EAC3D;AAAA,EACA,QAAQ,OAAO,WAAW;AACxB,UAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM,OAAO,sBAAoB;AAC5D,UAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,sBAAoB;AACnE,WAAO,IAAIA,gBAAe,sBAAsB,MAAM,CAAC;AAAA,EACzD;AAAA,EACA,UAAU,OAAO,WAAW;AAC1B,UAAM,EAAE,kBAAAC,kBAAiB,IAAI,MAAM,OAAO,wBAAwB;AAClE,UAAM,EAAE,wBAAwB,IAAI,MAAM,OAAO,sBAAsB;AACvE,WAAO,IAAIA,kBAAiB,wBAAwB,MAAM,CAAC;AAAA,EAC7D;AAAA,EACA,UAAU,OAAO,WAAW;AAC1B,UAAM,EAAE,kBAAAC,kBAAiB,IAAI,MAAM,OAAO,wBAAwB;AAClE,UAAM,EAAE,wBAAwB,IAAI,MAAM,OAAO,sBAAsB;AACvE,WAAO,IAAIA,kBAAiB,wBAAwB,MAAM,CAAC;AAAA,EAC7D;AAAA,EACA,UAAU,OAAO,WAAW;AAC1B,UAAM,EAAE,kBAAAC,kBAAiB,IAAI,MAAM,OAAO,wBAAwB;AAClE,UAAM,EAAE,wBAAwB,IAAI,MAAM,OAAO,wBAAwB;AACzE,WAAO,IAAIA,kBAAiB,wBAAwB,MAAM,CAAC;AAAA,EAC7D;AAAA,EACA,SAAS,OAAO,WAAW;AACzB,UAAM,EAAE,iBAAAC,iBAAgB,IAAI,MAAM,OAAO,uBAAsB;AAC/D,UAAM,EAAE,uBAAuB,IAAI,MAAM,OAAO,wBAAwB;AACxE,WAAO,IAAIA,iBAAgB,uBAAuB,MAAM,CAAC;AAAA,EAC3D;AAAA,EACA,OAAO,OAAO,WAAW;AACvB,UAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,qBAAkB;AACzD,UAAM,EAAE,sBAAAC,sBAAqB,IAAI,MAAM,OAAO,sBAAmB;AACjE,WAAO,IAAID,eAAcC,sBAAqB,MAAM,CAAC;AAAA,EACvD;AAAA,EACA,KAAK,OAAO,WAAW;AACrB,UAAM,EAAE,aAAAC,aAAY,IAAI,MAAM,OAAO,mBAAc;AACnD,UAAM,EAAE,oBAAAC,oBAAmB,IAAI,MAAM,OAAO,sBAAiB;AAC7D,WAAO,IAAID,aAAYC,oBAAmB,MAAM,CAAC;AAAA,EACnD;AAAA,EACA,SAAS,OAAO,WAAW;AACzB,UAAM,EAAE,iBAAAC,iBAAgB,IAAI,MAAM,OAAO,uBAAsB;AAC/D,UAAM,EAAE,wBAAAC,wBAAuB,IAAI,MAAM,OAAO,sBAAqB;AACrE,WAAO,IAAID,iBAAgBC,wBAAuB,MAAM,CAAC;AAAA,EAC3D;AAAA,EACA,QAAQ,OAAO,WAAW;AACxB,UAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM,OAAO,sBAAoB;AAC5D,UAAM,EAAE,uBAAAC,uBAAsB,IAAI,MAAM,OAAO,sBAAoB;AACnE,WAAO,IAAID,gBAAeC,uBAAsB,MAAM,CAAC;AAAA,EACzD;AAAA,EACA,QAAQ,OAAO,WAAW;AACxB,UAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM,OAAO,sBAAoB;AAC5D,UAAM,EAAE,uBAAAC,uBAAsB,IAAI,MAAM,OAAO,sBAAoB;AACnE,WAAO,IAAID,gBAAeC,uBAAsB,MAAM,CAAC;AAAA,EACzD;AAAA,EACA,QAAQ,OAAO,WAAW;AACxB,UAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM,OAAO,sBAAoB;AAC5D,UAAM,EAAE,uBAAAC,uBAAsB,IAAI,MAAM,OAAO,sBAAoB;AACnE,WAAO,IAAID,gBAAeC,uBAAsB,MAAM,CAAC;AAAA,EACzD;AAAA,EACA,UAAU,OAAO,WAAW;AAC1B,UAAM,EAAE,kBAAAC,kBAAiB,IAAI,MAAM,OAAO,wBAAwB;AAClE,UAAM,EAAE,yBAAAC,yBAAwB,IAAI,MAAM,OAAO,sBAAsB;AACvE,WAAO,IAAID,kBAAiBC,yBAAwB,MAAM,CAAC;AAAA,EAC7D;AAAA,EACA,QAAQ,OAAO,WAAW;AACxB,UAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM,OAAO,sBAAoB;AAC5D,UAAM,EAAE,uBAAAC,uBAAsB,IAAI,MAAM,OAAO,sBAAoB;AACnE,WAAOD,gBAAe,OAAOC,uBAAsB,MAAM,CAAC;AAAA,EAC5D;AAAA,EACA,WAAW,OAAO,WAAW;AAC3B,UAAM,EAAE,kBAAAC,kBAAiB,IAAI,MAAM,OAAO,yBAA0B;AACpE,UAAM,EAAE,yBAAAC,yBAAwB,IAAI,MAAM,OAAO,sBAAuB;AACxE,WAAO,IAAID,kBAAiBC,yBAAwB,MAAM,CAAC;AAAA,EAC7D;AAAA,EACA,OAAO,OAAO,WAAW;AACvB,UAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,qBAAkB;AACzD,UAAM,EAAE,sBAAAC,sBAAqB,IAAI,MAAM,OAAO,sBAAmB;AACjE,WAAO,IAAID,eAAcC,sBAAqB,MAAM,CAAC;AAAA,EACvD;AAAA,EACA,SAAS,OAAO,WAAW;AACzB,UAAM,EAAE,iBAAAC,iBAAgB,IAAI,MAAM,OAAO,uBAAsB;AAC/D,UAAM,EAAE,wBAAAC,wBAAuB,IAAI,MAAM,OAAO,sBAAqB;AACrE,WAAO,IAAID,iBAAgBC,wBAAuB,MAAM,CAAC;AAAA,EAC3D;AAAA,EACA,SAAS,OAAO,WAAW;AACzB,UAAM,EAAE,iBAAAC,iBAAgB,IAAI,MAAM,OAAO,uBAAsB;AAC/D,UAAM,EAAE,wBAAAC,wBAAuB,IAAI,MAAM,OAAO,sBAAqB;AACrE,WAAO,IAAID,iBAAgBC,wBAAuB,MAAM,CAAC;AAAA,EAC3D;AAAA,EACA,QAAQ,OAAO,WAAW;AACxB,UAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM,OAAO,sBAAoB;AAC5D,UAAM,EAAE,uBAAAC,uBAAsB,IAAI,MAAM,OAAO,sBAAoB;AACnE,WAAO,IAAID,gBAAeC,uBAAsB,MAAM,CAAC;AAAA,EACzD;AAAA,EACA,SAAS,OAAO,WAAW;AACzB,UAAM,EAAE,iBAAAC,iBAAgB,IAAI,MAAM,OAAO,uBAAsB;AAC/D,UAAM,EAAE,wBAAAC,wBAAuB,IAAI,MAAM,OAAO,sBAAqB;AACrE,WAAO,IAAID,iBAAgBC,wBAAuB,MAAM,CAAC;AAAA,EAC3D;AAAA,EACA,KAAK,OAAO,WAAW;AACrB,UAAM,EAAE,aAAAC,aAAY,IAAI,MAAM,OAAO,mBAAc;AACnD,UAAM,EAAE,oBAAAC,oBAAmB,IAAI,MAAM,OAAO,sBAAiB;AAC7D,WAAO,IAAID,aAAYC,oBAAmB,MAAM,CAAC;AAAA,EACnD;AAAA,EACA,OAAO,OAAO,WAAW;AACvB,UAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,qBAAkB;AACzD,UAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,sBAAmB;AACjE,WAAO,IAAIA,eAAc,qBAAqB,MAAM,CAAC;AAAA,EACvD;AAAA,EACA,OAAO,OAAO,WAAW;AACvB,UAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,qBAAkB;AACzD,UAAM,EAAE,sBAAAC,sBAAqB,IAAI,MAAM,OAAO,sBAAmB;AACjE,WAAO,IAAID,eAAcC,sBAAqB,MAAM,CAAC;AAAA,EACvD;AACF;AAMO,SAAS,iBAA2B;AACzC,SAAO,OAAO,KAAK,QAAQ,EAAE,KAAK;AACpC;AAMO,SAAS,SAAS,MAAc,SAAgC;AACrE,WAAS,IAAI,IAAI;AACnB;AAMA,eAAsB,cACpB,MACA,SAAkC,CAAC,GAChB;AACnB,QAAM,UAAU,SAAS,IAAI;AAC7B,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI;AAAA,MACR,oBAAoB,KAAK,UAAU,IAAI,CAAC,YAAY,eAAe,EAAE,KAAK,IAAI,CAAC;AAAA,IACjF;AAAA,EACF;AACA,SAAO,QAAQ,MAAM;AACvB;","names":["Buffer","createRequire","FileType","requireCjs","loadOptionalPeer","DiskResource","RedisResource","S3Resource","GCSResource","OCIResource","R2Resource","HfBucketsResource","normalizeHfBucketsConfig","HfDatasetsResource","normalizeHfRepoConfig","HfModelsResource","HfSpacesResource","SupabaseResource","DatabricksVolumeResource","MinIOResource","CephResource","SeaweedFSResource","WasabiResource","BackblazeResource","DigitalOceanResource","TencentResource","AliyunResource","ScalewayResource","QingStorResource","PostgresResource","MongoDBResource","SlackResource","normalizeSlackConfig","SSHResource","normalizeSshConfig","DiscordResource","normalizeDiscordConfig","TrelloResource","normalizeTrelloConfig","LinearResource","normalizeLinearConfig","NotionResource","normalizeNotionConfig","LangfuseResource","normalizeLangfuseConfig","GitHubResource","normalizeGitHubConfig","GitHubCIResource","normalizeGitHubCIConfig","GDocsResource","normalizeGDocsConfig","GSheetsResource","normalizeGSheetsConfig","GSlidesResource","normalizeGSlidesConfig","GDriveResource","normalizeGDriveConfig","DropboxResource","normalizeDropboxConfig","BoxResource","normalizeBoxConfig","GmailResource","EmailResource","normalizeEmailConfig"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/workspace.ts","../src/workspace/fuse.ts","../src/fuse/mount.ts","../src/fuse/fs.ts","../src/fuse/platform/macos.ts","../src/workspace/mount_spec.ts","../src/compression_codecs.ts","../src/observe/disk_store.ts","../src/observe/redis_store.ts","../src/fs_monkey.ts","../src/commands/builtin/redis/provision.ts","../src/cache/redis/file.ts","../src/resource/hf_models/config.ts","../src/resource/lancedb/lancedb.ts","../src/resource/lancedb/store.ts","../src/resource/registry.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\nexport * from '@struktoai/mirage-core'\nexport { Workspace, type NodeWorkspaceOptions } from './workspace.ts'\nexport { Mount, type MountSpecOptions } from './workspace/mount_spec.ts'\nexport {\n DiskResource,\n type DiskResourceOptions,\n type DiskResourceState,\n} from './resource/disk/disk.ts'\nexport { DISK_PROMPT } from './resource/disk/prompt.ts'\nexport { DISK_OPS } from './ops/disk/index.ts'\nexport { DiskObserverStore } from './observe/disk_store.ts'\nexport { RedisObserverStore, type RedisObserverStoreOptions } from './observe/redis_store.ts'\nexport { patchNodeFs } from './fs_monkey.ts'\nexport {\n RedisResource,\n type RedisResourceOptions,\n type RedisResourceState,\n} from './resource/redis/redis.ts'\nexport { REDIS_PROMPT } from './resource/redis/prompt.ts'\nexport { RedisStore, type RedisStoreOptions } from './resource/redis/store.ts'\nexport { RedisAccessor } from './accessor/redis.ts'\nexport { REDIS_OPS } from './ops/redis/index.ts'\nexport {\n fileReadProvision,\n headTailProvision,\n metadataProvision,\n type RedisResourceLike,\n} from './commands/builtin/redis/provision.ts'\nexport { RedisFileCacheStore, type RedisFileCacheOptions } from './cache/redis/file.ts'\nexport { FuseManager } from './workspace/fuse.ts'\nexport { MirageFS, type MirageFSOptions, type FuseAttr } from './fuse/fs.ts'\nexport {\n mount as fuseMount,\n mountBackground as fuseMountBackground,\n type FuseHandle,\n type MountOptions as FuseMountOptions,\n} from './fuse/mount.ts'\nexport { isMacosMetadata } from './fuse/platform/macos.ts'\nexport { S3Resource, type S3ResourceState } from './resource/s3/s3.ts'\nexport {\n DatabricksVolumeResource,\n type DatabricksVolumeResourceState,\n} from './resource/databricks_volume/databricks_volume.ts'\nexport {\n loadDatabricksProfile,\n parseDatabricksCfg,\n type DatabricksProfile,\n} from './resource/databricks_volume/profile.ts'\nexport {\n redactConfig as redactS3Config,\n type S3Config,\n type S3ConfigRedacted,\n} from './resource/s3/config.ts'\nexport { GCSResource, type GCSResourceState } from './resource/gcs/gcs.ts'\nexport {\n GCS_ENDPOINT,\n redactGcsConfig,\n type GCSConfig,\n type GCSConfigRedacted,\n} from './resource/gcs/config.ts'\nexport { GCS_PROMPT } from './resource/gcs/prompt.ts'\nexport { OCIResource, type OCIResourceState } from './resource/oci/oci.ts'\nexport { redactOciConfig, type OCIConfig, type OCIConfigRedacted } from './resource/oci/config.ts'\nexport { OCI_PROMPT } from './resource/oci/prompt.ts'\nexport { R2Resource, type R2ResourceState } from './resource/r2/r2.ts'\nexport { redactR2Config, type R2Config, type R2ConfigRedacted } from './resource/r2/config.ts'\nexport { R2_PROMPT } from './resource/r2/prompt.ts'\nexport { SupabaseResource, type SupabaseResourceState } from './resource/supabase/supabase.ts'\nexport {\n redactSupabaseConfig,\n resolvedSupabaseEndpoint,\n type SupabaseConfig,\n type SupabaseConfigRedacted,\n} from './resource/supabase/config.ts'\nexport { SUPABASE_PROMPT } from './resource/supabase/prompt.ts'\nexport {\n HF_RESOURCES,\n HfAccessor,\n HfBucketsAccessor,\n HfDatasetsAccessor,\n HfModelsAccessor,\n HfSpacesAccessor,\n} from './accessor/hf.ts'\nexport { HfBucketsResource, type HfBucketsResourceState } from './resource/hf_buckets/hf_buckets.ts'\nexport {\n assertHfRepoId,\n HF_ENDPOINT,\n normalizeHfBucketsConfig,\n normalizeHfRepoConfig,\n redactHfBucketsConfig,\n redactHfRepoConfig,\n type HfBucketsConfig,\n type HfBucketsConfigRedacted,\n type HfRepoConfig,\n type HfRepoConfigRedacted,\n} from './resource/hf_buckets/config.ts'\nexport { HF_BUCKETS_PROMPT } from './resource/hf_buckets/prompt.ts'\nexport {\n HfDatasetsResource,\n type HfDatasetsResourceState,\n} from './resource/hf_datasets/hf_datasets.ts'\nexport { HF_DATASETS_PROMPT } from './resource/hf_datasets/prompt.ts'\nexport { HfModelsResource, type HfModelsResourceState } from './resource/hf_models/hf_models.ts'\nexport {\n normalizeHfModelsConfig,\n redactHfModelsConfig,\n type HfModelsConfig,\n type HfModelsConfigRedacted,\n} from './resource/hf_models/config.ts'\nexport { HF_MODELS_PROMPT } from './resource/hf_models/prompt.ts'\nexport { HfSpacesResource, type HfSpacesResourceState } from './resource/hf_spaces/hf_spaces.ts'\nexport { HF_SPACES_PROMPT } from './resource/hf_spaces/prompt.ts'\nexport { HF_COMMANDS } from './commands/builtin/hf/index.ts'\nexport { HF_OPS } from './ops/hf/index.ts'\nexport { MinIOResource, type MinIOResourceState } from './resource/minio/minio.ts'\nexport {\n redactMinIOConfig,\n type MinIOConfig,\n type MinIOConfigRedacted,\n} from './resource/minio/config.ts'\nexport { MINIO_PROMPT } from './resource/minio/prompt.ts'\nexport { SeaweedFSResource, type SeaweedFSResourceState } from './resource/seaweedfs/seaweedfs.ts'\nexport {\n redactSeaweedFSConfig,\n type SeaweedFSConfig,\n type SeaweedFSConfigRedacted,\n} from './resource/seaweedfs/config.ts'\nexport { SEAWEEDFS_PROMPT } from './resource/seaweedfs/prompt.ts'\nexport { CephResource, type CephResourceState } from './resource/ceph/ceph.ts'\nexport {\n redactCephConfig,\n type CephConfig,\n type CephConfigRedacted,\n} from './resource/ceph/config.ts'\nexport { CEPH_PROMPT } from './resource/ceph/prompt.ts'\nexport { WasabiResource, type WasabiResourceState } from './resource/wasabi/wasabi.ts'\nexport {\n redactWasabiConfig,\n resolvedWasabiEndpoint,\n type WasabiConfig,\n type WasabiConfigRedacted,\n} from './resource/wasabi/config.ts'\nexport { WASABI_PROMPT } from './resource/wasabi/prompt.ts'\nexport { BackblazeResource, type BackblazeResourceState } from './resource/backblaze/backblaze.ts'\nexport {\n redactBackblazeConfig,\n resolvedBackblazeEndpoint,\n type BackblazeConfig,\n type BackblazeConfigRedacted,\n} from './resource/backblaze/config.ts'\nexport { BACKBLAZE_PROMPT } from './resource/backblaze/prompt.ts'\nexport {\n DigitalOceanResource,\n type DigitalOceanResourceState,\n} from './resource/digitalocean/digitalocean.ts'\nexport {\n redactDigitalOceanConfig,\n resolvedDigitalOceanEndpoint,\n type DigitalOceanConfig,\n type DigitalOceanConfigRedacted,\n} from './resource/digitalocean/config.ts'\nexport { DIGITALOCEAN_PROMPT } from './resource/digitalocean/prompt.ts'\nexport { TencentResource, type TencentResourceState } from './resource/tencent/tencent.ts'\nexport {\n redactTencentConfig,\n resolvedTencentEndpoint,\n type TencentConfig,\n type TencentConfigRedacted,\n} from './resource/tencent/config.ts'\nexport { TENCENT_PROMPT } from './resource/tencent/prompt.ts'\nexport { AliyunResource, type AliyunResourceState } from './resource/aliyun/aliyun.ts'\nexport {\n redactAliyunConfig,\n resolvedAliyunEndpoint,\n type AliyunConfig,\n type AliyunConfigRedacted,\n} from './resource/aliyun/config.ts'\nexport { ALIYUN_PROMPT } from './resource/aliyun/prompt.ts'\nexport { ScalewayResource, type ScalewayResourceState } from './resource/scaleway/scaleway.ts'\nexport {\n redactScalewayConfig,\n resolvedScalewayEndpoint,\n type ScalewayConfig,\n type ScalewayConfigRedacted,\n} from './resource/scaleway/config.ts'\nexport { SCALEWAY_PROMPT } from './resource/scaleway/prompt.ts'\nexport { QingStorResource, type QingStorResourceState } from './resource/qingstor/qingstor.ts'\nexport {\n redactQingStorConfig,\n resolvedQingStorEndpoint,\n type QingStorConfig,\n type QingStorConfigRedacted,\n} from './resource/qingstor/config.ts'\nexport { QINGSTOR_PROMPT } from './resource/qingstor/prompt.ts'\nexport { PostgresResource, type PostgresResourceOptions } from './resource/postgres/postgres.ts'\nexport { PostgresStore } from './resource/postgres/store.ts'\nexport { MongoDBResource, type MongoDBResourceOptions } from './resource/mongodb/mongodb.ts'\nexport { MongoDBStore } from './resource/mongodb/store.ts'\nexport { LanceDBResource, type LanceDBResourceOptions } from './resource/lancedb/lancedb.ts'\nexport { LanceDBStore } from './resource/lancedb/store.ts'\nexport { SlackResource, type SlackResourceState } from './resource/slack/slack.ts'\nexport {\n normalizeSlackConfig,\n redactSlackConfig,\n type SlackConfig,\n type SlackConfigRedacted,\n} from './resource/slack/config.ts'\nexport { SSHResource, type SSHResourceState } from './resource/ssh/ssh.ts'\nexport {\n normalizeSshConfig,\n redactSshConfig,\n type SSHConfig,\n type SSHConfigRedacted,\n} from './resource/ssh/config.ts'\nexport { SSHAccessor } from './accessor/ssh.ts'\nexport { SSH_PROMPT } from './resource/ssh/prompt.ts'\nexport { SSH_COMMANDS } from './commands/builtin/ssh/index.ts'\nexport { SSH_OPS } from './ops/ssh/index.ts'\nexport { DiscordResource, type DiscordResourceState } from './resource/discord/discord.ts'\nexport {\n normalizeDiscordConfig,\n redactDiscordConfig,\n type DiscordConfig,\n type DiscordConfigRedacted,\n} from './resource/discord/config.ts'\nexport { TrelloResource, type TrelloResourceState } from './resource/trello/trello.ts'\nexport {\n normalizeTrelloConfig,\n redactTrelloConfig,\n type TrelloConfig,\n type TrelloConfigRedacted,\n} from './resource/trello/config.ts'\nexport { LinearResource, type LinearResourceState } from './resource/linear/linear.ts'\nexport {\n normalizeLinearConfig,\n redactLinearConfig,\n type LinearConfig,\n type LinearConfigRedacted,\n} from './resource/linear/config.ts'\nexport { NotionResource, type NotionResourceState } from './resource/notion/notion.ts'\nexport {\n normalizeNotionConfig,\n redactNotionConfig,\n type NotionConfig,\n type NotionConfigRedacted,\n} from './resource/notion/config.ts'\nexport { LangfuseResource, type LangfuseResourceState } from './resource/langfuse/langfuse.ts'\nexport {\n normalizeLangfuseConfig,\n redactLangfuseConfig,\n type LangfuseConfig,\n type LangfuseConfigRedacted,\n} from './resource/langfuse/config.ts'\nexport { GitHubResource, type GitHubResourceState } from './resource/github/github.ts'\nexport {\n normalizeGitHubConfig,\n redactGitHubConfig,\n type GitHubConfig,\n type GitHubConfigRedacted,\n} from './resource/github/config.ts'\nexport { GitHubCIResource, type GitHubCIResourceState } from './resource/github_ci/github_ci.ts'\nexport {\n normalizeGitHubCIConfig,\n redactGitHubCIConfig,\n type GitHubCIConfig,\n type GitHubCIConfigRedacted,\n} from './resource/github_ci/config.ts'\nexport { GDocsResource, type GDocsResourceState } from './resource/gdocs/gdocs.ts'\nexport {\n normalizeGDocsConfig,\n redactGDocsConfig,\n type GDocsConfig,\n type GDocsConfigRedacted,\n} from './resource/gdocs/config.ts'\nexport { GSheetsResource, type GSheetsResourceState } from './resource/gsheets/gsheets.ts'\nexport {\n normalizeGSheetsConfig,\n redactGSheetsConfig,\n type GSheetsConfig,\n type GSheetsConfigRedacted,\n} from './resource/gsheets/config.ts'\nexport { GSlidesResource, type GSlidesResourceState } from './resource/gslides/gslides.ts'\nexport {\n normalizeGSlidesConfig,\n redactGSlidesConfig,\n type GSlidesConfig,\n type GSlidesConfigRedacted,\n} from './resource/gslides/config.ts'\nexport { GDriveResource, type GDriveResourceState } from './resource/gdrive/gdrive.ts'\nexport {\n normalizeGDriveConfig,\n redactGDriveConfig,\n type GDriveConfig,\n type GDriveConfigRedacted,\n} from './resource/gdrive/config.ts'\nexport { DropboxResource, type DropboxResourceState } from './resource/dropbox/dropbox.ts'\nexport {\n normalizeDropboxConfig,\n redactDropboxConfig,\n type DropboxConfig,\n type DropboxConfigRedacted,\n} from './resource/dropbox/config.ts'\nexport { BoxResource, type BoxResourceState } from './resource/box/box.ts'\nexport {\n normalizeBoxConfig,\n redactBoxConfig,\n type BoxConfig,\n type BoxConfigRedacted,\n} from './resource/box/config.ts'\nexport { GmailResource, type GmailResourceState } from './resource/gmail/gmail.ts'\nexport {\n normalizeGmailConfig,\n redactGmailConfig,\n type GmailConfig,\n type GmailConfigRedacted,\n} from './resource/gmail/config.ts'\nexport { EmailResource, type EmailResourceState } from './resource/email/email.ts'\nexport {\n buildEmailConfig,\n normalizeEmailConfig,\n redactEmailConfig,\n type EmailConfig,\n type EmailConfigInput,\n type EmailConfigRedacted,\n EMAIL_PROMPT,\n EMAIL_WRITE_PROMPT,\n} from './resource/email/index.ts'\nexport { EmailAccessor } from './accessor/email.ts'\nexport { EMAIL_COMMANDS } from './commands/builtin/email/index.ts'\nexport { EMAIL_OPS } from './ops/email/index.ts'\nexport {\n buildResource,\n knownResources,\n register as registerResourceFactory,\n type ResourceFactory,\n} from './resource/registry.ts'\nexport { DISK_COMMANDS } from './commands/builtin/disk/index.ts'\nexport { REDIS_COMMANDS } from './commands/builtin/redis/index.ts'\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 { readFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport {\n type CommandSafeguard,\n createShellParser,\n type ExecuteOptions,\n type ExecuteResult,\n type MountMode,\n type ProvisionResult,\n type Resource,\n type ShellParser,\n Workspace as CoreWorkspace,\n type WorkspaceOptions,\n} from '@struktoai/mirage-core'\nimport { FuseManager } from './workspace/fuse.ts'\nimport { Mount } from './workspace/mount_spec.ts'\nimport './compression_codecs.ts'\n\nconst requireCjs = createRequire(import.meta.url)\n\nlet cachedParser: Promise<ShellParser> | null = null\n\nfunction loadShellParser(): Promise<ShellParser> {\n if (cachedParser !== null) return cachedParser\n const enginePath = requireCjs.resolve('web-tree-sitter/web-tree-sitter.wasm')\n const grammarPath = requireCjs.resolve('tree-sitter-bash/tree-sitter-bash.wasm')\n cachedParser = createShellParser({\n engineWasm: readFileSync(enginePath),\n grammarWasm: readFileSync(grammarPath),\n })\n return cachedParser\n}\n\nexport type NodeWorkspaceOptions = WorkspaceOptions\n\nexport class Workspace extends CoreWorkspace {\n private fuseSetupPromise: Promise<void> | null = null\n private readonly fuseMountpointsMap = new Map<string, string>()\n private readonly fuseManagers = new Map<string, FuseManager>()\n\n constructor(resources: Record<string, Resource | Mount>, options: NodeWorkspaceOptions = {}) {\n const bareResources: Record<string, Resource> = {}\n const modeOverrides: Record<string, MountMode> = { ...(options.modeOverrides ?? {}) }\n const commandSafeguards: Record<string, Record<string, CommandSafeguard>> = {\n ...(options.commandSafeguards ?? {}),\n }\n const fuseTargets: [string, boolean | string][] = []\n for (const [prefix, value] of Object.entries(resources)) {\n if (value instanceof Mount) {\n bareResources[prefix] = value.resource\n if (value.options.mode !== undefined) modeOverrides[prefix] = value.options.mode\n if (value.options.commandSafeguards !== undefined)\n commandSafeguards[prefix] = value.options.commandSafeguards\n if (value.options.fuse !== undefined && value.options.fuse !== false)\n fuseTargets.push([prefix, value.options.fuse])\n } else {\n bareResources[prefix] = value\n }\n }\n super(bareResources, {\n ...options,\n ...(Object.keys(modeOverrides).length > 0 ? { modeOverrides } : {}),\n ...(Object.keys(commandSafeguards).length > 0 ? { commandSafeguards } : {}),\n shellParserFactory: options.shellParserFactory ?? loadShellParser,\n })\n if (fuseTargets.length > 0) {\n // Kick off mounts eagerly; await inside fuseReady() / execute() / close()\n // so callers don't need to await the constructor (Python mirrors this).\n //\n // A failed auto-mount (e.g. libfuse absent on the host) degrades to an\n // unmounted but fully usable workspace, mirroring Python: there the mount\n // runs on a daemon thread so its failure never reaches the main process.\n // On Node's single event loop we swallow it here, otherwise the unhandled\n // rejection would terminate the process under Node's default policy.\n const setups = fuseTargets.map(([prefix, target]) =>\n this.addFuseMount(prefix, typeof target === 'string' ? target : undefined).then(\n () => undefined,\n (err: unknown) => {\n process.stderr.write(\n `mirage: FUSE auto-mount failed for ${prefix}, continuing without it: ${\n err instanceof Error ? err.message : String(err)\n }\\n`,\n )\n },\n ),\n )\n this.fuseSetupPromise = Promise.all(setups).then(() => undefined)\n }\n }\n\n private registerFuseMount(prefix: string, mountpoint: string): void {\n for (const [otherPrefix, otherMp] of this.fuseMountpointsMap) {\n if (otherMp === mountpoint && otherPrefix !== prefix) {\n throw new Error(\n `FUSE mountpoint ${mountpoint} already used by prefix ${otherPrefix}; mounts need distinct paths`,\n )\n }\n }\n this.fuseMountpointsMap.set(prefix, mountpoint)\n }\n\n /**\n * Mount a workspace subtree under FUSE and own its lifecycle. Each mount gets\n * its own {@link FuseManager}, so a workspace can expose any number of FUSE\n * subtrees at once. A pinned mountpoint is collision-checked BEFORE mounting,\n * so a clash never leaves a partial kernel mount.\n */\n async addFuseMount(prefix: string, mountpoint?: string): Promise<string> {\n if (mountpoint !== undefined) this.registerFuseMount(prefix, mountpoint)\n const fm = new FuseManager()\n this.fuseManagers.set(prefix, fm)\n try {\n const mp = await fm.setup(this, {\n rootPrefix: prefix,\n ...(mountpoint !== undefined ? { mountpoint } : {}),\n })\n if (mountpoint === undefined) this.registerFuseMount(prefix, mp)\n return mp\n } catch (err) {\n // The mount never came up; drop the manager and any registered path so\n // fuseMountpoints does not misreport it as live.\n this.fuseManagers.delete(prefix)\n this.fuseMountpointsMap.delete(prefix)\n throw err\n }\n }\n\n async removeFuseMount(prefix: string): Promise<void> {\n const fm = this.fuseManagers.get(prefix)\n this.fuseManagers.delete(prefix)\n if (fm !== undefined) await fm.unmount()\n this.fuseMountpointsMap.delete(prefix)\n }\n\n get fuseMountpoints(): Record<string, string> {\n return Object.fromEntries(this.fuseMountpointsMap)\n }\n\n get fuseMountpoint(): string | null {\n if (this.fuseMountpointsMap.size === 0) return null\n if (this.fuseMountpointsMap.size > 1) {\n throw new Error('multiple FUSE mounts active; use fuseMountpoints to select one by prefix')\n }\n return this.fuseMountpointsMap.values().next().value ?? null\n }\n\n /** Await the eager per-mount fuse mounts started in the constructor. */\n async fuseReady(): Promise<void> {\n if (this.fuseSetupPromise !== null) {\n await this.fuseSetupPromise\n this.fuseSetupPromise = null\n }\n }\n\n override execute(\n command: string,\n options?: ExecuteOptions & { provision?: false | undefined },\n ): Promise<ExecuteResult>\n override execute(\n command: string,\n options: ExecuteOptions & { provision: true },\n ): Promise<ProvisionResult>\n override execute(\n command: string,\n options: ExecuteOptions,\n ): Promise<ExecuteResult | ProvisionResult>\n override async execute(\n command: string,\n options: ExecuteOptions = {},\n ): Promise<ExecuteResult | ProvisionResult> {\n await this.fuseReady()\n return super.execute(command, options)\n }\n\n override async close(): Promise<void> {\n await this.fuseReady().catch(() => undefined)\n for (const fm of this.fuseManagers.values()) await fm.unmount()\n this.fuseManagers.clear()\n this.fuseMountpointsMap.clear()\n await super.close()\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 { rmdirSync } from 'node:fs'\nimport type { Workspace } from '@struktoai/mirage-core'\nimport { forceUnmount, mount, type FuseHandle, type MountOptions } from '../fuse/mount.ts'\n\nconst SIGNALS = ['SIGINT', 'SIGTERM', 'SIGHUP'] as const\ntype Signal = (typeof SIGNALS)[number]\ninterface CleanupEntry {\n mountpoint: string\n handle: FuseHandle\n // Cleanup owns only generated temp directories, never explicit mountpoints.\n ownsMountpoint: boolean\n}\n\nfunction removeMountpointIfOwned(entry: { mountpoint: string; ownsMountpoint: boolean }): void {\n if (!entry.ownsMountpoint) return\n try {\n // Empty-directory cleanup only. Recursive removal is unsafe because a\n // still-mounted FUSE path can make deletes hit the mounted backend.\n rmdirSync(entry.mountpoint)\n } catch {\n // mountpoint may still be busy, non-empty, or already gone; caller can retry\n }\n}\n\n/**\n * Tracks auto-mounted FUSE handles and installs a single process-wide cleanup\n * path on SIGINT / SIGTERM / SIGHUP / `process.exit` so the kernel never ends\n * up with a stale mountpoint after the node process dies. Mirrors Python's\n * KeyboardInterrupt → `diskutil unmount force` / `fusermount -u` in mount.py.\n */\nclass FuseCleanupRegistry {\n private readonly mounts = new Set<CleanupEntry>()\n private installed = false\n private exiting = false\n\n register(entry: CleanupEntry): void {\n this.mounts.add(entry)\n this.install()\n }\n\n unregister(entry: CleanupEntry): void {\n this.mounts.delete(entry)\n }\n\n private install(): void {\n if (this.installed) return\n this.installed = true\n for (const sig of SIGNALS) {\n process.on(sig, this.onSignal)\n }\n process.on('beforeExit', this.onExit)\n process.on('exit', this.onExit)\n }\n\n private readonly onSignal = (sig: Signal): void => {\n if (this.exiting) return\n this.exiting = true\n this.drainSync()\n // Re-raise the signal so the default termination action runs after we've\n // unmounted. Node suppresses the default when a listener is attached.\n process.kill(process.pid, sig)\n }\n\n private readonly onExit = (): void => {\n if (this.exiting) return\n this.exiting = true\n this.drainSync()\n }\n\n private drainSync(): void {\n for (const entry of this.mounts) {\n forceUnmount(entry.mountpoint)\n removeMountpointIfOwned(entry)\n }\n this.mounts.clear()\n }\n}\n\nconst CLEANUP = new FuseCleanupRegistry()\n\n// Passive mounting primitive: it mounts a workspace subtree and tears it down.\n// Registry/lifecycle ownership lives on the node Workspace (addFuseMount /\n// removeFuseMount), mirroring Python's FuseManager.\nexport class FuseManager {\n private handle: FuseHandle | null = null\n private cleanupEntry: CleanupEntry | null = null\n\n get mountpoint(): string | null {\n return this.handle?.mountpoint ?? null\n }\n\n async setup(ws: Workspace, options: MountOptions = {}): Promise<string> {\n if (this.handle !== null) return this.handle.mountpoint\n const handle = await mount(ws, options)\n this.handle = handle\n this.cleanupEntry = {\n mountpoint: handle.mountpoint,\n handle,\n // Preserve the ownership decision made by mount(); unmount cleanup must\n // not infer ownership from path shape or whether the directory exists.\n ownsMountpoint: handle.ownsMountpoint,\n }\n CLEANUP.register(this.cleanupEntry)\n return handle.mountpoint\n }\n\n async unmount(): Promise<void> {\n if (this.handle === null) {\n return\n }\n const mp = this.handle.mountpoint\n try {\n await this.handle.unmount()\n } finally {\n const cleanupEntry = this.cleanupEntry\n if (cleanupEntry !== null) {\n CLEANUP.unregister(cleanupEntry)\n this.cleanupEntry = null\n }\n this.handle = null\n removeMountpointIfOwned({\n mountpoint: mp,\n ownsMountpoint: cleanupEntry?.ownsMountpoint ?? false,\n })\n }\n }\n\n async close(): Promise<void> {\n await this.unmount()\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 { execSync } from 'node:child_process'\nimport { mkdirSync, mkdtempSync } from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport type { Workspace } from '@struktoai/mirage-core'\nimport { loadOptionalPeer } from '../optional_peer.ts'\nimport { MirageFS } from './fs.ts'\n\nexport interface FuseHandle {\n mountpoint: string\n /** Whether Mirage created this mountpoint directory and may remove it later. */\n ownsMountpoint: boolean\n unmount: () => Promise<void>\n}\n\nexport interface MountOptions {\n /** Caller/deployment-owned mountpoint. Mirage mounts here but does not delete it. */\n mountpoint?: string\n agentId?: string\n /** Scope the mount to a single workspace mount prefix (subtree exposure). */\n rootPrefix?: string\n /**\n * When true, `@zkochan/fuse-native`'s `autoUnmount` flag is set so the\n * kernel releases the mount if the process exits abnormally. Defaults to\n * `true` on Linux, `false` on darwin — macFUSE rejects the option with\n * \"unknown option `auto_unmount'\". On darwin the SIGINT cleanup in\n * FuseManager runs `diskutil unmount force` instead.\n */\n autoUnmount?: boolean\n /** Extra options forwarded verbatim to `@zkochan/fuse-native`. */\n fuseOptions?: Record<string, unknown>\n}\n\ntype FuseConstructor = new (\n mountpoint: string,\n ops: Record<string, unknown>,\n options?: Record<string, unknown>,\n) => {\n mount: (cb: (err: Error | null) => void) => void\n unmount: (cb: (err: Error | null) => void) => void\n}\n\nasync function loadFuse(): Promise<FuseConstructor> {\n const mod = await loadOptionalPeer(\n () => import('@zkochan/fuse-native') as unknown as Promise<{ default?: FuseConstructor }>,\n {\n feature: 'FUSE support',\n packageName: '@zkochan/fuse-native',\n docsUrl: 'https://mirage.dev/typescript/setup/fuse',\n },\n )\n const Fuse = (mod.default ?? mod) as unknown as FuseConstructor\n if (typeof Fuse !== 'function') {\n throw new Error('@zkochan/fuse-native did not export a constructor')\n }\n return Fuse\n}\n\n/** Fallback unmount via platform tools — mirrors Python's SIGINT handler. */\nexport function forceUnmount(mountpoint: string): void {\n try {\n if (process.platform === 'darwin') {\n execSync(`diskutil unmount force ${JSON.stringify(mountpoint)}`, { stdio: 'ignore' })\n } else {\n execSync(`fusermount -u ${JSON.stringify(mountpoint)}`, { stdio: 'ignore' })\n }\n } catch {\n // best-effort; caller already tried the clean path\n }\n}\n\nexport async function mount(ws: Workspace, options: MountOptions = {}): Promise<FuseHandle> {\n const Fuse = await loadFuse()\n let mountpoint: string\n let ownsMountpoint = false\n if (options.mountpoint !== undefined) {\n // Pinned path: create if missing, but keep ownership with the caller.\n mkdirSync(options.mountpoint, { recursive: true })\n mountpoint = options.mountpoint\n } else {\n mountpoint = mkdtempSync(join(tmpdir(), 'mirage-fuse-'))\n ownsMountpoint = true\n }\n const agentId = options.agentId\n const mfs = new MirageFS(ws, {\n ...(agentId !== undefined ? { agentId } : {}),\n ...(options.rootPrefix !== undefined ? { rootPrefix: options.rootPrefix } : {}),\n })\n const autoUnmount = options.autoUnmount ?? process.platform === 'linux'\n // attr_timeout=0 (string: the option serializer drops falsy values) keeps\n // the kernel from caching the UNKNOWN_SIZE_SENTINEL that getattr reports\n // for size-unknown API files; the post-open fstat then reaches fgetattr,\n // which answers with the prefetched real size.\n const fuseOpts: Record<string, unknown> = {\n force: true,\n mkdir: true,\n attrTimeout: '0',\n ...(autoUnmount ? { autoUnmount: true } : {}),\n ...(options.fuseOptions ?? {}),\n }\n const fuse = new Fuse(mountpoint, mfs.ops(), fuseOpts)\n await new Promise<void>((resolve, reject) => {\n fuse.mount((err) => {\n if (err === null) resolve()\n else reject(err)\n })\n })\n return {\n mountpoint,\n ownsMountpoint,\n unmount: () =>\n new Promise<void>((resolve, reject) => {\n fuse.unmount((err) => {\n if (err === null) resolve()\n else reject(err)\n })\n }),\n }\n}\n\nexport function mountBackground(ws: Workspace, options: MountOptions = {}): Promise<FuseHandle> {\n return mount(ws, options)\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 { FileType, type OpRecord, type Workspace, rstripSlash } from '@struktoai/mirage-core'\nimport { isMacosMetadata } from './platform/macos.ts'\n\nconst ENV_AGENT_ID = 'MIRAGE_AGENT_ID'\nconst MIRAGE_DIR = '/.mirage'\nconst MIRAGE_WHOAMI = '/.mirage/whoami'\n\n// FUSE errno values (negative for fuse-native callbacks; positive for errors thrown).\nconst ENOENT = -2\nconst EACCES = -13\nconst ENOTDIR = -20\nconst EEXIST = -17\nconst ENOTEMPTY = -66 // macOS; Linux is -39 — fuse-native normalizes.\nconst EIO = -5\n\nexport interface FuseAttr {\n mtime: Date\n atime: Date\n ctime: Date\n nlink: number\n size: number\n mode: number\n uid: number\n gid: number\n}\n\ninterface Handle {\n path: string\n data?: Uint8Array\n writeBuf?: [number, Uint8Array][]\n}\n\ninterface PrefetchEntry {\n data: Uint8Array\n expires: number\n}\n\nconst PREFETCH_TTL_MS = 30_000\n\n/**\n * Sentinel size reported by getattr for API-backed files where the resource\n * returns size=null up front (Trello, Linear, Slack…). Python uses libfuse's\n * `direct_io` flag to make the kernel ignore reported size and issue read()\n * regardless; @zkochan/fuse-native doesn't expose direct_io, so we instead\n * report a deliberately-large size. The read handler returns 0 once the\n * actual bytes are exhausted, which surfaces as EOF to userspace.\n *\n * Reporting a real size requires fetching the bytes — fine for `cat`, but\n * disastrous for `ls`/`ls -l` because macOS's FUSE layer calls getattr per\n * directory entry. Using a sentinel keeps `ls` cheap (no API calls) while\n * still letting `cat` work. Once a file has been opened (and its bytes\n * cached), subsequent getattrs return the real size via cachedSize().\n *\n * The cap is bounded by Node's `fs/promises` readFile path: it allocates a\n * buffer of the reported size and converts it to a utf-8 string at the end,\n * which fails with `RangeError: Invalid string length` past V8's ~512 MiB\n * string limit. 100 MiB sits well under that, covers very busy Slack\n * channels' daily history, and bounds Buffer allocation per stat.\n */\nconst UNKNOWN_SIZE_SENTINEL = 100 * 1024 * 1024 // 100 MiB\n\ntype Cb<T> = (code: number, result?: T) => void\n\nfunction classifyError(err: unknown): number {\n const code = (err as { code?: string }).code\n if (code === 'ENOTEMPTY') return ENOTEMPTY\n if (code === 'ENOTDIR') return ENOTDIR\n if (code === 'EACCES') return EACCES\n if (code === 'EEXIST') return EEXIST\n if (code === 'ENOENT') return ENOENT\n const msg = (err instanceof Error ? err.message : String(err)).toLowerCase()\n if (msg.includes('not empty') || msg.includes('enotempty')) return ENOTEMPTY\n if (msg.includes('not a directory') || msg.includes('enotdir')) return ENOTDIR\n if (msg.includes('permission') || msg.includes('eacces') || msg.includes('read-only'))\n return EACCES\n if (msg.includes('file exists') || msg.includes('eexist')) return EEXIST\n if (\n msg.includes('not found') ||\n msg.includes('no such') ||\n msg.includes('enoent') ||\n msg.includes('no mount')\n )\n return ENOENT\n return EIO\n}\n\nexport interface MirageFSOptions {\n agentId?: string\n rootPrefix?: string\n}\n\nexport class MirageFS {\n private readonly ws: Workspace\n readonly agentId: string\n private readonly now: Date\n private readonly root: string\n private readonly prefixes: string[]\n private readonly handles = new Map<number, Handle>()\n // In-memory extended attributes, keyed by FUSE path. Backends have no POSIX\n // xattrs, so these are advisory and never persisted; see setxattr.\n private readonly xattrs = new Map<string, Map<string, Buffer>>()\n private readonly prefetchCache = new Map<string, PrefetchEntry>()\n private readonly prefetchInflight = new Map<string, Promise<Uint8Array | null>>()\n private nextFh = 1\n private readonly uid: number\n private readonly gid: number\n\n constructor(ws: Workspace, options: MirageFSOptions = {}) {\n this.ws = ws\n this.agentId =\n options.agentId ??\n process.env[ENV_AGENT_ID] ??\n `agent-${Math.random().toString(36).slice(2, 10)}`\n this.now = new Date()\n this.root = options.rootPrefix !== undefined ? rstripSlash(options.rootPrefix) : ''\n // When scoped to a single mount, the FUSE root maps onto that mount and\n // there are no virtual intermediate directories to synthesize.\n this.prefixes = this.root === '' ? ws.mounts().map((m) => m.prefix) : []\n this.uid = typeof process.getuid === 'function' ? process.getuid() : 0\n this.gid = typeof process.getgid === 'function' ? process.getgid() : 0\n }\n\n // ── helpers ──────────────────────────────────────────────────────\n\n private resolve(path: string): string {\n if (this.root === '') return path\n return path === '/' ? this.root : this.root + path\n }\n\n private whoamiContent(): Uint8Array {\n const lines = [`agent: ${this.agentId}`, 'cwd: /', `mounts: ${this.prefixes.join(', ')}`]\n return new TextEncoder().encode(lines.join('\\n') + '\\n')\n }\n\n private dirStat(): FuseAttr {\n return {\n mtime: this.now,\n atime: this.now,\n ctime: this.now,\n nlink: 2,\n size: 0,\n mode: 0o040755,\n uid: this.uid,\n gid: this.gid,\n }\n }\n\n private fileStat(size: number): FuseAttr {\n return {\n mtime: this.now,\n atime: this.now,\n ctime: this.now,\n nlink: 1,\n size,\n mode: 0o100644,\n uid: this.uid,\n gid: this.gid,\n }\n }\n\n private isVirtualDir(path: string): boolean {\n const bare = rstripSlash(path)\n const normalized = bare + '/'\n for (const p of this.prefixes) {\n const pBare = rstripSlash(p)\n if (p.startsWith(normalized) || pBare === bare) return true\n }\n return false\n }\n\n private virtualChildren(path: string): string[] {\n const normalized = path === '/' ? '/' : rstripSlash(path) + '/'\n const children = new Set<string>()\n for (const p of this.prefixes) {\n if (p.startsWith(normalized) && p !== normalized) {\n const rest = p.slice(normalized.length)\n const child = rest.split('/')[0]\n if (child !== undefined && child !== '') children.add(child)\n }\n }\n return [...children].sort()\n }\n\n private cachedSize(path: string): number | null {\n for (const ctx of this.handles.values()) {\n if (ctx.path === path && ctx.data !== undefined) return ctx.data.byteLength\n }\n const entry = this.prefetchCache.get(path)\n if (entry !== undefined && entry.expires > Date.now()) return entry.data.byteLength\n return null\n }\n\n private cachedData(path: string): Uint8Array | null {\n for (const ctx of this.handles.values()) {\n if (ctx.path === path && ctx.data !== undefined) return ctx.data\n }\n const entry = this.prefetchCache.get(path)\n if (entry !== undefined && entry.expires > Date.now()) return entry.data\n if (entry !== undefined) this.prefetchCache.delete(path)\n return null\n }\n\n /**\n * Fetch bytes for a size-unknown file and cache them so the immediate\n * getattr → open → read burst (and subsequent stats within the TTL) reuse\n * the same fetch. Required because @zkochan/fuse-native doesn't expose\n * libfuse's `direct_io` flag — without a real size from getattr, the kernel\n * decides the file is empty and never issues read().\n */\n private async prefetch(path: string): Promise<Uint8Array | null> {\n const cached = this.cachedData(path)\n if (cached !== null) return cached\n const inflight = this.prefetchInflight.get(path)\n if (inflight !== undefined) return inflight\n const promise = (async (): Promise<Uint8Array | null> => {\n try {\n const data = await this.ws.fs.readFile(this.resolve(path))\n this.prefetchCache.set(path, { data, expires: Date.now() + PREFETCH_TTL_MS })\n return data\n } catch {\n return null\n } finally {\n this.prefetchInflight.delete(path)\n }\n })()\n this.prefetchInflight.set(path, promise)\n return promise\n }\n\n /** Drain and return accumulated op records (mirrors Python's drain_ops). */\n drainOps(): OpRecord[] {\n const records = [...this.ws.records]\n this.ws.records.length = 0\n return records\n }\n\n private async writeFile(path: string, data: Uint8Array): Promise<void> {\n // Keep FUSE writes on Workspace.dispatch rather than Workspace.fs.writeFile:\n // dispatch is where Mirage enforces mount modes, revision tracking, and\n // post-write invalidation. The lower-level fs helper is useful internally,\n // but using it from FUSE made READ-mode mounts reject create while still\n // allowing buffered overwrite on flush.\n await this.ws.dispatch('write', this.resolve(path), [data])\n }\n\n // ── FUSE op surface (mirrors mfusepy Operations) ─────────────────\n\n ops(): Record<string, unknown> {\n return {\n readdir: this.readdir.bind(this),\n getattr: this.getattr.bind(this),\n fgetattr: this.fgetattr.bind(this),\n open: this.open.bind(this),\n read: this.read.bind(this),\n write: this.write.bind(this),\n create: this.create.bind(this),\n unlink: this.unlink.bind(this),\n mkdir: this.mkdir.bind(this),\n rmdir: this.rmdir.bind(this),\n rename: this.rename.bind(this),\n release: this.release.bind(this),\n truncate: this.truncate.bind(this),\n flush: this.flush.bind(this),\n fsync: this.fsync.bind(this),\n utimens: this.utimens.bind(this),\n chmod: this.chmod.bind(this),\n chown: this.chown.bind(this),\n access: this.access.bind(this),\n setxattr: this.setxattr.bind(this),\n getxattr: this.getxattr.bind(this),\n listxattr: this.listxattr.bind(this),\n removexattr: this.removexattr.bind(this),\n statfs: this.statfs.bind(this),\n }\n }\n\n private getattr(path: string, cb: Cb<FuseAttr>): void {\n void (async () => {\n if (path === '/' || path === MIRAGE_DIR) {\n cb(0, this.dirStat())\n return\n }\n if (path === MIRAGE_WHOAMI) {\n cb(0, this.fileStat(this.whoamiContent().byteLength))\n return\n }\n // macOS Finder/Spotlight probes .DS_Store, ._*, .Spotlight-V100, etc.\n // Reject early to avoid hitting the ops layer.\n const name = path.slice(path.lastIndexOf('/') + 1)\n if (isMacosMetadata(name)) {\n cb(ENOENT)\n return\n }\n if (this.isVirtualDir(path)) {\n cb(0, this.dirStat())\n return\n }\n try {\n const s = await this.ws.fs.stat(this.resolve(path))\n if (s.type === FileType.DIRECTORY) {\n cb(0, this.dirStat())\n return\n }\n let size = s.size\n size ??= this.cachedSize(path) ?? UNKNOWN_SIZE_SENTINEL\n cb(0, this.fileStat(size))\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private fgetattr(path: string, fd: number, cb: Cb<FuseAttr>): void {\n // fstat(fd) after open: the open handler prefetched size-unknown files\n // into the handle, so answer with the real byte length instead of the\n // sentinel that path-based getattr reported before open.\n const ctx = this.handles.get(fd)\n if (ctx?.data !== undefined) {\n cb(0, this.fileStat(ctx.data.byteLength))\n return\n }\n this.getattr(path, cb)\n }\n\n private readdir(path: string, cb: Cb<string[]>): void {\n void (async () => {\n // `/.mirage/` virtual dir — a single pseudo file.\n if (path === MIRAGE_DIR) {\n cb(0, ['.', '..', 'whoami'])\n return\n }\n const names = new Set(this.virtualChildren(path))\n if (path === '/') names.add('.mirage')\n try {\n const entries = await this.ws.fs.readdir(this.resolve(path))\n for (const e of entries) {\n const part = rstripSlash(e).split('/').pop() ?? ''\n if (part !== '' && !isMacosMetadata(part)) names.add(part)\n }\n } catch {\n if (names.size === 0) {\n cb(ENOENT)\n return\n }\n }\n cb(0, ['.', '..', ...[...names].sort()])\n })()\n }\n\n private read(\n path: string,\n fd: number,\n buf: Buffer,\n len: number,\n pos: number,\n cb: (result: number) => void,\n ): void {\n void (async () => {\n if (path === MIRAGE_WHOAMI) {\n const data = this.whoamiContent()\n const slice = data.subarray(pos, pos + len)\n buf.set(slice, 0)\n cb(slice.byteLength)\n return\n }\n const ctx = this.handles.get(fd)\n try {\n // Filetype-aware read: no `raw: true`, so parquet/feather/hdf5/etc.\n // get routed through their read ops and surface as rendered text —\n // matches Python's `self._ops.read(path)` which also goes through\n // filetype dispatch.\n if (ctx !== undefined && ctx.data === undefined) {\n const cached = this.cachedData(path)\n ctx.data = cached ?? (await this.ws.fs.readFile(this.resolve(path)))\n }\n const data =\n ctx?.data ?? this.cachedData(path) ?? (await this.ws.fs.readFile(this.resolve(path)))\n const slice = data.subarray(pos, pos + len)\n buf.set(slice, 0)\n cb(slice.byteLength)\n } catch {\n cb(0)\n }\n })()\n }\n\n private write(\n path: string,\n fd: number,\n buf: Buffer,\n len: number,\n pos: number,\n cb: (result: number) => void,\n ): void {\n const ctx = this.handles.get(fd)\n const data = new Uint8Array(buf.subarray(0, len))\n if (ctx !== undefined) {\n ctx.writeBuf ??= []\n ctx.writeBuf.push([pos, data])\n cb(len)\n return\n }\n void (async () => {\n try {\n let existing: Uint8Array = new Uint8Array(0)\n try {\n existing = await this.ws.fs.readFile(this.resolve(path), { raw: true })\n } catch {\n // file may not exist yet\n }\n let merged = existing\n if (pos > merged.byteLength) {\n // zero-pad from end-of-file up to the write offset (sparse write).\n const padded = new Uint8Array(pos + data.byteLength)\n padded.set(merged, 0)\n padded.set(data, pos)\n merged = padded\n } else {\n const size = Math.max(merged.byteLength, pos + data.byteLength)\n const out = new Uint8Array(size)\n out.set(merged.subarray(0, pos), 0)\n out.set(data, pos)\n if (pos + data.byteLength < merged.byteLength) {\n out.set(merged.subarray(pos + data.byteLength), pos + data.byteLength)\n }\n merged = out\n }\n await this.writeFile(path, merged)\n cb(len)\n } catch {\n cb(0)\n }\n })()\n }\n\n private create(path: string, _mode: number, cb: Cb<number>): void {\n void (async () => {\n try {\n // Route through the resource's `create` op so backends that distinguish\n // \"create empty\" from \"write bytes\" get the right code path. Falls back\n // to writeFile(empty) when the resource doesn't expose `create`.\n try {\n await this.ws.dispatch('create', this.resolve(path))\n } catch (dispatchErr) {\n const msg = (\n dispatchErr instanceof Error ? dispatchErr.message : String(dispatchErr)\n ).toLowerCase()\n if (!msg.includes('no op')) throw dispatchErr\n await this.writeFile(path, new Uint8Array(0))\n }\n const fh = this.nextFh++\n this.handles.set(fh, { path })\n cb(0, fh)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private mkdir(path: string, _mode: number, cb: (code: number) => void): void {\n void (async () => {\n try {\n await this.ws.fs.mkdir(this.resolve(path))\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private unlink(path: string, cb: (code: number) => void): void {\n void (async () => {\n try {\n await this.ws.fs.unlink(this.resolve(path))\n this.xattrs.delete(path)\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private rename(src: string, dst: string, cb: (code: number) => void): void {\n void (async () => {\n try {\n await this.ws.fs.rename(this.resolve(src), this.resolve(dst))\n const moved = this.xattrs.get(src)\n if (moved !== undefined) {\n this.xattrs.delete(src)\n this.xattrs.set(dst, moved)\n }\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private rmdir(path: string, cb: (code: number) => void): void {\n void (async () => {\n try {\n // Detect non-empty directories up front so we can map to ENOTEMPTY\n // cleanly. Message-string sniffing alone (classifyError) is unreliable\n // across backends; check contents first.\n try {\n const entries = await this.ws.fs.readdir(this.resolve(path))\n if (entries.length > 0) {\n cb(ENOTEMPTY)\n return\n }\n } catch {\n // readdir failure — fall through to rmdir and let it raise the real\n // error (e.g. ENOENT for missing path).\n }\n await this.ws.fs.rmdir(this.resolve(path))\n this.xattrs.delete(path)\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private truncate(path: string, size: number, cb: (code: number) => void): void {\n void (async () => {\n try {\n // Prefer the resource's dedicated `truncate` op (atomic on most\n // backends). Fall back to read/resize/write for resources that don't\n // expose one.\n try {\n await this.ws.dispatch('truncate', this.resolve(path), [size])\n } catch (dispatchErr) {\n const msg = (\n dispatchErr instanceof Error ? dispatchErr.message : String(dispatchErr)\n ).toLowerCase()\n if (!msg.includes('no op')) throw dispatchErr\n const data = await this.ws.fs\n .readFile(this.resolve(path), { raw: true })\n .catch(() => new Uint8Array(0))\n const out = new Uint8Array(size)\n out.set(data.subarray(0, Math.min(data.byteLength, size)), 0)\n await this.writeFile(path, out)\n }\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private statfs(_path: string, cb: Cb<Record<string, number>>): void {\n cb(0, {\n bsize: 4096,\n frsize: 4096,\n blocks: 1024 * 1024,\n bfree: 1024 * 1024,\n bavail: 1024 * 1024,\n files: 1_000_000,\n ffree: 1_000_000,\n favail: 1_000_000,\n namemax: 255,\n })\n }\n\n // chmod / chown / utimens / access are no-ops for the filesystem but must\n // validate path existence — callers like `touch`/`chmod` on a missing file\n // should fail with ENOENT, not silently succeed.\n\n private chmod(path: string, _mode: number, cb: (code: number) => void): void {\n this.getattrValidate(path, cb)\n }\n\n private chown(path: string, _uid: number, _gid: number, cb: (code: number) => void): void {\n this.getattrValidate(path, cb)\n }\n\n private utimens(path: string, _atime: Date, _mtime: Date, cb: (code: number) => void): void {\n this.getattrValidate(path, cb)\n }\n\n private access(path: string, _amode: number, cb: (code: number) => void): void {\n this.getattrValidate(path, cb)\n }\n\n // Mirage backends (S3, etc.) have no POSIX extended attributes, so there is\n // nothing to persist xattrs to. We keep them in memory per mount so tools that\n // probe or set xattrs (sandbox runtimes, rsync -aX, tar --xattrs, cp -p, macOS\n // Finder writing com.apple.*) succeed instead of failing with ENOTSUP. The\n // values live only for the mount's lifetime and are never written to the\n // backend.\n private setxattr(\n path: string,\n name: string,\n value: Buffer,\n _position: number,\n _flags: number,\n cb: (code: number) => void,\n ): void {\n this.getattr(path, (code) => {\n if (code !== 0) {\n cb(code)\n return\n }\n let attrs = this.xattrs.get(path)\n if (attrs === undefined) {\n attrs = new Map()\n this.xattrs.set(path, attrs)\n }\n attrs.set(name, Buffer.from(value))\n cb(0)\n })\n }\n\n private getxattr(\n path: string,\n name: string,\n _position: number,\n cb: (code: number, value?: Buffer) => void,\n ): void {\n this.getattr(path, (code) => {\n if (code !== 0) {\n cb(code)\n return\n }\n // A missing value tells fuse-native to report ENOATTR/ENODATA.\n cb(0, this.xattrs.get(path)?.get(name))\n })\n }\n\n private listxattr(path: string, cb: (code: number, list?: string[]) => void): void {\n this.getattr(path, (code) => {\n if (code !== 0) {\n cb(code)\n return\n }\n const attrs = this.xattrs.get(path)\n cb(0, attrs ? [...attrs.keys()] : [])\n })\n }\n\n private removexattr(path: string, name: string, cb: (code: number) => void): void {\n this.getattr(path, (code) => {\n if (code !== 0) {\n cb(code)\n return\n }\n this.xattrs.get(path)?.delete(name)\n cb(0)\n })\n }\n\n private getattrValidate(path: string, cb: (code: number) => void): void {\n // getattr's callback returns 0 on success and a negative errno on failure\n // (FUSE convention). Pass the code straight through so missing paths\n // surface as ENOENT instead of silently succeeding.\n this.getattr(path, (code) => {\n cb(code)\n })\n }\n\n private open(path: string, _flags: number, cb: Cb<number>): void {\n void (async () => {\n if (path === MIRAGE_WHOAMI) {\n const fh = this.nextFh++\n this.handles.set(fh, { path })\n cb(0, fh)\n return\n }\n try {\n const s = await this.ws.fs.stat(this.resolve(path))\n const ctx: Handle = { path }\n if (s.size === null && s.type !== FileType.DIRECTORY) {\n const data = await this.prefetch(path)\n if (data !== null) ctx.data = data\n }\n const fh = this.nextFh++\n this.handles.set(fh, ctx)\n cb(0, fh)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private release(_path: string, fd: number, cb: (code: number) => void): void {\n // Python does NOT flush on release — the kernel always issues flush first.\n // Auto-flushing here would conflict on error paths and hide real failures.\n this.handles.delete(fd)\n cb(0)\n }\n\n private flush(path: string, fd: number, cb: (code: number) => void): void {\n const ctx = this.handles.get(fd)\n if (ctx?.writeBuf === undefined || ctx.writeBuf.length === 0) {\n cb(0)\n return\n }\n const writes = ctx.writeBuf\n ctx.writeBuf = []\n void (async () => {\n try {\n let existing: Uint8Array = new Uint8Array(0)\n try {\n existing = await this.ws.fs.readFile(this.resolve(path), { raw: true })\n } catch {\n // ignore\n }\n let total = existing.byteLength\n for (const [off, chunk] of writes) {\n total = Math.max(total, off + chunk.byteLength)\n }\n const merged = new Uint8Array(total)\n merged.set(existing, 0)\n for (const [off, chunk] of writes) {\n merged.set(chunk, off)\n }\n await this.writeFile(path, merged)\n cb(0)\n } catch (err) {\n cb(classifyError(err))\n }\n })()\n }\n\n private fsync(path: string, _datasync: number, fd: number, cb: (code: number) => void): void {\n this.flush(path, fd, cb)\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\nconst MACOS_METADATA: ReadonlySet<string> = new Set([\n '.DS_Store',\n '.Spotlight-V100',\n '.fseventsd',\n '.Trashes',\n])\n\nexport function isMacosMetadata(name: string): boolean {\n return MACOS_METADATA.has(name) || name.startsWith('._')\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 { CommandSafeguard, MountMode, Resource } from '@struktoai/mirage-core'\n\nexport interface MountSpecOptions {\n /** Per-mount mode override; falls back to the workspace default when unset. */\n mode?: MountMode\n /** `true` mounts at a temp dir; a string pins the mountpoint to that path. */\n fuse?: boolean | string\n commandSafeguards?: Record<string, CommandSafeguard>\n}\n\nexport class Mount {\n constructor(\n readonly resource: Resource,\n readonly options: MountSpecOptions = {},\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 { createRequire } from 'node:module'\nimport { registerCompressionCodec } from '@struktoai/mirage-core'\n\ninterface Bzip2Module {\n compressFile(input: Uint8Array): Uint8Array\n decompressFile(input: Uint8Array): Uint8Array\n}\n\ninterface XzModule {\n compress(input: Uint8Array): Promise<Uint8Array>\n decompress(input: Uint8Array): Promise<Uint8Array>\n}\n\n// compressjs and @napi-rs/lzma are CommonJS; load them via createRequire so\n// the built ESM output resolves their exports without named-import interop\n// pitfalls (mirrors the createRequire usage in workspace.ts).\nconst requireCjs = createRequire(import.meta.url)\nconst { Bzip2 } = requireCjs('compressjs') as { Bzip2: Bzip2Module }\nconst { xz } = requireCjs('@napi-rs/lzma') as { xz: XzModule }\n\nregisterCompressionCodec('bzip2', {\n compress: (bytes) => Promise.resolve(Uint8Array.from(Bzip2.compressFile(bytes))),\n decompress: (bytes) => Promise.resolve(Uint8Array.from(Bzip2.decompressFile(bytes))),\n})\n\nregisterCompressionCodec('xz', {\n compress: async (bytes) => new Uint8Array(await xz.compress(Buffer.from(bytes))),\n decompress: async (bytes) => new Uint8Array(await xz.decompress(Buffer.from(bytes))),\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 { appendFile, mkdir, readdir, readFile, rmdir, unlink, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\nimport type { ObserverStore } from '@struktoai/mirage-core'\n\n/**\n * ObserverStore backed by a directory of JSONL files. Created lazily on\n * first append. Mirrors the Python DiskObserverStore.\n */\nexport class DiskObserverStore implements ObserverStore {\n private readonly root: string\n\n constructor(root: string) {\n this.root = root\n }\n\n private abs(key: string): string {\n return path.join(this.root, key.replace(/^\\/+/, ''))\n }\n\n async append(key: string, data: Uint8Array): Promise<void> {\n const absPath = this.abs(key)\n await mkdir(path.dirname(absPath), { recursive: true })\n await appendFile(absPath, data)\n }\n\n async write(key: string, data: Uint8Array): Promise<void> {\n const absPath = this.abs(key)\n await mkdir(path.dirname(absPath), { recursive: true })\n await writeFile(absPath, data)\n }\n\n readAll(): Promise<Map<string, Uint8Array>> {\n return this.readMatching('')\n }\n\n async readMatching(suffix: string): Promise<Map<string, Uint8Array>> {\n const out = new Map<string, Uint8Array>()\n const { files } = await this.walk()\n for (const absPath of files) {\n const rel = '/' + path.relative(this.root, absPath)\n if (!rel.endsWith(suffix)) continue\n out.set(rel, new Uint8Array(await readFile(absPath)))\n }\n return out\n }\n\n async clear(): Promise<void> {\n const { files, dirs } = await this.walk()\n for (const absPath of files) await unlink(absPath)\n for (const d of [...dirs].reverse()) await rmdir(d)\n }\n\n close(): Promise<void> {\n return Promise.resolve()\n }\n\n private async walk(): Promise<{ files: string[]; dirs: string[] }> {\n const files: string[] = []\n const dirs: string[] = []\n const stack: string[] = [this.root]\n while (stack.length > 0) {\n const d = stack.pop()\n if (d === undefined) break\n let entries\n try {\n entries = await readdir(d, { withFileTypes: true })\n } catch {\n continue\n }\n dirs.push(d)\n for (const entry of entries) {\n const full = path.join(d, entry.name)\n if (entry.isDirectory()) stack.push(full)\n else files.push(full)\n }\n }\n return { files, dirs }\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 { RedisClientType } from 'redis'\nimport type { ObserverStore } from '@struktoai/mirage-core'\nimport { loadOptionalPeer } from '../optional_peer.ts'\n\nexport interface RedisObserverStoreOptions {\n url?: string\n keyPrefix?: string\n}\n\n/**\n * ObserverStore backed by Redis strings (one key per JSONL file).\n *\n * Appends use the atomic Redis APPEND command; an index set tracks which\n * file keys exist so readAll needs no SCAN. Mirrors the Python\n * RedisObserverStore.\n */\nexport class RedisObserverStore implements ObserverStore {\n readonly url: string\n private readonly prefix: string\n private readonly indexKey: string\n private clientPromise: Promise<RedisClientType> | null = null\n\n constructor(options: RedisObserverStoreOptions = {}) {\n this.url = options.url ?? 'redis://localhost:6379/0'\n this.prefix = options.keyPrefix ?? 'mirage:observer:'\n this.indexKey = `${this.prefix}keys`\n }\n\n private async client(): Promise<RedisClientType> {\n this.clientPromise ??= (async () => {\n const mod = await loadOptionalPeer(\n () =>\n import('redis') as unknown as Promise<{\n createClient: (o: { url: string }) => RedisClientType\n }>,\n { feature: 'RedisObserverStore', packageName: 'redis' },\n )\n const c = mod.createClient({\n url: this.url,\n socket: { reconnectStrategy: false },\n } as Parameters<typeof mod.createClient>[0])\n await c.connect()\n return c\n })()\n return this.clientPromise\n }\n\n async append(key: string, data: Uint8Array): Promise<void> {\n const c = await this.client()\n const buf = Buffer.from(data.buffer, data.byteOffset, data.byteLength)\n await c.multi().append(`${this.prefix}${key}`, buf).sAdd(this.indexKey, key).exec()\n }\n\n async write(key: string, data: Uint8Array): Promise<void> {\n const c = await this.client()\n const buf = Buffer.from(data.buffer, data.byteOffset, data.byteLength)\n await c.multi().set(`${this.prefix}${key}`, buf).sAdd(this.indexKey, key).exec()\n }\n\n readAll(): Promise<Map<string, Uint8Array>> {\n return this.readMatching('')\n }\n\n async readMatching(suffix: string): Promise<Map<string, Uint8Array>> {\n const paths = (await this.indexedPaths()).filter((p) => p.endsWith(suffix))\n return this.readPaths(paths)\n }\n\n private async indexedPaths(): Promise<string[]> {\n const c = await this.client()\n const members = await c.sMembers(this.indexKey)\n return [...members].sort()\n }\n\n private async readPaths(paths: string[]): Promise<Map<string, Uint8Array>> {\n const out = new Map<string, Uint8Array>()\n if (paths.length === 0) return out\n const c = await this.client()\n const mod = (await import('redis')) as unknown as {\n RESP_TYPES: { readonly BLOB_STRING: number }\n }\n const mapping: Record<number, unknown> = { [mod.RESP_TYPES.BLOB_STRING]: Buffer }\n const typed = c as unknown as {\n withTypeMapping: (m: Record<number, unknown>) => {\n mGet: (keys: string[]) => Promise<(Buffer | null)[]>\n }\n }\n const values = await typed.withTypeMapping(mapping).mGet(paths.map((p) => `${this.prefix}${p}`))\n paths.forEach((p, i) => {\n const raw = values[i]\n out.set(p, raw === null || raw === undefined ? new Uint8Array() : new Uint8Array(raw))\n })\n return out\n }\n\n async clear(): Promise<void> {\n const c = await this.client()\n const paths = await this.indexedPaths()\n const keys = [...paths.map((p) => `${this.prefix}${p}`), this.indexKey]\n if (keys.length > 0) await c.del(keys)\n }\n\n async close(): Promise<void> {\n if (this.clientPromise === null) return\n const c = await this.clientPromise\n await c.quit()\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 { Buffer } from 'node:buffer'\nimport { createRequire } from 'node:module'\nimport { FileType, type Workspace } from '@struktoai/mirage-core'\n\nconst requireCjs = createRequire(import.meta.url)\nconst fs = requireCjs('node:fs') as Record<string, unknown>\n// fs-monkey ships no types\nconst fsMonkey = requireCjs('fs-monkey') as {\n patchFs: (vol: unknown, target?: unknown) => void\n}\nconst { patchFs } = fsMonkey\n\ntype Cb<T> = (err: NodeJS.ErrnoException | null, value?: T) => void\n\ntype FsLike = Record<string, unknown>\n\nfunction mountedPath(ws: Workspace, p: string): boolean {\n try {\n return ws.registry.mountFor(p) !== null\n } catch {\n return false\n }\n}\n\nasync function mirageStat(ws: Workspace, p: string): Promise<unknown> {\n const s = await ws.fs.stat(p)\n const isDir = s.type === FileType.DIRECTORY\n const mtime = s.modified !== null ? new Date(s.modified) : new Date(0)\n return {\n isFile: () => !isDir,\n isDirectory: () => isDir,\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isSymbolicLink: () => false,\n isFIFO: () => false,\n isSocket: () => false,\n size: s.size ?? 0,\n mtime,\n mtimeMs: mtime.getTime(),\n atime: mtime,\n atimeMs: mtime.getTime(),\n ctime: mtime,\n ctimeMs: mtime.getTime(),\n birthtime: mtime,\n birthtimeMs: mtime.getTime(),\n mode: 0,\n nlink: 1,\n uid: 0,\n gid: 0,\n rdev: 0,\n blksize: 0,\n blocks: 0,\n dev: 0,\n ino: 0,\n }\n}\n\n/**\n * Monkey-patch Node's `fs` module so that paths under any mirage mount\n * route through the workspace. Paths NOT under a mount fall through to\n * the real native fs. CJS-friendly; for ESM code you still need to use\n * `ws.fs.*` directly since ESM bindings are frozen.\n *\n * Returns a `restore()` function that undoes the patch.\n */\nexport function patchNodeFs(ws: Workspace): () => void {\n const originalFs: FsLike = { ...(fs as unknown as FsLike) }\n\n const vol: FsLike = {\n promises: {\n readFile: async (p: string, opts?: { encoding?: BufferEncoding } | BufferEncoding) => {\n if (mountedPath(ws, p)) {\n const bytes = await ws.fs.readFile(p)\n const encoding = typeof opts === 'string' ? opts : opts?.encoding\n if (encoding !== undefined) return Buffer.from(bytes).toString(encoding)\n return Buffer.from(bytes)\n }\n const native = (originalFs.promises as FsLike).readFile as (\n path: string,\n opts?: unknown,\n ) => Promise<Uint8Array | string>\n return native(p, opts)\n },\n writeFile: async (p: string, data: Uint8Array | string): Promise<void> => {\n if (mountedPath(ws, p)) {\n await ws.fs.writeFile(p, typeof data === 'string' ? data : data)\n return\n }\n const native = (originalFs.promises as FsLike).writeFile as (\n path: string,\n data: Uint8Array | string,\n ) => Promise<void>\n await native(p, data)\n },\n readdir: async (p: string): Promise<string[]> => {\n if (mountedPath(ws, p)) {\n // Workspace returns full paths; Node's fs.promises.readdir returns basenames.\n // Strip trailing slash on directory entries before slicing so dirs\n // don't collapse to ''.\n const entries = await ws.fs.readdir(p)\n return entries.map((e) => {\n const trimmed = e.endsWith('/') ? e.slice(0, -1) : e\n return trimmed.slice(trimmed.lastIndexOf('/') + 1)\n })\n }\n const native = (originalFs.promises as FsLike).readdir as (\n path: string,\n ) => Promise<string[]>\n return native(p)\n },\n stat: async (p: string): Promise<unknown> => {\n if (mountedPath(ws, p)) return mirageStat(ws, p)\n const native = (originalFs.promises as FsLike).stat as (path: string) => Promise<unknown>\n return native(p)\n },\n unlink: async (p: string): Promise<void> => {\n if (mountedPath(ws, p)) return ws.fs.unlink(p)\n const native = (originalFs.promises as FsLike).unlink as (path: string) => Promise<void>\n await native(p)\n },\n mkdir: async (p: string): Promise<void> => {\n if (mountedPath(ws, p)) return ws.fs.mkdir(p)\n const native = (originalFs.promises as FsLike).mkdir as (path: string) => Promise<void>\n await native(p)\n },\n rmdir: async (p: string): Promise<void> => {\n if (mountedPath(ws, p)) return ws.fs.rmdir(p)\n const native = (originalFs.promises as FsLike).rmdir as (path: string) => Promise<void>\n await native(p)\n },\n },\n readFileSync: (): Uint8Array => {\n throw new Error('mirage.patchNodeFs: sync fs methods not supported — use fs.promises.*')\n },\n readFile: (p: string, cb: Cb<Uint8Array>) => {\n if (mountedPath(ws, p)) {\n ws.fs\n .readFile(p)\n .then((data) => {\n cb(null, Buffer.from(data))\n })\n .catch((err: unknown) => {\n cb(err as NodeJS.ErrnoException)\n })\n return\n }\n const native = originalFs.readFile as (path: string, cb: Cb<Uint8Array>) => void\n native(p, cb)\n },\n readdir: (p: string, cb: Cb<string[]>) => {\n if (mountedPath(ws, p)) {\n ws.fs\n .readdir(p)\n .then((entries) => {\n cb(\n null,\n entries.map((e) => {\n const trimmed = e.endsWith('/') ? e.slice(0, -1) : e\n return trimmed.slice(trimmed.lastIndexOf('/') + 1)\n }),\n )\n })\n .catch((err: unknown) => {\n cb(err as NodeJS.ErrnoException)\n })\n return\n }\n const native = originalFs.readdir as (path: string, cb: Cb<string[]>) => void\n native(p, cb)\n },\n }\n\n patchFs(vol, fs)\n return function restore(): void {\n for (const [k, v] of Object.entries(originalFs)) {\n const desc = Object.getOwnPropertyDescriptor(fs, k)\n if (desc?.writable === false && desc.set === undefined) continue\n try {\n fs[k] = v\n } catch {\n // some fs properties are accessor-only and can't be reassigned; skip\n }\n }\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n type Accessor,\n type CommandOpts,\n type IndexCacheStore,\n type PathSpec,\n Precision,\n ProvisionResult,\n type Resource,\n} from '@struktoai/mirage-core'\nimport type { RedisAccessor } from '../../../accessor/redis.ts'\nimport { stat as redisStat } from '../../../core/redis/stat.ts'\n\nexport interface RedisResourceLike extends Resource {\n readonly accessor: RedisAccessor\n}\n\ninterface ResolvedSizes {\n resolved: [string, number][]\n missing: number\n}\n\nasync function resolveSizes(\n accessor: RedisAccessor,\n paths: readonly PathSpec[],\n index: IndexCacheStore | undefined,\n): Promise<ResolvedSizes> {\n const resolved: [string, number][] = []\n let missing = 0\n for (const p of paths) {\n const pathStr = p.original\n let size: number | null = null\n if (index !== undefined) {\n const lookup = await index.get(pathStr)\n if (lookup.entry !== undefined && lookup.entry !== null) {\n size = lookup.entry.size\n }\n }\n if (size === null) {\n try {\n const fileStat = await redisStat(accessor, p)\n size = fileStat.size\n } catch {\n // fall through — size stays null\n }\n }\n if (size !== null) {\n resolved.push([pathStr, size])\n } else {\n missing += 1\n }\n }\n return { resolved, missing }\n}\n\nexport async function fileReadProvision(\n accessor: Accessor,\n paths: PathSpec[],\n _texts: string[],\n _opts: CommandOpts,\n): Promise<ProvisionResult> {\n if (paths.length === 0) {\n return new ProvisionResult({ precision: Precision.UNKNOWN })\n }\n const { resolved, missing } = await resolveSizes(accessor as RedisAccessor, paths, undefined)\n if (missing > 0 || resolved.length === 0) {\n return new ProvisionResult({ precision: Precision.UNKNOWN })\n }\n const total = resolved.reduce((sum, [, size]) => sum + size, 0)\n return new ProvisionResult({\n networkReadLow: total,\n networkReadHigh: total,\n readOps: resolved.length,\n precision: Precision.EXACT,\n })\n}\n\nexport async function headTailProvision(\n accessor: Accessor,\n paths: PathSpec[],\n _texts: string[],\n _opts: CommandOpts,\n): Promise<ProvisionResult> {\n if (paths.length === 0) {\n return new ProvisionResult({ precision: Precision.UNKNOWN })\n }\n const { resolved, missing } = await resolveSizes(accessor as RedisAccessor, paths, undefined)\n if (missing > 0 || resolved.length === 0) {\n return new ProvisionResult({ precision: Precision.UNKNOWN })\n }\n const total = resolved.reduce((sum, [, size]) => sum + size, 0)\n return new ProvisionResult({\n networkReadLow: total,\n networkReadHigh: total,\n readOps: resolved.length,\n precision: Precision.EXACT,\n })\n}\n\nexport function metadataProvision(\n _accessor: Accessor,\n paths: PathSpec[],\n _texts: string[],\n _opts: CommandOpts,\n): ProvisionResult {\n const n = Math.max(1, paths.length > 0 ? paths.length : 1)\n return new ProvisionResult({\n networkReadLow: 0,\n networkReadHigh: 0,\n readOps: n,\n precision: Precision.EXACT,\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 {\n type FileCache,\n defaultFingerprint,\n parseLimit,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { RedisClientType } from 'redis'\nimport { RedisResource, type RedisResourceOptions } from '../../resource/redis/redis.ts'\n\nexport interface RedisFileCacheOptions extends RedisResourceOptions {\n cacheLimit?: string | number\n maxDrainBytes?: number | null\n}\n\nexport class RedisFileCacheStore extends RedisResource implements FileCache {\n private readonly limit: number\n private readonly dataPrefix: string\n private readonly metaPrefix: string\n maxDrainBytes: number | null\n\n constructor(options: RedisFileCacheOptions = {}) {\n super({\n url: options.url ?? 'redis://localhost:6379/0',\n keyPrefix: options.keyPrefix ?? 'mirage:cache:',\n })\n this.limit = parseLimit(options.cacheLimit ?? '512MB')\n this.dataPrefix = `${this.keyPrefix}data:`\n this.metaPrefix = `${this.keyPrefix}meta:`\n this.maxDrainBytes = options.maxDrainBytes ?? null\n }\n\n readonly cacheSize = 0\n\n get cacheLimit(): number {\n return this.limit\n }\n\n cacheClient(): Promise<RedisClientType> {\n return this.store.client()\n }\n\n async get(key: string): Promise<Uint8Array | null> {\n const c = await this.cacheClient()\n const mod = await this.module()\n const blob = mod.RESP_TYPES.BLOB_STRING\n const mapping: Record<number, unknown> = { [blob]: Buffer }\n const typed = c as unknown as {\n withTypeMapping: (m: Record<number, unknown>) => {\n get: (k: string) => Promise<Buffer | null>\n }\n }\n const raw = await typed.withTypeMapping(mapping).get(`${this.dataPrefix}${key}`)\n if (raw === null) return null\n return new Uint8Array(raw.buffer, raw.byteOffset, raw.byteLength)\n }\n\n async set(\n key: string,\n data: Uint8Array,\n options: { fingerprint?: string | null; ttl?: number | null } = {},\n ): Promise<void> {\n const fp = options.fingerprint ?? defaultFingerprint(data)\n const c = await this.cacheClient()\n const dk = `${this.dataPrefix}${key}`\n const mk = `${this.metaPrefix}${key}`\n const pipe = c.multi()\n pipe.set(dk, Buffer.from(data.buffer, data.byteOffset, data.byteLength))\n pipe.set(mk, fp)\n if (options.ttl !== null && options.ttl !== undefined) {\n pipe.expire(dk, options.ttl)\n pipe.expire(mk, options.ttl)\n }\n await pipe.exec()\n }\n\n async add(\n key: string,\n data: Uint8Array,\n options: { fingerprint?: string | null; ttl?: number | null } = {},\n ): Promise<boolean> {\n const c = await this.cacheClient()\n const exists = await c.exists(`${this.dataPrefix}${key}`)\n if (exists) return false\n await this.set(key, data, options)\n return true\n }\n\n async remove(key: string): Promise<void> {\n const c = await this.cacheClient()\n const pipe = c.multi()\n pipe.del(`${this.dataPrefix}${key}`)\n pipe.del(`${this.metaPrefix}${key}`)\n await pipe.exec()\n }\n\n async exists(key: string | PathSpec): Promise<boolean> {\n const k = typeof key === 'string' ? key : key.stripPrefix\n const c = await this.cacheClient()\n return (await c.exists(`${this.dataPrefix}${k}`)) > 0\n }\n\n async isFresh(key: string, remoteFingerprint: string): Promise<boolean> {\n const c = await this.cacheClient()\n const fp = await c.get(`${this.metaPrefix}${key}`)\n if (fp === null) return false\n return fp === remoteFingerprint\n }\n\n async clear(): Promise<void> {\n const c = await this.cacheClient()\n for (const pattern of [`${this.dataPrefix}*`, `${this.metaPrefix}*`]) {\n const batch: string[] = []\n for await (const k of c.scanIterator({ MATCH: pattern })) {\n if (Array.isArray(k)) batch.push(...k)\n else batch.push(k)\n }\n if (batch.length > 0) await c.del(batch)\n }\n }\n\n async allCached(keys: readonly string[]): Promise<boolean> {\n for (const k of keys) {\n if (!(await this.exists(k))) return false\n }\n return true\n }\n\n async multiGet(keys: readonly string[]): Promise<(Uint8Array | null)[]> {\n const out: (Uint8Array | null)[] = []\n for (const k of keys) out.push(await this.get(k))\n return out\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 {\n type HfRepoConfig,\n type HfRepoConfigRedacted,\n normalizeHfRepoConfig,\n redactHfRepoConfig,\n} from '../hf_buckets/config.ts'\n\nexport type HfModelsConfig = HfRepoConfig\nexport type HfModelsConfigRedacted = HfRepoConfigRedacted\n\nexport const normalizeHfModelsConfig = normalizeHfRepoConfig\nexport const redactHfModelsConfig = redactHfRepoConfig\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n BaseResource,\n type FileStat,\n LANCEDB_COMMANDS,\n LANCEDB_OPS,\n LANCEDB_PROMPT,\n LanceDBAccessor,\n type LanceDBConfig,\n type LanceDBConfigResolved,\n lanceRead,\n lanceReaddir,\n lanceStat,\n type PathSpec,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n ResourceName,\n resolveLanceDBConfig,\n} from '@struktoai/mirage-core'\nimport { LanceDBStore } from './store.ts'\n\nconst REMOTE_SCHEMES = ['s3://', 'gs://', 'az://', 'hf://', 'db://']\n\nexport interface LanceDBResourceOptions {\n config: LanceDBConfig\n}\n\nexport class LanceDBResource extends BaseResource implements Resource {\n readonly kind: string = ResourceName.LANCEDB\n readonly cachesReads: boolean\n readonly indexTtl: number = 0\n readonly prompt: string = LANCEDB_PROMPT\n readonly config: LanceDBConfigResolved\n readonly store: LanceDBStore\n readonly accessor: LanceDBAccessor\n\n constructor(options: LanceDBResourceOptions | LanceDBConfig) {\n super()\n const config = 'config' in options ? options.config : options\n this.config = resolveLanceDBConfig(config)\n this.cachesReads = REMOTE_SCHEMES.some((scheme) => this.config.uri.startsWith(scheme))\n this.store = new LanceDBStore(this.config)\n this.accessor = new LanceDBAccessor(this.store, this.config)\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n async close(): Promise<void> {\n await this.store.close()\n }\n\n ops(): readonly RegisteredOp[] {\n return LANCEDB_OPS\n }\n\n commands(): readonly RegisteredCommand[] {\n return LANCEDB_COMMANDS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return lanceRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return lanceReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return lanceStat(this.accessor, p, this.index)\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { Connection, Table } from '@lancedb/lancedb'\nimport {\n loadOptionalPeer,\n type LanceDriver,\n type LanceRow,\n type LanceDBConfigResolved,\n} from '@struktoai/mirage-core'\n\nfunction toStr(value: unknown): string {\n if (value === null || value === undefined) return ''\n if (typeof value === 'object') return JSON.stringify(value)\n return String(value as string | number | boolean | bigint)\n}\n\nfunction eqClause(column: string, value: string): string {\n if (/^-?\\d+$/.test(value)) return `${column} = ${value}`\n return `${column} = '${value.replace(/'/g, \"''\")}'`\n}\n\nfunction whereClause(filters: Record<string, string>): string {\n return Object.entries(filters)\n .map(([col, val]) => eqClause(col, val))\n .join(' AND ')\n}\n\nexport class LanceDBStore implements LanceDriver {\n private readonly config: LanceDBConfigResolved\n private db: Connection | null = null\n private readonly tables = new Map<string, Table>()\n\n constructor(config: LanceDBConfigResolved) {\n this.config = config\n }\n\n private async connection(): Promise<Connection> {\n if (this.db === null) {\n const options: Record<string, unknown> = {}\n if (this.config.apiKey !== null) options.apiKey = this.config.apiKey\n if (this.config.storageOptions !== null) options.storageOptions = this.config.storageOptions\n if (this.config.uri.startsWith('db://')) {\n options.region = this.config.region\n if (this.config.hostOverride !== null) options.hostOverride = this.config.hostOverride\n }\n const { connect } = await loadOptionalPeer(() => import('@lancedb/lancedb'), {\n feature: 'LanceDBResource',\n packageName: '@lancedb/lancedb',\n })\n this.db = await connect(this.config.uri, options)\n }\n return this.db\n }\n\n private async table(name: string): Promise<Table> {\n const cached = this.tables.get(name)\n if (cached !== undefined) return cached\n const db = await this.connection()\n const tbl = await db.openTable(name)\n this.tables.set(name, tbl)\n return tbl\n }\n\n async listTables(): Promise<string[]> {\n const db = await this.connection()\n const names = await db.tableNames()\n return [...names].sort()\n }\n\n async distinct(\n table: string,\n column: string,\n filters: Record<string, string>,\n limit: number,\n ): Promise<string[]> {\n const tbl = await this.table(table)\n let query = tbl.query().select([column]).limit(limit)\n if (Object.keys(filters).length > 0) query = query.where(whereClause(filters))\n const rows = (await query.toArray()) as LanceRow[]\n const values = new Set<string>()\n for (const row of rows) {\n const v = row[column]\n if (v !== null && v !== undefined) values.add(toStr(v))\n }\n return [...values].sort()\n }\n\n async rowsMatching(\n table: string,\n filters: Record<string, string>,\n columns: string[],\n limit: number,\n ): Promise<LanceRow[]> {\n const tbl = await this.table(table)\n let query = tbl.query().select(columns).limit(limit)\n if (Object.keys(filters).length > 0) query = query.where(whereClause(filters))\n return (await query.toArray()) as LanceRow[]\n }\n\n async rowRecord(table: string, idColumn: string, rowId: string): Promise<LanceRow | null> {\n const tbl = await this.table(table)\n const rows = (await tbl\n .query()\n .where(eqClause(idColumn, rowId))\n .limit(1)\n .toArray()) as LanceRow[]\n return rows[0] ?? null\n }\n\n async search(table: string, query: string, limit: number): Promise<LanceRow[]> {\n const tbl = await this.table(table)\n return (await tbl.search(query).limit(limit).toArray()) as LanceRow[]\n }\n\n close(): Promise<void> {\n if (this.db !== null) {\n this.db.close()\n this.db = null\n }\n this.tables.clear()\n return Promise.resolve()\n }\n}\n","// ========= 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, type Resource } from '@struktoai/mirage-core'\n\n/**\n * Construct a resource by registry name. Mirrors Python's\n * `mirage.resource.registry.build_resource`.\n *\n * Each entry is an async factory that lazy-imports its module so that\n * importing this file doesn't pull in every backend's dependencies.\n * Only the resource you actually request gets loaded — important for\n * S3/Redis whose peer deps (`@aws-sdk/client-s3`, `redis`) are optional.\n *\n * Configs are normalized from Python-style snake_case (used in YAML and\n * by the Python `mirage.config` loader) to TS-idiomatic camelCase. So\n * the same YAML file works in both Python and TS.\n */\nexport type ResourceFactory = (config: Record<string, unknown>) => Promise<Resource>\n\nconst REGISTRY: Record<string, ResourceFactory> = {\n ram: async (_config) => {\n const { RAMResource } = await import('@struktoai/mirage-core')\n return new RAMResource()\n },\n disk: async (config) => {\n const { DiskResource } = await import('./disk/disk.ts')\n const norm = normalizeFields(config) as { root: string }\n return new DiskResource(norm)\n },\n redis: async (config) => {\n const { RedisResource } = await import('./redis/redis.ts')\n const norm = normalizeFields(config)\n return new RedisResource(norm)\n },\n s3: async (config) => {\n const { S3Resource } = await import('./s3/s3.ts')\n const { normalizeS3Config } = await import('./s3/config.ts')\n return new S3Resource(normalizeS3Config(config))\n },\n gcs: async (config) => {\n const { GCSResource } = await import('./gcs/gcs.ts')\n const { normalizeGcsConfig } = await import('./gcs/config.ts')\n return new GCSResource(normalizeGcsConfig(config))\n },\n oci: async (config) => {\n const { OCIResource } = await import('./oci/oci.ts')\n const { normalizeOciConfig } = await import('./oci/config.ts')\n return new OCIResource(normalizeOciConfig(config))\n },\n r2: async (config) => {\n const { R2Resource } = await import('./r2/r2.ts')\n const { normalizeR2Config } = await import('./r2/config.ts')\n return new R2Resource(normalizeR2Config(config))\n },\n hf_buckets: async (config) => {\n const { HfBucketsResource } = await import('./hf_buckets/hf_buckets.ts')\n const { normalizeHfBucketsConfig } = await import('./hf_buckets/config.ts')\n return new HfBucketsResource(normalizeHfBucketsConfig(config))\n },\n hf_datasets: async (config) => {\n const { HfDatasetsResource } = await import('./hf_datasets/hf_datasets.ts')\n const { normalizeHfRepoConfig } = await import('./hf_buckets/config.ts')\n return new HfDatasetsResource(normalizeHfRepoConfig(config))\n },\n hf_models: async (config) => {\n const { HfModelsResource } = await import('./hf_models/hf_models.ts')\n const { normalizeHfRepoConfig } = await import('./hf_buckets/config.ts')\n return new HfModelsResource(normalizeHfRepoConfig(config))\n },\n hf_spaces: async (config) => {\n const { HfSpacesResource } = await import('./hf_spaces/hf_spaces.ts')\n const { normalizeHfRepoConfig } = await import('./hf_buckets/config.ts')\n return new HfSpacesResource(normalizeHfRepoConfig(config))\n },\n supabase: async (config) => {\n const { SupabaseResource } = await import('./supabase/supabase.ts')\n const { normalizeSupabaseConfig } = await import('./supabase/config.ts')\n return new SupabaseResource(normalizeSupabaseConfig(config))\n },\n databricks_volume: async (config) => {\n const { DatabricksVolumeResource } = await import('./databricks_volume/databricks_volume.ts')\n const { normalizeDatabricksVolumeConfig } = await import('@struktoai/mirage-core')\n return DatabricksVolumeResource.create(normalizeDatabricksVolumeConfig(config))\n },\n minio: async (config) => {\n const { MinIOResource } = await import('./minio/minio.ts')\n const { normalizeMinIOConfig } = await import('./minio/config.ts')\n return new MinIOResource(normalizeMinIOConfig(config))\n },\n ceph: async (config) => {\n const { CephResource } = await import('./ceph/ceph.ts')\n const { normalizeCephConfig } = await import('./ceph/config.ts')\n return new CephResource(normalizeCephConfig(config))\n },\n seaweedfs: async (config) => {\n const { SeaweedFSResource } = await import('./seaweedfs/seaweedfs.ts')\n const { normalizeSeaweedFSConfig } = await import('./seaweedfs/config.ts')\n return new SeaweedFSResource(normalizeSeaweedFSConfig(config))\n },\n wasabi: async (config) => {\n const { WasabiResource } = await import('./wasabi/wasabi.ts')\n const { normalizeWasabiConfig } = await import('./wasabi/config.ts')\n return new WasabiResource(normalizeWasabiConfig(config))\n },\n backblaze: async (config) => {\n const { BackblazeResource } = await import('./backblaze/backblaze.ts')\n const { normalizeBackblazeConfig } = await import('./backblaze/config.ts')\n return new BackblazeResource(normalizeBackblazeConfig(config))\n },\n digitalocean: async (config) => {\n const { DigitalOceanResource } = await import('./digitalocean/digitalocean.ts')\n const { normalizeDigitalOceanConfig } = await import('./digitalocean/config.ts')\n return new DigitalOceanResource(normalizeDigitalOceanConfig(config))\n },\n tencent: async (config) => {\n const { TencentResource } = await import('./tencent/tencent.ts')\n const { normalizeTencentConfig } = await import('./tencent/config.ts')\n return new TencentResource(normalizeTencentConfig(config))\n },\n aliyun: async (config) => {\n const { AliyunResource } = await import('./aliyun/aliyun.ts')\n const { normalizeAliyunConfig } = await import('./aliyun/config.ts')\n return new AliyunResource(normalizeAliyunConfig(config))\n },\n scaleway: async (config) => {\n const { ScalewayResource } = await import('./scaleway/scaleway.ts')\n const { normalizeScalewayConfig } = await import('./scaleway/config.ts')\n return new ScalewayResource(normalizeScalewayConfig(config))\n },\n qingstor: async (config) => {\n const { QingStorResource } = await import('./qingstor/qingstor.ts')\n const { normalizeQingStorConfig } = await import('./qingstor/config.ts')\n return new QingStorResource(normalizeQingStorConfig(config))\n },\n postgres: async (config) => {\n const { PostgresResource } = await import('./postgres/postgres.ts')\n const { normalizePostgresConfig } = await import('@struktoai/mirage-core')\n return new PostgresResource(normalizePostgresConfig(config))\n },\n mongodb: async (config) => {\n const { MongoDBResource } = await import('./mongodb/mongodb.ts')\n const { normalizeMongoDBConfig } = await import('@struktoai/mirage-core')\n return new MongoDBResource(normalizeMongoDBConfig(config))\n },\n slack: async (config) => {\n const { SlackResource } = await import('./slack/slack.ts')\n const { normalizeSlackConfig } = await import('./slack/config.ts')\n return new SlackResource(normalizeSlackConfig(config))\n },\n ssh: async (config) => {\n const { SSHResource } = await import('./ssh/ssh.ts')\n const { normalizeSshConfig } = await import('./ssh/config.ts')\n return new SSHResource(normalizeSshConfig(config))\n },\n discord: async (config) => {\n const { DiscordResource } = await import('./discord/discord.ts')\n const { normalizeDiscordConfig } = await import('./discord/config.ts')\n return new DiscordResource(normalizeDiscordConfig(config))\n },\n trello: async (config) => {\n const { TrelloResource } = await import('./trello/trello.ts')\n const { normalizeTrelloConfig } = await import('./trello/config.ts')\n return new TrelloResource(normalizeTrelloConfig(config))\n },\n linear: async (config) => {\n const { LinearResource } = await import('./linear/linear.ts')\n const { normalizeLinearConfig } = await import('./linear/config.ts')\n return new LinearResource(normalizeLinearConfig(config))\n },\n notion: async (config) => {\n const { NotionResource } = await import('./notion/notion.ts')\n const { normalizeNotionConfig } = await import('./notion/config.ts')\n return new NotionResource(normalizeNotionConfig(config))\n },\n langfuse: async (config) => {\n const { LangfuseResource } = await import('./langfuse/langfuse.ts')\n const { normalizeLangfuseConfig } = await import('./langfuse/config.ts')\n return new LangfuseResource(normalizeLangfuseConfig(config))\n },\n github: async (config) => {\n const { GitHubResource } = await import('./github/github.ts')\n const { normalizeGitHubConfig } = await import('./github/config.ts')\n return GitHubResource.create(normalizeGitHubConfig(config))\n },\n github_ci: async (config) => {\n const { GitHubCIResource } = await import('./github_ci/github_ci.ts')\n const { normalizeGitHubCIConfig } = await import('./github_ci/config.ts')\n return new GitHubCIResource(normalizeGitHubCIConfig(config))\n },\n gdocs: async (config) => {\n const { GDocsResource } = await import('./gdocs/gdocs.ts')\n const { normalizeGDocsConfig } = await import('./gdocs/config.ts')\n return new GDocsResource(normalizeGDocsConfig(config))\n },\n gsheets: async (config) => {\n const { GSheetsResource } = await import('./gsheets/gsheets.ts')\n const { normalizeGSheetsConfig } = await import('./gsheets/config.ts')\n return new GSheetsResource(normalizeGSheetsConfig(config))\n },\n gslides: async (config) => {\n const { GSlidesResource } = await import('./gslides/gslides.ts')\n const { normalizeGSlidesConfig } = await import('./gslides/config.ts')\n return new GSlidesResource(normalizeGSlidesConfig(config))\n },\n gdrive: async (config) => {\n const { GDriveResource } = await import('./gdrive/gdrive.ts')\n const { normalizeGDriveConfig } = await import('./gdrive/config.ts')\n return new GDriveResource(normalizeGDriveConfig(config))\n },\n dropbox: async (config) => {\n const { DropboxResource } = await import('./dropbox/dropbox.ts')\n const { normalizeDropboxConfig } = await import('./dropbox/config.ts')\n return new DropboxResource(normalizeDropboxConfig(config))\n },\n box: async (config) => {\n const { BoxResource } = await import('./box/box.ts')\n const { normalizeBoxConfig } = await import('./box/config.ts')\n return new BoxResource(normalizeBoxConfig(config))\n },\n gmail: async (config) => {\n const { GmailResource } = await import('./gmail/gmail.ts')\n const { normalizeGmailConfig } = await import('./gmail/config.ts')\n return new GmailResource(normalizeGmailConfig(config))\n },\n email: async (config) => {\n const { EmailResource } = await import('./email/email.ts')\n const { normalizeEmailConfig } = await import('./email/config.ts')\n return new EmailResource(normalizeEmailConfig(config))\n },\n}\n\n/**\n * Look up the registered names. Lazily-mutated by `register()` so users\n * can extend the registry with custom resources.\n */\nexport function knownResources(): string[] {\n return Object.keys(REGISTRY).sort()\n}\n\n/**\n * Register a custom resource factory under `name`. Existing entries\n * are overwritten, mirroring Python's mutable REGISTRY dict.\n */\nexport function register(name: string, factory: ResourceFactory): void {\n REGISTRY[name] = factory\n}\n\n/**\n * Build a resource instance by registry name. Throws if the name is\n * unknown.\n */\nexport async function buildResource(\n name: string,\n config: Record<string, unknown> = {},\n): Promise<Resource> {\n const factory = REGISTRY[name]\n if (factory === undefined) {\n throw new Error(\n `unknown resource ${JSON.stringify(name)}; known: ${knownResources().join(', ')}`,\n )\n }\n return factory(config)\n}\n"],"mappings":"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","names":["createRequire","path","requireCjs","createRequire","Buffer","createRequire","FileType","requireCjs","loadOptionalPeer","DiskResource","RedisResource","S3Resource","GCSResource","OCIResource","R2Resource","HfBucketsResource","normalizeHfBucketsConfig","HfDatasetsResource","normalizeHfRepoConfig","HfModelsResource","HfSpacesResource","SupabaseResource","DatabricksVolumeResource","MinIOResource","CephResource","SeaweedFSResource","WasabiResource","BackblazeResource","DigitalOceanResource","TencentResource","AliyunResource","ScalewayResource","QingStorResource","PostgresResource","MongoDBResource","SlackResource","normalizeSlackConfig","SSHResource","normalizeSshConfig","DiscordResource","normalizeDiscordConfig","TrelloResource","normalizeTrelloConfig","LinearResource","normalizeLinearConfig","NotionResource","normalizeNotionConfig","LangfuseResource","normalizeLangfuseConfig","GitHubResource","normalizeGitHubConfig","GitHubCIResource","normalizeGitHubCIConfig","GDocsResource","normalizeGDocsConfig","GSheetsResource","normalizeGSheetsConfig","GSlidesResource","normalizeGSlidesConfig","GDriveResource","normalizeGDriveConfig","DropboxResource","normalizeDropboxConfig","BoxResource","normalizeBoxConfig","GmailResource","EmailResource","normalizeEmailConfig"]}