@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.
- package/dist/agent-db.js +272 -128
- package/dist/audit-job-setup.d.ts +69 -0
- package/dist/audit-job-setup.d.ts.map +1 -0
- package/dist/audit-job-setup.js +317 -0
- package/dist/audit-job-setup.js.map +1 -0
- package/dist/caddy.d.ts +9 -0
- package/dist/caddy.d.ts.map +1 -1
- package/dist/caddy.js +38 -0
- package/dist/caddy.js.map +1 -1
- package/dist/cli-routing.js +1 -1
- package/dist/cli-routing.js.map +1 -1
- package/dist/cli.js +36 -9
- package/dist/cli.js.map +1 -1
- package/dist/compose.js +5 -0
- package/dist/compose.js.map +1 -1
- package/dist/converge-checkpoint.d.ts +66 -0
- package/dist/converge-checkpoint.d.ts.map +1 -0
- package/dist/converge-checkpoint.js +61 -0
- package/dist/converge-checkpoint.js.map +1 -0
- package/dist/converge-job-gcp.d.ts +46 -0
- package/dist/converge-job-gcp.d.ts.map +1 -0
- package/dist/converge-job-gcp.js +368 -0
- package/dist/converge-job-gcp.js.map +1 -0
- package/dist/converge-job-setup.d.ts +62 -0
- package/dist/converge-job-setup.d.ts.map +1 -0
- package/dist/converge-job-setup.js +228 -0
- package/dist/converge-job-setup.js.map +1 -0
- package/dist/converge-job.d.ts +141 -0
- package/dist/converge-job.d.ts.map +1 -0
- package/dist/converge-job.js +325 -0
- package/dist/converge-job.js.map +1 -0
- package/dist/gcp-names.d.ts +25 -1
- package/dist/gcp-names.d.ts.map +1 -1
- package/dist/gcp-names.js +36 -0
- package/dist/gcp-names.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/infra-contract.d.ts +1 -1
- package/dist/infra-contract.d.ts.map +1 -1
- package/dist/infra-contract.js +28 -1
- package/dist/infra-contract.js.map +1 -1
- package/dist/install-job.d.ts +11 -3
- package/dist/install-job.d.ts.map +1 -1
- package/dist/install-job.js +22 -12
- package/dist/install-job.js.map +1 -1
- package/dist/lifecycle.d.ts +13 -1
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +115 -58
- package/dist/lifecycle.js.map +1 -1
- package/dist/operator-access.d.ts.map +1 -1
- package/dist/operator-access.js +13 -3
- package/dist/operator-access.js.map +1 -1
- package/dist/private-file.d.ts +26 -0
- package/dist/private-file.d.ts.map +1 -0
- package/dist/private-file.js +49 -0
- package/dist/private-file.js.map +1 -0
- package/dist/release-contract.d.ts +3 -2
- package/dist/release-contract.d.ts.map +1 -1
- package/dist/release-contract.js +8 -2
- package/dist/release-contract.js.map +1 -1
- package/dist/release-manifest.d.ts +2 -0
- package/dist/release-manifest.d.ts.map +1 -1
- package/dist/release-manifest.js.map +1 -1
- package/dist/remote-mcp-edge.d.ts +114 -0
- package/dist/remote-mcp-edge.d.ts.map +1 -0
- package/dist/remote-mcp-edge.js +116 -0
- package/dist/remote-mcp-edge.js.map +1 -0
- package/dist/remote-mcp.d.ts +117 -0
- package/dist/remote-mcp.d.ts.map +1 -0
- package/dist/remote-mcp.js +379 -0
- package/dist/remote-mcp.js.map +1 -0
- package/dist/runtime-secrets.d.ts +12 -0
- package/dist/runtime-secrets.d.ts.map +1 -1
- package/dist/runtime-secrets.js +32 -4
- package/dist/runtime-secrets.js.map +1 -1
- package/dist/seal-key-rotation.d.ts +38 -0
- package/dist/seal-key-rotation.d.ts.map +1 -0
- package/dist/seal-key-rotation.js +206 -0
- package/dist/seal-key-rotation.js.map +1 -0
- package/dist/stack-contract.d.ts +175 -3
- package/dist/stack-contract.d.ts.map +1 -1
- package/dist/stack-contract.js +183 -3
- package/dist/stack-contract.js.map +1 -1
- package/dist/stack-converge.d.ts +38 -1
- package/dist/stack-converge.d.ts.map +1 -1
- package/dist/stack-converge.js +74 -4
- package/dist/stack-converge.js.map +1 -1
- package/dist/state-lock-lease.d.ts +142 -0
- package/dist/state-lock-lease.d.ts.map +1 -0
- package/dist/state-lock-lease.js +347 -0
- package/dist/state-lock-lease.js.map +1 -0
- package/dist/state-store.d.ts +66 -9
- package/dist/state-store.d.ts.map +1 -1
- package/dist/state-store.js +249 -30
- package/dist/state-store.js.map +1 -1
- package/dist/tar-entries.d.ts.map +1 -1
- package/dist/tar-entries.js +84 -9
- package/dist/tar-entries.js.map +1 -1
- package/dist/upgrade/app-roll.d.ts +36 -7
- package/dist/upgrade/app-roll.d.ts.map +1 -1
- package/dist/upgrade/app-roll.js +88 -19
- package/dist/upgrade/app-roll.js.map +1 -1
- package/dist/upgrade/audit-job-roll.d.ts +38 -0
- package/dist/upgrade/audit-job-roll.d.ts.map +1 -0
- package/dist/upgrade/audit-job-roll.js +43 -0
- package/dist/upgrade/audit-job-roll.js.map +1 -0
- package/dist/upgrade/converge.d.ts.map +1 -1
- package/dist/upgrade/converge.js +141 -8
- package/dist/upgrade/converge.js.map +1 -1
- package/dist/upgrade/gcp-lookup.d.ts +27 -10
- package/dist/upgrade/gcp-lookup.d.ts.map +1 -1
- package/dist/upgrade/gcp-lookup.js +46 -7
- package/dist/upgrade/gcp-lookup.js.map +1 -1
- package/dist/upgrade/record-rolled.d.ts +40 -0
- package/dist/upgrade/record-rolled.d.ts.map +1 -0
- package/dist/upgrade/record-rolled.js +46 -0
- package/dist/upgrade/record-rolled.js.map +1 -0
- package/dist/upgrade/upgrade.d.ts +45 -1
- package/dist/upgrade/upgrade.d.ts.map +1 -1
- package/dist/upgrade/upgrade.js +60 -17
- package/dist/upgrade/upgrade.js.map +1 -1
- package/dist/upgrader-assess.d.ts +15 -1
- package/dist/upgrader-assess.d.ts.map +1 -1
- package/dist/upgrader-assess.js +36 -6
- package/dist/upgrader-assess.js.map +1 -1
- package/dist/upgrader-gcp.d.ts +15 -0
- package/dist/upgrader-gcp.d.ts.map +1 -1
- package/dist/upgrader-gcp.js +42 -7
- package/dist/upgrader-gcp.js.map +1 -1
- package/dist/upgrader-iam-preflight.d.ts +123 -0
- package/dist/upgrader-iam-preflight.d.ts.map +1 -0
- package/dist/upgrader-iam-preflight.js +414 -0
- package/dist/upgrader-iam-preflight.js.map +1 -0
- package/dist/upgrader-job.d.ts +33 -9
- package/dist/upgrader-job.d.ts.map +1 -1
- package/dist/upgrader-job.js +169 -27
- package/dist/upgrader-job.js.map +1 -1
- package/dist/upgrader-records.d.ts +58 -0
- package/dist/upgrader-records.d.ts.map +1 -0
- package/dist/upgrader-records.js +87 -0
- package/dist/upgrader-records.js.map +1 -0
- package/dist/upgrader-reporter.d.ts +3 -2
- package/dist/upgrader-reporter.d.ts.map +1 -1
- package/dist/upgrader-reporter.js +10 -2
- package/dist/upgrader-reporter.js.map +1 -1
- package/dist/upgrader-setup.d.ts +25 -3
- package/dist/upgrader-setup.d.ts.map +1 -1
- package/dist/upgrader-setup.js +132 -14
- package/dist/upgrader-setup.js.map +1 -1
- package/dist/wizards/gcp-cost.d.ts.map +1 -1
- package/dist/wizards/gcp-cost.js +14 -6
- package/dist/wizards/gcp-cost.js.map +1 -1
- package/dist/wizards/gcp-pulumi.d.ts +6 -0
- package/dist/wizards/gcp-pulumi.d.ts.map +1 -1
- package/dist/wizards/gcp-pulumi.js +7 -0
- package/dist/wizards/gcp-pulumi.js.map +1 -1
- package/dist/wizards/gcp.d.ts.map +1 -1
- package/dist/wizards/gcp.js +130 -4
- package/dist/wizards/gcp.js.map +1 -1
- package/package.json +4 -4
- package/src/agent/run.test.ts +15 -1
- package/src/audit-job-setup.test.ts +234 -0
- package/src/audit-job-setup.ts +360 -0
- package/src/caddy-redirects.docker.test.ts +19 -6
- package/src/caddy.test.ts +30 -0
- package/src/caddy.ts +43 -0
- package/src/cli-init-validation.test.ts +44 -0
- package/src/cli-routing.ts +1 -1
- package/src/cli.ts +40 -8
- package/src/compose.ts +5 -0
- package/src/converge-checkpoint.ts +75 -0
- package/src/converge-entrypoint.test.ts +213 -0
- package/src/converge-job-gcp.test.ts +222 -0
- package/src/converge-job-gcp.ts +443 -0
- package/src/converge-job-setup.test.ts +152 -0
- package/src/converge-job-setup.ts +268 -0
- package/src/converge-job.test.ts +486 -0
- package/src/converge-job.ts +542 -0
- package/src/gateway-env-isolation.test.ts +8 -1
- package/src/gcp-names.ts +43 -1
- package/src/gcp-url-map.test.ts +9 -1
- package/src/index.ts +8 -0
- package/src/infra-contract.test.ts +7 -4
- package/src/infra-contract.ts +28 -1
- package/src/install-job.test.ts +3 -1
- package/src/install-job.ts +31 -14
- package/src/lifecycle.ts +137 -71
- package/src/operator-access.test.ts +14 -0
- package/src/operator-access.ts +13 -3
- package/src/private-file.test.ts +80 -0
- package/src/private-file.ts +50 -0
- package/src/release-contract.ts +8 -2
- package/src/release-manifest.test.ts +42 -0
- package/src/release-manifest.ts +2 -0
- package/src/remote-mcp-edge.ts +137 -0
- package/src/remote-mcp.test.ts +517 -0
- package/src/remote-mcp.ts +460 -0
- package/src/runtime-secrets.test.ts +31 -6
- package/src/runtime-secrets.ts +41 -3
- package/src/seal-key-rotation.test.ts +131 -0
- package/src/seal-key-rotation.ts +258 -0
- package/src/stack-contract-parity.test.ts +20 -3
- package/src/stack-contract.test.ts +34 -2
- package/src/stack-contract.ts +305 -3
- package/src/stack-converge-secrets.test.ts +3 -0
- package/src/stack-converge.test.ts +21 -5
- package/src/stack-converge.ts +101 -7
- package/src/state-attach.test.ts +7 -1
- package/src/state-lock-lease.test.ts +302 -0
- package/src/state-lock-lease.ts +423 -0
- package/src/state-lock.test.ts +568 -0
- package/src/state-store.ts +347 -27
- package/src/tar-entries.test.ts +149 -7
- package/src/tar-entries.ts +90 -9
- package/src/upgrade/app-roll.ts +135 -21
- package/src/upgrade/audit-job-roll.ts +68 -0
- package/src/upgrade/converge.ts +170 -7
- package/src/upgrade/gcp-lookup.test.ts +80 -0
- package/src/upgrade/gcp-lookup.ts +65 -8
- package/src/upgrade/record-rolled.test.ts +105 -0
- package/src/upgrade/record-rolled.ts +91 -0
- package/src/upgrade/upgrade.test.ts +279 -5
- package/src/upgrade/upgrade.ts +120 -24
- package/src/upgrader-assess.test.ts +93 -3
- package/src/upgrader-assess.ts +58 -9
- package/src/upgrader-gcp.ts +47 -8
- package/src/upgrader-iam-preflight.test.ts +393 -0
- package/src/upgrader-iam-preflight.ts +510 -0
- package/src/upgrader-job.test.ts +587 -15
- package/src/upgrader-job.ts +237 -53
- package/src/upgrader-records.ts +151 -0
- package/src/upgrader-reporter.test.ts +6 -0
- package/src/upgrader-reporter.ts +7 -2
- package/src/upgrader-setup.test.ts +4 -3
- package/src/upgrader-setup.ts +137 -13
- package/src/wizards/gcp-cost.ts +15 -6
- package/src/wizards/gcp-pulumi.ts +7 -0
- package/src/wizards/gcp.ts +162 -4
- package/stacks/aws/index.ts +18 -0
- package/stacks/azure/index.ts +18 -0
- package/stacks/gcp/index.ts +59 -7
- 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:
|
|
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 = ["
|
|
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
|
|
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([
|
|
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
|
-
|
|
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(
|
|
18302
|
+
mode: _enum(UPDATE_POLICY_MODES),
|
|
18216
18303
|
autoSecurity: boolean2(),
|
|
18217
18304
|
autoPatch: boolean2(),
|
|
18218
18305
|
autoMinor: boolean2(),
|
|
18219
|
-
|
|
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({
|
|
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
|
|
18273
|
-
|
|
18274
|
-
|
|
18275
|
-
|
|
18276
|
-
|
|
18277
|
-
|
|
18278
|
-
|
|
18279
|
-
|
|
18280
|
-
|
|
18281
|
-
|
|
18282
|
-
|
|
18283
|
-
|
|
18284
|
-
|
|
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
|
|
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
|
-
|
|
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", {
|
|
18472
|
-
|
|
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"}
|