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 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
- // — `site:{replace:{}}` has one key but ships nothing. We recurse one level
1232
- // so any object whose own values are all empty containers is still empty.
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 || (
@@ -95,7 +95,7 @@ export async function runInitAstro(args = []) {
95
95
  },
96
96
  dependencies: {
97
97
  astro: "^7.4.2",
98
- "@run402/astro": "^2.6.1",
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 SnapStart
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.0",
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":"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"}
@@ -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
- async function readTierFunctionLimits(client) {
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 = limit.source === "local_static_fallback"
1611
- ? "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."
1612
- : "Lower the function setting or upgrade the tier before deploying.";
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
- if (hasRecordEntries(site.replace))
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);