@wirecat/mail-cli 0.1.1 → 0.3.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 +51 -0
- package/README.md +4 -3
- package/dist/bin/mail.js +2 -2
- package/dist/bundle/{all-profiles-TKMBELRZ.js → all-profiles-52LCOKSL.js} +5 -5
- package/dist/bundle/{anthropic-7LMUAEIZ.js → anthropic-HPW7PLTT.js} +3 -3
- package/dist/bundle/{app-server-JGMIJDD4.js → app-server-Y7XSPVHJ.js} +39 -39
- package/dist/bundle/{bun-XRO6XJHQ.js → bun-B7YXDIMT.js} +2 -2
- package/dist/bundle/{bun-sqlite-Z54LEHVM.js → bun-sqlite-TTTKY7H2.js} +2 -2
- package/dist/bundle/{chunk-52F5DWS5.js → chunk-37MSU5O6.js} +1 -1
- package/dist/bundle/{chunk-5NYMNSSO.js → chunk-3RDTVH3H.js} +3 -3
- package/dist/bundle/{chunk-4E7BN3TC.js → chunk-4PXWXI2U.js} +2 -2
- package/dist/bundle/{chunk-GN62YOT5.js → chunk-4UOEUEZZ.js} +4 -4
- package/dist/bundle/{chunk-TQFCPUIM.js → chunk-5LY3OS7U.js} +1 -1
- package/dist/bundle/{chunk-QLEUNU6G.js → chunk-5SSFYIFF.js} +4 -4
- package/dist/bundle/{chunk-IK5TH3O7.js → chunk-732GKOLO.js} +10 -10
- package/dist/bundle/{chunk-UH4DDRHA.js → chunk-C2THROZU.js} +42 -42
- package/dist/bundle/{chunk-OTUOZ33L.js → chunk-C6E3VFUX.js} +2 -2
- package/dist/bundle/{chunk-YPQQ5J4X.js → chunk-DKKCQMDM.js} +16 -16
- package/dist/bundle/{chunk-6MAZWSC3.js → chunk-FGNTGLWA.js} +3 -3
- package/dist/bundle/{chunk-GQQJOH7A.js → chunk-FUXSKWWJ.js} +58 -46
- package/dist/bundle/{chunk-3KEVLSNN.js → chunk-FX77WAQL.js} +46 -8
- package/dist/bundle/{chunk-VEIZZRQ5.js → chunk-GX2M3AOO.js} +12 -3
- package/dist/bundle/{chunk-CEW6KIFA.js → chunk-H2JVXO5V.js} +32 -22
- package/dist/bundle/{chunk-ZANYM66S.js → chunk-HS25KDT3.js} +1 -1
- package/dist/bundle/{chunk-KM7Q67Z3.js → chunk-I2ARI6FI.js} +1 -1
- package/dist/bundle/{chunk-TWPDVUBR.js → chunk-IXHLMSHV.js} +2 -2
- package/dist/bundle/{chunk-BTQX2ZSZ.js → chunk-JDOOPGKW.js} +2 -2
- package/dist/bundle/{chunk-GK4M2SUP.js → chunk-JHNLU42I.js} +1 -1
- package/dist/bundle/{chunk-KHTO2Q6E.js → chunk-JXYFIUVX.js} +4 -4
- package/dist/bundle/{chunk-F6D6PJ34.js → chunk-K6SIGXRS.js} +5 -5
- package/dist/bundle/{chunk-QQB7WT7R.js → chunk-KALDYMKJ.js} +3 -3
- package/dist/bundle/{chunk-NK7EB63L.js → chunk-KXVZ373I.js} +960 -496
- package/dist/bundle/{chunk-GAH7N7HO.js → chunk-LCA5KC34.js} +44 -44
- package/dist/bundle/{chunk-TVREDYX4.js → chunk-LJDOPCPW.js} +100 -91
- package/dist/bundle/{chunk-3KOA73LS.js → chunk-MHNEMDH3.js} +14 -14
- package/dist/bundle/{chunk-MS53RALV.js → chunk-MXUUQXMA.js} +5 -5
- package/dist/bundle/{chunk-YO4CUH5E.js → chunk-N5WIUNOT.js} +1 -1
- package/dist/bundle/{chunk-EOEDICIE.js → chunk-O2F54PUO.js} +1 -1
- package/dist/bundle/{chunk-2LLNPNMB.js → chunk-O3DRPTWF.js} +1 -1
- package/dist/bundle/{chunk-FZ5FXIG6.js → chunk-PL6UPJIL.js} +1 -1
- package/dist/bundle/{chunk-75CWWETH.js → chunk-PYIJCWCH.js} +11 -11
- package/dist/bundle/{chunk-GWDCKUBI.js → chunk-QTWIZKUI.js} +30 -29
- package/dist/bundle/{chunk-7SXGLT6T.js → chunk-RMYYKBFW.js} +9 -8
- package/dist/bundle/{chunk-JVMVLITS.js → chunk-RORC2FW7.js} +4 -2
- package/dist/bundle/{chunk-K4FVKPDQ.js → chunk-RVIMMCHF.js} +9 -9
- package/dist/bundle/{chunk-T6464KYA.js → chunk-RZCFEASJ.js} +205 -204
- package/dist/bundle/{chunk-Z34ICZA3.js → chunk-SRMJ6LLC.js} +5 -5
- package/dist/bundle/{chunk-TWTATDM7.js → chunk-TL7PE6JU.js} +6 -6
- package/dist/bundle/{chunk-4FEMINO2.js → chunk-TLZWUADZ.js} +5 -5
- package/dist/bundle/{chunk-3E3WA2L6.js → chunk-TNQOKGJS.js} +21 -21
- package/dist/bundle/{chunk-MNOIRJEO.js → chunk-V7NZTJKU.js} +7 -7
- package/dist/bundle/{chunk-TE5U5OAM.js → chunk-VTJDEWMB.js} +2 -2
- package/dist/bundle/{chunk-J6MSJLIW.js → chunk-X7TFD5SX.js} +1 -1
- package/dist/bundle/{chunk-FDCGTODC.js → chunk-XD3TL4BK.js} +1 -1
- package/dist/bundle/{chunk-WLFLBWNH.js → chunk-XQVGIW4R.js} +2 -2
- package/dist/bundle/{chunk-JBBZCTTF.js → chunk-Y2HGQK7A.js} +1 -1
- package/dist/bundle/{chunk-WXAXYJJ7.js → chunk-YVIX7FHL.js} +5 -5
- package/dist/bundle/{chunk-CH6RXYAX.js → chunk-ZIJJNH47.js} +1 -1
- package/dist/bundle/{command-contract-WU434ZUL.js → command-contract-3HA7CZEQ.js} +13 -13
- package/dist/bundle/{decode-YB3ZDTES.js → decode-VLI3MAXE.js} +2 -2
- package/dist/bundle/{dist-A6GKSKFC.js → dist-C7LAAMNF.js} +14 -14
- package/dist/bundle/{echarts-YNGCOYHW.js → echarts-POTU3SHN.js} +2 -2
- package/dist/bundle/{embed-LWNHIRBQ.js → embed-J2DEEEUF.js} +3 -3
- package/dist/bundle/{embedder-2LYD3U37.js → embedder-5N56V7YJ.js} +6 -6
- package/dist/bundle/{first-run-N3HJKGU7.js → first-run-XILZE4PI.js} +5 -5
- package/dist/bundle/{first-screen-4U2DMV3G.js → first-screen-43VLEDWZ.js} +14 -14
- package/dist/bundle/{instructions-GJHHFV64.js → instructions-B7AUZXPL.js} +1 -1
- package/dist/bundle/mail.js +2 -2
- package/dist/bundle/{node-GFOH6FKP.js → node-SZAO6HTA.js} +2 -2
- package/dist/bundle/{node-sqlite-NBXQXBIU.js → node-sqlite-O34FFLRV.js} +2 -2
- package/dist/bundle/{oauth-56EFO5AQ.js → oauth-YYTLIPJT.js} +4 -4
- package/dist/bundle/{open-2V7QZQJP.js → open-SWJGI6H4.js} +1 -1
- package/dist/bundle/{openai-V3SVACVL.js → openai-GYXWCQOV.js} +10 -10
- package/dist/bundle/{process-XVDX4SPD.js → process-GLVWCUMK.js} +1 -1
- package/dist/bundle/{program-JTJB26P3.js → program-HW73TGIF.js} +1725 -1467
- package/dist/bundle/{prompt-YKWAI222.js → prompt-OZLHHGCD.js} +2 -2
- package/dist/bundle/{recognize-PAR66KVM.js → recognize-RDQSGHC5.js} +1 -1
- package/dist/bundle/{remote-CE43TKXC.js → remote-BKU5P3GK.js} +4 -4
- package/dist/bundle/{rerank-M7S7P2TW.js → rerank-EQIXYHKB.js} +4 -4
- package/dist/bundle/{serve-ENPMIV6J.js → serve-S6K5HKWG.js} +6 -6
- package/dist/bundle/{server-MBEZLVKZ.js → server-4VRVHPQC.js} +31 -31
- package/dist/bundle/server-WK6DRJX2.js +63 -0
- package/dist/bundle/{sqlite-runtime-HVGDHBJJ.js → sqlite-runtime-OOE455YM.js} +2 -2
- package/dist/bundle/{state-QZSOSKBD.js → state-OLPOJ2TY.js} +3 -3
- package/dist/bundle/{store-2BUX6LVX.js → store-6AVCPLH4.js} +9 -9
- package/dist/bundle/{store-UJ7SNKXI.js → store-WFV26CWY.js} +30 -12
- package/dist/bundle/store-maintenance-command-S6235I3W.js +52 -0
- package/dist/commands/account.d.ts.map +1 -1
- package/dist/commands/account.js +6 -5
- package/dist/commands/account.js.map +1 -1
- package/dist/commands/context.d.ts +19 -8
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +14 -10
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/folders.js +4 -4
- package/dist/commands/folders.js.map +1 -1
- package/dist/commands/login.d.ts +2 -2
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +3 -5
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/mailbox.d.ts +2 -1
- package/dist/commands/mailbox.d.ts.map +1 -1
- package/dist/commands/mailbox.js.map +1 -1
- package/dist/commands/session-start.d.ts +3 -0
- package/dist/commands/session-start.d.ts.map +1 -0
- package/dist/commands/session-start.js +117 -0
- package/dist/commands/session-start.js.map +1 -0
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +9 -117
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +8 -20
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +49 -26
- package/dist/commands/sync.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -0
- package/dist/config.js.map +1 -1
- package/dist/discovery.d.ts +4 -15
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +19 -92
- package/dist/discovery.js.map +1 -1
- package/dist/mail/backend.d.ts +36 -0
- package/dist/mail/backend.d.ts.map +1 -0
- package/dist/mail/backend.js +2 -0
- package/dist/mail/backend.js.map +1 -0
- package/dist/mail/imap/account.d.ts +5 -0
- package/dist/mail/imap/account.d.ts.map +1 -0
- package/dist/mail/imap/account.js +41 -0
- package/dist/mail/imap/account.js.map +1 -0
- package/dist/mail/imap/connection.d.ts +62 -0
- package/dist/mail/imap/connection.d.ts.map +1 -0
- package/dist/mail/imap/connection.js +188 -0
- package/dist/mail/imap/connection.js.map +1 -0
- package/dist/mail/{imap-errors.d.ts → imap/errors.d.ts} +1 -1
- package/dist/mail/imap/errors.d.ts.map +1 -0
- package/dist/mail/{imap-errors.js → imap/errors.js} +1 -1
- package/dist/mail/imap/errors.js.map +1 -0
- package/dist/mail/imap/index.d.ts +7 -0
- package/dist/mail/imap/index.d.ts.map +1 -0
- package/dist/mail/imap/index.js +11 -0
- package/dist/mail/imap/index.js.map +1 -0
- package/dist/mail/{imap-messages.d.ts → imap/messages.d.ts} +9 -9
- 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/read.d.ts +7 -0
- package/dist/mail/imap/read.d.ts.map +1 -0
- package/dist/mail/imap/read.js +164 -0
- package/dist/mail/imap/read.js.map +1 -0
- package/dist/mail/rethread.d.ts +15 -0
- package/dist/mail/rethread.d.ts.map +1 -0
- package/dist/mail/rethread.js +52 -0
- package/dist/mail/rethread.js.map +1 -0
- package/dist/profile.d.ts +2 -1
- package/dist/profile.d.ts.map +1 -1
- package/dist/profile.js +1 -0
- package/dist/profile.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +8 -1
- package/dist/program.js.map +1 -1
- package/dist/providers.d.ts +126 -26
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +141 -72
- package/dist/providers.js.map +1 -1
- package/dist/secret.d.ts +2 -1
- package/dist/secret.d.ts.map +1 -1
- package/dist/secret.js +1 -0
- package/dist/secret.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -2
- package/skills/mail-cli/SKILL.md +8 -0
- package/dist/bundle/server-JRTHUCVY.js +0 -63
- package/dist/bundle/store-maintenance-command-I7V5C44K.js +0 -52
- package/dist/mail/imap-errors.d.ts.map +0 -1
- package/dist/mail/imap-errors.js.map +0 -1
- package/dist/mail/imap-messages.d.ts.map +0 -1
- package/dist/mail/imap-messages.js +0 -66
- package/dist/mail/imap-messages.js.map +0 -1
- package/dist/mail/imap.d.ts +0 -67
- package/dist/mail/imap.d.ts.map +0 -1
- package/dist/mail/imap.js +0 -348
- package/dist/mail/imap.js.map +0 -1
package/dist/commands/sync.js
CHANGED
|
@@ -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,
|
|
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
|
-
/**
|
|
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
|
-
|
|
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
|
|
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;
|
|
112
|
-
const {
|
|
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
|
|
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
|
-
|
|
120
|
-
|
|
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
|
-
|
|
134
|
-
const
|
|
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:
|
|
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
|
-
:
|
|
157
|
-
?
|
|
158
|
-
:
|
|
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:
|
|
165
|
-
...(
|
|
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
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAEjE,OAAO,EACL,YAAY,EACZ,WAAW,EACX,aAAa,EACb,KAAK,EACL,MAAM,EACN,SAAS,EACT,YAAY,EACZ,WAAW,GACZ,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAuB,QAAQ,EAAE,MAAM,wBAAwB,CAAA;
|
|
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: {
|
package/dist/config.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
},
|
package/dist/config.js.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/discovery.d.ts
CHANGED
|
@@ -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: "
|
|
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
|
-
*
|
|
39
|
-
*
|
|
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
|
package/dist/discovery.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
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,
|
|
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
|
|
12
|
+
const provider = PROVIDERS[key];
|
|
80
13
|
return {
|
|
81
14
|
address,
|
|
82
|
-
provider:
|
|
83
|
-
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:
|
|
18
|
+
auth: provider.auth,
|
|
87
19
|
found_by,
|
|
88
|
-
...(
|
|
89
|
-
prepare:
|
|
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 =
|
|
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 =
|
|
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
|
-
*
|
|
148
|
-
*
|
|
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 =
|
|
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
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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.
|
package/dist/discovery.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,
|
|
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 @@
|
|
|
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
|