@caelo-cms/provisioning 0.10.53 → 0.10.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/dist/agent-db.js +272 -128
  2. package/dist/audit-job-setup.d.ts +69 -0
  3. package/dist/audit-job-setup.d.ts.map +1 -0
  4. package/dist/audit-job-setup.js +317 -0
  5. package/dist/audit-job-setup.js.map +1 -0
  6. package/dist/caddy.d.ts +9 -0
  7. package/dist/caddy.d.ts.map +1 -1
  8. package/dist/caddy.js +38 -0
  9. package/dist/caddy.js.map +1 -1
  10. package/dist/cli-routing.js +1 -1
  11. package/dist/cli-routing.js.map +1 -1
  12. package/dist/cli.js +36 -9
  13. package/dist/cli.js.map +1 -1
  14. package/dist/compose.js +5 -0
  15. package/dist/compose.js.map +1 -1
  16. package/dist/converge-checkpoint.d.ts +66 -0
  17. package/dist/converge-checkpoint.d.ts.map +1 -0
  18. package/dist/converge-checkpoint.js +61 -0
  19. package/dist/converge-checkpoint.js.map +1 -0
  20. package/dist/converge-job-gcp.d.ts +46 -0
  21. package/dist/converge-job-gcp.d.ts.map +1 -0
  22. package/dist/converge-job-gcp.js +368 -0
  23. package/dist/converge-job-gcp.js.map +1 -0
  24. package/dist/converge-job-setup.d.ts +62 -0
  25. package/dist/converge-job-setup.d.ts.map +1 -0
  26. package/dist/converge-job-setup.js +228 -0
  27. package/dist/converge-job-setup.js.map +1 -0
  28. package/dist/converge-job.d.ts +141 -0
  29. package/dist/converge-job.d.ts.map +1 -0
  30. package/dist/converge-job.js +325 -0
  31. package/dist/converge-job.js.map +1 -0
  32. package/dist/gcp-names.d.ts +25 -1
  33. package/dist/gcp-names.d.ts.map +1 -1
  34. package/dist/gcp-names.js +36 -0
  35. package/dist/gcp-names.js.map +1 -1
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +2 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/infra-contract.d.ts +1 -1
  41. package/dist/infra-contract.d.ts.map +1 -1
  42. package/dist/infra-contract.js +28 -1
  43. package/dist/infra-contract.js.map +1 -1
  44. package/dist/install-job.d.ts +11 -3
  45. package/dist/install-job.d.ts.map +1 -1
  46. package/dist/install-job.js +22 -12
  47. package/dist/install-job.js.map +1 -1
  48. package/dist/lifecycle.d.ts +13 -1
  49. package/dist/lifecycle.d.ts.map +1 -1
  50. package/dist/lifecycle.js +115 -58
  51. package/dist/lifecycle.js.map +1 -1
  52. package/dist/operator-access.d.ts.map +1 -1
  53. package/dist/operator-access.js +13 -3
  54. package/dist/operator-access.js.map +1 -1
  55. package/dist/private-file.d.ts +26 -0
  56. package/dist/private-file.d.ts.map +1 -0
  57. package/dist/private-file.js +49 -0
  58. package/dist/private-file.js.map +1 -0
  59. package/dist/release-contract.d.ts +3 -2
  60. package/dist/release-contract.d.ts.map +1 -1
  61. package/dist/release-contract.js +8 -2
  62. package/dist/release-contract.js.map +1 -1
  63. package/dist/release-manifest.d.ts +2 -0
  64. package/dist/release-manifest.d.ts.map +1 -1
  65. package/dist/release-manifest.js.map +1 -1
  66. package/dist/remote-mcp-edge.d.ts +114 -0
  67. package/dist/remote-mcp-edge.d.ts.map +1 -0
  68. package/dist/remote-mcp-edge.js +116 -0
  69. package/dist/remote-mcp-edge.js.map +1 -0
  70. package/dist/remote-mcp.d.ts +117 -0
  71. package/dist/remote-mcp.d.ts.map +1 -0
  72. package/dist/remote-mcp.js +379 -0
  73. package/dist/remote-mcp.js.map +1 -0
  74. package/dist/runtime-secrets.d.ts +12 -0
  75. package/dist/runtime-secrets.d.ts.map +1 -1
  76. package/dist/runtime-secrets.js +32 -4
  77. package/dist/runtime-secrets.js.map +1 -1
  78. package/dist/seal-key-rotation.d.ts +38 -0
  79. package/dist/seal-key-rotation.d.ts.map +1 -0
  80. package/dist/seal-key-rotation.js +206 -0
  81. package/dist/seal-key-rotation.js.map +1 -0
  82. package/dist/stack-contract.d.ts +175 -3
  83. package/dist/stack-contract.d.ts.map +1 -1
  84. package/dist/stack-contract.js +183 -3
  85. package/dist/stack-contract.js.map +1 -1
  86. package/dist/stack-converge.d.ts +38 -1
  87. package/dist/stack-converge.d.ts.map +1 -1
  88. package/dist/stack-converge.js +74 -4
  89. package/dist/stack-converge.js.map +1 -1
  90. package/dist/state-lock-lease.d.ts +142 -0
  91. package/dist/state-lock-lease.d.ts.map +1 -0
  92. package/dist/state-lock-lease.js +347 -0
  93. package/dist/state-lock-lease.js.map +1 -0
  94. package/dist/state-store.d.ts +66 -9
  95. package/dist/state-store.d.ts.map +1 -1
  96. package/dist/state-store.js +249 -30
  97. package/dist/state-store.js.map +1 -1
  98. package/dist/tar-entries.d.ts.map +1 -1
  99. package/dist/tar-entries.js +84 -9
  100. package/dist/tar-entries.js.map +1 -1
  101. package/dist/upgrade/app-roll.d.ts +36 -7
  102. package/dist/upgrade/app-roll.d.ts.map +1 -1
  103. package/dist/upgrade/app-roll.js +88 -19
  104. package/dist/upgrade/app-roll.js.map +1 -1
  105. package/dist/upgrade/audit-job-roll.d.ts +38 -0
  106. package/dist/upgrade/audit-job-roll.d.ts.map +1 -0
  107. package/dist/upgrade/audit-job-roll.js +43 -0
  108. package/dist/upgrade/audit-job-roll.js.map +1 -0
  109. package/dist/upgrade/converge.d.ts.map +1 -1
  110. package/dist/upgrade/converge.js +141 -8
  111. package/dist/upgrade/converge.js.map +1 -1
  112. package/dist/upgrade/gcp-lookup.d.ts +27 -10
  113. package/dist/upgrade/gcp-lookup.d.ts.map +1 -1
  114. package/dist/upgrade/gcp-lookup.js +46 -7
  115. package/dist/upgrade/gcp-lookup.js.map +1 -1
  116. package/dist/upgrade/record-rolled.d.ts +40 -0
  117. package/dist/upgrade/record-rolled.d.ts.map +1 -0
  118. package/dist/upgrade/record-rolled.js +46 -0
  119. package/dist/upgrade/record-rolled.js.map +1 -0
  120. package/dist/upgrade/upgrade.d.ts +45 -1
  121. package/dist/upgrade/upgrade.d.ts.map +1 -1
  122. package/dist/upgrade/upgrade.js +60 -17
  123. package/dist/upgrade/upgrade.js.map +1 -1
  124. package/dist/upgrader-assess.d.ts +15 -1
  125. package/dist/upgrader-assess.d.ts.map +1 -1
  126. package/dist/upgrader-assess.js +36 -6
  127. package/dist/upgrader-assess.js.map +1 -1
  128. package/dist/upgrader-gcp.d.ts +15 -0
  129. package/dist/upgrader-gcp.d.ts.map +1 -1
  130. package/dist/upgrader-gcp.js +42 -7
  131. package/dist/upgrader-gcp.js.map +1 -1
  132. package/dist/upgrader-iam-preflight.d.ts +123 -0
  133. package/dist/upgrader-iam-preflight.d.ts.map +1 -0
  134. package/dist/upgrader-iam-preflight.js +414 -0
  135. package/dist/upgrader-iam-preflight.js.map +1 -0
  136. package/dist/upgrader-job.d.ts +33 -9
  137. package/dist/upgrader-job.d.ts.map +1 -1
  138. package/dist/upgrader-job.js +169 -27
  139. package/dist/upgrader-job.js.map +1 -1
  140. package/dist/upgrader-records.d.ts +58 -0
  141. package/dist/upgrader-records.d.ts.map +1 -0
  142. package/dist/upgrader-records.js +87 -0
  143. package/dist/upgrader-records.js.map +1 -0
  144. package/dist/upgrader-reporter.d.ts +3 -2
  145. package/dist/upgrader-reporter.d.ts.map +1 -1
  146. package/dist/upgrader-reporter.js +10 -2
  147. package/dist/upgrader-reporter.js.map +1 -1
  148. package/dist/upgrader-setup.d.ts +25 -3
  149. package/dist/upgrader-setup.d.ts.map +1 -1
  150. package/dist/upgrader-setup.js +132 -14
  151. package/dist/upgrader-setup.js.map +1 -1
  152. package/dist/wizards/gcp-cost.d.ts.map +1 -1
  153. package/dist/wizards/gcp-cost.js +14 -6
  154. package/dist/wizards/gcp-cost.js.map +1 -1
  155. package/dist/wizards/gcp-pulumi.d.ts +6 -0
  156. package/dist/wizards/gcp-pulumi.d.ts.map +1 -1
  157. package/dist/wizards/gcp-pulumi.js +7 -0
  158. package/dist/wizards/gcp-pulumi.js.map +1 -1
  159. package/dist/wizards/gcp.d.ts.map +1 -1
  160. package/dist/wizards/gcp.js +130 -4
  161. package/dist/wizards/gcp.js.map +1 -1
  162. package/package.json +4 -4
  163. package/src/agent/run.test.ts +15 -1
  164. package/src/audit-job-setup.test.ts +234 -0
  165. package/src/audit-job-setup.ts +360 -0
  166. package/src/caddy-redirects.docker.test.ts +19 -6
  167. package/src/caddy.test.ts +30 -0
  168. package/src/caddy.ts +43 -0
  169. package/src/cli-init-validation.test.ts +44 -0
  170. package/src/cli-routing.ts +1 -1
  171. package/src/cli.ts +40 -8
  172. package/src/compose.ts +5 -0
  173. package/src/converge-checkpoint.ts +75 -0
  174. package/src/converge-entrypoint.test.ts +213 -0
  175. package/src/converge-job-gcp.test.ts +222 -0
  176. package/src/converge-job-gcp.ts +443 -0
  177. package/src/converge-job-setup.test.ts +152 -0
  178. package/src/converge-job-setup.ts +268 -0
  179. package/src/converge-job.test.ts +486 -0
  180. package/src/converge-job.ts +542 -0
  181. package/src/gateway-env-isolation.test.ts +8 -1
  182. package/src/gcp-names.ts +43 -1
  183. package/src/gcp-url-map.test.ts +9 -1
  184. package/src/index.ts +8 -0
  185. package/src/infra-contract.test.ts +7 -4
  186. package/src/infra-contract.ts +28 -1
  187. package/src/install-job.test.ts +3 -1
  188. package/src/install-job.ts +31 -14
  189. package/src/lifecycle.ts +137 -71
  190. package/src/operator-access.test.ts +14 -0
  191. package/src/operator-access.ts +13 -3
  192. package/src/private-file.test.ts +80 -0
  193. package/src/private-file.ts +50 -0
  194. package/src/release-contract.ts +8 -2
  195. package/src/release-manifest.test.ts +42 -0
  196. package/src/release-manifest.ts +2 -0
  197. package/src/remote-mcp-edge.ts +137 -0
  198. package/src/remote-mcp.test.ts +517 -0
  199. package/src/remote-mcp.ts +460 -0
  200. package/src/runtime-secrets.test.ts +31 -6
  201. package/src/runtime-secrets.ts +41 -3
  202. package/src/seal-key-rotation.test.ts +131 -0
  203. package/src/seal-key-rotation.ts +258 -0
  204. package/src/stack-contract-parity.test.ts +20 -3
  205. package/src/stack-contract.test.ts +34 -2
  206. package/src/stack-contract.ts +305 -3
  207. package/src/stack-converge-secrets.test.ts +3 -0
  208. package/src/stack-converge.test.ts +21 -5
  209. package/src/stack-converge.ts +101 -7
  210. package/src/state-attach.test.ts +7 -1
  211. package/src/state-lock-lease.test.ts +302 -0
  212. package/src/state-lock-lease.ts +423 -0
  213. package/src/state-lock.test.ts +568 -0
  214. package/src/state-store.ts +347 -27
  215. package/src/tar-entries.test.ts +149 -7
  216. package/src/tar-entries.ts +90 -9
  217. package/src/upgrade/app-roll.ts +135 -21
  218. package/src/upgrade/audit-job-roll.ts +68 -0
  219. package/src/upgrade/converge.ts +170 -7
  220. package/src/upgrade/gcp-lookup.test.ts +80 -0
  221. package/src/upgrade/gcp-lookup.ts +65 -8
  222. package/src/upgrade/record-rolled.test.ts +105 -0
  223. package/src/upgrade/record-rolled.ts +91 -0
  224. package/src/upgrade/upgrade.test.ts +279 -5
  225. package/src/upgrade/upgrade.ts +120 -24
  226. package/src/upgrader-assess.test.ts +93 -3
  227. package/src/upgrader-assess.ts +58 -9
  228. package/src/upgrader-gcp.ts +47 -8
  229. package/src/upgrader-iam-preflight.test.ts +393 -0
  230. package/src/upgrader-iam-preflight.ts +510 -0
  231. package/src/upgrader-job.test.ts +587 -15
  232. package/src/upgrader-job.ts +237 -53
  233. package/src/upgrader-records.ts +151 -0
  234. package/src/upgrader-reporter.test.ts +6 -0
  235. package/src/upgrader-reporter.ts +7 -2
  236. package/src/upgrader-setup.test.ts +4 -3
  237. package/src/upgrader-setup.ts +137 -13
  238. package/src/wizards/gcp-cost.ts +15 -6
  239. package/src/wizards/gcp-pulumi.ts +7 -0
  240. package/src/wizards/gcp.ts +162 -4
  241. package/stacks/aws/index.ts +18 -0
  242. package/stacks/azure/index.ts +18 -0
  243. package/stacks/gcp/index.ts +59 -7
  244. package/stacks/gcp-firebase/index.ts +50 -6
@@ -0,0 +1,38 @@
1
+ import type { GcloudRunner } from "./gcloud-retry.js";
2
+ /** The gateway env var holding the previous key during a rotation. */
3
+ export declare const SEAL_KEY_PREVIOUS_ENV = "CAELO_MCP_OAUTH_SEAL_KEY_PREVIOUS";
4
+ /** The gateway env var holding the current key (stack-contract SERVICE_SECRET_ENV). */
5
+ export declare const SEAL_KEY_ENV = "CAELO_MCP_OAUTH_SEAL_KEY";
6
+ /** Label on the gateway service: when the rotation started (epoch ms). */
7
+ export declare const SEAL_ROTATION_LABEL = "caelo-seal-rotation-started";
8
+ /**
9
+ * Days the previous key must stay: the broker's refresh-token lifetime
10
+ * (api-gateway mcp/token.ts REFRESH_MAX_LIFETIME_SECONDS, 30 days).
11
+ */
12
+ export declare const SEAL_KEY_ROTATION_WINDOW_DAYS = 30;
13
+ /** The deployed gateway a rotation works on. */
14
+ export interface SealRotationTarget {
15
+ readonly projectId: string;
16
+ readonly region: string;
17
+ readonly env: string;
18
+ /** Deployed (Pulumi-suffixed) gateway Cloud Run service name. */
19
+ readonly gatewayService: string;
20
+ }
21
+ export interface SealRotationReport {
22
+ readonly ok: boolean;
23
+ readonly steps: string[];
24
+ readonly error?: string;
25
+ }
26
+ export interface SealRotationDeps {
27
+ readonly run?: GcloudRunner;
28
+ readonly nowMs?: () => number;
29
+ /** The new key (default: 32 random bytes, base64 — the secret's format). */
30
+ readonly generate?: () => string;
31
+ }
32
+ /** Start a rotation: new key at `latest`, the old one pinned as previous. */
33
+ export declare function startSealKeyRotation(t: SealRotationTarget, deps?: SealRotationDeps): Promise<SealRotationReport>;
34
+ /** Finish a rotation: drop the previous key once the window has passed. */
35
+ export declare function finishSealKeyRotation(t: SealRotationTarget, deps?: SealRotationDeps, opts?: {
36
+ readonly now?: boolean;
37
+ }): Promise<SealRotationReport>;
38
+ //# sourceMappingURL=seal-key-rotation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seal-key-rotation.d.ts","sourceRoot":"","sources":["../src/seal-key-rotation.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,sEAAsE;AACtE,eAAO,MAAM,qBAAqB,sCAAsC,CAAC;AACzE,uFAAuF;AACvF,eAAO,MAAM,YAAY,6BAA6B,CAAC;AACvD,0EAA0E;AAC1E,eAAO,MAAM,mBAAmB,gCAAgC,CAAC;AACjE;;;GAGG;AACH,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAIhD,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;IAC9B,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAC;CAClC;AAuDD,6EAA6E;AAC7E,wBAAsB,oBAAoB,CACxC,CAAC,EAAE,kBAAkB,EACrB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,kBAAkB,CAAC,CAwE7B;AAED,2EAA2E;AAC3E,wBAAsB,qBAAqB,CACzC,CAAC,EAAE,kBAAkB,EACrB,IAAI,GAAE,gBAAqB,EAC3B,IAAI,GAAE;IAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GACpC,OAAO,CAAC,kBAAkB,CAAC,CA4C7B"}
@@ -0,0 +1,206 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ /**
3
+ * Issue #806 — rotating the remote-MCP broker's seal key without signing
4
+ * every connected MCP client out.
5
+ *
6
+ * The broker seals its OAuth state, codes and refresh tokens under
7
+ * `CAELO_MCP_OAUTH_SEAL_KEY` (api-gateway mcp/seal.ts, envelope v2 with a
8
+ * key id). While `CAELO_MCP_OAUTH_SEAL_KEY_PREVIOUS` is set it also opens
9
+ * values sealed under that key, and seals everything new under the current
10
+ * one. Refresh tokens live at most {@link SEAL_KEY_ROTATION_WINDOW_DAYS}
11
+ * days (mcp/token.ts), so after that window nothing sealed under the old key
12
+ * is still valid and the previous key can go.
13
+ *
14
+ * Two steps, both `cms-provision rotate-secret mcp-oauth-seal-key`:
15
+ *
16
+ * start — add a new version to the secret, then roll the gateway with
17
+ * the current key at `latest` and the previous key PINNED to
18
+ * the version that was latest before (a pinned version never
19
+ * follows the new one), labelled with the start time.
20
+ * finish — (`--finish`) once the window has passed: drop the previous key
21
+ * and the label and roll again. `--finish --now` skips the
22
+ * window — for a leaked key, where signing every client out is
23
+ * the point.
24
+ *
25
+ * Refused instead of guessed (CLAUDE.md §2): starting while a rotation is in
26
+ * progress (a second start would pin the CURRENT key as "previous" and drop
27
+ * the real previous one early), and finishing before the window ends.
28
+ *
29
+ * A `cms-provision upgrade` whose `pulumi up` rewrites the gateway template
30
+ * during the window drops the previous key (the stack does not declare it):
31
+ * clients sealed under it sign in again. That fails safe — no token lives
32
+ * longer than intended — and is documented in the rotate output.
33
+ */
34
+ import { gcloud as defaultGcloud } from "./gcloud.js";
35
+ import { gcpSecretId } from "./gcp-names.js";
36
+ import { initialSecretValue } from "./runtime-secrets.js";
37
+ import { liveContainerEnv } from "./stack-converge.js";
38
+ /** The gateway env var holding the previous key during a rotation. */
39
+ export const SEAL_KEY_PREVIOUS_ENV = "CAELO_MCP_OAUTH_SEAL_KEY_PREVIOUS";
40
+ /** The gateway env var holding the current key (stack-contract SERVICE_SECRET_ENV). */
41
+ export const SEAL_KEY_ENV = "CAELO_MCP_OAUTH_SEAL_KEY";
42
+ /** Label on the gateway service: when the rotation started (epoch ms). */
43
+ export const SEAL_ROTATION_LABEL = "caelo-seal-rotation-started";
44
+ /**
45
+ * Days the previous key must stay: the broker's refresh-token lifetime
46
+ * (api-gateway mcp/token.ts REFRESH_MAX_LIFETIME_SECONDS, 30 days).
47
+ */
48
+ export const SEAL_KEY_ROTATION_WINDOW_DAYS = 30;
49
+ const DAY_MS = 24 * 60 * 60 * 1000;
50
+ async function gatewayState(run, t) {
51
+ const r = await run([
52
+ "run",
53
+ "services",
54
+ "describe",
55
+ t.gatewayService,
56
+ "--region",
57
+ t.region,
58
+ `--project=${t.projectId}`,
59
+ "--format=json",
60
+ ]);
61
+ if (!r.ok)
62
+ return { ok: false, error: `read the gateway service: ${r.stderr.trim()}` };
63
+ const env = liveContainerEnv(r.stdout);
64
+ const labels = JSON.parse(r.stdout).metadata?.labels ??
65
+ {};
66
+ const raw = labels[SEAL_ROTATION_LABEL];
67
+ const started = raw !== undefined && /^\d+$/.test(raw) ? Number(raw) : null;
68
+ const current = env.get(SEAL_KEY_ENV);
69
+ if (current?.kind !== "secret") {
70
+ return {
71
+ ok: false,
72
+ error: `${SEAL_KEY_ENV} on ${t.gatewayService} is not a Secret Manager reference — run \`cms-provision upgrade\` first (it installs remote MCP's secrets).`,
73
+ };
74
+ }
75
+ return {
76
+ ok: true,
77
+ state: { previousPinned: env.has(SEAL_KEY_PREVIOUS_ENV), startedAtMs: started },
78
+ };
79
+ }
80
+ function rollFlip(t) {
81
+ return [
82
+ "run",
83
+ "services",
84
+ "update-traffic",
85
+ t.gatewayService,
86
+ "--region",
87
+ t.region,
88
+ `--project=${t.projectId}`,
89
+ "--to-latest",
90
+ "--quiet",
91
+ ];
92
+ }
93
+ /** Start a rotation: new key at `latest`, the old one pinned as previous. */
94
+ export async function startSealKeyRotation(t, deps = {}) {
95
+ const run = deps.run ?? defaultGcloud;
96
+ const now = (deps.nowMs ?? Date.now)();
97
+ const generate = deps.generate ?? (() => initialSecretValue("mcp-oauth-seal-key"));
98
+ const secretId = gcpSecretId(t.env, "mcp-oauth-seal-key");
99
+ const project = `--project=${t.projectId}`;
100
+ const steps = [];
101
+ const live = await gatewayState(run, t);
102
+ if (!live.ok)
103
+ return { ok: false, steps, error: live.error };
104
+ if (live.state.previousPinned) {
105
+ const since = live.state.startedAtMs;
106
+ return {
107
+ ok: false,
108
+ steps,
109
+ error: `A seal-key rotation is already in progress${since ? ` (started ${new Date(since).toISOString()})` : ""}. Finish it first with \`cms-provision rotate-secret mcp-oauth-seal-key --finish\` once ${SEAL_KEY_ROTATION_WINDOW_DAYS} days have passed; starting again now would drop the previous key early.`,
110
+ };
111
+ }
112
+ const latest = await run([
113
+ "secrets",
114
+ "versions",
115
+ "describe",
116
+ "latest",
117
+ `--secret=${secretId}`,
118
+ project,
119
+ "--format=value(name)",
120
+ ]);
121
+ const version = /\/versions\/(\d+)\s*$/.exec(latest.stdout.trim())?.[1];
122
+ if (!latest.ok || !version) {
123
+ return {
124
+ ok: false,
125
+ steps,
126
+ error: `find the current version of ${secretId}: ${latest.ok ? `unexpected answer "${latest.stdout.trim()}"` : latest.stderr.trim()}`,
127
+ };
128
+ }
129
+ const add = await run(["secrets", "versions", "add", secretId, project, "--data-file=-"], {
130
+ stdin: generate(),
131
+ });
132
+ if (!add.ok) {
133
+ return { ok: false, steps, error: `add a version to ${secretId}: ${add.stderr.trim()}` };
134
+ }
135
+ steps.push(`added a new version to ${secretId} (the previous key is version ${version})`);
136
+ const update = [
137
+ "run",
138
+ "services",
139
+ "update",
140
+ t.gatewayService,
141
+ "--region",
142
+ t.region,
143
+ project,
144
+ `--update-secrets=${SEAL_KEY_ENV}=${secretId}:latest,${SEAL_KEY_PREVIOUS_ENV}=${secretId}:${version}`,
145
+ `--update-labels=${SEAL_ROTATION_LABEL}=${now}`,
146
+ "--quiet",
147
+ ];
148
+ const rolled = await run(update);
149
+ const flipped = rolled.ok ? await run(rollFlip(t)) : rolled;
150
+ if (!flipped.ok) {
151
+ return {
152
+ ok: false,
153
+ steps,
154
+ error: `The new key is stored but the gateway does not use it yet. Do not rotate again — roll the gateway:\n gcloud ${update.join(" ")}\n gcloud ${rollFlip(t).join(" ")}\n(${flipped.stderr.trim()})`,
155
+ };
156
+ }
157
+ steps.push(`rolled the gateway onto the new key; tokens sealed under version ${version} keep working`, `finish after ${new Date(now + SEAL_KEY_ROTATION_WINDOW_DAYS * DAY_MS).toISOString()} with: cms-provision rotate-secret mcp-oauth-seal-key --finish`, "a `cms-provision upgrade` before then drops the previous key early: clients sealed under it sign in again");
158
+ return { ok: true, steps };
159
+ }
160
+ /** Finish a rotation: drop the previous key once the window has passed. */
161
+ export async function finishSealKeyRotation(t, deps = {}, opts = {}) {
162
+ const run = deps.run ?? defaultGcloud;
163
+ const now = (deps.nowMs ?? Date.now)();
164
+ const steps = [];
165
+ const live = await gatewayState(run, t);
166
+ if (!live.ok)
167
+ return { ok: false, steps, error: live.error };
168
+ if (!live.state.previousPinned) {
169
+ return {
170
+ ok: false,
171
+ steps,
172
+ error: `No seal-key rotation is in progress on ${t.gatewayService} (${SEAL_KEY_PREVIOUS_ENV} is not set). Start one with \`cms-provision rotate-secret mcp-oauth-seal-key\`.`,
173
+ };
174
+ }
175
+ const started = live.state.startedAtMs;
176
+ const due = started === null ? null : started + SEAL_KEY_ROTATION_WINDOW_DAYS * DAY_MS;
177
+ if (!opts.now && (due === null || now < due)) {
178
+ return {
179
+ ok: false,
180
+ steps,
181
+ error: due === null
182
+ ? `The gateway has ${SEAL_KEY_PREVIOUS_ENV} but no ${SEAL_ROTATION_LABEL} label, so the rotation's start is unknown. Wait ${SEAL_KEY_ROTATION_WINDOW_DAYS} days from when it started, then run --finish --now.`
183
+ : `The previous key still opens refresh tokens until ${new Date(due).toISOString()} (${SEAL_KEY_ROTATION_WINDOW_DAYS}-day lifetime). Finishing now would sign those clients out; run --finish after that time, or --finish --now if the old key leaked.`,
184
+ };
185
+ }
186
+ const update = [
187
+ "run",
188
+ "services",
189
+ "update",
190
+ t.gatewayService,
191
+ "--region",
192
+ t.region,
193
+ `--project=${t.projectId}`,
194
+ `--remove-secrets=${SEAL_KEY_PREVIOUS_ENV}`,
195
+ `--remove-labels=${SEAL_ROTATION_LABEL}`,
196
+ "--quiet",
197
+ ];
198
+ const rolled = await run(update);
199
+ const flipped = rolled.ok ? await run(rollFlip(t)) : rolled;
200
+ if (!flipped.ok) {
201
+ return { ok: false, steps, error: `roll the gateway: ${flipped.stderr.trim()}` };
202
+ }
203
+ steps.push("removed the previous seal key from the gateway; the rotation is complete");
204
+ return { ok: true, steps };
205
+ }
206
+ //# sourceMappingURL=seal-key-rotation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seal-key-rotation.js","sourceRoot":"","sources":["../src/seal-key-rotation.ts"],"names":[],"mappings":"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"}
@@ -130,6 +130,20 @@ export declare const OPERATOR_ACCESS_JOB_ENV_VAR = "CAELO_OPERATOR_ACCESS_JOB";
130
130
  * could not set the job up.
131
131
  */
132
132
  export declare const UPGRADER_JOB_ENV_VAR = "CAELO_UPGRADER_JOB";
133
+ /**
134
+ * The admin env var naming the converge job (#819) — what "Install update"
135
+ * starts for a release that changes the cloud setup. `upgrade` leaves it
136
+ * untouched when it could not set the job up.
137
+ */
138
+ export declare const CONVERGE_JOB_ENV_VAR = "CAELO_CONVERGE_JOB";
139
+ /**
140
+ * #875 — the admin env vars naming the parallel quality-audit job and the
141
+ * bucket its tasks write results into (admin-core quality/
142
+ * gcp-audit-launcher.ts). `upgrade` leaves them untouched when it could not
143
+ * set the job up.
144
+ */
145
+ export declare const AUDIT_JOB_ENV_VAR = "CAELO_AUDIT_JOB";
146
+ export declare const AUDIT_RESULTS_BUCKET_ENV_VAR = "CAELO_AUDIT_RESULTS_BUCKET";
133
147
  /**
134
148
  * Where the admin keeps media: the image's default media root
135
149
  * (`/app/apps/admin` + `data/media`), now the mount point of the media
@@ -181,7 +195,19 @@ export declare function adminMediaVolumeTemplate(volume: MediaVolumeContract): {
181
195
  * The Secret Manager secrets admin + gateway read at runtime, by logical
182
196
  * name ({@link gcpSecretId} gives the secret id).
183
197
  */
184
- export type RuntimeSecret = "postgres-password" | "public-role-password" | "secret-kek" | "internal-secret" | "tool-approval-secret" | "staging-gate-secret";
198
+ export type RuntimeSecret = "postgres-password" | "public-role-password" | "secret-kek" | "internal-secret" | "tool-approval-secret" | "staging-gate-secret"
199
+ /**
200
+ * #806 — the Google OAuth client the remote-MCP broker signs users in
201
+ * with: JSON `{"client_id","client_secret"}`, `{}` while remote MCP is not
202
+ * set up. The Owner writes it from Settings → MCP → Remote (the admin may
203
+ * add versions, never read them); the gateway reads it from a file.
204
+ */
205
+ | "mcp-oauth-client"
206
+ /**
207
+ * #806 — the broker's AES-256-GCM key (base64, 32 bytes) that seals its
208
+ * stateless OAuth state, codes and refresh tokens. Gateway only.
209
+ */
210
+ | "mcp-oauth-seal-key";
185
211
  /** The Postgres roles Caelo's services log in as, with their passwords. */
186
212
  export type DatabaseRole = "admin_role" | "public_role";
187
213
  /**
@@ -199,7 +225,21 @@ export declare const DATABASE_ROLE_SECRET: Readonly<Record<DatabaseRole, Runtime
199
225
  * Pulumi only references them, so a `pulumi up` after an upgrade never
200
226
  * collides with a secret upgrade created.
201
227
  */
202
- export declare const CLI_GENERATED_SECRETS: readonly ["internal-secret", "tool-approval-secret", "public-role-password", "staging-gate-secret"];
228
+ export declare const CLI_GENERATED_SECRETS: readonly ["internal-secret", "tool-approval-secret", "public-role-password", "staging-gate-secret", "mcp-oauth-client", "mcp-oauth-seal-key"];
229
+ /** A CLI-generated secret's first value: random hex, random base64, or a fixed placeholder. */
230
+ export type GeneratedSecretFormat = {
231
+ readonly kind: "hex32";
232
+ } | {
233
+ readonly kind: "base64-32";
234
+ } | {
235
+ readonly kind: "placeholder";
236
+ readonly value: string;
237
+ };
238
+ /**
239
+ * How each CLI-generated secret's first version is made. Every secret not
240
+ * listed is 32 random bytes as hex — the shape the stacks always generated.
241
+ */
242
+ export declare const GENERATED_SECRET_FORMAT: Readonly<Record<(typeof CLI_GENERATED_SECRETS)[number], GeneratedSecretFormat>>;
203
243
  /**
204
244
  * Each service's Secret Manager-backed env vars and the secret each reads.
205
245
  * The services' run SAs get `secretAccessor` on exactly these secrets
@@ -207,7 +247,57 @@ export declare const CLI_GENERATED_SECRETS: readonly ["internal-secret", "tool-a
207
247
  * boundary between the two services.
208
248
  */
209
249
  export declare const SERVICE_SECRET_ENV: Readonly<Record<CloudRunSlug, Readonly<Record<string, RuntimeSecret>>>>;
210
- /** The secrets `service` reads (deduplicated, table order). */
250
+ /** Env var naming the file that holds the remote-MCP Google OAuth client. */
251
+ export declare const MCP_OAUTH_CLIENT_FILE_ENV = "CAELO_MCP_OAUTH_CLIENT_FILE";
252
+ /**
253
+ * A Secret Manager secret mounted into a service as one file, at `latest`.
254
+ *
255
+ * Why a file and not an env var: Cloud Run resolves a secret env var once,
256
+ * at instance start, but reads a secret volume from Secret Manager each
257
+ * time the file is read ("When reading a volume, Cloud Run always fetches
258
+ * the secret value from the Secret Manager to use the value with the latest
259
+ * version" — cloud.google.com/run/docs/configuring/services/secrets). So the
260
+ * client the Owner saves under Settings → MCP reaches the running gateway
261
+ * (which re-reads it within 60 s) without a new revision, and the admin
262
+ * needs no right to deploy the gateway.
263
+ */
264
+ export interface SecretFileContract {
265
+ readonly secret: RuntimeSecret;
266
+ /** Volume name the stacks give it (gcloud names the ones upgrade adds itself). */
267
+ readonly volumeName: string;
268
+ /** Directory the volume is mounted at; must not exist in the image. */
269
+ readonly mountDir: string;
270
+ readonly fileName: string;
271
+ /** Always `latest`: a pinned version would never see the Owner's new client. */
272
+ readonly version: "latest";
273
+ }
274
+ /** The gateway's remote-MCP OAuth client file (#806). */
275
+ export declare const MCP_OAUTH_CLIENT_FILE: SecretFileContract;
276
+ /** Full path of a secret file inside the container. */
277
+ export declare function secretFilePath(file: SecretFileContract): string;
278
+ /** Each service's secret files. The admin has none. */
279
+ export declare const SERVICE_SECRET_FILES: Readonly<Record<CloudRunSlug, readonly SecretFileContract[]>>;
280
+ /**
281
+ * The secret files of `service` in the shape `gcp.cloudrunv2.Service`
282
+ * takes: `volumes` on the template, `volumeMounts` on the container.
283
+ */
284
+ export declare function secretFileVolumesTemplate(service: CloudRunSlug, env: string): {
285
+ readonly volumes: {
286
+ name: string;
287
+ secret: {
288
+ secret: string;
289
+ items: {
290
+ version: string;
291
+ path: string;
292
+ }[];
293
+ };
294
+ }[];
295
+ readonly volumeMounts: {
296
+ name: string;
297
+ mountPath: string;
298
+ }[];
299
+ };
300
+ /** The secrets `service` reads, as env or as files (deduplicated, table order). */
211
301
  export declare function serviceSecrets(service: CloudRunSlug): RuntimeSecret[];
212
302
  /**
213
303
  * Env vars an older stack set that the contract no longer gives a service;
@@ -237,6 +327,88 @@ export declare const GATEWAY_TRUSTED_PROXY_HOPS: Readonly<Record<SupportedProvid
237
327
  * spurious diffs.
238
328
  */
239
329
  export declare function gatewayEnvContract<V>(inputs: RuntimeEnvInputs<V>): CloudRunEnvVar<V | string>[];
330
+ /**
331
+ * #806 — the gateway's request timeout, in seconds: Cloud Run's maximum.
332
+ * The gateway proxies remote-MCP requests to the admin, and a `caelo_chat`
333
+ * turn streams for as long as the admin's own chat stream may (the admin
334
+ * runs at 3600 s for the same reason). Visitor endpoints are unaffected: a
335
+ * timeout is a ceiling, not a reservation, and Cloud Run bills request time,
336
+ * not the allowed maximum. On `gcp` the load balancer in front adds no
337
+ * shorter limit — the backend-service timeout does not apply to serverless
338
+ * NEGs, which get a fixed 60 minutes
339
+ * (cloud.google.com/load-balancing/docs/negs/serverless-neg-concepts).
340
+ */
341
+ export declare const GATEWAY_TIMEOUT_SECONDS = 3600;
342
+ /** Admin env var naming the Secret Manager secret the Owner writes the OAuth client to. */
343
+ export declare const MCP_OAUTH_CLIENT_STORE_ENV = "CAELO_MCP_OAUTH_CLIENT_STORE";
344
+ /** `projects/<project>/secrets/<id>` of the remote-MCP OAuth client secret. */
345
+ export declare function mcpOAuthClientSecretResource(projectId: string, env: string): string;
346
+ /**
347
+ * The remote-MCP env vars that name generated identities of the install:
348
+ * the admin's URL, the gateway's public origin, and the audience of the IAP
349
+ * JWTs the admin verifies.
350
+ *
351
+ * They are not part of {@link adminEnvContract} / {@link gatewayEnvContract}
352
+ * because the stacks cannot declare them: on `gcp-firebase` each service's
353
+ * value names a Cloud Run service Pulumi auto-names (the admin's audience is
354
+ * its own name; the gateway's public URL is its own URL; the admin's URL is
355
+ * a service created after the gateway), and on `gcp` the audience is the
356
+ * numeric id of a backend service created after the admin. A resource
357
+ * cannot take its own (or a later resource's) output as input. So the CLI
358
+ * reads the live identities after deploy and applies these vars with gcloud
359
+ * — the wizard after every `pulumi up`, `upgrade` after every roll
360
+ * (remote-mcp.ts `ensureRemoteMcpIdentityEnv`). A roll that does not set
361
+ * them leaves them as they are (planEnvUpdate never removes a var the
362
+ * contract does not own).
363
+ */
364
+ export interface RemoteMcpIdentity {
365
+ /** Where the gateway proxies `/api/mcp/<surface>` to (IAP in front). */
366
+ readonly adminUrl: string;
367
+ /** The broker's public origin; no trailing slash. */
368
+ readonly mcpPublicUrl: string;
369
+ /** The `aud` of the admin's IAP JWTs. */
370
+ readonly iapAudience: string;
371
+ }
372
+ /** Env var names of {@link RemoteMcpIdentity}. */
373
+ export declare const REMOTE_MCP_ENV: {
374
+ readonly adminUrl: "CAELO_ADMIN_URL";
375
+ readonly mcpPublicUrl: "CAELO_MCP_PUBLIC_URL";
376
+ readonly iapAudience: "CAELO_IAP_AUDIENCE";
377
+ };
378
+ /** What {@link remoteMcpIdentity} derives the identity from — all read from the live install. */
379
+ export type RemoteMcpIdentityInputs = {
380
+ readonly provider: "gcp";
381
+ readonly domain: string;
382
+ readonly projectNumber: string;
383
+ /** Numeric `id` of the admin's IAP-enabled backend service. */
384
+ readonly adminBackendServiceId: string;
385
+ } | {
386
+ readonly provider: "gcp-firebase";
387
+ readonly projectNumber: string;
388
+ readonly region: string;
389
+ readonly adminServiceName: string;
390
+ /** The services' `status.url` (`https://<name>-<hash>-<r>.a.run.app`). */
391
+ readonly adminServiceUrl: string;
392
+ readonly gatewayServiceUrl: string;
393
+ };
394
+ /**
395
+ * The install's remote-MCP identity.
396
+ *
397
+ * - `gcp`: the broker answers on the site's own host through the load
398
+ * balancer (`/api/*` and the `/.well-known/oauth-*` path rules), the admin
399
+ * on `admin.<domain>` behind the LB's IAP; the IAP audience is
400
+ * `/projects/<number>/global/backendServices/<id>`.
401
+ * - `gcp-firebase`: the broker answers on the gateway's own Cloud Run URL
402
+ * (Firebase Hosting rewrites cut requests at 60 s and buffer streams), the
403
+ * admin on its Cloud Run URL behind native IAP — whatever custom domain
404
+ * is mapped to it, IAP and its audience are the service's; the audience
405
+ * is `/projects/<number>/locations/<region>/services/<name>`.
406
+ *
407
+ * Audience formats: cloud.google.com/iap/docs/signed-headers-howto.
408
+ */
409
+ export declare function remoteMcpIdentity(i: RemoteMcpIdentityInputs): RemoteMcpIdentity;
410
+ /** {@link RemoteMcpIdentity} as each service's env vars. */
411
+ export declare function remoteMcpIdentityEnv(id: RemoteMcpIdentity): Record<CloudRunSlug, CloudRunEnvVar[]>;
240
412
  /**
241
413
  * The env of the admin service.
242
414
  *
@@ -1 +1 @@
1
- {"version":3,"file":"stack-contract.d.ts","sourceRoot":"","sources":["../src/stack-contract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stack-contract.d.ts","sourceRoot":"","sources":["../src/stack-contract.ts"],"names":[],"mappings":"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"}