@diskd-ai/email-client-mcp 0.1.21 → 0.1.22

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 (36) hide show
  1. package/dist/config/schema.d.ts +56 -0
  2. package/dist/config/schema.js +15 -0
  3. package/dist/config/schema.js.map +1 -1
  4. package/dist/domain/errors.d.ts +2 -0
  5. package/dist/domain/errors.js +18 -0
  6. package/dist/domain/errors.js.map +1 -1
  7. package/dist/imap/fetch.d.ts +14 -1
  8. package/dist/imap/fetch.js +58 -4
  9. package/dist/imap/fetch.js.map +1 -1
  10. package/dist/imap/mapper.js +12 -2
  11. package/dist/imap/mapper.js.map +1 -1
  12. package/dist/server.js +31 -3
  13. package/dist/server.js.map +1 -1
  14. package/dist/store/payloadTypes.d.ts +7 -0
  15. package/dist/sync/attachmentHydration.d.ts +44 -0
  16. package/dist/sync/attachmentHydration.js +118 -0
  17. package/dist/sync/attachmentHydration.js.map +1 -0
  18. package/dist/sync/bodyHydration.d.ts +52 -0
  19. package/dist/sync/bodyHydration.js +103 -0
  20. package/dist/sync/bodyHydration.js.map +1 -0
  21. package/dist/sync/sync.d.ts +9 -5
  22. package/dist/sync/sync.js +74 -43
  23. package/dist/sync/sync.js.map +1 -1
  24. package/dist/sync/watcher.d.ts +2 -0
  25. package/dist/sync/watcher.js +4 -0
  26. package/dist/sync/watcher.js.map +1 -1
  27. package/dist/tools/registry.d.ts +4 -0
  28. package/dist/tools/registry.js +10 -0
  29. package/dist/tools/registry.js.map +1 -1
  30. package/dist/tools/systemHydrateEmailAttachment.d.ts +26 -0
  31. package/dist/tools/systemHydrateEmailAttachment.js +13 -0
  32. package/dist/tools/systemHydrateEmailAttachment.js.map +1 -0
  33. package/dist/tools/systemHydrateEmailBodies.d.ts +40 -0
  34. package/dist/tools/systemHydrateEmailBodies.js +21 -0
  35. package/dist/tools/systemHydrateEmailBodies.js.map +1 -0
  36. package/package.json +1 -1
@@ -0,0 +1,118 @@
1
+ import { errorMessage, isRetryableImapError, notFound } from "../domain/errors.js";
2
+ import { Err, Ok } from "../domain/result.js";
3
+ import { attachmentIdFor } from "../store/attachments.js";
4
+ const resolvedAttachmentId = (payload, attachment) => attachment.attachmentId ?? attachmentIdFor(payload.uidValidity, payload.uid, attachment.partId);
5
+ const findAttachment = (payload, attachmentId) => payload.attachments.find((attachment) => resolvedAttachmentId(payload, attachment) === attachmentId) ?? null;
6
+ const patchAttachment = (payload, attachmentId, patch) => {
7
+ let patchedAttachment = null;
8
+ const attachments = payload.attachments.map((attachment) => {
9
+ const nextAttachment = {
10
+ ...attachment,
11
+ attachmentId: resolvedAttachmentId(payload, attachment),
12
+ };
13
+ if (nextAttachment.attachmentId !== attachmentId)
14
+ return nextAttachment;
15
+ patchedAttachment = patch(nextAttachment);
16
+ return patchedAttachment;
17
+ });
18
+ return { payload: { ...payload, attachments }, attachment: patchedAttachment };
19
+ };
20
+ const patchLoaded = (payload, attachmentId, uploaded) => patchAttachment(payload, attachmentId, (attachment) => {
21
+ const { lastLoadError: _lastLoadError, ...rest } = attachment;
22
+ return {
23
+ ...rest,
24
+ storageState: "loaded",
25
+ storedSizeBytes: uploaded.storedSizeBytes,
26
+ storedAt: uploaded.storedAt,
27
+ };
28
+ });
29
+ const patchFailed = (payload, attachmentId, status, message) => patchAttachment(payload, attachmentId, (attachment) => ({
30
+ ...attachment,
31
+ storageState: status,
32
+ lastLoadError: message,
33
+ }));
34
+ const persist = async (deps, ref, payload) => {
35
+ const upsert = await deps.drive.upsertMessages(ref.mailboxId, ref.folderId, [payload], [ref.externalId]);
36
+ if (upsert.tag === "Err")
37
+ return upsert;
38
+ return Ok(payload);
39
+ };
40
+ const isRetryableAppFailure = (cause) => isRetryableImapError(cause);
41
+ const outcome = (ref, payload, status, attachment, error) => ({
42
+ status,
43
+ mailboxId: ref.mailboxId,
44
+ folderId: ref.folderId,
45
+ externalId: ref.externalId,
46
+ attachmentId: ref.attachmentId,
47
+ attachment,
48
+ payload,
49
+ error,
50
+ });
51
+ export const hydrateStoredMessageAttachment = async (deps, ref, options) => {
52
+ const existing = await deps.drive.getMessage(ref.mailboxId, ref.folderId, ref.externalId);
53
+ if (existing.tag === "Err")
54
+ return existing;
55
+ if (existing.value === null)
56
+ return Err(notFound(`message ${ref.externalId}`));
57
+ const payload = existing.value;
58
+ const attachment = findAttachment(payload, ref.attachmentId);
59
+ if (attachment === null) {
60
+ return Ok(outcome(ref, payload, "failed_permanent", null, `attachment not found: ${ref.attachmentId}`));
61
+ }
62
+ const attachmentWithId = {
63
+ ...attachment,
64
+ attachmentId: resolvedAttachmentId(payload, attachment),
65
+ };
66
+ if (attachmentWithId.storageState === "loaded" && options?.refresh !== true) {
67
+ return Ok(outcome(ref, payload, "skipped", attachmentWithId, null));
68
+ }
69
+ if (attachmentWithId.partId.length === 0) {
70
+ const message = `attachment partId is missing: ${ref.attachmentId}`;
71
+ const patched = patchFailed(payload, ref.attachmentId, "failed_permanent", message);
72
+ const persisted = await persist(deps, ref, patched.payload);
73
+ if (persisted.tag === "Err")
74
+ return persisted;
75
+ return Ok(outcome(ref, persisted.value, "failed_permanent", patched.attachment, message));
76
+ }
77
+ let downloaded;
78
+ try {
79
+ downloaded = await deps.imap.downloadPart(payload.accountId, payload.mailbox, payload.uid, attachmentWithId.partId);
80
+ }
81
+ catch (cause) {
82
+ const message = cause?.message ?? String(cause);
83
+ const status = isRetryableAppFailure(cause) ? "failed_retryable" : "failed_permanent";
84
+ const patched = patchFailed(payload, ref.attachmentId, status, message);
85
+ const persisted = await persist(deps, ref, patched.payload);
86
+ if (persisted.tag === "Err")
87
+ return persisted;
88
+ return Ok(outcome(ref, persisted.value, status, patched.attachment, message));
89
+ }
90
+ const uploadAttachment = {
91
+ ...attachmentWithId,
92
+ sizeBytes: downloaded.sizeBytes ?? attachmentWithId.sizeBytes,
93
+ contentType: downloaded.contentType ?? attachmentWithId.contentType,
94
+ };
95
+ const uploaded = await (async () => {
96
+ try {
97
+ return await deps.drive.uploadAttachment(ref.mailboxId, ref.folderId, ref.externalId, uploadAttachment, downloaded.content);
98
+ }
99
+ finally {
100
+ downloaded.dispose();
101
+ }
102
+ })();
103
+ if (uploaded.tag === "Err") {
104
+ const message = errorMessage(uploaded.error);
105
+ const status = isRetryableAppFailure(message) ? "failed_retryable" : "failed_permanent";
106
+ const patched = patchFailed(payload, ref.attachmentId, status, message);
107
+ const persisted = await persist(deps, ref, patched.payload);
108
+ if (persisted.tag === "Err")
109
+ return persisted;
110
+ return Ok(outcome(ref, persisted.value, status, patched.attachment, message));
111
+ }
112
+ const patched = patchLoaded(payload, ref.attachmentId, uploaded.value);
113
+ const persisted = await persist(deps, ref, patched.payload);
114
+ if (persisted.tag === "Err")
115
+ return persisted;
116
+ return Ok(outcome(ref, persisted.value, "loaded", patched.attachment, null));
117
+ };
118
+ //# sourceMappingURL=attachmentHydration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachmentHydration.js","sourceRoot":"","sources":["../../src/sync/attachmentHydration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { type AppError, type ImapError } from "../domain/errors.js";
2
+ import { type Result } from "../domain/result.js";
3
+ import type { StoredEmailPayload } from "../store/payloadTypes.js";
4
+ export type FetchedBodyContent = {
5
+ readonly bodyText: string | null;
6
+ readonly bodyHtml: string | null;
7
+ readonly truncated: boolean;
8
+ readonly bytesRead: number;
9
+ };
10
+ export type BodyHydrationRef = {
11
+ readonly mailboxId: string;
12
+ readonly folderId: string;
13
+ readonly externalId: string;
14
+ };
15
+ export type BodyHydrationDeps = {
16
+ readonly drive: {
17
+ readonly getMessage: (mailboxId: string, folderId: string, externalId: string) => Promise<Result<AppError, StoredEmailPayload | null>>;
18
+ readonly upsertMessages: (mailboxId: string, folderId: string, payloads: readonly StoredEmailPayload[], externalIds: readonly string[]) => Promise<Result<AppError, {
19
+ inserted: number;
20
+ updated: number;
21
+ }>>;
22
+ };
23
+ readonly imap: {
24
+ readonly fetchBody: (accountId: string, mailbox: string, uid: number) => Promise<Result<ImapError, FetchedBodyContent | null>>;
25
+ };
26
+ readonly now: () => Date;
27
+ };
28
+ export type BodyHydrationStatus = "loaded" | "skipped" | "failed_retryable" | "failed_permanent";
29
+ export type BodyHydrationOutcome = {
30
+ readonly status: BodyHydrationStatus;
31
+ readonly payload: StoredEmailPayload;
32
+ readonly error: string | null;
33
+ };
34
+ export type BodyHydrationBatchItem = BodyHydrationOutcome & {
35
+ readonly ref: BodyHydrationRef;
36
+ };
37
+ export type BodyHydrationBatchResult = {
38
+ readonly loaded: readonly BodyHydrationBatchItem[];
39
+ readonly skipped: readonly BodyHydrationBatchItem[];
40
+ readonly failedRetryable: readonly BodyHydrationBatchItem[];
41
+ readonly failedPermanent: readonly BodyHydrationBatchItem[];
42
+ };
43
+ export declare const markBodyLoaded: (payload: StoredEmailPayload, body: FetchedBodyContent, now: Date) => StoredEmailPayload;
44
+ export declare const markBodyFailedRetryable: (payload: StoredEmailPayload, error: string, now: Date) => StoredEmailPayload;
45
+ export declare const markBodyFailedPermanent: (payload: StoredEmailPayload, error: string, now: Date) => StoredEmailPayload;
46
+ export declare const hydrateStoredMessageBody: (deps: BodyHydrationDeps, ref: BodyHydrationRef, options?: {
47
+ readonly refresh?: boolean;
48
+ }) => Promise<Result<AppError, BodyHydrationOutcome>>;
49
+ export declare const hydrateStoredMessageBodies: (deps: BodyHydrationDeps, refs: readonly BodyHydrationRef[], options?: {
50
+ readonly refresh?: boolean;
51
+ readonly maxMessages?: number;
52
+ }) => Promise<Result<AppError, BodyHydrationBatchResult>>;
@@ -0,0 +1,103 @@
1
+ import { errorMessage, isRetryableImapError, notFound, } from "../domain/errors.js";
2
+ import { Err, Ok } from "../domain/result.js";
3
+ import { htmlToText } from "../imap/mapper.js";
4
+ const buildSnippet = (bodyText, bodyHtml) => {
5
+ const text = bodyText ?? (bodyHtml !== null ? htmlToText(bodyHtml) : null);
6
+ if (text === null)
7
+ return "";
8
+ return text.replace(/\s+/g, " ").trim().slice(0, 200);
9
+ };
10
+ const messageHasLoadedBody = (payload) => payload.bodyState === "loaded" ||
11
+ (payload.bodyState === undefined && (payload.bodyText !== null || payload.bodyHtml !== null));
12
+ export const markBodyLoaded = (payload, body, now) => ({
13
+ ...payload,
14
+ snippet: buildSnippet(body.bodyText, body.bodyHtml),
15
+ bodyText: body.bodyText,
16
+ bodyHtml: body.bodyHtml,
17
+ truncated: payload.truncated || body.truncated,
18
+ bodyState: "loaded",
19
+ bodyFetchedAt: now.toISOString(),
20
+ bodyFetchError: null,
21
+ });
22
+ export const markBodyFailedRetryable = (payload, error, now) => ({
23
+ ...payload,
24
+ bodyState: "failed_retryable",
25
+ bodyFetchedAt: now.toISOString(),
26
+ bodyFetchError: error,
27
+ });
28
+ export const markBodyFailedPermanent = (payload, error, now) => ({
29
+ ...payload,
30
+ bodyState: "failed_permanent",
31
+ bodyFetchedAt: now.toISOString(),
32
+ bodyFetchError: error,
33
+ });
34
+ const persistBodyState = async (deps, ref, payload) => {
35
+ const upsert = await deps.drive.upsertMessages(ref.mailboxId, ref.folderId, [payload], [ref.externalId]);
36
+ if (upsert.tag === "Err")
37
+ return upsert;
38
+ return Ok(payload);
39
+ };
40
+ const imapFailureIsRetryable = (error) => isRetryableImapError(error.message) || isRetryableImapError(error.cause);
41
+ export const hydrateStoredMessageBody = async (deps, ref, options) => {
42
+ const existing = await deps.drive.getMessage(ref.mailboxId, ref.folderId, ref.externalId);
43
+ if (existing.tag === "Err")
44
+ return existing;
45
+ if (existing.value === null)
46
+ return Err(notFound(`message ${ref.externalId}`));
47
+ const payload = existing.value;
48
+ if (options?.refresh !== true && messageHasLoadedBody(payload)) {
49
+ return Ok({ status: "skipped", payload, error: null });
50
+ }
51
+ const fetched = await deps.imap.fetchBody(payload.accountId, payload.mailbox, payload.uid);
52
+ if (fetched.tag === "Err") {
53
+ const message = errorMessage(fetched.error);
54
+ const patched = imapFailureIsRetryable(fetched.error)
55
+ ? markBodyFailedRetryable(payload, message, deps.now())
56
+ : markBodyFailedPermanent(payload, message, deps.now());
57
+ const persisted = await persistBodyState(deps, ref, patched);
58
+ if (persisted.tag === "Err")
59
+ return persisted;
60
+ return Ok({
61
+ status: imapFailureIsRetryable(fetched.error) ? "failed_retryable" : "failed_permanent",
62
+ payload: persisted.value,
63
+ error: message,
64
+ });
65
+ }
66
+ if (fetched.value === null) {
67
+ const message = `message body not found: ${ref.externalId}`;
68
+ const patched = markBodyFailedPermanent(payload, message, deps.now());
69
+ const persisted = await persistBodyState(deps, ref, patched);
70
+ if (persisted.tag === "Err")
71
+ return persisted;
72
+ return Ok({ status: "failed_permanent", payload: persisted.value, error: message });
73
+ }
74
+ const patched = markBodyLoaded(payload, fetched.value, deps.now());
75
+ const persisted = await persistBodyState(deps, ref, patched);
76
+ if (persisted.tag === "Err")
77
+ return persisted;
78
+ return Ok({ status: "loaded", payload: persisted.value, error: null });
79
+ };
80
+ export const hydrateStoredMessageBodies = async (deps, refs, options) => {
81
+ const maxMessages = options?.maxMessages ?? refs.length;
82
+ const selectedRefs = refs.slice(0, Math.max(0, maxMessages));
83
+ const loaded = [];
84
+ const skipped = [];
85
+ const failedRetryable = [];
86
+ const failedPermanent = [];
87
+ for (const ref of selectedRefs) {
88
+ const result = await hydrateStoredMessageBody(deps, ref, { refresh: options?.refresh });
89
+ if (result.tag === "Err")
90
+ return result;
91
+ const item = { ...result.value, ref };
92
+ if (item.status === "loaded")
93
+ loaded.push(item);
94
+ else if (item.status === "skipped")
95
+ skipped.push(item);
96
+ else if (item.status === "failed_retryable")
97
+ failedRetryable.push(item);
98
+ else
99
+ failedPermanent.push(item);
100
+ }
101
+ return Ok({ loaded, skipped, failedRetryable, failedPermanent });
102
+ };
103
+ //# sourceMappingURL=bodyHydration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bodyHydration.js","sourceRoot":"","sources":["../../src/sync/bodyHydration.ts"],"names":[],"mappings":"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"}
@@ -21,7 +21,7 @@ import { type Account, type WatcherSettings } from "../config/schema.js";
21
21
  import { type AppError, type ImapError } from "../domain/errors.js";
22
22
  import { type Result } from "../domain/result.js";
23
23
  import { type FetchedMessageLike } from "../imap/mapper.js";
24
- import { type UploadAttachmentResult } from "../store/attachments.js";
24
+ import type { UploadAttachmentResult } from "../store/attachments.js";
25
25
  import type { StoredAttachment, StoredEmailPayload, SyncState } from "../store/payloadTypes.js";
26
26
  export type SyncDeps = {
27
27
  readonly drive: {
@@ -56,12 +56,14 @@ export type SyncDeps = {
56
56
  uidNext: number;
57
57
  messages: number;
58
58
  }>>;
59
- readonly fetchRange: (accountId: string, path: string, fromUid: number, toUid: number) => AsyncIterable<{
60
- readonly imapMessage: FetchedMessageLike;
59
+ readonly fetchMetadataRange: (accountId: string, path: string, fromUid: number, toUid: number) => AsyncIterable<FetchedMessageLike>;
60
+ readonly fetchEnvelopesRange: (accountId: string, path: string, fromUid: number, toUid: number) => AsyncIterable<FetchedMessageLike>;
61
+ readonly fetchBody: (accountId: string, mailbox: string, uid: number) => Promise<Result<ImapError, {
61
62
  readonly bodyText: string | null;
62
63
  readonly bodyHtml: string | null;
63
- }>;
64
- readonly fetchEnvelopesRange: (accountId: string, path: string, fromUid: number, toUid: number) => AsyncIterable<FetchedMessageLike>;
64
+ readonly truncated: boolean;
65
+ readonly bytesRead: number;
66
+ } | null>>;
65
67
  readonly downloadPart: (accountId: string, path: string, uid: number, partId: string) => Promise<{
66
68
  readonly content: AsyncIterable<Uint8Array>;
67
69
  readonly sizeBytes: number | null;
@@ -75,6 +77,8 @@ export type SyncFolderReport = {
75
77
  readonly folderId: string;
76
78
  readonly newMessages: number;
77
79
  readonly reconciledFlags: number;
80
+ readonly hydratedBodies: number;
81
+ readonly bodyHydrationErrors: number;
78
82
  readonly uidValidityRolled: boolean;
79
83
  readonly error: string | null;
80
84
  };
package/dist/sync/sync.js CHANGED
@@ -21,8 +21,8 @@ import { isOAuthAccount } from "../config/schema.js";
21
21
  import { errorMessage, imapError } from "../domain/errors.js";
22
22
  import { Err } from "../domain/result.js";
23
23
  import { toStoredPayload } from "../imap/mapper.js";
24
- import { patchAttachmentStorageRef, withAttachmentId, } from "../store/attachments.js";
25
24
  import { externalIdFor, sanitizeMailboxId } from "../store/conventions.js";
25
+ import { hydrateStoredMessageBodies } from "./bodyHydration.js";
26
26
  const BATCH_SIZE = 50;
27
27
  const parseSyncState = (raw) => {
28
28
  if (raw === null)
@@ -59,19 +59,34 @@ const mergeReconciledFlags = (existing, incoming) => {
59
59
  fetchedAt: incoming.fetchedAt,
60
60
  };
61
61
  };
62
+ const isAllMailFolder = (folderPath, specialUse) => specialUse === "\\All" || /(?:^|\/)All Mail$/i.test(folderPath);
63
+ const bodyHydrationEnabledForFolder = (watcher, folderPath, specialUse) => {
64
+ const settings = watcher.body_hydration;
65
+ if (settings.enabled !== true || settings.max_messages_per_tick <= 0)
66
+ return false;
67
+ if (settings.skip_all_mail && isAllMailFolder(folderPath, specialUse))
68
+ return false;
69
+ return true;
70
+ };
62
71
  /**
63
72
  * Sync one folder. Returns the per-folder report; never throws.
64
73
  * `lastSyncedUid` is advanced only after each successful batch upsert.
65
74
  */
66
- const syncFolder = async (deps, account, mailboxId, folderPath, flagWindow) => {
75
+ const syncFolder = async (deps, account, mailboxId, folderPath, specialUse, watcher) => {
67
76
  const folderId = folderPath;
68
77
  const startIso = deps.now().toISOString();
78
+ const flagWindow = watcher.flag_reconcile_window;
79
+ const bodyHydrationCandidates = [];
80
+ let hydratedBodies = 0;
81
+ let bodyHydrationErrors = 0;
69
82
  const statusR = await deps.imap.folderStatus(account.name, folderPath);
70
83
  if (statusR.tag === "Err") {
71
84
  return {
72
85
  folderId,
73
86
  newMessages: 0,
74
87
  reconciledFlags: 0,
88
+ hydratedBodies: 0,
89
+ bodyHydrationErrors: 0,
75
90
  uidValidityRolled: false,
76
91
  error: errorMessage(statusR.error),
77
92
  };
@@ -83,6 +98,8 @@ const syncFolder = async (deps, account, mailboxId, folderPath, flagWindow) => {
83
98
  folderId,
84
99
  newMessages: 0,
85
100
  reconciledFlags: 0,
101
+ hydratedBodies: 0,
102
+ bodyHydrationErrors: 0,
86
103
  uidValidityRolled: false,
87
104
  error: errorMessage(existing.error),
88
105
  };
@@ -98,6 +115,8 @@ const syncFolder = async (deps, account, mailboxId, folderPath, flagWindow) => {
98
115
  folderId,
99
116
  newMessages: 0,
100
117
  reconciledFlags: 0,
118
+ hydratedBodies: 0,
119
+ bodyHydrationErrors: 0,
101
120
  uidValidityRolled,
102
121
  error: errorMessage(del.error),
103
122
  };
@@ -126,6 +145,8 @@ const syncFolder = async (deps, account, mailboxId, folderPath, flagWindow) => {
126
145
  folderId,
127
146
  newMessages: 0,
128
147
  reconciledFlags: 0,
148
+ hydratedBodies: 0,
149
+ bodyHydrationErrors: 0,
129
150
  uidValidityRolled,
130
151
  error: errorMessage(w.error),
131
152
  };
@@ -144,6 +165,8 @@ const syncFolder = async (deps, account, mailboxId, folderPath, flagWindow) => {
144
165
  folderId,
145
166
  newMessages: 0,
146
167
  reconciledFlags: 0,
168
+ hydratedBodies: 0,
169
+ bodyHydrationErrors: 0,
147
170
  uidValidityRolled,
148
171
  error: errorMessage(w.error),
149
172
  };
@@ -164,6 +187,8 @@ const syncFolder = async (deps, account, mailboxId, folderPath, flagWindow) => {
164
187
  folderId,
165
188
  newMessages,
166
189
  reconciledFlags: 0,
190
+ hydratedBodies,
191
+ bodyHydrationErrors,
167
192
  uidValidityRolled,
168
193
  error: errorMessage(w.error),
169
194
  };
@@ -172,6 +197,8 @@ const syncFolder = async (deps, account, mailboxId, folderPath, flagWindow) => {
172
197
  folderId,
173
198
  newMessages,
174
199
  reconciledFlags: 0,
200
+ hydratedBodies,
201
+ bodyHydrationErrors,
175
202
  uidValidityRolled,
176
203
  error: errorMessage(error),
177
204
  };
@@ -179,54 +206,27 @@ const syncFolder = async (deps, account, mailboxId, folderPath, flagWindow) => {
179
206
  for (const [batchFrom, batchTo] of range(fromUid, toUid)) {
180
207
  let sawMessageInBatch = false;
181
208
  try {
182
- for await (const bundle of deps.imap.fetchRange(account.name, folderPath, batchFrom, batchTo)) {
209
+ for await (const imapMessage of deps.imap.fetchMetadataRange(account.name, folderPath, batchFrom, batchTo)) {
183
210
  sawMessageInBatch = true;
184
- const uid = bundle.imapMessage.uid;
211
+ const uid = imapMessage.uid;
185
212
  const externalId = externalIdFor(status.uidValidity, uid);
186
- let payload = toStoredPayload(bundle.imapMessage, {
213
+ const payload = toStoredPayload(imapMessage, {
187
214
  accountId: account.name,
188
215
  mailbox: folderPath,
189
216
  uidValidity: status.uidValidity,
190
217
  fetchedAt: deps.now(),
191
- bodyText: bundle.bodyText,
192
- bodyHtml: bundle.bodyHtml,
218
+ bodyText: null,
219
+ bodyHtml: null,
193
220
  truncated: false,
194
221
  });
195
- const initialUpsert = await deps.drive.upsertMessages(mailboxId, folderId, [payload], [externalId]);
196
- if (initialUpsert.tag === "Err") {
197
- return await finishWithError(initialUpsert.error);
198
- }
199
- if (payload.attachments.length === 0) {
200
- newMessages += initialUpsert.value.inserted + initialUpsert.value.updated;
201
- lastSynced = uid;
202
- continue;
222
+ const upsert = await deps.drive.upsertMessages(mailboxId, folderId, [payload], [externalId]);
223
+ if (upsert.tag === "Err") {
224
+ return await finishWithError(upsert.error);
203
225
  }
204
- for (const rawAttachment of payload.attachments) {
205
- const attachment = withAttachmentId(rawAttachment, status.uidValidity, uid);
206
- const downloaded = await deps.imap.downloadPart(account.name, folderPath, uid, attachment.partId);
207
- const uploadAttachment = {
208
- ...attachment,
209
- sizeBytes: downloaded.sizeBytes ?? attachment.sizeBytes,
210
- contentType: downloaded.contentType ?? attachment.contentType,
211
- };
212
- const uploaded = await (async () => {
213
- try {
214
- return await deps.drive.uploadAttachment(mailboxId, folderId, externalId, uploadAttachment, downloaded.content);
215
- }
216
- finally {
217
- downloaded.dispose();
218
- }
219
- })();
220
- if (uploaded.tag === "Err") {
221
- return await finishWithError(uploaded.error);
222
- }
223
- payload = patchAttachmentStorageRef(payload, attachment.attachmentId, uploaded.value);
226
+ newMessages += upsert.value.inserted + upsert.value.updated;
227
+ if (bodyHydrationEnabledForFolder(watcher, folderPath, specialUse)) {
228
+ bodyHydrationCandidates.push({ mailboxId, folderId, externalId });
224
229
  }
225
- const finalUpsert = await deps.drive.upsertMessages(mailboxId, folderId, [payload], [externalId]);
226
- if (finalUpsert.tag === "Err") {
227
- return await finishWithError(finalUpsert.error);
228
- }
229
- newMessages += initialUpsert.value.inserted + initialUpsert.value.updated;
230
230
  lastSynced = uid;
231
231
  }
232
232
  }
@@ -240,7 +240,7 @@ const syncFolder = async (deps, account, mailboxId, folderPath, flagWindow) => {
240
240
  lastSynced = batchTo;
241
241
  }
242
242
  // Checkpoint: write once after the batch, but the value is the
243
- // highest UID whose full message payload + attachment bytes are durable.
243
+ // highest UID whose metadata payload is durable.
244
244
  const checkpoint = {
245
245
  ...state,
246
246
  uidValidity: status.uidValidity,
@@ -255,6 +255,8 @@ const syncFolder = async (deps, account, mailboxId, folderPath, flagWindow) => {
255
255
  folderId,
256
256
  newMessages,
257
257
  reconciledFlags: 0,
258
+ hydratedBodies,
259
+ bodyHydrationErrors,
258
260
  uidValidityRolled,
259
261
  error: errorMessage(w.error),
260
262
  };
@@ -262,6 +264,21 @@ const syncFolder = async (deps, account, mailboxId, folderPath, flagWindow) => {
262
264
  state = checkpoint;
263
265
  }
264
266
  }
267
+ if (bodyHydrationCandidates.length > 0) {
268
+ const hydration = await hydrateStoredMessageBodies({
269
+ drive: deps.drive,
270
+ imap: { fetchBody: deps.imap.fetchBody },
271
+ now: deps.now,
272
+ }, bodyHydrationCandidates.slice().reverse(), { maxMessages: watcher.body_hydration.max_messages_per_tick });
273
+ if (hydration.tag === "Ok") {
274
+ hydratedBodies = hydration.value.loaded.length;
275
+ bodyHydrationErrors =
276
+ hydration.value.failedRetryable.length + hydration.value.failedPermanent.length;
277
+ }
278
+ else {
279
+ bodyHydrationErrors = bodyHydrationCandidates.length;
280
+ }
281
+ }
265
282
  // Sliding-window flag reconciliation. Bounds drift to flagWindow UIDs.
266
283
  let reconciledFlags = 0;
267
284
  if (flagWindow > 0 && lastSynced > 0) {
@@ -286,6 +303,8 @@ const syncFolder = async (deps, account, mailboxId, folderPath, flagWindow) => {
286
303
  folderId,
287
304
  newMessages,
288
305
  reconciledFlags: 0,
306
+ hydratedBodies,
307
+ bodyHydrationErrors,
289
308
  uidValidityRolled,
290
309
  error: errorMessage(existingPayload.error),
291
310
  };
@@ -301,6 +320,8 @@ const syncFolder = async (deps, account, mailboxId, folderPath, flagWindow) => {
301
320
  folderId,
302
321
  newMessages,
303
322
  reconciledFlags: 0,
323
+ hydratedBodies,
324
+ bodyHydrationErrors,
304
325
  uidValidityRolled,
305
326
  error: errorMessage(ups.error),
306
327
  };
@@ -315,12 +336,22 @@ const syncFolder = async (deps, account, mailboxId, folderPath, flagWindow) => {
315
336
  folderId,
316
337
  newMessages,
317
338
  reconciledFlags: 0,
339
+ hydratedBodies,
340
+ bodyHydrationErrors,
318
341
  uidValidityRolled,
319
342
  error: errorMessage(e),
320
343
  };
321
344
  }
322
345
  }
323
- return { folderId, newMessages, reconciledFlags, uidValidityRolled, error: null };
346
+ return {
347
+ folderId,
348
+ newMessages,
349
+ reconciledFlags,
350
+ hydratedBodies,
351
+ bodyHydrationErrors,
352
+ uidValidityRolled,
353
+ error: null,
354
+ };
324
355
  };
325
356
  /**
326
357
  * Run one sync tick for one account. Sequentially walks all folders,
@@ -363,7 +394,7 @@ export const runSyncOnce = async (deps, account, watcher) => {
363
394
  })();
364
395
  const reports = [];
365
396
  for (const f of filteredFolders) {
366
- const r = await syncFolder(deps, account, mailboxId, f.path, watcher.flag_reconcile_window);
397
+ const r = await syncFolder(deps, account, mailboxId, f.path, f.specialUse, watcher);
367
398
  reports.push(r);
368
399
  }
369
400
  // Prune Drive folders that disappeared from IMAP.
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"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"}