proton-mail-bridge-client 1.11.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.
- package/LICENSE +21 -0
- package/README.md +445 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1627 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3173 -0
- package/dist/index.js.map +1 -0
- package/dist/scripts/bridge-smoke.d.ts +2 -0
- package/dist/scripts/bridge-smoke.d.ts.map +1 -0
- package/dist/scripts/bridge-smoke.js +415 -0
- package/dist/scripts/bridge-smoke.js.map +1 -0
- package/dist/scripts/check-claude-desktop.d.ts +17 -0
- package/dist/scripts/check-claude-desktop.d.ts.map +1 -0
- package/dist/scripts/check-claude-desktop.js +138 -0
- package/dist/scripts/check-claude-desktop.js.map +1 -0
- package/dist/scripts/install-claude-desktop.d.ts +39 -0
- package/dist/scripts/install-claude-desktop.d.ts.map +1 -0
- package/dist/scripts/install-claude-desktop.js +257 -0
- package/dist/scripts/install-claude-desktop.js.map +1 -0
- package/dist/scripts/setup-claude-desktop.d.ts +15 -0
- package/dist/scripts/setup-claude-desktop.d.ts.map +1 -0
- package/dist/scripts/setup-claude-desktop.js +187 -0
- package/dist/scripts/setup-claude-desktop.js.map +1 -0
- package/dist/services/analytics-service.d.ts +45 -0
- package/dist/services/analytics-service.d.ts.map +1 -0
- package/dist/services/analytics-service.js +189 -0
- package/dist/services/analytics-service.js.map +1 -0
- package/dist/services/audit-service.d.ts +13 -0
- package/dist/services/audit-service.d.ts.map +1 -0
- package/dist/services/audit-service.js +67 -0
- package/dist/services/audit-service.js.map +1 -0
- package/dist/services/background-sync-service.d.ts +28 -0
- package/dist/services/background-sync-service.d.ts.map +1 -0
- package/dist/services/background-sync-service.js +216 -0
- package/dist/services/background-sync-service.js.map +1 -0
- package/dist/services/draft-store-service.d.ts +59 -0
- package/dist/services/draft-store-service.d.ts.map +1 -0
- package/dist/services/draft-store-service.js +251 -0
- package/dist/services/draft-store-service.js.map +1 -0
- package/dist/services/local-index-service.d.ts +90 -0
- package/dist/services/local-index-service.d.ts.map +1 -0
- package/dist/services/local-index-service.js +1462 -0
- package/dist/services/local-index-service.js.map +1 -0
- package/dist/services/simple-imap-service.d.ts +209 -0
- package/dist/services/simple-imap-service.d.ts.map +1 -0
- package/dist/services/simple-imap-service.js +1100 -0
- package/dist/services/simple-imap-service.js.map +1 -0
- package/dist/services/smtp-service.d.ts +15 -0
- package/dist/services/smtp-service.d.ts.map +1 -0
- package/dist/services/smtp-service.js +100 -0
- package/dist/services/smtp-service.js.map +1 -0
- package/dist/types/index.d.ts +355 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/helpers.d.ts +45 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +393 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/logger.d.ts +22 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +91 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/runtime-policy.d.ts +12 -0
- package/dist/utils/runtime-policy.d.ts.map +1 -0
- package/dist/utils/runtime-policy.js +62 -0
- package/dist/utils/runtime-policy.js.map +1 -0
- package/glama.json +6 -0
- package/package.json +91 -0
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
import { rm } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { buildConfigFromEnv, createServer } from "../index.js";
|
|
4
|
+
function uniqueAddresses(addresses) {
|
|
5
|
+
const seen = new Set();
|
|
6
|
+
const result = [];
|
|
7
|
+
for (const address of addresses) {
|
|
8
|
+
const normalized = address.trim().toLowerCase();
|
|
9
|
+
if (!normalized || seen.has(normalized)) {
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
seen.add(normalized);
|
|
13
|
+
result.push(address.trim());
|
|
14
|
+
}
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
function addressValues(addresses) {
|
|
18
|
+
return uniqueAddresses(addresses
|
|
19
|
+
.map((value) => value.address?.trim())
|
|
20
|
+
.filter((value) => Boolean(value)));
|
|
21
|
+
}
|
|
22
|
+
function formatAddressList(addresses) {
|
|
23
|
+
return addresses
|
|
24
|
+
.map((value) => {
|
|
25
|
+
if (value.name && value.address) {
|
|
26
|
+
return `${value.name} <${value.address}>`;
|
|
27
|
+
}
|
|
28
|
+
return value.address || value.name || "";
|
|
29
|
+
})
|
|
30
|
+
.filter(Boolean)
|
|
31
|
+
.join(", ");
|
|
32
|
+
}
|
|
33
|
+
function quotePlainText(value) {
|
|
34
|
+
return value
|
|
35
|
+
.split(/\r?\n/)
|
|
36
|
+
.map((line) => `> ${line}`)
|
|
37
|
+
.join("\n");
|
|
38
|
+
}
|
|
39
|
+
function prefixedSubject(subject, prefix) {
|
|
40
|
+
const trimmed = subject.trim();
|
|
41
|
+
if (trimmed.toLowerCase().startsWith(prefix.toLowerCase())) {
|
|
42
|
+
return trimmed;
|
|
43
|
+
}
|
|
44
|
+
return `${prefix} ${trimmed}`;
|
|
45
|
+
}
|
|
46
|
+
function buildReplyText(detail, body) {
|
|
47
|
+
const originalText = detail.text || detail.preview || "";
|
|
48
|
+
const fromText = formatAddressList(detail.from);
|
|
49
|
+
const dateText = detail.date || detail.internalDate || "an unknown date";
|
|
50
|
+
return [
|
|
51
|
+
body.trim(),
|
|
52
|
+
"",
|
|
53
|
+
`On ${dateText}, ${fromText || "the sender"} wrote:`,
|
|
54
|
+
quotePlainText(originalText),
|
|
55
|
+
].join("\n");
|
|
56
|
+
}
|
|
57
|
+
function buildForwardText(detail, body) {
|
|
58
|
+
const originalText = detail.text || detail.preview || "";
|
|
59
|
+
return [
|
|
60
|
+
body.trim(),
|
|
61
|
+
"",
|
|
62
|
+
"---------- Forwarded message ---------",
|
|
63
|
+
`From: ${formatAddressList(detail.from)}`,
|
|
64
|
+
`Date: ${detail.date || detail.internalDate || ""}`,
|
|
65
|
+
`Subject: ${detail.subject}`,
|
|
66
|
+
`To: ${formatAddressList(detail.to)}`,
|
|
67
|
+
detail.cc.length > 0 ? `Cc: ${formatAddressList(detail.cc)}` : "",
|
|
68
|
+
"",
|
|
69
|
+
originalText,
|
|
70
|
+
]
|
|
71
|
+
.filter((line, index, array) => line !== "" || (index > 0 && array[index - 1] !== ""))
|
|
72
|
+
.join("\n");
|
|
73
|
+
}
|
|
74
|
+
function getReplyRecipients(detail, ownerEmail, replyAll) {
|
|
75
|
+
const owner = ownerEmail.trim().toLowerCase();
|
|
76
|
+
const primary = addressValues(detail.replyTo).length > 0 ? detail.replyTo : detail.from;
|
|
77
|
+
const to = uniqueAddresses(addressValues(primary).filter((address) => address.trim().toLowerCase() !== owner));
|
|
78
|
+
if (!replyAll) {
|
|
79
|
+
return { to, cc: [] };
|
|
80
|
+
}
|
|
81
|
+
const ccPool = uniqueAddresses([...addressValues(detail.to), ...addressValues(detail.cc)]).filter((address) => {
|
|
82
|
+
const normalized = address.trim().toLowerCase();
|
|
83
|
+
return normalized !== owner && !to.some((recipient) => recipient.trim().toLowerCase() === normalized);
|
|
84
|
+
});
|
|
85
|
+
return { to, cc: ccPool };
|
|
86
|
+
}
|
|
87
|
+
function pickReplyTargetFromThread(thread, ownerEmail, preferLatestInbound) {
|
|
88
|
+
const messages = [...thread.messages];
|
|
89
|
+
const owner = ownerEmail.trim().toLowerCase();
|
|
90
|
+
if (preferLatestInbound) {
|
|
91
|
+
const inbound = [...messages]
|
|
92
|
+
.reverse()
|
|
93
|
+
.find((message) => !message.from.some((address) => address.address?.trim().toLowerCase() === owner));
|
|
94
|
+
if (inbound) {
|
|
95
|
+
return inbound;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return messages[messages.length - 1];
|
|
99
|
+
}
|
|
100
|
+
async function main() {
|
|
101
|
+
const config = buildConfigFromEnv();
|
|
102
|
+
const { smtpService, imapService, draftStore, localIndexService } = createServer(config, {
|
|
103
|
+
startBackgroundSync: false,
|
|
104
|
+
});
|
|
105
|
+
const selfTo = process.env.PROTONMAIL_SMOKE_SELF_TO || config.smtp.username;
|
|
106
|
+
const forwardTo = process.env.PROTONMAIL_SMOKE_FORWARD_TO || selfTo;
|
|
107
|
+
const allowMutations = process.env.PROTONMAIL_SMOKE_ALLOW_MUTATIONS === "true";
|
|
108
|
+
const mutationEmailId = process.env.PROTONMAIL_SMOKE_MUTATION_EMAIL_ID;
|
|
109
|
+
const unique = new Date().toISOString().replace(/[:.]/g, "-");
|
|
110
|
+
try {
|
|
111
|
+
await Promise.all([smtpService.verifyConnection(), imapService.ping()]);
|
|
112
|
+
const recentInbox = await imapService.getEmails({ folder: "INBOX", limit: 20, offset: 0 });
|
|
113
|
+
const replyTargetSummary = recentInbox.emails.find((email) => !addressValues(email.from).some((address) => address.trim().toLowerCase() === config.smtp.username.trim().toLowerCase()));
|
|
114
|
+
if (!replyTargetSummary) {
|
|
115
|
+
throw new Error("Unable to find a recent inbound email for reply draft coverage");
|
|
116
|
+
}
|
|
117
|
+
const snapshot = await imapService.collectEmailsForIndex({
|
|
118
|
+
folder: "INBOX",
|
|
119
|
+
limitPerFolder: 100,
|
|
120
|
+
includeAttachmentText: true,
|
|
121
|
+
});
|
|
122
|
+
const indexStatus = await localIndexService.recordSnapshot({
|
|
123
|
+
folders: snapshot.folders,
|
|
124
|
+
emails: snapshot.emails,
|
|
125
|
+
syncedAt: snapshot.syncedAt,
|
|
126
|
+
folderStats: snapshot.folderStats,
|
|
127
|
+
});
|
|
128
|
+
const incrementalSnapshot = await imapService.collectEmailsForIndex({
|
|
129
|
+
folder: "INBOX",
|
|
130
|
+
limitPerFolder: 100,
|
|
131
|
+
includeAttachmentText: true,
|
|
132
|
+
checkpoints: await localIndexService.getSyncCheckpointMap(),
|
|
133
|
+
});
|
|
134
|
+
const incrementalIndexStatus = await localIndexService.recordSnapshot({
|
|
135
|
+
folders: incrementalSnapshot.folders,
|
|
136
|
+
emails: incrementalSnapshot.emails,
|
|
137
|
+
syncedAt: incrementalSnapshot.syncedAt,
|
|
138
|
+
folderStats: incrementalSnapshot.folderStats,
|
|
139
|
+
});
|
|
140
|
+
const incrementalStrategies = incrementalSnapshot.folderStats.map((folder) => folder.strategy);
|
|
141
|
+
if (incrementalStrategies.some((strategy) => strategy !== "incremental" && strategy !== "incremental_window")) {
|
|
142
|
+
throw new Error(`Expected incremental second-pass sync strategies, received: ${incrementalStrategies.join(", ")}`);
|
|
143
|
+
}
|
|
144
|
+
const indexIntegrity = await localIndexService.runIntegrityCheck();
|
|
145
|
+
if (!indexIntegrity.ok) {
|
|
146
|
+
throw new Error(`SQLite integrity check failed: ${indexIntegrity.integrity}`);
|
|
147
|
+
}
|
|
148
|
+
const inboxDigest = await localIndexService.getInboxDigest({
|
|
149
|
+
limit: 5,
|
|
150
|
+
minAgeHours: 24,
|
|
151
|
+
});
|
|
152
|
+
const followUpCandidates = await localIndexService.getFollowUpCandidates({
|
|
153
|
+
limit: 5,
|
|
154
|
+
minAgeHours: 24,
|
|
155
|
+
pendingOn: "any",
|
|
156
|
+
});
|
|
157
|
+
const idleProbe = await imapService.waitForMailboxChanges({
|
|
158
|
+
folder: "INBOX",
|
|
159
|
+
timeoutMs: 3_000,
|
|
160
|
+
});
|
|
161
|
+
const attachmentTextHits = incrementalSnapshot.emails.filter((email) => Boolean(email.attachmentText?.trim())).length;
|
|
162
|
+
const actionableThreads = await localIndexService.getActionableThreads({
|
|
163
|
+
limit: 100,
|
|
164
|
+
unreadOnly: false,
|
|
165
|
+
});
|
|
166
|
+
const replyActionableThread = actionableThreads.threads.find((thread) => thread.messageIds.includes(replyTargetSummary.id));
|
|
167
|
+
const indexedThreads = await localIndexService.getThreads({ limit: 250 });
|
|
168
|
+
const replyThreadSummary = replyActionableThread ??
|
|
169
|
+
indexedThreads.threads.find((thread) => thread.messageIds.includes(replyTargetSummary.id));
|
|
170
|
+
if (!replyThreadSummary) {
|
|
171
|
+
throw new Error("Unable to resolve indexed thread coverage for the reply target");
|
|
172
|
+
}
|
|
173
|
+
const replyThread = await localIndexService.getThreadById(replyThreadSummary.id);
|
|
174
|
+
const replyTargetMessage = pickReplyTargetFromThread(replyThread, config.smtp.username, true);
|
|
175
|
+
if (!replyTargetMessage?.primaryEmailId) {
|
|
176
|
+
throw new Error("Actionable thread reply target did not produce a primaryEmailId");
|
|
177
|
+
}
|
|
178
|
+
const replyTarget = await imapService.getEmailById(replyTargetMessage.primaryEmailId);
|
|
179
|
+
const replyRecipients = getReplyRecipients(replyTarget, config.smtp.username, false);
|
|
180
|
+
if (replyRecipients.to.length === 0) {
|
|
181
|
+
throw new Error("Reply draft target did not produce a recipient");
|
|
182
|
+
}
|
|
183
|
+
const replyDraft = await draftStore.createDraft({
|
|
184
|
+
mode: "reply",
|
|
185
|
+
to: replyRecipients.to,
|
|
186
|
+
cc: replyRecipients.cc,
|
|
187
|
+
subject: prefixedSubject(replyTarget.subject, "Re:"),
|
|
188
|
+
body: buildReplyText(replyTarget, "Reply smoke check."),
|
|
189
|
+
isHtml: false,
|
|
190
|
+
inReplyTo: replyTarget.messageId,
|
|
191
|
+
references: replyTarget.messageId ? [replyTarget.messageId] : undefined,
|
|
192
|
+
sourceEmailId: replyTarget.id,
|
|
193
|
+
sourceMessageId: replyTarget.messageId,
|
|
194
|
+
notes: "Created by bridge smoke test",
|
|
195
|
+
});
|
|
196
|
+
const updatedReplyDraft = await draftStore.updateDraft(replyDraft.id, {
|
|
197
|
+
notes: "Updated by bridge smoke test",
|
|
198
|
+
});
|
|
199
|
+
const replyRaw = await smtpService.buildRawMessage({
|
|
200
|
+
to: updatedReplyDraft.to,
|
|
201
|
+
cc: updatedReplyDraft.cc,
|
|
202
|
+
bcc: updatedReplyDraft.bcc,
|
|
203
|
+
subject: updatedReplyDraft.subject,
|
|
204
|
+
body: updatedReplyDraft.body,
|
|
205
|
+
isHtml: updatedReplyDraft.isHtml,
|
|
206
|
+
priority: updatedReplyDraft.priority,
|
|
207
|
+
replyTo: updatedReplyDraft.replyTo,
|
|
208
|
+
inReplyTo: updatedReplyDraft.inReplyTo,
|
|
209
|
+
references: updatedReplyDraft.references,
|
|
210
|
+
messageId: updatedReplyDraft.draftMessageId,
|
|
211
|
+
attachments: updatedReplyDraft.attachments,
|
|
212
|
+
});
|
|
213
|
+
const replyRemoteDraft = await imapService.upsertRemoteDraft({
|
|
214
|
+
raw: replyRaw,
|
|
215
|
+
messageId: updatedReplyDraft.draftMessageId,
|
|
216
|
+
});
|
|
217
|
+
const syncedReplyDraft = await draftStore.markRemoteSynced(updatedReplyDraft.id, replyRemoteDraft);
|
|
218
|
+
const composeDraft = await draftStore.createDraft({
|
|
219
|
+
mode: "compose",
|
|
220
|
+
to: [selfTo],
|
|
221
|
+
subject: `ProtonMail MCP draft smoke ${unique}`,
|
|
222
|
+
body: `Compose draft smoke at ${new Date().toISOString()}.`,
|
|
223
|
+
isHtml: false,
|
|
224
|
+
notes: "Sendable compose draft for smoke coverage",
|
|
225
|
+
});
|
|
226
|
+
const composeRaw = await smtpService.buildRawMessage({
|
|
227
|
+
to: composeDraft.to,
|
|
228
|
+
cc: composeDraft.cc,
|
|
229
|
+
bcc: composeDraft.bcc,
|
|
230
|
+
subject: composeDraft.subject,
|
|
231
|
+
body: composeDraft.body,
|
|
232
|
+
isHtml: composeDraft.isHtml,
|
|
233
|
+
priority: composeDraft.priority,
|
|
234
|
+
replyTo: composeDraft.replyTo,
|
|
235
|
+
inReplyTo: composeDraft.inReplyTo,
|
|
236
|
+
references: composeDraft.references,
|
|
237
|
+
messageId: composeDraft.draftMessageId,
|
|
238
|
+
attachments: composeDraft.attachments,
|
|
239
|
+
});
|
|
240
|
+
const composeRemoteDraft = await imapService.upsertRemoteDraft({
|
|
241
|
+
raw: composeRaw,
|
|
242
|
+
messageId: composeDraft.draftMessageId,
|
|
243
|
+
});
|
|
244
|
+
const syncedComposeDraft = await draftStore.markRemoteSynced(composeDraft.id, composeRemoteDraft);
|
|
245
|
+
const composeSend = await smtpService.sendEmail({
|
|
246
|
+
to: syncedComposeDraft.to,
|
|
247
|
+
cc: syncedComposeDraft.cc,
|
|
248
|
+
bcc: syncedComposeDraft.bcc,
|
|
249
|
+
subject: syncedComposeDraft.subject,
|
|
250
|
+
body: syncedComposeDraft.body,
|
|
251
|
+
isHtml: syncedComposeDraft.isHtml,
|
|
252
|
+
inReplyTo: syncedComposeDraft.inReplyTo,
|
|
253
|
+
references: syncedComposeDraft.references,
|
|
254
|
+
attachments: syncedComposeDraft.attachments,
|
|
255
|
+
});
|
|
256
|
+
let sentComposeDraft = await draftStore.markSent(syncedComposeDraft.id, {
|
|
257
|
+
messageId: composeSend.messageId,
|
|
258
|
+
accepted: composeSend.accepted,
|
|
259
|
+
rejected: composeSend.rejected,
|
|
260
|
+
response: composeSend.response,
|
|
261
|
+
});
|
|
262
|
+
if (sentComposeDraft.remoteDraft?.emailId) {
|
|
263
|
+
await imapService.deleteRemoteDraft(sentComposeDraft.remoteDraft.emailId);
|
|
264
|
+
sentComposeDraft = await draftStore.clearRemoteSync(sentComposeDraft.id);
|
|
265
|
+
}
|
|
266
|
+
const forwardSend = await smtpService.sendEmail({
|
|
267
|
+
to: [forwardTo],
|
|
268
|
+
subject: prefixedSubject(replyTarget.subject, "Fwd:"),
|
|
269
|
+
body: buildForwardText(replyTarget, "Forward smoke check."),
|
|
270
|
+
isHtml: false,
|
|
271
|
+
});
|
|
272
|
+
const replyThreadEmailIds = [...new Set(replyThread.messages.map((message) => message.primaryEmailId))];
|
|
273
|
+
for (const emailId of replyThreadEmailIds) {
|
|
274
|
+
await imapService.starEmail(emailId, true);
|
|
275
|
+
}
|
|
276
|
+
for (const emailId of replyThreadEmailIds) {
|
|
277
|
+
await imapService.starEmail(emailId, false);
|
|
278
|
+
}
|
|
279
|
+
if (syncedReplyDraft.remoteDraft?.emailId) {
|
|
280
|
+
await imapService.deleteRemoteDraft(syncedReplyDraft.remoteDraft.emailId);
|
|
281
|
+
await draftStore.clearRemoteSync(syncedReplyDraft.id);
|
|
282
|
+
}
|
|
283
|
+
const attachmentSample = await imapService.searchEmails({ hasAttachment: true, limit: 10 });
|
|
284
|
+
let attachmentBatch;
|
|
285
|
+
if (attachmentSample.emails.length > 0) {
|
|
286
|
+
const attachmentOutputPath = join(config.dataDir, "smoke-attachments");
|
|
287
|
+
const savedAttachments = await imapService.saveAttachments({
|
|
288
|
+
emailId: attachmentSample.emails[0].id,
|
|
289
|
+
outputPath: attachmentOutputPath,
|
|
290
|
+
includeInline: true,
|
|
291
|
+
});
|
|
292
|
+
attachmentBatch = {
|
|
293
|
+
emailId: savedAttachments.emailId,
|
|
294
|
+
savedCount: savedAttachments.saved.length,
|
|
295
|
+
};
|
|
296
|
+
await rm(attachmentOutputPath, { recursive: true, force: true });
|
|
297
|
+
}
|
|
298
|
+
const deletedReplyDraft = await draftStore.deleteDraft(syncedReplyDraft.id);
|
|
299
|
+
const deletedComposeDraft = await draftStore.deleteDraft(sentComposeDraft.id);
|
|
300
|
+
const remoteDrafts = await imapService.listRemoteDrafts(10, 0);
|
|
301
|
+
let archiveResult;
|
|
302
|
+
let restoreAfterArchive;
|
|
303
|
+
let trashResult;
|
|
304
|
+
let restoreAfterTrash;
|
|
305
|
+
if (allowMutations && mutationEmailId) {
|
|
306
|
+
archiveResult = await imapService.archiveEmail(mutationEmailId);
|
|
307
|
+
if (!archiveResult.targetEmailId) {
|
|
308
|
+
throw new Error("Archive step did not return a targetEmailId");
|
|
309
|
+
}
|
|
310
|
+
restoreAfterArchive = await imapService.restoreEmail(archiveResult.targetEmailId, "INBOX");
|
|
311
|
+
if (!restoreAfterArchive.targetEmailId) {
|
|
312
|
+
throw new Error("Restore-after-archive step did not return a targetEmailId");
|
|
313
|
+
}
|
|
314
|
+
trashResult = await imapService.trashEmail(restoreAfterArchive.targetEmailId);
|
|
315
|
+
if (!trashResult.targetEmailId) {
|
|
316
|
+
throw new Error("Trash step did not return a targetEmailId");
|
|
317
|
+
}
|
|
318
|
+
restoreAfterTrash = await imapService.restoreEmail(trashResult.targetEmailId, "INBOX");
|
|
319
|
+
if (!restoreAfterTrash.targetEmailId) {
|
|
320
|
+
throw new Error("Restore-after-trash step did not return a targetEmailId");
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
console.log(JSON.stringify({
|
|
324
|
+
checkedAt: new Date().toISOString(),
|
|
325
|
+
index: {
|
|
326
|
+
firstSyncAt: indexStatus.updatedAt,
|
|
327
|
+
updatedAt: incrementalIndexStatus.updatedAt,
|
|
328
|
+
storedMessageCount: incrementalIndexStatus.storedMessageCount,
|
|
329
|
+
dedupedMessageCount: incrementalIndexStatus.dedupedMessageCount,
|
|
330
|
+
threadCount: incrementalIndexStatus.threadCount,
|
|
331
|
+
actionableThreadCount: actionableThreads.total,
|
|
332
|
+
},
|
|
333
|
+
sync: {
|
|
334
|
+
firstPass: snapshot.folderStats,
|
|
335
|
+
secondPass: incrementalSnapshot.folderStats,
|
|
336
|
+
attachmentTextHits,
|
|
337
|
+
},
|
|
338
|
+
diagnostics: {
|
|
339
|
+
integrity: indexIntegrity,
|
|
340
|
+
idleProbe,
|
|
341
|
+
digest: {
|
|
342
|
+
counts: typeof inboxDigest.counts === "object" && inboxDigest.counts
|
|
343
|
+
? inboxDigest.counts
|
|
344
|
+
: {},
|
|
345
|
+
topThreadCount: Array.isArray(inboxDigest.topThreads) ? inboxDigest.topThreads.length : 0,
|
|
346
|
+
staleAwaitingYouCount: Array.isArray(inboxDigest.staleAwaitingYou)
|
|
347
|
+
? inboxDigest.staleAwaitingYou.length
|
|
348
|
+
: 0,
|
|
349
|
+
},
|
|
350
|
+
followUps: {
|
|
351
|
+
total: typeof followUpCandidates.total === "number" ? followUpCandidates.total : 0,
|
|
352
|
+
returned: Array.isArray(followUpCandidates.threads)
|
|
353
|
+
? followUpCandidates.threads.length
|
|
354
|
+
: 0,
|
|
355
|
+
},
|
|
356
|
+
},
|
|
357
|
+
actionableThread: {
|
|
358
|
+
matchedActionableThread: Boolean(replyActionableThread),
|
|
359
|
+
threadId: replyThread.id,
|
|
360
|
+
pendingOn: replyActionableThread?.pendingOn ?? "unknown",
|
|
361
|
+
score: replyActionableThread?.score ?? null,
|
|
362
|
+
latestEmailId: replyActionableThread?.latestEmailId ?? null,
|
|
363
|
+
},
|
|
364
|
+
replyDraft: {
|
|
365
|
+
threadId: replyThread.id,
|
|
366
|
+
targetEmailId: replyTarget.id,
|
|
367
|
+
createdDraftId: replyDraft.id,
|
|
368
|
+
remoteDraftEmailId: replyRemoteDraft.emailId,
|
|
369
|
+
deletedDraft: deletedReplyDraft.removed,
|
|
370
|
+
},
|
|
371
|
+
composeDraft: {
|
|
372
|
+
createdDraftId: composeDraft.id,
|
|
373
|
+
remoteDraftEmailId: composeRemoteDraft.emailId,
|
|
374
|
+
sentMessageId: composeSend.messageId,
|
|
375
|
+
deletedDraft: deletedComposeDraft.removed,
|
|
376
|
+
},
|
|
377
|
+
forward: {
|
|
378
|
+
to: forwardTo,
|
|
379
|
+
sourceEmailId: replyTarget.id,
|
|
380
|
+
messageId: forwardSend.messageId,
|
|
381
|
+
},
|
|
382
|
+
threadActions: {
|
|
383
|
+
threadId: replyThread.id,
|
|
384
|
+
starredThenUnstarred: replyThreadEmailIds.length,
|
|
385
|
+
},
|
|
386
|
+
remoteDrafts: {
|
|
387
|
+
listed: remoteDrafts.emails.length,
|
|
388
|
+
},
|
|
389
|
+
attachments: attachmentBatch || { skipped: true },
|
|
390
|
+
mutations: allowMutations && mutationEmailId
|
|
391
|
+
? {
|
|
392
|
+
archiveTarget: archiveResult?.targetEmailId,
|
|
393
|
+
restoreAfterArchive: restoreAfterArchive?.targetEmailId,
|
|
394
|
+
trashTarget: trashResult?.targetEmailId,
|
|
395
|
+
restoreAfterTrash: restoreAfterTrash?.targetEmailId,
|
|
396
|
+
}
|
|
397
|
+
: allowMutations
|
|
398
|
+
? {
|
|
399
|
+
skipped: true,
|
|
400
|
+
reason: "PROTONMAIL_SMOKE_MUTATION_EMAIL_ID not set",
|
|
401
|
+
}
|
|
402
|
+
: {
|
|
403
|
+
skipped: true,
|
|
404
|
+
},
|
|
405
|
+
}, null, 2));
|
|
406
|
+
}
|
|
407
|
+
finally {
|
|
408
|
+
await Promise.allSettled([imapService.disconnect(), smtpService.close()]);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
main().catch((error) => {
|
|
412
|
+
console.error(error instanceof Error ? error.stack || error.message : String(error));
|
|
413
|
+
process.exit(1);
|
|
414
|
+
});
|
|
415
|
+
//# sourceMappingURL=bridge-smoke.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge-smoke.js","sourceRoot":"","sources":["../../src/scripts/bridge-smoke.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface ClaudeDesktopInstallStatus {
|
|
2
|
+
configPath: string;
|
|
3
|
+
serverName: string;
|
|
4
|
+
configExists: boolean;
|
|
5
|
+
installed: boolean;
|
|
6
|
+
runtimeDir?: string;
|
|
7
|
+
entryCommand?: string;
|
|
8
|
+
entryArgs?: string[];
|
|
9
|
+
runtimeEntryExists: boolean;
|
|
10
|
+
runtimeNodeModulesExists: boolean;
|
|
11
|
+
hasEnvConfig: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function getClaudeDesktopInstallStatus(options?: {
|
|
14
|
+
configPath?: string;
|
|
15
|
+
serverName?: string;
|
|
16
|
+
}): Promise<ClaudeDesktopInstallStatus>;
|
|
17
|
+
//# sourceMappingURL=check-claude-desktop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-claude-desktop.d.ts","sourceRoot":"","sources":["../../src/scripts/check-claude-desktop.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,wBAAwB,EAAE,OAAO,CAAC;IAClC,YAAY,EAAE,OAAO,CAAC;CACvB;AA6DD,wBAAsB,6BAA6B,CAAC,OAAO,GAAE;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CA0C3C"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { constants as fsConstants } from "node:fs";
|
|
2
|
+
import { access, readFile } from "node:fs/promises";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { resolveClaudeDesktopConfigPath, } from "./install-claude-desktop.js";
|
|
6
|
+
const DEFAULT_SERVER_NAME = "proton-mail-bridge";
|
|
7
|
+
function parseCliArgs(argv) {
|
|
8
|
+
const options = {};
|
|
9
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
10
|
+
const token = argv[index];
|
|
11
|
+
const next = argv[index + 1];
|
|
12
|
+
switch (token) {
|
|
13
|
+
case "--config-path":
|
|
14
|
+
if (!next) {
|
|
15
|
+
throw new Error("--config-path requires a value.");
|
|
16
|
+
}
|
|
17
|
+
options.configPath = next;
|
|
18
|
+
index += 1;
|
|
19
|
+
break;
|
|
20
|
+
case "--server-name":
|
|
21
|
+
if (!next) {
|
|
22
|
+
throw new Error("--server-name requires a value.");
|
|
23
|
+
}
|
|
24
|
+
options.serverName = next;
|
|
25
|
+
index += 1;
|
|
26
|
+
break;
|
|
27
|
+
case "--json":
|
|
28
|
+
options.json = true;
|
|
29
|
+
break;
|
|
30
|
+
case "--help":
|
|
31
|
+
case "-h":
|
|
32
|
+
process.stdout.write([
|
|
33
|
+
"Usage: node dist/scripts/check-claude-desktop.js [options]",
|
|
34
|
+
"",
|
|
35
|
+
"Options:",
|
|
36
|
+
" --config-path <path> Override Claude Desktop config path",
|
|
37
|
+
" --server-name <name> MCP server key to inspect (default: proton-mail-bridge)",
|
|
38
|
+
" --json Print machine-readable JSON output",
|
|
39
|
+
].join("\n"));
|
|
40
|
+
process.exit(0);
|
|
41
|
+
default:
|
|
42
|
+
throw new Error(`Unknown argument: ${token}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return options;
|
|
46
|
+
}
|
|
47
|
+
async function pathExists(targetPath) {
|
|
48
|
+
if (!targetPath) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
await access(targetPath, fsConstants.F_OK);
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export async function getClaudeDesktopInstallStatus(options = {}) {
|
|
60
|
+
const configPath = resolveClaudeDesktopConfigPath(options.configPath);
|
|
61
|
+
const serverName = options.serverName || DEFAULT_SERVER_NAME;
|
|
62
|
+
let configExists = false;
|
|
63
|
+
let parsed = {};
|
|
64
|
+
try {
|
|
65
|
+
const raw = await readFile(configPath, "utf8");
|
|
66
|
+
parsed = JSON.parse(raw);
|
|
67
|
+
configExists = true;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (!(error && typeof error === "object" && "code" in error && error.code === "ENOENT")) {
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const servers = parsed.mcpServers && typeof parsed.mcpServers === "object" && !Array.isArray(parsed.mcpServers)
|
|
75
|
+
? parsed.mcpServers
|
|
76
|
+
: {};
|
|
77
|
+
const entry = servers[serverName] && typeof servers[serverName] === "object" && !Array.isArray(servers[serverName])
|
|
78
|
+
? servers[serverName]
|
|
79
|
+
: undefined;
|
|
80
|
+
const runtimeDir = typeof entry?.cwd === "string" ? entry.cwd : undefined;
|
|
81
|
+
const entryArgs = Array.isArray(entry?.args) ? entry.args.filter((value) => typeof value === "string") : [];
|
|
82
|
+
const runtimeEntry = entryArgs[0];
|
|
83
|
+
return {
|
|
84
|
+
configPath,
|
|
85
|
+
serverName,
|
|
86
|
+
configExists,
|
|
87
|
+
installed: Boolean(entry),
|
|
88
|
+
runtimeDir,
|
|
89
|
+
entryCommand: typeof entry?.command === "string" ? entry.command : undefined,
|
|
90
|
+
entryArgs,
|
|
91
|
+
runtimeEntryExists: await pathExists(runtimeEntry),
|
|
92
|
+
runtimeNodeModulesExists: await pathExists(runtimeDir ? resolve(runtimeDir, "node_modules") : undefined),
|
|
93
|
+
hasEnvConfig: Boolean(entry?.env && typeof entry.env === "object" && !Array.isArray(entry.env)),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function renderStatus(status) {
|
|
97
|
+
if (!status.configExists) {
|
|
98
|
+
return [
|
|
99
|
+
"Claude Desktop config not found.",
|
|
100
|
+
`Expected config path: ${status.configPath}`,
|
|
101
|
+
"Run npm run setup:claude-desktop to install Proton Mail Bridge Client for Claude Desktop.",
|
|
102
|
+
].join("\n");
|
|
103
|
+
}
|
|
104
|
+
if (!status.installed) {
|
|
105
|
+
return [
|
|
106
|
+
"Proton Mail Bridge Client is not currently registered in Claude Desktop.",
|
|
107
|
+
`Config path: ${status.configPath}`,
|
|
108
|
+
`Expected server key: ${status.serverName}`,
|
|
109
|
+
"Run npm run setup:claude-desktop to add it.",
|
|
110
|
+
].join("\n");
|
|
111
|
+
}
|
|
112
|
+
return [
|
|
113
|
+
"Claude Desktop install looks present.",
|
|
114
|
+
`Config path: ${status.configPath}`,
|
|
115
|
+
`Server key: ${status.serverName}`,
|
|
116
|
+
`Runtime dir: ${status.runtimeDir || "unknown"}`,
|
|
117
|
+
`Runtime entry exists: ${status.runtimeEntryExists ? "yes" : "no"}`,
|
|
118
|
+
`Runtime dependencies exist: ${status.runtimeNodeModulesExists ? "yes" : "no"}`,
|
|
119
|
+
`Env config present: ${status.hasEnvConfig ? "yes" : "no"}`,
|
|
120
|
+
].join("\n");
|
|
121
|
+
}
|
|
122
|
+
async function main() {
|
|
123
|
+
const options = parseCliArgs(process.argv.slice(2));
|
|
124
|
+
const status = await getClaudeDesktopInstallStatus(options);
|
|
125
|
+
if (options.json) {
|
|
126
|
+
process.stdout.write(`${JSON.stringify(status, null, 2)}\n`);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
process.stdout.write(`${renderStatus(status)}\n`);
|
|
130
|
+
}
|
|
131
|
+
const isDirectExecution = process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url);
|
|
132
|
+
if (isDirectExecution) {
|
|
133
|
+
main().catch((error) => {
|
|
134
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
135
|
+
process.exitCode = 1;
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=check-claude-desktop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-claude-desktop.js","sourceRoot":"","sources":["../../src/scripts/check-claude-desktop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface ClaudeDesktopServerConfig {
|
|
2
|
+
command: string;
|
|
3
|
+
args: string[];
|
|
4
|
+
cwd: string;
|
|
5
|
+
env?: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export interface InstallOptions {
|
|
8
|
+
configPath?: string;
|
|
9
|
+
serverName?: string;
|
|
10
|
+
cwd?: string;
|
|
11
|
+
runtimeDir?: string;
|
|
12
|
+
command?: string;
|
|
13
|
+
includeEnv?: boolean;
|
|
14
|
+
env?: Record<string, string>;
|
|
15
|
+
useRepoRuntime?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function resolveClaudeDesktopConfigPath(explicitPath?: string): string;
|
|
18
|
+
export declare function resolveClaudeDesktopRuntimeDir(explicitPath?: string): string;
|
|
19
|
+
export declare function collectInstallEnv(sourceEnv?: NodeJS.ProcessEnv): Record<string, string>;
|
|
20
|
+
export declare function buildClaudeDesktopServerConfig(options?: InstallOptions): {
|
|
21
|
+
serverName: string;
|
|
22
|
+
serverConfig: ClaudeDesktopServerConfig;
|
|
23
|
+
};
|
|
24
|
+
export declare function prepareClaudeDesktopRuntime(options?: InstallOptions): Promise<{
|
|
25
|
+
runtimeDir: string;
|
|
26
|
+
sourceCwd: string;
|
|
27
|
+
usedRepoRuntime: boolean;
|
|
28
|
+
}>;
|
|
29
|
+
export declare function mergeClaudeDesktopConfig(existing: Record<string, unknown>, serverName: string, serverConfig: ClaudeDesktopServerConfig): Record<string, unknown>;
|
|
30
|
+
export declare function installClaudeDesktopConfig(options?: InstallOptions): Promise<{
|
|
31
|
+
configPath: string;
|
|
32
|
+
backupPath?: string;
|
|
33
|
+
serverName: string;
|
|
34
|
+
serverConfig: ClaudeDesktopServerConfig;
|
|
35
|
+
runtimeDir: string;
|
|
36
|
+
sourceCwd: string;
|
|
37
|
+
usedRepoRuntime: boolean;
|
|
38
|
+
}>;
|
|
39
|
+
//# sourceMappingURL=install-claude-desktop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-claude-desktop.d.ts","sourceRoot":"","sources":["../../src/scripts/install-claude-desktop.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAoFD,wBAAgB,8BAA8B,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAkB5E;AAED,wBAAgB,8BAA8B,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAkB5E;AAED,wBAAgB,iBAAiB,CAAC,SAAS,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMpG;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,GAAE,cAAmB,GAC3B;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,yBAAyB,CAAA;CAAE,CAoBjE;AAyBD,wBAAsB,2BAA2B,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC;IACvF,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC,CAwBD;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,yBAAyB,GACtC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAazB;AAgCD,wBAAsB,0BAA0B,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC;IACtF,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,yBAAyB,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC,CAuBD"}
|