@wirecat/mail-cli 0.6.0 → 0.7.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 +42 -0
- package/README.md +8 -4
- package/dist/bin/mail.js +2 -2
- package/dist/bundle/{all-profiles-GBFTKUHA.js → all-profiles-SI67TKZM.js} +6 -6
- package/dist/bundle/{anthropic-PTSCWUG6.js → anthropic-DALMLC3Y.js} +4 -4
- package/dist/bundle/{app-server-5VJ2WCKJ.js → app-server-XOH327Z2.js} +41 -41
- package/dist/bundle/{bun-2KRUBPIN.js → bun-ORL67CJ6.js} +2 -2
- package/dist/bundle/{bun-sqlite-ELSRSJBM.js → bun-sqlite-DGXFNFHI.js} +3 -3
- package/dist/bundle/{chunk-B337KHJ5.js → chunk-23IEVVL2.js} +1 -1
- package/dist/bundle/{chunk-PKU6V4EQ.js → chunk-2M4K7HYR.js} +16 -16
- package/dist/bundle/{chunk-RDSAI6DC.js → chunk-35KD2CI2.js} +349 -254
- package/dist/bundle/{chunk-J4C32YKH.js → chunk-3GZK5GTU.js} +1 -1
- package/dist/bundle/{chunk-OHV5RDFE.js → chunk-3TYEJRMZ.js} +3 -3
- package/dist/bundle/{chunk-AGX7NR3S.js → chunk-45KA5667.js} +12 -12
- package/dist/bundle/{chunk-YBJMBPL7.js → chunk-4NYWHINR.js} +5 -5
- package/dist/bundle/{chunk-JKLQHPED.js → chunk-4ULY3GDL.js} +9 -9
- package/dist/bundle/{chunk-O555ZEQR.js → chunk-5BSEGMNE.js} +3 -3
- package/dist/bundle/{chunk-ZPGLWMNH.js → chunk-5JEYIHS6.js} +3 -3
- package/dist/bundle/{chunk-56PI2BRH.js → chunk-6LK7KTWB.js} +1 -1
- package/dist/bundle/{chunk-ES4PWHBJ.js → chunk-6RMMAUUW.js} +26 -26
- package/dist/bundle/{chunk-TKJDGAHT.js → chunk-6XNPXAJU.js} +31 -25
- package/dist/bundle/{chunk-PBYDT3CG.js → chunk-73OJJGZE.js} +3 -2
- package/dist/bundle/{chunk-WGK4AIRL.js → chunk-7K6KJWTO.js} +11 -11
- package/dist/bundle/{chunk-FIQOBLHS.js → chunk-AP7V256W.js} +1 -1
- package/dist/bundle/{chunk-K5JUROGN.js → chunk-BEMLGWY4.js} +1 -1
- package/dist/bundle/{chunk-P5B7IFOG.js → chunk-BGUMGCUY.js} +1 -1
- package/dist/bundle/{chunk-NZB4WGQS.js → chunk-CAKBG5FC.js} +5 -5
- package/dist/bundle/{chunk-RAZOSYEO.js → chunk-DKQWTQVY.js} +22 -22
- package/dist/bundle/{chunk-TPNC5VCJ.js → chunk-DXGMPMFP.js} +4 -4
- package/dist/bundle/{chunk-5AQKM47C.js → chunk-E3DRM6YP.js} +2 -2
- package/dist/bundle/{chunk-JFJTDL22.js → chunk-EYT33MM3.js} +44 -44
- package/dist/bundle/{chunk-LWTG5UOF.js → chunk-FPOGVDLS.js} +2 -2
- package/dist/bundle/{chunk-5KHJUYHQ.js → chunk-FTFNWGIR.js} +6 -6
- package/dist/bundle/{chunk-4PKHZQIM.js → chunk-GJUUTUK4.js} +7 -7
- package/dist/bundle/{chunk-NOU6MWEM.js → chunk-HFJNEXU7.js} +1 -1
- package/dist/bundle/{chunk-M7V3GSJQ.js → chunk-HV3EIYX4.js} +1 -1
- package/dist/bundle/{chunk-H4VFIH5W.js → chunk-IYZHM3ZN.js} +2 -2
- package/dist/bundle/{chunk-DA46WQEA.js → chunk-JFMUI4H6.js} +1 -1
- package/dist/bundle/{chunk-VF24ZAPX.js → chunk-LZ5J3UXD.js} +3 -3
- package/dist/bundle/{chunk-Y7JKWQC2.js → chunk-M2JCUVCJ.js} +112 -93
- package/dist/bundle/{chunk-KUQYWIVR.js → chunk-MCJ7LKYR.js} +5 -5
- package/dist/bundle/{chunk-XERTHQ6D.js → chunk-MHQKHWCJ.js} +14 -14
- package/dist/bundle/{chunk-VEAP5RVI.js → chunk-MMXMVGA6.js} +6 -6
- package/dist/bundle/{chunk-PHPC72DP.js → chunk-NNIXREJH.js} +5 -5
- package/dist/bundle/{chunk-UAXBLHZK.js → chunk-OHTR4WFO.js} +2 -2
- package/dist/bundle/{chunk-SAZJDKEI.js → chunk-PDL4UREY.js} +6 -6
- package/dist/bundle/{chunk-JLRMSNPX.js → chunk-Q2C3VMSU.js} +2 -0
- package/dist/bundle/{chunk-JIQAFFPV.js → chunk-Q44AYEOB.js} +2 -2
- package/dist/bundle/{chunk-6MV2TBDB.js → chunk-R5MML3FC.js} +51 -47
- package/dist/bundle/{chunk-ZRYFEEXZ.js → chunk-RQVWZBW3.js} +2 -2
- package/dist/bundle/{chunk-3KY7DA5A.js → chunk-S4YUR4S3.js} +426 -336
- package/dist/bundle/{chunk-MD2J3POF.js → chunk-U6UJ3HRS.js} +7 -1
- package/dist/bundle/{chunk-XZGLY2LU.js → chunk-V4TDG4KF.js} +10 -10
- package/dist/bundle/{chunk-ZMMIIBTM.js → chunk-VBOMKZ4E.js} +42 -42
- package/dist/bundle/{chunk-NCWO2FNC.js → chunk-VKPWP3AK.js} +1 -1
- package/dist/bundle/{chunk-O7VK7CJX.js → chunk-VNJMO5F6.js} +2 -2
- package/dist/bundle/{chunk-J5MYH4L5.js → chunk-VSHJWTX5.js} +5 -5
- package/dist/bundle/{chunk-DV4RSEAH.js → chunk-XQJWMBDY.js} +5 -5
- package/dist/bundle/{chunk-JKA2AICL.js → chunk-ZKCNMW7G.js} +1 -1
- package/dist/bundle/{chunk-WCL3WBH5.js → chunk-ZKZABB4K.js} +1 -1
- package/dist/bundle/{chunk-BVIHT7KR.js → chunk-ZNGQ3NZ4.js} +8 -8
- package/dist/bundle/{command-contract-NZF4B5OR.js → command-contract-CB5BII3S.js} +14 -14
- package/dist/bundle/{decode-HVXDCQ63.js → decode-KOBURZIQ.js} +3 -3
- package/dist/bundle/{dist-43DZXMBL.js → dist-T7HMT675.js} +10 -10
- package/dist/bundle/{echarts-LZ74IXHG.js → echarts-LEWTQO6H.js} +2 -2
- package/dist/bundle/{embed-OQF5U2C6.js → embed-PUFE4BSQ.js} +4 -4
- package/dist/bundle/{embedder-OCWQAWKO.js → embedder-3G4BQQ6X.js} +7 -7
- package/dist/bundle/{first-run-MTZPUPGA.js → first-run-FLXOC53U.js} +7 -7
- package/dist/bundle/first-screen-VUZEDSQW.js +32 -0
- package/dist/bundle/{instructions-M6F4FP7U.js → instructions-HGSXDCBT.js} +1 -1
- package/dist/bundle/mail.js +3 -3
- package/dist/bundle/{node-NYBBFHGN.js → node-5Z7PS4F5.js} +2 -2
- package/dist/bundle/{node-sqlite-CWCNWO75.js → node-sqlite-OAW7APIX.js} +3 -3
- package/dist/bundle/{oauth-DVX45EME.js → oauth-ZFZWPAJN.js} +5 -5
- package/dist/bundle/{open-M7EQWWHL.js → open-ZQMBZVH4.js} +2 -2
- package/dist/bundle/{openai-63KRU5H2.js → openai-XT2RIXAK.js} +11 -11
- package/dist/bundle/{process-DV5GQIGM.js → process-VVEQIHPE.js} +1 -1
- package/dist/bundle/{program-EPR3QCMX.js → program-RD3BBDNY.js} +2391 -941
- package/dist/bundle/{prompt-EPWPWTB3.js → prompt-PU7GE4Z4.js} +3 -3
- package/dist/bundle/{recognize-R46KDXK4.js → recognize-AG4A3KUK.js} +2 -2
- package/dist/bundle/{remote-RENCYB5X.js → remote-D6TQ6T7F.js} +5 -5
- package/dist/bundle/{rerank-VHPC5O73.js → rerank-GO24HJPF.js} +5 -5
- package/dist/bundle/{serve-KCH3ORYO.js → serve-WCHJAH6G.js} +7 -7
- package/dist/bundle/server-5KJJ3D6P.js +63 -0
- package/dist/bundle/{server-HZVXSK7B.js → server-CAVNBG3P.js} +33 -33
- package/dist/bundle/{sqlite-runtime-XP7ZJCKJ.js → sqlite-runtime-ANXC4AW2.js} +3 -3
- package/dist/bundle/{state-GQ4MEQJ5.js → state-EGJ66A62.js} +4 -4
- package/dist/bundle/{store-WT7YTR3Y.js → store-OON7FCMQ.js} +12 -12
- package/dist/bundle/{store-CQNLNINW.js → store-SBFA444C.js} +10 -10
- package/dist/bundle/store-maintenance-command-UEOJLYMJ.js +52 -0
- package/dist/commands/attachments.js +2 -2
- package/dist/commands/attachments.js.map +1 -1
- package/dist/commands/context.d.ts +21 -6
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +47 -6
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/drafts.d.ts.map +1 -1
- package/dist/commands/drafts.js +20 -16
- package/dist/commands/drafts.js.map +1 -1
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +10 -7
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/messages.d.ts.map +1 -1
- package/dist/commands/messages.js +13 -9
- package/dist/commands/messages.js.map +1 -1
- package/dist/commands/read.d.ts.map +1 -1
- package/dist/commands/read.js +2 -1
- package/dist/commands/read.js.map +1 -1
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +5 -5
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/session-start.d.ts.map +1 -1
- package/dist/commands/session-start.js +107 -10
- package/dist/commands/session-start.js.map +1 -1
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +72 -9
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/stats.d.ts.map +1 -1
- package/dist/commands/stats.js +2 -3
- package/dist/commands/stats.js.map +1 -1
- package/dist/commands/status.js +2 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/sync.d.ts +0 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +8 -15
- package/dist/commands/sync.js.map +1 -1
- package/dist/config.d.ts +3 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -1
- package/dist/config.js.map +1 -1
- package/dist/mail/backend.d.ts +23 -1
- package/dist/mail/backend.d.ts.map +1 -1
- package/dist/mail/backend.js +4 -1
- package/dist/mail/backend.js.map +1 -1
- package/dist/mail/compose.d.ts.map +1 -1
- package/dist/mail/compose.js +13 -25
- package/dist/mail/compose.js.map +1 -1
- package/dist/mail/doctor.d.ts +42 -0
- package/dist/mail/doctor.d.ts.map +1 -1
- package/dist/mail/doctor.js +76 -0
- package/dist/mail/doctor.js.map +1 -1
- package/dist/mail/drafts.d.ts.map +1 -1
- package/dist/mail/drafts.js +4 -4
- package/dist/mail/drafts.js.map +1 -1
- package/dist/mail/imap/connection.d.ts +6 -3
- package/dist/mail/imap/connection.d.ts.map +1 -1
- package/dist/mail/imap/connection.js +63 -16
- package/dist/mail/imap/connection.js.map +1 -1
- package/dist/mail/imap/index.d.ts +2 -2
- package/dist/mail/imap/index.d.ts.map +1 -1
- package/dist/mail/imap/index.js +3 -3
- package/dist/mail/imap/index.js.map +1 -1
- package/dist/mail/imap/search.d.ts.map +1 -1
- package/dist/mail/imap/search.js +10 -4
- package/dist/mail/imap/search.js.map +1 -1
- package/dist/mail/save.d.ts +2 -5
- package/dist/mail/save.d.ts.map +1 -1
- package/dist/mail/save.js +6 -27
- package/dist/mail/save.js.map +1 -1
- package/dist/mail/send.d.ts.map +1 -1
- package/dist/mail/send.js +1 -0
- package/dist/mail/send.js.map +1 -1
- package/dist/mail/smtp.d.ts +3 -3
- package/dist/mail/smtp.d.ts.map +1 -1
- package/dist/mail/smtp.js +72 -36
- package/dist/mail/smtp.js.map +1 -1
- package/dist/oauth.d.ts +74 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +230 -0
- package/dist/oauth.js.map +1 -0
- package/dist/program.js +2 -2
- package/dist/program.js.map +1 -1
- package/dist/providers.d.ts +25 -3
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +32 -8
- package/dist/providers.js.map +1 -1
- package/dist/reasons.d.ts.map +1 -1
- package/dist/reasons.js +6 -0
- package/dist/reasons.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -4
- package/dist/bundle/first-screen-4PBS6QK5.js +0 -32
- package/dist/bundle/server-FMCPE2ZK.js +0 -63
- package/dist/bundle/store-maintenance-command-YYR42IT4.js +0 -52
package/dist/mail/smtp.js
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import { CliError } from "@wirecat/cli-base";
|
|
2
2
|
import SMTPConnection from "nodemailer/lib/smtp-connection";
|
|
3
|
+
import XOAuth2 from "nodemailer/lib/xoauth2";
|
|
3
4
|
/** The server's reply can quote addresses, so only its codes reach the caller. */
|
|
4
5
|
const codes = (error) => ({
|
|
5
6
|
...(error.code && /^[A-Z0-9_]{1,40}$/.test(error.code) ? { cause_code: error.code } : {}),
|
|
6
7
|
...(error.responseCode ? { smtp_code: error.responseCode } : {}),
|
|
7
8
|
});
|
|
9
|
+
const loginRefused = (error) => error.code === "EAUTH" || error.responseCode === 535;
|
|
10
|
+
/** A token refused after a refresh: on Microsoft 365 most often SMTP AUTH turned off for the mailbox. */
|
|
11
|
+
const tokenRefused = (error, credential) => credential.provider === "microsoft"
|
|
12
|
+
? new CliError("authentication_error", "Microsoft refused the OAuth login for sending; reading still works. On a Microsoft 365 mailbox an admin " +
|
|
13
|
+
'has to turn on "Authenticated SMTP" for it (security defaults turn it off for the whole organisation)', { reason: "mail.smtp-auth-disabled", sent: false, ...codes(error) })
|
|
14
|
+
: new CliError("authentication_error", `the submission server refused the OAuth login; sign in again${credential.signInCommand ? `: ${credential.signInCommand}` : ""}`, { reason: "mail.oauth-refused", sent: false, ...codes(error) });
|
|
8
15
|
/** A failure before the message left: nothing was sent, so the owner may simply run the command again. */
|
|
9
16
|
const beforeSending = (error) => {
|
|
10
|
-
if (error
|
|
17
|
+
if (loginRefused(error))
|
|
11
18
|
return new CliError("authentication_error", "the submission server refused the login; check that the app password allows sending (SMTP) for this mailbox", { reason: "mail.smtp-login-refused", sent: false, ...codes(error) });
|
|
12
19
|
if (error.code === "ETIMEDOUT")
|
|
13
20
|
return new CliError("timeout", "the submission server did not answer in time; nothing was sent", {
|
|
@@ -45,52 +52,81 @@ const settle = (connection, start) => new Promise((resolve, reject) => {
|
|
|
45
52
|
resolve(value);
|
|
46
53
|
});
|
|
47
54
|
});
|
|
48
|
-
/** SMTP submission with the profile's login and app password, one connection per message. */
|
|
49
|
-
export const smtpSubmit = (endpoint,
|
|
55
|
+
/** SMTP submission with the profile's login and its app password or OAuth token, one connection per message. */
|
|
56
|
+
export const smtpSubmit = (endpoint, credential, bounds = {}) => ({
|
|
50
57
|
send: async ({ from, recipients, raw }) => {
|
|
51
58
|
const timeout = Math.max(1_000, Math.min(60_000, bounds.timeLeftMs?.() ?? 60_000));
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
59
|
+
const open = async (login) => {
|
|
60
|
+
const connection = new SMTPConnection({
|
|
61
|
+
host: endpoint.host,
|
|
62
|
+
port: endpoint.port,
|
|
63
|
+
secure: endpoint.security === "tls",
|
|
64
|
+
requireTLS: endpoint.security === "starttls",
|
|
65
|
+
ignoreTLS: endpoint.security === "plain",
|
|
66
|
+
connectionTimeout: 15_000,
|
|
67
|
+
greetingTimeout: 15_000,
|
|
68
|
+
socketTimeout: timeout,
|
|
69
|
+
logger: false,
|
|
70
|
+
});
|
|
71
|
+
// An 'error' event with no listener would end the process; each step's callback already rejects.
|
|
72
|
+
connection.on("error", () => { });
|
|
73
|
+
const abort = () => connection.close();
|
|
74
|
+
bounds.signal?.addEventListener("abort", abort, { once: true });
|
|
75
|
+
const done = () => {
|
|
76
|
+
bounds.signal?.removeEventListener("abort", abort);
|
|
77
|
+
try {
|
|
78
|
+
connection.quit();
|
|
79
|
+
}
|
|
80
|
+
catch { }
|
|
81
|
+
};
|
|
68
82
|
try {
|
|
69
|
-
await settle(connection, (
|
|
70
|
-
await settle(connection, (
|
|
83
|
+
await settle(connection, (finish) => connection.connect((error) => finish(error ?? null)));
|
|
84
|
+
await settle(connection, (finish) => connection.login("pass" in login
|
|
85
|
+
? { user: endpoint.login, pass: login.pass }
|
|
86
|
+
: { user: endpoint.login, oauth2: new XOAuth2({ user: endpoint.login, accessToken: login.accessToken }) }, finish));
|
|
87
|
+
return { connection, done };
|
|
71
88
|
}
|
|
72
89
|
catch (error) {
|
|
73
|
-
|
|
90
|
+
done();
|
|
91
|
+
throw error;
|
|
74
92
|
}
|
|
93
|
+
};
|
|
94
|
+
let opened;
|
|
95
|
+
try {
|
|
75
96
|
try {
|
|
76
|
-
|
|
77
|
-
return { accepted: info.accepted, rejected: info.rejected };
|
|
97
|
+
opened = await open(await credential.login());
|
|
78
98
|
}
|
|
79
|
-
catch (
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
99
|
+
catch (error) {
|
|
100
|
+
if (credential.kind !== "oauth" || !loginRefused(error))
|
|
101
|
+
throw error;
|
|
102
|
+
try {
|
|
103
|
+
opened = await open(await credential.login({ refresh: true }));
|
|
104
|
+
}
|
|
105
|
+
catch (again) {
|
|
106
|
+
if (loginRefused(again))
|
|
107
|
+
throw tokenRefused(again, credential);
|
|
108
|
+
throw again;
|
|
109
|
+
}
|
|
86
110
|
}
|
|
87
111
|
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
throw error instanceof CliError ? error : beforeSending(error);
|
|
114
|
+
}
|
|
115
|
+
const { connection, done } = opened;
|
|
116
|
+
try {
|
|
117
|
+
const info = await settle(connection, (finish) => connection.send({ from, to: [...recipients] }, Buffer.from(raw), finish));
|
|
118
|
+
return { accepted: info.accepted, rejected: info.rejected };
|
|
119
|
+
}
|
|
120
|
+
catch (raw) {
|
|
121
|
+
const error = raw;
|
|
122
|
+
// The envelope is answered before the body goes; a message refused with a code was not taken either.
|
|
123
|
+
if (error.code === "EENVELOPE" || (error.code === "EMESSAGE" && error.responseCode))
|
|
124
|
+
throw refused(error);
|
|
125
|
+
throw new CliError("outcome_unknown", "the line to the submission server broke while the message was going; it may have been sent — " +
|
|
126
|
+
"look in Sent before sending it again", { retryable: false, ...codes(error) });
|
|
127
|
+
}
|
|
88
128
|
finally {
|
|
89
|
-
|
|
90
|
-
try {
|
|
91
|
-
connection.quit();
|
|
92
|
-
}
|
|
93
|
-
catch { }
|
|
129
|
+
done();
|
|
94
130
|
}
|
|
95
131
|
},
|
|
96
132
|
});
|
package/dist/mail/smtp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smtp.js","sourceRoot":"","sources":["../../src/mail/smtp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,cAAc,MAAM,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"smtp.js","sourceRoot":"","sources":["../../src/mail/smtp.ts"],"names":[],"mappings":"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"}
|
package/dist/oauth.d.ts
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { type KeyringStore } from "@wirecat/cli-base";
|
|
3
|
+
import { type OAuthClient, type TokenKeeper, type TokenStorage } from "@wirecat/cli-core/oauth";
|
|
4
|
+
import type { Mailbox } from "./config.js";
|
|
5
|
+
import type { MailCredential } from "./mail/backend.js";
|
|
6
|
+
export type OAuthKind = "microsoft" | "google";
|
|
7
|
+
/**
|
|
8
|
+
* WireCat's Microsoft app: a public client for any Entra tenant and personal accounts. Empty until WireCat registers
|
|
9
|
+
* it (docs/oauth-microsoft.md); until then a sign-in needs `microsoft_client_id` in the config.
|
|
10
|
+
*/
|
|
11
|
+
export declare const WIRECAT_MICROSOFT_CLIENT_ID = "";
|
|
12
|
+
export declare const OAUTH_GUIDE = "https://github.com/WireCatLabs/mail-cli/blob/main/docs/oauth-microsoft.md";
|
|
13
|
+
export declare const MICROSOFT_IMAP_SCOPE = "https://outlook.office.com/IMAP.AccessAsUser.All";
|
|
14
|
+
export declare const MICROSOFT_SMTP_SCOPE = "https://outlook.office.com/SMTP.Send";
|
|
15
|
+
/** IMAP and SMTP are one resource, so one token covers both; offline_access brings the refresh token. */
|
|
16
|
+
export declare const MICROSOFT_SCOPES: readonly ["offline_access", "https://outlook.office.com/IMAP.AccessAsUser.All", "https://outlook.office.com/SMTP.Send"];
|
|
17
|
+
export declare const GOOGLE_GUIDE = "https://github.com/WireCatLabs/mail-cli/blob/main/docs/oauth-google.md";
|
|
18
|
+
/** The only scope Gmail gives IMAP and SMTP: https://developers.google.com/workspace/gmail/imap/xoauth2-protocol */
|
|
19
|
+
export declare const GOOGLE_MAIL_SCOPE = "https://mail.google.com/";
|
|
20
|
+
export declare const GOOGLE_SCOPES: readonly ["openid", "email", "https://mail.google.com/"];
|
|
21
|
+
/** What each scope lets mail do, shown before the browser opens. */
|
|
22
|
+
export declare const SCOPE_WORDS: Record<string, string>;
|
|
23
|
+
export declare const OAUTH_NAMES: Record<OAuthKind, string>;
|
|
24
|
+
export declare const scopesOf: (kind: OAuthKind) => readonly string[];
|
|
25
|
+
/** The scope without which a profile cannot send. */
|
|
26
|
+
export declare const sendScopeOf: (kind: OAuthKind) => "https://mail.google.com/" | "https://outlook.office.com/SMTP.Send";
|
|
27
|
+
/** The owner's Desktop client: `--client-file` (private to the owner), else MAIL_GOOGLE_CLIENT_ID; no bundled one. */
|
|
28
|
+
export declare const googleClient: (env: NodeJS.ProcessEnv, file?: string, platform?: NodeJS.Platform) => OAuthClient;
|
|
29
|
+
/** The address Google signed in, from OpenID userinfo; the token goes in a header, so no failure prints it. */
|
|
30
|
+
export declare const googleAddress: (accessToken: string, fetcher: typeof fetch, signal?: AbortSignal) => Promise<string>;
|
|
31
|
+
/** The owner's own Microsoft app when the config names one, else WireCat's; only the owner sets the key (OWNER_ONLY). */
|
|
32
|
+
export declare const microsoftClient: (mailbox: Mailbox) => {
|
|
33
|
+
client: OAuthClient;
|
|
34
|
+
source: "wirecat" | "own";
|
|
35
|
+
};
|
|
36
|
+
export type CredentialStorage = "keyring" | "file";
|
|
37
|
+
export interface OAuthOptions {
|
|
38
|
+
env: NodeJS.ProcessEnv;
|
|
39
|
+
profile: string;
|
|
40
|
+
kind: OAuthKind;
|
|
41
|
+
keyring?: KeyringStore | undefined;
|
|
42
|
+
/** Where a new sign-in goes; a saved one is read and refreshed where it is. */
|
|
43
|
+
storage?: CredentialStorage | undefined;
|
|
44
|
+
}
|
|
45
|
+
/** The entry `oauth:<provider>:<profile>` beside the profile's app password, under the same options (WC-SECR-24). */
|
|
46
|
+
export declare const oauthStorage: ({ env, profile, kind, keyring, storage }: OAuthOptions) => TokenStorage;
|
|
47
|
+
export declare const signInWords: (profile: string) => string;
|
|
48
|
+
export interface KeeperOptions extends OAuthOptions {
|
|
49
|
+
client: OAuthClient;
|
|
50
|
+
/** Sent as `login_hint`, so the provider offers the right account first. */
|
|
51
|
+
address?: string | undefined;
|
|
52
|
+
fetch?: typeof fetch | undefined;
|
|
53
|
+
signal?: AbortSignal | undefined;
|
|
54
|
+
}
|
|
55
|
+
/** One profile's sign-in, refreshed under a lock every mail process shares; a refresh uses the app it signed in with. */
|
|
56
|
+
export declare const oauthKeeper: (options: KeeperOptions) => TokenKeeper;
|
|
57
|
+
export declare const oauthCredential: (keeper: TokenKeeper, kind: OAuthKind, profile: string) => MailCredential;
|
|
58
|
+
/** A token just received at sign-in, before anything is saved: a refusal fails the sign-in, nothing refreshes. */
|
|
59
|
+
export declare const tokenCredential: (accessToken: string, kind: OAuthKind) => MailCredential;
|
|
60
|
+
/**
|
|
61
|
+
* What `doctor` knows of each sign-in without opening the keyring: when it happened, with which app and scopes. Never
|
|
62
|
+
* a token.
|
|
63
|
+
*/
|
|
64
|
+
export interface SignInRecord {
|
|
65
|
+
provider: OAuthKind;
|
|
66
|
+
client: "wirecat" | "own";
|
|
67
|
+
signed_in_at: string;
|
|
68
|
+
scopes: string[];
|
|
69
|
+
}
|
|
70
|
+
export declare const signInRecords: (env: NodeJS.ProcessEnv) => Record<string, SignInRecord>;
|
|
71
|
+
export declare const recordSignIn: (env: NodeJS.ProcessEnv, profile: string, record: SignInRecord | undefined) => Promise<void>;
|
|
72
|
+
/** The system browser; the sign-in link is printed too, so a failure here only means opening it by hand. */
|
|
73
|
+
export declare const systemBrowser: (url: string, platform?: NodeJS.Platform, start?: typeof spawn) => Promise<void>;
|
|
74
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|
package/dist/oauth.js
ADDED
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { mkdirSync, readFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { CliError, isMovedRun, resolvePaths, systemKeyring } from "@wirecat/cli-base";
|
|
5
|
+
import { privateFiles } from "@wirecat/cli-core/cli";
|
|
6
|
+
import { writeFileAtomic } from "@wirecat/cli-core/files";
|
|
7
|
+
import { credentialStorage, oauthAccount, standardCodec, tokenKeeper, } from "@wirecat/cli-core/oauth";
|
|
8
|
+
import * as v from "valibot";
|
|
9
|
+
import { IDENTITY } from "./identity.js";
|
|
10
|
+
/**
|
|
11
|
+
* WireCat's Microsoft app: a public client for any Entra tenant and personal accounts. Empty until WireCat registers
|
|
12
|
+
* it (docs/oauth-microsoft.md); until then a sign-in needs `microsoft_client_id` in the config.
|
|
13
|
+
*/
|
|
14
|
+
export const WIRECAT_MICROSOFT_CLIENT_ID = "";
|
|
15
|
+
export const OAUTH_GUIDE = "https://github.com/WireCatLabs/mail-cli/blob/main/docs/oauth-microsoft.md";
|
|
16
|
+
export const MICROSOFT_IMAP_SCOPE = "https://outlook.office.com/IMAP.AccessAsUser.All";
|
|
17
|
+
export const MICROSOFT_SMTP_SCOPE = "https://outlook.office.com/SMTP.Send";
|
|
18
|
+
/** IMAP and SMTP are one resource, so one token covers both; offline_access brings the refresh token. */
|
|
19
|
+
export const MICROSOFT_SCOPES = ["offline_access", MICROSOFT_IMAP_SCOPE, MICROSOFT_SMTP_SCOPE];
|
|
20
|
+
export const GOOGLE_GUIDE = "https://github.com/WireCatLabs/mail-cli/blob/main/docs/oauth-google.md";
|
|
21
|
+
/** The only scope Gmail gives IMAP and SMTP: https://developers.google.com/workspace/gmail/imap/xoauth2-protocol */
|
|
22
|
+
export const GOOGLE_MAIL_SCOPE = "https://mail.google.com/";
|
|
23
|
+
export const GOOGLE_SCOPES = ["openid", "email", GOOGLE_MAIL_SCOPE];
|
|
24
|
+
/** What each scope lets mail do, shown before the browser opens. */
|
|
25
|
+
export const SCOPE_WORDS = {
|
|
26
|
+
offline_access: "stay signed in, so a scheduled sync needs no new sign-in",
|
|
27
|
+
[MICROSOFT_IMAP_SCOPE]: "read and change your mail over IMAP",
|
|
28
|
+
[MICROSOFT_SMTP_SCOPE]: "send mail as you over SMTP",
|
|
29
|
+
openid: "know which account signed in",
|
|
30
|
+
email: "see its address, to check it is this mailbox",
|
|
31
|
+
[GOOGLE_MAIL_SCOPE]: "read, change and send your Gmail over IMAP and SMTP",
|
|
32
|
+
};
|
|
33
|
+
export const OAUTH_NAMES = { microsoft: "Microsoft", google: "Google" };
|
|
34
|
+
export const scopesOf = (kind) => kind === "microsoft" ? MICROSOFT_SCOPES : GOOGLE_SCOPES;
|
|
35
|
+
/** The scope without which a profile cannot send. */
|
|
36
|
+
export const sendScopeOf = (kind) => (kind === "microsoft" ? MICROSOFT_SMTP_SCOPE : GOOGLE_MAIL_SCOPE);
|
|
37
|
+
// https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-auth-code-flow: a public client sends no secret,
|
|
38
|
+
// and `common` takes work, school and personal accounts.
|
|
39
|
+
const microsoftProvider = (client, address) => ({
|
|
40
|
+
id: "microsoft",
|
|
41
|
+
name: "Microsoft",
|
|
42
|
+
authorizeUrl: "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
|
|
43
|
+
tokenUrl: "https://login.microsoftonline.com/common/oauth2/v2.0/token",
|
|
44
|
+
client,
|
|
45
|
+
redirect: { kind: "loopback" },
|
|
46
|
+
authorizeParams: { prompt: "select_account", ...(address ? { login_hint: address } : {}) },
|
|
47
|
+
});
|
|
48
|
+
const googleProvider = (client, address) => ({
|
|
49
|
+
id: "google",
|
|
50
|
+
name: "Google",
|
|
51
|
+
authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
|
|
52
|
+
tokenUrl: "https://oauth2.googleapis.com/token",
|
|
53
|
+
revokeUrl: "https://oauth2.googleapis.com/revoke",
|
|
54
|
+
client,
|
|
55
|
+
redirect: { kind: "loopback" },
|
|
56
|
+
// Without offline access Google returns no refresh token; without consent it does not return one again.
|
|
57
|
+
authorizeParams: {
|
|
58
|
+
access_type: "offline",
|
|
59
|
+
prompt: "select_account consent",
|
|
60
|
+
...(address ? { login_hint: address } : {}),
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
const standardGoogle = standardCodec("google");
|
|
64
|
+
const entryObject = (text) => {
|
|
65
|
+
const value = JSON.parse(text);
|
|
66
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
67
|
+
throw new CliError("authentication_error", "the saved sign-in cannot be read; sign in again", {
|
|
68
|
+
reason: "oauth.invalid",
|
|
69
|
+
});
|
|
70
|
+
return { ...value };
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* gcal's codec (gcal-cli src/google.ts): a Google Desktop client needs its secret to refresh, and the client file is
|
|
74
|
+
* read once, at sign-in, so the entry keeps the secret. The third copy after gcal and drive (DEBT, journal).
|
|
75
|
+
*/
|
|
76
|
+
const googleCodec = {
|
|
77
|
+
decode: (raw) => {
|
|
78
|
+
const stored = standardGoogle.decode(raw);
|
|
79
|
+
const { clientSecret } = entryObject(raw);
|
|
80
|
+
return typeof clientSecret === "string" && clientSecret
|
|
81
|
+
? { ...stored, client: { clientId: stored.client?.clientId ?? "", clientSecret } }
|
|
82
|
+
: stored;
|
|
83
|
+
},
|
|
84
|
+
encode: (input) => {
|
|
85
|
+
const entry = entryObject(standardGoogle.encode(input));
|
|
86
|
+
if (input.client.clientSecret)
|
|
87
|
+
entry.clientSecret = input.client.clientSecret;
|
|
88
|
+
else
|
|
89
|
+
delete entry.clientSecret;
|
|
90
|
+
return JSON.stringify(entry);
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
const ClientFile = v.object({
|
|
94
|
+
installed: v.object({ client_id: v.pipe(v.string(), v.minLength(1)), client_secret: v.optional(v.string()) }),
|
|
95
|
+
});
|
|
96
|
+
/** The owner's Desktop client: `--client-file` (private to the owner), else MAIL_GOOGLE_CLIENT_ID; no bundled one. */
|
|
97
|
+
export const googleClient = (env, file, platform = process.platform) => {
|
|
98
|
+
if (!file) {
|
|
99
|
+
const clientId = env.MAIL_GOOGLE_CLIENT_ID;
|
|
100
|
+
const clientSecret = env.MAIL_GOOGLE_CLIENT_SECRET;
|
|
101
|
+
if (clientId)
|
|
102
|
+
return { clientId, ...(clientSecret ? { clientSecret } : {}) };
|
|
103
|
+
throw new CliError("configuration_error", `Gmail over OAuth needs your own Google app: pass --client-file <Desktop client JSON> (steps: ${GOOGLE_GUIDE})`, { reason: "mail.oauth-no-client" });
|
|
104
|
+
}
|
|
105
|
+
const mode = privateFiles({ files: [file], dirs: [] }, platform);
|
|
106
|
+
if (mode.checked && !mode.ok)
|
|
107
|
+
throw new CliError("configuration_error", `the client file can be read by other users of this computer; run chmod 600 ${file} and try again`, { reason: "sign-in.client-file-open" });
|
|
108
|
+
try {
|
|
109
|
+
const { installed } = v.parse(ClientFile, JSON.parse(readFileSync(file, "utf8")));
|
|
110
|
+
return {
|
|
111
|
+
clientId: installed.client_id,
|
|
112
|
+
...(installed.client_secret ? { clientSecret: installed.client_secret } : {}),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
throw new CliError("configuration_error", "could not read a Desktop app OAuth client JSON from the client file; its contents were not logged", { reason: "sign-in.client-file-invalid" });
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
const UserInfo = v.object({ email: v.optional(v.string()), email_verified: v.optional(v.boolean()) });
|
|
120
|
+
/** The address Google signed in, from OpenID userinfo; the token goes in a header, so no failure prints it. */
|
|
121
|
+
export const googleAddress = async (accessToken, fetcher, signal) => {
|
|
122
|
+
const timeout = AbortSignal.timeout(30_000);
|
|
123
|
+
let response;
|
|
124
|
+
try {
|
|
125
|
+
response = await fetcher("https://openidconnect.googleapis.com/v1/userinfo", {
|
|
126
|
+
headers: { authorization: `Bearer ${accessToken}`, accept: "application/json" },
|
|
127
|
+
signal: signal ? AbortSignal.any([signal, timeout]) : timeout,
|
|
128
|
+
redirect: "error",
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
throw new CliError("provider_unavailable", "Google did not answer the account lookup; try again", {
|
|
133
|
+
retryable: true,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
if (!response.ok)
|
|
137
|
+
throw new CliError("authentication_error", `Google refused the account lookup (HTTP ${response.status})`);
|
|
138
|
+
const info = v.safeParse(UserInfo, await response.json().catch(() => undefined));
|
|
139
|
+
const email = info.success ? info.output.email : undefined;
|
|
140
|
+
if (!email || (info.success && info.output.email_verified === false))
|
|
141
|
+
throw new CliError("authentication_error", "Google gave no verified address for this account");
|
|
142
|
+
return email.toLowerCase();
|
|
143
|
+
};
|
|
144
|
+
/** The owner's own Microsoft app when the config names one, else WireCat's; only the owner sets the key (OWNER_ONLY). */
|
|
145
|
+
export const microsoftClient = (mailbox) => {
|
|
146
|
+
const own = mailbox.microsoftClientId?.trim();
|
|
147
|
+
if (own)
|
|
148
|
+
return { client: { clientId: own }, source: own === WIRECAT_MICROSOFT_CLIENT_ID ? "wirecat" : "own" };
|
|
149
|
+
if (WIRECAT_MICROSOFT_CLIENT_ID)
|
|
150
|
+
return { client: { clientId: WIRECAT_MICROSOFT_CLIENT_ID }, source: "wirecat" };
|
|
151
|
+
throw new CliError("configuration_error", "this mail build has no Microsoft app to sign in with yet. Register your own (a free Microsoft Entra app, " +
|
|
152
|
+
`steps: ${OAUTH_GUIDE}) and set its Application (client) ID once, in a terminal: ` +
|
|
153
|
+
`\`${IDENTITY.command} config set --defaults microsoft_client_id <id>\``, { reason: "mail.oauth-no-client" });
|
|
154
|
+
};
|
|
155
|
+
const paths = (env) => resolvePaths({ appName: IDENTITY.appName, prefix: IDENTITY.envPrefix, env });
|
|
156
|
+
/** The entry `oauth:<provider>:<profile>` beside the profile's app password, under the same options (WC-SECR-24). */
|
|
157
|
+
export const oauthStorage = ({ env, profile, kind, keyring = systemKeyring, storage }) => credentialStorage({
|
|
158
|
+
credentials: {
|
|
159
|
+
configDir: paths(env).config,
|
|
160
|
+
service: IDENTITY.appName,
|
|
161
|
+
storage: storage === "file" ? "file" : "auto",
|
|
162
|
+
env,
|
|
163
|
+
isolated: keyring === systemKeyring && isMovedRun({ appName: IDENTITY.appName, prefix: IDENTITY.envPrefix, env }),
|
|
164
|
+
keyring,
|
|
165
|
+
},
|
|
166
|
+
account: oauthAccount(kind, profile),
|
|
167
|
+
codec: kind === "google" ? googleCodec : standardCodec(kind),
|
|
168
|
+
});
|
|
169
|
+
export const signInWords = (profile) => `${IDENTITY.command} ${profile} session start`;
|
|
170
|
+
/** One profile's sign-in, refreshed under a lock every mail process shares; a refresh uses the app it signed in with. */
|
|
171
|
+
export const oauthKeeper = (options) => tokenKeeper({
|
|
172
|
+
provider: options.kind === "google"
|
|
173
|
+
? googleProvider(options.client, options.address)
|
|
174
|
+
: microsoftProvider(options.client, options.address),
|
|
175
|
+
storage: oauthStorage(options),
|
|
176
|
+
lockDir: paths(options.env).config,
|
|
177
|
+
fetch: options.fetch ?? globalThis.fetch,
|
|
178
|
+
signInCommand: signInWords(options.profile),
|
|
179
|
+
...(options.signal ? { signal: options.signal } : {}),
|
|
180
|
+
});
|
|
181
|
+
export const oauthCredential = (keeper, kind, profile) => ({
|
|
182
|
+
kind: "oauth",
|
|
183
|
+
provider: kind,
|
|
184
|
+
signInCommand: signInWords(profile),
|
|
185
|
+
login: async ({ refresh = false } = {}) => ({ accessToken: await keeper.accessToken({ refresh }) }),
|
|
186
|
+
});
|
|
187
|
+
/** A token just received at sign-in, before anything is saved: a refusal fails the sign-in, nothing refreshes. */
|
|
188
|
+
export const tokenCredential = (accessToken, kind) => ({
|
|
189
|
+
kind: "oauth",
|
|
190
|
+
provider: kind,
|
|
191
|
+
login: async () => ({ accessToken }),
|
|
192
|
+
});
|
|
193
|
+
const recordsPath = (env) => join(paths(env).state, "sign-ins.json");
|
|
194
|
+
export const signInRecords = (env) => {
|
|
195
|
+
try {
|
|
196
|
+
const value = JSON.parse(readFileSync(recordsPath(env), "utf8"));
|
|
197
|
+
return typeof value === "object" && value !== null && !Array.isArray(value)
|
|
198
|
+
? value
|
|
199
|
+
: {};
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
return {};
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
export const recordSignIn = async (env, profile, record) => {
|
|
206
|
+
const records = signInRecords(env);
|
|
207
|
+
if (record)
|
|
208
|
+
records[profile] = record;
|
|
209
|
+
else if (profile in records)
|
|
210
|
+
delete records[profile];
|
|
211
|
+
else
|
|
212
|
+
return;
|
|
213
|
+
mkdirSync(paths(env).state, { recursive: true });
|
|
214
|
+
await writeFileAtomic(recordsPath(env), `${JSON.stringify(records, null, 2)}\n`, { mode: 0o600 });
|
|
215
|
+
};
|
|
216
|
+
/** The system browser; the sign-in link is printed too, so a failure here only means opening it by hand. */
|
|
217
|
+
export const systemBrowser = (url, platform = process.platform, start = spawn) => new Promise((resolve, reject) => {
|
|
218
|
+
const [command, args] = platform === "darwin"
|
|
219
|
+
? ["open", [url]]
|
|
220
|
+
: platform === "win32"
|
|
221
|
+
? ["rundll32.exe", ["url.dll,FileProtocolHandler", url]]
|
|
222
|
+
: ["xdg-open", [url]];
|
|
223
|
+
const child = start(command, args, { detached: true, stdio: "ignore", windowsHide: true });
|
|
224
|
+
child.once("error", () => reject(new CliError("configuration_error", `could not start ${command}`)));
|
|
225
|
+
child.once("spawn", () => {
|
|
226
|
+
child.unref();
|
|
227
|
+
resolve();
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|
package/dist/program.js
CHANGED
|
@@ -17,7 +17,7 @@ import { syncCommand } from "./commands/sync.js";
|
|
|
17
17
|
import { tagsCommand } from "./commands/tags.js";
|
|
18
18
|
import { configuration, OWNER_ONLY } from "./config.js";
|
|
19
19
|
import { IDENTITY, PACKAGE, SKILL } from "./identity.js";
|
|
20
|
-
import {
|
|
20
|
+
import { localChecks } from "./mail/doctor.js";
|
|
21
21
|
const update = appUpdate({
|
|
22
22
|
packageName: PACKAGE,
|
|
23
23
|
command: IDENTITY.command,
|
|
@@ -53,7 +53,7 @@ export const definition = () => ({
|
|
|
53
53
|
statsCommand(),
|
|
54
54
|
draftsCommand(),
|
|
55
55
|
tagsCommand(),
|
|
56
|
-
appDoctorCommand(IDENTITY, configuration, { packageName: PACKAGE, local:
|
|
56
|
+
appDoctorCommand(IDENTITY, configuration, { packageName: PACKAGE, local: localChecks }),
|
|
57
57
|
skillCommand(IDENTITY, SKILL),
|
|
58
58
|
appMcpCommand(IDENTITY, configuration, {
|
|
59
59
|
name: "mail",
|
package/dist/program.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,eAAe,EACf,aAAa,EACb,aAAa,IAAI,mBAAmB,EACpC,SAAS,EAIT,GAAG,IAAI,SAAS,EAChB,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,cAAc,GACf,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACxD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
|
package/dist/providers.d.ts
CHANGED
|
@@ -55,6 +55,8 @@ export interface Provider {
|
|
|
55
55
|
imap: Endpoint;
|
|
56
56
|
smtp: Smtp;
|
|
57
57
|
auth: "app-password" | "oauth";
|
|
58
|
+
/** Signs in with this OAuth provider: the only way when `auth` is `oauth`, else with `session start --client-file`. */
|
|
59
|
+
oauth?: "microsoft" | "google";
|
|
58
60
|
note?: string;
|
|
59
61
|
sync?: SyncFolders;
|
|
60
62
|
search?: ServerSearch;
|
|
@@ -99,6 +101,7 @@ declare const TABLE: {
|
|
|
99
101
|
sources: string[];
|
|
100
102
|
};
|
|
101
103
|
auth: "app-password";
|
|
104
|
+
oauth: "google";
|
|
102
105
|
note: string;
|
|
103
106
|
sync: {
|
|
104
107
|
mode: "gmail";
|
|
@@ -180,9 +183,9 @@ declare const TABLE: {
|
|
|
180
183
|
sources: string[];
|
|
181
184
|
};
|
|
182
185
|
};
|
|
183
|
-
|
|
186
|
+
microsoft365: {
|
|
184
187
|
name: string;
|
|
185
|
-
domains:
|
|
188
|
+
domains: never[];
|
|
186
189
|
mx: RegExp;
|
|
187
190
|
imap: Endpoint;
|
|
188
191
|
smtp: {
|
|
@@ -192,7 +195,7 @@ declare const TABLE: {
|
|
|
192
195
|
sources: string[];
|
|
193
196
|
};
|
|
194
197
|
auth: "oauth";
|
|
195
|
-
|
|
198
|
+
oauth: "microsoft";
|
|
196
199
|
prepare: {
|
|
197
200
|
steps: string[];
|
|
198
201
|
notes: string[];
|
|
@@ -200,6 +203,25 @@ declare const TABLE: {
|
|
|
200
203
|
sources: string[];
|
|
201
204
|
};
|
|
202
205
|
};
|
|
206
|
+
outlook: {
|
|
207
|
+
name: string;
|
|
208
|
+
domains: string[];
|
|
209
|
+
imap: Endpoint;
|
|
210
|
+
smtp: {
|
|
211
|
+
host: string;
|
|
212
|
+
port: number;
|
|
213
|
+
security: "starttls";
|
|
214
|
+
sources: string[];
|
|
215
|
+
};
|
|
216
|
+
auth: "oauth";
|
|
217
|
+
oauth: "microsoft";
|
|
218
|
+
prepare: {
|
|
219
|
+
steps: string[];
|
|
220
|
+
notes: never[];
|
|
221
|
+
refused: string;
|
|
222
|
+
sources: string[];
|
|
223
|
+
};
|
|
224
|
+
};
|
|
203
225
|
};
|
|
204
226
|
export type ProviderKey = keyof typeof TABLE;
|
|
205
227
|
/** One entry per built-in provider: how it is found, its servers, how it signs in and how to prepare it. */
|
package/dist/providers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEzD,eAAO,MAAM,aAAa,wEAAwE,CAAA;AAElG,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,UAAU,CAAA;AAEzC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,sHAAsH;IACtH,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAA;IACf,wDAAwD;IACxD,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,iHAAiH;AACjH,MAAM,WAAW,WAAW;IAC1B,uGAAuG;IACvG,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,8GAA8G;AAC9G,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAA;IACpB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,gEAAgE;AAChE,MAAM,WAAW,QAAQ;IACvB,gHAAgH;IAChH,MAAM,CAAC,EAAE,IAAI,CAAA;IACb,mGAAmG;IACnG,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,qGAAqG;IACrG,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,kFAAkF;AAClF,MAAM,WAAW,IAAK,SAAQ,QAAQ;IACpC;;;OAGG;IACH,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,mFAAmF;IACnF,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,qFAAqF;IACrF,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,cAAc,GAAG,OAAO,CAAA;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;CACjB;
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEzD,eAAO,MAAM,aAAa,wEAAwE,CAAA;AAElG,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,UAAU,CAAA;AAEzC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,sHAAsH;IACtH,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAA;IACf,wDAAwD;IACxD,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,iHAAiH;AACjH,MAAM,WAAW,WAAW;IAC1B,uGAAuG;IACvG,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,8GAA8G;AAC9G,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAA;IACpB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,gEAAgE;AAChE,MAAM,WAAW,QAAQ;IACvB,gHAAgH;IAChH,MAAM,CAAC,EAAE,IAAI,CAAA;IACb,mGAAmG;IACnG,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,qGAAqG;IACrG,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,kFAAkF;AAClF,MAAM,WAAW,IAAK,SAAQ,QAAQ;IACpC;;;OAGG;IACH,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,mFAAmF;IACnF,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,qFAAqF;IACrF,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,cAAc,GAAG,OAAO,CAAA;IAC9B,uHAAuH;IACvH,KAAK,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAA;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;CACjB;AAeD,QAAA,MAAM,KAAK;;;;;;;kBAjFH,MAAM;kBACN,MAAM;sBACF,QAAQ;;;;;;YAwFJ,KAAK;YAAuC,MAAM;;;YAE5D,KAAK;YAQL,KAAK;YAIL,OAAO;YAEP,OAAO;;;;;;;;;kBA1GL,MAAM;kBACN,MAAM;sBACF,QAAQ;;;;;;;;;;;;;;;;;;;;;;;YAyId,KAAK;YAML,KAAK;YAGL,OAAO;YAEP,OAAO;;;;;;;;;;;;;;;;YAgBP,KAAK;YAOL,KAAK;YAGL,OAAO;YAEP,OAAO;;;;;;;;;kBAlLL,MAAM;kBACN,MAAM;sBACF,QAAQ;;;;;;YA4Ld,KAAK;YAOL,KAAK;YAGL,OAAO;YACP,OAAO;;;;;;;;;kBAzML,MAAM;kBACN,MAAM;sBACF,QAAQ;;;;;YAqNd,KAAK;YAOL,KAAK;YACL,OAAO;YAEP,OAAO;;;;;;;;;;;;;;;;;YAaP,KAAK;YAGL,KAAK;YAKL,OAAO;YAEP,OAAO;;;;;;;;;;;;;;;;YAWP,KAAK;YAIL,KAAK;YACL,OAAO;YAEP,OAAO;;;CAGuB,CAAA;AAEpC,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,KAAK,CAAA;AAE5C,4GAA4G;AAC5G,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAS,CAAA;AAE7D,eAAO,MAAM,aAAa,EAA6B,WAAW,EAAE,CAAA;AAEpE,eAAO,MAAM,gBAAgB,WAAY,MAAM,KAAG,WAAW,GAAG,SACM,CAAA;AAEtE,eAAO,MAAM,YAAY,EAAE,WAA8D,CAAA;AAEzF,eAAO,MAAM,cAAc,EAAE,YAA0F,CAAA;AACvH,eAAO,MAAM,gBAAgB,EAAE,QAG9B,CAAA;AAED,uHAAuH;AACvH,eAAO,MAAM,WAAW,YAAa,MAAM,QAAQ,MAAM,GAAG,SAAS,KAAG,QAAQ,GAAG,SAIlF,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,OAO7B,CAAA;AAED,4GAA4G;AAC5G,eAAO,MAAM,WAAW,aAAc,MAAM,WAAW,OAAO,KAAG,MAShE,CAAA"}
|