@wootsup/yt-builder-mcp 1.12.0 → 2.0.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 +128 -30
- package/bin/node-floor.d.ts +28 -0
- package/bin/node-floor.js +123 -0
- package/bin/yt-builder-mcp.js +51 -10
- package/dist/auth.d.ts +3 -121
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +40 -170
- package/dist/auth.js.map +1 -1
- package/dist/catalog/build-catalog.d.ts +4 -49
- package/dist/catalog/build-catalog.d.ts.map +1 -1
- package/dist/catalog/build-catalog.js +15 -126
- package/dist/catalog/build-catalog.js.map +1 -1
- package/dist/catalog/json-schema.d.ts +3 -0
- package/dist/catalog/json-schema.d.ts.map +1 -0
- package/dist/catalog/json-schema.js +68 -0
- package/dist/catalog/json-schema.js.map +1 -0
- package/dist/catalog/output-shapes.d.ts +6 -0
- package/dist/catalog/output-shapes.d.ts.map +1 -0
- package/dist/catalog/output-shapes.js +89 -0
- package/dist/catalog/output-shapes.js.map +1 -0
- package/dist/catalog/tool-catalog-markdown.d.ts +1 -37
- package/dist/catalog/tool-catalog-markdown.d.ts.map +1 -1
- package/dist/catalog/tool-catalog-markdown.js +8 -52
- package/dist/catalog/tool-catalog-markdown.js.map +1 -1
- package/dist/cli/doctor-command.d.ts +2 -7
- package/dist/cli/doctor-command.d.ts.map +1 -1
- package/dist/cli/doctor-command.js +21 -62
- package/dist/cli/doctor-command.js.map +1 -1
- package/dist/cli/invocation-decision.d.ts +4 -52
- package/dist/cli/invocation-decision.d.ts.map +1 -1
- package/dist/cli/invocation-decision.js +45 -54
- package/dist/cli/invocation-decision.js.map +1 -1
- package/dist/client.d.ts +3 -107
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +34 -115
- package/dist/client.js.map +1 -1
- package/dist/clients/claude-code.d.ts +0 -15
- package/dist/clients/claude-code.d.ts.map +1 -1
- package/dist/clients/claude-code.js +0 -22
- package/dist/clients/claude-code.js.map +1 -1
- package/dist/clients/claude-desktop.d.ts +0 -16
- package/dist/clients/claude-desktop.d.ts.map +1 -1
- package/dist/clients/claude-desktop.js +0 -18
- package/dist/clients/claude-desktop.js.map +1 -1
- package/dist/clients/cline.d.ts +0 -23
- package/dist/clients/cline.d.ts.map +1 -1
- package/dist/clients/cline.js +0 -33
- package/dist/clients/cline.js.map +1 -1
- package/dist/clients/codex-cli.d.ts +0 -39
- package/dist/clients/codex-cli.d.ts.map +1 -1
- package/dist/clients/codex-cli.js +0 -137
- package/dist/clients/codex-cli.js.map +1 -1
- package/dist/clients/continue.d.ts +0 -10
- package/dist/clients/continue.d.ts.map +1 -1
- package/dist/clients/continue.js +0 -26
- package/dist/clients/continue.js.map +1 -1
- package/dist/clients/cursor.d.ts +0 -9
- package/dist/clients/cursor.d.ts.map +1 -1
- package/dist/clients/cursor.js +0 -11
- package/dist/clients/cursor.js.map +1 -1
- package/dist/clients/gemini-cli.d.ts +0 -15
- package/dist/clients/gemini-cli.d.ts.map +1 -1
- package/dist/clients/gemini-cli.js +0 -17
- package/dist/clients/gemini-cli.js.map +1 -1
- package/dist/clients/home.d.ts +0 -12
- package/dist/clients/home.d.ts.map +1 -1
- package/dist/clients/home.js +0 -12
- package/dist/clients/home.js.map +1 -1
- package/dist/clients/index.d.ts +0 -150
- package/dist/clients/index.d.ts.map +1 -1
- package/dist/clients/index.js +0 -112
- package/dist/clients/index.js.map +1 -1
- package/dist/clients/roo-code.d.ts +0 -20
- package/dist/clients/roo-code.d.ts.map +1 -1
- package/dist/clients/roo-code.js +0 -22
- package/dist/clients/roo-code.js.map +1 -1
- package/dist/clients/zed.d.ts +0 -9
- package/dist/clients/zed.d.ts.map +1 -1
- package/dist/clients/zed.js +0 -18
- package/dist/clients/zed.js.map +1 -1
- package/dist/compat-floor.d.ts +35 -0
- package/dist/compat-floor.d.ts.map +1 -0
- package/dist/compat-floor.js +84 -0
- package/dist/compat-floor.js.map +1 -0
- package/dist/compat-probe.d.ts +6 -0
- package/dist/compat-probe.d.ts.map +1 -0
- package/dist/compat-probe.js +20 -0
- package/dist/compat-probe.js.map +1 -0
- package/dist/diagnostics/ca-reexec.d.ts +0 -30
- package/dist/diagnostics/ca-reexec.d.ts.map +1 -1
- package/dist/diagnostics/ca-reexec.js +0 -62
- package/dist/diagnostics/ca-reexec.js.map +1 -1
- package/dist/diagnostics/ca-trust.d.ts +0 -22
- package/dist/diagnostics/ca-trust.d.ts.map +1 -1
- package/dist/diagnostics/ca-trust.js +3 -42
- package/dist/diagnostics/ca-trust.js.map +1 -1
- package/dist/diagnostics/diagnose-network-error.d.ts +1 -38
- package/dist/diagnostics/diagnose-network-error.d.ts.map +1 -1
- package/dist/diagnostics/diagnose-network-error.js +26 -37
- package/dist/diagnostics/diagnose-network-error.js.map +1 -1
- package/dist/diagnostics/doctor.d.ts +1 -85
- package/dist/diagnostics/doctor.d.ts.map +1 -1
- package/dist/diagnostics/doctor.js +5 -90
- package/dist/diagnostics/doctor.js.map +1 -1
- package/dist/diagnostics/startup-self-probe.d.ts +3 -25
- package/dist/diagnostics/startup-self-probe.d.ts.map +1 -1
- package/dist/diagnostics/startup-self-probe.js +11 -48
- package/dist/diagnostics/startup-self-probe.js.map +1 -1
- package/dist/errors/hints.d.ts +0 -44
- package/dist/errors/hints.d.ts.map +1 -1
- package/dist/errors/hints.js +0 -32
- package/dist/errors/hints.js.map +1 -1
- package/dist/errors/mask.d.ts +0 -31
- package/dist/errors/mask.d.ts.map +1 -1
- package/dist/errors/mask.js +0 -32
- package/dist/errors/mask.js.map +1 -1
- package/dist/errors/redact-credentials.d.ts +2 -0
- package/dist/errors/redact-credentials.d.ts.map +1 -0
- package/dist/errors/redact-credentials.js +13 -0
- package/dist/errors/redact-credentials.js.map +1 -0
- package/dist/errors/sanitize.d.ts +0 -29
- package/dist/errors/sanitize.d.ts.map +1 -1
- package/dist/errors/sanitize.js +0 -40
- package/dist/errors/sanitize.js.map +1 -1
- package/dist/errors.d.ts +6 -17
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +16 -21
- package/dist/errors.js.map +1 -1
- package/dist/gateway/advanced-read-tool.d.ts +0 -32
- package/dist/gateway/advanced-read-tool.d.ts.map +1 -1
- package/dist/gateway/advanced-read-tool.js +43 -111
- package/dist/gateway/advanced-read-tool.js.map +1 -1
- package/dist/gateway/advanced-tool/discovery.d.ts +1 -12
- package/dist/gateway/advanced-tool/discovery.d.ts.map +1 -1
- package/dist/gateway/advanced-tool/discovery.js +15 -24
- package/dist/gateway/advanced-tool/discovery.js.map +1 -1
- package/dist/gateway/advanced-tool/domains.d.ts +7 -66
- package/dist/gateway/advanced-tool/domains.d.ts.map +1 -1
- package/dist/gateway/advanced-tool/domains.js +36 -80
- package/dist/gateway/advanced-tool/domains.js.map +1 -1
- package/dist/gateway/advanced-tool/execute.d.ts +0 -25
- package/dist/gateway/advanced-tool/execute.d.ts.map +1 -1
- package/dist/gateway/advanced-tool/execute.js +13 -49
- package/dist/gateway/advanced-tool/execute.js.map +1 -1
- package/dist/gateway/advanced-tool/index.d.ts +1 -32
- package/dist/gateway/advanced-tool/index.d.ts.map +1 -1
- package/dist/gateway/advanced-tool/index.js +1 -35
- package/dist/gateway/advanced-tool/index.js.map +1 -1
- package/dist/gateway/advanced-tool/register.d.ts +0 -14
- package/dist/gateway/advanced-tool/register.d.ts.map +1 -1
- package/dist/gateway/advanced-tool/register.js +22 -58
- package/dist/gateway/advanced-tool/register.js.map +1 -1
- package/dist/gateway/advanced-tool.d.ts +0 -11
- package/dist/gateway/advanced-tool.d.ts.map +1 -1
- package/dist/gateway/advanced-tool.js +0 -11
- package/dist/gateway/advanced-tool.js.map +1 -1
- package/dist/gateway/capturing-server.d.ts +3 -88
- package/dist/gateway/capturing-server.d.ts.map +1 -1
- package/dist/gateway/capturing-server.js +0 -77
- package/dist/gateway/capturing-server.js.map +1 -1
- package/dist/gateway/essentials.d.ts +1 -63
- package/dist/gateway/essentials.d.ts.map +1 -1
- package/dist/gateway/essentials.js +9 -178
- package/dist/gateway/essentials.js.map +1 -1
- package/dist/gateway/test-support.d.ts +0 -28
- package/dist/gateway/test-support.d.ts.map +1 -1
- package/dist/gateway/test-support.js +0 -29
- package/dist/gateway/test-support.js.map +1 -1
- package/dist/health-response.d.ts +2 -0
- package/dist/health-response.d.ts.map +1 -0
- package/dist/health-response.js +7 -0
- package/dist/health-response.js.map +1 -0
- package/dist/icon-data.js +0 -3
- package/dist/icon-data.js.map +1 -1
- package/dist/index.d.ts +7 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -130
- package/dist/index.js.map +1 -1
- package/dist/install-skill.d.ts +0 -44
- package/dist/install-skill.d.ts.map +1 -1
- package/dist/install-skill.js +5 -46
- package/dist/install-skill.js.map +1 -1
- package/dist/net/extra-headers.d.ts +0 -58
- package/dist/net/extra-headers.d.ts.map +1 -1
- package/dist/net/extra-headers.js +0 -67
- package/dist/net/extra-headers.js.map +1 -1
- package/dist/net/internal-host.d.ts +0 -31
- package/dist/net/internal-host.d.ts.map +1 -1
- package/dist/net/internal-host.js +7 -65
- package/dist/net/internal-host.js.map +1 -1
- package/dist/net/proxy-dispatcher.d.ts +0 -37
- package/dist/net/proxy-dispatcher.d.ts.map +1 -1
- package/dist/net/proxy-dispatcher.js +0 -40
- package/dist/net/proxy-dispatcher.js.map +1 -1
- package/dist/net/public-fetch.d.ts +53 -0
- package/dist/net/public-fetch.d.ts.map +1 -0
- package/dist/net/public-fetch.js +143 -0
- package/dist/net/public-fetch.js.map +1 -0
- package/dist/net/public-page-report.d.ts +26 -0
- package/dist/net/public-page-report.d.ts.map +1 -0
- package/dist/net/public-page-report.js +145 -0
- package/dist/net/public-page-report.js.map +1 -0
- package/dist/net/redirect-safe-fetch.d.ts +14 -0
- package/dist/net/redirect-safe-fetch.d.ts.map +1 -0
- package/dist/net/redirect-safe-fetch.js +61 -0
- package/dist/net/redirect-safe-fetch.js.map +1 -0
- package/dist/net/session-recovery-fetch.d.ts +7 -0
- package/dist/net/session-recovery-fetch.d.ts.map +1 -0
- package/dist/net/session-recovery-fetch.js +139 -0
- package/dist/net/session-recovery-fetch.js.map +1 -0
- package/dist/net/site-basic-auth.d.ts +1 -59
- package/dist/net/site-basic-auth.d.ts.map +1 -1
- package/dist/net/site-basic-auth.js +5 -94
- package/dist/net/site-basic-auth.js.map +1 -1
- package/dist/package-version.d.ts +2 -0
- package/dist/package-version.d.ts.map +1 -0
- package/dist/package-version.js +15 -0
- package/dist/package-version.js.map +1 -0
- package/dist/platform/detect.d.ts +0 -54
- package/dist/platform/detect.d.ts.map +1 -1
- package/dist/platform/detect.js +0 -53
- package/dist/platform/detect.js.map +1 -1
- package/dist/platform/index.d.ts +0 -100
- package/dist/platform/index.d.ts.map +1 -1
- package/dist/platform/index.js +0 -106
- package/dist/platform/index.js.map +1 -1
- package/dist/platform/joomla.d.ts +0 -35
- package/dist/platform/joomla.d.ts.map +1 -1
- package/dist/platform/joomla.js +0 -35
- package/dist/platform/joomla.js.map +1 -1
- package/dist/proxy/bridge.d.ts +36 -76
- package/dist/proxy/bridge.d.ts.map +1 -1
- package/dist/proxy/bridge.js +443 -136
- package/dist/proxy/bridge.js.map +1 -1
- package/dist/proxy/confirm-elicitation.d.ts +22 -0
- package/dist/proxy/confirm-elicitation.d.ts.map +1 -0
- package/dist/proxy/confirm-elicitation.js +170 -0
- package/dist/proxy/confirm-elicitation.js.map +1 -0
- package/dist/proxy/confirm-question-contract.d.ts +6 -0
- package/dist/proxy/confirm-question-contract.d.ts.map +1 -0
- package/dist/proxy/confirm-question-contract.js +9 -0
- package/dist/proxy/confirm-question-contract.js.map +1 -0
- package/dist/proxy/confirm-question.d.ts +2 -0
- package/dist/proxy/confirm-question.d.ts.map +1 -0
- package/dist/proxy/confirm-question.js +125 -0
- package/dist/proxy/confirm-question.js.map +1 -0
- package/dist/proxy/instructions.d.ts +4 -0
- package/dist/proxy/instructions.d.ts.map +1 -0
- package/dist/proxy/instructions.js +12 -0
- package/dist/proxy/instructions.js.map +1 -0
- package/dist/proxy/mode.d.ts +14 -9
- package/dist/proxy/mode.d.ts.map +1 -1
- package/dist/proxy/mode.js +58 -34
- package/dist/proxy/mode.js.map +1 -1
- package/dist/proxy/multi-site.d.ts +42 -0
- package/dist/proxy/multi-site.d.ts.map +1 -0
- package/dist/proxy/multi-site.js +134 -0
- package/dist/proxy/multi-site.js.map +1 -0
- package/dist/proxy/request-headers.d.ts +9 -0
- package/dist/proxy/request-headers.d.ts.map +1 -0
- package/dist/proxy/request-headers.js +17 -0
- package/dist/proxy/request-headers.js.map +1 -0
- package/dist/proxy/shadow-tools.d.ts +9 -0
- package/dist/proxy/shadow-tools.d.ts.map +1 -0
- package/dist/proxy/shadow-tools.js +42 -0
- package/dist/proxy/shadow-tools.js.map +1 -0
- package/dist/proxy/tools-list-cap.d.ts +7 -0
- package/dist/proxy/tools-list-cap.d.ts.map +1 -0
- package/dist/proxy/tools-list-cap.js +14 -0
- package/dist/proxy/tools-list-cap.js.map +1 -0
- package/dist/proxy/transport-uncertainty.d.ts +2 -0
- package/dist/proxy/transport-uncertainty.d.ts.map +1 -0
- package/dist/proxy/transport-uncertainty.js +8 -0
- package/dist/proxy/transport-uncertainty.js.map +1 -0
- package/dist/proxy/upstream-error.d.ts +7 -0
- package/dist/proxy/upstream-error.d.ts.map +1 -0
- package/dist/proxy/upstream-error.js +35 -0
- package/dist/proxy/upstream-error.js.map +1 -0
- package/dist/proxy/wire-dialect.d.ts +5 -0
- package/dist/proxy/wire-dialect.d.ts.map +1 -0
- package/dist/proxy/wire-dialect.js +33 -0
- package/dist/proxy/wire-dialect.js.map +1 -0
- package/dist/server.d.ts +14 -82
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +107 -203
- package/dist/server.js.map +1 -1
- package/dist/setup/banner-color.d.ts +13 -0
- package/dist/setup/banner-color.d.ts.map +1 -0
- package/dist/setup/banner-color.js +93 -0
- package/dist/setup/banner-color.js.map +1 -0
- package/dist/setup/banner.d.ts +22 -0
- package/dist/setup/banner.d.ts.map +1 -0
- package/dist/setup/banner.js +119 -0
- package/dist/setup/banner.js.map +1 -0
- package/dist/setup/ca-recovery.d.ts +20 -0
- package/dist/setup/ca-recovery.d.ts.map +1 -0
- package/dist/setup/ca-recovery.js +92 -0
- package/dist/setup/ca-recovery.js.map +1 -0
- package/dist/setup/closing.d.ts +15 -0
- package/dist/setup/closing.d.ts.map +1 -0
- package/dist/setup/closing.js +43 -0
- package/dist/setup/closing.js.map +1 -0
- package/dist/setup/corporate-ca.d.ts +16 -0
- package/dist/setup/corporate-ca.d.ts.map +1 -0
- package/dist/setup/corporate-ca.js +32 -0
- package/dist/setup/corporate-ca.js.map +1 -0
- package/dist/setup/host-platform.d.ts +8 -0
- package/dist/setup/host-platform.d.ts.map +1 -0
- package/dist/setup/host-platform.js +21 -0
- package/dist/setup/host-platform.js.map +1 -0
- package/dist/setup/install-configs.d.ts +18 -0
- package/dist/setup/install-configs.d.ts.map +1 -0
- package/dist/setup/install-configs.js +70 -0
- package/dist/setup/install-configs.js.map +1 -0
- package/dist/setup/multi-site-loop.d.ts +14 -0
- package/dist/setup/multi-site-loop.d.ts.map +1 -0
- package/dist/setup/multi-site-loop.js +20 -0
- package/dist/setup/multi-site-loop.js.map +1 -0
- package/dist/setup/phases.d.ts +18 -0
- package/dist/setup/phases.d.ts.map +1 -0
- package/dist/setup/phases.js +55 -0
- package/dist/setup/phases.js.map +1 -0
- package/dist/setup/registry-remedy.d.ts +12 -0
- package/dist/setup/registry-remedy.d.ts.map +1 -0
- package/dist/setup/registry-remedy.js +37 -0
- package/dist/setup/registry-remedy.js.map +1 -0
- package/dist/setup/resume.d.ts +28 -0
- package/dist/setup/resume.d.ts.map +1 -0
- package/dist/setup/resume.js +99 -0
- package/dist/setup/resume.js.map +1 -0
- package/dist/setup-ca-env.d.ts +0 -30
- package/dist/setup-ca-env.d.ts.map +1 -1
- package/dist/setup-ca-env.js +0 -28
- package/dist/setup-ca-env.js.map +1 -1
- package/dist/setup-ca-reprobe.d.ts +0 -25
- package/dist/setup-ca-reprobe.d.ts.map +1 -1
- package/dist/setup-ca-reprobe.js +0 -34
- package/dist/setup-ca-reprobe.js.map +1 -1
- package/dist/setup-cli-confirm.d.ts +0 -34
- package/dist/setup-cli-confirm.d.ts.map +1 -1
- package/dist/setup-cli-confirm.js +0 -36
- package/dist/setup-cli-confirm.js.map +1 -1
- package/dist/setup-cli.d.ts +6 -167
- package/dist/setup-cli.d.ts.map +1 -1
- package/dist/setup-cli.js +161 -173
- package/dist/setup-cli.js.map +1 -1
- package/dist/setup-npx-spec.d.ts +0 -36
- package/dist/setup-npx-spec.d.ts.map +1 -1
- package/dist/setup-npx-spec.js +0 -38
- package/dist/setup-npx-spec.js.map +1 -1
- package/dist/setup-prompts.d.ts +5 -70
- package/dist/setup-prompts.d.ts.map +1 -1
- package/dist/setup-prompts.js +67 -107
- package/dist/setup-prompts.js.map +1 -1
- package/dist/setup-token.d.ts +0 -34
- package/dist/setup-token.d.ts.map +1 -1
- package/dist/setup-token.js +0 -40
- package/dist/setup-token.js.map +1 -1
- package/dist/setup-wizard-defaults.d.ts +0 -36
- package/dist/setup-wizard-defaults.d.ts.map +1 -1
- package/dist/setup-wizard-defaults.js +0 -75
- package/dist/setup-wizard-defaults.js.map +1 -1
- package/dist/setup-wizard-handshake.d.ts +1 -19
- package/dist/setup-wizard-handshake.d.ts.map +1 -1
- package/dist/setup-wizard-handshake.js +8 -45
- package/dist/setup-wizard-handshake.js.map +1 -1
- package/dist/setup-wizard-types.d.ts +16 -209
- package/dist/setup-wizard-types.d.ts.map +1 -1
- package/dist/setup-wizard-types.js +0 -9
- package/dist/setup-wizard-types.js.map +1 -1
- package/dist/setup-wizard.d.ts +0 -28
- package/dist/setup-wizard.d.ts.map +1 -1
- package/dist/setup-wizard.js +167 -412
- package/dist/setup-wizard.js.map +1 -1
- package/dist/setup.d.ts +0 -15
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +0 -15
- package/dist/setup.js.map +1 -1
- package/dist/sites/bootstrap.d.ts +0 -38
- package/dist/sites/bootstrap.d.ts.map +1 -1
- package/dist/sites/bootstrap.js +0 -44
- package/dist/sites/bootstrap.js.map +1 -1
- package/dist/sites/cli/add-site.d.ts +0 -76
- package/dist/sites/cli/add-site.d.ts.map +1 -1
- package/dist/sites/cli/add-site.js +0 -71
- package/dist/sites/cli/add-site.js.map +1 -1
- package/dist/sites/cli/list-sites.d.ts +0 -31
- package/dist/sites/cli/list-sites.d.ts.map +1 -1
- package/dist/sites/cli/list-sites.js +0 -45
- package/dist/sites/cli/list-sites.js.map +1 -1
- package/dist/sites/cli/remove-site.d.ts +0 -37
- package/dist/sites/cli/remove-site.d.ts.map +1 -1
- package/dist/sites/cli/remove-site.js +0 -37
- package/dist/sites/cli/remove-site.js.map +1 -1
- package/dist/sites/cli/set-default.d.ts +0 -25
- package/dist/sites/cli/set-default.d.ts.map +1 -1
- package/dist/sites/cli/set-default.js +0 -22
- package/dist/sites/cli/set-default.js.map +1 -1
- package/dist/sites/cli/test-site.d.ts +0 -44
- package/dist/sites/cli/test-site.d.ts.map +1 -1
- package/dist/sites/cli/test-site.js +0 -39
- package/dist/sites/cli/test-site.js.map +1 -1
- package/dist/sites/client-pool.d.ts +11 -164
- package/dist/sites/client-pool.d.ts.map +1 -1
- package/dist/sites/client-pool.js +73 -194
- package/dist/sites/client-pool.js.map +1 -1
- package/dist/sites/config-problem.d.ts +2 -0
- package/dist/sites/config-problem.d.ts.map +1 -0
- package/dist/sites/config-problem.js +13 -0
- package/dist/sites/config-problem.js.map +1 -0
- package/dist/sites/env-bridge.d.ts +0 -69
- package/dist/sites/env-bridge.d.ts.map +1 -1
- package/dist/sites/env-bridge.js +2 -71
- package/dist/sites/env-bridge.js.map +1 -1
- package/dist/sites/op-inject.d.ts +23 -0
- package/dist/sites/op-inject.d.ts.map +1 -0
- package/dist/sites/op-inject.js +131 -0
- package/dist/sites/op-inject.js.map +1 -0
- package/dist/sites/paths.d.ts +0 -19
- package/dist/sites/paths.d.ts.map +1 -1
- package/dist/sites/paths.js +0 -19
- package/dist/sites/paths.js.map +1 -1
- package/dist/sites/probe.d.ts +1 -47
- package/dist/sites/probe.d.ts.map +1 -1
- package/dist/sites/probe.js +4 -46
- package/dist/sites/probe.js.map +1 -1
- package/dist/sites/registry.d.ts +4 -135
- package/dist/sites/registry.d.ts.map +1 -1
- package/dist/sites/registry.js +4 -98
- package/dist/sites/registry.js.map +1 -1
- package/dist/sites/schema.d.ts +3 -51
- package/dist/sites/schema.d.ts.map +1 -1
- package/dist/sites/schema.js +6 -52
- package/dist/sites/schema.js.map +1 -1
- package/dist/sites/secret-resolver.d.ts +6 -76
- package/dist/sites/secret-resolver.d.ts.map +1 -1
- package/dist/sites/secret-resolver.js +39 -104
- package/dist/sites/secret-resolver.js.map +1 -1
- package/dist/sites/store.d.ts +12 -69
- package/dist/sites/store.d.ts.map +1 -1
- package/dist/sites/store.js +37 -86
- package/dist/sites/store.js.map +1 -1
- package/dist/sites/substituted-registry.d.ts +11 -0
- package/dist/sites/substituted-registry.d.ts.map +1 -0
- package/dist/sites/substituted-registry.js +13 -0
- package/dist/sites/substituted-registry.js.map +1 -0
- package/dist/sites/tools/fetch-public-url.d.ts +4 -0
- package/dist/sites/tools/fetch-public-url.d.ts.map +1 -0
- package/dist/sites/tools/fetch-public-url.js +231 -0
- package/dist/sites/tools/fetch-public-url.js.map +1 -0
- package/dist/sites/tools/index.d.ts +2 -26
- package/dist/sites/tools/index.d.ts.map +1 -1
- package/dist/sites/tools/index.js +5 -28
- package/dist/sites/tools/index.js.map +1 -1
- package/dist/sites/tools/sites-list.d.ts +3 -47
- package/dist/sites/tools/sites-list.d.ts.map +1 -1
- package/dist/sites/tools/sites-list.js +65 -79
- package/dist/sites/tools/sites-list.js.map +1 -1
- package/dist/sites/tools/sites-overview.d.ts +4 -0
- package/dist/sites/tools/sites-overview.d.ts.map +1 -0
- package/dist/sites/tools/sites-overview.js +209 -0
- package/dist/sites/tools/sites-overview.js.map +1 -0
- package/dist/sites/tools/sites-test.d.ts +2 -45
- package/dist/sites/tools/sites-test.d.ts.map +1 -1
- package/dist/sites/tools/sites-test.js +0 -55
- package/dist/sites/tools/sites-test.js.map +1 -1
- package/dist/sites/tools/use-site.d.ts +2 -45
- package/dist/sites/tools/use-site.d.ts.map +1 -1
- package/dist/sites/tools/use-site.js +29 -78
- package/dist/sites/tools/use-site.js.map +1 -1
- package/dist/sites/unknown-name-result.d.ts +10 -0
- package/dist/sites/unknown-name-result.d.ts.map +1 -0
- package/dist/sites/unknown-name-result.js +13 -0
- package/dist/sites/unknown-name-result.js.map +1 -0
- package/dist/skill-instructions.d.ts +7 -0
- package/dist/skill-instructions.d.ts.map +1 -0
- package/dist/skill-instructions.js +84 -0
- package/dist/skill-instructions.js.map +1 -0
- package/dist/skill-loader.d.ts +0 -102
- package/dist/skill-loader.d.ts.map +1 -1
- package/dist/skill-loader.js +4 -142
- package/dist/skill-loader.js.map +1 -1
- package/dist/skill-manifest.d.ts +0 -20
- package/dist/skill-manifest.d.ts.map +1 -1
- package/dist/skill-manifest.js +1 -21
- package/dist/skill-manifest.js.map +1 -1
- package/dist/skill-topics.d.ts +19 -0
- package/dist/skill-topics.d.ts.map +1 -0
- package/dist/skill-topics.js +181 -0
- package/dist/skill-topics.js.map +1 -0
- package/dist/tools/active-site.d.ts +16 -0
- package/dist/tools/active-site.d.ts.map +1 -0
- package/dist/tools/active-site.js +55 -0
- package/dist/tools/active-site.js.map +1 -0
- package/dist/tools/bind-guidance.d.ts +2 -72
- package/dist/tools/bind-guidance.d.ts.map +1 -1
- package/dist/tools/bind-guidance.js +2 -72
- package/dist/tools/bind-guidance.js.map +1 -1
- package/dist/tools/budgeted-table.d.ts +14 -19
- package/dist/tools/budgeted-table.d.ts.map +1 -1
- package/dist/tools/budgeted-table.js +171 -105
- package/dist/tools/budgeted-table.js.map +1 -1
- package/dist/tools/elements/bind-output-schema.d.ts +69 -0
- package/dist/tools/elements/bind-output-schema.d.ts.map +1 -0
- package/dist/tools/elements/bind-output-schema.js +64 -0
- package/dist/tools/elements/bind-output-schema.js.map +1 -0
- package/dist/tools/elements/builders.d.ts +1 -22
- package/dist/tools/elements/builders.d.ts.map +1 -1
- package/dist/tools/elements/builders.js +147 -133
- package/dist/tools/elements/builders.js.map +1 -1
- package/dist/tools/elements/index.d.ts +0 -26
- package/dist/tools/elements/index.d.ts.map +1 -1
- package/dist/tools/elements/index.js +0 -25
- package/dist/tools/elements/index.js.map +1 -1
- package/dist/tools/elements/read-output-schemas.d.ts +121 -0
- package/dist/tools/elements/read-output-schemas.d.ts.map +1 -0
- package/dist/tools/elements/read-output-schemas.js +225 -0
- package/dist/tools/elements/read-output-schemas.js.map +1 -0
- package/dist/tools/elements/write-output-schemas.d.ts +185 -0
- package/dist/tools/elements/write-output-schemas.d.ts.map +1 -0
- package/dist/tools/elements/write-output-schemas.js +98 -0
- package/dist/tools/elements/write-output-schemas.js.map +1 -0
- package/dist/tools/elements.d.ts +0 -11
- package/dist/tools/elements.d.ts.map +1 -1
- package/dist/tools/elements.js +0 -11
- package/dist/tools/elements.js.map +1 -1
- package/dist/tools/format/health-format.d.ts +26 -43
- package/dist/tools/format/health-format.d.ts.map +1 -1
- package/dist/tools/format/health-format.js +28 -60
- package/dist/tools/format/health-format.js.map +1 -1
- package/dist/tools/format/inspection-format.d.ts +2 -54
- package/dist/tools/format/inspection-format.d.ts.map +1 -1
- package/dist/tools/format/inspection-format.js +33 -119
- package/dist/tools/format/inspection-format.js.map +1 -1
- package/dist/tools/format/pages-format.d.ts +32 -69
- package/dist/tools/format/pages-format.d.ts.map +1 -1
- package/dist/tools/format/pages-format.js +114 -139
- package/dist/tools/format/pages-format.js.map +1 -1
- package/dist/tools/format/sources-format.d.ts +5 -39
- package/dist/tools/format/sources-format.d.ts.map +1 -1
- package/dist/tools/format/sources-format.js +57 -87
- package/dist/tools/format/sources-format.js.map +1 -1
- package/dist/tools/health-output-schemas.d.ts +82 -0
- package/dist/tools/health-output-schemas.d.ts.map +1 -0
- package/dist/tools/health-output-schemas.js +130 -0
- package/dist/tools/health-output-schemas.js.map +1 -0
- package/dist/tools/health.d.ts +2 -20
- package/dist/tools/health.d.ts.map +1 -1
- package/dist/tools/health.js +46 -232
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/index.d.ts +1 -26
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +12 -39
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/inspection.d.ts +4 -34
- package/dist/tools/inspection.d.ts.map +1 -1
- package/dist/tools/inspection.js +164 -536
- package/dist/tools/inspection.js.map +1 -1
- package/dist/tools/library.d.ts +115 -127
- package/dist/tools/library.d.ts.map +1 -1
- package/dist/tools/library.js +706 -454
- package/dist/tools/library.js.map +1 -1
- package/dist/tools/local-content/builders.d.ts +1 -17
- package/dist/tools/local-content/builders.d.ts.map +1 -1
- package/dist/tools/local-content/builders.js +103 -46
- package/dist/tools/local-content/builders.js.map +1 -1
- package/dist/tools/local-content/index.d.ts +0 -15
- package/dist/tools/local-content/index.d.ts.map +1 -1
- package/dist/tools/local-content/index.js +0 -14
- package/dist/tools/local-content/index.js.map +1 -1
- package/dist/tools/local-content/schemas.d.ts +31 -47
- package/dist/tools/local-content/schemas.d.ts.map +1 -1
- package/dist/tools/local-content/schemas.js +33 -62
- package/dist/tools/local-content/schemas.js.map +1 -1
- package/dist/tools/modules/builders.d.ts +4 -0
- package/dist/tools/modules/builders.d.ts.map +1 -0
- package/dist/tools/modules/builders.js +58 -0
- package/dist/tools/modules/builders.js.map +1 -0
- package/dist/tools/modules/index.d.ts +2 -0
- package/dist/tools/modules/index.d.ts.map +1 -0
- package/dist/tools/modules/index.js +2 -0
- package/dist/tools/modules/index.js.map +1 -0
- package/dist/tools/modules/module-id-schema.d.ts +4 -0
- package/dist/tools/modules/module-id-schema.d.ts.map +1 -0
- package/dist/tools/modules/module-id-schema.js +14 -0
- package/dist/tools/modules/module-id-schema.js.map +1 -0
- package/dist/tools/modules/module-type-fields.d.ts +10 -0
- package/dist/tools/modules/module-type-fields.d.ts.map +1 -0
- package/dist/tools/modules/module-type-fields.js +34 -0
- package/dist/tools/modules/module-type-fields.js.map +1 -0
- package/dist/tools/modules/modules-create.d.ts +59 -0
- package/dist/tools/modules/modules-create.d.ts.map +1 -0
- package/dist/tools/modules/modules-create.js +154 -0
- package/dist/tools/modules/modules-create.js.map +1 -0
- package/dist/tools/modules/modules-delete.d.ts +51 -0
- package/dist/tools/modules/modules-delete.d.ts.map +1 -0
- package/dist/tools/modules/modules-delete.js +180 -0
- package/dist/tools/modules/modules-delete.js.map +1 -0
- package/dist/tools/modules/modules-update.d.ts +43 -0
- package/dist/tools/modules/modules-update.d.ts.map +1 -0
- package/dist/tools/modules/modules-update.js +177 -0
- package/dist/tools/modules/modules-update.js.map +1 -0
- package/dist/tools/modules/placement-hints.d.ts +5 -0
- package/dist/tools/modules/placement-hints.d.ts.map +1 -0
- package/dist/tools/modules/placement-hints.js +90 -0
- package/dist/tools/modules/placement-hints.js.map +1 -0
- package/dist/tools/modules/placement-ways.d.ts +13 -0
- package/dist/tools/modules/placement-ways.d.ts.map +1 -0
- package/dist/tools/modules/placement-ways.js +61 -0
- package/dist/tools/modules/placement-ways.js.map +1 -0
- package/dist/tools/multi-items/builders.d.ts +1 -21
- package/dist/tools/multi-items/builders.d.ts.map +1 -1
- package/dist/tools/multi-items/builders.js +22 -65
- package/dist/tools/multi-items/builders.js.map +1 -1
- package/dist/tools/multi-items/index.d.ts +0 -15
- package/dist/tools/multi-items/index.d.ts.map +1 -1
- package/dist/tools/multi-items/index.js +0 -15
- package/dist/tools/multi-items/index.js.map +1 -1
- package/dist/tools/multi-items/item-container-map.d.ts +0 -35
- package/dist/tools/multi-items/item-container-map.d.ts.map +1 -1
- package/dist/tools/multi-items/item-container-map.js +0 -35
- package/dist/tools/multi-items/item-container-map.js.map +1 -1
- package/dist/tools/multi-items/output-schemas.d.ts +101 -0
- package/dist/tools/multi-items/output-schemas.d.ts.map +1 -0
- package/dist/tools/multi-items/output-schemas.js +74 -0
- package/dist/tools/multi-items/output-schemas.js.map +1 -0
- package/dist/tools/navigation/builders.d.ts +1 -16
- package/dist/tools/navigation/builders.d.ts.map +1 -1
- package/dist/tools/navigation/builders.js +5 -27
- package/dist/tools/navigation/builders.js.map +1 -1
- package/dist/tools/navigation/index.d.ts +0 -13
- package/dist/tools/navigation/index.d.ts.map +1 -1
- package/dist/tools/navigation/index.js +0 -12
- package/dist/tools/navigation/index.js.map +1 -1
- package/dist/tools/navigation/schemas.d.ts +0 -30
- package/dist/tools/navigation/schemas.d.ts.map +1 -1
- package/dist/tools/navigation/schemas.js +0 -30
- package/dist/tools/navigation/schemas.js.map +1 -1
- package/dist/tools/output-schema-metadata.d.ts +5 -0
- package/dist/tools/output-schema-metadata.d.ts.map +1 -0
- package/dist/tools/output-schema-metadata.js +83 -0
- package/dist/tools/output-schema-metadata.js.map +1 -0
- package/dist/tools/pages/builders.d.ts +1 -41
- package/dist/tools/pages/builders.d.ts.map +1 -1
- package/dist/tools/pages/builders.js +320 -405
- package/dist/tools/pages/builders.js.map +1 -1
- package/dist/tools/pages/header-transparency.d.ts +2 -32
- package/dist/tools/pages/header-transparency.d.ts.map +1 -1
- package/dist/tools/pages/header-transparency.js +9 -43
- package/dist/tools/pages/header-transparency.js.map +1 -1
- package/dist/tools/pages/index.d.ts +1 -19
- package/dist/tools/pages/index.d.ts.map +1 -1
- package/dist/tools/pages/index.js +1 -19
- package/dist/tools/pages/index.js.map +1 -1
- package/dist/tools/pages/schemas.d.ts +323 -241
- package/dist/tools/pages/schemas.d.ts.map +1 -1
- package/dist/tools/pages/schemas.js +514 -549
- package/dist/tools/pages/schemas.js.map +1 -1
- package/dist/tools/pages/write-output-schemas.d.ts +139 -0
- package/dist/tools/pages/write-output-schemas.d.ts.map +1 -0
- package/dist/tools/pages/write-output-schemas.js +138 -0
- package/dist/tools/pages/write-output-schemas.js.map +1 -0
- package/dist/tools/pages.d.ts +0 -11
- package/dist/tools/pages.d.ts.map +1 -1
- package/dist/tools/pages.js +0 -11
- package/dist/tools/pages.js.map +1 -1
- package/dist/tools/pool-resolve-helper.d.ts +0 -52
- package/dist/tools/pool-resolve-helper.d.ts.map +1 -1
- package/dist/tools/pool-resolve-helper.js +29 -104
- package/dist/tools/pool-resolve-helper.js.map +1 -1
- package/dist/tools/progress-phases.d.ts +0 -42
- package/dist/tools/progress-phases.d.ts.map +1 -1
- package/dist/tools/progress-phases.js +0 -44
- package/dist/tools/progress-phases.js.map +1 -1
- package/dist/tools/response-budget.d.ts +0 -69
- package/dist/tools/response-budget.d.ts.map +1 -1
- package/dist/tools/response-budget.js +0 -127
- package/dist/tools/response-budget.js.map +1 -1
- package/dist/tools/shared-schemas.d.ts +11 -65
- package/dist/tools/shared-schemas.d.ts.map +1 -1
- package/dist/tools/shared-schemas.js +40 -123
- package/dist/tools/shared-schemas.js.map +1 -1
- package/dist/tools/skill/builders.d.ts +3 -0
- package/dist/tools/skill/builders.d.ts.map +1 -0
- package/dist/tools/skill/builders.js +81 -0
- package/dist/tools/skill/builders.js.map +1 -0
- package/dist/tools/sources/builders.d.ts +1 -11
- package/dist/tools/sources/builders.d.ts.map +1 -1
- package/dist/tools/sources/builders.js +194 -170
- package/dist/tools/sources/builders.js.map +1 -1
- package/dist/tools/sources/index.d.ts +0 -17
- package/dist/tools/sources/index.d.ts.map +1 -1
- package/dist/tools/sources/index.js +0 -16
- package/dist/tools/sources/index.js.map +1 -1
- package/dist/tools/sources/read-output-schemas.d.ts +101 -0
- package/dist/tools/sources/read-output-schemas.d.ts.map +1 -0
- package/dist/tools/sources/read-output-schemas.js +105 -0
- package/dist/tools/sources/read-output-schemas.js.map +1 -0
- package/dist/tools/sources/source-name-argument.d.ts +17 -0
- package/dist/tools/sources/source-name-argument.d.ts.map +1 -0
- package/dist/tools/sources/source-name-argument.js +64 -0
- package/dist/tools/sources/source-name-argument.js.map +1 -0
- package/dist/tools/sources/write-output-schemas.d.ts +100 -0
- package/dist/tools/sources/write-output-schemas.d.ts.map +1 -0
- package/dist/tools/sources/write-output-schemas.js +61 -0
- package/dist/tools/sources/write-output-schemas.js.map +1 -0
- package/dist/tools/sources.d.ts +0 -12
- package/dist/tools/sources.d.ts.map +1 -1
- package/dist/tools/sources.js +0 -12
- package/dist/tools/sources.js.map +1 -1
- package/dist/tools/sparse-fields.d.ts +16 -232
- package/dist/tools/sparse-fields.d.ts.map +1 -1
- package/dist/tools/sparse-fields.js +178 -242
- package/dist/tools/sparse-fields.js.map +1 -1
- package/dist/tools/strict-input.d.ts +5 -0
- package/dist/tools/strict-input.d.ts.map +1 -0
- package/dist/tools/strict-input.js +55 -0
- package/dist/tools/strict-input.js.map +1 -0
- package/dist/tools/sublayout/builders.d.ts +1 -21
- package/dist/tools/sublayout/builders.d.ts.map +1 -1
- package/dist/tools/sublayout/builders.js +10 -39
- package/dist/tools/sublayout/builders.js.map +1 -1
- package/dist/tools/sublayout/index.d.ts +1 -11
- package/dist/tools/sublayout/index.d.ts.map +1 -1
- package/dist/tools/sublayout/index.js +1 -11
- package/dist/tools/sublayout/index.js.map +1 -1
- package/dist/tools/sublayout/output-schemas.d.ts +57 -0
- package/dist/tools/sublayout/output-schemas.d.ts.map +1 -0
- package/dist/tools/sublayout/output-schemas.js +51 -0
- package/dist/tools/sublayout/output-schemas.js.map +1 -0
- package/dist/tools/tool-builder/annotations.d.ts +1 -49
- package/dist/tools/tool-builder/annotations.d.ts.map +1 -1
- package/dist/tools/tool-builder/annotations.js +9 -49
- package/dist/tools/tool-builder/annotations.js.map +1 -1
- package/dist/tools/tool-builder/confirm-preview.d.ts +24 -0
- package/dist/tools/tool-builder/confirm-preview.d.ts.map +1 -0
- package/dist/tools/tool-builder/confirm-preview.js +37 -0
- package/dist/tools/tool-builder/confirm-preview.js.map +1 -0
- package/dist/tools/tool-builder/define.d.ts +6 -26
- package/dist/tools/tool-builder/define.d.ts.map +1 -1
- package/dist/tools/tool-builder/define.js +0 -25
- package/dist/tools/tool-builder/define.js.map +1 -1
- package/dist/tools/tool-builder/index.d.ts +3 -26
- package/dist/tools/tool-builder/index.d.ts.map +1 -1
- package/dist/tools/tool-builder/index.js +2 -25
- package/dist/tools/tool-builder/index.js.map +1 -1
- package/dist/tools/tool-builder/results.d.ts +4 -124
- package/dist/tools/tool-builder/results.d.ts.map +1 -1
- package/dist/tools/tool-builder/results.js +258 -263
- package/dist/tools/tool-builder/results.js.map +1 -1
- package/dist/tools/tool-builder/types.d.ts +5 -59
- package/dist/tools/tool-builder/types.d.ts.map +1 -1
- package/dist/tools/tool-builder/types.js +0 -7
- package/dist/tools/tool-builder/types.js.map +1 -1
- package/dist/tools/tool-builder.d.ts +0 -14
- package/dist/tools/tool-builder.d.ts.map +1 -1
- package/dist/tools/tool-builder.js +0 -14
- package/dist/tools/tool-builder.js.map +1 -1
- package/dist/uninstall-skill.d.ts +0 -41
- package/dist/uninstall-skill.d.ts.map +1 -1
- package/dist/uninstall-skill.js +0 -49
- package/dist/uninstall-skill.js.map +1 -1
- package/dist/uninstall.d.ts +0 -41
- package/dist/uninstall.d.ts.map +1 -1
- package/dist/uninstall.js +1 -29
- package/dist/uninstall.js.map +1 -1
- package/dist/update/update-check.d.ts +0 -26
- package/dist/update/update-check.d.ts.map +1 -1
- package/dist/update/update-check.js +0 -25
- package/dist/update/update-check.js.map +1 -1
- package/manifest.json +4 -5
- package/package.json +4 -4
- package/skills/yt-builder-mcp/SKILL.md +1857 -400
- package/dist/tools/elements/handlers-write.d.ts +0 -89
- package/dist/tools/elements/handlers-write.d.ts.map +0 -1
- package/dist/tools/elements/handlers-write.js +0 -797
- package/dist/tools/elements/handlers-write.js.map +0 -1
- package/dist/tools/elements/handlers.d.ts +0 -130
- package/dist/tools/elements/handlers.d.ts.map +0 -1
- package/dist/tools/elements/handlers.js +0 -581
- package/dist/tools/elements/handlers.js.map +0 -1
- package/dist/tools/elements/layout-hierarchy-rules.d.ts +0 -62
- package/dist/tools/elements/layout-hierarchy-rules.d.ts.map +0 -1
- package/dist/tools/elements/layout-hierarchy-rules.js +0 -154
- package/dist/tools/elements/layout-hierarchy-rules.js.map +0 -1
- package/dist/tools/elements/schema-validation.d.ts +0 -218
- package/dist/tools/elements/schema-validation.d.ts.map +0 -1
- package/dist/tools/elements/schema-validation.js +0 -685
- package/dist/tools/elements/schema-validation.js.map +0 -1
- package/dist/tools/elicitation.d.ts +0 -87
- package/dist/tools/elicitation.d.ts.map +0 -1
- package/dist/tools/elicitation.js +0 -100
- package/dist/tools/elicitation.js.map +0 -1
- package/dist/tools/format/elements-format.d.ts +0 -75
- package/dist/tools/format/elements-format.d.ts.map +0 -1
- package/dist/tools/format/elements-format.js +0 -368
- package/dist/tools/format/elements-format.js.map +0 -1
- package/dist/tools/format/source-schema-format.d.ts +0 -74
- package/dist/tools/format/source-schema-format.d.ts.map +0 -1
- package/dist/tools/format/source-schema-format.js +0 -208
- package/dist/tools/format/source-schema-format.js.map +0 -1
- package/dist/tools/layout-flatten.d.ts +0 -84
- package/dist/tools/layout-flatten.d.ts.map +0 -1
- package/dist/tools/layout-flatten.js +0 -129
- package/dist/tools/layout-flatten.js.map +0 -1
- package/dist/tools/local-content/handlers.d.ts +0 -56
- package/dist/tools/local-content/handlers.d.ts.map +0 -1
- package/dist/tools/local-content/handlers.js +0 -320
- package/dist/tools/local-content/handlers.js.map +0 -1
- package/dist/tools/multi-items/clean-implode-handler.d.ts +0 -37
- package/dist/tools/multi-items/clean-implode-handler.d.ts.map +0 -1
- package/dist/tools/multi-items/clean-implode-handler.js +0 -65
- package/dist/tools/multi-items/clean-implode-handler.js.map +0 -1
- package/dist/tools/multi-items/format/inspection-format.d.ts +0 -41
- package/dist/tools/multi-items/format/inspection-format.d.ts.map +0 -1
- package/dist/tools/multi-items/format/inspection-format.js +0 -64
- package/dist/tools/multi-items/format/inspection-format.js.map +0 -1
- package/dist/tools/multi-items/inspect-handler.d.ts +0 -97
- package/dist/tools/multi-items/inspect-handler.d.ts.map +0 -1
- package/dist/tools/multi-items/inspect-handler.js +0 -323
- package/dist/tools/multi-items/inspect-handler.js.map +0 -1
- package/dist/tools/multi-items/inspection-cache.d.ts +0 -85
- package/dist/tools/multi-items/inspection-cache.d.ts.map +0 -1
- package/dist/tools/multi-items/inspection-cache.js +0 -126
- package/dist/tools/multi-items/inspection-cache.js.map +0 -1
- package/dist/tools/navigation/handlers.d.ts +0 -30
- package/dist/tools/navigation/handlers.d.ts.map +0 -1
- package/dist/tools/navigation/handlers.js +0 -41
- package/dist/tools/navigation/handlers.js.map +0 -1
- package/dist/tools/pages/handlers-audit.d.ts +0 -140
- package/dist/tools/pages/handlers-audit.d.ts.map +0 -1
- package/dist/tools/pages/handlers-audit.js +0 -714
- package/dist/tools/pages/handlers-audit.js.map +0 -1
- package/dist/tools/pages/handlers-read.d.ts +0 -133
- package/dist/tools/pages/handlers-read.d.ts.map +0 -1
- package/dist/tools/pages/handlers-read.js +0 -1061
- package/dist/tools/pages/handlers-read.js.map +0 -1
- package/dist/tools/pages/handlers-write.d.ts +0 -212
- package/dist/tools/pages/handlers-write.d.ts.map +0 -1
- package/dist/tools/pages/handlers-write.js +0 -419
- package/dist/tools/pages/handlers-write.js.map +0 -1
- package/dist/tools/pages/target.d.ts +0 -162
- package/dist/tools/pages/target.d.ts.map +0 -1
- package/dist/tools/pages/target.js +0 -239
- package/dist/tools/pages/target.js.map +0 -1
- package/dist/tools/sources/handlers-bind.d.ts +0 -148
- package/dist/tools/sources/handlers-bind.d.ts.map +0 -1
- package/dist/tools/sources/handlers-bind.js +0 -657
- package/dist/tools/sources/handlers-bind.js.map +0 -1
- package/dist/tools/sources/handlers.d.ts +0 -116
- package/dist/tools/sources/handlers.d.ts.map +0 -1
- package/dist/tools/sources/handlers.js +0 -289
- package/dist/tools/sources/handlers.js.map +0 -1
- package/dist/tools/sublayout/inspect-sublayout-handler.d.ts +0 -95
- package/dist/tools/sublayout/inspect-sublayout-handler.d.ts.map +0 -1
- package/dist/tools/sublayout/inspect-sublayout-handler.js +0 -181
- package/dist/tools/sublayout/inspect-sublayout-handler.js.map +0 -1
package/dist/tools/inspection.js
CHANGED
|
@@ -1,59 +1,48 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Element-type inspection tools.
|
|
3
|
-
*
|
|
4
|
-
* yootheme_builder_element_types_list
|
|
5
|
-
* → catalogue of available element types (tableResult — Wave G.2)
|
|
6
|
-
* yootheme_builder_element_type_get_schema
|
|
7
|
-
* → field schema for a single element type (detailResult — Wave G.2)
|
|
8
|
-
*
|
|
9
|
-
* @license MIT
|
|
10
|
-
*/
|
|
11
1
|
import { detailResult } from '@getimo/mcp-toolkit';
|
|
12
2
|
import { z } from 'zod';
|
|
13
3
|
import { BIND_VIA_GATEWAY_EXAMPLE } from './bind-guidance.js';
|
|
14
4
|
import { TYPES_COMPACT_COLUMNS, TYPES_TABLE_COLUMNS, buildTypeSchemaDetail, flattenTypesPayload, mapTypeRow, } from './format/inspection-format.js';
|
|
15
5
|
import { INCLUDE_META_SCHEMA, SITE_ID_SCHEMA } from './shared-schemas.js';
|
|
6
|
+
import { strictInputObject } from './strict-input.js';
|
|
16
7
|
import { resolveSiteOrError } from './pool-resolve-helper.js';
|
|
17
8
|
import { defineTool, errorResult, readOnly, structuredResult, withSiteMeta, } from './tool-builder.js';
|
|
18
|
-
import { DEFAULT_FIELDS_TYPES_LIST, FIELDS, FIELD_NAMES, FIELD_NAME_CONTAINS, MAX_CHARS, applyMaxChars, projectFields, projectedFieldsEcho, projectionFeedback,
|
|
9
|
+
import { DEFAULT_FIELDS_TYPES_LIST, FIELDS, FIELD_NAMES, FIELD_NAME_CONTAINS, FIELD_COVERAGE_SCHEMA, MAX_CHARS, applyMaxChars, projectFields, prependTextBlock, projectedFieldsEcho, projectionCoverageBlock, projectionDetailBlock, projectionFeedback, projectionInlineNote, projectionNoteText, selectDescriptorsByName, } from './sparse-fields.js';
|
|
19
10
|
import { ITEM_CHILDREN_OF_CONTAINER } from './multi-items/item-container-map.js';
|
|
20
11
|
import { budgetedTableResult } from "./budgeted-table.js";
|
|
21
12
|
import { RESPONSE_BUDGET } from "./response-budget.js";
|
|
22
|
-
// ─── outputSchemas (Wave G.2 §4) ─────────────────────────────────────
|
|
23
13
|
const TYPES_LIST_OUTPUT_SCHEMA = z.object({
|
|
24
14
|
items: z.array(z.record(z.string(), z.unknown())),
|
|
25
15
|
total: z.number(),
|
|
26
16
|
projected_fields: z.array(z.string()).optional(),
|
|
27
|
-
// F-004 fix (2026-05-25 exhaustive audit): see sparse-fields::projectionFeedback.
|
|
28
17
|
available_fields: z.array(z.string()).optional(),
|
|
18
|
+
available_fields_by_kind: z.record(z.string(), z.array(z.string())).optional(),
|
|
29
19
|
unknown_fields: z.array(z.string()).optional(),
|
|
30
|
-
|
|
31
|
-
// structuredContent — hosts that surface structuredContent (not the
|
|
32
|
-
// text leg) to the model would otherwise never see it.
|
|
20
|
+
field_coverage: FIELD_COVERAGE_SCHEMA,
|
|
33
21
|
projection_warning: z.string().optional(),
|
|
34
22
|
});
|
|
35
23
|
const TYPE_SCHEMA_OUTPUT_SCHEMA = z.object({
|
|
36
|
-
name: z.string(),
|
|
24
|
+
name: z.string().optional(),
|
|
25
|
+
element_types: z
|
|
26
|
+
.array(z.object({
|
|
27
|
+
name: z.string(),
|
|
28
|
+
label: z.string().optional(),
|
|
29
|
+
requires_child_type: z.string().optional(),
|
|
30
|
+
origin: z.string().optional(),
|
|
31
|
+
has_children: z.boolean().optional(),
|
|
32
|
+
}))
|
|
33
|
+
.optional(),
|
|
34
|
+
total: z.number().optional(),
|
|
37
35
|
label: z.string().optional(),
|
|
38
36
|
origin: z.string().optional(),
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
has_children: z.boolean().optional(),
|
|
38
|
+
semantic_role: z.string().nullable().optional(),
|
|
39
|
+
available_fields: z.array(z.string()).optional(),
|
|
40
|
+
available_fields_by_kind: z.record(z.string(), z.array(z.string())).optional(),
|
|
41
|
+
unknown_fields: z.array(z.string()).optional(),
|
|
42
|
+
field_coverage: FIELD_COVERAGE_SCHEMA,
|
|
43
|
+
projection_warning: z.string().optional(),
|
|
44
|
+
projected_fields: z.array(z.string()).optional(),
|
|
42
45
|
fields: z.array(z.record(z.string(), z.unknown())).optional(),
|
|
43
|
-
// Task 7b (plan 2026-07-27-02): the fieldset groups' own sentences, stated
|
|
44
|
-
// ONCE each and joined on a field's `group`. YOOtheme parks the semantics of
|
|
45
|
-
// a whole class of fields there rather than on the field
|
|
46
|
-
// (grid.image_width/image_height carry the crop rule this way and declare
|
|
47
|
-
// nothing themselves), so a caller that reads only a descriptor's
|
|
48
|
-
// `description` misses the rule it needed. Narrows with the descriptor
|
|
49
|
-
// selection, so a `field_names` read carries only the groups it named.
|
|
50
|
-
//
|
|
51
|
-
// The RULE is stated here rather than in the 600-char tool description,
|
|
52
|
-
// which names only the key. Same carrier choice, and the same reason, as the
|
|
53
|
-
// `site_id` param description in `docs/mcp-response-budgets.md` §9.2: a
|
|
54
|
-
// schema `.describe()` rides in the wire `tools/list` payload (measured
|
|
55
|
-
// there at 19.2 % of it for `outputSchema`), so this states MORE while
|
|
56
|
-
// costing the tool-description budget nothing.
|
|
57
46
|
groups: z
|
|
58
47
|
.array(z.object({
|
|
59
48
|
name: z.string().describe('Matches a field descriptor\'s `group`.'),
|
|
@@ -69,24 +58,6 @@ const TYPE_SCHEMA_OUTPUT_SCHEMA = z.object({
|
|
|
69
58
|
'descriptor with no `description` is not undocumented, you are ' +
|
|
70
59
|
'reading at the wrong level. Join on the field\'s `group`. ' +
|
|
71
60
|
'Narrows with field_names/name_contains.'),
|
|
72
|
-
// Task 7b Step 4 (plan 2026-07-27-02, inventory groups B, A, L). NOT narrowed
|
|
73
|
-
// by a field_names/name_contains selection: these describe the element TYPE,
|
|
74
|
-
// and the caller asking for two fields of a 154-field type is exactly the
|
|
75
|
-
// caller about to write those two fields.
|
|
76
|
-
//
|
|
77
|
-
// The `.describe()` texts below are deliberately terse. They carry ONLY what
|
|
78
|
-
// a caller cannot read off the arrays themselves — the CNF semantics, the
|
|
79
|
-
// deletion consequence, the `&&`/`parent.` grammar, and what each
|
|
80
|
-
// media_autoswap key means. Everything that IS in the data (which props, which
|
|
81
|
-
// flags, which elements invert the precedence) is stated per element in the
|
|
82
|
-
// RESPONSE, where it costs bytes once per call instead of once per session in
|
|
83
|
-
// every host's tools/list.
|
|
84
|
-
//
|
|
85
|
-
// MEASURED, 2026-07-28: a first draft of these describes added 1953 B to the
|
|
86
|
-
// wire tools/list (136422 B → 138375 B, `tests/perf/token-baseline.test.ts`)
|
|
87
|
-
// and made this tool the largest entry on the server. Spending ~2 KB of every
|
|
88
|
-
// session's discovery payload to narrate four keys defeats the point of
|
|
89
|
-
// shipping them as arrays, so the prose was cut to the non-derivable facts.
|
|
90
61
|
renders_only_if: z
|
|
91
62
|
.array(z.array(z.string()))
|
|
92
63
|
.optional()
|
|
@@ -101,28 +72,6 @@ const TYPE_SCHEMA_OUTPUT_SCHEMA = z.object({
|
|
|
101
72
|
"UNSET and YOOtheme merges its placeholder (prerender, front end too), so " +
|
|
102
73
|
'fills render as lorem ipsum/"Title"/a placeholder image on the LIVE page. ' +
|
|
103
74
|
'Write any suppressed_by key, even "", to suppress the merge and get deletion.'),
|
|
104
|
-
// 2026-07-28. The shipped text said only "it BLANKS (not CSS-hide)", which
|
|
105
|
-
// rules out ONE wrong reading and leaves the other: a caller that turns off
|
|
106
|
-
// a container's `show_title`, watches its titles disappear, and reads
|
|
107
|
-
// "BLANKS" concludes its write was destroyed — and reaches for the one
|
|
108
|
-
// repair that cannot work, re-writing props that were never lost.
|
|
109
|
-
//
|
|
110
|
-
// MEASURED, YOOtheme Pro 5.0.37 (a two-item `grid`, written with
|
|
111
|
-
// element_update_settings + page_publish, read back with page_get_layout and
|
|
112
|
-
// from the published page): `show_title:false` took rendered `.el-title` from
|
|
113
|
-
// 2 to 0 with neither title string anywhere in the section HTML, while the
|
|
114
|
-
// grid's stored children subtree stayed byte-identical (equal sha256, 699 B,
|
|
115
|
-
// `diff` exit 0) and the whole-layout diff was ONE added line — the flag, on
|
|
116
|
-
// the GRID node, nothing on any child. Flipping it back restored the baseline
|
|
117
|
-
// render byte-for-byte. Stripped to `link` alone the items left the output
|
|
118
|
-
// entirely (`.el-item` 2 -> 0, `.uk-grid` 2 -> 1) while the read-back still
|
|
119
|
-
// carried `link` and `link_text` in full. The full measurement, including the
|
|
120
|
-
// source-bound case, is in SKILL.md; the pin is in
|
|
121
|
-
// tests/tools/inspection-blanked-by-parent-describe.test.ts.
|
|
122
|
-
//
|
|
123
|
-
// The two halves are BOTH here, and deliberately not split with SKILL.md,
|
|
124
|
-
// because the audience the defect reached is the cold agent reading one tool
|
|
125
|
-
// response with no skill installed.
|
|
126
75
|
blanked_by_parent: z
|
|
127
76
|
.record(z.string(), z.array(z.string()))
|
|
128
77
|
.optional()
|
|
@@ -140,25 +89,6 @@ const TYPE_SCHEMA_OUTPUT_SCHEMA = z.object({
|
|
|
140
89
|
.describe('Image/video collision, per element — not uniform across YOOtheme. ' +
|
|
141
90
|
'precedence: first non-empty renders. sniffed: URL-sniffed, value MOVED ' +
|
|
142
91
|
'between image/video. clears_on_conflict: prop SET FALSE, not just skipped.'),
|
|
143
|
-
// Task 7b Steps 5-6 (plan 2026-07-27-02, inventory groups P/M/D/E/K/S/O/N/F).
|
|
144
|
-
// Two keys, one mechanism: an id list that costs ~14 B per reference, and the
|
|
145
|
-
// note texts stated ONCE per response. The alternative measured at 2.5-3.0 KB
|
|
146
|
-
// (the inventory's per-prop cost table) because `link_striptags` alone is
|
|
147
|
-
// referenced by 17 (type, prop) pairs.
|
|
148
|
-
//
|
|
149
|
-
// These two `.describe()` texts say only what a caller CANNOT read off one
|
|
150
|
-
// response: that `rules` is a POINTER (an opaque id is useless without knowing
|
|
151
|
-
// where it resolves), why the pointed-at rule is worth following, and the
|
|
152
|
-
// narrowing asymmetry (element-level ids always resolve, field-level ones only
|
|
153
|
-
// while their field is returned — invisible from a single response).
|
|
154
|
-
//
|
|
155
|
-
// MEASURED, 2026-07-28: a first draft of these two texts (495 chars) cost
|
|
156
|
-
// 704 B of the wire tools/list and made this tool the largest entry on the
|
|
157
|
-
// server. The full prose lives in SKILL.md's `rules` + `rule_notes` section
|
|
158
|
-
// instead, where it costs the wire nothing and is ledger-PINNED
|
|
159
|
-
// (skill-md-behavior-truth.test.ts) so it cannot silently vanish — the same
|
|
160
|
-
// carrier choice, and the same reason, as `placeholder`/`enum_labels` in the
|
|
161
|
-
// tool description above.
|
|
162
92
|
rules: z
|
|
163
93
|
.array(z.string())
|
|
164
94
|
.optional()
|
|
@@ -170,25 +100,6 @@ const TYPE_SCHEMA_OUTPUT_SCHEMA = z.object({
|
|
|
170
100
|
.optional()
|
|
171
101
|
.describe('id -> rule text, for the ids this response references. Element-level ids ' +
|
|
172
102
|
'always resolve; a field-level one only while its field is returned.'),
|
|
173
|
-
// 2026-07-28. Found by LIVE verification: both 4.5.33 sites (wp-dev,
|
|
174
|
-
// joomla-dev — their own yootheme_builder_health says so) were served
|
|
175
|
-
// `no_effect: "No effect in YOOtheme Pro 5.0.37 …"`. The claim was read in a
|
|
176
|
-
// 5.0.37 tree; nobody read theirs. Every version-scoped key in this response
|
|
177
|
-
// now names the build it was read on, and `status` says whether that is the
|
|
178
|
-
// build you are running.
|
|
179
|
-
//
|
|
180
|
-
// `keys` is the BOUND, and it is why the describe below can say "those
|
|
181
|
-
// ONLY". This response also carries `binding_contract`, whose `child_type`
|
|
182
|
-
// comes from ItemContainerMap — read on YT-Pro 4.5.33, a DIFFERENT build,
|
|
183
|
-
// with a per-build difference recorded in that file's own docblock. The
|
|
184
|
-
// first draft described this record as covering "the version-scoped keys
|
|
185
|
-
// here", which vouched for it. Listing the covered keys ends that by
|
|
186
|
-
// construction rather than by prose kept in sync with a growing surface.
|
|
187
|
-
//
|
|
188
|
-
// The rule rides in this `.describe()` rather than the 600-char tool
|
|
189
|
-
// description for the same reason `groups` does — a schema describe is on the
|
|
190
|
-
// wire tools/list payload and costs the tool-description budget nothing
|
|
191
|
-
// (`docs/mcp-response-budgets.md` §9.2).
|
|
192
103
|
claims_verified_on: z
|
|
193
104
|
.object({
|
|
194
105
|
build: z.string(),
|
|
@@ -201,18 +112,9 @@ const TYPE_SCHEMA_OUTPUT_SCHEMA = z.object({
|
|
|
201
112
|
'ONLY, never the whole response. "differs"/"unknown" = NOT ' +
|
|
202
113
|
're-checked here, so they are reports, not facts, and no_effect ' +
|
|
203
114
|
'ships as no_effect_unverified.'),
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
// The descriptors THIS response carries. Equal to `field_count` when no
|
|
208
|
-
// `field_names`/`name_contains` selection was made.
|
|
209
|
-
returned_count: z.number(),
|
|
210
|
-
// Wave-6 R3 (2026-05-29): binding contract annotation. Surfaces the
|
|
211
|
-
// Multi-Items binding pattern for container types (grid/slider/switcher/
|
|
212
|
-
// list/accordion/gallery/panel/overlay), and identifies content-binding
|
|
213
|
-
// prop keys for leaf types (headline/text/button/image). Cold-AI #4 had
|
|
214
|
-
// to reverse-engineer this from inspect_multi_items_binding + page
|
|
215
|
-
// layout — this annotation eliminates that step.
|
|
115
|
+
field_count: z.number().optional(),
|
|
116
|
+
returned_count: z.number().optional(),
|
|
117
|
+
next_step: z.string().optional(),
|
|
216
118
|
binding_contract: z
|
|
217
119
|
.object({
|
|
218
120
|
kind: z.enum(['container', 'item', 'leaf', 'none']),
|
|
@@ -220,67 +122,40 @@ const TYPE_SCHEMA_OUTPUT_SCHEMA = z.object({
|
|
|
220
122
|
child_type: z.string().optional(),
|
|
221
123
|
child_required: z.boolean().optional(),
|
|
222
124
|
binding_target_props: z.array(z.string()).optional(),
|
|
223
|
-
// F151 (2026-06-11): the single canonical text prop for this
|
|
224
|
-
// element type (e.g. grid_item → "title", list_item/headline →
|
|
225
|
-
// "content"). Names the right key so the agent does not guess.
|
|
226
125
|
canonical_text_prop: z.string().optional(),
|
|
227
|
-
// F143 (2026-06-11): map_item's single combined "lat,lng"
|
|
228
|
-
// location prop contract — present only for location-bearing
|
|
229
|
-
// item types.
|
|
230
126
|
location_prop: z
|
|
231
127
|
.object({ prop: z.string(), format: z.string() })
|
|
232
128
|
.optional(),
|
|
233
129
|
minimal_layout: z.record(z.string(), z.unknown()).optional(),
|
|
234
130
|
set_via_tool: z.string().optional(),
|
|
235
131
|
discover_source_tool: z.string().optional(),
|
|
236
|
-
// Wave-7 (2026-05-29): explicit anti-patterns. Cold-AI #5 misread
|
|
237
|
-
// the minimal_layout and produced `props.source` nesting instead of
|
|
238
|
-
// sibling — YT-Pro silently ignored the binding and rendered 0 rows.
|
|
239
132
|
do_not: z.array(z.string()).optional(),
|
|
240
133
|
})
|
|
241
134
|
.optional(),
|
|
135
|
+
})
|
|
136
|
+
.superRefine((v, ctx) => {
|
|
137
|
+
if (v.element_types !== undefined)
|
|
138
|
+
return;
|
|
139
|
+
for (const key of ['name', 'field_count', 'returned_count']) {
|
|
140
|
+
if (v[key] === undefined) {
|
|
141
|
+
ctx.addIssue({
|
|
142
|
+
code: 'custom',
|
|
143
|
+
path: [key],
|
|
144
|
+
message: `${key} is required when a single element type was read`,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
242
148
|
});
|
|
243
|
-
// Wave-6 R3 (2026-05-29): Binding-contract derivation.
|
|
244
|
-
//
|
|
245
|
-
// Container types are the Multi-Items hosts — when bound to a source they
|
|
246
|
-
// clone their *_item child once per source row. The binding LIVES on the
|
|
247
|
-
// child item, not the container.
|
|
248
|
-
//
|
|
249
|
-
// Wave-13 A5 (2026-05-31): the canonical 16-pair map lives in
|
|
250
|
-
// `multi-items/item-container-map.ts` (TypeScript mirror of the PHP
|
|
251
|
-
// `ItemContainerMap` constant, pinned via Joomla/WP cross-platform tests).
|
|
252
|
-
// Re-aliased here as CONTAINER_TO_ITEM_TYPE so the binding-contract derivation
|
|
253
|
-
// always agrees with the rest of the surface. The previous inline 10-entry
|
|
254
|
-
// map had drifted (missing button/description_list/nav/popover/social/subnav/
|
|
255
|
-
// table; routed `slider`/`panel`/`overlay` to non-existent item types).
|
|
256
|
-
//
|
|
257
|
-
// Leaf types (headline, text, image) cannot host Multi-Items but they DO
|
|
258
|
-
// accept per-prop source bindings (e.g. `content` of a headline maps to a
|
|
259
|
-
// single source field). We surface the canonical prop keys below so the
|
|
260
|
-
// agent knows which keys to bind without guessing.
|
|
261
149
|
const CONTAINER_TO_ITEM_TYPE = ITEM_CHILDREN_OF_CONTAINER;
|
|
262
150
|
const ITEM_TO_CONTAINER_TYPE = Object.fromEntries(Object.entries(CONTAINER_TO_ITEM_TYPE).map(([k, v]) => [v, k]));
|
|
263
|
-
/** Canonical binding-target props per leaf type. Empty array → leaf type has no clear single-field binding. */
|
|
264
151
|
const LEAF_BINDING_TARGETS = {
|
|
265
|
-
headline: ['content'
|
|
152
|
+
headline: ['content'],
|
|
266
153
|
text: ['content'],
|
|
267
154
|
button: ['content', 'link'],
|
|
268
155
|
image: ['image'],
|
|
269
156
|
icon: ['icon'],
|
|
270
|
-
|
|
271
|
-
subtitle: ['content'],
|
|
157
|
+
quotation: ['content'],
|
|
272
158
|
};
|
|
273
|
-
// F151 (2026-06-11): the SINGLE canonical text prop per element type.
|
|
274
|
-
//
|
|
275
|
-
// Prop names diverge across types — a `grid_item` carries its primary
|
|
276
|
-
// text on `title`, while `list_item`/`headline`/`text` carry it on
|
|
277
|
-
// `content`. A cold agent that guesses one key consistently writes a
|
|
278
|
-
// DEAD prop (silent placeholder, no error). The F129 bind-time validator
|
|
279
|
-
// (Wave 4) already WARNS on unknown prop keys after the fact; this map is
|
|
280
|
-
// the SCHEMA side — it names the right key UP FRONT so the agent never
|
|
281
|
-
// guesses. Only types with an unambiguous single text carrier are listed;
|
|
282
|
-
// types with no clear single text prop are simply omitted (no
|
|
283
|
-
// `canonical_text_prop` emitted).
|
|
284
159
|
const CANONICAL_TEXT_PROP = {
|
|
285
160
|
grid_item: 'title',
|
|
286
161
|
list_item: 'content',
|
|
@@ -288,21 +163,13 @@ const CANONICAL_TEXT_PROP = {
|
|
|
288
163
|
slideshow_item: 'title',
|
|
289
164
|
switcher_item: 'title',
|
|
290
165
|
gallery_item: 'title',
|
|
291
|
-
|
|
166
|
+
'panel-slider_item': 'title',
|
|
292
167
|
headline: 'content',
|
|
293
168
|
text: 'content',
|
|
294
|
-
|
|
295
|
-
subtitle: 'content',
|
|
169
|
+
quotation: 'content',
|
|
296
170
|
button: 'content',
|
|
297
171
|
button_item: 'content',
|
|
298
172
|
};
|
|
299
|
-
// F143 (2026-06-11): `map_item` renders a marker off a SINGLE `location`
|
|
300
|
-
// prop that wants ONE combined "lat,lng" string. Sources almost always
|
|
301
|
-
// supply latitude and longitude as two separate fields, so the natural
|
|
302
|
-
// (wrong) move is to map two props — which leaves the map with zero pins
|
|
303
|
-
// and no error. Surface the contract on the schema so the agent maps one
|
|
304
|
-
// combined value instead. See also the inspect_multi_items_binding hard
|
|
305
|
-
// warning (PHP MultiItemsInspector) for the post-bind safety net.
|
|
306
173
|
const LOCATION_PROP_CONTRACT = {
|
|
307
174
|
map_item: {
|
|
308
175
|
prop: 'location',
|
|
@@ -313,12 +180,6 @@ const LOCATION_PROP_CONTRACT = {
|
|
|
313
180
|
'location binding the map renders 0 markers.',
|
|
314
181
|
},
|
|
315
182
|
};
|
|
316
|
-
/**
|
|
317
|
-
* F151/F143 — attach the canonical single text prop and (for map_item)
|
|
318
|
-
* the location-prop contract to whatever contract `deriveBindingContract`
|
|
319
|
-
* built. Pure: returns a new object, only sets the keys when a mapping
|
|
320
|
-
* exists for `elementType`.
|
|
321
|
-
*/
|
|
322
183
|
function withPropContracts(contract, elementType) {
|
|
323
184
|
const textProp = CANONICAL_TEXT_PROP[elementType];
|
|
324
185
|
const location = LOCATION_PROP_CONTRACT[elementType];
|
|
@@ -328,6 +189,10 @@ function withPropContracts(contract, elementType) {
|
|
|
328
189
|
...(location !== undefined ? { location_prop: { ...location } } : {}),
|
|
329
190
|
};
|
|
330
191
|
}
|
|
192
|
+
const DISCOVER_SOURCE_TOOL = 'apimapper_yootheme_binding_for_flow({ flow_id }) — a tool of the SEPARATE API Mapper ' +
|
|
193
|
+
'MCP server, available only when that server is connected alongside this one. If it ' +
|
|
194
|
+
'is not, read the published source and its fields with yootheme_builder_sources_list ' +
|
|
195
|
+
'and yootheme_builder_source_get_schema instead.';
|
|
331
196
|
function deriveBindingContract(elementType) {
|
|
332
197
|
const built = deriveBindingContractBase(elementType);
|
|
333
198
|
return built !== undefined ? withPropContracts(built, elementType) : built;
|
|
@@ -348,40 +213,24 @@ function deriveBindingContractBase(elementType) {
|
|
|
348
213
|
`N siblings.`,
|
|
349
214
|
child_type: itemType,
|
|
350
215
|
child_required: true,
|
|
351
|
-
// F132 (Wave 4a): the example shows a BARE container + child —
|
|
352
|
-
// NO populated `source` block. element_add's children-guard now
|
|
353
|
-
// rejects a hand-authored `source` anywhere in the tree (it
|
|
354
|
-
// silently renders 0 rows in a stored layout), so teaching the
|
|
355
|
-
// populated shape here would hand the agent a guaranteed reject /
|
|
356
|
-
// broken render. Build this bare structure first, THEN bind the
|
|
357
|
-
// source through the dedicated bind tool — see `set_via_tool`
|
|
358
|
-
// and `do_not` below. The binding lands on the *_item as a
|
|
359
|
-
// SIBLING of `props`/`children`; the bind tool writes it at the
|
|
360
|
-
// correct nesting level so you never hand-author it.
|
|
361
216
|
minimal_layout: {
|
|
362
217
|
type: elementType,
|
|
363
|
-
// Container is bare — it never holds a `source` of its own.
|
|
364
218
|
children: [
|
|
365
219
|
{
|
|
366
220
|
type: itemType,
|
|
367
|
-
// `props` stays minimal — settings only. NO `source`
|
|
368
|
-
// here: add the structure first, then bind via
|
|
369
|
-
// yootheme_builder_element_bind_source (see set_via_tool).
|
|
370
221
|
props: {},
|
|
371
222
|
children: [],
|
|
372
223
|
},
|
|
373
224
|
],
|
|
374
|
-
// After this structure exists, bind the source:
|
|
375
225
|
bind_after_create: 'Call yootheme_builder_element_bind_source on the *_item child ' +
|
|
376
|
-
'(NOT this container). Discover the binding shape
|
|
377
|
-
'
|
|
378
|
-
'to this layout by hand.',
|
|
226
|
+
'(NOT this container). Discover the binding shape via ' +
|
|
227
|
+
'`discover_source_tool` below. Do NOT add `source` to this layout by hand.',
|
|
379
228
|
},
|
|
380
|
-
set_via_tool: 'yootheme_builder_element_bind_source({
|
|
229
|
+
set_via_tool: 'yootheme_builder_element_bind_source({ layout_id, element_path, ' +
|
|
381
230
|
'source_name, field_mappings }) — REQUIRED. The bind tool is a first-class ' +
|
|
382
231
|
'tool in tools/list (since F116); call it directly. Hand-authoring source via ' +
|
|
383
232
|
'element_update_settings is rejected (props-schema does not include source).',
|
|
384
|
-
discover_source_tool:
|
|
233
|
+
discover_source_tool: DISCOVER_SOURCE_TOOL,
|
|
385
234
|
do_not: [
|
|
386
235
|
`Do NOT set \`source\` on the container (${elementType}) itself — only on the *_item child.`,
|
|
387
236
|
`Do NOT nest \`source\` under \`props\` on the ${itemType} — it must be a sibling of props.`,
|
|
@@ -400,16 +249,16 @@ function deriveBindingContractBase(elementType) {
|
|
|
400
249
|
`— do NOT hand-author the source via element_update_settings.** The source must ` +
|
|
401
250
|
`be set on THIS element (as a SIBLING of \`props\`/\`children\`, not nested ` +
|
|
402
251
|
`inside \`props\`), not on the parent ${containerType}.`,
|
|
403
|
-
set_via_tool: 'yootheme_builder_element_bind_source({
|
|
252
|
+
set_via_tool: 'yootheme_builder_element_bind_source({ layout_id, element_path, ' +
|
|
404
253
|
'source_name, field_mappings }) — REQUIRED. The bind tool is a first-class ' +
|
|
405
254
|
'tool in tools/list (since F116); call it directly. Hand-authoring source via ' +
|
|
406
255
|
'element_update_settings is rejected (props-schema does not include source).',
|
|
407
|
-
discover_source_tool:
|
|
256
|
+
discover_source_tool: DISCOVER_SOURCE_TOOL,
|
|
408
257
|
do_not: [
|
|
409
258
|
`Do NOT set \`source\` on the parent ${containerType} — only on this ${elementType}.`,
|
|
410
259
|
'Do NOT nest `source` under `props` — it must be a sibling of `props`/`children`.',
|
|
411
260
|
'Do NOT call element_update_settings with {source} or {source_extended} — bind via ' +
|
|
412
|
-
'yootheme_builder_element_bind_source({
|
|
261
|
+
'yootheme_builder_element_bind_source({ layout_id, element_path, source_name, field_mappings }).',
|
|
413
262
|
'Do NOT add child leaves with their own per-prop `source` + `${builder.source}` placeholders.',
|
|
414
263
|
],
|
|
415
264
|
};
|
|
@@ -422,7 +271,7 @@ function deriveBindingContractBase(elementType) {
|
|
|
422
271
|
`listed in \`binding_target_props\`. NOT a Multi-Items host.`,
|
|
423
272
|
binding_target_props: [...leafTargets],
|
|
424
273
|
set_via_tool: BIND_VIA_GATEWAY_EXAMPLE,
|
|
425
|
-
discover_source_tool:
|
|
274
|
+
discover_source_tool: DISCOVER_SOURCE_TOOL,
|
|
426
275
|
};
|
|
427
276
|
}
|
|
428
277
|
return {
|
|
@@ -432,45 +281,10 @@ function deriveBindingContractBase(elementType) {
|
|
|
432
281
|
'(the bind tool is a first-class tool in tools/list since F116).',
|
|
433
282
|
};
|
|
434
283
|
}
|
|
435
|
-
/**
|
|
436
|
-
* Test-only re-export of the module-private `deriveBindingContract`. Kept
|
|
437
|
-
* out of the public tool surface; consumed by the F132 minimal_layout pin
|
|
438
|
-
* (tests/tools/inspection-minimal-layout-bare.test.ts).
|
|
439
|
-
*/
|
|
440
284
|
export const __test_deriveBindingContract = deriveBindingContract;
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
* in `fields[]` even though they are SIBLINGS of `props` on the node, not props.
|
|
444
|
-
* Writing `props.name` via element_add is silently accepted (the key IS in
|
|
445
|
-
* fields[]) but never renders as the builder label. Annotating them steers the
|
|
446
|
-
* agent to set them OUTSIDE props (a first-class `name` arg is the cross-file
|
|
447
|
-
* follow-up owned by the element_add builder schema).
|
|
448
|
-
*/
|
|
285
|
+
export const __test_CANONICAL_TEXT_PROP = CANONICAL_TEXT_PROP;
|
|
286
|
+
export const __test_LEAF_BINDING_TARGETS = LEAF_BINDING_TARGETS;
|
|
449
287
|
const NODE_LEVEL_FIELD_KEYS = new Set(['name', 'status', 'source', 'id']);
|
|
450
|
-
/**
|
|
451
|
-
* Annotate node-level descriptors (`name`/`status`/`source`/`id`) with
|
|
452
|
-
* `group:'node-level'` + a value_hint so the agent knows they live OUTSIDE
|
|
453
|
-
* `props`. Non-destructive: returns a shallow-cloned array; other descriptors
|
|
454
|
-
* pass through untouched.
|
|
455
|
-
*
|
|
456
|
-
* `group:'node-level'` OVERRIDES whatever group the descriptor arrived with.
|
|
457
|
-
* That is a change from "only fill an ABSENT group", and it is load-bearing:
|
|
458
|
-
* Task 7b Step 1 (plan 2026-07-27-02) taught the PHP projection to read
|
|
459
|
-
* YOOtheme's fieldset TREE, and YOOtheme does list some of these keys inside a
|
|
460
|
-
* UI group. MEASURED over the real element.php configs: `column.source` and
|
|
461
|
-
* `column.id` now arrive as `{"group":"Advanced"}`, which under the old
|
|
462
|
-
* fill-if-absent rule SUPPRESSED the node-level marker on exactly the two keys
|
|
463
|
-
* whose mis-write is silent (`props.source` is ignored; the real `source` is a
|
|
464
|
-
* sibling of `props`). "This key is not a prop" outranks "this key sits in the
|
|
465
|
-
* Advanced panel" — the first prevents a silent no-op, the second is navigation.
|
|
466
|
-
* The `value_hint` carried the warning either way, but a consumer branching on
|
|
467
|
-
* `group` would have lost it.
|
|
468
|
-
*
|
|
469
|
-
* Safe against the two synthetic groups the PHP side assigns
|
|
470
|
-
* (`runtime-accepted` on button.content/link, `responsive-width` on
|
|
471
|
-
* column.width_*): neither list contains any of these four names, so no
|
|
472
|
-
* deliberate group is clobbered.
|
|
473
|
-
*/
|
|
474
288
|
function annotateNodeLevelFields(fields) {
|
|
475
289
|
return fields.map((field) => {
|
|
476
290
|
const name = field.name;
|
|
@@ -488,14 +302,6 @@ function annotateNodeLevelFields(fields) {
|
|
|
488
302
|
};
|
|
489
303
|
});
|
|
490
304
|
}
|
|
491
|
-
/**
|
|
492
|
-
* Narrow the root `groups` list to the groups the SELECTED descriptors name.
|
|
493
|
-
*
|
|
494
|
-
* Returns `undefined` when the backend sent no usable list, so a schema without
|
|
495
|
-
* groups (and a payload from an older backend) adds no key and the response
|
|
496
|
-
* stays byte-identical to before. The PHP transport's twin is
|
|
497
|
-
* `McpElementTypeGetSchemaHandler::narrowGroups()`.
|
|
498
|
-
*/
|
|
499
305
|
function narrowGroupsToSelection(raw, selected) {
|
|
500
306
|
if (!Array.isArray(raw))
|
|
501
307
|
return undefined;
|
|
@@ -519,15 +325,6 @@ function narrowGroupsToSelection(raw, selected) {
|
|
|
519
325
|
}
|
|
520
326
|
return groups.filter((g) => named.has(g.name));
|
|
521
327
|
}
|
|
522
|
-
/**
|
|
523
|
-
* Lift the three element-level render rules off the backend payload.
|
|
524
|
-
*
|
|
525
|
-
* Every branch is shape-VALIDATED rather than cast, so a malformed or older
|
|
526
|
-
* backend contributes no key and the response stays byte-identical to before —
|
|
527
|
-
* the same fail-quiet contract as `narrowGroupsToSelection`. A half-valid
|
|
528
|
-
* `media_autoswap` (no `precedence`) is dropped whole rather than forwarded
|
|
529
|
-
* partially: `precedence` is the fact, and the optional keys qualify it.
|
|
530
|
-
*/
|
|
531
328
|
function extractRenderRules(schema) {
|
|
532
329
|
const out = {};
|
|
533
330
|
const isStringList = (v) => Array.isArray(v) && v.every((s) => typeof s === 'string');
|
|
@@ -556,10 +353,6 @@ function extractRenderRules(schema) {
|
|
|
556
353
|
};
|
|
557
354
|
}
|
|
558
355
|
}
|
|
559
|
-
// An EMPTY `fills` is meaningful (the merge fires but adds nothing non-empty,
|
|
560
|
-
// so the gate still drops the node) and is forwarded. A missing or malformed
|
|
561
|
-
// `suppressed_by` is absence: it is the half that decides absent-vs-empty, and
|
|
562
|
-
// half a rule here turns that decision into a guess.
|
|
563
356
|
const fallback = schema.placeholder_fallback;
|
|
564
357
|
if (fallback !== null && typeof fallback === 'object' && !Array.isArray(fallback)) {
|
|
565
358
|
const { suppressed_by, fills } = fallback;
|
|
@@ -569,34 +362,6 @@ function extractRenderRules(schema) {
|
|
|
569
362
|
}
|
|
570
363
|
return out;
|
|
571
364
|
}
|
|
572
|
-
/**
|
|
573
|
-
* Which YOOtheme build the version-scoped keys in this response were READ on,
|
|
574
|
-
* versus what the site reports (2026-07-28).
|
|
575
|
-
*
|
|
576
|
-
* Found by live verification: `element_type_get_schema({element_type:'grid',
|
|
577
|
-
* field_names:['lightbox_image_orientation'], site_id:'wp-dev'})` returned
|
|
578
|
-
* `no_effect: "No effect in YOOtheme Pro 5.0.37 …"` on a site whose own
|
|
579
|
-
* `yootheme_builder_health` reports `"yootheme_version":"4.5.33"`. Same on
|
|
580
|
-
* `joomla-dev`. The PHP side now frames such a claim for the build it is
|
|
581
|
-
* actually talking to; this lifts the record onto the MCP surface so the
|
|
582
|
-
* framing survives the hop.
|
|
583
|
-
*
|
|
584
|
-
* Fail-quiet and shape-VALIDATED like {@link extractRenderRules}: a backend that
|
|
585
|
-
* predates the record (any deployed 1.11.0, which is every site today) sends no
|
|
586
|
-
* key, and the response stays byte-identical to before. `here` is `null` in the
|
|
587
|
-
* `unknown` stance — a real value, so it is validated as nullable rather than
|
|
588
|
-
* dropped, because "we could not resolve it" is exactly the fact worth shipping.
|
|
589
|
-
*
|
|
590
|
-
* ── `keys` IS REQUIRED, NOT OPTIONAL ───────────────────────────────────────
|
|
591
|
-
* `keys` is the record's BOUND: the response keys it vouches for. Without it the
|
|
592
|
-
* record is an unbounded statement about the whole response — and this function's
|
|
593
|
-
* own caller composes `binding_contract` into that response from
|
|
594
|
-
* `ItemContainerMap::MAP`, read on YT-Pro 4.5.33, a DIFFERENT build from the one
|
|
595
|
-
* the record names. A record that reached the wire unbounded would therefore
|
|
596
|
-
* assert exactly the thing it exists to prevent. No shipped plugin emits the
|
|
597
|
-
* unbounded shape (the record has never been released), so requiring the bound
|
|
598
|
-
* costs no compatibility and closes the hole by construction.
|
|
599
|
-
*/
|
|
600
365
|
function extractClaimProvenance(schema) {
|
|
601
366
|
const raw = schema.claims_verified_on;
|
|
602
367
|
if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
|
|
@@ -614,33 +379,6 @@ function extractClaimProvenance(schema) {
|
|
|
614
379
|
return undefined;
|
|
615
380
|
return { build, here, status, keys };
|
|
616
381
|
}
|
|
617
|
-
/**
|
|
618
|
-
* Task 7b Steps 5-6 (plan 2026-07-27-02, inventory groups P, M, D, E, K, S, O, N,
|
|
619
|
-
* F) — the SHARED render-rule notes: `rules` (a list of ids, on the element and on
|
|
620
|
-
* each field) resolved by `rule_notes` (id → the one shared sentence set).
|
|
621
|
-
*
|
|
622
|
-
* Distinct from {@link extractRenderRules} above, which forwards the four
|
|
623
|
-
* machine-readable Step-4 arrays (`renders_only_if` & co.). These are the nine
|
|
624
|
-
* groups an agent cannot deduce and that have no array form — prose, paid for
|
|
625
|
-
* ONCE per response instead of once per referencing prop.
|
|
626
|
-
*
|
|
627
|
-
* Narrowing is the point of this function. `rule_notes` must carry exactly the
|
|
628
|
-
* ids the RESPONSE still references, so a `field_names` read of two descriptors
|
|
629
|
-
* out of 154 does not ship the notes of the 152 it dropped — that would undo
|
|
630
|
-
* Task 4 for the narrow reads it exists to serve, which is the same failure
|
|
631
|
-
* {@link narrowGroupsToSelection} exists to prevent. The element's OWN `rules`
|
|
632
|
-
* always survive: they describe the container the caller is about to write into,
|
|
633
|
-
* not any one descriptor.
|
|
634
|
-
*
|
|
635
|
-
* Read off `selected` (the descriptors this response carries) rather than the
|
|
636
|
-
* sub-key-projected `fields`, for the same reason `groups` is: `fields:["type"]`
|
|
637
|
-
* strips the `rules` key itself, and narrowing on the projected list would then
|
|
638
|
-
* delete every note the caller can still see referenced nowhere.
|
|
639
|
-
*
|
|
640
|
-
* A referenced id with no note is dropped rather than forwarded as a dangling
|
|
641
|
-
* pointer, and a note nobody references is dropped rather than forwarded as
|
|
642
|
-
* dead weight.
|
|
643
|
-
*/
|
|
644
382
|
function extractSharedRuleNotes(schema, selected) {
|
|
645
383
|
const isStringList = (v) => Array.isArray(v) && v.every((s) => typeof s === 'string');
|
|
646
384
|
const elementRules = isStringList(schema.rules) ? schema.rules : [];
|
|
@@ -670,17 +408,10 @@ export function buildInspectionTools(pool) {
|
|
|
670
408
|
return [
|
|
671
409
|
defineTool({
|
|
672
410
|
name: 'yootheme_builder_element_types_list',
|
|
673
|
-
description: 'List element types registered on this site (built-ins + ' +
|
|
674
|
-
'
|
|
675
|
-
'
|
|
676
|
-
|
|
677
|
-
// names. F62: prop keys are per-element (grid_item `title` vs
|
|
678
|
-
// headline `content`) — call element_type_get_schema first.
|
|
679
|
-
'Keywords: "slider"/"carousel" → `slideshow`/`panel-slider`/`overlay-slider`. ' +
|
|
680
|
-
'Prop keys differ per element (grid_item `title` vs headline `content`) — ' +
|
|
681
|
-
'use element_type_get_schema before element_add/bind. Container rows carry ' +
|
|
682
|
-
'`requires_child_type` (grid→grid_item); `has_children`/`has_children_support` ' +
|
|
683
|
-
'are aliases (same value).',
|
|
411
|
+
description: 'List element types registered on this site (built-ins + YOOessentials extras). ' +
|
|
412
|
+
'Names feed `element_type` of element_add. ' +
|
|
413
|
+
'"slider"/"carousel" → `slideshow`/`panel-slider`/`overlay-slider`. Prop keys ' +
|
|
414
|
+
'differ per element — use element_type_get_schema before element_add/bind.',
|
|
684
415
|
inputSchema: {
|
|
685
416
|
site_id: SITE_ID_SCHEMA,
|
|
686
417
|
fields: FIELDS,
|
|
@@ -697,10 +428,6 @@ export function buildInspectionTools(pool) {
|
|
|
697
428
|
const data = await siteClient.get('/element-types');
|
|
698
429
|
const flat = flattenTypesPayload(data);
|
|
699
430
|
const mapped = flat.map(mapTypeRow);
|
|
700
|
-
// ELEMENT_WRITE-26: surface the container→item pairing per row
|
|
701
|
-
// (grid→grid_item, button→button_item) so the Multi-Items child
|
|
702
|
-
// requirement is visible WITHOUT opening each type's schema.
|
|
703
|
-
// Present only on container rows; leaf/item rows stay unchanged.
|
|
704
431
|
const mappedRecords = mapped.map((row) => {
|
|
705
432
|
const child = CONTAINER_TO_ITEM_TYPE[row.name];
|
|
706
433
|
return child !== undefined
|
|
@@ -710,13 +437,15 @@ export function buildInspectionTools(pool) {
|
|
|
710
437
|
const items = projectFields(mappedRecords, fields, DEFAULT_FIELDS_TYPES_LIST);
|
|
711
438
|
const echo = projectedFieldsEcho(fields, DEFAULT_FIELDS_TYPES_LIST);
|
|
712
439
|
const feedback = projectionFeedback(mappedRecords, fields);
|
|
713
|
-
|
|
714
|
-
const
|
|
440
|
+
const unknownNote = projectionInlineNote(feedback, fields);
|
|
441
|
+
const coverageBlock = projectionCoverageBlock(feedback?.field_coverage, feedback?.unknown_fields);
|
|
442
|
+
const projectionNote = projectionNoteText(coverageBlock, unknownNote);
|
|
715
443
|
const toolkitResult = budgetedTableResult(mappedRecords, {
|
|
716
444
|
columns: [...TYPES_TABLE_COLUMNS],
|
|
717
445
|
compactColumns: [...TYPES_COMPACT_COLUMNS],
|
|
718
|
-
header: (count) => `${String(count)} element types${unknownNote}`,
|
|
719
|
-
footer: '
|
|
446
|
+
header: (count) => `${coverageBlock}${String(count)} element types${unknownNote}`,
|
|
447
|
+
footer: 'Fields of a type: yootheme_builder_element_type_get_schema(' +
|
|
448
|
+
'{element_type: "<NAME column>"}).',
|
|
720
449
|
includeMeta: include_meta,
|
|
721
450
|
}, RESPONSE_BUDGET.BULKY);
|
|
722
451
|
return withSiteMeta(structuredResult(toolkitResult, {
|
|
@@ -726,8 +455,9 @@ export function buildInspectionTools(pool) {
|
|
|
726
455
|
...(feedback !== undefined ? {
|
|
727
456
|
available_fields: [...feedback.available_fields],
|
|
728
457
|
unknown_fields: [...feedback.unknown_fields],
|
|
729
|
-
|
|
458
|
+
field_coverage: { ...feedback.field_coverage },
|
|
730
459
|
} : {}),
|
|
460
|
+
...(projectionNote !== '' ? { projection_warning: projectionNote } : {}),
|
|
731
461
|
}), site);
|
|
732
462
|
}
|
|
733
463
|
catch (e) {
|
|
@@ -742,24 +472,9 @@ export function buildInspectionTools(pool) {
|
|
|
742
472
|
buildElementTypeGetSchemaTool(pool),
|
|
743
473
|
];
|
|
744
474
|
}
|
|
745
|
-
/**
|
|
746
|
-
* F-203 follow-up (Audit 2026-05-26 reviewer Gap 2): factored out of
|
|
747
|
-
* `buildInspectionTools` so the shape + refined ZodObject pair lives in
|
|
748
|
-
* one place. The SDK's pre-handler validator honours the top-level
|
|
749
|
-
* `.refine()` on `TYPE_SCHEMA_REFINED` and raises
|
|
750
|
-
* JSON-RPC `-32602 InvalidParams` when violated — hosts see the
|
|
751
|
-
* failure BEFORE the handler ever runs. The raw shape stays for
|
|
752
|
-
* handler-type inference (see `inputSchema`).
|
|
753
|
-
*/
|
|
754
475
|
function buildElementTypeGetSchemaTool(pool) {
|
|
755
476
|
const TYPE_SCHEMA_SHAPE = {
|
|
756
477
|
site_id: SITE_ID_SCHEMA,
|
|
757
|
-
// 1.0.1 cross-tool parameter naming alignment: every other
|
|
758
|
-
// tool in this domain uses `element_type` (element_add,
|
|
759
|
-
// element_update_settings, element_list rows). This tool
|
|
760
|
-
// originally shipped with `type_name`; we accept BOTH for
|
|
761
|
-
// backward-compatibility but the canonical key going
|
|
762
|
-
// forward is `element_type`.
|
|
763
478
|
element_type: z
|
|
764
479
|
.string()
|
|
765
480
|
.min(1)
|
|
@@ -773,209 +488,135 @@ function buildElementTypeGetSchemaTool(pool) {
|
|
|
773
488
|
.describe('DEPRECATED alias of `element_type` — use `element_type` ' +
|
|
774
489
|
'instead. Kept for 1.0.x backward-compatibility; will be ' +
|
|
775
490
|
'removed in a future major.'),
|
|
776
|
-
// ELEMENT_WRITE-17 / SOURCES_BINDING-23: this was the only read tool with
|
|
777
|
-
// NO way to bound its response (grid returns ~154 field descriptors in one
|
|
778
|
-
// blob). `fields[]` sparse-projects each field descriptor to the requested
|
|
779
|
-
// sub-keys; `max_chars` caps the text leg — mirroring the sibling reads.
|
|
780
491
|
fields: FIELDS,
|
|
781
|
-
// Plan 2026-07-27-02 Task 4 (P1, closes F8): SELECT which descriptors
|
|
782
|
-
// come back, instead of receiving all 154 with 88.6 % of them cut off
|
|
783
|
-
// (measured: `docs/mcp-response-size-baseline.md` §2). Orthogonal to
|
|
784
|
-
// `fields[]` — that one picks sub-keys OF a descriptor, these pick the
|
|
785
|
-
// descriptors themselves, and a selected one is returned COMPLETE.
|
|
786
492
|
field_names: FIELD_NAMES,
|
|
787
493
|
name_contains: FIELD_NAME_CONTAINS,
|
|
494
|
+
include_fields: z
|
|
495
|
+
.boolean()
|
|
496
|
+
.optional()
|
|
497
|
+
.describe('Return the full field-descriptor list (e.g. 147 for `grid`). ' +
|
|
498
|
+
'Default: head data only — binding_contract, minimal_layout ' +
|
|
499
|
+
'and field_count. `field_names`/`name_contains` also return ' +
|
|
500
|
+
'descriptors, narrowed to what they select.'),
|
|
788
501
|
max_chars: MAX_CHARS,
|
|
789
502
|
};
|
|
790
|
-
const TYPE_SCHEMA_REFINED =
|
|
791
|
-
.object(TYPE_SCHEMA_SHAPE)
|
|
792
|
-
.refine((args) => (typeof args.element_type === 'string' && args.element_type !== '') ||
|
|
793
|
-
(typeof args.type_name === 'string' && args.type_name !== ''), {
|
|
794
|
-
message: 'Provide either `element_type` (canonical) or ' +
|
|
795
|
-
'`type_name` (deprecated alias).',
|
|
796
|
-
});
|
|
503
|
+
const TYPE_SCHEMA_REFINED = strictInputObject('yootheme_builder_element_type_get_schema', TYPE_SCHEMA_SHAPE);
|
|
797
504
|
return defineTool({
|
|
798
505
|
name: 'yootheme_builder_element_type_get_schema',
|
|
799
|
-
// 544 chars — the per-tool budget is 600
|
|
800
|
-
// (`tests/gateway/description-length.test.ts`). Task 4 bought the room
|
|
801
|
-
// for the selector by tightening prose, not by dropping a fact; Task 6
|
|
802
|
-
// bought the room for `text?`/`description?` the same way. The five
|
|
803
|
-
// edits that paid for it are pure wording, no fact removed: "Returns
|
|
804
|
-
// each field as" → "Each field:", "prop keys are rejected" → "prop keys
|
|
805
|
-
// rejected", "hidden in the UI" → "hidden in UI", "for
|
|
806
|
-
// containers/items" → "(containers/items)", and "valid_prop_keys +
|
|
807
|
-
// did_you_mean" → "valid_prop_keys+did_you_mean" (the same `a+b` form
|
|
808
|
-
// "value_hint+enum" already uses two clauses later).
|
|
809
|
-
//
|
|
810
|
-
// Task 5b Step 3 (2026-07-28) — RESTORED "boolean". Task 4's tightening
|
|
811
|
-
// pass went one edit too far: `checkbox = boolean true/false` became
|
|
812
|
-
// `checkbox = true/false` (commit 139cb7d68). That deleted the word
|
|
813
|
-
// carrying the VALUE TYPE, and this clause was the only statement of a
|
|
814
|
-
// checkbox prop's type anywhere on the tool surface — an agent writing
|
|
815
|
-
// `element_update_settings({props:{image_expand:"1"}})` had nothing left
|
|
816
|
-
// to tell it the field wants a boolean rather than a truthy string.
|
|
817
|
-
// Naming the two values is not naming the type. Cost of the restore: 8
|
|
818
|
-
// chars, paid for many times over by dropping the repeated site_id
|
|
819
|
-
// sentence (57 chars here; the fact now rides in the `site_id` param
|
|
820
|
-
// description, which is where a host reads it while building the call).
|
|
821
|
-
// Pinned in tests/skills/skill-md-behavior-truth.test.ts (Task 5b block).
|
|
822
|
-
// Task 7b Steps 1+3 (plan 2026-07-27-02): the descriptor grew two
|
|
823
|
-
// DECISION-RELEVANT keys, so the illustrative shape names them.
|
|
824
|
-
// - `groups[]` — the enclosing fieldset group's own sentence, at the
|
|
825
|
-
// schema ROOT and joined on the field's `group`. YOOtheme parks the
|
|
826
|
-
// semantics of a whole class of fields there rather than on the field
|
|
827
|
-
// (grid.image_width/image_height carry the crop rule this way and
|
|
828
|
-
// declare nothing themselves), so a caller that reads only
|
|
829
|
-
// `description` misses the rule it needed. It is the one key of the
|
|
830
|
-
// set NOT self-describing from a field descriptor — a field naming
|
|
831
|
-
// `group:"Width/Height"` gives no reason to look at a root key — so
|
|
832
|
-
// this is where the budget is spent. The RULE rides in the
|
|
833
|
-
// `outputSchema` `.describe()`, which is on the wire and costs this
|
|
834
|
-
// budget nothing (`docs/mcp-response-budgets.md` §9.2).
|
|
835
|
-
// Was `group_description?` per field until the hoist measured 32
|
|
836
|
-
// occurrences of 5 distinct strings.
|
|
837
|
-
// - `no_effect` — the prop is declared and read by nothing. Naming it
|
|
838
|
-
// here is what stops an agent treating the descriptor as writable
|
|
839
|
-
// guidance; the VALUE carries the full read fact + the build it was
|
|
840
|
-
// read on, so no further prose is spent in this budget.
|
|
841
|
-
// The shape list is illustrative, not exhaustive (it has never named
|
|
842
|
-
// `default`/`enable`/`show`/`filter`/`constraint`). `placeholder` and
|
|
843
|
-
// `enum_labels` are therefore documented in SKILL.md rather than
|
|
844
|
-
// here — the budget is nearly spent, and both are self-describing once
|
|
845
|
-
// seen in a response, sitting next to the key they qualify
|
|
846
|
-
// (`enum_labels` beside `enum`).
|
|
847
|
-
// Space for the two additions was earned inside this same description,
|
|
848
|
-
// not by raising the budget: "Fetch a type's prop schema before" →
|
|
849
|
-
// "Prop schema; read before", "unknown prop keys" → "unknown keys"
|
|
850
|
-
// (the word `prop` is already in the opening clause), and "Read
|
|
851
|
-
// value_hint+enum first" → "value_hint+enum first". MEASURED: 544 →
|
|
852
|
-
// 595 chars, inside the 600-char tool-description budget.
|
|
853
|
-
// No fact left: every clause the pre-change description carried is still
|
|
854
|
-
// here, and the pinned phrases are VERBATIM — "checkbox = boolean
|
|
855
|
-
// true/false", "Select descriptors: field_names/name_contains",
|
|
856
|
-
// "field_count/returned_count", "Bound size with fields[]/max_chars".
|
|
857
|
-
// ("Bound size:" was tried and correctly REJECTED by the P4 max_chars
|
|
858
|
-
// pin in tests/skills/skill-md-behavior-truth.test.ts — the four chars
|
|
859
|
-
// were found elsewhere rather than by weakening the pin.)
|
|
860
506
|
description: 'Prop schema; read before element_add/element_update_settings: ' +
|
|
861
|
-
'
|
|
862
|
-
'
|
|
863
|
-
'
|
|
864
|
-
'
|
|
865
|
-
'
|
|
866
|
-
'
|
|
867
|
-
'
|
|
868
|
-
'
|
|
869
|
-
'
|
|
507
|
+
'undeclared keys are STORED, not refused: warns unknown_prop_keys. ' +
|
|
508
|
+
'NO element_type: lists the types. With one: head only ' +
|
|
509
|
+
'— binding_contract (containers/items) + groups[] + field_count. ' +
|
|
510
|
+
'include_fields:true adds every descriptor {name,type,label?,text?,' +
|
|
511
|
+
'description?,enum?,value_hint?,group?,no_effect?}; ' +
|
|
512
|
+
'Select descriptors: field_names/name_contains, answered with ' +
|
|
513
|
+
'field_count/returned_count. value_hint+enum first: some ' +
|
|
514
|
+
'defaults are SEO-fatal (headline.title_element→h1); checkbox = boolean ' +
|
|
515
|
+
'true/false; no_effect = read by nothing, never write it; ' +
|
|
516
|
+
'group:"runtime-accepted" = honoured at render, hidden in UI. ' +
|
|
517
|
+
'Bound size with fields[]/max_chars.',
|
|
870
518
|
inputSchema: TYPE_SCHEMA_SHAPE,
|
|
871
|
-
// F-203 follow-up: the refined object is what the SDK actually
|
|
872
|
-
// validates. The raw shape above stays for handler-type inference.
|
|
873
519
|
inputObjectSchema: TYPE_SCHEMA_REFINED,
|
|
874
520
|
outputSchema: TYPE_SCHEMA_OUTPUT_SCHEMA,
|
|
875
521
|
annotations: readOnly('Get Element Type Schema'),
|
|
876
522
|
handler: async (args) => {
|
|
877
|
-
// Defensive re-assert of the refine — should never fire when
|
|
878
|
-
// reached through the SDK (the boundary rejects with -32602
|
|
879
|
-
// first), but in-process tests bypass the SDK and call the
|
|
880
|
-
// handler directly, so the structured error path stays
|
|
881
|
-
// reachable for unit-test coverage.
|
|
882
523
|
const typeNameInput = typeof args.element_type === 'string' && args.element_type !== ''
|
|
883
524
|
? args.element_type
|
|
884
525
|
: typeof args.type_name === 'string'
|
|
885
526
|
? args.type_name
|
|
886
527
|
: '';
|
|
887
|
-
if (typeNameInput === '') {
|
|
888
|
-
return errorResult({
|
|
889
|
-
error: new Error('Provide either `element_type` (canonical) or ' +
|
|
890
|
-
'`type_name` (deprecated alias).'),
|
|
891
|
-
context: { site_id: typeof args.site_id === 'string' ? args.site_id : null },
|
|
892
|
-
hint: 'Pass `element_type` (e.g. "headline"). Use ' +
|
|
893
|
-
'yootheme_builder_element_types_list to discover valid values.',
|
|
894
|
-
});
|
|
895
|
-
}
|
|
896
|
-
const type_name = typeNameInput;
|
|
897
528
|
const r = await resolveSiteOrError(pool, typeof args.site_id === 'string' ? args.site_id : undefined);
|
|
898
529
|
if (!r.ok)
|
|
899
530
|
return r.error;
|
|
900
531
|
const { client: siteClient, site } = r;
|
|
532
|
+
if (typeNameInput === '') {
|
|
533
|
+
try {
|
|
534
|
+
const listData = await siteClient.get('/element-types');
|
|
535
|
+
const rows = flattenTypesPayload(listData).map(mapTypeRow);
|
|
536
|
+
const types = rows.map((row) => {
|
|
537
|
+
const child = CONTAINER_TO_ITEM_TYPE[row.name];
|
|
538
|
+
return {
|
|
539
|
+
name: row.name,
|
|
540
|
+
...(typeof row.label === 'string' && row.label !== ''
|
|
541
|
+
? { label: row.label }
|
|
542
|
+
: {}),
|
|
543
|
+
...(child !== undefined ? { requires_child_type: child } : {}),
|
|
544
|
+
};
|
|
545
|
+
});
|
|
546
|
+
const lines = types
|
|
547
|
+
.map((t) => t.requires_child_type !== undefined
|
|
548
|
+
? `${t.name} (needs a ${t.requires_child_type} child)`
|
|
549
|
+
: t.name)
|
|
550
|
+
.join('\n');
|
|
551
|
+
return withSiteMeta(structuredResult({
|
|
552
|
+
content: [
|
|
553
|
+
{
|
|
554
|
+
type: 'text',
|
|
555
|
+
text: `${String(types.length)} element types. Read one ` +
|
|
556
|
+
'with yootheme_builder_element_type_get_schema(' +
|
|
557
|
+
'{ element_type: "<NAME>" }) — that returns the ' +
|
|
558
|
+
'binding contract and the field COUNT; add ' +
|
|
559
|
+
'include_fields:true for the descriptors.' +
|
|
560
|
+
`\n\n${lines}`,
|
|
561
|
+
},
|
|
562
|
+
],
|
|
563
|
+
}, { element_types: types, total: types.length }), site);
|
|
564
|
+
}
|
|
565
|
+
catch (e) {
|
|
566
|
+
return withSiteMeta(errorResult({
|
|
567
|
+
error: e,
|
|
568
|
+
context: { site_id: site.id },
|
|
569
|
+
hint: 'Use yootheme_builder_health to check connectivity + auth.',
|
|
570
|
+
}), site);
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
const type_name = typeNameInput;
|
|
901
574
|
try {
|
|
902
575
|
const data = await siteClient.get(`/element-types/${encodeURIComponent(type_name)}/schema`);
|
|
903
|
-
// The REST endpoint nests the type schema under `schema`:
|
|
904
|
-
// {type_name, schema:{name,label,origin,has_children,fields:[…]}}.
|
|
905
|
-
// Fall back to the top-level object for older backends.
|
|
906
576
|
const schema = data.schema !== null && typeof data.schema === 'object'
|
|
907
577
|
? data.schema
|
|
908
578
|
: data;
|
|
909
579
|
const name = typeof schema.name === 'string' ? schema.name : type_name;
|
|
910
580
|
const label = typeof schema.label === 'string' ? schema.label : undefined;
|
|
911
581
|
const origin = typeof schema.origin === 'string' ? schema.origin : undefined;
|
|
912
|
-
// `fields` is a list of {name,type,label?} field descriptors.
|
|
913
582
|
const rawFields = Array.isArray(schema.fields)
|
|
914
583
|
? schema.fields
|
|
915
584
|
: undefined;
|
|
916
|
-
// ELEMENT_WRITE-4 (part 1): the node-level keys {name,status,
|
|
917
|
-
// source,id} are siblings of `props`, NOT props — but they render
|
|
918
|
-
// in the Fields table with no group, so an agent writes props.name
|
|
919
|
-
// via element_add and it is silently accepted (name is a fields[]
|
|
920
|
-
// entry). Annotate them so the agent knows they live OUTSIDE props.
|
|
921
585
|
const annotatedFields = rawFields !== undefined ? annotateNodeLevelFields(rawFields) : undefined;
|
|
922
|
-
// ELEMENT_WRITE-17 / SOURCES_BINDING-23: project each descriptor to
|
|
923
|
-
// the requested sub-keys when `fields[]` was passed (bounds the
|
|
924
|
-
// structured leg); `max_chars` bounds the text leg below.
|
|
925
586
|
const fieldsParam = Array.isArray(args.fields) &&
|
|
926
587
|
args.fields.every((f) => typeof f === 'string')
|
|
927
588
|
? args.fields
|
|
928
589
|
: undefined;
|
|
929
590
|
const maxChars = typeof args.max_chars === 'number' ? args.max_chars : undefined;
|
|
930
|
-
// Task 4 (P1): SELECT the descriptors first, THEN sub-key-project
|
|
931
|
-
// them. The order is load-bearing — `fields:["type"]` strips the
|
|
932
|
-
// very `name`/`label` the selector matches on, so projecting first
|
|
933
|
-
// would make the two arguments mutually exclusive instead of
|
|
934
|
-
// composable.
|
|
935
591
|
const fieldNamesParam = Array.isArray(args.field_names) &&
|
|
936
592
|
args.field_names.every((f) => typeof f === 'string')
|
|
937
593
|
? args.field_names
|
|
938
594
|
: undefined;
|
|
939
595
|
const nameContains = typeof args.name_contains === 'string' ? args.name_contains : undefined;
|
|
940
|
-
const
|
|
596
|
+
const wantsDescriptors = args.include_fields === true ||
|
|
597
|
+
fieldsParam !== undefined ||
|
|
598
|
+
fieldNamesParam !== undefined ||
|
|
599
|
+
nameContains !== undefined;
|
|
600
|
+
const selected = annotatedFields !== undefined && wantsDescriptors
|
|
941
601
|
? selectDescriptorsByName(annotatedFields, fieldNamesParam, nameContains)
|
|
942
602
|
: undefined;
|
|
943
603
|
const fields = selected !== undefined
|
|
944
604
|
? projectFields(selected, fieldsParam, [])
|
|
945
605
|
: undefined;
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
// (P2) and the caller can see what it did not ask for.
|
|
606
|
+
const descriptorFeedback = projectionFeedback(selected ?? [], fieldsParam);
|
|
607
|
+
const descriptorNote = projectionNoteText(projectionCoverageBlock(descriptorFeedback?.field_coverage, descriptorFeedback?.unknown_fields), projectionInlineNote(descriptorFeedback, fieldsParam));
|
|
608
|
+
const descriptorNoteBlock = projectionDetailBlock(descriptorFeedback, fieldsParam);
|
|
950
609
|
const fieldCount = annotatedFields !== undefined ? annotatedFields.length : 0;
|
|
951
610
|
const returnedCount = selected !== undefined ? selected.length : 0;
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
// group sentence the type has, undoing Task 4 for exactly the
|
|
958
|
-
// narrow reads it exists to serve. Read off `selected`, i.e.
|
|
959
|
-
// BEFORE the `fields[]` sub-key whitelist: `fields:["type"]`
|
|
960
|
-
// strips the join key, and narrowing on the projected list would
|
|
961
|
-
// then delete every sentence. Same ordering rule, same reason, as
|
|
962
|
-
// selection-before-projection above.
|
|
611
|
+
const nextStep = wantsDescriptors
|
|
612
|
+
? undefined
|
|
613
|
+
: `yootheme_builder_element_type_get_schema({ element_type: "${name}", ` +
|
|
614
|
+
`include_fields: true }) returns all ${String(fieldCount)} field ` +
|
|
615
|
+
'descriptors; field_names/name_contains return a subset.';
|
|
963
616
|
const groups = narrowGroupsToSelection(schema.groups, selected);
|
|
964
|
-
// Task 7b Step 4: the element-level render rules. Read off
|
|
965
|
-
// `schema`, NOT narrowed by `selected` — see the pass-through
|
|
966
|
-
// comment at the structuredResult call below for why.
|
|
967
617
|
const renderRules = extractRenderRules(schema);
|
|
968
|
-
// Task 7b Steps 5-6: the shared rule notes, narrowed to the ids
|
|
969
|
-
// this response still references. See extractSharedRuleNotes().
|
|
970
618
|
const sharedRules = extractSharedRuleNotes(schema, selected);
|
|
971
|
-
// 2026-07-28: which build the version-scoped keys above were read
|
|
972
|
-
// on. Element-level like `renderRules`, and for the same reason —
|
|
973
|
-
// it qualifies claims the caller is about to act on, so a narrow
|
|
974
|
-
// field selection must not be able to drop it.
|
|
975
619
|
const claimProvenance = extractClaimProvenance(schema);
|
|
976
|
-
// Wave-6 R3 (2026-05-29): attach a binding contract so
|
|
977
|
-
// the agent doesn't have to reverse-engineer the
|
|
978
|
-
// Multi-Items pattern from layout + inspection probes.
|
|
979
620
|
const bindingContract = deriveBindingContract(name);
|
|
980
621
|
const toolkitResult = detailResult({
|
|
981
622
|
...buildTypeSchemaDetail({
|
|
@@ -985,12 +626,12 @@ function buildElementTypeGetSchemaTool(pool) {
|
|
|
985
626
|
fields,
|
|
986
627
|
fieldCount,
|
|
987
628
|
returnedCount,
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
629
|
+
...(fieldsParam !== undefined && fieldsParam.length > 0 && selected !== undefined
|
|
630
|
+
? {
|
|
631
|
+
descriptorNames: selected.map((d) => typeof d.name === 'string' ? d.name : ''),
|
|
632
|
+
projectedFields: fieldsParam,
|
|
633
|
+
}
|
|
634
|
+
: {}),
|
|
994
635
|
...(bindingContract !== undefined
|
|
995
636
|
? {
|
|
996
637
|
bindingContract: {
|
|
@@ -1032,24 +673,24 @@ function buildElementTypeGetSchemaTool(pool) {
|
|
|
1032
673
|
}),
|
|
1033
674
|
includeMeta: false,
|
|
1034
675
|
});
|
|
1035
|
-
return withSiteMeta(structuredResult(applyMaxChars(toolkitResult, maxChars), {
|
|
676
|
+
return withSiteMeta(structuredResult(applyMaxChars(prependTextBlock(toolkitResult, descriptorNoteBlock), maxChars), {
|
|
1036
677
|
name,
|
|
1037
678
|
...(label !== undefined ? { label } : {}),
|
|
1038
679
|
...(origin !== undefined ? { origin } : {}),
|
|
680
|
+
...(descriptorFeedback !== undefined
|
|
681
|
+
? {
|
|
682
|
+
available_fields: [...descriptorFeedback.available_fields],
|
|
683
|
+
unknown_fields: [...descriptorFeedback.unknown_fields],
|
|
684
|
+
field_coverage: { ...descriptorFeedback.field_coverage },
|
|
685
|
+
}
|
|
686
|
+
: {}),
|
|
687
|
+
...(descriptorNote !== ''
|
|
688
|
+
? { projection_warning: descriptorNote }
|
|
689
|
+
: {}),
|
|
690
|
+
...(fieldsParam !== undefined && fieldsParam.length > 0
|
|
691
|
+
? { projected_fields: [...fieldsParam] }
|
|
692
|
+
: {}),
|
|
1039
693
|
...(groups !== undefined ? { groups } : {}),
|
|
1040
|
-
// Task 7b Step 4 (plan 2026-07-27-02, inventory groups B/A/L):
|
|
1041
|
-
// element-level render rules, forwarded whole. Deliberately
|
|
1042
|
-
// NOT narrowed by the descriptor selection the way `groups`
|
|
1043
|
-
// is — a group sentence belongs to the fields it annotates,
|
|
1044
|
-
// but "this element is deleted at render when these props are
|
|
1045
|
-
// empty" is true of the element regardless of which
|
|
1046
|
-
// descriptors were asked for, and suppressing it on a narrow
|
|
1047
|
-
// read would hide it from exactly the caller about to write.
|
|
1048
|
-
//
|
|
1049
|
-
// Same carrier choice as `groups`: structuredContent here,
|
|
1050
|
-
// the JSON text leg on the PHP transport. The TS text leg is
|
|
1051
|
-
// a NAME|TYPE|LABEL table and never carried element-level
|
|
1052
|
-
// keys, so nothing is added to it.
|
|
1053
694
|
...(renderRules.renders_only_if !== undefined
|
|
1054
695
|
? { renders_only_if: renderRules.renders_only_if }
|
|
1055
696
|
: {}),
|
|
@@ -1059,33 +700,20 @@ function buildElementTypeGetSchemaTool(pool) {
|
|
|
1059
700
|
...(renderRules.media_autoswap !== undefined
|
|
1060
701
|
? { media_autoswap: renderRules.media_autoswap }
|
|
1061
702
|
: {}),
|
|
1062
|
-
// Directly after the gate it qualifies: a caller that sees
|
|
1063
|
-
// `renders_only_if` alone concludes "absent props render
|
|
1064
|
-
// nothing", which is false on 27 of the 28 gated types.
|
|
1065
703
|
...(renderRules.placeholder_fallback !== undefined
|
|
1066
704
|
? { placeholder_fallback: renderRules.placeholder_fallback }
|
|
1067
705
|
: {}),
|
|
1068
|
-
// Task 7b Steps 5-6: the element's own rule ids, then the note
|
|
1069
|
-
// texts resolving every id the response still references
|
|
1070
|
-
// (element-level or on a returned field). Placed BEFORE
|
|
1071
|
-
// `fields` so a reader meets the vocabulary before the
|
|
1072
|
-
// descriptors that use it.
|
|
1073
706
|
...(sharedRules.rules !== undefined ? { rules: sharedRules.rules } : {}),
|
|
1074
707
|
...(sharedRules.rule_notes !== undefined
|
|
1075
708
|
? { rule_notes: sharedRules.rule_notes }
|
|
1076
709
|
: {}),
|
|
1077
|
-
// 2026-07-28: LAST of the element-level keys and still BEFORE
|
|
1078
|
-
// `fields`, so a reader meets the provenance of the claims
|
|
1079
|
-
// before the descriptors that carry them — the same ordering
|
|
1080
|
-
// argument as `rule_notes` above. A `differs`/`unknown` status
|
|
1081
|
-
// is what tells a caller that `no_effect_unverified` on a
|
|
1082
|
-
// descriptor below is a report, not a fact about their site.
|
|
1083
710
|
...(claimProvenance !== undefined
|
|
1084
711
|
? { claims_verified_on: claimProvenance }
|
|
1085
712
|
: {}),
|
|
1086
713
|
...(fields !== undefined ? { fields } : {}),
|
|
1087
714
|
field_count: fieldCount,
|
|
1088
715
|
returned_count: returnedCount,
|
|
716
|
+
...(nextStep !== undefined ? { next_step: nextStep } : {}),
|
|
1089
717
|
...(bindingContract !== undefined
|
|
1090
718
|
? { binding_contract: bindingContract }
|
|
1091
719
|
: {}),
|