@kywi-software/core 0.15.0 → 0.15.2

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 (265) hide show
  1. package/AGENT-PATTERNS.md +51 -1
  2. package/dist/admin/audience-editor.d.ts +2 -0
  3. package/dist/admin/audience-editor.d.ts.map +1 -1
  4. package/dist/admin/audience-editor.js +4 -2
  5. package/dist/admin/audience-editor.js.map +1 -1
  6. package/dist/admin/condition-builder.d.ts.map +1 -1
  7. package/dist/admin/condition-builder.js +16 -3
  8. package/dist/admin/condition-builder.js.map +1 -1
  9. package/dist/admin/rule-tester.d.ts +1 -0
  10. package/dist/admin/rule-tester.d.ts.map +1 -1
  11. package/dist/admin/rule-tester.js +7 -4
  12. package/dist/admin/rule-tester.js.map +1 -1
  13. package/dist/admin/signal-options.d.ts +17 -0
  14. package/dist/admin/signal-options.d.ts.map +1 -1
  15. package/dist/admin/signal-options.js +28 -0
  16. package/dist/admin/signal-options.js.map +1 -1
  17. package/dist/admin/surfaces/audiences/audiences-data.d.ts +5 -0
  18. package/dist/admin/surfaces/audiences/audiences-data.d.ts.map +1 -1
  19. package/dist/admin/surfaces/audiences/audiences-data.js +3 -0
  20. package/dist/admin/surfaces/audiences/audiences-data.js.map +1 -1
  21. package/dist/admin/surfaces/feeds/feeds-data.d.ts +8 -1
  22. package/dist/admin/surfaces/feeds/feeds-data.d.ts.map +1 -1
  23. package/dist/admin/surfaces/feeds/feeds-data.js +39 -22
  24. package/dist/admin/surfaces/feeds/feeds-data.js.map +1 -1
  25. package/dist/api/api-key-routes.js +2 -2
  26. package/dist/api/api-key-routes.js.map +1 -1
  27. package/dist/api/audience-routes.d.ts.map +1 -1
  28. package/dist/api/audience-routes.js +10 -4
  29. package/dist/api/audience-routes.js.map +1 -1
  30. package/dist/api/audience-runtime-routes.d.ts +17 -0
  31. package/dist/api/audience-runtime-routes.d.ts.map +1 -1
  32. package/dist/api/audience-runtime-routes.js +474 -23
  33. package/dist/api/audience-runtime-routes.js.map +1 -1
  34. package/dist/api/ax-routes.d.ts.map +1 -1
  35. package/dist/api/ax-routes.js +7 -3
  36. package/dist/api/ax-routes.js.map +1 -1
  37. package/dist/api/category-routes.js +3 -3
  38. package/dist/api/category-routes.js.map +1 -1
  39. package/dist/api/changeset-routes.js +2 -2
  40. package/dist/api/changeset-routes.js.map +1 -1
  41. package/dist/api/comment-routes.js +4 -4
  42. package/dist/api/comment-routes.js.map +1 -1
  43. package/dist/api/component-routes.js +3 -3
  44. package/dist/api/component-routes.js.map +1 -1
  45. package/dist/api/config-routes.js +4 -4
  46. package/dist/api/config-routes.js.map +1 -1
  47. package/dist/api/content-permission-routes.js +2 -2
  48. package/dist/api/content-permission-routes.js.map +1 -1
  49. package/dist/api/content-routes.d.ts.map +1 -1
  50. package/dist/api/content-routes.js +8 -3
  51. package/dist/api/content-routes.js.map +1 -1
  52. package/dist/api/content-type-routes.js +3 -3
  53. package/dist/api/content-type-routes.js.map +1 -1
  54. package/dist/api/experiment-routes.js +2 -2
  55. package/dist/api/experiment-routes.js.map +1 -1
  56. package/dist/api/extension-routes.js +4 -4
  57. package/dist/api/extension-routes.js.map +1 -1
  58. package/dist/api/feed-routes.d.ts.map +1 -1
  59. package/dist/api/feed-routes.js +51 -4
  60. package/dist/api/feed-routes.js.map +1 -1
  61. package/dist/api/form-routes.js +2 -2
  62. package/dist/api/form-routes.js.map +1 -1
  63. package/dist/api/group-routes.js +3 -3
  64. package/dist/api/group-routes.js.map +1 -1
  65. package/dist/api/index.d.ts.map +1 -1
  66. package/dist/api/index.js +15 -4
  67. package/dist/api/index.js.map +1 -1
  68. package/dist/api/layout-routes.d.ts +19 -1
  69. package/dist/api/layout-routes.d.ts.map +1 -1
  70. package/dist/api/layout-routes.js +65 -5
  71. package/dist/api/layout-routes.js.map +1 -1
  72. package/dist/api/layout-write-guard.d.ts +3 -2
  73. package/dist/api/layout-write-guard.d.ts.map +1 -1
  74. package/dist/api/layout-write-guard.js +12 -4
  75. package/dist/api/layout-write-guard.js.map +1 -1
  76. package/dist/api/media-routes.d.ts.map +1 -1
  77. package/dist/api/media-routes.js +50 -9
  78. package/dist/api/media-routes.js.map +1 -1
  79. package/dist/api/menu-routes.js +2 -2
  80. package/dist/api/menu-routes.js.map +1 -1
  81. package/dist/api/nav-routes.js +3 -3
  82. package/dist/api/nav-routes.js.map +1 -1
  83. package/dist/api/oauth-routes.js +2 -2
  84. package/dist/api/oauth-routes.js.map +1 -1
  85. package/dist/api/openapi.d.ts.map +1 -1
  86. package/dist/api/openapi.js +14 -1
  87. package/dist/api/openapi.js.map +1 -1
  88. package/dist/api/pagination.d.ts +10 -0
  89. package/dist/api/pagination.d.ts.map +1 -1
  90. package/dist/api/pagination.js +7 -1
  91. package/dist/api/pagination.js.map +1 -1
  92. package/dist/api/response.d.ts +29 -0
  93. package/dist/api/response.d.ts.map +1 -1
  94. package/dist/api/response.js +23 -3
  95. package/dist/api/response.js.map +1 -1
  96. package/dist/api/search-routes.d.ts.map +1 -1
  97. package/dist/api/search-routes.js +17 -3
  98. package/dist/api/search-routes.js.map +1 -1
  99. package/dist/api/section-template-routes.js +2 -2
  100. package/dist/api/section-template-routes.js.map +1 -1
  101. package/dist/api/site-routes.js +2 -2
  102. package/dist/api/site-routes.js.map +1 -1
  103. package/dist/api/tag-routes.d.ts.map +1 -1
  104. package/dist/api/tag-routes.js +2 -2
  105. package/dist/api/tag-routes.js.map +1 -1
  106. package/dist/api/user-routes.js +2 -2
  107. package/dist/api/user-routes.js.map +1 -1
  108. package/dist/api/version-routes.js +2 -2
  109. package/dist/api/version-routes.js.map +1 -1
  110. package/dist/api/webhook-routes.js +3 -3
  111. package/dist/api/webhook-routes.js.map +1 -1
  112. package/dist/api/workflow-routes.d.ts.map +1 -1
  113. package/dist/api/workflow-routes.js +15 -6
  114. package/dist/api/workflow-routes.js.map +1 -1
  115. package/dist/audiences/collectors/index.d.ts +8 -4
  116. package/dist/audiences/collectors/index.d.ts.map +1 -1
  117. package/dist/audiences/collectors/index.js +17 -4
  118. package/dist/audiences/collectors/index.js.map +1 -1
  119. package/dist/audiences/collectors/selfid.d.ts +25 -0
  120. package/dist/audiences/collectors/selfid.d.ts.map +1 -0
  121. package/dist/audiences/collectors/selfid.js +46 -0
  122. package/dist/audiences/collectors/selfid.js.map +1 -0
  123. package/dist/audiences/collectors/session.d.ts +41 -0
  124. package/dist/audiences/collectors/session.d.ts.map +1 -0
  125. package/dist/audiences/collectors/session.js +50 -0
  126. package/dist/audiences/collectors/session.js.map +1 -0
  127. package/dist/audiences/consent-config.d.ts +12 -0
  128. package/dist/audiences/consent-config.d.ts.map +1 -1
  129. package/dist/audiences/consent-config.js +16 -0
  130. package/dist/audiences/consent-config.js.map +1 -1
  131. package/dist/audiences/consent-startup.d.ts +7 -0
  132. package/dist/audiences/consent-startup.d.ts.map +1 -1
  133. package/dist/audiences/consent-startup.js +9 -2
  134. package/dist/audiences/consent-startup.js.map +1 -1
  135. package/dist/audiences/consent.d.ts +13 -0
  136. package/dist/audiences/consent.d.ts.map +1 -1
  137. package/dist/audiences/consent.js +13 -0
  138. package/dist/audiences/consent.js.map +1 -1
  139. package/dist/audiences/cookies.d.ts +21 -0
  140. package/dist/audiences/cookies.d.ts.map +1 -1
  141. package/dist/audiences/cookies.js +26 -0
  142. package/dist/audiences/cookies.js.map +1 -1
  143. package/dist/audiences/engine.d.ts.map +1 -1
  144. package/dist/audiences/engine.js +1 -0
  145. package/dist/audiences/engine.js.map +1 -1
  146. package/dist/audiences/entry-page.d.ts +89 -0
  147. package/dist/audiences/entry-page.d.ts.map +1 -0
  148. package/dist/audiences/entry-page.js +116 -0
  149. package/dist/audiences/entry-page.js.map +1 -0
  150. package/dist/audiences/evaluator/instant-match.d.ts.map +1 -1
  151. package/dist/audiences/evaluator/instant-match.js +7 -0
  152. package/dist/audiences/evaluator/instant-match.js.map +1 -1
  153. package/dist/audiences/index.d.ts +3 -2
  154. package/dist/audiences/index.d.ts.map +1 -1
  155. package/dist/audiences/index.js +6 -2
  156. package/dist/audiences/index.js.map +1 -1
  157. package/dist/audiences/queries.d.ts +16 -0
  158. package/dist/audiences/queries.d.ts.map +1 -1
  159. package/dist/audiences/queries.js +28 -1
  160. package/dist/audiences/queries.js.map +1 -1
  161. package/dist/audiences/schema.d.ts +17 -0
  162. package/dist/audiences/schema.d.ts.map +1 -1
  163. package/dist/audiences/schema.js +7 -0
  164. package/dist/audiences/schema.js.map +1 -1
  165. package/dist/audiences/server-eval.d.ts +19 -0
  166. package/dist/audiences/server-eval.d.ts.map +1 -1
  167. package/dist/audiences/server-eval.js +17 -1
  168. package/dist/audiences/server-eval.js.map +1 -1
  169. package/dist/audiences/types.d.ts +22 -1
  170. package/dist/audiences/types.d.ts.map +1 -1
  171. package/dist/audiences/types.js +1 -0
  172. package/dist/audiences/types.js.map +1 -1
  173. package/dist/ax/content-source.d.ts +10 -2
  174. package/dist/ax/content-source.d.ts.map +1 -1
  175. package/dist/ax/content-source.js +81 -5
  176. package/dist/ax/content-source.js.map +1 -1
  177. package/dist/ax/effective-body.d.ts +28 -0
  178. package/dist/ax/effective-body.d.ts.map +1 -0
  179. package/dist/ax/effective-body.js +47 -0
  180. package/dist/ax/effective-body.js.map +1 -0
  181. package/dist/ax/index.d.ts +3 -1
  182. package/dist/ax/index.d.ts.map +1 -1
  183. package/dist/ax/index.js +2 -0
  184. package/dist/ax/index.js.map +1 -1
  185. package/dist/ax/jsonld.d.ts +31 -1
  186. package/dist/ax/jsonld.d.ts.map +1 -1
  187. package/dist/ax/jsonld.js +35 -22
  188. package/dist/ax/jsonld.js.map +1 -1
  189. package/dist/ax/layout-to-html.d.ts +127 -0
  190. package/dist/ax/layout-to-html.d.ts.map +1 -0
  191. package/dist/ax/layout-to-html.js +545 -0
  192. package/dist/ax/layout-to-html.js.map +1 -0
  193. package/dist/ax/llms-full-txt.d.ts +3 -1
  194. package/dist/ax/llms-full-txt.d.ts.map +1 -1
  195. package/dist/ax/llms-full-txt.js +5 -2
  196. package/dist/ax/llms-full-txt.js.map +1 -1
  197. package/dist/ax/page-markdown.d.ts +10 -2
  198. package/dist/ax/page-markdown.d.ts.map +1 -1
  199. package/dist/ax/page-markdown.js +16 -3
  200. package/dist/ax/page-markdown.js.map +1 -1
  201. package/dist/ax/summary.d.ts +4 -0
  202. package/dist/ax/summary.d.ts.map +1 -1
  203. package/dist/ax/summary.js +6 -1
  204. package/dist/ax/summary.js.map +1 -1
  205. package/dist/ax/types.d.ts +24 -0
  206. package/dist/ax/types.d.ts.map +1 -1
  207. package/dist/cache/content-invalidation.d.ts.map +1 -1
  208. package/dist/cache/content-invalidation.js +11 -0
  209. package/dist/cache/content-invalidation.js.map +1 -1
  210. package/dist/config/types.d.ts +16 -0
  211. package/dist/config/types.d.ts.map +1 -1
  212. package/dist/config/types.js.map +1 -1
  213. package/dist/db/apply-snapshot.d.ts +7 -0
  214. package/dist/db/apply-snapshot.d.ts.map +1 -1
  215. package/dist/db/apply-snapshot.js +7 -0
  216. package/dist/db/apply-snapshot.js.map +1 -1
  217. package/dist/db/ax-queries.d.ts +6 -0
  218. package/dist/db/ax-queries.d.ts.map +1 -1
  219. package/dist/db/ax-queries.js +6 -0
  220. package/dist/db/ax-queries.js.map +1 -1
  221. package/dist/db/content-queries.d.ts.map +1 -1
  222. package/dist/db/content-queries.js +8 -0
  223. package/dist/db/content-queries.js.map +1 -1
  224. package/dist/db/layout-queries.d.ts +19 -2
  225. package/dist/db/layout-queries.d.ts.map +1 -1
  226. package/dist/db/layout-queries.js +11 -3
  227. package/dist/db/layout-queries.js.map +1 -1
  228. package/dist/db/search-queries.d.ts.map +1 -1
  229. package/dist/db/search-queries.js +24 -1
  230. package/dist/db/search-queries.js.map +1 -1
  231. package/dist/hooks/ax-invalidation.d.ts.map +1 -1
  232. package/dist/hooks/ax-invalidation.js +4 -0
  233. package/dist/hooks/ax-invalidation.js.map +1 -1
  234. package/dist/layout/index.d.ts +3 -1
  235. package/dist/layout/index.d.ts.map +1 -1
  236. package/dist/layout/index.js +3 -1
  237. package/dist/layout/index.js.map +1 -1
  238. package/dist/layout/module-permissions.d.ts.map +1 -1
  239. package/dist/layout/module-permissions.js +2 -38
  240. package/dist/layout/module-permissions.js.map +1 -1
  241. package/dist/layout/seed-defaults.d.ts +45 -0
  242. package/dist/layout/seed-defaults.d.ts.map +1 -0
  243. package/dist/layout/seed-defaults.js +75 -0
  244. package/dist/layout/seed-defaults.js.map +1 -0
  245. package/dist/layout/walk.d.ts +14 -0
  246. package/dist/layout/walk.d.ts.map +1 -0
  247. package/dist/layout/walk.js +49 -0
  248. package/dist/layout/walk.js.map +1 -0
  249. package/dist/media/index.d.ts +1 -1
  250. package/dist/media/index.d.ts.map +1 -1
  251. package/dist/media/index.js +1 -1
  252. package/dist/media/index.js.map +1 -1
  253. package/dist/media/upload-allowlist.d.ts +23 -0
  254. package/dist/media/upload-allowlist.d.ts.map +1 -1
  255. package/dist/media/upload-allowlist.js +29 -0
  256. package/dist/media/upload-allowlist.js.map +1 -1
  257. package/dist/schema/mysql-tables.d.ts +17 -0
  258. package/dist/schema/mysql-tables.d.ts.map +1 -1
  259. package/dist/schema/mysql-tables.js +2 -0
  260. package/dist/schema/mysql-tables.js.map +1 -1
  261. package/dist/scope/jsonld.d.ts +18 -3
  262. package/dist/scope/jsonld.d.ts.map +1 -1
  263. package/dist/scope/jsonld.js +6 -4
  264. package/dist/scope/jsonld.js.map +1 -1
  265. package/package.json +6 -1
@@ -0,0 +1,545 @@
1
+ import { sanitizeHtml } from '../util/sanitize.js';
2
+ import { createModuleRegistry } from '../layout/registry.js';
3
+ import { resolveComponentPlacements } from '../layout/component-refs.js';
4
+ import { isModuleVariantContainer } from '../layout/types.js';
5
+ import { selectVariantArm } from '../layout/variant-selection.js';
6
+ /**
7
+ * Serialize a stored layout document to semantic HTML in reading order.
8
+ * Returns `''` for a null/empty/unrecognizable document.
9
+ */
10
+ export function layoutToHtml(layout, opts = {}) {
11
+ const doc = asLayoutDocument(layout);
12
+ if (!doc)
13
+ return '';
14
+ const resolver = opts.resolveComponent;
15
+ // Pre-resolve linked placements exactly as the renderer does, so the
16
+ // projection reads the definition rather than a placement's fallback copy.
17
+ // A malformed subtree (or a resolver that throws) degrades to the UNRESOLVED
18
+ // document rather than to no output at all — the inline fallback copy a
19
+ // placement carries is still the page's copy.
20
+ let resolved = doc;
21
+ if (resolver) {
22
+ try {
23
+ resolved = resolveComponentPlacements(doc, (componentId) => resolver({ componentId }));
24
+ }
25
+ catch {
26
+ resolved = doc;
27
+ }
28
+ }
29
+ const ctx = {
30
+ registry: opts.modules ?? builtInRegistry(),
31
+ ...(resolver ? { resolveComponent: resolver } : {}),
32
+ visitedComponents: new Set(),
33
+ depth: 0,
34
+ };
35
+ const sink = createSink();
36
+ if (isRecord(resolved.regions)) {
37
+ for (const nodes of Object.values(resolved.regions)) {
38
+ for (const node of asArray(nodes))
39
+ emitRegionNode(node, ctx, sink);
40
+ }
41
+ }
42
+ return sink.blocks.join('\n');
43
+ }
44
+ // ─── Output sink (the budget lives here) ─────────────────────────────────────
45
+ /**
46
+ * Total characters one projection may emit. Generous for any real page (a long
47
+ * article body is a few tens of KB) and small enough that a pathological
48
+ * document — a deep diamond of components, a machine-generated layout — cannot
49
+ * turn one uncached `/search` hit into a memory event.
50
+ */
51
+ const MAX_OUTPUT_CHARS = 262_144;
52
+ function createSink() {
53
+ const blocks = [];
54
+ let used = 0;
55
+ return {
56
+ blocks,
57
+ push(html) {
58
+ if (used >= MAX_OUTPUT_CHARS)
59
+ return;
60
+ blocks.push(html);
61
+ used += html.length + 1;
62
+ },
63
+ full() {
64
+ return used >= MAX_OUTPUT_CHARS;
65
+ },
66
+ };
67
+ }
68
+ // ─── Walking ──────────────────────────────────────────────────────────────────
69
+ /** How many component expansions may nest before the walk gives up. */
70
+ const MAX_COMPONENT_DEPTH = 10;
71
+ function emitRegionNode(node, ctx, out) {
72
+ if (!isRecord(node) || out.full())
73
+ return;
74
+ if (node.type === 'section') {
75
+ emitSection(node, ctx, out);
76
+ return;
77
+ }
78
+ if (node.type === 'variantContainer') {
79
+ for (const section of servedSections(node)) {
80
+ emitSection(section, ctx, out);
81
+ }
82
+ }
83
+ }
84
+ /**
85
+ * The sections a section-level container serves an anonymous visitor: the
86
+ * locked winner's arm for an `ab_test`, otherwise Default. `selectVariantArm` is
87
+ * the renderer's own precedence — one implementation, so the corpus and the page
88
+ * cannot disagree about which arm is public.
89
+ */
90
+ function servedSections(container) {
91
+ const arms = asArray(container.variants);
92
+ const arm = selectVariantArm(arms, container, null);
93
+ return arm ? asArray(arm.sections) : asArray(container.defaultSections);
94
+ }
95
+ /** {@link servedSections} for a MODULE-level container: one module, not sections. */
96
+ function servedModule(container) {
97
+ const arms = asArray(container.variants);
98
+ const arm = selectVariantArm(arms, container, null);
99
+ return arm ? arm.module : container.defaultModule;
100
+ }
101
+ function emitSection(section, ctx, out) {
102
+ if (!isRecord(section) || out.full())
103
+ return;
104
+ for (const column of asArray(section.columns)) {
105
+ if (!isRecord(column))
106
+ continue;
107
+ for (const node of asArray(column['nodes']))
108
+ emitColumnNode(node, ctx, out);
109
+ }
110
+ }
111
+ function emitColumnNode(node, ctx, out) {
112
+ if (!isRecord(node) || out.full())
113
+ return;
114
+ if (isModuleVariantContainer(node)) {
115
+ emitModule(servedModule(node), ctx, out);
116
+ return;
117
+ }
118
+ emitModule(node, ctx, out);
119
+ }
120
+ function emitModule(node, ctx, out) {
121
+ if (!isRecord(node) || typeof node.type !== 'string' || out.full())
122
+ return;
123
+ const props = isRecord(node.props) ? node.props : {};
124
+ if (node.type === 'component') {
125
+ emitComponentPlacement(props, ctx, out);
126
+ return;
127
+ }
128
+ emitModuleOfType(node.type, props, ctx, out);
129
+ }
130
+ function emitModuleOfType(type, props, ctx, out) {
131
+ const entry = ctx.registry.get(type);
132
+ // A host that OVERRIDES a built-in name owns its prop shape, so the built-in
133
+ // emitter would be reading props that no longer exist. Its declared schema is
134
+ // the only trustworthy description of it.
135
+ //
136
+ // This runs BEFORE the skip list on purpose: the skip list describes KYWI's
137
+ // built-ins, and a host that registers its own `video` (with a transcript) or
138
+ // `carousel` (with slide copy) under that name has authored real content the
139
+ // built-in never carried.
140
+ if (entry && !entry.isBuiltIn) {
141
+ emitFromPropSchema(entry.props, props, out);
142
+ return;
143
+ }
144
+ if (SKIPPED_MODULES.has(type))
145
+ return;
146
+ const emitter = BUILT_IN_EMITTERS[type];
147
+ if (emitter) {
148
+ emitter(props, out);
149
+ return;
150
+ }
151
+ // Unregistered → skip silently. Registered but with no emitter (a built-in
152
+ // that carries copy in plain props) → read its schema.
153
+ if (entry)
154
+ emitFromPropSchema(entry.props, props, out);
155
+ }
156
+ /**
157
+ * A `component` MODULE placement (the "Saved → Component" palette entry), whose
158
+ * target lives in `props`, not in a node-level `componentId`.
159
+ */
160
+ function emitComponentPlacement(props, ctx, out) {
161
+ // A host that already hydrated the placement wins: that HTML is what rendered.
162
+ const content = str(props['content']);
163
+ if (content) {
164
+ pushHtml(content, out);
165
+ return;
166
+ }
167
+ const resolve = ctx.resolveComponent;
168
+ if (!resolve)
169
+ return;
170
+ const componentId = str(props['componentId']);
171
+ const slug = str(props['slug']);
172
+ if (!componentId && !slug)
173
+ return;
174
+ const key = componentId || `slug:${slug}`;
175
+ // The visited set catches a definition that points back at ITSELF; the depth
176
+ // cap catches a chain that never repeats a key (A→B→C→…), which a visited set
177
+ // alone cannot bound.
178
+ if (ctx.visitedComponents.has(key) || ctx.depth >= MAX_COMPONENT_DEPTH)
179
+ return;
180
+ ctx.visitedComponents.add(key);
181
+ ctx.depth += 1;
182
+ try {
183
+ const source = resolve({
184
+ ...(componentId ? { componentId } : {}),
185
+ ...(slug ? { slug } : {}),
186
+ });
187
+ if (!source)
188
+ return;
189
+ emitComponentSource(source, ctx, out);
190
+ }
191
+ finally {
192
+ ctx.depth -= 1;
193
+ ctx.visitedComponents.delete(key);
194
+ }
195
+ }
196
+ function emitComponentSource(source, ctx, out) {
197
+ switch (source.kind) {
198
+ case 'module':
199
+ emitModuleOfType(source.moduleType, isRecord(source.props) ? source.props : {}, ctx, out);
200
+ return;
201
+ case 'section':
202
+ emitSection(source.section, ctx, out);
203
+ return;
204
+ case 'variantContainer':
205
+ if (!isRecord(source.container))
206
+ return;
207
+ for (const section of servedSections(source.container))
208
+ emitSection(section, ctx, out);
209
+ return;
210
+ case 'moduleVariantContainer':
211
+ if (!isRecord(source.container))
212
+ return;
213
+ emitModule(servedModule(source.container), ctx, out);
214
+ return;
215
+ default:
216
+ // 'unresolvable' — the renderer shows the placement's own (empty) props.
217
+ return;
218
+ }
219
+ }
220
+ // ─── Prop-schema projection (custom modules + schema-only built-ins) ──────────
221
+ function emitFromPropSchema(schema, props, out) {
222
+ if (!schema)
223
+ return;
224
+ let headingUsed = false;
225
+ for (const [key, def] of Object.entries(schema)) {
226
+ const value = str(props[key]);
227
+ if (!value)
228
+ continue;
229
+ if (def.type === 'richText') {
230
+ pushHtml(value, out);
231
+ continue;
232
+ }
233
+ if (def.type !== 'text' && def.type !== 'textarea')
234
+ continue;
235
+ if (isReferenceProp(key))
236
+ continue;
237
+ // A textarea prop is also how the palette stores JSON item lists; a serialized
238
+ // array is data, not copy.
239
+ if (looksLikeJson(value) || looksLikeLinkTarget(value))
240
+ continue;
241
+ if (!headingUsed && def.type === 'text') {
242
+ headingUsed = true;
243
+ out.push(`<h2>${esc(value)}</h2>`);
244
+ }
245
+ else {
246
+ out.push(`<p>${esc(value)}</p>`);
247
+ }
248
+ }
249
+ }
250
+ const HEADING_LEVELS = new Set(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']);
251
+ const BUILT_IN_EMITTERS = {
252
+ heading(props, out) {
253
+ const text = str(props['text']);
254
+ if (!text)
255
+ return;
256
+ const level = str(props['level']);
257
+ const tag = HEADING_LEVELS.has(level) ? level : 'h2';
258
+ out.push(`<${tag}>${esc(text)}</${tag}>`);
259
+ },
260
+ richText(props, out) {
261
+ pushHtml(str(props['content']), out);
262
+ },
263
+ text(props, out) {
264
+ pushParagraph(str(props['content']), out);
265
+ },
266
+ button(props, out) {
267
+ pushLinkParagraph(str(props['label']), str(props['href']), out);
268
+ },
269
+ image(props, out) {
270
+ const alt = str(props['alt']);
271
+ if (alt)
272
+ out.push(`<p><em>${esc(alt)}</em></p>`);
273
+ pushParagraph(str(props['caption']), out);
274
+ },
275
+ card(props, out) {
276
+ const title = str(props['title']);
277
+ const href = safeHref(str(props['href']));
278
+ if (title) {
279
+ out.push(href ? `<h3><a href="${escAttr(href)}">${esc(title)}</a></h3>` : `<h3>${esc(title)}</h3>`);
280
+ }
281
+ pushParagraph(str(props['body']), out);
282
+ pushParagraph(str(props['footer']), out);
283
+ },
284
+ cta(props, out) {
285
+ pushHeading(2, str(props['headline']), out);
286
+ pushParagraph(str(props['subtext']), out);
287
+ pushLinkParagraph(str(props['buttonLabel']), str(props['buttonHref']), out);
288
+ },
289
+ hero(props, out) {
290
+ // h1 to match what HeroModule renders.
291
+ pushHeading(1, str(props['headline']), out);
292
+ pushParagraph(str(props['subtext']), out);
293
+ pushLinkParagraph(str(props['buttonLabel']), str(props['buttonHref']), out);
294
+ },
295
+ testimonial(props, out) {
296
+ pushQuote(str(props['quote']), out);
297
+ const author = str(props['author']);
298
+ const role = str(props['role']);
299
+ if (author)
300
+ pushParagraph(role ? `${author}, ${role}` : author, out);
301
+ },
302
+ blockquote(props, out) {
303
+ pushQuote(str(props['content']), out);
304
+ pushParagraph(str(props['author']), out);
305
+ },
306
+ faq(props, out) {
307
+ pushHeading(3, str(props['question']), out);
308
+ pushHtml(str(props['answer']), out);
309
+ },
310
+ accordion(props, out) {
311
+ pushHeading(3, str(props['title']), out);
312
+ pushHtml(str(props['content']), out);
313
+ },
314
+ pricing(props, out) {
315
+ pushHeading(3, str(props['planName']), out);
316
+ const price = str(props['price']);
317
+ const period = str(props['period']);
318
+ if (price)
319
+ pushParagraph(period ? `${price}/${period}` : price, out);
320
+ const features = parseJsonArray(props['features']).map(str).filter(Boolean);
321
+ if (features.length > 0) {
322
+ out.push(`<ul>${features.map(f => `<li>${esc(f)}</li>`).join('')}</ul>`);
323
+ }
324
+ pushLinkParagraph(str(props['buttonLabel']), str(props['buttonHref']), out);
325
+ },
326
+ alert(props, out) {
327
+ pushParagraph(str(props['message']), out);
328
+ },
329
+ badge(props, out) {
330
+ const label = str(props['label']);
331
+ if (!label)
332
+ return;
333
+ const href = str(props['href']);
334
+ if (href)
335
+ pushLinkParagraph(label, href, out);
336
+ else
337
+ pushParagraph(label, out);
338
+ },
339
+ tabs(props, out) {
340
+ for (const raw of parseJsonArray(props['tabs'])) {
341
+ if (!isRecord(raw))
342
+ continue;
343
+ pushHeading(3, str(raw['label']), out);
344
+ pushHtml(str(raw['content']), out);
345
+ }
346
+ },
347
+ feedDisplay(props, out) {
348
+ // Items are other published nodes — they enter the corpus on their own.
349
+ pushHeading(2, str(props['heading']) || str(props['title']), out);
350
+ },
351
+ };
352
+ /**
353
+ * Modules that carry no standalone authored copy, or whose copy is site chrome
354
+ * repeated on every page. See the module docblock for the reasoning per group.
355
+ */
356
+ const SKIPPED_MODULES = new Set([
357
+ // Layout scaffolding
358
+ 'section', 'container', 'columns', 'spacer', 'divider',
359
+ // Arbitrary markup / embeds
360
+ 'html', 'embed', 'video',
361
+ // Interaction
362
+ 'form', 'formEmbed', 'comments',
363
+ // Navigation + search chrome
364
+ 'breadcrumbs', 'navMenu', 'navigation', 'siteMap', 'searchBox', 'search',
365
+ // Compliance chrome
366
+ 'cookieConsent',
367
+ // Decorative / structured-data-only
368
+ 'icon', 'map', 'socialShare', 'countdown', 'carousel', 'tagCloud', 'categoryList',
369
+ // Personalization chrome + the retired container MODULE (the real container is
370
+ // a layout NODE, handled in the walk above).
371
+ 'personalizationBadge', 'variantContainer',
372
+ ]);
373
+ // ─── Emit helpers ─────────────────────────────────────────────────────────────
374
+ function pushHeading(level, text, out) {
375
+ if (!text)
376
+ return;
377
+ out.push(`<h${level}>${esc(text)}</h${level}>`);
378
+ }
379
+ function pushParagraph(text, out) {
380
+ if (!text)
381
+ return;
382
+ out.push(`<p>${esc(text)}</p>`);
383
+ }
384
+ function pushLinkParagraph(label, rawHref, out) {
385
+ if (!label)
386
+ return;
387
+ const href = safeHref(rawHref);
388
+ out.push(href ? `<p><a href="${escAttr(href)}">${esc(label)}</a></p>` : `<p>${esc(label)}</p>`);
389
+ }
390
+ /**
391
+ * The href allowlist for links this module ASSEMBLES.
392
+ *
393
+ * Rich text goes through `sanitizeHtml`, which enforces its own scheme list, but
394
+ * a `button`/`cta`/`card` href is interpolated straight into markup built here.
395
+ * A stored `javascript:` or `data:` href is inert in an agent corpus and live in
396
+ * anything that renders this HTML, and there is no reason for a projection to
397
+ * carry one. Relative targets (`/`, `#`, `?`, `.`, a bare path) pass; an
398
+ * absolute one must be http(s)/mailto/tel. Dropped → the label still emits as
399
+ * plain copy, since the words are the content.
400
+ */
401
+ const SAFE_SCHEME = /^(https?|mailto|tel):/i;
402
+ const HAS_SCHEME = /^[a-z][a-z0-9+.-]*:/i;
403
+ function safeHref(href) {
404
+ if (!href)
405
+ return '';
406
+ // Control characters are how `java\0script:` style bypasses are written.
407
+ const cleaned = href.replace(/[\u0000-\u001f\u007f]/g, '');
408
+ if (!cleaned)
409
+ return '';
410
+ if (!HAS_SCHEME.test(cleaned))
411
+ return cleaned;
412
+ return SAFE_SCHEME.test(cleaned) ? cleaned : '';
413
+ }
414
+ function pushQuote(text, out) {
415
+ if (!text)
416
+ return;
417
+ out.push(`<blockquote><p>${esc(text)}</p></blockquote>`);
418
+ }
419
+ /** Stored rich text is CMS-authored HTML: sanitize it exactly as the renderer does. */
420
+ function pushHtml(html, out) {
421
+ if (!html)
422
+ return;
423
+ const clean = sanitizeHtml(html).trim();
424
+ if (clean)
425
+ out.push(clean);
426
+ }
427
+ // ─── Small pure helpers ───────────────────────────────────────────────────────
428
+ let cachedBuiltInRegistry = null;
429
+ /** The built-ins-only registry, built once (it is immutable and stateless). */
430
+ function builtInRegistry() {
431
+ cachedBuiltInRegistry ??= createModuleRegistry([]);
432
+ return cachedBuiltInRegistry;
433
+ }
434
+ const registryByModules = new WeakMap();
435
+ /**
436
+ * The module registry for a config's `modules`, memoised on the array itself.
437
+ *
438
+ * The per-NODE surfaces — `/<path>.md`, per-page JSON-LD — are handed a node by
439
+ * the host rather than by the AX content source, so nothing precomputed their
440
+ * layout projection and they must build the registry themselves. Doing it
441
+ * unmemoised would rebuild a ~45-entry map on every request; the config's
442
+ * `modules` array is a stable object for the process's lifetime, so it keys the
443
+ * cache exactly.
444
+ *
445
+ * NOTE what this deliberately does NOT carry: a component resolver. Resolving a
446
+ * saved component is a database read, and these two surfaces are synchronous and
447
+ * DB-free by contract. A linked placement on a node that did not come through
448
+ * the content source therefore contributes its inline fallback copy — the same
449
+ * copy the renderer falls back to when a link cannot be resolved.
450
+ */
451
+ export function registryForModules(modules) {
452
+ if (!Array.isArray(modules) || modules.length === 0)
453
+ return builtInRegistry();
454
+ const hit = registryByModules.get(modules);
455
+ if (hit)
456
+ return hit;
457
+ const built = createModuleRegistry(modules);
458
+ registryByModules.set(modules, built);
459
+ return built;
460
+ }
461
+ function asLayoutDocument(value) {
462
+ if (!isRecord(value))
463
+ return null;
464
+ const regions = value['regions'];
465
+ if (!isRecord(regions))
466
+ return null;
467
+ return value;
468
+ }
469
+ function isRecord(value) {
470
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
471
+ }
472
+ /**
473
+ * THE guard for every walk site. A stored layout is raw JSONB that
474
+ * `setContentLayout` never validated, so any of `regions.main`, `columns`,
475
+ * `nodes`, `defaultSections` and `variants` may be an object, a string, or
476
+ * absent. `for (const x of somethingNotIterable)` is a TypeError, and these
477
+ * projections run on public routes.
478
+ */
479
+ function asArray(value) {
480
+ return Array.isArray(value) ? value : [];
481
+ }
482
+ function str(value) {
483
+ return typeof value === 'string' ? value.trim() : '';
484
+ }
485
+ /**
486
+ * Structured data stored in a `textarea` prop (the palette's item lists). The
487
+ * `JSON.parse` is not decoration: prose legitimately opens with a brace
488
+ * ("{curly} quotes", "[draft] title"), and dropping it would silently lose real
489
+ * copy.
490
+ */
491
+ function looksLikeJson(value) {
492
+ const first = value[0];
493
+ if (first !== '[' && first !== '{')
494
+ return false;
495
+ try {
496
+ JSON.parse(value);
497
+ return true;
498
+ }
499
+ catch {
500
+ return false;
501
+ }
502
+ }
503
+ /**
504
+ * A prop that NAMES something rather than saying something: a link target, an
505
+ * id, a slug, a CSS class.
506
+ *
507
+ * The palette has no "reference" prop type, so a custom module's `ctaHref`,
508
+ * `experimentId` or `videoSrc` is declared `text` alongside its `headline`. Emitting those as
509
+ * paragraphs fills an agent corpus with bare paths and UUIDs, and the schema
510
+ * path is the only projection that cannot tell them apart from copy (a built-in
511
+ * emitter names the props it reads). Matching on the name is the cheap, stable
512
+ * half of that; {@link looksLikeLinkTarget} catches the rest by value.
513
+ */
514
+ function isReferenceProp(name) {
515
+ // Whole name, or a camelCase suffix. The camelCase half must require the
516
+ // capital: a plain `/id$/i` would also swallow `valid`, `grid` and `hybrid`.
517
+ return (/^(href|url|uri|id|slug|class|classname|link|path|route|target|src)$/i.test(name) ||
518
+ /[a-z](Href|Url|Uri|Id|Slug|Class|ClassName|Link|Path|Route|Target|Src)$/.test(name));
519
+ }
520
+ /** A bare path, anchor, or absolute URL — a destination, not a sentence. */
521
+ function looksLikeLinkTarget(value) {
522
+ if (/\s/.test(value))
523
+ return false;
524
+ return /^(\/|#|https?:\/\/|mailto:|tel:)/i.test(value);
525
+ }
526
+ function parseJsonArray(raw) {
527
+ if (Array.isArray(raw))
528
+ return raw;
529
+ if (typeof raw !== 'string')
530
+ return [];
531
+ try {
532
+ const parsed = JSON.parse(raw);
533
+ return Array.isArray(parsed) ? parsed : [];
534
+ }
535
+ catch {
536
+ return [];
537
+ }
538
+ }
539
+ function esc(text) {
540
+ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
541
+ }
542
+ function escAttr(text) {
543
+ return esc(text).replace(/"/g, '&quot;');
544
+ }
545
+ //# sourceMappingURL=layout-to-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-to-html.js","sourceRoot":"","sources":["../../src/ax/layout-to-html.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  import type { AxContentSource, AxRenderContext } from './types.js';
2
2
  /**
3
3
  * Generate `llms-full.txt` — the full-text agent corpus: a deterministic
4
- * HTML→Markdown projection of every AX-eligible published node's `body`.
4
+ * HTML→Markdown projection of every AX-eligible published node's effective body
5
+ * (its stored `body`, or its LAYOUT serialized to HTML when that is empty —
6
+ * kywi-cms#195).
5
7
  *
6
8
  * Preamble matches the llms.txt header, then one `## {title}` section per node
7
9
  * (ordered by path), each with a URL/Type/Updated header line and the
@@ -1 +1 @@
1
- {"version":3,"file":"llms-full-txt.d.ts","sourceRoot":"","sources":["../../src/ax/llms-full-txt.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAiB,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjF;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BxG"}
1
+ {"version":3,"file":"llms-full-txt.d.ts","sourceRoot":"","sources":["../../src/ax/llms-full-txt.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAiB,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjF;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BxG"}
@@ -1,10 +1,13 @@
1
1
  import { resolveAxConfig } from '../config/define.js';
2
2
  import { absoluteUrl } from './url.js';
3
3
  import { htmlToMarkdown } from './html-to-markdown.js';
4
+ import { effectiveBodyHtml } from './effective-body.js';
4
5
  import { isAxEligible } from './filters.js';
5
6
  /**
6
7
  * Generate `llms-full.txt` — the full-text agent corpus: a deterministic
7
- * HTML→Markdown projection of every AX-eligible published node's `body`.
8
+ * HTML→Markdown projection of every AX-eligible published node's effective body
9
+ * (its stored `body`, or its LAYOUT serialized to HTML when that is empty —
10
+ * kywi-cms#195).
8
11
  *
9
12
  * Preamble matches the llms.txt header, then one `## {title}` section per node
10
13
  * (ordered by path), each with a URL/Type/Updated header line and the
@@ -44,7 +47,7 @@ function section(node, baseUrl) {
44
47
  `URL: ${url}`,
45
48
  `Type: ${node.contentTypeName}${updated ? ` Updated: ${updated}` : ''}`,
46
49
  ].join('\n');
47
- const bodySource = strOrEmpty(node.body) || strOrEmpty(node.summary);
50
+ const bodySource = effectiveBodyHtml(node) || strOrEmpty(node.summary);
48
51
  const markdown = htmlToMarkdown(bodySource);
49
52
  return markdown ? `${header}\n\n${markdown}` : header;
50
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"llms-full-txt.js","sourceRoot":"","sources":["../../src/ax/llms-full-txt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"llms-full-txt.js","sourceRoot":"","sources":["../../src/ax/llms-full-txt.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,16 @@
1
1
  import type { AxContentNode, AxRenderContext } from './types.js';
2
2
  /**
3
3
  * Single-node Markdown projection for content negotiation (`.md` /
4
- * `Accept: text/markdown`). Deterministic HTML→Markdown of the stored `body` —
5
- * the same converter as llms-full.txt, no language model.
4
+ * `Accept: text/markdown`). Deterministic HTML→Markdown of the node's effective
5
+ * body its stored `body`, or its LAYOUT serialized to HTML when that column is
6
+ * empty (kywi-cms#195) — the same converter as llms-full.txt, no language model.
7
+ *
8
+ * PROJECTING THE STORED LAYOUT IS CORRECT HERE, unlike in per-page JSON-LD.
9
+ * `/ax/md/slug/*` reads no cookie and resolves no audience — it is the same
10
+ * anonymous surface llms-full.txt is — so `layoutToHtml`'s own answer (Default,
11
+ * or a locked A/B winner, never a targeted arm) IS what this surface serves.
12
+ * JSON-LD differs because it renders inside a personalized page; see
13
+ * `generateJsonLd`'s docblock for that contract.
6
14
  */
7
15
  export declare function generatePageMarkdown(node: AxContentNode, ctx: AxRenderContext): string;
8
16
  //# sourceMappingURL=page-markdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"page-markdown.d.ts","sourceRoot":"","sources":["../../src/ax/page-markdown.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEhE;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,eAAe,GAAG,MAAM,CAYtF"}
1
+ {"version":3,"file":"page-markdown.d.ts","sourceRoot":"","sources":["../../src/ax/page-markdown.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEhE;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,eAAe,GAAG,MAAM,CAetF"}