@wirecat/mail-cli 0.1.0 → 0.2.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 (212) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +37 -11
  3. package/dist/bin/mail.js +2 -2
  4. package/dist/bundle/{all-profiles-TKMBELRZ.js → all-profiles-7WILOT5E.js} +5 -5
  5. package/dist/bundle/{anthropic-7LMUAEIZ.js → anthropic-NHWLIMEZ.js} +3 -3
  6. package/dist/bundle/{app-server-JGMIJDD4.js → app-server-XDMYCJLV.js} +39 -39
  7. package/dist/bundle/{bun-XRO6XJHQ.js → bun-GTG5IYLQ.js} +2 -2
  8. package/dist/bundle/{bun-sqlite-Z54LEHVM.js → bun-sqlite-KGH5F33G.js} +2 -2
  9. package/dist/bundle/{chunk-JVMVLITS.js → chunk-2X4WYZPA.js} +4 -2
  10. package/dist/bundle/{chunk-GN62YOT5.js → chunk-4I3YT5KK.js} +4 -4
  11. package/dist/bundle/{chunk-MS53RALV.js → chunk-5FLW25US.js} +5 -5
  12. package/dist/bundle/{chunk-FZ5FXIG6.js → chunk-5JOKRFWE.js} +1 -1
  13. package/dist/bundle/{chunk-KHTO2Q6E.js → chunk-6HIW7IJL.js} +4 -4
  14. package/dist/bundle/{chunk-TVREDYX4.js → chunk-76IKLP2M.js} +95 -91
  15. package/dist/bundle/{chunk-ZANYM66S.js → chunk-77VHMI3A.js} +1 -1
  16. package/dist/bundle/{chunk-TQFCPUIM.js → chunk-7LKJDJNS.js} +1 -1
  17. package/dist/bundle/{chunk-WLFLBWNH.js → chunk-7QEE5I7H.js} +2 -2
  18. package/dist/bundle/{chunk-6MAZWSC3.js → chunk-7REG25RM.js} +3 -3
  19. package/dist/bundle/{chunk-TWTATDM7.js → chunk-AJIT2T3F.js} +6 -6
  20. package/dist/bundle/{chunk-JBBZCTTF.js → chunk-AROBJF5P.js} +1 -1
  21. package/dist/bundle/{chunk-NK7EB63L.js → chunk-BKZEYTLU.js} +849 -440
  22. package/dist/bundle/{chunk-4FEMINO2.js → chunk-BPF7IXJT.js} +5 -5
  23. package/dist/bundle/{chunk-BTQX2ZSZ.js → chunk-BUOSCMCD.js} +2 -2
  24. package/dist/bundle/{chunk-5NYMNSSO.js → chunk-CT7NG7BI.js} +3 -3
  25. package/dist/bundle/{chunk-TWPDVUBR.js → chunk-D7UZXUSB.js} +2 -2
  26. package/dist/bundle/{chunk-OTUOZ33L.js → chunk-DDMJ3RVO.js} +2 -2
  27. package/dist/bundle/{chunk-3KEVLSNN.js → chunk-EKE3R36Y.js} +46 -8
  28. package/dist/bundle/{chunk-YO4CUH5E.js → chunk-ETPT7TPW.js} +1 -1
  29. package/dist/bundle/{chunk-3KOA73LS.js → chunk-GPAAQ6LY.js} +14 -14
  30. package/dist/bundle/{chunk-GQQJOH7A.js → chunk-GQKYSGIA.js} +58 -46
  31. package/dist/bundle/{chunk-QLEUNU6G.js → chunk-H5BW7454.js} +4 -4
  32. package/dist/bundle/{chunk-KM7Q67Z3.js → chunk-H66ZMBDD.js} +1 -1
  33. package/dist/bundle/{chunk-VEIZZRQ5.js → chunk-H7NUGJPV.js} +12 -3
  34. package/dist/bundle/{chunk-2LLNPNMB.js → chunk-H7XOHNRY.js} +1 -1
  35. package/dist/bundle/{chunk-F6D6PJ34.js → chunk-HJRUFT5Y.js} +5 -5
  36. package/dist/bundle/{chunk-5WGEUDE4.js → chunk-MABCR67K.js} +1 -1
  37. package/dist/bundle/{chunk-IK5TH3O7.js → chunk-MDVXIPA3.js} +10 -10
  38. package/dist/bundle/{chunk-YPQQ5J4X.js → chunk-QJHCKFFC.js} +16 -16
  39. package/dist/bundle/{chunk-Z34ICZA3.js → chunk-QLYHLW54.js} +5 -5
  40. package/dist/bundle/{chunk-7SXGLT6T.js → chunk-QUGFBY7O.js} +9 -8
  41. package/dist/bundle/{chunk-CEW6KIFA.js → chunk-QUSZWBZF.js} +21 -21
  42. package/dist/bundle/{chunk-FDCGTODC.js → chunk-R5JD4GMA.js} +1 -1
  43. package/dist/bundle/{chunk-K4FVKPDQ.js → chunk-S2GSU4MT.js} +9 -9
  44. package/dist/bundle/{chunk-T6464KYA.js → chunk-STC45HZX.js} +204 -203
  45. package/dist/bundle/{chunk-75CWWETH.js → chunk-SVNTRF5O.js} +11 -11
  46. package/dist/bundle/{chunk-GWDCKUBI.js → chunk-THVLMTH7.js} +30 -29
  47. package/dist/bundle/{chunk-4E7BN3TC.js → chunk-TMVIQJCG.js} +2 -2
  48. package/dist/bundle/{chunk-EOEDICIE.js → chunk-UZR3IKS7.js} +1 -1
  49. package/dist/bundle/{chunk-CH6RXYAX.js → chunk-VBLFQJY3.js} +1 -1
  50. package/dist/bundle/{chunk-GAH7N7HO.js → chunk-VRQRBVKT.js} +44 -44
  51. package/dist/bundle/{chunk-GK4M2SUP.js → chunk-VWO3XXSF.js} +1 -1
  52. package/dist/bundle/{chunk-QQB7WT7R.js → chunk-WJ3LUWRN.js} +3 -3
  53. package/dist/bundle/{chunk-3E3WA2L6.js → chunk-Y5WA7AOA.js} +21 -21
  54. package/dist/bundle/{chunk-TE5U5OAM.js → chunk-Y6KUKIQZ.js} +2 -2
  55. package/dist/bundle/{chunk-J6MSJLIW.js → chunk-YQAUH3PN.js} +1 -1
  56. package/dist/bundle/{chunk-MNOIRJEO.js → chunk-Z6F7EXT2.js} +7 -7
  57. package/dist/bundle/{chunk-WXAXYJJ7.js → chunk-ZKH5CHGI.js} +5 -5
  58. package/dist/bundle/{chunk-UH4DDRHA.js → chunk-ZNYJG4AY.js} +42 -42
  59. package/dist/bundle/{command-contract-WU434ZUL.js → command-contract-Y42ULKE5.js} +13 -13
  60. package/dist/bundle/{decode-YB3ZDTES.js → decode-L4X542L3.js} +2 -2
  61. package/dist/bundle/{dist-X36THCOF.js → dist-HFUVURJG.js} +1 -1
  62. package/dist/bundle/{dist-A6GKSKFC.js → dist-WKIRHOLK.js} +14 -14
  63. package/dist/bundle/{echarts-YNGCOYHW.js → echarts-G6QLXR4X.js} +2 -2
  64. package/dist/bundle/{embed-LWNHIRBQ.js → embed-E33ZBHQR.js} +3 -3
  65. package/dist/bundle/{embedder-2LYD3U37.js → embedder-EMBCIVGF.js} +6 -6
  66. package/dist/bundle/{first-run-N3HJKGU7.js → first-run-WF2HF5FI.js} +5 -5
  67. package/dist/bundle/{first-screen-4U2DMV3G.js → first-screen-DZFOUUZC.js} +14 -14
  68. package/dist/bundle/{instructions-GJHHFV64.js → instructions-DUH7265J.js} +1 -1
  69. package/dist/bundle/mail.js +2 -2
  70. package/dist/bundle/{node-GFOH6FKP.js → node-73PKCCE7.js} +2 -2
  71. package/dist/bundle/{node-sqlite-NBXQXBIU.js → node-sqlite-FDD5N6GC.js} +2 -2
  72. package/dist/bundle/{oauth-56EFO5AQ.js → oauth-ND3K2F7B.js} +4 -4
  73. package/dist/bundle/{open-2V7QZQJP.js → open-FZYY6TKE.js} +1 -1
  74. package/dist/bundle/{openai-V3SVACVL.js → openai-BXOF6XIM.js} +10 -10
  75. package/dist/bundle/{process-XVDX4SPD.js → process-TXIK4VJP.js} +1 -1
  76. package/dist/bundle/{program-ILID6EAT.js → program-2SUR4WOS.js} +1700 -1459
  77. package/dist/bundle/{prompt-YKWAI222.js → prompt-I5GCP73M.js} +2 -2
  78. package/dist/bundle/{recognize-PAR66KVM.js → recognize-ILYEKXVB.js} +1 -1
  79. package/dist/bundle/{remote-CE43TKXC.js → remote-SSPZEAJ7.js} +4 -4
  80. package/dist/bundle/{rerank-M7S7P2TW.js → rerank-NAO5RMGB.js} +4 -4
  81. package/dist/bundle/{serve-ENPMIV6J.js → serve-UDXIEQKC.js} +6 -6
  82. package/dist/bundle/{server-MBEZLVKZ.js → server-KTPELKAN.js} +31 -31
  83. package/dist/bundle/server-UZFSEKNJ.js +63 -0
  84. package/dist/bundle/{sqlite-runtime-HVGDHBJJ.js → sqlite-runtime-AONFLND6.js} +2 -2
  85. package/dist/bundle/{state-QZSOSKBD.js → state-I4PLX3UB.js} +3 -3
  86. package/dist/bundle/{store-UJ7SNKXI.js → store-OHQH3MGN.js} +30 -12
  87. package/dist/bundle/{store-2BUX6LVX.js → store-ZPPRXGPY.js} +9 -9
  88. package/dist/bundle/store-maintenance-command-QOYXEBT6.js +52 -0
  89. package/dist/commands/account.d.ts.map +1 -1
  90. package/dist/commands/account.js +6 -5
  91. package/dist/commands/account.js.map +1 -1
  92. package/dist/commands/context.d.ts +19 -8
  93. package/dist/commands/context.d.ts.map +1 -1
  94. package/dist/commands/context.js +14 -10
  95. package/dist/commands/context.js.map +1 -1
  96. package/dist/commands/folders.js +4 -4
  97. package/dist/commands/folders.js.map +1 -1
  98. package/dist/commands/login.d.ts +2 -2
  99. package/dist/commands/login.d.ts.map +1 -1
  100. package/dist/commands/login.js +3 -5
  101. package/dist/commands/login.js.map +1 -1
  102. package/dist/commands/mailbox.d.ts +2 -1
  103. package/dist/commands/mailbox.d.ts.map +1 -1
  104. package/dist/commands/mailbox.js.map +1 -1
  105. package/dist/commands/session-start.d.ts +3 -0
  106. package/dist/commands/session-start.d.ts.map +1 -0
  107. package/dist/commands/session-start.js +117 -0
  108. package/dist/commands/session-start.js.map +1 -0
  109. package/dist/commands/session.d.ts.map +1 -1
  110. package/dist/commands/session.js +9 -117
  111. package/dist/commands/session.js.map +1 -1
  112. package/dist/commands/status.d.ts.map +1 -1
  113. package/dist/commands/status.js +8 -20
  114. package/dist/commands/status.js.map +1 -1
  115. package/dist/commands/sync.d.ts.map +1 -1
  116. package/dist/commands/sync.js +49 -26
  117. package/dist/commands/sync.js.map +1 -1
  118. package/dist/config.d.ts +2 -0
  119. package/dist/config.d.ts.map +1 -1
  120. package/dist/config.js +4 -0
  121. package/dist/config.js.map +1 -1
  122. package/dist/discovery.d.ts +4 -15
  123. package/dist/discovery.d.ts.map +1 -1
  124. package/dist/discovery.js +19 -92
  125. package/dist/discovery.js.map +1 -1
  126. package/dist/mail/backend.d.ts +36 -0
  127. package/dist/mail/backend.d.ts.map +1 -0
  128. package/dist/mail/backend.js +2 -0
  129. package/dist/mail/backend.js.map +1 -0
  130. package/dist/mail/imap/account.d.ts +5 -0
  131. package/dist/mail/imap/account.d.ts.map +1 -0
  132. package/dist/mail/imap/account.js +41 -0
  133. package/dist/mail/imap/account.js.map +1 -0
  134. package/dist/mail/imap/connection.d.ts +62 -0
  135. package/dist/mail/imap/connection.d.ts.map +1 -0
  136. package/dist/mail/imap/connection.js +188 -0
  137. package/dist/mail/imap/connection.js.map +1 -0
  138. package/dist/mail/{imap-errors.d.ts → imap/errors.d.ts} +1 -1
  139. package/dist/mail/imap/errors.d.ts.map +1 -0
  140. package/dist/mail/{imap-errors.js → imap/errors.js} +1 -1
  141. package/dist/mail/imap/errors.js.map +1 -0
  142. package/dist/mail/imap/index.d.ts +7 -0
  143. package/dist/mail/imap/index.d.ts.map +1 -0
  144. package/dist/mail/imap/index.js +11 -0
  145. package/dist/mail/imap/index.js.map +1 -0
  146. package/dist/mail/{imap-messages.d.ts → imap/messages.d.ts} +9 -9
  147. package/dist/mail/imap/messages.d.ts.map +1 -0
  148. package/dist/mail/imap/messages.js +66 -0
  149. package/dist/mail/imap/messages.js.map +1 -0
  150. package/dist/mail/imap/read.d.ts +7 -0
  151. package/dist/mail/imap/read.d.ts.map +1 -0
  152. package/dist/mail/imap/read.js +164 -0
  153. package/dist/mail/imap/read.js.map +1 -0
  154. package/dist/mail/rethread.d.ts +15 -0
  155. package/dist/mail/rethread.d.ts.map +1 -0
  156. package/dist/mail/rethread.js +52 -0
  157. package/dist/mail/rethread.js.map +1 -0
  158. package/dist/profile.d.ts +2 -1
  159. package/dist/profile.d.ts.map +1 -1
  160. package/dist/profile.js +1 -0
  161. package/dist/profile.js.map +1 -1
  162. package/dist/providers.d.ts +126 -26
  163. package/dist/providers.d.ts.map +1 -1
  164. package/dist/providers.js +141 -72
  165. package/dist/providers.js.map +1 -1
  166. package/dist/secret.d.ts +2 -1
  167. package/dist/secret.d.ts.map +1 -1
  168. package/dist/secret.js +1 -0
  169. package/dist/secret.js.map +1 -1
  170. package/dist/version.d.ts +1 -1
  171. package/dist/version.js +1 -1
  172. package/package.json +3 -2
  173. package/skills/mail-cli/SKILL.md +8 -0
  174. package/dist/bundle/server-JRTHUCVY.js +0 -63
  175. package/dist/bundle/store-maintenance-command-I7V5C44K.js +0 -52
  176. package/dist/commands/doctor.d.ts +0 -77
  177. package/dist/commands/doctor.d.ts.map +0 -1
  178. package/dist/commands/doctor.js +0 -74
  179. package/dist/commands/doctor.js.map +0 -1
  180. package/dist/commands/mcp.d.ts +0 -3
  181. package/dist/commands/mcp.d.ts.map +0 -1
  182. package/dist/commands/mcp.js +0 -97
  183. package/dist/commands/mcp.js.map +0 -1
  184. package/dist/commands/setup.d.ts +0 -3
  185. package/dist/commands/setup.d.ts.map +0 -1
  186. package/dist/commands/setup.js +0 -156
  187. package/dist/commands/setup.js.map +0 -1
  188. package/dist/mail/imap-errors.d.ts.map +0 -1
  189. package/dist/mail/imap-errors.js.map +0 -1
  190. package/dist/mail/imap-messages.d.ts.map +0 -1
  191. package/dist/mail/imap-messages.js +0 -66
  192. package/dist/mail/imap-messages.js.map +0 -1
  193. package/dist/mail/imap.d.ts +0 -67
  194. package/dist/mail/imap.d.ts.map +0 -1
  195. package/dist/mail/imap.js +0 -348
  196. package/dist/mail/imap.js.map +0 -1
  197. package/dist/mail/parse.d.ts +0 -18
  198. package/dist/mail/parse.d.ts.map +0 -1
  199. package/dist/mail/parse.js +0 -31
  200. package/dist/mail/parse.js.map +0 -1
  201. package/dist/mail/port.d.ts +0 -50
  202. package/dist/mail/port.d.ts.map +0 -1
  203. package/dist/mail/port.js +0 -4
  204. package/dist/mail/port.js.map +0 -1
  205. package/dist/mcp.d.ts +0 -29
  206. package/dist/mcp.d.ts.map +0 -1
  207. package/dist/mcp.js +0 -98
  208. package/dist/mcp.js.map +0 -1
  209. package/dist/sync.d.ts +0 -26
  210. package/dist/sync.d.ts.map +0 -1
  211. package/dist/sync.js +0 -75
  212. package/dist/sync.js.map +0 -1
@@ -2,13 +2,15 @@ import { CliError } from "@wirecat/cli-base";
2
2
  import { annotate } from "@wirecat/cli-base/commands";
3
3
  import { timezoneOf, zonedMoment } from "@wirecat/cli-base/query";
4
4
  import { answerEntity, baseContext, environmentOf, FETCH, itemOf, outputFor, renderAnswer, runBudgetOf, } from "@wirecat/cli-core/cli";
5
- import { syncMail } from "@wirecat/cli-core/mail";
5
+ import { storedMailRules, syncMail } from "@wirecat/cli-core/mail";
6
6
  import { Command } from "commander";
7
7
  import * as v from "valibot";
8
8
  import { configuration } from "../config.js";
9
9
  import { IDENTITY } from "../identity.js";
10
+ import { rethreadStored } from "../mail/rethread.js";
11
+ import { DEFAULT_SYNC, providerFor } from "../providers.js";
10
12
  import { openMailStore } from "../store.js";
11
- import { collect, contextOf, openSource, refuseOffline } from "./context.js";
13
+ import { collect, contextOf, openMail, refuseOffline } from "./context.js";
12
14
  const DAY_MS = 86_400_000;
13
15
  const DEFAULT_DAYS = 30;
14
16
  /** A time without a zone is read in `zone`, and a date alone starts at its local midnight (WC-TIME-3, WC-TIME-5). */
@@ -51,17 +53,15 @@ const wholeNumberFor = (flag) => (value) => {
51
53
  });
52
54
  return Number(value);
53
55
  };
54
- /** INBOX and the folder the server marks as Sent, unless the profile or `--folder` says otherwise. */
55
- const foldersFor = async (explicit, configured, list) => {
56
+ /** The provider's folders by role (INBOX and Sent, All Mail on Gmail), unless the profile or `--folder` names some. */
57
+ const foldersFor = async (explicit, configured, defaults, list) => {
56
58
  if (explicit?.length)
57
59
  return explicit;
58
60
  if (configured?.length)
59
61
  return configured;
60
62
  const found = await list();
61
- const chosen = found
62
- .filter((folder) => folder.role === "inbox" || folder.role === "sent")
63
- .map((folder) => folder.path);
64
- return chosen.length ? chosen : ["INBOX"];
63
+ const chosen = found.filter((folder) => folder.role && defaults.roles.includes(folder.role)).map(({ path }) => path);
64
+ return chosen.length ? chosen : [defaults.otherwise];
65
65
  };
66
66
  const mailSync = v.strictObject({
67
67
  address: v.string(),
@@ -69,7 +69,7 @@ const mailSync = v.strictObject({
69
69
  timezone: v.string(),
70
70
  folders: v.array(v.string()),
71
71
  state: v.picklist(["partial", "complete"]),
72
- stopped: v.optional(v.picklist(["requests", "deadline", "cancelled"])),
72
+ stopped: v.optional(v.picklist(["requests", "deadline", "cancelled", "limit"])),
73
73
  requests: v.number(),
74
74
  listed: v.number(),
75
75
  saved: v.number(),
@@ -77,6 +77,8 @@ const mailSync = v.strictObject({
77
77
  deleted: v.number(),
78
78
  complete: v.boolean(),
79
79
  remaining: v.number(),
80
+ /** With --rescan: stored emails moved to the thread their References name. */
81
+ rethreaded: v.optional(v.number()),
80
82
  unreadable: v.number(),
81
83
  deletions_skipped: v.optional(v.string()),
82
84
  hint: v.optional(v.string()),
@@ -96,8 +98,8 @@ export const syncCommand = () => answerEntity(annotate(new Command("sync"), {
96
98
  .option("--since-time <time>", "only mail received since this date or time; a date alone starts at local midnight, a time without a zone is local (default: 30 days)")
97
99
  .option("--limit <n>", "save at most this many new emails in this run, newest first", wholeNumberFor("limit"))
98
100
  .option("--max-pages <pages>", "at most this many requests to the mail server in this run; as many as fit the deadline if not given", wholeNumberFor("max-pages"))
99
- .option("--folder <folder>", "a folder to read; repeat it for more (default: the profile's folders, else INBOX and Sent)", collect)
100
- .option("--rescan", "list every message in the window again, not only those an earlier run left")
101
+ .option("--folder <folder>", "a folder to read; repeat it for more (default: the profile's folders, else INBOX and Sent; All Mail on Gmail)", collect)
102
+ .option("--rescan", "list the whole window again; also moves stored replies into their thread where the server has no thread ids")
101
103
  .action(async function (args) {
102
104
  const context = contextOf(this);
103
105
  refuseOffline(context.flags);
@@ -108,30 +110,43 @@ export const syncCommand = () => answerEntity(annotate(new Command("sync"), {
108
110
  const since = sinceOf(args.sinceTime, zone, Date.now());
109
111
  const { signal } = environmentOf(this);
110
112
  const budget = runBudgetOf(this, args.maxPages);
111
- // A retry is a request of the budget; openSource keeps it from ending after the deadline.
112
- const { source } = await openSource(context, { canRetry: () => budget.take() === null });
113
+ // A retry is a request of the budget; openMail keeps it from ending after the deadline.
114
+ const { backend } = await openMail(context, { canRetry: () => budget.take() === null });
113
115
  try {
114
- const report = await baseContext(this, configuration.resolveSettings).run(async () => {
115
- const folders = await foldersFor(args.folder, context.settings.mailbox.folders, () => source.folderList());
116
+ const { report, rethreaded } = await baseContext(this, configuration.resolveSettings).run(async () => {
117
+ const { mailbox } = context.settings;
118
+ const defaults = providerFor(address, mailbox.host)?.sync ?? DEFAULT_SYNC;
119
+ const folders = await foldersFor(args.folder, mailbox.folders, defaults, () => backend.folderList());
116
120
  const store = await openMailStore(context.env);
117
121
  environmentOf(this).trackCloseable?.(store);
118
122
  try {
119
- return await syncMail(source, store, {
120
- account: { address, mode: "imap", folders },
123
+ // The stored rules, as memo passes them: the saved position holds their fingerprint, so both must agree.
124
+ const rules = await storedMailRules(store, { address });
125
+ const report = await syncMail(backend, store, {
126
+ account: { address, mode: defaults.mode ?? "imap", folders, rules },
121
127
  since,
122
128
  budget,
123
129
  ...(args.limit === undefined ? {} : { max: args.limit }),
124
130
  ...(args.rescan ? { rescan: true } : {}),
125
131
  ...(signal ? { signal } : {}),
126
132
  });
133
+ const key = { provider: "email", account: address.toLowerCase() };
134
+ const rethreaded = args.rescan && !report.stopped
135
+ ? await rethreadStored(backend, store, key, folders, since, () => budget.take() === null)
136
+ : undefined;
137
+ return { report, rethreaded };
127
138
  }
128
139
  finally {
129
140
  await store.close();
130
141
  }
131
142
  });
132
143
  const issues = issuesOf(report);
133
- const partial = report.state === "partial";
134
- const moved = report.saved + report.alreadyStored + report.skipped + report.envelopes > 0;
144
+ // cli-core reports a run its `max` cut short as incomplete with what it left, but with no reason.
145
+ const limited = args.limit !== undefined && !report.complete && !report.stopped && report.saved >= args.limit;
146
+ const stopped = report.stopped ?? (limited ? "limit" : undefined);
147
+ const unthreaded = rethreaded !== undefined && !rethreaded.complete;
148
+ const partial = (report.state ?? (report.complete ? "complete" : "partial")) === "partial" || limited || unthreaded;
149
+ const moved = report.saved + report.alreadyStored + report.skipped + report.envelopes > 0 || unthreaded;
135
150
  const timeout = this.optsWithGlobals().timeout;
136
151
  const next = partial && moved
137
152
  ? [
@@ -145,24 +160,31 @@ export const syncCommand = () => answerEntity(annotate(new Command("sync"), {
145
160
  max_pages: args.maxPages,
146
161
  timeout,
147
162
  folder: args.folder,
163
+ rescan: unthreaded ? true : undefined,
148
164
  }).filter(([, value]) => value !== undefined)),
149
- why: "the sync stopped before its end to answer in time; running it again goes on from where it stopped",
165
+ why: limited
166
+ ? `the run saved the ${args.limit} new emails --limit allows and left ${report.remaining ?? 0}; running it again saves the next ones`
167
+ : unthreaded
168
+ ? "the run stopped while it moved stored replies into their threads; --rescan again goes on"
169
+ : "the sync stopped before its end to answer in time; running it again goes on from where it stopped",
150
170
  safe_to_auto_execute: true,
151
171
  },
152
172
  ]
153
173
  : [];
154
174
  const hint = !partial
155
175
  ? undefined
156
- : moved
157
- ? `run sync again to continue; ${IDENTITY.command} ${context.profile} status shows how far it is`
158
- : "this run moved nothing on: raise --timeout or --max-pages, then run sync again";
176
+ : limited
177
+ ? `${report.remaining ?? 0} new emails are left; run sync again to save the next ${args.limit}`
178
+ : moved
179
+ ? `run sync again to continue; ${IDENTITY.command} ${context.profile} status shows how far it is`
180
+ : "this run moved nothing on: raise --timeout or --max-pages, then run sync again";
159
181
  renderAnswer(this, outputFor(this), itemOf({
160
182
  address: report.account,
161
183
  since: report.since,
162
184
  timezone: zone,
163
185
  folders: report.coverage?.folders ?? [],
164
- state: report.state ?? (report.complete ? "complete" : "partial"),
165
- ...(report.stopped ? { stopped: report.stopped } : {}),
186
+ state: partial ? "partial" : "complete",
187
+ ...(stopped ? { stopped } : {}),
166
188
  requests: report.requests ?? 0,
167
189
  listed: report.listed,
168
190
  saved: report.saved,
@@ -170,6 +192,7 @@ export const syncCommand = () => answerEntity(annotate(new Command("sync"), {
170
192
  deleted: report.deleted,
171
193
  complete: report.complete,
172
194
  remaining: report.remaining ?? 0,
195
+ ...(rethreaded ? { rethreaded: rethreaded.moved } : {}),
173
196
  unreadable: report.unreadable?.length ?? 0,
174
197
  ...(report.deletionsSkipped ? { deletions_skipped: report.deletionsSkipped } : {}),
175
198
  ...(hint ? { hint } : {}),
@@ -184,7 +207,7 @@ export const syncCommand = () => answerEntity(annotate(new Command("sync"), {
184
207
  }));
185
208
  }
186
209
  finally {
187
- await source.close();
210
+ await backend.close();
188
211
  }
189
212
  });
190
213
  //# sourceMappingURL=sync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -6,6 +6,8 @@ export interface Mailbox {
6
6
  host?: string;
7
7
  port?: number;
8
8
  security?: "tls" | "starttls";
9
+ /** How the profile signs in; a profile saved before this key existed uses an app password. */
10
+ auth: "app-password" | "oauth";
9
11
  folders?: string[];
10
12
  }
11
13
  export declare const configuration: {
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,QAAQ,EAAe,MAAM,uBAAuB,CAAA;AACtF,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAY5B,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,KAAK,GAAG,UAAU,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,eAAO,MAAM,aAAa;;iBAA0B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCzD,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAA"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,QAAQ,EAAe,MAAM,uBAAuB,CAAA;AACtF,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAa5B,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,KAAK,GAAG,UAAU,CAAA;IAC7B,8FAA8F;IAC9F,IAAI,EAAE,cAAc,GAAG,OAAO,CAAA;IAC9B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,eAAO,MAAM,aAAa;;iBAA0B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCzD,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAA"}
package/dist/config.js CHANGED
@@ -7,6 +7,7 @@ const PROFILE_ENTRIES = {
7
7
  imap_host: v.optional(v.string()),
8
8
  imap_port: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(65535))),
9
9
  imap_security: v.optional(v.picklist(["tls", "starttls"])),
10
+ auth: v.optional(v.picklist(["app-password", "oauth"])),
10
11
  folders: v.optional(v.array(v.string())),
11
12
  };
12
13
  export const configuration = settingsFor(IDENTITY, {
@@ -20,6 +21,7 @@ export const configuration = settingsFor(IDENTITY, {
20
21
  const port = pick("imap_port");
21
22
  const security = pick("imap_security");
22
23
  const folders = pick("folders");
24
+ const auth = pick("auth");
23
25
  const defined = (key, value) => (value === undefined ? {} : { [key]: value });
24
26
  return {
25
27
  values: {
@@ -30,6 +32,7 @@ export const configuration = settingsFor(IDENTITY, {
30
32
  ...defined("port", port.value),
31
33
  ...defined("security", security.value),
32
34
  ...defined("folders", folders.value),
35
+ auth: auth.value ?? "app-password",
33
36
  },
34
37
  },
35
38
  sources: {
@@ -39,6 +42,7 @@ export const configuration = settingsFor(IDENTITY, {
39
42
  imap_port: port.from,
40
43
  imap_security: security.from,
41
44
  folders: folders.from,
45
+ auth: auth.from,
42
46
  },
43
47
  };
44
48
  },
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAiB,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACtF,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,MAAM,eAAe,GAAG;IACtB,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC/B,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC7B,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACjC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACxF,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IAC1D,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;CACzC,CAAA;AAWD,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAuB,QAAQ,EAAE;IACvE,WAAW,EAAE,kBAAkB,EAAE;IACjC,OAAO,EAAE,eAAe;IACxB,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,CAAI,GAAW,EAAE,EAAE,CAAC,UAAU,CAAgB,GAAG,EAAE,SAAS,CAAC,CAAA;QAC1E,MAAM,OAAO,GAAG,IAAI,CAAS,SAAS,CAAC,CAAA;QACvC,MAAM,KAAK,GAAG,IAAI,CAAS,OAAO,CAAC,CAAA;QACnC,MAAM,IAAI,GAAG,IAAI,CAAS,WAAW,CAAC,CAAA;QACtC,MAAM,IAAI,GAAG,IAAI,CAAS,WAAW,CAAC,CAAA;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAqB,eAAe,CAAC,CAAA;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAW,SAAS,CAAC,CAAA;QACzC,MAAM,OAAO,GAAG,CAAI,GAAW,EAAE,KAAoB,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;QACvG,OAAO;YACL,MAAM,EAAE;gBACN,OAAO,EAAE;oBACP,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC;oBACpC,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;oBAChC,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;oBAC9B,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;oBAC9B,GAAG,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC;oBACtC,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC;iBACrC;aACF;YACD,OAAO,EAAE;gBACP,OAAO,EAAE,OAAO,CAAC,IAAI;gBACrB,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,aAAa,EAAE,QAAQ,CAAC,IAAI;gBAC5B,OAAO,EAAE,OAAO,CAAC,IAAI;aACtB;SACF,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -1,28 +1,17 @@
1
- import { type Prepare } from "./providers.js";
2
- export type Security = "tls" | "starttls";
3
- export interface Endpoint {
4
- host: string;
5
- port: number;
6
- security: Security;
7
- }
1
+ import { type Endpoint, type Prepare, type Provider } from "./providers.js";
8
2
  export interface Discovery {
9
3
  address: string;
10
4
  provider: string;
11
5
  imap: Endpoint;
12
6
  /** What the server wants as the login name. */
13
7
  login: string;
14
- auth: "app-password" | "oauth";
8
+ auth: Provider["auth"];
15
9
  found_by: "built-in" | "mx" | "ispdb" | "autoconfig";
16
10
  note?: string;
17
11
  prepare: Prepare;
18
12
  }
19
13
  export declare const ADDRESS: RegExp;
20
14
  export declare const domainOf: (address: string) => string;
21
- /** The steps for a saved profile: its address domain first, then its server host (a domain of its own on Yandex). */
22
- export declare const prepareFor: (address: string, host: string) => {
23
- provider: string;
24
- prepare: Prepare;
25
- };
26
15
  /** The names `--provider` and the interactive choice accept, in table order. */
27
16
  export declare const PROVIDER_NAMES: string[];
28
17
  /** A built-in provider picked by name, for an address whose own domain says nothing about its host. */
@@ -35,8 +24,8 @@ export interface DiscoveryDeps {
35
24
  /** The first IMAP server of a Mozilla autoconfig file; one that offers no encryption is ignored. */
36
25
  export declare const parseAutoconfig: (xml: string, address: string) => Omit<Discovery, "found_by" | "provider" | "auth" | "prepare"> | undefined;
37
26
  /**
38
- * Built-in table by domain, then the MX record, then Thunderbird's ISPDB, then the domain's own autoconfig file.
39
- * The result is only a proposal: `setup` shows it and the owner confirms.
27
+ * The built-in providers by domain, then the MX record, then Thunderbird's ISPDB, then the domain's own autoconfig
28
+ * file. `session start` prints what it found and sends the password there only to check it.
40
29
  */
41
30
  export declare const discover: (input: string, deps?: DiscoveryDeps) => Promise<Discovery>;
42
31
  //# sourceMappingURL=discovery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqC,KAAK,OAAO,EAAoB,MAAM,gBAAgB,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,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,QAAQ,CAAA;IACd,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,cAAc,GAAG,OAAO,CAAA;IAC9B,QAAQ,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,GAAG,YAAY,CAAA;IACpD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;CACjB;AA8ED,eAAO,MAAM,OAAO,QAA+D,CAAA;AAEnF,eAAO,MAAM,QAAQ,YAAa,MAAM,KAAG,MAK1C,CAAA;AAqBD,qHAAqH;AACrH,eAAO,MAAM,UAAU,YAAa,MAAM,QAAQ,MAAM,KAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAM9F,CAAA;AAID,gFAAgF;AAChF,eAAO,MAAM,cAAc,EAAE,MAAM,EAA2C,CAAA;AAE9E,uGAAuG;AACvG,eAAO,MAAM,cAAc,UAAW,MAAM,QAAQ,MAAM,KAAG,SAS5D,CAAA;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IACpB,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAQD,oGAAoG;AACpG,eAAO,MAAM,eAAe,QACrB,MAAM,WACF,MAAM,KACd,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,SAelE,CAAA;AAaD;;;GAGG;AACH,eAAO,MAAM,QAAQ,UAAiB,MAAM,SAAQ,aAAa,KAAQ,OAAO,CAAC,SAAS,CA8BzF,CAAA"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,QAAQ,EAIb,KAAK,OAAO,EACZ,KAAK,QAAQ,EAId,MAAM,gBAAgB,CAAA;AAEvB,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,QAAQ,CAAA;IACd,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IACtB,QAAQ,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,GAAG,YAAY,CAAA;IACpD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,eAAO,MAAM,OAAO,QAA+D,CAAA;AAEnF,eAAO,MAAM,QAAQ,YAAa,MAAM,KAAG,MAK1C,CAAA;AAkBD,gFAAgF;AAChF,eAAO,MAAM,cAAc,EAAE,MAAM,EAAoD,CAAA;AAEvF,uGAAuG;AACvG,eAAO,MAAM,cAAc,UAAW,MAAM,QAAQ,MAAM,KAAG,SAW5D,CAAA;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IACpB,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAQD,oGAAoG;AACpG,eAAO,MAAM,eAAe,QACrB,MAAM,WACF,MAAM,KACd,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,SAelE,CAAA;AAaD;;;GAGG;AACH,eAAO,MAAM,QAAQ,UAAiB,MAAM,SAAQ,aAAa,KAAQ,OAAO,CAAC,SAAS,CAiCzF,CAAA"}
package/dist/discovery.js CHANGED
@@ -1,71 +1,6 @@
1
1
  import { resolveMx } from "node:dns/promises";
2
2
  import { CliError } from "@wirecat/cli-base";
3
- import { GENERIC_PREPARE, PROVIDER_PREPARE } from "./providers.js";
4
- const tls = (host) => ({ host, port: 993, security: "tls" });
5
- const KNOWN = {
6
- yandex: {
7
- provider: "Yandex",
8
- imap: tls("imap.yandex.com"),
9
- auth: "app-password",
10
- note: "turn on IMAP and app passwords in Yandex settings, then make a password of type Mail",
11
- },
12
- gmail: {
13
- provider: "Gmail",
14
- imap: tls("imap.gmail.com"),
15
- auth: "app-password",
16
- note: "needs 2-step verification and an app password; IMAP downloads are capped at 2500 MB a day",
17
- },
18
- icloud: {
19
- provider: "iCloud",
20
- imap: tls("imap.mail.me.com"),
21
- auth: "app-password",
22
- note: "needs an app-specific password",
23
- },
24
- mailru: {
25
- provider: "Mail.ru",
26
- imap: tls("imap.mail.ru"),
27
- auth: "app-password",
28
- note: "needs an app password for external programs",
29
- },
30
- fastmail: { provider: "Fastmail", imap: tls("imap.fastmail.com"), auth: "app-password" },
31
- outlook: {
32
- provider: "Outlook",
33
- imap: tls("outlook.office365.com"),
34
- auth: "oauth",
35
- note: "Microsoft accepts only OAuth for IMAP; an app password cannot work, wait for OAuth sign-in",
36
- },
37
- };
38
- const BY_DOMAIN = {
39
- "yandex.ru": "yandex",
40
- "yandex.com": "yandex",
41
- "ya.ru": "yandex",
42
- "yandex.by": "yandex",
43
- "yandex.kz": "yandex",
44
- "yandex.ua": "yandex",
45
- "gmail.com": "gmail",
46
- "googlemail.com": "gmail",
47
- "icloud.com": "icloud",
48
- "me.com": "icloud",
49
- "mac.com": "icloud",
50
- "mail.ru": "mailru",
51
- "inbox.ru": "mailru",
52
- "list.ru": "mailru",
53
- "bk.ru": "mailru",
54
- "internet.ru": "mailru",
55
- "fastmail.com": "fastmail",
56
- "fastmail.fm": "fastmail",
57
- "outlook.com": "outlook",
58
- "hotmail.com": "outlook",
59
- "live.com": "outlook",
60
- };
61
- // A domain with its own name can still be hosted at one of these: its MX record says where.
62
- const BY_MX = [
63
- [/(^|\.)mx\.yandex\.(net|ru)$|(^|\.)yandex\.(net|ru)$/, "yandex"],
64
- [/(^|\.)(aspmx\.l\.google\.com|googlemail\.com|google\.com)$/, "gmail"],
65
- [/\.mail\.protection\.outlook\.com$/, "outlook"],
66
- [/(^|\.)messagingengine\.com$/, "fastmail"],
67
- [/(^|\.)mail\.ru$/, "mailru"],
68
- ];
3
+ import { GENERIC_PREPARE, PROVIDER_KEYS, PROVIDERS, providerByDomain, } from "./providers.js";
69
4
  export const ADDRESS = /^[^\s@<>()[\]\\,;:"]+@([A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)+)$/;
70
5
  export const domainOf = (address) => {
71
6
  const domain = ADDRESS.exec(address.trim())?.[1];
@@ -73,38 +8,27 @@ export const domainOf = (address) => {
73
8
  throw new CliError("validation_error", "give a full mail address, such as name@example.com", { param: "address" });
74
9
  return domain.toLowerCase();
75
10
  };
76
- const isProviderKey = (name) => Object.hasOwn(KNOWN, name);
77
- const KEYS = Object.keys(KNOWN).filter(isProviderKey);
78
11
  const found = (address, key, found_by) => {
79
- const known = KNOWN[key];
12
+ const provider = PROVIDERS[key];
80
13
  return {
81
14
  address,
82
- provider: known.provider,
83
- imap: known.imap,
84
- // Every provider in the table logs in with the full address.
15
+ provider: provider.name,
16
+ imap: provider.imap,
85
17
  login: address,
86
- auth: known.auth,
18
+ auth: provider.auth,
87
19
  found_by,
88
- ...(known.note ? { note: known.note } : {}),
89
- prepare: PROVIDER_PREPARE[key],
20
+ ...(provider.note ? { note: provider.note } : {}),
21
+ prepare: provider.prepare,
90
22
  };
91
23
  };
92
- /** The steps for a saved profile: its address domain first, then its server host (a domain of its own on Yandex). */
93
- export const prepareFor = (address, host) => {
94
- const domain = address.split("@")[1]?.toLowerCase() ?? "";
95
- const key = BY_DOMAIN[domain] ?? KEYS.find((name) => KNOWN[name].imap.host === host);
96
- return key
97
- ? { provider: KNOWN[key].provider, prepare: PROVIDER_PREPARE[key] }
98
- : { provider: domain || "this", prepare: GENERIC_PREPARE };
99
- };
100
24
  const slug = (name) => name.toLowerCase().replace(/[^a-z0-9]/g, "");
101
25
  /** The names `--provider` and the interactive choice accept, in table order. */
102
- export const PROVIDER_NAMES = KEYS.map((key) => KNOWN[key].provider);
26
+ export const PROVIDER_NAMES = PROVIDER_KEYS.map((key) => PROVIDERS[key].name);
103
27
  /** A built-in provider picked by name, for an address whose own domain says nothing about its host. */
104
28
  export const discoverByName = (input, name) => {
105
29
  const address = input.trim().toLowerCase();
106
30
  domainOf(address);
107
- const key = KEYS.find((candidate) => slug(candidate) === slug(name) || slug(KNOWN[candidate].provider) === slug(name));
31
+ const key = PROVIDER_KEYS.find((candidate) => slug(candidate) === slug(name) || slug(PROVIDERS[candidate].name) === slug(name));
108
32
  if (!key)
109
33
  throw new CliError("validation_error", `unknown provider ${name}; choose one of ${PROVIDER_NAMES.join(", ")}`, {
110
34
  param: "provider",
@@ -144,20 +68,23 @@ const ask = async (url, deps) => {
144
68
  }
145
69
  };
146
70
  /**
147
- * Built-in table by domain, then the MX record, then Thunderbird's ISPDB, then the domain's own autoconfig file.
148
- * The result is only a proposal: `setup` shows it and the owner confirms.
71
+ * The built-in providers by domain, then the MX record, then Thunderbird's ISPDB, then the domain's own autoconfig
72
+ * file. `session start` prints what it found and sends the password there only to check it.
149
73
  */
150
74
  export const discover = async (input, deps = {}) => {
151
75
  const address = input.trim().toLowerCase();
152
76
  const domain = domainOf(address);
153
- const key = BY_DOMAIN[domain];
77
+ const key = providerByDomain(domain);
154
78
  if (key)
155
79
  return found(address, key, "built-in");
156
80
  try {
157
- const exchanges = await (deps.mx ?? defaultMx)(domain);
158
- for (const [pattern, name] of BY_MX)
159
- if (exchanges.some((host) => pattern.test(host.toLowerCase())))
160
- return found(address, name, "mx");
81
+ const exchanges = (await (deps.mx ?? defaultMx)(domain)).map((host) => host.toLowerCase());
82
+ const hosted = PROVIDER_KEYS.find((name) => {
83
+ const pattern = PROVIDERS[name].mx;
84
+ return pattern !== undefined && exchanges.some((host) => pattern.test(host));
85
+ });
86
+ if (hosted)
87
+ return found(address, hosted, "mx");
161
88
  }
162
89
  catch {
163
90
  // No MX record, or no network: the file lookups below may still answer.
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { MailSource } from "@wirecat/cli-core/mail";
2
+ export interface MailEndpoint {
3
+ host: string;
4
+ port: number;
5
+ /** `plain` is for a local test server only; no profile can ask for it. */
6
+ security: "tls" | "starttls" | "plain";
7
+ login: string;
8
+ }
9
+ /** What the run lets a backend spend: a retry is a request of its budget, and none outlives its deadline. */
10
+ export interface RunBounds {
11
+ canRetry?: () => boolean;
12
+ timeLeftMs?: () => number | undefined;
13
+ signal?: AbortSignal;
14
+ }
15
+ export interface FolderInfo {
16
+ path: string;
17
+ name: string;
18
+ role: string | null;
19
+ messages: number | null;
20
+ unseen: number | null;
21
+ }
22
+ export interface AccountCheck {
23
+ login: string;
24
+ capabilities: string[];
25
+ features: Record<"idle" | "condstore" | "qresync" | "move" | "uidplus" | "compress" | "x_gm_ext_1" | "objectid", boolean>;
26
+ folders: number;
27
+ }
28
+ /** Everything a command asks of one mailbox. cli-core's sync reads it as a `MailSource`. */
29
+ export interface MailBackend extends MailSource {
30
+ check(): Promise<AccountCheck>;
31
+ folderList(): Promise<FolderInfo[]>;
32
+ /** After this, every call fails; nothing reconnects. */
33
+ close(): Promise<void>;
34
+ }
35
+ export type OpenBackend = (endpoint: MailEndpoint, password: string, bounds?: RunBounds) => MailBackend;
36
+ //# sourceMappingURL=backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/mail/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAExD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,0EAA0E;IAC1E,QAAQ,EAAE,KAAK,GAAG,UAAU,GAAG,OAAO,CAAA;IACtC,KAAK,EAAE,MAAM,CAAA;CACd;AAED,6GAA6G;AAC7G,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;IACrC,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,QAAQ,EAAE,MAAM,CACd,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,UAAU,EAC9F,OAAO,CACR,CAAA;IACD,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,4FAA4F;AAC5F,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC7C,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC,CAAA;IAC9B,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;IACnC,wDAAwD;IACxD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,KAAK,WAAW,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/mail/backend.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import type { MailBackend } from "../backend.js";
2
+ import type { Connections } from "./connection.js";
3
+ /** What a command asks of the account itself: its folders and what the server supports. */
4
+ export declare const imapAccount: (pool: Connections, login: string) => Pick<MailBackend, "check" | "folderList"> & Required<Pick<MailBackend, "folders">>;
5
+ //# sourceMappingURL=account.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../../src/mail/imap/account.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA4B,WAAW,EAAE,MAAM,eAAe,CAAA;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAGlD,2FAA2F;AAC3F,eAAO,MAAM,WAAW,SAChB,WAAW,SACV,MAAM,KACZ,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,YAAY,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CA4CnF,CAAA"}
@@ -0,0 +1,41 @@
1
+ import { roleOf } from "./messages.js";
2
+ /** What a command asks of the account itself: its folders and what the server supports. */
3
+ export const imapAccount = (pool, login) => {
4
+ const folderList = () => pool.onServer(async (open) => (await open.list({ statusQuery: { messages: true, unseen: true } }))
5
+ .filter((entry) => !entry.flags.has("\\Noselect") && !entry.flags.has("\\NonExistent"))
6
+ .map((entry) => ({
7
+ path: entry.path,
8
+ name: entry.name,
9
+ role: roleOf(entry),
10
+ messages: entry.status?.messages ?? null,
11
+ unseen: entry.status?.unseen ?? null,
12
+ })));
13
+ return {
14
+ folderList,
15
+ folders: async () => {
16
+ const entries = await folderList();
17
+ const role = (...names) => entries.find((entry) => entry.role && names.includes(entry.role))?.path;
18
+ return { all: role("all", "archive") ?? "INBOX", trash: role("trash") ?? "Trash" };
19
+ },
20
+ check: () => pool.onServer(async (open) => {
21
+ const has = (name) => open.capabilities.has(name);
22
+ const folders = (await open.list()).length;
23
+ return {
24
+ login,
25
+ capabilities: [...open.capabilities.keys()].sort(),
26
+ features: {
27
+ idle: has("IDLE"),
28
+ condstore: has("CONDSTORE"),
29
+ qresync: has("QRESYNC"),
30
+ move: has("MOVE"),
31
+ uidplus: has("UIDPLUS"),
32
+ compress: has("COMPRESS=DEFLATE"),
33
+ x_gm_ext_1: has("X-GM-EXT-1"),
34
+ objectid: has("OBJECTID"),
35
+ },
36
+ folders,
37
+ };
38
+ }),
39
+ };
40
+ };
41
+ //# sourceMappingURL=account.js.map