@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.
- package/CHANGELOG.md +50 -0
- package/LICENSE +204 -0
- package/README.md +141 -2
- package/dist/bin/mail.d.ts +3 -0
- package/dist/bin/mail.d.ts.map +1 -0
- package/dist/bin/mail.js +36 -0
- package/dist/bin/mail.js.map +1 -0
- package/dist/bundle/all-profiles-TKMBELRZ.js +286 -0
- package/dist/bundle/anthropic-7LMUAEIZ.js +72 -0
- package/dist/bundle/app-server-JGMIJDD4.js +229 -0
- package/dist/bundle/bun-XRO6XJHQ.js +169 -0
- package/dist/bundle/bun-sqlite-Z54LEHVM.js +71 -0
- package/dist/bundle/chunk-2LLNPNMB.js +24 -0
- package/dist/bundle/chunk-3E3WA2L6.js +1932 -0
- package/dist/bundle/chunk-3KEVLSNN.js +138 -0
- package/dist/bundle/chunk-3KOA73LS.js +3416 -0
- package/dist/bundle/chunk-4E7BN3TC.js +122 -0
- package/dist/bundle/chunk-4FEMINO2.js +409 -0
- package/dist/bundle/chunk-5BVIWP3S.js +71 -0
- package/dist/bundle/chunk-5D4AEUVA.js +24783 -0
- package/dist/bundle/chunk-5NYMNSSO.js +264 -0
- package/dist/bundle/chunk-5WGEUDE4.js +27 -0
- package/dist/bundle/chunk-6MAZWSC3.js +132 -0
- package/dist/bundle/chunk-75CWWETH.js +379 -0
- package/dist/bundle/chunk-7SXGLT6T.js +444 -0
- package/dist/bundle/chunk-BTQX2ZSZ.js +288 -0
- package/dist/bundle/chunk-CEW6KIFA.js +1193 -0
- package/dist/bundle/chunk-CH6RXYAX.js +82 -0
- package/dist/bundle/chunk-D72URWJE.js +532 -0
- package/dist/bundle/chunk-DFDN6AUB.js +21 -0
- package/dist/bundle/chunk-EOEDICIE.js +6848 -0
- package/dist/bundle/chunk-F6D6PJ34.js +100 -0
- package/dist/bundle/chunk-FDCGTODC.js +78 -0
- package/dist/bundle/chunk-FZ5FXIG6.js +18 -0
- package/dist/bundle/chunk-GAH7N7HO.js +8181 -0
- package/dist/bundle/chunk-GK4M2SUP.js +195 -0
- package/dist/bundle/chunk-GN62YOT5.js +161 -0
- package/dist/bundle/chunk-GQQJOH7A.js +7050 -0
- package/dist/bundle/chunk-GWDCKUBI.js +781 -0
- package/dist/bundle/chunk-HTQTIKWP.js +928 -0
- package/dist/bundle/chunk-IK5TH3O7.js +217 -0
- package/dist/bundle/chunk-J3QXTBD2.js +2742 -0
- package/dist/bundle/chunk-J6MSJLIW.js +45 -0
- package/dist/bundle/chunk-JBBZCTTF.js +76 -0
- package/dist/bundle/chunk-JVMVLITS.js +260 -0
- package/dist/bundle/chunk-K4FVKPDQ.js +525 -0
- package/dist/bundle/chunk-KHTO2Q6E.js +886 -0
- package/dist/bundle/chunk-KM7Q67Z3.js +63 -0
- package/dist/bundle/chunk-LQ37ALDJ.js +2416 -0
- package/dist/bundle/chunk-MNOIRJEO.js +2315 -0
- package/dist/bundle/chunk-MS53RALV.js +168 -0
- package/dist/bundle/chunk-NK7EB63L.js +36225 -0
- package/dist/bundle/chunk-NPGVOZVK.js +2 -0
- package/dist/bundle/chunk-OTUOZ33L.js +82 -0
- package/dist/bundle/chunk-P7P5MNAU.js +46 -0
- package/dist/bundle/chunk-QLEUNU6G.js +537 -0
- package/dist/bundle/chunk-QQB7WT7R.js +216 -0
- package/dist/bundle/chunk-QX7RCLRS.js +23 -0
- package/dist/bundle/chunk-T6464KYA.js +35130 -0
- package/dist/bundle/chunk-TE5U5OAM.js +73 -0
- package/dist/bundle/chunk-TI6VBZKJ.js +166 -0
- package/dist/bundle/chunk-TQFCPUIM.js +53 -0
- package/dist/bundle/chunk-TVREDYX4.js +3574 -0
- package/dist/bundle/chunk-TWPDVUBR.js +106 -0
- package/dist/bundle/chunk-TWTATDM7.js +461 -0
- package/dist/bundle/chunk-UH4DDRHA.js +2989 -0
- package/dist/bundle/chunk-VEIZZRQ5.js +630 -0
- package/dist/bundle/chunk-WLFLBWNH.js +54 -0
- package/dist/bundle/chunk-WXAXYJJ7.js +486 -0
- package/dist/bundle/chunk-XQUUANA2.js +24600 -0
- package/dist/bundle/chunk-Y5E2WNWB.js +35 -0
- package/dist/bundle/chunk-YO4CUH5E.js +33 -0
- package/dist/bundle/chunk-YPQQ5J4X.js +849 -0
- package/dist/bundle/chunk-Z34ICZA3.js +1028 -0
- package/dist/bundle/chunk-ZANYM66S.js +58 -0
- package/dist/bundle/chunk-ZD3WUGR2.js +142 -0
- package/dist/bundle/chunk-ZVVMGPBJ.js +50 -0
- package/dist/bundle/command-contract-WU434ZUL.js +34 -0
- package/dist/bundle/decode-YB3ZDTES.js +162 -0
- package/dist/bundle/dispatch-EUKKT3PD.js +411 -0
- package/dist/bundle/dist-A6GKSKFC.js +2072 -0
- package/dist/bundle/dist-X36THCOF.js +7577 -0
- package/dist/bundle/echarts-YNGCOYHW.js +42501 -0
- package/dist/bundle/embed-LWNHIRBQ.js +37 -0
- package/dist/bundle/embedder-2LYD3U37.js +110 -0
- package/dist/bundle/failure-OAIC5VAP.js +24 -0
- package/dist/bundle/first-run-N3HJKGU7.js +27 -0
- package/dist/bundle/first-screen-4U2DMV3G.js +32 -0
- package/dist/bundle/instructions-GJHHFV64.js +11 -0
- package/dist/bundle/mail.js +166 -0
- package/dist/bundle/mcp-L7SRVDRN.js +167 -0
- package/dist/bundle/node-GFOH6FKP.js +176 -0
- package/dist/bundle/node-KM3CUABH.js +2340 -0
- package/dist/bundle/node-TLZSIHIJ.js +21 -0
- package/dist/bundle/node-sqlite-NBXQXBIU.js +63 -0
- package/dist/bundle/oauth-56EFO5AQ.js +19 -0
- package/dist/bundle/open-2V7QZQJP.js +21 -0
- package/dist/bundle/openai-V3SVACVL.js +251 -0
- package/dist/bundle/process-XVDX4SPD.js +91 -0
- package/dist/bundle/program-ILID6EAT.js +35542 -0
- package/dist/bundle/prompt-YKWAI222.js +14 -0
- package/dist/bundle/recognize-PAR66KVM.js +25 -0
- package/dist/bundle/remote-CE43TKXC.js +28 -0
- package/dist/bundle/rerank-M7S7P2TW.js +51 -0
- package/dist/bundle/serve-ENPMIV6J.js +197 -0
- package/dist/bundle/server-JRTHUCVY.js +63 -0
- package/dist/bundle/server-MBEZLVKZ.js +189 -0
- package/dist/bundle/sqlite-runtime-HVGDHBJJ.js +18 -0
- package/dist/bundle/state-QZSOSKBD.js +35 -0
- package/dist/bundle/store-2BUX6LVX.js +124 -0
- package/dist/bundle/store-UJ7SNKXI.js +141 -0
- package/dist/bundle/store-maintenance-command-I7V5C44K.js +52 -0
- package/dist/commands/account.d.ts +3 -0
- package/dist/commands/account.d.ts.map +1 -0
- package/dist/commands/account.js +47 -0
- package/dist/commands/account.js.map +1 -0
- package/dist/commands/context.d.ts +41 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +52 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/doctor.d.ts +77 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +74 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/folders.d.ts +3 -0
- package/dist/commands/folders.d.ts.map +1 -0
- package/dist/commands/folders.js +36 -0
- package/dist/commands/folders.js.map +1 -0
- package/dist/commands/login.d.ts +5 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +21 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/mailbox.d.ts +16 -0
- package/dist/commands/mailbox.d.ts.map +1 -0
- package/dist/commands/mailbox.js +54 -0
- package/dist/commands/mailbox.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +97 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/session.d.ts +3 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +211 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +156 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +89 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +3 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +190 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/config.d.ts +190 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +46 -0
- package/dist/config.js.map +1 -0
- package/dist/discovery.d.ts +42 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +179 -0
- package/dist/discovery.js.map +1 -0
- package/dist/identity.d.ts +5 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +16 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/mail/imap-errors.d.ts +4 -0
- package/dist/mail/imap-errors.d.ts.map +1 -0
- package/dist/mail/imap-errors.js +41 -0
- package/dist/mail/imap-errors.js.map +1 -0
- package/dist/mail/imap-messages.d.ts +18 -0
- package/dist/mail/imap-messages.d.ts.map +1 -0
- package/dist/mail/imap-messages.js +66 -0
- package/dist/mail/imap-messages.js.map +1 -0
- package/dist/mail/imap.d.ts +67 -0
- package/dist/mail/imap.d.ts.map +1 -0
- package/dist/mail/imap.js +348 -0
- package/dist/mail/imap.js.map +1 -0
- package/dist/mail/parse.d.ts +18 -0
- package/dist/mail/parse.d.ts.map +1 -0
- package/dist/mail/parse.js +31 -0
- package/dist/mail/parse.js.map +1 -0
- package/dist/mail/port.d.ts +50 -0
- package/dist/mail/port.d.ts.map +1 -0
- package/dist/mail/port.js +4 -0
- package/dist/mail/port.js.map +1 -0
- package/dist/mcp.d.ts +29 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +98 -0
- package/dist/mcp.js.map +1 -0
- package/dist/profile.d.ts +16 -0
- package/dist/profile.d.ts.map +1 -0
- package/dist/profile.js +31 -0
- package/dist/profile.js.map +1 -0
- package/dist/program.d.ts +6 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +52 -0
- package/dist/program.js.map +1 -0
- package/dist/providers.d.ts +53 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +106 -0
- package/dist/providers.js.map +1 -0
- package/dist/secret.d.ts +30 -0
- package/dist/secret.d.ts.map +1 -0
- package/dist/secret.js +68 -0
- package/dist/secret.js.map +1 -0
- package/dist/store.d.ts +12 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +25 -0
- package/dist/store.js.map +1 -0
- package/dist/sync.d.ts +26 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +75 -0
- package/dist/sync.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +83 -4
- 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 @@
|
|
|
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 @@
|
|
|
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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"}
|