@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
@@ -1726,7 +1726,7 @@ var EMAIL_WRITE_PROMPT = ` Write commands:
1726
1726
  // src/resource/email/email.ts
1727
1727
  var EmailResource = class extends BaseResource {
1728
1728
  kind = ResourceName25.EMAIL;
1729
- isRemote = true;
1729
+ cachesReads = true;
1730
1730
  indexTtl = 86400;
1731
1731
  prompt = EMAIL_PROMPT;
1732
1732
  config;
@@ -1792,4 +1792,4 @@ export {
1792
1792
  EMAIL_WRITE_PROMPT,
1793
1793
  EmailResource
1794
1794
  };
1795
- //# sourceMappingURL=chunk-DTAY7LPC.js.map
1795
+ //# sourceMappingURL=chunk-S5OVP467.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/email/email.ts","../src/accessor/email.ts","../src/commands/builtin/email/basename.ts","../src/commands/builtin/email/cat.ts","../src/core/email/glob.ts","../src/core/email/readdir.ts","../src/core/email/_parse.ts","../src/core/email/_client.ts","../src/core/email/folders.ts","../src/core/email/read.ts","../src/core/email/stat.ts","../src/commands/builtin/email/provision.ts","../src/commands/builtin/email/dirname.ts","../src/commands/builtin/email/find.ts","../src/commands/builtin/email/email_forward.ts","../src/core/email/send.ts","../src/commands/builtin/email/grep.ts","../src/core/email/scope.ts","../src/core/email/search.ts","../src/commands/builtin/email/head.ts","../src/commands/builtin/email/jq.ts","../src/commands/builtin/email/ls.ts","../src/commands/builtin/email/nl.ts","../src/commands/builtin/email/email_read.ts","../src/commands/builtin/email/realpath.ts","../src/commands/builtin/email/email_reply.ts","../src/commands/builtin/email/email_reply_all.ts","../src/commands/builtin/email/rg.ts","../src/commands/builtin/email/email_send.ts","../src/commands/builtin/email/stat.ts","../src/commands/builtin/email/tail.ts","../src/commands/builtin/email/tree.ts","../src/commands/builtin/email/email_triage.ts","../src/commands/builtin/email/wc.ts","../src/commands/builtin/email/index.ts","../src/ops/email/read.ts","../src/ops/email/readdir.ts","../src/ops/email/stat.ts","../src/ops/email/index.ts","../src/resource/email/prompt.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n BaseResource,\n PathSpec,\n ResourceName,\n type FileStat,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n} from '@struktoai/mirage-core'\nimport { EmailAccessor } from '../../accessor/email.ts'\nimport { EMAIL_COMMANDS } from '../../commands/builtin/email/index.ts'\nimport { resolveGlob } from '../../core/email/glob.ts'\nimport { read as emailRead } from '../../core/email/read.ts'\nimport { readdir as emailReaddir } from '../../core/email/readdir.ts'\nimport { stat as emailStat } from '../../core/email/stat.ts'\nimport { EMAIL_OPS } from '../../ops/email/index.ts'\nimport { redactEmailConfig, type EmailConfig, type EmailConfigRedacted } from './config.ts'\nimport { EMAIL_PROMPT } from './prompt.ts'\n\nexport interface EmailResourceState {\n type: string\n config: EmailConfigRedacted\n}\n\nexport class EmailResource extends BaseResource implements Resource {\n readonly kind: string = ResourceName.EMAIL\n readonly cachesReads: boolean = true\n readonly indexTtl: number = 86_400\n readonly prompt: string = EMAIL_PROMPT\n readonly config: EmailConfig\n readonly accessor: EmailAccessor\n\n constructor(config: EmailConfig) {\n super()\n this.config = config\n this.accessor = new EmailAccessor(config)\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n async close(): Promise<void> {\n await this.accessor.close()\n }\n\n commands(): readonly RegisteredCommand[] {\n return EMAIL_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return EMAIL_OPS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return emailRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return emailReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return emailStat(this.accessor, p, this.index)\n }\n\n async fingerprint(p: PathSpec): Promise<string | null> {\n const lookup = await this.index.get(p.original)\n return lookup.entry?.remoteTime ?? null\n }\n\n glob(paths: readonly PathSpec[], prefix = ''): Promise<PathSpec[]> {\n const effective =\n prefix !== ''\n ? paths.map((p) =>\n p.prefix !== ''\n ? p\n : new PathSpec({\n original: p.original,\n directory: p.directory,\n ...(p.pattern !== null ? { pattern: p.pattern } : {}),\n resolved: p.resolved,\n prefix,\n }),\n )\n : paths\n return resolveGlob(this.accessor, effective, this.index)\n }\n\n getState(): Promise<EmailResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactEmailConfig(this.config),\n })\n }\n\n loadState(_state: EmailResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { Accessor, loadOptionalPeer } from '@struktoai/mirage-core'\nimport type { ImapFlow } from 'imapflow'\nimport type { EmailConfig } from '../resource/email/config.ts'\n\nexport class EmailAccessor extends Accessor {\n readonly config: EmailConfig\n private clientPromise: Promise<ImapFlow> | null = null\n\n constructor(config: EmailConfig) {\n super()\n this.config = config\n }\n\n async getImap(): Promise<ImapFlow> {\n this.clientPromise ??= (async () => {\n const mod = await loadOptionalPeer(\n () =>\n import('imapflow') as unknown as Promise<{\n ImapFlow: typeof ImapFlow\n }>,\n { feature: 'EmailAccessor', packageName: 'imapflow' },\n )\n const client = new mod.ImapFlow({\n host: this.config.imapHost,\n port: this.config.imapPort,\n secure: this.config.useSsl,\n auth: { user: this.config.username, pass: this.config.password },\n logger: false,\n })\n await client.connect()\n return client\n })()\n try {\n return await this.clientPromise\n } catch (err) {\n this.clientPromise = null\n throw err\n }\n }\n\n async close(): Promise<void> {\n if (this.clientPromise === null) return\n try {\n const c = await this.clientPromise\n await c.logout()\n } catch {\n // ignore — best-effort cleanup\n }\n this.clientPromise = null\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 { ResourceName, command, specOf, basenameFn } from '@struktoai/mirage-core'\n\nexport const EMAIL_BASENAME = command({\n name: 'basename',\n resource: ResourceName.EMAIL,\n spec: specOf('basename'),\n fn: basenameFn,\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 ResourceName,\n catGeneric,\n command,\n specOf,\n type CommandFnResult,\n type CommandOpts,\n type IndexCacheStore,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { resolveGlob } from '../../../core/email/glob.ts'\nimport { read as emailRead } from '../../../core/email/read.ts'\nimport { stat as emailStat } from '../../../core/email/stat.ts'\nimport { fileReadProvision } from './provision.ts'\n\nasync function* emailStream(\n accessor: EmailAccessor,\n p: PathSpec,\n index: IndexCacheStore | undefined,\n): AsyncIterable<Uint8Array> {\n yield await emailRead(accessor, p, index)\n}\n\nasync function catCommand(\n accessor: EmailAccessor,\n paths: PathSpec[],\n texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const resolved =\n paths.length > 0 ? await resolveGlob(accessor, paths, opts.index ?? undefined) : []\n return catGeneric(\n resolved,\n texts,\n opts,\n (p) => emailStat(accessor, p, opts.index ?? undefined),\n (p) => emailStream(accessor, p, opts.index ?? undefined),\n )\n}\n\nexport const EMAIL_CAT = command({\n name: 'cat',\n resource: ResourceName.EMAIL,\n spec: specOf('cat'),\n fn: catCommand,\n provision: fileReadProvision,\n})\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { IndexCacheStore, PathSpec } from '@struktoai/mirage-core'\nimport { PathSpec as PathSpecCtor, rstripSlash } from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../accessor/email.ts'\nimport { readdir } from './readdir.ts'\nimport { fnmatch } from '@struktoai/mirage-core'\n\nconst SCOPE_ERROR = 1000\n\nexport async function resolveGlob(\n accessor: EmailAccessor,\n paths: readonly PathSpec[],\n index?: IndexCacheStore,\n): Promise<PathSpec[]> {\n const result: PathSpec[] = []\n for (const p of paths) {\n if (p.resolved) {\n result.push(p)\n continue\n }\n if (p.pattern !== null && p.pattern !== '') {\n const entries = await readdir(accessor, p, index)\n const matched: PathSpec[] = []\n for (const entry of entries) {\n const trimmed = rstripSlash(entry)\n const base = trimmed.split('/').pop() ?? trimmed\n if (!fnmatch(base, p.pattern)) continue\n matched.push(PathSpecCtor.fromStrPath(trimmed, p.prefix))\n }\n const truncated = matched.length > SCOPE_ERROR ? matched.slice(0, SCOPE_ERROR) : matched\n result.push(...truncated)\n } else {\n result.push(p)\n }\n }\n return result\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { IndexCacheStore, PathSpec } from '@struktoai/mirage-core'\nimport { IndexEntry, PathSpec as PathSpecCtor, stripSlash } from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../accessor/email.ts'\nimport { fetchHeaders, listMessageUids } from './_client.ts'\nimport { listFolders } from './folders.ts'\nimport type { ParsedAttachment } from './_parse.ts'\n\nconst TITLE_MAX = 80\nconst UNSAFE = /[^\\w\\s\\-.]/g\nconst MULTI_UNDERSCORE = /_+/g\n\nfunction sanitize(text: string): string {\n if (text.trim() === '') return 'No_Subject'\n let cleaned = text.replace(UNSAFE, '_').replace(/ /g, '_')\n cleaned = cleaned.replace(MULTI_UNDERSCORE, '_').replace(/^_+|_+$/g, '')\n if (cleaned.length > TITLE_MAX) cleaned = `${cleaned.slice(0, TITLE_MAX - 3)}...`\n return cleaned\n}\n\nfunction msgFilename(subject: string, uid: string): string {\n return `${sanitize(subject)}__${uid}.email.json`\n}\n\nfunction dateFromHeader(dateStr: string): string {\n if (dateStr === '') return '1970-01-01'\n const d = new Date(dateStr)\n if (Number.isNaN(d.getTime())) return '1970-01-01'\n const yyyy = d.getUTCFullYear().toString().padStart(4, '0')\n const mm = (d.getUTCMonth() + 1).toString().padStart(2, '0')\n const dd = d.getUTCDate().toString().padStart(2, '0')\n return `${yyyy}-${mm}-${dd}`\n}\n\nfunction enoent(p: string): Error {\n const e = new Error(`ENOENT: ${p}`) as Error & { code: string }\n e.code = 'ENOENT'\n return e\n}\n\nexport async function readdir(\n accessor: EmailAccessor,\n path: PathSpec,\n index?: IndexCacheStore,\n): Promise<string[]> {\n const prefix = path.prefix\n const raw = path.pattern !== null ? path.directory : path.original\n let p = raw\n if (prefix !== '' && p.startsWith(prefix)) p = p.slice(prefix.length) || '/'\n const key = stripSlash(p)\n const virtualKey = key !== '' ? `${prefix}/${key}` : prefix !== '' ? prefix : '/'\n const parts = key === '' ? [] : key.split('/')\n const depth = parts.length\n\n if (depth === 0) {\n if (index !== undefined) {\n const cached = await index.listDir(virtualKey)\n if (cached.entries !== undefined && cached.entries !== null) return cached.entries\n }\n const folders = await listFolders(accessor)\n const entries: [string, IndexEntry][] = []\n for (const folderName of folders) {\n const entry = new IndexEntry({\n id: folderName,\n name: folderName,\n resourceType: 'email/folder',\n vfsName: folderName,\n })\n entries.push([folderName, entry])\n }\n if (index !== undefined) await index.setDir(virtualKey, entries)\n return entries.map(([name]) => `${prefix}/${name}`)\n }\n\n if (depth === 1) {\n const folderName = parts[0] ?? ''\n if (index !== undefined) {\n const cached = await index.listDir(virtualKey)\n if (cached.entries !== undefined && cached.entries !== null) return cached.entries\n }\n if (index === undefined) throw enoent(path.original)\n const maxMessages = accessor.config.maxMessages\n const uids = await listMessageUids(accessor, folderName, 'ALL', maxMessages)\n const headersList = await fetchHeaders(accessor, folderName, uids)\n const dateGroups = new Map<string, typeof headersList>()\n for (const hdr of headersList) {\n const dateStr = dateFromHeader(hdr.date)\n let bucket = dateGroups.get(dateStr)\n if (bucket === undefined) {\n bucket = []\n dateGroups.set(dateStr, bucket)\n }\n bucket.push(hdr)\n }\n const sortedDates = [...dateGroups.keys()].sort().reverse()\n const dateEntries: [string, IndexEntry][] = []\n for (const dateStr of sortedDates) {\n const dateEntry = new IndexEntry({\n id: dateStr,\n name: dateStr,\n resourceType: 'email/date',\n vfsName: dateStr,\n })\n dateEntries.push([dateStr, dateEntry])\n const msgEntries: [string, IndexEntry][] = []\n for (const hdr of dateGroups.get(dateStr) ?? []) {\n const uid = hdr.uid\n const subject = hdr.subject || 'No Subject'\n const filename = msgFilename(subject, uid)\n const msgEntry = new IndexEntry({\n id: uid,\n name: subject,\n resourceType: 'email/message',\n vfsName: filename,\n })\n msgEntries.push([filename, msgEntry])\n const attachments: ParsedAttachment[] = hdr.attachments\n if (attachments.length > 0) {\n const attDirName = filename.replace('.email.json', '')\n const attDirEntry = new IndexEntry({\n id: uid,\n name: attDirName,\n resourceType: 'email/attachment_dir',\n vfsName: attDirName,\n })\n msgEntries.push([attDirName, attDirEntry])\n const attEntries: [string, IndexEntry][] = []\n for (const att of attachments) {\n const attEntry = new IndexEntry({\n id: att.filename,\n name: att.filename,\n resourceType: 'email/attachment',\n vfsName: att.filename,\n size: att.size,\n })\n attEntries.push([att.filename, attEntry])\n }\n const attDirVKey = `${virtualKey}/${dateStr}/${attDirName}`\n await index.setDir(attDirVKey, attEntries)\n }\n }\n const dateVKey = `${virtualKey}/${dateStr}`\n await index.setDir(dateVKey, msgEntries)\n }\n await index.setDir(virtualKey, dateEntries)\n return dateEntries.map(([name]) => `${prefix}/${key}/${name}`)\n }\n\n if (depth === 2 || depth === 3) {\n if (index === undefined) throw enoent(path.original)\n let cached = await index.listDir(virtualKey)\n if (cached.entries !== undefined && cached.entries !== null) return cached.entries\n const folderPath = prefix !== '' ? `${prefix}/${parts[0] ?? ''}` : `/${parts[0] ?? ''}`\n const folderSpec = new PathSpecCtor({ original: folderPath, directory: folderPath, prefix })\n await readdir(accessor, folderSpec, index)\n cached = await index.listDir(virtualKey)\n if (cached.entries !== undefined && cached.entries !== null) return cached.entries\n throw enoent(path.original)\n }\n\n throw enoent(path.original)\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 { loadOptionalPeer } from '@struktoai/mirage-core'\nimport type {\n AddressObject,\n EmailAddress as MailparserEmailAddress,\n ParsedMail,\n simpleParser,\n} from 'mailparser'\n\nexport interface EmailAddress {\n name: string\n email: string\n}\n\nexport interface ParsedAttachment {\n filename: string\n content_type: string\n size: number\n}\n\nexport interface ParsedAttachmentWithPayload extends ParsedAttachment {\n payload: Uint8Array\n}\n\nexport interface ParsedRfc822 {\n from: EmailAddress\n to: EmailAddress[]\n cc: EmailAddress[]\n subject: string\n date: string\n body_text: string\n body_html: string\n snippet: string\n message_id: string\n in_reply_to: string | null\n references: string[]\n has_attachments: boolean\n attachments: ParsedAttachment[]\n}\n\nlet parserPromise: Promise<typeof simpleParser> | null = null\n\nasync function getParser(): Promise<typeof simpleParser> {\n parserPromise ??= (async () => {\n const mod = await loadOptionalPeer(\n () =>\n import('mailparser') as unknown as Promise<{\n simpleParser: typeof simpleParser\n }>,\n { feature: 'parseRfc822', packageName: 'mailparser' },\n )\n return mod.simpleParser\n })()\n return parserPromise\n}\n\nfunction toAddr(a: MailparserEmailAddress | undefined): EmailAddress {\n if (a === undefined) return { name: '', email: '' }\n return { name: a.name, email: a.address ?? '' }\n}\n\nfunction toAddrList(list: AddressObject | AddressObject[] | undefined): EmailAddress[] {\n if (list === undefined) return []\n const objs = Array.isArray(list) ? list : [list]\n return objs.flatMap((obj) => obj.value.map((a) => toAddr(a)))\n}\n\nfunction fromParsed(parsed: ParsedMail, headersOnly: boolean): ParsedRfc822 {\n const text = headersOnly ? '' : (parsed.text ?? '')\n const html = headersOnly ? '' : typeof parsed.html === 'string' ? parsed.html : ''\n const attachments = headersOnly\n ? []\n : parsed.attachments.map((a) => ({\n filename: a.filename ?? 'unnamed',\n content_type: a.contentType,\n size: a.size,\n }))\n const refsRaw = parsed.references\n const references =\n typeof refsRaw === 'string' ? refsRaw.split(/\\s+/).filter((s) => s !== '') : (refsRaw ?? [])\n return {\n from: toAddr(parsed.from?.value[0]),\n to: toAddrList(parsed.to),\n cc: toAddrList(parsed.cc),\n subject: parsed.subject ?? '',\n date: parsed.date instanceof Date ? parsed.date.toUTCString() : '',\n body_text: text,\n body_html: html,\n snippet: text.slice(0, 100),\n message_id: parsed.messageId ?? '',\n in_reply_to:\n typeof parsed.inReplyTo === 'string' && parsed.inReplyTo !== '' ? parsed.inReplyTo : null,\n references,\n has_attachments: attachments.length > 0,\n attachments,\n }\n}\n\nexport async function parseRfc822(raw: Uint8Array, headersOnly = false): Promise<ParsedRfc822> {\n const parser = await getParser()\n const parsed = await parser(Buffer.from(raw), { skipHtmlToText: false })\n return fromParsed(parsed, headersOnly)\n}\n\nexport async function parseWithPayloads(raw: Uint8Array): Promise<ParsedAttachmentWithPayload[]> {\n const parser = await getParser()\n const parsed = await parser(Buffer.from(raw))\n return parsed.attachments.map((a) => ({\n filename: a.filename ?? 'unnamed',\n content_type: a.contentType,\n size: a.size,\n payload: new Uint8Array(a.content),\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 { EmailAccessor } from '../../accessor/email.ts'\nimport { parseRfc822, parseWithPayloads, type ParsedRfc822 } from './_parse.ts'\n\nexport interface FetchedMessage extends ParsedRfc822 {\n uid: string\n flags: string[]\n}\n\nexport async function listFolders(accessor: EmailAccessor): Promise<string[]> {\n const imap = await accessor.getImap()\n const tree = await imap.list()\n return tree.map((m) => m.pathAsListed)\n}\n\nexport async function listMessageUids(\n accessor: EmailAccessor,\n folder: string,\n searchCriteria = 'ALL',\n maxResults: number | null = null,\n): Promise<string[]> {\n const imap = await accessor.getImap()\n const lock = await imap.getMailboxLock(folder)\n try {\n const query = parseSearchCriteria(searchCriteria)\n const uidsRaw = await imap.search(query, { uid: true })\n if (uidsRaw === false) return []\n const uids = uidsRaw.map((n) => String(n))\n if (maxResults !== null && uids.length > maxResults) {\n return uids.slice(uids.length - maxResults)\n }\n return uids\n } finally {\n lock.release()\n }\n}\n\ninterface SearchQuery {\n all?: boolean\n unseen?: boolean\n body?: string\n text?: string\n subject?: string\n from?: string\n to?: string\n since?: Date\n before?: Date\n}\n\nfunction parseSearchCriteria(criteria: string): SearchQuery {\n if (criteria === 'ALL' || criteria === '') return { all: true }\n const out: SearchQuery = {}\n const tokens = tokenizeCriteria(criteria)\n let i = 0\n while (i < tokens.length) {\n const tok = (tokens[i] ?? '').toUpperCase()\n if (tok === 'UNSEEN') {\n out.unseen = true\n i += 1\n continue\n }\n if (\n tok === 'TEXT' ||\n tok === 'SUBJECT' ||\n tok === 'FROM' ||\n tok === 'TO' ||\n tok === 'SINCE' ||\n tok === 'BEFORE'\n ) {\n const v = tokens[i + 1] ?? ''\n if (tok === 'TEXT') out.text = v\n else if (tok === 'SUBJECT') out.subject = v\n else if (tok === 'FROM') out.from = v\n else if (tok === 'TO') out.to = v\n else if (tok === 'SINCE') {\n const d = parseImapDate(v)\n if (d !== null) out.since = d\n } else {\n const d = parseImapDate(v)\n if (d !== null) out.before = d\n }\n i += 2\n continue\n }\n i += 1\n }\n return out\n}\n\nfunction tokenizeCriteria(criteria: string): string[] {\n const tokens: string[] = []\n let i = 0\n while (i < criteria.length) {\n if (criteria[i] === ' ') {\n i += 1\n continue\n }\n if (criteria[i] === '\"') {\n const end = criteria.indexOf('\"', i + 1)\n if (end === -1) {\n tokens.push(criteria.slice(i + 1))\n break\n }\n tokens.push(criteria.slice(i + 1, end))\n i = end + 1\n continue\n }\n let end = criteria.indexOf(' ', i)\n if (end === -1) end = criteria.length\n tokens.push(criteria.slice(i, end))\n i = end\n }\n return tokens\n}\n\nfunction parseImapDate(s: string): Date | null {\n const m = /^(\\d{1,2})-([A-Za-z]{3})-(\\d{4})$/.exec(s)\n if (m === null) return null\n const months: Record<string, number> = {\n Jan: 0,\n Feb: 1,\n Mar: 2,\n Apr: 3,\n May: 4,\n Jun: 5,\n Jul: 6,\n Aug: 7,\n Sep: 8,\n Oct: 9,\n Nov: 10,\n Dec: 11,\n }\n const day = Number.parseInt(m[1] ?? '0', 10)\n const monKey = (m[2] ?? '').slice(0, 1).toUpperCase() + (m[2] ?? '').slice(1).toLowerCase()\n const mon = months[monKey] ?? 0\n const year = Number.parseInt(m[3] ?? '1970', 10)\n return new Date(Date.UTC(year, mon, day))\n}\n\nexport async function fetchMessage(\n accessor: EmailAccessor,\n folder: string,\n uid: string,\n): Promise<FetchedMessage> {\n const imap = await accessor.getImap()\n const lock = await imap.getMailboxLock(folder)\n try {\n const msg = await imap.fetchOne(uid, { source: true, flags: true, uid: true }, { uid: true })\n if (msg === false) {\n throw new Error(`email: uid ${uid} not found in ${folder}`)\n }\n const source = msg.source instanceof Buffer ? new Uint8Array(msg.source) : new Uint8Array(0)\n const parsed = await parseRfc822(source)\n return {\n ...parsed,\n uid,\n flags: msg.flags !== undefined ? [...msg.flags] : [],\n }\n } finally {\n lock.release()\n }\n}\n\nexport async function fetchHeaders(\n accessor: EmailAccessor,\n folder: string,\n uids: readonly string[],\n): Promise<FetchedMessage[]> {\n if (uids.length === 0) return []\n const imap = await accessor.getImap()\n const lock = await imap.getMailboxLock(folder)\n try {\n const results: FetchedMessage[] = []\n for (const uid of uids) {\n const msg = await imap.fetchOne(uid, { headers: true, flags: true, uid: true }, { uid: true })\n if (msg === false) continue\n const headers =\n msg.headers instanceof Buffer ? new Uint8Array(msg.headers) : new Uint8Array(0)\n const parsed = await parseRfc822(headers, true)\n results.push({\n ...parsed,\n uid,\n flags: msg.flags !== undefined ? [...msg.flags] : [],\n })\n }\n return results\n } finally {\n lock.release()\n }\n}\n\nexport async function fetchAttachment(\n accessor: EmailAccessor,\n folder: string,\n uid: string,\n filename: string,\n): Promise<Uint8Array | null> {\n const imap = await accessor.getImap()\n const lock = await imap.getMailboxLock(folder)\n try {\n const msg = await imap.fetchOne(uid, { source: true }, { uid: true })\n if (msg === false) return null\n const source = msg.source instanceof Buffer ? new Uint8Array(msg.source) : new Uint8Array(0)\n const attachments = await parseWithPayloads(source)\n for (const att of attachments) {\n if (att.filename === filename) return att.payload\n }\n return null\n } finally {\n lock.release()\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 { EmailAccessor } from '../../accessor/email.ts'\nimport { listFolders as clientListFolders } from './_client.ts'\n\nexport async function listFolders(accessor: EmailAccessor): Promise<string[]> {\n return clientListFolders(accessor)\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { IndexCacheStore, PathSpec } from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../accessor/email.ts'\nimport { fetchAttachment, fetchMessage } from './_client.ts'\nimport { gnuDirname, stripSlash } from '@struktoai/mirage-core'\n\nconst ENC = new TextEncoder()\n\nfunction enoent(p: string): Error {\n const e = new Error(`ENOENT: ${p}`) as Error & { code: string }\n e.code = 'ENOENT'\n return e\n}\n\nfunction eisdir(p: string): Error {\n const e = new Error(`EISDIR: ${p}`) as Error & { code: string }\n e.code = 'EISDIR'\n return e\n}\n\nexport async function read(\n accessor: EmailAccessor,\n path: PathSpec,\n index?: IndexCacheStore,\n): Promise<Uint8Array> {\n const prefix = path.prefix\n let p = path.original\n if (prefix !== '' && p.startsWith(prefix)) p = p.slice(prefix.length) || '/'\n const key = stripSlash(p)\n if (index === undefined) throw enoent(path.original)\n const virtualKey = prefix !== '' ? `${prefix}/${key}` : `/${key}`\n const result = await index.get(virtualKey)\n if (result.entry === undefined || result.entry === null) throw enoent(path.original)\n const rt = result.entry.resourceType\n if (rt === 'email/folder' || rt === 'email/date' || rt === 'email/attachment_dir') {\n throw eisdir(path.original)\n }\n if (rt === 'email/attachment') {\n const parentKey = gnuDirname(virtualKey)\n const parentResult = await index.get(parentKey)\n if (parentResult.entry === undefined || parentResult.entry === null) {\n throw enoent(path.original)\n }\n const uid = parentResult.entry.id\n const parts = stripSlash(virtualKey).split('/')\n const folder = prefix !== '' ? (parts[1] ?? '') : (parts[0] ?? '')\n const filename = result.entry.vfsName !== '' ? result.entry.vfsName : result.entry.name\n const data = await fetchAttachment(accessor, folder, uid, filename)\n if (data === null) throw enoent(path.original)\n return data\n }\n const parts = stripSlash(virtualKey).split('/')\n const folder = prefix !== '' ? (parts[1] ?? '') : (parts[0] ?? '')\n const uid = result.entry.id\n const msg = await fetchMessage(accessor, folder, uid)\n return ENC.encode(JSON.stringify(msg))\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { IndexCacheStore, PathSpec } from '@struktoai/mirage-core'\nimport { FileStat, FileType, stripSlash } from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../accessor/email.ts'\nimport { listFolders } from './folders.ts'\n\nfunction guessType(name: string): FileType {\n const lower = name.toLowerCase()\n if (lower.endsWith('.json') || lower.endsWith('.email.json')) return FileType.JSON\n if (lower.endsWith('.csv')) return FileType.CSV\n if (lower.endsWith('.png')) return FileType.IMAGE_PNG\n if (lower.endsWith('.jpg') || lower.endsWith('.jpeg')) return FileType.IMAGE_JPEG\n if (lower.endsWith('.gif')) return FileType.IMAGE_GIF\n if (lower.endsWith('.zip')) return FileType.ZIP\n if (lower.endsWith('.gz') || lower.endsWith('.gzip')) return FileType.GZIP\n if (lower.endsWith('.pdf')) return FileType.PDF\n if (lower.endsWith('.txt') || lower.endsWith('.md') || lower.endsWith('.log')) {\n return FileType.TEXT\n }\n return FileType.BINARY\n}\n\nfunction enoent(p: string): Error {\n const e = new Error(`ENOENT: ${p}`) as Error & { code: string }\n e.code = 'ENOENT'\n return e\n}\n\nexport async function stat(\n accessor: EmailAccessor,\n path: PathSpec,\n index?: IndexCacheStore,\n): Promise<FileStat> {\n const prefix = path.prefix\n let p = path.original\n if (prefix !== '' && p.startsWith(prefix)) p = p.slice(prefix.length) || '/'\n const key = stripSlash(p)\n if (key === '') return new FileStat({ name: '/', type: FileType.DIRECTORY })\n\n if (index === undefined) throw enoent(path.original)\n const virtualKey = prefix !== '' ? `${prefix}/${key}` : `/${key}`\n const result = await index.get(virtualKey)\n if (result.entry === undefined || result.entry === null) {\n if (!key.includes('/')) {\n const folders = await listFolders(accessor)\n if (folders.includes(key)) return new FileStat({ name: key, type: FileType.DIRECTORY })\n throw enoent(path.original)\n }\n throw enoent(path.original)\n }\n const rt = result.entry.resourceType\n const vfsName = result.entry.vfsName !== '' ? result.entry.vfsName : result.entry.name\n if (rt === 'email/folder') return new FileStat({ name: vfsName, type: FileType.DIRECTORY })\n if (rt === 'email/date') return new FileStat({ name: vfsName, type: FileType.DIRECTORY })\n if (rt === 'email/message') {\n return new FileStat({\n name: vfsName,\n type: FileType.JSON,\n size: result.entry.size,\n extra: { uid: result.entry.id },\n })\n }\n if (rt === 'email/attachment_dir') {\n return new FileStat({\n name: vfsName,\n type: FileType.DIRECTORY,\n extra: { uid: result.entry.id },\n })\n }\n if (rt === 'email/attachment') {\n return new FileStat({\n name: vfsName,\n type: guessType(vfsName),\n size: result.entry.size,\n extra: { attachment_id: result.entry.id },\n })\n }\n return new FileStat({ name: vfsName, type: FileType.JSON, extra: { uid: result.entry.id } })\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 Precision,\n ProvisionResult,\n type Accessor,\n type CommandOpts,\n type IndexCacheStore,\n type PathSpec,\n} from '@struktoai/mirage-core'\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) return new ProvisionResult({ precision: Precision.UNKNOWN })\n const index: IndexCacheStore | undefined = opts.index ?? undefined\n let ops = 0\n if (index !== undefined) {\n for (const p of paths) {\n const lookup = await index.get(p.original)\n if (lookup.entry !== undefined && lookup.entry !== null) ops += 1\n }\n }\n return new ProvisionResult({\n networkReadLow: 0,\n networkReadHigh: 0,\n readOps: ops,\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 return new ProvisionResult({\n networkReadLow: 0,\n networkReadHigh: 0,\n readOps: 0,\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 { ResourceName, command, specOf, dirnameFn } from '@struktoai/mirage-core'\n\nexport const EMAIL_DIRNAME = command({\n name: 'dirname',\n resource: ResourceName.EMAIL,\n spec: specOf('dirname'),\n fn: dirnameFn,\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 IOResult,\n PathSpec,\n ResourceName,\n command,\n specOf,\n type ByteSource,\n type CommandFnResult,\n type CommandOpts,\n rstripSlash,\n stripSlash,\n formatRecords,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { resolveGlob } from '../../../core/email/glob.ts'\nimport { readdir as emailReaddir } from '../../../core/email/readdir.ts'\nimport { metadataProvision } from './provision.ts'\nimport { fnmatch } from '@struktoai/mirage-core'\nimport { findSizeMtimeError, invalidFindArg } from '@struktoai/mirage-core'\n\nasync function walk(\n accessor: EmailAccessor,\n path: PathSpec,\n index: CommandOpts['index'],\n maxDepth: number | null,\n depth: number,\n): Promise<string[]> {\n if (maxDepth !== null && depth > maxDepth) return []\n let children: string[]\n try {\n children = await emailReaddir(accessor, path, index ?? undefined)\n } catch {\n return []\n }\n const results: string[] = []\n for (const child of children) {\n const isFolder = child.endsWith('/')\n const trimmed = isFolder ? rstripSlash(child) : child\n results.push(trimmed)\n if (isFolder) {\n const childSpec = new PathSpec({\n original: trimmed,\n directory: trimmed,\n resolved: false,\n prefix: path.prefix,\n })\n const sub = await walk(accessor, childSpec, index, maxDepth, depth + 1)\n results.push(...sub)\n }\n }\n return results\n}\n\nasync function findCommand(\n accessor: EmailAccessor,\n paths: PathSpec[],\n _texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const resolved = await resolveGlob(accessor, paths, opts.index ?? undefined)\n const p0 =\n resolved[0] ??\n new PathSpec({\n original: '/',\n directory: '/',\n resolved: false,\n prefix: opts.mountPrefix ?? '',\n })\n const nameFlag = typeof opts.flags.name === 'string' ? opts.flags.name : null\n const inameFlag = typeof opts.flags.iname === 'string' ? opts.flags.iname : null\n const maxDepthRaw = typeof opts.flags.maxdepth === 'string' ? opts.flags.maxdepth : null\n const minDepthRaw = typeof opts.flags.mindepth === 'string' ? opts.flags.mindepth : null\n const maxDepth = maxDepthRaw !== null ? Number.parseInt(maxDepthRaw, 10) : null\n const minDepth = minDepthRaw !== null ? Number.parseInt(minDepthRaw, 10) : null\n if (maxDepthRaw !== null && Number.isNaN(maxDepth))\n return invalidFindArg(maxDepthRaw, '-maxdepth')\n if (minDepthRaw !== null && Number.isNaN(minDepth))\n return invalidFindArg(minDepthRaw, '-mindepth')\n const sizeFlag = typeof opts.flags.size === 'string' ? opts.flags.size : null\n const mtimeFlag = typeof opts.flags.mtime === 'string' ? opts.flags.mtime : null\n const sizeMtimeErr = findSizeMtimeError(sizeFlag, mtimeFlag)\n if (sizeMtimeErr !== null) return sizeMtimeErr\n\n const allPaths = await walk(accessor, p0, opts.index, maxDepth, 0)\n const searchKey = stripSlash(p0.stripPrefix)\n const baseDepth = searchKey === '' ? -1 : searchKey.split('/').length - 1\n const results: string[] = []\n for (const p of [...allPaths].sort()) {\n const stripped = p.startsWith(p0.prefix) ? p.slice(p0.prefix.length) : p\n const trimmed = stripSlash(stripped)\n const depth = trimmed === '' ? -1 : trimmed.split('/').length - (baseDepth + 2)\n if (minDepth !== null && depth < minDepth) continue\n const entryName = p.split('/').pop() ?? p\n if (nameFlag !== null && !fnmatch(entryName, nameFlag)) continue\n if (inameFlag !== null && !fnmatch(entryName.toLowerCase(), inameFlag.toLowerCase())) continue\n results.push(p)\n }\n const out: ByteSource = formatRecords(results)\n return [out, new IOResult()]\n}\n\nexport const EMAIL_FIND = command({\n name: 'find',\n resource: ResourceName.EMAIL,\n spec: specOf('find'),\n fn: findCommand,\n provision: metadataProvision,\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 CommandSpec,\n IOResult,\n OperandKind,\n Option,\n ResourceName,\n command,\n type ByteSource,\n type CommandFnResult,\n type CommandOpts,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { fetchMessage } from '../../../core/email/_client.ts'\nimport { forwardMessage } from '../../../core/email/send.ts'\n\nconst ENC = new TextEncoder()\n\nconst SPEC = new CommandSpec({\n options: [\n new Option({ long: '--uid', valueKind: OperandKind.TEXT }),\n new Option({ long: '--folder', valueKind: OperandKind.TEXT }),\n new Option({ long: '--to', valueKind: OperandKind.TEXT }),\n ],\n})\n\nasync function emailForwardCommand(\n accessor: EmailAccessor,\n _paths: PathSpec[],\n _texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const uid = typeof opts.flags.uid === 'string' ? opts.flags.uid : ''\n const folder = typeof opts.flags.folder === 'string' ? opts.flags.folder : ''\n const to = typeof opts.flags.to === 'string' ? opts.flags.to : ''\n if (uid === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--uid is required\\n') })]\n }\n if (folder === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--folder is required\\n') })]\n }\n if (to === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--to is required\\n') })]\n }\n const original = await fetchMessage(accessor, folder, uid)\n const result = await forwardMessage(accessor.config, original, to)\n const out: ByteSource = ENC.encode(JSON.stringify(result))\n return [out, new IOResult()]\n}\n\nexport const EMAIL_FORWARD = command({\n name: 'email-forward',\n resource: ResourceName.EMAIL,\n spec: SPEC,\n fn: emailForwardCommand,\n write: true,\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 { loadOptionalPeer } from '@struktoai/mirage-core'\nimport type * as Nodemailer from 'nodemailer'\nimport type { EmailConfig } from '../../resource/email/config.ts'\nimport type { FetchedMessage } from './_client.ts'\n\nlet transporterCache = new WeakMap<EmailConfig, Nodemailer.Transporter>()\n\nasync function getTransporter(config: EmailConfig): Promise<Nodemailer.Transporter> {\n const existing = transporterCache.get(config)\n if (existing !== undefined) return existing\n const mod = await loadOptionalPeer(\n () => import('nodemailer') as unknown as Promise<typeof Nodemailer>,\n { feature: 'email send/reply/forward', packageName: 'nodemailer' },\n )\n const transporter = mod.createTransport({\n host: config.smtpHost,\n port: config.smtpPort,\n secure: config.smtpPort === 465,\n auth: { user: config.username, pass: config.password },\n })\n transporterCache.set(config, transporter)\n return transporter\n}\n\nexport interface SendResult {\n status: string\n to: string | string[]\n subject: string\n}\n\nexport async function sendMessage(\n config: EmailConfig,\n to: string,\n subject: string,\n body: string,\n): Promise<SendResult> {\n const t = await getTransporter(config)\n await t.sendMail({ from: config.username, to, subject, text: body })\n return { status: 'sent', to, subject }\n}\n\nexport async function replyMessage(\n config: EmailConfig,\n original: FetchedMessage,\n body: string,\n): Promise<SendResult> {\n const t = await getTransporter(config)\n const refs = [...original.references]\n if (original.message_id !== '') refs.push(original.message_id)\n const subject = `Re: ${original.subject}`\n await t.sendMail({\n from: config.username,\n to: original.from.email,\n subject,\n text: body,\n inReplyTo: original.message_id,\n references: refs,\n })\n return { status: 'sent', to: original.from.email, subject }\n}\n\nexport async function replyAllMessage(\n config: EmailConfig,\n original: FetchedMessage,\n body: string,\n): Promise<SendResult> {\n const t = await getTransporter(config)\n const all = new Set<string>()\n if (original.from.email !== '') all.add(original.from.email)\n for (const r of original.to) if (r.email !== '') all.add(r.email)\n for (const r of original.cc) if (r.email !== '') all.add(r.email)\n all.delete(config.username)\n const recipients = [...all].sort()\n const refs = [...original.references]\n if (original.message_id !== '') refs.push(original.message_id)\n const subject = `Re: ${original.subject}`\n await t.sendMail({\n from: config.username,\n to: recipients,\n subject,\n text: body,\n inReplyTo: original.message_id,\n references: refs,\n })\n return { status: 'sent', to: recipients, subject }\n}\n\nexport async function forwardMessage(\n config: EmailConfig,\n original: FetchedMessage,\n to: string,\n): Promise<SendResult> {\n const t = await getTransporter(config)\n const subject = `Fwd: ${original.subject}`\n const fwdBody =\n `---------- Forwarded message ----------\\n` +\n `From: ${original.from.name} <${original.from.email}>\\n` +\n `Date: ${original.date}\\n` +\n `Subject: ${original.subject}\\n\\n` +\n original.body_text\n await t.sendMail({ from: config.username, to, subject, text: fwdBody })\n return { status: 'sent', to, subject }\n}\n\nexport function _resetTransporterCacheForTests(): void {\n transporterCache = new WeakMap()\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 IOResult,\n PathSpec,\n ResourceName,\n command,\n compilePattern,\n exitOnEmpty,\n grepFilesOnly,\n grepLines,\n grepStream,\n prefixAggregate,\n quietMatch,\n resolveSource,\n specOf,\n yieldBytes,\n type AsyncReadBytesFn,\n type AsyncReaddirFn,\n type AsyncStatFn,\n type ByteSource,\n type CommandFnResult,\n type CommandOpts,\n formatRecords,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { resolveGlob } from '../../../core/email/glob.ts'\nimport { read as emailRead } from '../../../core/email/read.ts'\nimport { readdir as emailReaddir } from '../../../core/email/readdir.ts'\nimport { stat as emailStat } from '../../../core/email/stat.ts'\nimport { detectScope } from '../../../core/email/scope.ts'\nimport { searchAndFormat } from '../../../core/email/search.ts'\nimport { fileReadProvision } from './provision.ts'\n\nconst ENC = new TextEncoder()\nconst DEC = new TextDecoder('utf-8', { fatal: false })\n\ninterface FlagSet {\n ignoreCase: boolean\n invert: boolean\n lineNumbers: boolean\n countOnly: boolean\n filesOnly: boolean\n wholeWord: boolean\n fixedString: boolean\n onlyMatching: boolean\n maxCount: number | null\n quiet: boolean\n afterContext: number\n beforeContext: number\n}\n\nfunction parseFlags(flags: Record<string, string | boolean | string[]>): FlagSet {\n const toInt = (v: string | boolean | string[] | undefined): number | null =>\n typeof v === 'string' ? Number.parseInt(v, 10) : null\n const aCtx = toInt(flags.A)\n const bCtx = toInt(flags.B)\n const cCtx = toInt(flags.C)\n return {\n ignoreCase: flags.i === true,\n invert: flags.v === true,\n lineNumbers: flags.n === true,\n countOnly: flags.c === true,\n filesOnly: flags.args_l === true || flags.l === true,\n wholeWord: flags.w === true,\n fixedString: flags.F === true,\n onlyMatching: flags.o === true,\n maxCount: toInt(flags.m),\n quiet: flags.q === true,\n afterContext: aCtx ?? cCtx ?? 0,\n beforeContext: bCtx ?? cCtx ?? 0,\n }\n}\n\nfunction getPattern(\n texts: readonly string[],\n flags: Record<string, string | boolean | string[]>,\n): string {\n if (typeof flags.e === 'string') return flags.e\n if (texts.length > 0 && texts[0] !== undefined) return texts[0]\n throw new Error('grep: usage: grep [flags] pattern [path]')\n}\n\nfunction splitLinesNoTrailing(text: string): string[] {\n const stripped = text.endsWith('\\n') ? text.slice(0, -1) : text\n return stripped === '' ? [] : stripped.split('\\n')\n}\n\nasync function grepCommand(\n accessor: EmailAccessor,\n paths: PathSpec[],\n texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n let pattern: string\n try {\n pattern = getPattern(texts, opts.flags)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode(`${msg}\\n`) })]\n }\n const f = parseFlags(opts.flags)\n const recursive = opts.flags.r === true || opts.flags.R === true\n\n if (paths.length > 0) {\n const first = paths[0]\n if (first !== undefined) {\n const scope = detectScope(first)\n if (scope.useNative) {\n const filePrefix = first.prefix !== '' ? first.prefix : ''\n const pairs = await searchAndFormat(accessor, scope, pattern, filePrefix, f.maxCount ?? 50)\n const lines: string[] = []\n for (const [vfsPath, msgText] of pairs) {\n const matched = grepLines(\n vfsPath,\n [msgText],\n compilePattern(pattern, f.ignoreCase, f.fixedString, f.wholeWord),\n f,\n )\n for (const line of matched) lines.push(`${vfsPath}:${line}`)\n }\n if (lines.length === 0) return [new Uint8Array(0), new IOResult({ exitCode: 1 })]\n const out: ByteSource = ENC.encode(lines.join('\\n') + '\\n')\n return [out, new IOResult()]\n }\n }\n\n const resolved = await resolveGlob(accessor, paths, opts.index ?? undefined)\n if (resolved.length === 0) return [new Uint8Array(0), new IOResult({ exitCode: 1 })]\n const filePrefix = resolved[0]?.prefix ?? ''\n const readdirFn: AsyncReaddirFn = async (path) => {\n const spec = new PathSpec({\n original: path,\n directory: path,\n resolved: false,\n prefix: filePrefix,\n })\n return emailReaddir(accessor, spec, opts.index ?? undefined)\n }\n const statFn: AsyncStatFn = async (path) => {\n const spec = new PathSpec({\n original: path,\n directory: path,\n resolved: false,\n prefix: filePrefix,\n })\n return emailStat(accessor, spec, opts.index ?? undefined)\n }\n const readBytesFn: AsyncReadBytesFn = async (path) => {\n const spec = new PathSpec({\n original: path,\n directory: path,\n resolved: true,\n prefix: filePrefix,\n })\n return emailRead(accessor, spec, opts.index ?? undefined)\n }\n\n if (f.filesOnly) {\n const warnings: string[] = []\n const firstResolved = resolved[0]\n if (firstResolved === undefined) return [new Uint8Array(0), new IOResult({ exitCode: 1 })]\n const results = await grepFilesOnly(\n readdirFn,\n statFn,\n readBytesFn,\n firstResolved.original,\n pattern,\n {\n recursive,\n ignoreCase: f.ignoreCase,\n invert: f.invert,\n lineNumbers: f.lineNumbers,\n countOnly: f.countOnly,\n fixedString: f.fixedString,\n onlyMatching: f.onlyMatching,\n maxCount: f.maxCount,\n wholeWord: f.wholeWord,\n },\n warnings,\n )\n const stderr = warnings.length > 0 ? formatRecords(warnings) : null\n if (results.length === 0) return [new Uint8Array(0), new IOResult({ exitCode: 1, stderr })]\n const out: ByteSource = formatRecords(results)\n return [out, new IOResult({ stderr })]\n }\n\n const pat = compilePattern(pattern, f.ignoreCase, f.fixedString, f.wholeWord)\n\n if (resolved.length > 1) {\n const allResults: string[] = []\n for (const p of resolved) {\n const data = splitLinesNoTrailing(\n DEC.decode(await emailRead(accessor, p, opts.index ?? undefined)),\n )\n const hits = grepLines(p.original, data, pat, f)\n if (f.countOnly) {\n if (hits.length > 0) allResults.push(`${p.original}:${hits[0] ?? ''}`)\n } else {\n for (const h of hits) allResults.push(`${p.original}:${h}`)\n }\n }\n if (allResults.length === 0) return [new Uint8Array(0), new IOResult({ exitCode: 1 })]\n const out: ByteSource = formatRecords(allResults)\n return [out, new IOResult()]\n }\n\n const firstResolved = resolved[0]\n if (firstResolved === undefined) return [null, new IOResult()]\n const data = await emailRead(accessor, firstResolved, opts.index ?? undefined)\n const source = yieldBytes(data)\n const stream = grepStream(source, pat, f)\n if (f.quiet) {\n const io = new IOResult({ exitCode: 1 })\n return [quietMatch(stream, io), io]\n }\n const io = new IOResult()\n return [exitOnEmpty(stream, io), io]\n }\n\n let source: AsyncIterable<Uint8Array>\n try {\n source = resolveSource(opts.stdin, 'grep: usage: grep [flags] pattern [path]')\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode(`${msg}\\n`) })]\n }\n const pat = compilePattern(pattern, f.ignoreCase, f.fixedString, f.wholeWord)\n const stream = grepStream(source, pat, f)\n if (f.quiet) {\n const io = new IOResult({ exitCode: 1 })\n return [quietMatch(stream, io), io]\n }\n const io = new IOResult()\n return [exitOnEmpty(stream, io), io]\n}\n\nexport const EMAIL_GREP = command({\n name: 'grep',\n resource: ResourceName.EMAIL,\n spec: specOf('grep'),\n fn: grepCommand,\n aggregate: prefixAggregate,\n provision: fileReadProvision,\n})\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { PathSpec } from '@struktoai/mirage-core'\nimport { stripSlash } from '@struktoai/mirage-core'\n\nexport interface EmailScope {\n useNative: boolean\n folder: string | null\n resourcePath: string\n}\n\nexport function detectScope(path: PathSpec): EmailScope {\n const key = stripSlash(path.stripPrefix)\n if (key === '') {\n return { useNative: false, folder: null, resourcePath: '/' }\n }\n const parts = key.split('/').filter((s) => s !== '')\n if (parts.length === 0) {\n return { useNative: false, folder: null, resourcePath: '/' }\n }\n if (key.endsWith('.email.json')) {\n return { useNative: false, folder: parts[0] ?? null, resourcePath: key }\n }\n if (parts.length <= 2) {\n return { useNative: true, folder: parts[0] ?? null, resourcePath: key }\n }\n return { useNative: false, folder: parts[0] ?? null, resourcePath: key }\n}\n\nexport function extractFolder(paths: readonly PathSpec[]): string | null {\n if (paths.length === 0) return null\n const p = paths[0]\n if (p === undefined) return null\n const key = stripSlash(p.stripPrefix)\n const parts = key.split('/').filter((s) => s !== '')\n return parts[0] ?? null\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 { EmailAccessor } from '../../accessor/email.ts'\nimport { fetchMessage, listMessageUids, type FetchedMessage } from './_client.ts'\nimport type { EmailScope } from './scope.ts'\n\nconst TITLE_MAX = 80\nconst UNSAFE = /[^\\w\\s\\-.]/g\nconst MULTI_UNDERSCORE = /_+/g\n\nfunction sanitize(text: string): string {\n if (text.trim() === '') return 'No_Subject'\n let cleaned = text.replace(UNSAFE, '_').replace(/ /g, '_')\n cleaned = cleaned.replace(MULTI_UNDERSCORE, '_').replace(/^_+|_+$/g, '')\n if (cleaned.length > TITLE_MAX) cleaned = `${cleaned.slice(0, TITLE_MAX - 3)}...`\n return cleaned\n}\n\nfunction dateFromHeader(dateStr: string): string {\n if (dateStr === '') return '1970-01-01'\n const d = new Date(dateStr)\n if (Number.isNaN(d.getTime())) return '1970-01-01'\n const yyyy = d.getUTCFullYear().toString().padStart(4, '0')\n const mm = (d.getUTCMonth() + 1).toString().padStart(2, '0')\n const dd = d.getUTCDate().toString().padStart(2, '0')\n return `${yyyy}-${mm}-${dd}`\n}\n\nexport interface SearchOptions {\n text?: string | null\n subject?: string | null\n fromAddr?: string | null\n toAddr?: string | null\n since?: string | null\n before?: string | null\n unseen?: boolean\n}\n\nexport function buildSearchCriteria(opts: SearchOptions): string {\n const parts: string[] = []\n if (opts.unseen === true) parts.push('UNSEEN')\n if (opts.text !== undefined && opts.text !== null && opts.text !== '') {\n parts.push(`TEXT \"${opts.text}\"`)\n }\n if (opts.subject !== undefined && opts.subject !== null && opts.subject !== '') {\n parts.push(`SUBJECT \"${opts.subject}\"`)\n }\n if (opts.fromAddr !== undefined && opts.fromAddr !== null && opts.fromAddr !== '') {\n parts.push(`FROM \"${opts.fromAddr}\"`)\n }\n if (opts.toAddr !== undefined && opts.toAddr !== null && opts.toAddr !== '') {\n parts.push(`TO \"${opts.toAddr}\"`)\n }\n if (opts.since !== undefined && opts.since !== null && opts.since !== '') {\n parts.push(`SINCE ${opts.since}`)\n }\n if (opts.before !== undefined && opts.before !== null && opts.before !== '') {\n parts.push(`BEFORE ${opts.before}`)\n }\n return parts.length > 0 ? parts.join(' ') : 'ALL'\n}\n\nexport async function searchMessages(\n accessor: EmailAccessor,\n folder: string,\n opts: SearchOptions = {},\n maxResults: number | null = null,\n): Promise<string[]> {\n const criteria = buildSearchCriteria(opts)\n return listMessageUids(accessor, folder, criteria, maxResults)\n}\n\nfunction buildVfsPath(prefix: string, folder: string, msg: FetchedMessage): string {\n const dateStr = dateFromHeader(msg.date)\n const subject = sanitize(msg.subject !== '' ? msg.subject : 'No Subject')\n const filename = `${subject}__${msg.uid}.email.json`\n return [prefix, folder, dateStr, filename].filter((p) => p !== '').join('/')\n}\n\nexport async function searchAndFormat(\n accessor: EmailAccessor,\n scope: EmailScope,\n pattern: string,\n prefix: string,\n maxResults: number | null = null,\n): Promise<[string, string][]> {\n const folder = scope.folder ?? ''\n if (folder === '') return []\n const uids = await searchMessages(accessor, folder, { text: pattern }, maxResults)\n const pairs: [string, string][] = []\n for (const uid of uids) {\n const msg = await fetchMessage(accessor, folder, uid)\n const msgText = JSON.stringify(msg)\n const vfsPath = buildVfsPath(prefix, folder, msg)\n pairs.push([vfsPath, msgText])\n }\n return pairs\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 ResourceName,\n command,\n headGeneric,\n specOf,\n type CommandFnResult,\n type CommandOpts,\n type IndexCacheStore,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { resolveGlob } from '../../../core/email/glob.ts'\nimport { read as emailRead } from '../../../core/email/read.ts'\nimport { stat as emailStat } from '../../../core/email/stat.ts'\nimport { fileReadProvision } from './provision.ts'\n\nasync function* emailStream(\n accessor: EmailAccessor,\n p: PathSpec,\n index: IndexCacheStore | undefined,\n): AsyncIterable<Uint8Array> {\n yield await emailRead(accessor, p, index)\n}\n\nasync function headCommand(\n accessor: EmailAccessor,\n paths: PathSpec[],\n texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const resolved =\n paths.length > 0 ? await resolveGlob(accessor, paths, opts.index ?? undefined) : []\n return headGeneric(\n resolved,\n texts,\n opts,\n (p) => emailStat(accessor, p, opts.index ?? undefined),\n (p) => emailStream(accessor, p, opts.index ?? undefined),\n )\n}\n\nexport const EMAIL_HEAD = command({\n name: 'head',\n resource: ResourceName.EMAIL,\n spec: specOf('head'),\n fn: headCommand,\n provision: fileReadProvision,\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 ResourceName,\n command,\n jqGeneric,\n specOf,\n type CommandFnResult,\n type CommandOpts,\n type IndexCacheStore,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { resolveGlob } from '../../../core/email/glob.ts'\nimport { read as emailRead } from '../../../core/email/read.ts'\n\nasync function* emailStream(\n accessor: EmailAccessor,\n p: PathSpec,\n index: IndexCacheStore | undefined,\n): AsyncIterable<Uint8Array> {\n yield await emailRead(accessor, p, index)\n}\n\nasync function jqCommand(\n accessor: EmailAccessor,\n paths: PathSpec[],\n texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const resolved =\n paths.length > 0 ? await resolveGlob(accessor, paths, opts.index ?? undefined) : []\n const stream = (p: PathSpec): AsyncIterable<Uint8Array> =>\n emailStream(accessor, p, opts.index ?? undefined)\n return jqGeneric(resolved, texts, opts, stream)\n}\n\nexport const EMAIL_JQ = command({\n name: 'jq',\n resource: ResourceName.EMAIL,\n spec: specOf('jq'),\n fn: jqCommand,\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 PathSpec,\n ResourceName,\n command,\n lsGeneric,\n specOf,\n type CommandFnResult,\n type CommandOpts,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { resolveGlob } from '../../../core/email/glob.ts'\nimport { readdir as emailReaddir } from '../../../core/email/readdir.ts'\nimport { stat as emailStat } from '../../../core/email/stat.ts'\nimport { metadataProvision } from './provision.ts'\n\nasync function lsCommand(\n accessor: EmailAccessor,\n paths: PathSpec[],\n _texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n let workingPaths: PathSpec[] = paths\n if (workingPaths.length === 0) {\n workingPaths = [\n new PathSpec({\n original: opts.cwd,\n directory: opts.cwd,\n resolved: false,\n prefix: opts.mountPrefix ?? '',\n }),\n ]\n }\n const resolved = await resolveGlob(accessor, workingPaths, opts.index ?? undefined)\n return lsGeneric(\n resolved,\n opts,\n (p) => emailReaddir(accessor, p, opts.index ?? undefined),\n (p) => emailStat(accessor, p, opts.index ?? undefined),\n )\n}\n\nexport const EMAIL_LS = command({\n name: 'ls',\n resource: ResourceName.EMAIL,\n spec: specOf('ls'),\n fn: lsCommand,\n provision: metadataProvision,\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 ResourceName,\n command,\n nlGeneric,\n specOf,\n type CommandFnResult,\n type CommandOpts,\n type IndexCacheStore,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { resolveGlob } from '../../../core/email/glob.ts'\nimport { read as emailRead } from '../../../core/email/read.ts'\nimport { fileReadProvision } from './provision.ts'\n\nasync function* emailStream(\n accessor: EmailAccessor,\n p: PathSpec,\n index: IndexCacheStore | undefined,\n): AsyncIterable<Uint8Array> {\n yield await emailRead(accessor, p, index)\n}\n\nasync function nlCommand(\n accessor: EmailAccessor,\n paths: PathSpec[],\n _texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const resolved =\n paths.length > 0 ? await resolveGlob(accessor, paths, opts.index ?? undefined) : []\n return nlGeneric(resolved, opts, (p) => emailStream(accessor, p, opts.index ?? undefined))\n}\n\nexport const EMAIL_NL = command({\n name: 'nl',\n resource: ResourceName.EMAIL,\n spec: specOf('nl'),\n fn: nlCommand,\n provision: fileReadProvision,\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 CommandSpec,\n IOResult,\n OperandKind,\n Option,\n ResourceName,\n command,\n type ByteSource,\n type CommandFnResult,\n type CommandOpts,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { fetchMessage } from '../../../core/email/_client.ts'\n\nconst ENC = new TextEncoder()\n\nconst SPEC = new CommandSpec({\n options: [\n new Option({ long: '--uid', valueKind: OperandKind.TEXT }),\n new Option({ long: '--folder', valueKind: OperandKind.TEXT }),\n ],\n})\n\nasync function emailReadCommand(\n accessor: EmailAccessor,\n _paths: PathSpec[],\n _texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const uid = typeof opts.flags.uid === 'string' ? opts.flags.uid : ''\n const folder = typeof opts.flags.folder === 'string' ? opts.flags.folder : ''\n if (uid === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--uid is required\\n') })]\n }\n if (folder === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--folder is required\\n') })]\n }\n const processed = await fetchMessage(accessor, folder, uid)\n const out: ByteSource = ENC.encode(JSON.stringify(processed))\n return [out, new IOResult()]\n}\n\nexport const EMAIL_READ = command({\n name: 'email-read',\n resource: ResourceName.EMAIL,\n spec: SPEC,\n fn: emailReadCommand,\n})\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { ResourceName, command, realpathGeneric, specOf } from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { stat as emailStat } from '../../../core/email/stat.ts'\n\nexport const EMAIL_REALPATH = command({\n name: 'realpath',\n resource: ResourceName.EMAIL,\n spec: specOf('realpath'),\n fn: (accessor: EmailAccessor, paths, texts, opts) =>\n realpathGeneric(paths, texts, opts, (p) => emailStat(accessor, p, opts.index ?? undefined)),\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 CommandSpec,\n IOResult,\n OperandKind,\n Option,\n ResourceName,\n command,\n type ByteSource,\n type CommandFnResult,\n type CommandOpts,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { fetchMessage } from '../../../core/email/_client.ts'\nimport { replyMessage } from '../../../core/email/send.ts'\n\nconst ENC = new TextEncoder()\n\nconst SPEC = new CommandSpec({\n options: [\n new Option({ long: '--uid', valueKind: OperandKind.TEXT }),\n new Option({ long: '--folder', valueKind: OperandKind.TEXT }),\n new Option({ long: '--body', valueKind: OperandKind.TEXT }),\n ],\n})\n\nasync function emailReplyCommand(\n accessor: EmailAccessor,\n _paths: PathSpec[],\n _texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const uid = typeof opts.flags.uid === 'string' ? opts.flags.uid : ''\n const folder = typeof opts.flags.folder === 'string' ? opts.flags.folder : ''\n const body = typeof opts.flags.body === 'string' ? opts.flags.body : ''\n if (uid === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--uid is required\\n') })]\n }\n if (folder === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--folder is required\\n') })]\n }\n if (body === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--body is required\\n') })]\n }\n const original = await fetchMessage(accessor, folder, uid)\n const result = await replyMessage(accessor.config, original, body)\n const out: ByteSource = ENC.encode(JSON.stringify(result))\n return [out, new IOResult()]\n}\n\nexport const EMAIL_REPLY = command({\n name: 'email-reply',\n resource: ResourceName.EMAIL,\n spec: SPEC,\n fn: emailReplyCommand,\n write: true,\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 CommandSpec,\n IOResult,\n OperandKind,\n Option,\n ResourceName,\n command,\n type ByteSource,\n type CommandFnResult,\n type CommandOpts,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { fetchMessage } from '../../../core/email/_client.ts'\nimport { replyAllMessage } from '../../../core/email/send.ts'\n\nconst ENC = new TextEncoder()\n\nconst SPEC = new CommandSpec({\n options: [\n new Option({ long: '--uid', valueKind: OperandKind.TEXT }),\n new Option({ long: '--folder', valueKind: OperandKind.TEXT }),\n new Option({ long: '--body', valueKind: OperandKind.TEXT }),\n ],\n})\n\nasync function emailReplyAllCommand(\n accessor: EmailAccessor,\n _paths: PathSpec[],\n _texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const uid = typeof opts.flags.uid === 'string' ? opts.flags.uid : ''\n const folder = typeof opts.flags.folder === 'string' ? opts.flags.folder : ''\n const body = typeof opts.flags.body === 'string' ? opts.flags.body : ''\n if (uid === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--uid is required\\n') })]\n }\n if (folder === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--folder is required\\n') })]\n }\n if (body === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--body is required\\n') })]\n }\n const original = await fetchMessage(accessor, folder, uid)\n const result = await replyAllMessage(accessor.config, original, body)\n const out: ByteSource = ENC.encode(JSON.stringify(result))\n return [out, new IOResult()]\n}\n\nexport const EMAIL_REPLY_ALL = command({\n name: 'email-reply-all',\n resource: ResourceName.EMAIL,\n spec: SPEC,\n fn: emailReplyAllCommand,\n write: true,\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 IOResult,\n ResourceName,\n command,\n compilePattern,\n grepLines,\n rgGeneric,\n specOf,\n type ByteSource,\n type CommandFnResult,\n type CommandOpts,\n type FileStat,\n type GrepLinesOptions,\n type IndexCacheStore,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { resolveGlob } from '../../../core/email/glob.ts'\nimport { read as emailRead } from '../../../core/email/read.ts'\nimport { readdir as emailReaddir } from '../../../core/email/readdir.ts'\nimport { stat as emailStat } from '../../../core/email/stat.ts'\nimport { detectScope } from '../../../core/email/scope.ts'\nimport { searchAndFormat } from '../../../core/email/search.ts'\n\nconst ENC = new TextEncoder()\n\nasync function* emailStream(\n accessor: EmailAccessor,\n p: PathSpec,\n index: IndexCacheStore | undefined,\n): AsyncIterable<Uint8Array> {\n yield await emailRead(accessor, p, index)\n}\n\nasync function rgCommand(\n accessor: EmailAccessor,\n paths: PathSpec[],\n texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n if (texts.length === 0 || texts[0] === undefined) {\n return [\n null,\n new IOResult({ exitCode: 2, stderr: ENC.encode('rg: usage: rg [flags] pattern [path]\\n') }),\n ]\n }\n const pattern = texts[0]\n const ignoreCase = opts.flags.i === true\n const invert = opts.flags.v === true\n const lineNumbers = opts.flags.n === true\n const countOnly = opts.flags.c === true\n const filesOnly = opts.flags.args_l === true || opts.flags.l === true\n const wholeWord = opts.flags.w === true\n const fixedString = opts.flags.F === true\n const onlyMatching = opts.flags.o === true\n const maxCount = typeof opts.flags.m === 'string' ? Number.parseInt(opts.flags.m, 10) : null\n const pat = compilePattern(pattern, ignoreCase, fixedString, wholeWord)\n\n const lineOpts: GrepLinesOptions = {\n invert,\n lineNumbers,\n countOnly,\n filesOnly,\n onlyMatching,\n maxCount,\n }\n\n if (paths.length > 0) {\n const first = paths[0]\n if (first !== undefined) {\n const scope = detectScope(first)\n if (scope.useNative) {\n const filePrefix = first.prefix !== '' ? first.prefix : ''\n const pairs = await searchAndFormat(accessor, scope, pattern, filePrefix, maxCount ?? 50)\n const lines: string[] = []\n for (const [vfsPath, msgText] of pairs) {\n const matched = grepLines(vfsPath, [msgText], pat, lineOpts)\n for (const line of matched) lines.push(`${vfsPath}:${line}`)\n }\n if (lines.length === 0) return [new Uint8Array(0), new IOResult({ exitCode: 1 })]\n const out: ByteSource = ENC.encode(lines.join('\\n') + '\\n')\n return [out, new IOResult()]\n }\n }\n }\n\n const resolved =\n paths.length > 0 ? await resolveGlob(accessor, paths, opts.index ?? undefined) : []\n const stat = (p: PathSpec): Promise<FileStat> => emailStat(accessor, p, opts.index ?? undefined)\n const readdir = (p: PathSpec): Promise<string[]> =>\n emailReaddir(accessor, p, opts.index ?? undefined)\n return rgGeneric(resolved, texts, opts, stat, readdir, (p) =>\n emailStream(accessor, p, opts.index ?? undefined),\n )\n}\n\nexport const EMAIL_RG = command({\n name: 'rg',\n resource: ResourceName.EMAIL,\n spec: specOf('rg'),\n fn: rgCommand,\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 CommandSpec,\n IOResult,\n OperandKind,\n Option,\n ResourceName,\n command,\n type ByteSource,\n type CommandFnResult,\n type CommandOpts,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { sendMessage } from '../../../core/email/send.ts'\n\nconst ENC = new TextEncoder()\n\nconst SPEC = new CommandSpec({\n options: [\n new Option({ long: '--to', valueKind: OperandKind.TEXT }),\n new Option({ long: '--subject', valueKind: OperandKind.TEXT }),\n new Option({ long: '--body', valueKind: OperandKind.TEXT }),\n ],\n})\n\nasync function emailSendCommand(\n accessor: EmailAccessor,\n _paths: PathSpec[],\n _texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const to = typeof opts.flags.to === 'string' ? opts.flags.to : ''\n const subject = typeof opts.flags.subject === 'string' ? opts.flags.subject : ''\n const body = typeof opts.flags.body === 'string' ? opts.flags.body : ''\n if (to === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--to is required\\n') })]\n }\n if (subject === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--subject is required\\n') })]\n }\n if (body === '') {\n return [null, new IOResult({ exitCode: 2, stderr: ENC.encode('--body is required\\n') })]\n }\n const result = await sendMessage(accessor.config, to, subject, body)\n const out: ByteSource = ENC.encode(JSON.stringify(result))\n return [out, new IOResult()]\n}\n\nexport const EMAIL_SEND = command({\n name: 'email-send',\n resource: ResourceName.EMAIL,\n spec: SPEC,\n fn: emailSendCommand,\n write: true,\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 ResourceName,\n command,\n specOf,\n statGeneric,\n type CommandFnResult,\n type CommandOpts,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { resolveGlob } from '../../../core/email/glob.ts'\nimport { stat as emailStat } from '../../../core/email/stat.ts'\nimport { metadataProvision } from './provision.ts'\n\nasync function statCommand(\n accessor: EmailAccessor,\n paths: PathSpec[],\n _texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const resolved =\n paths.length > 0 ? await resolveGlob(accessor, paths, opts.index ?? undefined) : []\n return statGeneric(resolved, opts, (p) => emailStat(accessor, p, opts.index ?? undefined))\n}\n\nexport const EMAIL_STAT = command({\n name: 'stat',\n resource: ResourceName.EMAIL,\n spec: specOf('stat'),\n fn: statCommand,\n provision: metadataProvision,\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 ResourceName,\n command,\n specOf,\n tailGeneric,\n type CommandFnResult,\n type CommandOpts,\n type IndexCacheStore,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { resolveGlob } from '../../../core/email/glob.ts'\nimport { read as emailRead } from '../../../core/email/read.ts'\nimport { fileReadProvision } from './provision.ts'\n\nasync function* emailStream(\n accessor: EmailAccessor,\n p: PathSpec,\n index: IndexCacheStore | undefined,\n): AsyncIterable<Uint8Array> {\n yield await emailRead(accessor, p, index)\n}\n\nasync function tailCommand(\n accessor: EmailAccessor,\n paths: PathSpec[],\n texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const resolved =\n paths.length > 0 ? await resolveGlob(accessor, paths, opts.index ?? undefined) : []\n return tailGeneric(resolved, texts, opts, (p) =>\n emailStream(accessor, p, opts.index ?? undefined),\n )\n}\n\nexport const EMAIL_TAIL = command({\n name: 'tail',\n resource: ResourceName.EMAIL,\n spec: specOf('tail'),\n fn: tailCommand,\n provision: fileReadProvision,\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 ResourceName,\n command,\n specOf,\n treeGeneric,\n type CommandFnResult,\n type CommandOpts,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { resolveGlob } from '../../../core/email/glob.ts'\nimport { readdir as emailReaddir } from '../../../core/email/readdir.ts'\nimport { stat as emailStat } from '../../../core/email/stat.ts'\n\nasync function treeCommand(\n accessor: EmailAccessor,\n paths: PathSpec[],\n _texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const resolved = await resolveGlob(accessor, paths, opts.index ?? undefined)\n return treeGeneric(\n resolved,\n opts,\n (p) => emailReaddir(accessor, p, opts.index ?? undefined),\n (p) => emailStat(accessor, p, opts.index ?? undefined),\n )\n}\n\nexport const EMAIL_TREE = command({\n name: 'tree',\n resource: ResourceName.EMAIL,\n spec: specOf('tree'),\n fn: treeCommand,\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 CommandSpec,\n IOResult,\n OperandKind,\n Option,\n ResourceName,\n command,\n type ByteSource,\n type CommandFnResult,\n type CommandOpts,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { fetchHeaders } from '../../../core/email/_client.ts'\nimport { searchMessages } from '../../../core/email/search.ts'\n\nconst ENC = new TextEncoder()\n\nconst SPEC = new CommandSpec({\n options: [\n new Option({ long: '--folder', valueKind: OperandKind.TEXT }),\n new Option({ long: '--max', valueKind: OperandKind.TEXT }),\n new Option({ long: '--unseen' }),\n new Option({ long: '--subject', valueKind: OperandKind.TEXT }),\n new Option({ long: '--from', valueKind: OperandKind.TEXT }),\n new Option({ long: '--to', valueKind: OperandKind.TEXT }),\n new Option({ long: '--body', valueKind: OperandKind.TEXT }),\n new Option({ long: '--since', valueKind: OperandKind.TEXT }),\n new Option({ long: '--before', valueKind: OperandKind.TEXT }),\n ],\n})\n\nasync function emailTriageCommand(\n accessor: EmailAccessor,\n _paths: PathSpec[],\n _texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const folder = typeof opts.flags.folder === 'string' ? opts.flags.folder : 'INBOX'\n const maxResults = typeof opts.flags.max === 'string' ? Number.parseInt(opts.flags.max, 10) : 20\n const uids = await searchMessages(\n accessor,\n folder,\n {\n text: typeof opts.flags.body === 'string' ? opts.flags.body : null,\n subject: typeof opts.flags.subject === 'string' ? opts.flags.subject : null,\n fromAddr: typeof opts.flags.from === 'string' ? opts.flags.from : null,\n toAddr: typeof opts.flags.to === 'string' ? opts.flags.to : null,\n since: typeof opts.flags.since === 'string' ? opts.flags.since : null,\n before: typeof opts.flags.before === 'string' ? opts.flags.before : null,\n unseen: opts.flags.unseen === true,\n },\n maxResults,\n )\n if (uids.length === 0) {\n const out: ByteSource = ENC.encode('[]')\n return [out, new IOResult()]\n }\n const headers = await fetchHeaders(accessor, folder, uids)\n const out: ByteSource = ENC.encode(JSON.stringify(headers))\n return [out, new IOResult()]\n}\n\nexport const EMAIL_TRIAGE = command({\n name: 'email-triage',\n resource: ResourceName.EMAIL,\n spec: SPEC,\n fn: emailTriageCommand,\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 ResourceName,\n command,\n specOf,\n wcGeneric,\n type CommandFnResult,\n type CommandOpts,\n type IndexCacheStore,\n type PathSpec,\n} from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../../accessor/email.ts'\nimport { resolveGlob } from '../../../core/email/glob.ts'\nimport { read as emailRead } from '../../../core/email/read.ts'\nimport { fileReadProvision } from './provision.ts'\n\nasync function* emailStream(\n accessor: EmailAccessor,\n p: PathSpec,\n index: IndexCacheStore | undefined,\n): AsyncIterable<Uint8Array> {\n yield await emailRead(accessor, p, index)\n}\n\nasync function wcCommand(\n accessor: EmailAccessor,\n paths: PathSpec[],\n texts: string[],\n opts: CommandOpts,\n): Promise<CommandFnResult> {\n const resolved =\n paths.length > 0 ? await resolveGlob(accessor, paths, opts.index ?? undefined) : []\n return wcGeneric(resolved, texts, opts, (p) => emailStream(accessor, p, opts.index ?? undefined))\n}\n\nexport const EMAIL_WC = command({\n name: 'wc',\n resource: ResourceName.EMAIL,\n spec: specOf('wc'),\n fn: wcCommand,\n provision: fileReadProvision,\n})\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { RegisteredCommand } from '@struktoai/mirage-core'\nimport { EMAIL_BASENAME } from './basename.ts'\nimport { EMAIL_CAT } from './cat.ts'\nimport { EMAIL_DIRNAME } from './dirname.ts'\nimport { EMAIL_FIND } from './find.ts'\nimport { EMAIL_FORWARD } from './email_forward.ts'\nimport { EMAIL_GREP } from './grep.ts'\nimport { EMAIL_HEAD } from './head.ts'\nimport { EMAIL_JQ } from './jq.ts'\nimport { EMAIL_LS } from './ls.ts'\nimport { EMAIL_NL } from './nl.ts'\nimport { EMAIL_READ } from './email_read.ts'\nimport { EMAIL_REALPATH } from './realpath.ts'\nimport { EMAIL_REPLY } from './email_reply.ts'\nimport { EMAIL_REPLY_ALL } from './email_reply_all.ts'\nimport { EMAIL_RG } from './rg.ts'\nimport { EMAIL_SEND } from './email_send.ts'\nimport { EMAIL_STAT } from './stat.ts'\nimport { EMAIL_TAIL } from './tail.ts'\nimport { EMAIL_TREE } from './tree.ts'\nimport { EMAIL_TRIAGE } from './email_triage.ts'\nimport { EMAIL_WC } from './wc.ts'\n\nexport const EMAIL_COMMANDS: readonly RegisteredCommand[] = [\n ...EMAIL_BASENAME,\n ...EMAIL_CAT,\n ...EMAIL_DIRNAME,\n ...EMAIL_FIND,\n ...EMAIL_GREP,\n ...EMAIL_HEAD,\n ...EMAIL_JQ,\n ...EMAIL_LS,\n ...EMAIL_NL,\n ...EMAIL_REALPATH,\n ...EMAIL_RG,\n ...EMAIL_STAT,\n ...EMAIL_TAIL,\n ...EMAIL_TREE,\n ...EMAIL_WC,\n ...EMAIL_SEND,\n ...EMAIL_REPLY,\n ...EMAIL_REPLY_ALL,\n ...EMAIL_FORWARD,\n ...EMAIL_TRIAGE,\n ...EMAIL_READ,\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 { OpKwargs, PathSpec, RegisteredOp } from '@struktoai/mirage-core'\nimport { ResourceName } from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../accessor/email.ts'\nimport { read as coreRead } from '../../core/email/read.ts'\n\nexport const readOp: RegisteredOp = {\n name: 'read',\n resource: ResourceName.EMAIL,\n filetype: null,\n write: false,\n fn: (accessor: EmailAccessor, path: PathSpec, _args: readonly unknown[], kwargs: OpKwargs) => {\n return coreRead(accessor, path, kwargs.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 { OpKwargs, PathSpec, RegisteredOp } from '@struktoai/mirage-core'\nimport { ResourceName } from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../accessor/email.ts'\nimport { readdir as coreReaddir } from '../../core/email/readdir.ts'\n\nexport const readdirOp: RegisteredOp = {\n name: 'readdir',\n resource: ResourceName.EMAIL,\n filetype: null,\n write: false,\n fn: (accessor: EmailAccessor, path: PathSpec, _args: readonly unknown[], kwargs: OpKwargs) => {\n return coreReaddir(accessor, path, kwargs.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 { OpKwargs, PathSpec, RegisteredOp } from '@struktoai/mirage-core'\nimport { ResourceName } from '@struktoai/mirage-core'\nimport type { EmailAccessor } from '../../accessor/email.ts'\nimport { stat as coreStat } from '../../core/email/stat.ts'\n\nexport const statOp: RegisteredOp = {\n name: 'stat',\n resource: ResourceName.EMAIL,\n filetype: null,\n write: false,\n fn: (accessor: EmailAccessor, path: PathSpec, _args: readonly unknown[], kwargs: OpKwargs) => {\n return coreStat(accessor, path, kwargs.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 { RegisteredOp } from '@struktoai/mirage-core'\nimport { readOp } from './read.ts'\nimport { readdirOp } from './readdir.ts'\nimport { statOp } from './stat.ts'\n\nexport const EMAIL_OPS: readonly RegisteredOp[] = [readdirOp, readOp, statOp] as const\nexport { readOp, readdirOp, statOp }\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nexport const EMAIL_PROMPT = `{prefix}\n <folder>/\n <yyyy-mm-dd>/\n <subject>__<uid>.email.json\n <subject>__<uid>/ # if attachments exist\n <attachment-filename>\n Folders include: INBOX, Sent, Drafts, etc. cat shows email as JSON.`\n\nexport const EMAIL_WRITE_PROMPT = ` Write commands:\n email-send \"to@email.com\" \"subject\" \"body\"\n email-reply <email-path> \"reply body\"\n email-forward <email-path> \"to@email.com\"`\n"],"mappings":"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","names":["PathSpec","ResourceName","ResourceName","command","specOf","PathSpecCtor","loadOptionalPeer","end","listFolders","listFolders","PathSpecCtor","stripSlash","enoent","uid","parts","folder","stripSlash","enoent","stripSlash","listFolders","command","ResourceName","specOf","ResourceName","command","specOf","ResourceName","command","specOf","rstripSlash","stripSlash","fnmatch","rstripSlash","stripSlash","command","ResourceName","specOf","IOResult","ResourceName","command","loadOptionalPeer","ENC","IOResult","command","ResourceName","IOResult","PathSpec","ResourceName","command","specOf","formatRecords","stripSlash","TITLE_MAX","UNSAFE","MULTI_UNDERSCORE","sanitize","dateFromHeader","ENC","IOResult","filePrefix","PathSpec","firstResolved","formatRecords","pat","data","source","stream","io","command","ResourceName","specOf","ResourceName","command","specOf","emailStream","command","ResourceName","specOf","ResourceName","command","specOf","emailStream","command","ResourceName","specOf","PathSpec","ResourceName","command","specOf","PathSpec","command","ResourceName","specOf","ResourceName","command","specOf","emailStream","command","ResourceName","specOf","CommandSpec","IOResult","OperandKind","Option","ResourceName","command","ENC","SPEC","CommandSpec","Option","OperandKind","IOResult","command","ResourceName","ResourceName","command","specOf","command","ResourceName","specOf","CommandSpec","IOResult","OperandKind","Option","ResourceName","command","ENC","SPEC","CommandSpec","Option","OperandKind","IOResult","command","ResourceName","CommandSpec","IOResult","OperandKind","Option","ResourceName","command","ENC","SPEC","CommandSpec","Option","OperandKind","IOResult","command","ResourceName","IOResult","ResourceName","command","compilePattern","grepLines","specOf","ENC","emailStream","IOResult","compilePattern","grepLines","stat","readdir","command","ResourceName","specOf","CommandSpec","IOResult","OperandKind","Option","ResourceName","command","ENC","SPEC","CommandSpec","Option","OperandKind","IOResult","command","ResourceName","ResourceName","command","specOf","command","ResourceName","specOf","ResourceName","command","specOf","emailStream","command","ResourceName","specOf","ResourceName","command","specOf","command","ResourceName","specOf","CommandSpec","IOResult","OperandKind","Option","ResourceName","command","ENC","SPEC","CommandSpec","Option","OperandKind","out","IOResult","command","ResourceName","ResourceName","command","specOf","emailStream","command","ResourceName","specOf","ResourceName","ResourceName","ResourceName","ResourceName","ResourceName","ResourceName","ResourceName","PathSpec"]}
@@ -19,7 +19,7 @@ import {
19
19
  } from "@struktoai/mirage-core";
20
20
  var DropboxResource = class extends BaseResource {
21
21
  kind = ResourceName.DROPBOX;
22
- isRemote = true;
22
+ cachesReads = true;
23
23
  indexTtl = 86400;
24
24
  prompt = DROPBOX_PROMPT;
25
25
  config;
@@ -86,4 +86,4 @@ var DropboxResource = class extends BaseResource {
86
86
  export {
87
87
  DropboxResource
88
88
  };
89
- //# sourceMappingURL=chunk-5YOCVEUB.js.map
89
+ //# sourceMappingURL=chunk-SWCDFEUK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/dropbox/dropbox.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n BaseResource,\n type FileStat,\n DROPBOX_COMMANDS,\n DROPBOX_PROMPT,\n DROPBOX_VFS_OPS,\n DropboxAccessor,\n DropboxTokenManager,\n PathSpec,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n ResourceName,\n dropboxRead,\n dropboxReaddir,\n dropboxResolveGlob,\n dropboxStat,\n} from '@struktoai/mirage-core'\nimport { redactDropboxConfig, type DropboxConfig, type DropboxConfigRedacted } from './config.ts'\n\nexport interface DropboxResourceState {\n type: string\n config: DropboxConfigRedacted\n}\n\nexport class DropboxResource extends BaseResource implements Resource {\n readonly kind: string = ResourceName.DROPBOX\n readonly cachesReads: boolean = true\n readonly indexTtl: number = 86_400\n readonly prompt: string = DROPBOX_PROMPT\n readonly config: DropboxConfig\n readonly accessor: DropboxAccessor\n\n constructor(config: DropboxConfig) {\n super()\n this.config = config\n const tm = new DropboxTokenManager({\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n refreshToken: config.refreshToken,\n ...(config.refreshFn !== undefined ? { refreshFn: config.refreshFn } : {}),\n })\n this.accessor = new DropboxAccessor({ tokenManager: tm })\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n close(): Promise<void> {\n return Promise.resolve()\n }\n\n commands(): readonly RegisteredCommand[] {\n return DROPBOX_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return DROPBOX_VFS_OPS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return dropboxRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return dropboxReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return dropboxStat(this.accessor, p, this.index)\n }\n\n async fingerprint(p: PathSpec): Promise<string | null> {\n const lookup = await this.index.get(p.original)\n return lookup.entry?.remoteTime ?? null\n }\n\n glob(paths: readonly PathSpec[], prefix = ''): Promise<PathSpec[]> {\n const effective =\n prefix !== ''\n ? paths.map((p) =>\n p.prefix !== ''\n ? p\n : new PathSpec({\n original: p.original,\n directory: p.directory,\n ...(p.pattern !== null ? { pattern: p.pattern } : {}),\n resolved: p.resolved,\n prefix,\n }),\n )\n : paths\n return dropboxResolveGlob(this.accessor, effective, this.index)\n }\n\n getState(): Promise<DropboxResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactDropboxConfig(this.config),\n })\n }\n\n loadState(_state: DropboxResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n"],"mappings":";;;;;AAcA;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAQA,IAAM,kBAAN,cAA8B,aAAiC;AAAA,EAC3D,OAAe,aAAa;AAAA,EAC5B,cAAuB;AAAA,EACvB,WAAmB;AAAA,EACnB,SAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EAET,YAAY,QAAuB;AACjC,UAAM;AACN,SAAK,SAAS;AACd,UAAM,KAAK,IAAI,oBAAoB;AAAA,MACjC,UAAU,OAAO;AAAA,MACjB,cAAc,OAAO;AAAA,MACrB,cAAc,OAAO;AAAA,MACrB,GAAI,OAAO,cAAc,SAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,IAC1E,CAAC;AACD,SAAK,WAAW,IAAI,gBAAgB,EAAE,cAAc,GAAG,CAAC;AAAA,EAC1D;AAAA,EAEA,OAAsB;AACpB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,QAAuB;AACrB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,WAAyC;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,MAA+B;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,GAAkC;AACzC,WAAO,YAAY,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACjD;AAAA,EAEA,QAAQ,GAAgC;AACtC,WAAO,eAAe,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACpD;AAAA,EAEA,KAAK,GAAgC;AACnC,WAAO,YAAY,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACjD;AAAA,EAEA,MAAM,YAAY,GAAqC;AACrD,UAAM,SAAS,MAAM,KAAK,MAAM,IAAI,EAAE,QAAQ;AAC9C,WAAO,OAAO,OAAO,cAAc;AAAA,EACrC;AAAA,EAEA,KAAK,OAA4B,SAAS,IAAyB;AACjE,UAAM,YACJ,WAAW,KACP,MAAM;AAAA,MAAI,CAAC,MACT,EAAE,WAAW,KACT,IACA,IAAI,SAAS;AAAA,QACX,UAAU,EAAE;AAAA,QACZ,WAAW,EAAE;AAAA,QACb,GAAI,EAAE,YAAY,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,QACnD,UAAU,EAAE;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACP,IACA;AACN,WAAO,mBAAmB,KAAK,UAAU,WAAW,KAAK,KAAK;AAAA,EAChE;AAAA,EAEA,WAA0C;AACxC,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,oBAAoB,KAAK,MAAM;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,QAA6C;AACrD,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -34,7 +34,7 @@ import {
34
34
  } from "@struktoai/mirage-core";
35
35
  var S3Resource = class extends BaseResource {
36
36
  kind = ResourceName.S3;
37
- isRemote = true;
37
+ cachesReads = true;
38
38
  supportsSnapshot = true;
39
39
  indexTtl = 600;
40
40
  prompt = S3_PROMPT;
@@ -181,4 +181,4 @@ var S3Resource = class extends BaseResource {
181
181
  export {
182
182
  S3Resource
183
183
  };
184
- //# sourceMappingURL=chunk-MHCMHKM6.js.map
184
+ //# sourceMappingURL=chunk-TA3WMOMU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resource/s3/s3.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n BaseResource,\n copy as copyCore,\n create as createCore,\n du as duCore,\n duAll as duAllCore,\n exists as existsCore,\n type FileStat,\n type FindOptions,\n find as findCore,\n mkdir as mkdirCore,\n normalizeKeyPrefix,\n PathSpec,\n rangeRead as rangeReadCore,\n S3_COMMANDS,\n read as readCore,\n readdir as readdirCore,\n type RegisteredCommand,\n type RegisteredOp,\n rename as renameCore,\n type Resource,\n ResourceName,\n resolveS3Glob as globCore,\n rmR as rmRCore,\n rmdir as rmdirCore,\n S3_OPS,\n S3_PROMPT,\n S3Accessor,\n stat as statCore,\n stream as streamCore,\n truncate as truncateCore,\n unlink as unlinkCore,\n write as writeCore,\n} from '@struktoai/mirage-core'\nimport { redactConfig, type S3Config, type S3ConfigRedacted } from './config.ts'\n\nexport interface S3ResourceState {\n type: string\n config: S3ConfigRedacted\n}\n\nexport class S3Resource extends BaseResource implements Resource {\n readonly kind: string = ResourceName.S3\n readonly cachesReads: boolean = true\n readonly supportsSnapshot: boolean = true\n readonly indexTtl: number = 600\n readonly prompt: string = S3_PROMPT\n readonly config: S3Config\n readonly accessor: S3Accessor\n readonly opsMap: Record<string, unknown> = {\n read_bytes: readCore,\n write: writeCore,\n readdir: readdirCore,\n stat: statCore,\n unlink: unlinkCore,\n rmdir: rmdirCore,\n copy: copyCore,\n rename: renameCore,\n mkdir: mkdirCore,\n read_stream: streamCore,\n range_read: rangeReadCore,\n rm_recursive: rmRCore,\n du_total: duCore,\n du_all: duAllCore,\n create: createCore,\n truncate: truncateCore,\n exists: existsCore,\n find_flat: findCore,\n }\n\n constructor(config: S3Config) {\n super()\n const normalized = normalizeKeyPrefix(config.keyPrefix)\n const cfg: S3Config = { ...config }\n if (normalized !== undefined) {\n cfg.keyPrefix = normalized\n } else {\n delete cfg.keyPrefix\n }\n this.config = cfg\n this.accessor = new S3Accessor(this.config)\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n close(): Promise<void> {\n return Promise.resolve()\n }\n\n commands(): readonly RegisteredCommand[] {\n return S3_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return S3_OPS\n }\n\n streamPath(p: PathSpec): AsyncIterable<Uint8Array> {\n return streamCore(this.accessor, p)\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return readCore(this.accessor, p)\n }\n\n writeFile(p: PathSpec, data: Uint8Array): Promise<void> {\n return writeCore(this.accessor, p, data)\n }\n\n async appendFile(p: PathSpec, data: Uint8Array): Promise<void> {\n let existing: Uint8Array\n try {\n existing = await readCore(this.accessor, p)\n } catch (err) {\n if ((err as { code?: string } | null)?.code === 'ENOENT') {\n existing = new Uint8Array()\n } else {\n throw err\n }\n }\n const merged = new Uint8Array(existing.byteLength + data.byteLength)\n merged.set(existing, 0)\n merged.set(data, existing.byteLength)\n await writeCore(this.accessor, p, merged)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return readdirCore(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return statCore(this.accessor, p)\n }\n\n exists(p: PathSpec): Promise<boolean> {\n return existsCore(this.accessor, p)\n }\n\n mkdir(p: PathSpec): Promise<void> {\n return mkdirCore(this.accessor, p)\n }\n\n rmdir(p: PathSpec): Promise<void> {\n return rmdirCore(this.accessor, p)\n }\n\n unlink(p: PathSpec): Promise<void> {\n return unlinkCore(this.accessor, p)\n }\n\n rename(src: PathSpec, dst: PathSpec): Promise<void> {\n return renameCore(this.accessor, src, dst)\n }\n\n truncate(p: PathSpec, length: number): Promise<void> {\n return truncateCore(this.accessor, p, length)\n }\n\n copy(src: PathSpec, dst: PathSpec): Promise<void> {\n return copyCore(this.accessor, src, dst)\n }\n\n rmR(p: PathSpec): Promise<void> {\n return rmRCore(this.accessor, p)\n }\n\n du(p: PathSpec): Promise<number> {\n return duCore(this.accessor, p)\n }\n\n find(p: PathSpec, options: FindOptions = {}): Promise<string[]> {\n return findCore(this.accessor, p, options)\n }\n\n glob(paths: readonly PathSpec[], prefix = ''): Promise<PathSpec[]> {\n const effective = prefix\n ? paths.map((p) =>\n p.prefix\n ? p\n : new PathSpec({\n original: p.original,\n directory: p.directory,\n ...(p.pattern !== null ? { pattern: p.pattern } : {}),\n resolved: p.resolved,\n prefix,\n }),\n )\n : paths\n return globCore(this.accessor, effective, this.index)\n }\n\n async fingerprint(p: PathSpec): Promise<string | null> {\n try {\n const s = await statCore(this.accessor, p)\n const etag = (s.extra as { etag?: unknown }).etag\n return typeof etag === 'string' && etag !== '' ? etag : null\n } catch (err) {\n if ((err as { code?: string } | null)?.code === 'ENOENT') return null\n throw err\n }\n }\n\n getState(): Promise<S3ResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactConfig(this.config),\n })\n }\n\n loadState(_state: S3ResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n"],"mappings":"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","names":[]}