@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.
Files changed (857) hide show
  1. package/README.md +128 -30
  2. package/bin/node-floor.d.ts +28 -0
  3. package/bin/node-floor.js +123 -0
  4. package/bin/yt-builder-mcp.js +51 -10
  5. package/dist/auth.d.ts +3 -121
  6. package/dist/auth.d.ts.map +1 -1
  7. package/dist/auth.js +40 -170
  8. package/dist/auth.js.map +1 -1
  9. package/dist/catalog/build-catalog.d.ts +4 -49
  10. package/dist/catalog/build-catalog.d.ts.map +1 -1
  11. package/dist/catalog/build-catalog.js +15 -126
  12. package/dist/catalog/build-catalog.js.map +1 -1
  13. package/dist/catalog/json-schema.d.ts +3 -0
  14. package/dist/catalog/json-schema.d.ts.map +1 -0
  15. package/dist/catalog/json-schema.js +68 -0
  16. package/dist/catalog/json-schema.js.map +1 -0
  17. package/dist/catalog/output-shapes.d.ts +6 -0
  18. package/dist/catalog/output-shapes.d.ts.map +1 -0
  19. package/dist/catalog/output-shapes.js +89 -0
  20. package/dist/catalog/output-shapes.js.map +1 -0
  21. package/dist/catalog/tool-catalog-markdown.d.ts +1 -37
  22. package/dist/catalog/tool-catalog-markdown.d.ts.map +1 -1
  23. package/dist/catalog/tool-catalog-markdown.js +8 -52
  24. package/dist/catalog/tool-catalog-markdown.js.map +1 -1
  25. package/dist/cli/doctor-command.d.ts +2 -7
  26. package/dist/cli/doctor-command.d.ts.map +1 -1
  27. package/dist/cli/doctor-command.js +21 -62
  28. package/dist/cli/doctor-command.js.map +1 -1
  29. package/dist/cli/invocation-decision.d.ts +4 -52
  30. package/dist/cli/invocation-decision.d.ts.map +1 -1
  31. package/dist/cli/invocation-decision.js +45 -54
  32. package/dist/cli/invocation-decision.js.map +1 -1
  33. package/dist/client.d.ts +3 -107
  34. package/dist/client.d.ts.map +1 -1
  35. package/dist/client.js +34 -115
  36. package/dist/client.js.map +1 -1
  37. package/dist/clients/claude-code.d.ts +0 -15
  38. package/dist/clients/claude-code.d.ts.map +1 -1
  39. package/dist/clients/claude-code.js +0 -22
  40. package/dist/clients/claude-code.js.map +1 -1
  41. package/dist/clients/claude-desktop.d.ts +0 -16
  42. package/dist/clients/claude-desktop.d.ts.map +1 -1
  43. package/dist/clients/claude-desktop.js +0 -18
  44. package/dist/clients/claude-desktop.js.map +1 -1
  45. package/dist/clients/cline.d.ts +0 -23
  46. package/dist/clients/cline.d.ts.map +1 -1
  47. package/dist/clients/cline.js +0 -33
  48. package/dist/clients/cline.js.map +1 -1
  49. package/dist/clients/codex-cli.d.ts +0 -39
  50. package/dist/clients/codex-cli.d.ts.map +1 -1
  51. package/dist/clients/codex-cli.js +0 -137
  52. package/dist/clients/codex-cli.js.map +1 -1
  53. package/dist/clients/continue.d.ts +0 -10
  54. package/dist/clients/continue.d.ts.map +1 -1
  55. package/dist/clients/continue.js +0 -26
  56. package/dist/clients/continue.js.map +1 -1
  57. package/dist/clients/cursor.d.ts +0 -9
  58. package/dist/clients/cursor.d.ts.map +1 -1
  59. package/dist/clients/cursor.js +0 -11
  60. package/dist/clients/cursor.js.map +1 -1
  61. package/dist/clients/gemini-cli.d.ts +0 -15
  62. package/dist/clients/gemini-cli.d.ts.map +1 -1
  63. package/dist/clients/gemini-cli.js +0 -17
  64. package/dist/clients/gemini-cli.js.map +1 -1
  65. package/dist/clients/home.d.ts +0 -12
  66. package/dist/clients/home.d.ts.map +1 -1
  67. package/dist/clients/home.js +0 -12
  68. package/dist/clients/home.js.map +1 -1
  69. package/dist/clients/index.d.ts +0 -150
  70. package/dist/clients/index.d.ts.map +1 -1
  71. package/dist/clients/index.js +0 -112
  72. package/dist/clients/index.js.map +1 -1
  73. package/dist/clients/roo-code.d.ts +0 -20
  74. package/dist/clients/roo-code.d.ts.map +1 -1
  75. package/dist/clients/roo-code.js +0 -22
  76. package/dist/clients/roo-code.js.map +1 -1
  77. package/dist/clients/zed.d.ts +0 -9
  78. package/dist/clients/zed.d.ts.map +1 -1
  79. package/dist/clients/zed.js +0 -18
  80. package/dist/clients/zed.js.map +1 -1
  81. package/dist/compat-floor.d.ts +35 -0
  82. package/dist/compat-floor.d.ts.map +1 -0
  83. package/dist/compat-floor.js +84 -0
  84. package/dist/compat-floor.js.map +1 -0
  85. package/dist/compat-probe.d.ts +6 -0
  86. package/dist/compat-probe.d.ts.map +1 -0
  87. package/dist/compat-probe.js +20 -0
  88. package/dist/compat-probe.js.map +1 -0
  89. package/dist/diagnostics/ca-reexec.d.ts +0 -30
  90. package/dist/diagnostics/ca-reexec.d.ts.map +1 -1
  91. package/dist/diagnostics/ca-reexec.js +0 -62
  92. package/dist/diagnostics/ca-reexec.js.map +1 -1
  93. package/dist/diagnostics/ca-trust.d.ts +0 -22
  94. package/dist/diagnostics/ca-trust.d.ts.map +1 -1
  95. package/dist/diagnostics/ca-trust.js +3 -42
  96. package/dist/diagnostics/ca-trust.js.map +1 -1
  97. package/dist/diagnostics/diagnose-network-error.d.ts +1 -38
  98. package/dist/diagnostics/diagnose-network-error.d.ts.map +1 -1
  99. package/dist/diagnostics/diagnose-network-error.js +26 -37
  100. package/dist/diagnostics/diagnose-network-error.js.map +1 -1
  101. package/dist/diagnostics/doctor.d.ts +1 -85
  102. package/dist/diagnostics/doctor.d.ts.map +1 -1
  103. package/dist/diagnostics/doctor.js +5 -90
  104. package/dist/diagnostics/doctor.js.map +1 -1
  105. package/dist/diagnostics/startup-self-probe.d.ts +3 -25
  106. package/dist/diagnostics/startup-self-probe.d.ts.map +1 -1
  107. package/dist/diagnostics/startup-self-probe.js +11 -48
  108. package/dist/diagnostics/startup-self-probe.js.map +1 -1
  109. package/dist/errors/hints.d.ts +0 -44
  110. package/dist/errors/hints.d.ts.map +1 -1
  111. package/dist/errors/hints.js +0 -32
  112. package/dist/errors/hints.js.map +1 -1
  113. package/dist/errors/mask.d.ts +0 -31
  114. package/dist/errors/mask.d.ts.map +1 -1
  115. package/dist/errors/mask.js +0 -32
  116. package/dist/errors/mask.js.map +1 -1
  117. package/dist/errors/redact-credentials.d.ts +2 -0
  118. package/dist/errors/redact-credentials.d.ts.map +1 -0
  119. package/dist/errors/redact-credentials.js +13 -0
  120. package/dist/errors/redact-credentials.js.map +1 -0
  121. package/dist/errors/sanitize.d.ts +0 -29
  122. package/dist/errors/sanitize.d.ts.map +1 -1
  123. package/dist/errors/sanitize.js +0 -40
  124. package/dist/errors/sanitize.js.map +1 -1
  125. package/dist/errors.d.ts +6 -17
  126. package/dist/errors.d.ts.map +1 -1
  127. package/dist/errors.js +16 -21
  128. package/dist/errors.js.map +1 -1
  129. package/dist/gateway/advanced-read-tool.d.ts +0 -32
  130. package/dist/gateway/advanced-read-tool.d.ts.map +1 -1
  131. package/dist/gateway/advanced-read-tool.js +43 -111
  132. package/dist/gateway/advanced-read-tool.js.map +1 -1
  133. package/dist/gateway/advanced-tool/discovery.d.ts +1 -12
  134. package/dist/gateway/advanced-tool/discovery.d.ts.map +1 -1
  135. package/dist/gateway/advanced-tool/discovery.js +15 -24
  136. package/dist/gateway/advanced-tool/discovery.js.map +1 -1
  137. package/dist/gateway/advanced-tool/domains.d.ts +7 -66
  138. package/dist/gateway/advanced-tool/domains.d.ts.map +1 -1
  139. package/dist/gateway/advanced-tool/domains.js +36 -80
  140. package/dist/gateway/advanced-tool/domains.js.map +1 -1
  141. package/dist/gateway/advanced-tool/execute.d.ts +0 -25
  142. package/dist/gateway/advanced-tool/execute.d.ts.map +1 -1
  143. package/dist/gateway/advanced-tool/execute.js +13 -49
  144. package/dist/gateway/advanced-tool/execute.js.map +1 -1
  145. package/dist/gateway/advanced-tool/index.d.ts +1 -32
  146. package/dist/gateway/advanced-tool/index.d.ts.map +1 -1
  147. package/dist/gateway/advanced-tool/index.js +1 -35
  148. package/dist/gateway/advanced-tool/index.js.map +1 -1
  149. package/dist/gateway/advanced-tool/register.d.ts +0 -14
  150. package/dist/gateway/advanced-tool/register.d.ts.map +1 -1
  151. package/dist/gateway/advanced-tool/register.js +22 -58
  152. package/dist/gateway/advanced-tool/register.js.map +1 -1
  153. package/dist/gateway/advanced-tool.d.ts +0 -11
  154. package/dist/gateway/advanced-tool.d.ts.map +1 -1
  155. package/dist/gateway/advanced-tool.js +0 -11
  156. package/dist/gateway/advanced-tool.js.map +1 -1
  157. package/dist/gateway/capturing-server.d.ts +3 -88
  158. package/dist/gateway/capturing-server.d.ts.map +1 -1
  159. package/dist/gateway/capturing-server.js +0 -77
  160. package/dist/gateway/capturing-server.js.map +1 -1
  161. package/dist/gateway/essentials.d.ts +1 -63
  162. package/dist/gateway/essentials.d.ts.map +1 -1
  163. package/dist/gateway/essentials.js +9 -178
  164. package/dist/gateway/essentials.js.map +1 -1
  165. package/dist/gateway/test-support.d.ts +0 -28
  166. package/dist/gateway/test-support.d.ts.map +1 -1
  167. package/dist/gateway/test-support.js +0 -29
  168. package/dist/gateway/test-support.js.map +1 -1
  169. package/dist/health-response.d.ts +2 -0
  170. package/dist/health-response.d.ts.map +1 -0
  171. package/dist/health-response.js +7 -0
  172. package/dist/health-response.js.map +1 -0
  173. package/dist/icon-data.js +0 -3
  174. package/dist/icon-data.js.map +1 -1
  175. package/dist/index.d.ts +7 -23
  176. package/dist/index.d.ts.map +1 -1
  177. package/dist/index.js +46 -130
  178. package/dist/index.js.map +1 -1
  179. package/dist/install-skill.d.ts +0 -44
  180. package/dist/install-skill.d.ts.map +1 -1
  181. package/dist/install-skill.js +5 -46
  182. package/dist/install-skill.js.map +1 -1
  183. package/dist/net/extra-headers.d.ts +0 -58
  184. package/dist/net/extra-headers.d.ts.map +1 -1
  185. package/dist/net/extra-headers.js +0 -67
  186. package/dist/net/extra-headers.js.map +1 -1
  187. package/dist/net/internal-host.d.ts +0 -31
  188. package/dist/net/internal-host.d.ts.map +1 -1
  189. package/dist/net/internal-host.js +7 -65
  190. package/dist/net/internal-host.js.map +1 -1
  191. package/dist/net/proxy-dispatcher.d.ts +0 -37
  192. package/dist/net/proxy-dispatcher.d.ts.map +1 -1
  193. package/dist/net/proxy-dispatcher.js +0 -40
  194. package/dist/net/proxy-dispatcher.js.map +1 -1
  195. package/dist/net/public-fetch.d.ts +53 -0
  196. package/dist/net/public-fetch.d.ts.map +1 -0
  197. package/dist/net/public-fetch.js +143 -0
  198. package/dist/net/public-fetch.js.map +1 -0
  199. package/dist/net/public-page-report.d.ts +26 -0
  200. package/dist/net/public-page-report.d.ts.map +1 -0
  201. package/dist/net/public-page-report.js +145 -0
  202. package/dist/net/public-page-report.js.map +1 -0
  203. package/dist/net/redirect-safe-fetch.d.ts +14 -0
  204. package/dist/net/redirect-safe-fetch.d.ts.map +1 -0
  205. package/dist/net/redirect-safe-fetch.js +61 -0
  206. package/dist/net/redirect-safe-fetch.js.map +1 -0
  207. package/dist/net/session-recovery-fetch.d.ts +7 -0
  208. package/dist/net/session-recovery-fetch.d.ts.map +1 -0
  209. package/dist/net/session-recovery-fetch.js +139 -0
  210. package/dist/net/session-recovery-fetch.js.map +1 -0
  211. package/dist/net/site-basic-auth.d.ts +1 -59
  212. package/dist/net/site-basic-auth.d.ts.map +1 -1
  213. package/dist/net/site-basic-auth.js +5 -94
  214. package/dist/net/site-basic-auth.js.map +1 -1
  215. package/dist/package-version.d.ts +2 -0
  216. package/dist/package-version.d.ts.map +1 -0
  217. package/dist/package-version.js +15 -0
  218. package/dist/package-version.js.map +1 -0
  219. package/dist/platform/detect.d.ts +0 -54
  220. package/dist/platform/detect.d.ts.map +1 -1
  221. package/dist/platform/detect.js +0 -53
  222. package/dist/platform/detect.js.map +1 -1
  223. package/dist/platform/index.d.ts +0 -100
  224. package/dist/platform/index.d.ts.map +1 -1
  225. package/dist/platform/index.js +0 -106
  226. package/dist/platform/index.js.map +1 -1
  227. package/dist/platform/joomla.d.ts +0 -35
  228. package/dist/platform/joomla.d.ts.map +1 -1
  229. package/dist/platform/joomla.js +0 -35
  230. package/dist/platform/joomla.js.map +1 -1
  231. package/dist/proxy/bridge.d.ts +36 -76
  232. package/dist/proxy/bridge.d.ts.map +1 -1
  233. package/dist/proxy/bridge.js +443 -136
  234. package/dist/proxy/bridge.js.map +1 -1
  235. package/dist/proxy/confirm-elicitation.d.ts +22 -0
  236. package/dist/proxy/confirm-elicitation.d.ts.map +1 -0
  237. package/dist/proxy/confirm-elicitation.js +170 -0
  238. package/dist/proxy/confirm-elicitation.js.map +1 -0
  239. package/dist/proxy/confirm-question-contract.d.ts +6 -0
  240. package/dist/proxy/confirm-question-contract.d.ts.map +1 -0
  241. package/dist/proxy/confirm-question-contract.js +9 -0
  242. package/dist/proxy/confirm-question-contract.js.map +1 -0
  243. package/dist/proxy/confirm-question.d.ts +2 -0
  244. package/dist/proxy/confirm-question.d.ts.map +1 -0
  245. package/dist/proxy/confirm-question.js +125 -0
  246. package/dist/proxy/confirm-question.js.map +1 -0
  247. package/dist/proxy/instructions.d.ts +4 -0
  248. package/dist/proxy/instructions.d.ts.map +1 -0
  249. package/dist/proxy/instructions.js +12 -0
  250. package/dist/proxy/instructions.js.map +1 -0
  251. package/dist/proxy/mode.d.ts +14 -9
  252. package/dist/proxy/mode.d.ts.map +1 -1
  253. package/dist/proxy/mode.js +58 -34
  254. package/dist/proxy/mode.js.map +1 -1
  255. package/dist/proxy/multi-site.d.ts +42 -0
  256. package/dist/proxy/multi-site.d.ts.map +1 -0
  257. package/dist/proxy/multi-site.js +134 -0
  258. package/dist/proxy/multi-site.js.map +1 -0
  259. package/dist/proxy/request-headers.d.ts +9 -0
  260. package/dist/proxy/request-headers.d.ts.map +1 -0
  261. package/dist/proxy/request-headers.js +17 -0
  262. package/dist/proxy/request-headers.js.map +1 -0
  263. package/dist/proxy/shadow-tools.d.ts +9 -0
  264. package/dist/proxy/shadow-tools.d.ts.map +1 -0
  265. package/dist/proxy/shadow-tools.js +42 -0
  266. package/dist/proxy/shadow-tools.js.map +1 -0
  267. package/dist/proxy/tools-list-cap.d.ts +7 -0
  268. package/dist/proxy/tools-list-cap.d.ts.map +1 -0
  269. package/dist/proxy/tools-list-cap.js +14 -0
  270. package/dist/proxy/tools-list-cap.js.map +1 -0
  271. package/dist/proxy/transport-uncertainty.d.ts +2 -0
  272. package/dist/proxy/transport-uncertainty.d.ts.map +1 -0
  273. package/dist/proxy/transport-uncertainty.js +8 -0
  274. package/dist/proxy/transport-uncertainty.js.map +1 -0
  275. package/dist/proxy/upstream-error.d.ts +7 -0
  276. package/dist/proxy/upstream-error.d.ts.map +1 -0
  277. package/dist/proxy/upstream-error.js +35 -0
  278. package/dist/proxy/upstream-error.js.map +1 -0
  279. package/dist/proxy/wire-dialect.d.ts +5 -0
  280. package/dist/proxy/wire-dialect.d.ts.map +1 -0
  281. package/dist/proxy/wire-dialect.js +33 -0
  282. package/dist/proxy/wire-dialect.js.map +1 -0
  283. package/dist/server.d.ts +14 -82
  284. package/dist/server.d.ts.map +1 -1
  285. package/dist/server.js +107 -203
  286. package/dist/server.js.map +1 -1
  287. package/dist/setup/banner-color.d.ts +13 -0
  288. package/dist/setup/banner-color.d.ts.map +1 -0
  289. package/dist/setup/banner-color.js +93 -0
  290. package/dist/setup/banner-color.js.map +1 -0
  291. package/dist/setup/banner.d.ts +22 -0
  292. package/dist/setup/banner.d.ts.map +1 -0
  293. package/dist/setup/banner.js +119 -0
  294. package/dist/setup/banner.js.map +1 -0
  295. package/dist/setup/ca-recovery.d.ts +20 -0
  296. package/dist/setup/ca-recovery.d.ts.map +1 -0
  297. package/dist/setup/ca-recovery.js +92 -0
  298. package/dist/setup/ca-recovery.js.map +1 -0
  299. package/dist/setup/closing.d.ts +15 -0
  300. package/dist/setup/closing.d.ts.map +1 -0
  301. package/dist/setup/closing.js +43 -0
  302. package/dist/setup/closing.js.map +1 -0
  303. package/dist/setup/corporate-ca.d.ts +16 -0
  304. package/dist/setup/corporate-ca.d.ts.map +1 -0
  305. package/dist/setup/corporate-ca.js +32 -0
  306. package/dist/setup/corporate-ca.js.map +1 -0
  307. package/dist/setup/host-platform.d.ts +8 -0
  308. package/dist/setup/host-platform.d.ts.map +1 -0
  309. package/dist/setup/host-platform.js +21 -0
  310. package/dist/setup/host-platform.js.map +1 -0
  311. package/dist/setup/install-configs.d.ts +18 -0
  312. package/dist/setup/install-configs.d.ts.map +1 -0
  313. package/dist/setup/install-configs.js +70 -0
  314. package/dist/setup/install-configs.js.map +1 -0
  315. package/dist/setup/multi-site-loop.d.ts +14 -0
  316. package/dist/setup/multi-site-loop.d.ts.map +1 -0
  317. package/dist/setup/multi-site-loop.js +20 -0
  318. package/dist/setup/multi-site-loop.js.map +1 -0
  319. package/dist/setup/phases.d.ts +18 -0
  320. package/dist/setup/phases.d.ts.map +1 -0
  321. package/dist/setup/phases.js +55 -0
  322. package/dist/setup/phases.js.map +1 -0
  323. package/dist/setup/registry-remedy.d.ts +12 -0
  324. package/dist/setup/registry-remedy.d.ts.map +1 -0
  325. package/dist/setup/registry-remedy.js +37 -0
  326. package/dist/setup/registry-remedy.js.map +1 -0
  327. package/dist/setup/resume.d.ts +28 -0
  328. package/dist/setup/resume.d.ts.map +1 -0
  329. package/dist/setup/resume.js +99 -0
  330. package/dist/setup/resume.js.map +1 -0
  331. package/dist/setup-ca-env.d.ts +0 -30
  332. package/dist/setup-ca-env.d.ts.map +1 -1
  333. package/dist/setup-ca-env.js +0 -28
  334. package/dist/setup-ca-env.js.map +1 -1
  335. package/dist/setup-ca-reprobe.d.ts +0 -25
  336. package/dist/setup-ca-reprobe.d.ts.map +1 -1
  337. package/dist/setup-ca-reprobe.js +0 -34
  338. package/dist/setup-ca-reprobe.js.map +1 -1
  339. package/dist/setup-cli-confirm.d.ts +0 -34
  340. package/dist/setup-cli-confirm.d.ts.map +1 -1
  341. package/dist/setup-cli-confirm.js +0 -36
  342. package/dist/setup-cli-confirm.js.map +1 -1
  343. package/dist/setup-cli.d.ts +6 -167
  344. package/dist/setup-cli.d.ts.map +1 -1
  345. package/dist/setup-cli.js +161 -173
  346. package/dist/setup-cli.js.map +1 -1
  347. package/dist/setup-npx-spec.d.ts +0 -36
  348. package/dist/setup-npx-spec.d.ts.map +1 -1
  349. package/dist/setup-npx-spec.js +0 -38
  350. package/dist/setup-npx-spec.js.map +1 -1
  351. package/dist/setup-prompts.d.ts +5 -70
  352. package/dist/setup-prompts.d.ts.map +1 -1
  353. package/dist/setup-prompts.js +67 -107
  354. package/dist/setup-prompts.js.map +1 -1
  355. package/dist/setup-token.d.ts +0 -34
  356. package/dist/setup-token.d.ts.map +1 -1
  357. package/dist/setup-token.js +0 -40
  358. package/dist/setup-token.js.map +1 -1
  359. package/dist/setup-wizard-defaults.d.ts +0 -36
  360. package/dist/setup-wizard-defaults.d.ts.map +1 -1
  361. package/dist/setup-wizard-defaults.js +0 -75
  362. package/dist/setup-wizard-defaults.js.map +1 -1
  363. package/dist/setup-wizard-handshake.d.ts +1 -19
  364. package/dist/setup-wizard-handshake.d.ts.map +1 -1
  365. package/dist/setup-wizard-handshake.js +8 -45
  366. package/dist/setup-wizard-handshake.js.map +1 -1
  367. package/dist/setup-wizard-types.d.ts +16 -209
  368. package/dist/setup-wizard-types.d.ts.map +1 -1
  369. package/dist/setup-wizard-types.js +0 -9
  370. package/dist/setup-wizard-types.js.map +1 -1
  371. package/dist/setup-wizard.d.ts +0 -28
  372. package/dist/setup-wizard.d.ts.map +1 -1
  373. package/dist/setup-wizard.js +167 -412
  374. package/dist/setup-wizard.js.map +1 -1
  375. package/dist/setup.d.ts +0 -15
  376. package/dist/setup.d.ts.map +1 -1
  377. package/dist/setup.js +0 -15
  378. package/dist/setup.js.map +1 -1
  379. package/dist/sites/bootstrap.d.ts +0 -38
  380. package/dist/sites/bootstrap.d.ts.map +1 -1
  381. package/dist/sites/bootstrap.js +0 -44
  382. package/dist/sites/bootstrap.js.map +1 -1
  383. package/dist/sites/cli/add-site.d.ts +0 -76
  384. package/dist/sites/cli/add-site.d.ts.map +1 -1
  385. package/dist/sites/cli/add-site.js +0 -71
  386. package/dist/sites/cli/add-site.js.map +1 -1
  387. package/dist/sites/cli/list-sites.d.ts +0 -31
  388. package/dist/sites/cli/list-sites.d.ts.map +1 -1
  389. package/dist/sites/cli/list-sites.js +0 -45
  390. package/dist/sites/cli/list-sites.js.map +1 -1
  391. package/dist/sites/cli/remove-site.d.ts +0 -37
  392. package/dist/sites/cli/remove-site.d.ts.map +1 -1
  393. package/dist/sites/cli/remove-site.js +0 -37
  394. package/dist/sites/cli/remove-site.js.map +1 -1
  395. package/dist/sites/cli/set-default.d.ts +0 -25
  396. package/dist/sites/cli/set-default.d.ts.map +1 -1
  397. package/dist/sites/cli/set-default.js +0 -22
  398. package/dist/sites/cli/set-default.js.map +1 -1
  399. package/dist/sites/cli/test-site.d.ts +0 -44
  400. package/dist/sites/cli/test-site.d.ts.map +1 -1
  401. package/dist/sites/cli/test-site.js +0 -39
  402. package/dist/sites/cli/test-site.js.map +1 -1
  403. package/dist/sites/client-pool.d.ts +11 -164
  404. package/dist/sites/client-pool.d.ts.map +1 -1
  405. package/dist/sites/client-pool.js +73 -194
  406. package/dist/sites/client-pool.js.map +1 -1
  407. package/dist/sites/config-problem.d.ts +2 -0
  408. package/dist/sites/config-problem.d.ts.map +1 -0
  409. package/dist/sites/config-problem.js +13 -0
  410. package/dist/sites/config-problem.js.map +1 -0
  411. package/dist/sites/env-bridge.d.ts +0 -69
  412. package/dist/sites/env-bridge.d.ts.map +1 -1
  413. package/dist/sites/env-bridge.js +2 -71
  414. package/dist/sites/env-bridge.js.map +1 -1
  415. package/dist/sites/op-inject.d.ts +23 -0
  416. package/dist/sites/op-inject.d.ts.map +1 -0
  417. package/dist/sites/op-inject.js +131 -0
  418. package/dist/sites/op-inject.js.map +1 -0
  419. package/dist/sites/paths.d.ts +0 -19
  420. package/dist/sites/paths.d.ts.map +1 -1
  421. package/dist/sites/paths.js +0 -19
  422. package/dist/sites/paths.js.map +1 -1
  423. package/dist/sites/probe.d.ts +1 -47
  424. package/dist/sites/probe.d.ts.map +1 -1
  425. package/dist/sites/probe.js +4 -46
  426. package/dist/sites/probe.js.map +1 -1
  427. package/dist/sites/registry.d.ts +4 -135
  428. package/dist/sites/registry.d.ts.map +1 -1
  429. package/dist/sites/registry.js +4 -98
  430. package/dist/sites/registry.js.map +1 -1
  431. package/dist/sites/schema.d.ts +3 -51
  432. package/dist/sites/schema.d.ts.map +1 -1
  433. package/dist/sites/schema.js +6 -52
  434. package/dist/sites/schema.js.map +1 -1
  435. package/dist/sites/secret-resolver.d.ts +6 -76
  436. package/dist/sites/secret-resolver.d.ts.map +1 -1
  437. package/dist/sites/secret-resolver.js +39 -104
  438. package/dist/sites/secret-resolver.js.map +1 -1
  439. package/dist/sites/store.d.ts +12 -69
  440. package/dist/sites/store.d.ts.map +1 -1
  441. package/dist/sites/store.js +37 -86
  442. package/dist/sites/store.js.map +1 -1
  443. package/dist/sites/substituted-registry.d.ts +11 -0
  444. package/dist/sites/substituted-registry.d.ts.map +1 -0
  445. package/dist/sites/substituted-registry.js +13 -0
  446. package/dist/sites/substituted-registry.js.map +1 -0
  447. package/dist/sites/tools/fetch-public-url.d.ts +4 -0
  448. package/dist/sites/tools/fetch-public-url.d.ts.map +1 -0
  449. package/dist/sites/tools/fetch-public-url.js +231 -0
  450. package/dist/sites/tools/fetch-public-url.js.map +1 -0
  451. package/dist/sites/tools/index.d.ts +2 -26
  452. package/dist/sites/tools/index.d.ts.map +1 -1
  453. package/dist/sites/tools/index.js +5 -28
  454. package/dist/sites/tools/index.js.map +1 -1
  455. package/dist/sites/tools/sites-list.d.ts +3 -47
  456. package/dist/sites/tools/sites-list.d.ts.map +1 -1
  457. package/dist/sites/tools/sites-list.js +65 -79
  458. package/dist/sites/tools/sites-list.js.map +1 -1
  459. package/dist/sites/tools/sites-overview.d.ts +4 -0
  460. package/dist/sites/tools/sites-overview.d.ts.map +1 -0
  461. package/dist/sites/tools/sites-overview.js +209 -0
  462. package/dist/sites/tools/sites-overview.js.map +1 -0
  463. package/dist/sites/tools/sites-test.d.ts +2 -45
  464. package/dist/sites/tools/sites-test.d.ts.map +1 -1
  465. package/dist/sites/tools/sites-test.js +0 -55
  466. package/dist/sites/tools/sites-test.js.map +1 -1
  467. package/dist/sites/tools/use-site.d.ts +2 -45
  468. package/dist/sites/tools/use-site.d.ts.map +1 -1
  469. package/dist/sites/tools/use-site.js +29 -78
  470. package/dist/sites/tools/use-site.js.map +1 -1
  471. package/dist/sites/unknown-name-result.d.ts +10 -0
  472. package/dist/sites/unknown-name-result.d.ts.map +1 -0
  473. package/dist/sites/unknown-name-result.js +13 -0
  474. package/dist/sites/unknown-name-result.js.map +1 -0
  475. package/dist/skill-instructions.d.ts +7 -0
  476. package/dist/skill-instructions.d.ts.map +1 -0
  477. package/dist/skill-instructions.js +84 -0
  478. package/dist/skill-instructions.js.map +1 -0
  479. package/dist/skill-loader.d.ts +0 -102
  480. package/dist/skill-loader.d.ts.map +1 -1
  481. package/dist/skill-loader.js +4 -142
  482. package/dist/skill-loader.js.map +1 -1
  483. package/dist/skill-manifest.d.ts +0 -20
  484. package/dist/skill-manifest.d.ts.map +1 -1
  485. package/dist/skill-manifest.js +1 -21
  486. package/dist/skill-manifest.js.map +1 -1
  487. package/dist/skill-topics.d.ts +19 -0
  488. package/dist/skill-topics.d.ts.map +1 -0
  489. package/dist/skill-topics.js +181 -0
  490. package/dist/skill-topics.js.map +1 -0
  491. package/dist/tools/active-site.d.ts +16 -0
  492. package/dist/tools/active-site.d.ts.map +1 -0
  493. package/dist/tools/active-site.js +55 -0
  494. package/dist/tools/active-site.js.map +1 -0
  495. package/dist/tools/bind-guidance.d.ts +2 -72
  496. package/dist/tools/bind-guidance.d.ts.map +1 -1
  497. package/dist/tools/bind-guidance.js +2 -72
  498. package/dist/tools/bind-guidance.js.map +1 -1
  499. package/dist/tools/budgeted-table.d.ts +14 -19
  500. package/dist/tools/budgeted-table.d.ts.map +1 -1
  501. package/dist/tools/budgeted-table.js +171 -105
  502. package/dist/tools/budgeted-table.js.map +1 -1
  503. package/dist/tools/elements/bind-output-schema.d.ts +69 -0
  504. package/dist/tools/elements/bind-output-schema.d.ts.map +1 -0
  505. package/dist/tools/elements/bind-output-schema.js +64 -0
  506. package/dist/tools/elements/bind-output-schema.js.map +1 -0
  507. package/dist/tools/elements/builders.d.ts +1 -22
  508. package/dist/tools/elements/builders.d.ts.map +1 -1
  509. package/dist/tools/elements/builders.js +147 -133
  510. package/dist/tools/elements/builders.js.map +1 -1
  511. package/dist/tools/elements/index.d.ts +0 -26
  512. package/dist/tools/elements/index.d.ts.map +1 -1
  513. package/dist/tools/elements/index.js +0 -25
  514. package/dist/tools/elements/index.js.map +1 -1
  515. package/dist/tools/elements/read-output-schemas.d.ts +121 -0
  516. package/dist/tools/elements/read-output-schemas.d.ts.map +1 -0
  517. package/dist/tools/elements/read-output-schemas.js +225 -0
  518. package/dist/tools/elements/read-output-schemas.js.map +1 -0
  519. package/dist/tools/elements/write-output-schemas.d.ts +185 -0
  520. package/dist/tools/elements/write-output-schemas.d.ts.map +1 -0
  521. package/dist/tools/elements/write-output-schemas.js +98 -0
  522. package/dist/tools/elements/write-output-schemas.js.map +1 -0
  523. package/dist/tools/elements.d.ts +0 -11
  524. package/dist/tools/elements.d.ts.map +1 -1
  525. package/dist/tools/elements.js +0 -11
  526. package/dist/tools/elements.js.map +1 -1
  527. package/dist/tools/format/health-format.d.ts +26 -43
  528. package/dist/tools/format/health-format.d.ts.map +1 -1
  529. package/dist/tools/format/health-format.js +28 -60
  530. package/dist/tools/format/health-format.js.map +1 -1
  531. package/dist/tools/format/inspection-format.d.ts +2 -54
  532. package/dist/tools/format/inspection-format.d.ts.map +1 -1
  533. package/dist/tools/format/inspection-format.js +33 -119
  534. package/dist/tools/format/inspection-format.js.map +1 -1
  535. package/dist/tools/format/pages-format.d.ts +32 -69
  536. package/dist/tools/format/pages-format.d.ts.map +1 -1
  537. package/dist/tools/format/pages-format.js +114 -139
  538. package/dist/tools/format/pages-format.js.map +1 -1
  539. package/dist/tools/format/sources-format.d.ts +5 -39
  540. package/dist/tools/format/sources-format.d.ts.map +1 -1
  541. package/dist/tools/format/sources-format.js +57 -87
  542. package/dist/tools/format/sources-format.js.map +1 -1
  543. package/dist/tools/health-output-schemas.d.ts +82 -0
  544. package/dist/tools/health-output-schemas.d.ts.map +1 -0
  545. package/dist/tools/health-output-schemas.js +130 -0
  546. package/dist/tools/health-output-schemas.js.map +1 -0
  547. package/dist/tools/health.d.ts +2 -20
  548. package/dist/tools/health.d.ts.map +1 -1
  549. package/dist/tools/health.js +46 -232
  550. package/dist/tools/health.js.map +1 -1
  551. package/dist/tools/index.d.ts +1 -26
  552. package/dist/tools/index.d.ts.map +1 -1
  553. package/dist/tools/index.js +12 -39
  554. package/dist/tools/index.js.map +1 -1
  555. package/dist/tools/inspection.d.ts +4 -34
  556. package/dist/tools/inspection.d.ts.map +1 -1
  557. package/dist/tools/inspection.js +164 -536
  558. package/dist/tools/inspection.js.map +1 -1
  559. package/dist/tools/library.d.ts +115 -127
  560. package/dist/tools/library.d.ts.map +1 -1
  561. package/dist/tools/library.js +706 -454
  562. package/dist/tools/library.js.map +1 -1
  563. package/dist/tools/local-content/builders.d.ts +1 -17
  564. package/dist/tools/local-content/builders.d.ts.map +1 -1
  565. package/dist/tools/local-content/builders.js +103 -46
  566. package/dist/tools/local-content/builders.js.map +1 -1
  567. package/dist/tools/local-content/index.d.ts +0 -15
  568. package/dist/tools/local-content/index.d.ts.map +1 -1
  569. package/dist/tools/local-content/index.js +0 -14
  570. package/dist/tools/local-content/index.js.map +1 -1
  571. package/dist/tools/local-content/schemas.d.ts +31 -47
  572. package/dist/tools/local-content/schemas.d.ts.map +1 -1
  573. package/dist/tools/local-content/schemas.js +33 -62
  574. package/dist/tools/local-content/schemas.js.map +1 -1
  575. package/dist/tools/modules/builders.d.ts +4 -0
  576. package/dist/tools/modules/builders.d.ts.map +1 -0
  577. package/dist/tools/modules/builders.js +58 -0
  578. package/dist/tools/modules/builders.js.map +1 -0
  579. package/dist/tools/modules/index.d.ts +2 -0
  580. package/dist/tools/modules/index.d.ts.map +1 -0
  581. package/dist/tools/modules/index.js +2 -0
  582. package/dist/tools/modules/index.js.map +1 -0
  583. package/dist/tools/modules/module-id-schema.d.ts +4 -0
  584. package/dist/tools/modules/module-id-schema.d.ts.map +1 -0
  585. package/dist/tools/modules/module-id-schema.js +14 -0
  586. package/dist/tools/modules/module-id-schema.js.map +1 -0
  587. package/dist/tools/modules/module-type-fields.d.ts +10 -0
  588. package/dist/tools/modules/module-type-fields.d.ts.map +1 -0
  589. package/dist/tools/modules/module-type-fields.js +34 -0
  590. package/dist/tools/modules/module-type-fields.js.map +1 -0
  591. package/dist/tools/modules/modules-create.d.ts +59 -0
  592. package/dist/tools/modules/modules-create.d.ts.map +1 -0
  593. package/dist/tools/modules/modules-create.js +154 -0
  594. package/dist/tools/modules/modules-create.js.map +1 -0
  595. package/dist/tools/modules/modules-delete.d.ts +51 -0
  596. package/dist/tools/modules/modules-delete.d.ts.map +1 -0
  597. package/dist/tools/modules/modules-delete.js +180 -0
  598. package/dist/tools/modules/modules-delete.js.map +1 -0
  599. package/dist/tools/modules/modules-update.d.ts +43 -0
  600. package/dist/tools/modules/modules-update.d.ts.map +1 -0
  601. package/dist/tools/modules/modules-update.js +177 -0
  602. package/dist/tools/modules/modules-update.js.map +1 -0
  603. package/dist/tools/modules/placement-hints.d.ts +5 -0
  604. package/dist/tools/modules/placement-hints.d.ts.map +1 -0
  605. package/dist/tools/modules/placement-hints.js +90 -0
  606. package/dist/tools/modules/placement-hints.js.map +1 -0
  607. package/dist/tools/modules/placement-ways.d.ts +13 -0
  608. package/dist/tools/modules/placement-ways.d.ts.map +1 -0
  609. package/dist/tools/modules/placement-ways.js +61 -0
  610. package/dist/tools/modules/placement-ways.js.map +1 -0
  611. package/dist/tools/multi-items/builders.d.ts +1 -21
  612. package/dist/tools/multi-items/builders.d.ts.map +1 -1
  613. package/dist/tools/multi-items/builders.js +22 -65
  614. package/dist/tools/multi-items/builders.js.map +1 -1
  615. package/dist/tools/multi-items/index.d.ts +0 -15
  616. package/dist/tools/multi-items/index.d.ts.map +1 -1
  617. package/dist/tools/multi-items/index.js +0 -15
  618. package/dist/tools/multi-items/index.js.map +1 -1
  619. package/dist/tools/multi-items/item-container-map.d.ts +0 -35
  620. package/dist/tools/multi-items/item-container-map.d.ts.map +1 -1
  621. package/dist/tools/multi-items/item-container-map.js +0 -35
  622. package/dist/tools/multi-items/item-container-map.js.map +1 -1
  623. package/dist/tools/multi-items/output-schemas.d.ts +101 -0
  624. package/dist/tools/multi-items/output-schemas.d.ts.map +1 -0
  625. package/dist/tools/multi-items/output-schemas.js +74 -0
  626. package/dist/tools/multi-items/output-schemas.js.map +1 -0
  627. package/dist/tools/navigation/builders.d.ts +1 -16
  628. package/dist/tools/navigation/builders.d.ts.map +1 -1
  629. package/dist/tools/navigation/builders.js +5 -27
  630. package/dist/tools/navigation/builders.js.map +1 -1
  631. package/dist/tools/navigation/index.d.ts +0 -13
  632. package/dist/tools/navigation/index.d.ts.map +1 -1
  633. package/dist/tools/navigation/index.js +0 -12
  634. package/dist/tools/navigation/index.js.map +1 -1
  635. package/dist/tools/navigation/schemas.d.ts +0 -30
  636. package/dist/tools/navigation/schemas.d.ts.map +1 -1
  637. package/dist/tools/navigation/schemas.js +0 -30
  638. package/dist/tools/navigation/schemas.js.map +1 -1
  639. package/dist/tools/output-schema-metadata.d.ts +5 -0
  640. package/dist/tools/output-schema-metadata.d.ts.map +1 -0
  641. package/dist/tools/output-schema-metadata.js +83 -0
  642. package/dist/tools/output-schema-metadata.js.map +1 -0
  643. package/dist/tools/pages/builders.d.ts +1 -41
  644. package/dist/tools/pages/builders.d.ts.map +1 -1
  645. package/dist/tools/pages/builders.js +320 -405
  646. package/dist/tools/pages/builders.js.map +1 -1
  647. package/dist/tools/pages/header-transparency.d.ts +2 -32
  648. package/dist/tools/pages/header-transparency.d.ts.map +1 -1
  649. package/dist/tools/pages/header-transparency.js +9 -43
  650. package/dist/tools/pages/header-transparency.js.map +1 -1
  651. package/dist/tools/pages/index.d.ts +1 -19
  652. package/dist/tools/pages/index.d.ts.map +1 -1
  653. package/dist/tools/pages/index.js +1 -19
  654. package/dist/tools/pages/index.js.map +1 -1
  655. package/dist/tools/pages/schemas.d.ts +323 -241
  656. package/dist/tools/pages/schemas.d.ts.map +1 -1
  657. package/dist/tools/pages/schemas.js +514 -549
  658. package/dist/tools/pages/schemas.js.map +1 -1
  659. package/dist/tools/pages/write-output-schemas.d.ts +139 -0
  660. package/dist/tools/pages/write-output-schemas.d.ts.map +1 -0
  661. package/dist/tools/pages/write-output-schemas.js +138 -0
  662. package/dist/tools/pages/write-output-schemas.js.map +1 -0
  663. package/dist/tools/pages.d.ts +0 -11
  664. package/dist/tools/pages.d.ts.map +1 -1
  665. package/dist/tools/pages.js +0 -11
  666. package/dist/tools/pages.js.map +1 -1
  667. package/dist/tools/pool-resolve-helper.d.ts +0 -52
  668. package/dist/tools/pool-resolve-helper.d.ts.map +1 -1
  669. package/dist/tools/pool-resolve-helper.js +29 -104
  670. package/dist/tools/pool-resolve-helper.js.map +1 -1
  671. package/dist/tools/progress-phases.d.ts +0 -42
  672. package/dist/tools/progress-phases.d.ts.map +1 -1
  673. package/dist/tools/progress-phases.js +0 -44
  674. package/dist/tools/progress-phases.js.map +1 -1
  675. package/dist/tools/response-budget.d.ts +0 -69
  676. package/dist/tools/response-budget.d.ts.map +1 -1
  677. package/dist/tools/response-budget.js +0 -127
  678. package/dist/tools/response-budget.js.map +1 -1
  679. package/dist/tools/shared-schemas.d.ts +11 -65
  680. package/dist/tools/shared-schemas.d.ts.map +1 -1
  681. package/dist/tools/shared-schemas.js +40 -123
  682. package/dist/tools/shared-schemas.js.map +1 -1
  683. package/dist/tools/skill/builders.d.ts +3 -0
  684. package/dist/tools/skill/builders.d.ts.map +1 -0
  685. package/dist/tools/skill/builders.js +81 -0
  686. package/dist/tools/skill/builders.js.map +1 -0
  687. package/dist/tools/sources/builders.d.ts +1 -11
  688. package/dist/tools/sources/builders.d.ts.map +1 -1
  689. package/dist/tools/sources/builders.js +194 -170
  690. package/dist/tools/sources/builders.js.map +1 -1
  691. package/dist/tools/sources/index.d.ts +0 -17
  692. package/dist/tools/sources/index.d.ts.map +1 -1
  693. package/dist/tools/sources/index.js +0 -16
  694. package/dist/tools/sources/index.js.map +1 -1
  695. package/dist/tools/sources/read-output-schemas.d.ts +101 -0
  696. package/dist/tools/sources/read-output-schemas.d.ts.map +1 -0
  697. package/dist/tools/sources/read-output-schemas.js +105 -0
  698. package/dist/tools/sources/read-output-schemas.js.map +1 -0
  699. package/dist/tools/sources/source-name-argument.d.ts +17 -0
  700. package/dist/tools/sources/source-name-argument.d.ts.map +1 -0
  701. package/dist/tools/sources/source-name-argument.js +64 -0
  702. package/dist/tools/sources/source-name-argument.js.map +1 -0
  703. package/dist/tools/sources/write-output-schemas.d.ts +100 -0
  704. package/dist/tools/sources/write-output-schemas.d.ts.map +1 -0
  705. package/dist/tools/sources/write-output-schemas.js +61 -0
  706. package/dist/tools/sources/write-output-schemas.js.map +1 -0
  707. package/dist/tools/sources.d.ts +0 -12
  708. package/dist/tools/sources.d.ts.map +1 -1
  709. package/dist/tools/sources.js +0 -12
  710. package/dist/tools/sources.js.map +1 -1
  711. package/dist/tools/sparse-fields.d.ts +16 -232
  712. package/dist/tools/sparse-fields.d.ts.map +1 -1
  713. package/dist/tools/sparse-fields.js +178 -242
  714. package/dist/tools/sparse-fields.js.map +1 -1
  715. package/dist/tools/strict-input.d.ts +5 -0
  716. package/dist/tools/strict-input.d.ts.map +1 -0
  717. package/dist/tools/strict-input.js +55 -0
  718. package/dist/tools/strict-input.js.map +1 -0
  719. package/dist/tools/sublayout/builders.d.ts +1 -21
  720. package/dist/tools/sublayout/builders.d.ts.map +1 -1
  721. package/dist/tools/sublayout/builders.js +10 -39
  722. package/dist/tools/sublayout/builders.js.map +1 -1
  723. package/dist/tools/sublayout/index.d.ts +1 -11
  724. package/dist/tools/sublayout/index.d.ts.map +1 -1
  725. package/dist/tools/sublayout/index.js +1 -11
  726. package/dist/tools/sublayout/index.js.map +1 -1
  727. package/dist/tools/sublayout/output-schemas.d.ts +57 -0
  728. package/dist/tools/sublayout/output-schemas.d.ts.map +1 -0
  729. package/dist/tools/sublayout/output-schemas.js +51 -0
  730. package/dist/tools/sublayout/output-schemas.js.map +1 -0
  731. package/dist/tools/tool-builder/annotations.d.ts +1 -49
  732. package/dist/tools/tool-builder/annotations.d.ts.map +1 -1
  733. package/dist/tools/tool-builder/annotations.js +9 -49
  734. package/dist/tools/tool-builder/annotations.js.map +1 -1
  735. package/dist/tools/tool-builder/confirm-preview.d.ts +24 -0
  736. package/dist/tools/tool-builder/confirm-preview.d.ts.map +1 -0
  737. package/dist/tools/tool-builder/confirm-preview.js +37 -0
  738. package/dist/tools/tool-builder/confirm-preview.js.map +1 -0
  739. package/dist/tools/tool-builder/define.d.ts +6 -26
  740. package/dist/tools/tool-builder/define.d.ts.map +1 -1
  741. package/dist/tools/tool-builder/define.js +0 -25
  742. package/dist/tools/tool-builder/define.js.map +1 -1
  743. package/dist/tools/tool-builder/index.d.ts +3 -26
  744. package/dist/tools/tool-builder/index.d.ts.map +1 -1
  745. package/dist/tools/tool-builder/index.js +2 -25
  746. package/dist/tools/tool-builder/index.js.map +1 -1
  747. package/dist/tools/tool-builder/results.d.ts +4 -124
  748. package/dist/tools/tool-builder/results.d.ts.map +1 -1
  749. package/dist/tools/tool-builder/results.js +258 -263
  750. package/dist/tools/tool-builder/results.js.map +1 -1
  751. package/dist/tools/tool-builder/types.d.ts +5 -59
  752. package/dist/tools/tool-builder/types.d.ts.map +1 -1
  753. package/dist/tools/tool-builder/types.js +0 -7
  754. package/dist/tools/tool-builder/types.js.map +1 -1
  755. package/dist/tools/tool-builder.d.ts +0 -14
  756. package/dist/tools/tool-builder.d.ts.map +1 -1
  757. package/dist/tools/tool-builder.js +0 -14
  758. package/dist/tools/tool-builder.js.map +1 -1
  759. package/dist/uninstall-skill.d.ts +0 -41
  760. package/dist/uninstall-skill.d.ts.map +1 -1
  761. package/dist/uninstall-skill.js +0 -49
  762. package/dist/uninstall-skill.js.map +1 -1
  763. package/dist/uninstall.d.ts +0 -41
  764. package/dist/uninstall.d.ts.map +1 -1
  765. package/dist/uninstall.js +1 -29
  766. package/dist/uninstall.js.map +1 -1
  767. package/dist/update/update-check.d.ts +0 -26
  768. package/dist/update/update-check.d.ts.map +1 -1
  769. package/dist/update/update-check.js +0 -25
  770. package/dist/update/update-check.js.map +1 -1
  771. package/manifest.json +4 -5
  772. package/package.json +4 -4
  773. package/skills/yt-builder-mcp/SKILL.md +1857 -400
  774. package/dist/tools/elements/handlers-write.d.ts +0 -89
  775. package/dist/tools/elements/handlers-write.d.ts.map +0 -1
  776. package/dist/tools/elements/handlers-write.js +0 -797
  777. package/dist/tools/elements/handlers-write.js.map +0 -1
  778. package/dist/tools/elements/handlers.d.ts +0 -130
  779. package/dist/tools/elements/handlers.d.ts.map +0 -1
  780. package/dist/tools/elements/handlers.js +0 -581
  781. package/dist/tools/elements/handlers.js.map +0 -1
  782. package/dist/tools/elements/layout-hierarchy-rules.d.ts +0 -62
  783. package/dist/tools/elements/layout-hierarchy-rules.d.ts.map +0 -1
  784. package/dist/tools/elements/layout-hierarchy-rules.js +0 -154
  785. package/dist/tools/elements/layout-hierarchy-rules.js.map +0 -1
  786. package/dist/tools/elements/schema-validation.d.ts +0 -218
  787. package/dist/tools/elements/schema-validation.d.ts.map +0 -1
  788. package/dist/tools/elements/schema-validation.js +0 -685
  789. package/dist/tools/elements/schema-validation.js.map +0 -1
  790. package/dist/tools/elicitation.d.ts +0 -87
  791. package/dist/tools/elicitation.d.ts.map +0 -1
  792. package/dist/tools/elicitation.js +0 -100
  793. package/dist/tools/elicitation.js.map +0 -1
  794. package/dist/tools/format/elements-format.d.ts +0 -75
  795. package/dist/tools/format/elements-format.d.ts.map +0 -1
  796. package/dist/tools/format/elements-format.js +0 -368
  797. package/dist/tools/format/elements-format.js.map +0 -1
  798. package/dist/tools/format/source-schema-format.d.ts +0 -74
  799. package/dist/tools/format/source-schema-format.d.ts.map +0 -1
  800. package/dist/tools/format/source-schema-format.js +0 -208
  801. package/dist/tools/format/source-schema-format.js.map +0 -1
  802. package/dist/tools/layout-flatten.d.ts +0 -84
  803. package/dist/tools/layout-flatten.d.ts.map +0 -1
  804. package/dist/tools/layout-flatten.js +0 -129
  805. package/dist/tools/layout-flatten.js.map +0 -1
  806. package/dist/tools/local-content/handlers.d.ts +0 -56
  807. package/dist/tools/local-content/handlers.d.ts.map +0 -1
  808. package/dist/tools/local-content/handlers.js +0 -320
  809. package/dist/tools/local-content/handlers.js.map +0 -1
  810. package/dist/tools/multi-items/clean-implode-handler.d.ts +0 -37
  811. package/dist/tools/multi-items/clean-implode-handler.d.ts.map +0 -1
  812. package/dist/tools/multi-items/clean-implode-handler.js +0 -65
  813. package/dist/tools/multi-items/clean-implode-handler.js.map +0 -1
  814. package/dist/tools/multi-items/format/inspection-format.d.ts +0 -41
  815. package/dist/tools/multi-items/format/inspection-format.d.ts.map +0 -1
  816. package/dist/tools/multi-items/format/inspection-format.js +0 -64
  817. package/dist/tools/multi-items/format/inspection-format.js.map +0 -1
  818. package/dist/tools/multi-items/inspect-handler.d.ts +0 -97
  819. package/dist/tools/multi-items/inspect-handler.d.ts.map +0 -1
  820. package/dist/tools/multi-items/inspect-handler.js +0 -323
  821. package/dist/tools/multi-items/inspect-handler.js.map +0 -1
  822. package/dist/tools/multi-items/inspection-cache.d.ts +0 -85
  823. package/dist/tools/multi-items/inspection-cache.d.ts.map +0 -1
  824. package/dist/tools/multi-items/inspection-cache.js +0 -126
  825. package/dist/tools/multi-items/inspection-cache.js.map +0 -1
  826. package/dist/tools/navigation/handlers.d.ts +0 -30
  827. package/dist/tools/navigation/handlers.d.ts.map +0 -1
  828. package/dist/tools/navigation/handlers.js +0 -41
  829. package/dist/tools/navigation/handlers.js.map +0 -1
  830. package/dist/tools/pages/handlers-audit.d.ts +0 -140
  831. package/dist/tools/pages/handlers-audit.d.ts.map +0 -1
  832. package/dist/tools/pages/handlers-audit.js +0 -714
  833. package/dist/tools/pages/handlers-audit.js.map +0 -1
  834. package/dist/tools/pages/handlers-read.d.ts +0 -133
  835. package/dist/tools/pages/handlers-read.d.ts.map +0 -1
  836. package/dist/tools/pages/handlers-read.js +0 -1061
  837. package/dist/tools/pages/handlers-read.js.map +0 -1
  838. package/dist/tools/pages/handlers-write.d.ts +0 -212
  839. package/dist/tools/pages/handlers-write.d.ts.map +0 -1
  840. package/dist/tools/pages/handlers-write.js +0 -419
  841. package/dist/tools/pages/handlers-write.js.map +0 -1
  842. package/dist/tools/pages/target.d.ts +0 -162
  843. package/dist/tools/pages/target.d.ts.map +0 -1
  844. package/dist/tools/pages/target.js +0 -239
  845. package/dist/tools/pages/target.js.map +0 -1
  846. package/dist/tools/sources/handlers-bind.d.ts +0 -148
  847. package/dist/tools/sources/handlers-bind.d.ts.map +0 -1
  848. package/dist/tools/sources/handlers-bind.js +0 -657
  849. package/dist/tools/sources/handlers-bind.js.map +0 -1
  850. package/dist/tools/sources/handlers.d.ts +0 -116
  851. package/dist/tools/sources/handlers.d.ts.map +0 -1
  852. package/dist/tools/sources/handlers.js +0 -289
  853. package/dist/tools/sources/handlers.js.map +0 -1
  854. package/dist/tools/sublayout/inspect-sublayout-handler.d.ts +0 -95
  855. package/dist/tools/sublayout/inspect-sublayout-handler.d.ts.map +0 -1
  856. package/dist/tools/sublayout/inspect-sublayout-handler.js +0 -181
  857. package/dist/tools/sublayout/inspect-sublayout-handler.js.map +0 -1
@@ -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, projectionWarning, selectDescriptorsByName, } from './sparse-fields.js';
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
- // F23 (2026-06-10): the LOUD unknown-projection warning also rides in
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
- // The REST endpoint returns `fields` as a list of {name,type,label?}
40
- // field descriptors — each `name` is a valid prop key for element_add /
41
- // _update_settings.
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
- // The descriptors the TYPE declares — unchanged by a selection, so a caller
205
- // always knows the size of what it did not ask for (Task 4 / P2).
206
- field_count: z.number(),
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', 'title_dynamic'],
152
+ headline: ['content'],
266
153
  text: ['content'],
267
154
  button: ['content', 'link'],
268
155
  image: ['image'],
269
156
  icon: ['icon'],
270
- quote: ['content'],
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
- panel_item: 'title',
166
+ 'panel-slider_item': 'title',
292
167
  headline: 'content',
293
168
  text: 'content',
294
- quote: 'content',
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 with ' +
377
- 'apimapper_yootheme_binding_for_flow({ flow_id }). Do NOT add `source` ' +
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({ template_id, element_path, ' +
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: 'apimapper_yootheme_binding_for_flow({ flow_id }) — returns ready-to-paste binding shapes.',
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({ template_id, element_path, ' +
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: 'apimapper_yootheme_binding_for_flow({ flow_id })',
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({ template_id, element_path, source_name, field_mappings }).',
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: 'apimapper_yootheme_binding_for_flow({ flow_id })',
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
- * ELEMENT_WRITE-4 (part 1) — the node-level keys the YT schema serializer lists
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
- 'YOOessentials/uEssentials extras). Names feed `element_type` of ' +
675
- 'element_add. Pass `fields[]` to narrow each row. ' +
676
- // F61: "slider"/"carousel" are customer words, not element
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
- // F23 (2026-06-09): shared loud-warning helper.
714
- const unknownNote = projectionWarning(feedback);
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: 'Use yootheme_builder_element_type_get_schema <name> for fields.',
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
- ...(unknownNote.trim() !== '' ? { projection_warning: unknownNote.trim() } : {}),
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 = z
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
- 'unknown keys rejected (error lists valid_prop_keys+' +
862
- 'did_you_mean). Field: {name,type,label?,text?,description?,enum?,' +
863
- 'value_hint?,group?,no_effect?} + groups[] + ' +
864
- 'field_count/returned_count + binding_contract ' +
865
- '(containers/items). value_hint+enum first: some defaults are SEO-fatal ' +
866
- '(headline.title_element→h1); checkbox = boolean true/false; ' +
867
- 'no_effect = read by nothing, never write it; ' +
868
- 'group:"runtime-accepted" = honoured at render, hidden in UI. Select ' +
869
- 'descriptors: field_names/name_contains. Bound size with fields[]/max_chars.',
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 selected = annotatedFields !== undefined
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
- // `field_count` keeps its meaning the descriptors the TYPE has —
947
- // so a call with no selector is unchanged. `returned_count` is what
948
- // this response actually carries, so a selection is never silent
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
- // Task 7b (plan 2026-07-27-02): each fieldset group's sentence is
953
- // stated ONCE at the schema root and joined on the field's
954
- // `group` (MEASURED: 32 occurrences of 5 distinct strings, 7334 B
955
- // carrying 1204 B of payload). Narrow it with the selection —
956
- // otherwise a two-descriptor read of a 154-field type ships every
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
- // Deliberately NOT handed to the detail renderer: the TS
989
- // text leg is a NAME|TYPE|LABEL table and never carried
990
- // `group_description` either, so the hoist moves the fact
991
- // between root and field WITHOUT adding a new payload to
992
- // the text leg. Its carrier is unchanged —
993
- // `structuredContent` here, the JSON text leg on PHP.
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
  : {}),