@wootsup/yt-builder-mcp 1.2.0 → 1.3.0

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 (165) hide show
  1. package/README.md +15 -11
  2. package/dist/catalog/build-catalog.d.ts +63 -0
  3. package/dist/catalog/build-catalog.d.ts.map +1 -0
  4. package/dist/catalog/build-catalog.js +166 -0
  5. package/dist/catalog/build-catalog.js.map +1 -0
  6. package/dist/gateway/advanced-read-tool.d.ts +37 -0
  7. package/dist/gateway/advanced-read-tool.d.ts.map +1 -0
  8. package/dist/gateway/advanced-read-tool.js +156 -0
  9. package/dist/gateway/advanced-read-tool.js.map +1 -0
  10. package/dist/gateway/advanced-tool/domains.d.ts +18 -3
  11. package/dist/gateway/advanced-tool/domains.d.ts.map +1 -1
  12. package/dist/gateway/advanced-tool/domains.js +28 -9
  13. package/dist/gateway/advanced-tool/domains.js.map +1 -1
  14. package/dist/gateway/advanced-tool/register.d.ts.map +1 -1
  15. package/dist/gateway/advanced-tool/register.js +43 -11
  16. package/dist/gateway/advanced-tool/register.js.map +1 -1
  17. package/dist/gateway/essentials.d.ts +14 -4
  18. package/dist/gateway/essentials.d.ts.map +1 -1
  19. package/dist/gateway/essentials.js +41 -5
  20. package/dist/gateway/essentials.js.map +1 -1
  21. package/dist/gateway/test-support.d.ts +2 -2
  22. package/dist/gateway/test-support.js +2 -2
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +10 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/install-skill.js +1 -1
  27. package/dist/proxy/bridge.d.ts +36 -0
  28. package/dist/proxy/bridge.d.ts.map +1 -0
  29. package/dist/proxy/bridge.js +129 -0
  30. package/dist/proxy/bridge.js.map +1 -0
  31. package/dist/proxy/mode.d.ts +10 -0
  32. package/dist/proxy/mode.d.ts.map +1 -0
  33. package/dist/proxy/mode.js +20 -0
  34. package/dist/proxy/mode.js.map +1 -0
  35. package/dist/server.d.ts +5 -3
  36. package/dist/server.d.ts.map +1 -1
  37. package/dist/server.js +13 -3
  38. package/dist/server.js.map +1 -1
  39. package/dist/setup-wizard.d.ts.map +1 -1
  40. package/dist/setup-wizard.js +7 -0
  41. package/dist/setup-wizard.js.map +1 -1
  42. package/dist/sites/client-pool.d.ts.map +1 -1
  43. package/dist/sites/client-pool.js +21 -3
  44. package/dist/sites/client-pool.js.map +1 -1
  45. package/dist/sites/registry.d.ts +30 -0
  46. package/dist/sites/registry.d.ts.map +1 -1
  47. package/dist/sites/registry.js.map +1 -1
  48. package/dist/sites/store.d.ts +8 -1
  49. package/dist/sites/store.d.ts.map +1 -1
  50. package/dist/sites/store.js +17 -2
  51. package/dist/sites/store.js.map +1 -1
  52. package/dist/sites/tools/use-site.d.ts.map +1 -1
  53. package/dist/sites/tools/use-site.js +26 -6
  54. package/dist/sites/tools/use-site.js.map +1 -1
  55. package/dist/tools/bind-guidance.d.ts +80 -0
  56. package/dist/tools/bind-guidance.d.ts.map +1 -0
  57. package/dist/tools/bind-guidance.js +95 -0
  58. package/dist/tools/bind-guidance.js.map +1 -0
  59. package/dist/tools/elements/builders.d.ts.map +1 -1
  60. package/dist/tools/elements/builders.js +59 -11
  61. package/dist/tools/elements/builders.js.map +1 -1
  62. package/dist/tools/elements/handlers-write.d.ts +19 -2
  63. package/dist/tools/elements/handlers-write.d.ts.map +1 -1
  64. package/dist/tools/elements/handlers-write.js +179 -10
  65. package/dist/tools/elements/handlers-write.js.map +1 -1
  66. package/dist/tools/elements/handlers.d.ts +6 -1
  67. package/dist/tools/elements/handlers.d.ts.map +1 -1
  68. package/dist/tools/elements/handlers.js +74 -7
  69. package/dist/tools/elements/handlers.js.map +1 -1
  70. package/dist/tools/elements/layout-hierarchy-rules.d.ts +62 -0
  71. package/dist/tools/elements/layout-hierarchy-rules.d.ts.map +1 -0
  72. package/dist/tools/elements/layout-hierarchy-rules.js +154 -0
  73. package/dist/tools/elements/layout-hierarchy-rules.js.map +1 -0
  74. package/dist/tools/format/elements-format.d.ts +35 -0
  75. package/dist/tools/format/elements-format.d.ts.map +1 -1
  76. package/dist/tools/format/elements-format.js +124 -1
  77. package/dist/tools/format/elements-format.js.map +1 -1
  78. package/dist/tools/format/inspection-format.d.ts +18 -0
  79. package/dist/tools/format/inspection-format.d.ts.map +1 -1
  80. package/dist/tools/format/inspection-format.js +22 -1
  81. package/dist/tools/format/inspection-format.js.map +1 -1
  82. package/dist/tools/format/pages-format.d.ts.map +1 -1
  83. package/dist/tools/format/pages-format.js +7 -0
  84. package/dist/tools/format/pages-format.js.map +1 -1
  85. package/dist/tools/format/sources-format.d.ts +8 -0
  86. package/dist/tools/format/sources-format.d.ts.map +1 -1
  87. package/dist/tools/format/sources-format.js +10 -0
  88. package/dist/tools/format/sources-format.js.map +1 -1
  89. package/dist/tools/health.d.ts.map +1 -1
  90. package/dist/tools/health.js +24 -0
  91. package/dist/tools/health.js.map +1 -1
  92. package/dist/tools/index.d.ts.map +1 -1
  93. package/dist/tools/index.js +4 -0
  94. package/dist/tools/index.js.map +1 -1
  95. package/dist/tools/inspection.d.ts +24 -0
  96. package/dist/tools/inspection.d.ts.map +1 -1
  97. package/dist/tools/inspection.js +140 -41
  98. package/dist/tools/inspection.js.map +1 -1
  99. package/dist/tools/layout-flatten.d.ts +11 -8
  100. package/dist/tools/layout-flatten.d.ts.map +1 -1
  101. package/dist/tools/layout-flatten.js +17 -6
  102. package/dist/tools/layout-flatten.js.map +1 -1
  103. package/dist/tools/multi-items/builders.d.ts.map +1 -1
  104. package/dist/tools/multi-items/builders.js +11 -2
  105. package/dist/tools/multi-items/builders.js.map +1 -1
  106. package/dist/tools/multi-items/inspect-handler.d.ts +13 -0
  107. package/dist/tools/multi-items/inspect-handler.d.ts.map +1 -1
  108. package/dist/tools/multi-items/inspect-handler.js +147 -3
  109. package/dist/tools/multi-items/inspect-handler.js.map +1 -1
  110. package/dist/tools/pages/builders.d.ts.map +1 -1
  111. package/dist/tools/pages/builders.js +88 -25
  112. package/dist/tools/pages/builders.js.map +1 -1
  113. package/dist/tools/pages/handlers-read.d.ts +5 -1
  114. package/dist/tools/pages/handlers-read.d.ts.map +1 -1
  115. package/dist/tools/pages/handlers-read.js +192 -47
  116. package/dist/tools/pages/handlers-read.js.map +1 -1
  117. package/dist/tools/pages/handlers-write.d.ts +95 -1
  118. package/dist/tools/pages/handlers-write.d.ts.map +1 -1
  119. package/dist/tools/pages/handlers-write.js +137 -8
  120. package/dist/tools/pages/handlers-write.js.map +1 -1
  121. package/dist/tools/pages/index.d.ts +1 -1
  122. package/dist/tools/pages/index.d.ts.map +1 -1
  123. package/dist/tools/pages/index.js +1 -1
  124. package/dist/tools/pages/index.js.map +1 -1
  125. package/dist/tools/pages/schemas.d.ts +54 -0
  126. package/dist/tools/pages/schemas.d.ts.map +1 -1
  127. package/dist/tools/pages/schemas.js +199 -2
  128. package/dist/tools/pages/schemas.js.map +1 -1
  129. package/dist/tools/shared-schemas.d.ts.map +1 -1
  130. package/dist/tools/shared-schemas.js +15 -13
  131. package/dist/tools/shared-schemas.js.map +1 -1
  132. package/dist/tools/sources/builders.d.ts.map +1 -1
  133. package/dist/tools/sources/builders.js +64 -6
  134. package/dist/tools/sources/builders.js.map +1 -1
  135. package/dist/tools/sources/handlers-bind.d.ts +13 -1
  136. package/dist/tools/sources/handlers-bind.d.ts.map +1 -1
  137. package/dist/tools/sources/handlers-bind.js +163 -1
  138. package/dist/tools/sources/handlers-bind.js.map +1 -1
  139. package/dist/tools/sources/handlers.d.ts +3 -0
  140. package/dist/tools/sources/handlers.d.ts.map +1 -1
  141. package/dist/tools/sources/handlers.js +43 -6
  142. package/dist/tools/sources/handlers.js.map +1 -1
  143. package/dist/tools/sparse-fields.d.ts +23 -0
  144. package/dist/tools/sparse-fields.d.ts.map +1 -1
  145. package/dist/tools/sparse-fields.js +29 -0
  146. package/dist/tools/sparse-fields.js.map +1 -1
  147. package/dist/tools/sublayout/builders.d.ts +23 -0
  148. package/dist/tools/sublayout/builders.d.ts.map +1 -0
  149. package/dist/tools/sublayout/builders.js +54 -0
  150. package/dist/tools/sublayout/builders.js.map +1 -0
  151. package/dist/tools/sublayout/index.d.ts +13 -0
  152. package/dist/tools/sublayout/index.d.ts.map +1 -0
  153. package/dist/tools/sublayout/index.js +13 -0
  154. package/dist/tools/sublayout/index.js.map +1 -0
  155. package/dist/tools/sublayout/inspect-sublayout-handler.d.ts +95 -0
  156. package/dist/tools/sublayout/inspect-sublayout-handler.d.ts.map +1 -0
  157. package/dist/tools/sublayout/inspect-sublayout-handler.js +181 -0
  158. package/dist/tools/sublayout/inspect-sublayout-handler.js.map +1 -0
  159. package/dist/tools/tool-builder/results.d.ts +31 -0
  160. package/dist/tools/tool-builder/results.d.ts.map +1 -1
  161. package/dist/tools/tool-builder/results.js +95 -4
  162. package/dist/tools/tool-builder/results.js.map +1 -1
  163. package/manifest.json +1 -1
  164. package/package.json +4 -2
  165. package/skills/yt-builder-mcp/SKILL.md +146 -81
@@ -19,8 +19,8 @@ import { detailResult, tableResult } from '@getimo/mcp-toolkit';
19
19
  import { z } from 'zod';
20
20
  import { encodeElementPath, encodeTemplateId } from '../../client.js';
21
21
  import { RestError } from '../../errors.js';
22
- import { ELEMENTS_COMPACT_COLUMNS, ELEMENTS_TABLE_COLUMNS, buildElementDetail, mapElementRow, } from '../format/elements-format.js';
23
- import { DEFAULT_FIELDS_ELEMENT_LIST, projectFields, projectionFeedback, projectedFieldsEcho, } from '../sparse-fields.js';
22
+ import { ELEMENTS_COMPACT_COLUMNS, ELEMENTS_TABLE_COLUMNS, buildElementDetail, extractBinding, mapElementRow, } from '../format/elements-format.js';
23
+ import { DEFAULT_FIELDS_ELEMENT_LIST, projectFields, projectionFeedback, projectionWarning, projectedFieldsEcho, } from '../sparse-fields.js';
24
24
  import { errorResult, structuredResult, } from '../tool-builder.js';
25
25
  // ─── outputSchemas (Wave G.2 §4) ─────────────────────────────────────
26
26
  export const ELEMENT_LIST_OUTPUT_SCHEMA = z.object({
@@ -59,6 +59,19 @@ export const ELEMENT_LIST_OUTPUT_SCHEMA = z.object({
59
59
  .optional()
60
60
  .describe('True when this element is dynamically bound to a data ' +
61
61
  'source. Use `element_get_binding` for the full mapping.'),
62
+ // F88: surface the binding so leaf field-mappings are readable
63
+ // back without dumping the props tree. Present only on bound rows.
64
+ source: z
65
+ .unknown()
66
+ .optional()
67
+ .describe('Raw binding object when bound (e.g. `{query:{name:"#parent"},' +
68
+ 'props:{content:{name:"field.x"}}}`). Copy back into ' +
69
+ '`element_bind_source`. Present only when `has_binding` is true.'),
70
+ binding_summary: z
71
+ .string()
72
+ .optional()
73
+ .describe('Compact one-line binding: `<query> ← <el>:<field>, …`. ' +
74
+ 'Present only when bound.'),
62
75
  })
63
76
  .passthrough()),
64
77
  total: z.number(),
@@ -72,6 +85,10 @@ export const ELEMENT_LIST_OUTPUT_SCHEMA = z.object({
72
85
  // table columns. See sparse-fields.ts::projectionFeedback.
73
86
  available_fields: z.array(z.string()).optional(),
74
87
  unknown_fields: z.array(z.string()).optional(),
88
+ // F23 (2026-06-10): the LOUD unknown-projection warning also rides in
89
+ // structuredContent — hosts that surface structuredContent (not the
90
+ // text leg) to the model would otherwise never see it.
91
+ projection_warning: z.string().optional(),
75
92
  });
76
93
  export const ELEMENT_GET_OUTPUT_SCHEMA = z.object({
77
94
  template_id: z.string(),
@@ -80,6 +97,11 @@ export const ELEMENT_GET_OUTPUT_SCHEMA = z.object({
80
97
  label: z.string().optional(),
81
98
  props: z.record(z.string(), z.unknown()).optional(),
82
99
  children_count: z.number(),
100
+ // F88 (2026-06-10): when the element is bound, surface the raw binding
101
+ // object + a compact summary so a leaf's field-mappings are readable back
102
+ // (the props tree no longer has to be eyeballed). Present only when bound.
103
+ source: z.unknown().optional(),
104
+ binding_summary: z.string().optional(),
83
105
  });
84
106
  // ─── element_list ────────────────────────────────────────────────────
85
107
  /**
@@ -165,6 +187,17 @@ export async function handleElementList({ client }, { template_id, fields, root_
165
187
  qs.set('limit', String(limit));
166
188
  if (typeof cursor === 'string' && cursor !== '')
167
189
  qs.set('cursor', cursor);
190
+ // F13 (2026-06-09): when the caller projects a nested `props.*`
191
+ // field, ask the REST plugin to attach the full props map per row
192
+ // (ElementOps::listOnTemplate honours `include=props`). The default
193
+ // row carries only `props_summary` (key names), which the row
194
+ // mapper drops — so without this opt-in the nested path would have
195
+ // nothing to project against. Mirrors page_get_layout flat-mode,
196
+ // which always carries props.
197
+ const wantsNestedProps = Array.isArray(fields) &&
198
+ fields.some((f) => f === 'props' || f.startsWith('props.'));
199
+ if (wantsNestedProps)
200
+ qs.set('include', 'props');
168
201
  const query = qs.toString();
169
202
  const data = await client.get(`/pages/${encodeTemplateId(template_id)}/elements${query !== '' ? `?${query}` : ''}`);
170
203
  // Paginated envelope uses `items`; flat shape uses `elements`.
@@ -202,9 +235,9 @@ export async function handleElementList({ client }, { template_id, fields, root_
202
235
  const items = projectFields(mapped, fields, DEFAULT_FIELDS_ELEMENT_LIST);
203
236
  const echo = projectedFieldsEcho(fields, DEFAULT_FIELDS_ELEMENT_LIST);
204
237
  const feedback = projectionFeedback(mapped, fields);
205
- const unknownNote = feedback !== undefined && feedback.unknown_fields.length > 0
206
- ? ` (unknown fields ignored: ${feedback.unknown_fields.join(', ')}; available: ${feedback.available_fields.join(', ')})`
207
- : '';
238
+ // F23 (2026-06-09): the loud text-leg warning is built by the
239
+ // shared helper so every read tool surfaces the identical signal.
240
+ const unknownNote = projectionWarning(feedback);
208
241
  // N-01 (Audit v4): when the caller passes an explicit narrow
209
242
  // `fields[]`, render the text table from the projected (slim)
210
243
  // rows with `full` detail (8000 chars) so the WHOLE node list
@@ -235,6 +268,7 @@ export async function handleElementList({ client }, { template_id, fields, root_
235
268
  ...(feedback !== undefined ? {
236
269
  available_fields: [...feedback.available_fields],
237
270
  unknown_fields: [...feedback.unknown_fields],
271
+ ...(unknownNote.trim() !== '' ? { projection_warning: unknownNote.trim() } : {}),
238
272
  } : {}),
239
273
  });
240
274
  }
@@ -257,17 +291,47 @@ export async function handleElementGet({ client }, { template_id, element_path }
257
291
  ? data.type
258
292
  : '';
259
293
  const label = typeof data.label === 'string' ? data.label : undefined;
260
- const propsRaw = data.props;
294
+ // Cluster C3 (back-compat defense-in-depth): older deployed plugins
295
+ // serialize an EMPTY props map as a JSON array `[]` (PHP
296
+ // `json_encode([])`). The fixed producer emits `{}`, but a client
297
+ // talking to an un-upgraded host still receives `[]`. The
298
+ // `element_get` outputSchema declares `props` as a `z.record(...)`
299
+ // (object), so emitting the raw `[]` into structuredContent makes
300
+ // the host reject the response with -32602 ("expected record,
301
+ // received array"). Normalize a ZERO-LENGTH array into an empty
302
+ // object. A NON-empty array is genuinely invalid (no plugin emits
303
+ // a populated array for props) — leave it untouched so schema
304
+ // validation surfaces the real error instead of masking it.
305
+ const propsRaw = Array.isArray(data.props) && data.props.length === 0
306
+ ? {}
307
+ : data.props;
261
308
  const props = propsRaw !== null && typeof propsRaw === 'object'
262
309
  ? propsRaw
263
310
  : undefined;
264
311
  const children = Array.isArray(data.children) ? data.children : [];
312
+ // F88: read the top-level binding carriers too. element_get returns
313
+ // the raw node under `element` plus the flattened top-level keys; the
314
+ // leaf #parent binding lives in `props.source`, but a container's
315
+ // binding may live in the top-level `source` / `source_extended`. Pass
316
+ // them through so the binding is surfaced + readable back.
317
+ const rawElement = data.element !== null && typeof data.element === 'object' && !Array.isArray(data.element)
318
+ ? data.element
319
+ : {};
320
+ const topSource = data.source ?? rawElement.source;
321
+ const topSourceExtended = data.source_extended ?? rawElement.source_extended;
322
+ const binding = extractBinding({
323
+ ...(props !== undefined ? { props } : {}),
324
+ ...(topSource !== undefined ? { source: topSource } : {}),
325
+ ...(topSourceExtended !== undefined ? { source_extended: topSourceExtended } : {}),
326
+ });
265
327
  const toolkitResult = detailResult(buildElementDetail({
266
328
  path: element_path,
267
329
  element_type: elementType,
268
330
  label,
269
331
  props,
270
332
  children: children,
333
+ ...(topSource !== undefined ? { source: topSource } : {}),
334
+ ...(topSourceExtended !== undefined ? { source_extended: topSourceExtended } : {}),
271
335
  }));
272
336
  return structuredResult(toolkitResult, {
273
337
  template_id,
@@ -276,6 +340,9 @@ export async function handleElementGet({ client }, { template_id, element_path }
276
340
  ...(label !== undefined ? { label } : {}),
277
341
  ...(props !== undefined ? { props } : {}),
278
342
  children_count: children.length,
343
+ ...(binding !== null
344
+ ? { source: binding.source, binding_summary: binding.binding_summary }
345
+ : {}),
279
346
  });
280
347
  }
281
348
  catch (e) {
@@ -288,5 +355,5 @@ export async function handleElementGet({ client }, { template_id, element_path }
288
355
  }
289
356
  }
290
357
  // Re-export write handlers so callers can import from this barrel.
291
- export { handleElementAdd, handleElementClone, handleElementDelete, handleElementMove, handleElementUpdateSettings, } from './handlers-write.js';
358
+ export { handleElementAdd, handleElementClone, handleElementDelete, handleElementMove, handleElementUpdateSettings, handleScaffoldSection, } from './handlers-write.js';
292
359
  //# sourceMappingURL=handlers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../../src/tools/elements/handlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../../src/tools/elements/handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Layout hierarchy grammar — TypeScript mirror of the PHP
3
+ * `WootsUp\BuilderMcp\Elements\LayoutHierarchyRules` constant.
4
+ *
5
+ * YOOtheme Pro renders a layout tree with a FIXED structural skeleton:
6
+ *
7
+ * root (layout) ⊃ section ⊃ row ⊃ column ⊃ {content | container}
8
+ *
9
+ * Content elements hung directly on the root / in a bare section / in a
10
+ * bare row do NOT render. This grammar (derived from REAL ab-Werk layouts —
11
+ * live-dumped from joomla-dev5 article:2 "The Club", YT 5.0.22) is the
12
+ * single source of truth shared by:
13
+ * • the PHP per-element + bulk guards (server-side enforcement)
14
+ * • the `scaffold_section` tool (builds a VALID section→row→column hull)
15
+ *
16
+ * Conservatism contract: REJECT ONLY what is positively known invalid (a
17
+ * child not allowed under a STRICT parent — section/row/root). Every other
18
+ * parent (column, fragment, multi-item containers, unknown 3rd-party) is
19
+ * PERMISSIVE. A false-positive that blocks a legitimate layout is strictly
20
+ * worse than a let-through edge case.
21
+ *
22
+ * The PHP and TS tables MUST stay in lock-step — both files carry a
23
+ * pin-test that fails if the grammar drifts.
24
+ *
25
+ * @license MIT
26
+ */
27
+ /**
28
+ * The ONLY element-type allowed as a DIRECT child of the layout root.
29
+ * Live-verified: every root child on article:2 is a `section`.
30
+ */
31
+ export declare const ROOT_ALLOWED: readonly string[];
32
+ /**
33
+ * STRICT structural parents and their EXHAUSTIVE allowed-child set.
34
+ * `column` is deliberately ABSENT — it is the permissive content host.
35
+ */
36
+ export declare const STRICT_PARENTS: Readonly<Record<string, readonly string[]>>;
37
+ /**
38
+ * Return the exhaustive allowed-child list for `parentType`, or null when
39
+ * `parentType` is NOT a strict structural parent (= permissive).
40
+ */
41
+ export declare function allowedChildrenOf(parentType: string): readonly string[] | null;
42
+ /**
43
+ * Is `childType` a valid DIRECT child of the layout root? Permissive for the
44
+ * empty type and for unknown / fragment types.
45
+ */
46
+ export declare function isAllowedRootChild(childType: string): boolean;
47
+ /**
48
+ * Is `childType` a valid child of `parentType`? Strict parents enforce
49
+ * their allow-list; every other parent is permissive.
50
+ */
51
+ export declare function isAllowedChild(parentType: string, childType: string): boolean;
52
+ /** Is `type` one of the STRICT structural parents (section / row)? */
53
+ export declare function isStructuralParent(type: string): boolean;
54
+ /**
55
+ * Is `childType` a type the STATIC grammar can positively reason about WITHOUT
56
+ * the live YT element-registry? True for the closed grammar (`section` + every
57
+ * KNOWN-non-section type); false for unknown / 3rd-party / `fragment` types
58
+ * (which stay degrade-permissive). Mirror of the PHP
59
+ * `LayoutHierarchyRules::isStaticallyDecidableChild`.
60
+ */
61
+ export declare function isStaticallyDecidableChild(childType: string): boolean;
62
+ //# sourceMappingURL=layout-hierarchy-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-hierarchy-rules.d.ts","sourceRoot":"","sources":["../../../src/tools/elements/layout-hierarchy-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAA+B,CAAC;AAE1E;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAGrE,CAAC;AAEH;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI,CAI9E;AAgED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAQ7D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAM7E;AAED,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAQrE"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Layout hierarchy grammar — TypeScript mirror of the PHP
3
+ * `WootsUp\BuilderMcp\Elements\LayoutHierarchyRules` constant.
4
+ *
5
+ * YOOtheme Pro renders a layout tree with a FIXED structural skeleton:
6
+ *
7
+ * root (layout) ⊃ section ⊃ row ⊃ column ⊃ {content | container}
8
+ *
9
+ * Content elements hung directly on the root / in a bare section / in a
10
+ * bare row do NOT render. This grammar (derived from REAL ab-Werk layouts —
11
+ * live-dumped from joomla-dev5 article:2 "The Club", YT 5.0.22) is the
12
+ * single source of truth shared by:
13
+ * • the PHP per-element + bulk guards (server-side enforcement)
14
+ * • the `scaffold_section` tool (builds a VALID section→row→column hull)
15
+ *
16
+ * Conservatism contract: REJECT ONLY what is positively known invalid (a
17
+ * child not allowed under a STRICT parent — section/row/root). Every other
18
+ * parent (column, fragment, multi-item containers, unknown 3rd-party) is
19
+ * PERMISSIVE. A false-positive that blocks a legitimate layout is strictly
20
+ * worse than a let-through edge case.
21
+ *
22
+ * The PHP and TS tables MUST stay in lock-step — both files carry a
23
+ * pin-test that fails if the grammar drifts.
24
+ *
25
+ * @license MIT
26
+ */
27
+ /**
28
+ * The ONLY element-type allowed as a DIRECT child of the layout root.
29
+ * Live-verified: every root child on article:2 is a `section`.
30
+ */
31
+ export const ROOT_ALLOWED = Object.freeze(['section']);
32
+ /**
33
+ * STRICT structural parents and their EXHAUSTIVE allowed-child set.
34
+ * `column` is deliberately ABSENT — it is the permissive content host.
35
+ */
36
+ export const STRICT_PARENTS = Object.freeze({
37
+ section: Object.freeze(['row']),
38
+ row: Object.freeze(['column']),
39
+ });
40
+ /**
41
+ * Return the exhaustive allowed-child list for `parentType`, or null when
42
+ * `parentType` is NOT a strict structural parent (= permissive).
43
+ */
44
+ export function allowedChildrenOf(parentType) {
45
+ return Object.prototype.hasOwnProperty.call(STRICT_PARENTS, parentType)
46
+ ? (STRICT_PARENTS[parentType] ?? null)
47
+ : null;
48
+ }
49
+ /**
50
+ * The closed set of KNOWN element-types that are NOT a `section` and are
51
+ * therefore invalid as a DIRECT root child. `fragment` is DELIBERATELY
52
+ * excluded (YT5 permissive wrapper). Built from the inner structural types,
53
+ * the canonical content leaves, and the multi-item containers + their items.
54
+ */
55
+ const KNOWN_NON_SECTION_TYPES = new Set([
56
+ // Inner structural types — never valid on the root.
57
+ 'row',
58
+ 'column',
59
+ 'layout',
60
+ // Canonical content leaves (YT 4.5.33 built-ins).
61
+ 'text',
62
+ 'headline',
63
+ 'image',
64
+ 'html',
65
+ 'icon',
66
+ 'alert',
67
+ 'code',
68
+ 'countdown',
69
+ 'divider',
70
+ 'overlay',
71
+ 'panel',
72
+ 'quotation',
73
+ 'totop',
74
+ 'video',
75
+ 'spacer',
76
+ // Multi-item containers + their `*_item` children (mirrors ItemContainerMap).
77
+ 'accordion',
78
+ 'accordion_item',
79
+ 'button',
80
+ 'button_item',
81
+ 'description_list',
82
+ 'description_list_item',
83
+ 'gallery',
84
+ 'gallery_item',
85
+ 'grid',
86
+ 'grid_item',
87
+ 'list',
88
+ 'list_item',
89
+ 'map',
90
+ 'map_item',
91
+ 'nav',
92
+ 'nav_item',
93
+ 'overlay-slider',
94
+ 'overlay-slider_item',
95
+ 'panel-slider',
96
+ 'panel-slider_item',
97
+ 'popover',
98
+ 'popover_item',
99
+ 'slideshow',
100
+ 'slideshow_item',
101
+ 'social',
102
+ 'social_item',
103
+ 'subnav',
104
+ 'subnav_item',
105
+ 'switcher',
106
+ 'switcher_item',
107
+ 'table',
108
+ 'table_item',
109
+ ]);
110
+ /**
111
+ * Is `childType` a valid DIRECT child of the layout root? Permissive for the
112
+ * empty type and for unknown / fragment types.
113
+ */
114
+ export function isAllowedRootChild(childType) {
115
+ if (childType === '') {
116
+ return true;
117
+ }
118
+ if (ROOT_ALLOWED.includes(childType)) {
119
+ return true;
120
+ }
121
+ return !KNOWN_NON_SECTION_TYPES.has(childType);
122
+ }
123
+ /**
124
+ * Is `childType` a valid child of `parentType`? Strict parents enforce
125
+ * their allow-list; every other parent is permissive.
126
+ */
127
+ export function isAllowedChild(parentType, childType) {
128
+ const allowed = allowedChildrenOf(parentType);
129
+ if (allowed === null) {
130
+ return true;
131
+ }
132
+ return allowed.includes(childType);
133
+ }
134
+ /** Is `type` one of the STRICT structural parents (section / row)? */
135
+ export function isStructuralParent(type) {
136
+ return Object.prototype.hasOwnProperty.call(STRICT_PARENTS, type);
137
+ }
138
+ /**
139
+ * Is `childType` a type the STATIC grammar can positively reason about WITHOUT
140
+ * the live YT element-registry? True for the closed grammar (`section` + every
141
+ * KNOWN-non-section type); false for unknown / 3rd-party / `fragment` types
142
+ * (which stay degrade-permissive). Mirror of the PHP
143
+ * `LayoutHierarchyRules::isStaticallyDecidableChild`.
144
+ */
145
+ export function isStaticallyDecidableChild(childType) {
146
+ if (childType === '') {
147
+ return false;
148
+ }
149
+ if (ROOT_ALLOWED.includes(childType)) {
150
+ return true;
151
+ }
152
+ return KNOWN_NON_SECTION_TYPES.has(childType);
153
+ }
154
+ //# sourceMappingURL=layout-hierarchy-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-hierarchy-rules.js","sourceRoot":"","sources":["../../../src/tools/elements/layout-hierarchy-rules.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,35 @@ export declare const ELEMENTS_COMPACT_COLUMNS: readonly TableColumn[];
14
14
  * `has_binding` from the SAME logic element_list uses — one SSoT.
15
15
  */
16
16
  export declare function hasSourceBinding(node: unknown): boolean;
17
+ /**
18
+ * F88 (2026-06-10): the resolved binding for an element, made READABLE.
19
+ *
20
+ * element_get / element_list historically surfaced only `has_binding`
21
+ * (a boolean) — so after binding a leaf (`props.content → field.x`) the
22
+ * agent could see THAT it was bound but not WHAT to. There was no
23
+ * top-level `source` projection, so the binding never appeared in
24
+ * `available_fields` and was unreadable without dumping the whole props
25
+ * tree. `extractBinding` finds the carrier slot (the same precedence
26
+ * BindingSerializer / hasSourceBinding use) and returns the raw binding
27
+ * object plus a compact human/agent-readable summary.
28
+ */
29
+ export interface ExtractedBinding {
30
+ /** Which slot carried the binding: `source` / `props.source` / `source_extended`. */
31
+ readonly carrier: 'source' | 'props.source' | 'source_extended';
32
+ /** The raw binding object — copy straight back into element_bind_source. */
33
+ readonly source: unknown;
34
+ /** Compact one-line summary: query name + bound leaf fields. */
35
+ readonly binding_summary: string;
36
+ }
37
+ /**
38
+ * Find the binding carrier on a node and return the raw binding object +
39
+ * a compact summary, or `null` when the node carries no binding. Carrier
40
+ * precedence mirrors `hasSourceBinding` (YT-Pro canonical `node.source`
41
+ * first, then the pre-1.1.13 `props.source` slot, then the YT4
42
+ * `source_extended` cache). A bare non-empty string source (legacy
43
+ * pre-F-13 user data) is surfaced too so it stays readable.
44
+ */
45
+ export declare function extractBinding(node: Record<string, unknown>): ExtractedBinding | null;
17
46
  /**
18
47
  * Maps an `/elements` row to the table shape.
19
48
  *
@@ -21,6 +50,9 @@ export declare function hasSourceBinding(node: unknown): boolean;
21
50
  * `label`, older emit `title` as the human-readable name).
22
51
  * - `has_binding` honours an explicit boolean from the REST plugin, else
23
52
  * derives from `props.source` presence.
53
+ * - F88: when a binding carrier is present, surface the raw `source`
54
+ * object + a compact `binding_summary` so leaf field-bindings are
55
+ * readable back (and appear in `available_fields`).
24
56
  */
25
57
  export declare function mapElementRow(input: Record<string, unknown>): Record<string, unknown>;
26
58
  interface ElementChildLike {
@@ -32,6 +64,9 @@ export declare function buildElementDetail(payload: {
32
64
  props?: unknown;
33
65
  children?: ElementChildLike[];
34
66
  label?: string;
67
+ /** F88: top-level carriers so the Binding group reads them too. */
68
+ source?: unknown;
69
+ source_extended?: unknown;
35
70
  }): {
36
71
  groups: DetailGroup[];
37
72
  title?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"elements-format.d.ts","sourceRoot":"","sources":["../../../src/tools/format/elements-format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAOpE,eAAO,MAAM,sBAAsB,EAAE,SAAS,WAAW,EAKxD,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,wBAAwB,EAAE,SAAS,WAAW,EAG1D,CAAC;AA+CF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CA+BvD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqBrF;AAID,UAAU,gBAAgB;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAClB;AAoBD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG;IAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA4C5C"}
1
+ {"version":3,"file":"elements-format.d.ts","sourceRoot":"","sources":["../../../src/tools/format/elements-format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAOpE,eAAO,MAAM,sBAAsB,EAAE,SAAS,WAAW,EAKxD,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,wBAAwB,EAAE,SAAS,WAAW,EAG1D,CAAC;AA+CF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CA+BvD;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,gBAAgB;IAC7B,qFAAqF;IACrF,QAAQ,CAAC,OAAO,EAAE,QAAQ,GAAG,cAAc,GAAG,iBAAiB,CAAC;IAChE,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,gEAAgE;IAChE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CACpC;AAgCD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,GAAG,IAAI,CA+BrF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmDrF;AAID,UAAU,gBAAgB;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAClB;AAoBD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG;IAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAsE5C"}
@@ -102,6 +102,75 @@ export function hasSourceBinding(node) {
102
102
  }
103
103
  return false;
104
104
  }
105
+ /**
106
+ * Build the compact `binding_summary` string for a structured binding
107
+ * object: `<query.name> ← <el>:<field>, <el>:<field>, …`. A binding with
108
+ * no `props` field-mappings (e.g. a bare iterating query on a container)
109
+ * summarises to just the query name. Inherit-only bindings (no query
110
+ * name) lead with `#inherit`.
111
+ */
112
+ function summarizeBinding(src) {
113
+ if (src === null || typeof src !== 'object')
114
+ return String(src);
115
+ const obj = src;
116
+ const query = obj.query;
117
+ const queryName = query !== null && typeof query === 'object' && typeof query.name === 'string'
118
+ ? query.name
119
+ : '';
120
+ const leaves = [];
121
+ const props = obj.props;
122
+ if (props !== null && typeof props === 'object') {
123
+ for (const el of Object.keys(props)) {
124
+ const v = props[el];
125
+ if (v !== null && typeof v === 'object') {
126
+ const name = v.name;
127
+ leaves.push(`${el}:${typeof name === 'string' ? name : '?'}`);
128
+ }
129
+ }
130
+ }
131
+ const head = queryName !== '' ? queryName : '#inherit';
132
+ return leaves.length > 0 ? `${head} ← ${leaves.join(', ')}` : head;
133
+ }
134
+ /**
135
+ * Find the binding carrier on a node and return the raw binding object +
136
+ * a compact summary, or `null` when the node carries no binding. Carrier
137
+ * precedence mirrors `hasSourceBinding` (YT-Pro canonical `node.source`
138
+ * first, then the pre-1.1.13 `props.source` slot, then the YT4
139
+ * `source_extended` cache). A bare non-empty string source (legacy
140
+ * pre-F-13 user data) is surfaced too so it stays readable.
141
+ */
142
+ export function extractBinding(node) {
143
+ // (1) top-level node.source — YT-Pro canonical.
144
+ if ('source' in node) {
145
+ const src = node.source;
146
+ if (typeof src === 'string' && src.length > 0) {
147
+ return { carrier: 'source', source: src, binding_summary: src };
148
+ }
149
+ if (isStructuredBinding(src)) {
150
+ return { carrier: 'source', source: src, binding_summary: summarizeBinding(src) };
151
+ }
152
+ }
153
+ // (2) props.source — pre-1.1.13 writer slot (the leaf #parent shape lives here).
154
+ const props = node.props;
155
+ if (props !== null && typeof props === 'object' && 'source' in props) {
156
+ const src = props.source;
157
+ if (typeof src === 'string' && src.length > 0) {
158
+ return { carrier: 'props.source', source: src, binding_summary: src };
159
+ }
160
+ if (isStructuredBinding(src)) {
161
+ return { carrier: 'props.source', source: src, binding_summary: summarizeBinding(src) };
162
+ }
163
+ }
164
+ // (3) node.source_extended — YT4 cached/expanded.
165
+ if ('source_extended' in node && isStructuredBinding(node.source_extended)) {
166
+ return {
167
+ carrier: 'source_extended',
168
+ source: node.source_extended,
169
+ binding_summary: summarizeBinding(node.source_extended),
170
+ };
171
+ }
172
+ return null;
173
+ }
105
174
  /**
106
175
  * Maps an `/elements` row to the table shape.
107
176
  *
@@ -109,6 +178,9 @@ export function hasSourceBinding(node) {
109
178
  * `label`, older emit `title` as the human-readable name).
110
179
  * - `has_binding` honours an explicit boolean from the REST plugin, else
111
180
  * derives from `props.source` presence.
181
+ * - F88: when a binding carrier is present, surface the raw `source`
182
+ * object + a compact `binding_summary` so leaf field-bindings are
183
+ * readable back (and appear in `available_fields`).
112
184
  */
113
185
  export function mapElementRow(input) {
114
186
  const label = asString(input.label) !== ''
@@ -119,13 +191,39 @@ export function mapElementRow(input) {
119
191
  // F-06: derive relative path by stripping `/templates/<id>/layout` prefix
120
192
  // so the LLM table column shows uniquely-identifying suffix.
121
193
  const relPath = path.replace(/^\/templates\/[^/]+\/layout/, '') || '/';
122
- return {
194
+ const row = {
123
195
  path,
124
196
  rel_path: relPath,
125
197
  element_type: asString(input.element_type),
126
198
  label,
127
199
  has_binding: explicitBinding ?? hasSourceBinding(input),
128
200
  };
201
+ // F13 (2026-06-09): preserve the row's `props` object when the REST
202
+ // plugin attached it (it does so only on `include=props`, see
203
+ // ElementOps::listOnTemplate). Keeping `props` lets the sparse-fields
204
+ // helper project nested paths (`fields:["props.content"]`) — the same
205
+ // capability page_get_layout flat-mode already has (flattenLayout keeps
206
+ // props). Without this the nested path landed in `unknown_fields` and
207
+ // the value never surfaced. A zero-length array (PHP `json_encode([])`
208
+ // on an empty map from an un-upgraded host) is normalised to `{}` so
209
+ // the shape stays an object, mirroring the element_get C3 defense.
210
+ if (Array.isArray(input.props) && input.props.length === 0) {
211
+ row.props = {};
212
+ }
213
+ else if (input.props !== null &&
214
+ typeof input.props === 'object' &&
215
+ !Array.isArray(input.props)) {
216
+ row.props = input.props;
217
+ }
218
+ // F88: surface the resolved binding so leaf field-mappings are readable
219
+ // back. Only emitted when a carrier is actually present — keeps unbound
220
+ // rows byte-identical (and out of `available_fields`).
221
+ const binding = extractBinding(input);
222
+ if (binding !== null) {
223
+ row.source = binding.source;
224
+ row.binding_summary = binding.binding_summary;
225
+ }
226
+ return row;
129
227
  }
130
228
  function summarizeProps(props) {
131
229
  if (props === null || typeof props !== 'object')
@@ -149,6 +247,17 @@ function listChildTypes(children) {
149
247
  }
150
248
  export function buildElementDetail(payload) {
151
249
  const children = Array.isArray(payload.children) ? payload.children : [];
250
+ // F88: resolve the binding from whichever carrier is present so a bound
251
+ // leaf surfaces a dedicated Binding group (query + leaf field mappings)
252
+ // instead of hiding the source inside the Props-keys summary.
253
+ const bindingNode = {
254
+ ...(payload.props !== null && typeof payload.props === 'object' && !Array.isArray(payload.props)
255
+ ? { props: payload.props }
256
+ : {}),
257
+ ...(payload.source !== undefined ? { source: payload.source } : {}),
258
+ ...(payload.source_extended !== undefined ? { source_extended: payload.source_extended } : {}),
259
+ };
260
+ const binding = extractBinding(bindingNode);
152
261
  return {
153
262
  title: `Element ${payload.path}`,
154
263
  groups: [
@@ -168,6 +277,20 @@ export function buildElementDetail(payload) {
168
277
  { key: 'keys', label: 'Keys', value: summarizeProps(payload.props) },
169
278
  ],
170
279
  },
280
+ // F88: Binding group — only when the element actually carries a
281
+ // source. Surfaces the carrier slot + the compact summary so the
282
+ // agent can read back leaf field-mappings without a props dump.
283
+ ...(binding !== null
284
+ ? [
285
+ {
286
+ label: 'Binding',
287
+ entries: [
288
+ { key: 'carrier', label: 'Carrier', value: binding.carrier, format: 'code' },
289
+ { key: 'summary', label: 'Summary', value: binding.binding_summary },
290
+ ],
291
+ },
292
+ ]
293
+ : []),
171
294
  {
172
295
  label: 'Children',
173
296
  entries: [