@caelo-cms/provisioning 0.10.55 → 0.10.58
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/agent-db.js +97 -24
- package/dist/cli-routing.js +1 -1
- package/dist/cli-routing.js.map +1 -1
- package/dist/cli.js +4 -1
- package/dist/cli.js.map +1 -1
- package/dist/compose.js +5 -0
- package/dist/compose.js.map +1 -1
- package/dist/converge-checkpoint.d.ts +66 -0
- package/dist/converge-checkpoint.d.ts.map +1 -0
- package/dist/converge-checkpoint.js +61 -0
- package/dist/converge-checkpoint.js.map +1 -0
- package/dist/converge-job-gcp.d.ts +46 -0
- package/dist/converge-job-gcp.d.ts.map +1 -0
- package/dist/converge-job-gcp.js +368 -0
- package/dist/converge-job-gcp.js.map +1 -0
- package/dist/converge-job-setup.d.ts +62 -0
- package/dist/converge-job-setup.d.ts.map +1 -0
- package/dist/converge-job-setup.js +228 -0
- package/dist/converge-job-setup.js.map +1 -0
- package/dist/converge-job.d.ts +141 -0
- package/dist/converge-job.d.ts.map +1 -0
- package/dist/converge-job.js +325 -0
- package/dist/converge-job.js.map +1 -0
- package/dist/gcp-names.d.ts +9 -0
- package/dist/gcp-names.d.ts.map +1 -1
- package/dist/gcp-names.js +13 -0
- package/dist/gcp-names.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- 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 +33 -1
- package/dist/infra-contract.js.map +1 -1
- package/dist/install-job.d.ts +11 -3
- package/dist/install-job.d.ts.map +1 -1
- package/dist/install-job.js +22 -12
- package/dist/install-job.js.map +1 -1
- package/dist/lifecycle.d.ts +13 -1
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +115 -58
- package/dist/lifecycle.js.map +1 -1
- package/dist/operator-access.d.ts +4 -0
- package/dist/operator-access.d.ts.map +1 -1
- package/dist/operator-access.js +43 -7
- package/dist/operator-access.js.map +1 -1
- package/dist/release-contract.d.ts +3 -2
- package/dist/release-contract.d.ts.map +1 -1
- package/dist/release-contract.js +5 -2
- package/dist/release-contract.js.map +1 -1
- package/dist/release-manifest.d.ts +2 -0
- package/dist/release-manifest.d.ts.map +1 -1
- package/dist/release-manifest.js.map +1 -1
- package/dist/remote-mcp-edge.d.ts +114 -0
- package/dist/remote-mcp-edge.d.ts.map +1 -0
- package/dist/remote-mcp-edge.js +116 -0
- package/dist/remote-mcp-edge.js.map +1 -0
- package/dist/remote-mcp.d.ts +139 -0
- package/dist/remote-mcp.d.ts.map +1 -0
- package/dist/remote-mcp.js +434 -0
- package/dist/remote-mcp.js.map +1 -0
- package/dist/runtime-secrets.d.ts +12 -0
- package/dist/runtime-secrets.d.ts.map +1 -1
- package/dist/runtime-secrets.js +32 -4
- package/dist/runtime-secrets.js.map +1 -1
- package/dist/seal-key-rotation.d.ts +38 -0
- package/dist/seal-key-rotation.d.ts.map +1 -0
- package/dist/seal-key-rotation.js +206 -0
- package/dist/seal-key-rotation.js.map +1 -0
- package/dist/stack-contract.d.ts +206 -3
- package/dist/stack-contract.d.ts.map +1 -1
- package/dist/stack-contract.js +219 -4
- package/dist/stack-contract.js.map +1 -1
- package/dist/stack-converge.d.ts +53 -1
- package/dist/stack-converge.d.ts.map +1 -1
- package/dist/stack-converge.js +124 -4
- package/dist/stack-converge.js.map +1 -1
- package/dist/state-lock-lease.d.ts +142 -0
- package/dist/state-lock-lease.d.ts.map +1 -0
- package/dist/state-lock-lease.js +347 -0
- package/dist/state-lock-lease.js.map +1 -0
- package/dist/state-store.d.ts +66 -9
- package/dist/state-store.d.ts.map +1 -1
- package/dist/state-store.js +249 -30
- package/dist/state-store.js.map +1 -1
- package/dist/upgrade/app-roll.d.ts +36 -7
- package/dist/upgrade/app-roll.d.ts.map +1 -1
- package/dist/upgrade/app-roll.js +53 -19
- package/dist/upgrade/app-roll.js.map +1 -1
- package/dist/upgrade/audit-job-roll.d.ts.map +1 -1
- package/dist/upgrade/audit-job-roll.js +3 -1
- package/dist/upgrade/audit-job-roll.js.map +1 -1
- package/dist/upgrade/converge.d.ts.map +1 -1
- package/dist/upgrade/converge.js +125 -12
- package/dist/upgrade/converge.js.map +1 -1
- package/dist/upgrade/gcp-lookup.d.ts +27 -10
- package/dist/upgrade/gcp-lookup.d.ts.map +1 -1
- package/dist/upgrade/gcp-lookup.js +46 -7
- package/dist/upgrade/gcp-lookup.js.map +1 -1
- package/dist/upgrade/record-rolled.d.ts +40 -0
- package/dist/upgrade/record-rolled.d.ts.map +1 -0
- package/dist/upgrade/record-rolled.js +46 -0
- package/dist/upgrade/record-rolled.js.map +1 -0
- package/dist/upgrade/upgrade.d.ts +45 -1
- package/dist/upgrade/upgrade.d.ts.map +1 -1
- package/dist/upgrade/upgrade.js +60 -17
- package/dist/upgrade/upgrade.js.map +1 -1
- package/dist/upgrader-assess.d.ts +15 -1
- package/dist/upgrader-assess.d.ts.map +1 -1
- package/dist/upgrader-assess.js +36 -6
- package/dist/upgrader-assess.js.map +1 -1
- package/dist/upgrader-gcp.d.ts +15 -0
- package/dist/upgrader-gcp.d.ts.map +1 -1
- package/dist/upgrader-gcp.js +42 -7
- package/dist/upgrader-gcp.js.map +1 -1
- package/dist/upgrader-iam-preflight.d.ts +123 -0
- package/dist/upgrader-iam-preflight.d.ts.map +1 -0
- package/dist/upgrader-iam-preflight.js +414 -0
- package/dist/upgrader-iam-preflight.js.map +1 -0
- package/dist/upgrader-job.d.ts +33 -9
- package/dist/upgrader-job.d.ts.map +1 -1
- package/dist/upgrader-job.js +169 -27
- package/dist/upgrader-job.js.map +1 -1
- package/dist/upgrader-records.d.ts +58 -0
- package/dist/upgrader-records.d.ts.map +1 -0
- package/dist/upgrader-records.js +87 -0
- package/dist/upgrader-records.js.map +1 -0
- package/dist/upgrader-reporter.d.ts +3 -2
- package/dist/upgrader-reporter.d.ts.map +1 -1
- package/dist/upgrader-reporter.js +10 -2
- package/dist/upgrader-reporter.js.map +1 -1
- package/dist/upgrader-setup.d.ts +25 -3
- package/dist/upgrader-setup.d.ts.map +1 -1
- package/dist/upgrader-setup.js +123 -11
- package/dist/upgrader-setup.js.map +1 -1
- package/dist/wizards/gcp-cost.d.ts.map +1 -1
- package/dist/wizards/gcp-cost.js +11 -3
- package/dist/wizards/gcp-cost.js.map +1 -1
- package/dist/wizards/gcp-pulumi.d.ts +6 -0
- package/dist/wizards/gcp-pulumi.d.ts.map +1 -1
- package/dist/wizards/gcp-pulumi.js +14 -2
- package/dist/wizards/gcp-pulumi.js.map +1 -1
- package/dist/wizards/gcp.d.ts.map +1 -1
- package/dist/wizards/gcp.js +106 -4
- package/dist/wizards/gcp.js.map +1 -1
- package/package.json +2 -2
- package/src/agent/run.test.ts +14 -1
- package/src/audit-job-setup.test.ts +7 -1
- package/src/cli-routing.ts +1 -1
- package/src/cli.ts +4 -1
- package/src/compose.ts +5 -0
- package/src/converge-checkpoint.ts +75 -0
- package/src/converge-entrypoint.test.ts +213 -0
- package/src/converge-job-gcp.test.ts +222 -0
- package/src/converge-job-gcp.ts +443 -0
- package/src/converge-job-setup.test.ts +152 -0
- package/src/converge-job-setup.ts +268 -0
- package/src/converge-job.test.ts +486 -0
- package/src/converge-job.ts +542 -0
- package/src/gateway-env-isolation.test.ts +8 -1
- package/src/gcp-names.ts +15 -0
- package/src/gcp-url-map.test.ts +9 -1
- package/src/index.ts +8 -0
- package/src/infra-contract.test.ts +8 -4
- package/src/infra-contract.ts +33 -1
- package/src/install-job.test.ts +3 -1
- package/src/install-job.ts +31 -14
- package/src/lifecycle.ts +137 -71
- package/src/operator-access.test.ts +24 -1
- package/src/operator-access.ts +44 -6
- package/src/release-contract.ts +5 -2
- package/src/release-manifest.test.ts +42 -0
- package/src/release-manifest.ts +2 -0
- package/src/remote-mcp-edge.ts +137 -0
- package/src/remote-mcp.test.ts +690 -0
- package/src/remote-mcp.ts +524 -0
- package/src/runtime-secrets.test.ts +31 -6
- package/src/runtime-secrets.ts +41 -3
- package/src/seal-key-rotation.test.ts +131 -0
- package/src/seal-key-rotation.ts +258 -0
- package/src/stack-contract-parity.test.ts +20 -3
- package/src/stack-contract.test.ts +32 -2
- package/src/stack-contract.ts +363 -4
- package/src/stack-converge-secrets.test.ts +4 -0
- package/src/stack-converge.test.ts +21 -5
- package/src/stack-converge.ts +162 -7
- package/src/state-attach.test.ts +7 -1
- package/src/state-lock-lease.test.ts +302 -0
- package/src/state-lock-lease.ts +423 -0
- package/src/state-lock.test.ts +568 -0
- package/src/state-store.ts +347 -27
- package/src/upgrade/app-roll.ts +102 -21
- package/src/upgrade/audit-job-roll.ts +3 -1
- package/src/upgrade/converge.ts +148 -10
- package/src/upgrade/gcp-lookup.test.ts +80 -0
- package/src/upgrade/gcp-lookup.ts +65 -8
- package/src/upgrade/record-rolled.test.ts +105 -0
- package/src/upgrade/record-rolled.ts +91 -0
- package/src/upgrade/upgrade.test.ts +203 -3
- package/src/upgrade/upgrade.ts +120 -24
- package/src/upgrader-assess.test.ts +92 -3
- package/src/upgrader-assess.ts +58 -9
- package/src/upgrader-gcp.ts +47 -8
- package/src/upgrader-iam-preflight.test.ts +393 -0
- package/src/upgrader-iam-preflight.ts +510 -0
- package/src/upgrader-job.test.ts +586 -15
- package/src/upgrader-job.ts +237 -53
- package/src/upgrader-records.ts +151 -0
- package/src/upgrader-reporter.test.ts +6 -0
- package/src/upgrader-reporter.ts +7 -2
- package/src/upgrader-setup.test.ts +3 -3
- package/src/upgrader-setup.ts +128 -11
- package/src/wizards/gcp-cost.ts +12 -3
- package/src/wizards/gcp-pulumi.test.ts +15 -0
- package/src/wizards/gcp-pulumi.ts +18 -2
- package/src/wizards/gcp.ts +134 -4
- package/stacks/aws/index.ts +10 -0
- package/stacks/azure/index.ts +9 -0
- package/stacks/gcp/index.ts +47 -7
- package/stacks/gcp-firebase/index.ts +38 -6
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { GcloudRunner } from "./gcloud-retry.js";
|
|
2
|
+
import type { HttpFetch } from "./runtime-secrets.js";
|
|
3
|
+
import { type CloudRunSlug, type GcpProvider, type RemoteMcpIdentity } from "./stack-contract.js";
|
|
4
|
+
import { type EnvChange } from "./stack-converge.js";
|
|
5
|
+
/** The install remote MCP is set up on. */
|
|
6
|
+
export interface RemoteMcpTarget {
|
|
7
|
+
readonly provider: GcpProvider;
|
|
8
|
+
readonly projectId: string;
|
|
9
|
+
readonly region: string;
|
|
10
|
+
/** Pulumi stack name (`production`). */
|
|
11
|
+
readonly env: string;
|
|
12
|
+
readonly domain: string;
|
|
13
|
+
/** Deployed (Pulumi-suffixed) Cloud Run service names. */
|
|
14
|
+
readonly services: Readonly<Record<CloudRunSlug, string>>;
|
|
15
|
+
}
|
|
16
|
+
export type RemoteMcpResult<T> = ({
|
|
17
|
+
readonly ok: true;
|
|
18
|
+
} & T) | {
|
|
19
|
+
readonly ok: false;
|
|
20
|
+
readonly error: string;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* #914 — the project's Google organisation domain (the organisation's
|
|
24
|
+
* `displayName`, which Cloud Resource Manager sets to its primary domain),
|
|
25
|
+
* or `none` when the project sits in no organisation. Read as the
|
|
26
|
+
* operator's identity: `organizations describe` needs
|
|
27
|
+
* `resourcemanager.organizations.get` on the organisation, which project
|
|
28
|
+
* Owners often have and the admin's service account never does.
|
|
29
|
+
*/
|
|
30
|
+
export declare function resolveGoogleOrgDomain(projectId: string, deps?: {
|
|
31
|
+
run?: GcloudRunner;
|
|
32
|
+
}): Promise<RemoteMcpResult<{
|
|
33
|
+
readonly domain: string;
|
|
34
|
+
}>>;
|
|
35
|
+
/** `CAELO_GOOGLE_ORG_DOMAIN` value for a project outside any organisation (admin-core identity-gate.ts). */
|
|
36
|
+
export declare const NO_GOOGLE_ORGANISATION = "none";
|
|
37
|
+
/**
|
|
38
|
+
* Read the live identities {@link remoteMcpIdentity} derives from: the
|
|
39
|
+
* project number, and the admin's backend service id (`gcp`) or both
|
|
40
|
+
* services' URLs (`gcp-firebase`). Fails naming what it could not read.
|
|
41
|
+
*
|
|
42
|
+
* The organisation domain (#914) is best-effort: when it cannot be read,
|
|
43
|
+
* `orgDomainError` says why and the identity carries none, so the admin's
|
|
44
|
+
* var keeps its value — the admin then reports the organisation as unknown
|
|
45
|
+
* and refuses user creation loudly until the Owner sets up Google sign-in.
|
|
46
|
+
*/
|
|
47
|
+
export declare function resolveRemoteMcpIdentity(target: RemoteMcpTarget, deps?: {
|
|
48
|
+
run?: GcloudRunner;
|
|
49
|
+
}): Promise<RemoteMcpResult<{
|
|
50
|
+
readonly identity: RemoteMcpIdentity;
|
|
51
|
+
readonly orgDomainError?: string;
|
|
52
|
+
}>>;
|
|
53
|
+
/**
|
|
54
|
+
* Bring both services' {@link RemoteMcpIdentity} env vars to `identity`
|
|
55
|
+
* with one `gcloud run services update` per service that differs (a new
|
|
56
|
+
* revision only then). Vars already right are left alone.
|
|
57
|
+
*/
|
|
58
|
+
export declare function applyRemoteMcpIdentityEnv(target: RemoteMcpTarget, identity: RemoteMcpIdentity, deps?: {
|
|
59
|
+
run?: GcloudRunner;
|
|
60
|
+
}): Promise<RemoteMcpResult<{
|
|
61
|
+
readonly changes: Record<CloudRunSlug, EnvChange[]>;
|
|
62
|
+
}>>;
|
|
63
|
+
/** {@link resolveRemoteMcpIdentity} then {@link applyRemoteMcpIdentityEnv}. */
|
|
64
|
+
export declare function ensureRemoteMcpIdentityEnv(target: RemoteMcpTarget, deps?: {
|
|
65
|
+
run?: GcloudRunner;
|
|
66
|
+
}): Promise<RemoteMcpResult<{
|
|
67
|
+
readonly identity: RemoteMcpIdentity;
|
|
68
|
+
readonly changes: Record<CloudRunSlug, EnvChange[]>;
|
|
69
|
+
readonly orgDomainError?: string;
|
|
70
|
+
}>>;
|
|
71
|
+
/** A path rule / matcher / URL map as the Compute API returns them (the parts used here). */
|
|
72
|
+
interface UrlMapPathRule {
|
|
73
|
+
readonly paths: string[];
|
|
74
|
+
readonly service?: string;
|
|
75
|
+
readonly urlRedirect?: unknown;
|
|
76
|
+
}
|
|
77
|
+
interface UrlMapPathMatcher {
|
|
78
|
+
readonly name: string;
|
|
79
|
+
readonly pathRules?: UrlMapPathRule[];
|
|
80
|
+
}
|
|
81
|
+
export interface LiveUrlMap {
|
|
82
|
+
readonly name: string;
|
|
83
|
+
readonly hostRules?: {
|
|
84
|
+
readonly hosts: string[];
|
|
85
|
+
readonly pathMatcher: string;
|
|
86
|
+
}[];
|
|
87
|
+
readonly pathMatchers?: UrlMapPathMatcher[];
|
|
88
|
+
readonly [field: string]: unknown;
|
|
89
|
+
}
|
|
90
|
+
export type UrlMapPathsPlan = {
|
|
91
|
+
readonly ok: true;
|
|
92
|
+
readonly map: LiveUrlMap;
|
|
93
|
+
readonly added: string[];
|
|
94
|
+
} | {
|
|
95
|
+
readonly ok: false;
|
|
96
|
+
readonly error: string;
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* The URL map with every {@link GCP_PUBLIC_BASE_PATHS} entry routed like
|
|
100
|
+
* `/api/*` (to the gateway). Only the rule that carries `/api/*` changes;
|
|
101
|
+
* redirect rules the admin wrote stay as they are. `added` is empty when the
|
|
102
|
+
* map is already complete.
|
|
103
|
+
*/
|
|
104
|
+
export declare function planUrlMapPaths(maps: readonly LiveUrlMap[], siteHost: string): UrlMapPathsPlan;
|
|
105
|
+
/**
|
|
106
|
+
* Route the remote-MCP discovery paths to the gateway on an existing `gcp`
|
|
107
|
+
* install: read the URL map, add the missing paths to its `/api/*` rule and
|
|
108
|
+
* write it back through the Compute API (`urlMaps.update` carries the map's
|
|
109
|
+
* fingerprint, so a concurrent write — the admin publishing redirects —
|
|
110
|
+
* fails instead of being lost; a re-run then succeeds).
|
|
111
|
+
*/
|
|
112
|
+
export declare function ensureUrlMapRemoteMcpPaths(target: Pick<RemoteMcpTarget, "projectId" | "domain">, deps?: {
|
|
113
|
+
run?: GcloudRunner;
|
|
114
|
+
http?: HttpFetch;
|
|
115
|
+
sleep?: (ms: number) => Promise<void>;
|
|
116
|
+
}): Promise<RemoteMcpResult<{
|
|
117
|
+
readonly added: string[];
|
|
118
|
+
}>>;
|
|
119
|
+
/**
|
|
120
|
+
* Give the gateway's Cloud Armor policy the `/api/mcp/*` rule
|
|
121
|
+
* ({@link MCP_ARMOR_RULE}): create it, or bring a rule at its priority back
|
|
122
|
+
* to spec.
|
|
123
|
+
*/
|
|
124
|
+
export declare function ensureMcpArmorRule(target: Pick<RemoteMcpTarget, "projectId" | "env">, deps?: {
|
|
125
|
+
run?: GcloudRunner;
|
|
126
|
+
}): Promise<RemoteMcpResult<{
|
|
127
|
+
readonly policy: string;
|
|
128
|
+
readonly action: "present" | "created" | "updated";
|
|
129
|
+
}>>;
|
|
130
|
+
/** Both load-balancer parts on `gcp`; a no-op success on `gcp-firebase`. */
|
|
131
|
+
export declare function ensureRemoteMcpEdge(target: Pick<RemoteMcpTarget, "provider" | "projectId" | "env" | "domain">, deps?: {
|
|
132
|
+
run?: GcloudRunner;
|
|
133
|
+
http?: HttpFetch;
|
|
134
|
+
sleep?: (ms: number) => Promise<void>;
|
|
135
|
+
}): Promise<RemoteMcpResult<{
|
|
136
|
+
readonly done: string[];
|
|
137
|
+
}>>;
|
|
138
|
+
export {};
|
|
139
|
+
//# sourceMappingURL=remote-mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-mcp.d.ts","sourceRoot":"","sources":["../src/remote-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
2
|
+
/**
|
|
3
|
+
* #806 — the CLI's part of remote MCP on a Google IAP install (`gcp`,
|
|
4
|
+
* `gcp-firebase`), run as the operator's (or the provisioner's) gcloud
|
|
5
|
+
* identity by the wizard after `pulumi up` and by `cms-provision upgrade`
|
|
6
|
+
* after the roll. Every step is idempotent.
|
|
7
|
+
*
|
|
8
|
+
* - {@link ensureRemoteMcpIdentityEnv}: the env vars that name generated
|
|
9
|
+
* identities ({@link RemoteMcpIdentity} — why the stacks cannot declare
|
|
10
|
+
* them is in stack-contract.ts), applied with `gcloud run services
|
|
11
|
+
* update` only where they differ.
|
|
12
|
+
* - {@link ensureRemoteMcpEdge} (`gcp` only): the load balancer's part for
|
|
13
|
+
* installs whose URL map / Cloud Armor policy predate it — the
|
|
14
|
+
* `/.well-known/oauth-*` path rules (the stack ignores `pathRules` after
|
|
15
|
+
* creation, gcp-url-map.ts) and the `/api/mcp/*` Cloud Armor rule
|
|
16
|
+
* (remote-mcp-edge.ts).
|
|
17
|
+
*
|
|
18
|
+
* The secrets, the IAM bindings, the gateway's secret volume and timeout
|
|
19
|
+
* come through the shared contract like everything else
|
|
20
|
+
* (runtime-secrets.ts, stack-contract.ts, upgrade/app-roll.ts).
|
|
21
|
+
*
|
|
22
|
+
* The same identity env carries what the admin's Google sign-in needs
|
|
23
|
+
* (#914): its own URL and the project's Google organisation domain
|
|
24
|
+
* ({@link resolveGoogleOrgDomain}).
|
|
25
|
+
*
|
|
26
|
+
* Nothing here enables remote MCP: that happens when the Owner sets up the
|
|
27
|
+
* install's Google sign-in client (Settings → Google sign-in). Until then
|
|
28
|
+
* the gateway answers 503 `remote_mcp_not_configured`.
|
|
29
|
+
*/
|
|
30
|
+
import { GCP_PUBLIC_BASE_PATHS } from "@caelo-cms/shared";
|
|
31
|
+
import { gcloud as defaultGcloud } from "./gcloud.js";
|
|
32
|
+
import { gcpNamePrefix } from "./gcp-names.js";
|
|
33
|
+
import { isMcpArmorRule, MCP_ARMOR_RULE, mcpArmorRuleFlags, } from "./remote-mcp-edge.js";
|
|
34
|
+
import { remoteMcpIdentity, remoteMcpIdentityEnv, } from "./stack-contract.js";
|
|
35
|
+
import { liveContainerEnv, planEnvUpdate } from "./stack-converge.js";
|
|
36
|
+
/** Parse gcloud JSON output; null (never a throw) when it is not JSON. */
|
|
37
|
+
function parseJson(stdout) {
|
|
38
|
+
try {
|
|
39
|
+
return JSON.parse(stdout);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function lines(stdout) {
|
|
46
|
+
return stdout
|
|
47
|
+
.split("\n")
|
|
48
|
+
.map((s) => s.trim())
|
|
49
|
+
.filter(Boolean);
|
|
50
|
+
}
|
|
51
|
+
// ===========================================================================
|
|
52
|
+
// Identity env
|
|
53
|
+
// ===========================================================================
|
|
54
|
+
/**
|
|
55
|
+
* #914 — the project's Google organisation domain (the organisation's
|
|
56
|
+
* `displayName`, which Cloud Resource Manager sets to its primary domain),
|
|
57
|
+
* or `none` when the project sits in no organisation. Read as the
|
|
58
|
+
* operator's identity: `organizations describe` needs
|
|
59
|
+
* `resourcemanager.organizations.get` on the organisation, which project
|
|
60
|
+
* Owners often have and the admin's service account never does.
|
|
61
|
+
*/
|
|
62
|
+
export async function resolveGoogleOrgDomain(projectId, deps = {}) {
|
|
63
|
+
const run = deps.run ?? defaultGcloud;
|
|
64
|
+
const ancestors = await run(["projects", "get-ancestors", projectId, "--format=json"]);
|
|
65
|
+
if (!ancestors.ok) {
|
|
66
|
+
return { ok: false, error: `read the ancestors of ${projectId}: ${ancestors.stderr.trim()}` };
|
|
67
|
+
}
|
|
68
|
+
const list = parseJson(ancestors.stdout || "[]");
|
|
69
|
+
if (!Array.isArray(list))
|
|
70
|
+
return { ok: false, error: "get-ancestors: output is not a JSON list" };
|
|
71
|
+
const org = list.find((a) => a.type === "organization");
|
|
72
|
+
if (!org?.id)
|
|
73
|
+
return { ok: true, domain: NO_GOOGLE_ORGANISATION };
|
|
74
|
+
const describe = await run(["organizations", "describe", org.id, "--format=value(displayName)"]);
|
|
75
|
+
const domain = describe.ok ? describe.stdout.trim().toLowerCase() : "";
|
|
76
|
+
if (!/^[a-z0-9.-]+\.[a-z]{2,}$/.test(domain)) {
|
|
77
|
+
return {
|
|
78
|
+
ok: false,
|
|
79
|
+
error: `read organization ${org.id}: ${describe.stderr.trim() || `unexpected name "${domain}"`} (needs the Organization Viewer role)`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return { ok: true, domain };
|
|
83
|
+
}
|
|
84
|
+
/** `CAELO_GOOGLE_ORG_DOMAIN` value for a project outside any organisation (admin-core identity-gate.ts). */
|
|
85
|
+
export const NO_GOOGLE_ORGANISATION = "none";
|
|
86
|
+
/**
|
|
87
|
+
* Read the live identities {@link remoteMcpIdentity} derives from: the
|
|
88
|
+
* project number, and the admin's backend service id (`gcp`) or both
|
|
89
|
+
* services' URLs (`gcp-firebase`). Fails naming what it could not read.
|
|
90
|
+
*
|
|
91
|
+
* The organisation domain (#914) is best-effort: when it cannot be read,
|
|
92
|
+
* `orgDomainError` says why and the identity carries none, so the admin's
|
|
93
|
+
* var keeps its value — the admin then reports the organisation as unknown
|
|
94
|
+
* and refuses user creation loudly until the Owner sets up Google sign-in.
|
|
95
|
+
*/
|
|
96
|
+
export async function resolveRemoteMcpIdentity(target, deps = {}) {
|
|
97
|
+
const resolved = await resolveServiceIdentity(target, deps);
|
|
98
|
+
if (!resolved.ok)
|
|
99
|
+
return resolved;
|
|
100
|
+
const org = await resolveGoogleOrgDomain(target.projectId, deps);
|
|
101
|
+
return org.ok
|
|
102
|
+
? { ok: true, identity: { ...resolved.identity, googleOrgDomain: org.domain } }
|
|
103
|
+
: { ok: true, identity: resolved.identity, orgDomainError: org.error };
|
|
104
|
+
}
|
|
105
|
+
async function resolveServiceIdentity(target, deps = {}) {
|
|
106
|
+
const run = deps.run ?? defaultGcloud;
|
|
107
|
+
const project = `--project=${target.projectId}`;
|
|
108
|
+
const num = await run([
|
|
109
|
+
"projects",
|
|
110
|
+
"describe",
|
|
111
|
+
target.projectId,
|
|
112
|
+
"--format=value(projectNumber)",
|
|
113
|
+
]);
|
|
114
|
+
const projectNumber = num.ok ? num.stdout.trim() : "";
|
|
115
|
+
if (!/^\d+$/.test(projectNumber)) {
|
|
116
|
+
return {
|
|
117
|
+
ok: false,
|
|
118
|
+
error: `read the project number of ${target.projectId}: ${num.stderr.trim() || "empty"}`,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
if (target.provider === "gcp") {
|
|
122
|
+
const prefix = `${gcpNamePrefix(target.env)}-admin-backend`;
|
|
123
|
+
const list = await run([
|
|
124
|
+
"compute",
|
|
125
|
+
"backend-services",
|
|
126
|
+
"list",
|
|
127
|
+
"--global",
|
|
128
|
+
project,
|
|
129
|
+
`--filter=name~^${prefix} AND iap.enabled=true`,
|
|
130
|
+
"--format=value(id)",
|
|
131
|
+
]);
|
|
132
|
+
if (!list.ok)
|
|
133
|
+
return { ok: false, error: `list backend services: ${list.stderr.trim()}` };
|
|
134
|
+
const ids = lines(list.stdout);
|
|
135
|
+
if (ids.length !== 1 || !/^\d+$/.test(ids[0] ?? "")) {
|
|
136
|
+
return {
|
|
137
|
+
ok: false,
|
|
138
|
+
error: `expected exactly one IAP-enabled ${prefix}* backend service, found ${ids.length}`,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
ok: true,
|
|
143
|
+
identity: remoteMcpIdentity({
|
|
144
|
+
provider: "gcp",
|
|
145
|
+
domain: target.domain,
|
|
146
|
+
projectNumber,
|
|
147
|
+
adminBackendServiceId: ids[0],
|
|
148
|
+
}),
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
const url = async (service) => {
|
|
152
|
+
const r = await run([
|
|
153
|
+
"run",
|
|
154
|
+
"services",
|
|
155
|
+
"describe",
|
|
156
|
+
service,
|
|
157
|
+
`--region=${target.region}`,
|
|
158
|
+
project,
|
|
159
|
+
"--format=value(status.url)",
|
|
160
|
+
]);
|
|
161
|
+
const value = r.ok ? r.stdout.trim() : "";
|
|
162
|
+
return value.startsWith("https://") ? value : null;
|
|
163
|
+
};
|
|
164
|
+
const adminUrl = await url(target.services.admin);
|
|
165
|
+
const gatewayUrl = await url(target.services.gateway);
|
|
166
|
+
if (!adminUrl || !gatewayUrl) {
|
|
167
|
+
return {
|
|
168
|
+
ok: false,
|
|
169
|
+
error: `read the Cloud Run URL of the ${adminUrl ? "gateway" : "admin"} service (${adminUrl ? target.services.gateway : target.services.admin})`,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
ok: true,
|
|
174
|
+
identity: remoteMcpIdentity({
|
|
175
|
+
provider: "gcp-firebase",
|
|
176
|
+
projectNumber,
|
|
177
|
+
region: target.region,
|
|
178
|
+
adminServiceName: target.services.admin,
|
|
179
|
+
adminServiceUrl: adminUrl,
|
|
180
|
+
gatewayServiceUrl: gatewayUrl,
|
|
181
|
+
}),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Bring both services' {@link RemoteMcpIdentity} env vars to `identity`
|
|
186
|
+
* with one `gcloud run services update` per service that differs (a new
|
|
187
|
+
* revision only then). Vars already right are left alone.
|
|
188
|
+
*/
|
|
189
|
+
export async function applyRemoteMcpIdentityEnv(target, identity, deps = {}) {
|
|
190
|
+
const run = deps.run ?? defaultGcloud;
|
|
191
|
+
const desired = remoteMcpIdentityEnv(identity);
|
|
192
|
+
const changes = { admin: [], gateway: [] };
|
|
193
|
+
for (const slug of ["admin", "gateway"]) {
|
|
194
|
+
const service = target.services[slug];
|
|
195
|
+
const describe = await run([
|
|
196
|
+
"run",
|
|
197
|
+
"services",
|
|
198
|
+
"describe",
|
|
199
|
+
service,
|
|
200
|
+
`--region=${target.region}`,
|
|
201
|
+
`--project=${target.projectId}`,
|
|
202
|
+
"--format=json",
|
|
203
|
+
]);
|
|
204
|
+
if (!describe.ok)
|
|
205
|
+
return { ok: false, error: `describe ${service}: ${describe.stderr.trim()}` };
|
|
206
|
+
if (parseJson(describe.stdout) === null) {
|
|
207
|
+
return { ok: false, error: `describe ${service}: output is not JSON` };
|
|
208
|
+
}
|
|
209
|
+
const plan = planEnvUpdate(liveContainerEnv(describe.stdout), desired[slug]);
|
|
210
|
+
if (!plan.ok)
|
|
211
|
+
return { ok: false, error: `${slug}: ${plan.error}` };
|
|
212
|
+
if (plan.flags.length === 0)
|
|
213
|
+
continue;
|
|
214
|
+
const update = await run([
|
|
215
|
+
"run",
|
|
216
|
+
"services",
|
|
217
|
+
"update",
|
|
218
|
+
service,
|
|
219
|
+
`--region=${target.region}`,
|
|
220
|
+
`--project=${target.projectId}`,
|
|
221
|
+
...plan.flags,
|
|
222
|
+
"--quiet",
|
|
223
|
+
]);
|
|
224
|
+
if (!update.ok)
|
|
225
|
+
return { ok: false, error: `update ${service}: ${update.stderr.trim()}` };
|
|
226
|
+
changes[slug] = plan.changes;
|
|
227
|
+
}
|
|
228
|
+
return { ok: true, changes };
|
|
229
|
+
}
|
|
230
|
+
/** {@link resolveRemoteMcpIdentity} then {@link applyRemoteMcpIdentityEnv}. */
|
|
231
|
+
export async function ensureRemoteMcpIdentityEnv(target, deps = {}) {
|
|
232
|
+
const resolved = await resolveRemoteMcpIdentity(target, deps);
|
|
233
|
+
if (!resolved.ok)
|
|
234
|
+
return resolved;
|
|
235
|
+
const applied = await applyRemoteMcpIdentityEnv(target, resolved.identity, deps);
|
|
236
|
+
if (!applied.ok)
|
|
237
|
+
return applied;
|
|
238
|
+
return {
|
|
239
|
+
ok: true,
|
|
240
|
+
identity: resolved.identity,
|
|
241
|
+
changes: applied.changes,
|
|
242
|
+
...(resolved.orgDomainError ? { orgDomainError: resolved.orgDomainError } : {}),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* The URL map with every {@link GCP_PUBLIC_BASE_PATHS} entry routed like
|
|
247
|
+
* `/api/*` (to the gateway). Only the rule that carries `/api/*` changes;
|
|
248
|
+
* redirect rules the admin wrote stay as they are. `added` is empty when the
|
|
249
|
+
* map is already complete.
|
|
250
|
+
*/
|
|
251
|
+
export function planUrlMapPaths(maps, siteHost) {
|
|
252
|
+
const routing = maps.flatMap((m) => (m.hostRules ?? [])
|
|
253
|
+
.filter((h) => h.hosts.includes(siteHost))
|
|
254
|
+
.map((h) => ({ map: m, pathMatcher: h.pathMatcher })));
|
|
255
|
+
if (routing.length !== 1) {
|
|
256
|
+
return {
|
|
257
|
+
ok: false,
|
|
258
|
+
error: `expected exactly one URL map routing ${siteHost}, found ${routing.length}`,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
const { map, pathMatcher } = routing[0];
|
|
262
|
+
const matcher = (map.pathMatchers ?? []).find((m) => m.name === pathMatcher);
|
|
263
|
+
const gatewayRule = matcher?.pathRules?.find((r) => r.service !== undefined && r.urlRedirect === undefined && r.paths.includes("/api/*"));
|
|
264
|
+
if (!matcher || !gatewayRule) {
|
|
265
|
+
return {
|
|
266
|
+
ok: false,
|
|
267
|
+
error: `URL map ${map.name} has no /api/* rule to the gateway in path matcher ${pathMatcher}; re-run the installer to restore the load balancer`,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
const added = GCP_PUBLIC_BASE_PATHS.filter((p) => !gatewayRule.paths.includes(p));
|
|
271
|
+
if (added.length === 0)
|
|
272
|
+
return { ok: true, map, added };
|
|
273
|
+
const next = {
|
|
274
|
+
...map,
|
|
275
|
+
pathMatchers: (map.pathMatchers ?? []).map((m) => m !== matcher
|
|
276
|
+
? m
|
|
277
|
+
: {
|
|
278
|
+
...m,
|
|
279
|
+
pathRules: (m.pathRules ?? []).map((r) => r === gatewayRule ? { ...r, paths: [...r.paths, ...added] } : r),
|
|
280
|
+
}),
|
|
281
|
+
};
|
|
282
|
+
return { ok: true, map: next, added };
|
|
283
|
+
}
|
|
284
|
+
const COMPUTE_API = "https://compute.googleapis.com/compute/v1";
|
|
285
|
+
const OPERATION_POLLS = 60;
|
|
286
|
+
/**
|
|
287
|
+
* Route the remote-MCP discovery paths to the gateway on an existing `gcp`
|
|
288
|
+
* install: read the URL map, add the missing paths to its `/api/*` rule and
|
|
289
|
+
* write it back through the Compute API (`urlMaps.update` carries the map's
|
|
290
|
+
* fingerprint, so a concurrent write — the admin publishing redirects —
|
|
291
|
+
* fails instead of being lost; a re-run then succeeds).
|
|
292
|
+
*/
|
|
293
|
+
export async function ensureUrlMapRemoteMcpPaths(target, deps = {}) {
|
|
294
|
+
const run = deps.run ?? defaultGcloud;
|
|
295
|
+
const http = deps.http ?? fetch;
|
|
296
|
+
const sleep = deps.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
297
|
+
const list = await run([
|
|
298
|
+
"compute",
|
|
299
|
+
"url-maps",
|
|
300
|
+
"list",
|
|
301
|
+
"--global",
|
|
302
|
+
`--project=${target.projectId}`,
|
|
303
|
+
"--format=json",
|
|
304
|
+
]);
|
|
305
|
+
if (!list.ok)
|
|
306
|
+
return { ok: false, error: `list URL maps: ${list.stderr.trim()}` };
|
|
307
|
+
const maps = parseJson(list.stdout || "[]");
|
|
308
|
+
if (!Array.isArray(maps))
|
|
309
|
+
return { ok: false, error: "list URL maps: output is not a JSON list" };
|
|
310
|
+
const plan = planUrlMapPaths(maps, target.domain);
|
|
311
|
+
if (!plan.ok)
|
|
312
|
+
return plan;
|
|
313
|
+
if (plan.added.length === 0)
|
|
314
|
+
return { ok: true, added: [] };
|
|
315
|
+
const token = await run(["auth", "print-access-token"]);
|
|
316
|
+
const bearer = token.ok ? token.stdout.trim() : "";
|
|
317
|
+
if (!bearer)
|
|
318
|
+
return { ok: false, error: `gcloud auth print-access-token: ${token.stderr.trim()}` };
|
|
319
|
+
const headers = { Authorization: `Bearer ${bearer}`, "Content-Type": "application/json" };
|
|
320
|
+
const base = `${COMPUTE_API}/projects/${encodeURIComponent(target.projectId)}/global`;
|
|
321
|
+
const put = await http(`${base}/urlMaps/${encodeURIComponent(plan.map.name)}`, {
|
|
322
|
+
method: "PUT",
|
|
323
|
+
headers,
|
|
324
|
+
body: JSON.stringify(plan.map),
|
|
325
|
+
});
|
|
326
|
+
if (!put.ok) {
|
|
327
|
+
return {
|
|
328
|
+
ok: false,
|
|
329
|
+
error: `update URL map ${plan.map.name}: HTTP ${put.status} ${(await put.text()).slice(0, 500)}`,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
let op = (parseJson(await put.text()) ?? {});
|
|
333
|
+
for (let i = 0; op.status !== "DONE" && i < OPERATION_POLLS; i++) {
|
|
334
|
+
await sleep(2_000);
|
|
335
|
+
const poll = await http(`${base}/operations/${encodeURIComponent(op.name ?? "")}`, {
|
|
336
|
+
method: "GET",
|
|
337
|
+
headers,
|
|
338
|
+
});
|
|
339
|
+
if (!poll.ok)
|
|
340
|
+
return { ok: false, error: `poll ${op.name}: HTTP ${poll.status}` };
|
|
341
|
+
op = (parseJson(await poll.text()) ?? {});
|
|
342
|
+
}
|
|
343
|
+
if (op.status !== "DONE")
|
|
344
|
+
return { ok: false, error: `URL-map update ${op.name} did not finish` };
|
|
345
|
+
const errors = op.error?.errors ?? [];
|
|
346
|
+
if (errors.length > 0) {
|
|
347
|
+
return {
|
|
348
|
+
ok: false,
|
|
349
|
+
error: `URL-map update failed: ${errors.map((e) => e.message).join("; ")}`,
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
return { ok: true, added: plan.added };
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Give the gateway's Cloud Armor policy the `/api/mcp/*` rule
|
|
356
|
+
* ({@link MCP_ARMOR_RULE}): create it, or bring a rule at its priority back
|
|
357
|
+
* to spec.
|
|
358
|
+
*/
|
|
359
|
+
export async function ensureMcpArmorRule(target, deps = {}) {
|
|
360
|
+
const run = deps.run ?? defaultGcloud;
|
|
361
|
+
const project = `--project=${target.projectId}`;
|
|
362
|
+
const prefix = `${gcpNamePrefix(target.env)}-waf`;
|
|
363
|
+
const list = await run([
|
|
364
|
+
"compute",
|
|
365
|
+
"security-policies",
|
|
366
|
+
"list",
|
|
367
|
+
project,
|
|
368
|
+
`--filter=name~^${prefix}`,
|
|
369
|
+
"--format=value(name)",
|
|
370
|
+
]);
|
|
371
|
+
if (!list.ok)
|
|
372
|
+
return { ok: false, error: `list security policies: ${list.stderr.trim()}` };
|
|
373
|
+
const names = lines(list.stdout);
|
|
374
|
+
if (names.length !== 1) {
|
|
375
|
+
return {
|
|
376
|
+
ok: false,
|
|
377
|
+
error: `expected exactly one ${prefix}* Cloud Armor policy, found ${names.length}`,
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
const policy = names[0];
|
|
381
|
+
const describe = await run([
|
|
382
|
+
"compute",
|
|
383
|
+
"security-policies",
|
|
384
|
+
"describe",
|
|
385
|
+
policy,
|
|
386
|
+
project,
|
|
387
|
+
"--format=json",
|
|
388
|
+
]);
|
|
389
|
+
if (!describe.ok)
|
|
390
|
+
return { ok: false, error: `describe ${policy}: ${describe.stderr.trim()}` };
|
|
391
|
+
const described = parseJson(describe.stdout);
|
|
392
|
+
if (!described)
|
|
393
|
+
return { ok: false, error: `describe ${policy}: output is not JSON` };
|
|
394
|
+
const rules = described.rules ?? [];
|
|
395
|
+
const existing = rules.find((r) => r.priority === MCP_ARMOR_RULE.priority);
|
|
396
|
+
if (existing && isMcpArmorRule(existing))
|
|
397
|
+
return { ok: true, policy, action: "present" };
|
|
398
|
+
const verb = existing ? "update" : "create";
|
|
399
|
+
const r = await run([
|
|
400
|
+
"compute",
|
|
401
|
+
"security-policies",
|
|
402
|
+
"rules",
|
|
403
|
+
verb,
|
|
404
|
+
String(MCP_ARMOR_RULE.priority),
|
|
405
|
+
`--security-policy=${policy}`,
|
|
406
|
+
project,
|
|
407
|
+
...mcpArmorRuleFlags(),
|
|
408
|
+
"--quiet",
|
|
409
|
+
]);
|
|
410
|
+
if (!r.ok)
|
|
411
|
+
return {
|
|
412
|
+
ok: false,
|
|
413
|
+
error: `${verb} rule ${MCP_ARMOR_RULE.priority} on ${policy}: ${r.stderr.trim()}`,
|
|
414
|
+
};
|
|
415
|
+
return { ok: true, policy, action: existing ? "updated" : "created" };
|
|
416
|
+
}
|
|
417
|
+
/** Both load-balancer parts on `gcp`; a no-op success on `gcp-firebase`. */
|
|
418
|
+
export async function ensureRemoteMcpEdge(target, deps = {}) {
|
|
419
|
+
if (target.provider !== "gcp")
|
|
420
|
+
return { ok: true, done: [] };
|
|
421
|
+
const done = [];
|
|
422
|
+
const armor = await ensureMcpArmorRule(target, deps);
|
|
423
|
+
if (!armor.ok)
|
|
424
|
+
return { ok: false, error: `Cloud Armor: ${armor.error}` };
|
|
425
|
+
done.push(`Cloud Armor rule ${MCP_ARMOR_RULE.priority} on ${armor.policy}: ${armor.action}`);
|
|
426
|
+
const paths = await ensureUrlMapRemoteMcpPaths(target, deps);
|
|
427
|
+
if (!paths.ok)
|
|
428
|
+
return { ok: false, error: `URL map: ${paths.error}` };
|
|
429
|
+
done.push(paths.added.length > 0
|
|
430
|
+
? `URL map: routed ${paths.added.join(", ")} to the gateway`
|
|
431
|
+
: "URL map: discovery paths already routed to the gateway");
|
|
432
|
+
return { ok: true, done };
|
|
433
|
+
}
|
|
434
|
+
//# sourceMappingURL=remote-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-mcp.js","sourceRoot":"","sources":["../src/remote-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,12 @@ export interface RuntimeDeps {
|
|
|
8
8
|
}
|
|
9
9
|
/** 32 random bytes as hex — the shape of every secret the stacks generate. */
|
|
10
10
|
export declare function generateSecretValue(): string;
|
|
11
|
+
/**
|
|
12
|
+
* The first value of a CLI-generated secret, in its format
|
|
13
|
+
* ({@link GENERATED_SECRET_FORMAT}). `generate` makes the hex ones (tests
|
|
14
|
+
* inject it); a placeholder is the fixed value its format names.
|
|
15
|
+
*/
|
|
16
|
+
export declare function initialSecretValue(name: (typeof CLI_GENERATED_SECRETS)[number], generate?: () => string): string;
|
|
11
17
|
export interface EnsureOutcome {
|
|
12
18
|
readonly id: string;
|
|
13
19
|
readonly status: "present" | "applied" | "failed";
|
|
@@ -100,6 +106,12 @@ export declare function ensureGeneratedSecrets(install: {
|
|
|
100
106
|
/** The secrets `rotate-secret` can rotate. */
|
|
101
107
|
export declare const ROTATABLE_SECRETS: readonly ["postgres-password", "public-role-password", "internal-secret", "tool-approval-secret", "staging-gate-secret"];
|
|
102
108
|
export type RotatableSecret = (typeof ROTATABLE_SECRETS)[number];
|
|
109
|
+
/**
|
|
110
|
+
* #806 — the remote-MCP seal key rotates in two steps with an overlap
|
|
111
|
+
* window (`rotate-secret mcp-oauth-seal-key`, then `--finish`), not through
|
|
112
|
+
* {@link rotateRuntimeSecret}: see seal-key-rotation.ts.
|
|
113
|
+
*/
|
|
114
|
+
export declare const SEAL_KEY_SECRET = "mcp-oauth-seal-key";
|
|
103
115
|
/**
|
|
104
116
|
* Why `name` cannot be rotated, or `null` when it can.
|
|
105
117
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-secrets.d.ts","sourceRoot":"","sources":["../src/runtime-secrets.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,KAAK,YAAY,EAA2B,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE3F,OAAO,EACL,qBAAqB,EACrB,KAAK,YAAY,EAEjB,KAAK,YAAY,
|
|
1
|
+
{"version":3,"file":"runtime-secrets.d.ts","sourceRoot":"","sources":["../src/runtime-secrets.ts"],"names":[],"mappings":"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"}
|