proton-mail-bridge-client 2.16.2 → 2.17.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/README.md +149 -12
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +178 -1
- package/dist/cli.js.map +1 -1
- package/dist/config-env.d.ts +2 -1
- package/dist/config-env.d.ts.map +1 -1
- package/dist/config-env.js +24 -0
- package/dist/config-env.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +180 -11
- package/dist/index.js.map +1 -1
- package/dist/services/account-manager.d.ts +7 -0
- package/dist/services/account-manager.d.ts.map +1 -1
- package/dist/services/account-manager.js +59 -0
- package/dist/services/account-manager.js.map +1 -1
- package/dist/services/audit-service.d.ts +20 -0
- package/dist/services/audit-service.d.ts.map +1 -1
- package/dist/services/audit-service.js +266 -9
- package/dist/services/audit-service.js.map +1 -1
- package/dist/services/autoresponder-service.d.ts +35 -6
- package/dist/services/autoresponder-service.d.ts.map +1 -1
- package/dist/services/autoresponder-service.js +223 -108
- package/dist/services/autoresponder-service.js.map +1 -1
- package/dist/services/brief-service.d.ts +7 -1
- package/dist/services/brief-service.d.ts.map +1 -1
- package/dist/services/brief-service.js +19 -5
- package/dist/services/brief-service.js.map +1 -1
- package/dist/services/category-service.d.ts +91 -0
- package/dist/services/category-service.d.ts.map +1 -0
- package/dist/services/category-service.js +320 -0
- package/dist/services/category-service.js.map +1 -0
- package/dist/services/commitment-service.d.ts.map +1 -1
- package/dist/services/commitment-service.js +9 -3
- package/dist/services/commitment-service.js.map +1 -1
- package/dist/services/contact-service.d.ts +60 -0
- package/dist/services/contact-service.d.ts.map +1 -0
- package/dist/services/contact-service.js +248 -0
- package/dist/services/contact-service.js.map +1 -0
- package/dist/services/delivery-queue-service.d.ts +4 -0
- package/dist/services/delivery-queue-service.d.ts.map +1 -1
- package/dist/services/delivery-queue-service.js +12 -2
- package/dist/services/delivery-queue-service.js.map +1 -1
- package/dist/services/draft-store-service.d.ts.map +1 -1
- package/dist/services/draft-store-service.js +3 -2
- package/dist/services/draft-store-service.js.map +1 -1
- package/dist/services/embedding-service.d.ts +68 -0
- package/dist/services/embedding-service.d.ts.map +1 -0
- package/dist/services/embedding-service.js +465 -0
- package/dist/services/embedding-service.js.map +1 -0
- package/dist/services/event-log-service.d.ts +67 -0
- package/dist/services/event-log-service.d.ts.map +1 -0
- package/dist/services/event-log-service.js +280 -0
- package/dist/services/event-log-service.js.map +1 -0
- package/dist/services/grant-service.d.ts +84 -0
- package/dist/services/grant-service.d.ts.map +1 -0
- package/dist/services/grant-service.js +214 -0
- package/dist/services/grant-service.js.map +1 -0
- package/dist/services/local-index-service.d.ts +18 -1
- package/dist/services/local-index-service.d.ts.map +1 -1
- package/dist/services/local-index-service.js +54 -4
- package/dist/services/local-index-service.js.map +1 -1
- package/dist/services/reply-reminder-service.d.ts +4 -0
- package/dist/services/reply-reminder-service.d.ts.map +1 -1
- package/dist/services/reply-reminder-service.js +22 -2
- package/dist/services/reply-reminder-service.js.map +1 -1
- package/dist/services/rules-service.d.ts +9 -1
- package/dist/services/rules-service.d.ts.map +1 -1
- package/dist/services/rules-service.js +8 -3
- package/dist/services/rules-service.js.map +1 -1
- package/dist/services/sieve-export.d.ts +19 -0
- package/dist/services/sieve-export.d.ts.map +1 -0
- package/dist/services/sieve-export.js +192 -0
- package/dist/services/sieve-export.js.map +1 -0
- package/dist/services/simple-imap-service.d.ts +13 -0
- package/dist/services/simple-imap-service.d.ts.map +1 -1
- package/dist/services/simple-imap-service.js +142 -18
- package/dist/services/simple-imap-service.js.map +1 -1
- package/dist/services/smtp-service.d.ts +1 -0
- package/dist/services/smtp-service.d.ts.map +1 -1
- package/dist/services/smtp-service.js +20 -0
- package/dist/services/smtp-service.js.map +1 -1
- package/dist/services/snooze-service.d.ts +4 -0
- package/dist/services/snooze-service.d.ts.map +1 -1
- package/dist/services/snooze-service.js +12 -3
- package/dist/services/snooze-service.js.map +1 -1
- package/dist/services/template-service.d.ts.map +1 -1
- package/dist/services/template-service.js +3 -2
- package/dist/services/template-service.js.map +1 -1
- package/dist/services/triage-plan-service.d.ts +10 -2
- package/dist/services/triage-plan-service.d.ts.map +1 -1
- package/dist/services/triage-plan-service.js +23 -3
- package/dist/services/triage-plan-service.js.map +1 -1
- package/dist/tools/attachments.js +1 -1
- package/dist/tools/attachments.js.map +1 -1
- package/dist/tools/brief.d.ts.map +1 -1
- package/dist/tools/brief.js +14 -4
- package/dist/tools/brief.js.map +1 -1
- package/dist/tools/categories.d.ts +4 -0
- package/dist/tools/categories.d.ts.map +1 -0
- package/dist/tools/categories.js +269 -0
- package/dist/tools/categories.js.map +1 -0
- package/dist/tools/commitments.d.ts.map +1 -1
- package/dist/tools/commitments.js +6 -2
- package/dist/tools/commitments.js.map +1 -1
- package/dist/tools/contacts.d.ts +6 -0
- package/dist/tools/contacts.d.ts.map +1 -0
- package/dist/tools/contacts.js +295 -0
- package/dist/tools/contacts.js.map +1 -0
- package/dist/tools/context.d.ts +4 -0
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +3 -0
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/definitions.d.ts +333 -5
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +169 -5
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/delegation.d.ts +44 -0
- package/dist/tools/delegation.d.ts.map +1 -0
- package/dist/tools/delegation.js +180 -0
- package/dist/tools/delegation.js.map +1 -0
- package/dist/tools/diagnostics.d.ts.map +1 -1
- package/dist/tools/diagnostics.js +6 -0
- package/dist/tools/diagnostics.js.map +1 -1
- package/dist/tools/drafts-support.d.ts +2 -1
- package/dist/tools/drafts-support.d.ts.map +1 -1
- package/dist/tools/drafts-support.js +14 -6
- package/dist/tools/drafts-support.js.map +1 -1
- package/dist/tools/drafts.d.ts.map +1 -1
- package/dist/tools/drafts.js +22 -1
- package/dist/tools/drafts.js.map +1 -1
- package/dist/tools/events.d.ts +47 -0
- package/dist/tools/events.d.ts.map +1 -0
- package/dist/tools/events.js +240 -0
- package/dist/tools/events.js.map +1 -0
- package/dist/tools/reading.d.ts.map +1 -1
- package/dist/tools/reading.js +125 -4
- package/dist/tools/reading.js.map +1 -1
- package/dist/tools/resources.d.ts +4 -0
- package/dist/tools/resources.d.ts.map +1 -1
- package/dist/tools/resources.js +9 -0
- package/dist/tools/resources.js.map +1 -1
- package/dist/tools/rules-runner.d.ts.map +1 -1
- package/dist/tools/rules-runner.js +1 -0
- package/dist/tools/rules-runner.js.map +1 -1
- package/dist/tools/rules.d.ts +9 -0
- package/dist/tools/rules.d.ts.map +1 -1
- package/dist/tools/rules.js +50 -19
- package/dist/tools/rules.js.map +1 -1
- package/dist/tools/sending.d.ts.map +1 -1
- package/dist/tools/sending.js +4 -0
- package/dist/tools/sending.js.map +1 -1
- package/dist/tools/style.d.ts +2 -0
- package/dist/tools/style.d.ts.map +1 -1
- package/dist/tools/style.js +3 -3
- package/dist/tools/style.js.map +1 -1
- package/dist/tools/templates-and-reminders.d.ts +3 -0
- package/dist/tools/templates-and-reminders.d.ts.map +1 -1
- package/dist/tools/templates-and-reminders.js +31 -17
- package/dist/tools/templates-and-reminders.js.map +1 -1
- package/dist/tools/triage.d.ts.map +1 -1
- package/dist/tools/triage.js +33 -11
- package/dist/tools/triage.js.map +1 -1
- package/dist/types/index.d.ts +23 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/account-identity.d.ts.map +1 -1
- package/dist/utils/account-identity.js +3 -2
- package/dist/utils/account-identity.js.map +1 -1
- package/dist/utils/approval.d.ts +133 -0
- package/dist/utils/approval.d.ts.map +1 -0
- package/dist/utils/approval.js +507 -0
- package/dist/utils/approval.js.map +1 -0
- package/dist/utils/atomic-write.d.ts +1 -1
- package/dist/utils/atomic-write.d.ts.map +1 -1
- package/dist/utils/atomic-write.js +10 -3
- package/dist/utils/atomic-write.js.map +1 -1
- package/dist/utils/commitment-phrases.d.ts.map +1 -1
- package/dist/utils/commitment-phrases.js +31 -18
- package/dist/utils/commitment-phrases.js.map +1 -1
- package/dist/utils/contact-text.d.ts +8 -0
- package/dist/utils/contact-text.d.ts.map +1 -0
- package/dist/utils/contact-text.js +24 -0
- package/dist/utils/contact-text.js.map +1 -0
- package/dist/utils/delegation.d.ts +17 -0
- package/dist/utils/delegation.d.ts.map +1 -0
- package/dist/utils/delegation.js +72 -0
- package/dist/utils/delegation.js.map +1 -0
- package/dist/utils/file-lock.d.ts.map +1 -1
- package/dist/utils/file-lock.js +5 -4
- package/dist/utils/file-lock.js.map +1 -1
- package/dist/utils/mail-security.d.ts +9 -1
- package/dist/utils/mail-security.d.ts.map +1 -1
- package/dist/utils/mail-security.js +444 -62
- package/dist/utils/mail-security.js.map +1 -1
- package/dist/utils/ocr.d.ts +24 -0
- package/dist/utils/ocr.d.ts.map +1 -0
- package/dist/utils/ocr.js +109 -0
- package/dist/utils/ocr.js.map +1 -0
- package/dist/utils/office-text-worker.d.ts +2 -0
- package/dist/utils/office-text-worker.d.ts.map +1 -0
- package/dist/utils/office-text-worker.js +17 -0
- package/dist/utils/office-text-worker.js.map +1 -0
- package/dist/utils/office-text.d.ts +32 -0
- package/dist/utils/office-text.d.ts.map +1 -0
- package/dist/utils/office-text.js +540 -0
- package/dist/utils/office-text.js.map +1 -0
- package/dist/utils/pdf-text-worker.js +2 -2
- package/dist/utils/pdf-text-worker.js.map +1 -1
- package/dist/utils/pdf-text.d.ts +10 -0
- package/dist/utils/pdf-text.d.ts.map +1 -1
- package/dist/utils/pdf-text.js +49 -9
- package/dist/utils/pdf-text.js.map +1 -1
- package/dist/utils/png.d.ts +2 -0
- package/dist/utils/png.d.ts.map +1 -0
- package/dist/utils/png.js +26 -0
- package/dist/utils/png.js.map +1 -0
- package/dist/utils/regular-file.d.ts +9 -0
- package/dist/utils/regular-file.d.ts.map +1 -0
- package/dist/utils/regular-file.js +34 -0
- package/dist/utils/regular-file.js.map +1 -0
- package/dist/utils/runtime-policy.d.ts.map +1 -1
- package/dist/utils/runtime-policy.js +2 -0
- package/dist/utils/runtime-policy.js.map +1 -1
- package/dist/utils/safe-write.d.ts +8 -0
- package/dist/utils/safe-write.d.ts.map +1 -0
- package/dist/utils/safe-write.js +46 -0
- package/dist/utils/safe-write.js.map +1 -0
- package/dist/utils/server-state-paths.d.ts +12 -0
- package/dist/utils/server-state-paths.d.ts.map +1 -0
- package/dist/utils/server-state-paths.js +69 -0
- package/dist/utils/server-state-paths.js.map +1 -0
- package/dist/utils/style-profile.d.ts +18 -0
- package/dist/utils/style-profile.d.ts.map +1 -1
- package/dist/utils/style-profile.js +63 -14
- package/dist/utils/style-profile.js.map +1 -1
- package/dist/utils/vcard.d.ts +27 -0
- package/dist/utils/vcard.d.ts.map +1 -0
- package/dist/utils/vcard.js +141 -0
- package/dist/utils/vcard.js.map +1 -0
- package/dist/utils/zip-reader.d.ts +16 -0
- package/dist/utils/zip-reader.d.ts.map +1 -0
- package/dist/utils/zip-reader.js +108 -0
- package/dist/utils/zip-reader.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
// Real human approval. `confirmed: true` is an argument, so the model can set it itself (a persuaded model, a message that
|
|
2
|
+
// says "pass confirmed"). With PROTONMAIL_APPROVAL=elicit|require the SERVER asks the person through the client (MCP
|
|
3
|
+
// elicitation) and only their answer counts. The question is built here from what the server knows or will act on (the
|
|
4
|
+
// account, the tool, the recipients the mail will really go to - a reply's found the way the reply tool finds them, Reply-To
|
|
5
|
+
// included - a stored draft, a plan, the call's own arguments), never from text the model wrote about the action, and every
|
|
6
|
+
// piece of mail text in it is stripped of control and bidi characters and cut short. What is stored (a draft, a plan) is
|
|
7
|
+
// bound to the answer: the handler refuses to act if it is no longer what the person was shown.
|
|
8
|
+
import { createHash } from "node:crypto";
|
|
9
|
+
import { basename } from "node:path";
|
|
10
|
+
import { ErrorCode, McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
11
|
+
import { FORWARD_DAILY_LIMIT } from "../services/rules-service.js";
|
|
12
|
+
import { normalizeBoolean } from "./helpers.js";
|
|
13
|
+
import { isGatedAction } from "./mail-security.js";
|
|
14
|
+
export const DEFAULT_APPROVAL_TIMEOUT_SECONDS = 120;
|
|
15
|
+
export function parseApprovalEnv(name) {
|
|
16
|
+
const raw = process.env[name]?.trim().toLowerCase();
|
|
17
|
+
// An unfilled "${user_config.approval}" from a host that did not substitute it is "not set", not a typo to fail on.
|
|
18
|
+
if (!raw || raw.startsWith("${"))
|
|
19
|
+
return "off";
|
|
20
|
+
if (raw === "off" || raw === "elicit" || raw === "require")
|
|
21
|
+
return raw;
|
|
22
|
+
throw new Error(`${name} must be one of: off, elicit, require (got "${raw}").`);
|
|
23
|
+
}
|
|
24
|
+
// confirmed-gated tools that the taint gate does not list.
|
|
25
|
+
const ALSO_APPROVED = new Set(["approve_plan", "send_test_email", "delete_draft", "delete_template", "delete_label"]);
|
|
26
|
+
const FLAG_TOOLS = new Set(["update_message_flags", "bulk_update_flags", "flag_thread"]);
|
|
27
|
+
const isRecord = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
28
|
+
const strings = (value) => (Array.isArray(value) ? value.map(String) : typeof value === "string" && value ? [value] : []);
|
|
29
|
+
/** Whether this call is one a person must approve: what the confirmation gate asks `confirmed` for, plus approve_plan. */
|
|
30
|
+
export function needsApproval(name, args, declared) {
|
|
31
|
+
if (ALSO_APPROVED.has(name))
|
|
32
|
+
return true;
|
|
33
|
+
if (FLAG_TOOLS.has(name))
|
|
34
|
+
return strings(args.flagsToAdd).some((flag) => flag.toLowerCase() === "\\deleted");
|
|
35
|
+
if (!isGatedAction(name, args, declared))
|
|
36
|
+
return false;
|
|
37
|
+
// A rule only sends mail when it forwards. With actions given they decide; without, they come from a proposal or the stored rule.
|
|
38
|
+
if (name === "set_rule" && isRecord(args.actions))
|
|
39
|
+
return strings(args.actions.forwardTo).length > 0;
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
/** Mail text on one line, without control, format (bidi, zero-width) or line-separator characters, cut to `max` characters. */
|
|
43
|
+
export function cleanForPrompt(value, max = 120) {
|
|
44
|
+
const text = String(value ?? "").replace(/[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]/gu, " ").replace(/\s+/g, " ").trim();
|
|
45
|
+
const chars = [...text];
|
|
46
|
+
return chars.length > max ? `${chars.slice(0, max - 1).join("")}…` : text;
|
|
47
|
+
}
|
|
48
|
+
const quoted = (value, max) => JSON.stringify(cleanForPrompt(value, max));
|
|
49
|
+
const addressSet = (values) => [...new Set(values.map((value) => value.trim().toLowerCase()))].sort().join("\n");
|
|
50
|
+
function listed(values, max = 5) {
|
|
51
|
+
const shown = values.slice(0, max).map((value) => quoted(value, 80));
|
|
52
|
+
return shown.join(", ") + (values.length > max ? ` and ${values.length - max} more` : "");
|
|
53
|
+
}
|
|
54
|
+
const sha256 = (value) => createHash("sha256").update(value).digest("hex");
|
|
55
|
+
/** A digest of a file's text that the question counted (a vCard file to import). */
|
|
56
|
+
export const contentDigest = sha256;
|
|
57
|
+
/** A digest of the content of a draft that is sent, scheduled or deleted: the question and the handler compute it the same way. */
|
|
58
|
+
export function draftApprovalDigest(draft) {
|
|
59
|
+
return sha256(JSON.stringify([
|
|
60
|
+
draft.to, draft.cc, draft.bcc, draft.subject, draft.body, Boolean(draft.isHtml), draft.priority ?? null, draft.replyTo ?? null, draft.from ?? null,
|
|
61
|
+
draft.inReplyTo ?? null, draft.references ?? [],
|
|
62
|
+
(draft.attachments ?? []).map((file) => [file.filename, file.contentType ?? null, file.cid ?? null, file.contentDisposition ?? null, sha256(file.content)]),
|
|
63
|
+
]));
|
|
64
|
+
}
|
|
65
|
+
/** A digest of the changes an approved plan applies (which message, which action, which target). */
|
|
66
|
+
export function planApprovalDigest(items) {
|
|
67
|
+
return sha256(JSON.stringify(items.map((item) => [item.n, item.emailId ?? null, item.action, item.target ?? null])));
|
|
68
|
+
}
|
|
69
|
+
const stable = (value) => JSON.stringify(value, (_, inner) => (isRecord(inner) ? Object.fromEntries(Object.entries(inner).sort(([a], [b]) => a.localeCompare(b))) : inner));
|
|
70
|
+
/** A digest of an automatic reply as it is stored (not when it was written or switched on). */
|
|
71
|
+
export function autoresponderApprovalDigest(rule) {
|
|
72
|
+
const { updatedAt: _updated, activatedAt: _activated, ...rest } = rule;
|
|
73
|
+
return sha256(stable(rest));
|
|
74
|
+
}
|
|
75
|
+
/** A digest of the rule set_rule stores: its name, whether it is on, its conditions and its actions. */
|
|
76
|
+
export const ruleApprovalDigest = (rule) => sha256(stable(rule));
|
|
77
|
+
const APPROVED = Symbol("approved content");
|
|
78
|
+
const LOOKUP_MS = 5_000;
|
|
79
|
+
async function within(work) {
|
|
80
|
+
let timer;
|
|
81
|
+
try {
|
|
82
|
+
return await Promise.race([work(), new Promise((resolve) => { timer = setTimeout(() => resolve(undefined), LOOKUP_MS); })]);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
if (timer)
|
|
89
|
+
clearTimeout(timer);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const SHOWN_MESSAGES = 3;
|
|
93
|
+
const MAX_MESSAGE_CHARS = 1500;
|
|
94
|
+
// These carry a block (the reply text, a rule's conditions and actions) that the person needs to read in full.
|
|
95
|
+
const LONG_QUESTIONS = new Set(["set_autoresponder", "set_rule", "apply_rules"]);
|
|
96
|
+
const MAX_LONG_MESSAGE_CHARS = 2500;
|
|
97
|
+
function whenText(when) {
|
|
98
|
+
if (!isRecord(when))
|
|
99
|
+
return "no condition";
|
|
100
|
+
const parts = [];
|
|
101
|
+
if (strings(when.from).length)
|
|
102
|
+
parts.push(`from ${listed(strings(when.from), 3)}`);
|
|
103
|
+
if (strings(when.subjectContains).length)
|
|
104
|
+
parts.push(`subject contains ${listed(strings(when.subjectContains), 3)}`);
|
|
105
|
+
parts.push(`in ${quoted(when.folder ?? "INBOX", 60)}`);
|
|
106
|
+
if (when.olderThanDays !== undefined)
|
|
107
|
+
parts.push(`older than ${quoted(when.olderThanDays, 10)} days`);
|
|
108
|
+
if (when.hasAttachment !== undefined)
|
|
109
|
+
parts.push(when.hasAttachment === true ? "with an attachment" : "without an attachment");
|
|
110
|
+
if (when.automated !== undefined)
|
|
111
|
+
parts.push(when.automated === true ? "list and automatic mail only" : "mail from people only");
|
|
112
|
+
if (when.unread === true)
|
|
113
|
+
parts.push("unread only");
|
|
114
|
+
return parts.join("; ");
|
|
115
|
+
}
|
|
116
|
+
function actionsText(actions) {
|
|
117
|
+
if (!isRecord(actions))
|
|
118
|
+
return "nothing";
|
|
119
|
+
const parts = [];
|
|
120
|
+
if (strings(actions.forwardTo).length)
|
|
121
|
+
parts.push(`forward to ${listed(strings(actions.forwardTo), 3)}`);
|
|
122
|
+
if (actions.label !== undefined)
|
|
123
|
+
parts.push(`label ${quoted(actions.label, 40)}`);
|
|
124
|
+
if (actions.markRead === true)
|
|
125
|
+
parts.push("mark read");
|
|
126
|
+
if (actions.moveTo !== undefined)
|
|
127
|
+
parts.push(`move to ${quoted(actions.moveTo, 60)}`);
|
|
128
|
+
if (actions.archive === true)
|
|
129
|
+
parts.push("archive");
|
|
130
|
+
if (actions.trash === true)
|
|
131
|
+
parts.push("move to Trash");
|
|
132
|
+
if (actions.delete === true)
|
|
133
|
+
parts.push("delete for good");
|
|
134
|
+
return parts.length ? parts.join("; ") : "nothing";
|
|
135
|
+
}
|
|
136
|
+
/** Whether the automatic reply would also go to someone who is not in the user's contacts (never written to). */
|
|
137
|
+
function answersStrangers(rule) {
|
|
138
|
+
if (!rule.enabled)
|
|
139
|
+
return "no (switched off)";
|
|
140
|
+
const rules = rule.rules ?? [];
|
|
141
|
+
if (!rule.body && !rule.bodies && !rules.some((candidate) => candidate.action !== "skip" && candidate.body))
|
|
142
|
+
return "no (there is no reply text)";
|
|
143
|
+
let conditional = false;
|
|
144
|
+
for (const candidate of rules) {
|
|
145
|
+
if (candidate.known === "yes")
|
|
146
|
+
continue;
|
|
147
|
+
if (!candidate.from?.length && !candidate.subjectContains?.length)
|
|
148
|
+
return candidate.action !== "skip" ? "yes" : conditional ? "only mail matching a rule" : "no";
|
|
149
|
+
if (candidate.action !== "skip")
|
|
150
|
+
conditional = true;
|
|
151
|
+
}
|
|
152
|
+
return "yes";
|
|
153
|
+
}
|
|
154
|
+
function matchText(match) {
|
|
155
|
+
if (!isRecord(match))
|
|
156
|
+
return "none";
|
|
157
|
+
const parts = [];
|
|
158
|
+
if (match.from !== undefined)
|
|
159
|
+
parts.push(`from ${quoted(match.from, 60)}`);
|
|
160
|
+
if (match.subject !== undefined)
|
|
161
|
+
parts.push(`subject contains ${quoted(match.subject, 60)}`);
|
|
162
|
+
if (match.text !== undefined)
|
|
163
|
+
parts.push(`text contains ${quoted(match.text, 60)}`);
|
|
164
|
+
if (match.since !== undefined)
|
|
165
|
+
parts.push(`since ${quoted(match.since, 40)}`);
|
|
166
|
+
if (match.before !== undefined)
|
|
167
|
+
parts.push(`before ${quoted(match.before, 40)}`);
|
|
168
|
+
if (match.isRead !== undefined)
|
|
169
|
+
parts.push(normalizeBoolean(match.isRead, false) ? "read" : "unread");
|
|
170
|
+
if (match.isStarred !== undefined)
|
|
171
|
+
parts.push(normalizeBoolean(match.isStarred, false) ? "starred" : "not starred");
|
|
172
|
+
if (match.sizeLarger !== undefined)
|
|
173
|
+
parts.push(`larger than ${quoted(match.sizeLarger, 12)} bytes`);
|
|
174
|
+
if (match.sizeSmaller !== undefined)
|
|
175
|
+
parts.push(`smaller than ${quoted(match.sizeSmaller, 12)} bytes`);
|
|
176
|
+
return parts.length ? parts.join("; ") : "none (every message in the folder)";
|
|
177
|
+
}
|
|
178
|
+
/** The text the person sees. Every dynamic piece is a quoted, cleaned, single-line value after a fixed label. */
|
|
179
|
+
export async function buildApprovalMessage(name, args, lookups) {
|
|
180
|
+
return (await buildApproval(name, args, lookups)).message;
|
|
181
|
+
}
|
|
182
|
+
async function buildApproval(name, args, lookups) {
|
|
183
|
+
let bound;
|
|
184
|
+
const lines = [`Approve ${name}?`, `Account: ${quoted(lookups.account(args))}`];
|
|
185
|
+
const add = (label, text) => { if (text)
|
|
186
|
+
lines.push(`${label}: ${text}`); };
|
|
187
|
+
const recipients = (label, values) => { const list = strings(values); if (list.length)
|
|
188
|
+
add(label, listed(list)); };
|
|
189
|
+
const message = async (label, id) => {
|
|
190
|
+
if (typeof id !== "string" || !id)
|
|
191
|
+
return;
|
|
192
|
+
const subject = await within(() => lookups.subject(id));
|
|
193
|
+
add(label, `${quoted(id, 80)}${subject === undefined ? "" : ` subject ${quoted(subject)}`}`);
|
|
194
|
+
};
|
|
195
|
+
const messages = async (ids) => {
|
|
196
|
+
add("Messages", String(ids.length));
|
|
197
|
+
for (const id of ids.slice(0, SHOWN_MESSAGES))
|
|
198
|
+
await message("Message", id);
|
|
199
|
+
};
|
|
200
|
+
// How many messages a filter or a folder covers, from the local index, which may lag behind the mailbox.
|
|
201
|
+
const counted = async () => {
|
|
202
|
+
const found = await within(() => lookups.matches(name, args));
|
|
203
|
+
add("Messages matched", found?.count === undefined ? "count unknown (the local index has nothing for this folder)" : `${found.count} (local index, may be out of date)`);
|
|
204
|
+
if (found?.subjects.length)
|
|
205
|
+
add("First subjects (untrusted mail text)", found.subjects.map((subject) => quoted(subject, 60)).join(", "));
|
|
206
|
+
};
|
|
207
|
+
switch (name) {
|
|
208
|
+
case "send_email":
|
|
209
|
+
recipients("To", args.to);
|
|
210
|
+
recipients("Cc", args.cc);
|
|
211
|
+
recipients("Bcc", args.bcc);
|
|
212
|
+
add("Subject", quoted(args.subject));
|
|
213
|
+
add("Send as", typeof args.from === "string" ? quoted(args.from, 80) : undefined);
|
|
214
|
+
if (Array.isArray(args.attachments) && args.attachments.length)
|
|
215
|
+
add("Attachments", String(args.attachments.length));
|
|
216
|
+
break;
|
|
217
|
+
case "send_test_email":
|
|
218
|
+
recipients("To", args.to);
|
|
219
|
+
add("Send as", typeof args.from === "string" ? quoted(args.from, 80) : undefined);
|
|
220
|
+
if (typeof args.customMessage === "string" && args.customMessage)
|
|
221
|
+
add("Message", quoted(args.customMessage, 100));
|
|
222
|
+
break;
|
|
223
|
+
case "reply_to_email":
|
|
224
|
+
case "reply_all_email": {
|
|
225
|
+
await message("Replying to", args.emailId);
|
|
226
|
+
const target = await within(() => lookups.target(name, args));
|
|
227
|
+
if (target) {
|
|
228
|
+
recipients("To", target.to);
|
|
229
|
+
recipients("Cc", target.cc);
|
|
230
|
+
recipients("Bcc", target.bcc);
|
|
231
|
+
// Where answers go can be somewhere else than where the mail came from.
|
|
232
|
+
if (target.replyTo?.length && addressSet(target.replyTo) !== addressSet(target.from ?? []))
|
|
233
|
+
add("Reply-To differs from sender", `Reply-To ${listed(target.replyTo)}, sender ${listed(target.from ?? [])}`);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
add("To", "unknown (the message could not be read)");
|
|
237
|
+
recipients("Extra Cc", args.cc);
|
|
238
|
+
recipients("Extra Bcc", args.bcc);
|
|
239
|
+
}
|
|
240
|
+
add("Send as", typeof args.from === "string" ? quoted(args.from, 80) : undefined);
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
case "forward_email": {
|
|
244
|
+
await message("Forwarding", args.emailId);
|
|
245
|
+
const target = await within(() => lookups.target(name, args));
|
|
246
|
+
recipients("To", target ? target.to : args.to);
|
|
247
|
+
recipients("Cc", target ? target.cc : args.cc);
|
|
248
|
+
recipients("Bcc", target ? target.bcc : args.bcc);
|
|
249
|
+
add("Send as", typeof args.from === "string" ? quoted(args.from, 80) : undefined);
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
case "send_draft":
|
|
253
|
+
case "schedule_draft":
|
|
254
|
+
case "delete_draft": {
|
|
255
|
+
const draftId = typeof args.draftId === "string" ? args.draftId : "";
|
|
256
|
+
const draft = draftId ? await within(() => lookups.draft(draftId)) : undefined;
|
|
257
|
+
bound = { kind: "draft", digest: draft ? draftApprovalDigest(draft) : undefined };
|
|
258
|
+
add("Draft", quoted(draftId, 80));
|
|
259
|
+
if (draft) {
|
|
260
|
+
recipients("To", draft.to);
|
|
261
|
+
recipients("Cc", draft.cc);
|
|
262
|
+
recipients("Bcc", draft.bcc);
|
|
263
|
+
add("Subject", quoted(draft.subject));
|
|
264
|
+
}
|
|
265
|
+
if (name === "schedule_draft")
|
|
266
|
+
add("Send at", quoted(args.sendAt, 40));
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
case "respond_to_invite": {
|
|
270
|
+
await message("Invitation", args.emailId);
|
|
271
|
+
add("Response", quoted(args.response, 40));
|
|
272
|
+
const invite = typeof args.emailId === "string" ? await within(() => lookups.invite(args.emailId)) : undefined;
|
|
273
|
+
if (invite) {
|
|
274
|
+
add("Organiser (from the invitation, untrusted)", invite.organizer ? quoted(invite.organizer, 80) : "unknown");
|
|
275
|
+
add("Event (from the invitation, untrusted)", invite.summary ? quoted(invite.summary, 80) : undefined);
|
|
276
|
+
}
|
|
277
|
+
else
|
|
278
|
+
add("Organiser", "unknown (the invitation could not be read)");
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
case "unsubscribe_sender": {
|
|
282
|
+
await message("Message", args.emailId);
|
|
283
|
+
const info = typeof args.emailId === "string" ? await within(() => lookups.unsubscribe(args.emailId)) : undefined;
|
|
284
|
+
add("Unsubscribe by", !info ? "unknown (the message could not be read)"
|
|
285
|
+
: info.mailto ? `mail to ${quoted(info.mailto, 80)} (from the message, untrusted)`
|
|
286
|
+
: info.host ? `a link on ${quoted(info.host, 80)}, which this server does not open (from the message, untrusted)`
|
|
287
|
+
: "nothing: the message has no List-Unsubscribe header");
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
case "delete_email":
|
|
291
|
+
await message("Message", args.emailId);
|
|
292
|
+
break;
|
|
293
|
+
case "delete_thread":
|
|
294
|
+
await message("Thread of", args.messageId);
|
|
295
|
+
add("Permanently", normalizeBoolean(args.permanent, false) ? "yes" : "no");
|
|
296
|
+
break;
|
|
297
|
+
case "bulk_delete":
|
|
298
|
+
case "batch_email_action": {
|
|
299
|
+
const ids = strings(args.emailIds);
|
|
300
|
+
if (ids.length)
|
|
301
|
+
await messages(ids);
|
|
302
|
+
else if (name === "bulk_delete" && isRecord(args.match)) {
|
|
303
|
+
add("Folder", quoted(args.folder, 80));
|
|
304
|
+
add("Filter", matchText(args.match));
|
|
305
|
+
await counted();
|
|
306
|
+
}
|
|
307
|
+
else
|
|
308
|
+
add("Messages", "chosen by a filter");
|
|
309
|
+
if (name === "batch_email_action")
|
|
310
|
+
add("Action", quoted(args.action, 40));
|
|
311
|
+
else
|
|
312
|
+
add("Permanently", normalizeBoolean(args.permanent, false) ? "yes" : "no");
|
|
313
|
+
break;
|
|
314
|
+
}
|
|
315
|
+
case "apply_thread_action":
|
|
316
|
+
await message("Thread of", args.threadId);
|
|
317
|
+
add("Action", quoted(args.action, 40));
|
|
318
|
+
break;
|
|
319
|
+
case "empty_folder":
|
|
320
|
+
add("Empty folder", quoted(args.folder, 80));
|
|
321
|
+
await counted();
|
|
322
|
+
break;
|
|
323
|
+
case "delete_folder":
|
|
324
|
+
add("Delete folder", quoted(args.path, 80));
|
|
325
|
+
await counted();
|
|
326
|
+
break;
|
|
327
|
+
case "delete_label":
|
|
328
|
+
add("Delete label", quoted(args.name, 80));
|
|
329
|
+
break;
|
|
330
|
+
case "delete_template":
|
|
331
|
+
add("Delete template", quoted(args.id, 80));
|
|
332
|
+
break;
|
|
333
|
+
case "set_rule": {
|
|
334
|
+
const found = await within(() => lookups.rule(args));
|
|
335
|
+
bound = { kind: "rule", digest: found ? ruleApprovalDigest(found.effective) : undefined };
|
|
336
|
+
if (!found) {
|
|
337
|
+
add("Rule", typeof args.name === "string" ? quoted(args.name, 80) : typeof args.id === "string" ? quoted(args.id, 80) : typeof args.proposalId === "string" ? quoted(args.proposalId, 80) : undefined);
|
|
338
|
+
add("Effect", "may forward mail to another address (the stored rule or proposal could not be read)");
|
|
339
|
+
break;
|
|
340
|
+
}
|
|
341
|
+
const { effective } = found;
|
|
342
|
+
add("Rule", effective.name ? quoted(effective.name, 80) : "unnamed");
|
|
343
|
+
if (found.from)
|
|
344
|
+
add("From", `${found.from.kind} ${quoted(found.from.id, 80)}`);
|
|
345
|
+
add("When", whenText(effective.when));
|
|
346
|
+
add("Actions", actionsText(effective.actions));
|
|
347
|
+
if (isRecord(effective.actions) && strings(effective.actions.forwardTo).length)
|
|
348
|
+
add("Forwarding", `at most ${FORWARD_DAILY_LIMIT} messages a day; it sends them by itself without asking each time, only mail that arrives after it is switched on`);
|
|
349
|
+
add("Switched on", effective.enabled ? "yes" : "no");
|
|
350
|
+
break;
|
|
351
|
+
}
|
|
352
|
+
case "set_autoresponder": {
|
|
353
|
+
const rule = await within(() => lookups.autoresponder(args));
|
|
354
|
+
bound = { kind: "autoresponder", digest: rule ? autoresponderApprovalDigest(rule) : undefined };
|
|
355
|
+
if (!rule) {
|
|
356
|
+
add("Effect", "changes the automatic reply, which can send mail by itself (the result could not be worked out)");
|
|
357
|
+
break;
|
|
358
|
+
}
|
|
359
|
+
add("Automatic reply", rule.enabled ? "on" : "off");
|
|
360
|
+
add("Mode", rule.mode ?? "send");
|
|
361
|
+
add("Answers people outside your contacts", answersStrangers(rule));
|
|
362
|
+
add("Reply subject", quoted(rule.subject, 120));
|
|
363
|
+
add("Reply text", rule.body ? quoted(rule.body, 300) : "none");
|
|
364
|
+
for (const [language, text] of Object.entries(rule.bodies ?? {}).slice(0, 5))
|
|
365
|
+
add(`Text in ${cleanForPrompt(language, 10)}`, quoted(text, 100));
|
|
366
|
+
if (rule.startsAt || rule.endsAt)
|
|
367
|
+
add("Window", `from ${rule.startsAt ? quoted(rule.startsAt, 40) : "now"} to ${rule.endsAt ? quoted(rule.endsAt, 40) : "no end"}${rule.timezone ? ` (${quoted(rule.timezone, 40)})` : ""}`);
|
|
368
|
+
if (rule.outsideHours)
|
|
369
|
+
add("Only outside hours", `days ${strings(rule.outsideHours.days).join(",")}, ${quoted(rule.outsideHours.from, 10)} to ${quoted(rule.outsideHours.to, 10)}`);
|
|
370
|
+
add("Limits", `each sender at most once in ${rule.replyEveryDays} days; at most ${rule.dailyLimit ?? 50} a day`);
|
|
371
|
+
if (rule.outgoingNote)
|
|
372
|
+
add("Note added to every mail sent", quoted(rule.outgoingNote, 100));
|
|
373
|
+
const matchRules = rule.rules ?? [];
|
|
374
|
+
if (matchRules.length)
|
|
375
|
+
add("Rules", String(matchRules.length));
|
|
376
|
+
matchRules.slice(0, 5).forEach((candidate, index) => {
|
|
377
|
+
const parts = [candidate.action];
|
|
378
|
+
if (candidate.from?.length)
|
|
379
|
+
parts.push(`from ${listed(candidate.from, 3)}`);
|
|
380
|
+
if (candidate.subjectContains?.length)
|
|
381
|
+
parts.push(`subject contains ${listed(candidate.subjectContains, 3)}`);
|
|
382
|
+
if (candidate.known)
|
|
383
|
+
parts.push(candidate.known === "yes" ? "people you have written to" : "people you have not written to");
|
|
384
|
+
add(`Rule ${index + 1}`, `${quoted(candidate.name ?? "", 40)} ${parts.join(", ")}`);
|
|
385
|
+
});
|
|
386
|
+
break;
|
|
387
|
+
}
|
|
388
|
+
case "apply_rules": {
|
|
389
|
+
add("Rule", typeof args.ruleId === "string" ? quoted(args.ruleId, 80) : "all enabled rules");
|
|
390
|
+
const plan = await within(() => lookups.applyPlan(args));
|
|
391
|
+
if (!plan) {
|
|
392
|
+
add("Effect", "applies them to the mailbox now (the matches could not be counted)");
|
|
393
|
+
break;
|
|
394
|
+
}
|
|
395
|
+
add("Messages matched", String(plan.total));
|
|
396
|
+
if (plan.total > plan.limit)
|
|
397
|
+
add("This run covers", `the first ${plan.limit}`);
|
|
398
|
+
for (const [index, rule] of plan.rules.slice(0, 5).entries())
|
|
399
|
+
add(`Rule ${index + 1}`, `${quoted(rule.name, 40)} matches ${rule.matches} messages: ${actionsText(rule.actions)}`);
|
|
400
|
+
break;
|
|
401
|
+
}
|
|
402
|
+
case "set_contact": {
|
|
403
|
+
const clearable = (label, value) => { if (value !== undefined)
|
|
404
|
+
add(label, value === null || value === "" ? "cleared" : quoted(value, 80)); };
|
|
405
|
+
add("Address", quoted(args.address, 80));
|
|
406
|
+
clearable("Display name", args.displayName);
|
|
407
|
+
for (const [label, tags] of [["Add tags", strings(args.addTags)], ["Remove tags", strings(args.removeTags)]])
|
|
408
|
+
if (tags.length)
|
|
409
|
+
add(label, listed(tags));
|
|
410
|
+
if (typeof args.mergeWith === "string" && args.mergeWith.trim())
|
|
411
|
+
add("Merge with", quoted(args.mergeWith, 80));
|
|
412
|
+
if (normalizeBoolean(args.unmerge, false))
|
|
413
|
+
add("Unmerge", "yes");
|
|
414
|
+
clearable("Notes", args.notes);
|
|
415
|
+
break;
|
|
416
|
+
}
|
|
417
|
+
case "import_contacts": {
|
|
418
|
+
const path = typeof args.path === "string" ? args.path : "";
|
|
419
|
+
const file = path ? await within(() => lookups.vcard(path)) : undefined;
|
|
420
|
+
bound = { kind: "vcard", digest: file?.digest };
|
|
421
|
+
add("File", quoted(basename(path), 80));
|
|
422
|
+
add("Cards", file ? String(file.cards) : "unknown (the file could not be read)");
|
|
423
|
+
break;
|
|
424
|
+
}
|
|
425
|
+
case "approve_plan": {
|
|
426
|
+
const planId = typeof args.planId === "string" ? args.planId : "";
|
|
427
|
+
add("Plan", quoted(planId, 80));
|
|
428
|
+
const items = planId ? await within(() => lookups.plan(planId, args)) : undefined;
|
|
429
|
+
bound = { kind: "plan", digest: items ? planApprovalDigest(items) : undefined };
|
|
430
|
+
if (items) {
|
|
431
|
+
add("Changes", String(items.length));
|
|
432
|
+
for (const item of items.slice(0, SHOWN_MESSAGES))
|
|
433
|
+
add("Change", `${quoted(item.action, 40)} ${quoted(item.subject)}`);
|
|
434
|
+
}
|
|
435
|
+
break;
|
|
436
|
+
}
|
|
437
|
+
default: {
|
|
438
|
+
// update_message_flags, bulk_update_flags, flag_thread: only reached when \Deleted is added.
|
|
439
|
+
add("Flags to add", listed(strings(args.flagsToAdd)));
|
|
440
|
+
if (typeof args.emailId === "string")
|
|
441
|
+
await message("Message", args.emailId);
|
|
442
|
+
else if (typeof args.messageId === "string")
|
|
443
|
+
await message("Thread of", args.messageId);
|
|
444
|
+
else if (strings(args.emailIds).length)
|
|
445
|
+
await messages(strings(args.emailIds));
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
const text = lines.join("\n");
|
|
449
|
+
const cap = LONG_QUESTIONS.has(name) ? MAX_LONG_MESSAGE_CHARS : MAX_MESSAGE_CHARS;
|
|
450
|
+
return { message: text.length > cap ? `${text.slice(0, cap - 1)}…` : text, bound };
|
|
451
|
+
}
|
|
452
|
+
export function clientCanElicit(server) {
|
|
453
|
+
const elicitation = server.getClientCapabilities()?.elicitation;
|
|
454
|
+
// An empty capability object means form support (the spec's backwards-compatible default).
|
|
455
|
+
return Boolean(elicitation) && (elicitation?.form !== undefined || elicitation?.url === undefined);
|
|
456
|
+
}
|
|
457
|
+
const refuse = (text) => new McpError(ErrorCode.InvalidRequest, `${text} Do not retry unless the user asks for it.`);
|
|
458
|
+
/**
|
|
459
|
+
* Called by a handler that acts on stored content (a draft, a plan) with the content as it reads it now. When the person was
|
|
460
|
+
* asked about this call, it must be what they were shown: anything else (the draft edited by a parallel update_draft, a plan
|
|
461
|
+
* rewritten, content that could not be shown) is refused before anything is sent, scheduled, deleted or applied.
|
|
462
|
+
* A call that was not asked about (approval off, a delegation grant) carries nothing and passes.
|
|
463
|
+
*/
|
|
464
|
+
export function assertApprovedContentUnchanged(args, kind, current, name) {
|
|
465
|
+
const bound = args[APPROVED];
|
|
466
|
+
if (!bound || bound.kind !== kind || bound.digest === current)
|
|
467
|
+
return;
|
|
468
|
+
throw refuse(`Not approved: the ${kind} changed after you were asked (or could not be shown to you), so ${name} did not run. Nothing was done. Look at it again and ask the user again.`);
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* The hook in front of every tool call. `off` does nothing at all. In `elicit` and `require` the model's own `confirmed` is
|
|
472
|
+
* dropped, and for a call that needs approval the person is asked; their yes sets `confirmed` for the gate behind this one.
|
|
473
|
+
* `elicit` on a client without elicitation changes nothing (today's behaviour); `require` refuses such a call.
|
|
474
|
+
*/
|
|
475
|
+
export async function applyApprovalPolicy(options) {
|
|
476
|
+
const { mode, server, name, args } = options;
|
|
477
|
+
if (mode === "off")
|
|
478
|
+
return;
|
|
479
|
+
const capable = clientCanElicit(server);
|
|
480
|
+
if (mode === "elicit" && !capable)
|
|
481
|
+
return;
|
|
482
|
+
delete args.confirmed;
|
|
483
|
+
if (!needsApproval(name, args, options.declared))
|
|
484
|
+
return;
|
|
485
|
+
if (!capable) {
|
|
486
|
+
throw refuse(`${name} needs the user's approval and PROTONMAIL_APPROVAL=require, but this client does not support MCP elicitation, so the user cannot be asked. Use a client that supports it, or set PROTONMAIL_APPROVAL=elicit (or off) to go back to confirmed: true.`);
|
|
487
|
+
}
|
|
488
|
+
const seconds = options.timeoutSeconds ?? DEFAULT_APPROVAL_TIMEOUT_SECONDS;
|
|
489
|
+
const { message, bound } = await buildApproval(name, args, options.lookups);
|
|
490
|
+
let answer;
|
|
491
|
+
try {
|
|
492
|
+
answer = await server.elicitInput({ message, requestedSchema: { type: "object", properties: {} } }, { timeout: seconds * 1000 });
|
|
493
|
+
}
|
|
494
|
+
catch (error) {
|
|
495
|
+
if (error instanceof McpError && error.code === ErrorCode.RequestTimeout)
|
|
496
|
+
throw refuse(`Not approved: the user did not answer within ${seconds} s, so ${name} was not run.`);
|
|
497
|
+
throw refuse(`Not approved: the user could not be asked (${error instanceof Error ? cleanForPrompt(error.message, 200) : "unknown error"}), so ${name} was not run.`);
|
|
498
|
+
}
|
|
499
|
+
if (answer.action === "accept") {
|
|
500
|
+
args.confirmed = true;
|
|
501
|
+
if (bound)
|
|
502
|
+
args[APPROVED] = bound;
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
throw refuse(answer.action === "decline" ? `Not approved: the user declined ${name}.` : `Not approved: the user dismissed the approval question for ${name}.`);
|
|
506
|
+
}
|
|
507
|
+
//# sourceMappingURL=approval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval.js","sourceRoot":"","sources":["../../src/utils/approval.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function writeFileAtomic(path: string, data: string): Promise<void>;
|
|
1
|
+
export declare function writeFileAtomic(path: string, data: string | Uint8Array): Promise<void>;
|
|
2
2
|
//# sourceMappingURL=atomic-write.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atomic-write.d.ts","sourceRoot":"","sources":["../../src/utils/atomic-write.ts"],"names":[],"mappings":"AASA,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"atomic-write.d.ts","sourceRoot":"","sources":["../../src/utils/atomic-write.ts"],"names":[],"mappings":"AASA,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB5F"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { open, rename } from "node:fs/promises";
|
|
1
|
+
import { open, rename, rm } from "node:fs/promises";
|
|
2
2
|
import { dirname } from "node:path";
|
|
3
3
|
// Replaces `path` with `data` so that a crash or power loss leaves either the old content or the new,
|
|
4
4
|
// never an empty or half-written file. Writing to a temp file and renaming is atomic with respect to other
|
|
@@ -10,13 +10,20 @@ export async function writeFileAtomic(path, data) {
|
|
|
10
10
|
const tempPath = `${path}.tmp`;
|
|
11
11
|
const handle = await open(tempPath, "w", 0o600);
|
|
12
12
|
try {
|
|
13
|
-
await handle.writeFile(data, "utf8");
|
|
13
|
+
await (typeof data === "string" ? handle.writeFile(data, "utf8") : handle.writeFile(data));
|
|
14
14
|
await handle.sync();
|
|
15
15
|
}
|
|
16
16
|
finally {
|
|
17
17
|
await handle.close();
|
|
18
18
|
}
|
|
19
|
-
|
|
19
|
+
try {
|
|
20
|
+
await rename(tempPath, path);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
// e.g. a directory in the place of `path`: do not leave the temp file behind on every attempt.
|
|
24
|
+
await rm(tempPath, { force: true }).catch(() => { });
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
20
27
|
await syncDirectory(dirname(path));
|
|
21
28
|
}
|
|
22
29
|
async function syncDirectory(directory) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atomic-write.js","sourceRoot":"","sources":["../../src/utils/atomic-write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"atomic-write.js","sourceRoot":"","sources":["../../src/utils/atomic-write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,sGAAsG;AACtG,2GAA2G;AAC3G,0GAA0G;AAC1G,0GAA0G;AAC1G,wGAAwG;AACxG,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,IAAyB;IAC3E,MAAM,QAAQ,GAAG,GAAG,IAAI,MAAM,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3F,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,+FAA+F;QAC/F,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACpD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,SAAiB;IAC5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,2GAA2G;IAC7G,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commitment-phrases.d.ts","sourceRoot":"","sources":["../../src/utils/commitment-phrases.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;
|
|
1
|
+
{"version":3,"file":"commitment-phrases.d.ts","sourceRoot":"","sources":["../../src/utils/commitment-phrases.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAyED,mHAAmH;AACnH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAkCxE;AAED,+FAA+F;AAC/F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,SAAI,GAAG,mBAAmB,EAAE,CAe1F"}
|