@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
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { KeyringStore } from "@wirecat/cli-base";
|
|
2
2
|
import { type BaseEnvironment, type GlobalFlags } from "@wirecat/cli-core/cli";
|
|
3
|
-
import type
|
|
3
|
+
import { type Command, Option } from "commander";
|
|
4
4
|
import type { DiscoveryDeps } from "../discovery.js";
|
|
5
|
-
import type
|
|
6
|
-
import { type
|
|
5
|
+
import { type MailCredential, type MailEndpoint, type OpenBackend } from "../mail/backend.js";
|
|
6
|
+
import { type OAuthKind } from "../oauth.js";
|
|
7
|
+
import { type LookupHimalaya, type PasswordSource } from "../secret.js";
|
|
7
8
|
/** What a test hands `run()` in place of the network, the keyring and `secret-tool`. */
|
|
8
9
|
export interface MailEnvironment extends BaseEnvironment {
|
|
9
10
|
keyring?: KeyringStore;
|
|
@@ -11,6 +12,9 @@ export interface MailEnvironment extends BaseEnvironment {
|
|
|
11
12
|
discovery?: DiscoveryDeps;
|
|
12
13
|
/** Opens the mailbox in place of IMAP; a test hands in one on its fake server. */
|
|
13
14
|
backend?: OpenBackend;
|
|
15
|
+
/** The OAuth token endpoint and the browser, replaced in tests. */
|
|
16
|
+
fetch?: typeof fetch;
|
|
17
|
+
openBrowser?: (url: string) => Promise<void>;
|
|
14
18
|
}
|
|
15
19
|
export declare const contextOf: (command: Command) => {
|
|
16
20
|
environment: MailEnvironment;
|
|
@@ -26,17 +30,26 @@ export declare const endpointOf: (settings: ReturnType<typeof contextOf>["settin
|
|
|
26
30
|
export declare const passwordsOf: (context: ReturnType<typeof contextOf>) => {
|
|
27
31
|
read: () => Promise<{
|
|
28
32
|
secret: string;
|
|
29
|
-
source:
|
|
33
|
+
source: PasswordSource;
|
|
30
34
|
} | undefined>;
|
|
31
35
|
write: (secret: string, storage?: "keyring" | "file") => "keyring" | "file";
|
|
32
36
|
usesOwnersSignIn: () => boolean;
|
|
33
37
|
remove: () => boolean;
|
|
34
38
|
};
|
|
39
|
+
/** The OAuth provider a profile signs in with, from its provider in the registry. */
|
|
40
|
+
export declare const oauthKindOf: (mailbox: ReturnType<typeof contextOf>["settings"]["mailbox"]) => OAuthKind | undefined;
|
|
41
|
+
/** A profile's OAuth sign-in, refreshed as each connect asks; nothing is read until a login needs a token. */
|
|
42
|
+
export declare const oauthKeeperOf: (context: ReturnType<typeof contextOf>, kind: OAuthKind) => import("@wirecat/cli-core/oauth").TokenKeeper;
|
|
43
|
+
/** The profile's credential by its `auth`: the stored app password, or its OAuth sign-in. */
|
|
44
|
+
export declare const credentialOf: (context: ReturnType<typeof contextOf>) => Promise<{
|
|
45
|
+
credential: MailCredential;
|
|
46
|
+
passwordFrom?: PasswordSource;
|
|
47
|
+
}>;
|
|
35
48
|
export interface OpenMailOptions {
|
|
36
49
|
/** A server not saved in the profile yet: `session start` checks it before saving it. */
|
|
37
50
|
endpoint?: MailEndpoint;
|
|
38
|
-
/** A password just typed, not read from the keyring. */
|
|
39
|
-
|
|
51
|
+
/** A password just typed or a token just received, not read from the keyring. */
|
|
52
|
+
credential?: MailCredential;
|
|
40
53
|
canRetry?: () => boolean;
|
|
41
54
|
}
|
|
42
55
|
/**
|
|
@@ -49,4 +62,6 @@ export declare const openMail: (context: ReturnType<typeof contextOf>, options?:
|
|
|
49
62
|
passwordFrom: "environment" | "file" | "himalaya" | "keyring" | undefined;
|
|
50
63
|
}>;
|
|
51
64
|
export declare const collect: (value: string, previous?: string[]) => string[];
|
|
65
|
+
/** The empty list as its default is what tells the MCP tool to take a list for the option, not one string. */
|
|
66
|
+
export declare const repeatable: (flags: string, description: string) => Option;
|
|
52
67
|
//# sourceMappingURL=context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,OAAO,EAAE,KAAK,eAAe,EAAiB,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAC7F,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,OAAO,EAAE,KAAK,eAAe,EAAiB,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAC7F,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAEhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAEpD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,WAAW,EAGjB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAmB,KAAK,SAAS,EAAgC,MAAM,aAAa,CAAA;AAE3F,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAiB,MAAM,cAAc,CAAA;AAEtF,wFAAwF;AACxF,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB,kFAAkF;IAClF,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,mEAAmE;IACnE,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IACpB,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7C;AAED,eAAO,MAAM,SAAS,YAAa,OAAO;;;;;;;;CAMzC,CAAA;AAED,eAAO,MAAM,aAAa,UAAW,WAAW,SAE/C,CAAA;AAED,eAAO,MAAM,UAAU,aAAc,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,UAAU,CAAC,KAAG,YAS/E,CAAA;AAWD,eAAO,MAAM,WAAW,YAAa,UAAU,CAAC,OAAO,SAAS,CAAC;;;;;;;;CAM7D,CAAA;AAEJ,qFAAqF;AACrF,eAAO,MAAM,WAAW,YAAa,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,KAAG,SAAS,GAAG,SACtB,CAAA;AAEjF,8GAA8G;AAC9G,eAAO,MAAM,aAAa,YAAa,UAAU,CAAC,OAAO,SAAS,CAAC,QAAQ,SAAS,kDAkBnF,CAAA;AAED,6FAA6F;AAC7F,eAAO,MAAM,YAAY,YACd,UAAU,CAAC,OAAO,SAAS,CAAC,KACpC,OAAO,CAAC;IAAE,UAAU,EAAE,cAAc,CAAC;IAAC,YAAY,CAAC,EAAE,cAAc,CAAA;CAAE,CAmBvE,CAAA;AAKD,MAAM,WAAW,eAAe;IAC9B,yFAAyF;IACzF,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,iFAAiF;IACjF,UAAU,CAAC,EAAE,cAAc,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAA;CACzB;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,YAAmB,UAAU,CAAC,OAAO,SAAS,CAAC,YAAW,eAAe;;;;EAiB7F,CAAA;AAED,eAAO,MAAM,OAAO,UAAW,MAAM,aAAY,MAAM,EAAE,KAAQ,MAAM,EAA0B,CAAA;AAEjG,8GAA8G;AAC9G,eAAO,MAAM,UAAU,UAAW,MAAM,eAAe,MAAM,KAAG,MACO,CAAA"}
|
package/dist/commands/context.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { CliError } from "@wirecat/cli-base";
|
|
2
2
|
import { environmentOf } from "@wirecat/cli-core/cli";
|
|
3
|
+
import { Option } from "commander";
|
|
3
4
|
import { configuration } from "../config.js";
|
|
4
5
|
import { IDENTITY } from "../identity.js";
|
|
6
|
+
import { passwordCredential, } from "../mail/backend.js";
|
|
5
7
|
import { imapBackend } from "../mail/imap/index.js";
|
|
8
|
+
import { microsoftClient, oauthCredential, oauthKeeper } from "../oauth.js";
|
|
9
|
+
import { providerFor } from "../providers.js";
|
|
6
10
|
import { passwordStore } from "../secret.js";
|
|
7
11
|
export const contextOf = (command) => {
|
|
8
12
|
const environment = environmentOf(command);
|
|
@@ -19,7 +23,16 @@ export const endpointOf = (settings) => {
|
|
|
19
23
|
const { address, login, host, port, security } = settings.mailbox;
|
|
20
24
|
if (!address || !host || !port || !security)
|
|
21
25
|
throw new CliError("configuration_error", `profile ${settings.profile} has no mail server; run \`${IDENTITY.command} ${settings.profile} session start --address <email>\``);
|
|
22
|
-
|
|
26
|
+
const smtp = smtpOf(settings.mailbox);
|
|
27
|
+
return { host, port, security, login: login ?? address, ...(smtp ? { smtp } : {}) };
|
|
28
|
+
};
|
|
29
|
+
/** The profile's own submission server, else the one the registry knows for its provider. */
|
|
30
|
+
const smtpOf = (mailbox) => {
|
|
31
|
+
const known = mailbox.address ? providerFor(mailbox.address, mailbox.host)?.smtp : undefined;
|
|
32
|
+
const host = mailbox.smtp?.host ?? known?.host;
|
|
33
|
+
const port = mailbox.smtp?.port ?? known?.port;
|
|
34
|
+
const security = mailbox.smtp?.security ?? known?.security;
|
|
35
|
+
return host && port && security ? { host, port, security } : undefined;
|
|
23
36
|
};
|
|
24
37
|
export const passwordsOf = (context) => passwordStore({
|
|
25
38
|
env: context.env,
|
|
@@ -27,6 +40,43 @@ export const passwordsOf = (context) => passwordStore({
|
|
|
27
40
|
keyring: context.environment.keyring,
|
|
28
41
|
himalaya: context.environment.himalaya,
|
|
29
42
|
});
|
|
43
|
+
/** The OAuth provider a profile signs in with, from its provider in the registry. */
|
|
44
|
+
export const oauthKindOf = (mailbox) => mailbox.address ? providerFor(mailbox.address, mailbox.host)?.oauth : undefined;
|
|
45
|
+
/** A profile's OAuth sign-in, refreshed as each connect asks; nothing is read until a login needs a token. */
|
|
46
|
+
export const oauthKeeperOf = (context, kind) => {
|
|
47
|
+
const { mailbox } = context.settings;
|
|
48
|
+
let client;
|
|
49
|
+
try {
|
|
50
|
+
client = kind === "microsoft" ? microsoftClient(mailbox).client : { clientId: "" };
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// A saved sign-in refreshes with the app it was made with, which the entry records.
|
|
54
|
+
client = { clientId: "" };
|
|
55
|
+
}
|
|
56
|
+
return oauthKeeper({
|
|
57
|
+
env: context.env,
|
|
58
|
+
profile: context.profile,
|
|
59
|
+
kind,
|
|
60
|
+
client,
|
|
61
|
+
keyring: context.environment.keyring,
|
|
62
|
+
fetch: context.environment.fetch,
|
|
63
|
+
signal: context.environment.signal,
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
/** The profile's credential by its `auth`: the stored app password, or its OAuth sign-in. */
|
|
67
|
+
export const credentialOf = async (context) => {
|
|
68
|
+
const { mailbox } = context.settings;
|
|
69
|
+
if (mailbox.auth === "oauth") {
|
|
70
|
+
const kind = oauthKindOf(mailbox);
|
|
71
|
+
if (!kind)
|
|
72
|
+
throw new CliError("configuration_error", `profile ${context.profile} signs in with OAuth, which mail can do for Outlook, Microsoft 365 and Gmail only`);
|
|
73
|
+
return { credential: oauthCredential(oauthKeeperOf(context, kind), kind, context.profile) };
|
|
74
|
+
}
|
|
75
|
+
const stored = await passwordsOf(context).read();
|
|
76
|
+
if (stored === undefined)
|
|
77
|
+
throw new CliError("authentication_error", `no app password for profile ${context.profile}; run \`${IDENTITY.command} ${context.profile} session start\``, { reason: "mail.no-password" });
|
|
78
|
+
return { credential: passwordCredential(stored.secret), passwordFrom: stored.source };
|
|
79
|
+
};
|
|
30
80
|
/** A retry that would end after the run's deadline is not made; this much is kept back for saving and answering. */
|
|
31
81
|
const RETRY_MARGIN_MS = 3_000;
|
|
32
82
|
/**
|
|
@@ -36,10 +86,9 @@ const RETRY_MARGIN_MS = 3_000;
|
|
|
36
86
|
export const openMail = async (context, options = {}) => {
|
|
37
87
|
const { deadline, signal } = context.environment;
|
|
38
88
|
const endpoint = options.endpoint ?? endpointOf(context.settings);
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
throw new CliError("authentication_error", `no app password for profile ${context.profile}; run \`${IDENTITY.command} ${context.profile} session start\``, { reason: "mail.no-password" });
|
|
89
|
+
const { credential, passwordFrom } = options.credential
|
|
90
|
+
? { credential: options.credential, passwordFrom: undefined }
|
|
91
|
+
: await credentialOf(context);
|
|
43
92
|
const bounds = {
|
|
44
93
|
timeLeftMs: () => {
|
|
45
94
|
const now = deadline?.();
|
|
@@ -48,9 +97,11 @@ export const openMail = async (context, options = {}) => {
|
|
|
48
97
|
...(signal ? { signal } : {}),
|
|
49
98
|
...(options.canRetry ? { canRetry: options.canRetry } : {}),
|
|
50
99
|
};
|
|
51
|
-
const backend = (context.environment.backend ?? imapBackend)(endpoint,
|
|
100
|
+
const backend = (context.environment.backend ?? imapBackend)(endpoint, credential, bounds);
|
|
52
101
|
context.environment.trackCloseable?.(backend);
|
|
53
|
-
return { backend, endpoint, passwordFrom
|
|
102
|
+
return { backend, endpoint, passwordFrom };
|
|
54
103
|
};
|
|
55
104
|
export const collect = (value, previous = []) => [...previous, value];
|
|
105
|
+
/** The empty list as its default is what tells the MCP tool to take a list for the option, not one string. */
|
|
106
|
+
export const repeatable = (flags, description) => new Option(flags, description).argParser(collect).default([], "none");
|
|
56
107
|
//# sourceMappingURL=context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAwB,aAAa,EAAoB,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAwB,aAAa,EAAoB,MAAM,uBAAuB,CAAA;AAC7F,OAAO,EAAgB,MAAM,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAIL,kBAAkB,GAEnB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAkB,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC3F,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAA4C,aAAa,EAAE,MAAM,cAAc,CAAA;AActF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC5C,MAAM,WAAW,GAAG,aAAa,CAAkB,OAAO,CAAC,CAAA;IAC3D,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,eAAe,EAAe,CAAA;IACpD,MAAM,QAAQ,GAAG,aAAa,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;IAC9D,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAA;AACzE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAkB,EAAE,EAAE;IAClD,IAAI,KAAK,CAAC,OAAO;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,iDAAiD,CAAC,CAAA;AAC9G,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,QAAkD,EAAgB,EAAE;IAC7F,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAA;IACjE,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ;QACzC,MAAM,IAAI,QAAQ,CAChB,qBAAqB,EACrB,WAAW,QAAQ,CAAC,OAAO,8BAA8B,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,oCAAoC,CAClI,CAAA;IACH,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IACrC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,IAAI,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;AACrF,CAAC,CAAA;AAED,6FAA6F;AAC7F,MAAM,MAAM,GAAG,CAAC,OAA4D,EAAE,EAAE;IAC9E,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;IAC5F,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,IAAI,KAAK,EAAE,IAAI,CAAA;IAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,IAAI,KAAK,EAAE,IAAI,CAAA;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,IAAI,KAAK,EAAE,QAAQ,CAAA;IAC1D,OAAO,IAAI,IAAI,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;AACxE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAqC,EAAE,EAAE,CACnE,aAAa,CAAC;IACZ,GAAG,EAAE,OAAO,CAAC,GAAG;IAChB,OAAO,EAAE,OAAO,CAAC,OAAO;IACxB,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,OAAO;IACpC,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,QAAQ;CACvC,CAAC,CAAA;AAEJ,qFAAqF;AACrF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAA4D,EAAyB,EAAE,CACjH,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AAEjF,8GAA8G;AAC9G,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAqC,EAAE,IAAe,EAAE,EAAE;IACtF,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAA;IACpC,IAAI,MAA4B,CAAA;IAChC,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,oFAAoF;QACpF,MAAM,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;IAC3B,CAAC;IACD,OAAO,WAAW,CAAC;QACjB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI;QACJ,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,OAAO;QACpC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK;QAChC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,MAAM;KACnC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,6FAA6F;AAC7F,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,OAAqC,EACmC,EAAE;IAC1E,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAA;IACpC,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;QACjC,IAAI,CAAC,IAAI;YACP,MAAM,IAAI,QAAQ,CAChB,qBAAqB,EACrB,WAAW,OAAO,CAAC,OAAO,mFAAmF,CAC9G,CAAA;QACH,OAAO,EAAE,UAAU,EAAE,eAAe,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAA;IAC7F,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;IAChD,IAAI,MAAM,KAAK,SAAS;QACtB,MAAM,IAAI,QAAQ,CAChB,sBAAsB,EACtB,+BAA+B,OAAO,CAAC,OAAO,WAAW,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,kBAAkB,EAC9G,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAC/B,CAAA;IACH,OAAO,EAAE,UAAU,EAAE,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,CAAA;AACvF,CAAC,CAAA;AAED,oHAAoH;AACpH,MAAM,eAAe,GAAG,KAAK,CAAA;AAU7B;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,OAAqC,EAAE,OAAO,GAAoB,EAAE,EAAE,EAAE;IACrG,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAA;IAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACjE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,UAAU;QACrD,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE;QAC7D,CAAC,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,CAAA;IAC/B,MAAM,MAAM,GAAc;QACxB,UAAU,EAAE,GAAG,EAAE;YACf,MAAM,GAAG,GAAG,QAAQ,EAAE,EAAE,CAAA;YACxB,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,SAAS,CAAA;QACpE,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5D,CAAA;IACD,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAA;IAC1F,OAAO,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAA;AAC5C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,QAAQ,GAAa,EAAE,EAAY,EAAE,CAAC,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAA;AAEjG,8GAA8G;AAC9G,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,WAAmB,EAAU,EAAE,CACvE,IAAI,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* Sends a saved draft through the same path as `messages send` — its keys, question, limit, journal and Sent copy —
|
|
4
|
+
* then takes it out of Drafts. A draft that cannot be removed stays and is said so: the mail has gone either way.
|
|
5
|
+
*/
|
|
6
|
+
export declare const draftSendCommand: () => Command;
|
|
7
|
+
//# sourceMappingURL=drafts-send.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drafts-send.d.ts","sourceRoot":"","sources":["../../src/commands/drafts-send.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAYnC;;;GAGG;AACH,eAAO,MAAM,gBAAgB,QAAO,OAyD9B,CAAA"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { annotate } from "@wirecat/cli-base/commands";
|
|
2
|
+
import { answerEntity, outputFor, REMOTE_WRITE } from "@wirecat/cli-core/cli";
|
|
3
|
+
import { guardedWrite, newOperationId } from "@wirecat/cli-core/sends";
|
|
4
|
+
import { Command } from "commander";
|
|
5
|
+
import { IDENTITY } from "../identity.js";
|
|
6
|
+
import { messageIdFor, peopleOf } from "../mail/compose.js";
|
|
7
|
+
import { draftIdOf, draftsFolderOf, findDraft } from "../mail/drafts.js";
|
|
8
|
+
import { organising } from "./messages.js";
|
|
9
|
+
import { go, mailSend, operationIdOf } from "./send.js";
|
|
10
|
+
/**
|
|
11
|
+
* Sends a saved draft through the same path as `messages send` — its keys, question, limit, journal and Sent copy —
|
|
12
|
+
* then takes it out of Drafts. A draft that cannot be removed stays and is said so: the mail has gone either way.
|
|
13
|
+
*/
|
|
14
|
+
export const draftSendCommand = () => answerEntity(annotate(new Command("send"), {
|
|
15
|
+
effects: REMOTE_WRITE,
|
|
16
|
+
examples: [`${IDENTITY.command} ya drafts send 5b0e1c2a@example.com`],
|
|
17
|
+
}), "mail_send", mailSend)
|
|
18
|
+
.summary("send a saved draft, then remove it from Drafts")
|
|
19
|
+
.description("send a draft as it is saved, over SMTP, as messages send does: mail to anyone but you asks first " +
|
|
20
|
+
"(permissions.messages.send.others); once it went, the draft leaves the Drafts folder")
|
|
21
|
+
.argument("<draft>", "the draft's id, as drafts list shows it")
|
|
22
|
+
.option("--operation-id <id>", "repeat a send whose outcome was unknown; Sent is checked first, so it goes once")
|
|
23
|
+
.option("--yes", "answer the question before sending to anyone but you")
|
|
24
|
+
.option("--dry-run", "show what would go; send nothing")
|
|
25
|
+
.action(async function (given, flags) {
|
|
26
|
+
const id = draftIdOf(given);
|
|
27
|
+
const operationId = operationIdOf(flags.operationId);
|
|
28
|
+
await organising(this, async (opened) => {
|
|
29
|
+
const folder = draftsFolderOf(await opened.mailbox.folders(), opened.mailbox.organise);
|
|
30
|
+
const found = await findDraft(opened.backend, folder, id);
|
|
31
|
+
const { draft: saved, references, parts } = found.read;
|
|
32
|
+
const from = { address: opened.mailbox.key.account };
|
|
33
|
+
const draft = {
|
|
34
|
+
from,
|
|
35
|
+
to: peopleOf(saved.to, "--to"),
|
|
36
|
+
cc: peopleOf(saved.cc, "--cc"),
|
|
37
|
+
bcc: peopleOf(saved.bcc, "--bcc"),
|
|
38
|
+
subject: saved.subject,
|
|
39
|
+
text: saved.text,
|
|
40
|
+
messageId: messageIdFor(operationId, from.address),
|
|
41
|
+
date: new Date(),
|
|
42
|
+
...(saved.in_reply_to ? { inReplyTo: saved.in_reply_to } : {}),
|
|
43
|
+
...(references.length ? { references } : {}),
|
|
44
|
+
files: [],
|
|
45
|
+
parts,
|
|
46
|
+
};
|
|
47
|
+
const sent = await go(this, opened, { draft, kind: "message", key: "messages.send", operationId, retry: flags.operationId !== undefined }, flags.dryRun === true);
|
|
48
|
+
if (!sent)
|
|
49
|
+
return;
|
|
50
|
+
try {
|
|
51
|
+
await guardedWrite(opened.guard, { chatId: null, kind: "account", key: "drafts.send", operationId: newOperationId() }, () => opened.mailbox.writes.expunge(folder, found.validity, [found.uid]));
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
outputFor(this).renderer.warn(`the draft was sent and is still in ${folder}; drafts delete removes it`);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=drafts-send.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drafts-send.js","sourceRoot":"","sources":["../../src/commands/drafts-send.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drafts.d.ts","sourceRoot":"","sources":["../../src/commands/drafts.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA6UnC,eAAO,MAAM,aAAa,QAAO,OAQE,CAAA"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { CliError } from "@wirecat/cli-base";
|
|
3
|
+
import { annotate } from "@wirecat/cli-base/commands";
|
|
4
|
+
import { answerEntity, bufferedInput, environmentOf, itemOf, LOCAL_READ, listOf, outputFor, ownerOnlyOption, REMOTE_READ, REMOTE_WRITE, renderAnswer, } from "@wirecat/cli-core/cli";
|
|
5
|
+
import { guardedWrite, newOperationId } from "@wirecat/cli-core/sends";
|
|
6
|
+
import { Command } from "commander";
|
|
7
|
+
import * as v from "valibot";
|
|
8
|
+
import { IDENTITY } from "../identity.js";
|
|
9
|
+
import { build, originalOf, peopleOf, referencesOf, replyCopies, replyPeople, replySubject, } from "../mail/compose.js";
|
|
10
|
+
import { DRAFT_FLAGS, draftIdOf, draftsFolderOf, findDraft, listDrafts, nextVersion, } from "../mail/drafts.js";
|
|
11
|
+
import { trashOf } from "../mail/organise.js";
|
|
12
|
+
import { fetchOriginal } from "../mail/send.js";
|
|
13
|
+
import { repeatable } from "./context.js";
|
|
14
|
+
import { draftSendCommand } from "./drafts-send.js";
|
|
15
|
+
import { organising } from "./messages.js";
|
|
16
|
+
import { ownerOf } from "./send.js";
|
|
17
|
+
const LIST_LIMIT = 50;
|
|
18
|
+
const MAX_LIST = 500;
|
|
19
|
+
const mailDraft = v.strictObject({
|
|
20
|
+
id: v.string(),
|
|
21
|
+
uid: v.number(),
|
|
22
|
+
subject: v.string(),
|
|
23
|
+
from: v.nullable(v.string()),
|
|
24
|
+
to: v.array(v.string()),
|
|
25
|
+
cc: v.array(v.string()),
|
|
26
|
+
bcc: v.array(v.string()),
|
|
27
|
+
date: v.nullable(v.string()),
|
|
28
|
+
in_reply_to: v.nullable(v.string()),
|
|
29
|
+
attachments: v.array(v.strictObject({ name: v.string(), mime: v.nullable(v.string()) })),
|
|
30
|
+
text: v.string(),
|
|
31
|
+
});
|
|
32
|
+
const draftChange = v.strictObject({
|
|
33
|
+
action: v.picklist(["create", "update", "delete"]),
|
|
34
|
+
applied: v.boolean(),
|
|
35
|
+
id: v.string(),
|
|
36
|
+
folder: v.string(),
|
|
37
|
+
uid: v.nullable(v.number()),
|
|
38
|
+
replaced_uid: v.optional(v.number()),
|
|
39
|
+
old_version_in: v.optional(v.string()),
|
|
40
|
+
subject: v.optional(v.string()),
|
|
41
|
+
to: v.optional(v.array(v.string())),
|
|
42
|
+
size: v.optional(v.number()),
|
|
43
|
+
hint: v.optional(v.string()),
|
|
44
|
+
});
|
|
45
|
+
const REF = "msg:email/me%40example.com/t1/m1";
|
|
46
|
+
const ID = "5b0e1c2a@example.com";
|
|
47
|
+
const limitOf = (value) => {
|
|
48
|
+
if (!/^\d+$/.test(value.trim()) || Number(value) < 1 || Number(value) > MAX_LIST)
|
|
49
|
+
throw new CliError("validation_error", `--limit takes a whole number from 1 to ${MAX_LIST}`, { param: "limit" });
|
|
50
|
+
return Number(value);
|
|
51
|
+
};
|
|
52
|
+
const addressing = (command) => command
|
|
53
|
+
.addOption(repeatable("--to <address>", "who it goes to: an address, or several split by commas; repeat it for more"))
|
|
54
|
+
.addOption(repeatable("--cc <address>", "a copy to; repeat it for more"))
|
|
55
|
+
.addOption(repeatable("--bcc <address>", "a blind copy to; repeat it for more"))
|
|
56
|
+
.option("--subject <text>", "the subject line")
|
|
57
|
+
.option("--dry-run", "build the draft and show it; store nothing");
|
|
58
|
+
const listed = (given, flag) => (given?.length ? peopleOf(given, flag) : undefined);
|
|
59
|
+
const addressesOf = (people) => people.map(({ address, name }) => (name ? `${name} <${address}>` : address));
|
|
60
|
+
/** The text as given, `-` for stdin; stdin is read only when asked, as an MCP server's stdin is its own channel. */
|
|
61
|
+
const textOf = async (command, text) => {
|
|
62
|
+
if (text !== "-")
|
|
63
|
+
return text;
|
|
64
|
+
const input = environmentOf(command).stdin ?? process.stdin;
|
|
65
|
+
if (input.isTTY)
|
|
66
|
+
throw new CliError("validation_error", "- reads the text from a pipe");
|
|
67
|
+
return (await bufferedInput(input)).toString("utf8");
|
|
68
|
+
};
|
|
69
|
+
const ownAddress = (opened) => opened.mailbox.key.account;
|
|
70
|
+
const draftsFolder = async (opened) => draftsFolderOf(await opened.mailbox.folders(), opened.mailbox.organise);
|
|
71
|
+
/** Every change to Drafts goes through the guard, with its own key; none counts toward the send limit. */
|
|
72
|
+
const guarded = (opened, key, act) => guardedWrite(opened.guard, { chatId: null, kind: "account", key, operationId: newOperationId() }, act);
|
|
73
|
+
const answer = (command, change) => renderAnswer(command, outputFor(command), itemOf(change), () => change.applied
|
|
74
|
+
? `${change.action === "delete" ? "deleted" : "saved"} draft ${change.id} in ${change.folder}\n`
|
|
75
|
+
: `${change.hint ?? "a preview: nothing changed"}\n`);
|
|
76
|
+
/** The message `--reply-to` names, read from the server, so its ids and recipients are exactly what it holds. */
|
|
77
|
+
const replyTo = async (command, opened, ref, all) => {
|
|
78
|
+
const { raw } = await fetchOriginal(opened.mailbox, opened.backend, ref, opened.profile);
|
|
79
|
+
const original = await originalOf(raw);
|
|
80
|
+
if (!original.messageId)
|
|
81
|
+
throw new CliError("invalid_response", `${ref} has no Message-ID, so a reply cannot name what it answers`);
|
|
82
|
+
const owner = ownerOf(opened, command);
|
|
83
|
+
const to = replyPeople(original, owner, false);
|
|
84
|
+
return {
|
|
85
|
+
to,
|
|
86
|
+
cc: all ? replyCopies(original, owner, to) : [],
|
|
87
|
+
subject: replySubject(original.subject),
|
|
88
|
+
inReplyTo: original.messageId,
|
|
89
|
+
references: referencesOf(original),
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
const listCommand = () => answerEntity(annotate(new Command("list"), {
|
|
93
|
+
effects: REMOTE_READ,
|
|
94
|
+
examples: [`${IDENTITY.command} ya drafts list`, `${IDENTITY.command} ya drafts list --limit 5 --json`],
|
|
95
|
+
}), "mail_draft", mailDraft)
|
|
96
|
+
.summary("the drafts on the server, newest first")
|
|
97
|
+
.description("the drafts in the mailbox's Drafts folder, newest first, read from the server")
|
|
98
|
+
.option("--limit <n>", `at most this many (default ${LIST_LIMIT}, at most ${MAX_LIST})`, limitOf)
|
|
99
|
+
.action(async function (options) {
|
|
100
|
+
await organising(this, async (opened) => {
|
|
101
|
+
const limit = options.limit ?? LIST_LIMIT;
|
|
102
|
+
const found = await listDrafts(opened.backend, await draftsFolder(opened), limit);
|
|
103
|
+
renderAnswer(this, outputFor(this), listOf("drafts list", { items: found.items, limit, has_more: found.more }), () => found.items.length === 0
|
|
104
|
+
? "no drafts\n"
|
|
105
|
+
: `${found.items.map((one) => `${one.id} ${one.subject || "(no subject)"} to ${one.to.join(", ") || "nobody yet"}`).join("\n")}\n`);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
const createCommand = () => answerEntity(addressing(annotate(new Command("create"), {
|
|
109
|
+
effects: REMOTE_WRITE,
|
|
110
|
+
examples: [
|
|
111
|
+
`${IDENTITY.command} ya drafts create --to anna@example.com --subject 'Monday' 'Shall we meet at ten?'`,
|
|
112
|
+
`${IDENTITY.command} ya drafts create --reply-to ${REF} --reply-all 'Thanks, agreed.'`,
|
|
113
|
+
],
|
|
114
|
+
})), "mail_draft_change", draftChange)
|
|
115
|
+
.summary("save a new draft for the owner to check and send")
|
|
116
|
+
.description("save a new message in the Drafts folder; nothing is sent, and the owner sends it from any mail app. " +
|
|
117
|
+
"--reply-to answers a stored message in its thread")
|
|
118
|
+
.argument("[text]", "the text; - reads it from stdin")
|
|
119
|
+
.option("--reply-to <message>", "answer this stored message: its sender, its subject with Re:, in its thread")
|
|
120
|
+
.option("--reply-all", "with --reply-to, also everyone it went to, but you")
|
|
121
|
+
.action(async function (given, options) {
|
|
122
|
+
if (options.replyAll && !options.replyTo)
|
|
123
|
+
throw new CliError("validation_error", "--reply-all goes with --reply-to", { param: "reply-all" });
|
|
124
|
+
const body = (await textOf(this, given)) ?? "";
|
|
125
|
+
await organising(this, async (opened) => {
|
|
126
|
+
const reply = options.replyTo
|
|
127
|
+
? await replyTo(this, opened, options.replyTo, options.replyAll === true)
|
|
128
|
+
: undefined;
|
|
129
|
+
const from = ownAddress(opened);
|
|
130
|
+
const message = {
|
|
131
|
+
from: { address: from },
|
|
132
|
+
to: listed(options.to, "--to") ?? reply?.to ?? [],
|
|
133
|
+
cc: [...(reply?.cc ?? []), ...(listed(options.cc, "--cc") ?? [])],
|
|
134
|
+
bcc: listed(options.bcc, "--bcc") ?? [],
|
|
135
|
+
subject: options.subject ?? reply?.subject ?? "",
|
|
136
|
+
text: body,
|
|
137
|
+
// A UUID, not an operation id: the owner types this id, and one starting with "-" reads as an option.
|
|
138
|
+
messageId: `<${randomUUID()}@${from.split("@")[1] ?? "localhost"}>`,
|
|
139
|
+
date: new Date(),
|
|
140
|
+
...(reply ? { inReplyTo: reply.inReplyTo, references: reply.references } : {}),
|
|
141
|
+
files: [],
|
|
142
|
+
};
|
|
143
|
+
await saveDraft(this, opened, "create", message, options.dryRun === true);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
const saveDraft = async (command, opened, action, message, dryRun, replacing) => {
|
|
147
|
+
const folder = await draftsFolder(opened);
|
|
148
|
+
// The copy keeps Bcc: a draft opened in another mail app must still show who gets a blind copy.
|
|
149
|
+
const { copy: raw } = await build(message);
|
|
150
|
+
const id = message.messageId.replace(/^<|>$/g, "");
|
|
151
|
+
const shown = { id, folder, subject: message.subject, to: addressesOf(message.to), size: raw.length };
|
|
152
|
+
if (dryRun)
|
|
153
|
+
return answer(command, { action, applied: false, uid: null, ...shown, hint: "a preview: nothing was saved" });
|
|
154
|
+
const writes = opened.mailbox.writes;
|
|
155
|
+
// The owner may have been writing the old version by hand, so it goes to Trash, where it can be got back.
|
|
156
|
+
const trash = replacing ? await trashOf(opened.mailbox) : undefined;
|
|
157
|
+
const stored = await guarded(opened, `drafts.${action}`, async () => {
|
|
158
|
+
const saved = await writes.append(folder, raw, DRAFT_FLAGS);
|
|
159
|
+
// The new version is in place before the old one goes, so a failure in between leaves two drafts, never none.
|
|
160
|
+
if (replacing && trash)
|
|
161
|
+
await writes.move(folder, replacing.validity, [replacing.uid], trash);
|
|
162
|
+
return saved;
|
|
163
|
+
});
|
|
164
|
+
answer(command, {
|
|
165
|
+
action,
|
|
166
|
+
applied: true,
|
|
167
|
+
uid: stored.uid ?? null,
|
|
168
|
+
...(replacing && trash ? { replaced_uid: replacing.uid, old_version_in: trash } : {}),
|
|
169
|
+
...shown,
|
|
170
|
+
});
|
|
171
|
+
};
|
|
172
|
+
const updateCommand = () => answerEntity(addressing(annotate(new Command("update"), {
|
|
173
|
+
effects: REMOTE_WRITE,
|
|
174
|
+
examples: [
|
|
175
|
+
`${IDENTITY.command} ya drafts update ${ID} 'New text, the rest kept'`,
|
|
176
|
+
`${IDENTITY.command} ya drafts update ${ID} --to anna@example.com --to boris@example.com`,
|
|
177
|
+
],
|
|
178
|
+
})), "mail_draft_change", draftChange)
|
|
179
|
+
.summary("change a draft: what is given replaces it, the rest stays")
|
|
180
|
+
.description("replace a draft with a new version under the same id: each given field replaces the old one (a --to list " +
|
|
181
|
+
"replaces the whole To), the rest, the thread and the attachments stay; the old version goes to Trash")
|
|
182
|
+
.argument("<draft>", "the draft's id, as drafts list shows it")
|
|
183
|
+
.argument("[text]", "the new text; - reads it from stdin")
|
|
184
|
+
.action(async function (draft, given, options) {
|
|
185
|
+
const id = draftIdOf(draft);
|
|
186
|
+
const body = await textOf(this, given);
|
|
187
|
+
await organising(this, async (opened) => {
|
|
188
|
+
const folder = await draftsFolder(opened);
|
|
189
|
+
const found = await findDraft(opened.backend, folder, id);
|
|
190
|
+
const fields = {
|
|
191
|
+
...(options.to?.length ? { to: peopleOf(options.to, "--to") } : {}),
|
|
192
|
+
...(options.cc?.length ? { cc: peopleOf(options.cc, "--cc") } : {}),
|
|
193
|
+
...(options.bcc?.length ? { bcc: peopleOf(options.bcc, "--bcc") } : {}),
|
|
194
|
+
...(options.subject === undefined ? {} : { subject: options.subject }),
|
|
195
|
+
...(body === undefined ? {} : { text: body }),
|
|
196
|
+
};
|
|
197
|
+
if (Object.keys(fields).length === 0)
|
|
198
|
+
throw new CliError("validation_error", "give what changes: the text, --to, --cc, --bcc or --subject");
|
|
199
|
+
await saveDraft(this, opened, "update", nextVersion(found.read, fields, ownAddress(opened)), options.dryRun === true, { uid: found.uid, validity: found.validity });
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
const deleteCommand = () => answerEntity(annotate(new Command("delete"), {
|
|
203
|
+
effects: REMOTE_WRITE,
|
|
204
|
+
examples: [`${IDENTITY.command} ya drafts delete ${ID} --allow-dangerous`],
|
|
205
|
+
}), "mail_draft_change", draftChange)
|
|
206
|
+
.summary("delete a draft for good")
|
|
207
|
+
.description("delete a draft from the Drafts folder for good, with no restore; the owner adds --allow-dangerous to do it, without it a preview")
|
|
208
|
+
.argument("<draft>", "the draft's id, as drafts list shows it")
|
|
209
|
+
.addOption(ownerOnlyOption("--allow-dangerous", "delete it for good, no restore; without it, only a preview"))
|
|
210
|
+
.option("--dry-run", "only preview, even with --allow-dangerous")
|
|
211
|
+
.action(async function (draft, options) {
|
|
212
|
+
const id = draftIdOf(draft);
|
|
213
|
+
const dangerous = this.optsWithGlobals().allowDangerous === true;
|
|
214
|
+
await organising(this, async (opened) => {
|
|
215
|
+
const folder = await draftsFolder(opened);
|
|
216
|
+
const found = await findDraft(opened.backend, folder, id);
|
|
217
|
+
const shown = {
|
|
218
|
+
action: "delete",
|
|
219
|
+
id: found.read.draft.id,
|
|
220
|
+
folder,
|
|
221
|
+
uid: found.uid,
|
|
222
|
+
subject: found.read.draft.subject,
|
|
223
|
+
to: found.read.draft.to,
|
|
224
|
+
};
|
|
225
|
+
if (options.dryRun === true || !dangerous)
|
|
226
|
+
return answer(this, {
|
|
227
|
+
...shown,
|
|
228
|
+
applied: false,
|
|
229
|
+
hint: "a preview: nothing changed; the owner adds --allow-dangerous to delete it for good",
|
|
230
|
+
});
|
|
231
|
+
await guarded(opened, "drafts.delete", () => opened.mailbox.writes.expunge(folder, found.validity, [found.uid]));
|
|
232
|
+
answer(this, { ...shown, applied: true });
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
export const draftsCommand = () => annotate(new Command("drafts"), { effects: LOCAL_READ })
|
|
236
|
+
.summary("drafts on the server: an agent writes them, the owner sends them")
|
|
237
|
+
.description("drafts in the mailbox's Drafts folder: an agent writes them, the owner checks and sends them")
|
|
238
|
+
.addCommand(listCommand())
|
|
239
|
+
.addCommand(createCommand())
|
|
240
|
+
.addCommand(updateCommand())
|
|
241
|
+
.addCommand(deleteCommand())
|
|
242
|
+
.addCommand(draftSendCommand());
|
|
243
|
+
//# sourceMappingURL=drafts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drafts.js","sourceRoot":"","sources":["../../src/commands/drafts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAA;AA+C3C,eAAO,MAAM,UAAU,QAAO,OAmSxB,CAAA"}
|