@wirecat/cli-memo 0.24.0 → 0.26.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 (194) hide show
  1. package/README.md +2 -2
  2. package/dist/actions/actions.d.ts +1 -1
  3. package/dist/actions/actions.d.ts.map +1 -1
  4. package/dist/actions/command.js +2 -2
  5. package/dist/actions/command.js.map +1 -1
  6. package/dist/answers/command.d.ts +1 -1
  7. package/dist/answers/command.d.ts.map +1 -1
  8. package/dist/answers/command.js +2 -2
  9. package/dist/answers/command.js.map +1 -1
  10. package/dist/app.d.ts +10 -1
  11. package/dist/app.d.ts.map +1 -1
  12. package/dist/app.js +3 -1
  13. package/dist/app.js.map +1 -1
  14. package/dist/author.d.ts +1 -1
  15. package/dist/author.d.ts.map +1 -1
  16. package/dist/bin/memo.js +25 -12
  17. package/dist/bin/memo.js.map +1 -1
  18. package/dist/config.d.ts +14 -1
  19. package/dist/config.d.ts.map +1 -1
  20. package/dist/config.js +14 -1
  21. package/dist/config.js.map +1 -1
  22. package/dist/context/command.js +1 -1
  23. package/dist/context/command.js.map +1 -1
  24. package/dist/context/context.d.ts +3 -3
  25. package/dist/context/context.d.ts.map +1 -1
  26. package/dist/context/context.js +2 -2
  27. package/dist/context/context.js.map +1 -1
  28. package/dist/discovery/command.d.ts +1 -1
  29. package/dist/discovery/command.js +2 -2
  30. package/dist/discovery/command.js.map +1 -1
  31. package/dist/examples.d.ts.map +1 -1
  32. package/dist/examples.js +8 -0
  33. package/dist/examples.js.map +1 -1
  34. package/dist/facts/command.js +1 -1
  35. package/dist/facts/command.js.map +1 -1
  36. package/dist/failure.d.ts +65 -0
  37. package/dist/failure.d.ts.map +1 -0
  38. package/dist/failure.js +73 -0
  39. package/dist/failure.js.map +1 -0
  40. package/dist/knowledge/command.js +1 -1
  41. package/dist/knowledge/command.js.map +1 -1
  42. package/dist/knowledge/key-documents.d.ts +1 -1
  43. package/dist/knowledge/key-documents.d.ts.map +1 -1
  44. package/dist/knowledge/key-documents.js +1 -1
  45. package/dist/knowledge/key-documents.js.map +1 -1
  46. package/dist/mail/accounts.d.ts +11 -0
  47. package/dist/mail/accounts.d.ts.map +1 -0
  48. package/dist/mail/accounts.js +26 -0
  49. package/dist/mail/accounts.js.map +1 -0
  50. package/dist/mail/command.d.ts +4 -0
  51. package/dist/mail/command.d.ts.map +1 -0
  52. package/dist/mail/command.js +185 -0
  53. package/dist/mail/command.js.map +1 -0
  54. package/dist/mail/gmail.d.ts +7 -2
  55. package/dist/mail/gmail.d.ts.map +1 -1
  56. package/dist/mail/gmail.js +76 -37
  57. package/dist/mail/gmail.js.map +1 -1
  58. package/dist/mail/headers.d.ts +23 -0
  59. package/dist/mail/headers.d.ts.map +1 -0
  60. package/dist/mail/headers.js +42 -0
  61. package/dist/mail/headers.js.map +1 -0
  62. package/dist/mail/himalaya.d.ts +3 -1
  63. package/dist/mail/himalaya.d.ts.map +1 -1
  64. package/dist/mail/himalaya.js +2 -2
  65. package/dist/mail/himalaya.js.map +1 -1
  66. package/dist/mail/import.d.ts +17 -6
  67. package/dist/mail/import.d.ts.map +1 -1
  68. package/dist/mail/import.js +184 -78
  69. package/dist/mail/import.js.map +1 -1
  70. package/dist/mail/mbox.d.ts +9 -0
  71. package/dist/mail/mbox.d.ts.map +1 -0
  72. package/dist/mail/mbox.js +218 -0
  73. package/dist/mail/mbox.js.map +1 -0
  74. package/dist/mail/messages-command.js +3 -3
  75. package/dist/mail/messages-command.js.map +1 -1
  76. package/dist/mail/parse.d.ts +2 -2
  77. package/dist/mail/parse.d.ts.map +1 -1
  78. package/dist/mail/parse.js +27 -63
  79. package/dist/mail/parse.js.map +1 -1
  80. package/dist/mail/probe.d.ts +31 -0
  81. package/dist/mail/probe.d.ts.map +1 -0
  82. package/dist/mail/probe.js +55 -0
  83. package/dist/mail/probe.js.map +1 -0
  84. package/dist/mail/rules.d.ts +35 -0
  85. package/dist/mail/rules.d.ts.map +1 -0
  86. package/dist/mail/rules.js +45 -0
  87. package/dist/mail/rules.js.map +1 -0
  88. package/dist/mail/source.d.ts +20 -0
  89. package/dist/mail/source.d.ts.map +1 -0
  90. package/dist/mail/source.js +99 -0
  91. package/dist/mail/source.js.map +1 -0
  92. package/dist/mcp/knowledge.js +2 -2
  93. package/dist/mcp/knowledge.js.map +1 -1
  94. package/dist/mcp/server.d.ts.map +1 -1
  95. package/dist/mcp/server.js +21 -17
  96. package/dist/mcp/server.js.map +1 -1
  97. package/dist/mcp/tool.d.ts +1 -1
  98. package/dist/mcp/tool.d.ts.map +1 -1
  99. package/dist/memories/command.js +1 -1
  100. package/dist/memories/command.js.map +1 -1
  101. package/dist/memories/memories.d.ts +1 -1
  102. package/dist/memories/memories.d.ts.map +1 -1
  103. package/dist/notes/about.d.ts +1 -1
  104. package/dist/notes/about.d.ts.map +1 -1
  105. package/dist/notes/about.js +1 -1
  106. package/dist/notes/about.js.map +1 -1
  107. package/dist/notes/bound.d.ts +1 -1
  108. package/dist/notes/bound.d.ts.map +1 -1
  109. package/dist/notes/command.js +1 -1
  110. package/dist/notes/command.js.map +1 -1
  111. package/dist/notes/embed.d.ts +1 -1
  112. package/dist/notes/embed.d.ts.map +1 -1
  113. package/dist/notes/embed.js +9 -7
  114. package/dist/notes/embed.js.map +1 -1
  115. package/dist/notes/folders-command.js +1 -1
  116. package/dist/notes/folders-command.js.map +1 -1
  117. package/dist/notes/import.d.ts +2 -2
  118. package/dist/notes/import.d.ts.map +1 -1
  119. package/dist/notes/import.js +2 -2
  120. package/dist/notes/import.js.map +1 -1
  121. package/dist/notes/internal.d.ts +1 -1
  122. package/dist/notes/internal.d.ts.map +1 -1
  123. package/dist/notes/links.d.ts +1 -1
  124. package/dist/notes/links.d.ts.map +1 -1
  125. package/dist/notes/list.d.ts +1 -1
  126. package/dist/notes/list.d.ts.map +1 -1
  127. package/dist/notes/search.d.ts +3 -3
  128. package/dist/notes/search.d.ts.map +1 -1
  129. package/dist/notes/search.js +1 -1
  130. package/dist/notes/search.js.map +1 -1
  131. package/dist/people/command.js +1 -1
  132. package/dist/people/command.js.map +1 -1
  133. package/dist/people/identity.d.ts +1 -1
  134. package/dist/people/identity.d.ts.map +1 -1
  135. package/dist/people/identity.js +1 -1
  136. package/dist/people/identity.js.map +1 -1
  137. package/dist/people/notes-map.d.ts +1 -1
  138. package/dist/people/notes-map.d.ts.map +1 -1
  139. package/dist/people/subject.d.ts +1 -1
  140. package/dist/people/subject.d.ts.map +1 -1
  141. package/dist/people/subject.js +1 -1
  142. package/dist/people/subject.js.map +1 -1
  143. package/dist/program.d.ts.map +1 -1
  144. package/dist/program.js +4 -1
  145. package/dist/program.js.map +1 -1
  146. package/dist/reasons.d.ts +4 -0
  147. package/dist/reasons.d.ts.map +1 -0
  148. package/dist/reasons.js +11 -0
  149. package/dist/reasons.js.map +1 -0
  150. package/dist/records/run.d.ts +1 -1
  151. package/dist/records/run.d.ts.map +1 -1
  152. package/dist/records/run.js +1 -1
  153. package/dist/records/run.js.map +1 -1
  154. package/dist/run/import.d.ts +2 -0
  155. package/dist/run/import.d.ts.map +1 -1
  156. package/dist/run/import.js +42 -20
  157. package/dist/run/import.js.map +1 -1
  158. package/dist/run/lock.d.ts.map +1 -1
  159. package/dist/run/lock.js +5 -2
  160. package/dist/run/lock.js.map +1 -1
  161. package/dist/search/command.d.ts +2 -2
  162. package/dist/search/command.d.ts.map +1 -1
  163. package/dist/search/command.js +7 -6
  164. package/dist/search/command.js.map +1 -1
  165. package/dist/store/gone.d.ts +1 -1
  166. package/dist/store/gone.d.ts.map +1 -1
  167. package/dist/store/held.d.ts +1 -1
  168. package/dist/store/held.d.ts.map +1 -1
  169. package/dist/store/scope.d.ts +1 -1
  170. package/dist/store/scope.d.ts.map +1 -1
  171. package/dist/store/scope.js +1 -1
  172. package/dist/store/scope.js.map +1 -1
  173. package/dist/store/source-target.d.ts +1 -1
  174. package/dist/store/source-target.d.ts.map +1 -1
  175. package/dist/store/source-target.js +1 -1
  176. package/dist/store/source-target.js.map +1 -1
  177. package/dist/tags/command.js +2 -2
  178. package/dist/tags/command.js.map +1 -1
  179. package/dist/tasks/command.js +3 -3
  180. package/dist/tasks/command.js.map +1 -1
  181. package/dist/tasks/context.d.ts +2 -2
  182. package/dist/tasks/context.d.ts.map +1 -1
  183. package/dist/tasks/context.js +2 -2
  184. package/dist/tasks/context.js.map +1 -1
  185. package/dist/tasks/relations-command.js +1 -1
  186. package/dist/tasks/relations-command.js.map +1 -1
  187. package/dist/version.d.ts +1 -1
  188. package/dist/version.js +1 -1
  189. package/dist/vocabulary/command.js +1 -1
  190. package/dist/vocabulary/command.js.map +1 -1
  191. package/dist/vocabulary/project.d.ts +1 -1
  192. package/dist/vocabulary/project.d.ts.map +1 -1
  193. package/package.json +4 -3
  194. package/skills/cli-memo/SKILL.md +13 -0
@@ -1,35 +1,39 @@
1
- import { extractText, importEngine } from "@wirecat/cli-messaging/documents";
1
+ import { extractText, importEngine } from "@wirecat/cli-core/documents";
2
2
  import { embedChanged, embedMailChunks } from "../notes/embed.js";
3
3
  import { dropMissing, tooManyGone } from "../store/gone.js";
4
- import { listAllMail, listImapMail } from "./gmail.js";
4
+ import { mailFolders } from "./accounts.js";
5
5
  import { MAX_BODY_CHARS, parseMail } from "./parse.js";
6
+ import { decide, ENVELOPE, envelopeBox, envelopeBoxOf } from "./rules.js";
6
7
  const DAY = 86_400_000;
7
8
  /** IMAP's SINCE counts whole days in the server's zone, so the window's first days are not trusted. */
8
9
  const EDGE = 2 * DAY;
9
10
  export const MAX_ATTACHMENT_CHARS = 200_000;
11
+ /** One chunk of raw mail is held in memory at a time. */
12
+ const FETCH_CHUNK = 50;
10
13
  const addressOf = ({ email, name }) => ({ address: email, name });
11
- export const importMail = async ({ store, run, account, since, max = 200, maxBodyChars = MAX_BODY_CHARS, maxAttachmentChars = MAX_ATTACHMENT_CHARS, now = Date.now, env, embed = false, loadEngine = importEngine, retryAttachments = false, indexThreads = embedChanged, embedMail = embedMailChunks, }) => {
14
+ export const importMail = async ({ store, source, account, since, max = 200, maxBodyChars = MAX_BODY_CHARS, maxAttachmentChars = MAX_ATTACHMENT_CHARS, now = Date.now, env, embed = false, loadEngine = importEngine, retryAttachments = false, indexThreads = embedChanged, embedMail = embedMailChunks, }) => {
12
15
  const startedAt = now();
13
16
  const key = { provider: "email", account: account.address.toLowerCase() };
14
17
  const accountId = await store.saveAccount(key, { name: account.address });
15
- const folders = account.folders ?? [account.mode === "imap" ? "INBOX" : "[Gmail]/All Mail"];
18
+ const folders = mailFolders(account);
16
19
  if (folders.length < 1 || folders.length > 50)
17
20
  throw new Error("select 1–50 mail folders");
21
+ const rules = account.rules ?? [];
22
+ // An archive file is a snapshot of the same account: it adds mail, and changes nothing IMAP keeps current.
23
+ const snapshot = account.mode === "mbox";
18
24
  const collected = [];
19
- for (const folder of folders)
20
- collected.push(...(account.mode === "imap"
21
- ? await listImapMail(run, account.name, since, folder)
22
- : (await listAllMail(run, account.name, since, folder)).map((item) => ({
23
- ...item,
24
- folder: folder === "[Gmail]/All Mail" ? "archive" : folder,
25
- scopeFolder: folder,
26
- }))));
25
+ for (const folder of folders) {
26
+ const found = await source.list(since, folder, { headers: rules.length > 0 });
27
+ // Spreading a whole mailbox into push() overflows the stack past ~120,000 emails.
28
+ for (const item of found)
29
+ collected.push(item);
30
+ }
27
31
  const listed = [...new Map(collected.map((item) => [item.messageId, item])).values()].sort((a, b) => b.receivedAt.localeCompare(a.receivedAt));
28
32
  const present = new Set(listed.map(({ messageId }) => messageId));
29
33
  const foundFolders = new Map();
30
34
  for (const item of collected) {
31
35
  const current = foundFolders.get(item.messageId) ?? new Set();
32
- current.add(item.scopeFolder ?? item.folder ?? folders[0]);
36
+ current.add(item.folder ?? folders[0]);
33
37
  foundFolders.set(item.messageId, current);
34
38
  }
35
39
  const mailbox = (folder) => ({ externalId: folder, name: folder, kind: null });
@@ -38,16 +42,18 @@ export const importMail = async ({ store, run, account, since, max = 200, maxBod
38
42
  const allMailOnly = account.mode !== "imap" && folders.length === 1 && folders[0] === "[Gmail]/All Mail";
39
43
  // Deletions are proved against the mailboxes as stored before this scan moves anything.
40
44
  const scope = JSON.stringify({ mode: account.mode ?? "gmail", folders: [...folders].sort() });
41
- const previousScope = await store.syncState(key, "mail_folder_scope");
45
+ const previousScope = snapshot ? undefined : await store.syncState(key, "mail_folder_scope");
42
46
  const windowStart = new Date(since.getTime() + EDGE);
43
47
  let deleted = 0;
44
48
  let skipped;
45
- if (previousScope !== undefined && previousScope.value !== scope)
49
+ if (snapshot)
50
+ skipped = "an mbox file is a snapshot; mail missing from it is not proven deleted";
51
+ else if (previousScope !== undefined && previousScope.value !== scope)
46
52
  skipped = "folder scope changed; missing mail is not proven deleted";
47
53
  else {
48
54
  // A label is not where mail lives, so only folders prove that a missing mail was deleted.
49
- const candidates = (await store.mail.emails({ accountId, since: windowStart.getTime() })).filter(({ mailboxes }) => {
50
- const inFolders = mailboxes.filter(({ kind }) => kind !== "label");
55
+ const candidates = (await store.mail.emailRefs({ accountId, since: windowStart.getTime() })).filter(({ mailboxes }) => {
56
+ const inFolders = mailboxes.filter(({ kind }) => kind !== "label" && kind !== ENVELOPE);
51
57
  return inFolders.length ? inFolders.every(({ externalId }) => folders.includes(externalId)) : allMailOnly;
52
58
  });
53
59
  const gone = candidates.filter(({ externalId }) => !present.has(externalId)).map(({ externalId }) => externalId);
@@ -64,9 +70,10 @@ export const importMail = async ({ store, run, account, since, max = 200, maxBod
64
70
  deleted += older.deleted;
65
71
  skipped ??= older.skipped;
66
72
  }
67
- await store.mail.setMailboxes(accountId, folders.map(mailbox), new Map([...foundFolders].map(([id, found]) => [id, [...found]])), startedAt);
73
+ if (!snapshot)
74
+ await store.mail.setMailboxes(accountId, folders.map(mailbox), new Map([...foundFolders].map(([id, found]) => [id, [...found]])), startedAt);
68
75
  // A message's label list is whole, so every label the account has is replaced for each message read.
69
- if (labelsOf.size) {
76
+ if (labelsOf.size && !snapshot) {
70
77
  const known = (await store.mail.mailboxes(accountId)).filter(({ kind }) => kind === "label");
71
78
  const seen = [...labelsOf.values()].flatMap(({ labels }) => labels ?? []);
72
79
  const scanned = new Map([
@@ -76,47 +83,69 @@ export const importMail = async ({ store, run, account, since, max = 200, maxBod
76
83
  await store.mail.setMailboxes(accountId, [...scanned.values()], new Map([...labelsOf].map(([id, { labels }]) => [id, (labels ?? []).map((name) => label(name).externalId)])), startedAt);
77
84
  }
78
85
  const attachments = [];
86
+ const unreadable = [];
79
87
  let saved = 0;
80
88
  let alreadyStored = 0;
81
- let read = 0;
89
+ let ruledOut = 0;
90
+ let envelopes = 0;
91
+ const pending = [];
92
+ // IMAP lists what exists now, so a mail marked deleted that it lists again is saved again, which brings it back.
93
+ // An archive is old: what it holds that IMAP proved deleted stays deleted.
94
+ const refs = await store.mail.emailRefs({ accountId, includeDeleted: snapshot });
95
+ const known = new Set(refs.map(({ externalId }) => externalId));
96
+ const stored = retryAttachments ? new Set() : known;
97
+ const enveloped = new Map(refs.flatMap(({ externalId, mailboxes }) => {
98
+ const boxes = mailboxes.filter(({ kind }) => kind === ENVELOPE).map((box) => box.externalId);
99
+ return boxes.length ? [[externalId, boxes]] : [];
100
+ }));
101
+ const upgraded = new Map();
102
+ const toRecord = [];
103
+ let full = false;
82
104
  for (const item of listed) {
83
- if (!retryAttachments && (await store.mail.email(accountId, item.messageId)) !== null) {
105
+ const rule = decide(rules, item.headers);
106
+ const boxes = enveloped.get(item.messageId);
107
+ // An envelope whose rule is gone or now keeps the mail is read in full; one a skip now matches stays as it is.
108
+ if (boxes !== undefined && rule?.action !== ENVELOPE && rule?.action !== "skip") {
109
+ if (pending.length < max) {
110
+ upgraded.set(item.messageId, boxes);
111
+ pending.push(item);
112
+ }
113
+ else
114
+ full = true;
115
+ continue;
116
+ }
117
+ if (stored.has(item.messageId)) {
84
118
  alreadyStored++;
85
119
  continue;
86
120
  }
87
- if (read >= max)
88
- break;
89
- read++;
90
- const mail = parseMail(await run(["--json", "message", "read", "-a", account.name, "-m", item.folder ?? "archive", item.uid]), maxBodyChars);
91
- const files = [];
92
- for (const [position, part] of mail.attachments.entries()) {
93
- const extraction = part.bytes === null
94
- ? { status: "unavailable" }
95
- : await extractText(part.bytes, { kind: "file", name: part.name, mime: part.mime, path: part.name }, loadEngine);
96
- attachments.push({ message: item.messageId, part: part.id, status: extraction.status });
97
- const extracted = extraction.status === "extracted" ? extraction : undefined;
98
- files.push({
99
- position,
100
- kind: "file",
101
- mime: part.mime,
102
- name: part.name,
103
- title: null,
104
- url: null,
105
- size: part.bytes === null ? null : part.bytes.byteLength,
106
- width: null,
107
- height: null,
108
- duration: null,
109
- providerRef: { message: item.messageId, part: part.id },
110
- localPath: null,
111
- text: extracted ? extracted.text.slice(0, maxAttachmentChars) : null,
112
- normalizedText: null,
113
- extraction: extracted ? "text" : "failed",
114
- extractor: extracted ? extracted.extractor : null,
115
- extractionError: extracted ? null : extraction.status,
116
- contentSha256: null,
117
- extractedAt: startedAt,
118
- });
121
+ // Stored mail a newer skip or envelope rule matches stays whole: removing it is a separate, explicit step.
122
+ if (rule?.action === "skip") {
123
+ ruledOut++;
124
+ continue;
125
+ }
126
+ if (rule?.action === ENVELOPE) {
127
+ if (!known.has(item.messageId))
128
+ toRecord.push({ item, rule });
129
+ else
130
+ alreadyStored++;
131
+ continue;
119
132
  }
133
+ if (pending.length < max)
134
+ pending.push(item);
135
+ else
136
+ full = true;
137
+ }
138
+ const inMailboxes = (item) => [
139
+ ...[...(foundFolders.get(item.messageId) ?? [])].map(mailbox),
140
+ ...(labelsOf.get(item.messageId)?.labels ?? []).map(label),
141
+ ];
142
+ const flagsOf = (item) => {
143
+ const { seen, flagged } = labelsOf.get(item.messageId) ?? {};
144
+ return { ...(seen === undefined ? {} : { read: seen }), ...(flagged === undefined ? {} : { flagged }) };
145
+ };
146
+ // An envelope costs nothing more from the source: its fields were read with the listing.
147
+ for (const { item, rule } of toRecord) {
148
+ const headers = item.headers;
120
149
  await store.mail.saveThread({
121
150
  accountId,
122
151
  externalId: item.threadId,
@@ -124,37 +153,110 @@ export const importMail = async ({ store, run, account, since, max = 200, maxBod
124
153
  emails: [
125
154
  {
126
155
  externalId: item.messageId,
127
- subject: mail.subject,
128
- from: mail.from === null ? null : addressOf(mail.from),
129
- to: mail.to.map(addressOf),
130
- cc: mail.cc.map(addressOf),
131
- bcc: mail.bcc.map(addressOf),
156
+ // Subject and text stay out of the columns search reads, so recorded mail is never a search hit.
157
+ subject: null,
158
+ from: headers?.from === undefined ? null : { address: headers.from, name: headers.fromName ?? null },
132
159
  sentAt: null,
133
160
  receivedAt: Date.parse(item.receivedAt),
134
- bodyText: mail.text || null,
135
- outgoing: mail.from === null ? null : mail.from.email === key.account,
136
- mailboxes: [
137
- ...[...(foundFolders.get(item.messageId) ?? [])].map(mailbox),
138
- ...(labelsOf.get(item.messageId)?.labels ?? []).map(label),
139
- ],
140
- ...(labelsOf.get(item.messageId)?.seen === undefined
141
- ? {}
142
- : { read: labelsOf.get(item.messageId)?.seen ?? null }),
143
- ...(labelsOf.get(item.messageId)?.flagged === undefined
144
- ? {}
145
- : { flagged: labelsOf.get(item.messageId)?.flagged ?? null }),
146
- attachments: files,
161
+ bodyText: null,
162
+ size: item.size ?? null,
163
+ outgoing: headers?.from === key.account,
164
+ mailboxes: [...inMailboxes(item), envelopeBox(rule.match)],
165
+ ...flagsOf(item),
166
+ metadata: {
167
+ rule: { action: rule.action, match: { ...rule.match } },
168
+ ...(headers?.subject ? { subject: headers.subject } : {}),
169
+ ...(headers?.listId ? { listId: headers.listId } : {}),
170
+ },
147
171
  },
148
172
  ],
149
173
  });
150
- saved++;
174
+ envelopes++;
175
+ }
176
+ for (let start = 0; start < pending.length; start += FETCH_CHUNK) {
177
+ const chunk = pending.slice(start, start + FETCH_CHUNK);
178
+ const raws = await source.fetchRaw(chunk);
179
+ // Every email of a chunk failing is the connection or the login, not the mail: stop instead of trying the rest.
180
+ if (chunk.length > 1 && raws.every((raw) => raw instanceof Error))
181
+ throw raws[0];
182
+ for (const [index, item] of chunk.entries()) {
183
+ let mail;
184
+ try {
185
+ const raw = raws[index];
186
+ if (raw === undefined || raw instanceof Error)
187
+ throw raw ?? new Error("not read");
188
+ mail = await parseMail(raw, maxBodyChars);
189
+ }
190
+ catch (error) {
191
+ unreadable.push({ message: item.messageId, reason: error instanceof Error ? error.message : String(error) });
192
+ continue;
193
+ }
194
+ const files = [];
195
+ for (const [position, part] of mail.attachments.entries()) {
196
+ const extraction = part.bytes === null
197
+ ? { status: "unavailable" }
198
+ : await extractText(part.bytes, { kind: "file", name: part.name, mime: part.mime, path: part.name }, loadEngine);
199
+ attachments.push({ message: item.messageId, part: part.id, status: extraction.status });
200
+ const extracted = extraction.status === "extracted" ? extraction : undefined;
201
+ files.push({
202
+ position,
203
+ kind: "file",
204
+ mime: part.mime,
205
+ name: part.name,
206
+ title: null,
207
+ url: null,
208
+ size: part.bytes === null ? null : part.bytes.byteLength,
209
+ width: null,
210
+ height: null,
211
+ duration: null,
212
+ providerRef: { message: item.messageId, part: part.id },
213
+ localPath: null,
214
+ text: extracted ? extracted.text.slice(0, maxAttachmentChars) : null,
215
+ normalizedText: null,
216
+ extraction: extracted ? "text" : "failed",
217
+ extractor: extracted ? extracted.extractor : null,
218
+ extractionError: extracted ? null : extraction.status,
219
+ contentSha256: null,
220
+ extractedAt: startedAt,
221
+ });
222
+ }
223
+ await store.mail.saveThread({
224
+ accountId,
225
+ externalId: item.threadId,
226
+ now: startedAt,
227
+ emails: [
228
+ {
229
+ externalId: item.messageId,
230
+ subject: mail.subject,
231
+ from: mail.from === null ? null : addressOf(mail.from),
232
+ to: mail.to.map(addressOf),
233
+ cc: mail.cc.map(addressOf),
234
+ bcc: mail.bcc.map(addressOf),
235
+ sentAt: null,
236
+ receivedAt: Date.parse(item.receivedAt),
237
+ bodyText: mail.text || null,
238
+ outgoing: mail.from === null ? null : mail.from.email === key.account,
239
+ mailboxes: inMailboxes(item),
240
+ ...flagsOf(item),
241
+ ...(upgraded.has(item.messageId) ? { metadata: {} } : {}),
242
+ attachments: files,
243
+ },
244
+ ],
245
+ });
246
+ saved++;
247
+ const boxes = upgraded.get(item.messageId);
248
+ if (boxes !== undefined)
249
+ await store.mail.setMailboxes(accountId, boxes.map(envelopeBoxOf), new Map([[item.messageId, []]]), startedAt);
250
+ }
151
251
  }
152
252
  // Read and starred change at the source after import; mail saved in this run already holds them.
153
- await store.mail.setFlags(accountId, new Map([...labelsOf].flatMap(([id, { seen, flagged }]) => seen === undefined && flagged === undefined
154
- ? []
155
- : [[id, { ...(seen === undefined ? {} : { read: seen }), ...(flagged === undefined ? {} : { flagged }) }]])), startedAt);
156
- const complete = listed.length - alreadyStored - saved === 0;
157
- await store.setSyncState(key, "mail_folder_scope", scope);
253
+ if (!snapshot)
254
+ await store.mail.setFlags(accountId, new Map([...labelsOf].flatMap(([id, { seen, flagged }]) => seen === undefined && flagged === undefined
255
+ ? []
256
+ : [[id, { ...(seen === undefined ? {} : { read: seen }), ...(flagged === undefined ? {} : { flagged }) }]])), startedAt);
257
+ const complete = !full && unreadable.length === 0;
258
+ if (!snapshot)
259
+ await store.setSyncState(key, "mail_folder_scope", scope);
158
260
  const embedding = { embed: embed && account.embed !== false, ...(env === undefined ? {} : { env }) };
159
261
  // Chats an earlier import saved as messages may still wait for vectors; the mail tables have their own.
160
262
  const older = await indexThreads(store, key, [], embedding);
@@ -172,18 +274,22 @@ export const importMail = async ({ store, run, account, since, max = 200, maxBod
172
274
  state: complete ? "window" : "partial",
173
275
  identity: account.mode === "imap" ? "message-id-or-uidvalidity-folder-uid" : "gmail-message-id",
174
276
  };
175
- await store.setSyncState(key, "mail_coverage", JSON.stringify(coverage));
277
+ if (!snapshot)
278
+ await store.setSyncState(key, "mail_coverage", JSON.stringify(coverage));
176
279
  return {
177
280
  account: key.account,
178
281
  since: since.toISOString(),
179
282
  listed: listed.length,
180
283
  saved,
181
284
  alreadyStored,
285
+ skipped: ruledOut,
286
+ envelopes,
182
287
  deleted,
183
288
  complete,
184
289
  indexed,
185
290
  coverage,
186
291
  ...(attachments.length ? { attachments } : {}),
292
+ ...(unreadable.length ? { unreadable } : {}),
187
293
  ...(skipped === undefined ? {} : { deletionsSkipped: skipped }),
188
294
  };
189
295
  };
@@ -1 +1 @@
1
- {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/mail/import.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/mail/import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAmB,MAAM,6BAA6B,CAAA;AAExF,OAAO,EAAE,YAAY,EAAE,eAAe,EAAsB,MAAM,mBAAmB,CAAA;AACrF,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAgB,cAAc,EAAmB,SAAS,EAAE,MAAM,YAAY,CAAA;AACrF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAA;AAoCxF,MAAM,GAAG,GAAG,UAAU,CAAA;AACtB,uGAAuG;AACvG,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,CAAA;AACpB,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAA;AAC3C,yDAAyD;AACzD,MAAM,WAAW,GAAG,EAAE,CAAA;AAEtB,MAAM,SAAS,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAW,EAAgB,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AAExF,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,EAC/B,KAAK,EACL,MAAM,EACN,OAAO,EACP,KAAK,EACL,GAAG,GAAG,GAAG,EACT,YAAY,GAAG,cAAc,EAC7B,kBAAkB,GAAG,oBAAoB,EACzC,GAAG,GAAG,IAAI,CAAC,GAAG,EACd,GAAG,EACH,KAAK,GAAG,KAAK,EACb,UAAU,GAAG,YAAY,EACzB,gBAAgB,GAAG,KAAK,EACxB,YAAY,GAAG,YAAY,EAC3B,SAAS,GAAG,eAAe,GAgB5B,EAAyB,EAAE;IAC1B,MAAM,SAAS,GAAG,GAAG,EAAE,CAAA;IACvB,MAAM,GAAG,GAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAA;IACrF,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IAEzE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IACpC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;IAC1F,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAA;IACjC,2GAA2G;IAC3G,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,KAAK,MAAM,CAAA;IACxC,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAA;QAC7E,kFAAkF;QAClF,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChD,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAClG,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CACzC,CAAA;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IACjE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAuB,CAAA;IACnD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,GAAG,EAAU,CAAA;QACrE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAK,OAAO,CAAC,CAAC,CAAY,CAAC,CAAA;QAClD,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAC3C,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACtF,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;IACtF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAClH,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAA;IAExG,wFAAwF;IACxF,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAC7F,MAAM,aAAa,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAA;IAC5F,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAA;IACpD,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,IAAI,OAA2B,CAAA;IAC/B,IAAI,QAAQ;QAAE,OAAO,GAAG,wEAAwE,CAAA;SAC3F,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,CAAC,KAAK,KAAK,KAAK;QACnE,OAAO,GAAG,0DAA0D,CAAA;SACjE,CAAC;QACJ,0FAA0F;QAC1F,MAAM,UAAU,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CACjG,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;YAChB,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAA;YACvF,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAA;QAC3G,CAAC,CACF,CAAA;QACD,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,CAAA;QAChH,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;QACrD,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAA;QAC/F,2GAA2G;QAC3G,MAAM,KAAK,GAAG,MAAM,WAAW,CAC7B,KAAK,EACL,GAAG,EACH,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,EAAE,EAChE,WAAW,CAAC,WAAW,EAAE,EACzB,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;YACf,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,wBAAwB,EAAE,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;YAC3G,IAAI,UAAU,KAAK,SAAS;gBAAE,OAAO,WAAW,CAAA;YAChD,OAAQ,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAc,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;QAC/F,CAAC,CACF,CAAA;QACD,OAAO,IAAI,KAAK,CAAC,OAAO,CAAA;QACxB,OAAO,KAAK,KAAK,CAAC,OAAO,CAAA;IAC3B,CAAC;IACD,IAAI,CAAC,QAAQ;QACX,MAAM,KAAK,CAAC,IAAI,CAAC,YAAY,CAC3B,SAAS,EACT,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EACpB,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,EACjE,SAAS,CACV,CAAA;IACH,qGAAqG;IACrG,IAAI,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,CAAA;QAC5F,MAAM,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;QACzE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC;YACtB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAU,CAAC;YACxD,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAU,CAAC;SACpD,CAAC,CAAA;QACF,MAAM,KAAK,CAAC,IAAI,CAAC,YAAY,CAC3B,SAAS,EACT,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EACrB,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAC5G,SAAS,CACV,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAA6C,EAAE,CAAA;IAChE,MAAM,UAAU,GAA4C,EAAE,CAAA;IAC9D,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,aAAa,GAAG,CAAC,CAAA;IACrB,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,IAAI,SAAS,GAAG,CAAC,CAAA;IACjB,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,iHAAiH;IACjH,2EAA2E;IAC3E,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAA;IAChF,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IAC/D,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,GAAG,EAAU,CAAC,CAAC,CAAC,KAAK,CAAA;IAC3D,MAAM,SAAS,GAAG,IAAI,GAAG,CACvB,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE;QACzC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QAC5F,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC3D,CAAC,CAAC,CACH,CAAA;IACD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC5C,MAAM,QAAQ,GAAuC,EAAE,CAAA;IACvD,IAAI,IAAI,GAAG,KAAK,CAAA;IAChB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QACxC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC3C,+GAA+G;QAC/G,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,EAAE,MAAM,KAAK,QAAQ,IAAI,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;YAChF,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACzB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;gBACnC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACpB,CAAC;;gBAAM,IAAI,GAAG,IAAI,CAAA;YAClB,SAAQ;QACV,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,aAAa,EAAE,CAAA;YACf,SAAQ;QACV,CAAC;QACD,2GAA2G;QAC3G,IAAI,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;YAC5B,QAAQ,EAAE,CAAA;YACV,SAAQ;QACV,CAAC;QACD,IAAI,IAAI,EAAE,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;;gBACxD,aAAa,EAAE,CAAA;YACpB,SAAQ;QACV,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;;YACvC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IACD,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC;QACpC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;QAC7D,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;KAC3D,CAAA;IACD,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE;QAC/B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;QAC5D,OAAO,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAA;IACzG,CAAC,CAAA;IACD,yFAAyF;IACzF,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,QAAQ,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC5B,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;YAC1B,SAAS;YACT,UAAU,EAAE,IAAI,CAAC,QAAQ;YACzB,GAAG,EAAE,SAAS;YACd,MAAM,EAAE;gBACN;oBACE,UAAU,EAAE,IAAI,CAAC,SAAS;oBAC1B,iGAAiG;oBACjG,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE,OAAO,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE;oBACpG,MAAM,EAAE,IAAI;oBACZ,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;oBACvC,QAAQ,EAAE,IAAI;oBACd,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;oBACvB,QAAQ,EAAE,OAAO,EAAE,IAAI,KAAK,GAAG,CAAC,OAAO;oBACvC,SAAS,EAAE,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC1D,GAAG,OAAO,CAAC,IAAI,CAAC;oBAChB,QAAQ,EAAE;wBACR,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE;wBACvD,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACzD,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACvD;iBACF;aACF;SACF,CAAC,CAAA;QACF,SAAS,EAAE,CAAA;IACb,CAAC;IACD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,WAAW,EAAE,CAAC;QACjE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,CAAC,CAAA;QACvD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACzC,gHAAgH;QAChH,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC;YAAE,MAAM,IAAI,CAAC,CAAC,CAAC,CAAA;QAChF,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5C,IAAI,IAAgB,CAAA;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;gBACvB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,YAAY,KAAK;oBAAE,MAAM,GAAG,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,CAAA;gBACjF,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,YAAY,CAAC,CAAA;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;gBAC5G,SAAQ;YACV,CAAC;YACD,MAAM,KAAK,GAAsB,EAAE,CAAA;YACnC,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC1D,MAAM,UAAU,GACd,IAAI,CAAC,KAAK,KAAK,IAAI;oBACjB,CAAC,CAAC,EAAE,MAAM,EAAE,aAAsB,EAAE;oBACpC,CAAC,CAAC,MAAM,WAAW,CACf,IAAI,CAAC,KAAK,EACV,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EACnE,UAAU,CACX,CAAA;gBACP,WAAW,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;gBACvF,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAA;gBAC5E,KAAK,CAAC,IAAI,CAAC;oBACT,QAAQ;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,KAAK,EAAE,IAAI;oBACX,GAAG,EAAE,IAAI;oBACT,IAAI,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU;oBACxD,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,IAAI;oBACZ,QAAQ,EAAE,IAAI;oBACd,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;oBACvD,SAAS,EAAE,IAAI;oBACf,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI;oBACpE,cAAc,EAAE,IAAI;oBACpB,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;oBACzC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;oBACjD,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM;oBACrD,aAAa,EAAE,IAAI;oBACnB,WAAW,EAAE,SAAS;iBACvB,CAAC,CAAA;YACJ,CAAC;YACD,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;gBAC1B,SAAS;gBACT,UAAU,EAAE,IAAI,CAAC,QAAQ;gBACzB,GAAG,EAAE,SAAS;gBACd,MAAM,EAAE;oBACN;wBACE,UAAU,EAAE,IAAI,CAAC,SAAS;wBAC1B,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;wBACtD,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;wBAC1B,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;wBAC1B,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC;wBAC5B,MAAM,EAAE,IAAI;wBACZ,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;wBACvC,QAAQ,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;wBAC3B,QAAQ,EAAE,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,OAAO;wBACrE,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC;wBAC5B,GAAG,OAAO,CAAC,IAAI,CAAC;wBAChB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACzD,WAAW,EAAE,KAAK;qBACnB;iBACF;aACF,CAAC,CAAA;YACF,KAAK,EAAE,CAAA;YACP,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC1C,IAAI,KAAK,KAAK,SAAS;gBACrB,MAAM,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;QAClH,CAAC;IACH,CAAC;IAED,iGAAiG;IACjG,IAAI,CAAC,QAAQ;QACX,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CACvB,SAAS,EACT,IAAI,GAAG,CACL,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAChD,IAAI,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;YACzC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAC7G,CACF,EACD,SAAS,CACV,CAAA;IAEH,MAAM,QAAQ,GAAG,CAAC,IAAI,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,CAAA;IACjD,IAAI,CAAC,QAAQ;QAAE,MAAM,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,mBAAmB,EAAE,KAAK,CAAC,CAAA;IACxE,MAAM,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,EAAE,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAA;IACpG,wGAAwG;IACxG,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,CAAC,CAAA;IAC3D,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IAC9C,MAAM,OAAO,GAAkB;QAC7B,GAAG,KAAK;QACR,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;QAClC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI;QAC7B,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;KAC7E,CAAA;IACD,MAAM,QAAQ,GAAG;QACf,OAAO;QACP,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE;QAC1B,KAAK,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;QACxC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAE,QAAkB,CAAC,CAAC,CAAE,SAAmB;QAC5D,QAAQ,EAAE,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,kBAAkB;KAChG,CAAA;IACD,IAAI,CAAC,QAAQ;QAAE,MAAM,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAA;IACvF,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE;QAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK;QACL,aAAa;QACb,OAAO,EAAE,QAAQ;QACjB,SAAS;QACT,OAAO;QACP,QAAQ;QACR,OAAO;QACP,QAAQ;QACR,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC;KAChE,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,9 @@
1
+ import type { MailSource } from "./source.js";
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mbox.d.ts","sourceRoot":"","sources":["../../src/mail/mbox.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AA+L7C;;;GAGG;AACH,eAAO,MAAM,UAAU,SAAU,MAAM,kBAA+B;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,KAAQ,UAqCnG,CAAA"}
@@ -0,0 +1,218 @@
1
+ import { createReadStream } from "node:fs";
2
+ import { open } from "node:fs/promises";
3
+ import { CliError } from "@wirecat/cli-base";
4
+ import { systemLabel } from "./gmail.js";
5
+ import { field, headersOf, unfold } from "./headers.js";
6
+ const NEWLINE = 10;
7
+ const CR = 13;
8
+ const SEPARATOR = Buffer.from("\nFrom ");
9
+ const MAX_HEADER = 256 * 1024;
10
+ const MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
11
+ /** Takeout's own marks, not labels the owner gave: read state and "not in Inbox". */
12
+ const PSEUDO_LABELS = new Set(["Opened", "Unread", "Archived"]);
13
+ /** `Mon Jul 24 10:00:00 +0000 2023`: asctime, with the zone Takeout writes. */
14
+ const separatorDate = (rest) => {
15
+ const match = /(\w{3}) +(\d{1,2}) (\d{2}):(\d{2}):(\d{2})(?: ([+-])(\d{2})(\d{2}))? (\d{4})/.exec(rest);
16
+ if (match === null)
17
+ return undefined;
18
+ const [, month = "", day, hour, minute, second, sign, offsetHours, offsetMinutes, year] = match;
19
+ if (!MONTHS.includes(month))
20
+ return undefined;
21
+ const local = Date.UTC(Number(year), MONTHS.indexOf(month), Number(day), Number(hour), Number(minute), Number(second));
22
+ const offset = sign === undefined ? 0 : (Number(offsetHours) * 60 + Number(offsetMinutes)) * 60_000;
23
+ return local - (sign === "-" ? -offset : offset);
24
+ };
25
+ /** RFC 2047 encoded words, which Takeout uses for labels outside ASCII. */
26
+ const decodeWords = (text) => text
27
+ .replace(/(\?=)\s+(=\?)/g, "$1$2")
28
+ .replace(/=\?([^?]+)\?([bBqQ])\?([^?]*)\?=/g, (_, charset, encoding, data) => {
29
+ const bytes = encoding.toUpperCase() === "B"
30
+ ? Buffer.from(data, "base64")
31
+ : Buffer.from(data
32
+ .replace(/_/g, " ")
33
+ .replace(/=([0-9A-Fa-f]{2})/g, (_hex, hex) => String.fromCharCode(parseInt(hex, 16))), "latin1");
34
+ try {
35
+ return new TextDecoder(charset).decode(bytes);
36
+ }
37
+ catch {
38
+ return bytes.toString("utf8");
39
+ }
40
+ });
41
+ const splitLabels = (value) => {
42
+ const labels = [];
43
+ let current = "";
44
+ let quoted = false;
45
+ for (const c of value) {
46
+ if (c === '"')
47
+ quoted = !quoted;
48
+ else if (c === "," && !quoted) {
49
+ labels.push(current);
50
+ current = "";
51
+ }
52
+ else
53
+ current += c;
54
+ }
55
+ labels.push(current);
56
+ return labels.map((label) => label.trim()).filter(Boolean);
57
+ };
58
+ const entryOf = (separator, header, start, body) => {
59
+ const [, sender = "", rest = ""] = /^From (\S+) ?(.*)$/.exec(separator) ?? [];
60
+ const messageId = /^(\d+)@/.exec(sender)?.[1];
61
+ // The id is what joins this archive to the IMAP account; never invented, so a wrong guess fails here.
62
+ if (messageId === undefined)
63
+ throw new CliError("invalid_response", `the mbox email at byte ${start} has no Gmail message id: its "From " line should read "From <digits>@xxx <date>"`);
64
+ const unfolded = unfold(header);
65
+ const date = separatorDate(rest) ?? Date.parse(field(unfolded, "Date") ?? "");
66
+ if (Number.isNaN(date))
67
+ throw new CliError("invalid_response", `the mbox email at byte ${start} has no readable date`);
68
+ const written = field(unfolded, "X-Gmail-Labels");
69
+ const raw = written === undefined ? undefined : splitLabels(decodeWords(written));
70
+ const labels = raw === undefined ? undefined : [...new Set(raw.filter((name) => !PSEUDO_LABELS.has(name)).map(systemLabel))].sort();
71
+ const seen = raw?.includes("Unread") ? false : raw?.includes("Opened") ? true : undefined;
72
+ const threadId = field(unfolded, "X-GM-THRID")?.trim();
73
+ return {
74
+ item: {
75
+ uid: messageId,
76
+ messageId,
77
+ threadId: threadId || messageId,
78
+ receivedAt: new Date(date).toISOString(),
79
+ ...(labels === undefined ? {} : { labels, flagged: labels.includes("Starred") }),
80
+ ...(seen === undefined ? {} : { seen }),
81
+ headers: headersOf(header),
82
+ },
83
+ start,
84
+ body,
85
+ end: -1,
86
+ };
87
+ };
88
+ /**
89
+ * One pass over the file: a "From " line after a blank line starts an email. Only headers are kept in memory;
90
+ * bodies are skipped with a byte search, so a 20 GB archive costs one read and no more memory than its headers.
91
+ */
92
+ const scan = async (path, chunkSize) => {
93
+ const entries = [];
94
+ let base = 0;
95
+ let pos = 0;
96
+ let bodyFrom = 0;
97
+ let inHeaders = true;
98
+ let separator;
99
+ let start = 0;
100
+ let body = 0;
101
+ let lines = [];
102
+ let headerBytes = 0;
103
+ const take = (buf, eof) => {
104
+ for (;;) {
105
+ if (inHeaders) {
106
+ let nl = buf.indexOf(NEWLINE, pos);
107
+ if (nl === -1) {
108
+ if (!eof || pos >= buf.length)
109
+ return Math.max(0, pos - 2);
110
+ nl = buf.length;
111
+ }
112
+ let line = buf.subarray(pos, nl);
113
+ if (line.at(-1) === CR)
114
+ line = line.subarray(0, -1);
115
+ if (separator === undefined) {
116
+ separator = line.toString("latin1");
117
+ if (!separator.startsWith("From "))
118
+ throw new CliError("validation_error", `${path} is not an mbox file: byte ${base + pos} starts no "From " line`);
119
+ start = base + pos;
120
+ body = base + nl + 1;
121
+ }
122
+ else if (line.length === 0) {
123
+ entries.push(entryOf(separator, Buffer.concat(lines).toString("utf8"), start, body));
124
+ lines = [];
125
+ headerBytes = 0;
126
+ inHeaders = false;
127
+ bodyFrom = nl;
128
+ }
129
+ else if (headerBytes < MAX_HEADER) {
130
+ lines.push(Buffer.from(line), Buffer.from("\n"));
131
+ headerBytes += line.length + 1;
132
+ }
133
+ pos = nl + 1;
134
+ continue;
135
+ }
136
+ const at = buf.indexOf(SEPARATOR, bodyFrom);
137
+ if (at === -1) {
138
+ const next = Math.max(bodyFrom, buf.length - (SEPARATOR.length - 1));
139
+ const keep = Math.max(0, next - 2);
140
+ bodyFrom = next - keep;
141
+ return keep;
142
+ }
143
+ const blank = buf[at - 1] === NEWLINE || (buf[at - 1] === CR && buf[at - 2] === NEWLINE);
144
+ if (!blank) {
145
+ bodyFrom = at + 1;
146
+ continue;
147
+ }
148
+ const last = entries.at(-1);
149
+ if (last)
150
+ last.end = base + at + 1;
151
+ inHeaders = true;
152
+ separator = undefined;
153
+ pos = at + 1;
154
+ }
155
+ };
156
+ let carry = Buffer.alloc(0);
157
+ for await (const chunk of createReadStream(path, { highWaterMark: chunkSize })) {
158
+ const buf = carry.length ? Buffer.concat([carry, chunk]) : chunk;
159
+ const keep = take(buf, false);
160
+ base += keep;
161
+ pos -= keep;
162
+ carry = buf.subarray(keep);
163
+ }
164
+ take(carry, true);
165
+ if (inHeaders && separator !== undefined)
166
+ entries.push(entryOf(separator, Buffer.concat(lines).toString("utf8"), start, body));
167
+ const last = entries.at(-1);
168
+ if (last && last.end === -1)
169
+ last.end = base + carry.length;
170
+ for (const entry of entries)
171
+ entry.item.size = entry.end - entry.start;
172
+ return entries;
173
+ };
174
+ /** The email as Gmail stored it: the blank line mbox adds after it removed, and mboxrd's `>From ` undone. */
175
+ const asStored = (bytes) => {
176
+ const text = bytes.toString("latin1");
177
+ const trimmed = /\r?\n\r?\n$/.test(text) ? text.replace(/\r?\n$/, "") : text;
178
+ return Buffer.from(trimmed.replace(/^>(>*From )/gm, "$1"), "latin1");
179
+ };
180
+ /**
181
+ * A Google Takeout mbox of Gmail: the same message and thread ids IMAP reports, so its emails and the
182
+ * account's IMAP emails are one set. Spam and Trash are left out, as IMAP's All Mail leaves them out.
183
+ */
184
+ export const mboxSource = (path, { chunkSize = 1024 * 1024 } = {}) => {
185
+ let index;
186
+ const indexed = () => {
187
+ index ??= scan(path, chunkSize).then((entries) => new Map(entries.map((entry) => [entry.item.messageId, entry])));
188
+ return index;
189
+ };
190
+ return {
191
+ list: async (since, folder) => [...(await indexed()).values()]
192
+ .filter(({ item }) => Date.parse(item.receivedAt) >= since.getTime() &&
193
+ !item.labels?.some((label) => label === "Spam" || label === "Trash"))
194
+ .map(({ item }) => ({ ...item, folder })),
195
+ fetchRaw: async (items) => {
196
+ const entries = await indexed();
197
+ const handle = await open(path);
198
+ try {
199
+ const read = [];
200
+ for (const item of items) {
201
+ const entry = entries.get(item.messageId);
202
+ if (entry === undefined) {
203
+ read.push(new CliError("not_found", `email ${item.messageId} is not in the mbox file`));
204
+ continue;
205
+ }
206
+ const bytes = Buffer.alloc(entry.end - entry.body);
207
+ await handle.read(bytes, 0, bytes.length, entry.body);
208
+ read.push(asStored(bytes));
209
+ }
210
+ return read;
211
+ }
212
+ finally {
213
+ await handle.close();
214
+ }
215
+ },
216
+ };
217
+ };
218
+ //# sourceMappingURL=mbox.js.map