fluxmail 0.20.0 → 0.21.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 (62) hide show
  1. package/dist/accounts/oauthCallback.d.ts +6 -3
  2. package/dist/accounts/oauthCallback.d.ts.map +1 -1
  3. package/dist/accounts/oauthCallback.js +8 -6
  4. package/dist/accounts/oauthCallback.js.map +1 -1
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +93 -10
  7. package/dist/cli.js.map +1 -1
  8. package/dist/cliCloudAuth.d.ts +48 -0
  9. package/dist/cliCloudAuth.d.ts.map +1 -0
  10. package/dist/cliCloudAuth.js +254 -0
  11. package/dist/cliCloudAuth.js.map +1 -0
  12. package/dist/cliCloudClient.d.ts +29 -0
  13. package/dist/cliCloudClient.d.ts.map +1 -0
  14. package/dist/cliCloudClient.js +154 -0
  15. package/dist/cliCloudClient.js.map +1 -0
  16. package/dist/cliInstances.d.ts +39 -4
  17. package/dist/cliInstances.d.ts.map +1 -1
  18. package/dist/cliInstances.js +76 -8
  19. package/dist/cliInstances.js.map +1 -1
  20. package/dist/cliMail.d.ts.map +1 -1
  21. package/dist/cliMail.js +54 -143
  22. package/dist/cliMail.js.map +1 -1
  23. package/dist/cliMailBackend.d.ts +125 -0
  24. package/dist/cliMailBackend.d.ts.map +1 -0
  25. package/dist/cliMailBackend.js +354 -0
  26. package/dist/cliMailBackend.js.map +1 -0
  27. package/dist/cliOutput.d.ts.map +1 -1
  28. package/dist/cliOutput.js +19 -2
  29. package/dist/cliOutput.js.map +1 -1
  30. package/dist/feedback.d.ts +13 -29
  31. package/dist/feedback.d.ts.map +1 -1
  32. package/dist/feedback.js +2 -1
  33. package/dist/feedback.js.map +1 -1
  34. package/dist/http/admin.d.ts.map +1 -1
  35. package/dist/http/admin.js +4 -2
  36. package/dist/http/admin.js.map +1 -1
  37. package/dist/http/rest.d.ts.map +1 -1
  38. package/dist/http/rest.js +13 -6
  39. package/dist/http/rest.js.map +1 -1
  40. package/dist/mcp/attachmentContent.d.ts +1 -1
  41. package/dist/mcp/attachmentContent.d.ts.map +1 -1
  42. package/dist/mcp/buildServer.d.ts.map +1 -1
  43. package/dist/mcp/buildServer.js +37 -9
  44. package/dist/mcp/buildServer.js.map +1 -1
  45. package/dist/mcp/outputSchemas.d.ts +189 -3100
  46. package/dist/mcp/outputSchemas.d.ts.map +1 -1
  47. package/dist/sendAt.d.ts +4 -0
  48. package/dist/sendAt.d.ts.map +1 -0
  49. package/dist/sendAt.js +10 -0
  50. package/dist/sendAt.js.map +1 -0
  51. package/dist/service/emailService.d.ts.map +1 -1
  52. package/dist/service/emailService.js +20 -1
  53. package/dist/service/emailService.js.map +1 -1
  54. package/dist/storage/fileLock.d.ts +2 -0
  55. package/dist/storage/fileLock.d.ts.map +1 -1
  56. package/dist/storage/fileLock.js +25 -4
  57. package/dist/storage/fileLock.js.map +1 -1
  58. package/dist/telemetry.d.ts +5 -0
  59. package/dist/telemetry.d.ts.map +1 -1
  60. package/dist/telemetry.js +17 -2
  61. package/dist/telemetry.js.map +1 -1
  62. package/package.json +8 -9
@@ -1,11 +1,19 @@
1
- import { chmodSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
1
+ import { randomBytes } from 'node:crypto';
2
+ import { chmodSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
2
3
  import path from 'node:path';
3
4
  import { EmailError } from '@fluxmail/core';
4
5
  import { resolveDataDir } from './config.js';
5
6
  import { createContext } from './context.js';
6
7
  import { createApp } from './http/app.js';
7
8
  import { CliStartupError } from './cliStartupDiagnostics.js';
9
+ import { withFileLock } from './storage/fileLock.js';
8
10
  import { OPERATION_TELEMETRY_EVENT } from './telemetry.js';
11
+ /** Guards every change to a Cloud session: refresh, login, logout and profile removal. */
12
+ export const CLOUD_SESSION_LOCK = {
13
+ timeoutMs: 45_000,
14
+ staleMs: 30_000,
15
+ description: 'another Fluxmail Cloud token refresh',
16
+ };
9
17
  const EMAIL_ERROR_CODES = new Set([
10
18
  'auth_expired',
11
19
  'rate_limited',
@@ -18,17 +26,29 @@ const EMAIL_ERROR_CODES = new Set([
18
26
  'unsupported_capability',
19
27
  ]);
20
28
  const SAFE_INSTANCE_API_TELEMETRY_CODES = new Set([
29
+ 'attachment_limit',
30
+ 'busy',
31
+ 'deadline_exceeded',
32
+ 'hourly_limit_exceeded',
21
33
  'https_required',
22
34
  'idempotency_conflict',
23
35
  'idempotency_in_progress',
24
36
  'internal',
25
37
  'invalid_response',
38
+ 'mailbox_busy',
26
39
  'request_failed',
40
+ 'request_limit',
27
41
  'request_timeout',
28
42
  'request_too_large',
43
+ 'response_limit',
44
+ 'send_outcome_unknown',
29
45
  'setup_required',
46
+ 'subscription_required',
30
47
  'unauthorized',
48
+ 'unavailable',
31
49
  'unsupported_media_type',
50
+ 'unsupported_operation',
51
+ 'workspace_unavailable',
32
52
  ]);
33
53
  const SAFE_CONNECTION_STAGES = new Set([
34
54
  'cli_validation',
@@ -47,6 +67,9 @@ export function setRequestDeadlineMs(value) {
47
67
  }
48
68
  requestDeadlineMs = value;
49
69
  }
70
+ export function currentRequestDeadlineMs() {
71
+ return requestDeadlineMs;
72
+ }
50
73
  export class InstanceApiError extends Error {
51
74
  code;
52
75
  status;
@@ -64,7 +87,7 @@ export class InstanceApiError extends Error {
64
87
  this.name = 'InstanceApiError';
65
88
  }
66
89
  }
67
- function requestTimeoutError() {
90
+ export function requestTimeoutError() {
68
91
  return new InstanceApiError('request_timeout', 'The request timed out. Check the operation status before retrying a send.', 0);
69
92
  }
70
93
  export function instanceResponseError(code, message, status, data, requestId, connectionStage) {
@@ -151,6 +174,10 @@ export function instanceConfigPath() {
151
174
  export function credentialPath() {
152
175
  return path.join(cliDirectory(), 'credentials.json');
153
176
  }
177
+ /** Kept apart from member sessions because refreshing rewrites this file on every token rotation. */
178
+ export function cloudCredentialPath() {
179
+ return path.join(cliDirectory(), 'cloud-credentials.json');
180
+ }
154
181
  function readJson(filePath, fallback, kind) {
155
182
  try {
156
183
  return JSON.parse(readFileSync(filePath, 'utf8'));
@@ -165,8 +192,16 @@ function writePrivateJson(filePath, value) {
165
192
  const directory = path.dirname(filePath);
166
193
  mkdirSync(directory, { recursive: true, mode: 0o700 });
167
194
  chmodSync(directory, 0o700);
168
- writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`, { mode: 0o600 });
169
- chmodSync(filePath, 0o600);
195
+ // Another CLI process may read this file at any moment, so it must never see a partial write.
196
+ const temporaryPath = `${filePath}.${randomBytes(6).toString('hex')}.tmp`;
197
+ try {
198
+ writeFileSync(temporaryPath, `${JSON.stringify(value, null, 2)}\n`, { mode: 0o600 });
199
+ renameSync(temporaryPath, filePath);
200
+ }
201
+ catch (error) {
202
+ rmSync(temporaryPath, { force: true });
203
+ throw error;
204
+ }
170
205
  }
171
206
  export function loadInstanceConfig() {
172
207
  return readJson(instanceConfigPath(), { instances: {} }, 'instance_config');
@@ -180,6 +215,27 @@ function loadCredentials() {
180
215
  function saveCredentials(credentials) {
181
216
  writePrivateJson(credentialPath(), credentials);
182
217
  }
218
+ export function cloudSessionLockPath() {
219
+ return path.join(cliDirectory(), 'cloud-refresh.lock');
220
+ }
221
+ function loadCloudCredentials() {
222
+ return readJson(cloudCredentialPath(), { sessions: {} }, 'credentials');
223
+ }
224
+ export function loadCloudSession(instanceName) {
225
+ return loadCloudCredentials().sessions[instanceName];
226
+ }
227
+ export function saveCloudSession(instanceName, session) {
228
+ const credentials = loadCloudCredentials();
229
+ credentials.sessions[instanceName] = session;
230
+ writePrivateJson(cloudCredentialPath(), credentials);
231
+ }
232
+ export function clearCloudSession(instanceName) {
233
+ const credentials = loadCloudCredentials();
234
+ if (!credentials.sessions[instanceName])
235
+ return;
236
+ delete credentials.sessions[instanceName];
237
+ writePrivateJson(cloudCredentialPath(), credentials);
238
+ }
183
239
  function validInstanceName(name) {
184
240
  const normalized = name.trim();
185
241
  if (!/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/.test(normalized)) {
@@ -221,6 +277,12 @@ export function saveRemoteInstance(name, serverUrl) {
221
277
  config.active ??= instanceName;
222
278
  saveInstanceConfig(config);
223
279
  }
280
+ export function saveCloudInstance(name, serverUrl) {
281
+ const instanceName = validInstanceName(name);
282
+ const config = loadInstanceConfig();
283
+ config.instances[instanceName] = { kind: 'cloud', serverUrl: validateRemoteServerUrl(serverUrl) };
284
+ saveInstanceConfig(config);
285
+ }
224
286
  export function useInstance(name) {
225
287
  const config = loadInstanceConfig();
226
288
  if (!config.instances[name])
@@ -236,15 +298,15 @@ export function removeInstance(name) {
236
298
  if (config.active === name)
237
299
  config.active = Object.keys(config.instances)[0];
238
300
  saveInstanceConfig(config);
239
- const credentials = loadCredentials();
240
- delete credentials.sessions[name];
241
- saveCredentials(credentials);
301
+ clearSessionToken(name);
302
+ // A refresh in flight would otherwise save its rotated tokens after this.
303
+ withFileLock(cloudSessionLockPath(), CLOUD_SESSION_LOCK, () => clearCloudSession(name));
242
304
  }
243
305
  export function resolveInstance(name) {
244
306
  const config = loadInstanceConfig();
245
307
  const selected = name ?? config.active;
246
308
  if (!selected)
247
- throw new CliStartupError('invalid_request', 'No CLI instance is configured.\nFor an existing local instance, run "fluxmail --instance local login".\nFor a new local instance, run "fluxmail setup".\nFor a remote instance, run "fluxmail login --server <url>".', 'instance_not_configured');
309
+ throw new CliStartupError('invalid_request', 'No CLI instance is configured.\nFor an existing local instance, run "fluxmail --instance local login".\nFor a new local instance, run "fluxmail setup".\nFor a remote instance, run "fluxmail login --server <url>".\nFor Fluxmail Cloud, run "fluxmail login --cloud".', 'instance_not_configured');
248
310
  const profile = config.instances[selected];
249
311
  if (!profile)
250
312
  throw new CliStartupError('not_found', `No CLI instance named "${selected}".`, 'instance_not_found');
@@ -407,8 +469,14 @@ export class InstanceClient {
407
469
  return envelope;
408
470
  }
409
471
  }
472
+ /** Administration stays in the Cloud dashboard; the CLI only reads and manages mail there. */
473
+ export function cloudManagementError(profile, page = '') {
474
+ return new EmailError('unsupported_capability', `This command manages a self-hosted instance. Use the Fluxmail Cloud dashboard at ${profile.serverUrl}${page}.`);
475
+ }
410
476
  export function instanceClient(name, requireToken = true, requestTimeoutMs) {
411
477
  const selected = resolveInstance(name);
478
+ if (selected.profile.kind === 'cloud')
479
+ throw cloudManagementError(selected.profile);
412
480
  if (requireToken && !selected.token)
413
481
  throw new EmailError('permission_denied', `Log in to instance "${selected.name}" first.`);
414
482
  return new InstanceClient(selected.name, selected.profile, selected.token, requestTimeoutMs);
@@ -1 +1 @@
1
- {"version":3,"file":"cliInstances.js","sourceRoot":"","sources":["../src/cliInstances.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cliInstances.js","sourceRoot":"","sources":["../src/cliInstances.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cliMail.d.ts","sourceRoot":"","sources":["../src/cliMail.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAWhE,UAAU,kBAAkB;IAC1B,gBAAgB,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAC3C,eAAe,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAC1C,cAAc,EAAE,MAAM,YAAY,CAAC;IACnC,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,iFAAiF;IACjF,oBAAoB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;CACzE;AAiZD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI,CA4dxF"}
1
+ {"version":3,"file":"cliMail.d.ts","sourceRoot":"","sources":["../src/cliMail.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAIhE,UAAU,kBAAkB;IAC1B,gBAAgB,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAC3C,eAAe,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAC1C,cAAc,EAAE,MAAM,YAAY,CAAC;IACnC,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,iFAAiF;IACjF,oBAAoB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;CACzE;AA4RD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAsaxF"}
package/dist/cliMail.js CHANGED
@@ -3,7 +3,8 @@ import path from 'node:path';
3
3
  import { lookup as lookupMimeType } from 'mime-types';
4
4
  import { EmailError, parseEmailSearch, parseSingleAddress, } from '@fluxmail/core';
5
5
  import { printOutput } from './cliOutput.js';
6
- import { apiErrorCode, instanceClient, instanceResponseError, localFailure, withLocalFailure, } from './cliInstances.js';
6
+ import { apiErrorCode, localFailure } from './cliInstances.js';
7
+ import { mailBackend } from './cliMailBackend.js';
7
8
  const MODIFY_ACTIONS = {
8
9
  markRead: 'markRead',
9
10
  'mark-read': 'markRead',
@@ -161,49 +162,18 @@ function addQueryOptions(command, includeText) {
161
162
  command.option('--text <query>', 'Filter by literal full-text search');
162
163
  return command;
163
164
  }
164
- function queryString(options, typedQuery) {
165
- const query = new URLSearchParams();
166
- for (const [key, value] of [
167
- ['folder', options.folder],
168
- ['query', typedQuery],
169
- ['text', options.text],
170
- ['from', options.from],
171
- ['to', options.to],
172
- ['subject', options.subject],
173
- ['after', options.after],
174
- ['before', options.before],
175
- ['rawProviderQuery', options.rawProviderQuery],
176
- ['pageSize', options.pageSize],
177
- ['pageToken', options.pageToken],
178
- ]) {
179
- if (value !== undefined)
180
- query.set(key, value);
181
- }
182
- if (options.read !== undefined)
183
- query.set('read', String(options.read));
184
- if (options.starred !== undefined)
185
- query.set('starred', String(options.starred));
186
- if (options.hasAttachment !== undefined)
187
- query.set('hasAttachment', String(options.hasAttachment));
188
- if (options.includeSnippet !== undefined)
189
- query.set('includeSnippet', String(options.includeSnippet));
190
- if (options.includeSearchContext !== undefined) {
191
- query.set('includeSearchContext', String(options.includeSearchContext));
192
- }
193
- return query.size ? `?${query}` : '';
194
- }
195
165
  const LISTING_PAGE_ATTEMPTS = 3;
196
166
  const LISTING_RETRY_DELAY_MS = 1_000;
197
- const RETRYABLE_LISTING_CODES = new Set(['provider_unavailable', 'request_timeout']);
167
+ const RETRYABLE_LISTING_CODES = new Set(['provider_unavailable', 'request_timeout', 'deadline_exceeded']);
198
168
  /**
199
169
  * Fetch one page of an --all listing. Listing is read-only, so a page that hit a
200
170
  * provider deadline or a dropped connection is requested again instead of
201
171
  * discarding the pages already collected.
202
172
  */
203
- async function listingPage(client, pathname) {
173
+ async function listingPage(mail, accountId, query, typedQuery) {
204
174
  for (let attempt = 1;; attempt++) {
205
175
  try {
206
- return await client.jsonEnvelope(pathname);
176
+ return await mail.listMessages(accountId, query, typedQuery);
207
177
  }
208
178
  catch (error) {
209
179
  if (attempt >= LISTING_PAGE_ATTEMPTS || !RETRYABLE_LISTING_CODES.has(apiErrorCode(error)))
@@ -212,24 +182,23 @@ async function listingPage(client, pathname) {
212
182
  }
213
183
  }
214
184
  }
215
- async function mailListing(client, accountId, options, typedQuery) {
216
- const path = `/api/v1/accounts/${encodeURIComponent(accountId)}/messages`;
217
- if (!options.all) {
218
- if (options.maxResults !== undefined)
185
+ async function mailListing(mail, accountId, { all, maxResults, ...query }, typedQuery) {
186
+ if (!all) {
187
+ if (maxResults !== undefined)
219
188
  throw new EmailError('invalid_request', '--max-results requires --all.');
220
- return client.jsonEnvelope(`${path}${queryString(options, typedQuery)}`);
189
+ return mail.listMessages(accountId, query, typedQuery);
221
190
  }
222
- const maximum = options.maxResults === undefined ? 1000 : Number(options.maxResults);
191
+ const maximum = maxResults === undefined ? 1000 : Number(maxResults);
223
192
  if (!Number.isInteger(maximum) || maximum < 1 || maximum > 10_000) {
224
193
  throw new EmailError('invalid_request', '--max-results must be between 1 and 10000.');
225
194
  }
226
- const requestedPageSize = options.pageSize === undefined ? 100 : Number(options.pageSize);
195
+ const requestedPageSize = query.pageSize === undefined ? 100 : Number(query.pageSize);
227
196
  if (!Number.isInteger(requestedPageSize) || requestedPageSize < 1 || requestedPageSize > 100) {
228
197
  throw new EmailError('invalid_request', '--page-size must be between 1 and 100.');
229
198
  }
230
199
  const data = [];
231
200
  const warnings = [];
232
- let pageToken = options.pageToken;
201
+ let pageToken = query.pageToken;
233
202
  const seenTokens = new Set();
234
203
  let meta = { exhausted: false };
235
204
  for (;;) {
@@ -238,11 +207,7 @@ async function mailListing(client, accountId, options, typedQuery) {
238
207
  throw new EmailError('provider_unavailable', 'The provider repeated a page token.');
239
208
  seenTokens.add(pageToken);
240
209
  }
241
- const page = await listingPage(client, `${path}${queryString({
242
- ...options,
243
- pageSize: String(Math.min(requestedPageSize, maximum - data.length)),
244
- pageToken,
245
- }, typedQuery)}`);
210
+ const page = await listingPage(mail, accountId, { ...query, pageSize: String(Math.min(requestedPageSize, maximum - data.length)), pageToken }, typedQuery);
246
211
  data.push(...page.data.slice(0, maximum - data.length));
247
212
  warnings.push(...(page.warnings ?? []));
248
213
  meta = page.meta ?? {};
@@ -256,51 +221,6 @@ async function mailListing(client, accountId, options, typedQuery) {
256
221
  }
257
222
  return { data, meta, ...(warnings.length ? { warnings } : {}) };
258
223
  }
259
- async function resolveAccountId(client, requested) {
260
- const requestedRef = requested?.trim();
261
- if (requestedRef && /^acct_[^@\s]+$/.test(requestedRef))
262
- return requestedRef;
263
- const listed = await client.json('/api/v1/accounts');
264
- if (listed.length === 0) {
265
- throw new EmailError('invalid_request', 'No email accounts are available. Connect an account first.');
266
- }
267
- const member = await client.json('/api/v1/me');
268
- const accounts = listed.filter((account) => account.ownerMemberId === member.id || account.sharedWithAll || account.grantedMemberIds.includes(member.id));
269
- if (requestedRef) {
270
- const normalized = requestedRef.toLowerCase();
271
- const account = accounts.find((candidate) => candidate.id === requestedRef || candidate.email.toLowerCase() === normalized);
272
- if (!account)
273
- throw new EmailError('not_found', `No accessible account has id or email "${requestedRef}".`);
274
- return account.id;
275
- }
276
- if (accounts.length === 0) {
277
- throw new EmailError('invalid_request', 'No email accounts are accessible to this member.');
278
- }
279
- if (accounts.length > 1) {
280
- throw new EmailError('invalid_request', `Multiple accounts are available. Pass --mail-account or -a with one of: ${accounts
281
- .map((account) => `${account.id} (${account.email})`)
282
- .join(', ')}.`);
283
- }
284
- return accounts[0].id;
285
- }
286
- async function responseError(response) {
287
- let error;
288
- try {
289
- const body = (await response.json());
290
- error = body.error;
291
- }
292
- catch {
293
- // The fallback below does not expose response content.
294
- }
295
- throw withLocalFailure(instanceResponseError(error?.code ?? 'request_failed', error?.message ?? `Request failed with HTTP ${response.status}.`, response.status, error?.data, error?.requestId), response);
296
- }
297
- function jsonRequest(body, headers = {}) {
298
- return {
299
- method: 'POST',
300
- headers: { 'content-type': 'application/json', ...headers },
301
- body: JSON.stringify(body),
302
- };
303
- }
304
224
  export function registerMailCommands(program, options) {
305
225
  const run = (fn) => async () => {
306
226
  try {
@@ -311,9 +231,9 @@ export function registerMailCommands(program, options) {
311
231
  }
312
232
  };
313
233
  const accountContext = async () => {
314
- const client = instanceClient(options.selectedInstance());
315
- const accountId = await resolveAccountId(client, options.selectedAccount());
316
- return { client, accountId };
234
+ const mail = mailBackend(options.selectedInstance());
235
+ const accountId = await mail.resolveAccountId(options.selectedAccount());
236
+ return { mail, accountId };
317
237
  };
318
238
  const printEnvelope = async (request) => printOutput(await request, options.selectedFormat());
319
239
  const folders = program.command('folders').description('Work with navigable mailbox folders');
@@ -321,22 +241,22 @@ export function registerMailCommands(program, options) {
321
241
  .command('list')
322
242
  .description('List folders in an email account')
323
243
  .action(run(async () => {
324
- const { client, accountId } = await accountContext();
325
- await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/folders`));
244
+ const { mail, accountId } = await accountContext();
245
+ await printEnvelope(mail.listFolders(accountId));
326
246
  }));
327
247
  const labels = program.command('labels').description('Work with Gmail labels and Outlook categories');
328
248
  labels
329
249
  .command('list')
330
250
  .description('List Gmail user labels or Outlook categories')
331
251
  .action(run(async () => {
332
- const { client, accountId } = await accountContext();
333
- await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/labels`));
252
+ const { mail, accountId } = await accountContext();
253
+ await printEnvelope(mail.listLabels(accountId));
334
254
  }));
335
255
  const emails = program.command('emails').description('Read, send, and organize email');
336
256
  const listEmails = addQueryOptions(emails.command('list').description('List and filter messages'), true);
337
257
  listEmails.action(async (query) => run(async () => {
338
- const { client, accountId } = await accountContext();
339
- await printEnvelope(mailListing(client, accountId, query));
258
+ const { mail, accountId } = await accountContext();
259
+ await printEnvelope(mailListing(mail, accountId, query));
340
260
  })());
341
261
  const search = addQueryOptions(emails.command('search').argument('<query>', 'Typed portable search query').description('Search messages'), false).allowUnknownOption();
342
262
  search.action(async (query, queryOptions) => run(async () => {
@@ -349,8 +269,8 @@ export function registerMailCommands(program, options) {
349
269
  for (const warning of parsed.diagnostics.filter((item) => item.severity === 'warning')) {
350
270
  console.error(`Search warning: ${warning.message}`);
351
271
  }
352
- const { client, accountId } = await accountContext();
353
- await printEnvelope(mailListing(client, accountId, queryOptions, query));
272
+ const { mail, accountId } = await accountContext();
273
+ await printEnvelope(mailListing(mail, accountId, queryOptions, query));
354
274
  })());
355
275
  const batchSearch = emails
356
276
  .command('search-batch')
@@ -407,8 +327,7 @@ export function registerMailCommands(program, options) {
407
327
  }).filter(([, value]) => value !== undefined)),
408
328
  };
409
329
  }
410
- const client = instanceClient(options.selectedInstance());
411
- const response = await client.jsonEnvelope('/api/v1/messages/search', jsonRequest(request));
330
+ const response = await mailBackend(options.selectedInstance()).searchBatch(request);
412
331
  printOutput(response, options.selectedFormat());
413
332
  if (response.data.some((group) => group.error !== undefined)) {
414
333
  options.reportPartialFailure('partial_failure', localFailure(response));
@@ -420,9 +339,8 @@ export function registerMailCommands(program, options) {
420
339
  .description('Get a complete message')
421
340
  .option('--include-headers', 'Include Message-ID, References, In-Reply-To, and other threading headers')
422
341
  .action(async (messageId, getOptions) => run(async () => {
423
- const { client, accountId } = await accountContext();
424
- await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/messages/${encodeURIComponent(messageId)}` +
425
- (getOptions.includeHeaders ? '?includeHeaders=true' : '')));
342
+ const { mail, accountId } = await accountContext();
343
+ await printEnvelope(mail.getMessage(accountId, messageId, getOptions.includeHeaders === true));
426
344
  })());
427
345
  const send = addMessageContentOptions(emails.command('send').description('Send or schedule a message'))
428
346
  .option('--draft <draft-id>', 'Send an existing draft')
@@ -451,8 +369,8 @@ export function registerMailCommands(program, options) {
451
369
  if (!sendOptions.idempotencyKey) {
452
370
  throw new EmailError('invalid_request', 'Pass --idempotency-key and reuse it when retrying this send.');
453
371
  }
454
- const { client, accountId } = await accountContext();
455
- const response = await client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/send`, jsonRequest(request, { 'idempotency-key': sendOptions.idempotencyKey }));
372
+ const { mail, accountId } = await accountContext();
373
+ const response = await mail.send(accountId, request, sendOptions.idempotencyKey);
456
374
  printOutput(response, options.selectedFormat());
457
375
  if (response.data.status === 'uncertain' || response.data.status === 'sending')
458
376
  options.reportPartialFailure('uncertain', localFailure(response));
@@ -465,8 +383,8 @@ export function registerMailCommands(program, options) {
465
383
  throw new EmailError('invalid_request', '--draft cannot be combined with message content.');
466
384
  }
467
385
  const request = previewOptions.draft ? { draftId: previewOptions.draft } : messageRequest(previewOptions);
468
- const { client, accountId } = await accountContext();
469
- await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/send/preview`, jsonRequest(request)));
386
+ const { mail, accountId } = await accountContext();
387
+ await printEnvelope(mail.previewSend(accountId, request));
470
388
  })());
471
389
  const forward = emails
472
390
  .command('forward')
@@ -503,8 +421,8 @@ export function registerMailCommands(program, options) {
503
421
  if (!forwardOptions.idempotencyKey) {
504
422
  throw new EmailError('invalid_request', 'Pass --idempotency-key and reuse it when retrying this forward.');
505
423
  }
506
- const { client, accountId } = await accountContext();
507
- const response = await client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/messages/${encodeURIComponent(messageId)}/forward`, jsonRequest(request, { 'idempotency-key': forwardOptions.idempotencyKey }));
424
+ const { mail, accountId } = await accountContext();
425
+ const response = await mail.forward(accountId, messageId, request, forwardOptions.idempotencyKey);
508
426
  printOutput(response, options.selectedFormat());
509
427
  if (response.data.status === 'uncertain' || response.data.status === 'sending')
510
428
  options.reportPartialFailure('uncertain', localFailure(response));
@@ -516,8 +434,8 @@ export function registerMailCommands(program, options) {
516
434
  .argument('<operation-id>', 'Delivery operation ID')
517
435
  .description('Check a send or forward outcome')
518
436
  .action(async (operationId) => run(async () => {
519
- const { client, accountId } = await accountContext();
520
- await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/delivery-operations/${encodeURIComponent(operationId)}`));
437
+ const { mail, accountId } = await accountContext();
438
+ await printEnvelope(mail.deliveryStatus(accountId, operationId));
521
439
  })());
522
440
  const modify = emails
523
441
  .command('modify')
@@ -550,8 +468,8 @@ export function registerMailCommands(program, options) {
550
468
  ...(modifyOptions.label.length ? { labels: modifyOptions.label } : {}),
551
469
  };
552
470
  }
553
- const { client, accountId } = await accountContext();
554
- const response = await client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/messages/actions`, jsonRequest(request));
471
+ const { mail, accountId } = await accountContext();
472
+ const response = await mail.modify(accountId, request);
555
473
  printOutput(response, options.selectedFormat());
556
474
  if (response.data.failed.length || response.data.uncertainIds.length) {
557
475
  options.reportPartialFailure('partial_failure', localFailure(response));
@@ -563,8 +481,8 @@ export function registerMailCommands(program, options) {
563
481
  .argument('<thread-id>', 'Provider thread ID')
564
482
  .description('Get a complete thread')
565
483
  .action(async (threadId) => run(async () => {
566
- const { client, accountId } = await accountContext();
567
- await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/threads/${encodeURIComponent(threadId)}`));
484
+ const { mail, accountId } = await accountContext();
485
+ await printEnvelope(mail.getThread(accountId, threadId));
568
486
  })());
569
487
  const drafts = program.command('drafts').description('Create and manage drafts');
570
488
  drafts
@@ -572,47 +490,44 @@ export function registerMailCommands(program, options) {
572
490
  .argument('<draft-id>', 'Provider draft ID')
573
491
  .description('Read a draft')
574
492
  .action(async (draftId) => run(async () => {
575
- const { client, accountId } = await accountContext();
576
- await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/drafts/${encodeURIComponent(draftId)}`));
493
+ const { mail, accountId } = await accountContext();
494
+ await printEnvelope(mail.getDraft(accountId, draftId));
577
495
  })());
578
496
  const createDraft = addMessageContentOptions(drafts.command('create').description('Create a draft'));
579
497
  createDraft.action(async (draftOptions) => run(async () => {
580
498
  const request = messageRequest(draftOptions);
581
- const { client, accountId } = await accountContext();
582
- await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/drafts`, jsonRequest(request)));
499
+ const { mail, accountId } = await accountContext();
500
+ await printEnvelope(mail.createDraft(accountId, request));
583
501
  })());
584
502
  const updateDraft = addMessageContentOptions(drafts.command('update').argument('<draft-id>', 'Provider draft ID').description('Replace the content of a draft'));
585
503
  updateDraft.action(async (draftId, draftOptions) => run(async () => {
586
504
  const request = messageRequest(draftOptions);
587
- const { client, accountId } = await accountContext();
588
- await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/drafts/${encodeURIComponent(draftId)}`, {
589
- ...jsonRequest(request),
590
- method: 'PUT',
591
- }));
505
+ const { mail, accountId } = await accountContext();
506
+ await printEnvelope(mail.updateDraft(accountId, draftId, request));
592
507
  })());
593
508
  drafts
594
509
  .command('delete')
595
510
  .argument('<draft-id>', 'Provider draft ID')
596
511
  .description('Delete a draft')
597
512
  .action(async (draftId) => run(async () => {
598
- const { client, accountId } = await accountContext();
599
- await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/drafts/${encodeURIComponent(draftId)}`, { method: 'DELETE' }));
513
+ const { mail, accountId } = await accountContext();
514
+ await printEnvelope(mail.deleteDraft(accountId, draftId));
600
515
  })());
601
516
  const scheduled = program.command('scheduled').description('Manage scheduled sends');
602
517
  scheduled
603
518
  .command('list')
604
519
  .description('List scheduled sends')
605
520
  .action(run(async () => {
606
- const { client, accountId } = await accountContext();
607
- await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/scheduled-sends`));
521
+ const { mail, accountId } = await accountContext();
522
+ await printEnvelope(mail.listScheduled(accountId));
608
523
  }));
609
524
  scheduled
610
525
  .command('cancel')
611
526
  .argument('<schedule-id>', 'Scheduled send ID')
612
527
  .description('Cancel a scheduled send and keep its draft')
613
528
  .action(async (scheduleId) => run(async () => {
614
- const { client, accountId } = await accountContext();
615
- await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/scheduled-sends/${encodeURIComponent(scheduleId)}`, { method: 'DELETE' }));
529
+ const { mail, accountId } = await accountContext();
530
+ await printEnvelope(mail.cancelScheduled(accountId, scheduleId));
616
531
  })());
617
532
  const attachments = program.command('attachments').description('Download message attachments');
618
533
  attachments
@@ -627,22 +542,18 @@ export function registerMailCommands(program, options) {
627
542
  if (!downloadOptions.force && existsSync(outputPath)) {
628
543
  throw new EmailError('invalid_request', `Output file already exists: ${outputPath}`);
629
544
  }
630
- const { client, accountId } = await accountContext();
631
- const response = await client.request(`/api/v1/accounts/${encodeURIComponent(accountId)}/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`);
632
- if (!response.ok)
633
- await responseError(response);
634
- const content = Buffer.from(await response.arrayBuffer());
545
+ const { mail, accountId } = await accountContext();
546
+ const { content, mimeType, warning } = await mail.downloadAttachment(accountId, messageId, attachmentId);
635
547
  try {
636
548
  writeFileSync(outputPath, content, { flag: downloadOptions.force ? 'w' : 'wx' });
637
549
  }
638
550
  catch (error) {
639
551
  throw new EmailError('invalid_request', `Could not write attachment to ${outputPath}: ${error instanceof Error ? error.message : String(error)}`);
640
552
  }
641
- const warning = response.headers.get('fluxmail-warning');
642
553
  printOutput({
643
554
  data: {
644
555
  output: outputPath,
645
- mimeType: response.headers.get('content-type') ?? 'application/octet-stream',
556
+ mimeType: mimeType ?? 'application/octet-stream',
646
557
  sizeBytes: content.length,
647
558
  },
648
559
  ...(warning ? { warnings: [warning] } : {}),