run402 1.69.8 → 1.70.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/lib/deploy-v2.mjs +35 -12
- package/lib/secrets.mjs +57 -17
- package/lib/tier.mjs +5 -2
- package/package.json +1 -1
- package/sdk/dist/namespaces/deploy.d.ts.map +1 -1
- package/sdk/dist/namespaces/deploy.js +452 -12
- package/sdk/dist/namespaces/deploy.js.map +1 -1
- package/sdk/dist/namespaces/deploy.types.d.ts +11 -0
- package/sdk/dist/namespaces/deploy.types.d.ts.map +1 -1
- package/sdk/dist/namespaces/deploy.types.js.map +1 -1
- package/sdk/dist/namespaces/tier.d.ts +16 -0
- package/sdk/dist/namespaces/tier.d.ts.map +1 -1
- package/sdk/dist/namespaces/tier.js.map +1 -1
- package/sdk/dist/node/deploy-manifest.d.ts +2 -0
- package/sdk/dist/node/deploy-manifest.d.ts.map +1 -1
- package/sdk/dist/node/deploy-manifest.js +24 -1
- package/sdk/dist/node/deploy-manifest.js.map +1 -1
package/lib/deploy-v2.mjs
CHANGED
|
@@ -37,8 +37,8 @@ import { normalizeArgv } from "./argparse.mjs";
|
|
|
37
37
|
const APPLY_HELP = `run402 deploy apply — Unified deploy primitive (v1.34+)
|
|
38
38
|
|
|
39
39
|
Usage:
|
|
40
|
-
run402 deploy apply --manifest <path> [--project <id>] [--quiet] [--allow-warnings]
|
|
41
|
-
run402 deploy apply --spec '<json>' [--project <id>] [--quiet] [--allow-warnings]
|
|
40
|
+
run402 deploy apply --manifest <path> [--project <id>] [--quiet|--final-only] [--allow-warning <code>] [--allow-warnings]
|
|
41
|
+
run402 deploy apply --spec '<json>' [--project <id>] [--quiet|--final-only] [--allow-warning <code>] [--allow-warnings]
|
|
42
42
|
cat spec.json | run402 deploy apply [--project <id>]
|
|
43
43
|
|
|
44
44
|
Manifest format mirrors the MCP \`deploy\` tool's ReleaseSpec:
|
|
@@ -80,14 +80,17 @@ Options:
|
|
|
80
80
|
--spec '<json>' Inline JSON spec (single-quote in shell)
|
|
81
81
|
--project <id> Override project_id from the manifest
|
|
82
82
|
--quiet Suppress per-event JSON-line stderr (final result still on stdout)
|
|
83
|
+
--final-only Alias for --quiet; final success/error envelope is still preserved
|
|
84
|
+
--allow-warning <code> Continue past this reviewed warning code (repeatable)
|
|
83
85
|
--allow-warnings Continue past plan warnings that require confirmation
|
|
84
86
|
|
|
85
87
|
Output:
|
|
86
88
|
stdout: { "status": "ok", "release_id": "rel_...", "operation_id": "op_...", "urls": {...}, "warnings": [...] }
|
|
87
|
-
stderr: one JSON event per line (suppressed with --quiet)
|
|
89
|
+
stderr: one JSON event per line (suppressed with --quiet or --final-only)
|
|
88
90
|
|
|
89
91
|
Secrets:
|
|
90
92
|
Secret values do not belong in deploy manifests. Set them first:
|
|
93
|
+
printf %s "$OPENAI_API_KEY" | run402 secrets set prj_... OPENAI_API_KEY --stdin
|
|
91
94
|
run402 secrets set prj_... OPENAI_API_KEY --file ./.secrets/openai-key
|
|
92
95
|
Then deploy a value-free declaration:
|
|
93
96
|
{ "project_id": "prj_...", "secrets": { "require": ["OPENAI_API_KEY"] } }
|
|
@@ -284,8 +287,8 @@ function makeStderrEventWriter(quiet) {
|
|
|
284
287
|
}
|
|
285
288
|
|
|
286
289
|
function parseApplyArgs(args) {
|
|
287
|
-
const opts = { manifest: null, spec: null, project: null, quiet: false, allowWarnings: false };
|
|
288
|
-
const allowedFlags = ["--manifest", "--spec", "--project", "--quiet", "--allow-warnings", "--help", "-h"];
|
|
290
|
+
const opts = { manifest: null, spec: null, project: null, quiet: false, allowWarnings: false, allowWarningCodes: [] };
|
|
291
|
+
const allowedFlags = ["--manifest", "--spec", "--project", "--quiet", "--final-only", "--allow-warning", "--allow-warnings", "--help", "-h"];
|
|
289
292
|
|
|
290
293
|
for (let i = 0; i < args.length; i++) {
|
|
291
294
|
const arg = args[i];
|
|
@@ -293,7 +296,7 @@ function parseApplyArgs(args) {
|
|
|
293
296
|
console.log(APPLY_HELP);
|
|
294
297
|
process.exit(0);
|
|
295
298
|
}
|
|
296
|
-
if (arg === "--manifest" || arg === "--spec" || arg === "--project") {
|
|
299
|
+
if (arg === "--manifest" || arg === "--spec" || arg === "--project" || arg === "--allow-warning") {
|
|
297
300
|
const value = args[i + 1];
|
|
298
301
|
if (value === undefined || (typeof value === "string" && value.startsWith("--"))) {
|
|
299
302
|
fail({
|
|
@@ -320,13 +323,15 @@ function parseApplyArgs(args) {
|
|
|
320
323
|
});
|
|
321
324
|
}
|
|
322
325
|
opts.spec = value;
|
|
323
|
-
} else {
|
|
326
|
+
} else if (arg === "--project") {
|
|
324
327
|
opts.project = value;
|
|
328
|
+
} else {
|
|
329
|
+
opts.allowWarningCodes.push(value);
|
|
325
330
|
}
|
|
326
331
|
i += 1;
|
|
327
332
|
continue;
|
|
328
333
|
}
|
|
329
|
-
if (arg === "--quiet") { opts.quiet = true; continue; }
|
|
334
|
+
if (arg === "--quiet" || arg === "--final-only") { opts.quiet = true; continue; }
|
|
330
335
|
if (arg === "--allow-warnings") { opts.allowWarnings = true; continue; }
|
|
331
336
|
if (typeof arg === "string" && arg.startsWith("-")) {
|
|
332
337
|
fail({
|
|
@@ -491,6 +496,7 @@ async function applyCmd(args) {
|
|
|
491
496
|
onEvent: makeStderrEventWriter(opts.quiet),
|
|
492
497
|
idempotencyKey,
|
|
493
498
|
allowWarnings: opts.allowWarnings,
|
|
499
|
+
allowWarningCodes: opts.allowWarningCodes,
|
|
494
500
|
});
|
|
495
501
|
console.log(JSON.stringify({ status: "ok", ...result }, null, 2));
|
|
496
502
|
} catch (err) {
|
|
@@ -596,12 +602,28 @@ function enhanceDeployWarningError(err) {
|
|
|
596
602
|
const affected = warnings
|
|
597
603
|
? warnings.flatMap((w) => Array.isArray(w?.affected) ? w.affected : [])
|
|
598
604
|
: [];
|
|
605
|
+
const unacknowledgedCodes = Array.isArray(existingBody.unacknowledged_warning_codes)
|
|
606
|
+
? existingBody.unacknowledged_warning_codes
|
|
607
|
+
: warnings
|
|
608
|
+
? Array.from(new Set(warnings
|
|
609
|
+
.filter((w) => w?.requires_confirmation || w?.code === "MISSING_REQUIRED_SECRET")
|
|
610
|
+
.map((w) => w?.code)
|
|
611
|
+
.filter(Boolean)))
|
|
612
|
+
: code
|
|
613
|
+
? [code]
|
|
614
|
+
: [];
|
|
615
|
+
const allowWarningAction = unacknowledgedCodes.length === 1
|
|
616
|
+
? `Retry with \`--allow-warning ${unacknowledgedCodes[0]}\` only after reviewing that warning.`
|
|
617
|
+
: unacknowledgedCodes.length > 1
|
|
618
|
+
? `Retry with one \`--allow-warning <code>\` per reviewed warning code: ${unacknowledgedCodes.join(", ")}.`
|
|
619
|
+
: "Retry with `--allow-warning <code>` only after reviewing the warning.";
|
|
599
620
|
const defaultNextActions = [
|
|
600
621
|
...(affected.length > 0
|
|
601
622
|
? [`Set or inspect affected secrets: ${Array.from(new Set(affected)).join(", ")}`]
|
|
602
623
|
: []),
|
|
603
624
|
"Retry `run402 deploy apply` after resolving warnings.",
|
|
604
|
-
|
|
625
|
+
allowWarningAction,
|
|
626
|
+
"Use `--allow-warnings` only when every warning was explicitly reviewed.",
|
|
605
627
|
];
|
|
606
628
|
enhanced.body = {
|
|
607
629
|
...existingBody,
|
|
@@ -610,8 +632,8 @@ function enhanceDeployWarningError(err) {
|
|
|
610
632
|
hint: existingBody.hint ||
|
|
611
633
|
routeGuidance?.hint ||
|
|
612
634
|
(code === "MISSING_REQUIRED_SECRET"
|
|
613
|
-
? "Set the missing secret values with `run402 secrets set
|
|
614
|
-
: "Review the plan warnings, then retry with --allow-warnings if you intentionally accept them."),
|
|
635
|
+
? "Set the missing secret values with `run402 secrets set <project> <KEY> --stdin` or `--file <path>`, then retry deploy apply."
|
|
636
|
+
: "Review the plan warnings, then retry with --allow-warning <code> for reviewed warnings if you intentionally accept them."),
|
|
615
637
|
next_actions: Array.isArray(existingBody.next_actions) && existingBody.next_actions.length > 0
|
|
616
638
|
? existingBody.next_actions
|
|
617
639
|
: (routeGuidance?.next_actions ?? defaultNextActions),
|
|
@@ -665,7 +687,8 @@ const ROUTE_WARNING_GUIDANCE = {
|
|
|
665
687
|
next_actions: [
|
|
666
688
|
"Add the mutation methods the routed function supports, such as POST.",
|
|
667
689
|
"Omit methods to allow every supported method when the route is an API surface.",
|
|
668
|
-
"
|
|
690
|
+
"Set acknowledge_readonly: true on an intentionally read-only GET/HEAD wildcard function route.",
|
|
691
|
+
"Use --allow-warning WILDCARD_ROUTE_EXCLUDES_MUTATION_METHODS only as a reviewed CLI escape hatch.",
|
|
669
692
|
],
|
|
670
693
|
},
|
|
671
694
|
ROUTE_TABLE_NEAR_LIMIT: {
|
package/lib/secrets.mjs
CHANGED
|
@@ -14,8 +14,8 @@ Subcommands:
|
|
|
14
14
|
delete <id> <key> Delete a secret from a project
|
|
15
15
|
|
|
16
16
|
Examples:
|
|
17
|
-
run402 secrets set prj_abc123 STRIPE_KEY --file ./.secrets/stripe-key
|
|
18
17
|
printf %s "$STRIPE_KEY" | run402 secrets set prj_abc123 STRIPE_KEY --stdin
|
|
18
|
+
run402 secrets set prj_abc123 STRIPE_KEY --file ./.secrets/stripe-key
|
|
19
19
|
run402 secrets set prj_abc123 TLS_CERT --file cert.pem
|
|
20
20
|
run402 secrets list prj_abc123
|
|
21
21
|
run402 secrets delete prj_abc123 STRIPE_KEY
|
|
@@ -30,27 +30,29 @@ const SUB_HELP = {
|
|
|
30
30
|
set: `run402 secrets set — Set a secret on a project
|
|
31
31
|
|
|
32
32
|
Usage:
|
|
33
|
-
run402 secrets set <id> <key> <value>
|
|
33
|
+
run402 secrets set <id> <key> <value>
|
|
34
34
|
run402 secrets set <id> <key> --file <path>
|
|
35
35
|
run402 secrets set <id> <key> --stdin
|
|
36
36
|
|
|
37
37
|
Arguments:
|
|
38
38
|
<id> Project ID (from 'run402 projects list')
|
|
39
39
|
<key> Secret key name (exposed as process.env.<key>)
|
|
40
|
-
<value> Inline secret value (omit if using --file)
|
|
40
|
+
<value> Inline secret value (omit if using --file or --stdin)
|
|
41
41
|
|
|
42
42
|
Options:
|
|
43
|
-
--file <path> Read the secret value from a file instead of inline
|
|
43
|
+
--file <path> Read the secret value from a file instead of inline
|
|
44
|
+
Use --file - or --file /dev/stdin to read from stdin
|
|
44
45
|
--stdin Read the secret value from stdin until EOF
|
|
45
46
|
|
|
46
47
|
Notes:
|
|
47
48
|
- Secrets are injected as process.env in serverless functions
|
|
48
49
|
- Values are write-only; 'list' cannot verify values by hash
|
|
49
|
-
- Prefer --
|
|
50
|
+
- Prefer --stdin or --file for real secrets so values do not land in shell history
|
|
50
51
|
|
|
51
52
|
Examples:
|
|
52
|
-
run402 secrets set prj_abc123 STRIPE_KEY --file ./.secrets/stripe-key
|
|
53
53
|
printf %s "$STRIPE_KEY" | run402 secrets set prj_abc123 STRIPE_KEY --stdin
|
|
54
|
+
cat ./.secrets/stripe-key | run402 secrets set prj_abc123 STRIPE_KEY --file -
|
|
55
|
+
run402 secrets set prj_abc123 STRIPE_KEY --file ./.secrets/stripe-key
|
|
54
56
|
run402 secrets set prj_abc123 TLS_CERT --file cert.pem
|
|
55
57
|
`,
|
|
56
58
|
list: `run402 secrets list — List all secrets for a project
|
|
@@ -87,15 +89,19 @@ export function readSecretValueForSet(parsedArgs, values, readers = {}) {
|
|
|
87
89
|
const validateFile = readers.validateFile ?? validateRegularFile;
|
|
88
90
|
const file = flagValue(parsedArgs, "--file");
|
|
89
91
|
const stdinRequested = parsedArgs.includes("--stdin");
|
|
90
|
-
const stdinFile = file
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
92
|
+
const stdinFile = isStdinAlias(file);
|
|
93
|
+
const sources = [];
|
|
94
|
+
if (values.length === 1) sources.push("inline");
|
|
95
|
+
if (file) sources.push(stdinFile ? "--file stdin" : "--file");
|
|
96
|
+
if (stdinRequested) sources.push("--stdin");
|
|
97
|
+
|
|
98
|
+
if (sources.length > 1) {
|
|
99
|
+
fail({
|
|
100
|
+
code: "BAD_USAGE",
|
|
101
|
+
message: "Provide exactly one secret value source.",
|
|
102
|
+
details: { sources },
|
|
103
|
+
hint: "Use one of: inline value, --file <path>, or --stdin.",
|
|
104
|
+
});
|
|
99
105
|
}
|
|
100
106
|
if (file && !stdinFile) validateFile(file, "--file");
|
|
101
107
|
|
|
@@ -113,12 +119,12 @@ async function set(projectId, key, args = []) {
|
|
|
113
119
|
if (values.length > 1) {
|
|
114
120
|
fail({ code: "BAD_USAGE", message: `Unexpected argument for secrets set: ${values[1]}` });
|
|
115
121
|
}
|
|
116
|
-
const val = readSecretValueForSet(parsedArgs, values);
|
|
122
|
+
const val = await readSecretValueForSet(parsedArgs, values, { readStdin: readStdinSecret });
|
|
117
123
|
if (val === undefined) {
|
|
118
124
|
fail({
|
|
119
125
|
code: "BAD_USAGE",
|
|
120
126
|
message: "Missing secret value.",
|
|
121
|
-
hint: "
|
|
127
|
+
hint: "Pipe a value to --stdin, use --file <path>, or provide an inline value only when shell history exposure is acceptable.",
|
|
122
128
|
});
|
|
123
129
|
}
|
|
124
130
|
try {
|
|
@@ -129,6 +135,40 @@ async function set(projectId, key, args = []) {
|
|
|
129
135
|
}
|
|
130
136
|
}
|
|
131
137
|
|
|
138
|
+
function isStdinAlias(file) {
|
|
139
|
+
return file === "-" || file === "/dev/stdin";
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async function readStdinSecret() {
|
|
143
|
+
if (process.stdin?.isTTY) {
|
|
144
|
+
failMissingStdin();
|
|
145
|
+
}
|
|
146
|
+
const chunks = [];
|
|
147
|
+
for await (const chunk of process.stdin) {
|
|
148
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));
|
|
149
|
+
}
|
|
150
|
+
if (chunks.length === 0) {
|
|
151
|
+
failMissingStdin();
|
|
152
|
+
}
|
|
153
|
+
const value = Buffer.concat(chunks).toString("utf-8");
|
|
154
|
+
if (value.length === 0) {
|
|
155
|
+
failMissingStdin();
|
|
156
|
+
}
|
|
157
|
+
return value;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function failMissingStdin() {
|
|
161
|
+
fail({
|
|
162
|
+
code: "BAD_USAGE",
|
|
163
|
+
message: "Missing secret value on stdin.",
|
|
164
|
+
hint: "Pipe a value, use --file <path>, or provide an inline value only when shell history exposure is acceptable.",
|
|
165
|
+
next_actions: [
|
|
166
|
+
"printf %s \"$VALUE\" | run402 secrets set <project> <KEY> --stdin",
|
|
167
|
+
"run402 secrets set <project> <KEY> --file <path>",
|
|
168
|
+
],
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
|
|
132
172
|
async function list(projectId, args = []) {
|
|
133
173
|
const parsedArgs = normalizeArgv(args);
|
|
134
174
|
assertKnownFlags(parsedArgs, ["--help", "-h"]);
|
package/lib/tier.mjs
CHANGED
|
@@ -8,7 +8,7 @@ Usage:
|
|
|
8
8
|
run402 tier <subcommand> [args...]
|
|
9
9
|
|
|
10
10
|
Subcommands:
|
|
11
|
-
status Show current tier
|
|
11
|
+
status Show current tier, expiry, usage, and function caps when returned
|
|
12
12
|
set <tier> Subscribe, renew, or upgrade (pays via x402)
|
|
13
13
|
|
|
14
14
|
Tiers: prototype ($0.10/7d, free with testnet faucet), hobby ($5/30d), team ($20/30d)
|
|
@@ -32,7 +32,10 @@ Usage:
|
|
|
32
32
|
run402 tier status
|
|
33
33
|
|
|
34
34
|
Notes:
|
|
35
|
-
- Returns the current tier name, status, and
|
|
35
|
+
- Returns the current tier name, status, expiry, and usage
|
|
36
|
+
- Newer gateways include function authoring caps such as max timeout,
|
|
37
|
+
max memory, max scheduled functions, minimum cron interval, and current
|
|
38
|
+
scheduled-function usage
|
|
36
39
|
- Use 'run402 tier set <tier>' to subscribe, renew, or upgrade
|
|
37
40
|
|
|
38
41
|
Examples:
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/namespaces/deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAiB3C,OAAO,KAAK,EACV,YAAY,EACZ,sBAAsB,EAKtB,WAAW,EACX,oBAAoB,EAEpB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EAWrB,iBAAiB,EAGjB,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,2BAA2B,EAC3B,uBAAuB,EACvB,WAAW,EACX,oBAAoB,EACpB,YAAY,EAEb,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/namespaces/deploy.ts"],"names":[],"mappings":"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"}
|