@wirecat/mail-cli 0.5.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 +149 -0
- package/README.md +48 -13
- package/dist/bin/mail.js +2 -2
- package/dist/bundle/{all-profiles-GR5JXYEQ.js → all-profiles-SI67TKZM.js} +9 -9
- package/dist/bundle/{anthropic-REBXE65F.js → anthropic-DALMLC3Y.js} +6 -6
- package/dist/bundle/{app-server-QJ7ICQXZ.js → app-server-XOH327Z2.js} +46 -46
- package/dist/bundle/{bun-WAX4QHW5.js → bun-ORL67CJ6.js} +2 -2
- package/dist/bundle/{bun-sqlite-5S7TQ4SG.js → bun-sqlite-DGXFNFHI.js} +5 -5
- package/dist/bundle/{chunk-ZD3WUGR2.js → chunk-23IEVVL2.js} +4 -4
- package/dist/bundle/{chunk-B5WSIWY5.js → chunk-2M4K7HYR.js} +17 -17
- package/dist/bundle/{chunk-IWDOGGMY.js → chunk-35KD2CI2.js} +501 -301
- package/dist/bundle/{chunk-7A7BHABA.js → chunk-3GZK5GTU.js} +1 -1
- package/dist/bundle/{chunk-JJBQPA7D.js → chunk-3TYEJRMZ.js} +4 -4
- package/dist/bundle/{chunk-M6BDHZON.js → chunk-45KA5667.js} +26 -13
- package/dist/bundle/{chunk-LOA4X6JW.js → chunk-4NYWHINR.js} +6 -6
- package/dist/bundle/{dist-KJOAJ6NF.js → chunk-4ULY3GDL.js} +16 -116
- package/dist/bundle/{chunk-2FXVBCA3.js → chunk-5BSEGMNE.js} +4 -4
- package/dist/bundle/{chunk-HCMUGUAG.js → chunk-5JEYIHS6.js} +3 -3
- package/dist/bundle/{chunk-QXOSGGKS.js → chunk-6LK7KTWB.js} +1 -1
- package/dist/bundle/{chunk-ESNNQA7D.js → chunk-6RMMAUUW.js} +28 -28
- package/dist/bundle/{chunk-VXAZZGXE.js → chunk-6XNPXAJU.js} +33 -27
- package/dist/bundle/{chunk-5INWLYBD.js → chunk-73OJJGZE.js} +14 -3
- package/dist/bundle/{chunk-4XJ4AM3K.js → chunk-7K6KJWTO.js} +12 -12
- package/dist/bundle/{chunk-KIDF77MA.js → chunk-AP7V256W.js} +1 -1
- package/dist/bundle/{chunk-4BMNP2FT.js → chunk-BEMLGWY4.js} +1 -1
- package/dist/bundle/{chunk-BFJV4FWJ.js → chunk-BGUMGCUY.js} +2 -2
- package/dist/bundle/{chunk-5BVIWP3S.js → chunk-BM445GYF.js} +2 -2
- package/dist/bundle/{chunk-F3NYA4KN.js → chunk-CAKBG5FC.js} +6 -6
- package/dist/bundle/{chunk-EB3R2PV3.js → chunk-DKQWTQVY.js} +23 -23
- package/dist/bundle/{chunk-6TY3DGCC.js → chunk-DXGMPMFP.js} +4 -4
- package/dist/bundle/{chunk-LFRHIXCF.js → chunk-E3DRM6YP.js} +3 -3
- package/dist/bundle/{chunk-FSUNGHRI.js → chunk-EYT33MM3.js} +47 -46
- package/dist/bundle/{chunk-DXDQOZ2P.js → chunk-FPOGVDLS.js} +2 -2
- package/dist/bundle/{chunk-S677WGOQ.js → chunk-FTFNWGIR.js} +8 -8
- package/dist/bundle/{chunk-TI6VBZKJ.js → chunk-FUB3X25H.js} +4 -4
- package/dist/bundle/{chunk-7JCRQX56.js → chunk-GJUUTUK4.js} +8 -8
- package/dist/bundle/{chunk-BLS5YG77.js → chunk-HFJNEXU7.js} +2 -2
- package/dist/bundle/{chunk-YKPBC3NL.js → chunk-HV3EIYX4.js} +1 -1
- package/dist/bundle/{chunk-EL554DV2.js → chunk-IYZHM3ZN.js} +3 -3
- package/dist/bundle/{chunk-6EO7GVYJ.js → chunk-JFMUI4H6.js} +1 -1
- package/dist/bundle/{chunk-2YQNBIDQ.js → chunk-LZ5J3UXD.js} +4 -4
- package/dist/bundle/{chunk-WNCCYHRV.js → chunk-M2JCUVCJ.js} +116 -95
- package/dist/bundle/{chunk-7F3NDIYL.js → chunk-MCJ7LKYR.js} +6 -6
- package/dist/bundle/{chunk-VDAIJM5L.js → chunk-MHQKHWCJ.js} +88 -34
- package/dist/bundle/{chunk-SQ7KOBRA.js → chunk-MMXMVGA6.js} +10 -8
- package/dist/bundle/{chunk-AFCGOZR7.js → chunk-NNIXREJH.js} +7 -7
- package/dist/bundle/{chunk-LQ37ALDJ.js → chunk-NXJLC2WK.js} +8 -8
- package/dist/bundle/{chunk-6GE3EADU.js → chunk-OHTR4WFO.js} +2 -2
- package/dist/bundle/{chunk-PJCTWPJB.js → chunk-PDL4UREY.js} +8 -8
- package/dist/bundle/{chunk-J3QXTBD2.js → chunk-Q2C3VMSU.js} +20 -18
- package/dist/bundle/{chunk-SWJAG5IE.js → chunk-Q44AYEOB.js} +2 -2
- package/dist/bundle/{chunk-P7P5MNAU.js → chunk-QZBT6BOU.js} +1 -1
- package/dist/bundle/{chunk-IBYTYIYO.js → chunk-R5MML3FC.js} +61 -54
- package/dist/bundle/{chunk-CEAANMJ2.js → chunk-RQVWZBW3.js} +3 -3
- package/dist/bundle/{chunk-5CXAH4Y6.js → chunk-S4YUR4S3.js} +656 -572
- package/dist/bundle/{chunk-QX7RCLRS.js → chunk-SQLCCKEL.js} +1 -1
- package/dist/bundle/chunk-U6UJ3HRS.js +58 -0
- package/dist/bundle/{chunk-YRGBZZUW.js → chunk-V4TDG4KF.js} +14 -14
- package/dist/bundle/{chunk-5FK6RD4M.js → chunk-VBOMKZ4E.js} +73 -57
- package/dist/bundle/{chunk-MQUJEQTU.js → chunk-VKPWP3AK.js} +2 -2
- package/dist/bundle/{chunk-7XNPSIWD.js → chunk-VNJMO5F6.js} +2 -2
- package/dist/bundle/{chunk-MMDCL42A.js → chunk-VSHJWTX5.js} +12 -6
- package/dist/bundle/{chunk-2MRECWJZ.js → chunk-XQJWMBDY.js} +6 -6
- package/dist/bundle/{chunk-2U4IANVV.js → chunk-ZKCNMW7G.js} +2 -2
- package/dist/bundle/{chunk-LNS27BTB.js → chunk-ZKZABB4K.js} +3 -3
- package/dist/bundle/{chunk-WNI5BZFB.js → chunk-ZNGQ3NZ4.js} +9 -9
- package/dist/bundle/command-contract-CB5BII3S.js +34 -0
- package/dist/bundle/{decode-D7BDVIVB.js → decode-KOBURZIQ.js} +5 -5
- package/dist/bundle/{dispatch-EUKKT3PD.js → dispatch-GDAH4JHS.js} +8 -8
- package/dist/bundle/dist-T7HMT675.js +134 -0
- package/dist/bundle/{echarts-IVRX7XHP.js → echarts-LEWTQO6H.js} +2 -2
- package/dist/bundle/{embed-X527RBTG.js → embed-PUFE4BSQ.js} +6 -6
- package/dist/bundle/{embedder-F4PSJS6S.js → embedder-3G4BQQ6X.js} +9 -9
- package/dist/bundle/{failure-OAIC5VAP.js → failure-6COJAO7T.js} +2 -2
- package/dist/bundle/{first-run-M5CIX6NA.js → first-run-FLXOC53U.js} +11 -11
- package/dist/bundle/first-screen-VUZEDSQW.js +32 -0
- package/dist/bundle/{instructions-UX36BT5F.js → instructions-HGSXDCBT.js} +1 -1
- package/dist/bundle/mail.js +12 -11
- package/dist/bundle/{mcp-L7SRVDRN.js → mcp-GAPDLFWA.js} +2 -2
- package/dist/bundle/{node-OXT7WE2T.js → node-5Z7PS4F5.js} +2 -2
- package/dist/bundle/{node-sqlite-X2PSEHA4.js → node-sqlite-OAW7APIX.js} +5 -5
- package/dist/bundle/{oauth-MYK4BSYN.js → oauth-ZFZWPAJN.js} +7 -7
- package/dist/bundle/{open-GONIP2DH.js → open-ZQMBZVH4.js} +4 -4
- package/dist/bundle/{openai-YJFNUOQT.js → openai-XT2RIXAK.js} +14 -14
- package/dist/bundle/{process-7IEUUSRK.js → process-VVEQIHPE.js} +1 -1
- package/dist/bundle/{program-Q73TTG3E.js → program-RD3BBDNY.js} +21470 -7075
- package/dist/bundle/{prompt-SKQ72KN7.js → prompt-PU7GE4Z4.js} +5 -5
- package/dist/bundle/{recognize-GC7CU2DB.js → recognize-AG4A3KUK.js} +4 -4
- package/dist/bundle/{remote-UEXFZP2I.js → remote-D6TQ6T7F.js} +7 -7
- package/dist/bundle/{rerank-2U2NDEZP.js → rerank-GO24HJPF.js} +7 -7
- package/dist/bundle/{serve-OOGKFEWL.js → serve-WCHJAH6G.js} +9 -9
- package/dist/bundle/server-5KJJ3D6P.js +63 -0
- package/dist/bundle/{server-FZ3LFQTF.js → server-CAVNBG3P.js} +38 -38
- package/dist/bundle/{sqlite-runtime-GIQSW6LJ.js → sqlite-runtime-ANXC4AW2.js} +5 -5
- package/dist/bundle/{state-EMFXPQVZ.js → state-EGJ66A62.js} +6 -6
- package/dist/bundle/{store-BDU4UPNK.js → store-OON7FCMQ.js} +15 -15
- package/dist/bundle/{store-LDI62AUG.js → store-SBFA444C.js} +13 -13
- package/dist/bundle/store-maintenance-command-UEOJLYMJ.js +52 -0
- package/dist/commands/attachments.d.ts +3 -0
- package/dist/commands/attachments.d.ts.map +1 -0
- package/dist/commands/attachments.js +97 -0
- package/dist/commands/attachments.js.map +1 -0
- package/dist/commands/context.d.ts +21 -6
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +58 -7
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/drafts-send.d.ts +7 -0
- package/dist/commands/drafts-send.d.ts.map +1 -0
- package/dist/commands/drafts-send.js +58 -0
- package/dist/commands/drafts-send.js.map +1 -0
- package/dist/commands/drafts.d.ts +3 -0
- package/dist/commands/drafts.d.ts.map +1 -0
- package/dist/commands/drafts.js +243 -0
- package/dist/commands/drafts.js.map +1 -0
- package/dist/commands/export.d.ts +3 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +278 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/folders.d.ts.map +1 -1
- package/dist/commands/folders.js +120 -2
- package/dist/commands/folders.js.map +1 -1
- package/dist/commands/messages.d.ts +25 -0
- package/dist/commands/messages.d.ts.map +1 -0
- package/dist/commands/messages.js +506 -0
- package/dist/commands/messages.js.map +1 -0
- package/dist/commands/read.d.ts +4 -1
- package/dist/commands/read.d.ts.map +1 -1
- package/dist/commands/read.js +14 -3
- package/dist/commands/read.js.map +1 -1
- package/dist/commands/rules.d.ts +3 -0
- package/dist/commands/rules.d.ts.map +1 -0
- package/dist/commands/rules.js +292 -0
- package/dist/commands/rules.js.map +1 -0
- package/dist/commands/send.d.ts +39 -0
- package/dist/commands/send.d.ts.map +1 -0
- package/dist/commands/send.js +309 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/server-search.d.ts +8 -0
- package/dist/commands/server-search.d.ts.map +1 -0
- package/dist/commands/server-search.js +38 -0
- package/dist/commands/server-search.js.map +1 -0
- 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 +3 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +89 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/status.js +2 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/sync.d.ts +6 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +28 -20
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/tags.d.ts +3 -0
- package/dist/commands/tags.d.ts.map +1 -0
- package/dist/commands/tags.js +144 -0
- package/dist/commands/tags.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +52 -1
- package/dist/config.js.map +1 -1
- package/dist/export/format.d.ts +19 -0
- package/dist/export/format.d.ts.map +1 -0
- package/dist/export/format.js +40 -0
- package/dist/export/format.js.map +1 -0
- package/dist/export/journal.d.ts +32 -0
- package/dist/export/journal.d.ts.map +1 -0
- package/dist/export/journal.js +84 -0
- package/dist/export/journal.js.map +1 -0
- package/dist/export/write.d.ts +14 -0
- package/dist/export/write.d.ts.map +1 -0
- package/dist/export/write.js +42 -0
- package/dist/export/write.js.map +1 -0
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +3 -0
- package/dist/identity.js.map +1 -1
- package/dist/mail/backend.d.ts +104 -2
- 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/changes.d.ts +91 -0
- package/dist/mail/changes.d.ts.map +1 -0
- package/dist/mail/changes.js +198 -0
- package/dist/mail/changes.js.map +1 -0
- package/dist/mail/cleanup.d.ts +41 -0
- package/dist/mail/cleanup.d.ts.map +1 -0
- package/dist/mail/cleanup.js +119 -0
- package/dist/mail/cleanup.js.map +1 -0
- package/dist/mail/compose.d.ts +73 -0
- package/dist/mail/compose.d.ts.map +1 -0
- package/dist/mail/compose.js +110 -0
- package/dist/mail/compose.js.map +1 -0
- package/dist/mail/doctor.d.ts +67 -0
- package/dist/mail/doctor.d.ts.map +1 -0
- package/dist/mail/doctor.js +115 -0
- package/dist/mail/doctor.js.map +1 -0
- package/dist/mail/drafts.d.ts +54 -0
- package/dist/mail/drafts.d.ts.map +1 -0
- package/dist/mail/drafts.js +104 -0
- package/dist/mail/drafts.js.map +1 -0
- package/dist/mail/imap/connection.d.ts +13 -3
- package/dist/mail/imap/connection.d.ts.map +1 -1
- package/dist/mail/imap/connection.js +87 -18
- package/dist/mail/imap/connection.js.map +1 -1
- package/dist/mail/imap/index.d.ts +3 -3
- package/dist/mail/imap/index.d.ts.map +1 -1
- package/dist/mail/imap/index.js +14 -4
- package/dist/mail/imap/index.js.map +1 -1
- package/dist/mail/imap/messages.d.ts +5 -6
- package/dist/mail/imap/messages.d.ts.map +1 -1
- package/dist/mail/imap/messages.js +14 -28
- package/dist/mail/imap/messages.js.map +1 -1
- package/dist/mail/imap/read.d.ts.map +1 -1
- package/dist/mail/imap/read.js +27 -13
- package/dist/mail/imap/read.js.map +1 -1
- package/dist/mail/imap/search.d.ts +14 -0
- package/dist/mail/imap/search.d.ts.map +1 -0
- package/dist/mail/imap/search.js +55 -0
- package/dist/mail/imap/search.js.map +1 -0
- package/dist/mail/imap/write.d.ts +5 -0
- package/dist/mail/imap/write.d.ts.map +1 -0
- package/dist/mail/imap/write.js +93 -0
- package/dist/mail/imap/write.js.map +1 -0
- package/dist/mail/organise.d.ts +116 -0
- package/dist/mail/organise.d.ts.map +1 -0
- package/dist/mail/organise.js +531 -0
- package/dist/mail/organise.js.map +1 -0
- package/dist/mail/rethread.d.ts +1 -2
- package/dist/mail/rethread.d.ts.map +1 -1
- package/dist/mail/rethread.js +8 -3
- package/dist/mail/rethread.js.map +1 -1
- package/dist/mail/rules/apply.d.ts +40 -0
- package/dist/mail/rules/apply.d.ts.map +1 -0
- package/dist/mail/rules/apply.js +114 -0
- package/dist/mail/rules/apply.js.map +1 -0
- package/dist/mail/rules/file.d.ts +9 -0
- package/dist/mail/rules/file.d.ts.map +1 -0
- package/dist/mail/rules/file.js +51 -0
- package/dist/mail/rules/file.js.map +1 -0
- package/dist/mail/rules/filters.d.ts +11 -0
- package/dist/mail/rules/filters.d.ts.map +1 -0
- package/dist/mail/rules/filters.js +150 -0
- package/dist/mail/rules/filters.js.map +1 -0
- package/dist/mail/rules/folders.d.ts +11 -0
- package/dist/mail/rules/folders.d.ts.map +1 -0
- package/dist/mail/rules/folders.js +17 -0
- package/dist/mail/rules/folders.js.map +1 -0
- package/dist/mail/rules/query.d.ts +15 -0
- package/dist/mail/rules/query.d.ts.map +1 -0
- package/dist/mail/rules/query.js +103 -0
- package/dist/mail/rules/query.js.map +1 -0
- package/dist/mail/rules/store.d.ts +9 -0
- package/dist/mail/rules/store.d.ts.map +1 -0
- package/dist/mail/rules/store.js +17 -0
- package/dist/mail/rules/store.js.map +1 -0
- package/dist/mail/save.d.ts +9 -0
- package/dist/mail/save.d.ts.map +1 -0
- package/dist/mail/save.js +50 -0
- package/dist/mail/save.js.map +1 -0
- package/dist/mail/send.d.ts +67 -0
- package/dist/mail/send.d.ts.map +1 -0
- package/dist/mail/send.js +173 -0
- package/dist/mail/send.js.map +1 -0
- package/dist/mail/smtp.d.ts +4 -0
- package/dist/mail/smtp.d.ts.map +1 -0
- package/dist/mail/smtp.js +133 -0
- package/dist/mail/smtp.js.map +1 -0
- 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.d.ts.map +1 -1
- package/dist/program.js +26 -4
- package/dist/program.js.map +1 -1
- package/dist/providers.d.ts +96 -9
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +69 -16
- package/dist/providers.js.map +1 -1
- package/dist/reasons.d.ts +9 -0
- package/dist/reasons.d.ts.map +1 -0
- package/dist/reasons.js +27 -0
- package/dist/reasons.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +7 -5
- package/skills/mail-cli/SKILL.md +30 -3
- package/dist/bundle/chunk-YD5WV757.js +0 -27
- package/dist/bundle/command-contract-GPUED3GT.js +0 -34
- package/dist/bundle/first-screen-M7MT776O.js +0 -32
- package/dist/bundle/server-4JMHDHZ7.js +0 -63
- package/dist/bundle/store-maintenance-command-OFRPORN2.js +0 -52
- /package/dist/bundle/{chunk-NPGVOZVK.js → chunk-WJWLHLQ7.js} +0 -0
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.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAEA,OAAO,EAQL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,UAAU,EAMhB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAEA,OAAO,EAQL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,UAAU,EAMhB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAqCxC,eAAO,MAAM,UAAU,QAAO,iBA2C5B,CAAA;AAEF,eAAO,MAAM,aAAa,aAAc,cAAc,KAAG,OAAqD,CAAA;AAE9G,eAAO,MAAM,GAAG,SAAU,MAAM,EAAE,YAAY,UAAU,KAAG,OAAO,CAAC,MAAM,CAA2C,CAAA"}
|
package/dist/program.js
CHANGED
|
@@ -3,13 +3,21 @@ import { resolvePaths } from "@wirecat/cli-base";
|
|
|
3
3
|
import { appDoctorCommand, appMcpCommand, baseContext, commandsCommand, configCommand, createProgram as createSharedProgram, outputFor, run as runShared, runsCommand, scheduleCommandFor, skillCommand, upgradeCommand, } from "@wirecat/cli-core/cli";
|
|
4
4
|
import { appUpdate } from "@wirecat/cli-core/update";
|
|
5
5
|
import { accountCommand } from "./commands/account.js";
|
|
6
|
+
import { attachmentsCommand } from "./commands/attachments.js";
|
|
7
|
+
import { draftsCommand } from "./commands/drafts.js";
|
|
6
8
|
import { foldersCommand } from "./commands/folders.js";
|
|
9
|
+
import { messageWrites } from "./commands/messages.js";
|
|
7
10
|
import { readCommands } from "./commands/read.js";
|
|
11
|
+
import { rulesCommand } from "./commands/rules.js";
|
|
12
|
+
import { forwardCommand, sendCommand } from "./commands/send.js";
|
|
8
13
|
import { sessionCommand } from "./commands/session.js";
|
|
14
|
+
import { statsCommand } from "./commands/stats.js";
|
|
9
15
|
import { statusCommand } from "./commands/status.js";
|
|
10
16
|
import { syncCommand } from "./commands/sync.js";
|
|
11
|
-
import {
|
|
17
|
+
import { tagsCommand } from "./commands/tags.js";
|
|
18
|
+
import { configuration, OWNER_ONLY } from "./config.js";
|
|
12
19
|
import { IDENTITY, PACKAGE, SKILL } from "./identity.js";
|
|
20
|
+
import { localChecks } from "./mail/doctor.js";
|
|
13
21
|
const update = appUpdate({
|
|
14
22
|
packageName: PACKAGE,
|
|
15
23
|
command: IDENTITY.command,
|
|
@@ -19,6 +27,15 @@ const update = appUpdate({
|
|
|
19
27
|
enabled: (env) => configuration.resolveSettings({}, { env, needsProfile: false }).updateCheck,
|
|
20
28
|
offVariables: [`${IDENTITY.envPrefix}_NO_UPDATE_CHECK`],
|
|
21
29
|
});
|
|
30
|
+
/** cli-core's `messages` group reads; the changes to a mailbox go beside `messages show`. */
|
|
31
|
+
const withWrites = (reads) => {
|
|
32
|
+
const messages = reads.find((one) => one.name() === "messages");
|
|
33
|
+
if (!messages)
|
|
34
|
+
throw new Error("cli-core's mail reads have no messages group");
|
|
35
|
+
for (const write of [...messageWrites(), sendCommand(), forwardCommand()])
|
|
36
|
+
messages.addCommand(write);
|
|
37
|
+
return reads;
|
|
38
|
+
};
|
|
22
39
|
export const definition = () => ({
|
|
23
40
|
app: IDENTITY,
|
|
24
41
|
firstScreen: { start: `${IDENTITY.command} personal session start --address <email>` },
|
|
@@ -29,9 +46,14 @@ export const definition = () => ({
|
|
|
29
46
|
accountCommand(),
|
|
30
47
|
foldersCommand(),
|
|
31
48
|
syncCommand(),
|
|
49
|
+
rulesCommand(),
|
|
32
50
|
statusCommand(),
|
|
33
|
-
...readCommands(),
|
|
34
|
-
|
|
51
|
+
...withWrites(readCommands()),
|
|
52
|
+
attachmentsCommand(),
|
|
53
|
+
statsCommand(),
|
|
54
|
+
draftsCommand(),
|
|
55
|
+
tagsCommand(),
|
|
56
|
+
appDoctorCommand(IDENTITY, configuration, { packageName: PACKAGE, local: localChecks }),
|
|
35
57
|
skillCommand(IDENTITY, SKILL),
|
|
36
58
|
appMcpCommand(IDENTITY, configuration, {
|
|
37
59
|
name: "mail",
|
|
@@ -45,7 +67,7 @@ export const definition = () => ({
|
|
|
45
67
|
latest: () => update.latest({}),
|
|
46
68
|
install: (argv) => update.runUpdate(argv, {}),
|
|
47
69
|
})),
|
|
48
|
-
configCommand(IDENTITY, configuration),
|
|
70
|
+
configCommand(IDENTITY, configuration, { ownerOnly: OWNER_ONLY }),
|
|
49
71
|
runsCommand(IDENTITY),
|
|
50
72
|
scheduleCommandFor({
|
|
51
73
|
app: IDENTITY,
|
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,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
|
package/dist/providers.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SearchSyntax } from "./mail/imap/search.js";
|
|
1
2
|
export declare const PROVIDERS_URL = "https://github.com/WireCatLabs/mail-cli/blob/main/docs/providers.md";
|
|
2
3
|
export type Security = "tls" | "starttls";
|
|
3
4
|
export interface Endpoint {
|
|
@@ -21,6 +22,30 @@ export interface SyncFolders {
|
|
|
21
22
|
roles: string[];
|
|
22
23
|
otherwise: string;
|
|
23
24
|
}
|
|
25
|
+
/** How `search messages --backend` asks the server, and which folders by role when the profile names none. */
|
|
26
|
+
export interface ServerSearch {
|
|
27
|
+
syntax: SearchSyntax;
|
|
28
|
+
roles: string[];
|
|
29
|
+
otherwise: string;
|
|
30
|
+
}
|
|
31
|
+
/** How a change reaches the mailbox, where providers differ. */
|
|
32
|
+
export interface Organise {
|
|
33
|
+
/** Gmail: one All Mail with labels, so a move or copy is a change of labels, and a deletion a move to Trash. */
|
|
34
|
+
labels?: true;
|
|
35
|
+
/** Trash under the names the provider gives it, tried when the server marks no folder `\Trash`. */
|
|
36
|
+
trash: string[];
|
|
37
|
+
/** Drafts under the names the provider gives it, tried when the server marks no folder `\Drafts`. */
|
|
38
|
+
drafts: string[];
|
|
39
|
+
}
|
|
40
|
+
/** Where `messages send` submits mail, read from the provider's own help page. */
|
|
41
|
+
export interface Smtp extends Endpoint {
|
|
42
|
+
/**
|
|
43
|
+
* The server files what SMTP carried into Sent itself, so a copy appended by the tool would be a second one. Absent:
|
|
44
|
+
* the help page does not say so, and the tool appends the copy unless Sent already holds that Message-ID.
|
|
45
|
+
*/
|
|
46
|
+
savesSent?: true;
|
|
47
|
+
sources: string[];
|
|
48
|
+
}
|
|
24
49
|
export interface Provider {
|
|
25
50
|
name: string;
|
|
26
51
|
/** Address domains it hosts; every provider here logs in with the full address. */
|
|
@@ -28,11 +53,14 @@ export interface Provider {
|
|
|
28
53
|
/** A domain with its own name can still be hosted here: its MX record says where. */
|
|
29
54
|
mx?: RegExp;
|
|
30
55
|
imap: Endpoint;
|
|
31
|
-
|
|
32
|
-
smtp: Endpoint;
|
|
56
|
+
smtp: Smtp;
|
|
33
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";
|
|
34
60
|
note?: string;
|
|
35
61
|
sync?: SyncFolders;
|
|
62
|
+
search?: ServerSearch;
|
|
63
|
+
organise?: Organise;
|
|
36
64
|
prepare: Prepare;
|
|
37
65
|
}
|
|
38
66
|
declare const TABLE: {
|
|
@@ -41,9 +69,18 @@ declare const TABLE: {
|
|
|
41
69
|
domains: string[];
|
|
42
70
|
mx: RegExp;
|
|
43
71
|
imap: Endpoint;
|
|
44
|
-
smtp:
|
|
72
|
+
smtp: {
|
|
73
|
+
host: string;
|
|
74
|
+
port: number;
|
|
75
|
+
security: Security;
|
|
76
|
+
sources: string[];
|
|
77
|
+
};
|
|
45
78
|
auth: "app-password";
|
|
46
79
|
note: string;
|
|
80
|
+
organise: {
|
|
81
|
+
trash: string[];
|
|
82
|
+
drafts: string[];
|
|
83
|
+
};
|
|
47
84
|
prepare: {
|
|
48
85
|
steps: string[];
|
|
49
86
|
notes: string[];
|
|
@@ -56,14 +93,31 @@ declare const TABLE: {
|
|
|
56
93
|
domains: string[];
|
|
57
94
|
mx: RegExp;
|
|
58
95
|
imap: Endpoint;
|
|
59
|
-
smtp:
|
|
96
|
+
smtp: {
|
|
97
|
+
host: string;
|
|
98
|
+
port: number;
|
|
99
|
+
security: Security;
|
|
100
|
+
savesSent: true;
|
|
101
|
+
sources: string[];
|
|
102
|
+
};
|
|
60
103
|
auth: "app-password";
|
|
104
|
+
oauth: "google";
|
|
61
105
|
note: string;
|
|
62
106
|
sync: {
|
|
63
107
|
mode: "gmail";
|
|
64
108
|
roles: string[];
|
|
65
109
|
otherwise: string;
|
|
66
110
|
};
|
|
111
|
+
search: {
|
|
112
|
+
syntax: "gmail";
|
|
113
|
+
roles: string[];
|
|
114
|
+
otherwise: string;
|
|
115
|
+
};
|
|
116
|
+
organise: {
|
|
117
|
+
labels: true;
|
|
118
|
+
trash: string[];
|
|
119
|
+
drafts: string[];
|
|
120
|
+
};
|
|
67
121
|
prepare: {
|
|
68
122
|
steps: string[];
|
|
69
123
|
notes: string[];
|
|
@@ -79,6 +133,7 @@ declare const TABLE: {
|
|
|
79
133
|
host: string;
|
|
80
134
|
port: number;
|
|
81
135
|
security: "starttls";
|
|
136
|
+
sources: string[];
|
|
82
137
|
};
|
|
83
138
|
auth: "app-password";
|
|
84
139
|
note: string;
|
|
@@ -94,7 +149,12 @@ declare const TABLE: {
|
|
|
94
149
|
domains: string[];
|
|
95
150
|
mx: RegExp;
|
|
96
151
|
imap: Endpoint;
|
|
97
|
-
smtp:
|
|
152
|
+
smtp: {
|
|
153
|
+
host: string;
|
|
154
|
+
port: number;
|
|
155
|
+
security: Security;
|
|
156
|
+
sources: string[];
|
|
157
|
+
};
|
|
98
158
|
auth: "app-password";
|
|
99
159
|
note: string;
|
|
100
160
|
prepare: {
|
|
@@ -109,7 +169,12 @@ declare const TABLE: {
|
|
|
109
169
|
domains: string[];
|
|
110
170
|
mx: RegExp;
|
|
111
171
|
imap: Endpoint;
|
|
112
|
-
smtp:
|
|
172
|
+
smtp: {
|
|
173
|
+
host: string;
|
|
174
|
+
port: number;
|
|
175
|
+
security: Security;
|
|
176
|
+
sources: string[];
|
|
177
|
+
};
|
|
113
178
|
auth: "app-password";
|
|
114
179
|
prepare: {
|
|
115
180
|
steps: string[];
|
|
@@ -118,18 +183,19 @@ declare const TABLE: {
|
|
|
118
183
|
sources: string[];
|
|
119
184
|
};
|
|
120
185
|
};
|
|
121
|
-
|
|
186
|
+
microsoft365: {
|
|
122
187
|
name: string;
|
|
123
|
-
domains:
|
|
188
|
+
domains: never[];
|
|
124
189
|
mx: RegExp;
|
|
125
190
|
imap: Endpoint;
|
|
126
191
|
smtp: {
|
|
127
192
|
host: string;
|
|
128
193
|
port: number;
|
|
129
194
|
security: "starttls";
|
|
195
|
+
sources: string[];
|
|
130
196
|
};
|
|
131
197
|
auth: "oauth";
|
|
132
|
-
|
|
198
|
+
oauth: "microsoft";
|
|
133
199
|
prepare: {
|
|
134
200
|
steps: string[];
|
|
135
201
|
notes: string[];
|
|
@@ -137,6 +203,25 @@ declare const TABLE: {
|
|
|
137
203
|
sources: string[];
|
|
138
204
|
};
|
|
139
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
|
+
};
|
|
140
225
|
};
|
|
141
226
|
export type ProviderKey = keyof typeof TABLE;
|
|
142
227
|
/** One entry per built-in provider: how it is found, its servers, how it signs in and how to prepare it. */
|
|
@@ -144,6 +229,8 @@ export declare const PROVIDERS: Record<ProviderKey, Provider>;
|
|
|
144
229
|
export declare const PROVIDER_KEYS: ProviderKey[];
|
|
145
230
|
export declare const providerByDomain: (domain: string) => ProviderKey | undefined;
|
|
146
231
|
export declare const DEFAULT_SYNC: SyncFolders;
|
|
232
|
+
export declare const DEFAULT_SEARCH: ServerSearch;
|
|
233
|
+
export declare const DEFAULT_ORGANISE: Organise;
|
|
147
234
|
/** The provider of a saved profile: its address domain first, then its server host (a domain of its own on Yandex). */
|
|
148
235
|
export declare const providerFor: (address: string, host: string | undefined) => Provider | undefined;
|
|
149
236
|
export declare const GENERIC_PREPARE: Prepare;
|
package/dist/providers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"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"}
|