@wirecat/mail-cli 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +50 -0
- package/LICENSE +204 -0
- package/README.md +141 -2
- package/dist/bin/mail.d.ts +3 -0
- package/dist/bin/mail.d.ts.map +1 -0
- package/dist/bin/mail.js +36 -0
- package/dist/bin/mail.js.map +1 -0
- package/dist/bundle/all-profiles-TKMBELRZ.js +286 -0
- package/dist/bundle/anthropic-7LMUAEIZ.js +72 -0
- package/dist/bundle/app-server-JGMIJDD4.js +229 -0
- package/dist/bundle/bun-XRO6XJHQ.js +169 -0
- package/dist/bundle/bun-sqlite-Z54LEHVM.js +71 -0
- package/dist/bundle/chunk-2LLNPNMB.js +24 -0
- package/dist/bundle/chunk-3E3WA2L6.js +1932 -0
- package/dist/bundle/chunk-3KEVLSNN.js +138 -0
- package/dist/bundle/chunk-3KOA73LS.js +3416 -0
- package/dist/bundle/chunk-4E7BN3TC.js +122 -0
- package/dist/bundle/chunk-4FEMINO2.js +409 -0
- package/dist/bundle/chunk-5BVIWP3S.js +71 -0
- package/dist/bundle/chunk-5D4AEUVA.js +24783 -0
- package/dist/bundle/chunk-5NYMNSSO.js +264 -0
- package/dist/bundle/chunk-5WGEUDE4.js +27 -0
- package/dist/bundle/chunk-6MAZWSC3.js +132 -0
- package/dist/bundle/chunk-75CWWETH.js +379 -0
- package/dist/bundle/chunk-7SXGLT6T.js +444 -0
- package/dist/bundle/chunk-BTQX2ZSZ.js +288 -0
- package/dist/bundle/chunk-CEW6KIFA.js +1193 -0
- package/dist/bundle/chunk-CH6RXYAX.js +82 -0
- package/dist/bundle/chunk-D72URWJE.js +532 -0
- package/dist/bundle/chunk-DFDN6AUB.js +21 -0
- package/dist/bundle/chunk-EOEDICIE.js +6848 -0
- package/dist/bundle/chunk-F6D6PJ34.js +100 -0
- package/dist/bundle/chunk-FDCGTODC.js +78 -0
- package/dist/bundle/chunk-FZ5FXIG6.js +18 -0
- package/dist/bundle/chunk-GAH7N7HO.js +8181 -0
- package/dist/bundle/chunk-GK4M2SUP.js +195 -0
- package/dist/bundle/chunk-GN62YOT5.js +161 -0
- package/dist/bundle/chunk-GQQJOH7A.js +7050 -0
- package/dist/bundle/chunk-GWDCKUBI.js +781 -0
- package/dist/bundle/chunk-HTQTIKWP.js +928 -0
- package/dist/bundle/chunk-IK5TH3O7.js +217 -0
- package/dist/bundle/chunk-J3QXTBD2.js +2742 -0
- package/dist/bundle/chunk-J6MSJLIW.js +45 -0
- package/dist/bundle/chunk-JBBZCTTF.js +76 -0
- package/dist/bundle/chunk-JVMVLITS.js +260 -0
- package/dist/bundle/chunk-K4FVKPDQ.js +525 -0
- package/dist/bundle/chunk-KHTO2Q6E.js +886 -0
- package/dist/bundle/chunk-KM7Q67Z3.js +63 -0
- package/dist/bundle/chunk-LQ37ALDJ.js +2416 -0
- package/dist/bundle/chunk-MNOIRJEO.js +2315 -0
- package/dist/bundle/chunk-MS53RALV.js +168 -0
- package/dist/bundle/chunk-NK7EB63L.js +36225 -0
- package/dist/bundle/chunk-NPGVOZVK.js +2 -0
- package/dist/bundle/chunk-OTUOZ33L.js +82 -0
- package/dist/bundle/chunk-P7P5MNAU.js +46 -0
- package/dist/bundle/chunk-QLEUNU6G.js +537 -0
- package/dist/bundle/chunk-QQB7WT7R.js +216 -0
- package/dist/bundle/chunk-QX7RCLRS.js +23 -0
- package/dist/bundle/chunk-T6464KYA.js +35130 -0
- package/dist/bundle/chunk-TE5U5OAM.js +73 -0
- package/dist/bundle/chunk-TI6VBZKJ.js +166 -0
- package/dist/bundle/chunk-TQFCPUIM.js +53 -0
- package/dist/bundle/chunk-TVREDYX4.js +3574 -0
- package/dist/bundle/chunk-TWPDVUBR.js +106 -0
- package/dist/bundle/chunk-TWTATDM7.js +461 -0
- package/dist/bundle/chunk-UH4DDRHA.js +2989 -0
- package/dist/bundle/chunk-VEIZZRQ5.js +630 -0
- package/dist/bundle/chunk-WLFLBWNH.js +54 -0
- package/dist/bundle/chunk-WXAXYJJ7.js +486 -0
- package/dist/bundle/chunk-XQUUANA2.js +24600 -0
- package/dist/bundle/chunk-Y5E2WNWB.js +35 -0
- package/dist/bundle/chunk-YO4CUH5E.js +33 -0
- package/dist/bundle/chunk-YPQQ5J4X.js +849 -0
- package/dist/bundle/chunk-Z34ICZA3.js +1028 -0
- package/dist/bundle/chunk-ZANYM66S.js +58 -0
- package/dist/bundle/chunk-ZD3WUGR2.js +142 -0
- package/dist/bundle/chunk-ZVVMGPBJ.js +50 -0
- package/dist/bundle/command-contract-WU434ZUL.js +34 -0
- package/dist/bundle/decode-YB3ZDTES.js +162 -0
- package/dist/bundle/dispatch-EUKKT3PD.js +411 -0
- package/dist/bundle/dist-A6GKSKFC.js +2072 -0
- package/dist/bundle/dist-X36THCOF.js +7577 -0
- package/dist/bundle/echarts-YNGCOYHW.js +42501 -0
- package/dist/bundle/embed-LWNHIRBQ.js +37 -0
- package/dist/bundle/embedder-2LYD3U37.js +110 -0
- package/dist/bundle/failure-OAIC5VAP.js +24 -0
- package/dist/bundle/first-run-N3HJKGU7.js +27 -0
- package/dist/bundle/first-screen-4U2DMV3G.js +32 -0
- package/dist/bundle/instructions-GJHHFV64.js +11 -0
- package/dist/bundle/mail.js +166 -0
- package/dist/bundle/mcp-L7SRVDRN.js +167 -0
- package/dist/bundle/node-GFOH6FKP.js +176 -0
- package/dist/bundle/node-KM3CUABH.js +2340 -0
- package/dist/bundle/node-TLZSIHIJ.js +21 -0
- package/dist/bundle/node-sqlite-NBXQXBIU.js +63 -0
- package/dist/bundle/oauth-56EFO5AQ.js +19 -0
- package/dist/bundle/open-2V7QZQJP.js +21 -0
- package/dist/bundle/openai-V3SVACVL.js +251 -0
- package/dist/bundle/process-XVDX4SPD.js +91 -0
- package/dist/bundle/program-ILID6EAT.js +35542 -0
- package/dist/bundle/prompt-YKWAI222.js +14 -0
- package/dist/bundle/recognize-PAR66KVM.js +25 -0
- package/dist/bundle/remote-CE43TKXC.js +28 -0
- package/dist/bundle/rerank-M7S7P2TW.js +51 -0
- package/dist/bundle/serve-ENPMIV6J.js +197 -0
- package/dist/bundle/server-JRTHUCVY.js +63 -0
- package/dist/bundle/server-MBEZLVKZ.js +189 -0
- package/dist/bundle/sqlite-runtime-HVGDHBJJ.js +18 -0
- package/dist/bundle/state-QZSOSKBD.js +35 -0
- package/dist/bundle/store-2BUX6LVX.js +124 -0
- package/dist/bundle/store-UJ7SNKXI.js +141 -0
- package/dist/bundle/store-maintenance-command-I7V5C44K.js +52 -0
- package/dist/commands/account.d.ts +3 -0
- package/dist/commands/account.d.ts.map +1 -0
- package/dist/commands/account.js +47 -0
- package/dist/commands/account.js.map +1 -0
- package/dist/commands/context.d.ts +41 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +52 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/doctor.d.ts +77 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +74 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/folders.d.ts +3 -0
- package/dist/commands/folders.d.ts.map +1 -0
- package/dist/commands/folders.js +36 -0
- package/dist/commands/folders.js.map +1 -0
- package/dist/commands/login.d.ts +5 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +21 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/mailbox.d.ts +16 -0
- package/dist/commands/mailbox.d.ts.map +1 -0
- package/dist/commands/mailbox.js +54 -0
- package/dist/commands/mailbox.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +97 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/session.d.ts +3 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +211 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +156 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +89 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +3 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +190 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/config.d.ts +190 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +46 -0
- package/dist/config.js.map +1 -0
- package/dist/discovery.d.ts +42 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +179 -0
- package/dist/discovery.js.map +1 -0
- package/dist/identity.d.ts +5 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +16 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/mail/imap-errors.d.ts +4 -0
- package/dist/mail/imap-errors.d.ts.map +1 -0
- package/dist/mail/imap-errors.js +41 -0
- package/dist/mail/imap-errors.js.map +1 -0
- package/dist/mail/imap-messages.d.ts +18 -0
- package/dist/mail/imap-messages.d.ts.map +1 -0
- package/dist/mail/imap-messages.js +66 -0
- package/dist/mail/imap-messages.js.map +1 -0
- package/dist/mail/imap.d.ts +67 -0
- package/dist/mail/imap.d.ts.map +1 -0
- package/dist/mail/imap.js +348 -0
- package/dist/mail/imap.js.map +1 -0
- package/dist/mail/parse.d.ts +18 -0
- package/dist/mail/parse.d.ts.map +1 -0
- package/dist/mail/parse.js +31 -0
- package/dist/mail/parse.js.map +1 -0
- package/dist/mail/port.d.ts +50 -0
- package/dist/mail/port.d.ts.map +1 -0
- package/dist/mail/port.js +4 -0
- package/dist/mail/port.js.map +1 -0
- package/dist/mcp.d.ts +29 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +98 -0
- package/dist/mcp.js.map +1 -0
- package/dist/profile.d.ts +16 -0
- package/dist/profile.d.ts.map +1 -0
- package/dist/profile.js +31 -0
- package/dist/profile.js.map +1 -0
- package/dist/program.d.ts +6 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +52 -0
- package/dist/program.js.map +1 -0
- package/dist/providers.d.ts +53 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +106 -0
- package/dist/providers.js.map +1 -0
- package/dist/secret.d.ts +30 -0
- package/dist/secret.d.ts.map +1 -0
- package/dist/secret.js +68 -0
- package/dist/secret.js.map +1 -0
- package/dist/store.d.ts +12 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +25 -0
- package/dist/store.js.map +1 -0
- package/dist/sync.d.ts +26 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +75 -0
- package/dist/sync.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +83 -4
- package/skills/mail-cli/SKILL.md +27 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { annotate } from "@wirecat/cli-base/commands";
|
|
2
|
+
import { answerEntity, baseContext, LOCAL_READ, listOf, outputFor, REMOTE_READ, renderAnswer, } from "@wirecat/cli-core/cli";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import * as v from "valibot";
|
|
5
|
+
import { configuration } from "../config.js";
|
|
6
|
+
import { IDENTITY } from "../identity.js";
|
|
7
|
+
import { contextOf, openSource, refuseOffline } from "./context.js";
|
|
8
|
+
const mailFolder = v.strictObject({
|
|
9
|
+
path: v.string(),
|
|
10
|
+
name: v.string(),
|
|
11
|
+
role: v.nullable(v.string()),
|
|
12
|
+
messages: v.nullable(v.number()),
|
|
13
|
+
unseen: v.nullable(v.number()),
|
|
14
|
+
});
|
|
15
|
+
const listCommand = () => answerEntity(annotate(new Command("list"), {
|
|
16
|
+
effects: REMOTE_READ,
|
|
17
|
+
examples: [`${IDENTITY.command} ya folders list`, `${IDENTITY.command} ya folders list --json`],
|
|
18
|
+
}), "mail_folder", mailFolder)
|
|
19
|
+
.summary("the folders with their role and message counts")
|
|
20
|
+
.description("the folders of the mailbox with their role (inbox, sent, trash, ...) and message counts")
|
|
21
|
+
.action(async function () {
|
|
22
|
+
const context = contextOf(this);
|
|
23
|
+
refuseOffline(context.flags);
|
|
24
|
+
const { source } = await openSource(context);
|
|
25
|
+
try {
|
|
26
|
+
const folders = await baseContext(this, configuration.resolveSettings).run(() => source.folderList());
|
|
27
|
+
renderAnswer(this, outputFor(this), listOf("folders list", { items: folders, limit: Math.max(1, folders.length), has_more: false }));
|
|
28
|
+
}
|
|
29
|
+
finally {
|
|
30
|
+
await source.close();
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
export const foldersCommand = () => annotate(new Command("folders"), { effects: LOCAL_READ })
|
|
34
|
+
.description("the folders of this profile's mailbox")
|
|
35
|
+
.addCommand(listCommand());
|
|
36
|
+
//# sourceMappingURL=folders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folders.js","sourceRoot":"","sources":["../../src/commands/folders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EACL,YAAY,EACZ,WAAW,EACX,UAAU,EACV,MAAM,EACN,SAAS,EACT,WAAW,EACX,YAAY,GACb,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEnE,MAAM,UAAU,GAAG,CAAC,CAAC,YAAY,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5B,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAChC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC/B,CAAC,CAAA;AAEF,MAAM,WAAW,GAAG,GAAG,EAAE,CACvB,YAAY,CACV,QAAQ,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE;IAC5B,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,OAAO,kBAAkB,EAAE,GAAG,QAAQ,CAAC,OAAO,yBAAyB,CAAC;CAChG,CAAC,EACF,aAAa,EACb,UAAU,CACX;KACE,OAAO,CAAC,gDAAgD,CAAC;KACzD,WAAW,CAAC,yFAAyF,CAAC;KACtG,MAAM,CAAC,KAAK;IACX,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC/B,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAA;IAC5C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;QACrG,YAAY,CACV,IAAI,EACJ,SAAS,CAAC,IAAI,CAAC,EACf,MAAM,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAChG,CAAA;IACH,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;AACH,CAAC,CAAC,CAAA;AAEN,MAAM,CAAC,MAAM,cAAc,GAAG,GAAY,EAAE,CAC1C,QAAQ,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;KACtD,WAAW,CAAC,uCAAuC,CAAC;KACpD,UAAU,CAAC,WAAW,EAAE,CAAC,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ImapEndpoint, ImapMailSource } from "../mail/imap.js";
|
|
2
|
+
import type { Prepare } from "../providers.js";
|
|
3
|
+
/** Logs in once and closes; the password is stored by the caller, only after this succeeds (WC-SECR-5). */
|
|
4
|
+
export declare const checkLogin: (connect: (endpoint: ImapEndpoint, password: string) => ImapMailSource, endpoint: ImapEndpoint, password: string, prepare: Prepare) => Promise<import("../mail/imap.js").AccountCheck>;
|
|
5
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACnE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAY9C,2GAA2G;AAC3G,eAAO,MAAM,UAAU,YACZ,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,KAAK,cAAc,YAC3D,YAAY,YACZ,MAAM,WACP,OAAO,oDAWjB,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { CliError, isCliError } from "@wirecat/cli-base";
|
|
2
|
+
import { IDENTITY } from "../identity.js";
|
|
3
|
+
/** A refused login, with the provider's likely cause and where the steps are; any other error passes through. */
|
|
4
|
+
const explained = (error, prepare) => isCliError(error) && error.details.reason === "mail.login-refused"
|
|
5
|
+
? new CliError(error.code, `${error.message}. Likely cause: ${prepare.refused} Run \`${IDENTITY.command} <profile> session start\` to see the steps again.`, error.details)
|
|
6
|
+
: error;
|
|
7
|
+
/** Logs in once and closes; the password is stored by the caller, only after this succeeds (WC-SECR-5). */
|
|
8
|
+
export const checkLogin = async (connect, endpoint, password, prepare) => {
|
|
9
|
+
let source;
|
|
10
|
+
try {
|
|
11
|
+
source = connect(endpoint, password);
|
|
12
|
+
return await source.check();
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
throw explained(error, prepare);
|
|
16
|
+
}
|
|
17
|
+
finally {
|
|
18
|
+
await source?.close();
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAIzC,iHAAiH;AACjH,MAAM,SAAS,GAAG,CAAC,KAAc,EAAE,OAAgB,EAAW,EAAE,CAC9D,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,oBAAoB;IAChE,CAAC,CAAC,IAAI,QAAQ,CACV,KAAK,CAAC,IAAI,EACV,GAAG,KAAK,CAAC,OAAO,mBAAmB,OAAO,CAAC,OAAO,UAAU,QAAQ,CAAC,OAAO,oDAAoD,EAChI,KAAK,CAAC,OAAO,CACd;IACH,CAAC,CAAC,KAAK,CAAA;AAEX,2GAA2G;AAC3G,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,OAAqE,EACrE,QAAsB,EACtB,QAAgB,EAChB,OAAgB,EAChB,EAAE;IACF,IAAI,MAAkC,CAAA;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QACpC,OAAO,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACjC,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,EAAE,KAAK,EAAE,CAAA;IACvB,CAAC;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type Discovery, type Security } from "../discovery.js";
|
|
2
|
+
import type { MailEnvironment } from "./context.js";
|
|
3
|
+
export interface MailboxFlags {
|
|
4
|
+
provider?: string;
|
|
5
|
+
host?: string;
|
|
6
|
+
port?: string;
|
|
7
|
+
security?: Security;
|
|
8
|
+
login?: string;
|
|
9
|
+
folder?: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare const securityOf: (value: string) => Security;
|
|
12
|
+
export declare const portOf: (value: string) => number;
|
|
13
|
+
/** Asks at a terminal which built-in provider hosts the address; an empty answer gives up. */
|
|
14
|
+
export type Pick = () => Promise<string | undefined>;
|
|
15
|
+
export declare const chosen: (address: string, flags: MailboxFlags, environment: MailEnvironment, pick?: Pick) => Promise<Discovery>;
|
|
16
|
+
//# sourceMappingURL=mailbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mailbox.d.ts","sourceRoot":"","sources":["../../src/commands/mailbox.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAsC,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAEnG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAEnD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,eAAO,MAAM,UAAU,UAAW,MAAM,KAAG,QAI1C,CAAA;AAED,eAAO,MAAM,MAAM,UAAW,MAAM,KAAG,MAKtC,CAAA;AAED,8FAA8F;AAC9F,MAAM,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;AAiBpD,eAAO,MAAM,MAAM,YACR,MAAM,SACR,YAAY,eACN,eAAe,SACrB,IAAI,KACV,OAAO,CAAC,SAAS,CAuBnB,CAAA"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { discover, discoverByName, domainOf } from "../discovery.js";
|
|
3
|
+
import { GENERIC_PREPARE } from "../providers.js";
|
|
4
|
+
export const securityOf = (value) => {
|
|
5
|
+
if (value !== "tls" && value !== "starttls")
|
|
6
|
+
throw new CliError("validation_error", "--security takes tls or starttls; a plain connection is refused");
|
|
7
|
+
return value;
|
|
8
|
+
};
|
|
9
|
+
export const portOf = (value) => {
|
|
10
|
+
const port = Number(value);
|
|
11
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535)
|
|
12
|
+
throw new CliError("validation_error", "--port takes a port number");
|
|
13
|
+
return port;
|
|
14
|
+
};
|
|
15
|
+
const discovered = async (address, flags, environment, pick) => {
|
|
16
|
+
if (flags.provider)
|
|
17
|
+
return discoverByName(address, flags.provider);
|
|
18
|
+
try {
|
|
19
|
+
return await discover(address, environment.discovery ?? { ...(environment.signal ? { signal: environment.signal } : {}) });
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
if (!(error instanceof CliError) || error.code !== "not_found" || !pick)
|
|
23
|
+
throw error;
|
|
24
|
+
const name = await pick();
|
|
25
|
+
if (!name)
|
|
26
|
+
throw error;
|
|
27
|
+
return discoverByName(address, name);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
export const chosen = async (address, flags, environment, pick) => {
|
|
31
|
+
if (!flags.host) {
|
|
32
|
+
const found = await discovered(address, flags, environment, pick);
|
|
33
|
+
return {
|
|
34
|
+
...found,
|
|
35
|
+
...(flags.login ? { login: flags.login } : {}),
|
|
36
|
+
imap: {
|
|
37
|
+
...found.imap,
|
|
38
|
+
...(flags.port ? { port: portOf(flags.port) } : {}),
|
|
39
|
+
...(flags.security ? { security: flags.security } : {}),
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
domainOf(address);
|
|
44
|
+
return {
|
|
45
|
+
address,
|
|
46
|
+
provider: "custom",
|
|
47
|
+
imap: { host: flags.host, port: flags.port ? portOf(flags.port) : 993, security: flags.security ?? "tls" },
|
|
48
|
+
login: flags.login ?? address,
|
|
49
|
+
auth: "app-password",
|
|
50
|
+
found_by: "built-in",
|
|
51
|
+
prepare: GENERIC_PREPARE,
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=mailbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mailbox.js","sourceRoot":"","sources":["../../src/commands/mailbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAkB,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAiB,MAAM,iBAAiB,CAAA;AACnG,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAYjD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAY,EAAE;IACpD,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,UAAU;QACzC,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,iEAAiE,CAAC,CAAA;IAC3G,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAU,EAAE;IAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC1B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK;QACrD,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,4BAA4B,CAAC,CAAA;IACtE,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAKD,MAAM,UAAU,GAAG,KAAK,EAAE,OAAe,EAAE,KAAmB,EAAE,WAA4B,EAAE,IAAW,EAAE,EAAE;IAC3G,IAAI,KAAK,CAAC,QAAQ;QAAE,OAAO,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;IAClE,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CACnB,OAAO,EACP,WAAW,CAAC,SAAS,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAC3F,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,IAAI;YAAE,MAAM,KAAK,CAAA;QACpF,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,CAAA;QACzB,IAAI,CAAC,IAAI;YAAE,MAAM,KAAK,CAAA;QACtB,OAAO,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IACtC,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EACzB,OAAe,EACf,KAAmB,EACnB,WAA4B,EAC5B,IAAW,EACS,EAAE;IACtB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;QACjE,OAAO;YACL,GAAG,KAAK;YACR,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,IAAI,EAAE;gBACJ,GAAG,KAAK,CAAC,IAAI;gBACb,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnD,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxD;SACF,CAAA;IACH,CAAC;IACD,QAAQ,CAAC,OAAO,CAAC,CAAA;IACjB,OAAO;QACL,OAAO;QACP,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK,EAAE;QAC1G,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,OAAO;QAC7B,IAAI,EAAE,cAAc;QACpB,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,eAAe;KACzB,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAwFnC,eAAO,MAAM,UAAU,QAAO,OAuBzB,CAAA"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { annotate, describeProgram } from "@wirecat/cli-base/commands";
|
|
3
|
+
import { changesAuthorityAt, environmentOf, httpTokenFile, itemOf, LOCAL_READ, LOCAL_WRITE, MCP_HTTP_DEFAULT_PORT, mcpServerCommand, outputFor, REMOTE_WRITE, refuseUnderReadOnly, renderAnswer, rootOf, } from "@wirecat/cli-core/cli";
|
|
4
|
+
import { Command } from "commander";
|
|
5
|
+
import { configuration } from "../config.js";
|
|
6
|
+
import { IDENTITY } from "../identity.js";
|
|
7
|
+
const SETUP = `claude mcp add ${IDENTITY.command} -- ${IDENTITY.command} personal mcp serve`;
|
|
8
|
+
const settingsOf = (command) => {
|
|
9
|
+
const flags = command.optsWithGlobals();
|
|
10
|
+
const env = environmentOf(command).env ?? process.env;
|
|
11
|
+
const { profile } = configuration.resolveSettings(flags, { env });
|
|
12
|
+
return { flags, env, profile, tokenFile: httpTokenFile(IDENTITY, profile, env) };
|
|
13
|
+
};
|
|
14
|
+
const serveCommand = () => annotate(new Command("serve"), {
|
|
15
|
+
effects: REMOTE_WRITE,
|
|
16
|
+
lifetime: "persistent",
|
|
17
|
+
mcp: false,
|
|
18
|
+
examples: [
|
|
19
|
+
`${IDENTITY.command} personal mcp serve`,
|
|
20
|
+
`${IDENTITY.command} personal mcp serve --http --public-url https://laptop.example.ts.net`,
|
|
21
|
+
],
|
|
22
|
+
})
|
|
23
|
+
.summary("serve this profile's commands to an AI agent")
|
|
24
|
+
.description(`serve this profile's commands to an agent over MCP, on stdin and stdout, writes included; the profile's permissions decide — \`${SETUP}\``)
|
|
25
|
+
.option("--http", "serve over HTTP on 127.0.0.1 for ChatGPT and Claude in the browser, behind your tunnel; the profile's permissions decide")
|
|
26
|
+
.option("--port <port>", `the local port for --http (default ${MCP_HTTP_DEFAULT_PORT})`)
|
|
27
|
+
.option("--public-url <url>", "the tunnel's https address the browser apps use, e.g. https://<name>.ts.net")
|
|
28
|
+
.action(async function () {
|
|
29
|
+
const { flags, env, profile, tokenFile } = settingsOf(this);
|
|
30
|
+
if (!flags.http && (flags.json || flags.jsonl))
|
|
31
|
+
throw new CliError("validation_error", "MCP over stdio controls its own output; leave out --json and --jsonl");
|
|
32
|
+
const environment = environmentOf(this);
|
|
33
|
+
const run = environment.runCommand;
|
|
34
|
+
if (!run)
|
|
35
|
+
throw new Error("mcp serve runs inside the program's run(), which provides runCommand");
|
|
36
|
+
const program = rootOf(this);
|
|
37
|
+
const options = {
|
|
38
|
+
profile,
|
|
39
|
+
commands: describeProgram(program),
|
|
40
|
+
levels: () => configuration.resolveSettings(flags, { env }).permissions,
|
|
41
|
+
authority: changesAuthorityAt(program),
|
|
42
|
+
run,
|
|
43
|
+
...(environment.signal ? { signal: environment.signal } : {}),
|
|
44
|
+
};
|
|
45
|
+
// Loaded here, not at the top: every other command would otherwise pay for the MCP SDK.
|
|
46
|
+
const { serveMcp, serveMcpOverHttp } = await import("../mcp.js");
|
|
47
|
+
if (!flags.http)
|
|
48
|
+
return serveMcp(options);
|
|
49
|
+
const { portOf, publicUrlOf } = await import("@wirecat/cli-core/mcp");
|
|
50
|
+
const { renderer } = outputFor(this);
|
|
51
|
+
await serveMcpOverHttp(options, {
|
|
52
|
+
publicUrl: publicUrlOf(flags.publicUrl, {
|
|
53
|
+
missing: "--http",
|
|
54
|
+
reaches: `the browser apps reach ${IDENTITY.command}`,
|
|
55
|
+
}),
|
|
56
|
+
port: portOf(flags.port, MCP_HTTP_DEFAULT_PORT),
|
|
57
|
+
tokenFile,
|
|
58
|
+
background: env[`${IDENTITY.envPrefix}_MCP_HTTP`] !== undefined,
|
|
59
|
+
note: (line) => renderer.note(line),
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
const revokeCommand = () => annotate(new Command("revoke"), {
|
|
63
|
+
effects: LOCAL_WRITE,
|
|
64
|
+
mcp: false,
|
|
65
|
+
examples: [`${IDENTITY.command} personal mcp revoke`],
|
|
66
|
+
})
|
|
67
|
+
.summary("forget every login given to a browser app")
|
|
68
|
+
.description("forget every login `mcp serve --http` gave a browser app; each must log in again")
|
|
69
|
+
.action(async function () {
|
|
70
|
+
refuseUnderReadOnly(this, "mcp revoke");
|
|
71
|
+
const { profile, tokenFile } = settingsOf(this);
|
|
72
|
+
const { revokeAll } = await import("@wirecat/cli-core/mcp");
|
|
73
|
+
revokeAll(tokenFile);
|
|
74
|
+
renderAnswer(this, outputFor(this), itemOf({ revoked: true, profile }));
|
|
75
|
+
});
|
|
76
|
+
export const mcpCommand = () => annotate(new Command("mcp"), { effects: LOCAL_READ, mcp: false })
|
|
77
|
+
.summary("serve this profile's commands to an AI agent")
|
|
78
|
+
.description(`serve this profile's commands to an agent over MCP — \`${SETUP}\``)
|
|
79
|
+
.addCommand(serveCommand())
|
|
80
|
+
.addCommand(revokeCommand())
|
|
81
|
+
.addCommand(mcpServerCommand({
|
|
82
|
+
example: `${IDENTITY.command} personal`,
|
|
83
|
+
target: (self) => {
|
|
84
|
+
const { env, profile, tokenFile } = settingsOf(self);
|
|
85
|
+
return {
|
|
86
|
+
invocation: `${IDENTITY.command} ${profile}`,
|
|
87
|
+
profile,
|
|
88
|
+
envPrefix: IDENTITY.envPrefix,
|
|
89
|
+
env,
|
|
90
|
+
tokenFile,
|
|
91
|
+
argv: [profile, "mcp", "serve", "--http"],
|
|
92
|
+
version: IDENTITY.version,
|
|
93
|
+
};
|
|
94
|
+
},
|
|
95
|
+
answer: (self, item, lines) => renderAnswer(self, outputFor(self), itemOf(item), () => lines.join("\n")),
|
|
96
|
+
}));
|
|
97
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAyQnC,eAAO,MAAM,cAAc,QAAO,OAMJ,CAAA"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { annotate } from "@wirecat/cli-base/commands";
|
|
3
|
+
import { answerEntity, baseContext, commandWords, environmentOf, FETCH, itemOf, LOCAL_READ, LOCAL_WRITE, listOf, logsInOrOut, outputFor, profileFree, profilesHere, REMOTE_READ, refuseCommandName, refuseUnderReadOnly, renderAnswer, rootOf, secretInputOf, } from "@wirecat/cli-core/cli";
|
|
4
|
+
import { Command } from "commander";
|
|
5
|
+
import * as v from "valibot";
|
|
6
|
+
import { configuration } from "../config.js";
|
|
7
|
+
import { PROVIDER_NAMES, prepareFor } from "../discovery.js";
|
|
8
|
+
import { IDENTITY } from "../identity.js";
|
|
9
|
+
import { imapSource } from "../mail/imap.js";
|
|
10
|
+
import { profileOf, writeProfile } from "../profile.js";
|
|
11
|
+
import { PROVIDERS_URL, prepareText } from "../providers.js";
|
|
12
|
+
import { passwordStore } from "../secret.js";
|
|
13
|
+
import { collect, contextOf, endpointOf, passwordsOf, refuseOffline } from "./context.js";
|
|
14
|
+
import { checkLogin } from "./login.js";
|
|
15
|
+
import { chosen, securityOf } from "./mailbox.js";
|
|
16
|
+
const answer = (command, item) => renderAnswer(command, outputFor(command), itemOf(item));
|
|
17
|
+
const SERVER_FLAGS = ["address", "provider", "host", "port", "security", "login", "folder"];
|
|
18
|
+
/** Whether this run may prompt: a terminal, no `--json`, no `--no-input`, not CI. */
|
|
19
|
+
const mayAsk = (command, environment, env) => (environment.tty ?? process.stdout.isTTY) === true &&
|
|
20
|
+
command.optsWithGlobals().input !== false &&
|
|
21
|
+
outputFor(command).format === "pretty" &&
|
|
22
|
+
!env.CI;
|
|
23
|
+
const startCommand = () => logsInOrOut(annotate(new Command("start"), {
|
|
24
|
+
effects: FETCH,
|
|
25
|
+
lifetime: "interactive",
|
|
26
|
+
mcp: false,
|
|
27
|
+
examples: [
|
|
28
|
+
`${IDENTITY.command} ya session start --address me@example.com`,
|
|
29
|
+
`${IDENTITY.command} ya session start`,
|
|
30
|
+
`${IDENTITY.command} me session start --address me@example.com --host imap.example.com --security tls`,
|
|
31
|
+
],
|
|
32
|
+
}))
|
|
33
|
+
.summary("sign in; a new profile is created first")
|
|
34
|
+
.description(`sign this profile in. A new profile needs its mailbox: --address, or it is asked at a terminal; the server is found (built-in providers, the MX record, ISPDB, the domain's autoconfig; all providers: ${PROVIDERS_URL}); for a domain the built-in table does not know, the domain, never the address, goes to the DNS resolver, autoconfig.thunderbird.net and autoconfig.<domain>, and --provider or --host skips those lookups; the steps to prepare the mailbox are shown, the app password is asked (hidden) or read from ${IDENTITY.envPrefix}_PASSWORD, checked against the server, and only then the profile and the keyring entry are saved. An existing profile only asks for the password again. Without a terminal nothing is asked: a missing --address or password is a validation error`)
|
|
35
|
+
.option("--address <email>", "the full mail address of a new profile, also the login for most providers")
|
|
36
|
+
.option("--provider <provider>", `skip discovery and use a built-in provider: ${PROVIDER_NAMES.join(", ")}`)
|
|
37
|
+
.option("--host <host>", "skip discovery and use this IMAP host")
|
|
38
|
+
.option("--port <port>", "IMAP port (default 993)")
|
|
39
|
+
.option("--security <mode>", "tls or starttls (default tls)", securityOf)
|
|
40
|
+
.option("--login <login>", "the login name, when it is not the full address")
|
|
41
|
+
.option("--folder <folder>", "sync only this folder; repeat it for more", collect)
|
|
42
|
+
.option("--credential-storage <storage>", "where the password is kept: keyring (the default, which falls back to a private file by itself when no " +
|
|
43
|
+
"keyring works), or file, not recommended", "keyring")
|
|
44
|
+
.action(async function (flags) {
|
|
45
|
+
const context = contextOf(this);
|
|
46
|
+
const { environment, env } = context;
|
|
47
|
+
refuseCommandName(context.profile, commandWords(rootOf(this)), IDENTITY.command);
|
|
48
|
+
const storage = flags.credentialStorage;
|
|
49
|
+
if (storage !== "keyring" && storage !== "file")
|
|
50
|
+
throw new CliError("validation_error", "--credential-storage takes keyring or file", {
|
|
51
|
+
param: "credential-storage",
|
|
52
|
+
});
|
|
53
|
+
refuseOffline(context.flags);
|
|
54
|
+
refuseUnderReadOnly(this, "session start");
|
|
55
|
+
const output = outputFor(this);
|
|
56
|
+
const asking = mayAsk(this, environment, env);
|
|
57
|
+
const ask = async (prompt, options = {}) => {
|
|
58
|
+
const { readSecret } = await import("@wirecat/cli-core");
|
|
59
|
+
return readSecret(prompt, { ...secretInputOf(this), ...options });
|
|
60
|
+
};
|
|
61
|
+
const known = context.settings.mailbox.address !== undefined;
|
|
62
|
+
let endpoint;
|
|
63
|
+
let address;
|
|
64
|
+
let provider;
|
|
65
|
+
let prepare;
|
|
66
|
+
let created;
|
|
67
|
+
if (known) {
|
|
68
|
+
const same = flags.address?.trim().toLowerCase() === context.settings.mailbox.address?.toLowerCase();
|
|
69
|
+
const given = SERVER_FLAGS.filter((flag) => flags[flag] !== undefined && !(flag === "address" && same));
|
|
70
|
+
if (given.length)
|
|
71
|
+
throw new CliError("validation_error", `profile ${context.profile} already exists, so --${given[0]} cannot change it; edit it with \`${IDENTITY.command} ${context.profile} config set\` or use a new profile name`, { param: given[0] });
|
|
72
|
+
endpoint = endpointOf(context.settings);
|
|
73
|
+
address = context.settings.mailbox.address ?? endpoint.login;
|
|
74
|
+
({ provider, prepare } = prepareFor(address, endpoint.host));
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const typedAddress = flags.address ?? (asking ? (await ask("Mail address: ", { echo: true })).trim() : "");
|
|
78
|
+
if (!typedAddress)
|
|
79
|
+
throw new CliError("validation_error", `profile ${context.profile} does not exist yet; name its mailbox with --address <email>`, { param: "address" });
|
|
80
|
+
address = typedAddress.toLowerCase();
|
|
81
|
+
const pick = asking
|
|
82
|
+
? async () => {
|
|
83
|
+
output.renderer.note(`No server found for ${address}. Built-in providers: ${PROVIDER_NAMES.join(", ")}`);
|
|
84
|
+
return ((await ask("Which one hosts this mailbox? (empty to give up) ", { echo: true })).trim() || undefined);
|
|
85
|
+
}
|
|
86
|
+
: undefined;
|
|
87
|
+
const found = await chosen(address, flags, environment, pick);
|
|
88
|
+
if (found.auth === "oauth")
|
|
89
|
+
throw new CliError("validation_error", `${found.provider} accepts only OAuth for IMAP, which this version cannot do yet`, { param: "address" });
|
|
90
|
+
endpoint = { ...found.imap, login: found.login };
|
|
91
|
+
provider = found.provider;
|
|
92
|
+
prepare = found.prepare;
|
|
93
|
+
created = () => writeProfile(env, context.profile, profileOf(found, flags.folder), false).path;
|
|
94
|
+
}
|
|
95
|
+
output.renderer.note(prepareText(provider, prepare));
|
|
96
|
+
const passwordVariable = `${IDENTITY.envPrefix}_PASSWORD`;
|
|
97
|
+
const typed = env[passwordVariable]?.trim() ||
|
|
98
|
+
(asking ? await ask(`App password for ${endpoint.login} (hidden): `) : undefined);
|
|
99
|
+
if (!typed)
|
|
100
|
+
throw new CliError("validation_error", asking
|
|
101
|
+
? "no password was given; nothing was stored"
|
|
102
|
+
: `there is no terminal to ask for the app password; set ${passwordVariable}`, { param: passwordVariable });
|
|
103
|
+
const connect = environment.connect ?? imapSource;
|
|
104
|
+
const result = await baseContext(this, configuration.resolveSettings).run(() => checkLogin(connect, endpoint, typed, prepare));
|
|
105
|
+
// Stored only after the server accepted it (WC-SECR-5), the profile with it.
|
|
106
|
+
const config = created?.();
|
|
107
|
+
const stored = passwordsOf(context).write(typed, storage);
|
|
108
|
+
answer(this, {
|
|
109
|
+
profile: context.profile,
|
|
110
|
+
signed_in: true,
|
|
111
|
+
login: endpoint.login,
|
|
112
|
+
credential_storage: stored,
|
|
113
|
+
folders: result.folders,
|
|
114
|
+
...(config ? { created: true, config } : {}),
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
const passwordFrom = v.nullable(v.picklist(["environment", "keyring", "himalaya"]));
|
|
118
|
+
const mailSessionStatus = v.strictObject({
|
|
119
|
+
profile: v.string(),
|
|
120
|
+
state: v.picklist(["saved", "missing"]),
|
|
121
|
+
password_from: passwordFrom,
|
|
122
|
+
address: v.nullable(v.string()),
|
|
123
|
+
verified: v.boolean(),
|
|
124
|
+
});
|
|
125
|
+
const statusCommand = () => answerEntity(annotate(new Command("status"), {
|
|
126
|
+
effects: REMOTE_READ,
|
|
127
|
+
examples: [`${IDENTITY.command} ya session status`, `${IDENTITY.command} ya session status --check --json`],
|
|
128
|
+
}), "mail_session_status", mailSessionStatus)
|
|
129
|
+
.description("show where this profile's app password comes from; the password is never printed")
|
|
130
|
+
.option("--check", "log in to the server to prove the password still works")
|
|
131
|
+
.action(async function (args) {
|
|
132
|
+
const context = contextOf(this);
|
|
133
|
+
const stored = await passwordsOf(context).read();
|
|
134
|
+
const status = {
|
|
135
|
+
profile: context.profile,
|
|
136
|
+
state: stored ? "saved" : "missing",
|
|
137
|
+
password_from: stored?.source ?? null,
|
|
138
|
+
address: context.settings.mailbox.address ?? null,
|
|
139
|
+
verified: false,
|
|
140
|
+
};
|
|
141
|
+
if (!args.check || !stored)
|
|
142
|
+
return answer(this, status);
|
|
143
|
+
refuseOffline(context.flags);
|
|
144
|
+
const connect = context.environment.connect ?? imapSource;
|
|
145
|
+
const source = connect(endpointOf(context.settings), stored.secret);
|
|
146
|
+
context.environment.trackCloseable?.(source);
|
|
147
|
+
try {
|
|
148
|
+
await baseContext(this, configuration.resolveSettings).run(() => source.check());
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
await source.close();
|
|
152
|
+
}
|
|
153
|
+
answer(this, { ...status, verified: true });
|
|
154
|
+
});
|
|
155
|
+
const endCommand = () => logsInOrOut(annotate(new Command("end"), {
|
|
156
|
+
effects: LOCAL_WRITE,
|
|
157
|
+
mcp: false,
|
|
158
|
+
examples: [`${IDENTITY.command} ya session end`],
|
|
159
|
+
}))
|
|
160
|
+
.description("forget this profile's app password on this computer; synced mail stays")
|
|
161
|
+
.action(async function () {
|
|
162
|
+
const context = contextOf(this);
|
|
163
|
+
refuseUnderReadOnly(this, "session end");
|
|
164
|
+
const passwords = passwordsOf(context);
|
|
165
|
+
if (passwords.usesOwnersSignIn()) {
|
|
166
|
+
answer(this, { profile: context.profile, ended: false, mail: "retained", kept: "owners-sign-in" });
|
|
167
|
+
outputFor(this).renderer.note(`kept the app password of ${context.profile}: this run's folders are moved, and it uses the owner's password, ` +
|
|
168
|
+
"which only a run with the owner's own folders can remove");
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
answer(this, { profile: context.profile, ended: passwords.remove(), mail: "retained" });
|
|
172
|
+
});
|
|
173
|
+
const mailProfile = v.strictObject({
|
|
174
|
+
profile: v.string(),
|
|
175
|
+
address: v.nullable(v.string()),
|
|
176
|
+
password_from: passwordFrom,
|
|
177
|
+
});
|
|
178
|
+
const listCommand = () => profileFree(answerEntity(annotate(new Command("list"), {
|
|
179
|
+
effects: LOCAL_READ,
|
|
180
|
+
examples: [`${IDENTITY.command} session list`, `${IDENTITY.command} session list --json`],
|
|
181
|
+
}), "mail_profile", mailProfile))
|
|
182
|
+
.summary("list the profiles here and whether each has an app password")
|
|
183
|
+
.description("list the profiles on this computer, each with its address and where its app password comes from; picks none and asks no server")
|
|
184
|
+
.action(async function () {
|
|
185
|
+
const environment = environmentOf(this);
|
|
186
|
+
const env = environment.env ?? process.env;
|
|
187
|
+
const { configuredProfiles } = configuration.resolveSettings({}, { env, needsProfile: false });
|
|
188
|
+
const items = [];
|
|
189
|
+
for (const profile of profilesHere(IDENTITY, configuredProfiles, env)) {
|
|
190
|
+
const settings = configuration.resolveSettings({ profile }, { env });
|
|
191
|
+
const stored = await passwordStore({
|
|
192
|
+
env,
|
|
193
|
+
profile,
|
|
194
|
+
keyring: environment.keyring,
|
|
195
|
+
himalaya: environment.himalaya,
|
|
196
|
+
}).read();
|
|
197
|
+
items.push({
|
|
198
|
+
profile,
|
|
199
|
+
address: settings.mailbox.address ?? null,
|
|
200
|
+
password_from: stored?.source ?? null,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
renderAnswer(this, outputFor(this), listOf("session list", { items, limit: Math.max(1, items.length), has_more: false }));
|
|
204
|
+
});
|
|
205
|
+
export const sessionCommand = () => annotate(new Command("session"), { effects: LOCAL_READ })
|
|
206
|
+
.description("keep this profile's app password in the OS keyring")
|
|
207
|
+
.addCommand(startCommand())
|
|
208
|
+
.addCommand(statusCommand())
|
|
209
|
+
.addCommand(endCommand())
|
|
210
|
+
.addCommand(listCommand());
|
|
211
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAkFnC,eAAO,MAAM,YAAY,QAAO,OA0H1B,CAAA"}
|