run402 3.3.1 → 3.3.3
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 +2 -0
- package/lib/billing.mjs +6 -4
- package/lib/email.mjs +142 -8
- package/lib/notifications.mjs +5 -5
- package/lib/org.mjs +14 -7
- package/lib/transfer.mjs +23 -16
- package/package.json +1 -1
- package/sdk/dist/namespaces/admin.d.ts +4 -6
- package/sdk/dist/namespaces/admin.d.ts.map +1 -1
- package/sdk/dist/namespaces/admin.js +2 -2
- package/sdk/dist/namespaces/admin.js.map +1 -1
- package/sdk/dist/namespaces/billing.d.ts +19 -3
- package/sdk/dist/namespaces/billing.d.ts.map +1 -1
- package/sdk/dist/namespaces/billing.js +20 -10
- package/sdk/dist/namespaces/billing.js.map +1 -1
- package/sdk/dist/namespaces/cache.d.ts +5 -5
- package/sdk/dist/namespaces/cache.d.ts.map +1 -1
- package/sdk/dist/namespaces/email.d.ts +62 -14
- package/sdk/dist/namespaces/email.d.ts.map +1 -1
- package/sdk/dist/namespaces/email.js +189 -23
- package/sdk/dist/namespaces/email.js.map +1 -1
- package/sdk/dist/namespaces/operator-session.d.ts +6 -0
- package/sdk/dist/namespaces/operator-session.d.ts.map +1 -1
- package/sdk/dist/namespaces/operator-session.js.map +1 -1
- package/sdk/dist/namespaces/org.d.ts +5 -3
- package/sdk/dist/namespaces/org.d.ts.map +1 -1
- package/sdk/dist/namespaces/org.js +10 -2
- package/sdk/dist/namespaces/org.js.map +1 -1
- package/sdk/dist/namespaces/org.types.d.ts +27 -14
- package/sdk/dist/namespaces/org.types.d.ts.map +1 -1
- package/sdk/dist/namespaces/transfers.d.ts +10 -3
- package/sdk/dist/namespaces/transfers.d.ts.map +1 -1
- package/sdk/dist/namespaces/transfers.js +4 -6
- package/sdk/dist/namespaces/transfers.js.map +1 -1
- package/sdk/dist/scoped.d.ts +3 -1
- package/sdk/dist/scoped.d.ts.map +1 -1
- package/sdk/dist/scoped.js +6 -0
- package/sdk/dist/scoped.js.map +1 -1
|
@@ -130,29 +130,39 @@ export class Billing {
|
|
|
130
130
|
async lookupOrganization(identifier) {
|
|
131
131
|
return resolveOrganizationDetail(this.client, identifier, "looking up organization");
|
|
132
132
|
}
|
|
133
|
-
/**
|
|
134
|
-
|
|
135
|
-
|
|
133
|
+
/**
|
|
134
|
+
* Fetch billing history by organization id (UUID), wallet, or email. Pass
|
|
135
|
+
* `{ limit, after }` to page; `after` is the opaque keyset cursor
|
|
136
|
+
* (`next_cursor` from a prior page).
|
|
137
|
+
*/
|
|
138
|
+
async history(identifier, opts = {}) {
|
|
139
|
+
return this.getHistory(identifier, opts);
|
|
136
140
|
}
|
|
137
141
|
/**
|
|
138
142
|
* Fetch ledger history for a organization. History is keyed by organization id
|
|
139
143
|
* (UUID): a wallet/email identifier is first resolved to its organization via the
|
|
140
144
|
* lookup, then `GET /orgs/v1/:org_id/billing/history` is read.
|
|
141
145
|
* Requires SIWX from a wallet linked to the organization, or an admin key.
|
|
146
|
+
* Pass `{ limit, after }` to page; `after` is the opaque keyset cursor
|
|
147
|
+
* (`next_cursor` from a prior page). Returns `{ org_id, entries, has_more,
|
|
148
|
+
* next_cursor }`.
|
|
142
149
|
*/
|
|
143
|
-
async getHistory(identifier,
|
|
144
|
-
if (limit !== undefined) {
|
|
145
|
-
assertPositiveSafeInteger(limit, "limit", "fetching billing history");
|
|
150
|
+
async getHistory(identifier, opts = {}) {
|
|
151
|
+
if (opts.limit !== undefined) {
|
|
152
|
+
assertPositiveSafeInteger(opts.limit, "limit", "fetching billing history");
|
|
146
153
|
}
|
|
147
154
|
const id = classifyBillingIdentifier(identifier, "fetching billing history");
|
|
148
155
|
const organizationId = id.kind === "org_id"
|
|
149
156
|
? id.value
|
|
150
157
|
: (await fetchOrganizationByLookup(this.client, id.kind, id.value, "fetching billing history"))
|
|
151
158
|
.org_id;
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
159
|
+
const params = new URLSearchParams();
|
|
160
|
+
if (opts.limit !== undefined)
|
|
161
|
+
params.set("limit", String(opts.limit));
|
|
162
|
+
if (opts.after !== undefined)
|
|
163
|
+
params.set("after", opts.after);
|
|
164
|
+
const query = params.toString();
|
|
165
|
+
const path = `/orgs/v1/${encodeURIComponent(organizationId)}/billing/history${query ? `?${query}` : ""}`;
|
|
156
166
|
return this.client.request(path, {
|
|
157
167
|
context: "fetching billing history",
|
|
158
168
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/namespaces/billing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/namespaces/billing.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,11 +48,11 @@ export interface CacheInspectResult {
|
|
|
48
48
|
search?: string;
|
|
49
49
|
method?: string;
|
|
50
50
|
locale?: string;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
51
|
+
release_id?: string;
|
|
52
|
+
cached_at?: string;
|
|
53
|
+
expires_at?: string;
|
|
54
|
+
written_under_generation?: string;
|
|
55
|
+
content_sha256?: string;
|
|
56
56
|
headers?: Record<string, string | string[]>;
|
|
57
57
|
}
|
|
58
58
|
export interface CacheInvalidatePrefixOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/namespaces/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,MAAM,WAAW,qBAAqB;IACpC,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB;;0CAEsC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB;oCACgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,mBAAmB;IAClC,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC;4DACwD;IACxD,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/namespaces/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,MAAM,WAAW,qBAAqB;IACpC,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB;;0CAEsC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB;oCACgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,mBAAmB;IAClC,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC;4DACwD;IACxD,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,KAAK;IACJ,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE3C;;;;;;OAMG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAanE;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,4BAA4B,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAkB1F;;;;OAIG;IACG,aAAa,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAWpF;;;OAGG;IACG,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAS/E;;;;;;OAMG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAajG"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `email` namespace — project mailboxes (send / list / get / raw /
|
|
3
|
-
* and mailbox webhooks.
|
|
4
|
-
* via the provider cache, falling back to a discovery GET when absent.
|
|
2
|
+
* `email` namespace — project mailboxes (defaults, send / list / get / raw /
|
|
3
|
+
* delete) and mailbox webhooks.
|
|
5
4
|
*/
|
|
6
5
|
import type { Client } from "../kernel.js";
|
|
7
6
|
declare const MESSAGE_DIRECTIONS: readonly ["inbound", "outbound"];
|
|
@@ -20,12 +19,46 @@ export interface MailboxRecord {
|
|
|
20
19
|
unique_recipients: number;
|
|
21
20
|
created_at: string;
|
|
22
21
|
updated_at: string;
|
|
22
|
+
/** True when this mailbox is configured as the project's outbound default. */
|
|
23
|
+
is_default_outbound?: boolean;
|
|
24
|
+
/** True when this mailbox is configured as the auth/session email sender. */
|
|
25
|
+
is_auth_sender?: boolean;
|
|
26
|
+
/** Whether the mailbox can currently send outbound mail. */
|
|
27
|
+
can_send?: boolean;
|
|
28
|
+
/** Present when `can_send` is false, e.g. domain verification or suspension. */
|
|
29
|
+
send_blocked_reason?: string | null;
|
|
30
|
+
/** Shared run402 domain vs a project-owned sender domain. Future strings are valid. */
|
|
31
|
+
domain_kind?: string;
|
|
23
32
|
}
|
|
24
|
-
export
|
|
33
|
+
export interface MailboxSettings {
|
|
34
|
+
default_outbound_mailbox_id: string | null;
|
|
35
|
+
auth_sender_mailbox_id: string | null;
|
|
36
|
+
}
|
|
37
|
+
export interface MailboxNextAction {
|
|
38
|
+
type?: string;
|
|
39
|
+
action?: string;
|
|
40
|
+
method?: string;
|
|
41
|
+
path?: string;
|
|
42
|
+
auth?: string;
|
|
43
|
+
why?: string;
|
|
44
|
+
command?: string;
|
|
45
|
+
[key: string]: unknown;
|
|
46
|
+
}
|
|
47
|
+
export interface MailboxSelectionEnvelope {
|
|
48
|
+
mailbox_settings?: MailboxSettings;
|
|
49
|
+
next_actions?: MailboxNextAction[];
|
|
50
|
+
}
|
|
51
|
+
export type CreateMailboxResult = MailboxRecord & MailboxSelectionEnvelope;
|
|
25
52
|
export type MailboxInfo = MailboxRecord;
|
|
26
|
-
export interface
|
|
53
|
+
export interface MailboxListResult extends MailboxSelectionEnvelope {
|
|
27
54
|
mailboxes: MailboxRecord[];
|
|
28
55
|
}
|
|
56
|
+
export type MailboxListResponse = MailboxListResult;
|
|
57
|
+
export interface SetMailboxDefaultsOptions {
|
|
58
|
+
default_outbound_mailbox_id?: string | null;
|
|
59
|
+
auth_sender_mailbox_id?: string | null;
|
|
60
|
+
}
|
|
61
|
+
export type SetMailboxDefaultsResult = MailboxListResult;
|
|
29
62
|
export interface DeleteMailboxResult {
|
|
30
63
|
mailbox_id: string;
|
|
31
64
|
address: string;
|
|
@@ -61,9 +94,9 @@ export interface SendEmailOptions {
|
|
|
61
94
|
attachments?: EmailAttachment[];
|
|
62
95
|
in_reply_to?: string;
|
|
63
96
|
/**
|
|
64
|
-
* Target mailbox (slug or `mbx_…` id)
|
|
65
|
-
*
|
|
66
|
-
*
|
|
97
|
+
* Target mailbox (slug or `mbx_…` id). Omit to use the configured
|
|
98
|
+
* `default_outbound_mailbox_id` when the gateway returns mailbox settings.
|
|
99
|
+
* Missing or invalid defaults surface typed repair errors.
|
|
67
100
|
*/
|
|
68
101
|
mailbox?: MailboxSelector;
|
|
69
102
|
}
|
|
@@ -78,6 +111,10 @@ export interface SendEmailResult {
|
|
|
78
111
|
template: string | null;
|
|
79
112
|
subject: string | null;
|
|
80
113
|
sent_at: string;
|
|
114
|
+
/** The actual mailbox used for the send, echoed by the gateway. */
|
|
115
|
+
mailbox_id?: string;
|
|
116
|
+
/** The actual From address used for the send, echoed by the gateway. */
|
|
117
|
+
from_address?: string;
|
|
81
118
|
}
|
|
82
119
|
export interface EmailSummary {
|
|
83
120
|
id: string;
|
|
@@ -212,16 +249,20 @@ export declare class Email {
|
|
|
212
249
|
* - `selector` is a mailbox id (`mbx_…`) → used directly; the gateway 403s
|
|
213
250
|
* if the id belongs to a different project, so no list call is needed.
|
|
214
251
|
* - `selector` is a slug → the project's mailboxes are listed and matched.
|
|
215
|
-
* - `selector` omitted
|
|
216
|
-
*
|
|
217
|
-
*
|
|
252
|
+
* - `selector` omitted for sends → use the configured
|
|
253
|
+
* `default_outbound_mailbox_id`. When the gateway returns
|
|
254
|
+
* `mailbox_settings` and no default is set, throw
|
|
255
|
+
* `DEFAULT_MAILBOX_REQUIRED`; do not silently pick the first/single row.
|
|
256
|
+
* - `selector` omitted for reads/webhooks → require a unique mailbox, as
|
|
257
|
+
* before. This keeps non-send flows from guessing that the outbound
|
|
258
|
+
* default is also the intended read/webhook target.
|
|
218
259
|
*
|
|
219
260
|
* The cached `mailbox_id` is intentionally NOT used to resolve when a
|
|
220
261
|
* selector is omitted — trusting it would silently target an arbitrary
|
|
221
|
-
* mailbox on a multi-mailbox project.
|
|
222
|
-
* cache, refreshed only on the single-mailbox path.
|
|
262
|
+
* mailbox on a multi-mailbox project.
|
|
223
263
|
*/
|
|
224
264
|
private resolveMailbox;
|
|
265
|
+
private pickDefaultOutboundMailbox;
|
|
225
266
|
/**
|
|
226
267
|
* Choose a mailbox from a project's list given an optional selector.
|
|
227
268
|
* `selector` matches by exact mailbox id or slug. With no selector: 0 →
|
|
@@ -231,7 +272,14 @@ export declare class Email {
|
|
|
231
272
|
private pickMailbox;
|
|
232
273
|
/** Best-effort refresh of the single-mailbox convenience cache. */
|
|
233
274
|
private cacheMailbox;
|
|
234
|
-
private
|
|
275
|
+
private listMailboxEnvelope;
|
|
276
|
+
/** List project mailboxes plus default-role settings and gateway repair hints. */
|
|
277
|
+
listMailboxes(projectId: string): Promise<MailboxListResult>;
|
|
278
|
+
/**
|
|
279
|
+
* Configure the project's mailbox defaults. Values are mailbox ids
|
|
280
|
+
* (`mbx_…`) or `null` to clear when the gateway allows clearing.
|
|
281
|
+
*/
|
|
282
|
+
setMailboxDefaults(projectId: string, opts: SetMailboxDefaultsOptions): Promise<SetMailboxDefaultsResult>;
|
|
235
283
|
/**
|
|
236
284
|
* Create a mailbox for a project.
|
|
237
285
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/namespaces/email.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/namespaces/email.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAY3C,QAAA,MAAM,kBAAkB,kCAAmC,CAAC;AAC5D,QAAA,MAAM,iBAAiB,oEAAqE,CAAC;AAE7F,4EAA4E;AAC5E,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AACnE,gFAAgF;AAChF,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvE,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,uFAAuF;IACvF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,gBAAgB,CAAC,EAAE,eAAe,CAAC;IACnC,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACpC;AAED,MAAM,MAAM,mBAAmB,GAAG,aAAa,GAAG,wBAAwB,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG,aAAa,CAAC;AAExC,MAAM,WAAW,iBAAkB,SAAQ,wBAAwB;IACjE,SAAS,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,MAAM,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAEpD,MAAM,WAAW,yBAAyB;IACxC,2BAA2B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,MAAM,wBAAwB,GAAG,iBAAiB,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAAG,YAAY,GAAG,cAAc,CAAC;AAE7E,6FAA6F;AAC7F,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC;AAErC,wGAAwG;AACxG,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,4FAA4F;AAC5F,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,sFAAsF;AACtF,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC;CACjD;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,iFAAiF;IACjF,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,qBAAqB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,iFAAiF;IACjF,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,iFAAiF;IACjF,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,sBAAsB,EAAE,CAAC;IACrC,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,+EAA+E;IAC/E,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,sBAAsB,CAAC;CAClC;AAED,qBAAa,QAAQ;IAEjB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc;gBADd,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,CAC/B,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,eAAe,KACvB,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAGlD;;;;OAIG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAmB3G,kFAAkF;IAC5E,eAAe,CACnB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,qBAAqB,CAAC;IAa3B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAWzF,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,oBAAyB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAQxF,GAAG,CACP,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,qBAAqB,CAAC;IAY3B,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,qBAAqB,CAAC;IAwB3B,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC;CASjB;AAED,qBAAa,KAAK;IAOJ,OAAO,CAAC,QAAQ,CAAC,MAAM;IANnC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACnF,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IACxF,QAAQ,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IACtF,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;gBAEnE,MAAM,EAAE,MAAM;IAQ3C;;;;;;;;;;;;;;;;;OAiBG;YACW,cAAc;IAsB5B,OAAO,CAAC,0BAA0B;IA+DlC;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAqCnB,mEAAmE;YACrD,YAAY;YAaZ,mBAAmB;IAYjC,kFAAkF;IAC5E,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAMlE;;;OAGG;IACG,kBAAkB,CACtB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,wBAAwB,CAAC;IA+BpC;;;;;;;;OAQG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAgClF,+DAA+D;IACzD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAkE/E,8CAA8C;IACxC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAqBpF,yDAAyD;IACnD,GAAG,CACP,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,WAAW,CAAC;IASvB;;;OAGG;IACG,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,cAAc,CAAC;IAwB1B;;;;OAIG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;IASrF;;;;;OAKG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAwCjG"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `email` namespace — project mailboxes (send / list / get / raw /
|
|
3
|
-
* and mailbox webhooks.
|
|
4
|
-
* via the provider cache, falling back to a discovery GET when absent.
|
|
2
|
+
* `email` namespace — project mailboxes (defaults, send / list / get / raw /
|
|
3
|
+
* delete) and mailbox webhooks.
|
|
5
4
|
*/
|
|
6
5
|
import { ApiError, LocalError, ProjectNotFound } from "../errors.js";
|
|
7
6
|
import { assertEmailAddress, assertHttpUrl, assertNonEmptyString, assertPositiveSafeInteger, assertStringInSet, } from "../validation.js";
|
|
@@ -127,28 +126,87 @@ export class Email {
|
|
|
127
126
|
* - `selector` is a mailbox id (`mbx_…`) → used directly; the gateway 403s
|
|
128
127
|
* if the id belongs to a different project, so no list call is needed.
|
|
129
128
|
* - `selector` is a slug → the project's mailboxes are listed and matched.
|
|
130
|
-
* - `selector` omitted
|
|
131
|
-
*
|
|
132
|
-
*
|
|
129
|
+
* - `selector` omitted for sends → use the configured
|
|
130
|
+
* `default_outbound_mailbox_id`. When the gateway returns
|
|
131
|
+
* `mailbox_settings` and no default is set, throw
|
|
132
|
+
* `DEFAULT_MAILBOX_REQUIRED`; do not silently pick the first/single row.
|
|
133
|
+
* - `selector` omitted for reads/webhooks → require a unique mailbox, as
|
|
134
|
+
* before. This keeps non-send flows from guessing that the outbound
|
|
135
|
+
* default is also the intended read/webhook target.
|
|
133
136
|
*
|
|
134
137
|
* The cached `mailbox_id` is intentionally NOT used to resolve when a
|
|
135
138
|
* selector is omitted — trusting it would silently target an arbitrary
|
|
136
|
-
* mailbox on a multi-mailbox project.
|
|
137
|
-
* cache, refreshed only on the single-mailbox path.
|
|
139
|
+
* mailbox on a multi-mailbox project.
|
|
138
140
|
*/
|
|
139
|
-
async resolveMailbox(projectId, selector) {
|
|
141
|
+
async resolveMailbox(projectId, selector, mode = "unique", context = "resolving mailbox") {
|
|
140
142
|
const project = await this.client.getProject(projectId);
|
|
141
143
|
if (!project)
|
|
142
|
-
throw new ProjectNotFound(projectId,
|
|
144
|
+
throw new ProjectNotFound(projectId, context);
|
|
143
145
|
if (selector && /^mbx_/.test(selector)) {
|
|
144
146
|
return { id: selector, serviceKey: project.service_key };
|
|
145
147
|
}
|
|
146
|
-
const list = await this.
|
|
147
|
-
const mb =
|
|
148
|
-
|
|
148
|
+
const list = await this.listMailboxEnvelope(project.service_key);
|
|
149
|
+
const mb = mode === "default_outbound" && !selector
|
|
150
|
+
? this.pickDefaultOutboundMailbox(projectId, list, context)
|
|
151
|
+
: this.pickMailbox(list.mailboxes, selector, context);
|
|
152
|
+
if (!selector && list.mailboxes.length === 1)
|
|
149
153
|
await this.cacheMailbox(projectId, mb);
|
|
150
154
|
return { id: mb.mailbox_id, serviceKey: project.service_key };
|
|
151
155
|
}
|
|
156
|
+
pickDefaultOutboundMailbox(projectId, envelope, context) {
|
|
157
|
+
const defaultId = envelope.mailbox_settings?.default_outbound_mailbox_id ??
|
|
158
|
+
envelope.mailboxes.find((m) => m.is_default_outbound)?.mailbox_id ??
|
|
159
|
+
null;
|
|
160
|
+
if (defaultId) {
|
|
161
|
+
const mb = envelope.mailboxes.find((m) => m.mailbox_id === defaultId);
|
|
162
|
+
if (!mb) {
|
|
163
|
+
throw mailboxConfigError({
|
|
164
|
+
status: 409,
|
|
165
|
+
code: "DEFAULT_MAILBOX_INVALID",
|
|
166
|
+
message: `Configured default outbound mailbox ${defaultId} is not available. Set a valid default before sending email.`,
|
|
167
|
+
context,
|
|
168
|
+
projectId,
|
|
169
|
+
mailboxes: envelope.mailboxes,
|
|
170
|
+
settings: envelope.mailbox_settings,
|
|
171
|
+
nextActions: envelope.next_actions,
|
|
172
|
+
details: { default_outbound_mailbox_id: defaultId, reason: "missing_from_mailbox_list" },
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
if (mb.can_send === false) {
|
|
176
|
+
throw mailboxConfigError({
|
|
177
|
+
status: 409,
|
|
178
|
+
code: "DEFAULT_MAILBOX_INVALID",
|
|
179
|
+
message: `Configured default outbound mailbox ${defaultId} cannot send email: ${mb.send_blocked_reason ?? "blocked"}.`,
|
|
180
|
+
context,
|
|
181
|
+
projectId,
|
|
182
|
+
mailboxes: envelope.mailboxes,
|
|
183
|
+
settings: envelope.mailbox_settings,
|
|
184
|
+
nextActions: envelope.next_actions,
|
|
185
|
+
details: {
|
|
186
|
+
default_outbound_mailbox_id: defaultId,
|
|
187
|
+
reason: mb.send_blocked_reason ?? "send_blocked",
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
return mb;
|
|
192
|
+
}
|
|
193
|
+
// Old gateways did not return mailbox_settings. Keep the legacy
|
|
194
|
+
// single-mailbox convenience only while that field is absent, so tolerant
|
|
195
|
+
// public clients can ship before the stricter gateway rollout.
|
|
196
|
+
if (envelope.mailbox_settings === undefined) {
|
|
197
|
+
return this.pickMailbox(envelope.mailboxes, undefined, context);
|
|
198
|
+
}
|
|
199
|
+
throw mailboxConfigError({
|
|
200
|
+
status: envelope.mailboxes.length > 1 ? 409 : 400,
|
|
201
|
+
code: "DEFAULT_MAILBOX_REQUIRED",
|
|
202
|
+
message: "Set default_outbound_mailbox_id before sending email without an explicit mailbox.",
|
|
203
|
+
context,
|
|
204
|
+
projectId,
|
|
205
|
+
mailboxes: envelope.mailboxes,
|
|
206
|
+
settings: envelope.mailbox_settings,
|
|
207
|
+
nextActions: envelope.next_actions,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
152
210
|
/**
|
|
153
211
|
* Choose a mailbox from a project's list given an optional selector.
|
|
154
212
|
* `selector` matches by exact mailbox id or slug. With no selector: 0 →
|
|
@@ -187,12 +245,51 @@ export class Email {
|
|
|
187
245
|
// best-effort cache — ignore failures
|
|
188
246
|
}
|
|
189
247
|
}
|
|
190
|
-
async
|
|
248
|
+
async listMailboxEnvelope(serviceKey) {
|
|
191
249
|
const raw = await this.client.request(`/mailboxes/v1`, {
|
|
192
250
|
headers: { Authorization: `Bearer ${serviceKey}` },
|
|
193
251
|
context: "listing mailboxes",
|
|
194
252
|
});
|
|
195
|
-
return
|
|
253
|
+
return {
|
|
254
|
+
mailboxes: Array.isArray(raw.mailboxes) ? raw.mailboxes : [],
|
|
255
|
+
...(raw.mailbox_settings !== undefined ? { mailbox_settings: raw.mailbox_settings } : {}),
|
|
256
|
+
...(Array.isArray(raw.next_actions) ? { next_actions: raw.next_actions } : {}),
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
/** List project mailboxes plus default-role settings and gateway repair hints. */
|
|
260
|
+
async listMailboxes(projectId) {
|
|
261
|
+
const project = await this.client.getProject(projectId);
|
|
262
|
+
if (!project)
|
|
263
|
+
throw new ProjectNotFound(projectId, "listing mailboxes");
|
|
264
|
+
return this.listMailboxEnvelope(project.service_key);
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Configure the project's mailbox defaults. Values are mailbox ids
|
|
268
|
+
* (`mbx_…`) or `null` to clear when the gateway allows clearing.
|
|
269
|
+
*/
|
|
270
|
+
async setMailboxDefaults(projectId, opts) {
|
|
271
|
+
if (!opts || typeof opts !== "object" || Array.isArray(opts)) {
|
|
272
|
+
throw new LocalError("r.email.setMailboxDefaults(projectId, opts) requires an opts object.", "setting mailbox defaults");
|
|
273
|
+
}
|
|
274
|
+
const hasOutbound = Object.prototype.hasOwnProperty.call(opts, "default_outbound_mailbox_id");
|
|
275
|
+
const hasAuthSender = Object.prototype.hasOwnProperty.call(opts, "auth_sender_mailbox_id");
|
|
276
|
+
if (!hasOutbound && !hasAuthSender) {
|
|
277
|
+
throw new LocalError("Provide default_outbound_mailbox_id and/or auth_sender_mailbox_id.", "setting mailbox defaults");
|
|
278
|
+
}
|
|
279
|
+
validateOptionalMailboxId(opts.default_outbound_mailbox_id, "default_outbound_mailbox_id");
|
|
280
|
+
validateOptionalMailboxId(opts.auth_sender_mailbox_id, "auth_sender_mailbox_id");
|
|
281
|
+
const project = await this.client.getProject(projectId);
|
|
282
|
+
if (!project)
|
|
283
|
+
throw new ProjectNotFound(projectId, "setting mailbox defaults");
|
|
284
|
+
return this.client.request("/mailboxes/v1/settings", {
|
|
285
|
+
method: "PATCH",
|
|
286
|
+
headers: { Authorization: `Bearer ${project.service_key}` },
|
|
287
|
+
body: {
|
|
288
|
+
...(hasOutbound ? { default_outbound_mailbox_id: opts.default_outbound_mailbox_id } : {}),
|
|
289
|
+
...(hasAuthSender ? { auth_sender_mailbox_id: opts.auth_sender_mailbox_id } : {}),
|
|
290
|
+
},
|
|
291
|
+
context: "setting mailbox defaults",
|
|
292
|
+
});
|
|
196
293
|
}
|
|
197
294
|
/**
|
|
198
295
|
* Create a mailbox for a project.
|
|
@@ -216,12 +313,13 @@ export class Email {
|
|
|
216
313
|
if (slug.includes("--")) {
|
|
217
314
|
throw new LocalError("Slug must not contain consecutive hyphens.", "creating mailbox");
|
|
218
315
|
}
|
|
219
|
-
const
|
|
316
|
+
const raw = await this.client.request("/mailboxes/v1", {
|
|
220
317
|
method: "POST",
|
|
221
318
|
headers: { Authorization: `Bearer ${project.service_key}` },
|
|
222
319
|
body: { slug, project_id: projectId },
|
|
223
320
|
context: "creating mailbox",
|
|
224
321
|
});
|
|
322
|
+
const result = normalizeCreateMailboxResult(raw);
|
|
225
323
|
await this.cacheMailbox(projectId, result);
|
|
226
324
|
return result;
|
|
227
325
|
}
|
|
@@ -249,7 +347,7 @@ export class Email {
|
|
|
249
347
|
if (hasAttachments && isTemplate) {
|
|
250
348
|
throw new LocalError("Attachments are only supported in raw mode (`subject` + `html`), not with `template`.", "sending email");
|
|
251
349
|
}
|
|
252
|
-
const { id, serviceKey } = await this.resolveMailbox(projectId, opts.mailbox);
|
|
350
|
+
const { id, serviceKey } = await this.resolveMailbox(projectId, opts.mailbox, "default_outbound", "sending email");
|
|
253
351
|
const body = { to: opts.to };
|
|
254
352
|
if (isTemplate) {
|
|
255
353
|
body.template = opts.template;
|
|
@@ -341,9 +439,9 @@ export class Email {
|
|
|
341
439
|
const project = await this.client.getProject(projectId);
|
|
342
440
|
if (!project)
|
|
343
441
|
throw new ProjectNotFound(projectId, "getting mailbox");
|
|
344
|
-
const list = await this.
|
|
345
|
-
const mb = this.pickMailbox(list, selector, "getting mailbox");
|
|
346
|
-
if (!selector && list.length === 1)
|
|
442
|
+
const list = await this.listMailboxEnvelope(project.service_key);
|
|
443
|
+
const mb = this.pickMailbox(list.mailboxes, selector, "getting mailbox");
|
|
444
|
+
if (!selector && list.mailboxes.length === 1)
|
|
347
445
|
await this.cacheMailbox(projectId, mb);
|
|
348
446
|
return mb;
|
|
349
447
|
}
|
|
@@ -362,11 +460,11 @@ export class Email {
|
|
|
362
460
|
id = selector;
|
|
363
461
|
}
|
|
364
462
|
else {
|
|
365
|
-
const list = await this.
|
|
366
|
-
if (!selector && list.length === 0) {
|
|
463
|
+
const list = await this.listMailboxEnvelope(project.service_key);
|
|
464
|
+
if (!selector && list.mailboxes.length === 0) {
|
|
367
465
|
throw new ApiError("No mailbox found for this project — nothing to delete.", 404, null, "deleting mailbox");
|
|
368
466
|
}
|
|
369
|
-
id = this.pickMailbox(list, selector, "deleting mailbox").mailbox_id;
|
|
467
|
+
id = this.pickMailbox(list.mailboxes, selector, "deleting mailbox").mailbox_id;
|
|
370
468
|
}
|
|
371
469
|
const result = await this.client.request(`/mailboxes/v1/${id}`, {
|
|
372
470
|
method: "DELETE",
|
|
@@ -388,6 +486,74 @@ export class Email {
|
|
|
388
486
|
return result;
|
|
389
487
|
}
|
|
390
488
|
}
|
|
489
|
+
function normalizeCreateMailboxResult(raw) {
|
|
490
|
+
const maybeEnvelope = raw;
|
|
491
|
+
if (maybeEnvelope.mailbox && typeof maybeEnvelope.mailbox === "object") {
|
|
492
|
+
return {
|
|
493
|
+
...maybeEnvelope.mailbox,
|
|
494
|
+
...(maybeEnvelope.mailbox_settings !== undefined
|
|
495
|
+
? { mailbox_settings: maybeEnvelope.mailbox_settings }
|
|
496
|
+
: {}),
|
|
497
|
+
...(Array.isArray(maybeEnvelope.next_actions)
|
|
498
|
+
? { next_actions: maybeEnvelope.next_actions }
|
|
499
|
+
: {}),
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
const maybeLegacy = raw;
|
|
503
|
+
if (!maybeLegacy.mailbox_id && typeof maybeLegacy.id === "string") {
|
|
504
|
+
return { ...maybeLegacy, mailbox_id: maybeLegacy.id };
|
|
505
|
+
}
|
|
506
|
+
return raw;
|
|
507
|
+
}
|
|
508
|
+
function validateOptionalMailboxId(value, field) {
|
|
509
|
+
if (value === undefined || value === null)
|
|
510
|
+
return;
|
|
511
|
+
assertNonEmptyString(value, field, "setting mailbox defaults");
|
|
512
|
+
if (!/^mbx_/.test(value)) {
|
|
513
|
+
throw new LocalError(`${field} must be a mailbox id starting with "mbx_". Use listMailboxes() to resolve a slug first.`, "setting mailbox defaults");
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
function mailboxConfigError(opts) {
|
|
517
|
+
const next_actions = opts.nextActions && opts.nextActions.length > 0
|
|
518
|
+
? opts.nextActions
|
|
519
|
+
: [{
|
|
520
|
+
type: "set_mailbox_defaults",
|
|
521
|
+
method: "PATCH",
|
|
522
|
+
path: "/mailboxes/v1/settings",
|
|
523
|
+
auth: "service_key",
|
|
524
|
+
why: "Choose the mailbox that should send outbound project email, then set default_outbound_mailbox_id.",
|
|
525
|
+
command: `run402 email defaults --outbound <slug|mbx_id> --project ${opts.projectId}`,
|
|
526
|
+
}];
|
|
527
|
+
return new ApiError(opts.message, opts.status, {
|
|
528
|
+
error: opts.message,
|
|
529
|
+
message: opts.message,
|
|
530
|
+
code: opts.code,
|
|
531
|
+
category: "email",
|
|
532
|
+
retryable: false,
|
|
533
|
+
safe_to_retry: true,
|
|
534
|
+
mutation_state: "none",
|
|
535
|
+
details: {
|
|
536
|
+
project_id: opts.projectId,
|
|
537
|
+
mailbox_settings: opts.settings ?? null,
|
|
538
|
+
candidates: summarizeMailboxCandidates(opts.mailboxes),
|
|
539
|
+
...(opts.details ?? {}),
|
|
540
|
+
},
|
|
541
|
+
next_actions,
|
|
542
|
+
}, opts.context);
|
|
543
|
+
}
|
|
544
|
+
function summarizeMailboxCandidates(mailboxes) {
|
|
545
|
+
return mailboxes.map((m) => ({
|
|
546
|
+
mailbox_id: m.mailbox_id,
|
|
547
|
+
slug: m.slug,
|
|
548
|
+
address: m.address,
|
|
549
|
+
status: m.status,
|
|
550
|
+
is_default_outbound: m.is_default_outbound ?? false,
|
|
551
|
+
is_auth_sender: m.is_auth_sender ?? false,
|
|
552
|
+
can_send: m.can_send,
|
|
553
|
+
send_blocked_reason: m.send_blocked_reason ?? null,
|
|
554
|
+
domain_kind: m.domain_kind,
|
|
555
|
+
}));
|
|
556
|
+
}
|
|
391
557
|
function encodePathSegment(value, name, context) {
|
|
392
558
|
assertNonEmptyString(value, name, context);
|
|
393
559
|
return encodeURIComponent(value);
|