run402 4.130.0 → 4.130.2
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 +8 -2
- package/lib/init-astro.mjs +2 -2
- package/package.json +1 -1
- package/sdk/dist/namespaces/deploy.d.ts.map +1 -1
- package/sdk/dist/namespaces/deploy.js +38 -6
- package/sdk/dist/namespaces/deploy.js.map +1 -1
- package/sdk/dist/node/actions-node.d.ts.map +1 -1
- package/sdk/dist/node/actions-node.js +5 -0
- package/sdk/dist/node/actions-node.js.map +1 -1
- package/vault-surface.json +1 -1
package/lib/deploy-v2.mjs
CHANGED
|
@@ -1228,8 +1228,9 @@ async function deployCmd(args) {
|
|
|
1228
1228
|
// the `assets` slice, which the Node manifest adapter accepts on its own
|
|
1229
1229
|
// (an assets-only manifest is a valid apply).
|
|
1230
1230
|
// For object-typed sections the "container is non-empty" check isn't enough
|
|
1231
|
-
// — `
|
|
1232
|
-
// so any object whose own values are all empty containers is still
|
|
1231
|
+
// — `functions:{replace:{}}` has one key but ships nothing. We recurse one
|
|
1232
|
+
// level so any object whose own values are all empty containers is still
|
|
1233
|
+
// empty. `site.replace` is the exception: an empty one is a real deploy.
|
|
1233
1234
|
const meaningful = ["database", "site", "functions", "secrets", "subdomains", "routes", "checks", "i18n", "assets"];
|
|
1234
1235
|
function hasContent(v) {
|
|
1235
1236
|
if (v == null) return false;
|
|
@@ -1249,6 +1250,11 @@ async function deployCmd(args) {
|
|
|
1249
1250
|
}
|
|
1250
1251
|
// `i18n: null` clears the slice — that's a valid deploy on its own.
|
|
1251
1252
|
if (key === "i18n" && value === null) return true;
|
|
1253
|
+
// An explicit `site.replace`, even `{}`, takes the static files offline.
|
|
1254
|
+
if (key === "site" && value && typeof value === "object" && !Array.isArray(value) &&
|
|
1255
|
+
value.replace && typeof value.replace === "object" && !Array.isArray(value.replace)) {
|
|
1256
|
+
return true;
|
|
1257
|
+
}
|
|
1252
1258
|
return hasContent(value);
|
|
1253
1259
|
}
|
|
1254
1260
|
const hasMeaningfulContent = executableManifest || (
|
package/lib/init-astro.mjs
CHANGED
|
@@ -95,7 +95,7 @@ export async function runInitAstro(args = []) {
|
|
|
95
95
|
},
|
|
96
96
|
dependencies: {
|
|
97
97
|
astro: "^7.4.2",
|
|
98
|
-
"@run402/astro": "^
|
|
98
|
+
"@run402/astro": "^3.0.0",
|
|
99
99
|
"@run402/functions": "^4.12.2",
|
|
100
100
|
},
|
|
101
101
|
},
|
|
@@ -106,7 +106,7 @@ export async function runInitAstro(args = []) {
|
|
|
106
106
|
{
|
|
107
107
|
path: "astro.config.mjs",
|
|
108
108
|
content: `// Run402 Astro preset. One config line gets you:
|
|
109
|
-
// - SSR on Lambda with
|
|
109
|
+
// - SSR on Lambda, with your pages loaded before the first request
|
|
110
110
|
// - ISR cache with cache.invalidate() admin-edit visibility
|
|
111
111
|
// - AsyncLocalStorage context so db()/auth.* helpers work natively
|
|
112
112
|
// - Build-time detectors for unsupported Astro features
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "run402",
|
|
3
|
-
"version": "4.130.
|
|
3
|
+
"version": "4.130.2",
|
|
4
4
|
"description": "CLI for Run402 — full-stack backend infrastructure for AI agents: Postgres, auth, storage, serverless functions and atomic deploys. Paid with x402/MPP. Includes $0.03 image generation.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/namespaces/deploy.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/namespaces/deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAwB3C,OAAO,KAAK,EACV,YAAY,EACZ,sBAAsB,EAQtB,WAAW,EACX,oBAAoB,EAEpB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EAIvB,sBAAsB,EACtB,oBAAoB,EAUpB,iBAAiB,EAGjB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,2BAA2B,EAC3B,uBAAuB,EACvB,WAAW,EACX,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAGlB,YAAY,EAEb,MAAM,mBAAmB,CAAC;AAgH3B,qBAAa,MAAM;IACL,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAnC,YAA6B,MAAM,EAAE,MAAM,EAAI;IAE/C;;;;OAIG;IACG,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAiD7E;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,eAAe,CAAC,CAE1E;IAED;;;;OAIG;IACG,IAAI,CACR,IAAI,EAAE,WAAW,EACjB,IAAI,GAAE;QACJ,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE,cAAc,GAAG,cAAc,CAAC;QACvC,YAAY,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,eAAe,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC5D,sEAAsE;QACtE,KAAK,CAAC,EAAE,oBAAoB,CAAC;KACzB,GACL,OAAO,CAAC;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;KAAE,CAAC,CAOvE;IAED;;;;;OAKG;IACG,MAAM,CACV,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACrC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;KACxC,GACA,OAAO,CAAC,IAAI,CAAC,CASf;IAED;;;;;OAKG;IACG,MAAM,CACV,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;QACJ,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;QACvC,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,eAAe,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC5D;;;;WAIG;QACH,KAAK,CAAC,EAAE,sBAAsB,CAAC;KAC3B,GACL,OAAO,CAAC,YAAY,CAAC,CAOvB;IAEK,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAY1F;IAED;;;;;;;;;OASG;IACG,MAAM,CACV,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE;QAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GACtE,OAAO,CAAC,YAAY,CAAC,CAmBvB;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACG,OAAO,CACX,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,aAAa,CAAC,CAyCxB;IAED;;;;OAIG;IACG,MAAM,CACV,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GAC9B,OAAO,CAAC,iBAAiB,CAAC,CAiB5B;IAED;;;;;;OAMG;IACG,IAAI,CACR,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CA2B7B;IAED;;;;;;;;OAQG;IACG,MAAM,CACV,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GACxB,OAAO,CAAC,oBAAoB,CAAC,CAiB/B;IAED;;;;OAIG;IACG,aAAa,CACjB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GACxB,OAAO,CAAC,mBAAmB,CAAC,CAuB9B;IAED;;;;OAIG;IACG,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,uBAAuB,CAAC,CAkClC;IAED;;;;OAIG;IACG,UAAU,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA2B7E;IAED;;;;OAIG;IACG,gBAAgB,CACpB,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,sBAAsB,CAAC,CAmBjC;IAED;;;;OAIG;IACG,IAAI,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA6BlE;IAED;;;;OAIG;IACG,OAAO,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAUxE;CACF;AAszED;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;iEAG6D;IAC7D,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;CACvC;AAs+ED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKrD"}
|
|
@@ -1342,7 +1342,7 @@ async function preflightTierFunctionLimits(client, spec, ciCredentials) {
|
|
|
1342
1342
|
return;
|
|
1343
1343
|
if (!hasFunctionTierPreflightInputs(spec.functions))
|
|
1344
1344
|
return;
|
|
1345
|
-
const limits = await readTierFunctionLimits(client);
|
|
1345
|
+
const limits = await readTierFunctionLimits(client, spec.project_id);
|
|
1346
1346
|
if (!limits)
|
|
1347
1347
|
return;
|
|
1348
1348
|
const entries = collectFunctionPreflightEntries(spec.functions);
|
|
@@ -1424,7 +1424,14 @@ function collectFunctionPreflightEntries(functions) {
|
|
|
1424
1424
|
}
|
|
1425
1425
|
return entries;
|
|
1426
1426
|
}
|
|
1427
|
-
|
|
1427
|
+
/**
|
|
1428
|
+
* The function caps of the tier the deploy is judged by: the tier of the
|
|
1429
|
+
* organization that owns the project. `/tiers/v1/status` describes the
|
|
1430
|
+
* wallet's own organization, so its caps count only when the project's tier
|
|
1431
|
+
* is the same; otherwise the static table for the project's tier applies.
|
|
1432
|
+
* When the project cannot be read, the wallet's own tier is used.
|
|
1433
|
+
*/
|
|
1434
|
+
async function readTierFunctionLimits(client, projectId) {
|
|
1428
1435
|
let status;
|
|
1429
1436
|
try {
|
|
1430
1437
|
status = await client.request("/tiers/v1/status", {
|
|
@@ -1434,12 +1441,20 @@ async function readTierFunctionLimits(client) {
|
|
|
1434
1441
|
catch {
|
|
1435
1442
|
return null;
|
|
1436
1443
|
}
|
|
1444
|
+
const projectTier = await readProjectTier(client, projectId);
|
|
1445
|
+
let walletTier;
|
|
1446
|
+
if (projectTier && projectTier.toLowerCase() !== String(status.tier ?? "").toLowerCase()) {
|
|
1447
|
+
walletTier = typeof status.tier === "string" ? status.tier : "";
|
|
1448
|
+
status = { tier: projectTier };
|
|
1449
|
+
}
|
|
1437
1450
|
if (typeof status.tier !== "string" || status.tier.length === 0) {
|
|
1438
1451
|
return null;
|
|
1439
1452
|
}
|
|
1440
1453
|
const tierKey = status.tier.toLowerCase();
|
|
1441
1454
|
const fallback = STATIC_FUNCTION_LIMITS_BY_TIER[tierKey];
|
|
1442
1455
|
const limits = { tier: status.tier };
|
|
1456
|
+
if (walletTier !== undefined)
|
|
1457
|
+
limits.walletTier = walletTier;
|
|
1443
1458
|
limits.maxTimeoutSeconds = tierStatusLimitOrFallback(status, [
|
|
1444
1459
|
"max_function_timeout_seconds",
|
|
1445
1460
|
"max_timeout_seconds",
|
|
@@ -1475,6 +1490,18 @@ async function readTierFunctionLimits(client) {
|
|
|
1475
1490
|
]);
|
|
1476
1491
|
return hasAnyTierFunctionLimit(limits) ? limits : null;
|
|
1477
1492
|
}
|
|
1493
|
+
async function readProjectTier(client, projectId) {
|
|
1494
|
+
try {
|
|
1495
|
+
const project = await client.request(`/projects/v1/${encodeURIComponent(projectId)}`, {
|
|
1496
|
+
method: "GET",
|
|
1497
|
+
context: "checking the project's tier for deploy preflight",
|
|
1498
|
+
});
|
|
1499
|
+
return typeof project.tier === "string" && project.tier.length > 0 ? project.tier : null;
|
|
1500
|
+
}
|
|
1501
|
+
catch {
|
|
1502
|
+
return null;
|
|
1503
|
+
}
|
|
1504
|
+
}
|
|
1478
1505
|
function tierStatusLimitOrFallback(status, keys, fallback) {
|
|
1479
1506
|
return tierStatusLimit(status, keys) ?? (fallback === undefined
|
|
1480
1507
|
? undefined
|
|
@@ -1607,9 +1634,11 @@ function scheduledCountTierLimitError(count, limits, limit, countSource) {
|
|
|
1607
1634
|
});
|
|
1608
1635
|
}
|
|
1609
1636
|
function tierLimitError(message, field, value, limits, limit, extraDetails) {
|
|
1610
|
-
const hint =
|
|
1611
|
-
?
|
|
1612
|
-
:
|
|
1637
|
+
const hint = limits.walletTier !== undefined
|
|
1638
|
+
? `The project's organization is on the ${limits.tier} tier (your wallet's own organization ${limits.walletTier ? `is on ${limits.walletTier}` : "has no tier"}), and a deploy is held to the limits of the organization that owns the project. Lower the function setting or upgrade that organization's tier.`
|
|
1639
|
+
: limit.source === "local_static_fallback"
|
|
1640
|
+
? "Tier limits came from the SDK's static fallback because /tiers/v1/status did not expose function caps. Run `run402 tier status` to refresh, lower the function setting, upgrade the tier, or retry and let gateway validation decide if this seems stale."
|
|
1641
|
+
: "Lower the function setting or upgrade the tier before deploying.";
|
|
1613
1642
|
const details = {
|
|
1614
1643
|
field,
|
|
1615
1644
|
value,
|
|
@@ -3212,7 +3241,10 @@ function hasSiteContent(site) {
|
|
|
3212
3241
|
}
|
|
3213
3242
|
if (!isRecord(site))
|
|
3214
3243
|
return false;
|
|
3215
|
-
|
|
3244
|
+
// An explicit `site.replace` is content even with no files: the release
|
|
3245
|
+
// then serves none of the previous release's static files (the gateway
|
|
3246
|
+
// asks to confirm ZERO_SITE_FILES_AFTER unless an ssr function serves them).
|
|
3247
|
+
if (isRecord(site.replace))
|
|
3216
3248
|
return true;
|
|
3217
3249
|
if (isRecord(site.patch)) {
|
|
3218
3250
|
return hasRecordEntries(site.patch.put) || hasArrayEntries(site.patch.delete);
|