@wirecat/mail-cli 0.0.0-stage → 0.1.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 (226) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/LICENSE +204 -0
  3. package/README.md +141 -2
  4. package/dist/bin/mail.d.ts +3 -0
  5. package/dist/bin/mail.d.ts.map +1 -0
  6. package/dist/bin/mail.js +36 -0
  7. package/dist/bin/mail.js.map +1 -0
  8. package/dist/bundle/all-profiles-TKMBELRZ.js +286 -0
  9. package/dist/bundle/anthropic-7LMUAEIZ.js +72 -0
  10. package/dist/bundle/app-server-JGMIJDD4.js +229 -0
  11. package/dist/bundle/bun-XRO6XJHQ.js +169 -0
  12. package/dist/bundle/bun-sqlite-Z54LEHVM.js +71 -0
  13. package/dist/bundle/chunk-2LLNPNMB.js +24 -0
  14. package/dist/bundle/chunk-3E3WA2L6.js +1932 -0
  15. package/dist/bundle/chunk-3KEVLSNN.js +138 -0
  16. package/dist/bundle/chunk-3KOA73LS.js +3416 -0
  17. package/dist/bundle/chunk-4E7BN3TC.js +122 -0
  18. package/dist/bundle/chunk-4FEMINO2.js +409 -0
  19. package/dist/bundle/chunk-5BVIWP3S.js +71 -0
  20. package/dist/bundle/chunk-5D4AEUVA.js +24783 -0
  21. package/dist/bundle/chunk-5NYMNSSO.js +264 -0
  22. package/dist/bundle/chunk-5WGEUDE4.js +27 -0
  23. package/dist/bundle/chunk-6MAZWSC3.js +132 -0
  24. package/dist/bundle/chunk-75CWWETH.js +379 -0
  25. package/dist/bundle/chunk-7SXGLT6T.js +444 -0
  26. package/dist/bundle/chunk-BTQX2ZSZ.js +288 -0
  27. package/dist/bundle/chunk-CEW6KIFA.js +1193 -0
  28. package/dist/bundle/chunk-CH6RXYAX.js +82 -0
  29. package/dist/bundle/chunk-D72URWJE.js +532 -0
  30. package/dist/bundle/chunk-DFDN6AUB.js +21 -0
  31. package/dist/bundle/chunk-EOEDICIE.js +6848 -0
  32. package/dist/bundle/chunk-F6D6PJ34.js +100 -0
  33. package/dist/bundle/chunk-FDCGTODC.js +78 -0
  34. package/dist/bundle/chunk-FZ5FXIG6.js +18 -0
  35. package/dist/bundle/chunk-GAH7N7HO.js +8181 -0
  36. package/dist/bundle/chunk-GK4M2SUP.js +195 -0
  37. package/dist/bundle/chunk-GN62YOT5.js +161 -0
  38. package/dist/bundle/chunk-GQQJOH7A.js +7050 -0
  39. package/dist/bundle/chunk-GWDCKUBI.js +781 -0
  40. package/dist/bundle/chunk-HTQTIKWP.js +928 -0
  41. package/dist/bundle/chunk-IK5TH3O7.js +217 -0
  42. package/dist/bundle/chunk-J3QXTBD2.js +2742 -0
  43. package/dist/bundle/chunk-J6MSJLIW.js +45 -0
  44. package/dist/bundle/chunk-JBBZCTTF.js +76 -0
  45. package/dist/bundle/chunk-JVMVLITS.js +260 -0
  46. package/dist/bundle/chunk-K4FVKPDQ.js +525 -0
  47. package/dist/bundle/chunk-KHTO2Q6E.js +886 -0
  48. package/dist/bundle/chunk-KM7Q67Z3.js +63 -0
  49. package/dist/bundle/chunk-LQ37ALDJ.js +2416 -0
  50. package/dist/bundle/chunk-MNOIRJEO.js +2315 -0
  51. package/dist/bundle/chunk-MS53RALV.js +168 -0
  52. package/dist/bundle/chunk-NK7EB63L.js +36225 -0
  53. package/dist/bundle/chunk-NPGVOZVK.js +2 -0
  54. package/dist/bundle/chunk-OTUOZ33L.js +82 -0
  55. package/dist/bundle/chunk-P7P5MNAU.js +46 -0
  56. package/dist/bundle/chunk-QLEUNU6G.js +537 -0
  57. package/dist/bundle/chunk-QQB7WT7R.js +216 -0
  58. package/dist/bundle/chunk-QX7RCLRS.js +23 -0
  59. package/dist/bundle/chunk-T6464KYA.js +35130 -0
  60. package/dist/bundle/chunk-TE5U5OAM.js +73 -0
  61. package/dist/bundle/chunk-TI6VBZKJ.js +166 -0
  62. package/dist/bundle/chunk-TQFCPUIM.js +53 -0
  63. package/dist/bundle/chunk-TVREDYX4.js +3574 -0
  64. package/dist/bundle/chunk-TWPDVUBR.js +106 -0
  65. package/dist/bundle/chunk-TWTATDM7.js +461 -0
  66. package/dist/bundle/chunk-UH4DDRHA.js +2989 -0
  67. package/dist/bundle/chunk-VEIZZRQ5.js +630 -0
  68. package/dist/bundle/chunk-WLFLBWNH.js +54 -0
  69. package/dist/bundle/chunk-WXAXYJJ7.js +486 -0
  70. package/dist/bundle/chunk-XQUUANA2.js +24600 -0
  71. package/dist/bundle/chunk-Y5E2WNWB.js +35 -0
  72. package/dist/bundle/chunk-YO4CUH5E.js +33 -0
  73. package/dist/bundle/chunk-YPQQ5J4X.js +849 -0
  74. package/dist/bundle/chunk-Z34ICZA3.js +1028 -0
  75. package/dist/bundle/chunk-ZANYM66S.js +58 -0
  76. package/dist/bundle/chunk-ZD3WUGR2.js +142 -0
  77. package/dist/bundle/chunk-ZVVMGPBJ.js +50 -0
  78. package/dist/bundle/command-contract-WU434ZUL.js +34 -0
  79. package/dist/bundle/decode-YB3ZDTES.js +162 -0
  80. package/dist/bundle/dispatch-EUKKT3PD.js +411 -0
  81. package/dist/bundle/dist-A6GKSKFC.js +2072 -0
  82. package/dist/bundle/dist-X36THCOF.js +7577 -0
  83. package/dist/bundle/echarts-YNGCOYHW.js +42501 -0
  84. package/dist/bundle/embed-LWNHIRBQ.js +37 -0
  85. package/dist/bundle/embedder-2LYD3U37.js +110 -0
  86. package/dist/bundle/failure-OAIC5VAP.js +24 -0
  87. package/dist/bundle/first-run-N3HJKGU7.js +27 -0
  88. package/dist/bundle/first-screen-4U2DMV3G.js +32 -0
  89. package/dist/bundle/instructions-GJHHFV64.js +11 -0
  90. package/dist/bundle/mail.js +166 -0
  91. package/dist/bundle/mcp-L7SRVDRN.js +167 -0
  92. package/dist/bundle/node-GFOH6FKP.js +176 -0
  93. package/dist/bundle/node-KM3CUABH.js +2340 -0
  94. package/dist/bundle/node-TLZSIHIJ.js +21 -0
  95. package/dist/bundle/node-sqlite-NBXQXBIU.js +63 -0
  96. package/dist/bundle/oauth-56EFO5AQ.js +19 -0
  97. package/dist/bundle/open-2V7QZQJP.js +21 -0
  98. package/dist/bundle/openai-V3SVACVL.js +251 -0
  99. package/dist/bundle/process-XVDX4SPD.js +91 -0
  100. package/dist/bundle/program-ILID6EAT.js +35542 -0
  101. package/dist/bundle/prompt-YKWAI222.js +14 -0
  102. package/dist/bundle/recognize-PAR66KVM.js +25 -0
  103. package/dist/bundle/remote-CE43TKXC.js +28 -0
  104. package/dist/bundle/rerank-M7S7P2TW.js +51 -0
  105. package/dist/bundle/serve-ENPMIV6J.js +197 -0
  106. package/dist/bundle/server-JRTHUCVY.js +63 -0
  107. package/dist/bundle/server-MBEZLVKZ.js +189 -0
  108. package/dist/bundle/sqlite-runtime-HVGDHBJJ.js +18 -0
  109. package/dist/bundle/state-QZSOSKBD.js +35 -0
  110. package/dist/bundle/store-2BUX6LVX.js +124 -0
  111. package/dist/bundle/store-UJ7SNKXI.js +141 -0
  112. package/dist/bundle/store-maintenance-command-I7V5C44K.js +52 -0
  113. package/dist/commands/account.d.ts +3 -0
  114. package/dist/commands/account.d.ts.map +1 -0
  115. package/dist/commands/account.js +47 -0
  116. package/dist/commands/account.js.map +1 -0
  117. package/dist/commands/context.d.ts +41 -0
  118. package/dist/commands/context.d.ts.map +1 -0
  119. package/dist/commands/context.js +52 -0
  120. package/dist/commands/context.js.map +1 -0
  121. package/dist/commands/doctor.d.ts +77 -0
  122. package/dist/commands/doctor.d.ts.map +1 -0
  123. package/dist/commands/doctor.js +74 -0
  124. package/dist/commands/doctor.js.map +1 -0
  125. package/dist/commands/folders.d.ts +3 -0
  126. package/dist/commands/folders.d.ts.map +1 -0
  127. package/dist/commands/folders.js +36 -0
  128. package/dist/commands/folders.js.map +1 -0
  129. package/dist/commands/login.d.ts +5 -0
  130. package/dist/commands/login.d.ts.map +1 -0
  131. package/dist/commands/login.js +21 -0
  132. package/dist/commands/login.js.map +1 -0
  133. package/dist/commands/mailbox.d.ts +16 -0
  134. package/dist/commands/mailbox.d.ts.map +1 -0
  135. package/dist/commands/mailbox.js +54 -0
  136. package/dist/commands/mailbox.js.map +1 -0
  137. package/dist/commands/mcp.d.ts +3 -0
  138. package/dist/commands/mcp.d.ts.map +1 -0
  139. package/dist/commands/mcp.js +97 -0
  140. package/dist/commands/mcp.js.map +1 -0
  141. package/dist/commands/session.d.ts +3 -0
  142. package/dist/commands/session.d.ts.map +1 -0
  143. package/dist/commands/session.js +211 -0
  144. package/dist/commands/session.js.map +1 -0
  145. package/dist/commands/setup.d.ts +3 -0
  146. package/dist/commands/setup.d.ts.map +1 -0
  147. package/dist/commands/setup.js +156 -0
  148. package/dist/commands/setup.js.map +1 -0
  149. package/dist/commands/status.d.ts +3 -0
  150. package/dist/commands/status.d.ts.map +1 -0
  151. package/dist/commands/status.js +89 -0
  152. package/dist/commands/status.js.map +1 -0
  153. package/dist/commands/sync.d.ts +3 -0
  154. package/dist/commands/sync.d.ts.map +1 -0
  155. package/dist/commands/sync.js +190 -0
  156. package/dist/commands/sync.js.map +1 -0
  157. package/dist/config.d.ts +190 -0
  158. package/dist/config.d.ts.map +1 -0
  159. package/dist/config.js +46 -0
  160. package/dist/config.js.map +1 -0
  161. package/dist/discovery.d.ts +42 -0
  162. package/dist/discovery.d.ts.map +1 -0
  163. package/dist/discovery.js +179 -0
  164. package/dist/discovery.js.map +1 -0
  165. package/dist/identity.d.ts +5 -0
  166. package/dist/identity.d.ts.map +1 -0
  167. package/dist/identity.js +16 -0
  168. package/dist/identity.js.map +1 -0
  169. package/dist/index.d.ts +3 -0
  170. package/dist/index.d.ts.map +1 -0
  171. package/dist/index.js +3 -0
  172. package/dist/index.js.map +1 -0
  173. package/dist/mail/imap-errors.d.ts +4 -0
  174. package/dist/mail/imap-errors.d.ts.map +1 -0
  175. package/dist/mail/imap-errors.js +41 -0
  176. package/dist/mail/imap-errors.js.map +1 -0
  177. package/dist/mail/imap-messages.d.ts +18 -0
  178. package/dist/mail/imap-messages.d.ts.map +1 -0
  179. package/dist/mail/imap-messages.js +66 -0
  180. package/dist/mail/imap-messages.js.map +1 -0
  181. package/dist/mail/imap.d.ts +67 -0
  182. package/dist/mail/imap.d.ts.map +1 -0
  183. package/dist/mail/imap.js +348 -0
  184. package/dist/mail/imap.js.map +1 -0
  185. package/dist/mail/parse.d.ts +18 -0
  186. package/dist/mail/parse.d.ts.map +1 -0
  187. package/dist/mail/parse.js +31 -0
  188. package/dist/mail/parse.js.map +1 -0
  189. package/dist/mail/port.d.ts +50 -0
  190. package/dist/mail/port.d.ts.map +1 -0
  191. package/dist/mail/port.js +4 -0
  192. package/dist/mail/port.js.map +1 -0
  193. package/dist/mcp.d.ts +29 -0
  194. package/dist/mcp.d.ts.map +1 -0
  195. package/dist/mcp.js +98 -0
  196. package/dist/mcp.js.map +1 -0
  197. package/dist/profile.d.ts +16 -0
  198. package/dist/profile.d.ts.map +1 -0
  199. package/dist/profile.js +31 -0
  200. package/dist/profile.js.map +1 -0
  201. package/dist/program.d.ts +6 -0
  202. package/dist/program.d.ts.map +1 -0
  203. package/dist/program.js +52 -0
  204. package/dist/program.js.map +1 -0
  205. package/dist/providers.d.ts +53 -0
  206. package/dist/providers.d.ts.map +1 -0
  207. package/dist/providers.js +106 -0
  208. package/dist/providers.js.map +1 -0
  209. package/dist/secret.d.ts +30 -0
  210. package/dist/secret.d.ts.map +1 -0
  211. package/dist/secret.js +68 -0
  212. package/dist/secret.js.map +1 -0
  213. package/dist/store.d.ts +12 -0
  214. package/dist/store.d.ts.map +1 -0
  215. package/dist/store.js +25 -0
  216. package/dist/store.js.map +1 -0
  217. package/dist/sync.d.ts +26 -0
  218. package/dist/sync.d.ts.map +1 -0
  219. package/dist/sync.js +75 -0
  220. package/dist/sync.js.map +1 -0
  221. package/dist/version.d.ts +2 -0
  222. package/dist/version.d.ts.map +1 -0
  223. package/dist/version.js +2 -0
  224. package/dist/version.js.map +1 -0
  225. package/package.json +83 -4
  226. package/skills/mail-cli/SKILL.md +27 -0
@@ -0,0 +1,156 @@
1
+ import { CliError } from "@wirecat/cli-base";
2
+ import { annotate } from "@wirecat/cli-base/commands";
3
+ import { environmentOf, FETCH, itemOf, outputFor, profileFree, refuseUnderReadOnly, renderAnswer, secretInputOf, } from "@wirecat/cli-core/cli";
4
+ import { Command } from "commander";
5
+ import { discover, discoverByName, domainOf, PROVIDER_NAMES } from "../discovery.js";
6
+ import { IDENTITY } from "../identity.js";
7
+ import { imapSource } from "../mail/imap.js";
8
+ import { profileOf, proposedName, writeProfile } from "../profile.js";
9
+ import { GENERIC_PREPARE, PROVIDERS_URL, prepareText } from "../providers.js";
10
+ import { passwordStore } from "../secret.js";
11
+ import { collect } from "./context.js";
12
+ import { checkLogin } from "./login.js";
13
+ const securityOf = (value) => {
14
+ if (value !== "tls" && value !== "starttls")
15
+ throw new CliError("validation_error", "--security takes tls or starttls; a plain connection is refused");
16
+ return value;
17
+ };
18
+ const portOf = (value) => {
19
+ const port = Number(value);
20
+ if (!Number.isInteger(port) || port < 1 || port > 65535)
21
+ throw new CliError("validation_error", "--port takes a port number");
22
+ return port;
23
+ };
24
+ const discovered = async (address, flags, environment, pick) => {
25
+ if (flags.provider)
26
+ return discoverByName(address, flags.provider);
27
+ try {
28
+ return await discover(address, environment.discovery ?? { ...(environment.signal ? { signal: environment.signal } : {}) });
29
+ }
30
+ catch (error) {
31
+ if (!(error instanceof CliError) || error.code !== "not_found" || !pick)
32
+ throw error;
33
+ const name = await pick();
34
+ if (!name)
35
+ throw error;
36
+ return discoverByName(address, name);
37
+ }
38
+ };
39
+ const chosen = async (address, flags, environment, pick) => {
40
+ if (!flags.host) {
41
+ const found = await discovered(address, flags, environment, pick);
42
+ return {
43
+ ...found,
44
+ ...(flags.login ? { login: flags.login } : {}),
45
+ imap: {
46
+ ...found.imap,
47
+ ...(flags.port ? { port: portOf(flags.port) } : {}),
48
+ ...(flags.security ? { security: flags.security } : {}),
49
+ },
50
+ };
51
+ }
52
+ domainOf(address);
53
+ return {
54
+ address,
55
+ provider: "custom",
56
+ imap: { host: flags.host, port: flags.port ? portOf(flags.port) : 993, security: flags.security ?? "tls" },
57
+ login: flags.login ?? address,
58
+ auth: "app-password",
59
+ found_by: "built-in",
60
+ prepare: GENERIC_PREPARE,
61
+ };
62
+ };
63
+ export const setupCommand = () => profileFree(annotate(new Command("setup"), {
64
+ effects: FETCH,
65
+ examples: [
66
+ `${IDENTITY.command} setup ya@burobiz.ru`,
67
+ `${IDENTITY.command} setup ya@burobiz.ru --name ya --yes`,
68
+ `${IDENTITY.command} setup me@example.com --host imap.example.com --security tls --yes`,
69
+ ],
70
+ }))
71
+ .summary("find a mailbox's server and save it as a profile")
72
+ .description(`find the IMAP server for an address (built-in providers, the MX record, ISPDB, the domain's autoconfig), show it with the steps to prepare the mailbox (turn on IMAP, make an app password; all providers: ${PROVIDERS_URL}), and save a profile when you confirm, then ask for the app password and keep it in the keyring (at a terminal; with --yes or --json nothing is asked and the next command is printed)`)
73
+ .argument("<address>", "the full mail address, also the login for most providers")
74
+ .option("--name <name>", "the profile name (default: the part before the @)")
75
+ .option("--provider <provider>", `skip discovery and use a built-in provider: ${PROVIDER_NAMES.join(", ")}`)
76
+ .option("--host <host>", "skip discovery and use this IMAP host")
77
+ .option("--port <port>", "IMAP port (default 993)")
78
+ .option("--security <mode>", "tls or starttls (default tls)", securityOf)
79
+ .option("--login <login>", "the login name, when it is not the full address")
80
+ .option("--folder <folder>", "sync only this folder; repeat it for more", collect)
81
+ .option("--replace", "overwrite a profile of the same name")
82
+ .action(async function (address, flags) {
83
+ const environment = environmentOf(this);
84
+ const env = environment.env ?? process.env;
85
+ const mail = address.trim().toLowerCase();
86
+ const output = outputFor(this);
87
+ const yes = this.optsWithGlobals().yes === true;
88
+ const asking = !yes && environment.tty !== false;
89
+ const pick = asking
90
+ ? async () => {
91
+ const { readSecret } = await import("@wirecat/cli-core");
92
+ output.renderer.note(`No server found for ${mail}. Built-in providers: ${PROVIDER_NAMES.join(", ")}`);
93
+ const named = await readSecret("Which one hosts this mailbox? (empty to give up) ", {
94
+ ...secretInputOf(this),
95
+ echo: true,
96
+ });
97
+ return named.trim() || undefined;
98
+ }
99
+ : undefined;
100
+ const found = await chosen(mail, flags, environment, pick);
101
+ const name = flags.name ?? proposedName(mail);
102
+ const next = `${IDENTITY.command} ${name} session start`;
103
+ const shown = {
104
+ profile: name,
105
+ address: found.address,
106
+ provider: found.provider,
107
+ found_by: found.found_by,
108
+ imap: found.imap,
109
+ login: found.login,
110
+ auth: found.auth,
111
+ ...(found.note ? { note: found.note } : {}),
112
+ ...(output.format === "pretty" ? {} : { prepare: found.prepare }),
113
+ };
114
+ if (output.format === "pretty") {
115
+ output.renderer.note(`${found.provider}: imap ${found.imap.host}:${found.imap.port} (${found.imap.security}), login ${found.login}`);
116
+ output.renderer.note(prepareText(found.provider, found.prepare));
117
+ }
118
+ let save = yes;
119
+ if (asking) {
120
+ const { readSecret } = await import("@wirecat/cli-core");
121
+ const answer = await readSecret(`Save profile ${name}? [y/N] `, { ...secretInputOf(this), echo: true });
122
+ save = /^y(es)?$/i.test(answer.trim());
123
+ }
124
+ if (!save)
125
+ return renderAnswer(this, output, itemOf({ ...shown, saved: false }));
126
+ if (found.auth === "oauth")
127
+ throw new CliError("validation_error", `${found.provider} accepts only OAuth for IMAP, which this version cannot do yet`, {
128
+ param: "address",
129
+ });
130
+ refuseUnderReadOnly(this, "setup");
131
+ const { path } = writeProfile(env, name, profileOf(found, flags.folder), flags.replace === true);
132
+ let signedIn = false;
133
+ if (asking && output.format === "pretty") {
134
+ const { readSecret } = await import("@wirecat/cli-core");
135
+ const typed = await readSecret(`App password for ${found.login} (hidden; empty to do it later with \`${next}\`): `, secretInputOf(this));
136
+ if (typed) {
137
+ try {
138
+ await checkLogin(environment.connect ?? imapSource, { ...found.imap, login: found.login }, typed, found.address, found.prepare);
139
+ }
140
+ catch (error) {
141
+ if (!(error instanceof CliError))
142
+ throw error;
143
+ throw new CliError(error.code, `${error.message} The profile ${name} is saved; run \`${next}\` to try again.`, error.details);
144
+ }
145
+ passwordStore({
146
+ env,
147
+ profile: name,
148
+ keyring: environment.keyring,
149
+ himalaya: environment.himalaya,
150
+ }).write(typed);
151
+ signedIn = true;
152
+ }
153
+ }
154
+ renderAnswer(this, output, itemOf({ ...shown, saved: true, config: path, signed_in: signedIn, ...(signedIn ? {} : { next_command: next }) }, { next: [] }));
155
+ });
156
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const statusCommand: () => Command;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA8BnC,eAAO,MAAM,aAAa,QAAO,OA6D3B,CAAA"}
@@ -0,0 +1,89 @@
1
+ import { existsSync } from "node:fs";
2
+ import { CliError } from "@wirecat/cli-base";
3
+ import { annotate } from "@wirecat/cli-base/commands";
4
+ import { progressOf } from "@wirecat/cli-core/background";
5
+ import { answerEntity, baseContext, itemOf, LOCAL_READ, outputFor, renderAnswer } from "@wirecat/cli-core/cli";
6
+ import { parsePoint, resumeKey } from "@wirecat/cli-core/mail";
7
+ import { Command } from "commander";
8
+ import * as v from "valibot";
9
+ import { configuration } from "../config.js";
10
+ import { IDENTITY } from "../identity.js";
11
+ import { openMailStore } from "../store.js";
12
+ import { contextOf } from "./context.js";
13
+ const nullableNumber = v.nullable(v.number());
14
+ /** cli-core's `sync_progress` with the folders it adds up; that entity is strict, so this one is mail's own. */
15
+ const mailSyncStatus = v.strictObject({
16
+ job: v.string(),
17
+ profile: v.string(),
18
+ done: v.number(),
19
+ total: nullableNumber,
20
+ remaining: nullableNumber,
21
+ state: v.picklist(["partial", "complete"]),
22
+ updated_at: v.nullable(v.string()),
23
+ cursor_age_ms: nullableNumber,
24
+ folders: v.array(v.strictObject({
25
+ folder: v.string(),
26
+ since: v.string(),
27
+ done: v.number(),
28
+ total: v.number(),
29
+ updated_at: v.string(),
30
+ })),
31
+ });
32
+ export const statusCommand = () => answerEntity(annotate(new Command("status"), {
33
+ effects: LOCAL_READ,
34
+ examples: [`${IDENTITY.command} ya status`, `${IDENTITY.command} ya status --json`],
35
+ }), "mail_sync_status", mailSyncStatus)
36
+ .summary("how far the sync is, from what the runs saved")
37
+ .description("how many messages of the synced window are read and how many are left, per folder; it asks no server, so it answers while a sync runs")
38
+ .action(async function () {
39
+ const context = contextOf(this);
40
+ const address = context.settings.mailbox.address;
41
+ if (!address)
42
+ throw new CliError("configuration_error", `profile ${context.profile} has no address`);
43
+ const key = { provider: "email", account: address.toLowerCase() };
44
+ const report = await baseContext(this, configuration.resolveSettings).run(async () => {
45
+ const { storePath } = await import("@wirecat/cli-core/store");
46
+ if (!existsSync(storePath(context.env)))
47
+ return [];
48
+ // Read-only, so it answers while a sync holds the write lock.
49
+ const store = await openMailStore(context.env, { readOnly: true });
50
+ context.environment.trackCloseable?.(store);
51
+ try {
52
+ const stored = await store.accounts.storedAccount(key).catch(() => null);
53
+ const names = stored === null
54
+ ? []
55
+ : (await store.mail.mailboxes(stored.id))
56
+ .filter(({ kind }) => kind === null)
57
+ .map(({ externalId }) => externalId);
58
+ const folders = [];
59
+ for (const folder of names) {
60
+ const point = parsePoint((await store.sync.syncState(key, resumeKey(folder)))?.value);
61
+ if (point !== undefined)
62
+ folders.push({
63
+ folder,
64
+ since: point.window.since,
65
+ done: point.window.done,
66
+ total: point.window.total,
67
+ updated_at: point.updatedAt,
68
+ });
69
+ }
70
+ return folders;
71
+ }
72
+ finally {
73
+ await store.close();
74
+ }
75
+ });
76
+ const updatedAt = report
77
+ .map(({ updated_at }) => updated_at)
78
+ .sort()
79
+ .at(-1);
80
+ const progress = progressOf({
81
+ job: "mail",
82
+ profile: context.profile,
83
+ done: report.reduce((sum, { done }) => sum + done, 0),
84
+ ...(report.length ? { total: report.reduce((sum, { total }) => sum + total, 0) } : {}),
85
+ ...(updatedAt === undefined ? {} : { updatedAt }),
86
+ });
87
+ renderAnswer(this, outputFor(this), itemOf({ ...progress, folders: report }));
88
+ });
89
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const syncCommand: () => Command;
3
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA+FnC,eAAO,MAAM,WAAW,QAAO,OAgIzB,CAAA"}
@@ -0,0 +1,190 @@
1
+ import { CliError } from "@wirecat/cli-base";
2
+ import { annotate } from "@wirecat/cli-base/commands";
3
+ import { timezoneOf, zonedMoment } from "@wirecat/cli-base/query";
4
+ import { answerEntity, baseContext, environmentOf, FETCH, itemOf, outputFor, renderAnswer, runBudgetOf, } from "@wirecat/cli-core/cli";
5
+ import { syncMail } from "@wirecat/cli-core/mail";
6
+ import { Command } from "commander";
7
+ import * as v from "valibot";
8
+ import { configuration } from "../config.js";
9
+ import { IDENTITY } from "../identity.js";
10
+ import { openMailStore } from "../store.js";
11
+ import { collect, contextOf, openSource, refuseOffline } from "./context.js";
12
+ const DAY_MS = 86_400_000;
13
+ const DEFAULT_DAYS = 30;
14
+ /** A time without a zone is read in `zone`, and a date alone starts at its local midnight (WC-TIME-3, WC-TIME-5). */
15
+ const sinceOf = (value, zone, now) => {
16
+ if (value === undefined)
17
+ return new Date(now - DEFAULT_DAYS * DAY_MS);
18
+ const refuse = () => new CliError("validation_error", "--since-time takes an ISO date or timestamp in the past", {
19
+ param: "since-time",
20
+ });
21
+ let since;
22
+ try {
23
+ since = zonedMoment(value, zone, { start: 0, end: value.length });
24
+ }
25
+ catch (error) {
26
+ if (error instanceof CliError)
27
+ throw refuse();
28
+ throw error;
29
+ }
30
+ if (since > now)
31
+ throw refuse();
32
+ return new Date(since);
33
+ };
34
+ const BUDGET_CODES = { requests: "rate_limited", deadline: "timeout", cancelled: "cancelled" };
35
+ /** What the run left out, so `meta.complete` is false whenever any of it is there (WC-OUT-7). */
36
+ const issuesOf = (report) => [
37
+ ...(report.unreadable?.length
38
+ ? [{ code: "invalid_response", reason: "mail.unreadable", source: "sync" }]
39
+ : []),
40
+ ...(report.deletionsSkipped
41
+ ? [{ code: "outcome_unknown", reason: "mail.deletions-skipped", source: "sync" }]
42
+ : []),
43
+ ...(report.stopped
44
+ ? [{ code: BUDGET_CODES[report.stopped], reason: `budget.${report.stopped}`, source: "sync" }]
45
+ : []),
46
+ ];
47
+ const wholeNumberFor = (flag) => (value) => {
48
+ if (!/^\d+$/.test(value.trim()) || Number(value) < 1)
49
+ throw new CliError("validation_error", `--${flag} takes a whole number from 1 upwards, not "${value}"`, {
50
+ param: flag,
51
+ });
52
+ return Number(value);
53
+ };
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
+ if (explicit?.length)
57
+ return explicit;
58
+ if (configured?.length)
59
+ return configured;
60
+ 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"];
65
+ };
66
+ const mailSync = v.strictObject({
67
+ address: v.string(),
68
+ since: v.string(),
69
+ timezone: v.string(),
70
+ folders: v.array(v.string()),
71
+ state: v.picklist(["partial", "complete"]),
72
+ stopped: v.optional(v.picklist(["requests", "deadline", "cancelled"])),
73
+ requests: v.number(),
74
+ listed: v.number(),
75
+ saved: v.number(),
76
+ already_stored: v.number(),
77
+ deleted: v.number(),
78
+ complete: v.boolean(),
79
+ remaining: v.number(),
80
+ unreadable: v.number(),
81
+ deletions_skipped: v.optional(v.string()),
82
+ hint: v.optional(v.string()),
83
+ });
84
+ export const syncCommand = () => answerEntity(annotate(new Command("sync"), {
85
+ effects: FETCH,
86
+ // The run stops on its own before its deadline, keeps what it read and says how to go on (WC-LIFE-16).
87
+ cooperative: true,
88
+ partial: true,
89
+ examples: [
90
+ `${IDENTITY.command} ya sync`,
91
+ `${IDENTITY.command} ya sync --since-time 2026-10-01 --limit 200`,
92
+ `${IDENTITY.command} ya sync --folder INBOX`,
93
+ ],
94
+ }), "mail_sync", mailSync)
95
+ .description("read mail from the server into the shared store; mail already stored is skipped")
96
+ .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
+ .option("--limit <n>", "save at most this many new emails in this run, newest first", wholeNumberFor("limit"))
98
+ .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
+ .action(async function (args) {
102
+ const context = contextOf(this);
103
+ refuseOffline(context.flags);
104
+ const address = context.settings.mailbox.address;
105
+ if (!address)
106
+ throw new CliError("configuration_error", `profile ${context.profile} has no address`);
107
+ const zone = timezoneOf();
108
+ const since = sinceOf(args.sinceTime, zone, Date.now());
109
+ const { signal } = environmentOf(this);
110
+ 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
+ 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 store = await openMailStore(context.env);
117
+ environmentOf(this).trackCloseable?.(store);
118
+ try {
119
+ return await syncMail(source, store, {
120
+ account: { address, mode: "imap", folders },
121
+ since,
122
+ budget,
123
+ ...(args.limit === undefined ? {} : { max: args.limit }),
124
+ ...(args.rescan ? { rescan: true } : {}),
125
+ ...(signal ? { signal } : {}),
126
+ });
127
+ }
128
+ finally {
129
+ await store.close();
130
+ }
131
+ });
132
+ const issues = issuesOf(report);
133
+ const partial = report.state === "partial";
134
+ const moved = report.saved + report.alreadyStored + report.skipped + report.envelopes > 0;
135
+ const timeout = this.optsWithGlobals().timeout;
136
+ const next = partial && moved
137
+ ? [
138
+ {
139
+ kind: "command",
140
+ step: "mail.sync",
141
+ command: "sync",
142
+ args: Object.fromEntries(Object.entries({
143
+ since_time: args.sinceTime,
144
+ limit: args.limit,
145
+ max_pages: args.maxPages,
146
+ timeout,
147
+ folder: args.folder,
148
+ }).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",
150
+ safe_to_auto_execute: true,
151
+ },
152
+ ]
153
+ : [];
154
+ const hint = !partial
155
+ ? 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";
159
+ renderAnswer(this, outputFor(this), itemOf({
160
+ address: report.account,
161
+ since: report.since,
162
+ timezone: zone,
163
+ folders: report.coverage?.folders ?? [],
164
+ state: report.state ?? (report.complete ? "complete" : "partial"),
165
+ ...(report.stopped ? { stopped: report.stopped } : {}),
166
+ requests: report.requests ?? 0,
167
+ listed: report.listed,
168
+ saved: report.saved,
169
+ already_stored: report.alreadyStored,
170
+ deleted: report.deleted,
171
+ complete: report.complete,
172
+ remaining: report.remaining ?? 0,
173
+ unreadable: report.unreadable?.length ?? 0,
174
+ ...(report.deletionsSkipped ? { deletions_skipped: report.deletionsSkipped } : {}),
175
+ ...(hint ? { hint } : {}),
176
+ }, {
177
+ next,
178
+ meta: {
179
+ complete: report.complete && issues.length === 0,
180
+ ...(issues.length ? { issues } : {}),
181
+ timezone: zone,
182
+ window: { since: since.toISOString() },
183
+ },
184
+ }));
185
+ }
186
+ finally {
187
+ await source.close();
188
+ }
189
+ });
190
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}