@wootsup/yt-builder-mcp 1.11.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 (853) hide show
  1. package/README.md +131 -33
  2. package/bin/node-floor.d.ts +28 -0
  3. package/bin/node-floor.js +123 -0
  4. package/bin/yt-builder-mcp.js +52 -11
  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 +9 -41
  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 +33 -54
  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 +13 -65
  102. package/dist/diagnostics/doctor.d.ts.map +1 -1
  103. package/dist/diagnostics/doctor.js +46 -70
  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 +18 -16
  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 +10 -174
  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 +68 -80
  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 +1 -56
  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 +31 -80
  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 +16 -0
  500. package/dist/tools/budgeted-table.d.ts.map +1 -0
  501. package/dist/tools/budgeted-table.js +203 -0
  502. package/dist/tools/budgeted-table.js.map +1 -0
  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 +171 -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 +42 -43
  528. package/dist/tools/format/health-format.d.ts.map +1 -1
  529. package/dist/tools/format/health-format.js +32 -55
  530. package/dist/tools/format/health-format.js.map +1 -1
  531. package/dist/tools/format/inspection-format.d.ts +4 -49
  532. package/dist/tools/format/inspection-format.d.ts.map +1 -1
  533. package/dist/tools/format/inspection-format.js +46 -114
  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 +115 -133
  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 +59 -184
  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 +13 -33
  554. package/dist/tools/index.js.map +1 -1
  555. package/dist/tools/inspection.d.ts +21 -17
  556. package/dist/tools/inspection.d.ts.map +1 -1
  557. package/dist/tools/inspection.js +431 -268
  558. package/dist/tools/inspection.js.map +1 -1
  559. package/dist/tools/library.d.ts +118 -126
  560. package/dist/tools/library.d.ts.map +1 -1
  561. package/dist/tools/library.js +723 -456
  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 +105 -48
  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 -67
  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 +3 -0
  628. package/dist/tools/navigation/builders.d.ts.map +1 -0
  629. package/dist/tools/navigation/builders.js +25 -0
  630. package/dist/tools/navigation/builders.js.map +1 -0
  631. package/dist/tools/navigation/index.d.ts +2 -0
  632. package/dist/tools/navigation/index.d.ts.map +1 -0
  633. package/dist/tools/navigation/index.js +2 -0
  634. package/dist/tools/navigation/index.js.map +1 -0
  635. package/dist/tools/navigation/schemas.d.ts +16 -0
  636. package/dist/tools/navigation/schemas.d.ts.map +1 -0
  637. package/dist/tools/navigation/schemas.js +11 -0
  638. package/dist/tools/navigation/schemas.js.map +1 -0
  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 +373 -359
  646. package/dist/tools/pages/builders.js.map +1 -1
  647. package/dist/tools/pages/header-transparency.d.ts +34 -0
  648. package/dist/tools/pages/header-transparency.d.ts.map +1 -0
  649. package/dist/tools/pages/header-transparency.js +85 -0
  650. package/dist/tools/pages/header-transparency.js.map +1 -0
  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 +392 -224
  656. package/dist/tools/pages/schemas.d.ts.map +1 -1
  657. package/dist/tools/pages/schemas.js +605 -458
  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 +8 -0
  676. package/dist/tools/response-budget.d.ts.map +1 -0
  677. package/dist/tools/response-budget.js +7 -0
  678. package/dist/tools/response-budget.js.map +1 -0
  679. package/dist/tools/shared-schemas.d.ts +12 -43
  680. package/dist/tools/shared-schemas.d.ts.map +1 -1
  681. package/dist/tools/shared-schemas.js +42 -97
  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 +195 -173
  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 +19 -194
  712. package/dist/tools/sparse-fields.d.ts.map +1 -1
  713. package/dist/tools/sparse-fields.js +212 -196
  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 -40
  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 -111
  748. package/dist/tools/tool-builder/results.d.ts.map +1 -1
  749. package/dist/tools/tool-builder/results.js +258 -250
  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 +5 -5
  773. package/skills/yt-builder-mcp/SKILL.md +2958 -382
  774. package/dist/tools/elements/handlers-write.d.ts +0 -70
  775. package/dist/tools/elements/handlers-write.d.ts.map +0 -1
  776. package/dist/tools/elements/handlers-write.js +0 -700
  777. package/dist/tools/elements/handlers-write.js.map +0 -1
  778. package/dist/tools/elements/handlers.d.ts +0 -125
  779. package/dist/tools/elements/handlers.d.ts.map +0 -1
  780. package/dist/tools/elements/handlers.js +0 -571
  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 -96
  787. package/dist/tools/elements/schema-validation.d.ts.map +0 -1
  788. package/dist/tools/elements/schema-validation.js +0 -249
  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 -324
  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 -54
  807. package/dist/tools/local-content/handlers.d.ts.map +0 -1
  808. package/dist/tools/local-content/handlers.js +0 -316
  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/pages/handlers-audit.d.ts +0 -129
  827. package/dist/tools/pages/handlers-audit.d.ts.map +0 -1
  828. package/dist/tools/pages/handlers-audit.js +0 -704
  829. package/dist/tools/pages/handlers-audit.js.map +0 -1
  830. package/dist/tools/pages/handlers-read.d.ts +0 -95
  831. package/dist/tools/pages/handlers-read.d.ts.map +0 -1
  832. package/dist/tools/pages/handlers-read.js +0 -929
  833. package/dist/tools/pages/handlers-read.js.map +0 -1
  834. package/dist/tools/pages/handlers-write.d.ts +0 -212
  835. package/dist/tools/pages/handlers-write.d.ts.map +0 -1
  836. package/dist/tools/pages/handlers-write.js +0 -418
  837. package/dist/tools/pages/handlers-write.js.map +0 -1
  838. package/dist/tools/pages/target.d.ts +0 -162
  839. package/dist/tools/pages/target.d.ts.map +0 -1
  840. package/dist/tools/pages/target.js +0 -239
  841. package/dist/tools/pages/target.js.map +0 -1
  842. package/dist/tools/sources/handlers-bind.d.ts +0 -148
  843. package/dist/tools/sources/handlers-bind.d.ts.map +0 -1
  844. package/dist/tools/sources/handlers-bind.js +0 -655
  845. package/dist/tools/sources/handlers-bind.js.map +0 -1
  846. package/dist/tools/sources/handlers.d.ts +0 -114
  847. package/dist/tools/sources/handlers.d.ts.map +0 -1
  848. package/dist/tools/sources/handlers.js +0 -285
  849. package/dist/tools/sources/handlers.js.map +0 -1
  850. package/dist/tools/sublayout/inspect-sublayout-handler.d.ts +0 -95
  851. package/dist/tools/sublayout/inspect-sublayout-handler.d.ts.map +0 -1
  852. package/dist/tools/sublayout/inspect-sublayout-handler.js +0 -181
  853. package/dist/tools/sublayout/inspect-sublayout-handler.js.map +0 -1
@@ -1,145 +1,164 @@
1
- /**
2
- * Page-tool output-schemas (Wave G.2 §4 structuredContent contracts).
3
- *
4
- * Split out of `src/tools/pages.ts` (Round-2 R2-A2-CRIT1) so the
5
- * handler files stay focused on logic.
6
- *
7
- * @license MIT
8
- */
9
1
  import { z } from 'zod';
10
- import { MAX_CHARS } from '../sparse-fields.js';
2
+ import { PAGE_KIND_WORDS, VISIBILITY_WORDS } from '../format/pages-format.js';
3
+ import { RESOLVED_LAYOUT_ID_OUTPUT, ETAG_PREVIEW_OPTIONAL, INCLUDE_META_SCHEMA } from '../shared-schemas.js';
4
+ import { FIELD_COVERAGE_SCHEMA, MAX_CHARS } from '../sparse-fields.js';
5
+ import { HOST_PROMPT_PROMISE } from '../tool-builder/confirm-preview.js';
6
+ import { HOST_PROMPT_ANSWERS } from '../../proxy/confirm-question-contract.js';
7
+ import { CMS_VISIBILITY_SCHEMA } from './write-output-schemas.js';
8
+ const PAGE_ROW_SCHEMA = z
9
+ .object({
10
+ id: z.string().optional(),
11
+ label: z.string().optional(),
12
+ type: z.string().optional(),
13
+ elements_count: z.number().optional(),
14
+ modified_at: z.string().nullable().optional(),
15
+ frontend_url: z.string().nullable().optional(),
16
+ frontend_url_template: z.string().nullable().optional(),
17
+ frontend_url_description: z.string().nullable().optional(),
18
+ builder_url: z.string().nullable().optional(),
19
+ serves_context_kind: z.string().optional(),
20
+ serves_context_ids: z.array(z.number()).optional(),
21
+ page_role: z.string().optional(),
22
+ is_theme_template: z.boolean().optional(),
23
+ is_public_homepage: z.boolean().optional(),
24
+ kind: z.enum(PAGE_KIND_WORDS).optional(),
25
+ cms_status: z.string().optional(),
26
+ visibility: z.enum(VISIBILITY_WORDS).optional(),
27
+ visibility_reason: z.string().optional(),
28
+ visibility_note: z.string().optional(),
29
+ frontend_url_provisional: z.boolean().optional(),
30
+ frontend_url_note: z.string().optional(),
31
+ })
32
+ .catchall(z.unknown());
11
33
  export const PAGES_LIST_OUTPUT_SCHEMA = z.object({
12
- // F-Frontend-URL (2026-05-25): each row carries `frontend_url`,
13
- // `frontend_url_template`, `frontend_url_description` so an MCP-agent
14
- // can answer "What is the URL of my <type> template?" without a
15
- // follow-up REST call or operator input. Server-side resolvers
16
- // (WordPress: get_permalink/get_term_link/get_author_posts_url; Joomla:
17
- // RouteHelper::getArticleRoute/getCategoryRoute/getTagRoute) emit one
18
- // of two shapes per row:
19
- // - `frontend_url: <permalink>` + `frontend_url_template: null`
20
- // when a canonical public URL exists (latest post / first category
21
- // / first author etc.).
22
- // - `frontend_url: null` + `frontend_url_template: <pattern>` when
23
- // the URL needs a runtime parameter (search, 404-test) or when no
24
- // public content of the matching type exists yet.
25
- // `frontend_url_description` is a short human hint ("Append any non-
26
- // existent path to test." / "Latest published post — rendered with
27
- // this template.") so the agent can render an instruction to the
28
- // end-user. All three keys are kept on the row-record (not an extra
29
- // schema object) so per-item sparse-field projection works.
30
- //
31
- // F33 (2026-06-10): each row also carries `builder_url` — a version-
32
- // aware (WP YT4/YT5) + platform-aware (Joomla com_ajax) "open in the
33
- // YOOtheme Pro builder" deep-link (or null when the host could not
34
- // resolve the admin base). Kept on the row-record so per-item sparse-
35
- // field projection + available_fields discovery surface it.
36
- items: z.array(z.record(z.string(), z.unknown())),
34
+ items: z.array(PAGE_ROW_SCHEMA),
37
35
  total: z.number(),
38
- // B2 (Glöckle 2026-06-25): pagination. `total` is the (filtered) count;
39
- // `returned` is how many rows this page carries; `next_cursor` (present
40
- // only when more remain) is passed back as `cursor` for the next page.
36
+ totals: z
37
+ .object({
38
+ content: z.number(),
39
+ theme_template: z.number(),
40
+ all: z.number(),
41
+ visibility: z
42
+ .object({
43
+ public: z.number().optional(),
44
+ hidden: z.number().optional(),
45
+ undetermined: z.number().optional(),
46
+ no_cms_status: z.number().optional(),
47
+ })
48
+ .optional(),
49
+ })
50
+ .optional(),
51
+ counting_note: z.string().optional(),
52
+ trashed_note: z.string().optional(),
53
+ hidden_count: z.number().optional(),
54
+ hidden_reason: z.string().optional(),
41
55
  returned: z.number().optional(),
42
56
  next_cursor: z.string().optional(),
43
57
  etag: z.string().optional(),
44
58
  projected_fields: z.array(z.string()).optional(),
45
- // F-004 fix (2026-05-25 exhaustive audit): projection-feedback —
46
- // emitted ONLY when the caller passed `fields[]`. `available_fields`
47
- // is the discovered top-level field vocabulary; `unknown_fields` is
48
- // the subset of requested fields that did NOT appear in any item
49
- // (previously: items came back as `[{}, {}, …]` silently).
50
59
  available_fields: z.array(z.string()).optional(),
60
+ available_fields_by_kind: z.record(z.string(), z.array(z.string())).optional(),
51
61
  unknown_fields: z.array(z.string()).optional(),
52
- // F23 (2026-06-10): the LOUD unknown-projection warning also rides in
53
- // structuredContent — hosts that surface structuredContent (not the
54
- // text leg) to the model would otherwise never see it.
62
+ field_coverage: FIELD_COVERAGE_SCHEMA,
55
63
  projection_warning: z.string().optional(),
64
+ sorted_over: z
65
+ .string()
66
+ .optional()
67
+ .describe('Scope the `sort` actually covered: `all` (the whole filtered set) or ' +
68
+ '`this_page` (only the rows returned here). Present only when `sort` was passed.'),
69
+ sort_note: z
70
+ .string()
71
+ .optional()
72
+ .describe('Present only when `sorted_over` is `this_page`: says that the newest row here ' +
73
+ 'is not necessarily the newest on the site.'),
74
+ visibility_note: z
75
+ .string()
76
+ .optional()
77
+ .describe('Present only when some row carries `visibility:"undetermined"`: explains that the ' +
78
+ 'word means "the CMS status does not hide it", which is not proof a visitor ' +
79
+ 'FINDS it. On Joomla an unrouted page is still served on its own direct URL.'),
80
+ visibility_filter_note: z.string().optional(),
81
+ default_row_note: z.string().optional(),
82
+ text_leg_note: z.string().optional(),
83
+ fields_hint: z
84
+ .string()
85
+ .optional()
86
+ .describe('Present only on a large, unfiltered answer: suggests narrowing with `fields` (see ' +
87
+ '`available_fields`) or paging with `limit`/`cursor`.'),
56
88
  });
57
- export const SCHEMA_OUTPUT_SCHEMA = z.object({
58
- // F-006 (2026-05-26): `rel_path` is the agent-preferred path form
59
- // (matches `element_list` + `page_get_layout` emit). `path` (the
60
- // fully-qualified `/templates/<id>/layout/...` pointer) stays on the
61
- // row for back-compat but is optional so callers reading the schema
62
- // know `rel_path` is the canonical projection column.
63
- //
64
- // G-B (Glöckle 2026-06-26): every row-field is now `.optional()` +
65
- // `.passthrough()` so a `fields[]` projection (which drops the unrequested
66
- // keys) still validates — exactly the relaxation `element_list`'s output
67
- // schema uses. The default (no fields) full row still carries all keys.
68
- items: z.array(z
69
- .object({
70
- rel_path: z.string().optional(),
71
- path: z.string().optional(),
72
- element_type: z.string().optional(),
73
- label: z.string().optional(),
74
- has_binding: z.boolean().optional(),
75
- })
76
- .passthrough()),
77
- total: z.number(),
78
- template_id: z.string(),
79
- // G-B: `fields[]` projection echo + the F23 unknown-field feedback,
80
- // emitted ONLY when the caller passed `fields[]`.
81
- projected_fields: z.array(z.string()).optional(),
89
+ const PAGE_GET_LAYOUT_ENVELOPE = z
90
+ .object({
91
+ ...RESOLVED_LAYOUT_ID_OUTPUT,
92
+ layout_id: z.string().optional(),
93
+ etag: z.string().optional(),
94
+ layout_root_pointer: z.string().optional(),
95
+ pointer_hint: z.string().optional(),
96
+ layout: z.unknown().optional(),
97
+ elements: z.array(z.record(z.string(), z.unknown())).optional(),
98
+ named_sections: z.unknown().optional(),
99
+ outline_text: z.string().optional(),
100
+ mode: z.string().optional(),
101
+ unchanged: z.boolean().optional(),
102
+ note: z.string().optional(),
103
+ total_elements: z.number().optional(),
104
+ warning: z.string().optional(),
82
105
  available_fields: z.array(z.string()).optional(),
106
+ available_fields_by_kind: z.record(z.string(), z.array(z.string())).optional(),
83
107
  unknown_fields: z.array(z.string()).optional(),
108
+ field_coverage: FIELD_COVERAGE_SCHEMA,
84
109
  projection_warning: z.string().optional(),
110
+ projected_fields: z.array(z.string()).optional(),
111
+ label_note: z.string().optional(),
112
+ modules_on_page: z.unknown().optional(),
113
+ modules_on_page_unavailable: z.unknown().optional(),
114
+ fields_not_applied: z.unknown().optional(),
115
+ })
116
+ .catchall(z.unknown());
117
+ export const PAGE_GET_LAYOUT_OUTPUT_SCHEMA = PAGE_GET_LAYOUT_ENVELOPE.refine((value) => Object.keys(PAGE_GET_LAYOUT_ENVELOPE.shape).some((key) => value[key] !== undefined), {
118
+ message: 'a page_get_layout answer carries at least one declared envelope key — every measured '
119
+ + 'branch does (layout_id / elements / unchanged / mode). An answer made only of '
120
+ + 'catchall keys means the envelope was lost.',
85
121
  });
86
122
  export const ETAG_OUTPUT_SCHEMA = z.object({
87
123
  etag: z.string(),
88
124
  generated_at: z.string().optional(),
89
125
  });
90
- // F-AUDIT-2 (2026-05-26): template_summary outputSchema. The handler
91
- // passes the REST `/pages/{id}/summary` body through verbatim via
92
- // `jsonResult(data)`. Live shape verified against the WP+Joomla dev
93
- // hosts: `template_id`, `counts_by_type` (open-ended map element-type
94
- // → count), `bound_count`, `max_depth`, `total`, `named_sections` (each
95
- // `{path, name}`), and the `etag` string. NOTE: `_meta` is merged at
96
- // the RESULT-LEVEL by `withSiteMeta`, NEVER into `structuredContent`
97
- // (see results.ts W12-R2 commentary) — this schema therefore validates
98
- // only the inner template-summary shape.
99
126
  export const TEMPLATE_SUMMARY_OUTPUT_SCHEMA = z.object({
100
- template_id: z.string(),
101
- counts_by_type: z.record(z.string(), z.number().int().nonnegative()),
102
- bound_count: z.number().int().nonnegative(),
103
- max_depth: z.number().int().nonnegative(),
104
- total: z.number().int().nonnegative(),
105
- named_sections: z.array(z.object({
127
+ ...RESOLVED_LAYOUT_ID_OUTPUT,
128
+ layout_id: z.string().optional(),
129
+ counts_by_type: z.record(z.string(), z.number().int().nonnegative()).optional(),
130
+ bound_count: z.number().int().nonnegative().optional(),
131
+ max_depth: z.number().int().nonnegative().optional(),
132
+ total: z.number().int().nonnegative().optional(),
133
+ named_sections: z
134
+ .array(z.object({
106
135
  path: z.string(),
107
136
  name: z.string(),
108
- })),
109
- // pages_audit impl plan Task 7 (2026-07-19): additive enrichment —
110
- // heading-level census (h1-h6 + div — `div` counts `description_list`
111
- // elements, the one type whose title_element defaults to div),
112
- // unbound-image-alt-gap count, and disabled-element count. Reuses the
113
- // SAME `LayoutAuditExtractor` pass `pages_audit` runs. `.optional()` so
114
- // a NEW MCP client talking to an OLD (pre-1.10.0) host plugin — which
115
- // doesn't emit these fields yet — still validates.
137
+ }))
138
+ .optional(),
116
139
  heading_levels: z.record(z.string(), z.number().int().nonnegative()).optional(),
140
+ heading_levels_note: z.string().optional(),
117
141
  images_missing_alt: z.number().int().nonnegative().optional(),
118
142
  disabled_elements: z.number().int().nonnegative().optional(),
119
- etag: z.string(),
143
+ already_dynamized: z.boolean().optional(),
144
+ is_theme_template: z.boolean().optional(),
145
+ etag: z.string().optional(),
146
+ content_nodes: z
147
+ .array(z.object({
148
+ path: z.string(),
149
+ type: z.string(),
150
+ status: z.boolean(),
151
+ effective_visible: z.boolean(),
152
+ hidden_on_mobile: z.boolean(),
153
+ headings: z.array(z.string()),
154
+ alts: z.array(z.string()),
155
+ }))
156
+ .optional(),
157
+ next_cursor: z.string().optional(),
158
+ summaries: z.record(z.string(), z.record(z.string(), z.unknown())).optional(),
159
+ not_found: z.array(z.string()).optional(),
160
+ forbidden: z.array(z.string()).optional(),
120
161
  });
121
- // ─── C1 — pages_create + pages_delete (v1.2) ──────────────────────────
122
- //
123
- // MCP tool schemas wrapping the Phase B REST endpoints:
124
- // POST /pages → yootheme_builder_pages_create
125
- // DELETE /pages/{post_id} → yootheme_builder_pages_delete
126
- //
127
- // These schemas drive (a) input validation at the MCP boundary and (b)
128
- // the structured-content outputSchema for client introspection.
129
- /**
130
- * Input shape for `yootheme_builder_pages_create`.
131
- *
132
- * Mirrors the args of `POST /pages` (Phase B).
133
- *
134
- * Design pins:
135
- * - `post_type` is intentionally NOT exposed. Layer 9 defensive guard
136
- * on the REST side rejects it server-side; surfacing it at the MCP
137
- * boundary would invite a footgun where an agent tries to set it
138
- * and fails confusingly.
139
- * - `status` defaults to `draft` on the server (Q6 design — no public
140
- * empty page).
141
- * - `dry_run` triggers validation Layers 1+2+4 without persisting.
142
- */
143
162
  export const PAGES_CREATE_INPUT = {
144
163
  title: z
145
164
  .string()
@@ -156,14 +175,6 @@ export const PAGES_CREATE_INPUT = {
156
175
  'WordPress accepts all five; Joomla maps draft→state 0 / publish→state 1 ' +
157
176
  '(the other three are WP-only). For the common make-it-live case prefer ' +
158
177
  'the `published` boolean below.'),
159
- // F12 (2026-06-09): friendly one-boolean publish shortcut. A fresh
160
- // draft on Joomla returns 404 to anonymous front-end visitors (state
161
- // 0); there was no ergonomic MCP path to flip it live. `published`
162
- // maps to the existing `status` field the PHP host already honours
163
- // (WP post_status=publish, Joomla state=1) — see the handler. Default
164
- // false keeps the safe "no public empty page" behaviour. When the
165
- // caller sets an explicit `status`, that wins (published is the
166
- // shortcut, not an override).
167
178
  published: z
168
179
  .boolean()
169
180
  .default(false)
@@ -171,20 +182,16 @@ export const PAGES_CREATE_INPUT = {
171
182
  'Joomla state=1) so anonymous visitors can render it immediately. ' +
172
183
  'Default false: created as a draft, visible only in the builder until ' +
173
184
  'you publish. Ignored when an explicit `status` is provided.'),
174
- // F64 (2026-06-10): Joomla-only routing helper. A published Joomla
175
- // article without a menu item has NO SEF route (anonymous 404). When
176
- // truthy AND the article is published, the host creates a
177
- // com_content single-article menu item via the Joomla Menu-Table API
178
- // under a dedicated HIDDEN menutype (string value picks the
179
- // menutype; `mainmenu` is rejected server-side so customer
180
- // navigation is never polluted). Ignored on WordPress.
181
185
  menu_item: z
182
186
  .union([z.boolean(), z.string().min(1).max(64)])
183
187
  .optional()
184
188
  .describe('Joomla only: create a SEF route for the new article. true = ' +
185
189
  'hidden default menutype; a string picks the menutype ' +
186
190
  '("mainmenu" is rejected). Requires published/status=publish. ' +
187
- 'Without a route a published Joomla article 404s for visitors.'),
191
+ 'Without a route the SEF url 404s, but the article still ' +
192
+ 'answers 200 on its raw ?option=com_content&view=article&id=N ' +
193
+ 'url: a missing menu item costs findability, never privacy. ' +
194
+ 'To keep an article non-public set its state or its access level.'),
188
195
  layout: z
189
196
  .record(z.string(), z.unknown())
190
197
  .optional()
@@ -193,118 +200,58 @@ export const PAGES_CREATE_INPUT = {
193
200
  .boolean()
194
201
  .optional()
195
202
  .describe('When true, runs validation Layers 1+2+4 without persisting.'),
196
- // post_type intentionally NOT exposed — Layer 9 defensive guard rejects
197
- // it server-side. Exposing it would invite footgun attempts.
198
203
  };
199
- /**
200
- * Wire shape for `yootheme_builder_pages_create` on success (non-dry-run).
201
- *
202
- * Mirrors the REST 201 response shape.
203
- *
204
- * Design pins:
205
- * - `frontend_url` is nullable: REST returns null for fresh drafts
206
- * before publish.
207
- * - `template_id` is a plain string. The "page:{post_id}" prefix is
208
- * enforced server-side; adding a `.startsWith()` here would buy no
209
- * MCP-client value while adding Zod complexity.
210
- * - `warnings` is a lean string array (e.g. "slug_collision_resolved"
211
- * when WP auto-appends `-2`). The REST surface may expand this to
212
- * richer objects in v1.3; strings keep the v1.2 surface minimal.
213
- */
214
204
  export const PAGES_CREATE_OUTPUT_SCHEMA = z
215
205
  .object({
216
- // E1 cross-platform divergence: WP returns `page_id`, Joomla returns
217
- // `article_id`. Both are positive ints; at least one is always present.
218
206
  page_id: z.number().int().positive().optional(),
219
207
  article_id: z.number().int().positive().optional(),
220
208
  title: z.string(),
221
209
  slug: z.string(),
222
210
  status: z.string(),
223
211
  frontend_url: z.string().nullable(),
224
- // F33 (2026-06-10): "open in the YOOtheme Pro builder" deep-link for
225
- // the freshly-created page/article. Version-aware (WP YT4/YT5) +
226
- // platform-aware (Joomla com_ajax). Nullable: null when the host
227
- // could not resolve the admin base. `.optional()` keeps the schema
228
- // back-compatible with an older host that predates the field.
229
212
  builder_url: z.string().nullable().optional(),
230
- template_id: z
213
+ layout_id: z
231
214
  .string()
232
- .describe('Synthetic per-page template id, e.g. "page:3275" (WP) or "article:42" (Joomla).'),
215
+ .describe('Synthetic per-page layout id, e.g. "page:3275" (WP) or "article:42" (Joomla).'),
233
216
  etag: z.string(),
234
217
  warnings: z
235
218
  .array(z.string())
236
219
  .describe('e.g. "slug_collision_resolved" when slug collision was resolved.'),
237
220
  })
238
221
  .refine((v) => typeof v.page_id === 'number' || typeof v.article_id === 'number', { message: 'response must contain either page_id (WP) or article_id (Joomla)' });
239
- /**
240
- * Wire shape for `yootheme_builder_pages_create` when `dry_run:true`.
241
- *
242
- * Design pin: NO `etag` field. The B6 fix-cycle decision was that
243
- * surfacing a "live" ETag with a dry-run response invites a stale-
244
- * If-Match footgun (caller pins the ETag, then non-dry-run mutates,
245
- * stale ETag rejected with 412). Dry-run is validation-only.
246
- *
247
- * `template_id_pattern` is a literal — the actual `template_id` cannot
248
- * be materialised before WP allocates the post_id.
249
- */
250
222
  export const PAGES_CREATE_DRY_RUN_OUTPUT_SCHEMA = z.object({
251
223
  dry_run: z.literal(true),
252
224
  would_create: z.object({
253
225
  title: z.string(),
254
226
  slug: z.string(),
255
227
  status: z.string(),
256
- // E1 cross-platform divergence: WP returns 'page:{post_id}', Joomla returns 'article:{article_id}'.
257
- template_id_pattern: z.enum(['page:{post_id}', 'article:{article_id}']),
228
+ layout_id_pattern: z.enum(['page:{post_id}', 'article:{article_id}']),
258
229
  }),
259
230
  validation_report: z.object({
260
231
  layer_1_structural: z.literal('passed'),
261
232
  layer_2_element_types: z.literal('passed'),
262
233
  layer_4_renderer: z.literal('passed'),
263
234
  }),
264
- // No `etag` field — by design (see B6 fix-cycle: stale-If-Match footgun).
265
235
  });
266
- /**
267
- * Input shape for `yootheme_builder_pages_delete`.
268
- *
269
- * Mirrors the args of `DELETE /pages/{post_id}` (Phase B).
270
- *
271
- * Design pin: `confirm` is `z.literal(true)`. This is the Zod-side
272
- * enforcement of the confirm gate — the MCP boundary rejects requests
273
- * without `confirm:true` before they ever hit the REST layer.
274
- *
275
- * `force` defaults to false server-side → wp_delete_post(trash). When
276
- * true → hard delete (irrecoverable).
277
- */
278
236
  export const PAGES_DELETE_INPUT = {
279
- post_id: z
280
- .number()
281
- .int()
282
- .positive()
283
- .describe('ID of the page/article to delete — WordPress post_id or Joomla article_id ' +
284
- '(the numeric part of the template_id, e.g. 42 for "article:42").'),
237
+ layout_id: z
238
+ .union([z.string().min(1), z.number().int().positive()])
239
+ .describe('Which layout: "page:42", "article:12", "default", or a bare id (42). '
240
+ + 'Use yootheme_builder_pages_list to discover.'),
285
241
  confirm: z
286
- .literal(true)
287
- .describe('Must be true. Confirm gate prevents accidental deletes.'),
288
- force: z
289
242
  .boolean()
290
243
  .optional()
291
- .describe('If true, hard-deletes (wp_delete_post force=true). Default: trash (recoverable).'),
244
+ .describe('Must be true to actually delete. LEAVE IT OUT (or send false) to get a '
245
+ + 'preview instead: the server answers 200 with what would be lost (label, '
246
+ + 'elements_count, what happens to media) plus the intents this page\'s current '
247
+ + 'state allows, and deletes nothing. '
248
+ + HOST_PROMPT_PROMISE),
249
+ intent: z
250
+ .string()
251
+ .optional()
252
+ .describe('What "remove" means here. Call without it once and the server lists the intents ' +
253
+ 'possible for this page\'s CURRENT state, in the words of its CMS.'),
292
254
  };
293
- // ─── P-G (Goldstandard wave 3) — page_dynamize ────────────────────────
294
- //
295
- // The composite "dynamize an existing designed layout" write. The recipe
296
- // of `dynamize-existing-layout.md` encoded server-side — the agent supplies
297
- // ONLY the language-level inputs (which list source, which leaf maps to
298
- // which flow field). F98 HYBRID EXECUTION: server runs the deterministic
299
- // steps (copy byte-identically, swap queries + leaf names, keep everything
300
- // else), reaching 85-95% compliance vs 60-70% for instruction-only.
301
- /**
302
- * A single `leaf_map` / `conditions` value — the F96 FieldMappingValue
303
- * shape reused verbatim (mirrors `field_mappings` in `sources/builders.ts`):
304
- * EITHER a plain string (the new flat field name) OR a structured
305
- * `{name, filters?}` carrying an explicit YT5 filters operator (e.g. a
306
- * `_condition` `{condition:'!!'}` or a date format `{date:'D, d.m.y'}`).
307
- */
308
255
  const FIELD_MAPPING_VALUE = z.union([
309
256
  z.string(),
310
257
  z
@@ -319,20 +266,18 @@ const FIELD_MAPPING_VALUE = z.union([
319
266
  })
320
267
  .strict(),
321
268
  ]);
322
- /**
323
- * Input shape for `yootheme_builder_page_dynamize`. Wraps
324
- * `POST /pages/dynamize`. Narrowest-schema rule: `template_id` +
325
- * `list_source_name` + `page.title` are required non-empty; `page` carries
326
- * the create-machinery passthrough; the reference selector is `section_name`
327
- * OR `element_path` (exactly-one is enforced server-side so a miss can list
328
- * the available named sections as remediation).
329
- */
330
- export const PAGE_DYNAMIZE_INPUT = {
331
- template_id: z
269
+ export const PAGE_GENERATE_DYNAMIC_INPUT = {
270
+ layout_id: z
332
271
  .string()
333
272
  .min(1)
334
- .describe('Template holding the REFERENCE section (e.g. "default"). ' +
273
+ .describe('The layout holding the REFERENCE section (e.g. "default"). ' +
335
274
  'Use yootheme_builder_pages_list / yootheme_builder_template_summary to discover.'),
275
+ output: z
276
+ .enum(['new_page'])
277
+ .describe('Where the dynamized result lands. "new_page" (the only value today) creates a ' +
278
+ 'NEW, unpublished, unlinked page from the reference — it never rewrites the ' +
279
+ 'reference itself. A later "in_place" value (editing the reference page ' +
280
+ 'directly) is not yet available.'),
336
281
  section_name: z
337
282
  .string()
338
283
  .min(1)
@@ -345,7 +290,9 @@ export const PAGE_DYNAMIZE_INPUT = {
345
290
  .min(1)
346
291
  .optional()
347
292
  .describe('JSON-Pointer / rel-path to the reference subtree (e.g. "/children/2"). ' +
348
- 'Provide THIS or `section_name` — exactly one.'),
293
+ 'Provide THIS or `section_name` — exactly one. The path must satisfy the ' +
294
+ 'same section→row→column hierarchy as a new page (`scaffold_section` ' +
295
+ 'builds a hull).'),
349
296
  list_source_name: z
350
297
  .string()
351
298
  .min(1)
@@ -355,10 +302,6 @@ export const PAGE_DYNAMIZE_INPUT = {
355
302
  '(apiMapperFlow…List, e.g. "apiMapperFlowAbcList") OR a native source/relation ' +
356
303
  '(e.g. "posts.customPosts", "articles"). Provide THIS or `source_map` — exactly ' +
357
304
  'one. Use yootheme_builder_sources_list to discover.'),
358
- // F201 (multi-block): a section with SEVERAL source blocks (Played / Next /
359
- // Later) dynamizes in ONE call. Each entry keys the EXISTING iterating
360
- // column query (`match`) to its flow list source (`source_name`) + its own
361
- // leaf_map. Provide THIS or `list_source_name` — exactly one.
362
305
  source_map: z
363
306
  .array(z
364
307
  .object({
@@ -433,13 +376,7 @@ export const PAGE_DYNAMIZE_INPUT = {
433
376
  .describe('Joomla only: create a SEF route. true = hidden menutype; a string picks it.'),
434
377
  })
435
378
  .describe('Passthrough to the existing create machinery (slug-collision, menu_item routing).'),
436
- etag: z
437
- .string()
438
- .min(1)
439
- .optional()
440
- .describe('Optimistic-lock ETag from yootheme_builder_get_etag. Optional; when provided, ' +
441
- '412 on conflict. Recommended for collaborative edits.'),
442
- // SOURCES_BINDING-27: preflight the dynamize without creating a page.
379
+ etag: ETAG_PREVIEW_OPTIONAL.optional(),
443
380
  dry_run: z
444
381
  .boolean()
445
382
  .optional()
@@ -448,57 +385,248 @@ export const PAGE_DYNAMIZE_INPUT = {
448
385
  '(etag == new_etag). Inspect summary.queries_swapped / unmatched_map_keys ' +
449
386
  'before the real call.'),
450
387
  };
451
- /**
452
- * Wire shape for `yootheme_builder_pages_delete` on success.
453
- *
454
- * `deleted` is `z.literal(true)` — the success-response invariant. A
455
- * failed delete surfaces as `isError:true` with a structured-error
456
- * envelope, not as `deleted:false`.
457
- */
458
388
  export const PAGES_DELETE_OUTPUT_SCHEMA = z
459
389
  .object({
460
- deleted: z.literal(true),
461
- // E1 cross-platform divergence: WP returns page_id, Joomla returns article_id.
390
+ ...RESOLVED_LAYOUT_ID_OUTPUT,
391
+ deleted: z.boolean(),
392
+ dry_run: z.literal(true).optional(),
393
+ already_trashed: z.literal(true).optional(),
394
+ note: z.string().optional(),
395
+ article_state: z.number().int().optional(),
462
396
  page_id: z.number().int().positive().optional(),
463
397
  article_id: z.number().int().positive().optional(),
464
- force_deleted: z.boolean(),
465
- etag: z.string(),
466
- // G2 / C0 (changed-path-on-write): every successful mutation now also
467
- // carries the post-write etag + the JSON-Pointer / template-id path(s)
468
- // it touched. pages_delete forwards the PHP body VERBATIM via
469
- // structuredResult, so these MUST be declared here — the host
470
- // validates structuredContent under additionalProperties:false and a
471
- // SUCCESS would otherwise trip -32602. Optional for back-compat.
398
+ post_id: z.number().int().positive().optional(),
399
+ post_type: z.string().optional(),
400
+ force_deleted: z.boolean().optional(),
401
+ etag: z.string().optional(),
472
402
  new_etag: z.string().optional(),
473
403
  changed_paths: z.array(z.string()).optional(),
404
+ label: z.string().nullable().optional(),
405
+ element_count: z.number().int().nonnegative().nullable().optional(),
406
+ has_dynamic_binding: z.boolean().optional(),
407
+ impact_note: z.string().optional(),
408
+ binding_note: z.string().nullable().optional(),
409
+ next_step: z.string().optional(),
410
+ preview: z.literal(true).optional(),
411
+ step_reversible: z.boolean().optional(),
412
+ host_prompt: z.enum(HOST_PROMPT_ANSWERS).optional(),
413
+ requires_confirm: z.literal(true).optional(),
414
+ requires_confirmation: z.literal(true).optional(),
415
+ operation: z.string().optional(),
416
+ warning: z.string().optional(),
417
+ hint: z.string().optional(),
418
+ received_confirm: z.unknown().optional(),
419
+ received_confirm_type: z.string().optional(),
420
+ expected_confirm: z.string().optional(),
421
+ layout_id: z.string().optional(),
422
+ elements_count: z.number().int().nonnegative().optional(),
423
+ elements_count_note: z.string().optional(),
424
+ media_note: z.string().optional(),
425
+ menu_item_ids: z.array(z.number().int().positive()).optional(),
426
+ menu_items_note: z.string().optional(),
427
+ applied: z.literal(false).optional(),
428
+ requires_intent: z.literal(true).optional(),
429
+ given_intent: z.string().optional(),
430
+ current_state: z.string().optional(),
431
+ intents: z
432
+ .array(z.object({
433
+ intent: z.string(),
434
+ effect: z.string(),
435
+ reversible: z.boolean(),
436
+ native_name: z.string(),
437
+ restore_call: z.string().nullable().optional(),
438
+ restore_state_note: z.string().nullable().optional(),
439
+ undo: z.string(),
440
+ }))
441
+ .optional(),
442
+ notes: z.array(z.string()).optional(),
443
+ instruction: z.string().optional(),
444
+ reads_degraded: z
445
+ .array(z.enum(['label', 'elements']))
446
+ .optional()
447
+ .describe('Reads that did not answer, so the fields they back are NOT measured. '
448
+ + '"label" backs `label` (null here means "could not read", not "no title"). '
449
+ + '"elements" backs `element_count`, `has_dynamic_binding` and `binding_note` '
450
+ + '(has_dynamic_binding defaults to false, so on a degraded read it reads as '
451
+ + '"no binding" rather than "unknown" — the more dangerous direction before a '
452
+ + 'delete). Absent when both reads answered.'),
474
453
  })
475
- .refine((v) => typeof v.page_id === 'number' || typeof v.article_id === 'number', { message: 'response must contain either page_id (WP) or article_id (Joomla)' });
476
- // ─── G-A (Track-C URL→layout) — pages_resolve ───────────────────────
477
- // ─── A-6 (single-page audit plan, 2026-07-22-02) — semantic `target` ──────
478
- //
479
- // The shared addressing object BOTH `pages_resolve` and `pages_audit` accept.
480
- // It is deliberately PERMISSIVE (every member optional, no `.refine`): the
481
- // exactly-one-of contract is enforced in the HANDLERS as a typed
482
- // `too_many_targets` result. F205 (`gateway/advanced-read-tool.ts`): an
483
- // SDK-level zod rejection surfaces as a raw -32602 and bypasses every piece of
484
- // typed steering the tool provides.
485
- //
486
- // The VOCABULARY lives in these field `.describe()` strings on purpose — the
487
- // tool descriptions are pinned at MAX_DESCRIPTION_LENGTH=600 by
488
- // `tests/gateway/description-length.test.ts` and pages_resolve already sits at
489
- // 577, so there is no room there. Field describes carry no length pin.
490
- /**
491
- * The five addressing keys, in the order they are documented + put on the
492
- * wire. SSOT for both the `matched_by` echo enum and the runtime iteration in
493
- * `./target.ts`.
494
- */
454
+ .superRefine((v, ctx) => {
455
+ if (v.requires_confirmation === true) {
456
+ if (v.deleted !== false) {
457
+ ctx.addIssue({
458
+ code: 'custom',
459
+ path: ['deleted'],
460
+ message: 'a confirm preview must report deleted:false nothing was removed',
461
+ });
462
+ }
463
+ if (!Array.isArray(v.intents) || v.intents.length === 0) {
464
+ ctx.addIssue({
465
+ code: 'custom',
466
+ path: ['intents'],
467
+ message: 'a confirm preview must carry the intents this state allows — without them '
468
+ + 'the caller cannot form the follow-up call it is being asked to make',
469
+ });
470
+ }
471
+ if (typeof v.page_id !== 'number' && typeof v.article_id !== 'number') {
472
+ ctx.addIssue({
473
+ code: 'custom',
474
+ path: ['page_id'],
475
+ message: 'response must contain either page_id (WP) or article_id (Joomla)',
476
+ });
477
+ }
478
+ return;
479
+ }
480
+ if (v.dry_run === true) {
481
+ if (v.deleted !== false) {
482
+ ctx.addIssue({
483
+ code: 'custom',
484
+ path: ['deleted'],
485
+ message: 'a dry_run preview must report deleted:false — nothing was written',
486
+ });
487
+ }
488
+ if (typeof v.post_id !== 'number') {
489
+ ctx.addIssue({
490
+ code: 'custom',
491
+ path: ['post_id'],
492
+ message: 'a dry_run preview must echo the post_id it previewed',
493
+ });
494
+ }
495
+ return;
496
+ }
497
+ if (v.requires_intent === true) {
498
+ if (v.deleted !== false) {
499
+ ctx.addIssue({
500
+ code: 'custom',
501
+ path: ['deleted'],
502
+ message: 'a discovery answer must report deleted:false — nothing was removed',
503
+ });
504
+ }
505
+ if (!Array.isArray(v.intents) || v.intents.length === 0) {
506
+ ctx.addIssue({
507
+ code: 'custom',
508
+ path: ['intents'],
509
+ message: 'a discovery answer must carry the options it was asked for',
510
+ });
511
+ }
512
+ return;
513
+ }
514
+ if (v.already_trashed === true) {
515
+ if (v.deleted !== false) {
516
+ ctx.addIssue({
517
+ code: 'custom',
518
+ path: ['deleted'],
519
+ message: 'an already-trashed report must say deleted:false — nothing was removed',
520
+ });
521
+ }
522
+ if (typeof v.note !== 'string' || v.note.length === 0) {
523
+ ctx.addIssue({
524
+ code: 'custom',
525
+ path: ['note'],
526
+ message: 'an already-trashed report must name the state and what to call next',
527
+ });
528
+ }
529
+ if (typeof v.page_id !== 'number' && typeof v.article_id !== 'number') {
530
+ ctx.addIssue({
531
+ code: 'custom',
532
+ path: ['page_id'],
533
+ message: 'response must contain either page_id (WP) or article_id (Joomla)',
534
+ });
535
+ }
536
+ return;
537
+ }
538
+ if (v.deleted !== true) {
539
+ ctx.addIssue({
540
+ code: 'custom',
541
+ path: ['deleted'],
542
+ message: 'a carried-out delete must report deleted:true (a failure is isError, not deleted:false)',
543
+ });
544
+ }
545
+ if (typeof v.force_deleted !== 'boolean') {
546
+ ctx.addIssue({
547
+ code: 'custom',
548
+ path: ['force_deleted'],
549
+ message: 'a carried-out delete must say whether it was permanent',
550
+ });
551
+ }
552
+ if (typeof v.page_id !== 'number' && typeof v.article_id !== 'number') {
553
+ ctx.addIssue({
554
+ code: 'custom',
555
+ path: ['page_id'],
556
+ message: 'response must contain either page_id (WP) or article_id (Joomla)',
557
+ });
558
+ }
559
+ if (typeof v.etag !== 'string') {
560
+ ctx.addIssue({
561
+ code: 'custom',
562
+ path: ['etag'],
563
+ message: 'a carried-out delete must carry the post-write etag',
564
+ });
565
+ }
566
+ });
567
+ export const PAGES_SET_STATUS_INPUT = {
568
+ layout_id: z
569
+ .union([z.string().min(1), z.number().int().positive()])
570
+ .describe('Which layout: "page:42", "article:12", "default", or a bare id (42). '
571
+ + 'Use yootheme_builder_pages_list to discover.'),
572
+ status: z
573
+ .enum([
574
+ 'publish', 'draft', 'pending', 'private', 'future',
575
+ 'published', 'unpublished', 'archived',
576
+ ])
577
+ .describe('The CMS status, in YOUR platform\'s own words. WordPress: publish, draft, '
578
+ + 'pending, private, future. Joomla: published, unpublished, archived. A status '
579
+ + 'from the other platform is refused (422) with the list valid HERE — no '
580
+ + 'translation happens. To trash or delete a page use '
581
+ + 'yootheme_builder_pages_delete (it carries the confirm gate); no status value '
582
+ + 'deletes anything. A page already IN the trash is refused (409) — restore it '
583
+ + 'in the CMS first, which is what puts its original URL back. '
584
+ + 'This write takes NO `etag` and is last-one-wins — nothing detects a competing '
585
+ + 'change. The `etag` it RETURNS is the post-write layout etag, for chaining into '
586
+ + 'your next LAYOUT write.'),
587
+ };
588
+ export const PAGES_SET_STATUS_OUTPUT_SCHEMA = z.object({
589
+ ...RESOLVED_LAYOUT_ID_OUTPUT,
590
+ post_id: z.number().int().positive(),
591
+ article_id: z.number().int().positive().optional(),
592
+ layout_id: z.string(),
593
+ post_type: z.string().optional(),
594
+ status: z.string(),
595
+ previous_status: z.string(),
596
+ changed: z.boolean(),
597
+ requested_status: z.string(),
598
+ warnings: z.array(z.string()),
599
+ changed_paths: z.array(z.string()).optional(),
600
+ etag: z.string(),
601
+ new_etag: z.string(),
602
+ findable_by_visitor: z.boolean().nullable(),
603
+ cms_visibility: CMS_VISIBILITY_SCHEMA.optional(),
604
+ cms_warning: z.string().optional(),
605
+ frontend_url: z.string().optional(),
606
+ frontend_url_provisional: z.boolean().optional(),
607
+ frontend_url_note: z.string().optional(),
608
+ });
609
+ export const PAGES_RESTORE_INPUT = {
610
+ layout_id: z
611
+ .union([z.string().min(1), z.number().int().positive()])
612
+ .describe('Which layout: "page:42", "article:12", "default", or a bare id (42). '
613
+ + 'Use yootheme_builder_pages_list to discover. Not currently trashed → refused (409).'),
614
+ };
615
+ export const PAGES_RESTORE_OUTPUT_SCHEMA = z.object({
616
+ ...RESOLVED_LAYOUT_ID_OUTPUT,
617
+ restored: z.boolean(),
618
+ post_id: z.number().int().positive(),
619
+ article_id: z.number().int().positive().optional(),
620
+ post_type: z.string().optional(),
621
+ status: z.string(),
622
+ restored_from: z.literal('trash').or(z.literal('trashed')),
623
+ changed_paths: z.array(z.string()).optional(),
624
+ etag: z.string(),
625
+ new_etag: z.string(),
626
+ note: z.string(),
627
+ frontend_url: z.string().optional(),
628
+ });
495
629
  export const TARGET_KEYS = ['template_id', 'post_id', 'url', 'special', 'title'];
496
- /**
497
- * The semantic-special vocabulary, byte-identical to PHP `SpecialTargetMap`'s
498
- * key set. `date` is IN the vocabulary but unsupported on both platforms — it
499
- * resolves to a clean `special_not_supported` error rather than "unknown
500
- * special", which is why it is listed here.
501
- */
502
630
  export const SPECIAL_TARGET_TOKENS = [
503
631
  'home',
504
632
  'front-page',
@@ -551,9 +679,6 @@ export const PAGES_TARGET = z
551
679
  'special / title — supplying two returns a typed too_many_targets error, ' +
552
680
  'supplying none runs the unscoped default.');
553
681
  export const PAGES_RESOLVE_INPUT = {
554
- // A-6: OPTIONAL since a target-only resolve must be expressible. The
555
- // exactly-one-of(url, target) contract lives in `handlePagesResolve`
556
- // (typed too_many_targets / missing_url), not in the schema.
557
682
  url: z
558
683
  .string()
559
684
  .min(1)
@@ -567,107 +692,69 @@ export const PAGES_RESOLVE_INPUT = {
567
692
  '"author", "archive") or a title substring. Mutually exclusive with `url`.'),
568
693
  };
569
694
  export const PAGES_RESOLVE_OUTPUT_SCHEMA = z.object({
570
- // The read-tool-addressable id every read tool accepts as `template_id`
571
- // (page_get_layout, page_get_schema, element_*): a `page:<id>` (WP) /
572
- // `article:<id>` (Joomla) token for a per-page layout, OR the raw
573
- // `templates.<id>` key for a governing THEME TEMPLATE (G-A2).
574
- template_id: z.string(),
575
- // The resolved integer post-id (WP) / article-id (Joomla) for a per-page
576
- // layout, or NULL for a theme template (an archive URL has no single post).
695
+ layout_id: z.string(),
577
696
  post_id: z.number().int().positive().nullable(),
578
- // Content type — `get_post_type`/archive post-type/taxonomy on WP,
579
- // "article"/"category" on Joomla.
580
697
  type: z.string(),
581
- // The page's human display name. Load-bearing for the fuzzy addresses: a
582
- // `special`/`title` resolve is only checkable if the caller can see WHICH
583
- // page it landed on without a second round-trip. `.optional()` because a
584
- // host predating the label fill omits it and this is a STRICT object.
585
698
  label: z.string().optional(),
586
- // Canonical permalink (null when the platform cannot re-derive one).
587
699
  frontend_url: z.string().nullable(),
588
- // G-A2: the matched YT type/condition for a theme template
589
- // (e.g. "archive-gloeckle_help", "taxonomy-category_faq"), else null for a
590
- // per-page layout.
591
700
  context: z.string().nullable(),
592
- // G-A2: which kind was resolved — a per-page layout vs. the governing theme
593
- // template — so the agent knows it reached the right surface.
594
701
  resolved_via: z.enum(['per_page', 'theme_template']),
595
- // A-6: WHICH branch of the `target` object matched, echoed so the caller can
596
- // tell the user how a fuzzy address (a title substring, a semantic special)
597
- // was interpreted. `.optional()` is load-bearing: a `url` resolve and every
598
- // host predating A-5 omit it, and this is a STRICT object.
599
702
  matched_by: z.enum(TARGET_KEYS).optional(),
600
703
  });
601
- // ─── F5 + N5 (Glöckle HANDOFF-4/5) — render_preview ──────────────────
602
- //
603
- // The input shape (`template_id` OR `url`, exactly one — mirroring
604
- // page_get_layout's addressing) is assembled in `builders.ts` from the shared
605
- // TEMPLATE_ID_OPTIONAL + RESOLVE_URL schemas, the same way pages_resolve /
606
- // page_get_layout do. Only the STRICT output schema lives here.
607
- /**
608
- * Wire shape for `yootheme_builder_render_preview` on success.
609
- *
610
- * STRICT (additionalProperties:false default ZodObject) — every field the
611
- * handler puts in structuredContent MUST be declared here, or a strict MCP
612
- * host -32602-rejects the SUCCESS (the structured-content-shape-pin guard
613
- * enforces this).
614
- *
615
- * - rendered: the in-process Builder render did NOT throw.
616
- * - item_count: count of rendered repeat-source items (`el-item` rows).
617
- * - empty: the rendered HTML is empty / whitespace-only.
618
- * - error: OPTIONAL — present ONLY when the render threw; the otherwise-
619
- * swallowed YOOtheme render message.
620
- * - cache_purge_hint: the constant operator steer (purge Rocket/CDN after save).
621
- * - template_id: echoed back (the resolved id the render ran on).
622
- * - matched: OPTIONAL — present ONLY when the caller passed `expect`; did the
623
- * rendered HTML contain that substring (Glöckle HANDOFF-6 #4).
624
- * - snippet: OPTIONAL — present ONLY when the caller passed `expect`; a
625
- * ~200-char window around the first match (or null when not
626
- * matched / the render threw). NULLABLE so the no-match case
627
- * validates under the strict schema.
628
- */
629
704
  export const RENDER_PREVIEW_OUTPUT_SCHEMA = z.object({
705
+ ...RESOLVED_LAYOUT_ID_OUTPUT,
630
706
  rendered: z.boolean(),
631
- item_count: z.number().int().nonnegative(),
707
+ rendered_item_wrapper_count: z.number().int().nonnegative(),
708
+ rendered_item_wrapper_count_note: z.string().optional(),
632
709
  empty: z.boolean(),
710
+ fallback_used: z.boolean(),
711
+ dropped_count: z.number().int().nonnegative(),
712
+ dropped_count_note: z.string().optional(),
633
713
  error: z.string().optional(),
634
714
  cache_purge_hint: z.string(),
635
- template_id: z.string(),
636
- // F5 + N5 / Glöckle HANDOFF-6 #4 — the optional `expect` substring check.
637
- // Both keys are emitted ONLY when the caller passed `expect`; declared here
638
- // (strict ZodObject → additionalProperties:false) so a strict host does not
639
- // -32602-reject the `expect` variant. `snippet` is nullable (null on a miss).
715
+ layout_id: z.string(),
716
+ source_item_counts: z.record(z.string(), z.number().int().nonnegative()),
717
+ unresolved_sources: z.array(z.string()).optional(),
640
718
  matched: z.boolean().optional(),
641
719
  snippet: z.string().nullable().optional(),
720
+ match_conclusive: z.boolean().optional(),
721
+ match_note: z.string().optional(),
722
+ mismatch_hints: z.array(z.string()).optional(),
723
+ stored_but_not_rendered: z
724
+ .object({
725
+ elements: z.array(z.object({
726
+ path: z.string(),
727
+ source_name: z.string(),
728
+ })),
729
+ note: z.string(),
730
+ })
731
+ .optional(),
732
+ cms_status: z.string().optional(),
733
+ cms_status_note: z.string().optional(),
734
+ });
735
+ export const HEADING_OUTLINE_OUTPUT_SCHEMA = z.object({
736
+ ...RESOLVED_LAYOUT_ID_OUTPUT,
737
+ layout_id: z.string(),
738
+ mode: z.enum(['builder', 'rendered']),
739
+ etag: z.string(),
740
+ outline: z.array(z.object({
741
+ level: z.string(),
742
+ text: z.string(),
743
+ element_type: z.string(),
744
+ path: z.string(),
745
+ })),
746
+ images: z.array(z.object({
747
+ alt: z.string().nullable(),
748
+ is_generic_alt: z.boolean(),
749
+ element_type: z.string(),
750
+ path: z.string(),
751
+ })),
752
+ h1_count: z.number().int().nonnegative(),
753
+ has_level_skip: z.boolean(),
754
+ images_missing_alt: z.number().int().nonnegative(),
755
+ render_fallback_used: z.boolean().optional(),
756
+ render_dropped_count: z.number().int().nonnegative().optional(),
642
757
  });
643
- // ─── Task 6 (pages_audit design, 2026-07-19) — shared FINDING/QUICK_CHECK ──
644
- //
645
- // Defined ONCE here — referenced by `pages_audit`'s own output schema AND
646
- // (Task 8) `page_publish` / `page_save`'s additive `quick_check` block, so
647
- // the finding shape has exactly one source of truth across all three
648
- // surfaces (design §5-§7). Mirrors the PHP wire shape verbatim
649
- // (`PageAuditService::audit()` / `AuditCheck`'s partial-finding contract).
650
- /**
651
- * The human-locatable address of ONE audit hit (B-3/B-5) — mirrors the PHP
652
- * `FindingLocator::toArray()` wire shape. `path` stays the machine write
653
- * address; `breadcrumb`/`element_type`/`element_name` are what a HUMAN needs
654
- * to find the element in the customizer. Per the PHP null-key policy the
655
- * optional members are OMITTED rather than sent as null.
656
- *
657
- * FAIL-SOFT BY CONSTRUCTION. `pages[]` rows used to ride through
658
- * `.catchall(z.unknown())` untyped; now that `locators` is a typed array, a
659
- * mismatch is no longer stripped — the MCP SDK THROWS `McpError`
660
- * (InvalidParams) on an outputSchema violation, which fails the WHOLE audit
661
- * call. So the optional members are `.nullish()` (an explicit `null` from a
662
- * host that does not honour the omit-nulls policy must not be fatal) and the
663
- * object carries a `.catchall`, so a field a future host version adds can
664
- * never hard-fail an otherwise perfectly good audit.
665
- *
666
- * `repeat` is the one deliberately STRICT member: PHP emits it clamped to
667
- * `>= 1` (`repeat: 0` is meaningless — a hit that renders zero times is not a
668
- * hit), so `min(1)` states the real contract rather than tolerating a value
669
- * that could only mean a producer bug.
670
- */
671
758
  export const FINDING_LOCATOR = z
672
759
  .object({
673
760
  path: z.string(),
@@ -681,58 +768,26 @@ export const FINDING_LOCATOR = z
681
768
  name: z.string().nullish(),
682
769
  })
683
770
  .catchall(z.unknown());
684
- /**
685
- * One audit finding. `pages` carries per-page mini-evidence whose KEYS vary
686
- * by check code (`first_headline_path`, `alt_paths`, `cluster_id`,
687
- * `iterated`, `disabled_elements`, `elements_content`, ...) — `.catchall`
688
- * keeps every row's base `{id, label}` typed while tolerating the
689
- * check-specific extras without a per-code union.
690
- *
691
- * The ADDITIVE B-3/B-5 keys (`locators`, `hits_truncated`,
692
- * `locators_stripped`, `builder_url`) are declared EXPLICITLY for
693
- * self-documentation — the `.catchall` already tolerated them, but a named
694
- * member states the contract. All stay `.optional()`: a host plugin predating
695
- * B-3 emits none of them.
696
- *
697
- * `hits_truncated` and `locators_stripped` mean DIFFERENT things and are never
698
- * interchangeable: the former says the upstream `hit_cap` dropped hits (so the
699
- * raw `paths`/`alt_paths`/`skips`/`dead_anchors` arrays are incomplete), the
700
- * latter says the transport's shrink-to-fit shed locator PROSE while leaving
701
- * those arrays complete.
702
- *
703
- * FORWARD-COMPAT `.catchall`, for the same reason `FINDING_LOCATOR` carries one:
704
- * the handler forwards each finding VERBATIM, and a strict object generates
705
- * `additionalProperties:false`, so ONE additive field on the PHP side (an
706
- * explicit hit total, a new evidence key) would make a strict host -32602-reject
707
- * an otherwise perfect audit. Every declared member is still validated; only
708
- * UNDECLARED ones ride through untyped.
709
- */
710
771
  export const FINDING = z.object({
711
772
  code: z.string(),
712
- category: z.enum(['seo', 'structure', 'content', 'links']),
773
+ category: z.enum(['seo', 'structure', 'content', 'links', 'design']),
713
774
  severity: z.enum(['critical', 'warning', 'info']),
714
775
  title: z.string(),
715
- count: z.number().int().nonnegative(),
776
+ affected_pages: z.number().int().nonnegative(),
716
777
  pages: z.array(z
717
778
  .object({
718
779
  id: z.string(),
719
780
  label: z.string(),
720
781
  locators: z.array(FINDING_LOCATOR).optional(),
721
- // NAME-2: `count` is ambiguous ACROSS levels on this wire — it
722
- // means PAGES on the finding and HITS on a page entry. The host
723
- // therefore emits an unambiguous `hits` alias next to a page
724
- // entry's `count` whenever that count really is a hit tally.
725
- // Declared (not merely tolerated via `.catchall`) so the field
726
- // is part of the contract and `hitCountOf` may prefer it.
727
- hits: z.number().int().nonnegative().optional(),
782
+ occurrences_here: z.number().int().nonnegative().optional(),
783
+ bound_gaps_not_counted: z.number().int().nonnegative().optional(),
728
784
  hits_truncated: z.boolean().optional(),
729
785
  locators_stripped: z.boolean().optional(),
730
786
  builder_url: z.string().nullable().optional(),
787
+ frontend_url: z.string().nullable().optional(),
731
788
  })
732
789
  .catchall(z.unknown())),
733
- pages_truncated: z.boolean(),
734
- // Machine-executable remediation (design §5): absent for findings with
735
- // NO safe auto-fix (duplicate-layout, title-collision — human decision).
790
+ finding_pages_truncated: z.boolean(),
736
791
  fix_hint: z
737
792
  .object({
738
793
  tool: z.string(),
@@ -741,26 +796,43 @@ export const FINDING = z.object({
741
796
  })
742
797
  .optional(),
743
798
  }).catchall(z.unknown());
744
- /**
745
- * The advisory block `page_publish` (default on) / `page_save`
746
- * (opt-in via `quick_check:true`) attach (Task 8). Design §7: `{clean:true}`
747
- * on zero findings, else `{findings, note}` pointing at `pages_audit` for
748
- * the site-wide (scope==='site') checks this per-page pass does not run.
749
- */
750
799
  export const QUICK_CHECK = z.object({
751
800
  clean: z.boolean().optional(),
752
801
  findings: z.array(FINDING).optional(),
753
802
  note: z.string().optional(),
754
803
  });
755
- /**
756
- * Input shape for `yootheme_builder_pages_audit` (design §5). `site_id` is
757
- * spread in separately by `builders.ts` (mirrors PAGES_RESOLVE_INPUT).
758
- */
759
804
  export const PAGES_AUDIT_INPUT = {
760
- // A-6: scope the whole sweep to ONE page. Omit for the site-wide default.
761
- // Site-wide checks that compare pages against EACH OTHER (duplicate-layout,
762
- // title-collision) cannot run on a single page and self-filter out; the
763
- // response says so in its `note`.
805
+ mode: z
806
+ .enum(['builder', 'rendered'])
807
+ .optional()
808
+ .describe('Audit source. "builder" (default) reads the saved layout tree: fast, but blind to ' +
809
+ 'module/widget output and anything a plugin injects only at render time — the ' +
810
+ 'response names the checks that blindness affects in ' +
811
+ '`checks_limited_to_saved_layout`, so a 0 from one of them reads as "0 in the ' +
812
+ 'stored layout" rather than "0 on the page". ' +
813
+ '"rendered" renders each page first (via the SAME engine render_preview uses) and ' +
814
+ 'audits the ACTUAL DOM. It runs a SUBSET of the checks, so a code that is not in ' +
815
+ 'that subset reports nothing here — "0 found" and "0 checked" are different ' +
816
+ 'answers, and the response says which one you got in `checks_not_run`. These do ' +
817
+ 'NOT run in "rendered" (each needs the stored builder tree): ' +
818
+ 'empty-page, dangling-source, unknown-source-fields, container-missing-item-child, ' +
819
+ 'binding-renders-nothing, heading-hidden-on-mobile, thin-content, duplicate-layout, ' +
820
+ 'title-collision, non-pretty-url, stale-content, header-contrast-risk, ' +
821
+ 'header-contrast-unverifiable. ' +
822
+ 'This is the MOST valuable mode for the "design" category, since a ' +
823
+ 'plugin form (Formidable/ACF) only exists at render time. Findings carry no builder ' +
824
+ 'element path in this mode (empty breadcrumb/' +
825
+ 'element_type by design, there is no builder node to point at); locate the hit by ' +
826
+ 'its content_snippet or the page\'s builder_url/frontend_url instead. A SITE-wide ' +
827
+ 'rendered sweep is capped (rendering is expensive); the response\'s render_scan ' +
828
+ '{attempted, rendered, capped} always says so honestly and, when the cap engaged, ' +
829
+ 'skipped_by_cap NAMES the templates it skipped, so the gap can be closed with a ' +
830
+ 'types-narrowed re-run. render_errors lists any ' +
831
+ 'page whose render failed (excluded from findings, never reported as a false clean). ' +
832
+ 'A Joomla page with module/module_position is NOT a render failure — it renders via ' +
833
+ 'a tolerant fallback (that subtree excluded) and shows up in render_fallback ' +
834
+ '{pages, suppressed_checks} instead, with no-headings/missing-h1/heading-skip ' +
835
+ 'suppressed on just those pages (the only codes a hidden widget heading could fabricate).'),
764
836
  target: PAGES_TARGET.optional().describe('Audit ONE page instead of the whole site — by template_id, post_id, url, a ' +
765
837
  'semantic special ("home", "blog", "404", "search", "category", "tag", ' +
766
838
  '"author", "archive") or a title substring. The response then carries ' +
@@ -773,13 +845,37 @@ export const PAGES_AUDIT_INPUT = {
773
845
  'same `type` values yootheme_builder_pages_list rows carry). Default: every ' +
774
846
  'scanned template/page is included.'),
775
847
  checks: z
776
- .array(z.enum(['seo', 'structure', 'content', 'links']))
848
+ .array(z.enum(['seo', 'structure', 'content', 'links', 'design']))
777
849
  .optional()
778
- .describe('Run only these check categories (default: all four). "seo" = title-collision, ' +
779
- 'non-pretty-url, stale-content. "structure" = empty-page, missing-h1, ' +
780
- 'multiple-h1, no-headings, heading-skip, long-heading. "content" = ' +
850
+ .describe('Run only these check categories (default: all five). "seo" = title-collision, ' +
851
+ 'non-pretty-url, stale-content. "structure" = empty-page, dangling-source, ' +
852
+ 'unknown-source-fields (the bound source exists but a field_mappings value it ' +
853
+ 'does not emit renders blank), ' +
854
+ 'container-missing-item-child (a grid/button/slideshow with no *_item child ' +
855
+ 'repeats nothing, so it renders nothing), missing-h1, ' +
856
+ 'multiple-h1, no-headings, heading-skip, heading-hidden-on-mobile (hidden at ' +
857
+ 'the mobile-first UIkit breakpoint; Google indexes mobile-first, so this is ' +
858
+ 'effectively invisible for ranking), long-heading. "content" = ' +
781
859
  'images-missing-alt, generic-alt-text, thin-content, duplicate-layout. ' +
782
- '"links" = dead-anchor, anchor-text-quality.'),
860
+ '"links" = dead-anchor, anchor-text-quality — BOTH stay on the page they are ' +
861
+ 'reading. No link TARGET is ever fetched or resolved: a link to a deleted page, a ' +
862
+ 'wrong internal path, or an external URL that answers 404 is not checked by this ' +
863
+ 'tool at all, so "no findings under links" must not be read as "no broken links". ' +
864
+ 'dead-anchor only means a `#id` jump whose target id is missing on the SAME page. ' +
865
+ '"design" = design-missing-uikit-class, ' +
866
+ 'design-foreign-class, design-inline-style: markup breaking out of the UIkit ' +
867
+ 'design system (e.g. a plugin form submit button with no uk-button); most ' +
868
+ 'valuable in mode:"rendered", where a plugin\'s own output actually exists — ' +
869
+ 'plus header-contrast-risk (warning): the first section pulls the navigation ' +
870
+ 'over itself (header_transparent) in a colour the theme\'s own --uk-inverse ' +
871
+ 'declaration contradicts, with no image or video hiding the background that ' +
872
+ 'declaration describes; and header-contrast-unverifiable (info): the same ' +
873
+ 'transparent header over a hero image/video, whatever the colour — the medium ' +
874
+ 'hides that background, so no colour is verifiable from the props, none is ' +
875
+ 'recommended, and readability is only verifiable by looking at the rendered ' +
876
+ 'page. Both are builder-mode only (section props do not exist ' +
877
+ 'in a rendered document). Headings and image alt are also read from raw HTML ' +
878
+ '(html/text element content), not just builder props.'),
783
879
  thin_content_threshold: z
784
880
  .number()
785
881
  .int()
@@ -794,49 +890,51 @@ export const PAGES_AUDIT_INPUT = {
794
890
  .optional()
795
891
  .describe('Months since a page\'s `modified_at` after which it is flagged `stale-content`. ' +
796
892
  'Pages with an empty modified_at are never flagged. Default: 24.'),
797
- // PERF-4 / PROD-2: on THIS tool `max_chars` bounds BOTH legs — the shared
798
- // describe's "structuredContent stays complete" is true everywhere else,
799
- // but an audit's structured leg was measured at 349 KB (~89k tokens) for a
800
- // site sweep, so it carries its own default ceiling
801
- // ({@see STRUCTURED_BUDGET_CHARS}) that this argument raises or lowers.
802
893
  max_chars: MAX_CHARS.describe('Optional cap (chars) on this result. Bounds BOTH the text leg and the ' +
803
894
  'structuredContent payload (default: 48000 chars for structuredContent). ' +
804
895
  'When the structured leg has to shrink, locator detail is shed before ' +
805
- 'evidence pages and the response carries structured_truncated:true. Raise ' +
806
- 'it for a complete pathological page, lower it on a tight context budget.'),
896
+ 'evidence pages and the response carries structured_truncated:true. ' +
897
+ 'It does NOT lift the per-page HIT cap: a site sweep lists at most 5 hits ' +
898
+ 'per page (flagged hits_truncated) whatever you pass here — pass `target` ' +
899
+ 'to audit ONE page, which raises that cap to 100. Raise max_chars for a ' +
900
+ 'complete pathological page, lower it on a tight context budget. ' +
901
+ 'Raising it stops helping at the limit your own client puts on a single tool ' +
902
+ 'result, which this server cannot see. ' +
903
+ 'Out of range, the cap that actually applied comes back as `max_chars`.'),
904
+ include_meta: INCLUDE_META_SCHEMA,
905
+ include_modules: z
906
+ .boolean()
907
+ .optional()
908
+ .describe('When true, attach `modules_by_page[layout_id]` — the widgets/modules that ' +
909
+ 'render on each SCANNED page, split into `from_elements` (a module/' +
910
+ 'module_position element placed directly in this page\'s own layout) and ' +
911
+ '`from_positions` (a site-wide theme position — navbar/header/footer — ' +
912
+ 'rendering here with no element in this page\'s own layout at all). On ' +
913
+ 'Joomla, a site-wide module can still be assignment-EXCLUDED from a ' +
914
+ 'specific page (`except`); when that decision cannot be resolved for a ' +
915
+ 'page (no menu item addresses it, or more than one does), the row lands in ' +
916
+ '`from_positions_undecidable` instead of being guessed in or out. A ' +
917
+ 'builder-content module (Joomla mod_yootheme_builder, WP builderwidget) ' +
918
+ 'carries its embedded layout SUMMARIZED here as ' +
919
+ '`{omitted_for_size:true, node_count:N}`, not the full tree (B25) — ' +
920
+ '`layout_root` still names its root type; for the actual content call ' +
921
+ 'local_content_read(kind:"modules") on that id. Costly across a site-wide ' +
922
+ 'sweep otherwise: `layout` alone routinely dwarfs every other field on ' +
923
+ 'the row. Default false — omit for the pre-existing response shape, ' +
924
+ 'unchanged.'),
807
925
  };
808
- /**
809
- * Wire shape for `yootheme_builder_pages_audit` (design §5). `scanned.by_type`
810
- * is a `Record<string, number>` — the PHP side already normalizes an empty
811
- * sweep to `(object) []` (`{}` over the wire), matching this schema without
812
- * the array-vs-object workaround `template_summary` needed (Task #46).
813
- */
814
926
  export const PAGES_AUDIT_OUTPUT_SCHEMA = z.object({
815
927
  etag: z.string(),
816
- // B-5 — the three single-target keys. `.optional()` is LOAD-BEARING, not
817
- // decoration: this is a strict object, and both a site sweep and every
818
- // host predating single-target mode omit all three, so a non-optional
819
- // member would make every such (perfectly valid) response fail validation.
820
928
  scope: z.string().optional(),
821
929
  note: z.string().optional(),
822
- // Every member of `PageQuery::descriptorFromRow()` /
823
- // `augmentResolverDescriptor()` must be declared here — the audit handler
824
- // forwards `resolved_target` VERBATIM, and this object generates
825
- // `additionalProperties:false`, so an undeclared key makes a strict host
826
- // -32602-reject a SUCCESSFUL call (W12-R2). All eight are `.optional()`
827
- // because a host predating single-target mode sends none of them.
828
930
  resolved_target: z
829
931
  .object({
830
- template_id: z.string().optional(),
932
+ layout_id: z.string().optional(),
831
933
  post_id: z.union([z.number(), z.string()]).nullable().optional(),
832
934
  type: z.string().optional(),
833
935
  label: z.string().optional(),
834
936
  frontend_url: z.string().nullable().optional(),
835
- // The matched YT type/condition for a theme template
836
- // (e.g. "taxonomy-category_faq"); null for a per-page layout.
837
937
  context: z.string().nullable().optional(),
838
- // `per_page` | `theme_template` — kept a plain string rather than an
839
- // enum so a newer host's additional kind is forwarded, not rejected.
840
938
  resolved_via: z.string().optional(),
841
939
  matched_by: z.string().optional(),
842
940
  })
@@ -846,19 +944,68 @@ export const PAGES_AUDIT_OUTPUT_SCHEMA = z.object({
846
944
  by_type: z.record(z.string(), z.number().int().nonnegative()),
847
945
  }),
848
946
  summary: z.object({
849
- critical: z.number().int().nonnegative(),
850
- warning: z.number().int().nonnegative(),
851
- info: z.number().int().nonnegative(),
947
+ critical_finding_kinds: z.number().int().nonnegative(),
948
+ warning_finding_kinds: z.number().int().nonnegative(),
949
+ info_finding_kinds: z.number().int().nonnegative(),
950
+ finding_kinds: z.number().int().nonnegative().optional(),
951
+ affected_pages_summed_across_findings: z.number().int().nonnegative().optional(),
852
952
  }),
853
953
  findings: z.array(FINDING),
854
954
  disclaimer: z.string(),
855
- // PERF-4 / PROD-2 — set by the TS handler (never by a host) when the shed
856
- // ladder had to run to bring `structuredContent` under its char budget.
857
- // Its PRESENCE is the whole signal: a complete payload omits the key
858
- // entirely, so a reader can never mistake a shrunk audit for a full one.
859
- // Which entries lost what is flagged in place — `locators_stripped` on the
860
- // page rows whose locator prose went, `pages_truncated` on the findings
861
- // whose evidence pages were capped or dropped.
955
+ occurrences_unit: z.string().optional(),
862
956
  structured_truncated: z.boolean().optional(),
957
+ truncated_by: z.array(z.enum(['response_budget', 'per_page_hit_cap'])).optional(),
958
+ truncation_remedy: z.string().optional(),
959
+ mode: z.enum(['rendered']).optional(),
960
+ render_scan: z
961
+ .object({
962
+ attempted: z.number().int().nonnegative(),
963
+ rendered: z.number().int().nonnegative(),
964
+ capped: z.boolean(),
965
+ skipped_by_cap: z
966
+ .array(z.object({ id: z.string(), label: z.string() }))
967
+ .optional(),
968
+ skipped_by_cap_not_listed: z.number().int().nonnegative().optional(),
969
+ })
970
+ .optional(),
971
+ checks_not_run: z.array(z.string()).optional(),
972
+ checks_limited_to_saved_layout: z
973
+ .object({
974
+ codes: z.array(z.string()),
975
+ note: z.string(),
976
+ })
977
+ .optional(),
978
+ render_errors: z
979
+ .array(z.object({
980
+ id: z.string(),
981
+ label: z.string(),
982
+ error: z.string(),
983
+ error_class: z.string().optional(),
984
+ reason: z.string().optional(),
985
+ }))
986
+ .optional(),
987
+ render_fallback: z
988
+ .object({
989
+ pages: z.array(z.object({
990
+ id: z.string(),
991
+ label: z.string(),
992
+ dropped_count: z.number().int().nonnegative(),
993
+ })),
994
+ suppressed_checks: z.array(z.string()),
995
+ })
996
+ .optional(),
997
+ modules_by_page: z
998
+ .record(z.string(), z.object({
999
+ from_elements: z.array(z.record(z.string(), z.unknown())),
1000
+ from_positions: z.array(z.record(z.string(), z.unknown())),
1001
+ from_positions_undecidable: z.array(z.record(z.string(), z.unknown())),
1002
+ unresolved_positions: z
1003
+ .array(z.object({ position: z.string(), reason: z.string() }))
1004
+ .optional(),
1005
+ unresolved_module_universe: z.object({ reason: z.string() }).optional(),
1006
+ }))
1007
+ .optional(),
1008
+ modules_by_page_omitted: z.boolean().optional(),
1009
+ retry_hint: z.string().optional(),
863
1010
  });
864
1011
  //# sourceMappingURL=schemas.js.map