@caelo-cms/provisioning 0.10.61 → 0.10.64
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/caddy/Caddyfile.production +7 -0
- package/caddy/Caddyfile.staging +7 -0
- package/dist/admin-internal-answer.d.ts +12 -0
- package/dist/admin-internal-answer.d.ts.map +1 -0
- package/dist/admin-internal-answer.js +32 -0
- package/dist/admin-internal-answer.js.map +1 -0
- package/dist/admin-internal-google.d.ts +4 -0
- package/dist/admin-internal-google.d.ts.map +1 -0
- package/dist/admin-internal-google.js +161 -0
- package/dist/admin-internal-google.js.map +1 -0
- package/dist/admin-internal-self-hosted.d.ts +30 -0
- package/dist/admin-internal-self-hosted.d.ts.map +1 -0
- package/dist/admin-internal-self-hosted.js +92 -0
- package/dist/admin-internal-self-hosted.js.map +1 -0
- package/dist/admin-internal.d.ts +33 -12
- package/dist/admin-internal.d.ts.map +1 -1
- package/dist/admin-internal.js +27 -159
- package/dist/admin-internal.js.map +1 -1
- package/dist/agent/command.d.ts +7 -0
- package/dist/agent/command.d.ts.map +1 -1
- package/dist/agent/command.js +1 -0
- package/dist/agent/command.js.map +1 -1
- package/dist/agent/lock.d.ts +13 -1
- package/dist/agent/lock.d.ts.map +1 -1
- package/dist/agent/lock.js +62 -5
- package/dist/agent/lock.js.map +1 -1
- package/dist/agent/run.d.ts +5 -1
- package/dist/agent/run.d.ts.map +1 -1
- package/dist/agent/run.js +8 -1
- package/dist/agent/run.js.map +1 -1
- package/dist/agent-db.js +192 -90
- package/dist/caddy.d.ts.map +1 -1
- package/dist/caddy.js +11 -1
- 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 +95 -38
- package/dist/cli.js.map +1 -1
- package/dist/compose.d.ts +7 -0
- package/dist/compose.d.ts.map +1 -1
- package/dist/compose.js +5 -0
- package/dist/compose.js.map +1 -1
- package/dist/converge-job-gcp.d.ts.map +1 -1
- package/dist/converge-job-gcp.js +10 -7
- package/dist/converge-job-gcp.js.map +1 -1
- package/dist/converge-job-preflight.d.ts +21 -0
- package/dist/converge-job-preflight.d.ts.map +1 -0
- package/dist/converge-job-preflight.js +111 -0
- package/dist/converge-job-preflight.js.map +1 -0
- package/dist/converge-job.d.ts +8 -2
- package/dist/converge-job.d.ts.map +1 -1
- package/dist/converge-job.js +14 -0
- package/dist/converge-job.js.map +1 -1
- package/dist/gateway-credentials.d.ts +5 -3
- package/dist/gateway-credentials.d.ts.map +1 -1
- package/dist/gateway-credentials.js +5 -8
- package/dist/gateway-credentials.js.map +1 -1
- package/dist/gcloud.d.ts +29 -0
- package/dist/gcloud.d.ts.map +1 -1
- package/dist/gcloud.js +66 -0
- package/dist/gcloud.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 +10 -1
- package/dist/infra-contract.js.map +1 -1
- package/dist/install-job.d.ts +3 -1
- package/dist/install-job.d.ts.map +1 -1
- package/dist/install-job.js.map +1 -1
- package/dist/install-state.d.ts +10 -0
- package/dist/install-state.d.ts.map +1 -1
- package/dist/install-state.js +12 -0
- package/dist/install-state.js.map +1 -1
- package/dist/lifecycle.d.ts +12 -0
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +113 -28
- package/dist/lifecycle.js.map +1 -1
- package/dist/mcp-iap.d.ts +2 -0
- package/dist/mcp-iap.d.ts.map +1 -1
- package/dist/mcp-iap.js +50 -17
- package/dist/mcp-iap.js.map +1 -1
- package/dist/owner-reset.d.ts +16 -19
- package/dist/owner-reset.d.ts.map +1 -1
- package/dist/owner-reset.js +92 -19
- package/dist/owner-reset.js.map +1 -1
- package/dist/preview-plan.d.ts +71 -0
- package/dist/preview-plan.d.ts.map +1 -0
- package/dist/preview-plan.js +168 -0
- package/dist/preview-plan.js.map +1 -0
- package/dist/public-role-isolation.d.ts +2 -0
- package/dist/public-role-isolation.d.ts.map +1 -1
- package/dist/public-role-isolation.js +9 -3
- package/dist/public-role-isolation.js.map +1 -1
- package/dist/release-contract.d.ts.map +1 -1
- package/dist/release-contract.js +4 -0
- package/dist/release-contract.js.map +1 -1
- package/dist/self-hosted-internal-secret.d.ts +27 -0
- package/dist/self-hosted-internal-secret.d.ts.map +1 -0
- package/dist/self-hosted-internal-secret.js +69 -0
- package/dist/self-hosted-internal-secret.js.map +1 -0
- package/dist/self-hosted-release.d.ts +3 -1
- package/dist/self-hosted-release.d.ts.map +1 -1
- package/dist/self-hosted-release.js +6 -2
- package/dist/self-hosted-release.js.map +1 -1
- package/dist/self-hosted-upgrade.d.ts +13 -1
- package/dist/self-hosted-upgrade.d.ts.map +1 -1
- package/dist/self-hosted-upgrade.js +26 -2
- package/dist/self-hosted-upgrade.js.map +1 -1
- package/dist/stack-converge.d.ts +5 -2
- package/dist/stack-converge.d.ts.map +1 -1
- package/dist/stack-converge.js +73 -8
- package/dist/stack-converge.js.map +1 -1
- package/dist/staging-admin.d.ts +4 -1
- package/dist/staging-admin.d.ts.map +1 -1
- package/dist/staging-admin.js.map +1 -1
- package/dist/state-backend.d.ts +3 -2
- package/dist/state-backend.d.ts.map +1 -1
- package/dist/state-backend.js +3 -2
- package/dist/state-backend.js.map +1 -1
- package/dist/state-command.d.ts +17 -0
- package/dist/state-command.d.ts.map +1 -1
- package/dist/state-command.js +34 -5
- package/dist/state-command.js.map +1 -1
- package/dist/state-migrate.d.ts +14 -3
- package/dist/state-migrate.d.ts.map +1 -1
- package/dist/state-migrate.js +31 -7
- package/dist/state-migrate.js.map +1 -1
- package/dist/state-pulumi.d.ts +0 -2
- package/dist/state-pulumi.d.ts.map +1 -1
- package/dist/state-pulumi.js +19 -20
- package/dist/state-pulumi.js.map +1 -1
- package/dist/static-security-headers.d.ts +86 -0
- package/dist/static-security-headers.d.ts.map +1 -0
- package/dist/static-security-headers.js +126 -0
- package/dist/static-security-headers.js.map +1 -0
- package/dist/static-svg-gcp.d.ts +28 -0
- package/dist/static-svg-gcp.d.ts.map +1 -0
- package/dist/static-svg-gcp.js +106 -0
- package/dist/static-svg-gcp.js.map +1 -0
- package/dist/upgrade/app-roll.d.ts +3 -0
- package/dist/upgrade/app-roll.d.ts.map +1 -1
- package/dist/upgrade/app-roll.js +12 -5
- package/dist/upgrade/app-roll.js.map +1 -1
- package/dist/upgrade/backup.d.ts +2 -0
- package/dist/upgrade/backup.d.ts.map +1 -1
- package/dist/upgrade/backup.js +5 -4
- package/dist/upgrade/backup.js.map +1 -1
- package/dist/upgrade/converge.d.ts +7 -0
- package/dist/upgrade/converge.d.ts.map +1 -1
- package/dist/upgrade/converge.js +19 -7
- package/dist/upgrade/converge.js.map +1 -1
- package/dist/upgrade/gcp-lookup.d.ts +38 -3
- package/dist/upgrade/gcp-lookup.d.ts.map +1 -1
- package/dist/upgrade/gcp-lookup.js +31 -9
- package/dist/upgrade/gcp-lookup.js.map +1 -1
- package/dist/upgrade/health.d.ts +31 -5
- package/dist/upgrade/health.d.ts.map +1 -1
- package/dist/upgrade/health.js +114 -25
- package/dist/upgrade/health.js.map +1 -1
- package/dist/upgrade/release-images.d.ts +17 -0
- package/dist/upgrade/release-images.d.ts.map +1 -1
- package/dist/upgrade/release-images.js +23 -12
- package/dist/upgrade/release-images.js.map +1 -1
- package/dist/upgrade/reporter.d.ts +2 -0
- package/dist/upgrade/reporter.d.ts.map +1 -1
- package/dist/upgrade/reporter.js +1 -0
- package/dist/upgrade/reporter.js.map +1 -1
- package/dist/upgrade/upgrade.d.ts +11 -1
- package/dist/upgrade/upgrade.d.ts.map +1 -1
- package/dist/upgrade/upgrade.js +5 -2
- package/dist/upgrade/upgrade.js.map +1 -1
- package/dist/upgrader-gcp.d.ts +12 -2
- package/dist/upgrader-gcp.d.ts.map +1 -1
- package/dist/upgrader-gcp.js +22 -13
- package/dist/upgrader-gcp.js.map +1 -1
- package/dist/upgrader-iam-preflight.d.ts +16 -3
- package/dist/upgrader-iam-preflight.d.ts.map +1 -1
- package/dist/upgrader-iam-preflight.js +9 -4
- package/dist/upgrader-iam-preflight.js.map +1 -1
- package/dist/upgrader-job.d.ts.map +1 -1
- package/dist/upgrader-job.js +10 -8
- package/dist/upgrader-job.js.map +1 -1
- package/dist/upgrader-reporter.d.ts.map +1 -1
- package/dist/upgrader-reporter.js +1 -0
- package/dist/upgrader-reporter.js.map +1 -1
- package/dist/wizards/gcp-pulumi.d.ts +70 -23
- package/dist/wizards/gcp-pulumi.d.ts.map +1 -1
- package/dist/wizards/gcp-pulumi.js +118 -39
- package/dist/wizards/gcp-pulumi.js.map +1 -1
- package/dist/wizards/gcp.d.ts.map +1 -1
- package/dist/wizards/gcp.js +67 -11
- package/dist/wizards/gcp.js.map +1 -1
- package/package.json +2 -2
- package/src/admin-internal-answer.ts +43 -0
- package/src/admin-internal-google.ts +187 -0
- package/src/admin-internal-self-hosted.test.ts +70 -0
- package/src/admin-internal-self-hosted.ts +128 -0
- package/src/admin-internal.ts +59 -174
- package/src/admin-memory.test.ts +1 -0
- package/src/agent/command.ts +3 -0
- package/src/agent/lock-config.test.ts +57 -2
- package/src/agent/lock.ts +68 -5
- package/src/agent/run.test.ts +18 -1
- package/src/agent/run.ts +17 -6
- package/src/caddy-redirects.test.ts +1 -0
- package/src/caddy.ts +12 -0
- package/src/cli-routing.ts +1 -1
- package/src/cli.ts +102 -44
- package/src/compose.ts +12 -0
- package/src/converge-job-gcp.ts +16 -11
- package/src/converge-job-preflight.test.ts +108 -0
- package/src/converge-job-preflight.ts +124 -0
- package/src/converge-job.test.ts +50 -0
- package/src/converge-job.ts +38 -2
- package/src/gateway-credentials.test.ts +4 -3
- package/src/gateway-credentials.ts +6 -10
- package/src/gateway-env-isolation.test.ts +1 -0
- package/src/gcloud.test.ts +93 -1
- package/src/gcloud.ts +82 -0
- package/src/index.test.ts +38 -1
- package/src/infra-contract.test.ts +4 -3
- package/src/infra-contract.ts +10 -1
- package/src/install-job.ts +5 -2
- package/src/install-state.ts +13 -0
- package/src/lifecycle.ts +134 -28
- package/src/mcp-iap.test.ts +66 -5
- package/src/mcp-iap.ts +55 -17
- package/src/owner-reset-providers.test.ts +370 -0
- package/src/owner-reset.test.ts +2 -2
- package/src/owner-reset.ts +108 -19
- package/src/preview-plan.test.ts +233 -0
- package/src/preview-plan.ts +226 -0
- package/src/public-role-isolation.test.ts +13 -2
- package/src/public-role-isolation.ts +14 -4
- package/src/release-contract.ts +4 -0
- package/src/self-hosted-compose.test.ts +25 -0
- package/src/self-hosted-internal-secret.test.ts +61 -0
- package/src/self-hosted-internal-secret.ts +80 -0
- package/src/self-hosted-release.ts +10 -3
- package/src/self-hosted-upgrade.test.ts +35 -1
- package/src/self-hosted-upgrade.ts +40 -3
- package/src/stack-contract.test.ts +1 -0
- package/src/stack-converge.test.ts +89 -5
- package/src/stack-converge.ts +81 -8
- package/src/staging-admin.test.ts +1 -1
- package/src/staging-admin.ts +2 -1
- package/src/state-backend.ts +3 -2
- package/src/state-command.test.ts +31 -0
- package/src/state-command.ts +35 -8
- package/src/state-migrate.test.ts +58 -7
- package/src/state-migrate.ts +48 -10
- package/src/state-pulumi.ts +20 -21
- package/src/static-security-headers.test.ts +124 -0
- package/src/static-security-headers.ts +154 -0
- package/src/static-svg-gcp.test.ts +133 -0
- package/src/static-svg-gcp.ts +140 -0
- package/src/upgrade/app-roll.ts +18 -7
- package/src/upgrade/backup.ts +14 -5
- package/src/upgrade/converge.ts +25 -7
- package/src/upgrade/gcp-lookup.test.ts +80 -1
- package/src/upgrade/gcp-lookup.ts +61 -11
- package/src/upgrade/health.test.ts +132 -8
- package/src/upgrade/health.ts +169 -31
- package/src/upgrade/release-images.test.ts +17 -0
- package/src/upgrade/release-images.ts +26 -14
- package/src/upgrade/reporter.ts +3 -0
- package/src/upgrade/upgrade.test.ts +137 -8
- package/src/upgrade/upgrade.ts +14 -2
- package/src/upgrader-gcp.ts +28 -13
- package/src/upgrader-iam-preflight.test.ts +6 -3
- package/src/upgrader-iam-preflight.ts +26 -5
- package/src/upgrader-job.ts +14 -6
- package/src/upgrader-reporter.ts +1 -0
- package/src/wizards/gcp-pulumi.test.ts +1 -1
- package/src/wizards/gcp-pulumi.ts +147 -38
- package/src/wizards/gcp.ts +89 -9
- package/src/wizards/stack-work-dir.test.ts +175 -0
- package/stacks/aws/index.ts +40 -0
- package/stacks/azure/index.ts +22 -1
- package/stacks/gcp/README.md +4 -0
- package/stacks/gcp/index.ts +6 -2
- package/stacks/gcp/Pulumi.production.yaml +0 -16
package/dist/agent-db.js
CHANGED
|
@@ -7169,9 +7169,25 @@ var pageModuleContentSetManySchema = object({
|
|
|
7169
7169
|
}).strict();
|
|
7170
7170
|
// ../shared/src/cap-failures.ts
|
|
7171
7171
|
var counters = new Map;
|
|
7172
|
+
// ../shared/src/css-scope-scan.ts
|
|
7173
|
+
var GROUPING_AT_RULES = new Set(["media", "supports", "layer", "container", "document"]);
|
|
7172
7174
|
// ../shared/src/interactions.ts
|
|
7173
|
-
var
|
|
7174
|
-
var
|
|
7175
|
+
var MOBILE_NAV_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}' + "}";
|
|
7176
|
+
var MOBILE_NAV_JS = "(function(){" + `var S='[data-caelo-ui="mobile-nav"]';` + "function set(nav,open){nav.setAttribute('data-nav-open',String(open));" + "var b=nav.querySelector('.caelo-nav-toggle');if(b)b.setAttribute('aria-expanded',String(open));return b;}" + "document.addEventListener('click',function(e){" + "var t=e.target;if(!(t instanceof Element))return;" + "var b=t.closest('.caelo-nav-toggle');if(!b)return;var nav=b.closest(S);if(!nav)return;" + "set(nav,nav.getAttribute('data-nav-open')!=='true');});" + "document.addEventListener('keydown',function(e){" + "if(e.key!=='Escape')return;var t=e.target;if(!(t instanceof Element))return;" + `var nav=t.closest(S+'[data-nav-open="true"]');if(!nav)return;` + "var b=set(nav,false);if(b)b.focus();});" + "})();";
|
|
7177
|
+
var ACCORDION_CSS = ':where([data-caelo-ui="accordion"] summary){cursor:pointer}';
|
|
7178
|
+
var ACCORDION_JS = "(function(){" + `var S='[data-caelo-ui="accordion"]';` + "document.addEventListener('toggle',function(e){" + "var d=e.target;if(!(d instanceof HTMLDetailsElement)||!d.open)return;" + "var acc=d.closest(S);if(!acc||!acc.hasAttribute('data-single'))return;" + "acc.querySelectorAll('details[open]').forEach(function(o){if(o!==d&&o.closest(S)===acc)o.open=false;});" + "},true);" + "function openHash(){var id;try{id=decodeURIComponent(location.hash.slice(1));}catch(_){return;}if(!id)return;" + "var el=document.getElementById(id);if(!el)return;var d=el.closest(S+' details');" + "if(d&&!d.open){d.open=true;el.scrollIntoView();}}" + "window.addEventListener('hashchange',openHash);" + "if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',openHash);else openHash();" + "})();";
|
|
7179
|
+
var TABS_CSS = '[data-caelo-ui="tabs"] [role="tabpanel"][hidden]{display:none}';
|
|
7180
|
+
var TABS_JS = "(function(){" + `function tabsOf(list){return Array.prototype.filter.call(list.querySelectorAll('[role="tab"]'),function(t){return t.closest('[role="tablist"]')===list;});}` + `function select(tab,focus){var list=tab.closest('[role="tablist"]');if(!list)return;` + "tabsOf(list).forEach(function(t){var on=t===tab;" + "t.setAttribute('aria-selected',String(on));t.setAttribute('tabindex',on?'0':'-1');" + "var p=document.getElementById(t.getAttribute('aria-controls')||'');if(p){if(on)p.removeAttribute('hidden');else p.setAttribute('hidden','');}});" + "if(focus)tab.focus();}" + "function tabAt(e){var t=e.target;if(!(t instanceof Element))return null;" + `var tab=t.closest('[role="tab"]');return tab&&tab.closest('[data-caelo-ui="tabs"]')?tab:null;}` + "document.addEventListener('click',function(e){var tab=tabAt(e);if(tab)select(tab,false);});" + "document.addEventListener('keydown',function(e){var tab=tabAt(e);if(!tab)return;" + `var list=tab.closest('[role="tablist"]');if(!list)return;var all=tabsOf(list);var i=all.indexOf(tab);var n=-1;` + "if(e.key==='ArrowRight'||e.key==='ArrowDown')n=(i+1)%all.length;" + "else if(e.key==='ArrowLeft'||e.key==='ArrowUp')n=(i-1+all.length)%all.length;" + "else if(e.key==='Home')n=0;else if(e.key==='End')n=all.length-1;" + "if(n<0)return;e.preventDefault();select(all[n],true);});" + "})();";
|
|
7181
|
+
var CAROUSEL_CSS = ':where([data-caelo-ui="carousel"] [data-caelo-carousel-track]){display:flex;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth}' + ':where([data-caelo-ui="carousel"] [data-caelo-carousel-track]>*){flex:0 0 100%;scroll-snap-align:start}' + '@media (prefers-reduced-motion: reduce){[data-caelo-ui="carousel"] [data-caelo-carousel-track]{scroll-behavior:auto}}';
|
|
7182
|
+
var CAROUSEL_JS = "(function(){" + "document.addEventListener('click',function(e){var t=e.target;if(!(t instanceof Element))return;" + "var b=t.closest('[data-caelo-carousel-prev],[data-caelo-carousel-next]');if(!b)return;" + `var c=b.closest('[data-caelo-ui="carousel"]');if(!c)return;` + "var track=c.querySelector('[data-caelo-carousel-track]');if(!track)return;" + "var dir=b.hasAttribute('data-caelo-carousel-next')?1:-1;" + "var reduce=window.matchMedia('(prefers-reduced-motion: reduce)').matches;" + "track.scrollBy({left:dir*track.clientWidth,behavior:reduce?'auto':'smooth'});});" + "})();";
|
|
7183
|
+
var INTERACTIONS = {
|
|
7184
|
+
"mobile-nav": { css: MOBILE_NAV_CSS, js: MOBILE_NAV_JS },
|
|
7185
|
+
accordion: { css: ACCORDION_CSS, js: ACCORDION_JS },
|
|
7186
|
+
tabs: { css: TABS_CSS, js: TABS_JS },
|
|
7187
|
+
carousel: { css: CAROUSEL_CSS, js: CAROUSEL_JS }
|
|
7188
|
+
};
|
|
7189
|
+
var INTERACTION_IDS = Object.keys(INTERACTIONS);
|
|
7190
|
+
var INTERACTION_MARKUP_CONTRACT = '**Vetted interactions - use these instead of writing JS for them.** Add `data-caelo-ui="<id>"` to the markup and Caelo ships accessible, dependency-free behaviour once per page; style it freely in the module CSS. ' + '`accordion` (FAQ, collapsible sections): `<div data-caelo-ui="accordion" data-single>` containing `<details id="..."><summary>Question</summary><div>Answer</div></details>` items - `data-single` keeps one open; a link to `#<details id>` opens it. ' + '`tabs`: `<div data-caelo-ui="tabs"><div role="tablist" aria-label="..."><button type="button" role="tab" id="t1" aria-controls="p1" aria-selected="true">...</button><button type="button" role="tab" id="t2" aria-controls="p2" aria-selected="false" tabindex="-1">...</button></div><div role="tabpanel" id="p1" aria-labelledby="t1">...</div><div role="tabpanel" id="p2" aria-labelledby="t2" hidden>...</div></div>` - ids must be unique on the page. ' + '`carousel` (slider, testimonials): `<section data-caelo-ui="carousel" aria-roledescription="carousel" aria-label="..."><div data-caelo-carousel-track tabindex="0"><div role="group" aria-roledescription="slide" aria-label="1 of 3">...</div>...</div><button type="button" data-caelo-carousel-prev aria-label="Previous slide"><span aria-hidden="true">‹</span></button><button type="button" data-caelo-carousel-next aria-label="Next slide"><span aria-hidden="true">›</span></button></section>` (an icon button keeps its visible content aria-hidden; a text button needs no aria-label) - one slide per view by default; set the slides\' `flex-basis` in module CSS to show more. ' + "`mobile-nav` is applied by the built-in nav-menu renderer; never add it by hand. " + "Write module JS only for behaviour the kit does not cover.";
|
|
7175
7191
|
|
|
7176
7192
|
// ../shared/src/media.ts
|
|
7177
7193
|
var MEDIA_ALLOWED_MIMES = [
|
|
@@ -8274,6 +8290,7 @@ var IMAGE_DIGEST = /^sha256:[0-9a-f]{64}$/;
|
|
|
8274
8290
|
var SEMVER2 = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/;
|
|
8275
8291
|
var GHSA_ID = /^GHSA(-[23456789cfghjmpqrvwx]{4}){3}$/;
|
|
8276
8292
|
var digest = string2().regex(IMAGE_DIGEST, "expected sha256:<64 hex>");
|
|
8293
|
+
var OWNER_ACTION_MAX_CHARS = 300;
|
|
8277
8294
|
var ReleaseManifestSchema = object({
|
|
8278
8295
|
manifestVersion: literal(1),
|
|
8279
8296
|
version: string2().regex(SEMVER2, "expected a SemVer version without a leading v"),
|
|
@@ -8287,7 +8304,8 @@ var ReleaseManifestSchema = object({
|
|
|
8287
8304
|
head: string2().min(1)
|
|
8288
8305
|
}),
|
|
8289
8306
|
security: boolean2(),
|
|
8290
|
-
advisories: array(string2().regex(GHSA_ID, "expected a GHSA id"))
|
|
8307
|
+
advisories: array(string2().regex(GHSA_ID, "expected a GHSA id")),
|
|
8308
|
+
ownerAction: string2().min(1).max(OWNER_ACTION_MAX_CHARS).optional()
|
|
8291
8309
|
});
|
|
8292
8310
|
var OciManifestSchema = object({
|
|
8293
8311
|
artifactType: string2().optional(),
|
|
@@ -17870,6 +17888,78 @@ function drizzle(...params) {
|
|
|
17870
17888
|
drizzle2.mock = mock;
|
|
17871
17889
|
})(drizzle || (drizzle = {}));
|
|
17872
17890
|
|
|
17891
|
+
// ../query-api/src/audit.ts
|
|
17892
|
+
var SENSITIVE_KEYS = new Set([
|
|
17893
|
+
"password",
|
|
17894
|
+
"newPassword",
|
|
17895
|
+
"currentPassword",
|
|
17896
|
+
"token",
|
|
17897
|
+
"csrfToken",
|
|
17898
|
+
"passwordHash",
|
|
17899
|
+
"secret",
|
|
17900
|
+
"apiKey",
|
|
17901
|
+
"clientSecret"
|
|
17902
|
+
]);
|
|
17903
|
+
var SENSITIVE_KEY_RE = /pass(word|wd|phrase)?|secret|token|api[-_]?key|credential|private[-_]?key/i;
|
|
17904
|
+
function redact2(value) {
|
|
17905
|
+
if (value === null || value === undefined)
|
|
17906
|
+
return value;
|
|
17907
|
+
if (Array.isArray(value))
|
|
17908
|
+
return value.map(redact2);
|
|
17909
|
+
if (typeof value === "object") {
|
|
17910
|
+
const out = {};
|
|
17911
|
+
for (const [k, v] of Object.entries(value)) {
|
|
17912
|
+
if (k === "__proto__" || k === "constructor" || k === "prototype")
|
|
17913
|
+
continue;
|
|
17914
|
+
out[k] = SENSITIVE_KEYS.has(k) || SENSITIVE_KEY_RE.test(k) ? "<redacted>" : redact2(v);
|
|
17915
|
+
}
|
|
17916
|
+
return out;
|
|
17917
|
+
}
|
|
17918
|
+
return value;
|
|
17919
|
+
}
|
|
17920
|
+
async function canonicalHash(input) {
|
|
17921
|
+
const canonical = JSON.stringify(redact2(input), (_key, val) => {
|
|
17922
|
+
if (val && typeof val === "object" && !Array.isArray(val)) {
|
|
17923
|
+
const sorted = {};
|
|
17924
|
+
for (const k of Object.keys(val).sort())
|
|
17925
|
+
sorted[k] = val[k];
|
|
17926
|
+
return sorted;
|
|
17927
|
+
}
|
|
17928
|
+
return val;
|
|
17929
|
+
});
|
|
17930
|
+
const bytes = new TextEncoder().encode(canonical);
|
|
17931
|
+
const digest = await crypto.subtle.digest("SHA-256", bytes);
|
|
17932
|
+
return [...new Uint8Array(digest)].map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
17933
|
+
}
|
|
17934
|
+
async function recordAudit(tx, opts) {
|
|
17935
|
+
const hash = await canonicalHash(opts.input);
|
|
17936
|
+
const entityId = opts.entityId ?? null;
|
|
17937
|
+
const resultSummary = opts.resultSummary ?? null;
|
|
17938
|
+
const requestId = opts.requestId ?? null;
|
|
17939
|
+
const provider = opts.provider ?? null;
|
|
17940
|
+
const model = opts.model ?? null;
|
|
17941
|
+
const operationType = opts.operationType ?? null;
|
|
17942
|
+
await tx.execute(sql`
|
|
17943
|
+
INSERT INTO audit_events (
|
|
17944
|
+
actor_id, operation, input_hash, succeeded, entity_id, result_summary,
|
|
17945
|
+
request_id, provider, model, operation_type
|
|
17946
|
+
)
|
|
17947
|
+
VALUES (
|
|
17948
|
+
${opts.actorId}::uuid,
|
|
17949
|
+
${opts.operation},
|
|
17950
|
+
${hash},
|
|
17951
|
+
${opts.succeeded},
|
|
17952
|
+
${entityId === null ? null : sql`${entityId}::uuid`},
|
|
17953
|
+
${resultSummary},
|
|
17954
|
+
${requestId},
|
|
17955
|
+
${provider},
|
|
17956
|
+
${model},
|
|
17957
|
+
${operationType}
|
|
17958
|
+
)
|
|
17959
|
+
`);
|
|
17960
|
+
}
|
|
17961
|
+
var SYSTEM_ACTOR_ID = "00000000-0000-0000-0000-00000000ffff";
|
|
17962
|
+
|
|
17873
17963
|
// ../query-api/src/branch-access.ts
|
|
17874
17964
|
var UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
17875
17965
|
function namedBranches(ctx, input) {
|
|
@@ -17957,6 +18047,28 @@ function isRlsDenial(error) {
|
|
|
17957
18047
|
return false;
|
|
17958
18048
|
}
|
|
17959
18049
|
|
|
18050
|
+
// ../query-api/src/post-commit.ts
|
|
18051
|
+
var pendingByTx = new WeakMap;
|
|
18052
|
+
function collectPostCommitEffects(tx) {
|
|
18053
|
+
const pending = [];
|
|
18054
|
+
pendingByTx.set(tx, pending);
|
|
18055
|
+
return pending;
|
|
18056
|
+
}
|
|
18057
|
+
async function runPostCommitEffects(effects) {
|
|
18058
|
+
const failures = [];
|
|
18059
|
+
for (const effect of effects) {
|
|
18060
|
+
try {
|
|
18061
|
+
await effect.run();
|
|
18062
|
+
} catch (thrown) {
|
|
18063
|
+
failures.push({
|
|
18064
|
+
effect,
|
|
18065
|
+
message: thrown instanceof Error ? thrown.message : String(thrown)
|
|
18066
|
+
});
|
|
18067
|
+
}
|
|
18068
|
+
}
|
|
18069
|
+
return failures;
|
|
18070
|
+
}
|
|
18071
|
+
|
|
17960
18072
|
// ../query-api/src/adapter.ts
|
|
17961
18073
|
var SQL3 = globalThis.Bun?.SQL;
|
|
17962
18074
|
var DEFAULT_ROLES = { admin: "admin_role", public: ["admin_role", "public_role"] };
|
|
@@ -17981,6 +18093,10 @@ function validatePoolMax(value, source) {
|
|
|
17981
18093
|
}
|
|
17982
18094
|
return value;
|
|
17983
18095
|
}
|
|
18096
|
+
function postCommitFailureMessage(failures) {
|
|
18097
|
+
const list = failures.map((f) => `${f.effect.label} (${f.message})`).join("; ");
|
|
18098
|
+
return `The change is saved, but its follow-up in the running server failed: ${list}. Do not repeat the change. Restart the admin server so the running state is rebuilt from the saved data; the failure is in the audit log.`;
|
|
18099
|
+
}
|
|
17984
18100
|
|
|
17985
18101
|
class DatabaseAdapter {
|
|
17986
18102
|
#admin;
|
|
@@ -18062,14 +18178,12 @@ class DatabaseAdapter {
|
|
|
18062
18178
|
await this.verifyRoles();
|
|
18063
18179
|
const db = op.database === "cms_admin" ? this.#adminDb(`operation ${op.name}`) : this.#public;
|
|
18064
18180
|
let publishAfterCommit = false;
|
|
18181
|
+
let postCommit = [];
|
|
18065
18182
|
let result;
|
|
18066
18183
|
try {
|
|
18067
18184
|
result = await db.transaction(async (tx) => {
|
|
18068
|
-
|
|
18069
|
-
await tx
|
|
18070
|
-
await tx.execute(sql`SELECT set_config('caelo.plugin_id', ${ctx.pluginId ?? ""}, true)`);
|
|
18071
|
-
await tx.execute(sql`SELECT set_config('caelo.chat_branch_id', ${ctx.chatBranchId ?? ""}, true)`);
|
|
18072
|
-
await tx.execute(sql`SELECT set_config('caelo.chat_task_id', ${ctx.chatTaskId ?? ""}, true)`);
|
|
18185
|
+
postCommit = collectPostCommitEffects(tx);
|
|
18186
|
+
await this.#setIdentity(tx, ctx);
|
|
18073
18187
|
if (op.database === "cms_admin") {
|
|
18074
18188
|
const denied = await firstInvisibleBranch(tx, namedBranches(ctx, validatedInput));
|
|
18075
18189
|
if (denied !== null)
|
|
@@ -18099,19 +18213,71 @@ class DatabaseAdapter {
|
|
|
18099
18213
|
...pgDetail ? { pgDetail } : {}
|
|
18100
18214
|
});
|
|
18101
18215
|
}
|
|
18216
|
+
const effectFailures = await this.#settlePostCommit(op.name, ctx, postCommit);
|
|
18217
|
+
let publishFailure = null;
|
|
18102
18218
|
if (publishAfterCommit) {
|
|
18103
18219
|
try {
|
|
18104
18220
|
await this.#publishAfterCommit();
|
|
18105
18221
|
} catch (thrown) {
|
|
18106
|
-
|
|
18107
|
-
kind: "HandlerError",
|
|
18108
|
-
operation: op.name,
|
|
18109
|
-
message: `The change is saved, but the public site does not serve it yet: publishing it failed (${thrown instanceof Error ? thrown.message : String(thrown)}). Do not repeat the change; it is published automatically within seconds once the public database answers.`
|
|
18110
|
-
});
|
|
18222
|
+
publishFailure = `The change is saved, but the public site does not serve it yet: publishing it failed (${thrown instanceof Error ? thrown.message : String(thrown)}). Do not repeat the change; it is published automatically within seconds once the public database answers.`;
|
|
18111
18223
|
}
|
|
18112
18224
|
}
|
|
18225
|
+
if (effectFailures.length > 0) {
|
|
18226
|
+
const effects = postCommitFailureMessage(effectFailures);
|
|
18227
|
+
return err({
|
|
18228
|
+
kind: "HandlerError",
|
|
18229
|
+
operation: op.name,
|
|
18230
|
+
message: publishFailure === null ? effects : `${effects} ${publishFailure}`
|
|
18231
|
+
});
|
|
18232
|
+
}
|
|
18233
|
+
if (publishFailure !== null) {
|
|
18234
|
+
return err({ kind: "HandlerError", operation: op.name, message: publishFailure });
|
|
18235
|
+
}
|
|
18113
18236
|
return result;
|
|
18114
18237
|
}
|
|
18238
|
+
async#setIdentity(tx, ctx) {
|
|
18239
|
+
await tx.execute(sql`SELECT set_config('caelo.actor_id', ${ctx.actorId}, true)`);
|
|
18240
|
+
await tx.execute(sql`SELECT set_config('caelo.actor_kind', ${ctx.actorKind}, true)`);
|
|
18241
|
+
await tx.execute(sql`SELECT set_config('caelo.plugin_id', ${ctx.pluginId ?? ""}, true)`);
|
|
18242
|
+
await tx.execute(sql`SELECT set_config('caelo.chat_branch_id', ${ctx.chatBranchId ?? ""}, true)`);
|
|
18243
|
+
await tx.execute(sql`SELECT set_config('caelo.chat_task_id', ${ctx.chatTaskId ?? ""}, true)`);
|
|
18244
|
+
}
|
|
18245
|
+
async#settlePostCommit(operation, ctx, effects) {
|
|
18246
|
+
if (effects.length === 0)
|
|
18247
|
+
return [];
|
|
18248
|
+
const failures = await runPostCommitEffects(effects);
|
|
18249
|
+
for (const failure of failures) {
|
|
18250
|
+
console.error("[query-api] post-commit effect failed", {
|
|
18251
|
+
effect: failure.effect.label,
|
|
18252
|
+
entityId: failure.effect.entityId ?? null,
|
|
18253
|
+
requestId: ctx.requestId,
|
|
18254
|
+
error: failure.message
|
|
18255
|
+
});
|
|
18256
|
+
if (this.#admin === null)
|
|
18257
|
+
continue;
|
|
18258
|
+
try {
|
|
18259
|
+
await this.#admin.transaction(async (tx) => {
|
|
18260
|
+
await this.#setIdentity(tx, ctx);
|
|
18261
|
+
await recordAudit(tx, {
|
|
18262
|
+
actorId: ctx.actorId,
|
|
18263
|
+
requestId: ctx.requestId,
|
|
18264
|
+
operation: `${operation}.post_commit`,
|
|
18265
|
+
input: { effect: failure.effect.label },
|
|
18266
|
+
succeeded: false,
|
|
18267
|
+
entityId: failure.effect.entityId ?? null,
|
|
18268
|
+
resultSummary: `${failure.effect.label}: ${failure.message}`.slice(0, 500)
|
|
18269
|
+
});
|
|
18270
|
+
});
|
|
18271
|
+
} catch (thrown) {
|
|
18272
|
+
console.error("[query-api] could not audit the failed post-commit effect", {
|
|
18273
|
+
effect: failure.effect.label,
|
|
18274
|
+
requestId: ctx.requestId,
|
|
18275
|
+
error: thrown instanceof Error ? thrown.message : String(thrown)
|
|
18276
|
+
});
|
|
18277
|
+
}
|
|
18278
|
+
}
|
|
18279
|
+
return failures;
|
|
18280
|
+
}
|
|
18115
18281
|
async close() {
|
|
18116
18282
|
await Promise.all([this.#adminRaw?.end(), this.#publicRaw.end()]);
|
|
18117
18283
|
}
|
|
@@ -18120,12 +18286,10 @@ class DatabaseAdapter {
|
|
|
18120
18286
|
if (!this.#skipVerify)
|
|
18121
18287
|
await this.verifyRoles();
|
|
18122
18288
|
let publishAfterCommit = false;
|
|
18289
|
+
let postCommit = [];
|
|
18123
18290
|
const out = await admin.transaction(async (tx) => {
|
|
18124
|
-
|
|
18125
|
-
await tx
|
|
18126
|
-
await tx.execute(sql`SELECT set_config('caelo.plugin_id', ${ctx.pluginId ?? ""}, true)`);
|
|
18127
|
-
await tx.execute(sql`SELECT set_config('caelo.chat_branch_id', ${ctx.chatBranchId ?? ""}, true)`);
|
|
18128
|
-
await tx.execute(sql`SELECT set_config('caelo.chat_task_id', ${ctx.chatTaskId ?? ""}, true)`);
|
|
18291
|
+
postCommit = collectPostCommitEffects(tx);
|
|
18292
|
+
await this.#setIdentity(tx, ctx);
|
|
18129
18293
|
const denied = await firstInvisibleBranch(tx, namedBranches(ctx, undefined));
|
|
18130
18294
|
if (denied !== null) {
|
|
18131
18295
|
throw new OperationAbortError(branchNotFound("withAdminTransaction", denied));
|
|
@@ -18134,19 +18298,28 @@ class DatabaseAdapter {
|
|
|
18134
18298
|
publishAfterCommit = await this.#projectionDirty(tx);
|
|
18135
18299
|
return result;
|
|
18136
18300
|
});
|
|
18301
|
+
const effectFailures = await this.#settlePostCommit("withAdminTransaction", ctx, postCommit);
|
|
18137
18302
|
if (publishAfterCommit)
|
|
18138
18303
|
await this.#publishAfterCommit();
|
|
18304
|
+
if (effectFailures.length > 0)
|
|
18305
|
+
throw new Error(postCommitFailureMessage(effectFailures));
|
|
18139
18306
|
return out;
|
|
18140
18307
|
}
|
|
18141
18308
|
async withPublicTransaction(ctx, fn) {
|
|
18142
18309
|
if (!this.#skipVerify)
|
|
18143
18310
|
await this.verifyRoles();
|
|
18144
|
-
|
|
18311
|
+
let postCommit = [];
|
|
18312
|
+
const out = await this.#public.transaction(async (tx) => {
|
|
18313
|
+
postCommit = collectPostCommitEffects(tx);
|
|
18145
18314
|
await tx.execute(sql`SELECT set_config('caelo.actor_id', ${ctx.actorId}, true)`);
|
|
18146
18315
|
await tx.execute(sql`SELECT set_config('caelo.actor_kind', ${ctx.actorKind}, true)`);
|
|
18147
18316
|
await tx.execute(sql`SELECT set_config('caelo.plugin_id', ${ctx.pluginId ?? ""}, true)`);
|
|
18148
18317
|
return await fn(tx);
|
|
18149
18318
|
});
|
|
18319
|
+
const effectFailures = await this.#settlePostCommit("withPublicTransaction", ctx, postCommit);
|
|
18320
|
+
if (effectFailures.length > 0)
|
|
18321
|
+
throw new Error(postCommitFailureMessage(effectFailures));
|
|
18322
|
+
return out;
|
|
18150
18323
|
}
|
|
18151
18324
|
rawAdmin() {
|
|
18152
18325
|
if (this.#adminRaw === null)
|
|
@@ -18211,77 +18384,6 @@ class DatabaseAdapter {
|
|
|
18211
18384
|
return this.#public;
|
|
18212
18385
|
}
|
|
18213
18386
|
}
|
|
18214
|
-
// ../query-api/src/audit.ts
|
|
18215
|
-
var SENSITIVE_KEYS = new Set([
|
|
18216
|
-
"password",
|
|
18217
|
-
"newPassword",
|
|
18218
|
-
"currentPassword",
|
|
18219
|
-
"token",
|
|
18220
|
-
"csrfToken",
|
|
18221
|
-
"passwordHash",
|
|
18222
|
-
"secret",
|
|
18223
|
-
"apiKey",
|
|
18224
|
-
"clientSecret"
|
|
18225
|
-
]);
|
|
18226
|
-
var SENSITIVE_KEY_RE = /pass(word|wd|phrase)?|secret|token|api[-_]?key|credential|private[-_]?key/i;
|
|
18227
|
-
function redact2(value) {
|
|
18228
|
-
if (value === null || value === undefined)
|
|
18229
|
-
return value;
|
|
18230
|
-
if (Array.isArray(value))
|
|
18231
|
-
return value.map(redact2);
|
|
18232
|
-
if (typeof value === "object") {
|
|
18233
|
-
const out = {};
|
|
18234
|
-
for (const [k, v] of Object.entries(value)) {
|
|
18235
|
-
if (k === "__proto__" || k === "constructor" || k === "prototype")
|
|
18236
|
-
continue;
|
|
18237
|
-
out[k] = SENSITIVE_KEYS.has(k) || SENSITIVE_KEY_RE.test(k) ? "<redacted>" : redact2(v);
|
|
18238
|
-
}
|
|
18239
|
-
return out;
|
|
18240
|
-
}
|
|
18241
|
-
return value;
|
|
18242
|
-
}
|
|
18243
|
-
async function canonicalHash(input) {
|
|
18244
|
-
const canonical = JSON.stringify(redact2(input), (_key, val) => {
|
|
18245
|
-
if (val && typeof val === "object" && !Array.isArray(val)) {
|
|
18246
|
-
const sorted = {};
|
|
18247
|
-
for (const k of Object.keys(val).sort())
|
|
18248
|
-
sorted[k] = val[k];
|
|
18249
|
-
return sorted;
|
|
18250
|
-
}
|
|
18251
|
-
return val;
|
|
18252
|
-
});
|
|
18253
|
-
const bytes = new TextEncoder().encode(canonical);
|
|
18254
|
-
const digest = await crypto.subtle.digest("SHA-256", bytes);
|
|
18255
|
-
return [...new Uint8Array(digest)].map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
18256
|
-
}
|
|
18257
|
-
async function recordAudit(tx, opts) {
|
|
18258
|
-
const hash = await canonicalHash(opts.input);
|
|
18259
|
-
const entityId = opts.entityId ?? null;
|
|
18260
|
-
const resultSummary = opts.resultSummary ?? null;
|
|
18261
|
-
const requestId = opts.requestId ?? null;
|
|
18262
|
-
const provider = opts.provider ?? null;
|
|
18263
|
-
const model = opts.model ?? null;
|
|
18264
|
-
const operationType = opts.operationType ?? null;
|
|
18265
|
-
await tx.execute(sql`
|
|
18266
|
-
INSERT INTO audit_events (
|
|
18267
|
-
actor_id, operation, input_hash, succeeded, entity_id, result_summary,
|
|
18268
|
-
request_id, provider, model, operation_type
|
|
18269
|
-
)
|
|
18270
|
-
VALUES (
|
|
18271
|
-
${opts.actorId}::uuid,
|
|
18272
|
-
${opts.operation},
|
|
18273
|
-
${hash},
|
|
18274
|
-
${opts.succeeded},
|
|
18275
|
-
${entityId === null ? null : sql`${entityId}::uuid`},
|
|
18276
|
-
${resultSummary},
|
|
18277
|
-
${requestId},
|
|
18278
|
-
${provider},
|
|
18279
|
-
${model},
|
|
18280
|
-
${operationType}
|
|
18281
|
-
)
|
|
18282
|
-
`);
|
|
18283
|
-
}
|
|
18284
|
-
var SYSTEM_ACTOR_ID = "00000000-0000-0000-0000-00000000ffff";
|
|
18285
18387
|
// ../query-api/src/execute.ts
|
|
18286
18388
|
var allowAllRateLimiter = {
|
|
18287
18389
|
async check() {
|
package/dist/caddy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caddy.d.ts","sourceRoot":"","sources":["../src/caddy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"caddy.d.ts","sourceRoot":"","sources":["../src/caddy.ts"],"names":[],"mappings":"AAoEA,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IAClC,QAAQ,CAAC,GAAG,EAAE,YAAY,GAAG,SAAS,CAAC;CACxC;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,kFAAkF;IAClF,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,0FAA0F;IAC1F,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;CAClD;AAED,uFAAuF;AACvF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,eAAe,EAAE,CAM9F;AAYD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAOzF;AAWD,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CA4C7D"}
|
package/dist/caddy.js
CHANGED
|
@@ -48,8 +48,15 @@
|
|
|
48
48
|
* icon MIME the media library stores and `<link rel="icon" type>`
|
|
49
49
|
* declares. file_server only fills Content-Type when no earlier handler
|
|
50
50
|
* set it, so the `header` line wins over the host's mime.types name.
|
|
51
|
+
*
|
|
52
|
+
* #891 — every response of a public vhost is `nosniff`, and every SVG
|
|
53
|
+
* gets the sandboxing CSP (`SVG_DOCUMENT_CSP`, @caelo-cms/shared): an
|
|
54
|
+
* uploaded SVG opened directly must not run script on the site's origin,
|
|
55
|
+
* which also serves `/api/*`. Caddy's `path` matcher is case-insensitive,
|
|
56
|
+
* so `*.svg` covers `.SVG` too. `cms-provision upgrade` re-writes this file
|
|
57
|
+
* (self-hosted-upgrade.ts), so existing installs get the headers too.
|
|
51
58
|
*/
|
|
52
|
-
import { CONTENT_HASHED_PATH_PATTERN, caddyRedirectsImport, IMMUTABLE_CACHE_CONTROL, } from "@caelo-cms/shared";
|
|
59
|
+
import { CONTENT_HASHED_PATH_PATTERN, caddyRedirectsImport, IMMUTABLE_CACHE_CONTROL, NOSNIFF, SVG_DOCUMENT_CSP, } from "@caelo-cms/shared";
|
|
53
60
|
/** The host the admin of a self-hosted install answers on (same convention as GCP). */
|
|
54
61
|
export function selfHostedAdminHost(domain) {
|
|
55
62
|
return `admin.${domain}`;
|
|
@@ -160,6 +167,9 @@ function vhost(d, spec) {
|
|
|
160
167
|
header @content_hashed Cache-Control "${IMMUTABLE_CACHE_CONTROL}"
|
|
161
168
|
@ico path *.ico
|
|
162
169
|
header @ico Content-Type "image/x-icon"
|
|
170
|
+
header X-Content-Type-Options "${NOSNIFF}"
|
|
171
|
+
@svg path *.svg
|
|
172
|
+
header @svg Content-Security-Policy "${SVG_DOCUMENT_CSP}"
|
|
163
173
|
handle /api/* {
|
|
164
174
|
reverse_proxy ${spec.gatewayUpstream}
|
|
165
175
|
}
|
package/dist/caddy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caddy.js","sourceRoot":"","sources":["../src/caddy.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC
|
|
1
|
+
{"version":3,"file":"caddy.js","sourceRoot":"","sources":["../src/caddy.ts"],"names":[],"mappings":"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"}
|
package/dist/cli-routing.js
CHANGED
|
@@ -65,7 +65,7 @@ export const CLI_COMMANDS = [
|
|
|
65
65
|
},
|
|
66
66
|
{
|
|
67
67
|
name: "upgrade",
|
|
68
|
-
args: "[--version x.y.z] [--channel stable|rc|beta] [--region <r>] [--skip-verify] [--skip-health-check] [--install <id|domain|all>]",
|
|
68
|
+
args: "[--version x.y.z] [--channel stable|rc|beta] [--region <r>] [--skip-verify] [--skip-health-check] [--install <id|domain|all>] [--project <gcp-project-id>]",
|
|
69
69
|
summary: "Roll the install to a newer release (latest stable by default) after verifying the image signatures.",
|
|
70
70
|
},
|
|
71
71
|
{
|
package/dist/cli-routing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-routing.js","sourceRoot":"","sources":["../src/cli-routing.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAenC;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAuB,EAAE,YAA8B;IACrF,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC1C,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/D,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC3B,CAAC;IACD,oEAAoE;IACpE,0EAA0E;IAC1E,6DAA6D;IAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5C,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK,aAAa,EAAE,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,OAAO,QAAQ,KAAK,aAAa,CAAC;AACpC,CAAC;AAYD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAA6B;IACpD;QACE,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,sIAAsI;QAC5I,OAAO,EACL,4MAA4M;KAC/M;IACD;QACE,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,EAAE;QACR,OAAO,EACL,iHAAiH;KACpH;IACD;QACE,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,EAAE;QACR,OAAO,EACL,oGAAoG;KACvG;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,6BAA6B;QACnC,OAAO,EAAE,2DAA2D;KACrE;IACD;QACE,IAAI,EAAE,SAAS;QACf,IAAI,EAAE
|
|
1
|
+
{"version":3,"file":"cli-routing.js","sourceRoot":"","sources":["../src/cli-routing.ts"],"names":[],"mappings":"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"}
|