@diskd-ai/email-client-mcp 0.1.38 → 0.1.40

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/config/schema.d.ts +525 -5
  2. package/dist/config/schema.js +67 -4
  3. package/dist/config/schema.js.map +1 -1
  4. package/dist/delivery/application/decideTransportOutcome.d.ts +15 -0
  5. package/dist/delivery/application/decideTransportOutcome.js +14 -0
  6. package/dist/delivery/application/decideTransportOutcome.js.map +1 -0
  7. package/dist/delivery/application/outboxRepository.d.ts +83 -0
  8. package/dist/delivery/application/outboxRepository.js +2 -0
  9. package/dist/delivery/application/outboxRepository.js.map +1 -0
  10. package/dist/delivery/domain/deliveryProgress.d.ts +17 -0
  11. package/dist/delivery/domain/deliveryProgress.js +34 -0
  12. package/dist/delivery/domain/deliveryProgress.js.map +1 -0
  13. package/dist/delivery/domain/deliveryState.d.ts +21 -0
  14. package/dist/delivery/domain/deliveryState.js +7 -0
  15. package/dist/delivery/domain/deliveryState.js.map +1 -0
  16. package/dist/delivery/domain/identity.d.ts +28 -0
  17. package/dist/delivery/domain/identity.js +28 -0
  18. package/dist/delivery/domain/identity.js.map +1 -0
  19. package/dist/delivery/domain/json.d.ts +5 -0
  20. package/dist/delivery/domain/json.js +2 -0
  21. package/dist/delivery/domain/json.js.map +1 -0
  22. package/dist/delivery/domain/transportOutcome.d.ts +31 -0
  23. package/dist/delivery/domain/transportOutcome.js +2 -0
  24. package/dist/delivery/domain/transportOutcome.js.map +1 -0
  25. package/dist/delivery/infrastructure/deliveryProcessor.d.ts +42 -0
  26. package/dist/delivery/infrastructure/deliveryProcessor.js +179 -0
  27. package/dist/delivery/infrastructure/deliveryProcessor.js.map +1 -0
  28. package/dist/delivery/infrastructure/deliveryRuntime.d.ts +13 -0
  29. package/dist/delivery/infrastructure/deliveryRuntime.js +80 -0
  30. package/dist/delivery/infrastructure/deliveryRuntime.js.map +1 -0
  31. package/dist/delivery/infrastructure/emailOutboxPayload.d.ts +7 -0
  32. package/dist/delivery/infrastructure/emailOutboxPayload.js +42 -0
  33. package/dist/delivery/infrastructure/emailOutboxPayload.js.map +1 -0
  34. package/dist/delivery/infrastructure/outboxSdkAdapter.d.ts +7 -0
  35. package/dist/delivery/infrastructure/outboxSdkAdapter.js +164 -0
  36. package/dist/delivery/infrastructure/outboxSdkAdapter.js.map +1 -0
  37. package/dist/delivery/infrastructure/perAccountRateLimiter.d.ts +9 -0
  38. package/dist/delivery/infrastructure/perAccountRateLimiter.js +27 -0
  39. package/dist/delivery/infrastructure/perAccountRateLimiter.js.map +1 -0
  40. package/dist/delivery/infrastructure/smtpTransport.d.ts +43 -0
  41. package/dist/delivery/infrastructure/smtpTransport.js +142 -0
  42. package/dist/delivery/infrastructure/smtpTransport.js.map +1 -0
  43. package/dist/events/platformEventNotifier.d.ts +22 -0
  44. package/dist/events/platformEventNotifier.js +29 -0
  45. package/dist/events/platformEventNotifier.js.map +1 -0
  46. package/dist/sdk/diskdClient.d.ts +1 -1
  47. package/dist/sdk/diskdClient.js +1 -1
  48. package/dist/server.js +88 -47
  49. package/dist/server.js.map +1 -1
  50. package/dist/store/driveStore.d.ts +2 -2
  51. package/dist/store/payloadTypes.d.ts +4 -0
  52. package/dist/sync/sync.d.ts +3 -2
  53. package/dist/sync/sync.js +10 -5
  54. package/dist/sync/sync.js.map +1 -1
  55. package/dist/tools/findMailboxFolder.d.ts +2 -2
  56. package/dist/tools/getEmail.d.ts +4 -4
  57. package/dist/tools/getEmails.d.ts +4 -4
  58. package/dist/tools/listEmails.d.ts +9 -9
  59. package/dist/tools/setEmailAttributes.d.ts +2 -2
  60. package/dist/tools/systemHydrateEmailAttachment.d.ts +4 -4
  61. package/dist/tools/systemHydrateEmailBodies.d.ts +8 -8
  62. package/package.json +4 -2
@@ -0,0 +1,142 @@
1
+ import { createHash } from "node:crypto";
2
+ import * as nodemailer from "nodemailer";
3
+ import { z } from "zod";
4
+ import { isOAuthAccount } from "../../config/schema.js";
5
+ const CONNECTION_TIMEOUT_MS = 30_000;
6
+ const GREETING_TIMEOUT_MS = 30_000;
7
+ const SOCKET_TIMEOUT_MS = 60_000;
8
+ const smtpErrorSchema = z
9
+ .object({
10
+ message: z.string().optional(),
11
+ code: z.string().optional(),
12
+ command: z.string().optional(),
13
+ response: z.string().optional(),
14
+ responseCode: z.number().int().optional(),
15
+ syscall: z.string().optional(),
16
+ })
17
+ .passthrough();
18
+ const formatFailureReason = (details, fallback) => [details.code, details.command, details.response, details.message ?? fallback]
19
+ .filter((part) => typeof part === "string" && part.length > 0)
20
+ .join(": ");
21
+ const rejectionKind = (responseCode) => responseCode !== undefined && responseCode >= 400 && responseCode < 500
22
+ ? "Transient"
23
+ : "Permanent";
24
+ const hasDefinitiveSmtpResponse = (details) => details.responseCode !== undefined && details.responseCode >= 400 && details.responseCode < 600;
25
+ const isPreSubmissionCommand = (command) => command === "CONN" ||
26
+ command === "EHLO" ||
27
+ command === "HELO" ||
28
+ command?.startsWith("AUTH ") === true ||
29
+ command === "MAIL FROM" ||
30
+ command === "RCPT TO" ||
31
+ command === "API";
32
+ /** Classify only failures proven to occur before SMTP acceptance as retryable. */
33
+ export const classifySmtpFailure = (cause) => {
34
+ const parsed = smtpErrorSchema.safeParse(cause);
35
+ const fallback = cause instanceof Error ? cause.message : String(cause);
36
+ if (!parsed.success) {
37
+ return { kind: "UnknownOutcome", failure: { reason: fallback } };
38
+ }
39
+ const details = parsed.data;
40
+ const reason = formatFailureReason(details, fallback);
41
+ if (details.code === "EAUTH" || details.code === "EREQUIRETLS") {
42
+ return {
43
+ kind: "RejectedBeforeAcceptance",
44
+ rejection: { kind: "Permanent", failure: { reason } },
45
+ };
46
+ }
47
+ if (hasDefinitiveSmtpResponse(details)) {
48
+ return {
49
+ kind: "RejectedBeforeAcceptance",
50
+ rejection: {
51
+ kind: rejectionKind(details.responseCode),
52
+ failure: { reason },
53
+ },
54
+ };
55
+ }
56
+ if (details.syscall === "connect") {
57
+ return {
58
+ kind: "RejectedBeforeAcceptance",
59
+ rejection: { kind: "Transient", failure: { reason } },
60
+ };
61
+ }
62
+ if (details.code === "EENVELOPE" && isPreSubmissionCommand(details.command)) {
63
+ return {
64
+ kind: "RejectedBeforeAcceptance",
65
+ rejection: { kind: "Permanent", failure: { reason } },
66
+ };
67
+ }
68
+ return { kind: "UnknownOutcome", failure: { reason } };
69
+ };
70
+ export const buildSmtpConnectionOptions = (account, smtp) => ({
71
+ host: smtp.host,
72
+ port: smtp.port,
73
+ secure: smtp.tls,
74
+ requireTLS: smtp.starttls,
75
+ tls: { rejectUnauthorized: smtp.verify_ssl },
76
+ connectionTimeout: CONNECTION_TIMEOUT_MS,
77
+ greetingTimeout: GREETING_TIMEOUT_MS,
78
+ socketTimeout: SOCKET_TIMEOUT_MS,
79
+ auth: isOAuthAccount(account)
80
+ ? {
81
+ type: "OAuth2",
82
+ user: account.username ?? account.email,
83
+ clientId: account.oauth2.client_id,
84
+ clientSecret: account.oauth2.client_secret,
85
+ refreshToken: account.oauth2.refresh_token,
86
+ }
87
+ : {
88
+ type: "login",
89
+ user: account.username ?? account.email,
90
+ pass: account.password,
91
+ },
92
+ });
93
+ export const toSmtpMessageId = (messageId) => `<${createHash("sha256").update(messageId, "utf8").digest("hex")}@email-client-mcp.invalid>`;
94
+ const readSmtpAddress = (value) => {
95
+ if (typeof value === "string")
96
+ return value;
97
+ const parsed = z.object({ address: z.string() }).safeParse(value);
98
+ return parsed.success ? parsed.data.address : undefined;
99
+ };
100
+ const normalizeSmtpAddresses = (values) => values.flatMap((value) => {
101
+ const address = readSmtpAddress(value);
102
+ return address === undefined ? [] : [address];
103
+ });
104
+ export const buildSmtpSender = (account) => {
105
+ if (account.smtp === undefined) {
106
+ throw new Error(`SMTP settings missing for account: ${account.name}`);
107
+ }
108
+ const transport = nodemailer.createTransport(buildSmtpConnectionOptions(account, account.smtp));
109
+ return {
110
+ send: async (message) => {
111
+ try {
112
+ const info = await transport.sendMail({
113
+ messageId: toSmtpMessageId(message.payload.messageId),
114
+ from: { name: message.fromName, address: message.fromAddress },
115
+ to: [...message.payload.to],
116
+ cc: [...message.payload.cc],
117
+ bcc: [...message.payload.bcc],
118
+ subject: message.payload.subject,
119
+ text: message.payload.bodyText,
120
+ html: message.payload.bodyHtml || undefined,
121
+ inReplyTo: message.payload.inReplyTo ?? undefined,
122
+ disableFileAccess: true,
123
+ disableUrlAccess: true,
124
+ });
125
+ return {
126
+ kind: "Accepted",
127
+ receipt: {
128
+ messageId: info.messageId,
129
+ accepted: normalizeSmtpAddresses(info.accepted),
130
+ rejected: normalizeSmtpAddresses(info.rejected),
131
+ response: info.response,
132
+ },
133
+ };
134
+ }
135
+ catch (cause) {
136
+ return classifySmtpFailure(cause);
137
+ }
138
+ },
139
+ close: () => transport.close(),
140
+ };
141
+ };
142
+ //# sourceMappingURL=smtpTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smtpTransport.js","sourceRoot":"","sources":["../../../src/delivery/infrastructure/smtpTransport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare const PLATFORM_EVENT_NOTIFICATION_METHOD: "notifications/platform/event";
3
+ export declare const EXCHANGE_INBOX_CREATED_EVENT: "exchange.inbox.created";
4
+ export type ExchangeInboxCreatedLocator = {
5
+ readonly accountId: string;
6
+ readonly mailboxId: string;
7
+ readonly folderId: string;
8
+ readonly externalId: string;
9
+ };
10
+ export type PlatformEventNotification = {
11
+ readonly method: typeof PLATFORM_EVENT_NOTIFICATION_METHOD;
12
+ readonly params: {
13
+ readonly id: string;
14
+ readonly type: typeof EXCHANGE_INBOX_CREATED_EVENT;
15
+ readonly data: ExchangeInboxCreatedLocator;
16
+ };
17
+ };
18
+ export type PlatformEventNotifier = {
19
+ readonly notifyExchangeInboxCreated: (event: ExchangeInboxCreatedLocator) => Promise<void>;
20
+ };
21
+ export declare const computeExchangeInboxCreatedEventId: (workspaceId: string, event: ExchangeInboxCreatedLocator) => string;
22
+ export declare const buildPlatformEventNotifier: (server: McpServer, workspaceId: string) => PlatformEventNotifier;
@@ -0,0 +1,29 @@
1
+ import { createHash } from "node:crypto";
2
+ export const PLATFORM_EVENT_NOTIFICATION_METHOD = "notifications/platform/event";
3
+ export const EXCHANGE_INBOX_CREATED_EVENT = "exchange.inbox.created";
4
+ export const computeExchangeInboxCreatedEventId = (workspaceId, event) => createHash("sha256")
5
+ .update([
6
+ EXCHANGE_INBOX_CREATED_EVENT,
7
+ workspaceId,
8
+ event.accountId,
9
+ event.mailboxId,
10
+ event.folderId,
11
+ event.externalId,
12
+ ].join("|"))
13
+ .digest("hex");
14
+ /** Isolate the MCP SDK's non-generic high-level server at the custom notification boundary. */
15
+ const platformEventProtocol = (server) => server.server;
16
+ export const buildPlatformEventNotifier = (server, workspaceId) => {
17
+ const protocol = platformEventProtocol(server);
18
+ return {
19
+ notifyExchangeInboxCreated: async (event) => protocol.notification({
20
+ method: PLATFORM_EVENT_NOTIFICATION_METHOD,
21
+ params: {
22
+ id: computeExchangeInboxCreatedEventId(workspaceId, event),
23
+ type: EXCHANGE_INBOX_CREATED_EVENT,
24
+ data: event,
25
+ },
26
+ }),
27
+ };
28
+ };
29
+ //# sourceMappingURL=platformEventNotifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platformEventNotifier.js","sourceRoot":"","sources":["../../src/events/platformEventNotifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,CAAC,MAAM,kCAAkC,GAAG,8BAAuC,CAAC;AAC1F,MAAM,CAAC,MAAM,4BAA4B,GAAG,wBAAiC,CAAC;AA0B9E,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAChD,WAAmB,EACnB,KAAkC,EAC1B,EAAE,CACV,UAAU,CAAC,QAAQ,CAAC;KACjB,MAAM,CACL;IACE,4BAA4B;IAC5B,WAAW;IACX,KAAK,CAAC,SAAS;IACf,KAAK,CAAC,SAAS;IACf,KAAK,CAAC,QAAQ;IACd,KAAK,CAAC,UAAU;CACjB,CAAC,IAAI,CAAC,GAAG,CAAC,CACZ;KACA,MAAM,CAAC,KAAK,CAAC,CAAC;AAEnB,+FAA+F;AAC/F,MAAM,qBAAqB,GAAG,CAAC,MAAiB,EAAyB,EAAE,CACzE,MAAM,CAAC,MAA0C,CAAC;AAEpD,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,MAAiB,EACjB,WAAmB,EACI,EAAE;IACzB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC/C,OAAO;QACL,0BAA0B,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAC1C,QAAQ,CAAC,YAAY,CAAC;YACpB,MAAM,EAAE,kCAAkC;YAC1C,MAAM,EAAE;gBACN,EAAE,EAAE,kCAAkC,CAAC,WAAW,EAAE,KAAK,CAAC;gBAC1D,IAAI,EAAE,4BAA4B;gBAClC,IAAI,EAAE,KAAK;aACZ;SACF,CAAC;KACL,CAAC;AACJ,CAAC,CAAC"}
@@ -10,7 +10,7 @@
10
10
  * APIS_BASE_URL := env APIS_BASE_URL
11
11
  * | TOML [sdk].base_url
12
12
  *
13
- * SDK constraint (5.1.x): `APIS_API_KEY` and `APIS_BASE_URL` are read
13
+ * SDK constraint: `APIS_API_KEY` and `APIS_BASE_URL` are read
14
14
  * from `process.env` only -- there is no constructor param. We mirror
15
15
  * TOML values into env via `ensureEnv` (only when env is empty) so cluster
16
16
  * env always wins over per-server TOML.
@@ -10,7 +10,7 @@
10
10
  * APIS_BASE_URL := env APIS_BASE_URL
11
11
  * | TOML [sdk].base_url
12
12
  *
13
- * SDK constraint (5.1.x): `APIS_API_KEY` and `APIS_BASE_URL` are read
13
+ * SDK constraint: `APIS_API_KEY` and `APIS_BASE_URL` are read
14
14
  * from `process.env` only -- there is no constructor param. We mirror
15
15
  * TOML values into env via `ensureEnv` (only when env is empty) so cluster
16
16
  * env always wins over per-server TOML.
package/dist/server.js CHANGED
@@ -14,11 +14,18 @@
14
14
  *
15
15
  * Logs go to stderr only (stdout is reserved for MCP JSON-RPC).
16
16
  */
17
+ import { randomUUID } from "node:crypto";
17
18
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
18
19
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
19
20
  import { loadConfig } from "./config/loader.js";
21
+ import { buildDeliveryProcessor } from "./delivery/infrastructure/deliveryProcessor.js";
22
+ import { buildDeliveryRuntime, } from "./delivery/infrastructure/deliveryRuntime.js";
23
+ import { buildOutboxRepository } from "./delivery/infrastructure/outboxSdkAdapter.js";
24
+ import { buildPerAccountRateLimiter } from "./delivery/infrastructure/perAccountRateLimiter.js";
25
+ import { buildSmtpSender } from "./delivery/infrastructure/smtpTransport.js";
20
26
  import { errorMessage } from "./domain/errors.js";
21
27
  import { Err, Ok } from "./domain/result.js";
28
+ import { buildPlatformEventNotifier } from "./events/platformEventNotifier.js";
22
29
  import { downloadPartByUid, fetchDisplayBodyByUid, fetchEnvelopesUidRange, fetchMetadataUidRange, folderStatus, withMailboxLock, } from "./imap/fetch.js";
23
30
  import { buildImapPool } from "./imap/pool.js";
24
31
  import { buildDiskd } from "./sdk/diskdClient.js";
@@ -59,38 +66,17 @@ const main = async () => {
59
66
  }
60
67
  log("sdk ready", { workspaceId: diskd.value.workspaceId });
61
68
  const driveStore = buildDriveStore(diskd.value.messagesStore);
69
+ const server = new McpServer({
70
+ name: "email-client-mcp",
71
+ version: PACKAGE_VERSION,
72
+ });
73
+ const platformEvents = buildPlatformEventNotifier(server, diskd.value.workspaceId);
62
74
  const pool = buildImapPool(cfg.value.accounts, {
63
75
  onEvent: (event) => log("imap.pool-event", event),
64
76
  });
65
- const signalEndpoint = process.env.EMAIL_CLIENT_MCP_SIGNAL_ENDPOINT;
66
- const signalApiKey = process.env.EMAIL_CLIENT_MCP_SIGNAL_API_KEY;
67
- if (signalEndpoint) {
68
- log("signal notifier configured", {
69
- endpoint: signalEndpoint,
70
- hasApiKey: Boolean(signalApiKey),
71
- });
72
- }
73
- else {
74
- log("signal notifier disabled", { reason: "EMAIL_CLIENT_MCP_SIGNAL_ENDPOINT is not set" });
75
- }
76
- const notifier = signalEndpoint
77
- ? {
78
- notifyEmailPersisted: async (event) => {
79
- const response = await fetch(signalEndpoint, {
80
- method: "POST",
81
- headers: {
82
- "Content-Type": "application/json",
83
- ...(signalApiKey ? { "X-Api-Key": signalApiKey } : {}),
84
- },
85
- body: JSON.stringify({ workspaceId: diskd.value.workspaceId, ...event }),
86
- });
87
- const responseText = await response.text();
88
- if (!response.ok) {
89
- throw new Error(`signal notify failed (${response.status}): ${responseText.slice(0, 500)}`);
90
- }
91
- },
92
- }
93
- : undefined;
77
+ const notifier = {
78
+ notifyEmailPersisted: platformEvents.notifyExchangeInboxCreated,
79
+ };
94
80
  const syncDeps = {
95
81
  drive: driveStore,
96
82
  imap: {
@@ -103,6 +89,7 @@ const main = async () => {
103
89
  return Ok(list.map((f) => ({
104
90
  path: f.path,
105
91
  specialUse: (f.specialUse ?? null),
92
+ delimiter: f.delimiter,
106
93
  })));
107
94
  }
108
95
  catch (cause) {
@@ -197,10 +184,33 @@ const main = async () => {
197
184
  imap: { downloadPart: syncDeps.imap.downloadPart },
198
185
  };
199
186
  const watcher = buildWatcher(syncDeps, cfg.value.accounts, cfg.value.watcher, log);
200
- const server = new McpServer({
201
- name: "email-client-mcp",
202
- version: PACKAGE_VERSION,
203
- });
187
+ const smtpSenders = [];
188
+ let deliveryRuntime;
189
+ let requestShutdown = (signal, exitCode) => {
190
+ log("shutdown requested before runtime initialization", { signal, exitCode });
191
+ process.exitCode = exitCode;
192
+ };
193
+ if (cfg.value.deliver.enabled) {
194
+ const deliveryAccounts = cfg.value.accounts.map((account) => {
195
+ const sender = buildSmtpSender(account);
196
+ smtpSenders.push(sender);
197
+ return { config: account, sender };
198
+ });
199
+ const repository = buildOutboxRepository(diskd.value.messagesStore);
200
+ const processor = buildDeliveryProcessor({
201
+ repository,
202
+ accounts: deliveryAccounts,
203
+ rateLimiter: buildPerAccountRateLimiter(cfg.value.deliver.rate_limit_per_account_per_minute),
204
+ leaseOwner: `email-client-mcp-${randomUUID()}`,
205
+ now: () => new Date(),
206
+ log,
207
+ });
208
+ deliveryRuntime = buildDeliveryRuntime({
209
+ repository,
210
+ processor,
211
+ log,
212
+ });
213
+ }
204
214
  registerTools(server, {
205
215
  accounts: cfg.value.accounts,
206
216
  imapPool: pool,
@@ -212,17 +222,17 @@ const main = async () => {
212
222
  const transport = new StdioServerTransport();
213
223
  await server.connect(transport);
214
224
  log("mcp ready", { accounts: cfg.value.accounts.length });
215
- // Start watcher after MCP transport is ready. The interval fires
216
- // immediately on the first tick (see watcher.start), then on every
217
- // clamped interval thereafter.
218
- if (cfg.value.watcher.enabled) {
219
- watcher.start();
220
- }
221
- else {
222
- log("watcher.disabled-by-config");
223
- }
224
- const shutdown = async (signal) => {
225
- log("shutdown", { signal });
225
+ let shutdownPromise;
226
+ const shutdown = async (signal, exitCode) => {
227
+ log("shutdown", { signal, exitCode });
228
+ if (deliveryRuntime !== undefined) {
229
+ try {
230
+ await deliveryRuntime.stop();
231
+ }
232
+ catch (e) {
233
+ log("delivery stop error", { error: String(e) });
234
+ }
235
+ }
226
236
  try {
227
237
  await watcher.stop();
228
238
  }
@@ -235,16 +245,47 @@ const main = async () => {
235
245
  catch (e) {
236
246
  log("pool close error", { error: String(e) });
237
247
  }
248
+ for (const sender of smtpSenders) {
249
+ try {
250
+ sender.close();
251
+ }
252
+ catch (e) {
253
+ log("smtp close error", { error: String(e) });
254
+ }
255
+ }
238
256
  try {
239
257
  await server.close();
240
258
  }
241
259
  catch (e) {
242
260
  log("server close error", { error: String(e) });
243
261
  }
244
- process.exit(0);
262
+ process.exit(exitCode);
245
263
  };
246
- process.on("SIGINT", () => void shutdown("SIGINT"));
247
- process.on("SIGTERM", () => void shutdown("SIGTERM"));
264
+ requestShutdown = (signal, exitCode) => {
265
+ if (shutdownPromise !== undefined)
266
+ return;
267
+ shutdownPromise = shutdown(signal, exitCode).catch((cause) => {
268
+ log("shutdown failed", { error: cause instanceof Error ? cause.message : String(cause) });
269
+ process.exit(1);
270
+ });
271
+ };
272
+ process.on("SIGINT", () => requestShutdown("SIGINT", 0));
273
+ process.on("SIGTERM", () => requestShutdown("SIGTERM", 0));
274
+ if (deliveryRuntime !== undefined) {
275
+ await deliveryRuntime.start();
276
+ }
277
+ else {
278
+ log("delivery.disabled-by-config");
279
+ }
280
+ // Start watcher after MCP transport is ready. The interval fires
281
+ // immediately on the first tick (see watcher.start), then on every
282
+ // clamped interval thereafter.
283
+ if (cfg.value.watcher.enabled) {
284
+ watcher.start();
285
+ }
286
+ else {
287
+ log("watcher.disabled-by-config");
288
+ }
248
289
  };
249
290
  main().catch((err) => {
250
291
  log("fatal", { error: err?.message ?? String(err) });
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@
10
10
  import type { diskd as DiskdNs } from "@diskd-ai/sdk";
11
11
  import { type DriveError } from "../domain/errors.js";
12
12
  import { type Result } from "../domain/result.js";
13
- import type { StoredAttachment, StoredEmailPayload, SyncState } from "./payloadTypes.js";
13
+ import type { StoredAttachment, StoredEmailPayload, SyncFolderMetadata } from "./payloadTypes.js";
14
14
  type MessagesStore = ReturnType<typeof DiskdNs.os.messagesStore>;
15
15
  export type UploadAttachmentInput = StoredAttachment & {
16
16
  readonly attachmentId: string;
@@ -28,7 +28,7 @@ export type DriveStore = {
28
28
  /** Ensure mailbox exists and SQLite schema is bootstrapped. */
29
29
  readonly ensureMailbox: (mailboxId: string, displayName: string, metadata: Readonly<Record<string, unknown>>) => Promise<Result<DriveError, void>>;
30
30
  readonly listMailboxes: () => Promise<Result<DriveError, readonly string[]>>;
31
- readonly upsertFolder: (mailboxId: string, folderId: string, displayName: string, metadata: SyncState) => Promise<Result<DriveError, void>>;
31
+ readonly upsertFolder: (mailboxId: string, folderId: string, displayName: string, metadata: SyncFolderMetadata) => Promise<Result<DriveError, void>>;
32
32
  readonly getFolder: (mailboxId: string, folderId: string) => Promise<Result<DriveError, {
33
33
  metadata: Readonly<Record<string, unknown>>;
34
34
  } | null>>;
@@ -76,3 +76,7 @@ export type SyncState = {
76
76
  readonly lastSyncFinishedAt: string | null;
77
77
  readonly lastSyncError: string | null;
78
78
  };
79
+ /** Folder metadata combines restart-safe sync state with the provider hierarchy delimiter. */
80
+ export type SyncFolderMetadata = SyncState & {
81
+ readonly delimiter: string;
82
+ };
@@ -23,11 +23,11 @@ import { type AppError, type ImapError } from "../domain/errors.js";
23
23
  import { type Result } from "../domain/result.js";
24
24
  import { type FetchedMessageLike } from "../imap/mapper.js";
25
25
  import type { UploadAttachmentResult } from "../store/attachments.js";
26
- import type { StoredAttachment, StoredEmailPayload, SyncState } from "../store/payloadTypes.js";
26
+ import type { StoredAttachment, StoredEmailPayload, SyncFolderMetadata } from "../store/payloadTypes.js";
27
27
  export type SyncDeps = {
28
28
  readonly drive: {
29
29
  readonly ensureMailbox: (mailboxId: string, displayName: string, metadata: Readonly<Record<string, unknown>>) => Promise<Result<AppError, void>>;
30
- readonly upsertFolder: (mailboxId: string, folderId: string, displayName: string, metadata: SyncState) => Promise<Result<AppError, void>>;
30
+ readonly upsertFolder: (mailboxId: string, folderId: string, displayName: string, metadata: SyncFolderMetadata) => Promise<Result<AppError, void>>;
31
31
  readonly getFolder: (mailboxId: string, folderId: string) => Promise<Result<AppError, {
32
32
  metadata: Readonly<Record<string, unknown>>;
33
33
  } | null>>;
@@ -58,6 +58,7 @@ export type SyncDeps = {
58
58
  readonly listFolders: (accountId: string) => Promise<Result<ImapError, readonly {
59
59
  path: string;
60
60
  specialUse: string | null;
61
+ delimiter: string;
61
62
  }[]>>;
62
63
  readonly folderStatus: (accountId: string, path: string) => Promise<Result<ImapError, {
63
64
  uidValidity: number;
package/dist/sync/sync.js CHANGED
@@ -125,7 +125,12 @@ const sortFoldersByPriority = (folders) => folders
125
125
  * Review drafts are removed only by explicit Exchange send/delete actions.
126
126
  */
127
127
  const shouldPruneDriveFolder = (driveFolderId, imapFolderPaths) => !imapFolderPaths.has(driveFolderId) && !PLATFORM_MANAGED_FOLDER_IDS.has(driveFolderId);
128
- const syncFolder = async (deps, account, mailboxId, folderPath, specialUse, watcher, options) => {
128
+ /** Attach the current provider delimiter to every persisted sync checkpoint. */
129
+ const makeSyncFolderMetadata = (state, delimiter) => ({
130
+ ...state,
131
+ delimiter,
132
+ });
133
+ const syncFolder = async (deps, account, mailboxId, folderPath, specialUse, delimiter, watcher, options) => {
129
134
  const folderId = folderPath;
130
135
  const startIso = deps.now().toISOString();
131
136
  const flagWindow = watcher.flag_reconcile_window;
@@ -185,7 +190,7 @@ const syncFolder = async (deps, account, mailboxId, folderPath, specialUse, watc
185
190
  let backfilledMessages = 0;
186
191
  // Initial folder upsert with fresh metadata. We rewrite metadata at
187
192
  // each successful batch so the on-disk checkpoint mirrors progress.
188
- const writeState = async (next) => deps.drive.upsertFolder(mailboxId, folderId, folderId, next);
193
+ const writeState = async (next) => deps.drive.upsertFolder(mailboxId, folderId, folderId, makeSyncFolderMetadata(next, delimiter));
189
194
  const recentFrom = Math.max(1, status.uidNext - recentFirst.initial_recent_window);
190
195
  const needsRecentBootstrap = recentFirst.enabled &&
191
196
  latestUid >= 1 &&
@@ -394,8 +399,8 @@ const syncFolder = async (deps, account, mailboxId, folderPath, specialUse, watc
394
399
  ...event,
395
400
  error: cause instanceof Error ? cause.message : String(cause),
396
401
  });
397
- // Best-effort post-checkpoint notification. app-service publishes
398
- // deterministic event ids, so duplicate/replayed notifications are safe.
402
+ // Best-effort post-checkpoint MCP notification. MCP Hub publishes
403
+ // the deterministic locator event to NATS; duplicate notifications are safe.
399
404
  }
400
405
  }
401
406
  }
@@ -587,7 +592,7 @@ export const runSyncOnce = async (deps, account, watcher) => {
587
592
  const reports = [];
588
593
  for (let i = 0; i < filteredFolders.length; i += 1) {
589
594
  const f = filteredFolders[i];
590
- const r = await syncFolder(deps, account, mailboxId, f.path, f.specialUse, watcher, {
595
+ const r = await syncFolder(deps, account, mailboxId, f.path, f.specialUse, f.delimiter, watcher, {
591
596
  runMaintenance: i === maintenanceIndex,
592
597
  });
593
598
  reports.push(r);