@wootsup/yt-builder-mcp 1.1.7 → 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.
- package/README.md +14 -10
- package/bin/yt-builder-mcp.js +55 -40
- package/dist/auth.d.ts +18 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +18 -0
- package/dist/auth.js.map +1 -1
- package/dist/catalog/build-catalog.d.ts +63 -0
- package/dist/catalog/build-catalog.d.ts.map +1 -0
- package/dist/catalog/build-catalog.js +166 -0
- package/dist/catalog/build-catalog.js.map +1 -0
- package/dist/cli/invocation-decision.d.ts +57 -0
- package/dist/cli/invocation-decision.d.ts.map +1 -0
- package/dist/cli/invocation-decision.js +86 -0
- package/dist/cli/invocation-decision.js.map +1 -0
- package/dist/client.d.ts +28 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +40 -1
- package/dist/client.js.map +1 -1
- package/dist/clients/claude-code.d.ts.map +1 -1
- package/dist/clients/claude-code.js +3 -1
- package/dist/clients/claude-code.js.map +1 -1
- package/dist/clients/claude-desktop.d.ts.map +1 -1
- package/dist/clients/claude-desktop.js +3 -1
- package/dist/clients/claude-desktop.js.map +1 -1
- package/dist/clients/cline.d.ts.map +1 -1
- package/dist/clients/cline.js +3 -1
- package/dist/clients/cline.js.map +1 -1
- package/dist/clients/codex-cli.d.ts +1 -1
- package/dist/clients/codex-cli.d.ts.map +1 -1
- package/dist/clients/codex-cli.js +98 -0
- package/dist/clients/codex-cli.js.map +1 -1
- package/dist/clients/continue.d.ts.map +1 -1
- package/dist/clients/continue.js +70 -1
- package/dist/clients/continue.js.map +1 -1
- package/dist/clients/cursor.d.ts.map +1 -1
- package/dist/clients/cursor.js +3 -1
- package/dist/clients/cursor.js.map +1 -1
- package/dist/clients/gemini-cli.d.ts.map +1 -1
- package/dist/clients/gemini-cli.js +3 -1
- package/dist/clients/gemini-cli.js.map +1 -1
- package/dist/clients/index.d.ts +104 -0
- package/dist/clients/index.d.ts.map +1 -1
- package/dist/clients/index.js +141 -0
- package/dist/clients/index.js.map +1 -1
- package/dist/clients/roo-code.d.ts.map +1 -1
- package/dist/clients/roo-code.js +3 -1
- package/dist/clients/roo-code.js.map +1 -1
- package/dist/clients/zed.d.ts.map +1 -1
- package/dist/clients/zed.js +3 -1
- package/dist/clients/zed.js.map +1 -1
- package/dist/gateway/advanced-read-tool.d.ts +37 -0
- package/dist/gateway/advanced-read-tool.d.ts.map +1 -0
- package/dist/gateway/advanced-read-tool.js +156 -0
- package/dist/gateway/advanced-read-tool.js.map +1 -0
- package/dist/gateway/advanced-tool/domains.d.ts +18 -3
- package/dist/gateway/advanced-tool/domains.d.ts.map +1 -1
- package/dist/gateway/advanced-tool/domains.js +28 -9
- package/dist/gateway/advanced-tool/domains.js.map +1 -1
- package/dist/gateway/advanced-tool/register.d.ts.map +1 -1
- package/dist/gateway/advanced-tool/register.js +43 -11
- package/dist/gateway/advanced-tool/register.js.map +1 -1
- package/dist/gateway/essentials.d.ts +14 -4
- package/dist/gateway/essentials.d.ts.map +1 -1
- package/dist/gateway/essentials.js +55 -5
- package/dist/gateway/essentials.js.map +1 -1
- package/dist/gateway/test-support.d.ts +3 -3
- package/dist/gateway/test-support.js +3 -3
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -1
- package/dist/index.js.map +1 -1
- package/dist/install-skill.js +1 -1
- package/dist/proxy/bridge.d.ts +36 -0
- package/dist/proxy/bridge.d.ts.map +1 -0
- package/dist/proxy/bridge.js +129 -0
- package/dist/proxy/bridge.js.map +1 -0
- package/dist/proxy/mode.d.ts +10 -0
- package/dist/proxy/mode.d.ts.map +1 -0
- package/dist/proxy/mode.js +20 -0
- package/dist/proxy/mode.js.map +1 -0
- package/dist/server.d.ts +6 -4
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +14 -4
- package/dist/server.js.map +1 -1
- package/dist/setup-cli.d.ts +41 -0
- package/dist/setup-cli.d.ts.map +1 -1
- package/dist/setup-cli.js +163 -1
- package/dist/setup-cli.js.map +1 -1
- package/dist/setup-prompts.d.ts +23 -0
- package/dist/setup-prompts.d.ts.map +1 -1
- package/dist/setup-prompts.js +76 -1
- package/dist/setup-prompts.js.map +1 -1
- package/dist/setup-wizard.d.ts.map +1 -1
- package/dist/setup-wizard.js +7 -0
- package/dist/setup-wizard.js.map +1 -1
- package/dist/sites/bootstrap.d.ts +41 -0
- package/dist/sites/bootstrap.d.ts.map +1 -0
- package/dist/sites/bootstrap.js +58 -0
- package/dist/sites/bootstrap.js.map +1 -0
- package/dist/sites/client-pool.d.ts +33 -0
- package/dist/sites/client-pool.d.ts.map +1 -1
- package/dist/sites/client-pool.js +69 -1
- package/dist/sites/client-pool.js.map +1 -1
- package/dist/sites/registry.d.ts +30 -0
- package/dist/sites/registry.d.ts.map +1 -1
- package/dist/sites/registry.js.map +1 -1
- package/dist/sites/store.d.ts +8 -1
- package/dist/sites/store.d.ts.map +1 -1
- package/dist/sites/store.js +17 -2
- package/dist/sites/store.js.map +1 -1
- package/dist/sites/tools/index.d.ts.map +1 -1
- package/dist/sites/tools/index.js +9 -1
- package/dist/sites/tools/index.js.map +1 -1
- package/dist/sites/tools/use-site.d.ts +47 -0
- package/dist/sites/tools/use-site.d.ts.map +1 -0
- package/dist/sites/tools/use-site.js +203 -0
- package/dist/sites/tools/use-site.js.map +1 -0
- package/dist/tools/bind-guidance.d.ts +80 -0
- package/dist/tools/bind-guidance.d.ts.map +1 -0
- package/dist/tools/bind-guidance.js +95 -0
- package/dist/tools/bind-guidance.js.map +1 -0
- package/dist/tools/elements/builders.d.ts.map +1 -1
- package/dist/tools/elements/builders.js +75 -18
- package/dist/tools/elements/builders.js.map +1 -1
- package/dist/tools/elements/handlers-write.d.ts +20 -3
- package/dist/tools/elements/handlers-write.d.ts.map +1 -1
- package/dist/tools/elements/handlers-write.js +372 -10
- package/dist/tools/elements/handlers-write.js.map +1 -1
- package/dist/tools/elements/handlers.d.ts +6 -1
- package/dist/tools/elements/handlers.d.ts.map +1 -1
- package/dist/tools/elements/handlers.js +77 -10
- package/dist/tools/elements/handlers.js.map +1 -1
- package/dist/tools/elements/layout-hierarchy-rules.d.ts +62 -0
- package/dist/tools/elements/layout-hierarchy-rules.d.ts.map +1 -0
- package/dist/tools/elements/layout-hierarchy-rules.js +154 -0
- package/dist/tools/elements/layout-hierarchy-rules.js.map +1 -0
- package/dist/tools/format/elements-format.d.ts +35 -0
- package/dist/tools/format/elements-format.d.ts.map +1 -1
- package/dist/tools/format/elements-format.js +134 -12
- package/dist/tools/format/elements-format.js.map +1 -1
- package/dist/tools/format/inspection-format.d.ts +29 -0
- package/dist/tools/format/inspection-format.d.ts.map +1 -1
- package/dist/tools/format/inspection-format.js +99 -22
- package/dist/tools/format/inspection-format.js.map +1 -1
- package/dist/tools/format/pages-format.d.ts.map +1 -1
- package/dist/tools/format/pages-format.js +7 -0
- package/dist/tools/format/pages-format.js.map +1 -1
- package/dist/tools/format/sources-format.d.ts +8 -0
- package/dist/tools/format/sources-format.d.ts.map +1 -1
- package/dist/tools/format/sources-format.js +10 -0
- package/dist/tools/format/sources-format.js.map +1 -1
- package/dist/tools/health.d.ts.map +1 -1
- package/dist/tools/health.js +24 -0
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/inspection.d.ts +24 -0
- package/dist/tools/inspection.d.ts.map +1 -1
- package/dist/tools/inspection.js +297 -5
- package/dist/tools/inspection.js.map +1 -1
- package/dist/tools/layout-flatten.d.ts +11 -8
- package/dist/tools/layout-flatten.d.ts.map +1 -1
- package/dist/tools/layout-flatten.js +17 -6
- package/dist/tools/layout-flatten.js.map +1 -1
- package/dist/tools/multi-items/builders.d.ts.map +1 -1
- package/dist/tools/multi-items/builders.js +18 -3
- package/dist/tools/multi-items/builders.js.map +1 -1
- package/dist/tools/multi-items/clean-implode-handler.d.ts.map +1 -1
- package/dist/tools/multi-items/clean-implode-handler.js +2 -2
- package/dist/tools/multi-items/clean-implode-handler.js.map +1 -1
- package/dist/tools/multi-items/format/inspection-format.d.ts +41 -0
- package/dist/tools/multi-items/format/inspection-format.d.ts.map +1 -0
- package/dist/tools/multi-items/format/inspection-format.js +64 -0
- package/dist/tools/multi-items/format/inspection-format.js.map +1 -0
- package/dist/tools/multi-items/inspect-handler.d.ts +50 -2
- package/dist/tools/multi-items/inspect-handler.d.ts.map +1 -1
- package/dist/tools/multi-items/inspect-handler.js +237 -10
- package/dist/tools/multi-items/inspect-handler.js.map +1 -1
- package/dist/tools/multi-items/inspection-cache.d.ts +85 -0
- package/dist/tools/multi-items/inspection-cache.d.ts.map +1 -0
- package/dist/tools/multi-items/inspection-cache.js +126 -0
- package/dist/tools/multi-items/inspection-cache.js.map +1 -0
- package/dist/tools/pages/builders.d.ts +31 -2
- package/dist/tools/pages/builders.d.ts.map +1 -1
- package/dist/tools/pages/builders.js +173 -17
- package/dist/tools/pages/builders.js.map +1 -1
- package/dist/tools/pages/handlers-read.d.ts +6 -2
- package/dist/tools/pages/handlers-read.d.ts.map +1 -1
- package/dist/tools/pages/handlers-read.js +228 -26
- package/dist/tools/pages/handlers-read.js.map +1 -1
- package/dist/tools/pages/handlers-write.d.ts +143 -7
- package/dist/tools/pages/handlers-write.d.ts.map +1 -1
- package/dist/tools/pages/handlers-write.js +215 -11
- package/dist/tools/pages/handlers-write.js.map +1 -1
- package/dist/tools/pages/index.d.ts +1 -1
- package/dist/tools/pages/index.d.ts.map +1 -1
- package/dist/tools/pages/index.js +1 -1
- package/dist/tools/pages/index.js.map +1 -1
- package/dist/tools/pages/schemas.d.ts +166 -0
- package/dist/tools/pages/schemas.d.ts.map +1 -1
- package/dist/tools/pages/schemas.js +347 -0
- package/dist/tools/pages/schemas.js.map +1 -1
- package/dist/tools/shared-schemas.d.ts.map +1 -1
- package/dist/tools/shared-schemas.js +26 -11
- package/dist/tools/shared-schemas.js.map +1 -1
- package/dist/tools/sources/builders.d.ts.map +1 -1
- package/dist/tools/sources/builders.js +64 -6
- package/dist/tools/sources/builders.js.map +1 -1
- package/dist/tools/sources/handlers-bind.d.ts +13 -1
- package/dist/tools/sources/handlers-bind.d.ts.map +1 -1
- package/dist/tools/sources/handlers-bind.js +219 -5
- package/dist/tools/sources/handlers-bind.js.map +1 -1
- package/dist/tools/sources/handlers.d.ts +3 -0
- package/dist/tools/sources/handlers.d.ts.map +1 -1
- package/dist/tools/sources/handlers.js +45 -8
- package/dist/tools/sources/handlers.js.map +1 -1
- package/dist/tools/sparse-fields.d.ts +23 -0
- package/dist/tools/sparse-fields.d.ts.map +1 -1
- package/dist/tools/sparse-fields.js +29 -0
- package/dist/tools/sparse-fields.js.map +1 -1
- package/dist/tools/sublayout/builders.d.ts +23 -0
- package/dist/tools/sublayout/builders.d.ts.map +1 -0
- package/dist/tools/sublayout/builders.js +54 -0
- package/dist/tools/sublayout/builders.js.map +1 -0
- package/dist/tools/sublayout/index.d.ts +13 -0
- package/dist/tools/sublayout/index.d.ts.map +1 -0
- package/dist/tools/sublayout/index.js +13 -0
- package/dist/tools/sublayout/index.js.map +1 -0
- package/dist/tools/sublayout/inspect-sublayout-handler.d.ts +95 -0
- package/dist/tools/sublayout/inspect-sublayout-handler.d.ts.map +1 -0
- package/dist/tools/sublayout/inspect-sublayout-handler.js +181 -0
- package/dist/tools/sublayout/inspect-sublayout-handler.js.map +1 -0
- package/dist/tools/tool-builder/results.d.ts +31 -0
- package/dist/tools/tool-builder/results.d.ts.map +1 -1
- package/dist/tools/tool-builder/results.js +95 -4
- package/dist/tools/tool-builder/results.js.map +1 -1
- package/dist/uninstall-skill.d.ts +52 -0
- package/dist/uninstall-skill.d.ts.map +1 -0
- package/dist/uninstall-skill.js +146 -0
- package/dist/uninstall-skill.js.map +1 -0
- package/dist/uninstall.d.ts +73 -0
- package/dist/uninstall.d.ts.map +1 -0
- package/dist/uninstall.js +82 -0
- package/dist/uninstall.js.map +1 -0
- package/icon.png +0 -0
- package/manifest.json +10 -10
- package/package.json +7 -3
- package/skills/yt-builder-mcp/SKILL.md +157 -88
|
@@ -9,10 +9,175 @@
|
|
|
9
9
|
* @license MIT
|
|
10
10
|
*/
|
|
11
11
|
import { elicitChoice, elicitConfirmation } from '@getimo/mcp-toolkit';
|
|
12
|
-
import { encodeElementPath } from '../../client.js';
|
|
12
|
+
import { encodeElementPath, encodeTemplateId } from '../../client.js';
|
|
13
|
+
import { RestError } from '../../errors.js';
|
|
13
14
|
import { flattenSourcesPayload, mapSourceRow, } from '../format/sources-format.js';
|
|
14
15
|
import { ambiguityFallbackError, } from '../elicitation.js';
|
|
15
16
|
import { confirmGuard, errorResult, jsonResult, } from '../tool-builder.js';
|
|
17
|
+
import { GRID_ITEM_ITERATOR_REJECT, SLOT_COLLISION_STEERING, } from '../bind-guidance.js';
|
|
18
|
+
/**
|
|
19
|
+
* Wave-12 F9 — extract validation-hint fields surfaced by the WP REST
|
|
20
|
+
* plugin when `source_name` is rejected (`unknown_source` code). The PHP
|
|
21
|
+
* controller writes `given`, `did_you_mean`, and `all_published_sources`
|
|
22
|
+
* into the WP_Error data; WordPress serialises that under the response
|
|
23
|
+
* body's `data` key. Surface those hints into the tool-result `context`
|
|
24
|
+
* so the agent can correct + retry in one step.
|
|
25
|
+
*/
|
|
26
|
+
function extractUnknownSourceHints(body) {
|
|
27
|
+
if (body === null || typeof body !== 'object')
|
|
28
|
+
return null;
|
|
29
|
+
const root = body;
|
|
30
|
+
if (root.code !== 'yootheme_builder_mcp.source_binding.unknown_source')
|
|
31
|
+
return null;
|
|
32
|
+
const data = root.data;
|
|
33
|
+
if (data === null || typeof data !== 'object')
|
|
34
|
+
return null;
|
|
35
|
+
const d = data;
|
|
36
|
+
return {
|
|
37
|
+
given: typeof d.given === 'string' ? d.given : undefined,
|
|
38
|
+
did_you_mean: d.did_you_mean,
|
|
39
|
+
all_published_sources: d.all_published_sources,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* F189 — true iff the REST error body is the slot-collision reject (409). The
|
|
44
|
+
* WP plugin writes `code` = `…source_binding.slot_collision`; both platforms
|
|
45
|
+
* also carry `data.error_code === 'slot_collision'` (WordPress nests hint data
|
|
46
|
+
* under `data`; the Joomla envelope surfaces the same `error_code`).
|
|
47
|
+
*/
|
|
48
|
+
function isSlotCollision(body) {
|
|
49
|
+
if (body === null || typeof body !== 'object')
|
|
50
|
+
return false;
|
|
51
|
+
const root = body;
|
|
52
|
+
if (typeof root.code === 'string' &&
|
|
53
|
+
root.code.endsWith('source_binding.slot_collision')) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
if (root.error_code === 'slot_collision')
|
|
57
|
+
return true;
|
|
58
|
+
const data = root.data;
|
|
59
|
+
if (data !== null && typeof data === 'object') {
|
|
60
|
+
return data.error_code === 'slot_collision';
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
/** Pull a `list<string>` from a passthrough body field, or `[]`. */
|
|
65
|
+
function stringList(value) {
|
|
66
|
+
if (!Array.isArray(value))
|
|
67
|
+
return [];
|
|
68
|
+
return value.filter((k) => typeof k === 'string');
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* F174 — the bind succeeded but with ZERO field mappings: each of the N
|
|
72
|
+
* cloned items will render only the template's static placeholder text
|
|
73
|
+
* ("Title" / "Lorem ipsum"), not real data. This is a silent footgun: a
|
|
74
|
+
* caged agent bound source_name + bindingLevel only, the call returned 200
|
|
75
|
+
* + binding_level:"item", and element_get_binding reported a healthy-looking
|
|
76
|
+
* binding — but the frontend showed N identical placeholder cards. The
|
|
77
|
+
* warning is NOT a hard reject (a first bind of just the source can be a
|
|
78
|
+
* legitimate intermediate step), but it must be unmissable.
|
|
79
|
+
*
|
|
80
|
+
* `hadMappings` is true when the bind REQUEST carried a non-empty
|
|
81
|
+
* field_mappings object. We fire only when the request had no mappings AND
|
|
82
|
+
* the response did not report any dropped mappings (a re-bind that shrinks an
|
|
83
|
+
* existing map keeps real data on the kept props — that is the F147 warning's
|
|
84
|
+
* territory, not this one).
|
|
85
|
+
*/
|
|
86
|
+
function zeroFieldMappingsWarning() {
|
|
87
|
+
return ('0 field mappings bound — the cloned items will render the template\'s ' +
|
|
88
|
+
'static placeholder texts (Title / Lorem ipsum), not real data. ' +
|
|
89
|
+
'Re-bind with field_mappings AT THIS ITEM (call element_bind_source ' +
|
|
90
|
+
'again on THIS same element_path with a non-empty ' +
|
|
91
|
+
'field_mappings:{<element_prop>:<source_field>}). Do NOT bind the ' +
|
|
92
|
+
'individual child leaves instead: on YT5 a "#parent" leaf bind written ' +
|
|
93
|
+
'directly under an iterating item renders placeholder text — the ' +
|
|
94
|
+
'field_mappings-at-the-item form is the shape that resolves. Discover ' +
|
|
95
|
+
'props via yootheme_builder_element_type_get_schema, source fields via ' +
|
|
96
|
+
'apimapper_yootheme_binding_for_flow.');
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* F129 + F147 + F174 — when the REST plugin's bind response carries
|
|
100
|
+
* `unknown_prop_keys` (field_mappings keys the target element-type does
|
|
101
|
+
* not render) and/or `dropped_field_mappings` (leaves the new, smaller
|
|
102
|
+
* field_mappings dropped from the prior binding — full replace, not
|
|
103
|
+
* merge), promote them to a TOP-LEVEL `warning` string so both silent-
|
|
104
|
+
* footgun signals are the first thing the agent sees. F174: when the bind
|
|
105
|
+
* persisted a source binding with ZERO field mappings (request had none and
|
|
106
|
+
* none were dropped), promote the placeholder-render footgun warning too.
|
|
107
|
+
* Returns the body unchanged when no signal is present (no warning on the
|
|
108
|
+
* happy path).
|
|
109
|
+
*/
|
|
110
|
+
function withBindWarnings(body, hadMappings) {
|
|
111
|
+
if (body === null || typeof body !== 'object' || Array.isArray(body))
|
|
112
|
+
return body;
|
|
113
|
+
const root = body;
|
|
114
|
+
const unknownKeys = stringList(root.unknown_prop_keys);
|
|
115
|
+
const droppedKeys = stringList(root.dropped_field_mappings);
|
|
116
|
+
const parts = [];
|
|
117
|
+
if (unknownKeys.length > 0) {
|
|
118
|
+
parts.push(`These field_mappings keys are not props the target element renders, ` +
|
|
119
|
+
`so their values will be silently dropped: ${unknownKeys.join(', ')}. ` +
|
|
120
|
+
`Run yootheme_builder_element_type_get_schema for valid prop names ` +
|
|
121
|
+
`(see unknown_prop_keys_did_you_mean for suggestions), or re-bind onto ` +
|
|
122
|
+
`an element that exposes these props.`);
|
|
123
|
+
}
|
|
124
|
+
// G2 (WF1 Phase-2) — the VALUE-side mirror of unknown_prop_keys. A
|
|
125
|
+
// field_mappings VALUE that names a source-field the bound flow does NOT
|
|
126
|
+
// emit binds to nothing → the bind returns 200 but the element renders
|
|
127
|
+
// blank. The PHP chokepoint is the only place that resolves BOTH the
|
|
128
|
+
// source's field set AND the target element, so it flags these as
|
|
129
|
+
// `unknown_source_field_values` (with the available set in
|
|
130
|
+
// `unknown_source_field_values_available`). Promote both into the
|
|
131
|
+
// top-level warning so the agent sees which field is wrong AND the
|
|
132
|
+
// valid choices, in one step.
|
|
133
|
+
const unknownFieldValues = stringList(root.unknown_source_field_values);
|
|
134
|
+
if (unknownFieldValues.length > 0) {
|
|
135
|
+
const available = stringList(root.unknown_source_field_values_available);
|
|
136
|
+
const availableHint = available.length > 0
|
|
137
|
+
? ` Available source fields: ${available.join(', ')}.`
|
|
138
|
+
: '';
|
|
139
|
+
parts.push(`These field_mappings values name source fields the bound source does ` +
|
|
140
|
+
`not emit, so they bind to nothing (the element renders blank): ` +
|
|
141
|
+
`${unknownFieldValues.join(', ')}.${availableHint} Re-bind with a ` +
|
|
142
|
+
`source-field name the flow actually emits — list them via ` +
|
|
143
|
+
`apimapper_yootheme_binding_for_flow.`);
|
|
144
|
+
}
|
|
145
|
+
if (droppedKeys.length > 0) {
|
|
146
|
+
parts.push(`field_mappings is a full REPLACE, not a merge — this re-bind dropped ` +
|
|
147
|
+
`the previously-bound prop(s): ${droppedKeys.join(', ')}. If that was ` +
|
|
148
|
+
`unintended, re-bind with the full set (include the dropped keys).`);
|
|
149
|
+
}
|
|
150
|
+
// F174 — only when the request bound a source with no mappings AND no
|
|
151
|
+
// prior mappings were dropped. A bind that dropped keys still kept real
|
|
152
|
+
// data on the survivors → not a zero-mappings placeholder situation.
|
|
153
|
+
if (!hadMappings && droppedKeys.length === 0 && bindPersistedSource(root)) {
|
|
154
|
+
parts.push(zeroFieldMappingsWarning());
|
|
155
|
+
}
|
|
156
|
+
// F189 — the bind landed a `…List` source on a LEAF renderer (grid_item /
|
|
157
|
+
// any non-container) that ALSO carries nested children. The item's own slot
|
|
158
|
+
// bind resolved, but its nested children are render-dead (the template never
|
|
159
|
+
// renders them). Promote the reject-recipe text so the agent fixes the shape
|
|
160
|
+
// instead of shipping a placeholder grid.
|
|
161
|
+
if (root.iterator_is_leaf_renderer === true) {
|
|
162
|
+
parts.push(GRID_ITEM_ITERATOR_REJECT);
|
|
163
|
+
}
|
|
164
|
+
if (parts.length === 0)
|
|
165
|
+
return body;
|
|
166
|
+
return { ...root, warning: parts.join(' ') };
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* F174 — did the bind response persist an actual source binding (vs an
|
|
170
|
+
* unbind / no-op)? True when the response `binding.source_name` (or the
|
|
171
|
+
* top-level `source_name`) is a non-empty string. Guards the zero-mappings
|
|
172
|
+
* warning so it never fires on an unbind echo.
|
|
173
|
+
*/
|
|
174
|
+
function bindPersistedSource(root) {
|
|
175
|
+
const fromBinding = root.binding !== null && typeof root.binding === 'object' && !Array.isArray(root.binding)
|
|
176
|
+
? root.binding.source_name
|
|
177
|
+
: undefined;
|
|
178
|
+
const name = typeof fromBinding === 'string' ? fromBinding : root.source_name;
|
|
179
|
+
return typeof name === 'string' && name.length > 0;
|
|
180
|
+
}
|
|
16
181
|
// ─── element_bind_source (G.4.3 — ambiguity resolution) ─────────────
|
|
17
182
|
/**
|
|
18
183
|
* Look up sources matching `source_name`. Returns at most one row per
|
|
@@ -82,13 +247,62 @@ export async function handleElementBindSource({ client, elicitation }, input) {
|
|
|
82
247
|
resolvedBody = { ...resolvedBody, source_id };
|
|
83
248
|
}
|
|
84
249
|
try {
|
|
85
|
-
const data = await client.put(`/pages/${
|
|
86
|
-
|
|
250
|
+
const data = await client.put(`/pages/${encodeTemplateId(template_id)}/elements/${encoded}/binding`, { body: resolvedBody, etag });
|
|
251
|
+
// F129 + F147 + F174 — the bind persisted (200), but the REST plugin
|
|
252
|
+
// may have flagged field_mappings keys the target element-type does
|
|
253
|
+
// not render (`unknown_prop_keys`) and/or leaves the new, smaller
|
|
254
|
+
// map dropped from the prior binding (`dropped_field_mappings` —
|
|
255
|
+
// full replace, not merge); and the bind may have persisted a source
|
|
256
|
+
// with ZERO field mappings (renders only template placeholders).
|
|
257
|
+
// All are silent footguns at render time. Lift them into a TOP-LEVEL
|
|
258
|
+
// warning so the agent notices and corrects, rather than leaving the
|
|
259
|
+
// signal buried in the passthrough body.
|
|
260
|
+
const hadMappings = field_mappings !== undefined && Object.keys(field_mappings).length > 0;
|
|
261
|
+
return jsonResult(withBindWarnings(data, hadMappings));
|
|
87
262
|
}
|
|
88
263
|
catch (e) {
|
|
264
|
+
// Wave-12 F9 — surface unknown-source hints directly into the
|
|
265
|
+
// result context so the agent can correct the source_name and
|
|
266
|
+
// retry in one step instead of guessing.
|
|
267
|
+
const baseContext = {
|
|
268
|
+
template_id,
|
|
269
|
+
element_path,
|
|
270
|
+
source_name,
|
|
271
|
+
...(source_id ? { source_id } : {}),
|
|
272
|
+
};
|
|
273
|
+
if (e instanceof RestError) {
|
|
274
|
+
// F189 — slot collision (409): two fields would land on the same
|
|
275
|
+
// parent prop slot during F188 consolidation, OR the lifted key is
|
|
276
|
+
// not a slot of the parent type. The server's message already names
|
|
277
|
+
// the slot + recipe; surface the canonical steering as the hint so
|
|
278
|
+
// the agent gives each field its own leaf / a distinct slot.
|
|
279
|
+
if (isSlotCollision(e.body)) {
|
|
280
|
+
return errorResult({
|
|
281
|
+
error: e,
|
|
282
|
+
context: baseContext,
|
|
283
|
+
hint: SLOT_COLLISION_STEERING,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
const hints = extractUnknownSourceHints(e.body);
|
|
287
|
+
if (hints !== null) {
|
|
288
|
+
if (hints.did_you_mean !== undefined) {
|
|
289
|
+
baseContext.did_you_mean = hints.did_you_mean;
|
|
290
|
+
}
|
|
291
|
+
if (hints.all_published_sources !== undefined) {
|
|
292
|
+
baseContext.all_published_sources = hints.all_published_sources;
|
|
293
|
+
}
|
|
294
|
+
return errorResult({
|
|
295
|
+
error: e,
|
|
296
|
+
context: baseContext,
|
|
297
|
+
hint: 'source_name does not match any published source. Pick from ' +
|
|
298
|
+
'`all_published_sources` (full list) or `did_you_mean` (closest matches) ' +
|
|
299
|
+
'in the context, or run yootheme_builder_sources_list to refresh.',
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
89
303
|
return errorResult({
|
|
90
304
|
error: e,
|
|
91
|
-
context:
|
|
305
|
+
context: baseContext,
|
|
92
306
|
hint: 'Verify source_name via yootheme_builder_sources_list. On 412 ' +
|
|
93
307
|
'refresh ETag and retry.',
|
|
94
308
|
});
|
|
@@ -115,7 +329,7 @@ export async function handleElementUnbindSource({ client, elicitation }, input)
|
|
|
115
329
|
}
|
|
116
330
|
const encoded = encodeElementPath(element_path);
|
|
117
331
|
try {
|
|
118
|
-
const data = await client.delete(`/pages/${
|
|
332
|
+
const data = await client.delete(`/pages/${encodeTemplateId(template_id)}/elements/${encoded}/binding`, { etag });
|
|
119
333
|
return jsonResult(data);
|
|
120
334
|
}
|
|
121
335
|
catch (e) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers-bind.js","sourceRoot":"","sources":["../../../src/tools/sources/handlers-bind.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEvE,OAAO,EAAE,iBAAiB,EAAmB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"handlers-bind.js","sourceRoot":"","sources":["../../../src/tools/sources/handlers-bind.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,12 +18,15 @@ export declare const SOURCES_LIST_OUTPUT_SCHEMA: z.ZodObject<{
|
|
|
18
18
|
projected_fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
19
19
|
available_fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
20
20
|
unknown_fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
21
|
+
projection_warning: z.ZodOptional<z.ZodString>;
|
|
21
22
|
}, z.core.$strip>;
|
|
22
23
|
export declare const BINDING_OUTPUT_SCHEMA: z.ZodObject<{
|
|
23
24
|
template_id: z.ZodString;
|
|
24
25
|
element_path: z.ZodString;
|
|
25
26
|
binding: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
26
27
|
has_binding: z.ZodBoolean;
|
|
28
|
+
field_mapping_count: z.ZodNumber;
|
|
29
|
+
warning: z.ZodOptional<z.ZodString>;
|
|
27
30
|
}, z.core.$strip>;
|
|
28
31
|
export interface SourcesHandlerDeps {
|
|
29
32
|
readonly client: RestClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/tools/sources/handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/tools/sources/handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAuC,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AASvF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAQlE,OAAO,EAGH,KAAK,UAAU,EAClB,MAAM,oBAAoB,CAAC;AAI5B,eAAO,MAAM,0BAA0B;;;;;;;iBAWrC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;iBAahC,CAAC;AAEH,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B;;;;;;OAMG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,wBAAwB,CAAC;CACnD;AAID,wBAAsB,iBAAiB,CACnC,EAAE,MAAM,EAAE,EAAE,kBAAkB,EAC9B,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC3C,OAAO,CAAC,UAAU,CAAC,CA2CrB;AAID,wBAAsB,uBAAuB,CACzC,EAAE,MAAM,EAAE,EAAE,kBAAkB,EAC9B,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC7E,OAAO,CAAC,UAAU,CAAC,CAwDrB;AAID,OAAO,EACH,uBAAuB,EACvB,yBAAyB,GAC5B,MAAM,oBAAoB,CAAC"}
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { detailResult, tableResult } from '@getimo/mcp-toolkit';
|
|
12
12
|
import { z } from 'zod';
|
|
13
|
-
import { encodeElementPath } from '../../client.js';
|
|
14
|
-
import { SOURCES_TABLE_COLUMNS, buildBindingDetail, flattenSourcesPayload, mapSourceRow, remapOriginForPlatform, } from '../format/sources-format.js';
|
|
15
|
-
import { DEFAULT_FIELDS_SOURCES_LIST, projectFields, projectedFieldsEcho, projectionFeedback, } from '../sparse-fields.js';
|
|
13
|
+
import { encodeElementPath, encodeTemplateId } from '../../client.js';
|
|
14
|
+
import { SOURCES_TABLE_COLUMNS, bindingFieldMappingCount, buildBindingDetail, flattenSourcesPayload, mapSourceRow, remapOriginForPlatform, } from '../format/sources-format.js';
|
|
15
|
+
import { DEFAULT_FIELDS_SOURCES_LIST, projectFields, projectedFieldsEcho, projectionFeedback, projectionWarning, } from '../sparse-fields.js';
|
|
16
16
|
import { errorResult, structuredResult, } from '../tool-builder.js';
|
|
17
17
|
// ─── outputSchemas (Wave G.2 §4) ─────────────────────────────────────
|
|
18
18
|
export const SOURCES_LIST_OUTPUT_SCHEMA = z.object({
|
|
@@ -22,12 +22,24 @@ export const SOURCES_LIST_OUTPUT_SCHEMA = z.object({
|
|
|
22
22
|
// F-004 fix (2026-05-25 exhaustive audit): see sparse-fields::projectionFeedback.
|
|
23
23
|
available_fields: z.array(z.string()).optional(),
|
|
24
24
|
unknown_fields: z.array(z.string()).optional(),
|
|
25
|
+
// F23 (2026-06-10): the LOUD unknown-projection warning also rides in
|
|
26
|
+
// structuredContent — hosts that surface structuredContent (not the
|
|
27
|
+
// text leg) to the model would otherwise never see it.
|
|
28
|
+
projection_warning: z.string().optional(),
|
|
25
29
|
});
|
|
26
30
|
export const BINDING_OUTPUT_SCHEMA = z.object({
|
|
27
31
|
template_id: z.string(),
|
|
28
32
|
element_path: z.string(),
|
|
29
33
|
binding: z.record(z.string(), z.unknown()),
|
|
30
34
|
has_binding: z.boolean(),
|
|
35
|
+
// F174 — number of field mappings on the binding. Always present (0 when
|
|
36
|
+
// unbound or mapping-less) so a "verification" read of a bound-but-
|
|
37
|
+
// mapping-less element no longer looks healthy.
|
|
38
|
+
field_mapping_count: z.number().int().nonnegative(),
|
|
39
|
+
// F174 — top-level warning when the element IS bound but has 0 field
|
|
40
|
+
// mappings (the N clones render only the template's static placeholder
|
|
41
|
+
// text). Absent on the happy path.
|
|
42
|
+
warning: z.string().optional(),
|
|
31
43
|
});
|
|
32
44
|
// ─── sources_list ────────────────────────────────────────────────────
|
|
33
45
|
export async function handleSourcesList({ client }, { fields }) {
|
|
@@ -46,13 +58,14 @@ export async function handleSourcesList({ client }, { fields }) {
|
|
|
46
58
|
const items = projectFields(mappedRecords, fields, DEFAULT_FIELDS_SOURCES_LIST);
|
|
47
59
|
const echo = projectedFieldsEcho(fields, DEFAULT_FIELDS_SOURCES_LIST);
|
|
48
60
|
const feedback = projectionFeedback(mappedRecords, fields);
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
: '';
|
|
61
|
+
// F23 (2026-06-09): shared loud-warning helper.
|
|
62
|
+
const unknownNote = projectionWarning(feedback);
|
|
52
63
|
const toolkitResult = tableResult(mappedRecords, {
|
|
53
64
|
columns: [...SOURCES_TABLE_COLUMNS],
|
|
54
65
|
header: (count) => `${String(count)} sources${unknownNote}`,
|
|
55
|
-
footer: '
|
|
66
|
+
footer: 'Bind one directly: yootheme_builder_element_bind_source({ template_id, ' +
|
|
67
|
+
'element_path, source_name, field_mappings }) ' +
|
|
68
|
+
'(a first-class tool in tools/list since F116).',
|
|
56
69
|
});
|
|
57
70
|
return structuredResult(toolkitResult, {
|
|
58
71
|
items,
|
|
@@ -61,6 +74,7 @@ export async function handleSourcesList({ client }, { fields }) {
|
|
|
61
74
|
...(feedback !== undefined ? {
|
|
62
75
|
available_fields: [...feedback.available_fields],
|
|
63
76
|
unknown_fields: [...feedback.unknown_fields],
|
|
77
|
+
...(unknownNote.trim() !== '' ? { projection_warning: unknownNote.trim() } : {}),
|
|
64
78
|
} : {}),
|
|
65
79
|
});
|
|
66
80
|
}
|
|
@@ -76,7 +90,7 @@ export async function handleSourcesList({ client }, { fields }) {
|
|
|
76
90
|
export async function handleElementGetBinding({ client }, { template_id, element_path }) {
|
|
77
91
|
const encoded = encodeElementPath(element_path);
|
|
78
92
|
try {
|
|
79
|
-
const data = await client.get(`/pages/${
|
|
93
|
+
const data = await client.get(`/pages/${encodeTemplateId(template_id)}/elements/${encoded}/binding`);
|
|
80
94
|
const binding = data !== null && typeof data === 'object' ? data : {};
|
|
81
95
|
// F-01-Mapping (Audit v4): trust the BE-computed `has_binding`
|
|
82
96
|
// flag (BindingSerializer SSoT) — it also flips true for an
|
|
@@ -86,12 +100,35 @@ export async function handleElementGetBinding({ client }, { template_id, element
|
|
|
86
100
|
? binding.has_binding
|
|
87
101
|
: typeof binding.source_name === 'string' &&
|
|
88
102
|
binding.source_name.length > 0;
|
|
103
|
+
// F174 — count the field mappings (same extraction the detail builder
|
|
104
|
+
// uses) so a "verification" read surfaces the zero-mappings footgun
|
|
105
|
+
// instead of silently looking healthy. The warning fires ONLY when the
|
|
106
|
+
// element is actually bound but carries no mappings — the N clones then
|
|
107
|
+
// render the template's static placeholder text, not real data.
|
|
108
|
+
const fieldMappingCount = bindingFieldMappingCount(binding);
|
|
109
|
+
const zeroFieldMappings = hasBinding && fieldMappingCount === 0;
|
|
89
110
|
const toolkitResult = detailResult(buildBindingDetail({ template_id, element_path, binding }));
|
|
90
111
|
return structuredResult(toolkitResult, {
|
|
91
112
|
template_id,
|
|
92
113
|
element_path,
|
|
93
114
|
binding,
|
|
94
115
|
has_binding: hasBinding,
|
|
116
|
+
field_mapping_count: fieldMappingCount,
|
|
117
|
+
...(zeroFieldMappings
|
|
118
|
+
? {
|
|
119
|
+
warning: 'This element is bound to a source but has 0 field mappings, ' +
|
|
120
|
+
'so its cloned items render the template\'s static placeholder ' +
|
|
121
|
+
'text (Title / Lorem ipsum), not real data. Re-bind with ' +
|
|
122
|
+
'field_mappings AT THIS ITEM via ' +
|
|
123
|
+
'yootheme_builder_element_bind_source on THIS element_path ' +
|
|
124
|
+
'with field_mappings:{<element_prop>:<source_field>}. Do NOT ' +
|
|
125
|
+
'bind the individual child leaves instead: on YT5 a "#parent" ' +
|
|
126
|
+
'leaf bind written directly under an iterating item renders ' +
|
|
127
|
+
'placeholder text. Discover props with ' +
|
|
128
|
+
'yootheme_builder_element_type_get_schema, source fields ' +
|
|
129
|
+
'with apimapper_yootheme_binding_for_flow.',
|
|
130
|
+
}
|
|
131
|
+
: {}),
|
|
95
132
|
});
|
|
96
133
|
}
|
|
97
134
|
catch (e) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../../src/tools/sources/handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAmB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../../src/tools/sources/handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -103,4 +103,27 @@ export interface ProjectionFeedback {
|
|
|
103
103
|
readonly unknown_fields: readonly string[];
|
|
104
104
|
}
|
|
105
105
|
export declare function projectionFeedback(items: readonly Record<string, unknown>[], requested: readonly string[] | undefined): ProjectionFeedback | undefined;
|
|
106
|
+
/**
|
|
107
|
+
* F23 (2026-06-09): single source of truth for the LOUD text-leg warning
|
|
108
|
+
* a tool appends to its table header when a `fields[]` projection
|
|
109
|
+
* contained keys that did not exist on any row.
|
|
110
|
+
*
|
|
111
|
+
* Before this helper every read tool assembled the note inline (subtly
|
|
112
|
+
* different wording per tool, and a new tool wiring `projectionFeedback`
|
|
113
|
+
* could silently forget the text-leg note entirely — only the
|
|
114
|
+
* structuredContent `unknown_fields` array surfaced it, which cold
|
|
115
|
+
* agents never read). Centralising the string here means ALL tools
|
|
116
|
+
* surface the identical, self-correcting signal:
|
|
117
|
+
*
|
|
118
|
+
* " (unknown projection fields ignored: type — available: rel_path, …)"
|
|
119
|
+
*
|
|
120
|
+
* Returns the EMPTY string when there is nothing to warn about (feedback
|
|
121
|
+
* undefined, or `unknown_fields` empty) so call-sites can unconditionally
|
|
122
|
+
* append the result to their header.
|
|
123
|
+
*
|
|
124
|
+
* The leading space lets a call-site write `header${warning}` without an
|
|
125
|
+
* extra separator; the parentheses keep it visually scoped inside the
|
|
126
|
+
* header line.
|
|
127
|
+
*/
|
|
128
|
+
export declare function projectionWarning(feedback: ProjectionFeedback | undefined): string;
|
|
106
129
|
//# sourceMappingURL=sparse-fields.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sparse-fields.d.ts","sourceRoot":"","sources":["../../src/tools/sparse-fields.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;;GAIG;AACH,eAAO,MAAM,MAAM,wCASd,CAAC;AAEN;;;;GAIG;AACH,eAAO,MAAM,IAAI,4BAMZ,CAAC;AAIN;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAMtD,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,SAAS,MAAM,EAIxD,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAIlD,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,SAAS,MAAM,EAKxD,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAKtD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,EAAE,SAAS,MAAM,EAAE,GAAG,SAAqB,CAAC;AAInF;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EACrC,SAAS,EAAE,SAAS,MAAM,EAAE,GAC7B,CAAC,EAAE,CAWL;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,GAAG,EAAE,CAAC,EACN,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EACrC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GACzC,CAAC,CAQH;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAC/B,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EACxC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GACxC,SAAS,MAAM,EAAE,GAAG,SAAS,CAI/B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,kBAAkB;IAC/B,qDAAqD;IACrD,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,+DAA+D;IAC/D,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AAED,wBAAgB,kBAAkB,CAC9B,KAAK,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACzC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GACzC,kBAAkB,GAAG,SAAS,CAkBhC"}
|
|
1
|
+
{"version":3,"file":"sparse-fields.d.ts","sourceRoot":"","sources":["../../src/tools/sparse-fields.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;;GAIG;AACH,eAAO,MAAM,MAAM,wCASd,CAAC;AAEN;;;;GAIG;AACH,eAAO,MAAM,IAAI,4BAMZ,CAAC;AAIN;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAMtD,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,SAAS,MAAM,EAIxD,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAIlD,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,SAAS,MAAM,EAKxD,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAKtD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,EAAE,SAAS,MAAM,EAAE,GAAG,SAAqB,CAAC;AAInF;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EACrC,SAAS,EAAE,SAAS,MAAM,EAAE,GAC7B,CAAC,EAAE,CAWL;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,GAAG,EAAE,CAAC,EACN,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EACrC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GACzC,CAAC,CAQH;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAC/B,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EACxC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GACxC,SAAS,MAAM,EAAE,GAAG,SAAS,CAI/B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,kBAAkB;IAC/B,qDAAqD;IACrD,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,+DAA+D;IAC/D,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AAED,wBAAgB,kBAAkB,CAC9B,KAAK,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACzC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GACzC,kBAAkB,GAAG,SAAS,CAkBhC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,iBAAiB,CAC7B,QAAQ,EAAE,kBAAkB,GAAG,SAAS,GACzC,MAAM,CAQR"}
|
|
@@ -162,4 +162,33 @@ export function projectionFeedback(items, requested) {
|
|
|
162
162
|
});
|
|
163
163
|
return { available_fields: available, unknown_fields: unknown };
|
|
164
164
|
}
|
|
165
|
+
/**
|
|
166
|
+
* F23 (2026-06-09): single source of truth for the LOUD text-leg warning
|
|
167
|
+
* a tool appends to its table header when a `fields[]` projection
|
|
168
|
+
* contained keys that did not exist on any row.
|
|
169
|
+
*
|
|
170
|
+
* Before this helper every read tool assembled the note inline (subtly
|
|
171
|
+
* different wording per tool, and a new tool wiring `projectionFeedback`
|
|
172
|
+
* could silently forget the text-leg note entirely — only the
|
|
173
|
+
* structuredContent `unknown_fields` array surfaced it, which cold
|
|
174
|
+
* agents never read). Centralising the string here means ALL tools
|
|
175
|
+
* surface the identical, self-correcting signal:
|
|
176
|
+
*
|
|
177
|
+
* " (unknown projection fields ignored: type — available: rel_path, …)"
|
|
178
|
+
*
|
|
179
|
+
* Returns the EMPTY string when there is nothing to warn about (feedback
|
|
180
|
+
* undefined, or `unknown_fields` empty) so call-sites can unconditionally
|
|
181
|
+
* append the result to their header.
|
|
182
|
+
*
|
|
183
|
+
* The leading space lets a call-site write `header${warning}` without an
|
|
184
|
+
* extra separator; the parentheses keep it visually scoped inside the
|
|
185
|
+
* header line.
|
|
186
|
+
*/
|
|
187
|
+
export function projectionWarning(feedback) {
|
|
188
|
+
if (feedback === undefined || feedback.unknown_fields.length === 0) {
|
|
189
|
+
return '';
|
|
190
|
+
}
|
|
191
|
+
return (` (unknown projection fields ignored: ${feedback.unknown_fields.join(', ')}` +
|
|
192
|
+
` — available: ${feedback.available_fields.join(', ')})`);
|
|
193
|
+
}
|
|
165
194
|
//# sourceMappingURL=sparse-fields.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sparse-fields.js","sourceRoot":"","sources":["../../src/tools/sparse-fields.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sparse-fields.js","sourceRoot":"","sources":["../../src/tools/sparse-fields.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sublayout tool builder.
|
|
3
|
+
*
|
|
4
|
+
* Surfaces one tool that operates on the YT5 `< SUBLAYOUT` mechanism
|
|
5
|
+
* (F154 / F93):
|
|
6
|
+
*
|
|
7
|
+
* yootheme_builder_inspect_sublayout
|
|
8
|
+
* → Reports the fragment subtree (bindable leaves with full JSON-Pointer
|
|
9
|
+
* paths) AND the render-time inner grid (gated title/image props), so an
|
|
10
|
+
* agent enriching a panel/grid_item binds the right node and avoids the
|
|
11
|
+
* silent-no-op trap (grid props set but the gate unsatisfied).
|
|
12
|
+
*
|
|
13
|
+
* L2 (advanced lane) — routed via `yootheme_builder_advanced`. It is a
|
|
14
|
+
* specialized layout diagnostic for one element family (panel/grid_item
|
|
15
|
+
* enrichment), not a hot-path every workflow needs (unlike
|
|
16
|
+
* inspect_multi_items_binding, which earns its L1 slot).
|
|
17
|
+
*
|
|
18
|
+
* @license MIT
|
|
19
|
+
*/
|
|
20
|
+
import type { ClientPool } from '../../sites/client-pool.js';
|
|
21
|
+
import { type AnyToolDefinition } from '../tool-builder.js';
|
|
22
|
+
export declare function buildSublayoutTools(pool: ClientPool): readonly AnyToolDefinition[];
|
|
23
|
+
//# sourceMappingURL=builders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../../../src/tools/sublayout/builders.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAG7D,OAAO,EAIH,KAAK,iBAAiB,EACzB,MAAM,oBAAoB,CAAC;AAQ5B,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,iBAAiB,EAAE,CA+BlF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sublayout tool builder.
|
|
3
|
+
*
|
|
4
|
+
* Surfaces one tool that operates on the YT5 `< SUBLAYOUT` mechanism
|
|
5
|
+
* (F154 / F93):
|
|
6
|
+
*
|
|
7
|
+
* yootheme_builder_inspect_sublayout
|
|
8
|
+
* → Reports the fragment subtree (bindable leaves with full JSON-Pointer
|
|
9
|
+
* paths) AND the render-time inner grid (gated title/image props), so an
|
|
10
|
+
* agent enriching a panel/grid_item binds the right node and avoids the
|
|
11
|
+
* silent-no-op trap (grid props set but the gate unsatisfied).
|
|
12
|
+
*
|
|
13
|
+
* L2 (advanced lane) — routed via `yootheme_builder_advanced`. It is a
|
|
14
|
+
* specialized layout diagnostic for one element family (panel/grid_item
|
|
15
|
+
* enrichment), not a hot-path every workflow needs (unlike
|
|
16
|
+
* inspect_multi_items_binding, which earns its L1 slot).
|
|
17
|
+
*
|
|
18
|
+
* @license MIT
|
|
19
|
+
*/
|
|
20
|
+
import { withSiteRetry } from '../pool-resolve-helper.js';
|
|
21
|
+
import { ELEMENT_PATH, SITE_ID_SCHEMA, TEMPLATE_ID } from '../shared-schemas.js';
|
|
22
|
+
import { defineTool, readOnly, withSiteMeta, } from '../tool-builder.js';
|
|
23
|
+
import { InspectionCache } from '../multi-items/inspection-cache.js';
|
|
24
|
+
import { INSPECT_SUBLAYOUT_OUTPUT_SCHEMA, handleInspectSublayout, } from './inspect-sublayout-handler.js';
|
|
25
|
+
export function buildSublayoutTools(pool) {
|
|
26
|
+
// One shared inspection cache per tool-build, keyed on (template_id,
|
|
27
|
+
// element_path, global-etag) with a 60s TTL. A write bumps the global
|
|
28
|
+
// etag and naturally invalidates the entry (mirrors multi-items).
|
|
29
|
+
const inspectionCache = new InspectionCache();
|
|
30
|
+
return [
|
|
31
|
+
defineTool({
|
|
32
|
+
name: 'yootheme_builder_inspect_sublayout',
|
|
33
|
+
description: 'Inspects a panel/grid_item `< SUBLAYOUT`: lists the `fragment` subtree ' +
|
|
34
|
+
'bindable leaves (with JSON-Pointer paths to bind on — NOT the container) ' +
|
|
35
|
+
'and the render-time inner grid. Flags `ungated_grid_prop` (blocking): grid ' +
|
|
36
|
+
'props set but the gate (title_align=left / image_align=left|right) ' +
|
|
37
|
+
'unsatisfied → silent no-op. For container↔item binding see ' +
|
|
38
|
+
'inspect_multi_items_binding. ' +
|
|
39
|
+
'Operates on the default site unless site_id is provided.',
|
|
40
|
+
inputSchema: {
|
|
41
|
+
site_id: SITE_ID_SCHEMA,
|
|
42
|
+
template_id: TEMPLATE_ID,
|
|
43
|
+
element_path: ELEMENT_PATH,
|
|
44
|
+
},
|
|
45
|
+
outputSchema: INSPECT_SUBLAYOUT_OUTPUT_SCHEMA,
|
|
46
|
+
annotations: readOnly('Inspect Sublayout'),
|
|
47
|
+
handler: async ({ site_id, ...rest }) => withSiteRetry(pool, site_id, async (client, site) => {
|
|
48
|
+
const deps = { client, cache: inspectionCache };
|
|
49
|
+
return withSiteMeta(await handleInspectSublayout(deps, rest), site);
|
|
50
|
+
}),
|
|
51
|
+
}),
|
|
52
|
+
];
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=builders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builders.js","sourceRoot":"","sources":["../../../src/tools/sublayout/builders.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EACH,UAAU,EACV,QAAQ,EACR,YAAY,GAEf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EACH,+BAA+B,EAC/B,sBAAsB,GAEzB,MAAM,gCAAgC,CAAC;AAExC,MAAM,UAAU,mBAAmB,CAAC,IAAgB;IAChD,qEAAqE;IACrE,sEAAsE;IACtE,kEAAkE;IAClE,MAAM,eAAe,GAAG,IAAI,eAAe,EAA2B,CAAC;IAEvE,OAAO;QACH,UAAU,CAAC;YACP,IAAI,EAAE,oCAAoC;YAC1C,WAAW,EACP,yEAAyE;gBACzE,2EAA2E;gBAC3E,6EAA6E;gBAC7E,qEAAqE;gBACrE,6DAA6D;gBAC7D,+BAA+B;gBAC/B,0DAA0D;YAC9D,WAAW,EAAE;gBACT,OAAO,EAAE,cAAc;gBACvB,WAAW,EAAE,WAAW;gBACxB,YAAY,EAAE,YAAY;aAC7B;YACD,YAAY,EAAE,+BAA+B;YAC7C,WAAW,EAAE,QAAQ,CAAC,mBAAmB,CAAC;YAC1C,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CACpC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;gBAChD,MAAM,IAAI,GAAyB,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;gBACtE,OAAO,YAAY,CAAC,MAAM,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;YACxE,CAAC,CAAC;SACT,CAAC;KACL,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sublayout tool barrel — public entry-point for the YT5 `< SUBLAYOUT`
|
|
3
|
+
* inspection tool (F154 / F93).
|
|
4
|
+
*
|
|
5
|
+
* yootheme_builder_inspect_sublayout
|
|
6
|
+
* → Report the fragment subtree (bindable leaves) + the render-time inner
|
|
7
|
+
* grid (gated props) for a panel/grid_item.
|
|
8
|
+
*
|
|
9
|
+
* @license MIT
|
|
10
|
+
*/
|
|
11
|
+
export { buildSublayoutTools } from './builders.js';
|
|
12
|
+
export { INSPECT_SUBLAYOUT_OUTPUT_SCHEMA, handleInspectSublayout, type SublayoutHandlerDeps, } from './inspect-sublayout-handler.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|