@caelo-cms/shared 0.10.53 → 0.10.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/dist/auto-update.d.ts +17 -3
  2. package/dist/auto-update.d.ts.map +1 -1
  3. package/dist/auto-update.js +21 -9
  4. package/dist/auto-update.js.map +1 -1
  5. package/dist/fonts.d.ts +12 -0
  6. package/dist/fonts.d.ts.map +1 -1
  7. package/dist/fonts.js +37 -1
  8. package/dist/fonts.js.map +1 -1
  9. package/dist/index.d.ts +2 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +2 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/link-refs.d.ts +250 -0
  14. package/dist/link-refs.d.ts.map +1 -0
  15. package/dist/link-refs.js +416 -0
  16. package/dist/link-refs.js.map +1 -0
  17. package/dist/media.d.ts +1 -1
  18. package/dist/nested-module-render.d.ts +4 -1
  19. package/dist/nested-module-render.d.ts.map +1 -1
  20. package/dist/nested-module-render.js +14 -2
  21. package/dist/nested-module-render.js.map +1 -1
  22. package/dist/platform-updates.d.ts +27 -6
  23. package/dist/platform-updates.d.ts.map +1 -1
  24. package/dist/platform-updates.js +37 -3
  25. package/dist/platform-updates.js.map +1 -1
  26. package/dist/preview-compose.d.ts +10 -0
  27. package/dist/preview-compose.d.ts.map +1 -1
  28. package/dist/preview-compose.js +58 -20
  29. package/dist/preview-compose.js.map +1 -1
  30. package/dist/proposal-status.d.ts +1 -1
  31. package/dist/raw-text-escape.d.ts +18 -0
  32. package/dist/raw-text-escape.d.ts.map +1 -0
  33. package/dist/raw-text-escape.js +40 -0
  34. package/dist/raw-text-escape.js.map +1 -0
  35. package/dist/redirect-emit-gcp.d.ts +11 -1
  36. package/dist/redirect-emit-gcp.d.ts.map +1 -1
  37. package/dist/redirect-emit-gcp.js +16 -2
  38. package/dist/redirect-emit-gcp.js.map +1 -1
  39. package/dist/release-manifest.d.ts +14 -4
  40. package/dist/release-manifest.d.ts.map +1 -1
  41. package/dist/release-manifest.js +19 -3
  42. package/dist/release-manifest.js.map +1 -1
  43. package/dist/responsive-images.d.ts.map +1 -1
  44. package/dist/responsive-images.js +3 -3
  45. package/dist/responsive-images.js.map +1 -1
  46. package/dist/seo.js +1 -1
  47. package/dist/seo.js.map +1 -1
  48. package/dist/template-balance.d.ts +3 -0
  49. package/dist/template-balance.d.ts.map +1 -0
  50. package/dist/template-balance.js +214 -0
  51. package/dist/template-balance.js.map +1 -0
  52. package/dist/template-engine.d.ts +11 -0
  53. package/dist/template-engine.d.ts.map +1 -1
  54. package/dist/template-engine.js +12 -0
  55. package/dist/template-engine.js.map +1 -1
  56. package/dist/theme-render.d.ts +2 -2
  57. package/dist/theme-render.d.ts.map +1 -1
  58. package/dist/theme-render.js +29 -5
  59. package/dist/theme-render.js.map +1 -1
  60. package/dist/version.d.ts +2 -2
  61. package/dist/version.js +1 -1
  62. package/package.json +2 -2
  63. package/src/auto-update.test.ts +74 -4
  64. package/src/auto-update.ts +31 -9
  65. package/src/fonts.test.ts +37 -0
  66. package/src/fonts.ts +38 -1
  67. package/src/index.ts +2 -0
  68. package/src/link-refs.test.ts +552 -0
  69. package/src/link-refs.ts +569 -0
  70. package/src/nested-module-render.ts +18 -1
  71. package/src/platform-updates.test.ts +5 -0
  72. package/src/platform-updates.ts +39 -3
  73. package/src/preview-compose-deferrals.test.ts +103 -0
  74. package/src/preview-compose.ts +73 -24
  75. package/src/raw-text-escape.ts +44 -0
  76. package/src/redirect-emit-gcp.ts +16 -2
  77. package/src/redirect-emit.test.ts +6 -4
  78. package/src/release-manifest.ts +39 -7
  79. package/src/responsive-images.test.ts +10 -0
  80. package/src/responsive-images.ts +6 -3
  81. package/src/seo.test.ts +7 -0
  82. package/src/seo.ts +1 -1
  83. package/src/template-balance.test.ts +97 -0
  84. package/src/template-balance.ts +216 -0
  85. package/src/template-engine.ts +23 -0
  86. package/src/theme-render-sanitize.test.ts +40 -0
  87. package/src/theme-render.ts +40 -8
  88. package/src/version.ts +1 -1
@@ -30,9 +30,9 @@
30
30
  import { type ThemeDocument } from "./themes.js";
31
31
  /** Renderer-level error for cyclic / unresolved aliases. */
32
32
  export declare class ThemeRenderError extends Error {
33
- readonly kind: "cyclic-alias" | "missing-alias";
33
+ readonly kind: "cyclic-alias" | "missing-alias" | "invalid-selector";
34
34
  readonly path: string;
35
- constructor(kind: "cyclic-alias" | "missing-alias", path: string, message: string);
35
+ constructor(kind: "cyclic-alias" | "missing-alias" | "invalid-selector", path: string, message: string);
36
36
  }
37
37
  /**
38
38
  * Optional render options. The `selector` parameter (v0.11.1, issue #76)
@@ -1 +1 @@
1
- {"version":3,"file":"theme-render.d.ts","sourceRoot":"","sources":["../src/theme-render.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAqC,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAEpF,4DAA4D;AAC5D,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,eAAe,CAAC;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBACV,IAAI,EAAE,cAAc,GAAG,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAMlF;AAED;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE,qBAA0B,GAAG,MAAM,CAgBjG;AAMD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAElE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,MAAM,EAAE,CAmB7E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmB5E;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAgBnE;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA8ChE"}
1
+ {"version":3,"file":"theme-render.d.ts","sourceRoot":"","sources":["../src/theme-render.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAqC,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAEpF,4DAA4D;AAC5D,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,eAAe,GAAG,kBAAkB,CAAC;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEpB,IAAI,EAAE,cAAc,GAAG,eAAe,GAAG,kBAAkB,EAC3D,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM;CAOlB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE,qBAA0B,GAAG,MAAM,CAuBjG;AAMD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAElE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,MAAM,EAAE,CAmB7E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmB5E;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAgBnE;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA8ChE"}
@@ -53,6 +53,9 @@ export class ThemeRenderError extends Error {
53
53
  */
54
54
  export function renderThemeCss(tokens, options = {}) {
55
55
  const selector = options.selector ?? ":root";
56
+ if (/[{};]|<\/style|<!--|--!?>/i.test(selector)) {
57
+ throw new ThemeRenderError("invalid-selector", selector, `Invalid CSS selector for theme rendering: '${selector}'`);
58
+ }
56
59
  const flat = flattenTokens(tokens);
57
60
  const resolveCache = new Map();
58
61
  const lightLines = [];
@@ -300,6 +303,27 @@ function lookupPath(doc, path) {
300
303
  // ────────────────────────────────────────────────────────────────────
301
304
  // Per-category CSS emission
302
305
  // ────────────────────────────────────────────────────────────────────
306
+ /**
307
+ * Serialize a token-path segment as part of a CSS custom-property name, the
308
+ * way `CSS.escape` does: ASCII letters, digits, `-`, `_` and every
309
+ * non-ASCII character stay as they are (so `color.grün` is still
310
+ * `--color-grün`), anything else becomes a hex escape. A theme key can
311
+ * therefore never end the declaration, the rule, or the surrounding
312
+ * `<style>` element.
313
+ */
314
+ function escapeCssIdentPart(part) {
315
+ let out = "";
316
+ for (const ch of part) {
317
+ const cp = ch.codePointAt(0) ?? 0;
318
+ if (cp === 0)
319
+ out += "\\fffd ";
320
+ else if (/[A-Za-z0-9_-]/.test(ch) || cp >= 0x80)
321
+ out += ch;
322
+ else
323
+ out += `\\${cp.toString(16)} `;
324
+ }
325
+ return out;
326
+ }
303
327
  function emitTokenLines(category, path, value, lightLines, darkLines) {
304
328
  // Strip the category prefix to get the rest of the path. e.g.
305
329
  // `color.brand.primary` → `brand-primary` becomes `--color-brand-primary`.
@@ -315,10 +339,10 @@ function emitTokenLines(category, path, value, lightLines, darkLines) {
315
339
  // every category (color/spacing/radius/etc.) so any future
316
340
  // DTCG-group-with-DEFAULT-alias works the same way.
317
341
  const restRaw = path.slice(category.length + 1);
318
- const rest = restRaw.endsWith(".DEFAULT")
342
+ const rest = escapeCssIdentPart(restRaw.endsWith(".DEFAULT")
319
343
  ? restRaw.slice(0, -".DEFAULT".length).replace(/\./g, "-")
320
- : restRaw.replace(/\./g, "-");
321
- const baseName = `--${category === "ease" ? "ease" : category}-${rest}`;
344
+ : restRaw.replace(/\./g, "-"));
345
+ const baseName = `--${category === "ease" ? "ease" : escapeCssIdentPart(category)}-${rest}`;
322
346
  switch (category) {
323
347
  case "color":
324
348
  emitColor(baseName, value, lightLines, darkLines);
@@ -384,9 +408,9 @@ function emitTypography(rest, value, out) {
384
408
  }
385
409
  function emitShadow(baseName, value, out) {
386
410
  // Literal CSS box-shadow string (the tolerant `shadowValueString` form).
387
- // Emit verbatim — the DTCG object form is expanded below.
411
+ // Scrubbed through sanitizeCssTokenValue like every other token value.
388
412
  if (typeof value === "string") {
389
- const s = value.trim();
413
+ const s = sanitizeCssTokenValue(value.trim());
390
414
  if (s.length > 0)
391
415
  out.push(`${baseName}:${s};`);
392
416
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"theme-render.js","sourceRoot":"","sources":["../src/theme-render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"theme-render.js","sourceRoot":"","sources":["../src/theme-render.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -19,7 +19,7 @@
19
19
  * Format: SemVer 2.0.0. Pre-1.0 minor bumps are breaking; post-1.0
20
20
  * follow standard SemVer.
21
21
  */
22
- export declare const CAELO_VERSION = "0.10.53";
22
+ export declare const CAELO_VERSION = "0.10.57";
23
23
  /**
24
24
  * Deprecated alias for back-compat — early P17 work spelled this
25
25
  * `CALEO_VERSION` (typo of "Caelo"). New code should import
@@ -31,7 +31,7 @@ export declare const CAELO_VERSION = "0.10.53";
31
31
  *
32
32
  * @deprecated use CAELO_VERSION
33
33
  */
34
- export declare const CALEO_VERSION = "0.10.53";
34
+ export declare const CALEO_VERSION = "0.10.57";
35
35
  /**
36
36
  * Parsed shape — major/minor/patch + optional pre-release tag.
37
37
  * Stable interface for callers that need to feature-gate (rare —
package/dist/version.js CHANGED
@@ -20,7 +20,7 @@
20
20
  * Format: SemVer 2.0.0. Pre-1.0 minor bumps are breaking; post-1.0
21
21
  * follow standard SemVer.
22
22
  */
23
- export const CAELO_VERSION = "0.10.53";
23
+ export const CAELO_VERSION = "0.10.57";
24
24
  /**
25
25
  * Deprecated alias for back-compat — early P17 work spelled this
26
26
  * `CALEO_VERSION` (typo of "Caelo"). New code should import
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caelo-cms/shared",
3
- "version": "0.10.53",
3
+ "version": "0.10.57",
4
4
  "private": false,
5
5
  "license": "MPL-2.0",
6
6
  "description": "Shared Zod schemas + types + the two-pass HTML composer used by every Caelo CMS workspace package. Stable enough for plugin authors and embedders to depend on directly.",
@@ -38,7 +38,7 @@
38
38
  "colorjs.io": "^0.7.1",
39
39
  "htmlparser2": "^12.0.0",
40
40
  "mustache": "^4.2.0",
41
- "zod": "4.6.5"
41
+ "zod": "4.6.7"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@types/mustache": "^4.2.6"
@@ -19,6 +19,7 @@ const POLICY: StoredUpdatePolicy = {
19
19
  autoSecurity: true,
20
20
  autoPatch: true,
21
21
  autoMinor: false,
22
+ autoConverge: false,
22
23
  channel: "stable",
23
24
  windowStart: null,
24
25
  windowEnd: null,
@@ -56,6 +57,7 @@ function input(over: Partial<AutoUpdateInput> & { version?: string; publishedHou
56
57
  release: { version, publishedAt: hoursAgo(publishedHoursAgo) },
57
58
  facts: FACTS,
58
59
  upgraderAvailable: true,
60
+ convergeAvailable: true,
59
61
  now: NOW,
60
62
  ...rest,
61
63
  } satisfies AutoUpdateInput;
@@ -244,10 +246,12 @@ describe("decideAutoUpdate — pause", () => {
244
246
 
245
247
  describe("decideAutoUpdate — releases that never install automatically", () => {
246
248
  const cases: [string, Partial<AutoUpdateInput>, string][] = [
247
- ["infra change", { facts: { ...FACTS, infraChange: true } }, "needs_cloud_shell"],
249
+ // autoConverge is off by default: the Owner installs it (#819).
250
+ ["infra change", { facts: { ...FACTS, infraChange: true } }, "manual"],
251
+ ["infra change on a security fix", { facts: { ...SECURITY, infraChange: true } }, "manual"],
248
252
  [
249
- "infra change on a security fix",
250
- { facts: { ...SECURITY, infraChange: true } },
253
+ "infra change, no converge job on this install",
254
+ { facts: { ...FACTS, infraChange: true }, convergeAvailable: false },
251
255
  "needs_cloud_shell",
252
256
  ],
253
257
  ["destructive migrations", { facts: { ...FACTS, contractMigrations: true } }, "manual"],
@@ -259,6 +263,73 @@ describe("decideAutoUpdate — releases that never install automatically", () =>
259
263
  expect(decideAutoUpdate({ ...input({}), ...over }).action).toBe(action);
260
264
  });
261
265
 
266
+ it("auto_converge on installs a cloud-setup change through the converge job (#819)", () => {
267
+ const everything = {
268
+ ...POLICY,
269
+ autoSecurity: true,
270
+ autoPatch: true,
271
+ autoMinor: true,
272
+ autoConverge: true,
273
+ };
274
+ for (const facts of [
275
+ { ...FACTS, infraChange: true },
276
+ { ...SECURITY, infraChange: true },
277
+ ]) {
278
+ for (const version of [VERSIONS.patch, VERSIONS.minor]) {
279
+ const d = decideAutoUpdate(input({ policy: everything, facts, version }));
280
+ expect(d.action).toBe("install");
281
+ expect(d.action === "install" && d.route).toBe("converge");
282
+ }
283
+ }
284
+ });
285
+
286
+ it("auto_converge only widens WHERE a release may install, never WHICH kinds", () => {
287
+ const d = decideAutoUpdate(
288
+ input({
289
+ policy: { ...POLICY, autoPatch: false, autoSecurity: false, autoConverge: true },
290
+ facts: { ...FACTS, infraChange: true },
291
+ }),
292
+ );
293
+ expect(d.action).toBe("notify");
294
+ });
295
+
296
+ it("auto_converge still waits for the soak period and never takes destructive migrations", () => {
297
+ const on = { ...POLICY, autoPatch: true, autoConverge: true };
298
+ const soaking = decideAutoUpdate(
299
+ input({ policy: on, facts: { ...FACTS, infraChange: true }, publishedHoursAgo: 1 }),
300
+ );
301
+ expect(soaking.action).toBe("wait");
302
+ expect(soaking.action === "wait" && soaking.route).toBe("converge");
303
+ const destructive = decideAutoUpdate(
304
+ input({ policy: on, facts: { ...FACTS, infraChange: true, contractMigrations: true } }),
305
+ );
306
+ expect(destructive.action).toBe("manual");
307
+ });
308
+
309
+ it("a converge-route install needs the converge job, not the upgrader", () => {
310
+ const on = { ...POLICY, autoPatch: true, autoConverge: true };
311
+ const d = decideAutoUpdate(
312
+ input({ policy: on, facts: { ...FACTS, infraChange: true }, upgraderAvailable: false }),
313
+ );
314
+ expect(d.action).toBe("install");
315
+ const none = decideAutoUpdate(
316
+ input({ policy: on, facts: { ...FACTS, infraChange: true }, convergeAvailable: false }),
317
+ );
318
+ expect(none.action).toBe("needs_cloud_shell");
319
+ });
320
+
321
+ it("auto_converge off: the Owner installs it from Settings → Updates", () => {
322
+ const d = decideAutoUpdate(input({ facts: { ...FACTS, infraChange: true } }));
323
+ expect(d.action).toBe("manual");
324
+ expect(d.reason).toContain("Settings → Updates");
325
+ });
326
+
327
+ it("auto_converge does not touch releases without a cloud-setup change", () => {
328
+ const off = decideAutoUpdate(input({}));
329
+ const on = decideAutoUpdate(input({ policy: { ...POLICY, autoConverge: true } }));
330
+ expect(on).toEqual(off);
331
+ });
332
+
262
333
  it("infra unknown here is left to the upgrader (it checks install.json)", () => {
263
334
  expect(decideAutoUpdate(input({ facts: { ...FACTS, infraChange: null } })).action).toBe(
264
335
  "install",
@@ -289,7 +360,6 @@ describe("decideAutoUpdate — modes and versions", () => {
289
360
  it.each([
290
361
  ["up to date", { version: INSTALLED }, "none"],
291
362
  ["older release", { version: "0.10.40" }, "none"],
292
- ["notices off", { policy: { ...POLICY, mode: "off" as const } }, "none"],
293
363
  ["notify mode", { policy: { ...POLICY, mode: "notify" as const } }, "notify"],
294
364
  [
295
365
  "notify mode, infra change",
@@ -20,11 +20,16 @@
20
20
  * the soak period.
21
21
  *
22
22
  * Rules, in order (maintainer decisions on #696):
23
- * 1. nothing newer, or notices off → none;
23
+ * 1. nothing newer → none (there is no "notices off": security
24
+ * releases are always announced, #862);
24
25
  * 2. off the stable channel, or the policy only notifies → notify;
25
26
  * 3. major → notify (never automatic before 1.0);
26
27
  * 4. release information unreadable → blocked (fails loudly, no guess);
27
- * 5. changes the cloud setup → needs_cloud_shell (never automatic);
28
+ * 5. changes the cloud setup (#819): with no converge job on this
29
+ * install → needs_cloud_shell (the terminal path); with one but
30
+ * `autoConverge` off → manual (the Owner installs it from Settings →
31
+ * Updates); with `autoConverge` on → on through the rules below, and
32
+ * an install it decides goes to the converge job (`route: converge`);
28
33
  * 6. destructive database changes → manual (never automatic);
29
34
  * 7. the kind is not switched on (security / patch / minor) → notify;
30
35
  * 8. no upgrader on this install → blocked;
@@ -36,6 +41,7 @@
36
41
 
37
42
  import {
38
43
  inMaintenanceWindow,
44
+ type PlatformUpdateRoute,
39
45
  type StoredUpdatePolicy,
40
46
  type UpdateKind,
41
47
  updateKind,
@@ -106,6 +112,11 @@ export interface AutoUpdateInput {
106
112
  readonly facts: ReleaseFacts | { readonly unavailable: string };
107
113
  /** This install has an upgrader the admin can hand a request to. */
108
114
  readonly upgraderAvailable: boolean;
115
+ /**
116
+ * This install has a converge job the admin can start (#819): releases
117
+ * that change the cloud setup can install from Caelo at all.
118
+ */
119
+ readonly convergeAvailable: boolean;
109
120
  /** Why it has none right now, in plain words (null: none set up at all). */
110
121
  readonly upgraderProblem?: string | null;
111
122
  readonly now: Date;
@@ -125,6 +136,8 @@ export type AutoUpdateDecision =
125
136
  readonly version: string;
126
137
  readonly kind: UpdateKind;
127
138
  readonly basis: AutoUpdateBasis;
139
+ /** Which job installs it once the wait is over. */
140
+ readonly route: PlatformUpdateRoute;
128
141
  readonly reason: string;
129
142
  /** When it becomes installable; null = until the Owner resumes. */
130
143
  readonly until: Date | null;
@@ -136,6 +149,8 @@ export type AutoUpdateDecision =
136
149
  readonly version: string;
137
150
  readonly kind: UpdateKind;
138
151
  readonly basis: AutoUpdateBasis;
152
+ /** Which job installs it: the upgrader, or the converge job (#819). */
153
+ readonly route: PlatformUpdateRoute;
139
154
  readonly reason: string;
140
155
  };
141
156
 
@@ -194,9 +209,6 @@ export function decideAutoUpdate(input: AutoUpdateInput): AutoUpdateDecision {
194
209
  if (kind === null) {
195
210
  return { action: "none", reason: `v${input.installedVersion} is the newest release.` };
196
211
  }
197
- if (policy.mode === "off") {
198
- return { action: "none", reason: "Update notices are switched off in the update policy." };
199
- }
200
212
  const v = release.version;
201
213
  const base = { version: v, kind } as const;
202
214
  if (!isStable(v)) {
@@ -228,13 +240,22 @@ export function decideAutoUpdate(input: AutoUpdateInput): AutoUpdateDecision {
228
240
  };
229
241
  }
230
242
  const facts = input.facts;
231
- if (facts.infraChange === true) {
243
+ const converge = facts.infraChange === true;
244
+ if (converge && !input.convergeAvailable) {
232
245
  return {
233
246
  action: "needs_cloud_shell",
234
247
  ...base,
235
- reason: `v${v} changes this install's cloud setup, which the admin may not do. It is never installed automatically: the Owner runs it once with their own account in Cloud Shell.`,
248
+ reason: `v${v} changes this install's cloud setup, and this install has no converge job to do that from Caelo. The Owner installs it once with their own account in Cloud Shell or from the computer they installed from.`,
249
+ };
250
+ }
251
+ if (converge && !policy.autoConverge) {
252
+ return {
253
+ action: "manual",
254
+ ...base,
255
+ reason: `v${v} changes this install's cloud setup. The update policy does not install those automatically; the Owner installs it from Settings → Updates.`,
236
256
  };
237
257
  }
258
+ const route: PlatformUpdateRoute = converge ? "converge" : "app_roll";
238
259
  if (facts.contractMigrations) {
239
260
  return {
240
261
  action: "manual",
@@ -258,7 +279,8 @@ export function decideAutoUpdate(input: AutoUpdateInput): AutoUpdateDecision {
258
279
  reason: `v${v} is a ${what}; the update policy does not install those automatically. The Owner installs it.`,
259
280
  };
260
281
  }
261
- if (!input.upgraderAvailable) {
282
+ // A converge-route install needs the converge job (checked above), not the upgrader.
283
+ if (!converge && !input.upgraderAvailable) {
262
284
  return {
263
285
  action: "blocked",
264
286
  ...base,
@@ -267,7 +289,7 @@ export function decideAutoUpdate(input: AutoUpdateInput): AutoUpdateDecision {
267
289
  : `v${v} could install automatically, but this install has no upgrader the admin can start. Run the upgrade command from Settings → Updates once; it sets the upgrader up.`,
268
290
  };
269
291
  }
270
- const auto = { ...base, basis } as const;
292
+ const auto = { ...base, basis, route } as const;
271
293
  if (isPausedAt(policy, now)) {
272
294
  const until = policy.pausedUntil === null ? null : new Date(policy.pausedUntil);
273
295
  const who = policy.pausedByOwner ? "by the Owner" : "after a failed automatic install";
package/src/fonts.test.ts CHANGED
@@ -10,6 +10,7 @@ import { describe, expect, it } from "bun:test";
10
10
  import {
11
11
  buildFontFaceCss,
12
12
  extractThemeFontRequests,
13
+ fontFaceProblem,
13
14
  fontUnresolvableMarker,
14
15
  googleFontsCssUrl,
15
16
  isSystemFontFamily,
@@ -155,3 +156,39 @@ describe("fontUnresolvableMarker", () => {
155
156
  expect(fontUnresolvableMarker("Poppins")).toBe("theme-font-unresolvable:Poppins");
156
157
  });
157
158
  });
159
+
160
+ describe("buildFontFaceCss descriptor validation", () => {
161
+ const good = {
162
+ family: "Inter",
163
+ style: "normal",
164
+ weight: "400",
165
+ unicodeRange: "U+0000-00FF, U+0131, U+0152-0153",
166
+ publicUrl: "/_assets/fonts/inter/abc123.woff2",
167
+ };
168
+
169
+ it("accepts the descriptor shapes a css2 response carries", () => {
170
+ expect(fontFaceProblem(good)).toBeNull();
171
+ expect(fontFaceProblem({ ...good, style: "italic", weight: "100 900" })).toBeNull();
172
+ expect(fontFaceProblem({ ...good, style: "oblique 0deg 10deg" })).toBeNull();
173
+ expect(fontFaceProblem({ ...good, unicodeRange: null })).toBeNull();
174
+ expect(fontFaceProblem({ ...good, unicodeRange: "U+4??" })).toBeNull();
175
+ });
176
+
177
+ it("refuses descriptors that could close the <style> or add rules, instead of scrubbing them", () => {
178
+ expect(fontFaceProblem({ ...good, style: "normal;}</style><script>" })).toMatch(/font-style/);
179
+ expect(fontFaceProblem({ ...good, weight: "400;}</style>" })).toMatch(/font-weight/);
180
+ expect(fontFaceProblem({ ...good, unicodeRange: "U+0000-00FF;</style>" })).toMatch(
181
+ /unicode-range/,
182
+ );
183
+ expect(fontFaceProblem({ ...good, publicUrl: "/x.woff2)</style>" })).toMatch(/url/);
184
+ expect(() => buildFontFaceCss([{ ...good, weight: "400}</style>" }])).toThrow(
185
+ /invalid font-weight/,
186
+ );
187
+ });
188
+
189
+ it("writes a family name's < as a CSS escape so it cannot spell </style", () => {
190
+ const css = buildFontFaceCss([{ ...good, family: "Evil</style><script>alert(1)</script>" }]);
191
+ expect(css.toLowerCase()).not.toContain("</style");
192
+ expect(css).toContain("Evil\\3c /style>");
193
+ });
194
+ });
package/src/fonts.ts CHANGED
@@ -224,16 +224,53 @@ export function parseFontsCss(cssText: string): ParsedFontFace[] {
224
224
  return faces;
225
225
  }
226
226
 
227
+ const FONT_STYLE_RE = /^(?:normal|italic|oblique(?: +-?\d{1,3}(?:\.\d+)?deg){0,2})$/i;
228
+ const FONT_WEIGHT_RE = /^(?:normal|bold|\d{1,4}(?: +\d{1,4})?)$/i;
229
+ const UNICODE_RANGE_ITEM = "U\\+[0-9A-F?]{1,6}(?:-[0-9A-F]{1,6})?";
230
+ const UNICODE_RANGE_RE = new RegExp(`^${UNICODE_RANGE_ITEM}(?:, *${UNICODE_RANGE_ITEM})*$`, "i");
231
+ /** A same-site asset path: no quotes, parens, whitespace or `<`. */
232
+ const FONT_URL_RE = /^[A-Za-z0-9._~/:%+-]+$/;
233
+
234
+ /**
235
+ * Why `face` cannot be emitted as an `@font-face` rule, or null when it can.
236
+ * The descriptors come from a remote fonts-CSS payload, so each one is held
237
+ * to the grammar a real descriptor has instead of being scrubbed: a value
238
+ * outside it could close the surrounding `<style>` or add rules, and a
239
+ * scrubbed value would ship a silently different font.
240
+ */
241
+ export function fontFaceProblem(face: ResolvedFontFace): string | null {
242
+ if (!FONT_STYLE_RE.test(face.style)) return `font-style ${JSON.stringify(face.style)}`;
243
+ if (!FONT_WEIGHT_RE.test(face.weight)) return `font-weight ${JSON.stringify(face.weight)}`;
244
+ if (face.unicodeRange !== null && !UNICODE_RANGE_RE.test(face.unicodeRange)) {
245
+ return `unicode-range ${JSON.stringify(face.unicodeRange)}`;
246
+ }
247
+ if (!FONT_URL_RE.test(face.publicUrl)) return `url ${JSON.stringify(face.publicUrl)}`;
248
+ return null;
249
+ }
250
+
227
251
  /**
228
252
  * Emit self-hosted @font-face CSS. `font-display: swap` always — text
229
253
  * must render in the fallback while the woff2 loads.
254
+ *
255
+ * Throws on a face {@link fontFaceProblem} refuses; the resolver checks
256
+ * faces first and reports a bad family as unresolved, so reaching the
257
+ * throw means a caller skipped that check.
230
258
  */
231
259
  export function buildFontFaceCss(faces: readonly ResolvedFontFace[]): string {
232
260
  return faces
233
261
  .map((f) => {
262
+ const problem = fontFaceProblem(f);
263
+ if (problem !== null) {
264
+ throw new Error(
265
+ `fonts: refusing the @font-face for ${JSON.stringify(f.family)} — invalid ${problem}. Re-fetch the family or pick another font.`,
266
+ );
267
+ }
268
+ // A CSS string; `<` is written as its CSS escape so no family name
269
+ // can spell `</style` in the surrounding HTML.
270
+ const family = JSON.stringify(f.family).replaceAll("<", "\\3c ");
234
271
  const range = f.unicodeRange !== null ? `unicode-range:${f.unicodeRange};` : "";
235
272
  return (
236
- `@font-face{font-family:${JSON.stringify(f.family)};` +
273
+ `@font-face{font-family:${family};` +
237
274
  `font-style:${f.style};font-weight:${f.weight};font-display:swap;` +
238
275
  `src:url(${f.publicUrl}) format('woff2');${range}}`
239
276
  );
package/src/index.ts CHANGED
@@ -25,6 +25,7 @@ export * from "./genesis-inventory.js";
25
25
  export * from "./google-models.js";
26
26
  export * from "./image-capabilities.js";
27
27
  export * from "./interactions.js";
28
+ export * from "./link-refs.js";
28
29
  export {
29
30
  type LogContext,
30
31
  type Logger,
@@ -47,6 +48,7 @@ export * from "./preview-scanner.js";
47
48
  export * from "./proposal-status.js";
48
49
  export * from "./provisioning-command.js";
49
50
  export * from "./publish-live-parity.js";
51
+ export * from "./raw-text-escape.js";
50
52
  export * from "./redirect-emit-caddy.js";
51
53
  export * from "./redirect-emit-cloudfront.js";
52
54
  export * from "./redirect-emit-front-door.js";