@caelo-cms/shared 0.10.22 → 0.10.23

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 (241) hide show
  1. package/dist/ai-tools.d.ts +290 -214
  2. package/dist/ai-tools.d.ts.map +1 -1
  3. package/dist/ai-tools.js +341 -264
  4. package/dist/ai-tools.js.map +1 -1
  5. package/dist/auth-forms.d.ts.map +1 -1
  6. package/dist/auth-forms.js +4 -1
  7. package/dist/auth-forms.js.map +1 -1
  8. package/dist/base-css.d.ts +24 -0
  9. package/dist/base-css.d.ts.map +1 -0
  10. package/dist/base-css.js +28 -0
  11. package/dist/base-css.js.map +1 -0
  12. package/dist/build-page.d.ts +330 -0
  13. package/dist/build-page.d.ts.map +1 -0
  14. package/dist/build-page.js +282 -0
  15. package/dist/build-page.js.map +1 -0
  16. package/dist/content.d.ts +322 -9
  17. package/dist/content.d.ts.map +1 -1
  18. package/dist/content.js +354 -11
  19. package/dist/content.js.map +1 -1
  20. package/dist/css-gradient-scan.d.ts +14 -0
  21. package/dist/css-gradient-scan.d.ts.map +1 -0
  22. package/dist/css-gradient-scan.js +81 -0
  23. package/dist/css-gradient-scan.js.map +1 -0
  24. package/dist/css-var-scan.d.ts +56 -0
  25. package/dist/css-var-scan.d.ts.map +1 -0
  26. package/dist/css-var-scan.js +97 -0
  27. package/dist/css-var-scan.js.map +1 -0
  28. package/dist/design-manifest.d.ts +36 -0
  29. package/dist/design-manifest.d.ts.map +1 -0
  30. package/dist/design-manifest.js +90 -0
  31. package/dist/design-manifest.js.map +1 -0
  32. package/dist/fonts.d.ts +89 -0
  33. package/dist/fonts.d.ts.map +1 -0
  34. package/dist/fonts.js +241 -0
  35. package/dist/fonts.js.map +1 -0
  36. package/dist/genesis-inventory.d.ts +32 -0
  37. package/dist/genesis-inventory.d.ts.map +1 -0
  38. package/dist/genesis-inventory.js +186 -0
  39. package/dist/genesis-inventory.js.map +1 -0
  40. package/dist/genesis.d.ts +62 -0
  41. package/dist/genesis.d.ts.map +1 -0
  42. package/dist/genesis.js +78 -0
  43. package/dist/genesis.js.map +1 -0
  44. package/dist/i18n.d.ts +44 -1
  45. package/dist/i18n.d.ts.map +1 -1
  46. package/dist/i18n.js +72 -6
  47. package/dist/i18n.js.map +1 -1
  48. package/dist/index.d.ts +27 -0
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +27 -0
  51. package/dist/index.js.map +1 -1
  52. package/dist/interactions.d.ts +23 -0
  53. package/dist/interactions.d.ts.map +1 -0
  54. package/dist/interactions.js +44 -0
  55. package/dist/interactions.js.map +1 -0
  56. package/dist/media.d.ts +101 -16
  57. package/dist/media.d.ts.map +1 -1
  58. package/dist/media.js +126 -15
  59. package/dist/media.js.map +1 -1
  60. package/dist/page-log.d.ts +94 -0
  61. package/dist/page-log.d.ts.map +1 -0
  62. package/dist/page-log.js +111 -0
  63. package/dist/page-log.js.map +1 -0
  64. package/dist/preview-compose.d.ts +79 -0
  65. package/dist/preview-compose.d.ts.map +1 -1
  66. package/dist/preview-compose.js +155 -25
  67. package/dist/preview-compose.js.map +1 -1
  68. package/dist/proposal-status.d.ts +40 -0
  69. package/dist/proposal-status.d.ts.map +1 -0
  70. package/dist/proposal-status.js +34 -0
  71. package/dist/proposal-status.js.map +1 -0
  72. package/dist/responsive-images.d.ts +64 -0
  73. package/dist/responsive-images.d.ts.map +1 -0
  74. package/dist/responsive-images.js +98 -0
  75. package/dist/responsive-images.js.map +1 -0
  76. package/dist/safe-keys.d.ts +9 -0
  77. package/dist/safe-keys.d.ts.map +1 -0
  78. package/dist/safe-keys.js +20 -0
  79. package/dist/safe-keys.js.map +1 -0
  80. package/dist/seo.d.ts +8 -0
  81. package/dist/seo.d.ts.map +1 -1
  82. package/dist/seo.js +3 -1
  83. package/dist/seo.js.map +1 -1
  84. package/dist/skills.d.ts +14 -68
  85. package/dist/skills.d.ts.map +1 -1
  86. package/dist/skills.js +19 -113
  87. package/dist/skills.js.map +1 -1
  88. package/dist/strip-cdata.d.ts +7 -0
  89. package/dist/strip-cdata.d.ts.map +1 -0
  90. package/dist/strip-cdata.js +48 -0
  91. package/dist/strip-cdata.js.map +1 -0
  92. package/dist/structured-sets.d.ts +6 -16
  93. package/dist/structured-sets.d.ts.map +1 -1
  94. package/dist/structured-sets.js +5 -16
  95. package/dist/structured-sets.js.map +1 -1
  96. package/dist/subagents.d.ts +105 -3
  97. package/dist/subagents.d.ts.map +1 -1
  98. package/dist/subagents.js +224 -41
  99. package/dist/subagents.js.map +1 -1
  100. package/dist/template-engine.d.ts +85 -0
  101. package/dist/template-engine.d.ts.map +1 -0
  102. package/dist/template-engine.js +403 -0
  103. package/dist/template-engine.js.map +1 -0
  104. package/dist/theme-importers/auto-detect.d.ts +26 -0
  105. package/dist/theme-importers/auto-detect.d.ts.map +1 -0
  106. package/dist/theme-importers/auto-detect.js +42 -0
  107. package/dist/theme-importers/auto-detect.js.map +1 -0
  108. package/dist/theme-importers/css-comments.d.ts +12 -0
  109. package/dist/theme-importers/css-comments.d.ts.map +1 -0
  110. package/dist/theme-importers/css-comments.js +15 -0
  111. package/dist/theme-importers/css-comments.js.map +1 -0
  112. package/dist/theme-importers/dtcg.d.ts +46 -0
  113. package/dist/theme-importers/dtcg.d.ts.map +1 -0
  114. package/dist/theme-importers/dtcg.js +111 -0
  115. package/dist/theme-importers/dtcg.js.map +1 -0
  116. package/dist/theme-importers/loose.d.ts +3 -0
  117. package/dist/theme-importers/loose.d.ts.map +1 -0
  118. package/dist/theme-importers/loose.js +76 -0
  119. package/dist/theme-importers/loose.js.map +1 -0
  120. package/dist/theme-importers/shadcn.d.ts +24 -0
  121. package/dist/theme-importers/shadcn.d.ts.map +1 -0
  122. package/dist/theme-importers/shadcn.js +135 -0
  123. package/dist/theme-importers/shadcn.js.map +1 -0
  124. package/dist/theme-importers/style-dictionary.d.ts +17 -0
  125. package/dist/theme-importers/style-dictionary.d.ts.map +1 -0
  126. package/dist/theme-importers/style-dictionary.js +125 -0
  127. package/dist/theme-importers/style-dictionary.js.map +1 -0
  128. package/dist/theme-importers/tailwind.d.ts +3 -0
  129. package/dist/theme-importers/tailwind.d.ts.map +1 -0
  130. package/dist/theme-importers/tailwind.js +218 -0
  131. package/dist/theme-importers/tailwind.js.map +1 -0
  132. package/dist/theme-literal-binding.d.ts +37 -0
  133. package/dist/theme-literal-binding.d.ts.map +1 -0
  134. package/dist/theme-literal-binding.js +138 -0
  135. package/dist/theme-literal-binding.js.map +1 -0
  136. package/dist/theme-normalize.d.ts +31 -0
  137. package/dist/theme-normalize.d.ts.map +1 -0
  138. package/dist/theme-normalize.js +587 -0
  139. package/dist/theme-normalize.js.map +1 -0
  140. package/dist/theme-ramp.d.ts +55 -0
  141. package/dist/theme-ramp.d.ts.map +1 -0
  142. package/dist/theme-ramp.js +149 -0
  143. package/dist/theme-ramp.js.map +1 -0
  144. package/dist/theme-render.d.ts +105 -0
  145. package/dist/theme-render.d.ts.map +1 -0
  146. package/dist/theme-render.js +441 -0
  147. package/dist/theme-render.js.map +1 -0
  148. package/dist/themes-errors.d.ts +109 -0
  149. package/dist/themes-errors.d.ts.map +1 -0
  150. package/dist/themes-errors.js +170 -0
  151. package/dist/themes-errors.js.map +1 -0
  152. package/dist/themes.d.ts +343 -0
  153. package/dist/themes.d.ts.map +1 -0
  154. package/dist/themes.js +697 -0
  155. package/dist/themes.js.map +1 -0
  156. package/dist/version.d.ts +7 -4
  157. package/dist/version.d.ts.map +1 -1
  158. package/dist/version.js +6 -3
  159. package/dist/version.js.map +1 -1
  160. package/package.json +10 -2
  161. package/src/__tests__/redos-hardening.test.ts +160 -0
  162. package/src/ai-tools-add-module-modes.test.ts +106 -0
  163. package/src/ai-tools-position.test.ts +134 -0
  164. package/src/ai-tools.test.ts +81 -0
  165. package/src/ai-tools.ts +1179 -0
  166. package/src/auth-forms.ts +36 -0
  167. package/src/base-css.ts +30 -0
  168. package/src/build-page.test.ts +228 -0
  169. package/src/build-page.ts +319 -0
  170. package/src/cap-failures.ts +67 -0
  171. package/src/content.test.ts +170 -0
  172. package/src/content.ts +620 -0
  173. package/src/context.ts +43 -0
  174. package/src/css-gradient-scan.ts +88 -0
  175. package/src/css-var-scan.test.ts +96 -0
  176. package/src/css-var-scan.ts +144 -0
  177. package/src/derive-module-type.test.ts +80 -0
  178. package/src/design-manifest.ts +93 -0
  179. package/src/fonts.test.ts +157 -0
  180. package/src/fonts.ts +296 -0
  181. package/src/genesis-inventory.test.ts +86 -0
  182. package/src/genesis-inventory.ts +215 -0
  183. package/src/genesis-sanitize.test.ts +35 -0
  184. package/src/genesis.ts +87 -0
  185. package/src/i18n.test.ts +274 -0
  186. package/src/i18n.ts +269 -0
  187. package/src/index.test.ts +10 -0
  188. package/src/index.ts +59 -0
  189. package/src/interactions.ts +48 -0
  190. package/src/logger.ts +147 -0
  191. package/src/media.test.ts +160 -0
  192. package/src/media.ts +355 -0
  193. package/src/page-log.test.ts +163 -0
  194. package/src/page-log.ts +124 -0
  195. package/src/preview-compose.test.ts +602 -0
  196. package/src/preview-compose.ts +709 -0
  197. package/src/preview-scanner.test.ts +96 -0
  198. package/src/preview-scanner.ts +214 -0
  199. package/src/proposal-status.test.ts +69 -0
  200. package/src/proposal-status.ts +40 -0
  201. package/src/responsive-images.test.ts +104 -0
  202. package/src/responsive-images.ts +151 -0
  203. package/src/result.ts +29 -0
  204. package/src/safe-keys.ts +21 -0
  205. package/src/seo.test.ts +234 -0
  206. package/src/seo.ts +261 -0
  207. package/src/skills.ts +48 -0
  208. package/src/snapshots.test.ts +80 -0
  209. package/src/snapshots.ts +81 -0
  210. package/src/strip-cdata.test.ts +41 -0
  211. package/src/strip-cdata.ts +50 -0
  212. package/src/structured-sets.ts +180 -0
  213. package/src/subagents.test.ts +262 -0
  214. package/src/subagents.ts +432 -0
  215. package/src/template-engine.test.ts +379 -0
  216. package/src/template-engine.ts +520 -0
  217. package/src/theme-gradient.test.ts +92 -0
  218. package/src/theme-importers/__tests__/proto-pollution.test.ts +54 -0
  219. package/src/theme-importers/auto-detect.ts +84 -0
  220. package/src/theme-importers/css-comments.ts +15 -0
  221. package/src/theme-importers/dtcg.ts +106 -0
  222. package/src/theme-importers/loose.ts +76 -0
  223. package/src/theme-importers/shadcn.ts +133 -0
  224. package/src/theme-importers/style-dictionary.ts +125 -0
  225. package/src/theme-importers/tailwind.ts +217 -0
  226. package/src/theme-literal-binding.test.ts +71 -0
  227. package/src/theme-literal-binding.ts +159 -0
  228. package/src/theme-motion.test.ts +115 -0
  229. package/src/theme-normalize-envelope.test.ts +43 -0
  230. package/src/theme-normalize-gradient.test.ts +135 -0
  231. package/src/theme-normalize.ts +661 -0
  232. package/src/theme-ramp.ts +187 -0
  233. package/src/theme-render-sanitize.test.ts +45 -0
  234. package/src/theme-render.test.ts +119 -0
  235. package/src/theme-render.ts +487 -0
  236. package/src/theme-shadow.test.ts +56 -0
  237. package/src/themes-errors.ts +199 -0
  238. package/src/themes.ts +842 -0
  239. package/src/translation.test.ts +160 -0
  240. package/src/translation.ts +295 -0
  241. package/src/version.ts +66 -0
package/dist/subagents.js CHANGED
@@ -16,12 +16,40 @@
16
16
  * verdict ({pass, issues[], suggestions[]})
17
17
  * tree ({tree: [...], rationale})
18
18
  * freeform ({text})
19
+ * rebuild ({pages[], contentNotes[], skipped[], summary})
19
20
  * - parseSubagentResult — pulls JSON out of the subagent's final
20
21
  * assistant message (handles ```json fences) and validates against
21
22
  * the requested shape.
22
23
  */
23
24
  import { z } from "zod";
24
- const expectedReturnShape = z.enum(["verdict", "tree", "freeform"]);
25
+ const expectedReturnShape = z.enum(["verdict", "tree", "freeform", "rebuild"]);
26
+ /**
27
+ * Run #8 R2a — the SINGLE source of truth for the return-shape enum.
28
+ *
29
+ * The spawn tools' hand-written provider `inputSchema` (JSON Schema) must
30
+ * carry the same enum values as this Zod schema; in run #8 the live
31
+ * validator rejected `"rebuild"` because the runtime resolved a stale
32
+ * pre-#266 build of this module while the provider schema advertised the
33
+ * new value (issue #251 drift class, resolution flavour). Tool files
34
+ * derive their JSON-Schema enums from this array instead of re-typing the
35
+ * literals, and a unit test asserts the tool schema accepts every shape
36
+ * this parser knows.
37
+ */
38
+ export const EXPECTED_RETURN_SHAPES = expectedReturnShape.options;
39
+ /**
40
+ * issue #306 — model tier a subagent runs at. `inherit` (the default) is
41
+ * today's behaviour: the child reuses the parent chat's provider+model.
42
+ * `mid` / `small` route the child onto a cheaper model the Owner mapped
43
+ * in the active provider's config (`ai_providers.config.modelTiers`).
44
+ * The tier VOCABULARY is deliberately abstract — tool results and
45
+ * editor-facing text never name the underlying model (CLAUDE.md §2:
46
+ * provider brand never surfaces in the editor chat UI); concrete model
47
+ * ids appear only on Owner surfaces (security panel, cost dashboard).
48
+ */
49
+ export const subagentModelTier = z.enum(["inherit", "mid", "small"]);
50
+ /** Single source of truth for the tier enum (same #251 drift-guard pattern
51
+ * as EXPECTED_RETURN_SHAPES — tool JSON schemas derive from this array). */
52
+ export const SUBAGENT_MODEL_TIERS = subagentModelTier.options;
25
53
  /**
26
54
  * One subagent spec. The parent supplies role + task + optional
27
55
  * narrowing. The handler creates the ephemeral chat session, appends
@@ -44,10 +72,38 @@ export const subagentSpec = z
44
72
  allowedToolNames: z.array(z.string().min(1).max(120)).optional(),
45
73
  /** Zod-validated return shape. Defaults to `verdict`. */
46
74
  expectedReturnShape: expectedReturnShape.default("verdict"),
47
- /** Per-spawn cost cap; default 50_000_000 microcents = $0.50. */
48
- maxCostMicrocents: z.number().int().nonnegative().default(50_000_000),
49
- /** Per-spawn timeout; default 60s. */
50
- timeoutMs: z.number().int().min(1000).max(600_000).default(60_000),
75
+ /**
76
+ * Per-spawn cost cap in microcents. OPTIONAL on purpose (issue #304):
77
+ * when omitted, the spawn orchestrator derives the cap from the armed
78
+ * run budget (#297) or falls back to SUBAGENT_CHILD_CAP_MICROCENTS.
79
+ * The old schema default (50M µ¢ = $0.50) sat BELOW the empirically
80
+ * observed 90–167M µ¢ per-child spend of migration page batches
81
+ * (runs #14/#15), so every child errored at the cap — a default here
82
+ * would make "AI omitted it" indistinguishable from "AI chose $0.50".
83
+ */
84
+ maxCostMicrocents: z.number().int().nonnegative().optional(),
85
+ /**
86
+ * Per-spawn wall-clock timeout. Default 300s (5 min): the documented
87
+ * fan-out use cases are page BUILDS — a Genesis design draft (full page +
88
+ * image generation) and a migration per-type rebuild each legitimately run
89
+ * 2–4 min. The old 60s default aborted every build child mid-work (Genesis
90
+ * live-run 2026-07: all 3 draft children `timed_out` at ~60000ms, so the
91
+ * flow saved 0 drafts; the abort also skips the child's `ai_calls` write, so
92
+ * the roll-up read `$0.00` — the child WAS building, not idle). Quick
93
+ * reviewer children (qa/legal/menu/categorizer) finish well under this
94
+ * ceiling, so the higher default is harmless for them. The AI can still
95
+ * pass a smaller `timeoutMs` for a known-fast child.
96
+ */
97
+ timeoutMs: z.number().int().min(1000).max(600_000).default(300_000),
98
+ /**
99
+ * issue #306 — model tier for this child. Default `inherit` keeps
100
+ * single-model behaviour byte-identical to pre-#306 (conservative
101
+ * default: nothing changes until a caller opts in per-spawn AND the
102
+ * Owner has mapped the tier). A requested-but-unmapped tier is a
103
+ * LOUD structured error at spawn time — never a silent downgrade to
104
+ * the parent's model (CLAUDE.md §2 no-fallbacks).
105
+ */
106
+ tier: subagentModelTier.default("inherit"),
51
107
  /**
52
108
  * Optional active page id. When passed, the spawn handler routes
53
109
  * it through to the runChatTurn invocation as `activePageId`,
@@ -61,7 +117,13 @@ export const subagentSpec = z
61
117
  export const spawnSubagentToolInput = subagentSpec;
62
118
  export const spawnSubagentsToolInput = z
63
119
  .object({
64
- subagents: z.array(subagentSpec).min(1).max(8),
120
+ // issue #304 — 32 matches the tool's advertised provider-schema
121
+ // maxItems (SUBAGENT_MAX_BATCH default). The previous max(8) silently
122
+ // rejected the very batches the provider schema invited (#251 drift
123
+ // class): a 14-page migration fan-out failed Zod validation at
124
+ // dispatch and fell back to serial building. SUBAGENT_MAX_BATCH must
125
+ // never be env-raised past this hard bound.
126
+ subagents: z.array(subagentSpec).min(1).max(32),
65
127
  })
66
128
  .strict();
67
129
  // ---------------------------------------------------------------------
@@ -87,6 +149,66 @@ export const freeformReturnShape = z
87
149
  text: z.string().min(1).max(40_000),
88
150
  })
89
151
  .strict();
152
+ /**
153
+ * issue #264 — compact per-page rebuild summary for migration fan-out
154
+ * subagents. The orchestrator chat's context grows by THIS shape only
155
+ * (never by the subagent's full transcript), so it is deliberately
156
+ * bounded: per-page status + short notes, deliberate omissions with a
157
+ * reason, and a one-paragraph summary. `pageId`/`slug` are both
158
+ * optional because a subagent that failed before resolving a page can
159
+ * still report the slug it was briefed with (or vice versa).
160
+ */
161
+ export const rebuildReturnShape = z
162
+ .object({
163
+ pages: z
164
+ .array(z
165
+ .object({
166
+ pageId: z.string().uuid().optional(),
167
+ slug: z.string().min(1).max(500).optional(),
168
+ /**
169
+ * issue #306 — `needs_escalation`: the child detected the page
170
+ * needs something it is not equipped to BUILD (no matching
171
+ * module/pattern, a layout decision, unexpected source
172
+ * structure) and hands it back instead of improvising. The
173
+ * orchestrator re-dispatches exactly those pages one capability
174
+ * step up (see subagent-batch.ts escalation waves). The reason
175
+ * lives in `notes` and is REQUIRED for this status — a blind
176
+ * escalation would just re-run the same confusion at higher
177
+ * cost (enforced by the superRefine below).
178
+ */
179
+ status: z.enum(["rebuilt", "skipped", "failed", "needs_escalation"]),
180
+ /** Content-completeness note: what was dropped/merged and why, or
181
+ * why skipped/failed — or, for `needs_escalation`, the REQUIRED
182
+ * reason the page needs a more capable pass. */
183
+ notes: z.string().max(2000).optional(),
184
+ })
185
+ .strict()
186
+ .superRefine((page, ctx) => {
187
+ if (page.status === "needs_escalation" && !page.notes?.trim()) {
188
+ ctx.addIssue({
189
+ code: "custom",
190
+ path: ["notes"],
191
+ message: 'status "needs_escalation" requires `notes` explaining WHAT new thing this page needs (missing pattern, layout decision, unexpected structure) — the escalated pass is briefed from it',
192
+ });
193
+ }
194
+ }))
195
+ .min(1)
196
+ .max(100),
197
+ /** Cross-page content-completeness observations (e.g. "source pricing table had a footnote row I folded into the caption"). */
198
+ contentNotes: z.array(z.string().min(1).max(2000)).max(50).default([]),
199
+ /** Items deliberately left out — the orchestrator relays these verbatim. */
200
+ skipped: z
201
+ .array(z
202
+ .object({
203
+ item: z.string().min(1).max(500),
204
+ reason: z.string().min(1).max(1000),
205
+ })
206
+ .strict())
207
+ .max(100)
208
+ .default([]),
209
+ summary: z.string().max(4000).default(""),
210
+ })
211
+ .strict();
90
212
  // ---------------------------------------------------------------------
91
213
  // Result parser — handles `````json {…} ````` fences + raw JSON.
92
214
  // ---------------------------------------------------------------------
@@ -136,6 +258,97 @@ function stripFences(text) {
136
258
  }
137
259
  return trimmed;
138
260
  }
261
+ /**
262
+ * Run #10 D2 — validate an ALREADY-PARSED value against the requested
263
+ * return shape. This is the structured half of the result channel: the
264
+ * `submit_result` tool hands the payload straight from the tool-call
265
+ * arguments (already JSON — no fence-stripping, no brace-balancing),
266
+ * so the "response is not valid JSON" failure class cannot occur.
267
+ * `parseSubagentResult` (final-text fallback) delegates here after its
268
+ * JSON extraction.
269
+ *
270
+ * For `freeform`, accepts `{text: "..."}` OR a bare string (wrapped as
271
+ * `{text}`) so the model can pass its prose directly.
272
+ */
273
+ export function validateSubagentResultValue(value, shape) {
274
+ // Defense-in-depth for the structured shapes: a provider can
275
+ // double-encode the payload so `value` arrives as a JSON string even
276
+ // after the `submit_result` inputSchema fix (and the final-text
277
+ // fallback path never passes through normalize-args at all). The
278
+ // structured shapes want an object/array, so decode a JSON-looking
279
+ // string before parsing. `freeform` legitimately wants a bare string,
280
+ // so it is left untouched.
281
+ let coerced = value;
282
+ if (shape !== "freeform" && typeof coerced === "string") {
283
+ const trimmed = coerced.trim();
284
+ if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
285
+ try {
286
+ coerced = JSON.parse(trimmed);
287
+ }
288
+ catch {
289
+ // leave as-is; the shape parse below reports the real mismatch
290
+ }
291
+ }
292
+ }
293
+ // v0.2.67 — when the schema rejects, include the actual top-level
294
+ // keys the subagent returned so the parent AI can tell whether the
295
+ // subagent ignored the schema entirely (returned freeform text under
296
+ // a different shape) vs. got close but mistyped a single field.
297
+ const observedKeys = typeof coerced === "object" && coerced !== null && !Array.isArray(coerced)
298
+ ? Object.keys(coerced)
299
+ : [];
300
+ const observedSummary = observedKeys.length > 0
301
+ ? ` got keys: [${observedKeys.slice(0, 8).join(", ")}]`
302
+ : ` got: ${typeof coerced} (${Array.isArray(coerced) ? "array" : "scalar"})`;
303
+ const issueSummary = (issues) => issues
304
+ .slice(0, 3)
305
+ .map((i) => `${i.path.join(".") || "<root>"}: ${i.message}`)
306
+ .join("; ");
307
+ if (shape === "freeform") {
308
+ if (typeof value === "string") {
309
+ if (value.trim().length === 0)
310
+ return { ok: false, error: "subagent returned empty text" };
311
+ return { ok: true, shape: "freeform", value: { text: value.trim() } };
312
+ }
313
+ const validated = freeformReturnShape.safeParse(value);
314
+ if (!validated.success) {
315
+ return {
316
+ ok: false,
317
+ error: `freeform shape mismatch (expected {text: string} or a plain string):${observedSummary}; ${issueSummary(validated.error.issues)}`,
318
+ };
319
+ }
320
+ return { ok: true, shape: "freeform", value: validated.data };
321
+ }
322
+ if (shape === "verdict") {
323
+ const validated = verdictReturnShape.safeParse(coerced);
324
+ if (!validated.success) {
325
+ return {
326
+ ok: false,
327
+ error: `verdict shape mismatch (expected {pass: boolean, issues: array, suggestions?: array}):${observedSummary}; ${issueSummary(validated.error.issues)}`,
328
+ };
329
+ }
330
+ return { ok: true, shape: "verdict", value: validated.data };
331
+ }
332
+ if (shape === "rebuild") {
333
+ const validated = rebuildReturnShape.safeParse(coerced);
334
+ if (!validated.success) {
335
+ return {
336
+ ok: false,
337
+ error: `rebuild shape mismatch (expected {pages: [{pageId?, slug?, status: "rebuilt"|"skipped"|"failed"|"needs_escalation", notes?}], contentNotes?: string[], skipped?: [{item, reason}], summary?: string}):${observedSummary}; ${issueSummary(validated.error.issues)}`,
338
+ };
339
+ }
340
+ return { ok: true, shape: "rebuild", value: validated.data };
341
+ }
342
+ // tree
343
+ const validated = treeReturnShape.safeParse(coerced);
344
+ if (!validated.success) {
345
+ return {
346
+ ok: false,
347
+ error: `tree shape mismatch (expected {tree: array, rationale?: string}):${observedSummary}; ${issueSummary(validated.error.issues)}`,
348
+ };
349
+ }
350
+ return { ok: true, shape: "tree", value: validated.data };
351
+ }
139
352
  /**
140
353
  * Pull JSON out of the subagent's final assistant text and validate
141
354
  * against the requested shape. On schema mismatch, returns
@@ -144,6 +357,10 @@ function stripFences(text) {
144
357
  * For `freeform`, accepts EITHER `{text: "..."}` JSON or raw text;
145
358
  * raw text is wrapped as `{text: rawText}` so the caller always gets
146
359
  * the same shape.
360
+ *
361
+ * Run #10 D2 — this is now the FALLBACK channel; the canonical path is
362
+ * the child calling `submit_result`, whose payload is validated by
363
+ * `validateSubagentResultValue` without any text extraction.
147
364
  */
148
365
  export function parseSubagentResult(text, shape) {
149
366
  if (shape === "freeform") {
@@ -173,40 +390,6 @@ export function parseSubagentResult(text, shape) {
173
390
  error: `subagent response is not valid JSON: ${e.message}; first 200 chars: ${stripped.slice(0, 200)}`,
174
391
  };
175
392
  }
176
- // v0.2.67 — when the schema rejects, include the actual top-level
177
- // keys the subagent returned so the parent AI can tell whether the
178
- // subagent ignored the schema entirely (returned freeform text under
179
- // a different shape) vs. got close but mistyped a single field.
180
- const observedKeys = typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)
181
- ? Object.keys(parsed)
182
- : [];
183
- const observedSummary = observedKeys.length > 0
184
- ? ` got keys: [${observedKeys.slice(0, 8).join(", ")}]`
185
- : ` got: ${typeof parsed} (${Array.isArray(parsed) ? "array" : "scalar"})`;
186
- if (shape === "verdict") {
187
- const validated = verdictReturnShape.safeParse(parsed);
188
- if (!validated.success) {
189
- return {
190
- ok: false,
191
- error: `verdict shape mismatch (expected {pass: boolean, issues: array, suggestions?: array}):${observedSummary}; ${validated.error.issues
192
- .slice(0, 3)
193
- .map((i) => `${i.path.join(".") || "<root>"}: ${i.message}`)
194
- .join("; ")}`,
195
- };
196
- }
197
- return { ok: true, shape: "verdict", value: validated.data };
198
- }
199
- // tree
200
- const validated = treeReturnShape.safeParse(parsed);
201
- if (!validated.success) {
202
- return {
203
- ok: false,
204
- error: `tree shape mismatch (expected {tree: array, rationale?: string}):${observedSummary}; ${validated.error.issues
205
- .slice(0, 3)
206
- .map((i) => `${i.path.join(".") || "<root>"}: ${i.message}`)
207
- .join("; ")}`,
208
- };
209
- }
210
- return { ok: true, shape: "tree", value: validated.data };
393
+ return validateSubagentResultValue(parsed, shape);
211
394
  }
212
395
  //# sourceMappingURL=subagents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subagents.js","sourceRoot":"","sources":["../src/subagents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subagents.js","sourceRoot":"","sources":["../src/subagents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ import { type ModuleFieldKind } from "./content.js";
2
+ /**
3
+ * Subset of `modules.fields[]` the engine cares about. The full
4
+ * schema lives in `content.ts`; the engine only needs `name`, `kind`,
5
+ * and the optional `default`. Importers pass the full row through.
6
+ */
7
+ export interface TemplateField {
8
+ readonly name: string;
9
+ readonly kind: ModuleFieldKind;
10
+ readonly default?: unknown;
11
+ }
12
+ export interface RenderTemplateInput {
13
+ readonly html: string;
14
+ readonly fields: readonly TemplateField[];
15
+ /** Per-placement values from `content_instances.values`. */
16
+ readonly contentValues?: Readonly<Record<string, unknown>>;
17
+ /**
18
+ * Pre-rendered nested-module HTML keyed by:
19
+ * - `<name>` for single `{{>name}}` (module field kind)
20
+ * - `<name>__<index>` for each `{{#name}}` element (module-list)
21
+ * Compose path: empty map (no DB → loud HTML comments emit).
22
+ * Preview-render path: built from RenderResolver walks.
23
+ */
24
+ readonly partials?: Readonly<Record<string, string>>;
25
+ /**
26
+ * v0.11.1 (issue #76) — active theme's resolved asset URLs. When
27
+ * present, `{{theme_logo_url}}` / `{{theme_logo_dark_url}}` /
28
+ * `{{theme_favicon_url}}` / `{{theme_social_share_url}}` substitute
29
+ * to the asset URL string. Unbound slots (null/absent) follow the
30
+ * existing loud-raw invariant (CLAUDE.md §2): the `{{…}}` stays in
31
+ * the output verbatim AND `theme-asset-unbound:<slot>` lands in
32
+ * `missingSlots`. Per-placement `contentValues` still take
33
+ * precedence so an operator can override on a single module.
34
+ */
35
+ readonly themeAssets?: {
36
+ readonly logo: string | null;
37
+ readonly logoDark: string | null;
38
+ readonly favicon: string | null;
39
+ readonly socialShare: string | null;
40
+ };
41
+ }
42
+ export interface RenderTemplateOutput {
43
+ readonly html: string;
44
+ /** Structured failure channel — see file-level comment for the markers. */
45
+ readonly missingSlots: readonly string[];
46
+ }
47
+ /**
48
+ * Render a `caelo:missing` HTML comment carrying a failure reason.
49
+ * The shape (`<!-- caelo:missing reason=<…> -->`) is part of the
50
+ * public failure-marker contract — the chat-runner diag pass reads
51
+ * the comment text out of rendered HTML, and the editor's missing-
52
+ * content surface highlights it for the operator. Exported so the
53
+ * DB-aware preview-render path (`packages/admin-core/src/ops/content/
54
+ * preview-render.ts`) emits the exact same shape without redeclaring.
55
+ */
56
+ export declare function caeloMissingComment(reason: string): string;
57
+ /**
58
+ * Render `html` against `contentValues` + `fields` + `partials`,
59
+ * returning the substituted HTML plus a structured `missingSlots`
60
+ * channel. Pure / sync / no IO.
61
+ *
62
+ * @example
63
+ * // AC #1 fixture (issue #71). Iterates a link-list field per element.
64
+ * renderTemplate({
65
+ * html: '<nav>{{#nav_items}}<a href="{{href}}">{{label}}</a>{{/nav_items}}</nav>',
66
+ * fields: [{ name: 'nav_items', kind: 'link-list' }],
67
+ * contentValues: {
68
+ * nav_items: [
69
+ * { label: 'Docs', href: '/docs' },
70
+ * { label: 'Blog', href: '/blog' },
71
+ * ],
72
+ * },
73
+ * });
74
+ * // → {
75
+ * // html: '<nav><a href="/docs">Docs</a><a href="/blog">Blog</a></nav>',
76
+ * // missingSlots: [],
77
+ * // }
78
+ *
79
+ * @see {@link TemplateField} for the field shape (name + kind + optional default).
80
+ * @see {@link ./content.js#MODULE_FIELD_KINDS} for the canonical kind union.
81
+ * @see {@link ./content.js#MODULE_FIELD_SECTION_KINDS} for the kinds the engine
82
+ * iterates via `{{#name}}` (text-list / link-list / module-list).
83
+ */
84
+ export declare function renderTemplate(input: RenderTemplateInput): RenderTemplateOutput;
85
+ //# sourceMappingURL=template-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-engine.d.ts","sourceRoot":"","sources":["../src/template-engine.ts"],"names":[],"mappings":"AA8DA,OAAO,EAA8B,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAShF;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;IAC1C,4DAA4D;IAC5D,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD;;;;;;;;;OASG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE;QACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KACrC,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAsDD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CA+G/E"}