@wirecat/mail-cli 0.4.0 → 0.6.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 (281) hide show
  1. package/CHANGELOG.md +115 -0
  2. package/README.md +41 -10
  3. package/dist/bin/mail.js +2 -2
  4. package/dist/bundle/{all-profiles-55XPXQHY.js → all-profiles-GBFTKUHA.js} +9 -9
  5. package/dist/bundle/{anthropic-K5B6I4LB.js → anthropic-PTSCWUG6.js} +6 -6
  6. package/dist/bundle/{app-server-VWWLQLTZ.js → app-server-5VJ2WCKJ.js} +46 -46
  7. package/dist/bundle/{bun-EO7AI6YP.js → bun-2KRUBPIN.js} +2 -2
  8. package/dist/bundle/{bun-sqlite-F24A4IOP.js → bun-sqlite-ELSRSJBM.js} +5 -5
  9. package/dist/bundle/{chunk-X7AXH2IC.js → chunk-3KY7DA5A.js} +428 -434
  10. package/dist/bundle/{chunk-ANRI6EZY.js → chunk-4PKHZQIM.js} +8 -8
  11. package/dist/bundle/{chunk-CADRRSQK.js → chunk-56PI2BRH.js} +1 -1
  12. package/dist/bundle/{chunk-2ADB5DSG.js → chunk-5AQKM47C.js} +3 -3
  13. package/dist/bundle/{chunk-VP5GCMHM.js → chunk-5KHJUYHQ.js} +8 -8
  14. package/dist/bundle/{chunk-HUB42T2Z.js → chunk-6MV2TBDB.js} +57 -54
  15. package/dist/bundle/{chunk-4KLJN3LK.js → chunk-AGX7NR3S.js} +26 -13
  16. package/dist/bundle/{chunk-ZD3WUGR2.js → chunk-B337KHJ5.js} +4 -4
  17. package/dist/bundle/{chunk-5BVIWP3S.js → chunk-BM445GYF.js} +2 -2
  18. package/dist/bundle/{chunk-H7K2DN3R.js → chunk-BVIHT7KR.js} +9 -9
  19. package/dist/bundle/{chunk-EDKV6D6T.js → chunk-DA46WQEA.js} +1 -1
  20. package/dist/bundle/{chunk-UO7X2VW4.js → chunk-DV4RSEAH.js} +6 -6
  21. package/dist/bundle/{chunk-JZFIHVRB.js → chunk-ES4PWHBJ.js} +28 -28
  22. package/dist/bundle/{chunk-7X64JS6S.js → chunk-FIQOBLHS.js} +1 -1
  23. package/dist/bundle/{chunk-TI6VBZKJ.js → chunk-FUB3X25H.js} +4 -4
  24. package/dist/bundle/{chunk-VWXCEEUH.js → chunk-H4VFIH5W.js} +3 -3
  25. package/dist/bundle/{chunk-JKHI3PH7.js → chunk-J4C32YKH.js} +1 -1
  26. package/dist/bundle/{chunk-F6JTOQIK.js → chunk-J5MYH4L5.js} +12 -6
  27. package/dist/bundle/{chunk-QYWDC7NP.js → chunk-JFJTDL22.js} +47 -46
  28. package/dist/bundle/{chunk-UZDHK26H.js → chunk-JIQAFFPV.js} +2 -2
  29. package/dist/bundle/{chunk-BHKI5OCD.js → chunk-JKA2AICL.js} +2 -2
  30. package/dist/bundle/{dist-FMN7UZ7R.js → chunk-JKLQHPED.js} +16 -116
  31. package/dist/bundle/{chunk-J3QXTBD2.js → chunk-JLRMSNPX.js} +18 -18
  32. package/dist/bundle/{chunk-HORM6VRV.js → chunk-K5JUROGN.js} +1 -1
  33. package/dist/bundle/{chunk-SY3SP7EI.js → chunk-KUQYWIVR.js} +6 -6
  34. package/dist/bundle/{chunk-7QQ4EMYF.js → chunk-LWTG5UOF.js} +2 -2
  35. package/dist/bundle/{chunk-YSSMDVT3.js → chunk-M7V3GSJQ.js} +1 -1
  36. package/dist/bundle/chunk-MD2J3POF.js +52 -0
  37. package/dist/bundle/{chunk-SWRNMYDL.js → chunk-NCWO2FNC.js} +2 -2
  38. package/dist/bundle/{chunk-LKDK5YMI.js → chunk-NOU6MWEM.js} +2 -2
  39. package/dist/bundle/{chunk-LQ37ALDJ.js → chunk-NXJLC2WK.js} +8 -8
  40. package/dist/bundle/{chunk-ZAR67WKR.js → chunk-NZB4WGQS.js} +6 -6
  41. package/dist/bundle/{chunk-5RUTHKXZ.js → chunk-O555ZEQR.js} +4 -4
  42. package/dist/bundle/{chunk-MGBGE2Y4.js → chunk-O7VK7CJX.js} +2 -2
  43. package/dist/bundle/{chunk-WFBTPZK3.js → chunk-OHV5RDFE.js} +4 -4
  44. package/dist/bundle/{chunk-HJEMHZRU.js → chunk-P5B7IFOG.js} +2 -2
  45. package/dist/bundle/{chunk-VWHRIGYJ.js → chunk-PBYDT3CG.js} +13 -3
  46. package/dist/bundle/{chunk-7IYDIU4P.js → chunk-PHPC72DP.js} +7 -7
  47. package/dist/bundle/{chunk-ID24SLH3.js → chunk-PKU6V4EQ.js} +17 -17
  48. package/dist/bundle/{chunk-P7P5MNAU.js → chunk-QZBT6BOU.js} +1 -1
  49. package/dist/bundle/{chunk-NL5LNYGX.js → chunk-RAZOSYEO.js} +23 -23
  50. package/dist/bundle/{chunk-CCNHVZ3G.js → chunk-RDSAI6DC.js} +398 -293
  51. package/dist/bundle/{chunk-CSI73XJ5.js → chunk-SAZJDKEI.js} +8 -8
  52. package/dist/bundle/{chunk-QX7RCLRS.js → chunk-SQLCCKEL.js} +1 -1
  53. package/dist/bundle/{chunk-ORYYYM5Y.js → chunk-TKJDGAHT.js} +23 -23
  54. package/dist/bundle/{chunk-RLSGMMGC.js → chunk-TPNC5VCJ.js} +4 -4
  55. package/dist/bundle/{chunk-IIO6NXCA.js → chunk-UAXBLHZK.js} +2 -2
  56. package/dist/bundle/{chunk-2NZGUKYK.js → chunk-VEAP5RVI.js} +10 -8
  57. package/dist/bundle/{chunk-6BNMEOVS.js → chunk-VF24ZAPX.js} +4 -4
  58. package/dist/bundle/{chunk-FFKNUVVD.js → chunk-WCL3WBH5.js} +3 -3
  59. package/dist/bundle/{chunk-M4NTQ247.js → chunk-WGK4AIRL.js} +12 -12
  60. package/dist/bundle/{chunk-OM4ZBLT7.js → chunk-XERTHQ6D.js} +88 -34
  61. package/dist/bundle/{chunk-6BR6JMCR.js → chunk-XZGLY2LU.js} +14 -14
  62. package/dist/bundle/{chunk-2LP46EUH.js → chunk-Y7JKWQC2.js} +96 -94
  63. package/dist/bundle/{chunk-F7KAJNNK.js → chunk-YBJMBPL7.js} +6 -6
  64. package/dist/bundle/{chunk-YYTWV5GU.js → chunk-ZMMIIBTM.js} +73 -57
  65. package/dist/bundle/{chunk-EOEYP7CJ.js → chunk-ZPGLWMNH.js} +3 -3
  66. package/dist/bundle/{chunk-UJYCKCFR.js → chunk-ZRYFEEXZ.js} +3 -3
  67. package/dist/bundle/command-contract-NZF4B5OR.js +34 -0
  68. package/dist/bundle/{decode-ON4KBMEX.js → decode-HVXDCQ63.js} +5 -5
  69. package/dist/bundle/{dispatch-EUKKT3PD.js → dispatch-GDAH4JHS.js} +8 -8
  70. package/dist/bundle/dist-43DZXMBL.js +134 -0
  71. package/dist/bundle/{echarts-XPA226QR.js → echarts-LZ74IXHG.js} +2 -2
  72. package/dist/bundle/{embed-QERDAB73.js → embed-OQF5U2C6.js} +6 -6
  73. package/dist/bundle/{embedder-I76YT3E5.js → embedder-OCWQAWKO.js} +9 -9
  74. package/dist/bundle/{failure-OAIC5VAP.js → failure-6COJAO7T.js} +2 -2
  75. package/dist/bundle/{first-run-KZJFR55N.js → first-run-MTZPUPGA.js} +11 -11
  76. package/dist/bundle/first-screen-4PBS6QK5.js +32 -0
  77. package/dist/bundle/{instructions-NN3BCFIM.js → instructions-M6F4FP7U.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-2S75QJ6B.js → node-NYBBFHGN.js} +2 -2
  81. package/dist/bundle/{node-sqlite-RC7WM3EG.js → node-sqlite-CWCNWO75.js} +5 -5
  82. package/dist/bundle/{oauth-FUHLZCKV.js → oauth-DVX45EME.js} +7 -7
  83. package/dist/bundle/{open-JOKT7LKY.js → open-M7EQWWHL.js} +4 -4
  84. package/dist/bundle/{openai-U3IMQ6UI.js → openai-63KRU5H2.js} +14 -14
  85. package/dist/bundle/{process-LKODK722.js → process-DV5GQIGM.js} +1 -1
  86. package/dist/bundle/{program-RMLIQXCA.js → program-EPR3QCMX.js} +20570 -7622
  87. package/dist/bundle/{prompt-23VYMNNB.js → prompt-EPWPWTB3.js} +5 -5
  88. package/dist/bundle/{recognize-TXO3462R.js → recognize-R46KDXK4.js} +4 -4
  89. package/dist/bundle/{remote-5F4ZOASM.js → remote-RENCYB5X.js} +7 -7
  90. package/dist/bundle/{rerank-TXSDPEFE.js → rerank-VHPC5O73.js} +7 -7
  91. package/dist/bundle/{serve-TWYECYWM.js → serve-KCH3ORYO.js} +9 -9
  92. package/dist/bundle/server-FMCPE2ZK.js +63 -0
  93. package/dist/bundle/{server-3S3BKE6D.js → server-HZVXSK7B.js} +38 -38
  94. package/dist/bundle/{sqlite-runtime-BEOBGC6K.js → sqlite-runtime-XP7ZJCKJ.js} +5 -5
  95. package/dist/bundle/{state-ERWIUTQQ.js → state-GQ4MEQJ5.js} +6 -6
  96. package/dist/bundle/{store-2JO4JGQL.js → store-CQNLNINW.js} +13 -13
  97. package/dist/bundle/{store-4RY5UMOP.js → store-WT7YTR3Y.js} +15 -15
  98. package/dist/bundle/store-maintenance-command-YYR42IT4.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.map +1 -1
  104. package/dist/commands/context.js +11 -1
  105. package/dist/commands/context.js.map +1 -1
  106. package/dist/commands/drafts-send.d.ts +7 -0
  107. package/dist/commands/drafts-send.d.ts.map +1 -0
  108. package/dist/commands/drafts-send.js +58 -0
  109. package/dist/commands/drafts-send.js.map +1 -0
  110. package/dist/commands/drafts.d.ts +3 -0
  111. package/dist/commands/drafts.d.ts.map +1 -0
  112. package/dist/commands/drafts.js +239 -0
  113. package/dist/commands/drafts.js.map +1 -0
  114. package/dist/commands/export.d.ts +3 -0
  115. package/dist/commands/export.d.ts.map +1 -0
  116. package/dist/commands/export.js +275 -0
  117. package/dist/commands/export.js.map +1 -0
  118. package/dist/commands/folders.d.ts.map +1 -1
  119. package/dist/commands/folders.js +120 -2
  120. package/dist/commands/folders.js.map +1 -1
  121. package/dist/commands/messages.d.ts +25 -0
  122. package/dist/commands/messages.d.ts.map +1 -0
  123. package/dist/commands/messages.js +502 -0
  124. package/dist/commands/messages.js.map +1 -0
  125. package/dist/commands/read.d.ts +4 -1
  126. package/dist/commands/read.d.ts.map +1 -1
  127. package/dist/commands/read.js +12 -2
  128. package/dist/commands/read.js.map +1 -1
  129. package/dist/commands/rules.d.ts +3 -0
  130. package/dist/commands/rules.d.ts.map +1 -0
  131. package/dist/commands/rules.js +292 -0
  132. package/dist/commands/rules.js.map +1 -0
  133. package/dist/commands/send.d.ts +39 -0
  134. package/dist/commands/send.d.ts.map +1 -0
  135. package/dist/commands/send.js +309 -0
  136. package/dist/commands/send.js.map +1 -0
  137. package/dist/commands/server-search.d.ts +8 -0
  138. package/dist/commands/server-search.d.ts.map +1 -0
  139. package/dist/commands/server-search.js +38 -0
  140. package/dist/commands/server-search.js.map +1 -0
  141. package/dist/commands/stats.d.ts +3 -0
  142. package/dist/commands/stats.d.ts.map +1 -0
  143. package/dist/commands/stats.js +90 -0
  144. package/dist/commands/stats.js.map +1 -0
  145. package/dist/commands/sync.d.ts +7 -0
  146. package/dist/commands/sync.d.ts.map +1 -1
  147. package/dist/commands/sync.js +22 -7
  148. package/dist/commands/sync.js.map +1 -1
  149. package/dist/commands/tags.d.ts +3 -0
  150. package/dist/commands/tags.d.ts.map +1 -0
  151. package/dist/commands/tags.js +144 -0
  152. package/dist/commands/tags.js.map +1 -0
  153. package/dist/config.d.ts +13 -0
  154. package/dist/config.d.ts.map +1 -1
  155. package/dist/config.js +47 -1
  156. package/dist/config.js.map +1 -1
  157. package/dist/export/format.d.ts +19 -0
  158. package/dist/export/format.d.ts.map +1 -0
  159. package/dist/export/format.js +40 -0
  160. package/dist/export/format.js.map +1 -0
  161. package/dist/export/journal.d.ts +32 -0
  162. package/dist/export/journal.d.ts.map +1 -0
  163. package/dist/export/journal.js +84 -0
  164. package/dist/export/journal.js.map +1 -0
  165. package/dist/export/write.d.ts +14 -0
  166. package/dist/export/write.d.ts.map +1 -0
  167. package/dist/export/write.js +42 -0
  168. package/dist/export/write.js.map +1 -0
  169. package/dist/identity.d.ts.map +1 -1
  170. package/dist/identity.js +3 -0
  171. package/dist/identity.js.map +1 -1
  172. package/dist/mail/backend.d.ts +81 -1
  173. package/dist/mail/backend.d.ts.map +1 -1
  174. package/dist/mail/changes.d.ts +91 -0
  175. package/dist/mail/changes.d.ts.map +1 -0
  176. package/dist/mail/changes.js +198 -0
  177. package/dist/mail/changes.js.map +1 -0
  178. package/dist/mail/cleanup.d.ts +41 -0
  179. package/dist/mail/cleanup.d.ts.map +1 -0
  180. package/dist/mail/cleanup.js +119 -0
  181. package/dist/mail/cleanup.js.map +1 -0
  182. package/dist/mail/compose.d.ts +73 -0
  183. package/dist/mail/compose.d.ts.map +1 -0
  184. package/dist/mail/compose.js +122 -0
  185. package/dist/mail/compose.js.map +1 -0
  186. package/dist/mail/doctor.d.ts +25 -0
  187. package/dist/mail/doctor.d.ts.map +1 -0
  188. package/dist/mail/doctor.js +39 -0
  189. package/dist/mail/doctor.js.map +1 -0
  190. package/dist/mail/drafts.d.ts +54 -0
  191. package/dist/mail/drafts.d.ts.map +1 -0
  192. package/dist/mail/drafts.js +104 -0
  193. package/dist/mail/drafts.js.map +1 -0
  194. package/dist/mail/imap/connection.d.ts +7 -0
  195. package/dist/mail/imap/connection.d.ts.map +1 -1
  196. package/dist/mail/imap/connection.js +24 -2
  197. package/dist/mail/imap/connection.js.map +1 -1
  198. package/dist/mail/imap/index.d.ts +1 -1
  199. package/dist/mail/imap/index.d.ts.map +1 -1
  200. package/dist/mail/imap/index.js +12 -2
  201. package/dist/mail/imap/index.js.map +1 -1
  202. package/dist/mail/imap/messages.d.ts +5 -6
  203. package/dist/mail/imap/messages.d.ts.map +1 -1
  204. package/dist/mail/imap/messages.js +14 -28
  205. package/dist/mail/imap/messages.js.map +1 -1
  206. package/dist/mail/imap/read.d.ts.map +1 -1
  207. package/dist/mail/imap/read.js +27 -13
  208. package/dist/mail/imap/read.js.map +1 -1
  209. package/dist/mail/imap/search.d.ts +14 -0
  210. package/dist/mail/imap/search.d.ts.map +1 -0
  211. package/dist/mail/imap/search.js +49 -0
  212. package/dist/mail/imap/search.js.map +1 -0
  213. package/dist/mail/imap/write.d.ts +5 -0
  214. package/dist/mail/imap/write.d.ts.map +1 -0
  215. package/dist/mail/imap/write.js +93 -0
  216. package/dist/mail/imap/write.js.map +1 -0
  217. package/dist/mail/organise.d.ts +116 -0
  218. package/dist/mail/organise.d.ts.map +1 -0
  219. package/dist/mail/organise.js +531 -0
  220. package/dist/mail/organise.js.map +1 -0
  221. package/dist/mail/rethread.d.ts +1 -2
  222. package/dist/mail/rethread.d.ts.map +1 -1
  223. package/dist/mail/rethread.js +8 -3
  224. package/dist/mail/rethread.js.map +1 -1
  225. package/dist/mail/rules/apply.d.ts +40 -0
  226. package/dist/mail/rules/apply.d.ts.map +1 -0
  227. package/dist/mail/rules/apply.js +114 -0
  228. package/dist/mail/rules/apply.js.map +1 -0
  229. package/dist/mail/rules/file.d.ts +9 -0
  230. package/dist/mail/rules/file.d.ts.map +1 -0
  231. package/dist/mail/rules/file.js +51 -0
  232. package/dist/mail/rules/file.js.map +1 -0
  233. package/dist/mail/rules/filters.d.ts +11 -0
  234. package/dist/mail/rules/filters.d.ts.map +1 -0
  235. package/dist/mail/rules/filters.js +150 -0
  236. package/dist/mail/rules/filters.js.map +1 -0
  237. package/dist/mail/rules/folders.d.ts +11 -0
  238. package/dist/mail/rules/folders.d.ts.map +1 -0
  239. package/dist/mail/rules/folders.js +17 -0
  240. package/dist/mail/rules/folders.js.map +1 -0
  241. package/dist/mail/rules/query.d.ts +15 -0
  242. package/dist/mail/rules/query.d.ts.map +1 -0
  243. package/dist/mail/rules/query.js +103 -0
  244. package/dist/mail/rules/query.js.map +1 -0
  245. package/dist/mail/rules/store.d.ts +9 -0
  246. package/dist/mail/rules/store.d.ts.map +1 -0
  247. package/dist/mail/rules/store.js +17 -0
  248. package/dist/mail/rules/store.js.map +1 -0
  249. package/dist/mail/save.d.ts +12 -0
  250. package/dist/mail/save.d.ts.map +1 -0
  251. package/dist/mail/save.js +71 -0
  252. package/dist/mail/save.js.map +1 -0
  253. package/dist/mail/send.d.ts +67 -0
  254. package/dist/mail/send.d.ts.map +1 -0
  255. package/dist/mail/send.js +172 -0
  256. package/dist/mail/send.js.map +1 -0
  257. package/dist/mail/smtp.d.ts +4 -0
  258. package/dist/mail/smtp.d.ts.map +1 -0
  259. package/dist/mail/smtp.js +97 -0
  260. package/dist/mail/smtp.js.map +1 -0
  261. package/dist/program.d.ts.map +1 -1
  262. package/dist/program.js +28 -6
  263. package/dist/program.js.map +1 -1
  264. package/dist/providers.d.ts +71 -6
  265. package/dist/providers.d.ts.map +1 -1
  266. package/dist/providers.js +38 -9
  267. package/dist/providers.js.map +1 -1
  268. package/dist/reasons.d.ts +9 -0
  269. package/dist/reasons.d.ts.map +1 -0
  270. package/dist/reasons.js +21 -0
  271. package/dist/reasons.js.map +1 -0
  272. package/dist/version.d.ts +1 -1
  273. package/dist/version.js +1 -1
  274. package/package.json +8 -5
  275. package/skills/mail-cli/SKILL.md +30 -3
  276. package/dist/bundle/chunk-XJ5TBPCK.js +0 -27
  277. package/dist/bundle/command-contract-L65UZ7AF.js +0 -34
  278. package/dist/bundle/first-screen-EORANEAK.js +0 -32
  279. package/dist/bundle/server-2GEAXKX2.js +0 -63
  280. package/dist/bundle/store-maintenance-command-T7D4OTN7.js +0 -52
  281. /package/dist/bundle/{chunk-NPGVOZVK.js → chunk-WJWLHLQ7.js} +0 -0
@@ -0,0 +1,292 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { CliError } from "@wirecat/cli-base";
3
+ import { annotate } from "@wirecat/cli-base/commands";
4
+ import { queryFieldsOf } from "@wirecat/cli-base/query";
5
+ import { answerEntity, baseContext, dateWindow, grantsAuthority, itemOf, LOCAL_READ, LOCAL_WRITE, listOf, listQuery, outputFor, renderAnswer, snakeKeys, typedQuery, withQuery, } from "@wirecat/cli-core/cli";
6
+ import { conditionKeys, describeMatch, mapProposedTags, PRESET_NAMES, storedMailRules, } from "@wirecat/cli-core/mail";
7
+ import { Command, Option } from "commander";
8
+ import * as v from "valibot";
9
+ import { configuration } from "../config.js";
10
+ import { IDENTITY } from "../identity.js";
11
+ import { applyRules } from "../mail/rules/apply.js";
12
+ import { rulesFileOf } from "../mail/rules/file.js";
13
+ import { importFilters } from "../mail/rules/filters.js";
14
+ import { syncFoldersOf } from "../mail/rules/folders.js";
15
+ import { ACTION_HELP, actionsOf, FILTER_HELP, filterMatch } from "../mail/rules/query.js";
16
+ import { removeRule, ruleCounts, saveRule } from "../mail/rules/store.js";
17
+ import { openMailStore } from "../store.js";
18
+ import { contextOf, openMail, refuseOffline } from "./context.js";
19
+ const mailRule = v.looseObject({
20
+ id: v.optional(v.number()),
21
+ match: v.record(v.string(), v.unknown()),
22
+ action: v.picklist(["keep", "envelope", "skip"]),
23
+ tags: v.optional(v.array(v.string())),
24
+ reason: v.optional(v.string()),
25
+ protected: v.optional(v.boolean()),
26
+ source: v.optional(v.string()),
27
+ decided_at: v.string(),
28
+ });
29
+ const MAIL_RULES_QUERY = {
30
+ entity: "mail_rule",
31
+ backend: "sql",
32
+ fields: queryFieldsOf(mailRule, {
33
+ native: ["id", "protected", "source"],
34
+ examples: { id: "id:1", protected: "protected:true", source: "source:owner" },
35
+ }),
36
+ };
37
+ const matchOptions = (command) => command
38
+ .option("--sender <address>", "one sender address")
39
+ .option("--domain <domain>", "a sender domain, and its subdomains")
40
+ .option("--list-id <id>", "a mailing list, by its List-Id")
41
+ .option("--filter <query>", FILTER_HELP)
42
+ .addOption(new Option("--kind <kind>", "a built-in kind of mail").choices(PRESET_NAMES));
43
+ const matchOf = (options) => {
44
+ const match = {
45
+ ...(options.sender === undefined ? {} : { from: options.sender }),
46
+ ...(options.domain === undefined ? {} : { domain: options.domain }),
47
+ ...(options.listId === undefined ? {} : { list_id: options.listId }),
48
+ ...(options.filter === undefined ? {} : filterMatch(options.filter)),
49
+ ...(options.kind === undefined ? {} : { preset: options.kind }),
50
+ };
51
+ if (conditionKeys(match).length === 0)
52
+ throw new CliError("validation_error", "give at least one of --sender, --domain, --list-id, --filter, --kind");
53
+ return match;
54
+ };
55
+ const megabytes = (bytes) => (bytes / 1024 / 1024).toFixed(1);
56
+ const ruleLine = (rule) => [
57
+ rule.protected ? "PROTECTED" : rule.action.padEnd(8),
58
+ describeMatch(rule.match),
59
+ rule.tags?.length ? `tag ${rule.tags.join(", ")}` : "",
60
+ rule.tags_skipped ? `tags skipped: ${Object.keys(rule.tags_skipped).join(", ")}` : "",
61
+ rule.source === undefined ? "" : `(${rule.source})`,
62
+ rule.decided_at.slice(0, 10),
63
+ rule.recorded === undefined ? "" : `${rule.recorded.emails} emails, ${megabytes(rule.recorded.bytes)} MB`,
64
+ rule.reason ?? "",
65
+ ]
66
+ .filter(Boolean)
67
+ .join(" ")
68
+ .trimEnd();
69
+ const applyText = (result) => [
70
+ ...result.rules
71
+ .filter(({ emails }) => emails > 0)
72
+ .map(({ rule, emails, bytes }) => `${describeMatch(rule.match)} ${emails} emails, ${megabytes(bytes)} MB of text`),
73
+ `${result.applied ? "cut" : "would cut"} ${result.envelopes} emails to envelopes, ` +
74
+ `${megabytes(result.bytes)} MB of text, of ${result.listed} listed; ` +
75
+ `${result.skipMatched} match only a skip rule and stay as stored; ` +
76
+ `${result.protectedKept} are protected and stay whole; ${result.applied ? "tagged" : "would tag"} ${result.tagged}`,
77
+ ].join("\n");
78
+ const addressOf = (context) => {
79
+ const address = context.settings.mailbox.address;
80
+ if (!address)
81
+ throw new CliError("configuration_error", `profile ${context.profile} has no address; run \`${IDENTITY.command} ${context.profile} session start --address <email>\``);
82
+ return address;
83
+ };
84
+ /** The profile's mailbox address and the shared store, open for `work` and closed after it. */
85
+ const withRules = (command, work) => {
86
+ const context = contextOf(command);
87
+ const address = addressOf(context);
88
+ return baseContext(command, configuration.resolveSettings).run(async () => {
89
+ const store = await openMailStore(context.env);
90
+ context.environment.trackCloseable?.(store);
91
+ try {
92
+ return await work(store, address, context);
93
+ }
94
+ finally {
95
+ await store.close();
96
+ }
97
+ });
98
+ };
99
+ const listCommand = () => answerEntity(withQuery(annotate(new Command("list"), {
100
+ effects: LOCAL_READ,
101
+ examples: [`${IDENTITY.command} ya rules list`, `${IDENTITY.command} ya rules list protected:true --json`],
102
+ }), MAIL_RULES_QUERY), "mail_rule", mailRule)
103
+ .description("this mailbox's rules, protected ones first")
104
+ .addHelpText("after", "\nProtected rules come first, as PROTECTED. An envelope rule shows how many emails it recorded and their " +
105
+ "size at the source.")
106
+ .action(async function (words) {
107
+ const query = listQuery(typedQuery(words), MAIL_RULES_QUERY, "rules list");
108
+ const items = await withRules(this, async (store, address) => {
109
+ const rules = await storedMailRules(store, { address }, query);
110
+ const counts = await ruleCounts(store, address);
111
+ return rules
112
+ .sort((a, b) => Number(b.protected === true) - Number(a.protected === true))
113
+ .map((rule) => {
114
+ const recorded = rule.id === undefined ? undefined : counts.get(rule.id);
115
+ return rule.action === "envelope" ? { ...rule, recorded: recorded ?? { emails: 0, bytes: 0 } } : rule;
116
+ });
117
+ });
118
+ renderAnswer(this, outputFor(this), listOf("rules list", { items, limit: Math.max(1, items.length), has_more: false }), () => items.map(ruleLine).join("\n") || "no rules");
119
+ });
120
+ const addCommand = () => answerEntity(matchOptions(grantsAuthority(annotate(new Command("add"), {
121
+ effects: LOCAL_WRITE,
122
+ examples: [
123
+ `${IDENTITY.command} ya rules add --domain shop.example --do envelope,tag:promo`,
124
+ `${IDENTITY.command} ya rules add --sender boss@example.com --do protect --reason "never lose these"`,
125
+ `${IDENTITY.command} ya rules add --filter "older:365d larger:5MB" --do envelope`,
126
+ ],
127
+ }))), "mail_rule", mailRule)
128
+ .description("decide mail by sender, list, subject, age, size, label or kind; repeats replace")
129
+ .requiredOption("--do <actions>", ACTION_HELP, actionsOf)
130
+ .option("--reason <text>", "why, for the owner later")
131
+ .addHelpText("after", "\nAll conditions given must hold. A protected rule wins over every other rule and kind; then keep wins over " +
132
+ "envelope and envelope over skip, so --do keep --sender one sender overrides --do skip --domain of its " +
133
+ "domain; an explicit rule wins over a --kind one. A skipped email is never read or stored by sync. An " +
134
+ "envelope email costs no more from the mailbox than a skipped one; its subject is kept in its metadata, not " +
135
+ "in search. Changing an envelope rule to keep, or removing it, reads those emails in full on the next sync. " +
136
+ "Mail already stored in full stays; rules apply cuts or tags it.\n\n" +
137
+ "score: and --kind judge a sender by its mail in the same listing; a sync that lists only new mail judges it " +
138
+ "from that mail. has:attachment reads Content-Type at list time: a guess, not a parse.")
139
+ .action(async function (options) {
140
+ const rule = {
141
+ match: matchOf(options),
142
+ action: options.do.action,
143
+ ...(options.do.tags.length ? { tags: options.do.tags } : {}),
144
+ ...(options.do.protect ? { protected: true } : {}),
145
+ ...(options.kind === undefined ? {} : { source: `preset:${options.kind}` }),
146
+ ...(options.reason === undefined ? {} : { reason: options.reason }),
147
+ decided_at: new Date().toISOString(),
148
+ };
149
+ const saved = await withRules(this, (store, address) => saveRule(store, address, rule));
150
+ renderAnswer(this, outputFor(this), itemOf(saved), () => ruleLine(saved));
151
+ });
152
+ const removeCommand = () => matchOptions(grantsAuthority(annotate(new Command("remove"), {
153
+ effects: LOCAL_WRITE,
154
+ examples: [
155
+ `${IDENTITY.command} ya rules remove --domain shop.example`,
156
+ `${IDENTITY.command} ya rules remove --filter "older:365d larger:5MB"`,
157
+ ],
158
+ })))
159
+ .description("drop the rule with exactly these conditions")
160
+ .action(async function (options) {
161
+ const match = matchOf(options);
162
+ const { removed, profile } = await withRules(this, async (store, address, context) => ({
163
+ removed: await removeRule(store, address, match),
164
+ profile: context.profile,
165
+ }));
166
+ if (!removed)
167
+ throw new CliError("not_found", `no rule for ${describeMatch(match)}; \`${IDENTITY.command} ${profile} rules list\` shows them`, { reason: "mail.rule-not-found" });
168
+ renderAnswer(this, outputFor(this), itemOf({ removed: match }), () => `removed the rule for ${describeMatch(match)}`);
169
+ });
170
+ const applyCommand = () => annotate(new Command("apply"), {
171
+ effects: LOCAL_WRITE,
172
+ examples: [
173
+ `${IDENTITY.command} ya rules apply`,
174
+ `${IDENTITY.command} ya rules apply --since-time 2026-01-01 --yes`,
175
+ ],
176
+ })
177
+ .description("cut stored mail an envelope rule matches to its envelope; dry run unless --yes")
178
+ .option("--since-time <time>", "only mail from this time, ISO 8601 or 30d ago (default: all mail)")
179
+ .option("--dry-run", "only say what would change, even with --yes; the read-only lock lets this through")
180
+ .addHelpText("after", "\nWithout --yes it only says what would change. Reads the mailbox's headers from the server, from the folders sync reads (List-Id is not stored), then " +
181
+ "drops the text, attachments and search entries of each matching stored email and keeps its sender, date, " +
182
+ "size, labels and subject in metadata. Mail a skip rule matches is left as stored. Nothing changes in the " +
183
+ "mailbox. Changing a rule to keep, or removing it, reads those emails in full on the next sync.")
184
+ .action(async function (options) {
185
+ const context = contextOf(this);
186
+ refuseOffline(context.flags);
187
+ const address = addressOf(context);
188
+ const window = dateWindow({ sinceTime: options.sinceTime });
189
+ const since = new Date(window.since ?? 0);
190
+ // --yes is the shared program's; it is read from the globals, as cli-core's own confirmed writes read it.
191
+ const apply = this.optsWithGlobals().yes === true && options.dryRun !== true;
192
+ const { backend } = await openMail(context);
193
+ try {
194
+ const result = await withRules(this, async (store) => applyRules({
195
+ store,
196
+ source: backend,
197
+ account: { address, rules: await storedMailRules(store, { address }) },
198
+ folders: await syncFoldersOf(context.settings.mailbox, backend),
199
+ since,
200
+ apply,
201
+ }));
202
+ const next = result.applied || result.envelopes + result.tagged === 0
203
+ ? []
204
+ : [
205
+ {
206
+ kind: "command",
207
+ step: "mail.rules-apply",
208
+ command: "rules apply",
209
+ args: { yes: true, ...(options.sinceTime === undefined ? {} : { since_time: options.sinceTime }) },
210
+ why: "this was a dry run; --yes cuts them",
211
+ safe_to_auto_execute: false,
212
+ },
213
+ ];
214
+ renderAnswer(this, outputFor(this), itemOf(snakeKeys(result), { next, meta: window.meta }), () => applyText(result));
215
+ }
216
+ finally {
217
+ await backend.close();
218
+ }
219
+ });
220
+ const exportCommand = () => annotate(new Command("export"), {
221
+ effects: LOCAL_READ,
222
+ examples: [`${IDENTITY.command} ya rules export`],
223
+ })
224
+ .description("print this mailbox's rules as JSON, to review, keep or move elsewhere")
225
+ .addHelpText("after", `\n${IDENTITY.command} ya rules export > rules.json; ${IDENTITY.command} ya rules import rules.json reads it ` +
226
+ "back. memo mail rules import reads it too.")
227
+ .action(async function () {
228
+ const file = await withRules(this, async (store, address) => {
229
+ const rules = await storedMailRules(store, { address });
230
+ return { version: 1, account: address, rules: rules.map(({ id: _, ...rule }) => rule) };
231
+ });
232
+ outputFor(this).streams.data(`${JSON.stringify(file, null, 2)}\n`);
233
+ });
234
+ const importCommand = () => grantsAuthority(annotate(new Command("import"), {
235
+ effects: LOCAL_WRITE,
236
+ examples: [
237
+ `${IDENTITY.command} ya rules import rules.json`,
238
+ `${IDENTITY.command} ya rules import Filters.json --format gmail`,
239
+ `${IDENTITY.command} ya rules import Filters.json --format gmail --yes`,
240
+ ],
241
+ }))
242
+ .summary("import saved rules, or preview Gmail filters")
243
+ .description("import saved rules, or preview Gmail filters with --format gmail; same match replaces")
244
+ .argument("<file>", "a rules JSON file from rules export, or Takeout Filters.json with --format gmail")
245
+ .addOption(new Option("--format <format>", "the file's format: mail (memo's export is the same file) or gmail")
246
+ .choices(["mail", "memo", "gmail"])
247
+ .default("mail"))
248
+ .addHelpText("after", "\nWith --format gmail it only previews the rules the filters suggest; --yes adds them. A rules file is " +
249
+ "imported at once.")
250
+ .action(async function (path, options) {
251
+ const yes = this.optsWithGlobals().yes === true;
252
+ const text = readFileSync(path, "utf8");
253
+ if (options.format === "gmail") {
254
+ const parsed = importFilters(text, path);
255
+ const { proposal, mapping, added, profile } = await withRules(this, async (store, address, context) => {
256
+ const { rules: mapped, mapping } = await mapProposedTags(store, parsed.rules);
257
+ const proposal = { ...parsed, rules: mapped };
258
+ if (!yes)
259
+ return { proposal, mapping, added: 0, profile: context.profile };
260
+ for (const rule of proposal.rules)
261
+ await saveRule(store, address, rule);
262
+ return { proposal, mapping, added: proposal.rules.length, profile: context.profile };
263
+ });
264
+ renderAnswer(this, outputFor(this), itemOf({ rules: proposal.rules, skipped: proposal.skipped, tag_mapping: mapping, added }), () => [
265
+ ...proposal.rules.map(ruleLine),
266
+ ...mapping.map(({ tag, as, why }) => `label ${tag} → ${as} (${why === "reuse" ? "same label" : "similar label"})`),
267
+ ...proposal.skipped.map(({ filter, why }) => `skipped ${filter}: ${why}`),
268
+ yes
269
+ ? `added ${added} rules`
270
+ : `${proposal.rules.length} rules proposed; ` +
271
+ `\`${IDENTITY.command} ${profile} rules import ${path} --format gmail --yes\` adds them`,
272
+ ].join("\n"));
273
+ return;
274
+ }
275
+ const rules = rulesFileOf(text, path, `${IDENTITY.command} <profile> rules export`);
276
+ const saved = await withRules(this, async (store, address) => {
277
+ const out = [];
278
+ for (const rule of rules)
279
+ out.push(await saveRule(store, address, rule));
280
+ return out;
281
+ });
282
+ renderAnswer(this, outputFor(this), listOf("rules import", { items: saved, limit: Math.max(1, saved.length), has_more: false }), () => `imported ${saved.length} rules`);
283
+ });
284
+ export const rulesCommand = () => annotate(new Command("rules"), { effects: LOCAL_READ })
285
+ .description("the owner's decisions on which mail to keep, record, skip, tag or protect")
286
+ .addCommand(listCommand())
287
+ .addCommand(addCommand())
288
+ .addCommand(removeCommand())
289
+ .addCommand(applyCommand())
290
+ .addCommand(exportCommand())
291
+ .addCommand(importCommand());
292
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/commands/rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { Command } from "commander";
2
+ import * as v from "valibot";
3
+ import { type Outgoing } from "../mail/send.js";
4
+ import { type Opened } from "./messages.js";
5
+ export declare const mailSend: v.LooseObjectSchema<{
6
+ readonly sent: v.BooleanSchema<undefined>;
7
+ readonly already_sent: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
8
+ readonly operation_id: v.StringSchema<undefined>;
9
+ readonly message_id: v.StringSchema<undefined>;
10
+ readonly from: v.StringSchema<undefined>;
11
+ readonly to: v.ArraySchema<v.StringSchema<undefined>, undefined>;
12
+ readonly cc: v.ArraySchema<v.StringSchema<undefined>, undefined>;
13
+ readonly bcc: v.ArraySchema<v.StringSchema<undefined>, undefined>;
14
+ readonly subject: v.StringSchema<undefined>;
15
+ readonly attachments: v.ArraySchema<v.StrictObjectSchema<{
16
+ readonly name: v.StringSchema<undefined>;
17
+ readonly bytes: v.NumberSchema<undefined>;
18
+ }, undefined>, undefined>;
19
+ readonly text_chars: v.NumberSchema<undefined>;
20
+ readonly accepted: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
21
+ readonly rejected: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
22
+ readonly sent_copy: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
23
+ readonly stored: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
24
+ readonly marked_original: v.OptionalSchema<v.NullableSchema<v.BooleanSchema<undefined>, undefined>, undefined>;
25
+ readonly hint: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
26
+ }, undefined>;
27
+ export declare const operationIdOf: (given: string | undefined) => string;
28
+ /** The owner's own addresses: the profile's address and a login that is an address too. */
29
+ export declare const ownerOf: (opened: Opened, command: Command) => Set<string>;
30
+ export declare const filesOf: (command: Command, paths: readonly string[], anyFile: boolean) => Promise<{
31
+ name: string;
32
+ path: string;
33
+ bytes: number;
34
+ }[]>;
35
+ /** Checks, previews or sends, and answers; the outcome of a send that left, for what the caller does after. */
36
+ export declare const go: (command: Command, opened: Opened, outgoing: Outgoing, dryRun: boolean) => Promise<import("../mail/send.js").Sent | undefined>;
37
+ export declare const sendCommand: () => Command;
38
+ export declare const forwardCommand: () => Command;
39
+ //# sourceMappingURL=send.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAiB5B,OAAO,EAA2B,KAAK,QAAQ,EAAmC,MAAM,iBAAiB,CAAA;AAGzG,OAAO,EAAE,KAAK,MAAM,EAAc,MAAM,eAAe,CAAA;AAkBvD,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;aAkBnB,CAAA;AAEF,eAAO,MAAM,aAAa,UAAW,MAAM,GAAG,SAAS,WAOtD,CAAA;AAED,2FAA2F;AAC3F,eAAO,MAAM,OAAO,WAAY,MAAM,WAAW,OAAO,KAAG,GAAG,CAAC,MAAM,CAQpE,CAAA;AAgCD,eAAO,MAAM,OAAO,YAAmB,OAAO,SAAS,SAAS,MAAM,EAAE,WAAW,OAAO;;;;IASzF,CAAA;AA2DD,+GAA+G;AAC/G,eAAO,MAAM,EAAE,YAAmB,OAAO,UAAU,MAAM,YAAY,QAAQ,UAAU,OAAO,wDA+B7F,CAAA;AA6FD,eAAO,MAAM,WAAW,QAAO,OA2BR,CAAA;AAyCvB,eAAO,MAAM,cAAc,QAAO,OAwBR,CAAA"}