@diskd-ai/email-client-mcp 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 (81) hide show
  1. package/LICENSE +155 -0
  2. package/README.md +110 -0
  3. package/dist/config/loader.d.ts +12 -0
  4. package/dist/config/loader.js +42 -0
  5. package/dist/config/loader.js.map +1 -0
  6. package/dist/config/schema.d.ts +512 -0
  7. package/dist/config/schema.js +66 -0
  8. package/dist/config/schema.js.map +1 -0
  9. package/dist/domain/errors.d.ts +40 -0
  10. package/dist/domain/errors.js +46 -0
  11. package/dist/domain/errors.js.map +1 -0
  12. package/dist/domain/result.d.ts +30 -0
  13. package/dist/domain/result.js +12 -0
  14. package/dist/domain/result.js.map +1 -0
  15. package/dist/imap/fetch.d.ts +44 -0
  16. package/dist/imap/fetch.js +127 -0
  17. package/dist/imap/fetch.js.map +1 -0
  18. package/dist/imap/mapper.d.ts +70 -0
  19. package/dist/imap/mapper.js +140 -0
  20. package/dist/imap/mapper.js.map +1 -0
  21. package/dist/imap/pool.d.ts +26 -0
  22. package/dist/imap/pool.js +92 -0
  23. package/dist/imap/pool.js.map +1 -0
  24. package/dist/imap/virtualFolders.d.ts +11 -0
  25. package/dist/imap/virtualFolders.js +20 -0
  26. package/dist/imap/virtualFolders.js.map +1 -0
  27. package/dist/sdk/diskdClient.d.ts +21 -0
  28. package/dist/sdk/diskdClient.js +39 -0
  29. package/dist/sdk/diskdClient.js.map +1 -0
  30. package/dist/server.d.ts +17 -0
  31. package/dist/server.js +180 -0
  32. package/dist/server.js.map +1 -0
  33. package/dist/store/conventions.d.ts +31 -0
  34. package/dist/store/conventions.js +53 -0
  35. package/dist/store/conventions.js.map +1 -0
  36. package/dist/store/driveStore.d.ts +36 -0
  37. package/dist/store/driveStore.js +95 -0
  38. package/dist/store/driveStore.js.map +1 -0
  39. package/dist/store/payloadTypes.d.ts +62 -0
  40. package/dist/store/payloadTypes.js +11 -0
  41. package/dist/store/payloadTypes.js.map +1 -0
  42. package/dist/sync/backoff.d.ts +18 -0
  43. package/dist/sync/backoff.js +24 -0
  44. package/dist/sync/backoff.js.map +1 -0
  45. package/dist/sync/sync.d.ts +85 -0
  46. package/dist/sync/sync.js +383 -0
  47. package/dist/sync/sync.js.map +1 -0
  48. package/dist/sync/watcher.d.ts +43 -0
  49. package/dist/sync/watcher.js +141 -0
  50. package/dist/sync/watcher.js.map +1 -0
  51. package/dist/tools/bulkAction.d.ts +41 -0
  52. package/dist/tools/bulkAction.js +82 -0
  53. package/dist/tools/bulkAction.js.map +1 -0
  54. package/dist/tools/findMailboxFolder.d.ts +33 -0
  55. package/dist/tools/findMailboxFolder.js +45 -0
  56. package/dist/tools/findMailboxFolder.js.map +1 -0
  57. package/dist/tools/getEmail.d.ts +41 -0
  58. package/dist/tools/getEmail.js +74 -0
  59. package/dist/tools/getEmail.js.map +1 -0
  60. package/dist/tools/getEmails.d.ts +38 -0
  61. package/dist/tools/getEmails.js +72 -0
  62. package/dist/tools/getEmails.js.map +1 -0
  63. package/dist/tools/getWatcherStatus.d.ts +9 -0
  64. package/dist/tools/getWatcherStatus.js +8 -0
  65. package/dist/tools/getWatcherStatus.js.map +1 -0
  66. package/dist/tools/listAccounts.d.ts +19 -0
  67. package/dist/tools/listAccounts.js +18 -0
  68. package/dist/tools/listAccounts.js.map +1 -0
  69. package/dist/tools/listEmails.d.ts +70 -0
  70. package/dist/tools/listEmails.js +101 -0
  71. package/dist/tools/listEmails.js.map +1 -0
  72. package/dist/tools/listMailboxFolder.d.ts +33 -0
  73. package/dist/tools/listMailboxFolder.js +60 -0
  74. package/dist/tools/listMailboxFolder.js.map +1 -0
  75. package/dist/tools/moveEmail.d.ts +36 -0
  76. package/dist/tools/moveEmail.js +52 -0
  77. package/dist/tools/moveEmail.js.map +1 -0
  78. package/dist/tools/registry.d.ts +17 -0
  79. package/dist/tools/registry.js +64 -0
  80. package/dist/tools/registry.js.map +1 -0
  81. package/package.json +46 -0
@@ -0,0 +1,512 @@
1
+ /**
2
+ * Zod schemas for the TOML config file mounted at
3
+ * `/home/mcp/.config/email-client-mcp/config.toml` by the assembler
4
+ * (or wherever `EMAIL_CLIENT_MCP_CONFIG` points).
5
+ *
6
+ * Mirrors the per-account shape used by `diskd-ai/email-mcp` so the same
7
+ * vault accounts can serve both servers; adds [sdk] and [watcher]
8
+ * sections specific to this server.
9
+ */
10
+ import { z } from "zod";
11
+ declare const passwordAccountSchema: z.ZodObject<{
12
+ name: z.ZodString;
13
+ email: z.ZodString;
14
+ username: z.ZodOptional<z.ZodString>;
15
+ full_name: z.ZodOptional<z.ZodString>;
16
+ password: z.ZodString;
17
+ imap: z.ZodObject<{
18
+ host: z.ZodString;
19
+ port: z.ZodNumber;
20
+ tls: z.ZodDefault<z.ZodBoolean>;
21
+ verify_ssl: z.ZodDefault<z.ZodBoolean>;
22
+ }, "strip", z.ZodTypeAny, {
23
+ host: string;
24
+ port: number;
25
+ tls: boolean;
26
+ verify_ssl: boolean;
27
+ }, {
28
+ host: string;
29
+ port: number;
30
+ tls?: boolean | undefined;
31
+ verify_ssl?: boolean | undefined;
32
+ }>;
33
+ }, "strip", z.ZodTypeAny, {
34
+ name: string;
35
+ email: string;
36
+ password: string;
37
+ imap: {
38
+ host: string;
39
+ port: number;
40
+ tls: boolean;
41
+ verify_ssl: boolean;
42
+ };
43
+ username?: string | undefined;
44
+ full_name?: string | undefined;
45
+ }, {
46
+ name: string;
47
+ email: string;
48
+ password: string;
49
+ imap: {
50
+ host: string;
51
+ port: number;
52
+ tls?: boolean | undefined;
53
+ verify_ssl?: boolean | undefined;
54
+ };
55
+ username?: string | undefined;
56
+ full_name?: string | undefined;
57
+ }>;
58
+ declare const oauthAccountSchema: z.ZodObject<{
59
+ name: z.ZodString;
60
+ email: z.ZodString;
61
+ full_name: z.ZodOptional<z.ZodString>;
62
+ oauth2: z.ZodObject<{
63
+ provider: z.ZodString;
64
+ client_id: z.ZodString;
65
+ client_secret: z.ZodString;
66
+ refresh_token: z.ZodString;
67
+ }, "strip", z.ZodTypeAny, {
68
+ provider: string;
69
+ client_id: string;
70
+ client_secret: string;
71
+ refresh_token: string;
72
+ }, {
73
+ provider: string;
74
+ client_id: string;
75
+ client_secret: string;
76
+ refresh_token: string;
77
+ }>;
78
+ imap: z.ZodObject<{
79
+ host: z.ZodString;
80
+ port: z.ZodNumber;
81
+ tls: z.ZodDefault<z.ZodBoolean>;
82
+ verify_ssl: z.ZodDefault<z.ZodBoolean>;
83
+ }, "strip", z.ZodTypeAny, {
84
+ host: string;
85
+ port: number;
86
+ tls: boolean;
87
+ verify_ssl: boolean;
88
+ }, {
89
+ host: string;
90
+ port: number;
91
+ tls?: boolean | undefined;
92
+ verify_ssl?: boolean | undefined;
93
+ }>;
94
+ }, "strip", z.ZodTypeAny, {
95
+ name: string;
96
+ email: string;
97
+ imap: {
98
+ host: string;
99
+ port: number;
100
+ tls: boolean;
101
+ verify_ssl: boolean;
102
+ };
103
+ oauth2: {
104
+ provider: string;
105
+ client_id: string;
106
+ client_secret: string;
107
+ refresh_token: string;
108
+ };
109
+ full_name?: string | undefined;
110
+ }, {
111
+ name: string;
112
+ email: string;
113
+ imap: {
114
+ host: string;
115
+ port: number;
116
+ tls?: boolean | undefined;
117
+ verify_ssl?: boolean | undefined;
118
+ };
119
+ oauth2: {
120
+ provider: string;
121
+ client_id: string;
122
+ client_secret: string;
123
+ refresh_token: string;
124
+ };
125
+ full_name?: string | undefined;
126
+ }>;
127
+ export declare const accountSchema: z.ZodUnion<[z.ZodObject<{
128
+ name: z.ZodString;
129
+ email: z.ZodString;
130
+ username: z.ZodOptional<z.ZodString>;
131
+ full_name: z.ZodOptional<z.ZodString>;
132
+ password: z.ZodString;
133
+ imap: z.ZodObject<{
134
+ host: z.ZodString;
135
+ port: z.ZodNumber;
136
+ tls: z.ZodDefault<z.ZodBoolean>;
137
+ verify_ssl: z.ZodDefault<z.ZodBoolean>;
138
+ }, "strip", z.ZodTypeAny, {
139
+ host: string;
140
+ port: number;
141
+ tls: boolean;
142
+ verify_ssl: boolean;
143
+ }, {
144
+ host: string;
145
+ port: number;
146
+ tls?: boolean | undefined;
147
+ verify_ssl?: boolean | undefined;
148
+ }>;
149
+ }, "strip", z.ZodTypeAny, {
150
+ name: string;
151
+ email: string;
152
+ password: string;
153
+ imap: {
154
+ host: string;
155
+ port: number;
156
+ tls: boolean;
157
+ verify_ssl: boolean;
158
+ };
159
+ username?: string | undefined;
160
+ full_name?: string | undefined;
161
+ }, {
162
+ name: string;
163
+ email: string;
164
+ password: string;
165
+ imap: {
166
+ host: string;
167
+ port: number;
168
+ tls?: boolean | undefined;
169
+ verify_ssl?: boolean | undefined;
170
+ };
171
+ username?: string | undefined;
172
+ full_name?: string | undefined;
173
+ }>, z.ZodObject<{
174
+ name: z.ZodString;
175
+ email: z.ZodString;
176
+ full_name: z.ZodOptional<z.ZodString>;
177
+ oauth2: z.ZodObject<{
178
+ provider: z.ZodString;
179
+ client_id: z.ZodString;
180
+ client_secret: z.ZodString;
181
+ refresh_token: z.ZodString;
182
+ }, "strip", z.ZodTypeAny, {
183
+ provider: string;
184
+ client_id: string;
185
+ client_secret: string;
186
+ refresh_token: string;
187
+ }, {
188
+ provider: string;
189
+ client_id: string;
190
+ client_secret: string;
191
+ refresh_token: string;
192
+ }>;
193
+ imap: z.ZodObject<{
194
+ host: z.ZodString;
195
+ port: z.ZodNumber;
196
+ tls: z.ZodDefault<z.ZodBoolean>;
197
+ verify_ssl: z.ZodDefault<z.ZodBoolean>;
198
+ }, "strip", z.ZodTypeAny, {
199
+ host: string;
200
+ port: number;
201
+ tls: boolean;
202
+ verify_ssl: boolean;
203
+ }, {
204
+ host: string;
205
+ port: number;
206
+ tls?: boolean | undefined;
207
+ verify_ssl?: boolean | undefined;
208
+ }>;
209
+ }, "strip", z.ZodTypeAny, {
210
+ name: string;
211
+ email: string;
212
+ imap: {
213
+ host: string;
214
+ port: number;
215
+ tls: boolean;
216
+ verify_ssl: boolean;
217
+ };
218
+ oauth2: {
219
+ provider: string;
220
+ client_id: string;
221
+ client_secret: string;
222
+ refresh_token: string;
223
+ };
224
+ full_name?: string | undefined;
225
+ }, {
226
+ name: string;
227
+ email: string;
228
+ imap: {
229
+ host: string;
230
+ port: number;
231
+ tls?: boolean | undefined;
232
+ verify_ssl?: boolean | undefined;
233
+ };
234
+ oauth2: {
235
+ provider: string;
236
+ client_id: string;
237
+ client_secret: string;
238
+ refresh_token: string;
239
+ };
240
+ full_name?: string | undefined;
241
+ }>]>;
242
+ export type Account = z.infer<typeof accountSchema>;
243
+ export type PasswordAccount = z.infer<typeof passwordAccountSchema>;
244
+ export type OAuthAccount = z.infer<typeof oauthAccountSchema>;
245
+ export declare const isOAuthAccount: (a: Account) => a is OAuthAccount;
246
+ declare const watcherSchema: z.ZodObject<{
247
+ enabled: z.ZodDefault<z.ZodBoolean>;
248
+ interval_ms: z.ZodDefault<z.ZodNumber>;
249
+ folders: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
250
+ flag_reconcile_window: z.ZodDefault<z.ZodNumber>;
251
+ }, "strip", z.ZodTypeAny, {
252
+ enabled: boolean;
253
+ interval_ms: number;
254
+ flag_reconcile_window: number;
255
+ folders?: string[] | undefined;
256
+ }, {
257
+ enabled?: boolean | undefined;
258
+ interval_ms?: number | undefined;
259
+ folders?: string[] | undefined;
260
+ flag_reconcile_window?: number | undefined;
261
+ }>;
262
+ declare const sdkSchema: z.ZodObject<{
263
+ api_key: z.ZodString;
264
+ base_url: z.ZodOptional<z.ZodString>;
265
+ workspace_id: z.ZodOptional<z.ZodString>;
266
+ }, "strip", z.ZodTypeAny, {
267
+ api_key: string;
268
+ base_url?: string | undefined;
269
+ workspace_id?: string | undefined;
270
+ }, {
271
+ api_key: string;
272
+ base_url?: string | undefined;
273
+ workspace_id?: string | undefined;
274
+ }>;
275
+ export declare const configSchema: z.ZodObject<{
276
+ accounts: z.ZodArray<z.ZodUnion<[z.ZodObject<{
277
+ name: z.ZodString;
278
+ email: z.ZodString;
279
+ username: z.ZodOptional<z.ZodString>;
280
+ full_name: z.ZodOptional<z.ZodString>;
281
+ password: z.ZodString;
282
+ imap: z.ZodObject<{
283
+ host: z.ZodString;
284
+ port: z.ZodNumber;
285
+ tls: z.ZodDefault<z.ZodBoolean>;
286
+ verify_ssl: z.ZodDefault<z.ZodBoolean>;
287
+ }, "strip", z.ZodTypeAny, {
288
+ host: string;
289
+ port: number;
290
+ tls: boolean;
291
+ verify_ssl: boolean;
292
+ }, {
293
+ host: string;
294
+ port: number;
295
+ tls?: boolean | undefined;
296
+ verify_ssl?: boolean | undefined;
297
+ }>;
298
+ }, "strip", z.ZodTypeAny, {
299
+ name: string;
300
+ email: string;
301
+ password: string;
302
+ imap: {
303
+ host: string;
304
+ port: number;
305
+ tls: boolean;
306
+ verify_ssl: boolean;
307
+ };
308
+ username?: string | undefined;
309
+ full_name?: string | undefined;
310
+ }, {
311
+ name: string;
312
+ email: string;
313
+ password: string;
314
+ imap: {
315
+ host: string;
316
+ port: number;
317
+ tls?: boolean | undefined;
318
+ verify_ssl?: boolean | undefined;
319
+ };
320
+ username?: string | undefined;
321
+ full_name?: string | undefined;
322
+ }>, z.ZodObject<{
323
+ name: z.ZodString;
324
+ email: z.ZodString;
325
+ full_name: z.ZodOptional<z.ZodString>;
326
+ oauth2: z.ZodObject<{
327
+ provider: z.ZodString;
328
+ client_id: z.ZodString;
329
+ client_secret: z.ZodString;
330
+ refresh_token: z.ZodString;
331
+ }, "strip", z.ZodTypeAny, {
332
+ provider: string;
333
+ client_id: string;
334
+ client_secret: string;
335
+ refresh_token: string;
336
+ }, {
337
+ provider: string;
338
+ client_id: string;
339
+ client_secret: string;
340
+ refresh_token: string;
341
+ }>;
342
+ imap: z.ZodObject<{
343
+ host: z.ZodString;
344
+ port: z.ZodNumber;
345
+ tls: z.ZodDefault<z.ZodBoolean>;
346
+ verify_ssl: z.ZodDefault<z.ZodBoolean>;
347
+ }, "strip", z.ZodTypeAny, {
348
+ host: string;
349
+ port: number;
350
+ tls: boolean;
351
+ verify_ssl: boolean;
352
+ }, {
353
+ host: string;
354
+ port: number;
355
+ tls?: boolean | undefined;
356
+ verify_ssl?: boolean | undefined;
357
+ }>;
358
+ }, "strip", z.ZodTypeAny, {
359
+ name: string;
360
+ email: string;
361
+ imap: {
362
+ host: string;
363
+ port: number;
364
+ tls: boolean;
365
+ verify_ssl: boolean;
366
+ };
367
+ oauth2: {
368
+ provider: string;
369
+ client_id: string;
370
+ client_secret: string;
371
+ refresh_token: string;
372
+ };
373
+ full_name?: string | undefined;
374
+ }, {
375
+ name: string;
376
+ email: string;
377
+ imap: {
378
+ host: string;
379
+ port: number;
380
+ tls?: boolean | undefined;
381
+ verify_ssl?: boolean | undefined;
382
+ };
383
+ oauth2: {
384
+ provider: string;
385
+ client_id: string;
386
+ client_secret: string;
387
+ refresh_token: string;
388
+ };
389
+ full_name?: string | undefined;
390
+ }>]>, "many">;
391
+ sdk: z.ZodObject<{
392
+ api_key: z.ZodString;
393
+ base_url: z.ZodOptional<z.ZodString>;
394
+ workspace_id: z.ZodOptional<z.ZodString>;
395
+ }, "strip", z.ZodTypeAny, {
396
+ api_key: string;
397
+ base_url?: string | undefined;
398
+ workspace_id?: string | undefined;
399
+ }, {
400
+ api_key: string;
401
+ base_url?: string | undefined;
402
+ workspace_id?: string | undefined;
403
+ }>;
404
+ watcher: z.ZodDefault<z.ZodObject<{
405
+ enabled: z.ZodDefault<z.ZodBoolean>;
406
+ interval_ms: z.ZodDefault<z.ZodNumber>;
407
+ folders: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
408
+ flag_reconcile_window: z.ZodDefault<z.ZodNumber>;
409
+ }, "strip", z.ZodTypeAny, {
410
+ enabled: boolean;
411
+ interval_ms: number;
412
+ flag_reconcile_window: number;
413
+ folders?: string[] | undefined;
414
+ }, {
415
+ enabled?: boolean | undefined;
416
+ interval_ms?: number | undefined;
417
+ folders?: string[] | undefined;
418
+ flag_reconcile_window?: number | undefined;
419
+ }>>;
420
+ }, "strip", z.ZodTypeAny, {
421
+ accounts: ({
422
+ name: string;
423
+ email: string;
424
+ password: string;
425
+ imap: {
426
+ host: string;
427
+ port: number;
428
+ tls: boolean;
429
+ verify_ssl: boolean;
430
+ };
431
+ username?: string | undefined;
432
+ full_name?: string | undefined;
433
+ } | {
434
+ name: string;
435
+ email: string;
436
+ imap: {
437
+ host: string;
438
+ port: number;
439
+ tls: boolean;
440
+ verify_ssl: boolean;
441
+ };
442
+ oauth2: {
443
+ provider: string;
444
+ client_id: string;
445
+ client_secret: string;
446
+ refresh_token: string;
447
+ };
448
+ full_name?: string | undefined;
449
+ })[];
450
+ sdk: {
451
+ api_key: string;
452
+ base_url?: string | undefined;
453
+ workspace_id?: string | undefined;
454
+ };
455
+ watcher: {
456
+ enabled: boolean;
457
+ interval_ms: number;
458
+ flag_reconcile_window: number;
459
+ folders?: string[] | undefined;
460
+ };
461
+ }, {
462
+ accounts: ({
463
+ name: string;
464
+ email: string;
465
+ password: string;
466
+ imap: {
467
+ host: string;
468
+ port: number;
469
+ tls?: boolean | undefined;
470
+ verify_ssl?: boolean | undefined;
471
+ };
472
+ username?: string | undefined;
473
+ full_name?: string | undefined;
474
+ } | {
475
+ name: string;
476
+ email: string;
477
+ imap: {
478
+ host: string;
479
+ port: number;
480
+ tls?: boolean | undefined;
481
+ verify_ssl?: boolean | undefined;
482
+ };
483
+ oauth2: {
484
+ provider: string;
485
+ client_id: string;
486
+ client_secret: string;
487
+ refresh_token: string;
488
+ };
489
+ full_name?: string | undefined;
490
+ })[];
491
+ sdk: {
492
+ api_key: string;
493
+ base_url?: string | undefined;
494
+ workspace_id?: string | undefined;
495
+ };
496
+ watcher?: {
497
+ enabled?: boolean | undefined;
498
+ interval_ms?: number | undefined;
499
+ folders?: string[] | undefined;
500
+ flag_reconcile_window?: number | undefined;
501
+ } | undefined;
502
+ }>;
503
+ export type Config = z.infer<typeof configSchema>;
504
+ export type WatcherSettings = z.infer<typeof watcherSchema>;
505
+ export type SdkSettings = z.infer<typeof sdkSchema>;
506
+ /**
507
+ * Default config search path. Overridden by `EMAIL_CLIENT_MCP_CONFIG`.
508
+ * Matches the MOUNT_PATH convention used by other diskd-ai assemblers
509
+ * but resolves the user's home dir at startup so it works locally.
510
+ */
511
+ export declare const defaultConfigPath: (homeDir: string) => string;
512
+ export {};
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Zod schemas for the TOML config file mounted at
3
+ * `/home/mcp/.config/email-client-mcp/config.toml` by the assembler
4
+ * (or wherever `EMAIL_CLIENT_MCP_CONFIG` points).
5
+ *
6
+ * Mirrors the per-account shape used by `diskd-ai/email-mcp` so the same
7
+ * vault accounts can serve both servers; adds [sdk] and [watcher]
8
+ * sections specific to this server.
9
+ */
10
+ import { z } from "zod";
11
+ const imapSchema = z.object({
12
+ host: z.string().min(1),
13
+ port: z.number().int().min(1).max(65535),
14
+ tls: z.boolean().default(true),
15
+ verify_ssl: z.boolean().default(false),
16
+ });
17
+ const passwordAccountSchema = z.object({
18
+ name: z.string().min(1),
19
+ email: z.string().min(1),
20
+ username: z.string().optional(),
21
+ full_name: z.string().optional(),
22
+ password: z.string().min(1),
23
+ imap: imapSchema,
24
+ });
25
+ const oauth2Schema = z.object({
26
+ provider: z.string().min(1),
27
+ client_id: z.string().min(1),
28
+ client_secret: z.string().min(1),
29
+ refresh_token: z.string().min(1),
30
+ });
31
+ const oauthAccountSchema = z.object({
32
+ name: z.string().min(1),
33
+ email: z.string().min(1),
34
+ full_name: z.string().optional(),
35
+ oauth2: oauth2Schema,
36
+ imap: imapSchema,
37
+ });
38
+ export const accountSchema = z.union([passwordAccountSchema, oauthAccountSchema]);
39
+ export const isOAuthAccount = (a) => "oauth2" in a;
40
+ const watcherSchema = z.object({
41
+ enabled: z.boolean().default(true),
42
+ interval_ms: z.number().int().min(60_000).default(60_000),
43
+ folders: z.array(z.string()).optional(),
44
+ flag_reconcile_window: z.number().int().min(0).default(500),
45
+ });
46
+ const sdkSchema = z.object({
47
+ api_key: z.string().min(1),
48
+ base_url: z.string().url().optional(),
49
+ workspace_id: z.string().optional(),
50
+ });
51
+ export const configSchema = z.object({
52
+ accounts: z.array(accountSchema).min(1),
53
+ sdk: sdkSchema,
54
+ watcher: watcherSchema.default({
55
+ enabled: true,
56
+ interval_ms: 60_000,
57
+ flag_reconcile_window: 500,
58
+ }),
59
+ });
60
+ /**
61
+ * Default config search path. Overridden by `EMAIL_CLIENT_MCP_CONFIG`.
62
+ * Matches the MOUNT_PATH convention used by other diskd-ai assemblers
63
+ * but resolves the user's home dir at startup so it works locally.
64
+ */
65
+ export const defaultConfigPath = (homeDir) => `${homeDir}/.config/email-client-mcp/config.toml`;
66
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Typed errors used across modules. Adapters convert raw exceptions
3
+ * (imapflow, fetch, fs) into one of these so the domain stays pure.
4
+ */
5
+ export type ConfigError = {
6
+ readonly kind: "ConfigError";
7
+ readonly message: string;
8
+ readonly cause?: unknown;
9
+ };
10
+ export type ImapError = {
11
+ readonly kind: "ImapError";
12
+ readonly accountId: string;
13
+ readonly message: string;
14
+ readonly cause?: unknown;
15
+ };
16
+ export type DriveError = {
17
+ readonly kind: "DriveError";
18
+ readonly message: string;
19
+ readonly cause?: unknown;
20
+ };
21
+ export type NotFoundError = {
22
+ readonly kind: "NotFound";
23
+ readonly what: string;
24
+ };
25
+ export type VirtualFolderRefused = {
26
+ readonly kind: "VirtualFolderRefused";
27
+ readonly mailbox: string;
28
+ };
29
+ export type ToolInputError = {
30
+ readonly kind: "ToolInputError";
31
+ readonly message: string;
32
+ };
33
+ export type AppError = ConfigError | ImapError | DriveError | NotFoundError | VirtualFolderRefused | ToolInputError;
34
+ export declare const configError: (message: string, cause?: unknown) => ConfigError;
35
+ export declare const imapError: (accountId: string, message: string, cause?: unknown) => ImapError;
36
+ export declare const driveError: (message: string, cause?: unknown) => DriveError;
37
+ export declare const notFound: (what: string) => NotFoundError;
38
+ export declare const virtualFolderRefused: (mailbox: string) => VirtualFolderRefused;
39
+ export declare const toolInputError: (message: string) => ToolInputError;
40
+ export declare const errorMessage: (e: AppError) => string;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Typed errors used across modules. Adapters convert raw exceptions
3
+ * (imapflow, fetch, fs) into one of these so the domain stays pure.
4
+ */
5
+ export const configError = (message, cause) => ({
6
+ kind: "ConfigError",
7
+ message,
8
+ cause,
9
+ });
10
+ export const imapError = (accountId, message, cause) => ({
11
+ kind: "ImapError",
12
+ accountId,
13
+ message,
14
+ cause,
15
+ });
16
+ export const driveError = (message, cause) => ({
17
+ kind: "DriveError",
18
+ message,
19
+ cause,
20
+ });
21
+ export const notFound = (what) => ({ kind: "NotFound", what });
22
+ export const virtualFolderRefused = (mailbox) => ({
23
+ kind: "VirtualFolderRefused",
24
+ mailbox,
25
+ });
26
+ export const toolInputError = (message) => ({
27
+ kind: "ToolInputError",
28
+ message,
29
+ });
30
+ export const errorMessage = (e) => {
31
+ switch (e.kind) {
32
+ case "ConfigError":
33
+ return `config: ${e.message}`;
34
+ case "ImapError":
35
+ return `imap[${e.accountId}]: ${e.message}`;
36
+ case "DriveError":
37
+ return `drive: ${e.message}`;
38
+ case "NotFound":
39
+ return `not found: ${e.what}`;
40
+ case "VirtualFolderRefused":
41
+ return `refusing to operate on virtual mailbox: ${e.mailbox}`;
42
+ case "ToolInputError":
43
+ return `bad tool input: ${e.message}`;
44
+ }
45
+ };
46
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/domain/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiCH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,KAAe,EAAe,EAAE,CAAC,CAAC;IAC7E,IAAI,EAAE,aAAa;IACnB,OAAO;IACP,KAAK;CACN,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAiB,EAAE,OAAe,EAAE,KAAe,EAAa,EAAE,CAAC,CAAC;IAC5F,IAAI,EAAE,WAAW;IACjB,SAAS;IACT,OAAO;IACP,KAAK;CACN,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,KAAe,EAAc,EAAE,CAAC,CAAC;IAC3E,IAAI,EAAE,YAAY;IAClB,OAAO;IACP,KAAK;CACN,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAiB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;AACtF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAe,EAAwB,EAAE,CAAC,CAAC;IAC9E,IAAI,EAAE,sBAAsB;IAC5B,OAAO;CACR,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAe,EAAkB,EAAE,CAAC,CAAC;IAClE,IAAI,EAAE,gBAAgB;IACtB,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAW,EAAU,EAAE;IAClD,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,aAAa;YAChB,OAAO,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC;QAChC,KAAK,WAAW;YACd,OAAO,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9C,KAAK,YAAY;YACf,OAAO,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;QAC/B,KAAK,UAAU;YACb,OAAO,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,KAAK,sBAAsB;YACzB,OAAO,2CAA2C,CAAC,CAAC,OAAO,EAAE,CAAC;QAChE,KAAK,gBAAgB;YACnB,OAAO,mBAAmB,CAAC,CAAC,OAAO,EAAE,CAAC;IAC1C,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Result + Option ADTs. Domain returns `Result<E, T>`; adapters convert
3
+ * thrown exceptions into typed `Err`. Mirrors the project conventions
4
+ * from CODING_CONVENTIONS_TYPESCRIPT.md.
5
+ */
6
+ export type Result<E, T> = {
7
+ readonly tag: "Ok";
8
+ readonly value: T;
9
+ } | {
10
+ readonly tag: "Err";
11
+ readonly error: E;
12
+ };
13
+ export declare const Ok: <T>(value: T) => Result<never, T>;
14
+ export declare const Err: <E>(error: E) => Result<E, never>;
15
+ export declare const isOk: <E, T>(r: Result<E, T>) => r is {
16
+ readonly tag: "Ok";
17
+ readonly value: T;
18
+ };
19
+ export declare const isErr: <E, T>(r: Result<E, T>) => r is {
20
+ readonly tag: "Err";
21
+ readonly error: E;
22
+ };
23
+ export type Option<T> = {
24
+ readonly tag: "Some";
25
+ readonly value: T;
26
+ } | {
27
+ readonly tag: "None";
28
+ };
29
+ export declare const Some: <T>(value: T) => Option<T>;
30
+ export declare const None: Option<never>;