run402-mcp 4.1.0 → 4.2.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.
Files changed (39) hide show
  1. package/README.md +6 -2
  2. package/dist/index.js +4 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/tools/list-tenant-payments.d.ts +22 -0
  5. package/dist/tools/list-tenant-payments.d.ts.map +1 -0
  6. package/dist/tools/list-tenant-payments.js +47 -0
  7. package/dist/tools/list-tenant-payments.js.map +1 -0
  8. package/dist/tools/orgs.d.ts +8 -0
  9. package/dist/tools/orgs.d.ts.map +1 -1
  10. package/dist/tools/orgs.js +43 -0
  11. package/dist/tools/orgs.js.map +1 -1
  12. package/package.json +3 -3
  13. package/schemas/release-spec.v1.json +44 -0
  14. package/sdk/README.md +6 -2
  15. package/sdk/dist/namespaces/deploy.d.ts.map +1 -1
  16. package/sdk/dist/namespaces/deploy.js +41 -2
  17. package/sdk/dist/namespaces/deploy.js.map +1 -1
  18. package/sdk/dist/namespaces/deploy.types.d.ts +11 -0
  19. package/sdk/dist/namespaces/deploy.types.d.ts.map +1 -1
  20. package/sdk/dist/namespaces/deploy.types.js +4 -0
  21. package/sdk/dist/namespaces/deploy.types.js.map +1 -1
  22. package/sdk/dist/namespaces/org.d.ts +8 -1
  23. package/sdk/dist/namespaces/org.d.ts.map +1 -1
  24. package/sdk/dist/namespaces/org.js +16 -0
  25. package/sdk/dist/namespaces/org.js.map +1 -1
  26. package/sdk/dist/namespaces/org.types.d.ts +37 -0
  27. package/sdk/dist/namespaces/org.types.d.ts.map +1 -1
  28. package/sdk/dist/namespaces/projects.d.ts +8 -1
  29. package/sdk/dist/namespaces/projects.d.ts.map +1 -1
  30. package/sdk/dist/namespaces/projects.js +17 -0
  31. package/sdk/dist/namespaces/projects.js.map +1 -1
  32. package/sdk/dist/namespaces/projects.types.d.ts +58 -0
  33. package/sdk/dist/namespaces/projects.types.d.ts.map +1 -1
  34. package/sdk/dist/node/deploy-manifest.js +1 -1
  35. package/sdk/dist/node/deploy-manifest.js.map +1 -1
  36. package/sdk/dist/scoped.d.ts +2 -1
  37. package/sdk/dist/scoped.d.ts.map +1 -1
  38. package/sdk/dist/scoped.js +3 -0
  39. package/sdk/dist/scoped.js.map +1 -1
@@ -20,7 +20,7 @@
20
20
  */
21
21
  import { isCiSessionCredentials } from "../ci-credentials.js";
22
22
  import { assertCiDeployableSpec } from "./ci.js";
23
- import { ROUTE_HTTP_METHODS, normalizeDeployResolveRequest, } from "./deploy.types.js";
23
+ import { ROUTE_PRICING_NETWORKS, ROUTE_HTTP_METHODS, normalizeDeployResolveRequest, } from "./deploy.types.js";
24
24
  import { ApiError, LocalError, NetworkError, PaymentRequired, Run402DeployError, Unauthorized, isTransferFreezeError, } from "../errors.js";
25
25
  import { assertAssetMetadata, assertExifPolicy, } from "./assets-validation.js";
26
26
  // ─── Constants ───────────────────────────────────────────────────────────────
@@ -2073,10 +2073,12 @@ const SITE_PUBLIC_PATHS_FIELDS = new Set(["mode", "replace"]);
2073
2073
  const PUBLIC_STATIC_PATH_FIELDS = new Set(["asset", "cache_class"]);
2074
2074
  const SUBDOMAINS_SPEC_FIELDS = new Set(["set", "add", "remove"]);
2075
2075
  const ROUTES_SPEC_FIELDS = new Set(["replace"]);
2076
- const ROUTE_ENTRY_FIELDS = new Set(["pattern", "methods", "target", "acknowledge_readonly"]);
2076
+ const ROUTE_ENTRY_FIELDS = new Set(["pattern", "methods", "target", "pricing", "acknowledge_readonly"]);
2077
2077
  const FUNCTION_ROUTE_TARGET_FIELDS = new Set(["type", "name"]);
2078
2078
  const STATIC_ROUTE_TARGET_FIELDS = new Set(["type", "file"]);
2079
2079
  const ROUTE_METHOD_SET = new Set(ROUTE_HTTP_METHODS);
2080
+ const ROUTE_PRICING_FIELDS = new Set(["mode", "amount_usd_micros", "pay_to", "networks"]);
2081
+ const ROUTE_PRICING_NETWORK_SET = new Set(ROUTE_PRICING_NETWORKS);
2080
2082
  const I18N_SPEC_FIELDS = new Set(["defaultLocale", "locales", "detect", "unknownLocalePolicy"]);
2081
2083
  const I18N_LOCALE_TAG_REGEX = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
2082
2084
  const I18N_COOKIE_NAME_REGEX = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
@@ -2493,11 +2495,48 @@ function validateRouteEntry(route, resource) {
2493
2495
  }
2494
2496
  }
2495
2497
  const targetType = validateRouteTarget(entry.target, `${resource}.target`);
2498
+ validateRoutePricing(entry.pricing, resource, targetType);
2496
2499
  validateRouteReadOnlyAcknowledgement(entry, targetType, resource);
2497
2500
  if (targetType === "static") {
2498
2501
  validateStaticRouteEntry(entry, resource);
2499
2502
  }
2500
2503
  }
2504
+ function validateRoutePricing(pricing, resource, targetType) {
2505
+ if (pricing === undefined)
2506
+ return;
2507
+ if (targetType !== "function") {
2508
+ throw invalidRouteSpec(`ReleaseSpec.${resource}.pricing is only supported on function route targets`, `${resource}.pricing`);
2509
+ }
2510
+ const obj = requireObject(pricing, `${resource}.pricing`);
2511
+ validateKnownFields(obj, `${resource}.pricing`, ROUTE_PRICING_FIELDS);
2512
+ if (obj.mode !== "always") {
2513
+ throw invalidRouteSpec(`ReleaseSpec.${resource}.pricing.mode must be "always"`, `${resource}.pricing.mode`);
2514
+ }
2515
+ if (typeof obj.amount_usd_micros !== "number" || !Number.isSafeInteger(obj.amount_usd_micros) || obj.amount_usd_micros <= 0) {
2516
+ throw invalidRouteSpec(`ReleaseSpec.${resource}.pricing.amount_usd_micros must be a positive safe JSON integer`, `${resource}.pricing.amount_usd_micros`);
2517
+ }
2518
+ if (obj.pay_to !== "org_default_payout") {
2519
+ throw invalidRouteSpec(`ReleaseSpec.${resource}.pricing.pay_to must be "org_default_payout"`, `${resource}.pricing.pay_to`);
2520
+ }
2521
+ if (obj.networks === undefined)
2522
+ return;
2523
+ if (!Array.isArray(obj.networks)) {
2524
+ throw invalidRouteSpec(`ReleaseSpec.${resource}.pricing.networks must be an array`, `${resource}.pricing.networks`);
2525
+ }
2526
+ if (obj.networks.length === 0) {
2527
+ throw invalidRouteSpec(`ReleaseSpec.${resource}.pricing.networks must not be empty; omit networks for production mainnet only`, `${resource}.pricing.networks`);
2528
+ }
2529
+ const seen = new Set();
2530
+ for (const network of obj.networks) {
2531
+ if (typeof network !== "string" || !ROUTE_PRICING_NETWORK_SET.has(network)) {
2532
+ throw invalidRouteSpec(`Unsupported route pricing network ${JSON.stringify(network)} at ReleaseSpec.${resource}.pricing.networks. Supported networks: ${ROUTE_PRICING_NETWORKS.join(", ")}`, `${resource}.pricing.networks`);
2533
+ }
2534
+ if (seen.has(network)) {
2535
+ throw invalidRouteSpec(`ReleaseSpec.${resource}.pricing.networks contains duplicate network ${JSON.stringify(network)}`, `${resource}.pricing.networks`);
2536
+ }
2537
+ seen.add(network);
2538
+ }
2539
+ }
2501
2540
  function validateRouteReadOnlyAcknowledgement(entry, targetType, resource) {
2502
2541
  if (entry.acknowledge_readonly === undefined)
2503
2542
  return;