@caelo-cms/provisioning 0.10.53 → 0.10.55

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 (90) hide show
  1. package/dist/agent-db.js +196 -109
  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.js +32 -8
  11. package/dist/cli.js.map +1 -1
  12. package/dist/gcp-names.d.ts +16 -1
  13. package/dist/gcp-names.d.ts.map +1 -1
  14. package/dist/gcp-names.js +23 -0
  15. package/dist/gcp-names.js.map +1 -1
  16. package/dist/infra-contract.d.ts +1 -1
  17. package/dist/infra-contract.d.ts.map +1 -1
  18. package/dist/infra-contract.js +7 -1
  19. package/dist/infra-contract.js.map +1 -1
  20. package/dist/private-file.d.ts +26 -0
  21. package/dist/private-file.d.ts.map +1 -0
  22. package/dist/private-file.js +49 -0
  23. package/dist/private-file.js.map +1 -0
  24. package/dist/release-contract.d.ts.map +1 -1
  25. package/dist/release-contract.js +3 -0
  26. package/dist/release-contract.js.map +1 -1
  27. package/dist/stack-contract.d.ts +8 -0
  28. package/dist/stack-contract.d.ts.map +1 -1
  29. package/dist/stack-contract.js +13 -1
  30. package/dist/stack-contract.js.map +1 -1
  31. package/dist/tar-entries.d.ts.map +1 -1
  32. package/dist/tar-entries.js +84 -9
  33. package/dist/tar-entries.js.map +1 -1
  34. package/dist/upgrade/app-roll.d.ts.map +1 -1
  35. package/dist/upgrade/app-roll.js +35 -0
  36. package/dist/upgrade/app-roll.js.map +1 -1
  37. package/dist/upgrade/audit-job-roll.d.ts +38 -0
  38. package/dist/upgrade/audit-job-roll.d.ts.map +1 -0
  39. package/dist/upgrade/audit-job-roll.js +43 -0
  40. package/dist/upgrade/audit-job-roll.js.map +1 -0
  41. package/dist/upgrade/converge.d.ts.map +1 -1
  42. package/dist/upgrade/converge.js +33 -2
  43. package/dist/upgrade/converge.js.map +1 -1
  44. package/dist/upgrader-setup.d.ts.map +1 -1
  45. package/dist/upgrader-setup.js +9 -3
  46. package/dist/upgrader-setup.js.map +1 -1
  47. package/dist/wizards/gcp-cost.js +3 -3
  48. package/dist/wizards/gcp-cost.js.map +1 -1
  49. package/dist/wizards/gcp-pulumi.d.ts +6 -0
  50. package/dist/wizards/gcp-pulumi.d.ts.map +1 -1
  51. package/dist/wizards/gcp-pulumi.js +7 -0
  52. package/dist/wizards/gcp-pulumi.js.map +1 -1
  53. package/dist/wizards/gcp.d.ts.map +1 -1
  54. package/dist/wizards/gcp.js +31 -0
  55. package/dist/wizards/gcp.js.map +1 -1
  56. package/package.json +4 -4
  57. package/src/agent/run.test.ts +1 -0
  58. package/src/audit-job-setup.test.ts +234 -0
  59. package/src/audit-job-setup.ts +360 -0
  60. package/src/caddy-redirects.docker.test.ts +19 -6
  61. package/src/caddy.test.ts +30 -0
  62. package/src/caddy.ts +43 -0
  63. package/src/cli-init-validation.test.ts +44 -0
  64. package/src/cli.ts +36 -7
  65. package/src/gcp-names.ts +28 -1
  66. package/src/infra-contract.test.ts +3 -3
  67. package/src/infra-contract.ts +7 -1
  68. package/src/private-file.test.ts +80 -0
  69. package/src/private-file.ts +50 -0
  70. package/src/release-contract.ts +3 -0
  71. package/src/stack-contract.test.ts +4 -0
  72. package/src/stack-contract.ts +14 -0
  73. package/src/stack-converge.test.ts +1 -1
  74. package/src/tar-entries.test.ts +149 -7
  75. package/src/tar-entries.ts +90 -9
  76. package/src/upgrade/app-roll.ts +39 -0
  77. package/src/upgrade/audit-job-roll.ts +68 -0
  78. package/src/upgrade/converge.ts +42 -1
  79. package/src/upgrade/upgrade.test.ts +76 -2
  80. package/src/upgrader-assess.test.ts +1 -0
  81. package/src/upgrader-job.test.ts +1 -0
  82. package/src/upgrader-setup.test.ts +1 -0
  83. package/src/upgrader-setup.ts +9 -2
  84. package/src/wizards/gcp-cost.ts +3 -3
  85. package/src/wizards/gcp-pulumi.ts +7 -0
  86. package/src/wizards/gcp.ts +37 -0
  87. package/stacks/aws/index.ts +8 -0
  88. package/stacks/azure/index.ts +9 -0
  89. package/stacks/gcp/index.ts +13 -0
  90. package/stacks/gcp-firebase/index.ts +13 -0
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;
@@ -6921,7 +6957,7 @@ var PLATFORM_UPDATE_STALE_REASON = "The upgrader stopped before it finished (its
6921
6957
  var PLATFORM_UPDATE_EVENT_MAX = 4000;
6922
6958
  var SEMVER = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/;
6923
6959
  var releaseVersionSchema = string2().regex(SEMVER, "expected a release version like 0.11.0 (no leading v)");
6924
- var UPDATE_POLICY_MODES = ["off", "notify", "auto"];
6960
+ var UPDATE_POLICY_MODES = ["notify", "auto"];
6925
6961
  var UPDATE_POLICY_CHANNELS = ["stable", "rc", "beta", "alpha"];
6926
6962
  var WALL_CLOCK = /^([01]\d|2[0-3]):[0-5]\d$/;
6927
6963
  function isKnownTimeZone(tz) {
@@ -6937,6 +6973,7 @@ var updatePolicySchema = object({
6937
6973
  autoSecurity: boolean2(),
6938
6974
  autoPatch: boolean2(),
6939
6975
  autoMinor: boolean2(),
6976
+ autoConverge: boolean2(),
6940
6977
  channel: _enum(UPDATE_POLICY_CHANNELS),
6941
6978
  windowStart: string2().regex(WALL_CLOCK, "expected HH:MM").nullable(),
6942
6979
  windowEnd: string2().regex(WALL_CLOCK, "expected HH:MM").nullable(),
@@ -7079,6 +7116,119 @@ var counters = new Map;
7079
7116
  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
7117
  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
7118
 
7119
+ // ../shared/src/media.ts
7120
+ var MEDIA_ALLOWED_MIMES = [
7121
+ "image/jpeg",
7122
+ "image/png",
7123
+ "image/webp",
7124
+ "image/avif",
7125
+ "image/gif",
7126
+ "image/svg+xml",
7127
+ "image/x-icon",
7128
+ "application/pdf",
7129
+ "video/mp4",
7130
+ "font/woff2",
7131
+ "font/woff",
7132
+ "font/ttf",
7133
+ "font/otf"
7134
+ ];
7135
+ var MEDIA_SIZE_CAPS = {
7136
+ "image/jpeg": 10 * 1024 * 1024,
7137
+ "image/png": 10 * 1024 * 1024,
7138
+ "image/webp": 10 * 1024 * 1024,
7139
+ "image/avif": 10 * 1024 * 1024,
7140
+ "image/gif": 8 * 1024 * 1024,
7141
+ "image/svg+xml": 1 * 1024 * 1024,
7142
+ "image/x-icon": 1 * 1024 * 1024,
7143
+ "application/pdf": 20 * 1024 * 1024,
7144
+ "video/mp4": 50 * 1024 * 1024,
7145
+ "font/woff2": 5 * 1024 * 1024,
7146
+ "font/woff": 5 * 1024 * 1024,
7147
+ "font/ttf": 5 * 1024 * 1024,
7148
+ "font/otf": 5 * 1024 * 1024
7149
+ };
7150
+ var MEDIA_HARD_LIMIT_BYTES = 50 * 1024 * 1024;
7151
+ var MEDIA_URL_PREFIX = "/_caelo/media";
7152
+ var RASTER_IMAGE_MIMES = new Set([
7153
+ "image/jpeg",
7154
+ "image/png",
7155
+ "image/webp",
7156
+ "image/avif",
7157
+ "image/gif"
7158
+ ]);
7159
+ var mediaUrlPattern = new RegExp(`${MEDIA_URL_PREFIX}/([a-z0-9][a-z0-9-]{0,63})(?:/([a-z][a-z0-9-]{0,63}))?`, "g");
7160
+ var sha256Schema = string2().regex(/^[0-9a-f]{64}$/, "must be hex sha256");
7161
+ var mediaVisibilitySchema = _enum(["library", "reference"]);
7162
+ var mediaUploadInputSchema = object({
7163
+ sha256: sha256Schema,
7164
+ originalName: string2().min(1).max(512),
7165
+ name: string2().max(200).optional(),
7166
+ mime: _enum(MEDIA_ALLOWED_MIMES),
7167
+ sizeBytes: number2().int().positive(),
7168
+ width: number2().int().positive().nullable(),
7169
+ height: number2().int().positive().nullable(),
7170
+ alt: string2().max(2048).default(""),
7171
+ storageKey: string2().min(1),
7172
+ storageProvider: string2().min(1).max(64).default("local"),
7173
+ sourceKind: _enum(["upload", "ai_generated", "imported", "external"]).optional(),
7174
+ sourceDetail: string2().max(2048).optional(),
7175
+ license: string2().max(200).optional(),
7176
+ visibility: mediaVisibilitySchema.optional(),
7177
+ derivedFromId: string2().uuid().optional(),
7178
+ variants: array(object({
7179
+ variant: string2().min(1).max(64),
7180
+ format: string2().min(1).max(32),
7181
+ width: number2().int().positive().nullable(),
7182
+ height: number2().int().positive().nullable(),
7183
+ sizeBytes: number2().int().positive(),
7184
+ storageKey: string2().min(1)
7185
+ })).min(1)
7186
+ }).strict();
7187
+ var mediaListInputSchema = object({
7188
+ query: string2().max(256).optional(),
7189
+ mime: _enum(MEDIA_ALLOWED_MIMES).optional(),
7190
+ sort: _enum(["recent", "most_used"]).default("recent"),
7191
+ visibility: _enum(["library", "reference", "all"]).default("library"),
7192
+ limit: number2().int().positive().max(200).default(60),
7193
+ offset: number2().int().nonnegative().default(0)
7194
+ }).strict();
7195
+ var mediaUpdateAltInputSchema = object({
7196
+ assetId: string2().uuid(),
7197
+ alt: string2().max(2048)
7198
+ }).strict();
7199
+ var mediaSetSourceInputSchema = object({
7200
+ assetId: string2().uuid(),
7201
+ sourceKind: _enum(["upload", "ai_generated", "imported", "external"]).optional(),
7202
+ sourceDetail: string2().max(2048).optional(),
7203
+ license: string2().max(200).optional()
7204
+ }).strict();
7205
+ var mediaSetVisibilityInputSchema = object({
7206
+ assetId: string2().uuid(),
7207
+ visibility: mediaVisibilitySchema
7208
+ }).strict();
7209
+ var mediaDeleteInputSchema = object({
7210
+ assetId: string2().uuid(),
7211
+ force: boolean2().default(false)
7212
+ }).strict();
7213
+ var mediaRecordUsageInputSchema = object({
7214
+ deltas: record(string2().uuid(), number2().int())
7215
+ }).strict();
7216
+ var mediaSetCdnInputSchema = object({
7217
+ enabled: boolean2(),
7218
+ threshold: number2().int().min(1).max(1e4)
7219
+ }).strict();
7220
+
7221
+ // ../shared/src/link-refs.ts
7222
+ var UUID_SRC = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
7223
+ var QUERY_SRC = "[A-Za-z0-9_\\-.~%=&;+/:@!$()*]{1,512}";
7224
+ var ANCHOR_SRC = "[A-Za-z0-9_\\-.~%:]{1,256}";
7225
+ var VARIANT_SRC = "[a-z][a-z0-9-]{0,63}";
7226
+ var ID_END_SRC = "(?![A-Za-z0-9_/\\-])";
7227
+ var PAGE_BODY_SRC = `page/(${UUID_SRC})${ID_END_SRC}(?:\\?(${QUERY_SRC}))?(?:#(${ANCHOR_SRC}))?`;
7228
+ var MEDIA_BODY_SRC = `media/(${UUID_SRC})(?:/(${VARIANT_SRC}))?${ID_END_SRC}`;
7229
+ var PAGE_REF_EXACT = new RegExp(`^caelo:${PAGE_BODY_SRC}$`);
7230
+ var MEDIA_REF_EXACT = new RegExp(`^caelo:${MEDIA_BODY_SRC}$`);
7231
+
7082
7232
  // ../../node_modules/mustache/mustache.mjs
7083
7233
  /*!
7084
7234
  * mustache.js - Logic-less {{mustache}} templates with JavaScript
@@ -7551,6 +7701,21 @@ var THEME_ASSET_KEY_TO_SLOT = {
7551
7701
  };
7552
7702
  var THEME_ASSET_KEYS = Object.keys(THEME_ASSET_KEY_TO_SLOT);
7553
7703
 
7704
+ // ../shared/src/template-balance.ts
7705
+ var RAW_TEXT_ELEMENTS = new Set([
7706
+ "script",
7707
+ "style",
7708
+ "textarea",
7709
+ "title",
7710
+ "xmp",
7711
+ "iframe",
7712
+ "noembed",
7713
+ "noframes",
7714
+ "noscript"
7715
+ ]);
7716
+ var CODE_ELEMENTS = new Set(["script", "style"]);
7717
+ var FOREIGN_ROOTS = new Set(["svg", "math"]);
7718
+
7554
7719
  // ../shared/src/font-assets.ts
7555
7720
  var fontRef = object({ id: string2().uuid(), sha256: string2().regex(/^[a-f0-9]{64}$/) }).strict();
7556
7721
  var fontLicense = object({
@@ -7908,6 +8073,8 @@ var SYSTEM_FONT_FAMILIES = new Set([
7908
8073
  "lucida console",
7909
8074
  "lucida sans"
7910
8075
  ].map((f) => f.toLowerCase()));
8076
+ var UNICODE_RANGE_ITEM = "U\\+[0-9A-F?]{1,6}(?:-[0-9A-F]{1,6})?";
8077
+ var UNICODE_RANGE_RE = new RegExp(`^${UNICODE_RANGE_ITEM}(?:, *${UNICODE_RANGE_ITEM})*$`, "i");
7911
8078
  // ../shared/src/genesis.ts
7912
8079
  var designBriefSchema = object({
7913
8080
  audience: string2().min(1).max(500).optional(),
@@ -7994,107 +8161,6 @@ var GENERIC_FONT_KEYWORDS = new Set([
7994
8161
  ]);
7995
8162
  // ../shared/src/markup-structure.ts
7996
8163
  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
8164
  // ../shared/src/page-log.ts
8099
8165
  var pageLogEntryKinds = [
8100
8166
  "edited",
@@ -18018,6 +18084,9 @@ class DatabaseAdapter {
18018
18084
  return this.#publicRaw;
18019
18085
  }
18020
18086
  async provisionPluginPublicSchema(opts) {
18087
+ if (!/^[0-9a-f-]{36}$/i.test(opts.pluginId)) {
18088
+ throw new Error(`provisionPluginPublicSchema: pluginId "${opts.pluginId}" is not a UUID`);
18089
+ }
18021
18090
  if (!this.#skipVerify)
18022
18091
  await this.verifyRoles();
18023
18092
  await this.#public.transaction(async (tx) => {
@@ -18027,12 +18096,15 @@ class DatabaseAdapter {
18027
18096
  });
18028
18097
  }
18029
18098
  async provisionPluginAdminSchema(opts) {
18099
+ if (!/^[0-9a-f-]{36}$/i.test(opts.pluginId)) {
18100
+ throw new Error(`provisionPluginAdminSchema: pluginId "${opts.pluginId}" is not a UUID`);
18101
+ }
18030
18102
  const admin = this.#adminDb("provisionPluginAdminSchema");
18031
18103
  if (!this.#skipVerify)
18032
18104
  await this.verifyRoles();
18033
18105
  await admin.transaction(async (tx) => {
18034
18106
  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)`));
18107
+ await tx.execute(sql`SELECT set_config('caelo.plugin_id', ${opts.pluginId}, true)`);
18036
18108
  await tx.execute(sql.raw(opts.sql));
18037
18109
  });
18038
18110
  }
@@ -18067,7 +18139,18 @@ class DatabaseAdapter {
18067
18139
  }
18068
18140
  }
18069
18141
  // ../query-api/src/audit.ts
18070
- var SENSITIVE_KEYS = new Set(["password", "token", "csrfToken", "passwordHash"]);
18142
+ var SENSITIVE_KEYS = new Set([
18143
+ "password",
18144
+ "newPassword",
18145
+ "currentPassword",
18146
+ "token",
18147
+ "csrfToken",
18148
+ "passwordHash",
18149
+ "secret",
18150
+ "apiKey",
18151
+ "clientSecret"
18152
+ ]);
18153
+ var SENSITIVE_KEY_RE = /pass(word|wd|phrase)?|secret|token|api[-_]?key|credential|private[-_]?key/i;
18071
18154
  function redact2(value) {
18072
18155
  if (value === null || value === undefined)
18073
18156
  return value;
@@ -18076,7 +18159,9 @@ function redact2(value) {
18076
18159
  if (typeof value === "object") {
18077
18160
  const out = {};
18078
18161
  for (const [k, v] of Object.entries(value)) {
18079
- out[k] = SENSITIVE_KEYS.has(k) ? "<redacted>" : redact2(v);
18162
+ if (k === "__proto__" || k === "constructor" || k === "prototype")
18163
+ continue;
18164
+ out[k] = SENSITIVE_KEYS.has(k) || SENSITIVE_KEY_RE.test(k) ? "<redacted>" : redact2(v);
18080
18165
  }
18081
18166
  return out;
18082
18167
  }
@@ -18212,11 +18297,12 @@ class OperationRegistry {
18212
18297
  }
18213
18298
  // ../platform-updater/src/ops.ts
18214
18299
  var policySchema = object({
18215
- mode: _enum(["off", "notify", "auto"]),
18300
+ mode: _enum(UPDATE_POLICY_MODES),
18216
18301
  autoSecurity: boolean2(),
18217
18302
  autoPatch: boolean2(),
18218
18303
  autoMinor: boolean2(),
18219
- channel: _enum(["stable", "rc", "beta", "alpha"]),
18304
+ autoConverge: boolean2(),
18305
+ channel: _enum(UPDATE_POLICY_CHANNELS),
18220
18306
  windowStart: string2().nullable(),
18221
18307
  windowEnd: string2().nullable(),
18222
18308
  windowTimezone: string2(),
@@ -18285,7 +18371,7 @@ var jobClaimOp = defineOperation({
18285
18371
  if (!row)
18286
18372
  return ok({ recovered: stale.map((s) => s.id), claimed: null });
18287
18373
  const policies = await tx.execute(sql`
18288
- SELECT mode, auto_security, auto_patch, auto_minor, channel,
18374
+ SELECT mode, auto_security, auto_patch, auto_minor, auto_converge, channel,
18289
18375
  to_char(window_start, 'HH24:MI') AS window_start,
18290
18376
  to_char(window_end, 'HH24:MI') AS window_end,
18291
18377
  window_timezone, soak_hours, security_soak_hours, paused, paused_reason,
@@ -18308,6 +18394,7 @@ var jobClaimOp = defineOperation({
18308
18394
  autoSecurity: p.auto_security,
18309
18395
  autoPatch: p.auto_patch,
18310
18396
  autoMinor: p.auto_minor,
18397
+ autoConverge: p.auto_converge,
18311
18398
  channel: p.channel,
18312
18399
  windowStart: p.window_start,
18313
18400
  windowEnd: p.window_end,
@@ -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"}