fluxmail 0.0.1 → 0.1.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 (88) hide show
  1. package/dist/accounts/googleAuth.d.ts +31 -0
  2. package/dist/accounts/googleAuth.d.ts.map +1 -0
  3. package/dist/accounts/googleAuth.js +143 -0
  4. package/dist/accounts/googleAuth.js.map +1 -0
  5. package/dist/accounts/registry.d.ts +28 -0
  6. package/dist/accounts/registry.d.ts.map +1 -0
  7. package/dist/accounts/registry.js +185 -0
  8. package/dist/accounts/registry.js.map +1 -0
  9. package/dist/cli.d.ts +3 -0
  10. package/dist/cli.d.ts.map +1 -0
  11. package/dist/cli.js +434 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/config.d.ts +40 -0
  14. package/dist/config.d.ts.map +1 -0
  15. package/dist/config.js +215 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/context.d.ts +15 -0
  18. package/dist/context.d.ts.map +1 -0
  19. package/dist/context.js +15 -0
  20. package/dist/context.js.map +1 -0
  21. package/dist/http/app.d.ts +16 -0
  22. package/dist/http/app.d.ts.map +1 -0
  23. package/dist/http/app.js +110 -0
  24. package/dist/http/app.js.map +1 -0
  25. package/dist/index.d.ts +14 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +14 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/licensing/activation.d.ts +5 -0
  30. package/dist/licensing/activation.d.ts.map +1 -0
  31. package/dist/licensing/activation.js +11 -0
  32. package/dist/licensing/activation.js.map +1 -0
  33. package/dist/licensing/client.d.ts +52 -0
  34. package/dist/licensing/client.d.ts.map +1 -0
  35. package/dist/licensing/client.js +75 -0
  36. package/dist/licensing/client.js.map +1 -0
  37. package/dist/licensing/entitlements.d.ts +55 -0
  38. package/dist/licensing/entitlements.d.ts.map +1 -0
  39. package/dist/licensing/entitlements.js +116 -0
  40. package/dist/licensing/entitlements.js.map +1 -0
  41. package/dist/licensing/lease.d.ts +47 -0
  42. package/dist/licensing/lease.d.ts.map +1 -0
  43. package/dist/licensing/lease.js +103 -0
  44. package/dist/licensing/lease.js.map +1 -0
  45. package/dist/licensing/refresher.d.ts +46 -0
  46. package/dist/licensing/refresher.d.ts.map +1 -0
  47. package/dist/licensing/refresher.js +150 -0
  48. package/dist/licensing/refresher.js.map +1 -0
  49. package/dist/mcp/buildServer.d.ts +28 -0
  50. package/dist/mcp/buildServer.d.ts.map +1 -0
  51. package/dist/mcp/buildServer.js +394 -0
  52. package/dist/mcp/buildServer.js.map +1 -0
  53. package/dist/scheduler/sendScheduler.d.ts +38 -0
  54. package/dist/scheduler/sendScheduler.d.ts.map +1 -0
  55. package/dist/scheduler/sendScheduler.js +130 -0
  56. package/dist/scheduler/sendScheduler.js.map +1 -0
  57. package/dist/service/emailService.d.ts +138 -0
  58. package/dist/service/emailService.d.ts.map +1 -0
  59. package/dist/service/emailService.js +375 -0
  60. package/dist/service/emailService.js.map +1 -0
  61. package/dist/storage/apiKeys.d.ts +27 -0
  62. package/dist/storage/apiKeys.d.ts.map +1 -0
  63. package/dist/storage/apiKeys.js +43 -0
  64. package/dist/storage/apiKeys.js.map +1 -0
  65. package/dist/storage/crypto.d.ts +4 -0
  66. package/dist/storage/crypto.d.ts.map +1 -0
  67. package/dist/storage/crypto.js +21 -0
  68. package/dist/storage/crypto.js.map +1 -0
  69. package/dist/storage/db.d.ts +729 -0
  70. package/dist/storage/db.d.ts.map +1 -0
  71. package/dist/storage/db.js +143 -0
  72. package/dist/storage/db.js.map +1 -0
  73. package/dist/storage/members.d.ts +29 -0
  74. package/dist/storage/members.d.ts.map +1 -0
  75. package/dist/storage/members.js +67 -0
  76. package/dist/storage/members.js.map +1 -0
  77. package/dist/storage/scheduledSends.d.ts +60 -0
  78. package/dist/storage/scheduledSends.d.ts.map +1 -0
  79. package/dist/storage/scheduledSends.js +169 -0
  80. package/dist/storage/scheduledSends.js.map +1 -0
  81. package/dist/version.d.ts +2 -0
  82. package/dist/version.d.ts.map +1 -0
  83. package/dist/version.js +7 -0
  84. package/dist/version.js.map +1 -0
  85. package/package.json +38 -15
  86. package/README.md +0 -29
  87. package/bin/fluxmail.js +0 -4
  88. package/src/cli.js +0 -36
package/dist/cli.js ADDED
@@ -0,0 +1,434 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { serve } from '@hono/node-server';
4
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
5
+ import { EmailError } from '@fluxmail/core';
6
+ import { createContext } from './context.js';
7
+ import { configFilePath, maskStoredConfigValue, readStoredConfig, resolveDataDir, setStoredConfig, unsetStoredConfig, } from './config.js';
8
+ import { createApp } from './http/app.js';
9
+ import { buildMcpServer } from './mcp/buildServer.js';
10
+ import { runLoopbackFlow } from './accounts/googleAuth.js';
11
+ import { createApiKey, listApiKeys, revokeApiKey } from './storage/apiKeys.js';
12
+ import { addMember, findMember, listMembers, removeMember } from './storage/members.js';
13
+ import { activateLicense } from './licensing/activation.js';
14
+ import { LICENSE_KEY_PATTERN, releaseLicense } from './licensing/client.js';
15
+ import { licensePublicKeys, verifyLease } from './licensing/lease.js';
16
+ import { checkLicenseState, clearLease, getEntitlements, readLeaseRow, } from './licensing/entitlements.js';
17
+ import { loadInstanceId, startLicenseRefresher } from './licensing/refresher.js';
18
+ import { VERSION } from './version.js';
19
+ import { countPending } from './storage/scheduledSends.js';
20
+ function planLine(ent) {
21
+ const members = `${ent.maxMembers} member${ent.maxMembers === 1 ? '' : 's'}`;
22
+ return `${ent.plan} (up to ${ent.maxAccounts} mailboxes, ${members})`;
23
+ }
24
+ /** Renewal warning for an expiring or lapsed license; printed by every command that opens the db. */
25
+ function warnLicense(db, log = console.error) {
26
+ const { warning } = checkLicenseState(db);
27
+ if (warning)
28
+ log(`Warning: ${warning}`);
29
+ }
30
+ const program = new Command();
31
+ program.name('fluxmail').description('Fluxmail, a self-hosted MCP server for your email').version(VERSION);
32
+ program
33
+ .command('serve')
34
+ .description('Run the HTTP server (Streamable HTTP MCP at /mcp)')
35
+ .action(() => {
36
+ const ctx = createContext();
37
+ const app = createApp(ctx);
38
+ ctx.scheduler.start();
39
+ serve({ fetch: app.fetch, port: ctx.config.port }, () => {
40
+ console.log(`Fluxmail listening on ${ctx.config.baseUrl}`);
41
+ console.log(` MCP endpoint: ${ctx.config.baseUrl}/mcp`);
42
+ console.log(` Auth mode: ${ctx.config.authMode}`);
43
+ if (ctx.config.authMode === 'apikey' && listApiKeys(ctx.db).length === 0) {
44
+ console.log(' Note: no API keys exist yet. Run "fluxmail apikey create --name <name>" to create one.');
45
+ }
46
+ const accounts = ctx.registry.listAccounts();
47
+ console.log(accounts.length
48
+ ? ` Accounts: ${accounts.map((a) => `${a.email} (${a.status})`).join(', ')}`
49
+ : ' Accounts: none (run "fluxmail accounts add gmail")');
50
+ console.log(` Plan: ${planLine(getEntitlements(ctx.db))}`);
51
+ warnLicense(ctx.db, console.log);
52
+ startLicenseRefresher({
53
+ db: ctx.db,
54
+ config: ctx.config,
55
+ log: console.log,
56
+ onRefreshed: () => ctx.scheduler.wake(),
57
+ });
58
+ });
59
+ });
60
+ program
61
+ .command('stdio')
62
+ .description('Run as a stdio MCP server (for Claude Desktop / Claude Code local config)')
63
+ .action(async () => {
64
+ const ctx = createContext();
65
+ const server = buildMcpServer(ctx.service);
66
+ ctx.scheduler.start();
67
+ await server.connect(new StdioServerTransport());
68
+ // stdout belongs to the MCP protocol; log to stderr only.
69
+ startLicenseRefresher({
70
+ db: ctx.db,
71
+ config: ctx.config,
72
+ log: console.error,
73
+ onRefreshed: () => ctx.scheduler.wake(),
74
+ });
75
+ console.error('Fluxmail MCP server running on stdio');
76
+ warnLicense(ctx.db);
77
+ const { pending } = countPending(ctx.db);
78
+ if (pending > 0)
79
+ console.error(`Scheduled sends pending: ${pending}`);
80
+ });
81
+ const accounts = program.command('accounts').description('Manage connected email accounts');
82
+ accounts
83
+ .command('add')
84
+ .argument('<provider>', 'Email provider (currently: gmail)')
85
+ .option('--reauthorize <account-id>', 'Reconnect an existing account')
86
+ .option('--member <member>', 'Member (id or email) who owns the new mailbox; omit for a shared mailbox')
87
+ .description('Connect an account via OAuth (opens a browser consent flow)')
88
+ .action(async (provider, opts) => {
89
+ if (provider !== 'gmail') {
90
+ console.error(`Provider "${provider}" is not supported yet. Available: gmail`);
91
+ process.exitCode = 1;
92
+ return;
93
+ }
94
+ const ctx = createContext();
95
+ warnLicense(ctx.db);
96
+ try {
97
+ if (opts.reauthorize && opts.member) {
98
+ throw new EmailError('invalid_request', '--member cannot be combined with --reauthorize; use "fluxmail accounts assign" to change ownership.');
99
+ }
100
+ // Resolve before the OAuth flow so a typo fails fast.
101
+ const member = opts.member ? findMember(ctx.db, opts.member) : undefined;
102
+ const existing = opts.reauthorize ? ctx.registry.getAccount(opts.reauthorize) : undefined;
103
+ if (existing && existing.provider !== provider) {
104
+ throw new EmailError('invalid_request', `Account ${existing.id} uses ${existing.provider}, not ${provider}.`);
105
+ }
106
+ if (!existing)
107
+ ctx.registry.assertCanAddAccount();
108
+ const account = await runLoopbackFlow(ctx.config, (url) => {
109
+ console.log('\nOpen this URL in your browser to authorize Gmail access:\n');
110
+ console.log(` ${url}\n`);
111
+ console.log('Waiting for Google to redirect back…');
112
+ }, (result) => {
113
+ if (existing && result.email !== existing.email) {
114
+ throw new EmailError('invalid_request', `Google authorized ${result.email}, but account ${existing.id} belongs to ${existing.email}. ` +
115
+ 'Try again and choose the matching Google account.');
116
+ }
117
+ return ctx.registry.addGmailAccount(result.email, result.tokens, result.displayName, member?.id);
118
+ });
119
+ console.log(`\nConnected ${account.email} (account id: ${account.id})` +
120
+ (member && account.memberId === member.id ? ` for member ${member.name}` : ''));
121
+ if (member && account.memberId !== member.id) {
122
+ // The mailbox was already connected; re-auth keeps its existing owner.
123
+ console.log(`${account.email} was already connected, so its ownership is unchanged. ` +
124
+ `To assign it to ${member.name}, run "fluxmail accounts assign ${account.id} --member ${member.id}".`);
125
+ }
126
+ }
127
+ catch (err) {
128
+ console.error(`\nError: ${err instanceof Error ? err.message : String(err)}`);
129
+ process.exitCode = 1;
130
+ }
131
+ });
132
+ accounts
133
+ .command('list')
134
+ .description('List connected accounts')
135
+ .action(() => {
136
+ const ctx = createContext();
137
+ warnLicense(ctx.db);
138
+ const all = ctx.registry.listAccounts();
139
+ if (!all.length) {
140
+ console.log('No accounts connected. Run "fluxmail accounts add gmail".');
141
+ return;
142
+ }
143
+ const memberNames = new Map(listMembers(ctx.db).map((m) => [m.id, m.name]));
144
+ for (const a of all) {
145
+ const owner = a.memberId ? (memberNames.get(a.memberId) ?? a.memberId) : 'shared';
146
+ console.log(`${a.id} ${a.provider} ${a.email} [${a.status}] owner=${owner}`);
147
+ }
148
+ });
149
+ accounts
150
+ .command('remove')
151
+ .argument('<accountId>')
152
+ .description('Disconnect an account and delete its stored tokens')
153
+ .action((accountId) => {
154
+ const ctx = createContext();
155
+ warnLicense(ctx.db);
156
+ ctx.registry.removeAccount(accountId);
157
+ console.log(`Removed ${accountId}`);
158
+ });
159
+ accounts
160
+ .command('assign')
161
+ .argument('<accountId>')
162
+ .option('--member <member>', 'Member (id or email) to own the mailbox')
163
+ .option('--shared', 'Make the mailbox shared across the instance')
164
+ .description('Assign a mailbox to a member, or make it shared')
165
+ .action((accountId, opts) => {
166
+ const ctx = createContext();
167
+ warnLicense(ctx.db);
168
+ try {
169
+ if (!opts.member === !opts.shared) {
170
+ throw new EmailError('invalid_request', 'Pass exactly one of --member <member> or --shared.');
171
+ }
172
+ const member = opts.member ? findMember(ctx.db, opts.member) : undefined;
173
+ const account = ctx.registry.assignAccountMember(accountId, member?.id ?? null);
174
+ console.log(member
175
+ ? `${account.email} is now owned by ${member.name}`
176
+ : `${account.email} is now shared`);
177
+ }
178
+ catch (err) {
179
+ console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
180
+ process.exitCode = 1;
181
+ }
182
+ });
183
+ const membersCmd = program.command('members').description('Manage members (people using this instance)');
184
+ membersCmd
185
+ .command('add')
186
+ .requiredOption('--name <name>', 'Member name')
187
+ .option('--email <email>', 'Member email, usable as a shorthand in --member flags')
188
+ .description('Add a member (subject to the plan seat limit)')
189
+ .action((opts) => {
190
+ const ctx = createContext();
191
+ warnLicense(ctx.db);
192
+ try {
193
+ const member = addMember(ctx.db, { name: opts.name, ...(opts.email ? { email: opts.email } : {}) });
194
+ console.log(`Added member ${member.name} (id: ${member.id})`);
195
+ }
196
+ catch (err) {
197
+ console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
198
+ process.exitCode = 1;
199
+ }
200
+ });
201
+ membersCmd
202
+ .command('list')
203
+ .description('List members with their mailbox and API key counts')
204
+ .action(() => {
205
+ const ctx = createContext();
206
+ warnLicense(ctx.db);
207
+ const all = listMembers(ctx.db);
208
+ if (!all.length) {
209
+ console.log('No members. Run "fluxmail members add --name <name>".');
210
+ return;
211
+ }
212
+ for (const m of all) {
213
+ console.log(`${m.id} ${m.name} email=${m.email ?? '-'} mailboxes=${m.accountCount} keys=${m.apiKeyCount}`);
214
+ }
215
+ });
216
+ membersCmd
217
+ .command('remove')
218
+ .argument('<memberId>')
219
+ .description('Remove a member; their mailboxes become shared and their API keys are revoked')
220
+ .action((memberId) => {
221
+ const ctx = createContext();
222
+ warnLicense(ctx.db);
223
+ try {
224
+ const { name, freedAccounts, revokedApiKeys } = removeMember(ctx.db, memberId);
225
+ console.log(`Removed ${name}. ${freedAccounts} mailbox(es) are now shared and ${revokedApiKeys} API key(s) revoked.`);
226
+ }
227
+ catch (err) {
228
+ console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
229
+ process.exitCode = 1;
230
+ }
231
+ });
232
+ const apikey = program.command('apikey').description('Manage API keys for the HTTP MCP endpoint');
233
+ apikey
234
+ .command('create')
235
+ .requiredOption('--name <name>', 'Human-readable key name')
236
+ .option('--member <member>', 'Member (id or email) the key is issued to')
237
+ .description('Create an API key (shown once)')
238
+ .action((opts) => {
239
+ const ctx = createContext();
240
+ warnLicense(ctx.db);
241
+ try {
242
+ const member = opts.member ? findMember(ctx.db, opts.member) : undefined;
243
+ const { key, info } = createApiKey(ctx.db, opts.name, member?.id);
244
+ console.log(`Created API key "${info.name}" (id: ${info.id})` + (member ? ` for member ${member.name}` : '') + '\n');
245
+ console.log(` ${key}\n`);
246
+ console.log('Store it now; it cannot be shown again.');
247
+ }
248
+ catch (err) {
249
+ console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
250
+ process.exitCode = 1;
251
+ }
252
+ });
253
+ apikey
254
+ .command('list')
255
+ .description('List API keys')
256
+ .action(() => {
257
+ const ctx = createContext();
258
+ warnLicense(ctx.db);
259
+ const keys = listApiKeys(ctx.db);
260
+ if (!keys.length) {
261
+ console.log('No API keys. Run "fluxmail apikey create --name <name>".');
262
+ return;
263
+ }
264
+ const memberNames = new Map(listMembers(ctx.db).map((m) => [m.id, m.name]));
265
+ for (const k of keys) {
266
+ const lastUsed = k.lastUsedAt ? new Date(k.lastUsedAt).toISOString() : 'never';
267
+ const member = k.memberId ? (memberNames.get(k.memberId) ?? k.memberId) : '-';
268
+ console.log(`${k.id} ${k.name} member=${member} created=${new Date(k.createdAt).toISOString()} lastUsed=${lastUsed}`);
269
+ }
270
+ });
271
+ apikey
272
+ .command('revoke')
273
+ .argument('<keyId>')
274
+ .description('Revoke an API key')
275
+ .action((keyId) => {
276
+ const ctx = createContext();
277
+ warnLicense(ctx.db);
278
+ console.log(revokeApiKey(ctx.db, keyId) ? `Revoked ${keyId}` : `No key with id ${keyId}`);
279
+ });
280
+ const license = program.command('license').description('Manage the paid-tier license');
281
+ license
282
+ .command('activate')
283
+ .argument('<key>', 'License key (fluxmail_lic_…), shown once at purchase')
284
+ .description('Store a license key and validate it with the license server')
285
+ .action(async (key) => {
286
+ if (!LICENSE_KEY_PATTERN.test(key)) {
287
+ console.error('That does not look like a Fluxmail license key (expected "fluxmail_lic_" followed by 40 hex characters).');
288
+ process.exitCode = 1;
289
+ return;
290
+ }
291
+ const dataDir = resolveDataDir();
292
+ const overridingKey = process.env.FLUXMAIL_LICENSE_KEY?.trim();
293
+ if (overridingKey && overridingKey !== key) {
294
+ console.error('FLUXMAIL_LICENSE_KEY is already set by the shell or a .env file, which takes precedence over stored settings. Remove it before activating a different key.');
295
+ process.exitCode = 1;
296
+ return;
297
+ }
298
+ const ctx = createContext();
299
+ const result = await activateLicense(ctx.db, {
300
+ licenseKey: key,
301
+ serverUrl: ctx.config.licenseServerUrl,
302
+ dataDir,
303
+ });
304
+ if (result.outcome === 'refreshed') {
305
+ const { lease } = result;
306
+ console.log(`License activated: ${lease.plan} plan, up to ${lease.maxAccounts} mailboxes and ` +
307
+ `${lease.maxMembers} member${lease.maxMembers === 1 ? '' : 's'}.`);
308
+ console.log(`The lease is valid until ${lease.expiresAt} and renews automatically while the server runs.`);
309
+ return;
310
+ }
311
+ console.error(result.message);
312
+ if (result.outcome === 'outage') {
313
+ console.error('The key is saved; validation will be retried automatically once the server can reach it.');
314
+ }
315
+ else {
316
+ process.exitCode = 1;
317
+ }
318
+ });
319
+ license
320
+ .command('status')
321
+ .description('Show the configured license and cached lease')
322
+ .action(() => {
323
+ const ctx = createContext();
324
+ if (ctx.config.licenseKey) {
325
+ console.log(`License key: ${maskStoredConfigValue('FLUXMAIL_LICENSE_KEY', ctx.config.licenseKey)}`);
326
+ }
327
+ else {
328
+ console.log('No license key configured. Run "fluxmail license activate <key>" after purchasing one.');
329
+ }
330
+ const row = readLeaseRow(ctx.db);
331
+ if (row) {
332
+ console.log(`Last validated: ${new Date(row.updatedAt).toISOString()}`);
333
+ try {
334
+ const lease = verifyLease(row.token, licensePublicKeys(), new Date(), { allowExpired: true });
335
+ const expired = Date.parse(lease.expiresAt) <= Date.now();
336
+ console.log(`Lease ${expired ? 'expired' : 'valid until'} ${lease.expiresAt}: ${lease.plan} plan, ` +
337
+ `up to ${lease.maxAccounts} mailboxes and ${lease.maxMembers} member${lease.maxMembers === 1 ? '' : 's'}.`);
338
+ }
339
+ catch (err) {
340
+ console.log(`Cached lease is not usable (${err instanceof Error ? err.message : String(err)}).`);
341
+ }
342
+ }
343
+ else {
344
+ console.log('No cached lease.');
345
+ }
346
+ console.log(`Current plan: ${planLine(getEntitlements(ctx.db))}`);
347
+ warnLicense(ctx.db, console.log);
348
+ });
349
+ license
350
+ .command('deactivate')
351
+ .description('Release the license from this instance and remove the stored key and cached lease')
352
+ .action(async () => {
353
+ const dataDir = resolveDataDir();
354
+ // Captured before createContext() merges the stored config into the
355
+ // environment: truthy only when the key comes from the shell or a .env file.
356
+ const envLicenseKey = process.env.FLUXMAIL_LICENSE_KEY?.trim();
357
+ const ctx = createContext();
358
+ // Best effort: free the server-side instance binding so the key can be
359
+ // activated elsewhere. Local deactivation proceeds either way.
360
+ if (ctx.config.licenseKey) {
361
+ const released = await releaseLicense({
362
+ serverUrl: ctx.config.licenseServerUrl,
363
+ licenseKey: ctx.config.licenseKey,
364
+ instanceId: loadInstanceId(dataDir),
365
+ });
366
+ console.log(released
367
+ ? 'Released the license from this instance; it can now be activated elsewhere.'
368
+ : 'Could not reach the license server to release this instance; unused bindings are released automatically after a while.');
369
+ }
370
+ const removed = unsetStoredConfig(dataDir, 'FLUXMAIL_LICENSE_KEY');
371
+ clearLease(ctx.db);
372
+ console.log(removed
373
+ ? 'License removed; this instance is back to Personal-plan limits.'
374
+ : 'No stored license key; cleared any cached lease.');
375
+ if (envLicenseKey) {
376
+ console.log('Note: FLUXMAIL_LICENSE_KEY is still set in the environment or a .env file.');
377
+ }
378
+ });
379
+ const configCmd = program
380
+ .command('config')
381
+ .description('Persistent settings stored in the data dir, usable from any directory');
382
+ configCmd
383
+ .command('set')
384
+ .argument('<key>', 'Setting name, e.g. GOOGLE_CLIENT_ID')
385
+ .argument('<value>')
386
+ .description('Store a setting (shell env vars and local .env files still take precedence)')
387
+ .action((key, value) => {
388
+ try {
389
+ const dataDir = resolveDataDir();
390
+ setStoredConfig(dataDir, key, value);
391
+ console.log(`Set ${key} in ${configFilePath(dataDir)}`);
392
+ }
393
+ catch (err) {
394
+ console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
395
+ process.exitCode = 1;
396
+ }
397
+ });
398
+ configCmd
399
+ .command('unset')
400
+ .argument('<key>')
401
+ .description('Remove a stored setting')
402
+ .action((key) => {
403
+ const dataDir = resolveDataDir();
404
+ console.log(unsetStoredConfig(dataDir, key) ? `Removed ${key}` : `${key} is not set`);
405
+ });
406
+ configCmd
407
+ .command('list')
408
+ .description('Show stored settings (secret values are masked)')
409
+ .action(() => {
410
+ const dataDir = resolveDataDir();
411
+ const stored = readStoredConfig(dataDir);
412
+ const keys = Object.keys(stored);
413
+ if (!keys.length) {
414
+ console.log(`No stored settings. Run "fluxmail config set <KEY> <value>" (file: ${configFilePath(dataDir)}).`);
415
+ return;
416
+ }
417
+ for (const key of keys) {
418
+ const value = stored[key] ?? '';
419
+ console.log(`${key}=${maskStoredConfigValue(key, value)}`);
420
+ }
421
+ });
422
+ program
423
+ .command('status')
424
+ .description('Show accounts, members, entitlements, and provider availability')
425
+ .action(async () => {
426
+ const ctx = createContext();
427
+ warnLicense(ctx.db);
428
+ console.log(JSON.stringify(await ctx.service.status(), null, 2));
429
+ });
430
+ program.parseAsync(process.argv).catch((err) => {
431
+ console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
432
+ process.exitCode = 1;
433
+ });
434
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ export interface FluxmailConfig {
2
+ dataDir: string;
3
+ dbPath: string;
4
+ /** 32-byte key for AES-256-GCM token encryption. */
5
+ encryptionKey: Buffer;
6
+ port: number;
7
+ /** Public base URL of the HTTP server, used to build OAuth redirect URIs. */
8
+ baseUrl: string;
9
+ /** Port for the ephemeral loopback OAuth listener used by `fluxmail accounts add`. */
10
+ oauthPort: number;
11
+ /** Bind address for the OAuth listener. Docker uses 0.0.0.0 so its published port can reach it. */
12
+ oauthHost: string;
13
+ /** 'apikey' (default) requires a bearer token on /mcp; 'none' is for trusted networks only. */
14
+ authMode: 'apikey' | 'none';
15
+ /** Paid-tier license key (fluxmail_lic_…); absent means free tier. */
16
+ licenseKey?: string;
17
+ /** Base URL of the hosted license server. */
18
+ licenseServerUrl: string;
19
+ google?: {
20
+ clientId: string;
21
+ clientSecret: string;
22
+ };
23
+ }
24
+ /**
25
+ * Load .env.local and .env from the working directory. Real environment
26
+ * variables always win; .env.local wins over .env.
27
+ */
28
+ export declare function loadDotEnv(cwd?: string): void;
29
+ /** Expand a leading "~" (e.g. FLUXMAIL_DATA_DIR=~/.fluxmail), which Node does not do. */
30
+ export declare function expandHome(p: string): string;
31
+ /** Resolve (and create) the data dir, honoring cwd .env files and FLUXMAIL_DATA_DIR. */
32
+ export declare function resolveDataDir(): string;
33
+ export declare function configFilePath(dataDir: string): string;
34
+ /** Settings persisted by `fluxmail config set`, e.g. GOOGLE_CLIENT_ID. */
35
+ export declare function readStoredConfig(dataDir: string): Record<string, string>;
36
+ export declare function setStoredConfig(dataDir: string, key: string, value: string): void;
37
+ export declare function unsetStoredConfig(dataDir: string, key: string): boolean;
38
+ export declare function maskStoredConfigValue(key: string, value: string): string;
39
+ export declare function loadConfig(): FluxmailConfig;
40
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;IAChB,sFAAsF;IACtF,SAAS,EAAE,MAAM,CAAC;IAClB,mGAAmG;IACnG,SAAS,EAAE,MAAM,CAAC;IAClB,+FAA+F;IAC/F,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC5B,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AA+CD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,SAAgB,GAAG,IAAI,CAGpD;AAED,yFAAyF;AACzF,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI5C;AAED,wFAAwF;AACxF,wBAAgB,cAAc,IAAI,MAAM,CAMvC;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAWD,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKxE;AAID,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAUjF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAMvE;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGxE;AAmED,wBAAgB,UAAU,IAAI,cAAc,CAoC3C"}