@run402/sdk 4.109.1 → 4.110.1

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.
@@ -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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"}
@@ -1103,22 +1103,26 @@ function siteToCoreSpec(site) {
1103
1103
  ...(site.public_paths ? { public_paths: site.public_paths } : {}),
1104
1104
  };
1105
1105
  }
1106
- // tenant-site-embedding and site.sign_in_path never reach core: both are
1107
- // gateway-owned and core validates site keys against its own list.
1106
+ // tenant-site-embedding, site.sign_in_path, and site.noindex never reach
1107
+ // core: all three are gateway-owned and core validates site keys against
1108
+ // its own list.
1108
1109
  return site.public_paths ? { public_paths: site.public_paths } : {};
1109
1110
  }
1110
1111
  function siteToWire(site) {
1111
1112
  // tenant-site-embedding: `null` is a meaningful value on the wire (clear), so
1112
1113
  // it is carried whenever the key is present, unlike public_paths.
1113
- // site.sign_in_path follows the same rule (`null` clears back to the hosted page).
1114
+ // site.sign_in_path follows the same rule (`null` clears back to the hosted page),
1115
+ // and so does site.noindex (`false` or `null` clears back to indexable).
1114
1116
  const embedding = "embedding" in site && site.embedding !== undefined ? { embedding: site.embedding } : {};
1115
1117
  const signInPath = "sign_in_path" in site && site.sign_in_path !== undefined ? { sign_in_path: site.sign_in_path } : {};
1118
+ const noindex = "noindex" in site && site.noindex !== undefined ? { noindex: site.noindex } : {};
1116
1119
  if ("replace" in site && site.replace) {
1117
1120
  return {
1118
1121
  replace: fileSetToWire(site.replace),
1119
1122
  ...(site.public_paths ? { public_paths: site.public_paths } : {}),
1120
1123
  ...embedding,
1121
1124
  ...signInPath,
1125
+ ...noindex,
1122
1126
  };
1123
1127
  }
1124
1128
  if ("patch" in site && site.patch) {
@@ -1130,12 +1134,14 @@ function siteToWire(site) {
1130
1134
  ...(site.public_paths ? { public_paths: site.public_paths } : {}),
1131
1135
  ...embedding,
1132
1136
  ...signInPath,
1137
+ ...noindex,
1133
1138
  };
1134
1139
  }
1135
1140
  return {
1136
1141
  ...(site.public_paths ? { public_paths: site.public_paths } : {}),
1137
1142
  ...embedding,
1138
1143
  ...signInPath,
1144
+ ...noindex,
1139
1145
  };
1140
1146
  }
1141
1147
  function i18nToWire(i18n) {
@@ -1654,7 +1660,7 @@ async function commitInternal(client, planId, idempotencyKey, project, requiredP
1654
1660
  : {}),
1655
1661
  context: "committing deploy",
1656
1662
  });
1657
- return await sendCommitRecoveringLostResponse(client, send, operationId, project, tries);
1663
+ return await sendCommitWithRetry(send, tries);
1658
1664
  }
1659
1665
  catch (err) {
1660
1666
  const translated = translateDeployError(err, "commit", planId, operationId ?? null);
@@ -1667,38 +1673,34 @@ async function commitInternal(client, planId, idempotencyKey, project, requiredP
1667
1673
  }
1668
1674
  }
1669
1675
  /**
1670
- * Send a deploy commit, recovering when a 502/503/504 or a dropped connection
1671
- * loses the response. The commit may still have reached the gateway (a long
1672
- * commit can outlive the connection that carried it), and a second commit
1673
- * while the first is running would drive the state machine twice. So read the
1674
- * operation first: once it has left `planning`/`uploading` the commit landed,
1675
- * and the caller follows the operation; otherwise the commit never arrived and
1676
- * is sent again. Without an operation id to read, the failure surfaces as is.
1677
- * `tries.attempts` counts the commits sent, for the error's retry metadata.
1676
+ * Send a deploy commit, re-sending when a 502/503/504 or a dropped connection
1677
+ * loses the response. Re-sending is safe because a plan commits once: the
1678
+ * gateway answers a commit of a plan whose operation is already running with
1679
+ * `status: "running"` (the caller follows the operation) and a finished one
1680
+ * with its stored result, and Run402 Core answers `commit_in_progress` while
1681
+ * the first commit runs, which is re-sent the same way. `tries.attempts`
1682
+ * counts the commits sent, for the error's retry metadata.
1678
1683
  */
1679
- async function sendCommitRecoveringLostResponse(client, send, operationId, projectId, tries) {
1684
+ async function sendCommitWithRetry(send, tries) {
1680
1685
  for (let attempt = 1;; attempt++) {
1681
1686
  tries.attempts = attempt;
1682
1687
  try {
1683
1688
  return await send();
1684
1689
  }
1685
1690
  catch (err) {
1686
- if (!operationId || !projectId || !isTransientGatewayFailure(err) || attempt >= DEPLOY_COMMIT_MAX_ATTEMPTS)
1691
+ if (!isRetryableCommitFailure(err) || attempt >= DEPLOY_COMMIT_MAX_ATTEMPTS)
1687
1692
  throw err;
1688
1693
  await sleep(DEPLOY_COMMIT_RETRY_BASE_DELAY_MS * 2 ** (attempt - 1));
1689
- let snapshot;
1690
- try {
1691
- snapshot = await client.request(`/apply/v1/operations/${encodeURIComponent(operationId)}`, { headers: await apikeyHeaders(client, projectId), context: "fetching deploy operation" });
1692
- }
1693
- catch {
1694
- throw err;
1695
- }
1696
- if (snapshot.status !== "planning" && snapshot.status !== "uploading") {
1697
- return { operation_id: operationId, status: "running" };
1698
- }
1699
1694
  }
1700
1695
  }
1701
1696
  }
1697
+ function isRetryableCommitFailure(err) {
1698
+ if (isTransientGatewayFailure(err))
1699
+ return true;
1700
+ // Run402 Core: another commit of this plan is still running.
1701
+ return isRun402Error(err) && err.status === 409 &&
1702
+ err.body?.error === "commit_in_progress";
1703
+ }
1702
1704
  async function uploadMissing(client, projectId, presence, byteReaders, emit) {
1703
1705
  // Surface CAS dedup hits so agents can distinguish "N files were already
1704
1706
  // present" from "nothing happened". The gateway reports both present and
@@ -2371,7 +2373,7 @@ const FUNCTION_SPEC_FIELDS = new Set([
2371
2373
  const FUNCTION_CONFIG_FIELDS = new Set(["timeoutSeconds", "memoryMb"]);
2372
2374
  const FUNCTION_TRIGGER_FIELDS = new Set(["id", "type", "cron", "timezone", "misfire_policy", "overlap_policy", "mailbox", "events", "run"]);
2373
2375
  const FUNCTION_TRIGGER_RUN_FIELDS = new Set(["event_type", "payload", "retry", "expires_after_seconds"]);
2374
- const SITE_SPEC_FIELDS = new Set(["replace", "patch", "public_paths", "embedding", "sign_in_path"]);
2376
+ const SITE_SPEC_FIELDS = new Set(["replace", "patch", "public_paths", "embedding", "sign_in_path", "noindex"]);
2375
2377
  const SITE_PATCH_FIELDS = new Set(["put", "delete"]);
2376
2378
  const SITE_PUBLIC_PATHS_FIELDS = new Set(["mode", "replace"]);
2377
2379
  const PUBLIC_STATIC_PATH_FIELDS = new Set(["asset", "cache_class"]);
@@ -2710,6 +2712,17 @@ function validateSiteSpec(site) {
2710
2712
  if (obj.sign_in_path !== undefined) {
2711
2713
  validateSiteSignInPath(obj.sign_in_path, "site.sign_in_path");
2712
2714
  }
2715
+ if (obj.noindex !== undefined) {
2716
+ validateSiteNoindex(obj.noindex, "site.noindex");
2717
+ }
2718
+ }
2719
+ /** site.noindex. `true` = every response of the host carries
2720
+ * `X-Robots-Tag: noindex, nofollow, nosnippet`; `false` or `null` clears back
2721
+ * to indexable; omitted carries forward. */
2722
+ function validateSiteNoindex(value, resource) {
2723
+ if (value === null || typeof value === "boolean")
2724
+ return;
2725
+ throw invalidSpec(`ReleaseSpec.${resource} must be true, false, or null; send true to add X-Robots-Tag: noindex, nofollow, nosnippet to every response of the host, false or null to make it indexable again, or omit ${resource} to carry the previous value forward`, resource);
2713
2726
  }
2714
2727
  /** site.sign_in_path. Structural check only (the gateway is authoritative on
2715
2728
  * the reserved prefixes and the full rule set): a same-origin absolute path
@@ -3089,6 +3102,10 @@ function hasSiteContent(site) {
3089
3102
  if (site && typeof site === "object" && "sign_in_path" in site && site.sign_in_path !== undefined) {
3090
3103
  return true;
3091
3104
  }
3105
+ // site.noindex: same rule, true/false/null is content.
3106
+ if (site && typeof site === "object" && "noindex" in site && site.noindex !== undefined) {
3107
+ return true;
3108
+ }
3092
3109
  if (!isRecord(site))
3093
3110
  return false;
3094
3111
  if (hasRecordEntries(site.replace))
@@ -3545,6 +3562,10 @@ async function normalizeReleaseSpec(client, spec, opts = {}) {
3545
3562
  const signInPath = "sign_in_path" in spec.site && spec.site.sign_in_path !== undefined
3546
3563
  ? { sign_in_path: spec.site.sign_in_path }
3547
3564
  : {};
3565
+ // site.noindex: present (boolean or null) travels as-is.
3566
+ const noindex = "noindex" in spec.site && spec.site.noindex !== undefined
3567
+ ? { noindex: spec.site.noindex }
3568
+ : {};
3548
3569
  if ("replace" in spec.site && spec.site.replace) {
3549
3570
  const map = await normalizeFileSet(spec.site.replace, rememberRelease);
3550
3571
  // Re-check post-expansion so `dir("dist")` (a LocalDirRef whose keys are
@@ -3555,6 +3576,7 @@ async function normalizeReleaseSpec(client, spec, opts = {}) {
3555
3576
  ...(publicPaths ? { public_paths: publicPaths } : {}),
3556
3577
  ...embedding,
3557
3578
  ...signInPath,
3579
+ ...noindex,
3558
3580
  };
3559
3581
  }
3560
3582
  else if ("patch" in spec.site && spec.site.patch) {
@@ -3570,13 +3592,15 @@ async function normalizeReleaseSpec(client, spec, opts = {}) {
3570
3592
  ...(publicPaths ? { public_paths: publicPaths } : {}),
3571
3593
  ...embedding,
3572
3594
  ...signInPath,
3595
+ ...noindex,
3573
3596
  };
3574
3597
  }
3575
- else if (publicPaths || "embedding" in embedding || "sign_in_path" in signInPath) {
3598
+ else if (publicPaths || "embedding" in embedding || "sign_in_path" in signInPath || "noindex" in noindex) {
3576
3599
  normalized.site = {
3577
3600
  ...(publicPaths ? { public_paths: publicPaths } : {}),
3578
3601
  ...embedding,
3579
3602
  ...signInPath,
3603
+ ...noindex,
3580
3604
  };
3581
3605
  }
3582
3606
  }