@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
package/dist/agent-db.js CHANGED
@@ -382,6 +382,18 @@ function prefixIssues(path, issues) {
382
382
  function unwrapMessage(message) {
383
383
  return typeof message === "string" ? message : message?.message;
384
384
  }
385
+ function sizeCaps(defChecks) {
386
+ const caps = [];
387
+ for (const ch of defChecks ?? []) {
388
+ const d = ch._zod.def;
389
+ if (!/_(length|size)$|_equals$/.test(d.check))
390
+ break;
391
+ const max = d.maximum ?? d.length ?? d.size;
392
+ if (max >= 0)
393
+ caps.push([max, ch]);
394
+ }
395
+ return caps;
396
+ }
385
397
  function attachSchema(issues, start, inst) {
386
398
  var _a;
387
399
  for (let i = start;i < issues.length; i++) {
@@ -1379,7 +1391,7 @@ ${content.join(`
1379
1391
  var version = {
1380
1392
  major: 4,
1381
1393
  minor: 6,
1382
- patch: 5
1394
+ patch: 7
1383
1395
  };
1384
1396
 
1385
1397
  // ../../node_modules/zod/v4/core/schemas.js
@@ -1931,6 +1943,29 @@ var $ZodNever = /* @__PURE__ */ $constructor("$ZodNever", (inst, def) => {
1931
1943
  return payload;
1932
1944
  };
1933
1945
  });
1946
+ function capSize(inst, size) {
1947
+ const caps = sizeCaps(inst._zod.def.checks);
1948
+ if (!caps.length)
1949
+ return;
1950
+ const cap = Math.min(...caps.map((c) => c[0]));
1951
+ const parse = inst._zod.parse;
1952
+ inst._zod.parse = (payload, ctx) => {
1953
+ const n = size(payload.value);
1954
+ if (n > cap && !ctx?.skipChecks && ctx?.direction !== "backward") {
1955
+ for (const [max, ch] of sizeCaps(inst._zod.def.checks)) {
1956
+ if (n > max && ch._zod.def.when(payload)) {
1957
+ const start = payload.issues.length;
1958
+ ch._zod.check(payload);
1959
+ payload.issues[start].continue = false;
1960
+ attachSchema(payload.issues, start, inst);
1961
+ return payload;
1962
+ }
1963
+ }
1964
+ }
1965
+ return parse(payload, ctx);
1966
+ };
1967
+ }
1968
+ var arraySize = (input) => Array.isArray(input) ? input.length : -1;
1934
1969
  function handleArrayResult(result, final, index) {
1935
1970
  if (result.issues.length) {
1936
1971
  final.issues.push(...prefixIssues(index, result.issues));
@@ -1974,6 +2009,7 @@ var $ZodArray = /* @__PURE__ */ $constructor("$ZodArray", (inst, def) => {
1974
2009
  }
1975
2010
  return payload;
1976
2011
  };
2012
+ capSize(inst, arraySize);
1977
2013
  });
1978
2014
  function handlePropertyResult(result, final, key, input, optin, optout) {
1979
2015
  const isPresent = key in input;
@@ -6905,6 +6941,7 @@ var PLATFORM_UPDATE_PHASES = [
6905
6941
  "verify",
6906
6942
  "assess",
6907
6943
  "backup",
6944
+ "converge",
6908
6945
  "health-baseline",
6909
6946
  "migrations",
6910
6947
  "roll",
@@ -6914,6 +6951,7 @@ var PLATFORM_UPDATE_PHASES = [
6914
6951
  "self-update",
6915
6952
  "finish"
6916
6953
  ];
6954
+ var PLATFORM_UPDATE_ROUTES = ["app_roll", "converge"];
6917
6955
  var PLATFORM_UPDATE_EVENT_LEVELS = ["info", "success", "warn", "error"];
6918
6956
  var PLATFORM_UPDATE_TRIGGERS = ["manual", "auto"];
6919
6957
  var PLATFORM_UPDATE_STALE_MINUTES = 90;
@@ -6921,7 +6959,7 @@ var PLATFORM_UPDATE_STALE_REASON = "The upgrader stopped before it finished (its
6921
6959
  var PLATFORM_UPDATE_EVENT_MAX = 4000;
6922
6960
  var SEMVER = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/;
6923
6961
  var releaseVersionSchema = string2().regex(SEMVER, "expected a release version like 0.11.0 (no leading v)");
6924
- var UPDATE_POLICY_MODES = ["off", "notify", "auto"];
6962
+ var UPDATE_POLICY_MODES = ["notify", "auto"];
6925
6963
  var UPDATE_POLICY_CHANNELS = ["stable", "rc", "beta", "alpha"];
6926
6964
  var WALL_CLOCK = /^([01]\d|2[0-3]):[0-5]\d$/;
6927
6965
  function isKnownTimeZone(tz) {
@@ -6937,6 +6975,7 @@ var updatePolicySchema = object({
6937
6975
  autoSecurity: boolean2(),
6938
6976
  autoPatch: boolean2(),
6939
6977
  autoMinor: boolean2(),
6978
+ autoConverge: boolean2(),
6940
6979
  channel: _enum(UPDATE_POLICY_CHANNELS),
6941
6980
  windowStart: string2().regex(WALL_CLOCK, "expected HH:MM").nullable(),
6942
6981
  windowEnd: string2().regex(WALL_CLOCK, "expected HH:MM").nullable(),
@@ -7079,6 +7118,119 @@ var counters = new Map;
7079
7118
  var NAV_FUNCTIONAL_CSS = ".caelo-nav-menu .caelo-nav-toggle{display:none;background:none;border:0;cursor:pointer;padding:0.5rem;color:inherit;font:inherit}" + ".caelo-nav-menu .caelo-nav-toggle .caelo-nav-bar{display:block;width:1.25em;height:2px;background:currentColor;margin:0.25em 0}" + "@media (max-width: 720px){" + ".caelo-nav-menu .caelo-nav-toggle{display:inline-block}" + ".caelo-nav-menu > ul{display:none}" + '.caelo-nav-menu[data-nav-open="true"] > ul{display:block}' + "}";
7080
7119
  var NAV_TOGGLE_JS = "(function(){" + "document.querySelectorAll('.caelo-nav-menu').forEach(function(nav){" + "var btn=nav.querySelector('.caelo-nav-toggle');if(!btn)return;" + "btn.addEventListener('click',function(){" + "var open=nav.getAttribute('data-nav-open')==='true';" + "nav.setAttribute('data-nav-open',String(!open));" + "btn.setAttribute('aria-expanded',String(!open));" + "});" + "nav.addEventListener('keydown',function(e){" + "if(e.key==='Escape'&&nav.getAttribute('data-nav-open')==='true'){" + "nav.setAttribute('data-nav-open','false');" + "btn.setAttribute('aria-expanded','false');btn.focus();" + "}});" + "});" + "})();";
7081
7120
 
7121
+ // ../shared/src/media.ts
7122
+ var MEDIA_ALLOWED_MIMES = [
7123
+ "image/jpeg",
7124
+ "image/png",
7125
+ "image/webp",
7126
+ "image/avif",
7127
+ "image/gif",
7128
+ "image/svg+xml",
7129
+ "image/x-icon",
7130
+ "application/pdf",
7131
+ "video/mp4",
7132
+ "font/woff2",
7133
+ "font/woff",
7134
+ "font/ttf",
7135
+ "font/otf"
7136
+ ];
7137
+ var MEDIA_SIZE_CAPS = {
7138
+ "image/jpeg": 10 * 1024 * 1024,
7139
+ "image/png": 10 * 1024 * 1024,
7140
+ "image/webp": 10 * 1024 * 1024,
7141
+ "image/avif": 10 * 1024 * 1024,
7142
+ "image/gif": 8 * 1024 * 1024,
7143
+ "image/svg+xml": 1 * 1024 * 1024,
7144
+ "image/x-icon": 1 * 1024 * 1024,
7145
+ "application/pdf": 20 * 1024 * 1024,
7146
+ "video/mp4": 50 * 1024 * 1024,
7147
+ "font/woff2": 5 * 1024 * 1024,
7148
+ "font/woff": 5 * 1024 * 1024,
7149
+ "font/ttf": 5 * 1024 * 1024,
7150
+ "font/otf": 5 * 1024 * 1024
7151
+ };
7152
+ var MEDIA_HARD_LIMIT_BYTES = 50 * 1024 * 1024;
7153
+ var MEDIA_URL_PREFIX = "/_caelo/media";
7154
+ var RASTER_IMAGE_MIMES = new Set([
7155
+ "image/jpeg",
7156
+ "image/png",
7157
+ "image/webp",
7158
+ "image/avif",
7159
+ "image/gif"
7160
+ ]);
7161
+ var mediaUrlPattern = new RegExp(`${MEDIA_URL_PREFIX}/([a-z0-9][a-z0-9-]{0,63})(?:/([a-z][a-z0-9-]{0,63}))?`, "g");
7162
+ var sha256Schema = string2().regex(/^[0-9a-f]{64}$/, "must be hex sha256");
7163
+ var mediaVisibilitySchema = _enum(["library", "reference"]);
7164
+ var mediaUploadInputSchema = object({
7165
+ sha256: sha256Schema,
7166
+ originalName: string2().min(1).max(512),
7167
+ name: string2().max(200).optional(),
7168
+ mime: _enum(MEDIA_ALLOWED_MIMES),
7169
+ sizeBytes: number2().int().positive(),
7170
+ width: number2().int().positive().nullable(),
7171
+ height: number2().int().positive().nullable(),
7172
+ alt: string2().max(2048).default(""),
7173
+ storageKey: string2().min(1),
7174
+ storageProvider: string2().min(1).max(64).default("local"),
7175
+ sourceKind: _enum(["upload", "ai_generated", "imported", "external"]).optional(),
7176
+ sourceDetail: string2().max(2048).optional(),
7177
+ license: string2().max(200).optional(),
7178
+ visibility: mediaVisibilitySchema.optional(),
7179
+ derivedFromId: string2().uuid().optional(),
7180
+ variants: array(object({
7181
+ variant: string2().min(1).max(64),
7182
+ format: string2().min(1).max(32),
7183
+ width: number2().int().positive().nullable(),
7184
+ height: number2().int().positive().nullable(),
7185
+ sizeBytes: number2().int().positive(),
7186
+ storageKey: string2().min(1)
7187
+ })).min(1)
7188
+ }).strict();
7189
+ var mediaListInputSchema = object({
7190
+ query: string2().max(256).optional(),
7191
+ mime: _enum(MEDIA_ALLOWED_MIMES).optional(),
7192
+ sort: _enum(["recent", "most_used"]).default("recent"),
7193
+ visibility: _enum(["library", "reference", "all"]).default("library"),
7194
+ limit: number2().int().positive().max(200).default(60),
7195
+ offset: number2().int().nonnegative().default(0)
7196
+ }).strict();
7197
+ var mediaUpdateAltInputSchema = object({
7198
+ assetId: string2().uuid(),
7199
+ alt: string2().max(2048)
7200
+ }).strict();
7201
+ var mediaSetSourceInputSchema = object({
7202
+ assetId: string2().uuid(),
7203
+ sourceKind: _enum(["upload", "ai_generated", "imported", "external"]).optional(),
7204
+ sourceDetail: string2().max(2048).optional(),
7205
+ license: string2().max(200).optional()
7206
+ }).strict();
7207
+ var mediaSetVisibilityInputSchema = object({
7208
+ assetId: string2().uuid(),
7209
+ visibility: mediaVisibilitySchema
7210
+ }).strict();
7211
+ var mediaDeleteInputSchema = object({
7212
+ assetId: string2().uuid(),
7213
+ force: boolean2().default(false)
7214
+ }).strict();
7215
+ var mediaRecordUsageInputSchema = object({
7216
+ deltas: record(string2().uuid(), number2().int())
7217
+ }).strict();
7218
+ var mediaSetCdnInputSchema = object({
7219
+ enabled: boolean2(),
7220
+ threshold: number2().int().min(1).max(1e4)
7221
+ }).strict();
7222
+
7223
+ // ../shared/src/link-refs.ts
7224
+ var UUID_SRC = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
7225
+ var QUERY_SRC = "[A-Za-z0-9_\\-.~%=&;+/:@!$()*]{1,512}";
7226
+ var ANCHOR_SRC = "[A-Za-z0-9_\\-.~%:]{1,256}";
7227
+ var VARIANT_SRC = "[a-z][a-z0-9-]{0,63}";
7228
+ var ID_END_SRC = "(?![A-Za-z0-9_/\\-])";
7229
+ var PAGE_BODY_SRC = `page/(${UUID_SRC})${ID_END_SRC}(?:\\?(${QUERY_SRC}))?(?:#(${ANCHOR_SRC}))?`;
7230
+ var MEDIA_BODY_SRC = `media/(${UUID_SRC})(?:/(${VARIANT_SRC}))?${ID_END_SRC}`;
7231
+ var PAGE_REF_EXACT = new RegExp(`^caelo:${PAGE_BODY_SRC}$`);
7232
+ var MEDIA_REF_EXACT = new RegExp(`^caelo:${MEDIA_BODY_SRC}$`);
7233
+
7082
7234
  // ../../node_modules/mustache/mustache.mjs
7083
7235
  /*!
7084
7236
  * mustache.js - Logic-less {{mustache}} templates with JavaScript
@@ -7551,6 +7703,21 @@ var THEME_ASSET_KEY_TO_SLOT = {
7551
7703
  };
7552
7704
  var THEME_ASSET_KEYS = Object.keys(THEME_ASSET_KEY_TO_SLOT);
7553
7705
 
7706
+ // ../shared/src/template-balance.ts
7707
+ var RAW_TEXT_ELEMENTS = new Set([
7708
+ "script",
7709
+ "style",
7710
+ "textarea",
7711
+ "title",
7712
+ "xmp",
7713
+ "iframe",
7714
+ "noembed",
7715
+ "noframes",
7716
+ "noscript"
7717
+ ]);
7718
+ var CODE_ELEMENTS = new Set(["script", "style"]);
7719
+ var FOREIGN_ROOTS = new Set(["svg", "math"]);
7720
+
7554
7721
  // ../shared/src/font-assets.ts
7555
7722
  var fontRef = object({ id: string2().uuid(), sha256: string2().regex(/^[a-f0-9]{64}$/) }).strict();
7556
7723
  var fontLicense = object({
@@ -7908,6 +8075,8 @@ var SYSTEM_FONT_FAMILIES = new Set([
7908
8075
  "lucida console",
7909
8076
  "lucida sans"
7910
8077
  ].map((f) => f.toLowerCase()));
8078
+ var UNICODE_RANGE_ITEM = "U\\+[0-9A-F?]{1,6}(?:-[0-9A-F]{1,6})?";
8079
+ var UNICODE_RANGE_RE = new RegExp(`^${UNICODE_RANGE_ITEM}(?:, *${UNICODE_RANGE_ITEM})*$`, "i");
7911
8080
  // ../shared/src/genesis.ts
7912
8081
  var designBriefSchema = object({
7913
8082
  audience: string2().min(1).max(500).optional(),
@@ -7994,107 +8163,6 @@ var GENERIC_FONT_KEYWORDS = new Set([
7994
8163
  ]);
7995
8164
  // ../shared/src/markup-structure.ts
7996
8165
  var LEAF_TAGS = new Set(["svg", "math", "script", "style", "noscript", "iframe"]);
7997
- // ../shared/src/media.ts
7998
- var MEDIA_ALLOWED_MIMES = [
7999
- "image/jpeg",
8000
- "image/png",
8001
- "image/webp",
8002
- "image/avif",
8003
- "image/gif",
8004
- "image/svg+xml",
8005
- "image/x-icon",
8006
- "application/pdf",
8007
- "video/mp4",
8008
- "font/woff2",
8009
- "font/woff",
8010
- "font/ttf",
8011
- "font/otf"
8012
- ];
8013
- var MEDIA_SIZE_CAPS = {
8014
- "image/jpeg": 10 * 1024 * 1024,
8015
- "image/png": 10 * 1024 * 1024,
8016
- "image/webp": 10 * 1024 * 1024,
8017
- "image/avif": 10 * 1024 * 1024,
8018
- "image/gif": 8 * 1024 * 1024,
8019
- "image/svg+xml": 1 * 1024 * 1024,
8020
- "image/x-icon": 1 * 1024 * 1024,
8021
- "application/pdf": 20 * 1024 * 1024,
8022
- "video/mp4": 50 * 1024 * 1024,
8023
- "font/woff2": 5 * 1024 * 1024,
8024
- "font/woff": 5 * 1024 * 1024,
8025
- "font/ttf": 5 * 1024 * 1024,
8026
- "font/otf": 5 * 1024 * 1024
8027
- };
8028
- var MEDIA_HARD_LIMIT_BYTES = 50 * 1024 * 1024;
8029
- var MEDIA_URL_PREFIX = "/_caelo/media";
8030
- var RASTER_IMAGE_MIMES = new Set([
8031
- "image/jpeg",
8032
- "image/png",
8033
- "image/webp",
8034
- "image/avif",
8035
- "image/gif"
8036
- ]);
8037
- var mediaUrlPattern = new RegExp(`${MEDIA_URL_PREFIX}/([a-z0-9][a-z0-9-]{0,63})(?:/([a-z][a-z0-9-]{0,63}))?`, "g");
8038
- var sha256Schema = string2().regex(/^[0-9a-f]{64}$/, "must be hex sha256");
8039
- var mediaVisibilitySchema = _enum(["library", "reference"]);
8040
- var mediaUploadInputSchema = object({
8041
- sha256: sha256Schema,
8042
- originalName: string2().min(1).max(512),
8043
- name: string2().max(200).optional(),
8044
- mime: _enum(MEDIA_ALLOWED_MIMES),
8045
- sizeBytes: number2().int().positive(),
8046
- width: number2().int().positive().nullable(),
8047
- height: number2().int().positive().nullable(),
8048
- alt: string2().max(2048).default(""),
8049
- storageKey: string2().min(1),
8050
- storageProvider: string2().min(1).max(64).default("local"),
8051
- sourceKind: _enum(["upload", "ai_generated", "imported", "external"]).optional(),
8052
- sourceDetail: string2().max(2048).optional(),
8053
- license: string2().max(200).optional(),
8054
- visibility: mediaVisibilitySchema.optional(),
8055
- derivedFromId: string2().uuid().optional(),
8056
- variants: array(object({
8057
- variant: string2().min(1).max(64),
8058
- format: string2().min(1).max(32),
8059
- width: number2().int().positive().nullable(),
8060
- height: number2().int().positive().nullable(),
8061
- sizeBytes: number2().int().positive(),
8062
- storageKey: string2().min(1)
8063
- })).min(1)
8064
- }).strict();
8065
- var mediaListInputSchema = object({
8066
- query: string2().max(256).optional(),
8067
- mime: _enum(MEDIA_ALLOWED_MIMES).optional(),
8068
- sort: _enum(["recent", "most_used"]).default("recent"),
8069
- visibility: _enum(["library", "reference", "all"]).default("library"),
8070
- limit: number2().int().positive().max(200).default(60),
8071
- offset: number2().int().nonnegative().default(0)
8072
- }).strict();
8073
- var mediaUpdateAltInputSchema = object({
8074
- assetId: string2().uuid(),
8075
- alt: string2().max(2048)
8076
- }).strict();
8077
- var mediaSetSourceInputSchema = object({
8078
- assetId: string2().uuid(),
8079
- sourceKind: _enum(["upload", "ai_generated", "imported", "external"]).optional(),
8080
- sourceDetail: string2().max(2048).optional(),
8081
- license: string2().max(200).optional()
8082
- }).strict();
8083
- var mediaSetVisibilityInputSchema = object({
8084
- assetId: string2().uuid(),
8085
- visibility: mediaVisibilitySchema
8086
- }).strict();
8087
- var mediaDeleteInputSchema = object({
8088
- assetId: string2().uuid(),
8089
- force: boolean2().default(false)
8090
- }).strict();
8091
- var mediaRecordUsageInputSchema = object({
8092
- deltas: record(string2().uuid(), number2().int())
8093
- }).strict();
8094
- var mediaSetCdnInputSchema = object({
8095
- enabled: boolean2(),
8096
- threshold: number2().int().min(1).max(1e4)
8097
- }).strict();
8098
8166
  // ../shared/src/page-log.ts
8099
8167
  var pageLogEntryKinds = [
8100
8168
  "edited",
@@ -18018,6 +18086,9 @@ class DatabaseAdapter {
18018
18086
  return this.#publicRaw;
18019
18087
  }
18020
18088
  async provisionPluginPublicSchema(opts) {
18089
+ if (!/^[0-9a-f-]{36}$/i.test(opts.pluginId)) {
18090
+ throw new Error(`provisionPluginPublicSchema: pluginId "${opts.pluginId}" is not a UUID`);
18091
+ }
18021
18092
  if (!this.#skipVerify)
18022
18093
  await this.verifyRoles();
18023
18094
  await this.#public.transaction(async (tx) => {
@@ -18027,12 +18098,15 @@ class DatabaseAdapter {
18027
18098
  });
18028
18099
  }
18029
18100
  async provisionPluginAdminSchema(opts) {
18101
+ if (!/^[0-9a-f-]{36}$/i.test(opts.pluginId)) {
18102
+ throw new Error(`provisionPluginAdminSchema: pluginId "${opts.pluginId}" is not a UUID`);
18103
+ }
18030
18104
  const admin = this.#adminDb("provisionPluginAdminSchema");
18031
18105
  if (!this.#skipVerify)
18032
18106
  await this.verifyRoles();
18033
18107
  await admin.transaction(async (tx) => {
18034
18108
  await tx.execute(sql.raw("SELECT set_config('caelo.actor_kind', 'system', true)"));
18035
- await tx.execute(sql.raw(`SELECT set_config('caelo.plugin_id', '${opts.pluginId}', true)`));
18109
+ await tx.execute(sql`SELECT set_config('caelo.plugin_id', ${opts.pluginId}, true)`);
18036
18110
  await tx.execute(sql.raw(opts.sql));
18037
18111
  });
18038
18112
  }
@@ -18067,7 +18141,18 @@ class DatabaseAdapter {
18067
18141
  }
18068
18142
  }
18069
18143
  // ../query-api/src/audit.ts
18070
- var SENSITIVE_KEYS = new Set(["password", "token", "csrfToken", "passwordHash"]);
18144
+ var SENSITIVE_KEYS = new Set([
18145
+ "password",
18146
+ "newPassword",
18147
+ "currentPassword",
18148
+ "token",
18149
+ "csrfToken",
18150
+ "passwordHash",
18151
+ "secret",
18152
+ "apiKey",
18153
+ "clientSecret"
18154
+ ]);
18155
+ var SENSITIVE_KEY_RE = /pass(word|wd|phrase)?|secret|token|api[-_]?key|credential|private[-_]?key/i;
18071
18156
  function redact2(value) {
18072
18157
  if (value === null || value === undefined)
18073
18158
  return value;
@@ -18076,7 +18161,9 @@ function redact2(value) {
18076
18161
  if (typeof value === "object") {
18077
18162
  const out = {};
18078
18163
  for (const [k, v] of Object.entries(value)) {
18079
- out[k] = SENSITIVE_KEYS.has(k) ? "<redacted>" : redact2(v);
18164
+ if (k === "__proto__" || k === "constructor" || k === "prototype")
18165
+ continue;
18166
+ out[k] = SENSITIVE_KEYS.has(k) || SENSITIVE_KEY_RE.test(k) ? "<redacted>" : redact2(v);
18080
18167
  }
18081
18168
  return out;
18082
18169
  }
@@ -18212,11 +18299,12 @@ class OperationRegistry {
18212
18299
  }
18213
18300
  // ../platform-updater/src/ops.ts
18214
18301
  var policySchema = object({
18215
- mode: _enum(["off", "notify", "auto"]),
18302
+ mode: _enum(UPDATE_POLICY_MODES),
18216
18303
  autoSecurity: boolean2(),
18217
18304
  autoPatch: boolean2(),
18218
18305
  autoMinor: boolean2(),
18219
- channel: _enum(["stable", "rc", "beta", "alpha"]),
18306
+ autoConverge: boolean2(),
18307
+ channel: _enum(UPDATE_POLICY_CHANNELS),
18220
18308
  windowStart: string2().nullable(),
18221
18309
  windowEnd: string2().nullable(),
18222
18310
  windowTimezone: string2(),
@@ -18236,14 +18324,19 @@ var claimOutput = object({
18236
18324
  targetVersion: string2(),
18237
18325
  trigger: _enum(PLATFORM_UPDATE_TRIGGERS),
18238
18326
  autoBasis: _enum(AUTO_UPDATE_BASES).nullable(),
18239
- policy: policySchema
18327
+ policy: policySchema,
18328
+ resume: boolean2(),
18329
+ execution: string2().nullable()
18240
18330
  }).nullable()
18241
18331
  });
18242
18332
  var jobClaimOp = defineOperation({
18243
18333
  name: "platform_updates.job_claim",
18244
18334
  actorScope: ["system"],
18245
18335
  database: "cms_admin",
18246
- input: object({ execution: string2().min(1).max(200).nullable() }).strict(),
18336
+ input: object({
18337
+ execution: string2().min(1).max(200).nullable(),
18338
+ route: _enum(PLATFORM_UPDATE_ROUTES).default("app_roll")
18339
+ }).strict(),
18247
18340
  output: claimOutput,
18248
18341
  handler: async (_ctx, input, tx) => {
18249
18342
  const stale = await tx.execute(sql`
@@ -18269,23 +18362,31 @@ var jobClaimOp = defineOperation({
18269
18362
  WHERE id = 1
18270
18363
  `);
18271
18364
  }
18272
- const claimed = await tx.execute(sql`
18273
- UPDATE platform_update_requests
18274
- SET status = 'running', started_at = now(), execution = ${input.execution}
18275
- WHERE id = (
18276
- SELECT id FROM platform_update_requests
18277
- WHERE status = 'pending'
18278
- ORDER BY requested_at
18279
- LIMIT 1
18280
- FOR UPDATE SKIP LOCKED
18281
- )
18282
- RETURNING id::text AS id, target_version, trigger, auto_basis
18283
- `);
18284
- const row = claimed[0];
18365
+ const running = input.route === "converge" ? await tx.execute(sql`
18366
+ SELECT id::text AS id, target_version, trigger, auto_basis, execution
18367
+ FROM platform_update_requests
18368
+ WHERE status = 'running' AND route = 'converge'
18369
+ ORDER BY requested_at
18370
+ LIMIT 1
18371
+ `) : [];
18372
+ const resumed = running[0];
18373
+ const claimed = resumed ? [] : await tx.execute(sql`
18374
+ UPDATE platform_update_requests
18375
+ SET status = 'running', started_at = now(), execution = ${input.execution}
18376
+ WHERE id = (
18377
+ SELECT id FROM platform_update_requests
18378
+ WHERE status = 'pending' AND route = ${input.route}
18379
+ ORDER BY requested_at
18380
+ LIMIT 1
18381
+ FOR UPDATE SKIP LOCKED
18382
+ )
18383
+ RETURNING id::text AS id, target_version, trigger, auto_basis, execution
18384
+ `);
18385
+ const row = resumed ?? claimed[0];
18285
18386
  if (!row)
18286
18387
  return ok({ recovered: stale.map((s) => s.id), claimed: null });
18287
18388
  const policies = await tx.execute(sql`
18288
- SELECT mode, auto_security, auto_patch, auto_minor, channel,
18389
+ SELECT mode, auto_security, auto_patch, auto_minor, auto_converge, channel,
18289
18390
  to_char(window_start, 'HH24:MI') AS window_start,
18290
18391
  to_char(window_end, 'HH24:MI') AS window_end,
18291
18392
  window_timezone, soak_hours, security_soak_hours, paused, paused_reason,
@@ -18303,11 +18404,14 @@ var jobClaimOp = defineOperation({
18303
18404
  targetVersion: row.target_version,
18304
18405
  trigger: row.trigger,
18305
18406
  autoBasis: row.auto_basis,
18407
+ resume: resumed !== undefined,
18408
+ execution: row.execution,
18306
18409
  policy: {
18307
18410
  mode: p.mode,
18308
18411
  autoSecurity: p.auto_security,
18309
18412
  autoPatch: p.auto_patch,
18310
18413
  autoMinor: p.auto_minor,
18414
+ autoConverge: p.auto_converge,
18311
18415
  channel: p.channel,
18312
18416
  windowStart: p.window_start,
18313
18417
  windowEnd: p.window_end,
@@ -18325,6 +18429,36 @@ var jobClaimOp = defineOperation({
18325
18429
  });
18326
18430
  }
18327
18431
  });
18432
+ var jobHandoverOp = defineOperation({
18433
+ name: "platform_updates.job_handover",
18434
+ actorScope: ["system"],
18435
+ database: "cms_admin",
18436
+ input: object({
18437
+ requestId: string2().uuid(),
18438
+ from: string2().min(1).max(200).nullable(),
18439
+ to: string2().min(1).max(200).nullable()
18440
+ }).strict(),
18441
+ output: object({ handedOver: boolean2() }),
18442
+ handler: async (ctx, input, tx) => {
18443
+ const rows = await tx.execute(sql`
18444
+ UPDATE platform_update_requests
18445
+ SET execution = ${input.to}, started_at = now()
18446
+ WHERE id = ${input.requestId}::uuid AND status = 'running' AND route = 'converge'
18447
+ AND execution IS NOT DISTINCT FROM ${input.from}
18448
+ RETURNING id
18449
+ `);
18450
+ await recordAudit(tx, {
18451
+ actorId: SYSTEM_ACTOR_ID,
18452
+ requestId: ctx.requestId,
18453
+ operation: "platform_updates.job_handover",
18454
+ input: { requestId: input.requestId, from: input.from, to: input.to },
18455
+ succeeded: rows.length > 0,
18456
+ entityId: input.requestId,
18457
+ resultSummary: rows.length > 0 ? input.to === null ? "released for the next run" : `run ${input.to}` : "not handed over (moved on)"
18458
+ });
18459
+ return ok({ handedOver: rows.length > 0 });
18460
+ }
18461
+ });
18328
18462
  var jobEventOp = defineOperation({
18329
18463
  name: "platform_updates.job_event",
18330
18464
  actorScope: ["system"],
@@ -18450,26 +18584,36 @@ function upgraderRegistry() {
18450
18584
  registry.register(jobEventOp);
18451
18585
  registry.register(jobRecordOp);
18452
18586
  registry.register(jobFinishOp);
18587
+ registry.register(jobHandoverOp);
18453
18588
  registry.register(agentHeartbeatOp);
18454
18589
  return registry;
18455
18590
  }
18456
- function createDbAgentQueue(adapter, registry = upgraderRegistry()) {
18591
+ function opCaller(adapter, registry) {
18457
18592
  let n = 0;
18458
18593
  const ctx = () => ({
18459
18594
  actorId: SYSTEM_ACTOR_ID,
18460
18595
  actorKind: "system",
18461
18596
  requestId: `upgrader-job-${Date.now()}-${n++}`
18462
18597
  });
18463
- const call = async (op, input) => {
18598
+ return async (op, input) => {
18464
18599
  const r = await execute(registry, adapter, ctx(), op, input);
18465
18600
  if (!r.ok)
18466
18601
  throw new Error(`${op}: ${JSON.stringify(r.error)}`);
18467
18602
  return r.value;
18468
18603
  };
18604
+ }
18605
+ function createDbAgentQueue(adapter, registry = upgraderRegistry()) {
18606
+ const call = opCaller(adapter, registry);
18469
18607
  return {
18470
18608
  async claim(execution) {
18471
- const r = await call("platform_updates.job_claim", { execution });
18472
- return r.claimed;
18609
+ const r = await call("platform_updates.job_claim", {
18610
+ execution,
18611
+ route: "app_roll"
18612
+ });
18613
+ if (!r.claimed)
18614
+ return null;
18615
+ const { resume: _resume, execution: _execution, ...request } = r.claimed;
18616
+ return request;
18473
18617
  },
18474
18618
  async event(requestId, phase, level, message) {
18475
18619
  await call("platform_updates.job_event", { requestId, phase, level, message });
@@ -0,0 +1,69 @@
1
+ import { type GcloudRunner, type Sleep } from "./gcloud-retry.js";
2
+ import type { GcpProvider } from "./stack-contract.js";
3
+ /** Where the admin image ships the task's entry point. */
4
+ export declare const AUDIT_TASK_SCRIPT = "/app/packages/admin-core/src/quality/audit-task.ts";
5
+ /** How many audit tasks run at once by default: 5 pages x 3 runs. */
6
+ export declare const AUDIT_PARALLELISM_DEFAULT = 15;
7
+ /**
8
+ * Roles the audit job's identity must never hold anywhere. Prefix matches
9
+ * (`roles/secretmanager.` = every Secret Manager role).
10
+ */
11
+ export declare const AUDIT_FORBIDDEN_ROLES: readonly ["roles/owner", "roles/editor", "roles/run.", "roles/iam.", "roles/secretmanager.", "roles/cloudsql.", "roles/compute.", "roles/resourcemanager.", "roles/storage.admin", "roles/storage.objectAdmin", "roles/storage.objectUser"];
12
+ /** Delete results after a day: the admin reads them within minutes. */
13
+ export declare const AUDIT_RESULTS_LIFECYCLE: {
14
+ rule: {
15
+ action: {
16
+ type: string;
17
+ };
18
+ condition: {
19
+ age: number;
20
+ };
21
+ }[];
22
+ };
23
+ export interface AuditJobTarget {
24
+ readonly provider: GcpProvider;
25
+ readonly projectId: string;
26
+ readonly region: string;
27
+ /** Pulumi stack name (`production`). */
28
+ readonly env: string;
29
+ /** The admin image the job runs, digest-pinned (`…/admin@sha256:…`). */
30
+ readonly adminImageRef: string;
31
+ /**
32
+ * Tasks at once (`auditParallelism`, 1–15). Absent on converge: an
33
+ * existing job keeps the value it has, so an operator's choice survives
34
+ * `upgrade`; a job the converge creates gets
35
+ * {@link AUDIT_PARALLELISM_DEFAULT}, as a fresh install's does.
36
+ */
37
+ readonly parallelism?: number;
38
+ }
39
+ export type AuditJobResult = {
40
+ readonly ok: true;
41
+ readonly done: string[];
42
+ } | {
43
+ readonly ok: false;
44
+ readonly done: string[];
45
+ readonly error: string;
46
+ };
47
+ /** Ensure the audit job and everything it needs. Never throws for a gcloud failure. */
48
+ export declare function ensureAuditJob(target: AuditJobTarget, deps?: {
49
+ run?: GcloudRunner;
50
+ sleep?: Sleep;
51
+ }): Promise<AuditJobResult>;
52
+ /**
53
+ * {@link ensureAuditJob}'s image: the deployed admin's, so the job runs the
54
+ * code the admin runs.
55
+ */
56
+ export declare function resolveAdminImage(opts: {
57
+ readonly projectId: string;
58
+ readonly region: string;
59
+ readonly env: string;
60
+ }, deps?: {
61
+ run?: GcloudRunner;
62
+ }): Promise<{
63
+ ok: true;
64
+ imageRef: string;
65
+ } | {
66
+ ok: false;
67
+ error: string;
68
+ }>;
69
+ //# sourceMappingURL=audit-job-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-job-setup.d.ts","sourceRoot":"","sources":["../src/audit-job-setup.ts"],"names":[],"mappings":"AAgDA,OAAO,EAAE,KAAK,YAAY,EAA2B,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAS3F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,0DAA0D;AAC1D,eAAO,MAAM,iBAAiB,uDAAuD,CAAC;AAEtF,qEAAqE;AACrE,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAS5C;;;GAGG;AACH,eAAO,MAAM,qBAAqB,6OAYxB,CAAC;AAEX,uEAAuE;AACvE,eAAO,MAAM,uBAAuB;;;;;;;;;CAEnC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,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,wEAAwE;IACxE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5E,uFAAuF;AACvF,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,YAAY,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAO,GAC/C,OAAO,CAAC,cAAc,CAAC,CA6NzB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EACnF,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,YAAY,CAAA;CAAO,GAChC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAQxE"}