@wirecat/cli-memo 0.131.24 → 0.131.26
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/README.md +9 -12
- package/dist/actions/actions.d.ts +1 -1
- package/dist/actions/actions.d.ts.map +1 -1
- package/dist/actions/actions.js +27 -8
- package/dist/actions/actions.js.map +1 -1
- package/dist/actions/command.d.ts +1 -1
- package/dist/actions/command.d.ts.map +1 -1
- package/dist/actions/command.js +1 -12
- package/dist/actions/command.js.map +1 -1
- package/dist/app.d.ts +1 -1
- package/dist/bin/memo.js +2 -2
- package/dist/bundle/{all-profiles-ZCJTYGOL.js → all-profiles-VULFSNYE.js} +9 -9
- package/dist/bundle/{anthropic-7WVLAKTX.js → anthropic-VXQ6ST2U.js} +6 -6
- package/dist/bundle/{app-server-6G3SXEHO.js → app-server-HQPELIPY.js} +42 -42
- package/dist/bundle/auto-3R4RFJGK.js +86 -0
- package/dist/bundle/{bun-JVBDJKBB.js → bun-2NMWL5YB.js} +2 -2
- package/dist/bundle/{bun-sqlite-P4I7NVMQ.js → bun-sqlite-CT544OXO.js} +5 -5
- package/dist/bundle/{chunk-EGG3PGCM.js → chunk-254TXVLA.js} +2 -2
- package/dist/bundle/{chunk-FXHN2UZW.js → chunk-2ND2XYME.js} +33 -17
- package/dist/bundle/{chunk-5YCNCXL5.js → chunk-3CVDHJER.js} +1 -1
- package/dist/bundle/{chunk-ALGIPJ6L.js → chunk-3ZJE5TIG.js} +2 -2
- package/dist/bundle/{chunk-3KNXQZMO.js → chunk-4ENVJFRM.js} +29 -29
- package/dist/bundle/{chunk-NAH473ZR.js → chunk-5FPQGUJA.js} +1 -1
- package/dist/bundle/{chunk-ZOYGY2PN.js → chunk-6PRRZC7Z.js} +3 -3
- package/dist/bundle/{chunk-CM2H7NRC.js → chunk-6TJCRDNZ.js} +4 -4
- package/dist/bundle/{chunk-AWGV4VOA.js → chunk-7ISENDNK.js} +12 -12
- package/dist/bundle/{chunk-UY2VH3QK.js → chunk-7LMTWOTP.js} +2 -2
- package/dist/bundle/{chunk-2IRCJT4O.js → chunk-A4NZ2XOG.js} +8 -8
- package/dist/bundle/{chunk-R3LNQ3I4.js → chunk-A6PITALJ.js} +4 -2
- package/dist/bundle/{chunk-EACY2ULS.js → chunk-AGMYCYSG.js} +306 -187
- package/dist/bundle/{chunk-EB7LKK4K.js → chunk-ARDUJR5Z.js} +1 -1
- package/dist/bundle/{chunk-UA2C4BCH.js → chunk-BELLQAWL.js} +9 -9
- package/dist/bundle/{chunk-LWIMGWKB.js → chunk-BO4FN4UB.js} +3 -3
- package/dist/bundle/{chunk-3MER7NE6.js → chunk-CRC3AW6N.js} +4 -4
- package/dist/bundle/{chunk-UVR6U55E.js → chunk-CUWI6JIX.js} +6 -6
- package/dist/bundle/{chunk-VLPMB3UU.js → chunk-CW3NJ764.js} +4 -4
- package/dist/bundle/{chunk-ND3GBFEY.js → chunk-DKKWZMR7.js} +2 -2
- package/dist/bundle/{chunk-BTQSFPIM.js → chunk-DUHXWFCB.js} +5 -5
- package/dist/bundle/{chunk-CCHHEMPM.js → chunk-EB2IULWB.js} +3 -2
- package/dist/bundle/{chunk-R2LJDDZP.js → chunk-FHY664YS.js} +4 -4
- package/dist/bundle/{chunk-JY4LVWGZ.js → chunk-G2BB5WY5.js} +15 -8
- package/dist/bundle/chunk-GJBK3M6X.js +452 -0
- package/dist/bundle/{chunk-ZDOVR4PA.js → chunk-GOEHJK2R.js} +7 -7
- package/dist/bundle/{chunk-GQOXFZBX.js → chunk-GPYGMETC.js} +286 -282
- package/dist/bundle/{chunk-DIMX5AEE.js → chunk-H6O6IQND.js} +5 -5
- package/dist/bundle/{chunk-ELKYINWL.js → chunk-HN3EDDVX.js} +13 -13
- package/dist/bundle/{chunk-GSEDSGJF.js → chunk-HVVBSM2C.js} +753 -648
- package/dist/bundle/{chunk-JCCL7RGH.js → chunk-I7PL5WX2.js} +4 -4
- package/dist/bundle/{chunk-LNXFM4FD.js → chunk-IJ34FAES.js} +45 -26
- package/dist/bundle/{chunk-MPVW7BQZ.js → chunk-IUM5XZWV.js} +6 -6
- package/dist/bundle/{chunk-GRXVN2X7.js → chunk-J57DDKF4.js} +1 -1
- package/dist/bundle/{chunk-INTF3YPV.js → chunk-KFDPW2AR.js} +2 -2
- package/dist/bundle/{chunk-AIGMYGEL.js → chunk-KMZRXGTF.js} +1 -1
- package/dist/bundle/{chunk-MROFZXAB.js → chunk-KTDNFSXC.js} +22 -22
- package/dist/bundle/{chunk-ILHTNOIV.js → chunk-KV4267S4.js} +1 -1
- package/dist/bundle/{chunk-VVEFQEWP.js → chunk-LJZFMXDC.js} +22 -22
- package/dist/bundle/{chunk-OQK2IKPB.js → chunk-LMN7SYX4.js} +1 -1
- package/dist/bundle/{chunk-RTESJ5O2.js → chunk-M4QN77GH.js} +4 -4
- package/dist/bundle/{chunk-M43DAAZ7.js → chunk-M6O4DH5F.js} +1 -1
- package/dist/bundle/{chunk-UXCDBNAY.js → chunk-MQAHMAJB.js} +2 -2
- package/dist/bundle/{chunk-XF3LZ32F.js → chunk-NAM2Y63Z.js} +3 -3
- package/dist/bundle/{chunk-UPXUE27A.js → chunk-NH2JSH24.js} +6 -6
- package/dist/bundle/{chunk-3U7OUQV2.js → chunk-OYB3FUYQ.js} +1 -1
- package/dist/bundle/{chunk-J6D34BFP.js → chunk-PWA3RNXN.js} +260 -263
- package/dist/bundle/{chunk-KQSHIQSV.js → chunk-QFW4MJIH.js} +239 -242
- package/dist/bundle/{chunk-CPJEQK4V.js → chunk-QKQ7A4L7.js} +46 -46
- package/dist/bundle/{chunk-N5H6I7WQ.js → chunk-S3RBWUUA.js} +6 -6
- package/dist/bundle/{chunk-Q6MFBH6Q.js → chunk-SY7M2DLJ.js} +9 -9
- package/dist/bundle/{chunk-EKTZEF3Q.js → chunk-TKVRZZE3.js} +3 -27
- package/dist/bundle/{chunk-SKTGBVYC.js → chunk-TPFWNOPG.js} +4 -4
- package/dist/bundle/{chunk-F2ED6KG6.js → chunk-TXANQZEG.js} +3 -3
- package/dist/bundle/{chunk-T4LW6UYQ.js → chunk-TZ7WDQPD.js} +40 -34
- package/dist/bundle/{chunk-AIVUS6WA.js → chunk-UZXCBBDC.js} +15 -12
- package/dist/bundle/{chunk-XSI5NYGB.js → chunk-VL3YCTZD.js} +8 -8
- package/dist/bundle/{chunk-ZLZE5P6M.js → chunk-WRZ7JDA2.js} +8 -8
- package/dist/bundle/{chunk-EW3XTUPB.js → chunk-XBIPSSKI.js} +4 -4
- package/dist/bundle/{chunk-JDDVGGUV.js → chunk-XKGXVVYV.js} +10 -10
- package/dist/bundle/{chunk-ITQBXFMC.js → chunk-YFBKS5BW.js} +3 -3
- package/dist/bundle/{chunk-PQLBPYJR.js → chunk-YPF6OS37.js} +1 -1
- package/dist/bundle/{chunk-IC2TL7RW.js → chunk-Z3YGDBBS.js} +2 -2
- package/dist/bundle/{chunk-IJC6MFLP.js → chunk-ZR3BPBS6.js} +10 -10
- package/dist/bundle/command-contract-RQMIQKBS.js +32 -0
- package/dist/bundle/{decode-YHX3DQG2.js → decode-7VB3CHK2.js} +5 -5
- package/dist/bundle/{dispatch-MELZFYOS.js → dispatch-CU5KGRQL.js} +8 -8
- package/dist/bundle/{echarts-FBVAP7BR.js → echarts-45D6USAX.js} +2 -2
- package/dist/bundle/{embed-CQJ42S5C.js → embed-KU2RGB24.js} +6 -6
- package/dist/bundle/{embedder-EDXLEJ27.js → embedder-E7YZDZ5Y.js} +9 -9
- package/dist/bundle/{entry-HZEA7QFK.js → entry-N42HJMIN.js} +7 -7
- package/dist/bundle/failure-R355OCVE.js +66 -0
- package/dist/bundle/{failure-RBNZBCZJ.js → failure-TUXXI6JT.js} +2 -2
- package/dist/bundle/{first-run-JZQN7R6M.js → first-run-Y5YNAAO3.js} +11 -11
- package/dist/bundle/first-screen-SNPGBQFZ.js +30 -0
- package/dist/bundle/{instructions-NYVYNWVU.js → instructions-6EFSPC7C.js} +1 -1
- package/dist/bundle/mcp-6Z7UKX7E.js +90 -0
- package/dist/bundle/{mcp-MNI62HHE.js → mcp-PPVOM4SE.js} +2 -2
- package/dist/bundle/memo.js +16 -16
- package/dist/bundle/{node-2QE6UPGS.js → node-OXC26QXO.js} +2 -2
- package/dist/bundle/{node-sqlite-SDHZJNY7.js → node-sqlite-FNTICDEN.js} +6 -6
- package/dist/bundle/{oauth-FFUJREKS.js → oauth-4JFOFCBB.js} +7 -7
- package/dist/bundle/{open-NT2GYX6N.js → open-WXFCCY7S.js} +5 -5
- package/dist/bundle/{openai-IQA2XR6Z.js → openai-TPQKQNM7.js} +10 -10
- package/dist/bundle/{process-HIEJXYW6.js → process-YWPAOI6G.js} +1 -1
- package/dist/bundle/{chunk-DMQ3342A.js → program-WFUPN7XO.js} +9769 -2059
- package/dist/bundle/{prompt-IOZAME2R.js → prompt-HJUH4EP4.js} +5 -5
- package/dist/bundle/{recognize-2XOAZJ5N.js → recognize-DAIRHALM.js} +4 -4
- package/dist/bundle/{remote-2LE7OTDA.js → remote-MJLWTLAX.js} +7 -7
- package/dist/bundle/{rerank-UKOVVZM6.js → rerank-VAK5HSJE.js} +7 -7
- package/dist/bundle/{serve-S2UHPEBP.js → serve-M2A66WOW.js} +9 -9
- package/dist/bundle/server-33FB7QXW.js +48 -0
- package/dist/bundle/server-AIPDQO57.js +61 -0
- package/dist/bundle/{server-BG4WWQHY.js → server-NN2CBVSX.js} +57 -57
- package/dist/bundle/{state-F5KT3CBD.js → state-6TBUXJOX.js} +6 -6
- package/dist/bundle/{store-WBUUS7FO.js → store-TJCL3QBY.js} +13 -13
- package/dist/bundle/store-maintenance-command-NKJV5A3G.js +48 -0
- package/dist/bundle/update-OXR3SNM2.js +69 -0
- package/dist/config.d.ts +15 -29
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +23 -36
- package/dist/config.js.map +1 -1
- package/dist/context/command.d.ts.map +1 -1
- package/dist/context/command.js +6 -2
- package/dist/context/command.js.map +1 -1
- package/dist/context/context.d.ts +2 -0
- package/dist/context/context.d.ts.map +1 -1
- package/dist/context/context.js +15 -0
- package/dist/context/context.js.map +1 -1
- package/dist/doctor/command.d.ts +0 -12
- package/dist/doctor/command.d.ts.map +1 -1
- package/dist/doctor/command.js +19 -24
- package/dist/doctor/command.js.map +1 -1
- package/dist/examples.d.ts.map +1 -1
- package/dist/examples.js +3 -9
- package/dist/examples.js.map +1 -1
- package/dist/failure.d.ts +2 -2
- package/dist/mail/command.d.ts.map +1 -1
- package/dist/mail/command.js +2 -87
- package/dist/mail/command.js.map +1 -1
- package/dist/mail/findings-command.d.ts.map +1 -1
- package/dist/mail/findings-command.js +1 -1
- package/dist/mail/findings-command.js.map +1 -1
- package/dist/mail/messages-command.d.ts.map +1 -1
- package/dist/mail/messages-command.js +9 -2
- package/dist/mail/messages-command.js.map +1 -1
- package/dist/mail/moved.d.ts +1 -1
- package/dist/mail/moved.d.ts.map +1 -1
- package/dist/mail/moved.js +3 -0
- package/dist/mail/moved.js.map +1 -1
- package/dist/mail/review-command.d.ts +1 -1
- package/dist/mail/review-command.d.ts.map +1 -1
- package/dist/mail/review-command.js +5 -8
- package/dist/mail/review-command.js.map +1 -1
- package/dist/program.js +1 -1
- package/dist/program.js.map +1 -1
- package/dist/read-only.d.ts +1 -1
- package/dist/reasons.d.ts.map +1 -1
- package/dist/reasons.js +1 -25
- package/dist/reasons.js.map +1 -1
- package/dist/review/command.d.ts +0 -1
- package/dist/review/command.d.ts.map +1 -1
- package/dist/review/command.js +2 -10
- package/dist/review/command.js.map +1 -1
- package/dist/review/kinds.d.ts +4 -21
- package/dist/review/kinds.d.ts.map +1 -1
- package/dist/review/kinds.js +13 -174
- package/dist/review/kinds.js.map +1 -1
- package/dist/review/review.js +2 -2
- package/dist/review/review.js.map +1 -1
- package/dist/review/status.js +2 -2
- package/dist/review/status.js.map +1 -1
- package/dist/run/auto.js +3 -3
- package/dist/run/auto.js.map +1 -1
- package/dist/run/import.d.ts +2 -2
- package/dist/run/import.d.ts.map +1 -1
- package/dist/run/import.js +24 -121
- package/dist/run/import.js.map +1 -1
- package/dist/schedule/command.d.ts +2 -2
- package/dist/schedule/command.d.ts.map +1 -1
- package/dist/schedule/command.js +9 -4
- package/dist/schedule/command.js.map +1 -1
- package/dist/search/command.js +1 -1
- package/dist/store/source-list.d.ts +1 -6
- package/dist/store/source-list.d.ts.map +1 -1
- package/dist/store/source-list.js +11 -46
- package/dist/store/source-list.js.map +1 -1
- package/dist/tasks/command.js +1 -1
- package/dist/tasks/command.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
- package/scenarios/set-up.md +3 -3
- package/skills/cli-memo/SKILL.md +13 -21
- package/skills/mail-triage/SKILL.md +28 -16
- package/dist/bundle/auto-JWPM5654.js +0 -86
- package/dist/bundle/chunk-MLMSQK76.js +0 -103
- package/dist/bundle/command-contract-543RRFNU.js +0 -32
- package/dist/bundle/failure-62G7QSPX.js +0 -66
- package/dist/bundle/first-screen-56V3UOQE.js +0 -30
- package/dist/bundle/mcp-Y6IPYDS2.js +0 -90
- package/dist/bundle/program-DEMRKCZY.js +0 -10972
- package/dist/bundle/server-3YNOEPWU.js +0 -61
- package/dist/bundle/server-EZWQ5KP4.js +0 -48
- package/dist/bundle/setup-2X7ADKFH.js +0 -973
- package/dist/bundle/store-maintenance-command-KLST56XF.js +0 -48
- package/dist/bundle/update-WH4CGJGP.js +0 -69
- package/dist/mail/accounts.d.ts +0 -7
- package/dist/mail/accounts.d.ts.map +0 -1
- package/dist/mail/accounts.js +0 -28
- package/dist/mail/accounts.js.map +0 -1
- package/dist/mail/backfill-headers.d.ts +0 -11
- package/dist/mail/backfill-headers.d.ts.map +0 -1
- package/dist/mail/backfill-headers.js +0 -84
- package/dist/mail/backfill-headers.js.map +0 -1
- package/dist/mail/domain-age.d.ts +0 -26
- package/dist/mail/domain-age.d.ts.map +0 -1
- package/dist/mail/domain-age.js +0 -151
- package/dist/mail/domain-age.js.map +0 -1
- package/dist/mail/gmail.d.ts +0 -39
- package/dist/mail/gmail.d.ts.map +0 -1
- package/dist/mail/gmail.js +0 -325
- package/dist/mail/gmail.js.map +0 -1
- package/dist/mail/himalaya.d.ts +0 -22
- package/dist/mail/himalaya.d.ts.map +0 -1
- package/dist/mail/himalaya.js +0 -113
- package/dist/mail/himalaya.js.map +0 -1
- package/dist/mail/mbox.d.ts +0 -9
- package/dist/mail/mbox.d.ts.map +0 -1
- package/dist/mail/mbox.js +0 -230
- package/dist/mail/mbox.js.map +0 -1
- package/dist/mail/repair.d.ts +0 -7
- package/dist/mail/repair.d.ts.map +0 -1
- package/dist/mail/repair.js +0 -54
- package/dist/mail/repair.js.map +0 -1
- package/dist/mail/rule-store.d.ts +0 -12
- package/dist/mail/rule-store.d.ts.map +0 -1
- package/dist/mail/rule-store.js +0 -83
- package/dist/mail/rule-store.js.map +0 -1
- package/dist/mail/setup-command.d.ts +0 -4
- package/dist/mail/setup-command.d.ts.map +0 -1
- package/dist/mail/setup-command.js +0 -41
- package/dist/mail/setup-command.js.map +0 -1
- package/dist/mail/setup.d.ts +0 -19
- package/dist/mail/setup.d.ts.map +0 -1
- package/dist/mail/setup.js +0 -95
- package/dist/mail/setup.js.map +0 -1
- package/dist/mail/slices.d.ts +0 -6
- package/dist/mail/slices.d.ts.map +0 -1
- package/dist/mail/slices.js +0 -7
- package/dist/mail/slices.js.map +0 -1
- package/dist/mail/source.d.ts +0 -7
- package/dist/mail/source.d.ts.map +0 -1
- package/dist/mail/source.js +0 -119
- package/dist/mail/source.js.map +0 -1
- package/dist/mail/sync.d.ts +0 -21
- package/dist/mail/sync.d.ts.map +0 -1
- package/dist/mail/sync.js +0 -24
- package/dist/mail/sync.js.map +0 -1
- /package/dist/bundle/{chunk-CWOKGEL3.js → chunk-DF7NE4ZG.js} +0 -0
- /package/dist/bundle/{chunk-NUN6OGOV.js → chunk-LU3WKZBA.js} +0 -0
package/dist/mail/gmail.js
DELETED
|
@@ -1,325 +0,0 @@
|
|
|
1
|
-
import { CliError } from "@wirecat/cli-base";
|
|
2
|
-
import { HEADER_FIELDS, headersOf, labelName, mailIds } from "@wirecat/cli-core/mail";
|
|
3
|
-
import { isThrottled, throttledError } from "./himalaya.js";
|
|
4
|
-
/** The atoms and quoted strings of one parenthesised IMAP list, or undefined when it holds a literal. */
|
|
5
|
-
const imapList = (items, name) => {
|
|
6
|
-
const start = items.indexOf(`${name} (`);
|
|
7
|
-
if (start === -1)
|
|
8
|
-
return undefined;
|
|
9
|
-
const values = [];
|
|
10
|
-
for (let at = start + name.length + 2; at < items.length;) {
|
|
11
|
-
const c = items[at];
|
|
12
|
-
if (c === ")")
|
|
13
|
-
return values;
|
|
14
|
-
if (c === " ")
|
|
15
|
-
at++;
|
|
16
|
-
else if (c === "{")
|
|
17
|
-
return undefined;
|
|
18
|
-
else if (c === '"') {
|
|
19
|
-
let value = "";
|
|
20
|
-
for (at++; at < items.length && items[at] !== '"'; at++)
|
|
21
|
-
value += items[at] === "\\" ? items[++at] : items[at];
|
|
22
|
-
values.push(value);
|
|
23
|
-
at++;
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
const end = items.slice(at).search(/[ )]/);
|
|
27
|
-
if (end === -1)
|
|
28
|
-
return undefined;
|
|
29
|
-
values.push(items.slice(at, at + end));
|
|
30
|
-
at += end;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return undefined;
|
|
34
|
-
};
|
|
35
|
-
/** One FETCH answer per email, across lines, since a header field comes back as a multi-line literal. */
|
|
36
|
-
const FETCH_ANSWERS = /^\* \d+ FETCH \(([\s\S]*?)(?=^\* \d+ FETCH|^[a-z]\d* (?:OK|NO|BAD)|$(?![\s\S]))/gm;
|
|
37
|
-
/** Each answer's UID and header text; the UID is looked for outside the literal, so a header cannot fake it. */
|
|
38
|
-
const fetchedHeaders = (output) => [...output.matchAll(FETCH_ANSWERS)].flatMap(([, fields = ""]) => {
|
|
39
|
-
const literal = /\{\d+\}\r?\n/.exec(fields);
|
|
40
|
-
if (literal === null)
|
|
41
|
-
return [];
|
|
42
|
-
const start = literal.index + literal[0].length;
|
|
43
|
-
const blank = fields.slice(start).search(/\r?\n\r?\n/);
|
|
44
|
-
const end = blank === -1 ? fields.length : start + blank;
|
|
45
|
-
const uid = /(?:^|\s)UID (\d+)/.exec(`${fields.slice(0, literal.index)} ${fields.slice(end)}`)?.[1];
|
|
46
|
-
return uid === undefined ? [] : [[uid, fields.slice(start, end)]];
|
|
47
|
-
});
|
|
48
|
-
const MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
|
49
|
-
const FETCH_BATCH = 500;
|
|
50
|
-
/** One himalaya call reads its whole answer into memory, so a large mailbox is listed in parts. */
|
|
51
|
-
const CALL_UIDS = 10_000;
|
|
52
|
-
const imapDate = (day) => `${day.getUTCDate()}-${MONTHS[day.getUTCMonth()]}-${day.getUTCFullYear()}`;
|
|
53
|
-
/** IMAP's `INTERNALDATE`: `"04-Oct-2026 19:51:09 +0000"`. */
|
|
54
|
-
const isoOf = (internal) => {
|
|
55
|
-
const match = /^\s*(\d{1,2})-(\w{3})-(\d{4}) (\d{2}):(\d{2}):(\d{2}) ([+-])(\d{2})(\d{2})$/.exec(internal);
|
|
56
|
-
if (match === null)
|
|
57
|
-
throw new CliError("invalid_response", `unexpected IMAP date "${internal}"`, { reason: "mail.invalid-imap" });
|
|
58
|
-
const [, day, month, year, hour, minute, second, sign, offsetHours, offsetMinutes] = match;
|
|
59
|
-
const local = Date.UTC(Number(year), MONTHS.indexOf(month ?? ""), Number(day), Number(hour), Number(minute), Number(second));
|
|
60
|
-
const offset = (Number(offsetHours) * 60 + Number(offsetMinutes)) * 60_000 * (sign === "-" ? -1 : 1);
|
|
61
|
-
return new Date(local - offset).toISOString();
|
|
62
|
-
};
|
|
63
|
-
/** A tagged NO or BAD comes back as output, not as an error, so every tag must end in OK. */
|
|
64
|
-
const assertCompleted = (output, tags) => {
|
|
65
|
-
for (const tag of tags) {
|
|
66
|
-
if (!new RegExp(`^${tag} OK`, "m").test(output)) {
|
|
67
|
-
const line = output.split(/\r?\n/).find((text) => text.startsWith(`${tag} `)) ?? "no answer";
|
|
68
|
-
// Gmail tags answers with [THROTTLED] even when another code says what failed, so that code goes first.
|
|
69
|
-
if (/\[NONEXISTENT\]/.test(line))
|
|
70
|
-
throw new CliError("provider_error", `IMAP command ${tag}: Gmail has no such mailbox: ${line}`, {
|
|
71
|
-
reason: "mail.source-failed",
|
|
72
|
-
});
|
|
73
|
-
if (isThrottled(line))
|
|
74
|
-
throw throttledError(`IMAP command ${tag}`);
|
|
75
|
-
throw new CliError("provider_error", `IMAP command ${tag} did not complete: ${line}`, {
|
|
76
|
-
reason: "mail.source-failed",
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
const mailboxOf = (folder) => {
|
|
82
|
-
if (!folder || /[\r\n]/.test(folder) || folder.includes(String.fromCharCode(0)))
|
|
83
|
-
throw new CliError("validation_error", "invalid mailbox name");
|
|
84
|
-
return JSON.stringify(folder);
|
|
85
|
-
};
|
|
86
|
-
/**
|
|
87
|
-
* All Mail and Trash found by their roles (RFC 6154 `\\All`, `\\Trash`): Gmail names them in the account's
|
|
88
|
-
* language, so Trash is `[Gmail]/Bin` in UK English.
|
|
89
|
-
*/
|
|
90
|
-
export const specialFolders = async (run, account) => {
|
|
91
|
-
const listed = await run(["imap", "raw", "-a", account], `a LIST "" "*"\r\n`);
|
|
92
|
-
assertCompleted(listed, ["a"]);
|
|
93
|
-
let all;
|
|
94
|
-
let trash;
|
|
95
|
-
for (const line of listed.split(/\r?\n/)) {
|
|
96
|
-
const hit = /^\* LIST \(([^)]*)\) (?:"[^"]*"|NIL) (.+)$/.exec(line);
|
|
97
|
-
if (!hit)
|
|
98
|
-
continue;
|
|
99
|
-
const [, flags = "", raw = ""] = hit;
|
|
100
|
-
const name = raw.startsWith('"') ? JSON.parse(raw) : raw;
|
|
101
|
-
if (/\\All\b/.test(flags))
|
|
102
|
-
all = name;
|
|
103
|
-
if (/\\Trash\b/.test(flags))
|
|
104
|
-
trash = name;
|
|
105
|
-
}
|
|
106
|
-
if (all === undefined || trash === undefined)
|
|
107
|
-
throw new CliError("provider_error", "Gmail listed no All Mail or Trash folder", { reason: "mail.source-failed" });
|
|
108
|
-
return { all, trash };
|
|
109
|
-
};
|
|
110
|
-
/** One cheap call: the UIDs a listing would fetch, so a rerun can fetch only those not done before. */
|
|
111
|
-
export const searchMail = async (run, account, since, folder) => {
|
|
112
|
-
const searched = await run(["imap", "raw", "-a", account], `a EXAMINE ${mailboxOf(folder)}\r\nb UID SEARCH SINCE ${imapDate(since)}\r\n`);
|
|
113
|
-
assertCompleted(searched, ["a", "b"]);
|
|
114
|
-
const validity = /\[UIDVALIDITY (\d+)\]/.exec(searched)?.[1];
|
|
115
|
-
const uids = [...new Set((/^\* SEARCH(.*)$/m.exec(searched)?.[1] ?? "").trim().split(/\s+/).filter(Boolean))];
|
|
116
|
-
if (!uids.every((uid) => /^\d+$/.test(uid)))
|
|
117
|
-
throw new CliError("invalid_response", "invalid IMAP UID listing", { reason: "mail.invalid-imap" });
|
|
118
|
-
return { ...(validity === undefined ? {} : { validity }), uids };
|
|
119
|
-
};
|
|
120
|
-
/** Gmail ids looked up per call; each is one `UID SEARCH` line of the same answer. */
|
|
121
|
-
const IDS_PER_CALL = 200;
|
|
122
|
-
/**
|
|
123
|
-
* The UIDs of messages known by their Gmail id, through Gmail's `X-GM-MSGID` search (Gmail IMAP extensions); a
|
|
124
|
-
* message gone from `folder` has none, so it is simply not in the answer.
|
|
125
|
-
*/
|
|
126
|
-
export const uidsOfMessages = async (run, account, messageIds, folder = "[Gmail]/All Mail") => {
|
|
127
|
-
if (!messageIds.every((id) => /^\d+$/.test(id)))
|
|
128
|
-
throw new CliError("validation_error", "a Gmail message id is a number", { reason: "mail.invalid-imap" });
|
|
129
|
-
const mailbox = mailboxOf(folder);
|
|
130
|
-
const uids = new Set();
|
|
131
|
-
for (let from = 0; from < messageIds.length; from += IDS_PER_CALL) {
|
|
132
|
-
const ids = messageIds.slice(from, from + IDS_PER_CALL);
|
|
133
|
-
const tags = ids.map((_, index) => `s${index}`);
|
|
134
|
-
const searched = await run(["imap", "raw", "-a", account], `a EXAMINE ${mailbox}\r\n${ids.map((id, index) => `${tags[index]} UID SEARCH X-GM-MSGID ${id}\r\n`).join("")}`);
|
|
135
|
-
assertCompleted(searched, ["a", ...tags]);
|
|
136
|
-
for (const [, found = ""] of searched.matchAll(/^\* SEARCH(.*)$/gm))
|
|
137
|
-
for (const uid of found.trim().split(/\s+/).filter(Boolean))
|
|
138
|
-
uids.add(uid);
|
|
139
|
-
}
|
|
140
|
-
if (![...uids].every((uid) => /^\d+$/.test(uid)))
|
|
141
|
-
throw new CliError("invalid_response", "invalid IMAP UID listing", { reason: "mail.invalid-imap" });
|
|
142
|
-
return [...uids];
|
|
143
|
-
};
|
|
144
|
-
/** Each Gmail id's UID in `folder`; an id the folder does not hold is absent from the map. */
|
|
145
|
-
const uidsById = async (run, account, messageIds, folder) => {
|
|
146
|
-
if (!messageIds.every((id) => /^\d+$/.test(id)))
|
|
147
|
-
throw new CliError("validation_error", "a Gmail message id is a number", { reason: "mail.invalid-imap" });
|
|
148
|
-
const found = new Map();
|
|
149
|
-
for (let from = 0; from < messageIds.length; from += IDS_PER_CALL) {
|
|
150
|
-
const ids = messageIds.slice(from, from + IDS_PER_CALL);
|
|
151
|
-
const tags = ids.map((_, index) => `s${index}`);
|
|
152
|
-
const searched = await run(["imap", "raw", "-a", account], `a EXAMINE ${mailboxOf(folder)}\r\n${ids.map((id, index) => `${tags[index]} UID SEARCH X-GM-MSGID ${id}\r\n`).join("")}`);
|
|
153
|
-
assertCompleted(searched, ["a", ...tags]);
|
|
154
|
-
// Each untagged SEARCH answers the next tagged command, so answers pair with ids in order.
|
|
155
|
-
let pending;
|
|
156
|
-
for (const line of searched.split(/\r?\n/)) {
|
|
157
|
-
const hit = /^\* SEARCH(.*)$/.exec(line);
|
|
158
|
-
if (hit)
|
|
159
|
-
pending = hit[1]?.trim().split(/\s+/).filter(Boolean)[0];
|
|
160
|
-
const done = /^s(\d+) OK/.exec(line);
|
|
161
|
-
if (done) {
|
|
162
|
-
const id = ids[Number(done[1])];
|
|
163
|
-
if (id !== undefined && pending !== undefined && /^\d+$/.test(pending))
|
|
164
|
-
found.set(id, pending);
|
|
165
|
-
pending = undefined;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
return found;
|
|
170
|
-
};
|
|
171
|
-
/** An IMAP quoted string escapes `\` and `"` as JSON does. */
|
|
172
|
-
const quoted = (name) => JSON.stringify(name);
|
|
173
|
-
/**
|
|
174
|
-
* Moves the messages with these Gmail ids from `from` to `to` with `UID MOVE` (RFC 6851, which Gmail lists in its
|
|
175
|
-
* CAPABILITY). On Gmail a move to `[Gmail]/Trash` takes a message out of All Mail and drops `\Inbox`, keeping its
|
|
176
|
-
* other labels; a move back to `INBOX` or `[Gmail]/All Mail` returns it (checked on a test account, 2026-10-16).
|
|
177
|
-
*/
|
|
178
|
-
export const moveMessages = async (run, account, messageIds, from, to, known) => {
|
|
179
|
-
const uids = known ?? (await uidsById(run, account, messageIds, from));
|
|
180
|
-
const missing = messageIds.filter((id) => !uids.has(id));
|
|
181
|
-
if (uids.size === 0)
|
|
182
|
-
return { moved: [], missing };
|
|
183
|
-
const moved = await run(["imap", "raw", "-a", account], `a SELECT ${mailboxOf(from)}\r\nm UID MOVE ${[...uids.values()].join(",")} ${mailboxOf(to)}\r\n`);
|
|
184
|
-
assertCompleted(moved, ["a", "m"]);
|
|
185
|
-
return { moved: [...uids.keys()], missing };
|
|
186
|
-
};
|
|
187
|
-
/** Which of these UIDs `folder` still holds: one `UID SEARCH`, where looking each message up by Gmail id is one per. */
|
|
188
|
-
export const uidsPresent = async (run, account, uids, folder) => {
|
|
189
|
-
if (uids.length === 0)
|
|
190
|
-
return [];
|
|
191
|
-
if (!uids.every((uid) => /^\d+$/.test(uid)))
|
|
192
|
-
throw new CliError("validation_error", "a UID is a number", { reason: "mail.invalid-imap" });
|
|
193
|
-
const searched = await run(["imap", "raw", "-a", account], `a EXAMINE ${mailboxOf(folder)}\r\nb UID SEARCH UID ${uids.join(",")}\r\n`);
|
|
194
|
-
assertCompleted(searched, ["a", "b"]);
|
|
195
|
-
return (/^\* SEARCH(.*)$/m.exec(searched)?.[1] ?? "").trim().split(/\s+/).filter(Boolean);
|
|
196
|
-
};
|
|
197
|
-
/** Puts Gmail labels back on messages in `folder`; a label a message already has is left as it is. */
|
|
198
|
-
export const addLabels = async (run, account, messageIds, folder, labels) => {
|
|
199
|
-
if (labels.length === 0)
|
|
200
|
-
return;
|
|
201
|
-
const uids = await uidsById(run, account, messageIds, folder);
|
|
202
|
-
if (uids.size === 0)
|
|
203
|
-
return;
|
|
204
|
-
const names = labels.map(quoted).join(" ");
|
|
205
|
-
const stored = await run(["imap", "raw", "-a", account], `a SELECT ${mailboxOf(folder)}\r\nl UID STORE ${[...uids.values()].join(",")} +X-GM-LABELS (${names})\r\n`);
|
|
206
|
-
assertCompleted(stored, ["a", "l"]);
|
|
207
|
-
};
|
|
208
|
-
/**
|
|
209
|
-
* Every message in All Mail received since `since`, read with EXAMINE so nothing can change a flag.
|
|
210
|
-
* All Mail rather than INBOX: an archived message leaves INBOX but is not deleted.
|
|
211
|
-
* `searched` limits it to those UIDs, from `searchMail`, so mail done in an earlier run is not fetched again.
|
|
212
|
-
*/
|
|
213
|
-
export const listAllMail = async (run, account, since, folder = "[Gmail]/All Mail", headers = false, searched) => {
|
|
214
|
-
const mailbox = mailboxOf(folder);
|
|
215
|
-
const { uids } = searched ?? (await searchMail(run, account, since, folder));
|
|
216
|
-
if (uids.length === 0)
|
|
217
|
-
return [];
|
|
218
|
-
const listed = [];
|
|
219
|
-
const marks = new Map();
|
|
220
|
-
for (let from = 0; from < uids.length; from += CALL_UIDS) {
|
|
221
|
-
const batches = [];
|
|
222
|
-
for (let start = from; start < Math.min(from + CALL_UIDS, uids.length); start += FETCH_BATCH)
|
|
223
|
-
batches.push(uids.slice(start, start + FETCH_BATCH).join(","));
|
|
224
|
-
const tags = batches.map((_, index) => `f${index}`);
|
|
225
|
-
const fetched = await run(["imap", "raw", "-a", account], `a EXAMINE ${mailbox}\r\n${batches
|
|
226
|
-
.map((set, index) => `${tags[index]} UID FETCH ${set} (UID X-GM-MSGID X-GM-THRID INTERNALDATE RFC822.SIZE)\r\n`)
|
|
227
|
-
.join("")}`);
|
|
228
|
-
assertCompleted(fetched, ["a", ...tags]);
|
|
229
|
-
for (const [, items = ""] of fetched.matchAll(/^\* \d+ FETCH \((.*)\)\s*$/gm)) {
|
|
230
|
-
const item = (name) => new RegExp(`${name} (\\d+)`).exec(items)?.[1];
|
|
231
|
-
const internal = /INTERNALDATE "([^"]+)"/.exec(items)?.[1];
|
|
232
|
-
const uid = item("UID");
|
|
233
|
-
const messageId = item("X-GM-MSGID");
|
|
234
|
-
const threadId = item("X-GM-THRID");
|
|
235
|
-
const size = item("RFC822\\.SIZE");
|
|
236
|
-
if (!uid || !messageId || !threadId || !internal)
|
|
237
|
-
throw new CliError("invalid_response", `IMAP FETCH answer without the Gmail ids: ${items}`, {
|
|
238
|
-
reason: "mail.invalid-imap",
|
|
239
|
-
});
|
|
240
|
-
listed.push({
|
|
241
|
-
uid,
|
|
242
|
-
messageId,
|
|
243
|
-
threadId,
|
|
244
|
-
receivedAt: isoOf(internal),
|
|
245
|
-
...(size === undefined ? {} : { size: Number(size) }),
|
|
246
|
-
});
|
|
247
|
-
}
|
|
248
|
-
// A separate answer, so a label the parser cannot read costs that message its labels, never the listing.
|
|
249
|
-
const labelled = await run(["imap", "raw", "-a", account], `a EXAMINE ${mailbox}\r\n${batches
|
|
250
|
-
.map((set, index) => `l${index} UID FETCH ${set} (UID X-GM-LABELS FLAGS)\r\n`)
|
|
251
|
-
.join("")}`);
|
|
252
|
-
for (const [, items = ""] of labelled.matchAll(/^\* \d+ FETCH \((.*)\)\s*$/gm)) {
|
|
253
|
-
const uid = /(?:^|\s)UID (\d+)/.exec(items)?.[1];
|
|
254
|
-
const labels = imapList(items, "X-GM-LABELS");
|
|
255
|
-
const flags = imapList(items, "FLAGS");
|
|
256
|
-
if (!uid || labels === undefined || flags === undefined)
|
|
257
|
-
continue;
|
|
258
|
-
const flagged = flags.includes("\\Flagged");
|
|
259
|
-
const names = new Set(labels.map(labelName));
|
|
260
|
-
if (flagged)
|
|
261
|
-
names.add("Starred");
|
|
262
|
-
marks.set(uid, { labels: [...names].sort(), seen: flags.includes("\\Seen"), flagged });
|
|
263
|
-
}
|
|
264
|
-
if (headers) {
|
|
265
|
-
const headed = await run(["imap", "raw", "-a", account], `a EXAMINE ${mailbox}\r\n${batches
|
|
266
|
-
.map((set, index) => `h${index} UID FETCH ${set} (UID BODY.PEEK[HEADER.FIELDS (${HEADER_FIELDS})])\r\n`)
|
|
267
|
-
.join("")}`);
|
|
268
|
-
// A refused fetch would leave a whole batch without headers, and rules would not keep its mail out.
|
|
269
|
-
assertCompleted(headed, ["a", ...batches.map((_, index) => `h${index}`)]);
|
|
270
|
-
for (const [uid, text] of fetchedHeaders(headed))
|
|
271
|
-
marks.set(uid, { ...marks.get(uid), headers: headersOf(text) });
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
if (listed.length !== uids.length)
|
|
275
|
-
throw new CliError("invalid_response", `IMAP listed ${uids.length} messages but fetched ${listed.length}`, {
|
|
276
|
-
reason: "mail.invalid-imap",
|
|
277
|
-
});
|
|
278
|
-
return listed.map((item) => ({ ...item, ...marks.get(item.uid) }));
|
|
279
|
-
};
|
|
280
|
-
/** Message-ID is stable across folders; absent headers fall back to a UIDVALIDITY-scoped identity. */
|
|
281
|
-
export const listImapMail = async (run, account, since, folder, searched) => {
|
|
282
|
-
const mailbox = mailboxOf(folder);
|
|
283
|
-
const { validity, uids } = searched ?? (await searchMail(run, account, since, folder));
|
|
284
|
-
// Without Message-ID the identity is the UID, which means nothing without its UIDVALIDITY.
|
|
285
|
-
if (!validity)
|
|
286
|
-
throw new CliError("invalid_response", "IMAP did not report UIDVALIDITY", { reason: "mail.invalid-imap" });
|
|
287
|
-
const listed = [];
|
|
288
|
-
for (let start = 0; start < uids.length; start += FETCH_BATCH) {
|
|
289
|
-
const batch = uids.slice(start, start + FETCH_BATCH);
|
|
290
|
-
const before = listed.length;
|
|
291
|
-
const output = await run(["imap", "raw", "-a", account], `a EXAMINE ${mailbox}\r\nf UID FETCH ${batch.join(",")} (UID FLAGS INTERNALDATE RFC822.SIZE BODY.PEEK[HEADER.FIELDS (MESSAGE-ID REFERENCES IN-REPLY-TO ${HEADER_FIELDS})])\r\n`);
|
|
292
|
-
assertCompleted(output, ["a", "f"]);
|
|
293
|
-
for (const match of output.matchAll(/^\* \d+ FETCH \(([\s\S]*?)(?=^\* \d+ FETCH|^[af] (?:OK|NO|BAD)|$(?![\s\S]))/gm)) {
|
|
294
|
-
const fields = match[1] ?? "", uid = /(?:^|\s)UID (\d+)/.exec(fields)?.[1], internal = /INTERNALDATE "([^"]+)"/.exec(fields)?.[1];
|
|
295
|
-
if (!uid || !internal || !batch.includes(uid))
|
|
296
|
-
throw new CliError("invalid_response", "incomplete IMAP envelope", { reason: "mail.invalid-imap" });
|
|
297
|
-
const unfolded = fields.replace(/\r?\n[ \t]+/g, " ");
|
|
298
|
-
const flags = imapList(fields, "FLAGS");
|
|
299
|
-
const size = /RFC822\.SIZE (\d+)/.exec(fields)?.[1];
|
|
300
|
-
listed.push({
|
|
301
|
-
uid,
|
|
302
|
-
...(size === undefined ? {} : { size: Number(size) }),
|
|
303
|
-
...mailIds({ head: fields, folder, validity, uid }),
|
|
304
|
-
receivedAt: isoOf(internal),
|
|
305
|
-
folder,
|
|
306
|
-
headers: headersOf(unfolded),
|
|
307
|
-
// IMAP has no labels; a flagged message is Starred, as in Gmail, so one search finds both.
|
|
308
|
-
...(flags === undefined
|
|
309
|
-
? {}
|
|
310
|
-
: {
|
|
311
|
-
labels: flags.includes("\\Flagged") ? ["Starred"] : [],
|
|
312
|
-
seen: flags.includes("\\Seen"),
|
|
313
|
-
flagged: flags.includes("\\Flagged"),
|
|
314
|
-
}),
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
if (listed.length - before !== batch.length ||
|
|
318
|
-
new Set(listed.slice(before).map((item) => item.uid)).size !== batch.length)
|
|
319
|
-
throw new CliError("invalid_response", "IMAP returned a partial envelope batch; deletions were not checked", {
|
|
320
|
-
reason: "mail.invalid-imap",
|
|
321
|
-
});
|
|
322
|
-
}
|
|
323
|
-
return listed;
|
|
324
|
-
};
|
|
325
|
-
//# sourceMappingURL=gmail.js.map
|
package/dist/mail/gmail.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gmail.js","sourceRoot":"","sources":["../../src/mail/gmail.ts"],"names":[],"mappings":"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"}
|
package/dist/mail/himalaya.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { CliError } from "@wirecat/cli-base";
|
|
2
|
-
export type Himalaya = (args: string[], input?: string, options?: {
|
|
3
|
-
maxBuffer?: number;
|
|
4
|
-
}) => Promise<string>;
|
|
5
|
-
/** The last lines of himalaya's stderr, without credentials, for the error's details and the failed line. */
|
|
6
|
-
export declare const stderrTail: (stderr: string) => string[];
|
|
7
|
-
export declare const isThrottled: (text: string) => boolean;
|
|
8
|
-
/**
|
|
9
|
-
* himalaya 2.2 prints its own failure on stdout, not stderr ("Error: …" then "Suggestions:"), so a failure whose
|
|
10
|
-
* stderr is empty reads it from there; an IMAP answer above it is left out.
|
|
11
|
-
*/
|
|
12
|
-
export declare const errorReport: (stdout: string) => string[];
|
|
13
|
-
export declare const throttledError: (what: string) => CliError;
|
|
14
|
-
/** `himalaya.envelope.list`: the subcommand words only; an account, folder or query never matches. */
|
|
15
|
-
export declare const operationOf: (args: readonly string[]) => string;
|
|
16
|
-
/**
|
|
17
|
-
* `MEMO_HIMALAYA` names the program, so the test sandbox can point it at a fake. A read that fails is tried once
|
|
18
|
-
* more after `MEMO_HIMALAYA_RETRY_MS` (15 s): six failed runs in two days (2026-10-14/15) each passed on the next run.
|
|
19
|
-
* A failed login is not: with two accounts it held sync for a minute.
|
|
20
|
-
*/
|
|
21
|
-
export declare const himalaya: (env?: NodeJS.ProcessEnv, signal?: AbortSignal) => Himalaya;
|
|
22
|
-
//# sourceMappingURL=himalaya.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"himalaya.d.ts","sourceRoot":"","sources":["../../src/mail/himalaya.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAG5C,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAY5G,6GAA6G;AAC7G,eAAO,MAAM,UAAU,WAAY,MAAM,KAAG,MAAM,EAMlC,CAAA;AAEhB,eAAO,MAAM,WAAW,SAAU,MAAM,KAAG,OAA+B,CAAA;AAY1E;;;GAGG;AACH,eAAO,MAAM,WAAW,WAAY,MAAM,KAAG,MAAM,EAMlD,CAAA;AAKD,eAAO,MAAM,cAAc,SAAU,MAAM,KAAG,QAG1C,CAAA;AAYJ,sGAAsG;AACtG,eAAO,MAAM,WAAW,SAAU,SAAS,MAAM,EAAE,KAAG,MACyB,CAAA;AA2D/E;;;;GAIG;AACH,eAAO,MAAM,QAAQ,SACb,MAAM,CAAC,UAAU,WAAyB,WAAW,KAAG,QAmB7D,CAAA"}
|
package/dist/mail/himalaya.js
DELETED
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import { execFile } from "node:child_process";
|
|
2
|
-
import { setTimeout as sleep } from "node:timers/promises";
|
|
3
|
-
import { CliError } from "@wirecat/cli-base";
|
|
4
|
-
import { providerRequest } from "@wirecat/cli-core/cli";
|
|
5
|
-
const TAIL_LINES = 5;
|
|
6
|
-
/** Gmail's words for "too much IMAP traffic from this account": a tagged `NO [THROTTLED]`, or a refused login. */
|
|
7
|
-
const THROTTLED = /\[THROTTLED\]|Too many simultaneous connections|Account exceeded command or bandwidth limits/i;
|
|
8
|
-
// A login line or a URL can carry a password or a token; nothing after these words reaches an error.
|
|
9
|
-
const SECRET = /((?:pass(?:word)?|token|secret|auth[a-z]*|bearer|key)\s*[:=]?\s*)\S+/gi;
|
|
10
|
-
const redact = (line) => line.replace(/\/\/[^/@\s]+@/g, "//…@").replace(SECRET, "$1…");
|
|
11
|
-
/** The last lines of himalaya's stderr, without credentials, for the error's details and the failed line. */
|
|
12
|
-
export const stderrTail = (stderr) => stderr
|
|
13
|
-
.split(/\r?\n/)
|
|
14
|
-
.map((line) => line.trim())
|
|
15
|
-
.filter(Boolean)
|
|
16
|
-
.slice(-TAIL_LINES)
|
|
17
|
-
.map(redact);
|
|
18
|
-
export const isThrottled = (text) => THROTTLED.test(text);
|
|
19
|
-
// RFC 5530's AUTHENTICATIONFAILED, and himalaya's own words for a login or a keyring that fails: asking again
|
|
20
|
-
// in 15 s gets the same answer, so such a failure is not retried.
|
|
21
|
-
const LOGIN_FAILED = /AUTHENTICATIONFAILED|authentication failed|cannot authenticate|invalid credentials|keyring/i;
|
|
22
|
-
const lasting = new WeakSet();
|
|
23
|
-
const lastingly = (error) => {
|
|
24
|
-
lasting.add(error);
|
|
25
|
-
return error;
|
|
26
|
-
};
|
|
27
|
-
/**
|
|
28
|
-
* himalaya 2.2 prints its own failure on stdout, not stderr ("Error: …" then "Suggestions:"), so a failure whose
|
|
29
|
-
* stderr is empty reads it from there; an IMAP answer above it is left out.
|
|
30
|
-
*/
|
|
31
|
-
export const errorReport = (stdout) => {
|
|
32
|
-
const lines = stdout.split(/\r?\n/);
|
|
33
|
-
const start = lines.findLastIndex((line) => line.startsWith("Error:"));
|
|
34
|
-
if (start < 0)
|
|
35
|
-
return [];
|
|
36
|
-
const end = lines.findIndex((line, index) => index > start && line.startsWith("Suggestions:"));
|
|
37
|
-
return stderrTail(lines.slice(start, end < 0 ? undefined : end).join("\n"));
|
|
38
|
-
};
|
|
39
|
-
// Every IMAP command memo sends only reads, so running one again is safe; a write must never be repeated.
|
|
40
|
-
const WRITES = /^\S+\s+(?:UID\s+)?(?:STORE|EXPUNGE|COPY|MOVE|APPEND|DELETE|CREATE|RENAME)\b/im;
|
|
41
|
-
export const throttledError = (what) => new CliError("rate_limited", `${what}: Gmail is limiting this account's IMAP traffic; try again in an hour or more`, {
|
|
42
|
-
reason: "mail.throttled",
|
|
43
|
-
});
|
|
44
|
-
const howItEnded = ({ code, signal }) => signal ? `killed by ${signal}` : typeof code === "number" ? `exit ${code}` : String(code ?? "failed");
|
|
45
|
-
const WORD = /^[a-z][a-z-]{0,23}$/;
|
|
46
|
-
/** `himalaya.envelope.list`: the subcommand words only; an account, folder or query never matches. */
|
|
47
|
-
export const operationOf = (args) => ["himalaya", ...args.slice(0, 2).filter((word) => WORD.test(word))].join(".");
|
|
48
|
-
const once = (env, signal, retry = { attempt: 1 }) => (args, input, options) => new Promise((resolve, reject) => {
|
|
49
|
-
const answered = providerRequest(operationOf(args), undefined, retry);
|
|
50
|
-
const child = execFile(env.MEMO_HIMALAYA ?? "himalaya", args, { env, maxBuffer: options?.maxBuffer ?? 64 * 1024 * 1024, ...(signal ? { signal } : {}) }, (error, stdout, stderr) => {
|
|
51
|
-
if (error === null) {
|
|
52
|
-
answered({ status: 0 });
|
|
53
|
-
return resolve(stdout);
|
|
54
|
-
}
|
|
55
|
-
const exit = error.code;
|
|
56
|
-
const printed = stderrTail(stderr);
|
|
57
|
-
const tail = printed.length ? printed : errorReport(String(stdout));
|
|
58
|
-
const throttled = isThrottled(stderr) || isThrottled(String(stdout).slice(-4096)) || isThrottled(tail.join("\n"));
|
|
59
|
-
answered({
|
|
60
|
-
...(typeof exit === "number" ? { status: exit } : {}),
|
|
61
|
-
error,
|
|
62
|
-
...(throttled ? { providerError: "mail.throttled" } : {}),
|
|
63
|
-
});
|
|
64
|
-
if (signal?.aborted)
|
|
65
|
-
return reject(signal.reason);
|
|
66
|
-
const what = `himalaya ${args[0] ?? ""} ${args[1] ?? ""}`.trim();
|
|
67
|
-
if (throttled)
|
|
68
|
-
return reject(throttledError(what));
|
|
69
|
-
const failure = error;
|
|
70
|
-
if (failure.code === "ENOENT")
|
|
71
|
-
return reject(lastingly(new CliError("provider_error", `${what}: himalaya is not installed or not on PATH`, {
|
|
72
|
-
reason: "mail.source-failed",
|
|
73
|
-
})));
|
|
74
|
-
const ended = howItEnded(failure);
|
|
75
|
-
const said = tail.at(-1) ?? (/maxBuffer/i.test(failure.message) ? "its answer was too large" : "no error text");
|
|
76
|
-
const failed = new CliError("provider_error", `${what} failed (${ended}): ${said}`, {
|
|
77
|
-
reason: "mail.source-failed",
|
|
78
|
-
...(typeof failure.code === "number" ? { exit_code: failure.code } : {}),
|
|
79
|
-
...(failure.signal ? { signal: failure.signal } : {}),
|
|
80
|
-
stderr_tail: tail,
|
|
81
|
-
});
|
|
82
|
-
reject(LOGIN_FAILED.test(`${stderr}\n${String(stdout).slice(-4096)}`) ? lastingly(failed) : failed);
|
|
83
|
-
});
|
|
84
|
-
// A himalaya that exits before reading its input breaks the pipe (EPIPE); how it ended is reported above.
|
|
85
|
-
child.stdin?.on("error", () => { });
|
|
86
|
-
child.stdin?.end(input ?? "");
|
|
87
|
-
});
|
|
88
|
-
/**
|
|
89
|
-
* `MEMO_HIMALAYA` names the program, so the test sandbox can point it at a fake. A read that fails is tried once
|
|
90
|
-
* more after `MEMO_HIMALAYA_RETRY_MS` (15 s): six failed runs in two days (2026-10-14/15) each passed on the next run.
|
|
91
|
-
* A failed login is not: with two accounts it held sync for a minute.
|
|
92
|
-
*/
|
|
93
|
-
export const himalaya = (env = process.env, signal) => async (args, input, options) => {
|
|
94
|
-
try {
|
|
95
|
-
return await once(env, signal)(args, input, options);
|
|
96
|
-
}
|
|
97
|
-
catch (error) {
|
|
98
|
-
const again = error instanceof CliError &&
|
|
99
|
-
error.code === "provider_error" &&
|
|
100
|
-
!lasting.has(error) &&
|
|
101
|
-
!error.message.includes("too large") &&
|
|
102
|
-
!WRITES.test(input ?? "");
|
|
103
|
-
if (!again)
|
|
104
|
-
throw error;
|
|
105
|
-
// Stop sends SIGKILL 5 s after SIGTERM; a 15 s wait would lose the resume point.
|
|
106
|
-
const waitMs = Number(env.MEMO_HIMALAYA_RETRY_MS ?? 15_000);
|
|
107
|
-
await sleep(waitMs, undefined, signal ? { signal } : {}).catch(() => {
|
|
108
|
-
throw signal?.reason;
|
|
109
|
-
});
|
|
110
|
-
return once(env, signal, { attempt: 2, waitMs })(args, input, options);
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
//# sourceMappingURL=himalaya.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"himalaya.js","sourceRoot":"","sources":["../../src/mail/himalaya.ts"],"names":[],"mappings":"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"}
|
package/dist/mail/mbox.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { type MailSource } from "@wirecat/cli-core/mail";
|
|
2
|
-
/**
|
|
3
|
-
* A Google Takeout mbox of Gmail: the same message and thread ids IMAP reports, so its emails and the
|
|
4
|
-
* account's IMAP emails are one set. Spam and Trash are left out, as IMAP's All Mail leaves them out.
|
|
5
|
-
*/
|
|
6
|
-
export declare const mboxSource: (path: string, { chunkSize }?: {
|
|
7
|
-
chunkSize?: number;
|
|
8
|
-
}) => MailSource;
|
|
9
|
-
//# sourceMappingURL=mbox.d.ts.map
|
package/dist/mail/mbox.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mbox.d.ts","sourceRoot":"","sources":["../../src/mail/mbox.ts"],"names":[],"mappings":"AAGA,OAAO,EAA0B,KAAK,UAAU,EAAe,MAAM,wBAAwB,CAAA;AAgN7F;;;GAGG;AACH,eAAO,MAAM,UAAU,SAAU,MAAM,kBAA+B;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,KAAQ,UA2CnG,CAAA"}
|