@remit/mailbox-service 0.0.111 → 0.0.113

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 (298) hide show
  1. package/dist/account-credentials.d.ts +83 -0
  2. package/dist/account-credentials.js +104 -0
  3. package/dist/attribute-mapper.d.ts +36 -0
  4. package/dist/attribute-mapper.js +119 -0
  5. package/dist/body-parse.d.ts +28 -0
  6. package/{src/body-parse.ts → dist/body-parse.js} +18 -26
  7. package/dist/body-part-mapper.d.ts +92 -0
  8. package/dist/body-part-mapper.js +301 -0
  9. package/dist/body-sync-queue.d.ts +59 -0
  10. package/dist/body-sync-queue.js +56 -0
  11. package/dist/body-sync-terminal.d.ts +58 -0
  12. package/dist/body-sync-terminal.js +95 -0
  13. package/dist/body-sync.d.ts +351 -0
  14. package/dist/body-sync.js +1204 -0
  15. package/dist/calendar-parts.d.ts +23 -0
  16. package/dist/calendar-parts.js +18 -0
  17. package/dist/classification-backfill.d.ts +91 -0
  18. package/dist/classification-backfill.js +180 -0
  19. package/dist/classify-message.d.ts +31 -0
  20. package/dist/classify-message.js +89 -0
  21. package/dist/connection-factory.d.ts +54 -0
  22. package/dist/connection-factory.js +54 -0
  23. package/dist/connection-test.d.ts +41 -0
  24. package/dist/connection-test.js +152 -0
  25. package/dist/external-move.d.ts +94 -0
  26. package/dist/external-move.js +173 -0
  27. package/dist/filter-operations.d.ts +42 -0
  28. package/dist/filter-operations.js +211 -0
  29. package/dist/filters/filter-config.d.ts +14 -0
  30. package/dist/filters/filter-config.js +10 -0
  31. package/{src/filters/list-id.ts → dist/filters/list-id.d.ts} +2 -16
  32. package/dist/filters/list-id.js +26 -0
  33. package/dist/filters/match.d.ts +69 -0
  34. package/dist/filters/match.js +165 -0
  35. package/dist/filters/pipeline.d.ts +64 -0
  36. package/dist/filters/pipeline.js +100 -0
  37. package/{src/flag-push-terminal.ts → dist/flag-push-terminal.d.ts} +19 -77
  38. package/dist/flag-push-terminal.js +63 -0
  39. package/dist/flag-push.d.ts +69 -0
  40. package/dist/flag-push.js +111 -0
  41. package/dist/flag-queue.d.ts +175 -0
  42. package/dist/flag-queue.js +291 -0
  43. package/dist/folder-operations.d.ts +39 -0
  44. package/dist/folder-operations.js +112 -0
  45. package/dist/folder-placement.d.ts +13 -0
  46. package/dist/folder-placement.js +23 -0
  47. package/dist/heuristics/authenticationResults.d.ts +10 -0
  48. package/dist/heuristics/authenticationResults.js +187 -0
  49. package/dist/heuristics/classifyByHeaders.d.ts +82 -0
  50. package/dist/heuristics/classifyByHeaders.js +365 -0
  51. package/dist/heuristics/classifyPlacement.d.ts +67 -0
  52. package/dist/heuristics/classifyPlacement.js +153 -0
  53. package/dist/heuristics/machineSenders.d.ts +21 -0
  54. package/{src/heuristics/machineSenders.ts → dist/heuristics/machineSenders.js} +34 -40
  55. package/dist/heuristics/senderMismatch.d.ts +81 -0
  56. package/dist/heuristics/senderMismatch.js +192 -0
  57. package/dist/heuristics/socialDomains.d.ts +14 -0
  58. package/{src/heuristics/socialDomains.ts → dist/heuristics/socialDomains.js} +9 -9
  59. package/dist/heuristics/transactionalDomains.d.ts +18 -0
  60. package/{src/heuristics/transactionalDomains.ts → dist/heuristics/transactionalDomains.js} +8 -8
  61. package/dist/imapflow-connection.d.ts +377 -0
  62. package/dist/imapflow-connection.js +1147 -0
  63. package/dist/index.d.ts +63 -0
  64. package/dist/index.js +65 -0
  65. package/dist/list-id-backfill.d.ts +83 -0
  66. package/dist/list-id-backfill.js +132 -0
  67. package/dist/mailbox-cursor-rebuild.d.ts +74 -0
  68. package/dist/mailbox-cursor-rebuild.js +71 -0
  69. package/{src/mailbox-cursor.ts → dist/mailbox-cursor.d.ts} +20 -98
  70. package/dist/mailbox-cursor.js +102 -0
  71. package/dist/mailbox-intent.d.ts +41 -0
  72. package/{src/mailbox-intent.ts → dist/mailbox-intent.js} +39 -63
  73. package/dist/mailbox-management.d.ts +240 -0
  74. package/dist/mailbox-management.js +576 -0
  75. package/dist/mailbox-presence.d.ts +52 -0
  76. package/{src/mailbox-presence.ts → dist/mailbox-presence.js} +19 -30
  77. package/dist/mailbox-queue.d.ts +126 -0
  78. package/dist/mailbox-queue.js +214 -0
  79. package/dist/mailbox-sync.d.ts +93 -0
  80. package/dist/mailbox-sync.js +490 -0
  81. package/dist/mailbox-upstream.d.ts +38 -0
  82. package/{src/mailbox-upstream.ts → dist/mailbox-upstream.js} +37 -47
  83. package/dist/message-category.d.ts +51 -0
  84. package/{src/message-category.ts → dist/message-category.js} +28 -71
  85. package/dist/message-move.d.ts +285 -0
  86. package/dist/message-move.js +858 -0
  87. package/dist/message-parser.d.ts +14 -0
  88. package/dist/message-parser.js +17 -0
  89. package/{src/message-presence.ts → dist/message-presence.d.ts} +1 -13
  90. package/dist/message-presence.js +29 -0
  91. package/dist/message-read.d.ts +51 -0
  92. package/dist/message-read.js +31 -0
  93. package/dist/message-sync.d.ts +345 -0
  94. package/dist/message-sync.js +1358 -0
  95. package/dist/mime-walker.d.ts +102 -0
  96. package/dist/mime-walker.js +198 -0
  97. package/dist/organize-job.d.ts +20 -0
  98. package/dist/organize-job.js +37 -0
  99. package/dist/outbox-attachment-content.d.ts +37 -0
  100. package/dist/outbox-attachment-content.js +50 -0
  101. package/dist/outbox-attachment-filename.d.ts +19 -0
  102. package/dist/outbox-attachment-filename.js +64 -0
  103. package/dist/outbox-attachment.d.ts +148 -0
  104. package/dist/outbox-attachment.js +273 -0
  105. package/dist/outbox-queue.d.ts +73 -0
  106. package/dist/outbox-queue.js +284 -0
  107. package/{src/outbox-status.ts → dist/outbox-status.d.ts} +1 -6
  108. package/dist/outbox-status.js +18 -0
  109. package/dist/ownership.d.ts +24 -0
  110. package/dist/ownership.js +83 -0
  111. package/dist/placement-move-terminal.d.ts +67 -0
  112. package/dist/placement-move-terminal.js +88 -0
  113. package/dist/placement-move.d.ts +83 -0
  114. package/dist/placement-move.js +216 -0
  115. package/{src/placement-settled.ts → dist/placement-settled.d.ts} +19 -50
  116. package/dist/placement-settled.js +75 -0
  117. package/dist/quarantine.d.ts +95 -0
  118. package/dist/quarantine.js +131 -0
  119. package/dist/refusal.d.ts +31 -0
  120. package/dist/refusal.js +3 -0
  121. package/{src/restore-source-placement.ts → dist/restore-source-placement.d.ts} +29 -101
  122. package/dist/restore-source-placement.js +79 -0
  123. package/dist/search-text-backfill.d.ts +15 -0
  124. package/dist/search-text-backfill.js +33 -0
  125. package/dist/snippet.d.ts +61 -0
  126. package/dist/snippet.js +129 -0
  127. package/dist/spam-report.d.ts +86 -0
  128. package/dist/spam-report.js +241 -0
  129. package/dist/sync-warning.d.ts +21 -0
  130. package/dist/sync-warning.js +26 -0
  131. package/dist/sync-watermarks.d.ts +138 -0
  132. package/dist/sync-watermarks.js +205 -0
  133. package/dist/test-helpers/fake-imap.d.ts +151 -0
  134. package/dist/test-helpers/fake-imap.js +508 -0
  135. package/dist/test-helpers/folder-roles.d.ts +34 -0
  136. package/dist/test-helpers/folder-roles.js +47 -0
  137. package/dist/test-helpers/mime-tree-generator.d.ts +82 -0
  138. package/dist/test-helpers/mime-tree-generator.js +329 -0
  139. package/dist/test-helpers/test-store.d.ts +69 -0
  140. package/dist/test-helpers/test-store.js +193 -0
  141. package/dist/text/normalizer.d.ts +20 -0
  142. package/dist/text/normalizer.js +102 -0
  143. package/dist/thread-message-rows.d.ts +69 -0
  144. package/dist/thread-message-rows.js +40 -0
  145. package/dist/thread-root.d.ts +7 -0
  146. package/dist/thread-root.js +25 -0
  147. package/dist/types.d.ts +343 -0
  148. package/dist/types.js +19 -0
  149. package/package.json +86 -73
  150. package/src/account-credentials.ts +0 -210
  151. package/src/adversarial-mime.e2e.test.ts +0 -307
  152. package/src/attribute-mapper.test.ts +0 -104
  153. package/src/attribute-mapper.ts +0 -148
  154. package/src/body-parse.test.ts +0 -55
  155. package/src/body-part-mapper.property.test.ts +0 -354
  156. package/src/body-part-mapper.ts +0 -360
  157. package/src/body-sync-auto-read-writeonce.test.ts +0 -219
  158. package/src/body-sync-calendar-suggestion.test.ts +0 -433
  159. package/src/body-sync-category-denormalize.test.ts +0 -352
  160. package/src/body-sync-category-override.test.ts +0 -501
  161. package/src/body-sync-category-writeonce.test.ts +0 -234
  162. package/src/body-sync-filter.test.ts +0 -237
  163. package/src/body-sync-message-gone.test.ts +0 -139
  164. package/src/body-sync-placement-flags.test.ts +0 -347
  165. package/src/body-sync-placement-writeonce.test.ts +0 -337
  166. package/src/body-sync-quarantine.test.ts +0 -276
  167. package/src/body-sync-queue.test.ts +0 -124
  168. package/src/body-sync-queue.ts +0 -131
  169. package/src/body-sync-resync.test.ts +0 -605
  170. package/src/body-sync-terminal.test.ts +0 -310
  171. package/src/body-sync-terminal.ts +0 -176
  172. package/src/body-sync-unclassifiable-once.test.ts +0 -260
  173. package/src/body-sync-unsubscribed-auto-read.test.ts +0 -176
  174. package/src/body-sync.ts +0 -1970
  175. package/src/calendar-parts.ts +0 -41
  176. package/src/classification-backfill.test.ts +0 -615
  177. package/src/classification-backfill.ts +0 -363
  178. package/src/classify-message.test.ts +0 -205
  179. package/src/classify-message.ts +0 -116
  180. package/src/connection-factory.ts +0 -102
  181. package/src/connection-test.ts +0 -208
  182. package/src/credentials.test.ts +0 -181
  183. package/src/external-move.test.ts +0 -369
  184. package/src/external-move.ts +0 -272
  185. package/src/filters/anchor-drift.ts +0 -55
  186. package/src/filters/filter-config.test.ts +0 -229
  187. package/src/filters/filter-config.ts +0 -69
  188. package/src/filters/list-id.test.ts +0 -50
  189. package/src/filters/match.test.ts +0 -429
  190. package/src/filters/match.ts +0 -274
  191. package/src/filters/message-embedder.test.ts +0 -39
  192. package/src/filters/message-embedder.ts +0 -33
  193. package/src/filters/pipeline.test.ts +0 -330
  194. package/src/filters/pipeline.ts +0 -284
  195. package/src/flag-push-terminal.test.ts +0 -209
  196. package/src/flag-push.test.ts +0 -408
  197. package/src/flag-push.ts +0 -198
  198. package/src/flag-queue-stars.test.ts +0 -171
  199. package/src/flag-queue.ts +0 -509
  200. package/src/folder-placement.ts +0 -56
  201. package/src/heuristics/authenticationResults.test.ts +0 -189
  202. package/src/heuristics/authenticationResults.ts +0 -212
  203. package/src/heuristics/classifyByHeaders.test.ts +0 -889
  204. package/src/heuristics/classifyByHeaders.ts +0 -467
  205. package/src/heuristics/classifyPlacement.test.ts +0 -366
  206. package/src/heuristics/classifyPlacement.ts +0 -211
  207. package/src/heuristics/classifyRealMail.test.ts +0 -242
  208. package/src/heuristics/machineSenders.test.ts +0 -101
  209. package/src/heuristics/senderMismatch.test.ts +0 -346
  210. package/src/heuristics/senderMismatch.ts +0 -259
  211. package/src/imapflow-connect-retry.test.ts +0 -134
  212. package/src/imapflow-connection.e2e.test.ts +0 -335
  213. package/src/imapflow-connection.integ.test.ts +0 -316
  214. package/src/imapflow-connection.test.ts +0 -469
  215. package/src/imapflow-connection.ts +0 -1475
  216. package/src/index.ts +0 -350
  217. package/src/list-id-backfill.test.ts +0 -573
  218. package/src/list-id-backfill.ts +0 -274
  219. package/src/mailbox-cursor-rebuild.test.ts +0 -171
  220. package/src/mailbox-cursor-rebuild.ts +0 -146
  221. package/src/mailbox-cursor.test.ts +0 -249
  222. package/src/mailbox-delete-intent.test.ts +0 -246
  223. package/src/mailbox-management.test.ts +0 -356
  224. package/src/mailbox-management.ts +0 -839
  225. package/src/mailbox-presence.test.ts +0 -72
  226. package/src/mailbox-queue.ts +0 -415
  227. package/src/mailbox-rename-intent.test.ts +0 -389
  228. package/src/mailbox-rename-subtree.test.ts +0 -664
  229. package/src/mailbox-sync.test.ts +0 -848
  230. package/src/mailbox-sync.ts +0 -724
  231. package/src/message-delete-junk-reconcile.test.ts +0 -117
  232. package/src/message-delete-no-trash.test.ts +0 -245
  233. package/src/message-delete-unsettled-placement.test.ts +0 -396
  234. package/src/message-move-copy.test.ts +0 -562
  235. package/src/message-move-empty-trash.test.ts +0 -326
  236. package/src/message-move-same-mailbox.test.ts +0 -139
  237. package/src/message-move-unsettled-placement.test.ts +0 -378
  238. package/src/message-move.ts +0 -1348
  239. package/src/message-parser.ts +0 -26
  240. package/src/message-presence.test.ts +0 -50
  241. package/src/message-sync-address-spoof.test.ts +0 -293
  242. package/src/message-sync-category.test.ts +0 -142
  243. package/src/message-sync-changedsince.test.ts +0 -840
  244. package/src/message-sync-flags.test.ts +0 -158
  245. package/src/message-sync-junk-harvest.test.ts +0 -244
  246. package/src/message-sync-quarantine.test.ts +0 -416
  247. package/src/message-sync-repoint.test.ts +0 -419
  248. package/src/message-sync.ts +0 -1963
  249. package/src/mime-walker.test.ts +0 -311
  250. package/src/mime-walker.ts +0 -305
  251. package/src/outbox-attachment-content.test.ts +0 -153
  252. package/src/outbox-attachment-content.ts +0 -104
  253. package/src/outbox-attachment-filename.test.ts +0 -132
  254. package/src/outbox-attachment-filename.ts +0 -76
  255. package/src/outbox-attachment.test.ts +0 -738
  256. package/src/outbox-attachment.ts +0 -536
  257. package/src/outbox-failed-recovery.test.ts +0 -370
  258. package/src/outbox-queue-settled-row.test.ts +0 -140
  259. package/src/outbox-queue.test.ts +0 -291
  260. package/src/outbox-queue.ts +0 -508
  261. package/src/pass-through-unit-of-work.ts +0 -17
  262. package/src/placement-move-terminal.test.ts +0 -300
  263. package/src/placement-move-terminal.ts +0 -148
  264. package/src/placement-move-unsettled.test.ts +0 -275
  265. package/src/placement-move.ts +0 -336
  266. package/src/placement-settled.test.ts +0 -147
  267. package/src/placement-transition-race.test.ts +0 -482
  268. package/src/quarantine.test.ts +0 -191
  269. package/src/quarantine.ts +0 -228
  270. package/src/snippet.test.ts +0 -213
  271. package/src/snippet.ts +0 -152
  272. package/src/spam-report.test.ts +0 -801
  273. package/src/spam-report.ts +0 -357
  274. package/src/stale-message-reconcile.test.ts +0 -82
  275. package/src/stale-message-reconcile.ts +0 -55
  276. package/src/sync-watermarks.test.ts +0 -409
  277. package/src/sync-watermarks.ts +0 -319
  278. package/src/system-flag-wire-format.test.ts +0 -77
  279. package/src/test-helpers/folder-roles.ts +0 -66
  280. package/src/test-helpers/isolated-mailbox.ts +0 -44
  281. package/src/test-helpers/mailfuzz-connection.ts +0 -27
  282. package/src/test-helpers/mime-tree-generator.ts +0 -461
  283. package/src/text/normalizer.test.ts +0 -223
  284. package/src/text/normalizer.ts +0 -140
  285. package/src/thread-message-rows.ts +0 -77
  286. package/src/types/mailparser-augment.d.ts +0 -15
  287. package/src/types/natural-porter-stemmer.d.ts +0 -50
  288. package/src/types/stopword.d.ts +0 -69
  289. package/src/types.ts +0 -371
  290. package/test/fixtures/mime-adversarial-e2e/01-octet-stream-pdf.eml +0 -21
  291. package/test/fixtures/mime-adversarial-e2e/02-nested-related-cid-image.eml +0 -31
  292. package/test/fixtures/mime-adversarial-e2e/03-calendar-invite.eml +0 -33
  293. package/test/fixtures/mime-adversarial-e2e/04-forwarded-rfc822-with-attachments.eml +0 -42
  294. package/test/fixtures/mime-adversarial-e2e/05-tnef-winmail.eml +0 -25
  295. package/test/fixtures/mime-adversarial-e2e/06-8bit-non-ascii.eml +0 -15
  296. package/test/fixtures/mime-adversarial-e2e/07-quoted-printable-soft-breaks.eml +0 -17
  297. package/test/fixtures/mime-adversarial-e2e/08-alternative-empty-text.eml +0 -18
  298. package/tsconfig.json +0 -8
@@ -0,0 +1,377 @@
1
+ /**
2
+ * ImapFlow-based IMAP connection
3
+ *
4
+ * Modern async/await replacement for the node-imap based ImapConnection.
5
+ * Provides the same interface but uses ImapFlow under the hood.
6
+ */
7
+ import { Readable } from "node:stream";
8
+ import type { FlatMailboxInfo, ImapBoxStatus, ImapConnectionConfig, ImapConnectionState, ImapEnvelopeSnapshot, ImapMailboxStatus, ImapMessage, ImapNamespaces } from "./types.js";
9
+ /**
10
+ * Convert an envelope date into an ISO string, tolerating non-Date values.
11
+ *
12
+ * imapflow types `envelope.date` as a Date, but a malformed `Date:` header can
13
+ * leave it as a string or other value at runtime. Returns "" for absent or
14
+ * invalid dates so one bad header never poisons the whole fetch batch.
15
+ */
16
+ export declare const toIsoDateString: (value: unknown) => string;
17
+ /**
18
+ * Coerce an IMAP INTERNALDATE into a valid `Date`, tolerating malformed input.
19
+ *
20
+ * INTERNALDATE is the server's receive time and is almost always a clean Date.
21
+ * But a broken server (or an unexpected imapflow runtime value) can yield a
22
+ * string that `new Date` cannot parse, or a wholly unexpected type. Either way
23
+ * `getTime()` would be `NaN`, which is the message's date-of-last-resort — it
24
+ * is the fallback `parseHeaderDate` uses and is stored as the message's
25
+ * `internalDate` — so a `NaN` here silently corrupts every downstream date and
26
+ * gets rejected by ElectroDB, permanently failing the message.
27
+ *
28
+ * When the value cannot produce a valid Date we fall back to `now` so the
29
+ * message still syncs with an approximate receive time rather than being
30
+ * dropped. Returns `null` only for a genuinely absent value, which the caller
31
+ * skips (a transient imapflow artifact, see #408 — not bad data).
32
+ */
33
+ export declare const toInternalDate: (value: unknown) => Date | null;
34
+ /**
35
+ * Compile node-imap style search criteria into an ImapFlow search object.
36
+ *
37
+ * A criterion this does not understand throws, and so does an empty criteria
38
+ * list. imapflow reads an empty object as `SEARCH ALL`
39
+ * (`imapflow/lib/commands/search.js`), so quietly skipping one turns a narrow
40
+ * probe into "every message in the mailbox" — the reconcile and move paths then
41
+ * act on a stranger's UID (#912). Header names accumulate in a Map so that a
42
+ * name like `__proto__` lands as a query term rather than hitting the
43
+ * prototype setter and vanishing.
44
+ *
45
+ * Values travel as structured tokens, never interpolated into a criterion
46
+ * string, so a quote or a CRLF in a header value cannot alter the query.
47
+ */
48
+ export declare const convertSearchCriteria: (criteria: unknown[]) => Record<string, unknown>;
49
+ /**
50
+ * ImapFlow-based IMAP connection
51
+ *
52
+ * Drop-in replacement for ImapConnection using the ImapFlow library.
53
+ * Benefits:
54
+ * - Native async/await API (no callback wrapping)
55
+ * - Built-in envelope parsing that works with mokapi
56
+ * - Proper IDLE support with events
57
+ * - Built-in TypeScript types
58
+ * - Active maintenance
59
+ */
60
+ export declare class ImapFlowConnection {
61
+ private client;
62
+ private _state;
63
+ private config;
64
+ private currentMailbox;
65
+ constructor(config: ImapConnectionConfig);
66
+ /**
67
+ * Current connection state
68
+ */
69
+ get state(): ImapConnectionState;
70
+ /**
71
+ * Whether the connection is established and authenticated
72
+ */
73
+ get isConnected(): boolean;
74
+ /**
75
+ * Connect to the IMAP server with retry logic.
76
+ *
77
+ * Retries up to 3 times with exponential backoff (1s, 2s, 4s) on connection errors.
78
+ * Authentication errors are not retried.
79
+ */
80
+ connect: () => Promise<void>;
81
+ /**
82
+ * Single connection attempt
83
+ */
84
+ private attemptConnect;
85
+ /**
86
+ * Cleanup client state for retry
87
+ */
88
+ private cleanup;
89
+ /**
90
+ * Sleep for a specified duration
91
+ */
92
+ private sleep;
93
+ /**
94
+ * Disconnect from the IMAP server
95
+ */
96
+ disconnect: () => Promise<void>;
97
+ /**
98
+ * Get IMAP namespaces
99
+ *
100
+ * Note: ImapFlow doesn't expose namespaces directly, so we return
101
+ * the default namespace. The mailbox listing works without explicit
102
+ * namespace handling in ImapFlow.
103
+ */
104
+ getNamespaces: () => Promise<ImapNamespaces>;
105
+ /**
106
+ * List all mailboxes as a flat list, preserving original paths from server.
107
+ * This avoids path corruption from split/join operations.
108
+ *
109
+ * @param nsPrefix - Optional namespace prefix to filter mailboxes
110
+ */
111
+ listMailboxes: (nsPrefix?: string) => Promise<FlatMailboxInfo[]>;
112
+ /**
113
+ * Convert ImapFlow flags Set to string array
114
+ */
115
+ private convertFlags;
116
+ /**
117
+ * Open a mailbox for reading
118
+ *
119
+ * @param mailboxPath - Full path to the mailbox (e.g., "INBOX", "[Gmail]/Sent")
120
+ * @param readOnly - Whether to open read-only (default: true)
121
+ */
122
+ openBox: (mailboxPath: string, readOnly?: boolean) => Promise<ImapBoxStatus>;
123
+ /**
124
+ * Build an ImapBoxStatus from an imapflow MailboxObject.
125
+ */
126
+ private toBoxStatus;
127
+ /**
128
+ * Close the currently open mailbox
129
+ *
130
+ * @param _expunge - Whether to permanently remove deleted messages (not used in ImapFlow)
131
+ */
132
+ closeBox: (_expunge?: boolean) => Promise<void>;
133
+ /**
134
+ * Search for messages, answering UIDs.
135
+ *
136
+ * imapflow answers a successful SEARCH with an array — empty when the
137
+ * server matched nothing — and `false` when the command failed or no
138
+ * mailbox was selected. Collapsing the two into `[]` makes a failed SEARCH
139
+ * indistinguishable from an empty mailbox, and every caller here acts on
140
+ * emptiness by deleting something: the cursor rebuild reads it as "every
141
+ * local row is stale", and {@link isMessageGoneFromOpenMailbox} reads it as
142
+ * "this message is gone". A failure therefore throws.
143
+ */
144
+ search: (criteria: unknown[]) => Promise<number[]>;
145
+ /**
146
+ * Fetch messages by UID
147
+ *
148
+ * Uses ImapFlow's native envelope parsing which works correctly
149
+ * with all IMAP servers including mokapi.
150
+ */
151
+ fetchMessages: (uids: number[]) => Promise<ImapMessage[]>;
152
+ /**
153
+ * True when this session negotiated CONDSTORE (RFC 7162) and the open
154
+ * mailbox keeps persistent mod-sequences.
155
+ *
156
+ * Both halves matter. `enabled` reflects the ENABLE exchange, not merely
157
+ * the advertised capability, and a server may still answer NOMODSEQ for an
158
+ * individual mailbox — in which case RFC 7162 Section 3.1.2.2 requires it
159
+ * to reject CHANGEDSINCE with a BAD response.
160
+ */
161
+ supportsCondstore: () => boolean;
162
+ /**
163
+ * FETCH everything in the open mailbox whose MODSEQ is strictly greater
164
+ * than `sinceModseq` — new arrivals and metadata changes to messages
165
+ * already synced, in one pass over the whole UID space.
166
+ *
167
+ * The CONDSTORE guard is load-bearing rather than defensive: imapflow drops
168
+ * the CHANGEDSINCE modifier when the extension is unavailable, so the same
169
+ * call would degrade into a fetch of every message in the mailbox.
170
+ */
171
+ fetchMessagesChangedSince: (sinceModseq: bigint) => Promise<ImapMessage[]>;
172
+ /**
173
+ * One UID FETCH over `range`, mapped to {@link ImapMessage}. The shared
174
+ * body of {@link fetchMessages} and {@link fetchMessagesChangedSince} —
175
+ * both need identical message shapes and differ only in what they select.
176
+ */
177
+ private runMessageFetch;
178
+ /**
179
+ * Cheap envelope-only FETCH for the UIDVALIDITY cursor rebuild (#1272):
180
+ * UID + Message-ID + INTERNALDATE only — no flags, no BODYSTRUCTURE, no
181
+ * References header, no body. Deliberately lighter than {@link
182
+ * fetchMessages} so a rebuild pass over a large mailbox stays cheap (epic
183
+ * #1281 invariant 6).
184
+ */
185
+ fetchEnvelopeSnapshots: (uids: number[]) => Promise<ImapEnvelopeSnapshot[]>;
186
+ /**
187
+ * Fetch the full message body (RFC822 source) for a single message by UID.
188
+ *
189
+ * @param uid - The UID of the message to fetch
190
+ * @returns The raw message body, or null when the UID FETCH matched no message
191
+ */
192
+ fetchMessageBody: (uid: number) => Promise<Buffer | null>;
193
+ /**
194
+ * Fetch full message bodies (RFC822 source) for many UIDs in ONE pipelined
195
+ * ranged UID FETCH on a single connection — the desktop-client pattern.
196
+ *
197
+ * Mirrors `fetchMessages`: one comma-joined UID range, one `client.fetch`,
198
+ * one SELECT (the caller opens the box once for the whole batch). Yields
199
+ * `{ uid, source }` as each message arrives so the caller can stream each
200
+ * body straight to storage without buffering the whole batch.
201
+ *
202
+ * `source` is a readable stream over the message bytes — callers must
203
+ * consume it (e.g. pipe to an upload) before requesting the next item.
204
+ */
205
+ fetchMessageBodies(uids: number[]): AsyncGenerator<{
206
+ uid: number;
207
+ source: Readable;
208
+ }>;
209
+ /**
210
+ * Parse the References header from IMAP headers buffer.
211
+ * Returns an array of Message-IDs, with the first being the thread root.
212
+ */
213
+ private parseReferencesHeader;
214
+ /**
215
+ * Convert ImapFlow envelope to our ImapEnvelope format
216
+ */
217
+ private convertEnvelope;
218
+ /**
219
+ * Add flags to messages by UID.
220
+ * Requires mailbox to be open (not read-only).
221
+ *
222
+ * @param uids - Array of message UIDs
223
+ * @param flags - Array of flags to add (e.g., ["\\Seen", "\\Flagged"])
224
+ */
225
+ addFlags: (uids: number[], flags: string[]) => Promise<void>;
226
+ /**
227
+ * Remove flags from messages by UID.
228
+ * Requires mailbox to be open (not read-only).
229
+ *
230
+ * @param uids - Array of message UIDs
231
+ * @param flags - Array of flags to remove (e.g., ["\\Seen", "\\Flagged"])
232
+ */
233
+ removeFlags: (uids: number[], flags: string[]) => Promise<void>;
234
+ /**
235
+ * Replace all flags on messages by UID.
236
+ * Requires mailbox to be open (not read-only).
237
+ *
238
+ * @param uids - Array of message UIDs
239
+ * @param flags - Array of flags to set (replaces all existing flags)
240
+ */
241
+ setFlags: (uids: number[], flags: string[]) => Promise<void>;
242
+ /**
243
+ * Create a new mailbox.
244
+ *
245
+ * @param path - Full path of the mailbox to create (e.g., "Projects/ClientA")
246
+ * @returns Object with path and whether it was created (false if already exists)
247
+ */
248
+ createMailbox: (path: string) => Promise<{
249
+ path: string;
250
+ created: boolean;
251
+ }>;
252
+ /**
253
+ * Delete a mailbox.
254
+ *
255
+ * @param path - Full path of the mailbox to delete
256
+ * @returns Object with the deleted path
257
+ */
258
+ deleteMailbox: (path: string) => Promise<{
259
+ path: string;
260
+ }>;
261
+ /**
262
+ * Rename a mailbox.
263
+ *
264
+ * @param oldPath - Current path of the mailbox
265
+ * @param newPath - New path for the mailbox
266
+ * @returns Object with old and new paths
267
+ */
268
+ renameMailbox: (oldPath: string, newPath: string) => Promise<{
269
+ path: string;
270
+ newPath: string;
271
+ }>;
272
+ /**
273
+ * Subscribe to a mailbox.
274
+ *
275
+ * @param path - Full path of the mailbox to subscribe to
276
+ */
277
+ subscribeMailbox: (path: string) => Promise<void>;
278
+ /**
279
+ * Unsubscribe from a mailbox.
280
+ *
281
+ * @param path - Full path of the mailbox to unsubscribe from
282
+ */
283
+ unsubscribeMailbox: (path: string) => Promise<void>;
284
+ /**
285
+ * Move messages to another mailbox.
286
+ * Uses ImapFlow's messageMove which wraps UID MOVE command.
287
+ * Returns mapping of source UIDs to destination UIDs from COPYUID response.
288
+ *
289
+ * @param uids - Array of message UIDs to move
290
+ * @param destination - Destination mailbox path
291
+ * @returns Object with destination path, uidValidity, and uidMap
292
+ */
293
+ moveMessages: (uids: number[], destination: string) => Promise<{
294
+ destination: string;
295
+ uidValidity: number;
296
+ uidMap: Map<number, number>;
297
+ }>;
298
+ /**
299
+ * Copy messages to another mailbox.
300
+ * Uses ImapFlow's messageCopy which wraps UID COPY command.
301
+ * Returns mapping of source UIDs to destination UIDs from COPYUID response.
302
+ *
303
+ * @param uids - Array of message UIDs to copy
304
+ * @param destination - Destination mailbox path
305
+ * @returns Object with destination path, uidValidity, and uidMap
306
+ */
307
+ copyMessages: (uids: number[], destination: string) => Promise<{
308
+ destination: string;
309
+ uidValidity: number;
310
+ uidMap: Map<number, number>;
311
+ }>;
312
+ /**
313
+ * Permanently delete messages (mark \Deleted + expunge).
314
+ * Uses ImapFlow's messageDelete which wraps STORE +FLAGS.SILENT \Deleted
315
+ * followed by UID EXPUNGE.
316
+ *
317
+ * @param uids - Array of message UIDs to delete
318
+ * @returns Number of messages deleted
319
+ */
320
+ deleteMessages: (uids: number[]) => Promise<number>;
321
+ /**
322
+ * Get mailbox status.
323
+ *
324
+ * Message/unseen counts come from the IMAP STATUS command (no SELECT). The
325
+ * \Deleted count is not part of imapflow's typed STATUS query (there is no
326
+ * IMAP4rev2 STATUS=DELETED in the API), so it is derived by selecting the
327
+ * mailbox read-only and running SEARCH \Deleted — a projection re-read from
328
+ * the server, never a locally computed value.
329
+ *
330
+ * @param mailboxPath - Full path to the mailbox
331
+ * @returns Mailbox status including unseen and deleted counts
332
+ */
333
+ getMailboxStatus: (mailboxPath: string) => Promise<ImapMailboxStatus>;
334
+ /**
335
+ * Count messages flagged \Deleted but not yet expunged.
336
+ *
337
+ * Selects the mailbox read-only (no state change) and counts SEARCH \Deleted
338
+ * hits. Read-only SELECT is idempotent against an already-open mailbox.
339
+ */
340
+ private countDeleted;
341
+ /**
342
+ * Append a message to a mailbox.
343
+ * Used primarily for testing to seed messages.
344
+ *
345
+ * @param mailbox - Mailbox path to append to
346
+ * @param message - RFC 822 message content
347
+ * @param flags - Optional flags to set on the message
348
+ * @returns Object with destination path, uidValidity, and uid of the appended message
349
+ */
350
+ append: (mailbox: string, message: string | Buffer, flags?: string[]) => Promise<{
351
+ destination: string;
352
+ uidValidity: number;
353
+ uid: number;
354
+ }>;
355
+ /**
356
+ * Ensure the connection is established
357
+ */
358
+ private ensureConnected;
359
+ }
360
+ /**
361
+ * Create an ImapFlow connection from account data using password credentials.
362
+ */
363
+ export declare const createImapFlowConnectionFromAccount: (account: {
364
+ imapHost: string;
365
+ imapPort: number;
366
+ imapTls: boolean;
367
+ username: string;
368
+ }, password: string) => ImapFlowConnection;
369
+ /**
370
+ * Create an ImapFlow connection using a credentials union (password or OAuth access token).
371
+ */
372
+ export declare const createImapFlowConnectionWithCredentials: (account: {
373
+ imapHost: string;
374
+ imapPort: number;
375
+ imapTls: boolean;
376
+ username: string;
377
+ }, credentials: import("./types.js").MailCredentials) => ImapFlowConnection;