@caelo-cms/provisioning 0.11.8 → 0.11.10
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/dist/admin-domain.d.ts +10 -1
- package/dist/admin-domain.d.ts.map +1 -1
- package/dist/admin-domain.js +13 -3
- package/dist/admin-domain.js.map +1 -1
- package/dist/adopt-existing.d.ts +6 -1
- package/dist/adopt-existing.d.ts.map +1 -1
- package/dist/adopt-existing.js +86 -0
- package/dist/adopt-existing.js.map +1 -1
- package/dist/agent/command.d.ts +20 -0
- package/dist/agent/command.d.ts.map +1 -1
- package/dist/agent/command.js +32 -9
- package/dist/agent/command.js.map +1 -1
- package/dist/agent/run.d.ts +2 -0
- package/dist/agent/run.d.ts.map +1 -1
- package/dist/agent/run.js +5 -1
- package/dist/agent/run.js.map +1 -1
- package/dist/agent-db.js +65 -3
- package/dist/aws-task-roles.d.ts +4 -2
- package/dist/aws-task-roles.d.ts.map +1 -1
- package/dist/aws-task-roles.js +4 -1
- package/dist/aws-task-roles.js.map +1 -1
- package/dist/caddy.d.ts +21 -4
- package/dist/caddy.d.ts.map +1 -1
- package/dist/caddy.js +27 -3
- package/dist/caddy.js.map +1 -1
- package/dist/cli.js +12 -3
- package/dist/cli.js.map +1 -1
- package/dist/cloudsql-tls.d.ts +63 -0
- package/dist/cloudsql-tls.d.ts.map +1 -0
- package/dist/cloudsql-tls.js +289 -0
- package/dist/cloudsql-tls.js.map +1 -0
- package/dist/compose.d.ts +29 -6
- package/dist/compose.d.ts.map +1 -1
- package/dist/compose.js +95 -23
- package/dist/compose.js.map +1 -1
- package/dist/converge-checkpoint.d.ts +1 -0
- package/dist/converge-checkpoint.d.ts.map +1 -1
- package/dist/converge-checkpoint.js +8 -1
- package/dist/converge-checkpoint.js.map +1 -1
- package/dist/converge-job-gcp.d.ts.map +1 -1
- package/dist/converge-job-gcp.js +2 -11
- package/dist/converge-job-gcp.js.map +1 -1
- package/dist/deployed-release.d.ts +4 -1
- package/dist/deployed-release.d.ts.map +1 -1
- package/dist/deployed-release.js +18 -8
- package/dist/deployed-release.js.map +1 -1
- package/dist/gcp-names.d.ts +21 -0
- package/dist/gcp-names.d.ts.map +1 -1
- package/dist/gcp-names.js +24 -0
- package/dist/gcp-names.js.map +1 -1
- package/dist/gcp-url-map.d.ts.map +1 -1
- package/dist/gcp-url-map.js +6 -2
- package/dist/gcp-url-map.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/infra-contract.d.ts +1 -1
- package/dist/infra-contract.d.ts.map +1 -1
- package/dist/infra-contract.js +24 -1
- package/dist/infra-contract.js.map +1 -1
- package/dist/install-state.d.ts +6 -0
- package/dist/install-state.d.ts.map +1 -1
- package/dist/install-state.js +17 -4
- package/dist/install-state.js.map +1 -1
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +17 -8
- package/dist/lifecycle.js.map +1 -1
- package/dist/mcp-auth-proxy-setup.d.ts +48 -0
- package/dist/mcp-auth-proxy-setup.d.ts.map +1 -0
- package/dist/mcp-auth-proxy-setup.js +280 -0
- package/dist/mcp-auth-proxy-setup.js.map +1 -0
- package/dist/release-manifest.d.ts +25 -1
- package/dist/release-manifest.d.ts.map +1 -1
- package/dist/release-manifest.js +36 -3
- package/dist/release-manifest.js.map +1 -1
- package/dist/remote-mcp.d.ts +55 -18
- package/dist/remote-mcp.d.ts.map +1 -1
- package/dist/remote-mcp.js +307 -77
- package/dist/remote-mcp.js.map +1 -1
- package/dist/runtime-secrets.d.ts +9 -0
- package/dist/runtime-secrets.d.ts.map +1 -1
- package/dist/runtime-secrets.js +21 -10
- package/dist/runtime-secrets.js.map +1 -1
- package/dist/seal-key-rotation.d.ts +7 -7
- package/dist/seal-key-rotation.d.ts.map +1 -1
- package/dist/seal-key-rotation.js +22 -22
- package/dist/seal-key-rotation.js.map +1 -1
- package/dist/self-hosted-db-tls.d.ts +37 -0
- package/dist/self-hosted-db-tls.d.ts.map +1 -0
- package/dist/self-hosted-db-tls.js +220 -0
- package/dist/self-hosted-db-tls.js.map +1 -0
- package/dist/self-hosted-release.d.ts +3 -1
- package/dist/self-hosted-release.d.ts.map +1 -1
- package/dist/self-hosted-release.js +33 -9
- package/dist/self-hosted-release.js.map +1 -1
- package/dist/self-hosted-roles.d.ts +34 -0
- package/dist/self-hosted-roles.d.ts.map +1 -1
- package/dist/self-hosted-roles.js +52 -0
- package/dist/self-hosted-roles.js.map +1 -1
- package/dist/self-hosted-start.d.ts +0 -21
- package/dist/self-hosted-start.d.ts.map +1 -1
- package/dist/self-hosted-start.js +39 -1
- package/dist/self-hosted-start.js.map +1 -1
- package/dist/self-hosted-upgrade.d.ts +15 -6
- package/dist/self-hosted-upgrade.d.ts.map +1 -1
- package/dist/self-hosted-upgrade.js +72 -23
- package/dist/self-hosted-upgrade.js.map +1 -1
- package/dist/stack-contract.d.ts +170 -25
- package/dist/stack-contract.d.ts.map +1 -1
- package/dist/stack-contract.js +314 -37
- package/dist/stack-contract.js.map +1 -1
- package/dist/stack-converge.d.ts +31 -0
- package/dist/stack-converge.d.ts.map +1 -1
- package/dist/stack-converge.js +71 -30
- package/dist/stack-converge.js.map +1 -1
- package/dist/upgrade/app-roll.d.ts +25 -4
- package/dist/upgrade/app-roll.d.ts.map +1 -1
- package/dist/upgrade/app-roll.js +63 -17
- package/dist/upgrade/app-roll.js.map +1 -1
- package/dist/upgrade/converge.d.ts.map +1 -1
- package/dist/upgrade/converge.js +99 -12
- package/dist/upgrade/converge.js.map +1 -1
- package/dist/upgrade/health.d.ts +31 -7
- package/dist/upgrade/health.d.ts.map +1 -1
- package/dist/upgrade/health.js +41 -17
- package/dist/upgrade/health.js.map +1 -1
- package/dist/upgrade/image-forms.d.ts +1 -1
- package/dist/upgrade/image-forms.d.ts.map +1 -1
- package/dist/upgrade/image-forms.js +24 -7
- package/dist/upgrade/image-forms.js.map +1 -1
- package/dist/upgrade/release-images.d.ts +12 -3
- package/dist/upgrade/release-images.d.ts.map +1 -1
- package/dist/upgrade/release-images.js +13 -4
- package/dist/upgrade/release-images.js.map +1 -1
- package/dist/upgrade/upgrade.d.ts +13 -3
- package/dist/upgrade/upgrade.d.ts.map +1 -1
- package/dist/upgrade/upgrade.js +34 -2
- package/dist/upgrade/upgrade.js.map +1 -1
- package/dist/upgrader-gcp.d.ts +12 -0
- package/dist/upgrader-gcp.d.ts.map +1 -1
- package/dist/upgrader-gcp.js +49 -1
- package/dist/upgrader-gcp.js.map +1 -1
- package/dist/upgrader-iam-preflight.d.ts.map +1 -1
- package/dist/upgrader-iam-preflight.js +6 -1
- package/dist/upgrader-iam-preflight.js.map +1 -1
- package/dist/upgrader-job.d.ts +1 -1
- package/dist/upgrader-job.d.ts.map +1 -1
- package/dist/upgrader-job.js +20 -14
- package/dist/upgrader-job.js.map +1 -1
- package/dist/upgrader-records.d.ts +1 -1
- package/dist/upgrader-records.d.ts.map +1 -1
- package/dist/upgrader-records.js +26 -7
- package/dist/upgrader-records.js.map +1 -1
- package/dist/upgrader-setup.d.ts.map +1 -1
- package/dist/upgrader-setup.js +10 -5
- package/dist/upgrader-setup.js.map +1 -1
- package/dist/wizards/gcp-cost.d.ts.map +1 -1
- package/dist/wizards/gcp-cost.js +22 -7
- package/dist/wizards/gcp-cost.js.map +1 -1
- package/dist/wizards/gcp.d.ts.map +1 -1
- package/dist/wizards/gcp.js +43 -17
- package/dist/wizards/gcp.js.map +1 -1
- package/package.json +2 -2
- package/src/admin-domain.test.ts +9 -8
- package/src/admin-domain.ts +13 -3
- package/src/admin-memory.test.ts +1 -0
- package/src/adopt-existing.test.ts +39 -0
- package/src/adopt-existing.ts +83 -1
- package/src/agent/command.test.ts +49 -1
- package/src/agent/command.ts +36 -9
- package/src/agent/run.test.ts +19 -0
- package/src/agent/run.ts +11 -2
- package/src/aws-task-roles.ts +5 -2
- package/src/caddy-redirects.docker.test.ts +2 -0
- package/src/caddy-redirects.test.ts +3 -0
- package/src/caddy-validate.test.ts +7 -1
- package/src/caddy.test.ts +39 -1
- package/src/caddy.ts +36 -4
- package/src/checkpoint-secrets.test.ts +14 -6
- package/src/cli.ts +12 -1
- package/src/cloudsql-tls.test.ts +225 -0
- package/src/cloudsql-tls.ts +352 -0
- package/src/compose.ts +125 -24
- package/src/converge-checkpoint.ts +8 -1
- package/src/converge-job-gcp.ts +2 -11
- package/src/database-tls-builders.test.ts +55 -0
- package/src/deployed-release.test.ts +104 -40
- package/src/deployed-release.ts +30 -9
- package/src/gateway-env-isolation.test.ts +10 -5
- package/src/gcp-names.ts +31 -0
- package/src/gcp-url-map.test.ts +6 -8
- package/src/gcp-url-map.ts +6 -2
- package/src/index.test.ts +7 -1
- package/src/index.ts +1 -0
- package/src/infra-contract.test.ts +5 -3
- package/src/infra-contract.ts +24 -1
- package/src/install-state.ts +26 -4
- package/src/lifecycle.ts +20 -11
- package/src/mcp-auth-proxy-setup.test.ts +305 -0
- package/src/mcp-auth-proxy-setup.ts +374 -0
- package/src/mcp-iap-stacks.test.ts +1 -1
- package/src/media-volume.test.ts +1 -1
- package/src/operator-access-stacks.test.ts +1 -1
- package/src/operator-access.test.ts +5 -4
- package/src/pool-budget-stacks.test.ts +1 -1
- package/src/release-manifest.test.ts +25 -0
- package/src/release-manifest.ts +59 -4
- package/src/remote-mcp-stack-config.test.ts +19 -9
- package/src/remote-mcp.test.ts +252 -57
- package/src/remote-mcp.ts +336 -77
- package/src/runtime-secrets.test.ts +20 -7
- package/src/runtime-secrets.ts +50 -9
- package/src/seal-key-rotation.test.ts +2 -2
- package/src/seal-key-rotation.ts +25 -25
- package/src/self-hosted-compose.test.ts +108 -5
- package/src/self-hosted-db-tls.test.ts +111 -0
- package/src/self-hosted-db-tls.ts +287 -0
- package/src/self-hosted-release-resolve.test.ts +71 -0
- package/src/self-hosted-release.ts +41 -11
- package/src/self-hosted-roles.test.ts +54 -0
- package/src/self-hosted-roles.ts +58 -0
- package/src/self-hosted-start.test.ts +34 -2
- package/src/self-hosted-start.ts +20 -2
- package/src/self-hosted-upgrade.test.ts +103 -14
- package/src/self-hosted-upgrade.ts +115 -29
- package/src/stack-contract-parity.test.ts +79 -12
- package/src/stack-contract.test.ts +169 -29
- package/src/stack-contract.ts +362 -42
- package/src/stack-converge-secrets.test.ts +26 -13
- package/src/stack-converge.test.ts +199 -26
- package/src/stack-converge.ts +92 -30
- package/src/state-store.test.ts +2 -1
- package/src/upgrade/app-roll.ts +97 -19
- package/src/upgrade/converge.ts +120 -11
- package/src/upgrade/health.test.ts +63 -25
- package/src/upgrade/health.ts +54 -22
- package/src/upgrade/image-forms.test.ts +34 -0
- package/src/upgrade/image-forms.ts +23 -8
- package/src/upgrade/release-images.test.ts +5 -1
- package/src/upgrade/release-images.ts +22 -6
- package/src/upgrade/upgrade.test.ts +353 -44
- package/src/upgrade/upgrade.ts +55 -6
- package/src/upgrader-gcp.ts +65 -3
- package/src/upgrader-iam-preflight.test.ts +19 -0
- package/src/upgrader-iam-preflight.ts +6 -0
- package/src/upgrader-job.test.ts +101 -27
- package/src/upgrader-job.ts +27 -14
- package/src/upgrader-records.test.ts +97 -12
- package/src/upgrader-records.ts +28 -11
- package/src/upgrader-setup.test.ts +2 -0
- package/src/upgrader-setup.ts +10 -4
- package/src/wizards/gcp-cost.test.ts +50 -0
- package/src/wizards/gcp-cost.ts +24 -7
- package/src/wizards/gcp.ts +55 -14
- package/stacks/aws/index.ts +32 -14
- package/stacks/azure/index.ts +57 -18
- package/stacks/gcp/index.ts +83 -23
- package/stacks/gcp-firebase/index.ts +162 -33
- package/stacks/self-hosted/README.md +2 -1
- package/stacks/self-hosted/index.ts +11 -1
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
2
|
+
/**
|
|
3
|
+
* #1328 — the Cloud Run services an upgrade to the MCP-Auth-Proxy release
|
|
4
|
+
* must find before it plans its rolls, created through gcloud on installs
|
|
5
|
+
* whose stack predates them (`cms-provision upgrade` and the converge job
|
|
6
|
+
* never run Pulumi). Run as the operator's or the provisioner's identity,
|
|
7
|
+
* before the upgrade's plan: each step only ADDS a service, account or grant
|
|
8
|
+
* that serves no traffic yet, so a failure leaves the running install as it
|
|
9
|
+
* was (converge release 1 of the hardening plan, #763, is additive).
|
|
10
|
+
*
|
|
11
|
+
* - Both providers: the proxy's own service account and its
|
|
12
|
+
* `secretAccessor` on exactly its two secrets — before any service runs
|
|
13
|
+
* as it, because Cloud Run checks a revision's secret access at deploy.
|
|
14
|
+
* - `gcp-firebase` (E13 a): the visitor gateway's new service
|
|
15
|
+
* `caelo-<env>-data-gateway`, a copy of the service that was the gateway
|
|
16
|
+
* (same image, env, secrets, VPC, account), so the app-roll can then roll
|
|
17
|
+
* it like any other service and turn the old one into the proxy. Copied,
|
|
18
|
+
* not built from the contract, so the health baseline sees the release
|
|
19
|
+
* that serves today on all three services.
|
|
20
|
+
* - `gcp`: the proxy's own service `caelo-<env>-mcp-auth-proxy`, deployed
|
|
21
|
+
* with the release's proxy image (there is no older proxy to copy). Its
|
|
22
|
+
* load-balancer part is remote-mcp.ts `ensureRemoteMcpEdge`, later in
|
|
23
|
+
* the converge.
|
|
24
|
+
*
|
|
25
|
+
* Fresh installs get the same from their stack (gcp-firebase) or from the
|
|
26
|
+
* wizard after the first `pulumi up` (gcp, like the jobs: CLI-owned).
|
|
27
|
+
*/
|
|
28
|
+
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
29
|
+
import { tmpdir } from "node:os";
|
|
30
|
+
import { join } from "node:path";
|
|
31
|
+
import { gcloud as defaultGcloud } from "./gcloud.js";
|
|
32
|
+
import { gcpSecretId, mcpAuthProxyServiceAccountEmail } from "./gcp-names.js";
|
|
33
|
+
import { ensureMcpAuthProxyServiceAccount } from "./runtime-secrets.js";
|
|
34
|
+
import { cloudRunServicePrefix, DEFAULT_MCP_AUTH_PROXY_MAX_INSTANCES, fixedCloudRunServiceName, MCP_AUTH_PROXY_TIMEOUT_SECONDS, mcpAuthProxyEnvContract, OPERATOR_OAUTH_CLIENT_FILE, remoteMcpIdentity, remoteMcpIdentityEnv, secretFilePath, serviceSecrets, } from "./stack-contract.js";
|
|
35
|
+
import { listFlag } from "./stack-converge.js";
|
|
36
|
+
import { lookupFailure, resolveGcpResourceName } from "./upgrade/gcp-lookup.js";
|
|
37
|
+
const NOT_FOUND = /NOT_FOUND|not found|does not exist|could not be found/i;
|
|
38
|
+
/** Ensure everything {@link ReleaseServicesTarget} needs; outcomes in order, failures included. */
|
|
39
|
+
export async function ensureReleaseServices(target, deps = {}) {
|
|
40
|
+
const run = deps.run ?? defaultGcloud;
|
|
41
|
+
const outcomes = [];
|
|
42
|
+
const account = await ensureMcpAuthProxyServiceAccount(target, { run });
|
|
43
|
+
outcomes.push(account);
|
|
44
|
+
if (account.status === "failed")
|
|
45
|
+
return outcomes;
|
|
46
|
+
outcomes.push(...(await ensureMcpAuthProxySecretAccess(target, run)));
|
|
47
|
+
if (outcomes.some((o) => o.status === "failed"))
|
|
48
|
+
return outcomes;
|
|
49
|
+
outcomes.push(target.provider === "gcp-firebase"
|
|
50
|
+
? await ensureDataGatewayService(target, run, deps.writeSpecFile ?? writeTempSpec)
|
|
51
|
+
: await ensureMcpAuthProxyServiceGcp(target, run));
|
|
52
|
+
return outcomes;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* `secretAccessor` for the proxy's account on each secret it reads
|
|
56
|
+
* (stack-contract.ts `serviceSecrets("mcp-auth-proxy")`) and nothing else.
|
|
57
|
+
* `add-iam-policy-binding` is idempotent; the stack invariants ensure the
|
|
58
|
+
* same bindings again later in the converge.
|
|
59
|
+
*/
|
|
60
|
+
async function ensureMcpAuthProxySecretAccess(target, run) {
|
|
61
|
+
const member = `serviceAccount:${mcpAuthProxyServiceAccountEmail(target.projectId, target.env)}`;
|
|
62
|
+
const outcomes = [];
|
|
63
|
+
for (const secret of serviceSecrets("mcp-auth-proxy")) {
|
|
64
|
+
const id = `secretAccessor → MCP-Auth-Proxy on ${secret}`;
|
|
65
|
+
const r = await run([
|
|
66
|
+
"secrets",
|
|
67
|
+
"add-iam-policy-binding",
|
|
68
|
+
gcpSecretId(target.env, secret),
|
|
69
|
+
`--project=${target.projectId}`,
|
|
70
|
+
`--member=${member}`,
|
|
71
|
+
"--role=roles/secretmanager.secretAccessor",
|
|
72
|
+
"--condition=None",
|
|
73
|
+
"--quiet",
|
|
74
|
+
]);
|
|
75
|
+
outcomes.push(r.ok ? { id, status: "present" } : { id, status: "failed", error: r.stderr.trim() });
|
|
76
|
+
}
|
|
77
|
+
return outcomes;
|
|
78
|
+
}
|
|
79
|
+
// ===========================================================================
|
|
80
|
+
// gcp-firebase: the data gateway
|
|
81
|
+
// ===========================================================================
|
|
82
|
+
/**
|
|
83
|
+
* The Knative service spec of `serviceJson` (`gcloud run services describe
|
|
84
|
+
* --format=json`) as a new service named `name`, for `gcloud run services
|
|
85
|
+
* replace`: the configuration only — image, env, secrets, volumes, VPC,
|
|
86
|
+
* scaling, account, ingress — without the source's identity (uid, revision
|
|
87
|
+
* names, status), its tool stamps or its traffic pins.
|
|
88
|
+
*
|
|
89
|
+
* @throws when the source is not a gateway image (a re-run must never copy
|
|
90
|
+
* the MCP-Auth-Proxy the old service became)
|
|
91
|
+
*/
|
|
92
|
+
export function cloneServiceSpec(serviceJson, name) {
|
|
93
|
+
const svc = JSON.parse(serviceJson);
|
|
94
|
+
const image = svc.spec?.template?.spec?.containers?.[0]?.image ?? "";
|
|
95
|
+
if (!/\/gateway[@:]/.test(image)) {
|
|
96
|
+
throw new Error(`the source service runs ${image || "no image"}, not a Caelo gateway image — the visitor gateway cannot be copied from it`);
|
|
97
|
+
}
|
|
98
|
+
const keepLabels = (labels) => Object.fromEntries(Object.entries(labels ?? {}).filter(([k]) => !k.startsWith("cloud.googleapis.com/") &&
|
|
99
|
+
!k.startsWith("run.googleapis.com/") &&
|
|
100
|
+
!k.startsWith("client.knative.dev/") &&
|
|
101
|
+
!k.startsWith("serving.knative.dev/") &&
|
|
102
|
+
!k.startsWith("goog-")));
|
|
103
|
+
// Service-level: only the settings; the rest are server stamps.
|
|
104
|
+
const KEEP_SERVICE_ANNOTATIONS = [
|
|
105
|
+
"run.googleapis.com/ingress",
|
|
106
|
+
"run.googleapis.com/launch-stage",
|
|
107
|
+
];
|
|
108
|
+
const annotations = Object.fromEntries(Object.entries(svc.metadata?.annotations ?? {}).filter(([k]) => KEEP_SERVICE_ANNOTATIONS.includes(k)));
|
|
109
|
+
const templateAnnotations = Object.fromEntries(Object.entries(svc.spec?.template?.metadata?.annotations ?? {}).filter(([k]) => k !== "run.googleapis.com/client-name" && k !== "run.googleapis.com/client-version"));
|
|
110
|
+
return JSON.stringify({
|
|
111
|
+
apiVersion: svc.apiVersion ?? "serving.knative.dev/v1",
|
|
112
|
+
kind: svc.kind ?? "Service",
|
|
113
|
+
metadata: { name, labels: keepLabels(svc.metadata?.labels), annotations },
|
|
114
|
+
spec: {
|
|
115
|
+
template: {
|
|
116
|
+
metadata: {
|
|
117
|
+
labels: keepLabels(svc.spec?.template?.metadata?.labels),
|
|
118
|
+
annotations: templateAnnotations,
|
|
119
|
+
},
|
|
120
|
+
spec: svc.spec?.template?.spec ?? {},
|
|
121
|
+
},
|
|
122
|
+
traffic: [{ percent: 100, latestRevision: true }],
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
function writeTempSpec(json) {
|
|
127
|
+
const dir = mkdtempSync(join(tmpdir(), "caelo-service-"));
|
|
128
|
+
const path = join(dir, "service.json");
|
|
129
|
+
writeFileSync(path, json, { mode: 0o600 });
|
|
130
|
+
return { path, cleanup: () => rmSync(dir, { recursive: true, force: true }) };
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* The gcp-firebase data gateway (`caelo-<env>-data-gateway`): present, or
|
|
134
|
+
* created as a copy of the `caelo-<env>-gateway*` service. Its public invoker
|
|
135
|
+
* and the admin's `run.viewer` (the Firebase rewrite) follow from the stack
|
|
136
|
+
* invariants later in the converge.
|
|
137
|
+
*/
|
|
138
|
+
async function ensureDataGatewayService(target, run, writeSpecFile) {
|
|
139
|
+
const name = fixedCloudRunServiceName(target.provider, target.env, "gateway");
|
|
140
|
+
const id = `Cloud Run service ${name} (the visitor gateway)`;
|
|
141
|
+
const where = [`--region=${target.region}`, `--project=${target.projectId}`];
|
|
142
|
+
const existing = await run([
|
|
143
|
+
"run",
|
|
144
|
+
"services",
|
|
145
|
+
"describe",
|
|
146
|
+
name,
|
|
147
|
+
...where,
|
|
148
|
+
"--format=value(metadata.name)",
|
|
149
|
+
]);
|
|
150
|
+
if (existing.ok)
|
|
151
|
+
return { id, status: "present" };
|
|
152
|
+
if (!NOT_FOUND.test(existing.stderr)) {
|
|
153
|
+
return { id, status: "failed", error: existing.stderr.trim() };
|
|
154
|
+
}
|
|
155
|
+
// The source: the service that was the gateway and becomes the proxy.
|
|
156
|
+
const sourcePrefix = cloudRunServicePrefix(target.provider, target.env, "mcp-auth-proxy");
|
|
157
|
+
const source = await resolveGcpResourceName(run, "run-service", sourcePrefix, target.projectId, target.region);
|
|
158
|
+
if (source.status !== "found") {
|
|
159
|
+
return {
|
|
160
|
+
id,
|
|
161
|
+
status: "failed",
|
|
162
|
+
error: lookupFailure(source, `${sourcePrefix}* Cloud Run service`, "operator"),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
const described = await run([
|
|
166
|
+
"run",
|
|
167
|
+
"services",
|
|
168
|
+
"describe",
|
|
169
|
+
source.name,
|
|
170
|
+
...where,
|
|
171
|
+
"--format=json",
|
|
172
|
+
]);
|
|
173
|
+
if (!described.ok) {
|
|
174
|
+
return { id, status: "failed", error: `describe ${source.name}: ${described.stderr.trim()}` };
|
|
175
|
+
}
|
|
176
|
+
let spec;
|
|
177
|
+
try {
|
|
178
|
+
spec = cloneServiceSpec(described.stdout, name);
|
|
179
|
+
}
|
|
180
|
+
catch (e) {
|
|
181
|
+
return {
|
|
182
|
+
id,
|
|
183
|
+
status: "failed",
|
|
184
|
+
error: `${e instanceof Error ? e.message : String(e)}. Re-run the installer (it creates ${name} from the stack), then upgrade again.`,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
const file = writeSpecFile(spec);
|
|
188
|
+
try {
|
|
189
|
+
const replaced = await run(["run", "services", "replace", file.path, ...where, "--quiet"]);
|
|
190
|
+
return replaced.ok
|
|
191
|
+
? { id, status: "applied", detail: `copied from ${source.name}` }
|
|
192
|
+
: { id, status: "failed", error: replaced.stderr.trim() };
|
|
193
|
+
}
|
|
194
|
+
finally {
|
|
195
|
+
file.cleanup();
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// ===========================================================================
|
|
199
|
+
// gcp: the proxy's service
|
|
200
|
+
// ===========================================================================
|
|
201
|
+
/**
|
|
202
|
+
* The full env the `gcp` proxy is deployed with: its contract plus the
|
|
203
|
+
* remote-MCP identity it can derive without a lookup (its public origin is
|
|
204
|
+
* the site's host, the admin's is `admin.<domain>`). The IAP audience is
|
|
205
|
+
* the admin's alone.
|
|
206
|
+
*/
|
|
207
|
+
function gcpProxyEnv(target) {
|
|
208
|
+
const identity = remoteMcpIdentityEnv(remoteMcpIdentity({
|
|
209
|
+
provider: "gcp",
|
|
210
|
+
domain: target.domain,
|
|
211
|
+
// Only the admin's audience uses these; the proxy's env does not.
|
|
212
|
+
projectNumber: "0",
|
|
213
|
+
adminBackendServiceId: "0",
|
|
214
|
+
}))["mcp-auth-proxy"];
|
|
215
|
+
return [...mcpAuthProxyEnvContract({ provider: "gcp", env: target.env }), ...identity];
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* The `gcloud run deploy` argv of the `gcp` proxy: load-balancer-only
|
|
219
|
+
* ingress (its two hops, stack-contract.ts MCP_AUTH_PROXY_TRUSTED_PROXY_HOPS),
|
|
220
|
+
* invokable without a Google identity (MCP clients have none), request-based
|
|
221
|
+
* CPU, no VPC, and its Google sign-in client file as a secret volume.
|
|
222
|
+
*/
|
|
223
|
+
export function gcpProxyDeployArgs(target) {
|
|
224
|
+
const name = fixedCloudRunServiceName("gcp", target.env, "mcp-auth-proxy");
|
|
225
|
+
const env = gcpProxyEnv(target);
|
|
226
|
+
const plain = env.flatMap((e) => ("value" in e ? [`${e.name}=${e.value}`] : []));
|
|
227
|
+
const secrets = [
|
|
228
|
+
...env.flatMap((e) => "valueSource" in e
|
|
229
|
+
? [`${e.name}=${e.valueSource.secretKeyRef.secret}:${e.valueSource.secretKeyRef.version}`]
|
|
230
|
+
: []),
|
|
231
|
+
`${secretFilePath(OPERATOR_OAUTH_CLIENT_FILE)}=${gcpSecretId(target.env, OPERATOR_OAUTH_CLIENT_FILE.secret)}:${OPERATOR_OAUTH_CLIENT_FILE.version}`,
|
|
232
|
+
];
|
|
233
|
+
return [
|
|
234
|
+
"run",
|
|
235
|
+
"deploy",
|
|
236
|
+
name,
|
|
237
|
+
`--image=${target.mcpAuthProxyImageRef}`,
|
|
238
|
+
`--region=${target.region}`,
|
|
239
|
+
`--project=${target.projectId}`,
|
|
240
|
+
`--service-account=${mcpAuthProxyServiceAccountEmail(target.projectId, target.env)}`,
|
|
241
|
+
"--ingress=internal-and-cloud-load-balancing",
|
|
242
|
+
"--allow-unauthenticated",
|
|
243
|
+
"--min-instances=0",
|
|
244
|
+
`--max-instances=${DEFAULT_MCP_AUTH_PROXY_MAX_INSTANCES}`,
|
|
245
|
+
"--cpu=1",
|
|
246
|
+
"--memory=512Mi",
|
|
247
|
+
"--cpu-throttling",
|
|
248
|
+
`--timeout=${MCP_AUTH_PROXY_TIMEOUT_SECONDS}`,
|
|
249
|
+
listFlag("--set-env-vars", plain),
|
|
250
|
+
listFlag("--set-secrets", secrets),
|
|
251
|
+
"--quiet",
|
|
252
|
+
];
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* The `gcp` proxy service: present, or deployed. Deployed once; the
|
|
256
|
+
* app-roll moves it onto each release's image after that.
|
|
257
|
+
*/
|
|
258
|
+
export async function ensureMcpAuthProxyServiceGcp(target, run) {
|
|
259
|
+
const name = fixedCloudRunServiceName("gcp", target.env, "mcp-auth-proxy");
|
|
260
|
+
const id = `Cloud Run service ${name} (the MCP-Auth-Proxy)`;
|
|
261
|
+
const existing = await run([
|
|
262
|
+
"run",
|
|
263
|
+
"services",
|
|
264
|
+
"describe",
|
|
265
|
+
name,
|
|
266
|
+
`--region=${target.region}`,
|
|
267
|
+
`--project=${target.projectId}`,
|
|
268
|
+
"--format=value(metadata.name)",
|
|
269
|
+
]);
|
|
270
|
+
if (existing.ok)
|
|
271
|
+
return { id, status: "present" };
|
|
272
|
+
if (!NOT_FOUND.test(existing.stderr)) {
|
|
273
|
+
return { id, status: "failed", error: existing.stderr.trim() };
|
|
274
|
+
}
|
|
275
|
+
const deployed = await run(gcpProxyDeployArgs(target));
|
|
276
|
+
return deployed.ok
|
|
277
|
+
? { id, status: "applied" }
|
|
278
|
+
: { id, status: "failed", error: deployed.stderr.trim() };
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=mcp-auth-proxy-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-auth-proxy-setup.js","sourceRoot":"","sources":["../src/mcp-auth-proxy-setup.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,WAAW,EAAE,+BAA+B,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAsB,gCAAgC,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAEL,qBAAqB,EACrB,oCAAoC,EACpC,wBAAwB,EAExB,8BAA8B,EAC9B,uBAAuB,EACvB,0BAA0B,EAC1B,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAuBhF,MAAM,SAAS,GAAG,wDAAwD,CAAC;AAE3E,mGAAmG;AACnG,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAA6B,EAC7B,OAA4B,EAAE;IAE9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,aAAa,CAAC;IACtC,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,gCAAgC,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACxE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACjD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,8BAA8B,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACtE,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IACjE,QAAQ,CAAC,IAAI,CACX,MAAM,CAAC,QAAQ,KAAK,cAAc;QAChC,CAAC,CAAC,MAAM,wBAAwB,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC;QAClF,CAAC,CAAC,MAAM,4BAA4B,CAAC,MAAM,EAAE,GAAG,CAAC,CACpD,CAAC;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,8BAA8B,CAC3C,MAAwD,EACxD,GAAiB;IAEjB,MAAM,MAAM,GAAG,kBAAkB,+BAA+B,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACjG,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,KAAK,MAAM,MAAM,IAAI,cAAc,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACtD,MAAM,EAAE,GAAG,sCAAsC,MAAM,EAAE,CAAC;QAC1D,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC;YAClB,SAAS;YACT,wBAAwB;YACxB,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC;YAC/B,aAAa,MAAM,CAAC,SAAS,EAAE;YAC/B,YAAY,MAAM,EAAE;YACpB,2CAA2C;YAC3C,kBAAkB;YAClB,SAAS;SACV,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CACX,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CACpF,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,iCAAiC;AACjC,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB,EAAE,IAAY;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAUjC,CAAC;IACF,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;IACrE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,2BAA2B,KAAK,IAAI,UAAU,4EAA4E,CAC3H,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,CAAC,MAA0C,EAAE,EAAE,CAChE,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CACjC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CACN,CAAC,CAAC,CAAC,UAAU,CAAC,uBAAuB,CAAC;QACtC,CAAC,CAAC,CAAC,UAAU,CAAC,qBAAqB,CAAC;QACpC,CAAC,CAAC,CAAC,UAAU,CAAC,qBAAqB,CAAC;QACpC,CAAC,CAAC,CAAC,UAAU,CAAC,sBAAsB,CAAC;QACrC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CACzB,CACF,CAAC;IACJ,gEAAgE;IAChE,MAAM,wBAAwB,GAAG;QAC/B,4BAA4B;QAC5B,iCAAiC;KAClC,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CACpC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7D,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC,CACrC,CACF,CAAC;IACF,MAAM,mBAAmB,GAAG,MAAM,CAAC,WAAW,CAC5C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,CACpE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,gCAAgC,IAAI,CAAC,KAAK,mCAAmC,CAC7F,CACF,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,wBAAwB;QACtD,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,SAAS;QAC3B,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE;QACzE,IAAI,EAAE;YACJ,QAAQ,EAAE;gBACR,QAAQ,EAAE;oBACR,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;oBACxD,WAAW,EAAE,mBAAmB;iBACjC;gBACD,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE;aACrC;YACD,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;SAClD;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACvC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAChF,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,wBAAwB,CACrC,MAA6B,EAC7B,GAAiB,EACjB,aAAgE;IAEhE,MAAM,IAAI,GAAG,wBAAwB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,EAAE,SAAS,CAAW,CAAC;IACxF,MAAM,EAAE,GAAG,qBAAqB,IAAI,wBAAwB,CAAC;IAC7D,MAAM,KAAK,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,EAAE,EAAE,aAAa,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC;QACzB,KAAK;QACL,UAAU;QACV,UAAU;QACV,IAAI;QACJ,GAAG,KAAK;QACR,+BAA+B;KAChC,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAClD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IACjE,CAAC;IACD,sEAAsE;IACtE,MAAM,YAAY,GAAG,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAC1F,MAAM,MAAM,GAAG,MAAM,sBAAsB,CACzC,GAAG,EACH,aAAa,EACb,YAAY,EACZ,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,MAAM,CACd,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC9B,OAAO;YACL,EAAE;YACF,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,aAAa,CAAC,MAAM,EAAE,GAAG,YAAY,qBAAqB,EAAE,UAAU,CAAC;SAC/E,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC;QAC1B,KAAK;QACL,UAAU;QACV,UAAU;QACV,MAAM,CAAC,IAAI;QACX,GAAG,KAAK;QACR,eAAe;KAChB,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QAClB,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;IAChG,CAAC;IACD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO;YACL,EAAE;YACF,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,sCAAsC,IAAI,uCAAuC;SACtI,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;QAC3F,OAAO,QAAQ,CAAC,EAAE;YAChB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,MAAM,CAAC,IAAI,EAAE,EAAE;YACjE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IAC9D,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E;;;;;GAKG;AACH,SAAS,WAAW,CAAC,MAAqD;IACxE,MAAM,QAAQ,GAAG,oBAAoB,CACnC,iBAAiB,CAAC;QAChB,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,kEAAkE;QAClE,aAAa,EAAE,GAAG;QAClB,qBAAqB,EAAE,GAAG;KAC3B,CAAC,CACH,CAAC,gBAAgB,CAAC,CAAC;IACpB,OAAO,CAAC,GAAG,uBAAuB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC;AACzF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA6B;IAC9D,MAAM,IAAI,GAAG,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,gBAAgB,CAAW,CAAC;IACrF,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG;QACd,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACnB,aAAa,IAAI,CAAC;YAChB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YAC1F,CAAC,CAAC,EAAE,CACP;QACD,GAAG,cAAc,CAAC,0BAA0B,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,0BAA0B,CAAC,MAAM,CAAC,IAAI,0BAA0B,CAAC,OAAO,EAAE;KACpJ,CAAC;IACF,OAAO;QACL,KAAK;QACL,QAAQ;QACR,IAAI;QACJ,WAAW,MAAM,CAAC,oBAAoB,EAAE;QACxC,YAAY,MAAM,CAAC,MAAM,EAAE;QAC3B,aAAa,MAAM,CAAC,SAAS,EAAE;QAC/B,qBAAqB,+BAA+B,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE;QACpF,6CAA6C;QAC7C,yBAAyB;QACzB,mBAAmB;QACnB,mBAAmB,oCAAoC,EAAE;QACzD,SAAS;QACT,gBAAgB;QAChB,kBAAkB;QAClB,aAAa,8BAA8B,EAAE;QAC7C,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC;QACjC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;QAClC,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,MAA6B,EAC7B,GAAiB;IAEjB,MAAM,IAAI,GAAG,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,gBAAgB,CAAW,CAAC;IACrF,MAAM,EAAE,GAAG,qBAAqB,IAAI,uBAAuB,CAAC;IAC5D,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC;QACzB,KAAK;QACL,UAAU;QACV,UAAU;QACV,IAAI;QACJ,YAAY,MAAM,CAAC,MAAM,EAAE;QAC3B,aAAa,MAAM,CAAC,SAAS,EAAE;QAC/B,+BAA+B;KAChC,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAClD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IACjE,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IACvD,OAAO,QAAQ,CAAC,EAAE;QAChB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;QAC3B,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;AAC9D,CAAC"}
|
|
@@ -63,10 +63,34 @@ export interface DigestMismatch {
|
|
|
63
63
|
readonly image: ReleaseImage;
|
|
64
64
|
/** Which digest differs: the image index, or its linux/amd64 manifest (#1025). */
|
|
65
65
|
readonly form: "index" | "platform";
|
|
66
|
-
/**
|
|
66
|
+
/**
|
|
67
|
+
* The manifest's digest; null when the manifest names none for this form
|
|
68
|
+
* (no platform digests, or an image the release predates —
|
|
69
|
+
* OPTIONAL_RELEASE_IMAGES).
|
|
70
|
+
*/
|
|
67
71
|
readonly expected: string | null;
|
|
68
72
|
readonly actual: string | null;
|
|
69
73
|
}
|
|
74
|
+
/** One service's digest-pinned image in the public mirror. */
|
|
75
|
+
export interface ManifestServiceImage {
|
|
76
|
+
readonly digest: string;
|
|
77
|
+
readonly imageRef: string;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The images the app-roll moves the Cloud Run services onto, from the signed
|
|
81
|
+
* manifest's digests — never a registry tag lookup.
|
|
82
|
+
*
|
|
83
|
+
* Fails for a manifest without an MCP-Auth-Proxy digest: such a release
|
|
84
|
+
* predates #1328, and this code rolls three services, so installing it
|
|
85
|
+
* would leave the proxy on an image of another release.
|
|
86
|
+
*/
|
|
87
|
+
export declare function manifestServiceImages(m: Pick<ReleaseManifest, "version" | "digests">): {
|
|
88
|
+
readonly ok: true;
|
|
89
|
+
readonly images: Readonly<Record<"admin" | "gateway" | "mcp-auth-proxy", ManifestServiceImage>>;
|
|
90
|
+
} | {
|
|
91
|
+
readonly ok: false;
|
|
92
|
+
readonly error: string;
|
|
93
|
+
};
|
|
70
94
|
/**
|
|
71
95
|
* Compare the digests a registry resolved for the release's tags with the
|
|
72
96
|
* signed manifest. Only images present in `resolved` (or `resolvedPlatform`)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release-manifest.d.ts","sourceRoot":"","sources":["../src/release-manifest.ts"],"names":[],"mappings":"AA0BA,OAAO,EAML,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,
|
|
1
|
+
{"version":3,"file":"release-manifest.d.ts","sourceRoot":"","sources":["../src/release-manifest.ts"],"names":[],"mappings":"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"}
|
package/dist/release-manifest.js
CHANGED
|
@@ -24,7 +24,7 @@ import { tmpdir } from "node:os";
|
|
|
24
24
|
import { join } from "node:path";
|
|
25
25
|
import { fetchReleaseArtifact, isSecurityRelease, parseReleaseManifest, RELEASE_CHANNELS, RELEASE_IMAGES, } from "@caelo-cms/shared";
|
|
26
26
|
import { infraStepsText } from "./infra-contract.js";
|
|
27
|
-
import { RELEASE_OIDC_ISSUER, RELEASE_WORKFLOWS_URL } from "./upgrade/release-images.js";
|
|
27
|
+
import { RELEASE_OIDC_ISSUER, RELEASE_WORKFLOWS_URL, releaseImageRef, } from "./upgrade/release-images.js";
|
|
28
28
|
// The manifest's shape and location live in @caelo-cms/shared (the admin's
|
|
29
29
|
// auto-update scheduler reads them too); re-exported so this module stays
|
|
30
30
|
// the CLI's one import for release manifests.
|
|
@@ -160,6 +160,35 @@ export async function fetchVerifiedReleaseManifest(version, deps = defaultDeps)
|
|
|
160
160
|
return fail(parsed.code, `signed manifest: ${parsed.message}`);
|
|
161
161
|
return { ok: true, manifest: parsed.manifest };
|
|
162
162
|
}
|
|
163
|
+
/**
|
|
164
|
+
* The images the app-roll moves the Cloud Run services onto, from the signed
|
|
165
|
+
* manifest's digests — never a registry tag lookup.
|
|
166
|
+
*
|
|
167
|
+
* Fails for a manifest without an MCP-Auth-Proxy digest: such a release
|
|
168
|
+
* predates #1328, and this code rolls three services, so installing it
|
|
169
|
+
* would leave the proxy on an image of another release.
|
|
170
|
+
*/
|
|
171
|
+
export function manifestServiceImages(m) {
|
|
172
|
+
const proxy = m.digests["mcp-auth-proxy"];
|
|
173
|
+
if (!proxy) {
|
|
174
|
+
return {
|
|
175
|
+
ok: false,
|
|
176
|
+
error: `the signed manifest of ${m.version} names no mcp-auth-proxy image: that release predates the MCP-Auth-Proxy (#1328) and cannot be installed by this release's upgrader. Install it from a terminal with the version's own CLI (bunx @caelo-cms/provisioning@${m.version} upgrade).`,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
const image = (slug, digest) => ({
|
|
180
|
+
digest,
|
|
181
|
+
imageRef: releaseImageRef(slug, digest),
|
|
182
|
+
});
|
|
183
|
+
return {
|
|
184
|
+
ok: true,
|
|
185
|
+
images: {
|
|
186
|
+
admin: image("admin", m.digests.admin),
|
|
187
|
+
gateway: image("gateway", m.digests.gateway),
|
|
188
|
+
"mcp-auth-proxy": image("mcp-auth-proxy", proxy),
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
}
|
|
163
192
|
/**
|
|
164
193
|
* Compare the digests a registry resolved for the release's tags with the
|
|
165
194
|
* signed manifest. Only images present in `resolved` (or `resolvedPlatform`)
|
|
@@ -174,9 +203,13 @@ export function compareImageDigests(manifest, resolved, resolvedPlatform = {}) {
|
|
|
174
203
|
const out = [];
|
|
175
204
|
for (const image of RELEASE_IMAGES) {
|
|
176
205
|
if (image in resolved) {
|
|
206
|
+
// An image the signed manifest does not name (a release from before
|
|
207
|
+
// the image existed) can never match: a caller that resolved it is
|
|
208
|
+
// asking about an image the signature does not cover.
|
|
177
209
|
const actual = resolved[image] ?? null;
|
|
178
|
-
|
|
179
|
-
|
|
210
|
+
const expected = manifest.digests[image] ?? null;
|
|
211
|
+
if (actual === null || actual !== expected) {
|
|
212
|
+
out.push({ image, form: "index", expected, actual });
|
|
180
213
|
}
|
|
181
214
|
}
|
|
182
215
|
if (image in resolvedPlatform) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release-manifest.js","sourceRoot":"","sources":["../src/release-manifest.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,GAIf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,
|
|
1
|
+
{"version":3,"file":"release-manifest.js","sourceRoot":"","sources":["../src/release-manifest.ts"],"names":[],"mappings":"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"}
|
package/dist/remote-mcp.d.ts
CHANGED
|
@@ -109,36 +109,41 @@ export interface LiveUrlMap {
|
|
|
109
109
|
export type UrlMapPathsPlan = {
|
|
110
110
|
readonly ok: true;
|
|
111
111
|
readonly map: LiveUrlMap;
|
|
112
|
-
|
|
112
|
+
/** What changed, for the log; empty when the map was already right. */
|
|
113
|
+
readonly changes: string[];
|
|
113
114
|
} | {
|
|
114
115
|
readonly ok: false;
|
|
115
116
|
readonly error: string;
|
|
116
117
|
};
|
|
117
118
|
/**
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
*
|
|
119
|
+
* #1328 — the URL map with the remote-MCP paths ({@link GCP_MCP_AUTH_PROXY_PATHS})
|
|
120
|
+
* on their own rule to the MCP-Auth-Proxy's backend, and none of them left
|
|
121
|
+
* on the gateway's `/api/*` rule (#806 put the discovery paths there). Only
|
|
122
|
+
* those two rules change; redirect rules the admin wrote stay as they are.
|
|
123
|
+
*
|
|
124
|
+
* @param proxyBackend the proxy backend's self-link
|
|
122
125
|
*/
|
|
123
|
-
export declare function planUrlMapPaths(maps: readonly LiveUrlMap[], siteHost: string): UrlMapPathsPlan;
|
|
126
|
+
export declare function planUrlMapPaths(maps: readonly LiveUrlMap[], siteHost: string, proxyBackend: string): UrlMapPathsPlan;
|
|
124
127
|
/**
|
|
125
|
-
* Route the remote-MCP
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
128
|
+
* Route the remote-MCP paths to the MCP-Auth-Proxy on a `gcp` install: read
|
|
129
|
+
* the URL map, apply {@link planUrlMapPaths} and write it back through the
|
|
130
|
+
* Compute API (`urlMaps.update` carries the map's fingerprint, so a
|
|
131
|
+
* concurrent write — the admin publishing redirects — fails instead of
|
|
132
|
+
* being lost; a re-run then succeeds).
|
|
130
133
|
*/
|
|
131
|
-
export declare function ensureUrlMapRemoteMcpPaths(target: Pick<RemoteMcpTarget, "projectId" | "domain">, deps?: {
|
|
134
|
+
export declare function ensureUrlMapRemoteMcpPaths(target: Pick<RemoteMcpTarget, "projectId" | "domain">, proxyBackend: string, deps?: {
|
|
132
135
|
run?: GcloudRunner;
|
|
133
136
|
http?: HttpFetch;
|
|
134
137
|
sleep?: (ms: number) => Promise<void>;
|
|
135
138
|
}): Promise<RemoteMcpResult<{
|
|
136
|
-
readonly
|
|
139
|
+
readonly changes: string[];
|
|
137
140
|
}>>;
|
|
138
141
|
/**
|
|
139
|
-
*
|
|
140
|
-
* ({@link MCP_ARMOR_RULE}
|
|
141
|
-
* to spec.
|
|
142
|
+
* #1328 — the MCP-Auth-Proxy's own Cloud Armor policy with the `/api/mcp/*`
|
|
143
|
+
* rule ({@link MCP_ARMOR_RULE}; remote-mcp-edge.ts says why): created when
|
|
144
|
+
* missing, a rule at its priority brought back to spec. Everything else the
|
|
145
|
+
* policy's default rule allows: the proxy rate-limits every route itself
|
|
146
|
+
* (apps/mcp-auth-proxy rate-limit.ts).
|
|
142
147
|
*/
|
|
143
148
|
export declare function ensureMcpArmorRule(target: Pick<RemoteMcpTarget, "projectId" | "env">, deps?: {
|
|
144
149
|
run?: GcloudRunner;
|
|
@@ -146,8 +151,40 @@ export declare function ensureMcpArmorRule(target: Pick<RemoteMcpTarget, "projec
|
|
|
146
151
|
readonly policy: string;
|
|
147
152
|
readonly action: "present" | "created" | "updated";
|
|
148
153
|
}>>;
|
|
149
|
-
/**
|
|
150
|
-
|
|
154
|
+
/**
|
|
155
|
+
* #1328 — drop the `/api/mcp/*` rule #806 put on the gateway's policy, once
|
|
156
|
+
* the URL map no longer sends those paths to the gateway: there it would
|
|
157
|
+
* only exempt matching paths from the OWASP packs and the ban. A rule at the
|
|
158
|
+
* priority that is not exactly the MCP rule is someone's own and stays.
|
|
159
|
+
*/
|
|
160
|
+
export declare function retireGatewayMcpArmorRule(target: Pick<RemoteMcpTarget, "projectId" | "env">, deps?: {
|
|
161
|
+
run?: GcloudRunner;
|
|
162
|
+
}): Promise<RemoteMcpResult<{
|
|
163
|
+
readonly removed: string | null;
|
|
164
|
+
}>>;
|
|
165
|
+
/**
|
|
166
|
+
* #1328 — the proxy's serverless NEG and backend service (EXTERNAL_MANAGED,
|
|
167
|
+
* its own Cloud Armor policy), created when missing. Returns the backend's
|
|
168
|
+
* self-link for the URL map.
|
|
169
|
+
*/
|
|
170
|
+
export declare function ensureMcpAuthProxyBackend(target: Pick<RemoteMcpTarget, "projectId" | "region" | "env">, deps?: {
|
|
171
|
+
run?: GcloudRunner;
|
|
172
|
+
}): Promise<RemoteMcpResult<{
|
|
173
|
+
readonly backend: string;
|
|
174
|
+
readonly done: string[];
|
|
175
|
+
}>>;
|
|
176
|
+
/**
|
|
177
|
+
* The MCP-Auth-Proxy's load-balancer part on `gcp`, in the order that never
|
|
178
|
+
* routes a request to something that is not there yet: its service (created
|
|
179
|
+
* once with the release's image; mcp-auth-proxy-setup.ts), its Cloud Armor
|
|
180
|
+
* policy, NEG and backend, the URL map's MCP rule, and last the old MCP rule
|
|
181
|
+
* off the gateway's policy. A no-op success on `gcp-firebase`, where the
|
|
182
|
+
* proxy is reached on its own run.app URL.
|
|
183
|
+
*/
|
|
184
|
+
export declare function ensureRemoteMcpEdge(target: Pick<RemoteMcpTarget, "provider" | "projectId" | "region" | "env" | "domain"> & {
|
|
185
|
+
/** The release's digest-pinned proxy image, for a proxy service that does not exist yet. */
|
|
186
|
+
readonly mcpAuthProxyImageRef: string;
|
|
187
|
+
}, deps?: {
|
|
151
188
|
run?: GcloudRunner;
|
|
152
189
|
http?: HttpFetch;
|
|
153
190
|
sleep?: (ms: number) => Promise<void>;
|
package/dist/remote-mcp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-mcp.d.ts","sourceRoot":"","sources":["../src/remote-mcp.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"remote-mcp.d.ts","sourceRoot":"","sources":["../src/remote-mcp.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAStD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAEL,KAAK,YAAY,EAGjB,KAAK,WAAW,EAEhB,KAAK,iBAAiB,EAGvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,SAAS,EAAmC,MAAM,qBAAqB,CAAC;AAGtF,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;CAC3D;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,IACzB,CAAC;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG,CAAC,CAAC,GAC3B;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAsBnD;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,YAAY,CAAA;CAAO,GAChC,OAAO,CAAC,eAAe,CAAC;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAmBvD;AAED,4GAA4G;AAC5G,eAAO,MAAM,sBAAsB,SAAS,CAAC;AAE7C;;;;;;;;;GASG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,eAAe,EACvB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,YAAY,CAAA;CAAO,GAChC,OAAO,CACR,eAAe,CAAC;IAAE,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAC5F,CAOA;AA6GD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,EACvC,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,YAAY,CAAA;CAAO,GAChC,OAAO,CAAC,eAAe,CAAC;IAAE,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAAC,CAAC,CA+BhE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,eAAe,EACvB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,YAAY,CAAA;CAAO,GAChC,OAAO,CACR,eAAe,CAAC;IAAE,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAC5F,CAeA;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,YAAY,CAAA;CAAO,GAChC,OAAO,CAAC,eAAe,CAAC;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAA;CAAE,CAAC,CAAC,CAYjF;AAMD,6FAA6F;AAC7F,UAAU,cAAc;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;CAChC;AACD,UAAU,iBAAiB;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CACvC;AACD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAClF,QAAQ,CAAC,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC5C,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CACnC;AAED,MAAM,MAAM,eAAe,GACvB;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;CAC5B,GACD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAOnD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,SAAS,UAAU,EAAE,EAC3B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,eAAe,CA4DjB;AAKD;;;;;;GAMG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,GAAG,QAAQ,CAAC,EACrD,YAAY,EAAE,MAAM,EACpB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,YAAY,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAAO,GACzF,OAAO,CAAC,eAAe,CAAC;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC,CAuD1D;AA8BD;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,GAAG,KAAK,CAAC,EAClD,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,YAAY,CAAA;CAAO,GAChC,OAAO,CACR,eAAe,CAAC;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAA;CAAE,CAAC,CACjG,CAuCA;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,GAAG,KAAK,CAAC,EAClD,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,YAAY,CAAA;CAAO,GAChC,OAAO,CAAC,eAAe,CAAC;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC,CA0C/D;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,GAAG,QAAQ,GAAG,KAAK,CAAC,EAC7D,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,YAAY,CAAA;CAAO,GAChC,OAAO,CAAC,eAAe,CAAC;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC,CAyGjF;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAC,GAAG;IACtF,4FAA4F;IAC5F,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC,EACD,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,YAAY,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAAO,GACzF,OAAO,CAAC,eAAe,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC,CA2BvD"}
|