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.
- package/README.md +6 -2
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/list-tenant-payments.d.ts +22 -0
- package/dist/tools/list-tenant-payments.d.ts.map +1 -0
- package/dist/tools/list-tenant-payments.js +47 -0
- package/dist/tools/list-tenant-payments.js.map +1 -0
- package/dist/tools/orgs.d.ts +8 -0
- package/dist/tools/orgs.d.ts.map +1 -1
- package/dist/tools/orgs.js +43 -0
- package/dist/tools/orgs.js.map +1 -1
- package/package.json +3 -3
- package/schemas/release-spec.v1.json +44 -0
- package/sdk/README.md +6 -2
- package/sdk/dist/namespaces/deploy.d.ts.map +1 -1
- package/sdk/dist/namespaces/deploy.js +41 -2
- 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 +4 -0
- package/sdk/dist/namespaces/deploy.types.js.map +1 -1
- package/sdk/dist/namespaces/org.d.ts +8 -1
- package/sdk/dist/namespaces/org.d.ts.map +1 -1
- package/sdk/dist/namespaces/org.js +16 -0
- package/sdk/dist/namespaces/org.js.map +1 -1
- package/sdk/dist/namespaces/org.types.d.ts +37 -0
- package/sdk/dist/namespaces/org.types.d.ts.map +1 -1
- package/sdk/dist/namespaces/projects.d.ts +8 -1
- package/sdk/dist/namespaces/projects.d.ts.map +1 -1
- package/sdk/dist/namespaces/projects.js +17 -0
- package/sdk/dist/namespaces/projects.js.map +1 -1
- package/sdk/dist/namespaces/projects.types.d.ts +58 -0
- package/sdk/dist/namespaces/projects.types.d.ts.map +1 -1
- package/sdk/dist/node/deploy-manifest.js +1 -1
- package/sdk/dist/node/deploy-manifest.js.map +1 -1
- package/sdk/dist/scoped.d.ts +2 -1
- package/sdk/dist/scoped.d.ts.map +1 -1
- package/sdk/dist/scoped.js +3 -0
- 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;
|