@wirecat/cli-memo 0.24.0 → 0.25.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.
Files changed (178) hide show
  1. package/dist/actions/actions.d.ts +1 -1
  2. package/dist/actions/actions.d.ts.map +1 -1
  3. package/dist/actions/command.js +2 -2
  4. package/dist/actions/command.js.map +1 -1
  5. package/dist/answers/command.d.ts +1 -1
  6. package/dist/answers/command.d.ts.map +1 -1
  7. package/dist/answers/command.js +2 -2
  8. package/dist/answers/command.js.map +1 -1
  9. package/dist/author.d.ts +1 -1
  10. package/dist/author.d.ts.map +1 -1
  11. package/dist/bin/memo.js +2 -2
  12. package/dist/bin/memo.js.map +1 -1
  13. package/dist/config.d.ts +14 -1
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +14 -1
  16. package/dist/config.js.map +1 -1
  17. package/dist/context/command.js +1 -1
  18. package/dist/context/command.js.map +1 -1
  19. package/dist/context/context.d.ts +3 -3
  20. package/dist/context/context.d.ts.map +1 -1
  21. package/dist/context/context.js +2 -2
  22. package/dist/context/context.js.map +1 -1
  23. package/dist/discovery/command.d.ts +1 -1
  24. package/dist/discovery/command.js +2 -2
  25. package/dist/discovery/command.js.map +1 -1
  26. package/dist/examples.d.ts.map +1 -1
  27. package/dist/examples.js +7 -0
  28. package/dist/examples.js.map +1 -1
  29. package/dist/facts/command.js +1 -1
  30. package/dist/facts/command.js.map +1 -1
  31. package/dist/knowledge/command.js +1 -1
  32. package/dist/knowledge/command.js.map +1 -1
  33. package/dist/knowledge/key-documents.d.ts +1 -1
  34. package/dist/knowledge/key-documents.d.ts.map +1 -1
  35. package/dist/knowledge/key-documents.js +1 -1
  36. package/dist/knowledge/key-documents.js.map +1 -1
  37. package/dist/mail/accounts.d.ts +11 -0
  38. package/dist/mail/accounts.d.ts.map +1 -0
  39. package/dist/mail/accounts.js +26 -0
  40. package/dist/mail/accounts.js.map +1 -0
  41. package/dist/mail/command.d.ts +4 -0
  42. package/dist/mail/command.d.ts.map +1 -0
  43. package/dist/mail/command.js +139 -0
  44. package/dist/mail/command.js.map +1 -0
  45. package/dist/mail/gmail.d.ts +7 -2
  46. package/dist/mail/gmail.d.ts.map +1 -1
  47. package/dist/mail/gmail.js +76 -37
  48. package/dist/mail/gmail.js.map +1 -1
  49. package/dist/mail/headers.d.ts +17 -0
  50. package/dist/mail/headers.d.ts.map +1 -0
  51. package/dist/mail/headers.js +28 -0
  52. package/dist/mail/headers.js.map +1 -0
  53. package/dist/mail/himalaya.d.ts +3 -1
  54. package/dist/mail/himalaya.d.ts.map +1 -1
  55. package/dist/mail/himalaya.js +2 -2
  56. package/dist/mail/himalaya.js.map +1 -1
  57. package/dist/mail/import.d.ts +15 -6
  58. package/dist/mail/import.d.ts.map +1 -1
  59. package/dist/mail/import.js +130 -87
  60. package/dist/mail/import.js.map +1 -1
  61. package/dist/mail/mbox.d.ts +9 -0
  62. package/dist/mail/mbox.d.ts.map +1 -0
  63. package/dist/mail/mbox.js +218 -0
  64. package/dist/mail/mbox.js.map +1 -0
  65. package/dist/mail/messages-command.js +3 -3
  66. package/dist/mail/messages-command.js.map +1 -1
  67. package/dist/mail/parse.d.ts +2 -2
  68. package/dist/mail/parse.d.ts.map +1 -1
  69. package/dist/mail/parse.js +27 -63
  70. package/dist/mail/parse.js.map +1 -1
  71. package/dist/mail/probe.d.ts +31 -0
  72. package/dist/mail/probe.d.ts.map +1 -0
  73. package/dist/mail/probe.js +55 -0
  74. package/dist/mail/probe.js.map +1 -0
  75. package/dist/mail/rules.d.ts +18 -0
  76. package/dist/mail/rules.d.ts.map +1 -0
  77. package/dist/mail/rules.js +26 -0
  78. package/dist/mail/rules.js.map +1 -0
  79. package/dist/mail/source.d.ts +20 -0
  80. package/dist/mail/source.d.ts.map +1 -0
  81. package/dist/mail/source.js +99 -0
  82. package/dist/mail/source.js.map +1 -0
  83. package/dist/mcp/knowledge.js +1 -1
  84. package/dist/mcp/knowledge.js.map +1 -1
  85. package/dist/mcp/server.js +2 -2
  86. package/dist/mcp/server.js.map +1 -1
  87. package/dist/mcp/tool.d.ts +1 -1
  88. package/dist/mcp/tool.d.ts.map +1 -1
  89. package/dist/memories/command.js +1 -1
  90. package/dist/memories/command.js.map +1 -1
  91. package/dist/memories/memories.d.ts +1 -1
  92. package/dist/memories/memories.d.ts.map +1 -1
  93. package/dist/notes/about.d.ts +1 -1
  94. package/dist/notes/about.d.ts.map +1 -1
  95. package/dist/notes/about.js +1 -1
  96. package/dist/notes/about.js.map +1 -1
  97. package/dist/notes/bound.d.ts +1 -1
  98. package/dist/notes/bound.d.ts.map +1 -1
  99. package/dist/notes/command.js +1 -1
  100. package/dist/notes/command.js.map +1 -1
  101. package/dist/notes/embed.d.ts +1 -1
  102. package/dist/notes/embed.d.ts.map +1 -1
  103. package/dist/notes/embed.js +1 -1
  104. package/dist/notes/embed.js.map +1 -1
  105. package/dist/notes/folders-command.js +1 -1
  106. package/dist/notes/folders-command.js.map +1 -1
  107. package/dist/notes/import.d.ts +2 -2
  108. package/dist/notes/import.d.ts.map +1 -1
  109. package/dist/notes/import.js +2 -2
  110. package/dist/notes/import.js.map +1 -1
  111. package/dist/notes/internal.d.ts +1 -1
  112. package/dist/notes/internal.d.ts.map +1 -1
  113. package/dist/notes/links.d.ts +1 -1
  114. package/dist/notes/links.d.ts.map +1 -1
  115. package/dist/notes/list.d.ts +1 -1
  116. package/dist/notes/list.d.ts.map +1 -1
  117. package/dist/notes/search.d.ts +3 -3
  118. package/dist/notes/search.d.ts.map +1 -1
  119. package/dist/notes/search.js +1 -1
  120. package/dist/notes/search.js.map +1 -1
  121. package/dist/people/command.js +1 -1
  122. package/dist/people/command.js.map +1 -1
  123. package/dist/people/identity.d.ts +1 -1
  124. package/dist/people/identity.d.ts.map +1 -1
  125. package/dist/people/identity.js +1 -1
  126. package/dist/people/identity.js.map +1 -1
  127. package/dist/people/notes-map.d.ts +1 -1
  128. package/dist/people/notes-map.d.ts.map +1 -1
  129. package/dist/people/subject.d.ts +1 -1
  130. package/dist/people/subject.d.ts.map +1 -1
  131. package/dist/people/subject.js +1 -1
  132. package/dist/people/subject.js.map +1 -1
  133. package/dist/program.d.ts.map +1 -1
  134. package/dist/program.js +2 -0
  135. package/dist/program.js.map +1 -1
  136. package/dist/records/run.d.ts +1 -1
  137. package/dist/records/run.d.ts.map +1 -1
  138. package/dist/records/run.js +1 -1
  139. package/dist/records/run.js.map +1 -1
  140. package/dist/run/import.d.ts.map +1 -1
  141. package/dist/run/import.js +21 -17
  142. package/dist/run/import.js.map +1 -1
  143. package/dist/run/lock.js +1 -1
  144. package/dist/run/lock.js.map +1 -1
  145. package/dist/search/command.d.ts +2 -2
  146. package/dist/search/command.d.ts.map +1 -1
  147. package/dist/search/command.js +5 -4
  148. package/dist/search/command.js.map +1 -1
  149. package/dist/store/gone.d.ts +1 -1
  150. package/dist/store/gone.d.ts.map +1 -1
  151. package/dist/store/held.d.ts +1 -1
  152. package/dist/store/held.d.ts.map +1 -1
  153. package/dist/store/scope.d.ts +1 -1
  154. package/dist/store/scope.d.ts.map +1 -1
  155. package/dist/store/scope.js +1 -1
  156. package/dist/store/scope.js.map +1 -1
  157. package/dist/store/source-target.d.ts +1 -1
  158. package/dist/store/source-target.d.ts.map +1 -1
  159. package/dist/store/source-target.js +1 -1
  160. package/dist/store/source-target.js.map +1 -1
  161. package/dist/tags/command.js +2 -2
  162. package/dist/tags/command.js.map +1 -1
  163. package/dist/tasks/command.js +3 -3
  164. package/dist/tasks/command.js.map +1 -1
  165. package/dist/tasks/context.d.ts +2 -2
  166. package/dist/tasks/context.d.ts.map +1 -1
  167. package/dist/tasks/context.js +2 -2
  168. package/dist/tasks/context.js.map +1 -1
  169. package/dist/tasks/relations-command.js +1 -1
  170. package/dist/tasks/relations-command.js.map +1 -1
  171. package/dist/version.d.ts +1 -1
  172. package/dist/version.js +1 -1
  173. package/dist/vocabulary/command.js +1 -1
  174. package/dist/vocabulary/command.js.map +1 -1
  175. package/dist/vocabulary/project.d.ts +1 -1
  176. package/dist/vocabulary/project.d.ts.map +1 -1
  177. package/package.json +4 -3
  178. package/skills/cli-memo/SKILL.md +11 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/mail/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA4ExC,eAAO,MAAM,WAAW,YAAa,OAAO,WAAW,OAAO,OAAO,MAAM,CAAC,UAAU,KAAG,IA+FxF,CAAA"}
@@ -0,0 +1,139 @@
1
+ import { CliError } from "@wirecat/cli-base";
2
+ import { loadConfig, updateConfig } from "../config.js";
3
+ import { positive } from "../options.js";
4
+ import { printing } from "../records/run.js";
5
+ import { mailAccounts, mailFolders, mailSource } from "./accounts.js";
6
+ import { probeMail, SUGGEST_RULE } from "./probe.js";
7
+ import { sameMatch } from "./rules.js";
8
+ const accountOf = (config, name) => mailAccounts(config.mail?.accounts ?? [], [name])[0];
9
+ const matchOf = ({ from, domain, listId }) => {
10
+ const given = [from, domain, listId].filter((value) => value !== undefined);
11
+ if (given.length !== 1)
12
+ throw new CliError("validation_error", "give exactly one of --from, --domain, --list-id");
13
+ return from !== undefined ? { from } : domain !== undefined ? { domain } : { listId: listId };
14
+ };
15
+ const describe = (match) => match.from !== undefined
16
+ ? `from ${match.from}`
17
+ : match.domain !== undefined
18
+ ? `domain ${match.domain}`
19
+ : `list-id ${match.listId}`;
20
+ const ruleLine = (rule) => [rule.action.padEnd(4), describe(rule.match), rule.decidedAt.slice(0, 10), rule.reason ?? ""].join(" ").trimEnd();
21
+ const changeRules = (env, name, change) => {
22
+ let changed = [];
23
+ updateConfig((config) => {
24
+ const account = accountOf(config, name);
25
+ changed = change(account.rules ?? []);
26
+ const accounts = (config.mail?.accounts ?? []).map((each) => each === account ? { ...each, rules: changed } : each);
27
+ return { ...config, mail: { ...config.mail, accounts } };
28
+ }, env);
29
+ return changed;
30
+ };
31
+ const megabytes = (bytes) => (bytes / 1024 / 1024).toFixed(1);
32
+ const percent = (value) => (value === null ? "?" : `${Math.round(value * 100)}%`);
33
+ const probeText = (probe) => {
34
+ const rows = probe.items.map((group) => [
35
+ String(group.emails),
36
+ megabytes(group.bytes),
37
+ percent(group.unread),
38
+ percent(group.bulk),
39
+ group.firstYear === group.lastYear ? String(group.firstYear) : `${group.firstYear}-${group.lastYear}`,
40
+ group.replied ? "yes" : "no",
41
+ group.suggest ?? "",
42
+ group.listId === null ? (group.from ?? "") : `${group.listId} (${group.from ?? "?"})`,
43
+ ]);
44
+ const header = ["emails", "MB", "unread", "bulk", "years", "replied", "suggest", "sender or list"];
45
+ const widths = header.map((title, column) => Math.max(title.length, ...rows.map((row) => row[column]?.length ?? 0)));
46
+ const line = (row) => row
47
+ .map((cell, column) => (column < 2 ? cell.padStart(widths[column] ?? 0) : cell.padEnd(widths[column] ?? 0)))
48
+ .join(" ")
49
+ .trimEnd();
50
+ return [
51
+ `${probe.emails} emails, ${megabytes(probe.bytes)} MB, ${probe.groups} groups; ${probe.sent} sent, ` +
52
+ `${probe.withoutHeaders} without readable headers; ${probe.seconds}s`,
53
+ line(header),
54
+ ...rows.map(line),
55
+ ].join("\n");
56
+ };
57
+ export const mailCommand = (program, streams, env) => {
58
+ const print = printing(streams);
59
+ const mail = program.command("mail").description("look at a mail account before importing it, and the owner's rules");
60
+ mail
61
+ .command("probe")
62
+ .description("group an account's mail by sender and list, to decide what to keep or skip")
63
+ .argument("<account>", "the account's name in mail.accounts, or its address")
64
+ .option("--since-time <time>", "only mail from this time, ISO 8601 or 30d ago (default: all mail)")
65
+ .option("--limit-groups <n>", "show this many of the largest groups", positive, 50)
66
+ .option("--json", "print JSON")
67
+ .addHelpText("after", "\nRead-only and headers only: about 300 bytes per email (From, To, Cc, List-Id, List-Unsubscribe, " +
68
+ "Precedence), against Gmail's daily download limit. An mbox account reads the whole file once.\n\n" +
69
+ `Each group's ${SUGGEST_RULE}. The owner decides; add a rule with memo mail rules add.`)
70
+ .action(async (name, options) => {
71
+ const account = accountOf(loadConfig(env), name);
72
+ const since = new Date(options.sinceTime === undefined
73
+ ? 0
74
+ : (await import("@wirecat/cli-core/cli")).momentOf(options.sinceTime, "--since-time"));
75
+ const started = Date.now();
76
+ const source = mailSource(account, env);
77
+ const listed = new Map();
78
+ for (const folder of mailFolders(account))
79
+ for (const item of await source.list(since, folder, { headers: true }))
80
+ listed.set(item.messageId, item);
81
+ const probe = { ...probeMail([...listed.values()], options.limitGroups), seconds: 0 };
82
+ probe.seconds = Math.round((Date.now() - started) / 100) / 10;
83
+ print(options.json, probe, probeText(probe));
84
+ });
85
+ const rules = mail
86
+ .command("rules")
87
+ .description("the owner's decisions on which mail to skip or keep, by sender, domain or list");
88
+ rules
89
+ .command("list")
90
+ .description("one account's rules")
91
+ .argument("<account>", "the account's name in mail.accounts, or its address")
92
+ .option("--json", "print JSON")
93
+ .action((name, options) => {
94
+ const items = accountOf(loadConfig(env), name).rules ?? [];
95
+ print(options.json, { items }, items.map(ruleLine).join("\n") || "no rules");
96
+ });
97
+ rules
98
+ .command("add")
99
+ .description("skip or keep mail by sender, domain or list; a repeated match replaces its rule")
100
+ .argument("<account>", "the account's name in mail.accounts, or its address")
101
+ .option("--from <address>", "one sender address")
102
+ .option("--domain <domain>", "a sender domain, and its subdomains")
103
+ .option("--list-id <id>", "a mailing list, by its List-Id")
104
+ .option("--skip", "never import this mail")
105
+ .option("--keep", "import this mail even when a skip rule matches it")
106
+ .option("--reason <text>", "why, for the owner later")
107
+ .option("--json", "print JSON")
108
+ .addHelpText("after", "\nA keep wins over a skip, so --keep --from one sender overrides --skip --domain of its domain. " +
109
+ "A skipped email is never read or stored by memo sync; mail already stored stays.")
110
+ .action((name, options) => {
111
+ const match = matchOf(options);
112
+ if (Boolean(options.skip) === Boolean(options.keep))
113
+ throw new CliError("validation_error", "give exactly one of --skip, --keep");
114
+ const rule = {
115
+ match,
116
+ action: options.skip ? "skip" : "keep",
117
+ ...(options.reason === undefined ? {} : { reason: options.reason }),
118
+ decidedAt: new Date().toISOString(),
119
+ };
120
+ changeRules(env, name, (current) => [...current.filter((each) => !sameMatch(each.match, match)), rule]);
121
+ print(options.json, rule, ruleLine(rule));
122
+ });
123
+ rules
124
+ .command("remove")
125
+ .description("drop the rule for a sender, domain or list")
126
+ .argument("<account>", "the account's name in mail.accounts, or its address")
127
+ .option("--from <address>", "one sender address")
128
+ .option("--domain <domain>", "a sender domain")
129
+ .option("--list-id <id>", "a mailing list, by its List-Id")
130
+ .option("--json", "print JSON")
131
+ .action((name, options) => {
132
+ const match = matchOf(options);
133
+ if (!(accountOf(loadConfig(env), name).rules ?? []).some((rule) => sameMatch(rule.match, match)))
134
+ throw new CliError("not_found", `no rule for ${describe(match)}; memo mail rules list ${name} shows them`);
135
+ const left = changeRules(env, name, (current) => current.filter((rule) => !sameMatch(rule.match, match)));
136
+ print(options.json, { removed: match, items: left }, `removed the rule for ${describe(match)}`);
137
+ });
138
+ };
139
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/mail/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAgB,MAAM,mBAAmB,CAAA;AAE1D,OAAO,EAAe,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAA0B,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC7F,OAAO,EAAc,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAChE,OAAO,EAAqC,SAAS,EAAE,MAAM,YAAY,CAAA;AASzE,MAAM,SAAS,GAAG,CAAC,MAAc,EAAE,IAAY,EAAqB,EAAE,CACpE,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAsB,CAAA;AAE3E,MAAM,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAgB,EAAiB,EAAE;IACxE,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAA;IAC3E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,iDAAiD,CAAC,CAAA;IACjH,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAgB,EAAE,CAAA;AACzG,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,KAAoB,EAAU,EAAE,CAChD,KAAK,CAAC,IAAI,KAAK,SAAS;IACtB,CAAC,CAAC,QAAQ,KAAK,CAAC,IAAI,EAAE;IACtB,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS;QAC1B,CAAC,CAAC,UAAU,KAAK,CAAC,MAAM,EAAE;QAC1B,CAAC,CAAC,WAAW,KAAK,CAAC,MAAM,EAAE,CAAA;AAEjC,MAAM,QAAQ,GAAG,CAAC,IAAc,EAAU,EAAE,CAC1C,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAA;AAEpH,MAAM,WAAW,GAAG,CAAC,GAAsB,EAAE,IAAY,EAAE,MAAyC,EAAc,EAAE;IAClH,IAAI,OAAO,GAAe,EAAE,CAAA;IAC5B,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE;QACtB,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QACvC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;QACrC,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC1D,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CACtD,CAAA;QACD,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAA;IAC1D,CAAC,EAAE,GAAG,CAAC,CAAA;IACP,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AACrE,MAAM,OAAO,GAAG,CAAC,KAAoB,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;AAEhG,MAAM,SAAS,GAAG,CAAC,KAAkC,EAAU,EAAE;IAC/D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QACpB,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;QACnB,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,EAAE;QACrG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QAC5B,KAAK,CAAC,OAAO,IAAI,EAAE;QACnB,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,IAAI,GAAG,GAAG;KACtF,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAA;IAClG,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IACpH,MAAM,IAAI,GAAG,CAAC,GAAa,EAAE,EAAE,CAC7B,GAAG;SACA,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAC3G,IAAI,CAAC,IAAI,CAAC;SACV,OAAO,EAAE,CAAA;IACd,OAAO;QACL,GAAG,KAAK,CAAC,MAAM,YAAY,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,IAAI,SAAS;YAClG,GAAG,KAAK,CAAC,cAAc,8BAA8B,KAAK,CAAC,OAAO,GAAG;QACvE,IAAI,CAAC,MAAM,CAAC;QACZ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;KAClB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAgB,EAAE,OAAgB,EAAE,GAAsB,EAAQ,EAAE;IAC9F,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,mEAAmE,CAAC,CAAA;IAErH,IAAI;SACD,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,4EAA4E,CAAC;SACzF,QAAQ,CAAC,WAAW,EAAE,qDAAqD,CAAC;SAC5E,MAAM,CAAC,qBAAqB,EAAE,mEAAmE,CAAC;SAClG,MAAM,CAAC,oBAAoB,EAAE,sCAAsC,EAAE,QAAQ,EAAE,EAAE,CAAC;SAClF,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC;SAC9B,WAAW,CACV,OAAO,EACP,oGAAoG;QAClG,mGAAmG;QACnG,gBAAgB,YAAY,2DAA2D,CAC1F;SACA,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAoE,EAAE,EAAE;QACnG,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;QAChD,MAAM,KAAK,GAAG,IAAI,IAAI,CACpB,OAAO,CAAC,SAAS,KAAK,SAAS;YAC7B,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,CACxF,CAAA;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC1B,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACvC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;QACxC,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC;YACvC,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QAC1G,MAAM,KAAK,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAA;QACrF,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,CAAA;QAC7D,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEJ,MAAM,KAAK,GAAG,IAAI;SACf,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,gFAAgF,CAAC,CAAA;IAEhG,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qBAAqB,CAAC;SAClC,QAAQ,CAAC,WAAW,EAAE,qDAAqD,CAAC;SAC5E,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC;SAC9B,MAAM,CAAC,CAAC,IAAY,EAAE,OAA2B,EAAE,EAAE;QACpD,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAA;QAC1D,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEJ,KAAK;SACF,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,iFAAiF,CAAC;SAC9F,QAAQ,CAAC,WAAW,EAAE,qDAAqD,CAAC;SAC5E,MAAM,CAAC,kBAAkB,EAAE,oBAAoB,CAAC;SAChD,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,CAAC;SAClE,MAAM,CAAC,gBAAgB,EAAE,gCAAgC,CAAC;SAC1D,MAAM,CAAC,QAAQ,EAAE,wBAAwB,CAAC;SAC1C,MAAM,CAAC,QAAQ,EAAE,mDAAmD,CAAC;SACrE,MAAM,CAAC,iBAAiB,EAAE,0BAA0B,CAAC;SACrD,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC;SAC9B,WAAW,CACV,OAAO,EACP,kGAAkG;QAChG,kFAAkF,CACrF;SACA,MAAM,CACL,CAAC,IAAY,EAAE,OAA2F,EAAE,EAAE;QAC5G,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAC9B,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;YACjD,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,oCAAoC,CAAC,CAAA;QAC9E,MAAM,IAAI,GAAa;YACrB,KAAK;YACL,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YACtC,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;YACnE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAA;QACD,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAA;QACvG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3C,CAAC,CACF,CAAA;IAEH,KAAK;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4CAA4C,CAAC;SACzD,QAAQ,CAAC,WAAW,EAAE,qDAAqD,CAAC;SAC5E,MAAM,CAAC,kBAAkB,EAAE,oBAAoB,CAAC;SAChD,MAAM,CAAC,mBAAmB,EAAE,iBAAiB,CAAC;SAC9C,MAAM,CAAC,gBAAgB,EAAE,gCAAgC,CAAC;SAC1D,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC;SAC9B,MAAM,CAAC,CAAC,IAAY,EAAE,OAA0C,EAAE,EAAE;QACnE,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAC9B,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9F,MAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,eAAe,QAAQ,CAAC,KAAK,CAAC,0BAA0B,IAAI,aAAa,CAAC,CAAA;QAC5G,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;QACzG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,wBAAwB,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACjG,CAAC,CAAC,CAAA;AACN,CAAC,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { type MailHeaders } from "./headers.js";
1
2
  import type { Himalaya } from "./himalaya.js";
2
3
  export interface Listed {
3
4
  uid: string;
@@ -6,21 +7,25 @@ export interface Listed {
6
7
  threadId: string;
7
8
  receivedAt: string;
8
9
  folder?: string;
9
- scopeFolder?: string;
10
10
  /** Gmail labels, plain names; absent when the answer could not be read, so nothing is changed. */
11
11
  labels?: string[];
12
12
  seen?: boolean;
13
13
  flagged?: boolean;
14
+ /** RFC822.SIZE in bytes, to size fetch batches. */
15
+ size?: number;
16
+ /** Read only when asked for; absent when not asked or unreadable, so no rule applies to it. */
17
+ headers?: MailHeaders;
14
18
  }
15
19
  /** IMAP's modified UTF-7 (RFC 3501 §5.1.3): `&` opens base64 of UTF-16BE, `,` stands for `/`, `-` closes. */
16
20
  export declare const decodeMailboxName: (name: string) => string;
21
+ export declare const systemLabel: (name: string) => string;
17
22
  /** A label as people read it: `\\Important` and `Important` are one label, and names are decoded. */
18
23
  export declare const labelName: (raw: string) => string;
19
24
  /**
20
25
  * Every message in All Mail received since `since`, read with EXAMINE so nothing can change a flag.
21
26
  * All Mail rather than INBOX: an archived message leaves INBOX but is not deleted.
22
27
  */
23
- export declare const listAllMail: (run: Himalaya, account: string, since: Date, folder?: string) => Promise<Listed[]>;
28
+ export declare const listAllMail: (run: Himalaya, account: string, since: Date, folder?: string, headers?: boolean) => Promise<Listed[]>;
24
29
  /** Message-ID is stable across folders; absent headers fall back to a UIDVALIDITY-scoped identity. */
25
30
  export declare const listImapMail: (run: Himalaya, account: string, since: Date, folder: string) => Promise<Listed[]>;
26
31
  //# sourceMappingURL=gmail.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gmail.d.ts","sourceRoot":"","sources":["../../src/mail/gmail.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kGAAkG;IAClG,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAcD,6GAA6G;AAC7G,eAAO,MAAM,iBAAiB,SAAU,MAAM,KAAG,MAO7C,CAAA;AA2BJ,qGAAqG;AACrG,eAAO,MAAM,SAAS,QAAS,MAAM,KAAG,MAGvC,CAAA;AAkCD;;;GAGG;AACH,eAAO,MAAM,WAAW,QACjB,QAAQ,WACJ,MAAM,SACR,IAAI,sBAEV,OAAO,CAAC,MAAM,EAAE,CAwDlB,CAAA;AAED,sGAAsG;AACtG,eAAO,MAAM,YAAY,QAAe,QAAQ,WAAW,MAAM,SAAS,IAAI,UAAU,MAAM,KAAG,OAAO,CAAC,MAAM,EAAE,CA2DhH,CAAA"}
1
+ {"version":3,"file":"gmail.d.ts","sourceRoot":"","sources":["../../src/mail/gmail.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,cAAc,CAAA;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kGAAkG;IAClG,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+FAA+F;IAC/F,OAAO,CAAC,EAAE,WAAW,CAAA;CACtB;AAcD,6GAA6G;AAC7G,eAAO,MAAM,iBAAiB,SAAU,MAAM,KAAG,MAO7C,CAAA;AA2BJ,eAAO,MAAM,WAAW,SAAU,MAAM,KAAG,MAAmD,CAAA;AAE9F,qGAAqG;AACrG,eAAO,MAAM,SAAS,QAAS,MAAM,KAAG,MAGvC,CAAA;AAmDD;;;GAGG;AACH,eAAO,MAAM,WAAW,QACjB,QAAQ,WACJ,MAAM,SACR,IAAI,yCAGV,OAAO,CAAC,MAAM,EAAE,CA6ElB,CAAA;AAED,sGAAsG;AACtG,eAAO,MAAM,YAAY,QAAe,QAAQ,WAAW,MAAM,SAAS,IAAI,UAAU,MAAM,KAAG,OAAO,CAAC,MAAM,EAAE,CA8DhH,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { CliError } from "@wirecat/cli-base";
3
+ import { HEADER_FIELDS, headersOf } from "./headers.js";
3
4
  const SYSTEM_LABELS = {
4
5
  inbox: "Inbox",
5
6
  sent: "Sent",
@@ -52,13 +53,29 @@ const imapList = (items, name) => {
52
53
  }
53
54
  return undefined;
54
55
  };
56
+ export const systemLabel = (name) => SYSTEM_LABELS[name.toLowerCase()] ?? name;
55
57
  /** A label as people read it: `\\Important` and `Important` are one label, and names are decoded. */
56
58
  export const labelName = (raw) => {
57
59
  const system = raw.startsWith("\\") ? raw.slice(1) : raw;
58
60
  return SYSTEM_LABELS[system.toLowerCase()] ?? decodeMailboxName(system);
59
61
  };
62
+ /** One FETCH answer per email, across lines, since a header field comes back as a multi-line literal. */
63
+ const FETCH_ANSWERS = /^\* \d+ FETCH \(([\s\S]*?)(?=^\* \d+ FETCH|^[a-z]\d* (?:OK|NO|BAD)|$(?![\s\S]))/gm;
64
+ /** Each answer's UID and header text; the UID is looked for outside the literal, so a header cannot fake it. */
65
+ const fetchedHeaders = (output) => [...output.matchAll(FETCH_ANSWERS)].flatMap(([, fields = ""]) => {
66
+ const literal = /\{\d+\}\r?\n/.exec(fields);
67
+ if (literal === null)
68
+ return [];
69
+ const start = literal.index + literal[0].length;
70
+ const blank = fields.slice(start).search(/\r?\n\r?\n/);
71
+ const end = blank === -1 ? fields.length : start + blank;
72
+ const uid = /(?:^|\s)UID (\d+)/.exec(`${fields.slice(0, literal.index)} ${fields.slice(end)}`)?.[1];
73
+ return uid === undefined ? [] : [[uid, fields.slice(start, end)]];
74
+ });
60
75
  const MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
61
76
  const FETCH_BATCH = 500;
77
+ /** One himalaya call reads its whole answer into memory, so a mailbox of 300,000+ emails is listed in parts. */
78
+ const CALL_UIDS = 10_000;
62
79
  const imapDate = (day) => `${day.getUTCDate()}-${MONTHS[day.getUTCMonth()]}-${day.getUTCFullYear()}`;
63
80
  /** IMAP's `INTERNALDATE`: `"04-Oct-2026 19:51:09 +0000"`. */
64
81
  const isoOf = (internal) => {
@@ -83,7 +100,7 @@ const assertCompleted = (output, tags) => {
83
100
  * Every message in All Mail received since `since`, read with EXAMINE so nothing can change a flag.
84
101
  * All Mail rather than INBOX: an archived message leaves INBOX but is not deleted.
85
102
  */
86
- export const listAllMail = async (run, account, since, folder = "[Gmail]/All Mail") => {
103
+ export const listAllMail = async (run, account, since, folder = "[Gmail]/All Mail", headers = false) => {
87
104
  if (/[\r\n]/.test(folder) || folder.includes(String.fromCharCode(0)))
88
105
  throw new CliError("validation_error", "invalid mailbox name");
89
106
  const mailbox = JSON.stringify(folder);
@@ -92,43 +109,62 @@ export const listAllMail = async (run, account, since, folder = "[Gmail]/All Mai
92
109
  const uids = (/^\* SEARCH(.*)$/m.exec(search)?.[1] ?? "").trim().split(/\s+/).filter(Boolean);
93
110
  if (uids.length === 0)
94
111
  return [];
95
- const batches = [];
96
- for (let start = 0; start < uids.length; start += FETCH_BATCH)
97
- batches.push(uids.slice(start, start + FETCH_BATCH).join(","));
98
- const tags = batches.map((_, index) => `f${index}`);
99
- const fetched = await run(["imap", "raw", "-a", account], `a EXAMINE ${mailbox}\r\n${batches
100
- .map((set, index) => `${tags[index]} UID FETCH ${set} (UID X-GM-MSGID X-GM-THRID INTERNALDATE)\r\n`)
101
- .join("")}`);
102
- assertCompleted(fetched, ["a", ...tags]);
103
- const listed = [...fetched.matchAll(/^\* \d+ FETCH \((.*)\)\s*$/gm)].map(([, items = ""]) => {
104
- const item = (name) => new RegExp(`${name} (\\d+)`).exec(items)?.[1];
105
- const internal = /INTERNALDATE "([^"]+)"/.exec(items)?.[1];
106
- const uid = item("UID");
107
- const messageId = item("X-GM-MSGID");
108
- const threadId = item("X-GM-THRID");
109
- if (!uid || !messageId || !threadId || !internal)
110
- throw new CliError("invalid_response", `IMAP FETCH answer without the Gmail ids: ${items}`);
111
- return { uid, messageId, threadId, receivedAt: isoOf(internal) };
112
- });
113
- if (listed.length !== uids.length)
114
- throw new CliError("invalid_response", `IMAP listed ${uids.length} messages but fetched ${listed.length}`);
115
- // A separate answer, so a label the parser cannot read costs that message its labels, never the listing.
116
- const labelled = await run(["imap", "raw", "-a", account], `a EXAMINE ${mailbox}\r\n${batches
117
- .map((set, index) => `l${index} UID FETCH ${set} (UID X-GM-LABELS FLAGS)\r\n`)
118
- .join("")}`);
112
+ const listed = [];
119
113
  const marks = new Map();
120
- for (const [, items = ""] of labelled.matchAll(/^\* \d+ FETCH \((.*)\)\s*$/gm)) {
121
- const uid = /(?:^|\s)UID (\d+)/.exec(items)?.[1];
122
- const labels = imapList(items, "X-GM-LABELS");
123
- const flags = imapList(items, "FLAGS");
124
- if (!uid || labels === undefined || flags === undefined)
125
- continue;
126
- const flagged = flags.includes("\\Flagged");
127
- const names = new Set(labels.map(labelName));
128
- if (flagged)
129
- names.add("Starred");
130
- marks.set(uid, { labels: [...names].sort(), seen: flags.includes("\\Seen"), flagged });
114
+ for (let from = 0; from < uids.length; from += CALL_UIDS) {
115
+ const batches = [];
116
+ for (let start = from; start < Math.min(from + CALL_UIDS, uids.length); start += FETCH_BATCH)
117
+ batches.push(uids.slice(start, start + FETCH_BATCH).join(","));
118
+ const tags = batches.map((_, index) => `f${index}`);
119
+ const fetched = await run(["imap", "raw", "-a", account], `a EXAMINE ${mailbox}\r\n${batches
120
+ .map((set, index) => `${tags[index]} UID FETCH ${set} (UID X-GM-MSGID X-GM-THRID INTERNALDATE RFC822.SIZE)\r\n`)
121
+ .join("")}`);
122
+ assertCompleted(fetched, ["a", ...tags]);
123
+ for (const [, items = ""] of fetched.matchAll(/^\* \d+ FETCH \((.*)\)\s*$/gm)) {
124
+ const item = (name) => new RegExp(`${name} (\\d+)`).exec(items)?.[1];
125
+ const internal = /INTERNALDATE "([^"]+)"/.exec(items)?.[1];
126
+ const uid = item("UID");
127
+ const messageId = item("X-GM-MSGID");
128
+ const threadId = item("X-GM-THRID");
129
+ const size = item("RFC822\\.SIZE");
130
+ if (!uid || !messageId || !threadId || !internal)
131
+ throw new CliError("invalid_response", `IMAP FETCH answer without the Gmail ids: ${items}`);
132
+ listed.push({
133
+ uid,
134
+ messageId,
135
+ threadId,
136
+ receivedAt: isoOf(internal),
137
+ ...(size === undefined ? {} : { size: Number(size) }),
138
+ });
139
+ }
140
+ // A separate answer, so a label the parser cannot read costs that message its labels, never the listing.
141
+ const labelled = await run(["imap", "raw", "-a", account], `a EXAMINE ${mailbox}\r\n${batches
142
+ .map((set, index) => `l${index} UID FETCH ${set} (UID X-GM-LABELS FLAGS)\r\n`)
143
+ .join("")}`);
144
+ for (const [, items = ""] of labelled.matchAll(/^\* \d+ FETCH \((.*)\)\s*$/gm)) {
145
+ const uid = /(?:^|\s)UID (\d+)/.exec(items)?.[1];
146
+ const labels = imapList(items, "X-GM-LABELS");
147
+ const flags = imapList(items, "FLAGS");
148
+ if (!uid || labels === undefined || flags === undefined)
149
+ continue;
150
+ const flagged = flags.includes("\\Flagged");
151
+ const names = new Set(labels.map(labelName));
152
+ if (flagged)
153
+ names.add("Starred");
154
+ marks.set(uid, { labels: [...names].sort(), seen: flags.includes("\\Seen"), flagged });
155
+ }
156
+ if (headers) {
157
+ const headed = await run(["imap", "raw", "-a", account], `a EXAMINE ${mailbox}\r\n${batches
158
+ .map((set, index) => `h${index} UID FETCH ${set} (UID BODY.PEEK[HEADER.FIELDS (${HEADER_FIELDS})])\r\n`)
159
+ .join("")}`);
160
+ // A refused fetch would leave a whole batch without headers, and rules would not keep its mail out.
161
+ assertCompleted(headed, ["a", ...batches.map((_, index) => `h${index}`)]);
162
+ for (const [uid, text] of fetchedHeaders(headed))
163
+ marks.set(uid, { ...marks.get(uid), headers: headersOf(text) });
164
+ }
131
165
  }
166
+ if (listed.length !== uids.length)
167
+ throw new CliError("invalid_response", `IMAP listed ${uids.length} messages but fetched ${listed.length}`);
132
168
  return listed.map((item) => ({ ...item, ...marks.get(item.uid) }));
133
169
  };
134
170
  /** Message-ID is stable across folders; absent headers fall back to a UIDVALIDITY-scoped identity. */
@@ -149,7 +185,7 @@ export const listImapMail = async (run, account, since, folder) => {
149
185
  for (let start = 0; start < uids.length; start += FETCH_BATCH) {
150
186
  const batch = uids.slice(start, start + FETCH_BATCH);
151
187
  const before = listed.length;
152
- const output = await run(["imap", "raw", "-a", account], `a EXAMINE ${mailbox}\r\nf UID FETCH ${batch.join(",")} (UID FLAGS INTERNALDATE BODY.PEEK[HEADER.FIELDS (MESSAGE-ID REFERENCES IN-REPLY-TO)])\r\n`);
188
+ 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`);
153
189
  assertCompleted(output, ["a", "f"]);
154
190
  for (const match of output.matchAll(/^\* \d+ FETCH \(([\s\S]*?)(?=^\* \d+ FETCH|^[af] (?:OK|NO|BAD)|$(?![\s\S]))/gm)) {
155
191
  const fields = match[1] ?? "", uid = /(?:^|\s)UID (\d+)/.exec(fields)?.[1], internal = /INTERNALDATE "([^"]+)"/.exec(fields)?.[1];
@@ -161,12 +197,15 @@ export const listImapMail = async (run, account, since, folder) => {
161
197
  const parent = /^In-Reply-To:\s*(<[^>]+>)/im.exec(unfolded)?.[1];
162
198
  const identity = messageId ?? `uid:${folder}:${validity}:${uid}`;
163
199
  const flags = imapList(fields, "FLAGS");
200
+ const size = /RFC822\.SIZE (\d+)/.exec(fields)?.[1];
164
201
  listed.push({
165
202
  uid,
203
+ ...(size === undefined ? {} : { size: Number(size) }),
166
204
  messageId: digest(identity),
167
205
  threadId: digest(refs?.[0] ?? parent ?? identity),
168
206
  receivedAt: isoOf(internal),
169
207
  folder,
208
+ headers: headersOf(unfolded),
170
209
  // IMAP has no labels; a flagged message is Starred, as in Gmail, so one search finds both.
171
210
  ...(flags === undefined
172
211
  ? {}
@@ -1 +1 @@
1
- {"version":3,"file":"gmail.js","sourceRoot":"","sources":["../../src/mail/gmail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAiB5C,MAAM,aAAa,GAA2B;IAC5C,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,QAAQ;IACf,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;CACb,CAAA;AAED,6GAA6G;AAC7G,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAU,EAAE,CACxD,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE;IAC5C,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,GAAG,CAAA;IAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAA;IAC3D,IAAI,IAAI,GAAG,EAAE,CAAA;IACb,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC;QAAE,IAAI,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAA;IACpG,OAAO,IAAI,CAAA;AACb,CAAC,CAAC,CAAA;AAEJ,yGAAyG;AACzG,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,IAAY,EAAwB,EAAE;IACrE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,CAAA;IACxC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IAClC,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,KAAK,IAAI,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,GAAI,CAAC;QAC3D,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAA;QACnB,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,MAAM,CAAA;QAC5B,IAAI,CAAC,KAAK,GAAG;YAAE,EAAE,EAAE,CAAA;aACd,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,SAAS,CAAA;aAC/B,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACnB,IAAI,KAAK,GAAG,EAAE,CAAA;YACd,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,GAAG,EAAE,EAAE,EAAE;gBAAE,KAAK,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YAC9G,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClB,EAAE,EAAE,CAAA;QACN,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAC1C,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE,OAAO,SAAS,CAAA;YAChC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;YACtC,EAAE,IAAI,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,qGAAqG;AACrG,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,GAAW,EAAU,EAAE;IAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;IACxD,OAAO,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAA;AACzE,CAAC,CAAA;AAED,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AACnG,MAAM,WAAW,GAAG,GAAG,CAAA;AAEvB,MAAM,QAAQ,GAAG,CAAC,GAAS,EAAU,EAAE,CAAC,GAAG,GAAG,CAAC,UAAU,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,GAAG,CAAC,cAAc,EAAE,EAAE,CAAA;AAElH,6DAA6D;AAC7D,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAU,EAAE;IACzC,MAAM,KAAK,GAAG,6EAA6E,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC1G,IAAI,KAAK,KAAK,IAAI;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,yBAAyB,QAAQ,GAAG,CAAC,CAAA;IAChG,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,GAAG,KAAK,CAAA;IAC1F,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,MAAM,CAAC,IAAI,CAAC,EACZ,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,EAC3B,MAAM,CAAC,GAAG,CAAC,EACX,MAAM,CAAC,IAAI,CAAC,EACZ,MAAM,CAAC,MAAM,CAAC,EACd,MAAM,CAAC,MAAM,CAAC,CACf,CAAA;IACD,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACpG,OAAO,IAAI,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;AAC/C,CAAC,CAAA;AAED,6FAA6F;AAC7F,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,IAAc,EAAQ,EAAE;IAC/D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,WAAW,CAAA;YAC5F,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,sBAAsB,IAAI,EAAE,CAAC,CAAA;QACvF,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAC9B,GAAa,EACb,OAAe,EACf,KAAW,EACX,MAAM,GAAG,kBAAkB,EACR,EAAE;IACrB,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAA;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACtC,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,EAC9B,aAAa,OAAO,0BAA0B,QAAQ,CAAC,KAAK,CAAC,MAAM,CACpE,CAAA;IACD,eAAe,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;IACnC,MAAM,IAAI,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC7F,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEhC,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,WAAW;QAC3D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IAChE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAA;IACnD,MAAM,OAAO,GAAG,MAAM,GAAG,CACvB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,EAC9B,aAAa,OAAO,OAAO,OAAO;SAC/B,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,+CAA+C,CAAC;SACnG,IAAI,CAAC,EAAE,CAAC,EAAE,CACd,CAAA;IACD,eAAe,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;IAExC,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE;QAC1F,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC5E,MAAM,QAAQ,GAAG,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;QACnC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;YAC9C,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,4CAA4C,KAAK,EAAE,CAAC,CAAA;QAC7F,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAA;IAClE,CAAC,CAAC,CAAA;IACF,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAC/B,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,eAAe,IAAI,CAAC,MAAM,yBAAyB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;IAE5G,yGAAyG;IACzG,MAAM,QAAQ,GAAG,MAAM,GAAG,CACxB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,EAC9B,aAAa,OAAO,OAAO,OAAO;SAC/B,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,cAAc,GAAG,8BAA8B,CAAC;SAC7E,IAAI,CAAC,EAAE,CAAC,EAAE,CACd,CAAA;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuD,CAAA;IAC5E,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE,CAAC;QAC/E,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,CAAA;QAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACtC,IAAI,CAAC,GAAG,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;YAAE,SAAQ;QACjE,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;QAC3C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;QAC5C,IAAI,OAAO;YAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACjC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IACxF,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;AACpE,CAAC,CAAA;AAED,sGAAsG;AACtG,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,GAAa,EAAE,OAAe,EAAE,KAAW,EAAE,MAAc,EAAqB,EAAE;IACnH,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAA;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACtC,MAAM,QAAQ,GAAG,MAAM,GAAG,CACxB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,EAC9B,aAAa,OAAO,0BAA0B,QAAQ,CAAC,KAAK,CAAC,MAAM,CACpE,CAAA;IACD,eAAe,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;IACrC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC5D,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,iCAAiC,CAAC,CAAA;IACxF,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAC7G,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,0BAA0B,CAAC,CAAA;IAC/G,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,QAAQ,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;IACtF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,WAAW,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,CAAC,CAAA;QACpD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;QAC5B,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,EAC9B,aAAa,OAAO,mBAAmB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,4FAA4F,CACnJ,CAAA;QACD,eAAe,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;QACnC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,CACjC,+EAA+E,CAChF,EAAE,CAAC;YACF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAC3B,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAC3C,QAAQ,GAAG,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACvD,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,0BAA0B,CAAC,CAAA;YACjH,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAA;YACpD,MAAM,SAAS,GAAG,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAA;YACtE,MAAM,IAAI,GAAG,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;YAC5E,MAAM,MAAM,GAAG,6BAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAChE,MAAM,QAAQ,GAAG,SAAS,IAAI,OAAO,MAAM,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAA;YAChE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YACvC,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG;gBACH,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC;gBAC3B,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,QAAQ,CAAC;gBACjD,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC;gBAC3B,MAAM;gBACN,2FAA2F;gBAC3F,GAAG,CAAC,KAAK,KAAK,SAAS;oBACrB,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC;wBACE,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;wBACtD,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;wBAC9B,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;qBACrC,CAAC;aACP,CAAC,CAAA;QACJ,CAAC;QACD,IACE,MAAM,CAAC,MAAM,GAAG,MAAM,KAAK,KAAK,CAAC,MAAM;YACvC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM;YAE3E,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,oEAAoE,CAAC,CAAA;IAChH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
1
+ {"version":3,"file":"gmail.js","sourceRoot":"","sources":["../../src/mail/gmail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,SAAS,EAAoB,MAAM,cAAc,CAAA;AAoBzE,MAAM,aAAa,GAA2B;IAC5C,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,QAAQ;IACf,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;CACb,CAAA;AAED,6GAA6G;AAC7G,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAU,EAAE,CACxD,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE;IAC5C,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,GAAG,CAAA;IAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAA;IAC3D,IAAI,IAAI,GAAG,EAAE,CAAA;IACb,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC;QAAE,IAAI,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAA;IACpG,OAAO,IAAI,CAAA;AACb,CAAC,CAAC,CAAA;AAEJ,yGAAyG;AACzG,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,IAAY,EAAwB,EAAE;IACrE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,CAAA;IACxC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IAClC,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,KAAK,IAAI,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,GAAI,CAAC;QAC3D,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAA;QACnB,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,MAAM,CAAA;QAC5B,IAAI,CAAC,KAAK,GAAG;YAAE,EAAE,EAAE,CAAA;aACd,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,SAAS,CAAA;aAC/B,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACnB,IAAI,KAAK,GAAG,EAAE,CAAA;YACd,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,GAAG,EAAE,EAAE,EAAE;gBAAE,KAAK,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YAC9G,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClB,EAAE,EAAE,CAAA;QACN,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAC1C,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE,OAAO,SAAS,CAAA;YAChC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;YACtC,EAAE,IAAI,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAA;AAE9F,qGAAqG;AACrG,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,GAAW,EAAU,EAAE;IAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;IACxD,OAAO,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAA;AACzE,CAAC,CAAA;AAED,yGAAyG;AACzG,MAAM,aAAa,GAAG,mFAAmF,CAAA;AAEzG,gHAAgH;AAChH,MAAM,cAAc,GAAG,CAAC,MAAc,EAAsB,EAAE,CAC5D,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,EAAE;IAC9D,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC3C,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,CAAA;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IACtD,MAAM,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAA;IACxD,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACnG,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAqB,CAAC,CAAA;AACvF,CAAC,CAAC,CAAA;AAEJ,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AACnG,MAAM,WAAW,GAAG,GAAG,CAAA;AACvB,gHAAgH;AAChH,MAAM,SAAS,GAAG,MAAM,CAAA;AAExB,MAAM,QAAQ,GAAG,CAAC,GAAS,EAAU,EAAE,CAAC,GAAG,GAAG,CAAC,UAAU,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,GAAG,CAAC,cAAc,EAAE,EAAE,CAAA;AAElH,6DAA6D;AAC7D,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAU,EAAE;IACzC,MAAM,KAAK,GAAG,6EAA6E,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC1G,IAAI,KAAK,KAAK,IAAI;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,yBAAyB,QAAQ,GAAG,CAAC,CAAA;IAChG,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,GAAG,KAAK,CAAA;IAC1F,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,MAAM,CAAC,IAAI,CAAC,EACZ,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,EAC3B,MAAM,CAAC,GAAG,CAAC,EACX,MAAM,CAAC,IAAI,CAAC,EACZ,MAAM,CAAC,MAAM,CAAC,EACd,MAAM,CAAC,MAAM,CAAC,CACf,CAAA;IACD,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACpG,OAAO,IAAI,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;AAC/C,CAAC,CAAA;AAED,6FAA6F;AAC7F,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,IAAc,EAAQ,EAAE;IAC/D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,WAAW,CAAA;YAC5F,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,sBAAsB,IAAI,EAAE,CAAC,CAAA;QACvF,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAC9B,GAAa,EACb,OAAe,EACf,KAAW,EACX,MAAM,GAAG,kBAAkB,EAC3B,OAAO,GAAG,KAAK,EACI,EAAE;IACrB,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAA;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACtC,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,EAC9B,aAAa,OAAO,0BAA0B,QAAQ,CAAC,KAAK,CAAC,MAAM,CACpE,CAAA;IACD,eAAe,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;IACnC,MAAM,IAAI,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC7F,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEhC,MAAM,MAAM,GAAkD,EAAE,CAAA;IAChE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmE,CAAA;IACxF,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,SAAS,EAAE,CAAC;QACzD,MAAM,OAAO,GAAa,EAAE,CAAA;QAC5B,KAAK,IAAI,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,WAAW;YAC1F,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAChE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAA;QACnD,MAAM,OAAO,GAAG,MAAM,GAAG,CACvB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,EAC9B,aAAa,OAAO,OAAO,OAAO;aAC/B,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,2DAA2D,CAAC;aAC/G,IAAI,CAAC,EAAE,CAAC,EAAE,CACd,CAAA;QACD,eAAe,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;QACxC,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE,CAAC;YAC9E,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAC5E,MAAM,QAAQ,GAAG,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;YACvB,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;YACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,CAAA;YAClC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;gBAC9C,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,4CAA4C,KAAK,EAAE,CAAC,CAAA;YAC7F,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG;gBACH,SAAS;gBACT,QAAQ;gBACR,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC;gBAC3B,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;aACtD,CAAC,CAAA;QACJ,CAAC;QAED,yGAAyG;QACzG,MAAM,QAAQ,GAAG,MAAM,GAAG,CACxB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,EAC9B,aAAa,OAAO,OAAO,OAAO;aAC/B,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,cAAc,GAAG,8BAA8B,CAAC;aAC7E,IAAI,CAAC,EAAE,CAAC,EAAE,CACd,CAAA;QACD,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE,CAAC;YAC/E,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,CAAA;YAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;YACtC,IAAI,CAAC,GAAG,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAQ;YACjE,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;YAC3C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;YAC5C,IAAI,OAAO;gBAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACjC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;QACxF,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,EAC9B,aAAa,OAAO,OAAO,OAAO;iBAC/B,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,cAAc,GAAG,kCAAkC,aAAa,SAAS,CAAC;iBACvG,IAAI,CAAC,EAAE,CAAC,EAAE,CACd,CAAA;YACD,oGAAoG;YACpG,eAAe,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;YACzE,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACnH,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAC/B,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,eAAe,IAAI,CAAC,MAAM,yBAAyB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;IAC5G,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;AACpE,CAAC,CAAA;AAED,sGAAsG;AACtG,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,GAAa,EAAE,OAAe,EAAE,KAAW,EAAE,MAAc,EAAqB,EAAE;IACnH,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAA;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACtC,MAAM,QAAQ,GAAG,MAAM,GAAG,CACxB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,EAC9B,aAAa,OAAO,0BAA0B,QAAQ,CAAC,KAAK,CAAC,MAAM,CACpE,CAAA;IACD,eAAe,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;IACrC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC5D,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,iCAAiC,CAAC,CAAA;IACxF,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAC7G,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,0BAA0B,CAAC,CAAA;IAC/G,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,QAAQ,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;IACtF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,WAAW,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,CAAC,CAAA;QACpD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;QAC5B,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,EAC9B,aAAa,OAAO,mBAAmB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,mGAAmG,aAAa,SAAS,CAChL,CAAA;QACD,eAAe,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;QACnC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,CACjC,+EAA+E,CAChF,EAAE,CAAC;YACF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAC3B,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAC3C,QAAQ,GAAG,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACvD,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,0BAA0B,CAAC,CAAA;YACjH,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAA;YACpD,MAAM,SAAS,GAAG,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAA;YACtE,MAAM,IAAI,GAAG,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;YAC5E,MAAM,MAAM,GAAG,6BAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAChE,MAAM,QAAQ,GAAG,SAAS,IAAI,OAAO,MAAM,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAA;YAChE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YACvC,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACnD,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG;gBACH,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrD,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC;gBAC3B,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,QAAQ,CAAC;gBACjD,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC;gBAC3B,MAAM;gBACN,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC;gBAC5B,2FAA2F;gBAC3F,GAAG,CAAC,KAAK,KAAK,SAAS;oBACrB,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC;wBACE,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;wBACtD,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;wBAC9B,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;qBACrC,CAAC;aACP,CAAC,CAAA;QACJ,CAAC;QACD,IACE,MAAM,CAAC,MAAM,GAAG,MAAM,KAAK,KAAK,CAAC,MAAM;YACvC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM;YAE3E,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,oEAAoE,CAAC,CAAA;IAChH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
@@ -0,0 +1,17 @@
1
+ /** The header fields memo reads at list time: enough to group mail by sender and apply the owner's rules. */
2
+ export declare const HEADER_FIELDS = "FROM TO CC LIST-ID LIST-UNSUBSCRIBE PRECEDENCE";
3
+ export interface MailHeaders {
4
+ /** The sender's address, lower case; absent when From holds none. */
5
+ from?: string;
6
+ /** To and Cc addresses, lower case. */
7
+ to: string[];
8
+ listId?: string;
9
+ /** List-Id, List-Unsubscribe or `Precedence: bulk|list|junk`: mail sent to many, not written to one. */
10
+ bulk: boolean;
11
+ }
12
+ export declare const unfold: (text: string) => string;
13
+ export declare const field: (unfolded: string, name: string) => string | undefined;
14
+ export declare const addressesOf: (value: string | undefined) => string[];
15
+ /** The header fields of one email, from its header text. */
16
+ export declare const headersOf: (text: string) => MailHeaders;
17
+ //# sourceMappingURL=headers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/mail/headers.ts"],"names":[],"mappings":"AAAA,6GAA6G;AAC7G,eAAO,MAAM,aAAa,mDAAmD,CAAA;AAE7E,MAAM,WAAW,WAAW;IAC1B,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uCAAuC;IACvC,EAAE,EAAE,MAAM,EAAE,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,wGAAwG;IACxG,IAAI,EAAE,OAAO,CAAA;CACd;AAED,eAAO,MAAM,MAAM,SAAU,MAAM,KAAG,MAA2C,CAAA;AAEjF,eAAO,MAAM,KAAK,aAAc,MAAM,QAAQ,MAAM,KAAG,MAAM,GAAG,SACI,CAAA;AAEpE,eAAO,MAAM,WAAW,UAAW,MAAM,GAAG,SAAS,KAAG,MAAM,EAK7D,CAAA;AAED,4DAA4D;AAC5D,eAAO,MAAM,SAAS,SAAU,MAAM,KAAG,WAexC,CAAA"}
@@ -0,0 +1,28 @@
1
+ /** The header fields memo reads at list time: enough to group mail by sender and apply the owner's rules. */
2
+ export const HEADER_FIELDS = "FROM TO CC LIST-ID LIST-UNSUBSCRIBE PRECEDENCE";
3
+ export const unfold = (text) => text.replace(/\r?\n[ \t]+/g, " ");
4
+ export const field = (unfolded, name) => new RegExp(`^${name}:[ \\t]*(.*?)\\r?$`, "im").exec(unfolded)?.[1];
5
+ export const addressesOf = (value) => {
6
+ if (value === undefined)
7
+ return [];
8
+ const bracketed = [...value.matchAll(/<([^<>\s]+@[^<>\s]+)>/g)].map(([, address]) => address);
9
+ const found = bracketed.length ? bracketed : (value.match(/[^\s<>,;:"()]+@[^\s<>,;:"()]+/g) ?? []);
10
+ return found.map((address) => address.toLowerCase());
11
+ };
12
+ /** The header fields of one email, from its header text. */
13
+ export const headersOf = (text) => {
14
+ const unfolded = unfold(text);
15
+ const [from] = addressesOf(field(unfolded, "From"));
16
+ const rawList = field(unfolded, "List-Id");
17
+ const listId = rawList === undefined ? undefined : (/<([^>]+)>/.exec(rawList)?.[1] ?? rawList).trim().toLowerCase();
18
+ const bulk = Boolean(listId) ||
19
+ field(unfolded, "List-Unsubscribe") !== undefined ||
20
+ /^(bulk|list|junk)\b/i.test(field(unfolded, "Precedence") ?? "");
21
+ return {
22
+ ...(from === undefined ? {} : { from }),
23
+ to: [...addressesOf(field(unfolded, "To")), ...addressesOf(field(unfolded, "Cc"))],
24
+ ...(listId ? { listId } : {}),
25
+ bulk,
26
+ };
27
+ };
28
+ //# sourceMappingURL=headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../src/mail/headers.ts"],"names":[],"mappings":"AAAA,6GAA6G;AAC7G,MAAM,CAAC,MAAM,aAAa,GAAG,gDAAgD,CAAA;AAY7E,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAA;AAEjF,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAE,IAAY,EAAsB,EAAE,CAC1E,IAAI,MAAM,CAAC,IAAI,IAAI,oBAAoB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AAEpE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAyB,EAAY,EAAE;IACjE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAA;IAClC,MAAM,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAiB,CAAC,CAAA;IACvG,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,gCAAgC,CAAC,IAAI,EAAE,CAAC,CAAA;IAClG,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;AACtD,CAAC,CAAA;AAED,4DAA4D;AAC5D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAe,EAAE;IACrD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;IAC7B,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;IACnD,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IAC1C,MAAM,MAAM,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACnH,MAAM,IAAI,GACR,OAAO,CAAC,MAAM,CAAC;QACf,KAAK,CAAC,QAAQ,EAAE,kBAAkB,CAAC,KAAK,SAAS;QACjD,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC,CAAA;IAClE,OAAO;QACL,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACvC,EAAE,EAAE,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QAClF,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,IAAI;KACL,CAAA;AACH,CAAC,CAAA"}
@@ -1,4 +1,6 @@
1
- export type Himalaya = (args: string[], input?: string) => Promise<string>;
1
+ export type Himalaya = (args: string[], input?: string, options?: {
2
+ maxBuffer?: number;
3
+ }) => Promise<string>;
2
4
  /** `MEMO_HIMALAYA` names the program, so the test sandbox can point it at a fake. */
3
5
  export declare const himalaya: (env?: NodeJS.ProcessEnv) => Himalaya;
4
6
  //# sourceMappingURL=himalaya.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"himalaya.d.ts","sourceRoot":"","sources":["../../src/mail/himalaya.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAE1E,qFAAqF;AACrF,eAAO,MAAM,QAAQ,SACb,MAAM,CAAC,UAAU,KAAiB,QAgBpC,CAAA"}
1
+ {"version":3,"file":"himalaya.d.ts","sourceRoot":"","sources":["../../src/mail/himalaya.ts"],"names":[],"mappings":"AAGA,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;AAE5G,qFAAqF;AACrF,eAAO,MAAM,QAAQ,SACb,MAAM,CAAC,UAAU,KAAiB,QAgBpC,CAAA"}
@@ -1,8 +1,8 @@
1
1
  import { execFile } from "node:child_process";
2
2
  import { CliError } from "@wirecat/cli-base";
3
3
  /** `MEMO_HIMALAYA` names the program, so the test sandbox can point it at a fake. */
4
- export const himalaya = (env = process.env) => (args, input) => new Promise((resolve, reject) => {
5
- const child = execFile(env.MEMO_HIMALAYA ?? "himalaya", args, { env, maxBuffer: 64 * 1024 * 1024 }, (error, stdout, stderr) => {
4
+ export const himalaya = (env = process.env) => (args, input, options) => new Promise((resolve, reject) => {
5
+ const child = execFile(env.MEMO_HIMALAYA ?? "himalaya", args, { env, maxBuffer: options?.maxBuffer ?? 64 * 1024 * 1024 }, (error, stdout, stderr) => {
6
6
  if (error === null)
7
7
  resolve(stdout);
8
8
  else
@@ -1 +1 @@
1
- {"version":3,"file":"himalaya.js","sourceRoot":"","sources":["../../src/mail/himalaya.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAI5C,qFAAqF;AACrF,MAAM,CAAC,MAAM,QAAQ,GACnB,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAY,EAAE,CACnD,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC9B,MAAM,KAAK,GAAG,QAAQ,CACpB,GAAG,CAAC,aAAa,IAAI,UAAU,EAC/B,IAAI,EACJ,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EACpC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QACxB,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,CAAC,MAAM,CAAC,CAAA;;YAEjC,MAAM,CACJ,IAAI,QAAQ,CAAC,gBAAgB,EAAE,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,MAAM,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CACtG,CAAA;IACL,CAAC,CACF,CAAA;IACD,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;AAC/B,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"himalaya.js","sourceRoot":"","sources":["../../src/mail/himalaya.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAI5C,qFAAqF;AACrF,MAAM,CAAC,MAAM,QAAQ,GACnB,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAY,EAAE,CACnD,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CACvB,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC9B,MAAM,KAAK,GAAG,QAAQ,CACpB,GAAG,CAAC,aAAa,IAAI,UAAU,EAC/B,IAAI,EACJ,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EAC1D,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QACxB,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,CAAC,MAAM,CAAC,CAAA;;YAEjC,MAAM,CACJ,IAAI,QAAQ,CAAC,gBAAgB,EAAE,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,MAAM,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CACtG,CAAA;IACL,CAAC,CACF,CAAA;IACD,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;AAC/B,CAAC,CAAC,CAAA"}
@@ -1,15 +1,17 @@
1
- import { type LoadEngine } from "@wirecat/cli-messaging/documents";
2
- import type { MessageStore } from "@wirecat/cli-messaging/store";
1
+ import { type LoadEngine } from "@wirecat/cli-core/documents";
2
+ import type { MessageStore } from "@wirecat/cli-core/store";
3
3
  import { embedChanged, embedMailChunks, type NotesEmbedded } from "../notes/embed.js";
4
- import type { Himalaya } from "./himalaya.js";
4
+ import { type MailRule } from "./rules.js";
5
+ import type { MailSource } from "./source.js";
5
6
  export interface MailAccount {
6
7
  /** The account's name in Himalaya's config. */
7
8
  name: string;
8
9
  /** The mailbox address: the store's account id. */
9
10
  address: string;
10
- mode?: "gmail" | "imap";
11
+ mode?: "gmail" | "imap" | "mbox";
11
12
  folders?: string[];
12
13
  embed?: boolean;
14
+ rules?: MailRule[];
13
15
  }
14
16
  export interface ImportResult {
15
17
  account: string;
@@ -17,9 +19,16 @@ export interface ImportResult {
17
19
  listed: number;
18
20
  saved: number;
19
21
  alreadyStored: number;
22
+ /** New emails a skip rule kept out: never read, never stored. */
23
+ skipped: number;
20
24
  deleted: number;
21
25
  /** False when `max` stopped the run before every new message was read; the next run continues. */
22
26
  complete: boolean;
27
+ /** Emails that could not be read or parsed; they are tried again next run. */
28
+ unreadable?: {
29
+ message: string;
30
+ reason: string;
31
+ }[];
23
32
  /** Why stored messages missing at the source were left alone, when they were. */
24
33
  deletionsSkipped?: string;
25
34
  indexed?: NotesEmbedded;
@@ -37,9 +46,9 @@ export interface ImportResult {
37
46
  }[];
38
47
  }
39
48
  export declare const MAX_ATTACHMENT_CHARS = 200000;
40
- export declare const importMail: ({ store, run, account, since, max, maxBodyChars, maxAttachmentChars, now, env, embed, loadEngine, retryAttachments, indexThreads, embedMail, }: {
49
+ export declare const importMail: ({ store, source, account, since, max, maxBodyChars, maxAttachmentChars, now, env, embed, loadEngine, retryAttachments, indexThreads, embedMail, }: {
41
50
  store: MessageStore;
42
- run: Himalaya;
51
+ source: MailSource;
43
52
  account: MailAccount;
44
53
  since: Date;
45
54
  max?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/mail/import.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAC7F,OAAO,KAAK,EAA6C,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3G,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAGrF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAG7C,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAA;IACZ,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,kGAAkG;IAClG,QAAQ,EAAE,OAAO,CAAA;IACjB,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7G,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAClE;AAKD,eAAO,MAAM,oBAAoB,SAAU,CAAA;AAI3C,eAAO,MAAM,UAAU,mJAepB;IACD,KAAK,EAAE,YAAY,CAAA;IACnB,GAAG,EAAE,QAAQ,CAAA;IACb,OAAO,EAAE,WAAW,CAAA;IACpB,KAAK,EAAE,IAAI,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,YAAY,CAAC,EAAE,OAAO,YAAY,CAAA;IAClC,SAAS,CAAC,EAAE,OAAO,eAAe,CAAA;CACnC,KAAG,OAAO,CAAC,YAAY,CAyNvB,CAAA"}
1
+ {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/mail/import.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxF,OAAO,KAAK,EAA6C,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtG,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAIrF,OAAO,EAAU,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,KAAK,EAAU,UAAU,EAAE,MAAM,aAAa,CAAA;AAErD,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAA;IACZ,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;IAChC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,MAAM,CAAA;IACrB,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,kGAAkG;IAClG,QAAQ,EAAE,OAAO,CAAA;IACjB,8EAA8E;IAC9E,UAAU,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAClD,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7G,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAClE;AAKD,eAAO,MAAM,oBAAoB,SAAU,CAAA;AAM3C,eAAO,MAAM,UAAU,sJAepB;IACD,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,UAAU,CAAA;IAClB,OAAO,EAAE,WAAW,CAAA;IACpB,KAAK,EAAE,IAAI,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,YAAY,CAAC,EAAE,OAAO,YAAY,CAAA;IAClC,SAAS,CAAC,EAAE,OAAO,eAAe,CAAA;CACnC,KAAG,OAAO,CAAC,YAAY,CAqPvB,CAAA"}