fluxmail 0.5.0 → 0.6.1

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 (109) hide show
  1. package/dist/accounts/googleAuth.d.ts +7 -3
  2. package/dist/accounts/googleAuth.d.ts.map +1 -1
  3. package/dist/accounts/googleAuth.js +8 -7
  4. package/dist/accounts/googleAuth.js.map +1 -1
  5. package/dist/accounts/microsoftAuth.d.ts +5 -2
  6. package/dist/accounts/microsoftAuth.d.ts.map +1 -1
  7. package/dist/accounts/microsoftAuth.js +24 -21
  8. package/dist/accounts/microsoftAuth.js.map +1 -1
  9. package/dist/accounts/registry.d.ts +3 -1
  10. package/dist/accounts/registry.d.ts.map +1 -1
  11. package/dist/accounts/registry.js +12 -6
  12. package/dist/accounts/registry.js.map +1 -1
  13. package/dist/auth.d.ts.map +1 -1
  14. package/dist/auth.js +5 -2
  15. package/dist/auth.js.map +1 -1
  16. package/dist/cli.d.ts +8 -0
  17. package/dist/cli.d.ts.map +1 -1
  18. package/dist/cli.js +382 -65
  19. package/dist/cli.js.map +1 -1
  20. package/dist/cliInstances.d.ts +14 -0
  21. package/dist/cliInstances.d.ts.map +1 -1
  22. package/dist/cliInstances.js +88 -5
  23. package/dist/cliInstances.js.map +1 -1
  24. package/dist/cliMail.d.ts +9 -0
  25. package/dist/cliMail.d.ts.map +1 -0
  26. package/dist/cliMail.js +450 -0
  27. package/dist/cliMail.js.map +1 -0
  28. package/dist/config.d.ts +89 -118
  29. package/dist/config.d.ts.map +1 -1
  30. package/dist/config.js +344 -369
  31. package/dist/config.js.map +1 -1
  32. package/dist/configMigration.d.ts +8 -0
  33. package/dist/configMigration.d.ts.map +1 -0
  34. package/dist/configMigration.js +234 -0
  35. package/dist/configMigration.js.map +1 -0
  36. package/dist/context.d.ts +8 -2
  37. package/dist/context.d.ts.map +1 -1
  38. package/dist/context.js +24 -7
  39. package/dist/context.js.map +1 -1
  40. package/dist/deploymentConfig.d.ts +190 -0
  41. package/dist/deploymentConfig.d.ts.map +1 -0
  42. package/dist/deploymentConfig.js +539 -0
  43. package/dist/deploymentConfig.js.map +1 -0
  44. package/dist/http/admin.d.ts +19 -1
  45. package/dist/http/admin.d.ts.map +1 -1
  46. package/dist/http/admin.js +162 -15
  47. package/dist/http/admin.js.map +1 -1
  48. package/dist/http/app.d.ts +4 -1
  49. package/dist/http/app.d.ts.map +1 -1
  50. package/dist/http/app.js +44 -12
  51. package/dist/http/app.js.map +1 -1
  52. package/dist/http/identity.d.ts.map +1 -1
  53. package/dist/http/identity.js +5 -0
  54. package/dist/http/identity.js.map +1 -1
  55. package/dist/http/rest.d.ts +5 -1
  56. package/dist/http/rest.d.ts.map +1 -1
  57. package/dist/http/rest.js +76 -6
  58. package/dist/http/rest.js.map +1 -1
  59. package/dist/index.d.ts +2 -1
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +2 -1
  62. package/dist/index.js.map +1 -1
  63. package/dist/instanceConfig.d.ts +36 -0
  64. package/dist/instanceConfig.d.ts.map +1 -0
  65. package/dist/instanceConfig.js +157 -0
  66. package/dist/instanceConfig.js.map +1 -0
  67. package/dist/licensing/activation.d.ts +2 -1
  68. package/dist/licensing/activation.d.ts.map +1 -1
  69. package/dist/licensing/activation.js +2 -3
  70. package/dist/licensing/activation.js.map +1 -1
  71. package/dist/licensing/entitlements.d.ts.map +1 -1
  72. package/dist/licensing/entitlements.js +2 -2
  73. package/dist/licensing/entitlements.js.map +1 -1
  74. package/dist/licensing/refresher.d.ts +6 -1
  75. package/dist/licensing/refresher.d.ts.map +1 -1
  76. package/dist/licensing/refresher.js +18 -7
  77. package/dist/licensing/refresher.js.map +1 -1
  78. package/dist/logging.d.ts +87 -0
  79. package/dist/logging.d.ts.map +1 -0
  80. package/dist/logging.js +612 -0
  81. package/dist/logging.js.map +1 -0
  82. package/dist/mcp/buildServer.d.ts +2 -0
  83. package/dist/mcp/buildServer.d.ts.map +1 -1
  84. package/dist/mcp/buildServer.js +13 -5
  85. package/dist/mcp/buildServer.js.map +1 -1
  86. package/dist/permissions.d.ts.map +1 -1
  87. package/dist/permissions.js +3 -3
  88. package/dist/permissions.js.map +1 -1
  89. package/dist/scheduler/sendScheduler.d.ts +3 -1
  90. package/dist/scheduler/sendScheduler.d.ts.map +1 -1
  91. package/dist/scheduler/sendScheduler.js +14 -1
  92. package/dist/scheduler/sendScheduler.js.map +1 -1
  93. package/dist/service/emailService.d.ts +2 -1
  94. package/dist/service/emailService.d.ts.map +1 -1
  95. package/dist/service/emailService.js +3 -0
  96. package/dist/service/emailService.js.map +1 -1
  97. package/dist/storage/db.d.ts +5 -2
  98. package/dist/storage/db.d.ts.map +1 -1
  99. package/dist/storage/db.js +55 -2
  100. package/dist/storage/db.js.map +1 -1
  101. package/dist/telemetry.d.ts +3 -2
  102. package/dist/telemetry.d.ts.map +1 -1
  103. package/dist/telemetry.js +12 -19
  104. package/dist/telemetry.js.map +1 -1
  105. package/dist/updateNotifier.d.ts +18 -0
  106. package/dist/updateNotifier.d.ts.map +1 -0
  107. package/dist/updateNotifier.js +128 -0
  108. package/dist/updateNotifier.js.map +1 -0
  109. package/package.json +37 -5
@@ -0,0 +1,612 @@
1
+ import { isEmailError } from '@fluxmail/core';
2
+ import { randomBytes } from 'node:crypto';
3
+ import { appendFileSync, chmodSync, closeSync, existsSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, statSync, writeFileSync, } from 'node:fs';
4
+ import { hostname } from 'node:os';
5
+ import path from 'node:path';
6
+ import { VERSION } from './version.js';
7
+ const DEFAULT_LIMITS = {
8
+ segmentBytes: 5 * 1024 * 1024,
9
+ segmentCount: 4,
10
+ maxRecordBytes: 16 * 1024,
11
+ maxQueueBytes: 256 * 1024,
12
+ maxBatchBytes: 64 * 1024,
13
+ flushIntervalMs: 1_000,
14
+ rateBurstBytes: 64 * 1024,
15
+ rateBytesPerHour: 1024 * 1024,
16
+ duplicateWindowMs: 60_000,
17
+ duplicateLimit: 3,
18
+ };
19
+ const LEVEL_VALUE = { info: 10, warn: 20, error: 30 };
20
+ const SECRET_VALUE = '[REDACTED]';
21
+ const LOCK_STALE_MS = 30_000;
22
+ const LOCK_READ_TIMEOUT_MS = 1_000;
23
+ const FILE_FAILURE_WARNING_INTERVAL_MS = 60 * 60_000;
24
+ const LOCK_WAIT_ARRAY = new Int32Array(new SharedArrayBuffer(4));
25
+ function redact(value) {
26
+ return value
27
+ .replace(/\bBearer\s+[^\s,;]+/gi, `Bearer ${SECRET_VALUE}`)
28
+ .replace(/\bfluxmail_(?:api|lic)_[A-Za-z0-9_-]+\b/g, SECRET_VALUE)
29
+ .replace(/\b(?:fmk|fms)_[a-f0-9]{16,}\b/gi, SECRET_VALUE)
30
+ .replace(/([?&](?:access_token|refresh_token|client_secret|password|api_key|key|code)=)[^&#\s]*/gi, `$1${SECRET_VALUE}`)
31
+ .replace(/((?:access_token|refresh_token|client_secret|password|api_key|license_key|authorization)["']?\s*[:=]\s*["']?)[^"'\s,;}]+/gi, `$1${SECRET_VALUE}`)
32
+ .replace(/\b(?:GOOGLE|MICROSOFT|FLUXMAIL)_[A-Z0-9_]*(?:SECRET|KEY|TOKEN|PASSWORD)=\S+/g, (match) => {
33
+ const separator = match.indexOf('=');
34
+ return `${match.slice(0, separator + 1)}${SECRET_VALUE}`;
35
+ });
36
+ }
37
+ function truncateText(value, maxBytes) {
38
+ const suffix = '...[truncated]';
39
+ const inputLimit = Math.max(maxBytes, maxBytes * 4);
40
+ const safe = redact(value.length > inputLimit ? value.slice(0, inputLimit) + suffix : value);
41
+ if (Buffer.byteLength(safe) <= maxBytes)
42
+ return safe;
43
+ const suffixBytes = Buffer.byteLength(suffix);
44
+ let end = Math.max(0, Math.min(safe.length, maxBytes - suffixBytes));
45
+ while (end > 0 && Buffer.byteLength(safe.slice(0, end)) + suffixBytes > maxBytes)
46
+ end -= 1;
47
+ return safe.slice(0, end) + suffix;
48
+ }
49
+ function errorCode(error) {
50
+ if (isEmailError(error))
51
+ return error.code;
52
+ if (!error || typeof error !== 'object')
53
+ return undefined;
54
+ const value = error.code;
55
+ return typeof value === 'string' && /^[a-z][a-z0-9_]{0,63}$/.test(value) ? value : undefined;
56
+ }
57
+ function serializeError(error, includeStack, depth = 0) {
58
+ if (error instanceof Error) {
59
+ const cause = depth < 3 ? error.cause : undefined;
60
+ return {
61
+ name: truncateText(error.name || 'Error', 256),
62
+ ...(errorCode(error) ? { code: errorCode(error) } : {}),
63
+ message: truncateText(error.message, 4 * 1024),
64
+ ...(includeStack && error.stack ? { stack: truncateText(error.stack, 8 * 1024) } : {}),
65
+ ...(includeStack && cause !== undefined ? { cause: serializeError(cause, true, depth + 1) } : {}),
66
+ };
67
+ }
68
+ return { name: 'Error', message: truncateText(String(error), 4 * 1024) };
69
+ }
70
+ function recordWithinLimit(record, maxBytes) {
71
+ let json = JSON.stringify(record);
72
+ if (Buffer.byteLength(json) <= maxBytes)
73
+ return json;
74
+ const compact = {
75
+ ...record,
76
+ message: truncateText(record.message, 1024),
77
+ ...(record.error
78
+ ? {
79
+ error: {
80
+ name: record.error.name,
81
+ ...(record.error.code ? { code: record.error.code } : {}),
82
+ message: truncateText(record.error.message, 1024),
83
+ ...(record.error.stack ? { stack: truncateText(record.error.stack, 4 * 1024) } : {}),
84
+ },
85
+ }
86
+ : {}),
87
+ };
88
+ json = JSON.stringify(compact);
89
+ if (Buffer.byteLength(json) <= maxBytes)
90
+ return json;
91
+ delete compact.details;
92
+ if (compact.error)
93
+ delete compact.error.stack;
94
+ return JSON.stringify(compact);
95
+ }
96
+ export function escapeLogTextForConsole(value) {
97
+ let output = '';
98
+ for (const character of value) {
99
+ const code = character.codePointAt(0);
100
+ const control = code <= 0x1f || (code >= 0x7f && code <= 0x9f) || code === 0x2028 || code === 0x2029;
101
+ if (!control) {
102
+ output += character;
103
+ continue;
104
+ }
105
+ if (character === '\r')
106
+ output += '\\r';
107
+ else if (character === '\n')
108
+ output += '\\n';
109
+ else if (character === '\t')
110
+ output += '\\t';
111
+ else
112
+ output += code <= 0xff ? `\\x${code.toString(16).padStart(2, '0')}` : `\\u${code.toString(16).padStart(4, '0')}`;
113
+ }
114
+ return output;
115
+ }
116
+ function formatConsole(record) {
117
+ const singleLine = escapeLogTextForConsole;
118
+ const code = record.error?.code ? ` [${singleLine(record.error.code)}]` : '';
119
+ return `${record.timestamp} ${record.level.toUpperCase()} ${singleLine(record.event)}${code}: ${singleLine(record.message)}\n`;
120
+ }
121
+ function processIsRunning(pid) {
122
+ try {
123
+ process.kill(pid, 0);
124
+ return true;
125
+ }
126
+ catch (error) {
127
+ return error.code !== 'ESRCH';
128
+ }
129
+ }
130
+ function readLockOwner(file) {
131
+ try {
132
+ const owner = JSON.parse(readFileSync(file, 'utf8'));
133
+ if (typeof owner.token !== 'string' ||
134
+ typeof owner.pid !== 'number' ||
135
+ typeof owner.hostname !== 'string' ||
136
+ typeof owner.createdAt !== 'number') {
137
+ return undefined;
138
+ }
139
+ return owner;
140
+ }
141
+ catch {
142
+ return undefined;
143
+ }
144
+ }
145
+ function canRemoveLock(file) {
146
+ const owner = readLockOwner(file);
147
+ if (owner?.hostname === hostname())
148
+ return !processIsRunning(owner.pid);
149
+ try {
150
+ return Date.now() - statSync(file).mtimeMs > LOCK_STALE_MS;
151
+ }
152
+ catch {
153
+ return false;
154
+ }
155
+ }
156
+ function releaseOwnedLock(file, token) {
157
+ if (readLockOwner(file)?.token !== token)
158
+ return;
159
+ try {
160
+ rmSync(file, { force: true });
161
+ }
162
+ catch {
163
+ // A stale lock is recovered by a later operation.
164
+ }
165
+ }
166
+ function tryRemoveAbandonedLock(file) {
167
+ const reclaimFile = `${file}.reclaim`;
168
+ const token = randomBytes(16).toString('hex');
169
+ const owner = { token, pid: process.pid, hostname: hostname(), createdAt: Date.now() };
170
+ let descriptor;
171
+ try {
172
+ descriptor = openSync(reclaimFile, 'wx', 0o600);
173
+ writeFileSync(descriptor, JSON.stringify(owner));
174
+ }
175
+ catch (error) {
176
+ if (descriptor !== undefined) {
177
+ closeSync(descriptor);
178
+ rmSync(reclaimFile, { force: true });
179
+ }
180
+ if (error.code === 'EEXIST')
181
+ return false;
182
+ throw error;
183
+ }
184
+ try {
185
+ if (!canRemoveLock(file))
186
+ return false;
187
+ rmSync(file, { force: true });
188
+ return true;
189
+ }
190
+ finally {
191
+ closeSync(descriptor);
192
+ releaseOwnedLock(reclaimFile, token);
193
+ }
194
+ }
195
+ function acquireLock(file) {
196
+ for (let attempt = 0; attempt < 2; attempt += 1) {
197
+ const token = randomBytes(16).toString('hex');
198
+ const owner = { token, pid: process.pid, hostname: hostname(), createdAt: Date.now() };
199
+ let descriptor;
200
+ try {
201
+ descriptor = openSync(file, 'wx', 0o600);
202
+ writeFileSync(descriptor, JSON.stringify(owner));
203
+ return { descriptor, token };
204
+ }
205
+ catch (error) {
206
+ if (descriptor !== undefined) {
207
+ closeSync(descriptor);
208
+ rmSync(file, { force: true });
209
+ }
210
+ if (error.code !== 'EEXIST')
211
+ throw error;
212
+ if (attempt === 0 && tryRemoveAbandonedLock(file))
213
+ continue;
214
+ return undefined;
215
+ }
216
+ }
217
+ return undefined;
218
+ }
219
+ function acquireReadLock(file) {
220
+ const startedAt = Date.now();
221
+ while (true) {
222
+ const descriptor = acquireLock(file);
223
+ if (descriptor !== undefined)
224
+ return descriptor;
225
+ const elapsed = Date.now() - startedAt;
226
+ if (elapsed >= LOCK_READ_TIMEOUT_MS)
227
+ throw new Error('Timed out waiting to read the local log files.');
228
+ Atomics.wait(LOCK_WAIT_ARRAY, 0, 0, Math.min(10, LOCK_READ_TIMEOUT_MS - elapsed));
229
+ }
230
+ }
231
+ function releaseLock(file, lock) {
232
+ closeSync(lock.descriptor);
233
+ releaseOwnedLock(file, lock.token);
234
+ }
235
+ function logPaths(logDir, count) {
236
+ return [
237
+ path.join(logDir, 'fluxmail.jsonl'),
238
+ ...Array.from({ length: count - 1 }, (_, index) => path.join(logDir, `fluxmail.jsonl.${index + 1}`)),
239
+ ];
240
+ }
241
+ function restrictPermissions(file) {
242
+ try {
243
+ chmodSync(file, 0o600);
244
+ }
245
+ catch {
246
+ // The write itself reports permission failures. Permission repair is best effort.
247
+ }
248
+ }
249
+ function appendBatch(dataDir, batch, limits) {
250
+ const logDir = path.join(dataDir, 'logs');
251
+ const lockFile = path.join(logDir, '.write.lock');
252
+ let lock;
253
+ try {
254
+ mkdirSync(logDir, { recursive: true, mode: 0o700 });
255
+ try {
256
+ chmodSync(logDir, 0o700);
257
+ }
258
+ catch {
259
+ // The append below reports a real permission failure.
260
+ }
261
+ lock = acquireLock(lockFile);
262
+ if (lock === undefined)
263
+ return 'busy';
264
+ const files = logPaths(logDir, limits.segmentCount);
265
+ for (const file of files) {
266
+ if (existsSync(file) && statSync(file).size > limits.segmentBytes)
267
+ rmSync(file, { force: true });
268
+ }
269
+ const active = files[0];
270
+ const activeBytes = existsSync(active) ? statSync(active).size : 0;
271
+ if (activeBytes + Buffer.byteLength(batch) > limits.segmentBytes) {
272
+ rmSync(files.at(-1), { force: true });
273
+ for (let index = files.length - 2; index >= 1; index -= 1) {
274
+ if (existsSync(files[index]))
275
+ renameSync(files[index], files[index + 1]);
276
+ }
277
+ if (existsSync(active))
278
+ renameSync(active, files[1]);
279
+ }
280
+ appendFileSync(active, batch, { encoding: 'utf8', flag: 'a', mode: 0o600 });
281
+ restrictPermissions(active);
282
+ return 'written';
283
+ }
284
+ catch {
285
+ return 'failed';
286
+ }
287
+ finally {
288
+ if (lock !== undefined)
289
+ releaseLock(lockFile, lock);
290
+ }
291
+ }
292
+ class BoundedLogger {
293
+ options;
294
+ runId = randomBytes(8).toString('hex');
295
+ now;
296
+ consoleWrite;
297
+ limits;
298
+ duplicates = new Map();
299
+ queue = [];
300
+ queueBytes = 0;
301
+ timer;
302
+ closed = false;
303
+ tokens;
304
+ lastRefillAt;
305
+ suppressedByRate = 0;
306
+ suppressedByQueue = 0;
307
+ lastFileFailureWarningAt = Number.NEGATIVE_INFINITY;
308
+ constructor(options) {
309
+ this.options = options;
310
+ this.now = options.now ?? Date.now;
311
+ this.consoleWrite = options.consoleWrite ?? ((value) => process.stderr.write(value));
312
+ this.limits = { ...DEFAULT_LIMITS, ...options.limits };
313
+ this.tokens = this.limits.rateBurstBytes;
314
+ this.lastRefillAt = this.now();
315
+ }
316
+ info(event, message, context) {
317
+ this.add('info', event, message, undefined, context);
318
+ }
319
+ warn(event, message, error, context) {
320
+ this.add('warn', event, message, error, context);
321
+ }
322
+ error(event, message, error, context) {
323
+ this.add('error', event, message, error, context);
324
+ }
325
+ accepts(level) {
326
+ const configured = this.options.level ?? 'info';
327
+ return configured !== 'off' && LEVEL_VALUE[level] >= LEVEL_VALUE[configured];
328
+ }
329
+ refill(now) {
330
+ const elapsed = Math.max(0, now - this.lastRefillAt);
331
+ this.tokens = Math.min(this.limits.rateBurstBytes, this.tokens + elapsed * (this.limits.rateBytesPerHour / (60 * 60_000)));
332
+ this.lastRefillAt = now;
333
+ }
334
+ duplicateAllowed(key, now) {
335
+ const state = this.duplicates.get(key);
336
+ if (!state || now - state.windowStartedAt >= this.limits.duplicateWindowMs) {
337
+ if (state?.suppressed)
338
+ this.enqueueSuppression('duplicate', state.suppressed, now);
339
+ this.duplicates.set(key, { windowStartedAt: now, emitted: 1, suppressed: 0 });
340
+ return true;
341
+ }
342
+ if (state.emitted < this.limits.duplicateLimit) {
343
+ state.emitted += 1;
344
+ return true;
345
+ }
346
+ state.suppressed += 1;
347
+ return false;
348
+ }
349
+ enqueueSuppression(reason, count, now) {
350
+ if (!count || !this.accepts('warn'))
351
+ return;
352
+ const record = {
353
+ timestamp: new Date(now).toISOString(),
354
+ level: 'warn',
355
+ event: 'logging.records_suppressed',
356
+ message: `${count} local log record${count === 1 ? '' : 's'} suppressed`,
357
+ version: VERSION,
358
+ pid: process.pid,
359
+ run_id: this.runId,
360
+ process_mode: this.options.mode,
361
+ details: { reason, count },
362
+ };
363
+ this.enqueue(record, false, true);
364
+ }
365
+ add(level, event, message, error, context) {
366
+ if (this.closed || !this.accepts(level))
367
+ return;
368
+ const now = this.now();
369
+ const code = errorCode(error);
370
+ if (!this.duplicateAllowed(`${event}:${context?.operation ?? ''}:${code ?? ''}`, now))
371
+ return;
372
+ this.refill(now);
373
+ if (this.suppressedByRate > 0 && this.tokens >= 256) {
374
+ const count = this.suppressedByRate;
375
+ this.suppressedByRate = 0;
376
+ this.enqueueSuppression('rate', count, now);
377
+ }
378
+ if (this.suppressedByQueue > 0 && this.queueBytes < this.limits.maxQueueBytes / 2) {
379
+ const count = this.suppressedByQueue;
380
+ this.suppressedByQueue = 0;
381
+ this.enqueueSuppression('queue', count, now);
382
+ }
383
+ const record = {
384
+ timestamp: new Date(now).toISOString(),
385
+ level,
386
+ event: truncateText(event, 256),
387
+ message: truncateText(message, 4 * 1024),
388
+ version: VERSION,
389
+ pid: process.pid,
390
+ run_id: this.runId,
391
+ process_mode: this.options.mode,
392
+ ...(context?.productSurface ? { product_surface: context.productSurface } : {}),
393
+ ...(context?.operation ? { operation: truncateText(context.operation, 256) } : {}),
394
+ ...(context?.durationMs !== undefined ? { duration_ms: Math.max(0, Math.round(context.durationMs)) } : {}),
395
+ ...(context?.details
396
+ ? {
397
+ details: Object.fromEntries(Object.entries(context.details)
398
+ .filter((entry) => entry[1] !== undefined)
399
+ .map(([key, value]) => [key, typeof value === 'string' ? truncateText(value, 1024) : value])),
400
+ }
401
+ : {}),
402
+ ...(error !== undefined ? { error: serializeError(error, level === 'error' && !isEmailError(error)) } : {}),
403
+ };
404
+ this.enqueue(record, context?.skipConsole === true, false);
405
+ }
406
+ enqueue(record, skipConsole, bypassRate) {
407
+ const json = recordWithinLimit(record, this.limits.maxRecordBytes) + '\n';
408
+ const bytes = Buffer.byteLength(json);
409
+ if (!bypassRate) {
410
+ if (bytes > this.tokens) {
411
+ this.suppressedByRate += 1;
412
+ return;
413
+ }
414
+ this.tokens -= bytes;
415
+ }
416
+ if (this.queueBytes + bytes > this.limits.maxQueueBytes) {
417
+ this.suppressedByQueue += 1;
418
+ return;
419
+ }
420
+ const destination = this.options.destination ?? 'both';
421
+ this.queue.push({
422
+ json,
423
+ console: formatConsole(record),
424
+ bytes,
425
+ filePending: destination === 'file' || destination === 'both',
426
+ consolePending: !skipConsole && (destination === 'console' || destination === 'both'),
427
+ });
428
+ this.queueBytes += bytes;
429
+ this.scheduleFlush();
430
+ }
431
+ scheduleFlush() {
432
+ if (this.timer || this.closed)
433
+ return;
434
+ this.timer = setTimeout(() => {
435
+ this.timer = undefined;
436
+ void this.flush();
437
+ }, this.limits.flushIntervalMs);
438
+ this.timer.unref();
439
+ }
440
+ async flush() {
441
+ if (this.timer)
442
+ clearTimeout(this.timer);
443
+ this.timer = undefined;
444
+ if (!this.queue.length)
445
+ return;
446
+ const batch = [];
447
+ let batchBytes = 0;
448
+ for (const item of this.queue) {
449
+ if (batch.length && batchBytes + item.bytes > this.limits.maxBatchBytes)
450
+ break;
451
+ batch.push(item);
452
+ batchBytes += item.bytes;
453
+ }
454
+ const consoleLines = batch
455
+ .filter((item) => item.consolePending)
456
+ .map((item) => item.console)
457
+ .join('');
458
+ if (consoleLines) {
459
+ try {
460
+ this.consoleWrite(consoleLines);
461
+ for (const item of batch)
462
+ item.consolePending = false;
463
+ }
464
+ catch {
465
+ for (const item of batch)
466
+ item.consolePending = false;
467
+ }
468
+ }
469
+ const fileItems = batch.filter((item) => item.filePending);
470
+ if (fileItems.length) {
471
+ const result = appendBatch(this.options.dataDir, fileItems.map((item) => item.json).join(''), this.limits);
472
+ if (result === 'written') {
473
+ for (const item of fileItems)
474
+ item.filePending = false;
475
+ }
476
+ else if (result === 'failed') {
477
+ for (const item of fileItems)
478
+ item.filePending = false;
479
+ const now = this.now();
480
+ if (now - this.lastFileFailureWarningAt >= FILE_FAILURE_WARNING_INTERVAL_MS) {
481
+ this.lastFileFailureWarningAt = now;
482
+ try {
483
+ this.consoleWrite('Fluxmail could not write its local log file. Local file logging is unavailable.\n');
484
+ }
485
+ catch {
486
+ // Logging cannot affect application work.
487
+ }
488
+ }
489
+ }
490
+ }
491
+ this.queue = this.queue.filter((item) => item.filePending || item.consolePending);
492
+ this.queueBytes = this.queue.reduce((total, item) => total + item.bytes, 0);
493
+ if (this.queue.length)
494
+ this.scheduleFlush();
495
+ }
496
+ async close() {
497
+ if (this.closed)
498
+ return;
499
+ for (const state of this.duplicates.values()) {
500
+ if (state.suppressed)
501
+ this.enqueueSuppression('duplicate', state.suppressed, this.now());
502
+ }
503
+ const lockDeadline = Date.now() + LOCK_READ_TIMEOUT_MS;
504
+ const flushUntilDeadline = async () => {
505
+ while (this.queue.length) {
506
+ await this.flush();
507
+ const remaining = lockDeadline - Date.now();
508
+ if (!this.queue.length || remaining <= 0)
509
+ return;
510
+ await new Promise((resolve) => setTimeout(resolve, Math.min(10, remaining)));
511
+ }
512
+ };
513
+ await flushUntilDeadline();
514
+ if (this.suppressedByRate > 0 && !this.queue.length) {
515
+ const count = this.suppressedByRate;
516
+ this.suppressedByRate = 0;
517
+ this.enqueueSuppression('rate', count, this.now());
518
+ await flushUntilDeadline();
519
+ }
520
+ if (this.suppressedByQueue > 0 && !this.queue.length) {
521
+ const count = this.suppressedByQueue;
522
+ this.suppressedByQueue = 0;
523
+ this.enqueueSuppression('queue', count, this.now());
524
+ await flushUntilDeadline();
525
+ }
526
+ this.closed = true;
527
+ if (this.timer)
528
+ clearTimeout(this.timer);
529
+ this.timer = undefined;
530
+ }
531
+ }
532
+ export function createLogger(options) {
533
+ return new BoundedLogger(options);
534
+ }
535
+ export function logFailure(logger, event, error, context) {
536
+ const message = error instanceof Error ? error.message : String(error);
537
+ if (isEmailError(error))
538
+ logger?.warn(event, message, error, context);
539
+ else
540
+ logger?.error(event, message, error, context);
541
+ }
542
+ export function logCodedFailure(logger, event, code, message, context) {
543
+ const error = Object.assign(new Error(message), { name: 'OperationError', code });
544
+ logger?.warn(event, message, error, context);
545
+ }
546
+ const sharedLoggers = new Map();
547
+ export function getLogger(dataDir, mode, settings) {
548
+ const existing = sharedLoggers.get(dataDir);
549
+ if (existing)
550
+ return existing;
551
+ const logger = createLogger({ dataDir, mode, ...settings });
552
+ sharedLoggers.set(dataDir, logger);
553
+ return logger;
554
+ }
555
+ export async function flushLogging() {
556
+ await Promise.all([...sharedLoggers.values()].map((logger) => logger.flush()));
557
+ }
558
+ export async function shutdownLogging() {
559
+ const loggers = [...sharedLoggers.values()];
560
+ sharedLoggers.clear();
561
+ await Promise.all(loggers.map((logger) => logger.close()));
562
+ }
563
+ function isLogRecord(value) {
564
+ if (!value || typeof value !== 'object')
565
+ return false;
566
+ const record = value;
567
+ return (typeof record.timestamp === 'string' &&
568
+ (record.level === 'info' || record.level === 'warn' || record.level === 'error') &&
569
+ typeof record.event === 'string' &&
570
+ typeof record.message === 'string');
571
+ }
572
+ export function readLocalLogs(dataDir, options) {
573
+ const minimum = options.minimumLevel ?? 'info';
574
+ const logDir = path.join(dataDir, 'logs');
575
+ if (!existsSync(logDir))
576
+ return { entries: [], malformedLines: 0 };
577
+ const lockFile = path.join(logDir, '.write.lock');
578
+ const lock = acquireReadLock(lockFile);
579
+ const files = logPaths(logDir, DEFAULT_LIMITS.segmentCount).reverse();
580
+ const tail = Math.min(Math.max(Math.floor(options.tail), 1), 1000);
581
+ try {
582
+ const entries = [];
583
+ let malformedLines = 0;
584
+ for (const file of files.filter((candidate) => existsSync(candidate))) {
585
+ const content = readFileSync(file, 'utf8');
586
+ for (const line of content.split('\n')) {
587
+ if (!line.trim())
588
+ continue;
589
+ try {
590
+ const record = JSON.parse(line);
591
+ if (!isLogRecord(record)) {
592
+ malformedLines += 1;
593
+ continue;
594
+ }
595
+ if (LEVEL_VALUE[record.level] < LEVEL_VALUE[minimum])
596
+ continue;
597
+ entries.push({ record, raw: line });
598
+ if (entries.length > tail)
599
+ entries.shift();
600
+ }
601
+ catch {
602
+ malformedLines += 1;
603
+ }
604
+ }
605
+ }
606
+ return { entries, malformedLines };
607
+ }
608
+ finally {
609
+ releaseLock(lockFile, lock);
610
+ }
611
+ }
612
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import type { EmailService, SendInput } from '../service/emailService.js';
3
3
  import { type PermissionPolicy } from '../permissions.js';
4
4
  import { type Telemetry } from '../telemetry.js';
5
+ import { type Logger } from '../logging.js';
5
6
  type DraftArgs = {
6
7
  accountId?: string;
7
8
  to?: string[];
@@ -29,6 +30,7 @@ export interface BuildMcpServerOptions {
29
30
  maxAttachmentBytes?: number;
30
31
  telemetry?: Telemetry;
31
32
  transport?: McpTransport;
33
+ logger?: Logger;
32
34
  }
33
35
  export type McpServerOptions = BuildMcpServerOptions;
34
36
  export declare function buildMcpServer(service: EmailService, options?: BuildMcpServerOptions): McpServer;