run402 3.3.2 → 3.3.4
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/email.mjs +142 -8
- package/lib/transfer.mjs +68 -38
- package/package.json +1 -1
- package/sdk/dist/namespaces/admin.d.ts +3 -3
- package/sdk/dist/namespaces/admin.js +3 -3
- 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/transfers.d.ts +85 -22
- package/sdk/dist/namespaces/transfers.d.ts.map +1 -1
- package/sdk/dist/namespaces/transfers.js +56 -41
- 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
package/README.md
CHANGED
|
@@ -163,6 +163,8 @@ Jobs are platform-managed runners, not arbitrary Docker execution. Submit the ga
|
|
|
163
163
|
|
|
164
164
|
```bash
|
|
165
165
|
run402 email create my-app
|
|
166
|
+
run402 email mailboxes
|
|
167
|
+
run402 email defaults --outbound my-app --auth-sender my-app
|
|
166
168
|
run402 email send --to user@example.com --subject "Welcome" --html "<h1>Hi</h1>"
|
|
167
169
|
run402 email send --to user@example.com --template notification --var project_name="My App"
|
|
168
170
|
```
|
package/lib/email.mjs
CHANGED
|
@@ -74,6 +74,11 @@ Usage:
|
|
|
74
74
|
|
|
75
75
|
Subcommands:
|
|
76
76
|
create <slug> [--project <id>] Create a mailbox (<slug>@mail.run402.com)
|
|
77
|
+
mailboxes [--project <id>] List mailboxes with default-role metadata
|
|
78
|
+
and gateway next_actions
|
|
79
|
+
defaults [--outbound <slug|id>] [--auth-sender <slug|id>] [--project <id>]
|
|
80
|
+
Show or set mailbox defaults. With no
|
|
81
|
+
flags, prints current settings/candidates.
|
|
77
82
|
info [--project <id>] Show mailbox info (ID, address, slug)
|
|
78
83
|
status [--project <id>] Alias for 'info' (prefer 'info')
|
|
79
84
|
send --to <email> [mode flags] Send an email (template or raw HTML)
|
|
@@ -114,10 +119,12 @@ Send modes:
|
|
|
114
119
|
|
|
115
120
|
Choosing a mailbox:
|
|
116
121
|
--mailbox <slug|id> Target a specific mailbox. Accepted by send, list, get,
|
|
117
|
-
get-raw, reply, info, and webhooks.
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
122
|
+
get-raw, reply, info, and webhooks. For send, omitting
|
|
123
|
+
--mailbox uses default_outbound_mailbox_id when set; if
|
|
124
|
+
the gateway reports mailbox_settings and no default is
|
|
125
|
+
configured, set one with 'run402 email defaults'.
|
|
126
|
+
(delete takes the target as its positional
|
|
127
|
+
<slug|mailbox_id>.)
|
|
121
128
|
|
|
122
129
|
Templates:
|
|
123
130
|
project_invite — requires --var project_name=... --var invite_url=...
|
|
@@ -126,6 +133,8 @@ Templates:
|
|
|
126
133
|
|
|
127
134
|
Examples:
|
|
128
135
|
run402 email create my-app
|
|
136
|
+
run402 email mailboxes
|
|
137
|
+
run402 email defaults --outbound my-app --auth-sender my-app
|
|
129
138
|
run402 email send --template project_invite --to user@example.com \\
|
|
130
139
|
--var project_name="My App" --var invite_url="https://example.com/invite/abc"
|
|
131
140
|
run402 email send --to user@example.com --subject "Welcome!" \\
|
|
@@ -141,7 +150,8 @@ Examples:
|
|
|
141
150
|
run402 email webhooks register --url https://example.com/hook --events delivery,bounced
|
|
142
151
|
|
|
143
152
|
Notes:
|
|
144
|
-
- Up to 5 mailboxes per project —
|
|
153
|
+
- Up to 5 mailboxes per project — configure explicit defaults before
|
|
154
|
+
relying on omitted --mailbox sends
|
|
145
155
|
- Single recipient per send (no CC/BCC)
|
|
146
156
|
- Slug: 3-63 chars, lowercase alphanumeric + hyphens, no consecutive hyphens
|
|
147
157
|
- --project defaults to the active project
|
|
@@ -168,7 +178,7 @@ Options:
|
|
|
168
178
|
max 5, ≤ 7 MB total). Content-type is inferred from the
|
|
169
179
|
extension when the :content-type suffix is omitted.
|
|
170
180
|
--from-name "..." Display name for the From header
|
|
171
|
-
--mailbox <slug|id> Target mailbox
|
|
181
|
+
--mailbox <slug|id> Target mailbox. Omit to use default_outbound_mailbox_id.
|
|
172
182
|
--project <id> Project ID (defaults to the active project)
|
|
173
183
|
`,
|
|
174
184
|
list: `run402 email list — List messages in the mailbox
|
|
@@ -235,6 +245,28 @@ Notes:
|
|
|
235
245
|
Examples:
|
|
236
246
|
run402 email create my-app
|
|
237
247
|
run402 email create my-app --project prj_abc123
|
|
248
|
+
`,
|
|
249
|
+
mailboxes: `run402 email mailboxes — List project mailboxes
|
|
250
|
+
|
|
251
|
+
Usage:
|
|
252
|
+
run402 email mailboxes [--project <id>]
|
|
253
|
+
|
|
254
|
+
Returns JSON: { mailboxes, mailbox_settings?, next_actions? }. Mailbox rows
|
|
255
|
+
include default-role/readiness metadata when the gateway provides it.
|
|
256
|
+
`,
|
|
257
|
+
defaults: `run402 email defaults — Show or set mailbox defaults
|
|
258
|
+
|
|
259
|
+
Usage:
|
|
260
|
+
run402 email defaults [--project <id>]
|
|
261
|
+
run402 email defaults --outbound <slug|mbx_id> [--auth-sender <slug|mbx_id>] [--project <id>]
|
|
262
|
+
run402 email defaults --auth-sender <slug|mbx_id> [--project <id>]
|
|
263
|
+
|
|
264
|
+
Options:
|
|
265
|
+
--outbound <slug|mbx_id> Set default_outbound_mailbox_id
|
|
266
|
+
--auth-sender <slug|mbx_id> Set auth_sender_mailbox_id
|
|
267
|
+
--clear-outbound Clear default_outbound_mailbox_id
|
|
268
|
+
--clear-auth-sender Clear auth_sender_mailbox_id
|
|
269
|
+
--project <id> Project ID (defaults to the active project)
|
|
238
270
|
`,
|
|
239
271
|
get: `run402 email get — Get a message with replies
|
|
240
272
|
|
|
@@ -264,6 +296,39 @@ function strictFlagValue(args, flag) {
|
|
|
264
296
|
return value;
|
|
265
297
|
}
|
|
266
298
|
|
|
299
|
+
function summarizeMailboxForDefaults(m) {
|
|
300
|
+
return {
|
|
301
|
+
mailbox_id: m.mailbox_id,
|
|
302
|
+
slug: m.slug,
|
|
303
|
+
address: m.address,
|
|
304
|
+
status: m.status,
|
|
305
|
+
is_default_outbound: m.is_default_outbound ?? false,
|
|
306
|
+
is_auth_sender: m.is_auth_sender ?? false,
|
|
307
|
+
can_send: m.can_send,
|
|
308
|
+
send_blocked_reason: m.send_blocked_reason ?? null,
|
|
309
|
+
domain_kind: m.domain_kind,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
function mailboxIdFromSelector(envelope, selector, flag) {
|
|
314
|
+
if (selector === undefined || selector === null) return undefined;
|
|
315
|
+
if (/^mbx_/.test(selector)) return selector;
|
|
316
|
+
const hit = (envelope.mailboxes ?? []).find((m) => m.mailbox_id === selector || m.slug === selector);
|
|
317
|
+
if (!hit) {
|
|
318
|
+
fail({
|
|
319
|
+
code: "MAILBOX_NOT_FOUND",
|
|
320
|
+
message: `No mailbox matching ${JSON.stringify(selector)} for ${flag}.`,
|
|
321
|
+
details: {
|
|
322
|
+
selector,
|
|
323
|
+
flag,
|
|
324
|
+
candidates: (envelope.mailboxes ?? []).map(summarizeMailboxForDefaults),
|
|
325
|
+
},
|
|
326
|
+
next_actions: [{ type: "list_mailboxes", command: "run402 email mailboxes" }],
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
return hit.mailbox_id;
|
|
330
|
+
}
|
|
331
|
+
|
|
267
332
|
function validateArgs(args, knownFlags, flagsWithValues = knownFlags) {
|
|
268
333
|
assertKnownFlags(args, knownFlags, flagsWithValues);
|
|
269
334
|
const valueFlags = new Set(flagsWithValues);
|
|
@@ -321,7 +386,64 @@ async function create(args) {
|
|
|
321
386
|
|
|
322
387
|
try {
|
|
323
388
|
const data = await getSdk().email.createMailbox(projectId, slug);
|
|
324
|
-
console.log(JSON.stringify({
|
|
389
|
+
console.log(JSON.stringify({
|
|
390
|
+
mailbox_id: data.mailbox_id,
|
|
391
|
+
address: data.address,
|
|
392
|
+
slug: data.slug,
|
|
393
|
+
status: data.status,
|
|
394
|
+
mailbox_settings: data.mailbox_settings,
|
|
395
|
+
next_actions: data.next_actions,
|
|
396
|
+
created: true,
|
|
397
|
+
}));
|
|
398
|
+
} catch (err) {
|
|
399
|
+
reportSdkError(err);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
async function mailboxes(args) {
|
|
404
|
+
validateArgs(args, ["--project"]);
|
|
405
|
+
const projectId = resolveProjectId(strictFlagValue(args, "--project"));
|
|
406
|
+
try {
|
|
407
|
+
const data = await getSdk().email.listMailboxes(projectId);
|
|
408
|
+
console.log(JSON.stringify(data, null, 2));
|
|
409
|
+
} catch (err) {
|
|
410
|
+
reportSdkError(err);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
async function defaults(args) {
|
|
415
|
+
const knownFlags = ["--project", "--outbound", "--auth-sender", "--clear-outbound", "--clear-auth-sender"];
|
|
416
|
+
const valueFlags = ["--project", "--outbound", "--auth-sender"];
|
|
417
|
+
validateArgs(args, knownFlags, valueFlags);
|
|
418
|
+
const projectId = resolveProjectId(strictFlagValue(args, "--project"));
|
|
419
|
+
const outbound = strictFlagValue(args, "--outbound");
|
|
420
|
+
const authSender = strictFlagValue(args, "--auth-sender");
|
|
421
|
+
const clearOutbound = args.includes("--clear-outbound");
|
|
422
|
+
const clearAuthSender = args.includes("--clear-auth-sender");
|
|
423
|
+
|
|
424
|
+
if (outbound && clearOutbound) {
|
|
425
|
+
fail({ code: "BAD_USAGE", message: "Use either --outbound or --clear-outbound, not both." });
|
|
426
|
+
}
|
|
427
|
+
if (authSender && clearAuthSender) {
|
|
428
|
+
fail({ code: "BAD_USAGE", message: "Use either --auth-sender or --clear-auth-sender, not both." });
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
const shouldPatch = outbound || authSender || clearOutbound || clearAuthSender;
|
|
432
|
+
try {
|
|
433
|
+
const current = await getSdk().email.listMailboxes(projectId);
|
|
434
|
+
if (!shouldPatch) {
|
|
435
|
+
console.log(JSON.stringify(current, null, 2));
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
const patch = {};
|
|
440
|
+
if (outbound) patch.default_outbound_mailbox_id = mailboxIdFromSelector(current, outbound, "--outbound");
|
|
441
|
+
if (clearOutbound) patch.default_outbound_mailbox_id = null;
|
|
442
|
+
if (authSender) patch.auth_sender_mailbox_id = mailboxIdFromSelector(current, authSender, "--auth-sender");
|
|
443
|
+
if (clearAuthSender) patch.auth_sender_mailbox_id = null;
|
|
444
|
+
|
|
445
|
+
const updated = await getSdk().email.setMailboxDefaults(projectId, patch);
|
|
446
|
+
console.log(JSON.stringify(updated, null, 2));
|
|
325
447
|
} catch (err) {
|
|
326
448
|
reportSdkError(err);
|
|
327
449
|
}
|
|
@@ -357,7 +479,17 @@ async function send(args) {
|
|
|
357
479
|
mailbox: mailbox ?? undefined,
|
|
358
480
|
attachments: attachments.length ? attachments : undefined,
|
|
359
481
|
});
|
|
360
|
-
console.log(JSON.stringify({
|
|
482
|
+
console.log(JSON.stringify({
|
|
483
|
+
message_id: data.message_id,
|
|
484
|
+
to: data.to,
|
|
485
|
+
template: data.template,
|
|
486
|
+
subject: data.subject,
|
|
487
|
+
status: data.status,
|
|
488
|
+
sent_at: data.sent_at,
|
|
489
|
+
mailbox_id: data.mailbox_id,
|
|
490
|
+
from_address: data.from_address,
|
|
491
|
+
sent: true,
|
|
492
|
+
}));
|
|
361
493
|
} catch (err) {
|
|
362
494
|
reportSdkError(err);
|
|
363
495
|
}
|
|
@@ -536,6 +668,8 @@ export async function run(sub, args) {
|
|
|
536
668
|
if (Array.isArray(args) && (args.includes("--help") || args.includes("-h")) && sub !== "webhooks") { console.log(SUB_HELP[sub] || HELP); process.exit(0); }
|
|
537
669
|
switch (sub) {
|
|
538
670
|
case "create": await create(args); break;
|
|
671
|
+
case "mailboxes": await mailboxes(args); break;
|
|
672
|
+
case "defaults": await defaults(args); break;
|
|
539
673
|
case "info":
|
|
540
674
|
case "status": await status(args); break;
|
|
541
675
|
case "send": await send(args); break;
|
package/lib/transfer.mjs
CHANGED
|
@@ -10,10 +10,10 @@ import {
|
|
|
10
10
|
positionalArgs,
|
|
11
11
|
} from "./argparse.mjs";
|
|
12
12
|
|
|
13
|
-
const HELP = `run402 transfer — Project transfer, one noun for
|
|
13
|
+
const HELP = `run402 transfer — Project transfer, one noun for wallet, email, and owned-org recipients
|
|
14
14
|
|
|
15
15
|
Usage:
|
|
16
|
-
run402 transfer init --to <wallet|email> [--project <id>] [--billing-policy migrate] [--message <text>] [--kysigned <record_id>] [--retain-collaborator developer]
|
|
16
|
+
run402 transfer init (--to <wallet|email> | --to-org <org_id>) [--project <id>] [--billing-policy migrate] [--message <text>] [--kysigned <record_id>] [--retain-collaborator developer]
|
|
17
17
|
run402 transfer preview <transfer_id>
|
|
18
18
|
run402 transfer list [--incoming | --outgoing] [--limit N] [--after <cursor>]
|
|
19
19
|
run402 transfer accept <transfer_id>
|
|
@@ -22,17 +22,19 @@ Usage:
|
|
|
22
22
|
|
|
23
23
|
Subcommands:
|
|
24
24
|
init Initiate ownership change. --to <wallet> = two-party wallet transfer
|
|
25
|
-
(completed by 'accept'); --to <email> = email->org transfer (completed by 'claim')
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
(completed by 'accept'); --to <email> = email->org transfer (completed by 'claim');
|
|
26
|
+
--to-org <org_id> = same-actor move to an owned org (completes immediately).
|
|
27
|
+
preview Fetch the safe review document (pending transfer — kind-agnostic)
|
|
28
|
+
list List pending transfers (incoming default, or --outgoing) — pending rows unioned
|
|
28
29
|
accept Accept an incoming WALLET transfer (your wallet must be the to_wallet)
|
|
29
30
|
claim Claim an incoming EMAIL transfer into an org (--into <id>; omit = new org)
|
|
30
|
-
cancel Cancel a pending transfer of
|
|
31
|
+
cancel Cancel a pending transfer of any kind
|
|
31
32
|
|
|
32
33
|
Notes:
|
|
33
34
|
- Owner-side mutations on a project with a pending transfer return 409
|
|
34
35
|
PROJECT_HAS_PENDING_TRANSFER. Cancel the transfer or wait 72h for expiry.
|
|
35
36
|
- Phase 1A supports only billing_policy=migrate (default).
|
|
37
|
+
- --to-org is same-actor only in the first gateway release: you must own both orgs.
|
|
36
38
|
- Secret VALUES are inherited by the recipient on completion; rotation is advised.
|
|
37
39
|
- GitHub repo ownership is NOT transferred — handle that out of band.
|
|
38
40
|
`;
|
|
@@ -41,12 +43,14 @@ const SUB_HELP = {
|
|
|
41
43
|
init: `run402 transfer init — Initiate a project transfer
|
|
42
44
|
|
|
43
45
|
Usage:
|
|
44
|
-
run402 transfer init --to <wallet|email> [--project <id>] [--billing-policy migrate] [--message <text>] [--kysigned <record_id>] [--retain-collaborator developer]
|
|
46
|
+
run402 transfer init (--to <wallet|email> | --to-org <org_id>) [--project <id>] [--billing-policy migrate] [--message <text>] [--kysigned <record_id>] [--retain-collaborator developer]
|
|
45
47
|
|
|
46
48
|
Options:
|
|
47
49
|
--project <id> Project id (defaults to the active project)
|
|
48
50
|
--to <wallet|email> Recipient (required). A wallet uses the two-party rail (completed by
|
|
49
51
|
'accept'); an email uses the email->org rail (completed by 'claim').
|
|
52
|
+
--to-org <org_id> Destination org you already own. Same-actor only in the first gateway
|
|
53
|
+
release; completes immediately and returns project keys.
|
|
50
54
|
--billing-policy <p> Billing policy (wallet rail). Phase 1A only allows 'migrate' (default).
|
|
51
55
|
--message <text> Optional note shown to the recipient in preview + emails.
|
|
52
56
|
--kysigned <record_id> Optional KySigned record id (wallet rail; Phase 1A: informational only).
|
|
@@ -57,6 +61,7 @@ Options:
|
|
|
57
61
|
Notes:
|
|
58
62
|
- Caller's wallet/session must currently own or admin the project (gateway re-checks fresh DB).
|
|
59
63
|
- Owner-side mutations on the project are frozen until accept/claim/cancel/expiry.
|
|
64
|
+
Owned-org moves complete immediately and do not create a pending window.
|
|
60
65
|
- The project lease stays with your organization; it is NOT refunded.
|
|
61
66
|
`,
|
|
62
67
|
preview: `run402 transfer preview — Fetch the preview document
|
|
@@ -66,7 +71,7 @@ Usage:
|
|
|
66
71
|
|
|
67
72
|
Returns project name, custom domains, subdomains, function names, secret NAMES
|
|
68
73
|
(values are never returned), CI bindings that will be revoked on completion, and
|
|
69
|
-
billing implications. Works for
|
|
74
|
+
billing implications. Works for pending wallet/email/future-org transfers; any
|
|
70
75
|
party to the transfer may preview.
|
|
71
76
|
`,
|
|
72
77
|
list: `run402 transfer list — List pending transfers
|
|
@@ -74,8 +79,7 @@ party to the transfer may preview.
|
|
|
74
79
|
Usage:
|
|
75
80
|
run402 transfer list [--incoming | --outgoing] [--limit N] [--after <cursor>]
|
|
76
81
|
|
|
77
|
-
Lists
|
|
78
|
-
recipient_kind.
|
|
82
|
+
Lists pending transfers, unioned; each row carries recipient_kind.
|
|
79
83
|
|
|
80
84
|
Options:
|
|
81
85
|
--incoming List transfers OFFERED TO you (default).
|
|
@@ -99,7 +103,7 @@ via 'claim', not 'accept'.)
|
|
|
99
103
|
Usage:
|
|
100
104
|
run402 transfer cancel <transfer_id> [--reason <text>]
|
|
101
105
|
|
|
102
|
-
Cancels a pending transfer of
|
|
106
|
+
Cancels a pending transfer of any kind. You must be authorized for the row's
|
|
103
107
|
kind (a wallet signing party, or an owner/admin of the offering org / the
|
|
104
108
|
addressed-email principal). Already-processed transfers return 409
|
|
105
109
|
TRANSFER_ALREADY_PROCESSED.
|
|
@@ -124,15 +128,19 @@ const RETAIN_ROLES = new Set(["developer"]);
|
|
|
124
128
|
|
|
125
129
|
async function init(args) {
|
|
126
130
|
const parsedArgs = normalizeArgv(args);
|
|
127
|
-
const valueFlags = ["--project", "--to", "--billing-policy", "--message", "--kysigned", "--retain-collaborator"];
|
|
131
|
+
const valueFlags = ["--project", "--to", "--to-org", "--billing-policy", "--message", "--kysigned", "--retain-collaborator"];
|
|
128
132
|
assertKnownFlags(parsedArgs, [...valueFlags, "--help", "-h"], valueFlags);
|
|
129
133
|
const extra = positionalArgs(parsedArgs, valueFlags);
|
|
130
134
|
if (extra.length > 0) {
|
|
131
135
|
fail({ code: "BAD_USAGE", message: `Unexpected argument for transfer init: ${extra[0]}` });
|
|
132
136
|
}
|
|
133
137
|
const to = flagValue(parsedArgs, "--to");
|
|
134
|
-
|
|
135
|
-
|
|
138
|
+
const toOrg = flagValue(parsedArgs, "--to-org");
|
|
139
|
+
if (!to && !toOrg) {
|
|
140
|
+
fail({ code: "BAD_USAGE", message: "Missing recipient. Pass --to <wallet|email> or --to-org <org_id>." });
|
|
141
|
+
}
|
|
142
|
+
if (to && toOrg) {
|
|
143
|
+
fail({ code: "BAD_USAGE", message: "Pass exactly one recipient flag: --to <wallet|email> or --to-org <org_id>." });
|
|
136
144
|
}
|
|
137
145
|
const projectFlag = flagValue(parsedArgs, "--project");
|
|
138
146
|
const projectId = await resolveProjectId(projectFlag);
|
|
@@ -151,18 +159,17 @@ async function init(args) {
|
|
|
151
159
|
const kysigned = flagValue(parsedArgs, "--kysigned");
|
|
152
160
|
const retainCollaborator = flagValue(parsedArgs, "--retain-collaborator");
|
|
153
161
|
|
|
154
|
-
// One noun,
|
|
155
|
-
//
|
|
156
|
-
|
|
157
|
-
const isEmail = to.includes("@");
|
|
162
|
+
// One noun, three recipient shapes. --to keeps wallet/email auto-detection;
|
|
163
|
+
// --to-org is explicit because org ids are not human-recipient addresses.
|
|
164
|
+
const recipientKind = toOrg ? "org" : (to.includes("@") ? "email" : "wallet");
|
|
158
165
|
|
|
159
166
|
// --retain-collaborator (v1.91) is an email-only opt-in: the sender keeps a
|
|
160
167
|
// developer membership in the recipient's org (recipient must accept at claim).
|
|
161
168
|
if (retainCollaborator !== null) {
|
|
162
|
-
if (
|
|
169
|
+
if (recipientKind !== "email") {
|
|
163
170
|
fail({
|
|
164
171
|
code: "BAD_FLAG",
|
|
165
|
-
message: "--retain-collaborator applies only to email recipients
|
|
172
|
+
message: "--retain-collaborator applies only to email recipients.",
|
|
166
173
|
details: { flag: "--retain-collaborator" },
|
|
167
174
|
});
|
|
168
175
|
}
|
|
@@ -174,25 +181,48 @@ async function init(args) {
|
|
|
174
181
|
});
|
|
175
182
|
}
|
|
176
183
|
}
|
|
184
|
+
if (kysigned !== null && recipientKind !== "wallet") {
|
|
185
|
+
fail({
|
|
186
|
+
code: "BAD_FLAG",
|
|
187
|
+
message: "--kysigned applies only to wallet recipients; email and owned-org transfers do not use the KySigned rail.",
|
|
188
|
+
details: { flag: "--kysigned" },
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
if (billingPolicy !== null && recipientKind !== "wallet") {
|
|
192
|
+
fail({
|
|
193
|
+
code: "BAD_FLAG",
|
|
194
|
+
message: "--billing-policy applies only to wallet recipients; email and owned-org transfers always migrate ownership.",
|
|
195
|
+
details: { flag: "--billing-policy" },
|
|
196
|
+
});
|
|
197
|
+
}
|
|
177
198
|
|
|
178
|
-
//
|
|
199
|
+
// All recipient shapes initiate on the unified transfer endpoint — sign that path.
|
|
179
200
|
allowanceAuthHeaders(`/projects/v1/${projectId}/transfers`);
|
|
180
201
|
|
|
181
202
|
try {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
203
|
+
let res;
|
|
204
|
+
if (recipientKind === "org") {
|
|
205
|
+
res = await getSdk().admin.transfers.initiate({
|
|
206
|
+
projectId,
|
|
207
|
+
toOrgId: toOrg,
|
|
208
|
+
message: message ?? undefined,
|
|
209
|
+
});
|
|
210
|
+
} else if (recipientKind === "email") {
|
|
211
|
+
res = await getSdk().admin.transfers.initiate({
|
|
212
|
+
projectId,
|
|
213
|
+
toEmail: to,
|
|
214
|
+
message: message ?? undefined,
|
|
215
|
+
retainCollaborator: retainCollaborator ? { role: retainCollaborator } : undefined,
|
|
216
|
+
});
|
|
217
|
+
} else {
|
|
218
|
+
res = await getSdk().admin.transfers.initiate({
|
|
219
|
+
projectId,
|
|
220
|
+
toWallet: to,
|
|
221
|
+
billingPolicy: billingPolicy ?? undefined,
|
|
222
|
+
message: message ?? undefined,
|
|
223
|
+
kysignedRecordId: kysigned ?? undefined,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
196
226
|
console.log(JSON.stringify(res, null, 2));
|
|
197
227
|
} catch (err) {
|
|
198
228
|
reportSdkError(err);
|
|
@@ -207,7 +237,7 @@ async function preview(args) {
|
|
|
207
237
|
fail({ code: "BAD_USAGE", message: "Usage: run402 transfer preview <transfer_id>" });
|
|
208
238
|
}
|
|
209
239
|
const transferId = positionals[0];
|
|
210
|
-
// Preview is kind-agnostic — one route serves wallet and
|
|
240
|
+
// Preview is kind-agnostic — one route serves wallet, email, and future org transfers.
|
|
211
241
|
allowanceAuthHeaders(`/agent/v1/transfers/${transferId}`);
|
|
212
242
|
|
|
213
243
|
try {
|
|
@@ -241,8 +271,8 @@ async function list(args) {
|
|
|
241
271
|
? undefined
|
|
242
272
|
: parseIntegerFlag("--limit", limitFlag, { min: 1, max: 1000 });
|
|
243
273
|
|
|
244
|
-
// Incoming/outgoing are kind-agnostic — each returns the union of
|
|
245
|
-
// email-
|
|
274
|
+
// Incoming/outgoing are kind-agnostic — each returns the union of pending
|
|
275
|
+
// wallet/email/future-org rows, tagged with recipient_kind.
|
|
246
276
|
allowanceAuthHeaders(`/agent/v1/transfers/${direction}`);
|
|
247
277
|
|
|
248
278
|
try {
|
package/package.json
CHANGED
|
@@ -218,9 +218,9 @@ export interface OperatorStatusResult {
|
|
|
218
218
|
export declare class Admin {
|
|
219
219
|
private readonly client;
|
|
220
220
|
/**
|
|
221
|
-
* Project transfer sub-namespace
|
|
222
|
-
* project
|
|
223
|
-
* accept, cancel, listIncoming, listOutgoing}`.
|
|
221
|
+
* Project transfer sub-namespace — unified wallet, email, and owned-org
|
|
222
|
+
* project transfer surface. Access via `r.admin.transfers.{initiate,
|
|
223
|
+
* preview, accept, claim, cancel, listIncoming, listOutgoing}`.
|
|
224
224
|
*/
|
|
225
225
|
readonly transfers: Transfers;
|
|
226
226
|
constructor(client: Client);
|
|
@@ -11,9 +11,9 @@ const FINANCE_WINDOWS = new Set(["24h", "7d", "30d", "90d"]);
|
|
|
11
11
|
export class Admin {
|
|
12
12
|
client;
|
|
13
13
|
/**
|
|
14
|
-
* Project transfer sub-namespace
|
|
15
|
-
* project
|
|
16
|
-
* accept, cancel, listIncoming, listOutgoing}`.
|
|
14
|
+
* Project transfer sub-namespace — unified wallet, email, and owned-org
|
|
15
|
+
* project transfer surface. Access via `r.admin.transfers.{initiate,
|
|
16
|
+
* preview, accept, claim, cancel, listIncoming, listOutgoing}`.
|
|
17
17
|
*/
|
|
18
18
|
transfers;
|
|
19
19
|
constructor(client) {
|
|
@@ -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":"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"}
|