@wirecat/mail-cli 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/CHANGELOG.md +149 -0
  2. package/README.md +48 -13
  3. package/dist/bin/mail.js +2 -2
  4. package/dist/bundle/{all-profiles-GR5JXYEQ.js → all-profiles-SI67TKZM.js} +9 -9
  5. package/dist/bundle/{anthropic-REBXE65F.js → anthropic-DALMLC3Y.js} +6 -6
  6. package/dist/bundle/{app-server-QJ7ICQXZ.js → app-server-XOH327Z2.js} +46 -46
  7. package/dist/bundle/{bun-WAX4QHW5.js → bun-ORL67CJ6.js} +2 -2
  8. package/dist/bundle/{bun-sqlite-5S7TQ4SG.js → bun-sqlite-DGXFNFHI.js} +5 -5
  9. package/dist/bundle/{chunk-ZD3WUGR2.js → chunk-23IEVVL2.js} +4 -4
  10. package/dist/bundle/{chunk-B5WSIWY5.js → chunk-2M4K7HYR.js} +17 -17
  11. package/dist/bundle/{chunk-IWDOGGMY.js → chunk-35KD2CI2.js} +501 -301
  12. package/dist/bundle/{chunk-7A7BHABA.js → chunk-3GZK5GTU.js} +1 -1
  13. package/dist/bundle/{chunk-JJBQPA7D.js → chunk-3TYEJRMZ.js} +4 -4
  14. package/dist/bundle/{chunk-M6BDHZON.js → chunk-45KA5667.js} +26 -13
  15. package/dist/bundle/{chunk-LOA4X6JW.js → chunk-4NYWHINR.js} +6 -6
  16. package/dist/bundle/{dist-KJOAJ6NF.js → chunk-4ULY3GDL.js} +16 -116
  17. package/dist/bundle/{chunk-2FXVBCA3.js → chunk-5BSEGMNE.js} +4 -4
  18. package/dist/bundle/{chunk-HCMUGUAG.js → chunk-5JEYIHS6.js} +3 -3
  19. package/dist/bundle/{chunk-QXOSGGKS.js → chunk-6LK7KTWB.js} +1 -1
  20. package/dist/bundle/{chunk-ESNNQA7D.js → chunk-6RMMAUUW.js} +28 -28
  21. package/dist/bundle/{chunk-VXAZZGXE.js → chunk-6XNPXAJU.js} +33 -27
  22. package/dist/bundle/{chunk-5INWLYBD.js → chunk-73OJJGZE.js} +14 -3
  23. package/dist/bundle/{chunk-4XJ4AM3K.js → chunk-7K6KJWTO.js} +12 -12
  24. package/dist/bundle/{chunk-KIDF77MA.js → chunk-AP7V256W.js} +1 -1
  25. package/dist/bundle/{chunk-4BMNP2FT.js → chunk-BEMLGWY4.js} +1 -1
  26. package/dist/bundle/{chunk-BFJV4FWJ.js → chunk-BGUMGCUY.js} +2 -2
  27. package/dist/bundle/{chunk-5BVIWP3S.js → chunk-BM445GYF.js} +2 -2
  28. package/dist/bundle/{chunk-F3NYA4KN.js → chunk-CAKBG5FC.js} +6 -6
  29. package/dist/bundle/{chunk-EB3R2PV3.js → chunk-DKQWTQVY.js} +23 -23
  30. package/dist/bundle/{chunk-6TY3DGCC.js → chunk-DXGMPMFP.js} +4 -4
  31. package/dist/bundle/{chunk-LFRHIXCF.js → chunk-E3DRM6YP.js} +3 -3
  32. package/dist/bundle/{chunk-FSUNGHRI.js → chunk-EYT33MM3.js} +47 -46
  33. package/dist/bundle/{chunk-DXDQOZ2P.js → chunk-FPOGVDLS.js} +2 -2
  34. package/dist/bundle/{chunk-S677WGOQ.js → chunk-FTFNWGIR.js} +8 -8
  35. package/dist/bundle/{chunk-TI6VBZKJ.js → chunk-FUB3X25H.js} +4 -4
  36. package/dist/bundle/{chunk-7JCRQX56.js → chunk-GJUUTUK4.js} +8 -8
  37. package/dist/bundle/{chunk-BLS5YG77.js → chunk-HFJNEXU7.js} +2 -2
  38. package/dist/bundle/{chunk-YKPBC3NL.js → chunk-HV3EIYX4.js} +1 -1
  39. package/dist/bundle/{chunk-EL554DV2.js → chunk-IYZHM3ZN.js} +3 -3
  40. package/dist/bundle/{chunk-6EO7GVYJ.js → chunk-JFMUI4H6.js} +1 -1
  41. package/dist/bundle/{chunk-2YQNBIDQ.js → chunk-LZ5J3UXD.js} +4 -4
  42. package/dist/bundle/{chunk-WNCCYHRV.js → chunk-M2JCUVCJ.js} +116 -95
  43. package/dist/bundle/{chunk-7F3NDIYL.js → chunk-MCJ7LKYR.js} +6 -6
  44. package/dist/bundle/{chunk-VDAIJM5L.js → chunk-MHQKHWCJ.js} +88 -34
  45. package/dist/bundle/{chunk-SQ7KOBRA.js → chunk-MMXMVGA6.js} +10 -8
  46. package/dist/bundle/{chunk-AFCGOZR7.js → chunk-NNIXREJH.js} +7 -7
  47. package/dist/bundle/{chunk-LQ37ALDJ.js → chunk-NXJLC2WK.js} +8 -8
  48. package/dist/bundle/{chunk-6GE3EADU.js → chunk-OHTR4WFO.js} +2 -2
  49. package/dist/bundle/{chunk-PJCTWPJB.js → chunk-PDL4UREY.js} +8 -8
  50. package/dist/bundle/{chunk-J3QXTBD2.js → chunk-Q2C3VMSU.js} +20 -18
  51. package/dist/bundle/{chunk-SWJAG5IE.js → chunk-Q44AYEOB.js} +2 -2
  52. package/dist/bundle/{chunk-P7P5MNAU.js → chunk-QZBT6BOU.js} +1 -1
  53. package/dist/bundle/{chunk-IBYTYIYO.js → chunk-R5MML3FC.js} +61 -54
  54. package/dist/bundle/{chunk-CEAANMJ2.js → chunk-RQVWZBW3.js} +3 -3
  55. package/dist/bundle/{chunk-5CXAH4Y6.js → chunk-S4YUR4S3.js} +656 -572
  56. package/dist/bundle/{chunk-QX7RCLRS.js → chunk-SQLCCKEL.js} +1 -1
  57. package/dist/bundle/chunk-U6UJ3HRS.js +58 -0
  58. package/dist/bundle/{chunk-YRGBZZUW.js → chunk-V4TDG4KF.js} +14 -14
  59. package/dist/bundle/{chunk-5FK6RD4M.js → chunk-VBOMKZ4E.js} +73 -57
  60. package/dist/bundle/{chunk-MQUJEQTU.js → chunk-VKPWP3AK.js} +2 -2
  61. package/dist/bundle/{chunk-7XNPSIWD.js → chunk-VNJMO5F6.js} +2 -2
  62. package/dist/bundle/{chunk-MMDCL42A.js → chunk-VSHJWTX5.js} +12 -6
  63. package/dist/bundle/{chunk-2MRECWJZ.js → chunk-XQJWMBDY.js} +6 -6
  64. package/dist/bundle/{chunk-2U4IANVV.js → chunk-ZKCNMW7G.js} +2 -2
  65. package/dist/bundle/{chunk-LNS27BTB.js → chunk-ZKZABB4K.js} +3 -3
  66. package/dist/bundle/{chunk-WNI5BZFB.js → chunk-ZNGQ3NZ4.js} +9 -9
  67. package/dist/bundle/command-contract-CB5BII3S.js +34 -0
  68. package/dist/bundle/{decode-D7BDVIVB.js → decode-KOBURZIQ.js} +5 -5
  69. package/dist/bundle/{dispatch-EUKKT3PD.js → dispatch-GDAH4JHS.js} +8 -8
  70. package/dist/bundle/dist-T7HMT675.js +134 -0
  71. package/dist/bundle/{echarts-IVRX7XHP.js → echarts-LEWTQO6H.js} +2 -2
  72. package/dist/bundle/{embed-X527RBTG.js → embed-PUFE4BSQ.js} +6 -6
  73. package/dist/bundle/{embedder-F4PSJS6S.js → embedder-3G4BQQ6X.js} +9 -9
  74. package/dist/bundle/{failure-OAIC5VAP.js → failure-6COJAO7T.js} +2 -2
  75. package/dist/bundle/{first-run-M5CIX6NA.js → first-run-FLXOC53U.js} +11 -11
  76. package/dist/bundle/first-screen-VUZEDSQW.js +32 -0
  77. package/dist/bundle/{instructions-UX36BT5F.js → instructions-HGSXDCBT.js} +1 -1
  78. package/dist/bundle/mail.js +12 -11
  79. package/dist/bundle/{mcp-L7SRVDRN.js → mcp-GAPDLFWA.js} +2 -2
  80. package/dist/bundle/{node-OXT7WE2T.js → node-5Z7PS4F5.js} +2 -2
  81. package/dist/bundle/{node-sqlite-X2PSEHA4.js → node-sqlite-OAW7APIX.js} +5 -5
  82. package/dist/bundle/{oauth-MYK4BSYN.js → oauth-ZFZWPAJN.js} +7 -7
  83. package/dist/bundle/{open-GONIP2DH.js → open-ZQMBZVH4.js} +4 -4
  84. package/dist/bundle/{openai-YJFNUOQT.js → openai-XT2RIXAK.js} +14 -14
  85. package/dist/bundle/{process-7IEUUSRK.js → process-VVEQIHPE.js} +1 -1
  86. package/dist/bundle/{program-Q73TTG3E.js → program-RD3BBDNY.js} +21470 -7075
  87. package/dist/bundle/{prompt-SKQ72KN7.js → prompt-PU7GE4Z4.js} +5 -5
  88. package/dist/bundle/{recognize-GC7CU2DB.js → recognize-AG4A3KUK.js} +4 -4
  89. package/dist/bundle/{remote-UEXFZP2I.js → remote-D6TQ6T7F.js} +7 -7
  90. package/dist/bundle/{rerank-2U2NDEZP.js → rerank-GO24HJPF.js} +7 -7
  91. package/dist/bundle/{serve-OOGKFEWL.js → serve-WCHJAH6G.js} +9 -9
  92. package/dist/bundle/server-5KJJ3D6P.js +63 -0
  93. package/dist/bundle/{server-FZ3LFQTF.js → server-CAVNBG3P.js} +38 -38
  94. package/dist/bundle/{sqlite-runtime-GIQSW6LJ.js → sqlite-runtime-ANXC4AW2.js} +5 -5
  95. package/dist/bundle/{state-EMFXPQVZ.js → state-EGJ66A62.js} +6 -6
  96. package/dist/bundle/{store-BDU4UPNK.js → store-OON7FCMQ.js} +15 -15
  97. package/dist/bundle/{store-LDI62AUG.js → store-SBFA444C.js} +13 -13
  98. package/dist/bundle/store-maintenance-command-UEOJLYMJ.js +52 -0
  99. package/dist/commands/attachments.d.ts +3 -0
  100. package/dist/commands/attachments.d.ts.map +1 -0
  101. package/dist/commands/attachments.js +97 -0
  102. package/dist/commands/attachments.js.map +1 -0
  103. package/dist/commands/context.d.ts +21 -6
  104. package/dist/commands/context.d.ts.map +1 -1
  105. package/dist/commands/context.js +58 -7
  106. package/dist/commands/context.js.map +1 -1
  107. package/dist/commands/drafts-send.d.ts +7 -0
  108. package/dist/commands/drafts-send.d.ts.map +1 -0
  109. package/dist/commands/drafts-send.js +58 -0
  110. package/dist/commands/drafts-send.js.map +1 -0
  111. package/dist/commands/drafts.d.ts +3 -0
  112. package/dist/commands/drafts.d.ts.map +1 -0
  113. package/dist/commands/drafts.js +243 -0
  114. package/dist/commands/drafts.js.map +1 -0
  115. package/dist/commands/export.d.ts +3 -0
  116. package/dist/commands/export.d.ts.map +1 -0
  117. package/dist/commands/export.js +278 -0
  118. package/dist/commands/export.js.map +1 -0
  119. package/dist/commands/folders.d.ts.map +1 -1
  120. package/dist/commands/folders.js +120 -2
  121. package/dist/commands/folders.js.map +1 -1
  122. package/dist/commands/messages.d.ts +25 -0
  123. package/dist/commands/messages.d.ts.map +1 -0
  124. package/dist/commands/messages.js +506 -0
  125. package/dist/commands/messages.js.map +1 -0
  126. package/dist/commands/read.d.ts +4 -1
  127. package/dist/commands/read.d.ts.map +1 -1
  128. package/dist/commands/read.js +14 -3
  129. package/dist/commands/read.js.map +1 -1
  130. package/dist/commands/rules.d.ts +3 -0
  131. package/dist/commands/rules.d.ts.map +1 -0
  132. package/dist/commands/rules.js +292 -0
  133. package/dist/commands/rules.js.map +1 -0
  134. package/dist/commands/send.d.ts +39 -0
  135. package/dist/commands/send.d.ts.map +1 -0
  136. package/dist/commands/send.js +309 -0
  137. package/dist/commands/send.js.map +1 -0
  138. package/dist/commands/server-search.d.ts +8 -0
  139. package/dist/commands/server-search.d.ts.map +1 -0
  140. package/dist/commands/server-search.js +38 -0
  141. package/dist/commands/server-search.js.map +1 -0
  142. package/dist/commands/session-start.d.ts.map +1 -1
  143. package/dist/commands/session-start.js +107 -10
  144. package/dist/commands/session-start.js.map +1 -1
  145. package/dist/commands/session.d.ts.map +1 -1
  146. package/dist/commands/session.js +72 -9
  147. package/dist/commands/session.js.map +1 -1
  148. package/dist/commands/stats.d.ts +3 -0
  149. package/dist/commands/stats.d.ts.map +1 -0
  150. package/dist/commands/stats.js +89 -0
  151. package/dist/commands/stats.js.map +1 -0
  152. package/dist/commands/status.js +2 -2
  153. package/dist/commands/status.js.map +1 -1
  154. package/dist/commands/sync.d.ts +6 -0
  155. package/dist/commands/sync.d.ts.map +1 -1
  156. package/dist/commands/sync.js +28 -20
  157. package/dist/commands/sync.js.map +1 -1
  158. package/dist/commands/tags.d.ts +3 -0
  159. package/dist/commands/tags.d.ts.map +1 -0
  160. package/dist/commands/tags.js +144 -0
  161. package/dist/commands/tags.js.map +1 -0
  162. package/dist/config.d.ts +15 -0
  163. package/dist/config.d.ts.map +1 -1
  164. package/dist/config.js +52 -1
  165. package/dist/config.js.map +1 -1
  166. package/dist/export/format.d.ts +19 -0
  167. package/dist/export/format.d.ts.map +1 -0
  168. package/dist/export/format.js +40 -0
  169. package/dist/export/format.js.map +1 -0
  170. package/dist/export/journal.d.ts +32 -0
  171. package/dist/export/journal.d.ts.map +1 -0
  172. package/dist/export/journal.js +84 -0
  173. package/dist/export/journal.js.map +1 -0
  174. package/dist/export/write.d.ts +14 -0
  175. package/dist/export/write.d.ts.map +1 -0
  176. package/dist/export/write.js +42 -0
  177. package/dist/export/write.js.map +1 -0
  178. package/dist/identity.d.ts.map +1 -1
  179. package/dist/identity.js +3 -0
  180. package/dist/identity.js.map +1 -1
  181. package/dist/mail/backend.d.ts +104 -2
  182. package/dist/mail/backend.d.ts.map +1 -1
  183. package/dist/mail/backend.js +4 -1
  184. package/dist/mail/backend.js.map +1 -1
  185. package/dist/mail/changes.d.ts +91 -0
  186. package/dist/mail/changes.d.ts.map +1 -0
  187. package/dist/mail/changes.js +198 -0
  188. package/dist/mail/changes.js.map +1 -0
  189. package/dist/mail/cleanup.d.ts +41 -0
  190. package/dist/mail/cleanup.d.ts.map +1 -0
  191. package/dist/mail/cleanup.js +119 -0
  192. package/dist/mail/cleanup.js.map +1 -0
  193. package/dist/mail/compose.d.ts +73 -0
  194. package/dist/mail/compose.d.ts.map +1 -0
  195. package/dist/mail/compose.js +110 -0
  196. package/dist/mail/compose.js.map +1 -0
  197. package/dist/mail/doctor.d.ts +67 -0
  198. package/dist/mail/doctor.d.ts.map +1 -0
  199. package/dist/mail/doctor.js +115 -0
  200. package/dist/mail/doctor.js.map +1 -0
  201. package/dist/mail/drafts.d.ts +54 -0
  202. package/dist/mail/drafts.d.ts.map +1 -0
  203. package/dist/mail/drafts.js +104 -0
  204. package/dist/mail/drafts.js.map +1 -0
  205. package/dist/mail/imap/connection.d.ts +13 -3
  206. package/dist/mail/imap/connection.d.ts.map +1 -1
  207. package/dist/mail/imap/connection.js +87 -18
  208. package/dist/mail/imap/connection.js.map +1 -1
  209. package/dist/mail/imap/index.d.ts +3 -3
  210. package/dist/mail/imap/index.d.ts.map +1 -1
  211. package/dist/mail/imap/index.js +14 -4
  212. package/dist/mail/imap/index.js.map +1 -1
  213. package/dist/mail/imap/messages.d.ts +5 -6
  214. package/dist/mail/imap/messages.d.ts.map +1 -1
  215. package/dist/mail/imap/messages.js +14 -28
  216. package/dist/mail/imap/messages.js.map +1 -1
  217. package/dist/mail/imap/read.d.ts.map +1 -1
  218. package/dist/mail/imap/read.js +27 -13
  219. package/dist/mail/imap/read.js.map +1 -1
  220. package/dist/mail/imap/search.d.ts +14 -0
  221. package/dist/mail/imap/search.d.ts.map +1 -0
  222. package/dist/mail/imap/search.js +55 -0
  223. package/dist/mail/imap/search.js.map +1 -0
  224. package/dist/mail/imap/write.d.ts +5 -0
  225. package/dist/mail/imap/write.d.ts.map +1 -0
  226. package/dist/mail/imap/write.js +93 -0
  227. package/dist/mail/imap/write.js.map +1 -0
  228. package/dist/mail/organise.d.ts +116 -0
  229. package/dist/mail/organise.d.ts.map +1 -0
  230. package/dist/mail/organise.js +531 -0
  231. package/dist/mail/organise.js.map +1 -0
  232. package/dist/mail/rethread.d.ts +1 -2
  233. package/dist/mail/rethread.d.ts.map +1 -1
  234. package/dist/mail/rethread.js +8 -3
  235. package/dist/mail/rethread.js.map +1 -1
  236. package/dist/mail/rules/apply.d.ts +40 -0
  237. package/dist/mail/rules/apply.d.ts.map +1 -0
  238. package/dist/mail/rules/apply.js +114 -0
  239. package/dist/mail/rules/apply.js.map +1 -0
  240. package/dist/mail/rules/file.d.ts +9 -0
  241. package/dist/mail/rules/file.d.ts.map +1 -0
  242. package/dist/mail/rules/file.js +51 -0
  243. package/dist/mail/rules/file.js.map +1 -0
  244. package/dist/mail/rules/filters.d.ts +11 -0
  245. package/dist/mail/rules/filters.d.ts.map +1 -0
  246. package/dist/mail/rules/filters.js +150 -0
  247. package/dist/mail/rules/filters.js.map +1 -0
  248. package/dist/mail/rules/folders.d.ts +11 -0
  249. package/dist/mail/rules/folders.d.ts.map +1 -0
  250. package/dist/mail/rules/folders.js +17 -0
  251. package/dist/mail/rules/folders.js.map +1 -0
  252. package/dist/mail/rules/query.d.ts +15 -0
  253. package/dist/mail/rules/query.d.ts.map +1 -0
  254. package/dist/mail/rules/query.js +103 -0
  255. package/dist/mail/rules/query.js.map +1 -0
  256. package/dist/mail/rules/store.d.ts +9 -0
  257. package/dist/mail/rules/store.d.ts.map +1 -0
  258. package/dist/mail/rules/store.js +17 -0
  259. package/dist/mail/rules/store.js.map +1 -0
  260. package/dist/mail/save.d.ts +9 -0
  261. package/dist/mail/save.d.ts.map +1 -0
  262. package/dist/mail/save.js +50 -0
  263. package/dist/mail/save.js.map +1 -0
  264. package/dist/mail/send.d.ts +67 -0
  265. package/dist/mail/send.d.ts.map +1 -0
  266. package/dist/mail/send.js +173 -0
  267. package/dist/mail/send.js.map +1 -0
  268. package/dist/mail/smtp.d.ts +4 -0
  269. package/dist/mail/smtp.d.ts.map +1 -0
  270. package/dist/mail/smtp.js +133 -0
  271. package/dist/mail/smtp.js.map +1 -0
  272. package/dist/oauth.d.ts +74 -0
  273. package/dist/oauth.d.ts.map +1 -0
  274. package/dist/oauth.js +230 -0
  275. package/dist/oauth.js.map +1 -0
  276. package/dist/program.d.ts.map +1 -1
  277. package/dist/program.js +26 -4
  278. package/dist/program.js.map +1 -1
  279. package/dist/providers.d.ts +96 -9
  280. package/dist/providers.d.ts.map +1 -1
  281. package/dist/providers.js +69 -16
  282. package/dist/providers.js.map +1 -1
  283. package/dist/reasons.d.ts +9 -0
  284. package/dist/reasons.d.ts.map +1 -0
  285. package/dist/reasons.js +27 -0
  286. package/dist/reasons.js.map +1 -0
  287. package/dist/version.d.ts +1 -1
  288. package/dist/version.js +1 -1
  289. package/package.json +7 -5
  290. package/skills/mail-cli/SKILL.md +30 -3
  291. package/dist/bundle/chunk-YD5WV757.js +0 -27
  292. package/dist/bundle/command-contract-GPUED3GT.js +0 -34
  293. package/dist/bundle/first-screen-M7MT776O.js +0 -32
  294. package/dist/bundle/server-4JMHDHZ7.js +0 -63
  295. package/dist/bundle/store-maintenance-command-OFRPORN2.js +0 -52
  296. /package/dist/bundle/{chunk-NPGVOZVK.js → chunk-WJWLHLQ7.js} +0 -0
package/dist/oauth.js ADDED
@@ -0,0 +1,230 @@
1
+ import { spawn } from "node:child_process";
2
+ import { mkdirSync, readFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { CliError, isMovedRun, resolvePaths, systemKeyring } from "@wirecat/cli-base";
5
+ import { privateFiles } from "@wirecat/cli-core/cli";
6
+ import { writeFileAtomic } from "@wirecat/cli-core/files";
7
+ import { credentialStorage, oauthAccount, standardCodec, tokenKeeper, } from "@wirecat/cli-core/oauth";
8
+ import * as v from "valibot";
9
+ import { IDENTITY } from "./identity.js";
10
+ /**
11
+ * WireCat's Microsoft app: a public client for any Entra tenant and personal accounts. Empty until WireCat registers
12
+ * it (docs/oauth-microsoft.md); until then a sign-in needs `microsoft_client_id` in the config.
13
+ */
14
+ export const WIRECAT_MICROSOFT_CLIENT_ID = "";
15
+ export const OAUTH_GUIDE = "https://github.com/WireCatLabs/mail-cli/blob/main/docs/oauth-microsoft.md";
16
+ export const MICROSOFT_IMAP_SCOPE = "https://outlook.office.com/IMAP.AccessAsUser.All";
17
+ export const MICROSOFT_SMTP_SCOPE = "https://outlook.office.com/SMTP.Send";
18
+ /** IMAP and SMTP are one resource, so one token covers both; offline_access brings the refresh token. */
19
+ export const MICROSOFT_SCOPES = ["offline_access", MICROSOFT_IMAP_SCOPE, MICROSOFT_SMTP_SCOPE];
20
+ export const GOOGLE_GUIDE = "https://github.com/WireCatLabs/mail-cli/blob/main/docs/oauth-google.md";
21
+ /** The only scope Gmail gives IMAP and SMTP: https://developers.google.com/workspace/gmail/imap/xoauth2-protocol */
22
+ export const GOOGLE_MAIL_SCOPE = "https://mail.google.com/";
23
+ export const GOOGLE_SCOPES = ["openid", "email", GOOGLE_MAIL_SCOPE];
24
+ /** What each scope lets mail do, shown before the browser opens. */
25
+ export const SCOPE_WORDS = {
26
+ offline_access: "stay signed in, so a scheduled sync needs no new sign-in",
27
+ [MICROSOFT_IMAP_SCOPE]: "read and change your mail over IMAP",
28
+ [MICROSOFT_SMTP_SCOPE]: "send mail as you over SMTP",
29
+ openid: "know which account signed in",
30
+ email: "see its address, to check it is this mailbox",
31
+ [GOOGLE_MAIL_SCOPE]: "read, change and send your Gmail over IMAP and SMTP",
32
+ };
33
+ export const OAUTH_NAMES = { microsoft: "Microsoft", google: "Google" };
34
+ export const scopesOf = (kind) => kind === "microsoft" ? MICROSOFT_SCOPES : GOOGLE_SCOPES;
35
+ /** The scope without which a profile cannot send. */
36
+ export const sendScopeOf = (kind) => (kind === "microsoft" ? MICROSOFT_SMTP_SCOPE : GOOGLE_MAIL_SCOPE);
37
+ // https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-auth-code-flow: a public client sends no secret,
38
+ // and `common` takes work, school and personal accounts.
39
+ const microsoftProvider = (client, address) => ({
40
+ id: "microsoft",
41
+ name: "Microsoft",
42
+ authorizeUrl: "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
43
+ tokenUrl: "https://login.microsoftonline.com/common/oauth2/v2.0/token",
44
+ client,
45
+ redirect: { kind: "loopback" },
46
+ authorizeParams: { prompt: "select_account", ...(address ? { login_hint: address } : {}) },
47
+ });
48
+ const googleProvider = (client, address) => ({
49
+ id: "google",
50
+ name: "Google",
51
+ authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
52
+ tokenUrl: "https://oauth2.googleapis.com/token",
53
+ revokeUrl: "https://oauth2.googleapis.com/revoke",
54
+ client,
55
+ redirect: { kind: "loopback" },
56
+ // Without offline access Google returns no refresh token; without consent it does not return one again.
57
+ authorizeParams: {
58
+ access_type: "offline",
59
+ prompt: "select_account consent",
60
+ ...(address ? { login_hint: address } : {}),
61
+ },
62
+ });
63
+ const standardGoogle = standardCodec("google");
64
+ const entryObject = (text) => {
65
+ const value = JSON.parse(text);
66
+ if (typeof value !== "object" || value === null || Array.isArray(value))
67
+ throw new CliError("authentication_error", "the saved sign-in cannot be read; sign in again", {
68
+ reason: "oauth.invalid",
69
+ });
70
+ return { ...value };
71
+ };
72
+ /**
73
+ * gcal's codec (gcal-cli src/google.ts): a Google Desktop client needs its secret to refresh, and the client file is
74
+ * read once, at sign-in, so the entry keeps the secret. The third copy after gcal and drive (DEBT, journal).
75
+ */
76
+ const googleCodec = {
77
+ decode: (raw) => {
78
+ const stored = standardGoogle.decode(raw);
79
+ const { clientSecret } = entryObject(raw);
80
+ return typeof clientSecret === "string" && clientSecret
81
+ ? { ...stored, client: { clientId: stored.client?.clientId ?? "", clientSecret } }
82
+ : stored;
83
+ },
84
+ encode: (input) => {
85
+ const entry = entryObject(standardGoogle.encode(input));
86
+ if (input.client.clientSecret)
87
+ entry.clientSecret = input.client.clientSecret;
88
+ else
89
+ delete entry.clientSecret;
90
+ return JSON.stringify(entry);
91
+ },
92
+ };
93
+ const ClientFile = v.object({
94
+ installed: v.object({ client_id: v.pipe(v.string(), v.minLength(1)), client_secret: v.optional(v.string()) }),
95
+ });
96
+ /** The owner's Desktop client: `--client-file` (private to the owner), else MAIL_GOOGLE_CLIENT_ID; no bundled one. */
97
+ export const googleClient = (env, file, platform = process.platform) => {
98
+ if (!file) {
99
+ const clientId = env.MAIL_GOOGLE_CLIENT_ID;
100
+ const clientSecret = env.MAIL_GOOGLE_CLIENT_SECRET;
101
+ if (clientId)
102
+ return { clientId, ...(clientSecret ? { clientSecret } : {}) };
103
+ throw new CliError("configuration_error", `Gmail over OAuth needs your own Google app: pass --client-file <Desktop client JSON> (steps: ${GOOGLE_GUIDE})`, { reason: "mail.oauth-no-client" });
104
+ }
105
+ const mode = privateFiles({ files: [file], dirs: [] }, platform);
106
+ if (mode.checked && !mode.ok)
107
+ throw new CliError("configuration_error", `the client file can be read by other users of this computer; run chmod 600 ${file} and try again`, { reason: "sign-in.client-file-open" });
108
+ try {
109
+ const { installed } = v.parse(ClientFile, JSON.parse(readFileSync(file, "utf8")));
110
+ return {
111
+ clientId: installed.client_id,
112
+ ...(installed.client_secret ? { clientSecret: installed.client_secret } : {}),
113
+ };
114
+ }
115
+ catch {
116
+ throw new CliError("configuration_error", "could not read a Desktop app OAuth client JSON from the client file; its contents were not logged", { reason: "sign-in.client-file-invalid" });
117
+ }
118
+ };
119
+ const UserInfo = v.object({ email: v.optional(v.string()), email_verified: v.optional(v.boolean()) });
120
+ /** The address Google signed in, from OpenID userinfo; the token goes in a header, so no failure prints it. */
121
+ export const googleAddress = async (accessToken, fetcher, signal) => {
122
+ const timeout = AbortSignal.timeout(30_000);
123
+ let response;
124
+ try {
125
+ response = await fetcher("https://openidconnect.googleapis.com/v1/userinfo", {
126
+ headers: { authorization: `Bearer ${accessToken}`, accept: "application/json" },
127
+ signal: signal ? AbortSignal.any([signal, timeout]) : timeout,
128
+ redirect: "error",
129
+ });
130
+ }
131
+ catch {
132
+ throw new CliError("provider_unavailable", "Google did not answer the account lookup; try again", {
133
+ retryable: true,
134
+ });
135
+ }
136
+ if (!response.ok)
137
+ throw new CliError("authentication_error", `Google refused the account lookup (HTTP ${response.status})`);
138
+ const info = v.safeParse(UserInfo, await response.json().catch(() => undefined));
139
+ const email = info.success ? info.output.email : undefined;
140
+ if (!email || (info.success && info.output.email_verified === false))
141
+ throw new CliError("authentication_error", "Google gave no verified address for this account");
142
+ return email.toLowerCase();
143
+ };
144
+ /** The owner's own Microsoft app when the config names one, else WireCat's; only the owner sets the key (OWNER_ONLY). */
145
+ export const microsoftClient = (mailbox) => {
146
+ const own = mailbox.microsoftClientId?.trim();
147
+ if (own)
148
+ return { client: { clientId: own }, source: own === WIRECAT_MICROSOFT_CLIENT_ID ? "wirecat" : "own" };
149
+ if (WIRECAT_MICROSOFT_CLIENT_ID)
150
+ return { client: { clientId: WIRECAT_MICROSOFT_CLIENT_ID }, source: "wirecat" };
151
+ throw new CliError("configuration_error", "this mail build has no Microsoft app to sign in with yet. Register your own (a free Microsoft Entra app, " +
152
+ `steps: ${OAUTH_GUIDE}) and set its Application (client) ID once, in a terminal: ` +
153
+ `\`${IDENTITY.command} config set --defaults microsoft_client_id <id>\``, { reason: "mail.oauth-no-client" });
154
+ };
155
+ const paths = (env) => resolvePaths({ appName: IDENTITY.appName, prefix: IDENTITY.envPrefix, env });
156
+ /** The entry `oauth:<provider>:<profile>` beside the profile's app password, under the same options (WC-SECR-24). */
157
+ export const oauthStorage = ({ env, profile, kind, keyring = systemKeyring, storage }) => credentialStorage({
158
+ credentials: {
159
+ configDir: paths(env).config,
160
+ service: IDENTITY.appName,
161
+ storage: storage === "file" ? "file" : "auto",
162
+ env,
163
+ isolated: keyring === systemKeyring && isMovedRun({ appName: IDENTITY.appName, prefix: IDENTITY.envPrefix, env }),
164
+ keyring,
165
+ },
166
+ account: oauthAccount(kind, profile),
167
+ codec: kind === "google" ? googleCodec : standardCodec(kind),
168
+ });
169
+ export const signInWords = (profile) => `${IDENTITY.command} ${profile} session start`;
170
+ /** One profile's sign-in, refreshed under a lock every mail process shares; a refresh uses the app it signed in with. */
171
+ export const oauthKeeper = (options) => tokenKeeper({
172
+ provider: options.kind === "google"
173
+ ? googleProvider(options.client, options.address)
174
+ : microsoftProvider(options.client, options.address),
175
+ storage: oauthStorage(options),
176
+ lockDir: paths(options.env).config,
177
+ fetch: options.fetch ?? globalThis.fetch,
178
+ signInCommand: signInWords(options.profile),
179
+ ...(options.signal ? { signal: options.signal } : {}),
180
+ });
181
+ export const oauthCredential = (keeper, kind, profile) => ({
182
+ kind: "oauth",
183
+ provider: kind,
184
+ signInCommand: signInWords(profile),
185
+ login: async ({ refresh = false } = {}) => ({ accessToken: await keeper.accessToken({ refresh }) }),
186
+ });
187
+ /** A token just received at sign-in, before anything is saved: a refusal fails the sign-in, nothing refreshes. */
188
+ export const tokenCredential = (accessToken, kind) => ({
189
+ kind: "oauth",
190
+ provider: kind,
191
+ login: async () => ({ accessToken }),
192
+ });
193
+ const recordsPath = (env) => join(paths(env).state, "sign-ins.json");
194
+ export const signInRecords = (env) => {
195
+ try {
196
+ const value = JSON.parse(readFileSync(recordsPath(env), "utf8"));
197
+ return typeof value === "object" && value !== null && !Array.isArray(value)
198
+ ? value
199
+ : {};
200
+ }
201
+ catch {
202
+ return {};
203
+ }
204
+ };
205
+ export const recordSignIn = async (env, profile, record) => {
206
+ const records = signInRecords(env);
207
+ if (record)
208
+ records[profile] = record;
209
+ else if (profile in records)
210
+ delete records[profile];
211
+ else
212
+ return;
213
+ mkdirSync(paths(env).state, { recursive: true });
214
+ await writeFileAtomic(recordsPath(env), `${JSON.stringify(records, null, 2)}\n`, { mode: 0o600 });
215
+ };
216
+ /** The system browser; the sign-in link is printed too, so a failure here only means opening it by hand. */
217
+ export const systemBrowser = (url, platform = process.platform, start = spawn) => new Promise((resolve, reject) => {
218
+ const [command, args] = platform === "darwin"
219
+ ? ["open", [url]]
220
+ : platform === "win32"
221
+ ? ["rundll32.exe", ["url.dll,FileProtocolHandler", url]]
222
+ : ["xdg-open", [url]];
223
+ const child = start(command, args, { detached: true, stdio: "ignore", windowsHide: true });
224
+ child.once("error", () => reject(new CliError("configuration_error", `could not start ${command}`)));
225
+ child.once("spawn", () => {
226
+ child.unref();
227
+ resolve();
228
+ });
229
+ });
230
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAqB,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACxG,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EACL,iBAAiB,EAGjB,YAAY,EACZ,aAAa,EAIb,WAAW,GACZ,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAKxC;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAA;AAE7C,MAAM,CAAC,MAAM,WAAW,GAAG,2EAA2E,CAAA;AAEtG,MAAM,CAAC,MAAM,oBAAoB,GAAG,kDAAkD,CAAA;AACtF,MAAM,CAAC,MAAM,oBAAoB,GAAG,sCAAsC,CAAA;AAC1E,yGAAyG;AACzG,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,oBAAoB,CAAU,CAAA;AAEvG,MAAM,CAAC,MAAM,YAAY,GAAG,wEAAwE,CAAA;AACpG,oHAAoH;AACpH,MAAM,CAAC,MAAM,iBAAiB,GAAG,0BAA0B,CAAA;AAC3D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,iBAAiB,CAAU,CAAA;AAE5E,oEAAoE;AACpE,MAAM,CAAC,MAAM,WAAW,GAA2B;IACjD,cAAc,EAAE,0DAA0D;IAC1E,CAAC,oBAAoB,CAAC,EAAE,qCAAqC;IAC7D,CAAC,oBAAoB,CAAC,EAAE,4BAA4B;IACpD,MAAM,EAAE,8BAA8B;IACtC,KAAK,EAAE,8CAA8C;IACrD,CAAC,iBAAiB,CAAC,EAAE,qDAAqD;CAC3E,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAA8B,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;AAClG,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAe,EAAqB,EAAE,CAC7D,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAA;AACzD,qDAAqD;AACrD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAe,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAA;AAEjH,uHAAuH;AACvH,yDAAyD;AACzD,MAAM,iBAAiB,GAAG,CAAC,MAAmB,EAAE,OAAgB,EAAiB,EAAE,CAAC,CAAC;IACnF,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,WAAW;IACjB,YAAY,EAAE,gEAAgE;IAC9E,QAAQ,EAAE,4DAA4D;IACtE,MAAM;IACN,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;IAC9B,eAAe,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;CAC3F,CAAC,CAAA;AAEF,MAAM,cAAc,GAAG,CAAC,MAAmB,EAAE,OAAgB,EAAiB,EAAE,CAAC,CAAC;IAChF,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,QAAQ;IACd,YAAY,EAAE,8CAA8C;IAC5D,QAAQ,EAAE,qCAAqC;IAC/C,SAAS,EAAE,sCAAsC;IACjD,MAAM;IACN,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;IAC9B,wGAAwG;IACxG,eAAe,EAAE;QACf,WAAW,EAAE,SAAS;QACtB,MAAM,EAAE,wBAAwB;QAChC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C;CACF,CAAC,CAAA;AAEF,MAAM,cAAc,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;AAC9C,MAAM,WAAW,GAAG,CAAC,IAAY,EAA2B,EAAE;IAC5D,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrE,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,iDAAiD,EAAE;YAC5F,MAAM,EAAE,eAAe;SACxB,CAAC,CAAA;IACJ,OAAO,EAAE,GAAG,KAAK,EAAE,CAAA;AACrB,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,WAAW,GAAe;IAC9B,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE;QACd,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACzC,MAAM,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;QACzC,OAAO,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY;YACrD,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE;YAClF,CAAC,CAAC,MAAM,CAAA;IACZ,CAAC;IACD,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QAChB,MAAM,KAAK,GAAG,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QACvD,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY;YAAE,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,CAAA;;YACxE,OAAO,KAAK,CAAC,YAAY,CAAA;QAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAC9B,CAAC;CACF,CAAA;AAED,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;CAC9G,CAAC,CAAA;AAEF,sHAAsH;AACtH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAsB,EAAE,IAAa,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAe,EAAE;IAC9G,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,QAAQ,GAAG,GAAG,CAAC,qBAAqB,CAAA;QAC1C,MAAM,YAAY,GAAG,GAAG,CAAC,yBAAyB,CAAA;QAClD,IAAI,QAAQ;YAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;QAC5E,MAAM,IAAI,QAAQ,CAChB,qBAAqB,EACrB,gGAAgG,YAAY,GAAG,EAC/G,EAAE,MAAM,EAAE,sBAAsB,EAAE,CACnC,CAAA;IACH,CAAC;IACD,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;IAChE,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE;QAC1B,MAAM,IAAI,QAAQ,CAChB,qBAAqB,EACrB,8EAA8E,IAAI,gBAAgB,EAClG,EAAE,MAAM,EAAE,0BAA0B,EAAE,CACvC,CAAA;IACH,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;QACjF,OAAO;YACL,QAAQ,EAAE,SAAS,CAAC,SAAS;YAC7B,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9E,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAChB,qBAAqB,EACrB,mGAAmG,EACnG,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAC1C,CAAA;IACH,CAAC;AACH,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;AAErG,+GAA+G;AAC/G,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,WAAmB,EAAE,OAAqB,EAAE,MAAoB,EAAE,EAAE;IACtG,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC3C,IAAI,QAAkB,CAAA;IACtB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,OAAO,CAAC,kDAAkD,EAAE;YAC3E,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,WAAW,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;YAC/E,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;YAC7D,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAA;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,qDAAqD,EAAE;YAChG,SAAS,EAAE,IAAI;SAChB,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,EAAE;QACd,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,2CAA2C,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;IAC3G,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAChF,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IAC1D,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,KAAK,KAAK,CAAC;QAClE,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,kDAAkD,CAAC,CAAA;IAChG,OAAO,KAAK,CAAC,WAAW,EAAE,CAAA;AAC5B,CAAC,CAAA;AAED,yHAAyH;AACzH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAgB,EAAsD,EAAE;IACtG,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAA;IAC7C,IAAI,GAAG;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,KAAK,2BAA2B,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,CAAA;IAC9G,IAAI,2BAA2B;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,2BAA2B,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAChH,MAAM,IAAI,QAAQ,CAChB,qBAAqB,EACrB,2GAA2G;QACzG,UAAU,WAAW,6DAA6D;QAClF,KAAK,QAAQ,CAAC,OAAO,mDAAmD,EAC1E,EAAE,MAAM,EAAE,sBAAsB,EAAE,CACnC,CAAA;AACH,CAAC,CAAA;AAED,MAAM,KAAK,GAAG,CAAC,GAAsB,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;AAatH,qHAAqH;AACrH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,aAAa,EAAE,OAAO,EAAgB,EAAgB,EAAE,CACnH,iBAAiB,CAAC;IAChB,WAAW,EAAE;QACX,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM;QAC5B,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QAC7C,GAAG;QACH,QAAQ,EAAE,OAAO,KAAK,aAAa,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC;QACjH,OAAO;KACR;IACD,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC;IACpC,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;CAC7D,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,OAAO,IAAI,OAAO,gBAAgB,CAAA;AAU9F,yHAAyH;AACzH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAsB,EAAe,EAAE,CACjE,WAAW,CAAC;IACV,QAAQ,EACN,OAAO,CAAC,IAAI,KAAK,QAAQ;QACvB,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC;QACjD,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC;IACxD,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC;IAC9B,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM;IAClC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK;IACxC,aAAa,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;IAC3C,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CACtD,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAmB,EAAE,IAAe,EAAE,OAAe,EAAkB,EAAE,CAAC,CAAC;IACzG,IAAI,EAAE,OAAO;IACb,QAAQ,EAAE,IAAI;IACd,aAAa,EAAE,WAAW,CAAC,OAAO,CAAC;IACnC,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;CACpG,CAAC,CAAA;AAEF,kHAAkH;AAClH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,WAAmB,EAAE,IAAe,EAAkB,EAAE,CAAC,CAAC;IACxF,IAAI,EAAE,OAAO;IACb,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;CACrC,CAAC,CAAA;AAaF,MAAM,WAAW,GAAG,CAAC,GAAsB,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,eAAe,CAAC,CAAA;AAEvF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAsB,EAAgC,EAAE;IACpF,IAAI,CAAC;QACH,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;QACzE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACzE,CAAC,CAAE,KAAsC;YACzC,CAAC,CAAC,EAAE,CAAA;IACR,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,GAAsB,EAAE,OAAe,EAAE,MAAgC,EAAE,EAAE;IAC9G,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;IAClC,IAAI,MAAM;QAAE,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,CAAA;SAChC,IAAI,OAAO,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAA;;QAC/C,OAAM;IACX,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAChD,MAAM,eAAe,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;AACnG,CAAC,CAAA;AAED,4GAA4G;AAC5G,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,GAAG,KAAK,EAAiB,EAAE,CACtG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC9B,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GACnB,QAAQ,KAAK,QAAQ;QACnB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC,CAAC,QAAQ,KAAK,OAAO;YACpB,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;YACxD,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1F,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,qBAAqB,EAAE,mBAAmB,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;IACpG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;QACvB,KAAK,CAAC,KAAK,EAAE,CAAA;QACb,OAAO,EAAE,CAAA;IACX,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAEA,OAAO,EAQL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,UAAU,EAMhB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAqBxC,eAAO,MAAM,UAAU,QAAO,iBAsC5B,CAAA;AAEF,eAAO,MAAM,aAAa,aAAc,cAAc,KAAG,OAAqD,CAAA;AAE9G,eAAO,MAAM,GAAG,SAAU,MAAM,EAAE,YAAY,UAAU,KAAG,OAAO,CAAC,MAAM,CAA2C,CAAA"}
1
+ {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAEA,OAAO,EAQL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,UAAU,EAMhB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAqCxC,eAAO,MAAM,UAAU,QAAO,iBA2C5B,CAAA;AAEF,eAAO,MAAM,aAAa,aAAc,cAAc,KAAG,OAAqD,CAAA;AAE9G,eAAO,MAAM,GAAG,SAAU,MAAM,EAAE,YAAY,UAAU,KAAG,OAAO,CAAC,MAAM,CAA2C,CAAA"}
package/dist/program.js CHANGED
@@ -3,13 +3,21 @@ import { resolvePaths } from "@wirecat/cli-base";
3
3
  import { appDoctorCommand, appMcpCommand, baseContext, commandsCommand, configCommand, createProgram as createSharedProgram, outputFor, run as runShared, runsCommand, scheduleCommandFor, skillCommand, upgradeCommand, } from "@wirecat/cli-core/cli";
4
4
  import { appUpdate } from "@wirecat/cli-core/update";
5
5
  import { accountCommand } from "./commands/account.js";
6
+ import { attachmentsCommand } from "./commands/attachments.js";
7
+ import { draftsCommand } from "./commands/drafts.js";
6
8
  import { foldersCommand } from "./commands/folders.js";
9
+ import { messageWrites } from "./commands/messages.js";
7
10
  import { readCommands } from "./commands/read.js";
11
+ import { rulesCommand } from "./commands/rules.js";
12
+ import { forwardCommand, sendCommand } from "./commands/send.js";
8
13
  import { sessionCommand } from "./commands/session.js";
14
+ import { statsCommand } from "./commands/stats.js";
9
15
  import { statusCommand } from "./commands/status.js";
10
16
  import { syncCommand } from "./commands/sync.js";
11
- import { configuration } from "./config.js";
17
+ import { tagsCommand } from "./commands/tags.js";
18
+ import { configuration, OWNER_ONLY } from "./config.js";
12
19
  import { IDENTITY, PACKAGE, SKILL } from "./identity.js";
20
+ import { localChecks } from "./mail/doctor.js";
13
21
  const update = appUpdate({
14
22
  packageName: PACKAGE,
15
23
  command: IDENTITY.command,
@@ -19,6 +27,15 @@ const update = appUpdate({
19
27
  enabled: (env) => configuration.resolveSettings({}, { env, needsProfile: false }).updateCheck,
20
28
  offVariables: [`${IDENTITY.envPrefix}_NO_UPDATE_CHECK`],
21
29
  });
30
+ /** cli-core's `messages` group reads; the changes to a mailbox go beside `messages show`. */
31
+ const withWrites = (reads) => {
32
+ const messages = reads.find((one) => one.name() === "messages");
33
+ if (!messages)
34
+ throw new Error("cli-core's mail reads have no messages group");
35
+ for (const write of [...messageWrites(), sendCommand(), forwardCommand()])
36
+ messages.addCommand(write);
37
+ return reads;
38
+ };
22
39
  export const definition = () => ({
23
40
  app: IDENTITY,
24
41
  firstScreen: { start: `${IDENTITY.command} personal session start --address <email>` },
@@ -29,9 +46,14 @@ export const definition = () => ({
29
46
  accountCommand(),
30
47
  foldersCommand(),
31
48
  syncCommand(),
49
+ rulesCommand(),
32
50
  statusCommand(),
33
- ...readCommands(),
34
- appDoctorCommand(IDENTITY, configuration, { packageName: PACKAGE }),
51
+ ...withWrites(readCommands()),
52
+ attachmentsCommand(),
53
+ statsCommand(),
54
+ draftsCommand(),
55
+ tagsCommand(),
56
+ appDoctorCommand(IDENTITY, configuration, { packageName: PACKAGE, local: localChecks }),
35
57
  skillCommand(IDENTITY, SKILL),
36
58
  appMcpCommand(IDENTITY, configuration, {
37
59
  name: "mail",
@@ -45,7 +67,7 @@ export const definition = () => ({
45
67
  latest: () => update.latest({}),
46
68
  install: (argv) => update.runUpdate(argv, {}),
47
69
  })),
48
- configCommand(IDENTITY, configuration),
70
+ configCommand(IDENTITY, configuration, { ownerOnly: OWNER_ONLY }),
49
71
  runsCommand(IDENTITY),
50
72
  scheduleCommandFor({
51
73
  app: IDENTITY,
@@ -1 +1 @@
1
- {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { SearchSyntax } from "./mail/imap/search.js";
1
2
  export declare const PROVIDERS_URL = "https://github.com/WireCatLabs/mail-cli/blob/main/docs/providers.md";
2
3
  export type Security = "tls" | "starttls";
3
4
  export interface Endpoint {
@@ -21,6 +22,30 @@ export interface SyncFolders {
21
22
  roles: string[];
22
23
  otherwise: string;
23
24
  }
25
+ /** How `search messages --backend` asks the server, and which folders by role when the profile names none. */
26
+ export interface ServerSearch {
27
+ syntax: SearchSyntax;
28
+ roles: string[];
29
+ otherwise: string;
30
+ }
31
+ /** How a change reaches the mailbox, where providers differ. */
32
+ export interface Organise {
33
+ /** Gmail: one All Mail with labels, so a move or copy is a change of labels, and a deletion a move to Trash. */
34
+ labels?: true;
35
+ /** Trash under the names the provider gives it, tried when the server marks no folder `\Trash`. */
36
+ trash: string[];
37
+ /** Drafts under the names the provider gives it, tried when the server marks no folder `\Drafts`. */
38
+ drafts: string[];
39
+ }
40
+ /** Where `messages send` submits mail, read from the provider's own help page. */
41
+ export interface Smtp extends Endpoint {
42
+ /**
43
+ * The server files what SMTP carried into Sent itself, so a copy appended by the tool would be a second one. Absent:
44
+ * the help page does not say so, and the tool appends the copy unless Sent already holds that Message-ID.
45
+ */
46
+ savesSent?: true;
47
+ sources: string[];
48
+ }
24
49
  export interface Provider {
25
50
  name: string;
26
51
  /** Address domains it hosts; every provider here logs in with the full address. */
@@ -28,11 +53,14 @@ export interface Provider {
28
53
  /** A domain with its own name can still be hosted here: its MX record says where. */
29
54
  mx?: RegExp;
30
55
  imap: Endpoint;
31
- /** Not used until sending comes; check it against the provider's help page then. */
32
- smtp: Endpoint;
56
+ smtp: Smtp;
33
57
  auth: "app-password" | "oauth";
58
+ /** Signs in with this OAuth provider: the only way when `auth` is `oauth`, else with `session start --client-file`. */
59
+ oauth?: "microsoft" | "google";
34
60
  note?: string;
35
61
  sync?: SyncFolders;
62
+ search?: ServerSearch;
63
+ organise?: Organise;
36
64
  prepare: Prepare;
37
65
  }
38
66
  declare const TABLE: {
@@ -41,9 +69,18 @@ declare const TABLE: {
41
69
  domains: string[];
42
70
  mx: RegExp;
43
71
  imap: Endpoint;
44
- smtp: Endpoint;
72
+ smtp: {
73
+ host: string;
74
+ port: number;
75
+ security: Security;
76
+ sources: string[];
77
+ };
45
78
  auth: "app-password";
46
79
  note: string;
80
+ organise: {
81
+ trash: string[];
82
+ drafts: string[];
83
+ };
47
84
  prepare: {
48
85
  steps: string[];
49
86
  notes: string[];
@@ -56,14 +93,31 @@ declare const TABLE: {
56
93
  domains: string[];
57
94
  mx: RegExp;
58
95
  imap: Endpoint;
59
- smtp: Endpoint;
96
+ smtp: {
97
+ host: string;
98
+ port: number;
99
+ security: Security;
100
+ savesSent: true;
101
+ sources: string[];
102
+ };
60
103
  auth: "app-password";
104
+ oauth: "google";
61
105
  note: string;
62
106
  sync: {
63
107
  mode: "gmail";
64
108
  roles: string[];
65
109
  otherwise: string;
66
110
  };
111
+ search: {
112
+ syntax: "gmail";
113
+ roles: string[];
114
+ otherwise: string;
115
+ };
116
+ organise: {
117
+ labels: true;
118
+ trash: string[];
119
+ drafts: string[];
120
+ };
67
121
  prepare: {
68
122
  steps: string[];
69
123
  notes: string[];
@@ -79,6 +133,7 @@ declare const TABLE: {
79
133
  host: string;
80
134
  port: number;
81
135
  security: "starttls";
136
+ sources: string[];
82
137
  };
83
138
  auth: "app-password";
84
139
  note: string;
@@ -94,7 +149,12 @@ declare const TABLE: {
94
149
  domains: string[];
95
150
  mx: RegExp;
96
151
  imap: Endpoint;
97
- smtp: Endpoint;
152
+ smtp: {
153
+ host: string;
154
+ port: number;
155
+ security: Security;
156
+ sources: string[];
157
+ };
98
158
  auth: "app-password";
99
159
  note: string;
100
160
  prepare: {
@@ -109,7 +169,12 @@ declare const TABLE: {
109
169
  domains: string[];
110
170
  mx: RegExp;
111
171
  imap: Endpoint;
112
- smtp: Endpoint;
172
+ smtp: {
173
+ host: string;
174
+ port: number;
175
+ security: Security;
176
+ sources: string[];
177
+ };
113
178
  auth: "app-password";
114
179
  prepare: {
115
180
  steps: string[];
@@ -118,18 +183,19 @@ declare const TABLE: {
118
183
  sources: string[];
119
184
  };
120
185
  };
121
- outlook: {
186
+ microsoft365: {
122
187
  name: string;
123
- domains: string[];
188
+ domains: never[];
124
189
  mx: RegExp;
125
190
  imap: Endpoint;
126
191
  smtp: {
127
192
  host: string;
128
193
  port: number;
129
194
  security: "starttls";
195
+ sources: string[];
130
196
  };
131
197
  auth: "oauth";
132
- note: string;
198
+ oauth: "microsoft";
133
199
  prepare: {
134
200
  steps: string[];
135
201
  notes: string[];
@@ -137,6 +203,25 @@ declare const TABLE: {
137
203
  sources: string[];
138
204
  };
139
205
  };
206
+ outlook: {
207
+ name: string;
208
+ domains: string[];
209
+ imap: Endpoint;
210
+ smtp: {
211
+ host: string;
212
+ port: number;
213
+ security: "starttls";
214
+ sources: string[];
215
+ };
216
+ auth: "oauth";
217
+ oauth: "microsoft";
218
+ prepare: {
219
+ steps: string[];
220
+ notes: never[];
221
+ refused: string;
222
+ sources: string[];
223
+ };
224
+ };
140
225
  };
141
226
  export type ProviderKey = keyof typeof TABLE;
142
227
  /** One entry per built-in provider: how it is found, its servers, how it signs in and how to prepare it. */
@@ -144,6 +229,8 @@ export declare const PROVIDERS: Record<ProviderKey, Provider>;
144
229
  export declare const PROVIDER_KEYS: ProviderKey[];
145
230
  export declare const providerByDomain: (domain: string) => ProviderKey | undefined;
146
231
  export declare const DEFAULT_SYNC: SyncFolders;
232
+ export declare const DEFAULT_SEARCH: ServerSearch;
233
+ export declare const DEFAULT_ORGANISE: Organise;
147
234
  /** The provider of a saved profile: its address domain first, then its server host (a domain of its own on Yandex). */
148
235
  export declare const providerFor: (address: string, host: string | undefined) => Provider | undefined;
149
236
  export declare const GENERIC_PREPARE: Prepare;
@@ -1 +1 @@
1
- {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,wEAAwE,CAAA;AAElG,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,UAAU,CAAA;AAEzC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,sHAAsH;IACtH,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAA;IACf,wDAAwD;IACxD,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,iHAAiH;AACjH,MAAM,WAAW,WAAW;IAC1B,uGAAuG;IACvG,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,mFAAmF;IACnF,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,qFAAqF;IACrF,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,QAAQ,CAAA;IACd,oFAAoF;IACpF,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE,cAAc,GAAG,OAAO,CAAA;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;CACjB;AAID,QAAA,MAAM,KAAK;;;;;;;;;;YAUL,KAAK;YAQL,KAAK;YAIL,OAAO;YAEP,OAAO;;;;;;;;;;;;;;;;;YAiBP,KAAK;YAML,KAAK;YAGL,OAAO;YAEP,OAAO;;;;;;;;;;;;;;;YAWP,KAAK;YAOL,KAAK;YAGL,OAAO;YAEP,OAAO;;;;;;;;;;;;YAYP,KAAK;YAOL,KAAK;YAGL,OAAO;YACP,OAAO;;;;;;;;;;;YAWP,KAAK;YAOL,KAAK;YACL,OAAO;YAEP,OAAO;;;;;;;;;;;;;;;;YAYP,KAAK;YAIL,KAAK;YAGL,OAAO;YACP,OAAO;;;CAKuB,CAAA;AAEpC,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,KAAK,CAAA;AAE5C,4GAA4G;AAC5G,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAS,CAAA;AAE7D,eAAO,MAAM,aAAa,EAA6B,WAAW,EAAE,CAAA;AAEpE,eAAO,MAAM,gBAAgB,WAAY,MAAM,KAAG,WAAW,GAAG,SACM,CAAA;AAEtE,eAAO,MAAM,YAAY,EAAE,WAA8D,CAAA;AAEzF,uHAAuH;AACvH,eAAO,MAAM,WAAW,YAAa,MAAM,QAAQ,MAAM,GAAG,SAAS,KAAG,QAAQ,GAAG,SAIlF,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,OAO7B,CAAA;AAED,4GAA4G;AAC5G,eAAO,MAAM,WAAW,aAAc,MAAM,WAAW,OAAO,KAAG,MAShE,CAAA"}
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"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"}