@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.
- package/dist/config/schema.d.ts +525 -5
- package/dist/config/schema.js +67 -4
- package/dist/config/schema.js.map +1 -1
- package/dist/delivery/application/decideTransportOutcome.d.ts +15 -0
- package/dist/delivery/application/decideTransportOutcome.js +14 -0
- package/dist/delivery/application/decideTransportOutcome.js.map +1 -0
- package/dist/delivery/application/outboxRepository.d.ts +83 -0
- package/dist/delivery/application/outboxRepository.js +2 -0
- package/dist/delivery/application/outboxRepository.js.map +1 -0
- package/dist/delivery/domain/deliveryProgress.d.ts +17 -0
- package/dist/delivery/domain/deliveryProgress.js +34 -0
- package/dist/delivery/domain/deliveryProgress.js.map +1 -0
- package/dist/delivery/domain/deliveryState.d.ts +21 -0
- package/dist/delivery/domain/deliveryState.js +7 -0
- package/dist/delivery/domain/deliveryState.js.map +1 -0
- package/dist/delivery/domain/identity.d.ts +28 -0
- package/dist/delivery/domain/identity.js +28 -0
- package/dist/delivery/domain/identity.js.map +1 -0
- package/dist/delivery/domain/json.d.ts +5 -0
- package/dist/delivery/domain/json.js +2 -0
- package/dist/delivery/domain/json.js.map +1 -0
- package/dist/delivery/domain/transportOutcome.d.ts +31 -0
- package/dist/delivery/domain/transportOutcome.js +2 -0
- package/dist/delivery/domain/transportOutcome.js.map +1 -0
- package/dist/delivery/infrastructure/deliveryProcessor.d.ts +42 -0
- package/dist/delivery/infrastructure/deliveryProcessor.js +179 -0
- package/dist/delivery/infrastructure/deliveryProcessor.js.map +1 -0
- package/dist/delivery/infrastructure/deliveryRuntime.d.ts +13 -0
- package/dist/delivery/infrastructure/deliveryRuntime.js +80 -0
- package/dist/delivery/infrastructure/deliveryRuntime.js.map +1 -0
- package/dist/delivery/infrastructure/emailOutboxPayload.d.ts +7 -0
- package/dist/delivery/infrastructure/emailOutboxPayload.js +42 -0
- package/dist/delivery/infrastructure/emailOutboxPayload.js.map +1 -0
- package/dist/delivery/infrastructure/outboxSdkAdapter.d.ts +7 -0
- package/dist/delivery/infrastructure/outboxSdkAdapter.js +164 -0
- package/dist/delivery/infrastructure/outboxSdkAdapter.js.map +1 -0
- package/dist/delivery/infrastructure/perAccountRateLimiter.d.ts +9 -0
- package/dist/delivery/infrastructure/perAccountRateLimiter.js +27 -0
- package/dist/delivery/infrastructure/perAccountRateLimiter.js.map +1 -0
- package/dist/delivery/infrastructure/smtpTransport.d.ts +43 -0
- package/dist/delivery/infrastructure/smtpTransport.js +142 -0
- package/dist/delivery/infrastructure/smtpTransport.js.map +1 -0
- package/dist/events/platformEventNotifier.d.ts +22 -0
- package/dist/events/platformEventNotifier.js +29 -0
- package/dist/events/platformEventNotifier.js.map +1 -0
- package/dist/sdk/diskdClient.d.ts +1 -1
- package/dist/sdk/diskdClient.js +1 -1
- package/dist/server.js +88 -47
- package/dist/server.js.map +1 -1
- package/dist/store/driveStore.d.ts +2 -2
- package/dist/store/payloadTypes.d.ts +4 -0
- package/dist/sync/sync.d.ts +3 -2
- package/dist/sync/sync.js +10 -5
- package/dist/sync/sync.js.map +1 -1
- package/dist/tools/findMailboxFolder.d.ts +2 -2
- package/dist/tools/getEmail.d.ts +4 -4
- package/dist/tools/getEmails.d.ts +4 -4
- package/dist/tools/listEmails.d.ts +9 -9
- package/dist/tools/setEmailAttributes.d.ts +2 -2
- package/dist/tools/systemHydrateEmailAttachment.d.ts +4 -4
- package/dist/tools/systemHydrateEmailBodies.d.ts +8 -8
- 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
|
|
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/sdk/diskdClient.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* APIS_BASE_URL := env APIS_BASE_URL
|
|
11
11
|
* | TOML [sdk].base_url
|
|
12
12
|
*
|
|
13
|
-
* SDK constraint
|
|
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
|
|
66
|
-
|
|
67
|
-
|
|
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
|
|
201
|
-
|
|
202
|
-
|
|
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
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
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(
|
|
262
|
+
process.exit(exitCode);
|
|
245
263
|
};
|
|
246
|
-
|
|
247
|
-
|
|
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) });
|
package/dist/server.js.map
CHANGED
|
@@ -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":";AACA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AACxF,OAAO,EACL,oBAAoB,GAErB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AACtF,OAAO,EAAE,0BAA0B,EAAE,MAAM,oDAAoD,CAAC;AAChG,OAAO,EAAE,eAAe,EAAmB,MAAM,4CAA4C,CAAC;AAE9F,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,YAAY,EACZ,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAEL,uCAAuC,GACxC,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,KAAyC,EAAQ,EAAE;IAC3E,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;IAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,OAAO,IAAI,CAAC,CAAC;AAC1D,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,IAAuB,EAAuB,EAAE;IACvE,sEAAsE;IACtE,6BAA6B;IAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACzD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;IACrC,MAAM,GAAG,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,GAAG,CAAC,iCAAiC,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,GAAG,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;IAE9C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IACvD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,GAAG,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;QACtB,GAAG,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC1E,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;QACxB,GAAG,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,GAAG,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAE9D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,eAAe;KACzB,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,0BAA0B,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAEnF,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE;QAC7C,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC;KAClD,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAyB;QACrC,oBAAoB,EAAE,cAAc,CAAC,0BAA0B;KAChE,CAAC;IAEF,MAAM,QAAQ,GAAa;QACzB,KAAK,EAAE,UAA0C;QACjD,IAAI,EAAE;YACJ,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;gBAC/B,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBAC3C,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK;oBAAE,OAAO,CAAC,CAAC;gBAC9B,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;oBAClC,OAAO,EAAE,CACP,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACf,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,IAAI,CAAkB;wBACnD,SAAS,EAAE,CAAC,CAAC,SAAS;qBACvB,CAAC,CAAC,CACJ,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,GAAG,CAAC;wBACT,IAAI,EAAE,WAAW;wBACjB,SAAS;wBACT,OAAO,EAAE,gBAAiB,KAAe,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;qBACzD,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YACD,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE;gBACtC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBAC3C,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK;oBAAE,OAAO,CAAC,CAAC;gBAC9B,IAAI,CAAC;oBACH,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;oBAC5C,OAAO,EAAE,CAAC,CAAC,CAGV,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,GAAG,CAAC;wBACT,IAAI,EAAE,WAAW;wBACjB,SAAS;wBACT,OAAO,EAAE,UAAU,IAAI,KAAM,KAAe,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;qBAC5D,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YACD,kBAAkB,EAAE,KAAK,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK;gBAClE,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBAC3C,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC5D,0DAA0D;gBAC1D,oDAAoD;gBACpD,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;oBAC1D,MAAM,GAAG,GAAc,EAAE,CAAC;oBAC1B,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,qBAAqB,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC;wBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClF,OAAO,GAAG,CAAC;gBACb,CAAC,CAAC,CAAC;gBACH,KAAK,MAAM,CAAC,IAAI,GAAG;oBAAE,MAAM,CAAU,CAAC;YACxC,CAAC;YACD,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;gBACxC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBAC3C,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK;oBAAE,OAAO,CAAC,CAAC;gBAC9B,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAC3D,qBAAqB,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CACpC,CAAC;oBACF,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;gBAClB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,GAAG,CAAC;wBACT,IAAI,EAAE,WAAW;wBACjB,SAAS;wBACT,OAAO,EAAE,cAAc,IAAI,IAAI,GAAG,KAAM,KAAe,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;wBACnF,KAAK;qBACO,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YACD,mBAAmB,EAAE,KAAK,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK;gBACnE,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBAC3C,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC5D,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;oBAC1D,MAAM,GAAG,GAAc,EAAE,CAAC;oBAC1B,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,sBAAsB,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC;wBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACnF,OAAO,GAAG,CAAC;gBACb,CAAC,CAAC,CAAC;gBACH,KAAK,MAAM,CAAC,IAAI,GAAG;oBAAE,MAAM,CAAU,CAAC;YACxC,CAAC;YACD,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;gBACnD,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBAC3C,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC5D,OAAO,MAAM,iBAAiB,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE;oBACzD,SAAS,EAAE,uCAAuC;iBACnD,CAAC,CAAC;YACL,CAAC;SACF;QACD,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE;QACrB,GAAG;QACH,QAAQ;KACT,CAAC;IAEF,MAAM,iBAAiB,GAAsB;QAC3C,KAAK,EAAE,UAAmD;QAC1D,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE;QAC5C,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE;KACtB,CAAC;IACF,MAAM,uBAAuB,GAA4B;QACvD,KAAK,EAAE,UAAyD;QAChE,IAAI,EAAE,EAAE,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE;KACnD,CAAC;IAEF,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACnF,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,IAAI,eAA4C,CAAC;IACjD,IAAI,eAAe,GAA+C,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;QACrF,GAAG,CAAC,kDAAkD,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9E,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC9B,CAAC,CAAC;IACF,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC9B,MAAM,gBAAgB,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YAC1D,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YACxC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,sBAAsB,CAAC;YACvC,UAAU;YACV,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,0BAA0B,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,iCAAiC,CAAC;YAC5F,UAAU,EAAE,oBAAoB,UAAU,EAAE,EAAE;YAC9C,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE;YACrB,GAAG;SACJ,CAAC,CAAC;QACH,eAAe,GAAG,oBAAoB,CAAC;YACrC,UAAU;YACV,SAAS;YACT,GAAG;SACJ,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,MAAM,EAAE;QACpB,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ;QAC5B,QAAQ,EAAE,IAAI;QACd,OAAO;QACP,aAAa,EAAE,iBAAiB;QAChC,mBAAmB,EAAE,uBAAuB;QAC5C,aAAa,EAAE,UAAU;KAC1B,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,GAAG,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAE1D,IAAI,eAA0C,CAAC;IAC/C,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,QAAgB,EAAiB,EAAE;QACzE,GAAG,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtC,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,eAAe,CAAC,IAAI,EAAE,CAAC;YAC/B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,GAAG,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,GAAG,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,GAAG,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,GAAG,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,GAAG,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC,CAAC;IACF,eAAe,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;QACrC,IAAI,eAAe,KAAK,SAAS;YAAE,OAAO;QAC1C,eAAe,GAAG,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YAC3D,GAAG,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;IAE3D,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,6BAA6B,CAAC,CAAC;IACrC,CAAC;IAED,iEAAiE;IACjE,mEAAmE;IACnE,+BAA+B;IAC/B,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,4BAA4B,CAAC,CAAC;IACpC,CAAC;AACH,CAAC,CAAC;AAEF,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAG,GAAa,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -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,
|
|
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:
|
|
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
|
+
};
|
package/dist/sync/sync.d.ts
CHANGED
|
@@ -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,
|
|
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:
|
|
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
|
-
|
|
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.
|
|
398
|
-
// deterministic event
|
|
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);
|