@wootsup/yt-builder-mcp 1.5.0 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/bin/yt-builder-mcp.js +72 -0
  2. package/dist/auth.d.ts +11 -0
  3. package/dist/auth.d.ts.map +1 -1
  4. package/dist/auth.js +11 -0
  5. package/dist/auth.js.map +1 -1
  6. package/dist/cli/doctor-command.d.ts.map +1 -1
  7. package/dist/cli/doctor-command.js +45 -2
  8. package/dist/cli/doctor-command.js.map +1 -1
  9. package/dist/client.d.ts +18 -0
  10. package/dist/client.d.ts.map +1 -1
  11. package/dist/client.js +13 -1
  12. package/dist/client.js.map +1 -1
  13. package/dist/clients/claude-code.d.ts.map +1 -1
  14. package/dist/clients/claude-code.js +5 -2
  15. package/dist/clients/claude-code.js.map +1 -1
  16. package/dist/clients/claude-desktop.d.ts.map +1 -1
  17. package/dist/clients/claude-desktop.js +5 -2
  18. package/dist/clients/claude-desktop.js.map +1 -1
  19. package/dist/clients/cline.d.ts.map +1 -1
  20. package/dist/clients/cline.js +5 -2
  21. package/dist/clients/cline.js.map +1 -1
  22. package/dist/clients/codex-cli.d.ts.map +1 -1
  23. package/dist/clients/codex-cli.js +127 -2
  24. package/dist/clients/codex-cli.js.map +1 -1
  25. package/dist/clients/continue.d.ts.map +1 -1
  26. package/dist/clients/continue.js +11 -2
  27. package/dist/clients/continue.js.map +1 -1
  28. package/dist/clients/cursor.d.ts.map +1 -1
  29. package/dist/clients/cursor.js +5 -2
  30. package/dist/clients/cursor.js.map +1 -1
  31. package/dist/clients/gemini-cli.d.ts.map +1 -1
  32. package/dist/clients/gemini-cli.js +5 -2
  33. package/dist/clients/gemini-cli.js.map +1 -1
  34. package/dist/clients/index.d.ts +49 -0
  35. package/dist/clients/index.d.ts.map +1 -1
  36. package/dist/clients/index.js +79 -0
  37. package/dist/clients/index.js.map +1 -1
  38. package/dist/clients/roo-code.d.ts.map +1 -1
  39. package/dist/clients/roo-code.js +5 -2
  40. package/dist/clients/roo-code.js.map +1 -1
  41. package/dist/clients/zed.d.ts.map +1 -1
  42. package/dist/clients/zed.js +22 -2
  43. package/dist/clients/zed.js.map +1 -1
  44. package/dist/diagnostics/ca-reexec.d.ts +41 -0
  45. package/dist/diagnostics/ca-reexec.d.ts.map +1 -0
  46. package/dist/diagnostics/ca-reexec.js +91 -0
  47. package/dist/diagnostics/ca-reexec.js.map +1 -0
  48. package/dist/diagnostics/ca-trust.d.ts +11 -0
  49. package/dist/diagnostics/ca-trust.d.ts.map +1 -1
  50. package/dist/diagnostics/ca-trust.js +14 -1
  51. package/dist/diagnostics/ca-trust.js.map +1 -1
  52. package/dist/diagnostics/diagnose-network-error.d.ts +11 -0
  53. package/dist/diagnostics/diagnose-network-error.d.ts.map +1 -1
  54. package/dist/diagnostics/diagnose-network-error.js +18 -3
  55. package/dist/diagnostics/diagnose-network-error.js.map +1 -1
  56. package/dist/diagnostics/doctor.d.ts +10 -1
  57. package/dist/diagnostics/doctor.d.ts.map +1 -1
  58. package/dist/diagnostics/doctor.js +23 -0
  59. package/dist/diagnostics/doctor.js.map +1 -1
  60. package/dist/diagnostics/startup-self-probe.d.ts +39 -0
  61. package/dist/diagnostics/startup-self-probe.d.ts.map +1 -0
  62. package/dist/diagnostics/startup-self-probe.js +87 -0
  63. package/dist/diagnostics/startup-self-probe.js.map +1 -0
  64. package/dist/gateway/essentials.d.ts +15 -6
  65. package/dist/gateway/essentials.d.ts.map +1 -1
  66. package/dist/gateway/essentials.js +51 -5
  67. package/dist/gateway/essentials.js.map +1 -1
  68. package/dist/index.d.ts +15 -1
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +37 -2
  71. package/dist/index.js.map +1 -1
  72. package/dist/net/proxy-dispatcher.d.ts +7 -0
  73. package/dist/net/proxy-dispatcher.d.ts.map +1 -1
  74. package/dist/net/proxy-dispatcher.js +7 -2
  75. package/dist/net/proxy-dispatcher.js.map +1 -1
  76. package/dist/net/site-basic-auth.d.ts +65 -0
  77. package/dist/net/site-basic-auth.d.ts.map +1 -0
  78. package/dist/net/site-basic-auth.js +118 -0
  79. package/dist/net/site-basic-auth.js.map +1 -0
  80. package/dist/proxy/bridge.d.ts +18 -1
  81. package/dist/proxy/bridge.d.ts.map +1 -1
  82. package/dist/proxy/bridge.js +23 -3
  83. package/dist/proxy/bridge.js.map +1 -1
  84. package/dist/setup-wizard-handshake.d.ts.map +1 -1
  85. package/dist/setup-wizard-handshake.js +17 -4
  86. package/dist/setup-wizard-handshake.js.map +1 -1
  87. package/dist/setup-wizard-types.d.ts +22 -0
  88. package/dist/setup-wizard-types.d.ts.map +1 -1
  89. package/dist/setup-wizard.d.ts.map +1 -1
  90. package/dist/setup-wizard.js +111 -0
  91. package/dist/setup-wizard.js.map +1 -1
  92. package/dist/sites/client-pool.d.ts +35 -1
  93. package/dist/sites/client-pool.d.ts.map +1 -1
  94. package/dist/sites/client-pool.js +45 -1
  95. package/dist/sites/client-pool.js.map +1 -1
  96. package/dist/tools/elements/builders.js +7 -7
  97. package/dist/tools/elements/builders.js.map +1 -1
  98. package/dist/tools/elements/handlers.d.ts +2 -0
  99. package/dist/tools/elements/handlers.d.ts.map +1 -1
  100. package/dist/tools/elements/handlers.js +48 -2
  101. package/dist/tools/elements/handlers.js.map +1 -1
  102. package/dist/tools/format/elements-format.d.ts.map +1 -1
  103. package/dist/tools/format/elements-format.js +8 -0
  104. package/dist/tools/format/elements-format.js.map +1 -1
  105. package/dist/tools/format/health-format.d.ts +2 -0
  106. package/dist/tools/format/health-format.d.ts.map +1 -1
  107. package/dist/tools/format/health-format.js +11 -0
  108. package/dist/tools/format/health-format.js.map +1 -1
  109. package/dist/tools/format/pages-format.d.ts +27 -0
  110. package/dist/tools/format/pages-format.d.ts.map +1 -1
  111. package/dist/tools/format/pages-format.js +36 -0
  112. package/dist/tools/format/pages-format.js.map +1 -1
  113. package/dist/tools/format/source-schema-format.d.ts +64 -0
  114. package/dist/tools/format/source-schema-format.d.ts.map +1 -0
  115. package/dist/tools/format/source-schema-format.js +161 -0
  116. package/dist/tools/format/source-schema-format.js.map +1 -0
  117. package/dist/tools/health.d.ts.map +1 -1
  118. package/dist/tools/health.js +31 -0
  119. package/dist/tools/health.js.map +1 -1
  120. package/dist/tools/multi-items/builders.js +2 -2
  121. package/dist/tools/multi-items/builders.js.map +1 -1
  122. package/dist/tools/multi-items/inspect-handler.d.ts +8 -0
  123. package/dist/tools/multi-items/inspect-handler.d.ts.map +1 -1
  124. package/dist/tools/multi-items/inspect-handler.js +48 -2
  125. package/dist/tools/multi-items/inspect-handler.js.map +1 -1
  126. package/dist/tools/pages/builders.d.ts.map +1 -1
  127. package/dist/tools/pages/builders.js +133 -31
  128. package/dist/tools/pages/builders.js.map +1 -1
  129. package/dist/tools/pages/handlers-read.d.ts +24 -2
  130. package/dist/tools/pages/handlers-read.d.ts.map +1 -1
  131. package/dist/tools/pages/handlers-read.js +157 -11
  132. package/dist/tools/pages/handlers-read.js.map +1 -1
  133. package/dist/tools/pages/handlers-write.d.ts +42 -1
  134. package/dist/tools/pages/handlers-write.d.ts.map +1 -1
  135. package/dist/tools/pages/handlers-write.js +114 -5
  136. package/dist/tools/pages/handlers-write.js.map +1 -1
  137. package/dist/tools/pages/schemas.d.ts +38 -1
  138. package/dist/tools/pages/schemas.d.ts.map +1 -1
  139. package/dist/tools/pages/schemas.js +58 -5
  140. package/dist/tools/pages/schemas.js.map +1 -1
  141. package/dist/tools/pool-resolve-helper.d.ts +11 -26
  142. package/dist/tools/pool-resolve-helper.d.ts.map +1 -1
  143. package/dist/tools/pool-resolve-helper.js +50 -0
  144. package/dist/tools/pool-resolve-helper.js.map +1 -1
  145. package/dist/tools/sources/builders.d.ts.map +1 -1
  146. package/dist/tools/sources/builders.js +258 -4
  147. package/dist/tools/sources/builders.js.map +1 -1
  148. package/dist/tools/sources/handlers-bind.d.ts +107 -0
  149. package/dist/tools/sources/handlers-bind.d.ts.map +1 -1
  150. package/dist/tools/sources/handlers-bind.js +197 -2
  151. package/dist/tools/sources/handlers-bind.js.map +1 -1
  152. package/dist/tools/sources/handlers.d.ts +54 -0
  153. package/dist/tools/sources/handlers.d.ts.map +1 -1
  154. package/dist/tools/sources/handlers.js +82 -0
  155. package/dist/tools/sources/handlers.js.map +1 -1
  156. package/dist/tools/sparse-fields.d.ts +37 -1
  157. package/dist/tools/sparse-fields.d.ts.map +1 -1
  158. package/dist/tools/sparse-fields.js +35 -5
  159. package/dist/tools/sparse-fields.js.map +1 -1
  160. package/dist/tools/tool-builder/results.d.ts.map +1 -1
  161. package/dist/tools/tool-builder/results.js +3 -0
  162. package/dist/tools/tool-builder/results.js.map +1 -1
  163. package/manifest.json +1 -1
  164. package/package.json +1 -1
  165. package/skills/yt-builder-mcp/SKILL.md +80 -34
@@ -13,13 +13,13 @@
13
13
  * @license MIT
14
14
  */
15
15
  import { z } from 'zod';
16
- import { withSiteRetry } from '../pool-resolve-helper.js';
17
- import { POST_ID, RESOLVE_URL, SITE_ID_SCHEMA, TEMPLATE_ID, TEMPLATE_ID_OPTIONAL, } from '../shared-schemas.js';
16
+ import { withSiteRetry, withWriteSiteRetry } from '../pool-resolve-helper.js';
17
+ import { ETAG as ETAG_STRICT, POST_ID, RESOLVE_URL, SITE_ID_SCHEMA, TEMPLATE_ID, TEMPLATE_ID_OPTIONAL, } from '../shared-schemas.js';
18
18
  import { FIELDS, FLAT, MAX_CHARS } from '../sparse-fields.js';
19
19
  import { creating, defineTool, mutating, readOnly, withSiteMeta, } from '../tool-builder.js';
20
- import { handleGetEtag, handlePageGetLayout, handlePageGetSchema, handlePagesList, handlePagesResolve, handleTemplateSummary, } from './handlers-read.js';
21
- import { handlePageDynamize, handlePagePublish, handlePagesCreate, handlePagesDelete, handlePageSave, } from './handlers-write.js';
22
- import { ETAG_OUTPUT_SCHEMA, PAGE_DYNAMIZE_INPUT, PAGES_CREATE_INPUT, PAGES_DELETE_INPUT, PAGES_DELETE_OUTPUT_SCHEMA, PAGES_LIST_OUTPUT_SCHEMA, PAGES_RESOLVE_INPUT, PAGES_RESOLVE_OUTPUT_SCHEMA, SCHEMA_OUTPUT_SCHEMA, TEMPLATE_SUMMARY_OUTPUT_SCHEMA, } from './schemas.js';
20
+ import { handleGetEtag, handlePageGetLayout, handlePageGetSchema, handlePagesList, handlePagesResolve, handleRenderPreview, handleTemplateSummary, } from './handlers-read.js';
21
+ import { handlePageDynamize, handlePagePublish, handlePagesCreate, handlePagesDelete, handlePageSave, handleTemplateSetType, TEMPLATE_SET_TYPE_OUTPUT_SCHEMA, } from './handlers-write.js';
22
+ import { ETAG_OUTPUT_SCHEMA, PAGE_DYNAMIZE_INPUT, PAGES_CREATE_INPUT, PAGES_DELETE_INPUT, PAGES_DELETE_OUTPUT_SCHEMA, PAGES_LIST_OUTPUT_SCHEMA, PAGES_RESOLVE_INPUT, PAGES_RESOLVE_OUTPUT_SCHEMA, RENDER_PREVIEW_OUTPUT_SCHEMA, SCHEMA_OUTPUT_SCHEMA, TEMPLATE_SUMMARY_OUTPUT_SCHEMA, } from './schemas.js';
23
23
  // F-14: page-level save/publish accept OPTIONAL ETag (no precondition lock
24
24
  // at template level — element/binding mutations REQUIRE one via the strict
25
25
  // ETAG in shared-schemas.ts). Schema and description now agree: optional
@@ -111,14 +111,13 @@ export function buildPagesTools(pool) {
111
111
  defineTool({
112
112
  name: 'yootheme_builder_page_get_layout',
113
113
  description: 'Get the layout tree for one template — address it by `template_id` ' +
114
- '(from pages_list), `post_id` (numeric post/article id), or `url` ' +
115
- '(public page URL, resolved in one call). For dynamize/bind work prefer ' +
116
- '`mode:"bindings_only"` the binding skeleton only (no style props). ' +
117
- 'Default `mode:"full"` returns nested `{layout, etag}`. `flat:true` gives ' +
118
- 'a depth-first `{elements:[...], etag}` array (with `fields[]`). A repeated ' +
119
- 'unchanged read auto-skips `[unchanged]`; `force:true` re-fetches. ' +
120
- '`max_chars` bounds the (full-mode) text output. ' +
121
- 'Operates on the default site unless site_id is provided.',
114
+ '(from pages_list), `post_id` (numeric post/article id), or `url`. For ' +
115
+ 'dynamize/bind prefer `mode:"bindings_only"` (binding skeleton, no style ' +
116
+ 'props). Default `mode:"full"` returns nested `{layout, etag}`; `flat:true` ' +
117
+ 'gives a depth-first `{elements:[...]}` array (with `fields[]`). A repeated ' +
118
+ 'unchanged read auto-skips (`force:true` re-fetches). `max_chars` bounds the ' +
119
+ 'text; a clipped read returns `next_cursor` (pass back as `cursor`) to page ' +
120
+ 'the rest. Operates on the default site unless site_id is provided.',
122
121
  inputSchema: {
123
122
  site_id: SITE_ID_SCHEMA,
124
123
  // G-A (Track-C URL→layout): three interchangeable addressing modes
@@ -153,6 +152,15 @@ export function buildPagesTools(pool) {
153
152
  flat: FLAT,
154
153
  fields: FIELDS,
155
154
  max_chars: MAX_CHARS,
155
+ // B7 (Glöckle continuation cursor): resume a clipped full/
156
+ // bindings_only text leg from its char offset. Opaque
157
+ // base64url `o:<n>` — the SAME offset-cursor contract
158
+ // pages_list/sources_list use. Omit to read from the start.
159
+ cursor: z
160
+ .string()
161
+ .optional()
162
+ .describe('Char-offset cursor from a clipped response\'s next_cursor — resumes ' +
163
+ 'the same dump at that offset (use with max_chars).'),
156
164
  },
157
165
  // No outputSchema: the response shape is a union (nested OR flat with
158
166
  // optional projection) and the JSON-Pointer-keyed nested shape is
@@ -187,11 +195,13 @@ export function buildPagesTools(pool) {
187
195
  // agent reaches it directly (the whole point of the gap fix).
188
196
  defineTool({
189
197
  name: 'yootheme_builder_pages_resolve',
190
- description: 'Resolve a public page/article URL to the template_id that renders it — ' +
191
- 'paste a URL, get a layout-addressable id in one call. Returns ' +
192
- '{template_id (page:{id}/article:{id}), post_id, type, frontend_url}. ' +
193
- '404s with a hint for THEME-template URLs (use pages_list instead). ' +
194
- 'page_get_layout / page_get_schema also accept a `url` param directly. ' +
198
+ description: 'Resolve a public page/article OR archive URL to the template_id that renders it — ' +
199
+ 'paste a URL, get a layout-addressable id in one call. A singular page resolves to ' +
200
+ 'its per-page layout; a CPT archive (/faq/), taxonomy/category/tag term, or author ' +
201
+ 'archive resolves to the governing THEME TEMPLATE. Returns {template_id, post_id ' +
202
+ '(null for theme templates), type, frontend_url, context (matched YT type), ' +
203
+ 'resolved_via (per_page|theme_template)}. Only home/search/date 404 (use pages_list). ' +
204
+ 'page_get_layout/page_get_schema also accept `url`. ' +
195
205
  'Operates on the default site unless site_id is provided.',
196
206
  inputSchema: { site_id: SITE_ID_SCHEMA, ...PAGES_RESOLVE_INPUT },
197
207
  outputSchema: PAGES_RESOLVE_OUTPUT_SCHEMA,
@@ -230,14 +240,55 @@ export function buildPagesTools(pool) {
230
240
  annotations: readOnly('Template Summary'),
231
241
  handler: async ({ site_id, ...rest }) => withSiteRetry(pool, site_id, async (client, site) => withSiteMeta(await handleTemplateSummary(client, rest), site)),
232
242
  }),
243
+ // ─── F5 + N5 (Glöckle HANDOFF-4/5) — render_preview ───────────
244
+ // The authenticated post-write render HEALTHCHECK. READ-ONLY: renders
245
+ // the template server-side over the existing Bearer channel and reports
246
+ // {rendered, item_count, empty, error?} + a cache_purge_hint — answering
247
+ // "does my saved page actually render, with how many items?" where an
248
+ // external cURL 401s behind QA Basic-Auth. L2 (advanced-read) — reached
249
+ // via yootheme_builder_advanced_read, NOT in ESSENTIAL_TOOLS, so the L1
250
+ // token-baseline stays at 32. Addressing mirrors page_get_layout:
251
+ // template_id OR url (exactly one).
252
+ defineTool({
253
+ name: 'yootheme_builder_render_preview',
254
+ description: 'Render-check a saved template over the authenticated channel — does it ' +
255
+ 'actually render, with how many items, or is it blank? Address by ' +
256
+ '`template_id` (from pages_list) OR `url` (resolved for you). Returns ' +
257
+ '{rendered, item_count, empty, error?, cache_purge_hint}; with `expect`, also ' +
258
+ '{matched, snippet}. Use AFTER a page_save / element_bind_source to catch a ' +
259
+ 'silently-empty live page (a bad binding "saves" then renders blank); the ' +
260
+ 'swallowed YOOtheme render error is surfaced in `error`. Read-only — renders ' +
261
+ 'without persisting. Operates on the default site unless site_id is provided.',
262
+ inputSchema: {
263
+ site_id: SITE_ID_SCHEMA,
264
+ // Exactly one of template_id / url — mirrors page_get_layout's
265
+ // TEMPLATE_ID_OPTIONAL + url addressing (resolveEffectiveTemplateId).
266
+ template_id: TEMPLATE_ID_OPTIONAL,
267
+ url: RESOLVE_URL,
268
+ // Glöckle HANDOFF-6 #4: optional substring the rendered HTML must
269
+ // contain. When set, the response adds {matched, snippet} so "did
270
+ // my edit reach the render?" is answerable in one call.
271
+ expect: z
272
+ .string()
273
+ .min(1)
274
+ .optional()
275
+ .describe('Optional substring to find in the rendered HTML (e.g. a headline you ' +
276
+ 'just bound). When set, the response adds `matched` (bool) + ' +
277
+ '`snippet` (≈200-char window, or null) — confirm an edit reached ' +
278
+ 'the render in one call.'),
279
+ },
280
+ outputSchema: RENDER_PREVIEW_OUTPUT_SCHEMA,
281
+ annotations: readOnly('Render Preview'),
282
+ handler: async ({ site_id, ...rest }) => withSiteRetry(pool, site_id, async (client, site) => withSiteMeta(await handleRenderPreview(client, rest), site)),
283
+ }),
233
284
  defineTool({
234
285
  name: 'yootheme_builder_page_save',
235
- description: 'Re-run save-transforms + flush caches. Optionally pass a whole `layout` to ' +
236
- 'REPLACE the template tree ATOMICALLY (F85)ideal for wholesale dynamization ' +
237
- '(read layout swap query remap fields write back). A supplied layout is ' +
238
- 'validated + ETag-locked; on rejection nothing is persisted. Omit `layout` to just ' +
239
- 're-run transforms (no-op if byte-identical) for incremental edits use ' +
240
- 'element_add/update/bind/delete first. New pages: pages_create. Publish: page_publish. ' +
286
+ description: 'Re-run save-transforms + flush caches. Optionally REPLACE the template tree by ' +
287
+ 'passing the INNER {type:"layout",children:[...]} tree as `layout`NOT the full ' +
288
+ 'template node page_get_layout returns (rejected 422, would blank the page). ' +
289
+ 'Validated + ETag-locked; on reject nothing persists. An unrenderable layout is ' +
290
+ 'refused PRE-WRITE (422). `dry_run:true` preflights; the success response carries ' +
291
+ '`previous_layout` for 1-call rollback. Omit `layout` to re-run transforms only. ' +
241
292
  'ETag optional (412 on conflict; else last-write-wins). ' +
242
293
  'Operates on the default site unless site_id is provided.',
243
294
  inputSchema: {
@@ -249,12 +300,22 @@ export function buildPagesTools(pool) {
249
300
  layout: z
250
301
  .record(z.string(), z.unknown())
251
302
  .optional()
252
- .describe('Optional whole YT layout-node object (e.g. {type:"layout",children:[...]}) ' +
253
- 'to replace the template tree atomically. Validated + ETag-locked. ' +
303
+ .describe('Optional whole YT layout-node object the INNER tree ' +
304
+ '{type:"layout",children:[...]}, NOT the full template node ' +
305
+ 'page_get_layout returns (passing that is rejected as a double-nest). ' +
306
+ 'Replaces the template tree atomically. Validated + ETag-locked. ' +
254
307
  'Omit to just re-run save-transforms.'),
308
+ // U3/F3 (Glöckle HANDOFF-4): optional render preflight.
309
+ dry_run: z
310
+ .boolean()
311
+ .optional()
312
+ .describe('Optional. When true, run the double-nest guard + a read-only Builder ' +
313
+ 'render dry-run and return a validation_report WITHOUT persisting ' +
314
+ '(no write, no cache flush, no ETag bump). Use to verify a binding ' +
315
+ 'renders before it can blank the live page. Omit to actually save.'),
255
316
  },
256
317
  annotations: mutating('Save Page'),
257
- handler: async ({ site_id, ...rest }, extra) => withSiteRetry(pool, site_id, async (client, site) => withRenderContext(withSiteMeta(await handlePageSave(client, rest, extra), site), buildRenderContext({
318
+ handler: async ({ site_id, ...rest }, extra) => withWriteSiteRetry(pool, site_id, 'yootheme_builder_page_save', async (client, site) => withRenderContext(withSiteMeta(await handlePageSave(client, rest, extra), site), buildRenderContext({
258
319
  siteUrl: site.url,
259
320
  parentTemplateId: rest.template_id,
260
321
  locale: localeForSite(site),
@@ -275,7 +336,48 @@ export function buildPagesTools(pool) {
275
336
  // unchanged template snapshots the same ETag and flushes
276
337
  // the same caches. Matrix marks `idempotentHint:true`.
277
338
  annotations: mutating('Publish Page'),
278
- handler: async ({ site_id, ...rest }, extra) => withSiteRetry(pool, site_id, async (client, site) => withRenderContext(withSiteMeta(await handlePagePublish(client, rest, extra), site), buildRenderContext({
339
+ handler: async ({ site_id, ...rest }, extra) => withWriteSiteRetry(pool, site_id, 'yootheme_builder_page_publish', async (client, site) => withRenderContext(withSiteMeta(await handlePagePublish(client, rest, extra), site), buildRenderContext({
340
+ siteUrl: site.url,
341
+ parentTemplateId: rest.template_id,
342
+ locale: localeForSite(site),
343
+ }))),
344
+ }),
345
+ // ─── N3 (Glöckle HANDOFF-5) — template_set_type ───────────────
346
+ // L2 (advanced): set which archive/single a YOOtheme theme template
347
+ // is assigned to (the `templates.<id>.type` condition pages_list
348
+ // reads). The #1 missing step in a taxonomy/CPT-rename workflow —
349
+ // after categoryFaq→categoryHelp the `taxonomy-category_faq` /
350
+ // `single-gloeckle_faq` templates are orphaned and must be re-typed.
351
+ defineTool({
352
+ name: 'yootheme_builder_template_set_type',
353
+ description:
354
+ // N3 (Glöckle HANDOFF-5) — archive/single TYPE reassignment.
355
+ 'Reassign which archive/single a YOOtheme THEME template applies to — ' +
356
+ 'set its `type` condition (the value pages_list shows) in ONE ETag-locked ' +
357
+ 'write. Use after a taxonomy/CPT rename orphans a template (e.g. re-type ' +
358
+ '"taxonomy-category_faq" → "taxonomy-category_help", "single-gloeckle_faq" ' +
359
+ '→ "single-gloeckle_help"). Returns {type, previous_type, new_etag} — ' +
360
+ 'previous_type is the read of the prior assignment, folded in. THEME ' +
361
+ 'templates only: a page:/article: layout is refused (422). ETag req. ' +
362
+ 'Operates on the default site unless site_id is provided.',
363
+ inputSchema: {
364
+ site_id: SITE_ID_SCHEMA,
365
+ template_id: TEMPLATE_ID,
366
+ type: z
367
+ .string()
368
+ .min(1)
369
+ .describe('The new archive/single TYPE assignment (the `type` condition ' +
370
+ 'pages_list surfaces), e.g. "taxonomy-category_help", ' +
371
+ '"single-gloeckle_help", "archive-post", or the bare "template". ' +
372
+ 'Read the current value via pages_list (the `type` column) or ' +
373
+ 'GET the template first. `page`/`article` are NOT valid here.'),
374
+ // Required strict ETag (the re-type is a real mutation; the PHP
375
+ // controller enforces If-Match → 428 if omitted, 412 on stale).
376
+ etag: ETAG_STRICT,
377
+ },
378
+ outputSchema: TEMPLATE_SET_TYPE_OUTPUT_SCHEMA,
379
+ annotations: mutating('Set Template Type'),
380
+ handler: async ({ site_id, ...rest }, extra) => withWriteSiteRetry(pool, site_id, 'yootheme_builder_template_set_type', async (client, site) => withRenderContext(withSiteMeta(await handleTemplateSetType(client, rest, extra), site), buildRenderContext({
279
381
  siteUrl: site.url,
280
382
  parentTemplateId: rest.template_id,
281
383
  locale: localeForSite(site),
@@ -299,7 +401,7 @@ export function buildPagesTools(pool) {
299
401
  // No outputSchema: the response shape is a discriminated union
300
402
  // (201 wet vs 200 dry-run). page_get_layout uses the same pattern.
301
403
  annotations: mutating('Create Page'),
302
- handler: async ({ site_id, ...rest }, extra) => withSiteRetry(pool, site_id, async (client, site) => withRenderContext(withSiteMeta(await handlePagesCreate(client, rest, extra), site), buildRenderContext({
404
+ handler: async ({ site_id, ...rest }, extra) => withWriteSiteRetry(pool, site_id, 'yootheme_builder_pages_create', async (client, site) => withRenderContext(withSiteMeta(await handlePagesCreate(client, rest, extra), site), buildRenderContext({
303
405
  siteUrl: site.url,
304
406
  // A new page has no caller-supplied parent
305
407
  // template; null until the REST response carries
@@ -329,7 +431,7 @@ export function buildPagesTools(pool) {
329
431
  // `summary` object — pages_create uses the same no-outputSchema
330
432
  // pattern for its discriminated union.
331
433
  annotations: creating('Dynamize Page'),
332
- handler: async ({ site_id, ...rest }, extra) => withSiteRetry(pool, site_id, async (client, site) => withRenderContext(withSiteMeta(await handlePageDynamize(client, rest, extra), site), buildRenderContext({
434
+ handler: async ({ site_id, ...rest }, extra) => withWriteSiteRetry(pool, site_id, 'yootheme_builder_page_dynamize', async (client, site) => withRenderContext(withSiteMeta(await handlePageDynamize(client, rest, extra), site), buildRenderContext({
333
435
  siteUrl: site.url,
334
436
  parentTemplateId: null,
335
437
  locale: localeForSite(site),
@@ -345,7 +447,7 @@ export function buildPagesTools(pool) {
345
447
  inputSchema: { site_id: SITE_ID_SCHEMA, ...PAGES_DELETE_INPUT },
346
448
  outputSchema: PAGES_DELETE_OUTPUT_SCHEMA,
347
449
  annotations: mutating('Delete Page'),
348
- handler: async ({ site_id, ...rest }, extra) => withSiteRetry(pool, site_id, async (client, site) => withSiteMeta(await handlePagesDelete(client, rest, extra), site)),
450
+ handler: async ({ site_id, ...rest }, extra) => withWriteSiteRetry(pool, site_id, 'yootheme_builder_pages_delete', async (client, site) => withSiteMeta(await handlePagesDelete(client, rest, extra), site)),
349
451
  }),
350
452
  ];
351
453
  }
@@ -1 +1 @@
1
- {"version":3,"file":"builders.js","sourceRoot":"","sources":["../../../src/tools/pages/builders.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"builders.js","sourceRoot":"","sources":["../../../src/tools/pages/builders.ts"],"names":[],"mappings":"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"}
@@ -19,9 +19,11 @@ export declare function handlePagesList(client: RestClient, { fields, limit, cur
19
19
  /** Structured shape returned by GET /pages/resolve on success. */
20
20
  export interface ResolvedTemplate {
21
21
  readonly template_id: string;
22
- readonly post_id: number;
22
+ readonly post_id: number | null;
23
23
  readonly type: string;
24
24
  readonly frontend_url: string | null;
25
+ readonly context: string | null;
26
+ readonly resolved_via: 'per_page' | 'theme_template';
25
27
  }
26
28
  /**
27
29
  * G-A (Track-C URL→layout): GET /pages/resolve?url=... → the per-page
@@ -38,7 +40,7 @@ export declare function handlePagesResolve(client: RestClient, { url }: {
38
40
  }): Promise<ToolResult>;
39
41
  /** Test-only: clear the dedup cache between cases (mirrors the bus reset idiom). */
40
42
  export declare function __resetLayoutDedupCacheForTests(): void;
41
- export declare function handlePageGetLayout(client: RestClient, { template_id, post_id, url, flat, fields, mode, force, max_chars }: {
43
+ export declare function handlePageGetLayout(client: RestClient, { template_id, post_id, url, flat, fields, mode, force, cursor, max_chars }: {
42
44
  template_id?: string;
43
45
  post_id?: number;
44
46
  url?: string;
@@ -46,6 +48,7 @@ export declare function handlePageGetLayout(client: RestClient, { template_id, p
46
48
  fields?: readonly string[];
47
49
  mode?: 'full' | 'bindings_only' | 'outline';
48
50
  force?: boolean;
51
+ cursor?: string;
49
52
  max_chars?: number;
50
53
  }): Promise<ToolResult>;
51
54
  export declare function handlePageGetSchema(client: RestClient, { template_id, post_id, url, fields, max_chars }: {
@@ -65,4 +68,23 @@ export declare function handleGetEtag(client: RestClient): Promise<ToolResult>;
65
68
  export declare function handleTemplateSummary(client: RestClient, { template_id }: {
66
69
  template_id: string;
67
70
  }): Promise<ToolResult>;
71
+ /**
72
+ * F5 + N5 (Glöckle HANDOFF-4/5): the authenticated post-write render
73
+ * HEALTHCHECK. Resolves the EFFECTIVE template_id from `template_id` OR `url`
74
+ * (the SAME `resolveEffectiveTemplateId` precedence page_get_layout uses — a
75
+ * pasted public URL is reverse-resolved via GET /pages/resolve first), then
76
+ * GETs `/pages/{id}/render-preview` which runs the in-process read-only Builder
77
+ * render server-side over the already-authenticated Bearer channel — answering
78
+ * "renders / N items / blank?" where an external cURL 401s behind QA Basic-Auth.
79
+ *
80
+ * Returns the strict RENDER_PREVIEW_OUTPUT_SCHEMA shape: `{rendered, item_count,
81
+ * empty, error?, cache_purge_hint, template_id}`. A render that resolved to zero
82
+ * items, or that threw inside the Builder pipeline (the swallowed YOOtheme
83
+ * render error surfaced as `error`), is a SUCCESS — not a tool error.
84
+ */
85
+ export declare function handleRenderPreview(client: RestClient, { template_id, url, expect }: {
86
+ template_id?: string;
87
+ url?: string;
88
+ expect?: string;
89
+ }): Promise<ToolResult>;
68
90
  //# sourceMappingURL=handlers-read.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"handlers-read.d.ts","sourceRoot":"","sources":["../../../src/tools/pages/handlers-read.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAuBpE,OAAO,EAIH,KAAK,UAAU,EAClB,MAAM,oBAAoB,CAAC;AAgC5B,wBAAsB,eAAe,CACjC,MAAM,EAAE,UAAU,EAClB,EACI,MAAM,EACN,KAAK,EACL,MAAM,EACN,cAAc,EACd,SAAS,GACZ,EAAE;IACC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,GACF,OAAO,CAAC,UAAU,CAAC,CAmFrB;AAID,kEAAkE;AAClE,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACtC,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,MAAM,GACZ,OAAO,CAAC,gBAAgB,CAAC,CAI3B;AAED,wBAAsB,kBAAkB,CACpC,MAAM,EAAE,UAAU,EAClB,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GACzB,OAAO,CAAC,UAAU,CAAC,CAmBrB;AAsBD,oFAAoF;AACpF,wBAAgB,+BAA+B,IAAI,IAAI,CAEtD;AA0KD,wBAAsB,mBAAmB,CACrC,MAAM,EAAE,UAAU,EAClB,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAC;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,GACF,OAAO,CAAC,UAAU,CAAC,CAkMrB;AAID,wBAAsB,mBAAmB,CACrC,MAAM,EAAE,UAAU,EAClB,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,GACF,OAAO,CAAC,UAAU,CAAC,CA4ErB;AAID,wBAAsB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAoB3E;AAID;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACvC,MAAM,EAAE,UAAU,EAClB,EAAE,WAAW,EAAE,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GACzC,OAAO,CAAC,UAAU,CAAC,CA8CrB"}
1
+ {"version":3,"file":"handlers-read.d.ts","sourceRoot":"","sources":["../../../src/tools/pages/handlers-read.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA4BpE,OAAO,EAIH,KAAK,UAAU,EAClB,MAAM,oBAAoB,CAAC;AAgC5B,wBAAsB,eAAe,CACjC,MAAM,EAAE,UAAU,EAClB,EACI,MAAM,EACN,KAAK,EACL,MAAM,EACN,cAAc,EACd,SAAS,GACZ,EAAE;IACC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,GACF,OAAO,CAAC,UAAU,CAAC,CAmFrB;AAID,kEAAkE;AAClE,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAErC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAEhC,QAAQ,CAAC,YAAY,EAAE,UAAU,GAAG,gBAAgB,CAAC;CACxD;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACtC,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,MAAM,GACZ,OAAO,CAAC,gBAAgB,CAAC,CAI3B;AAED,wBAAsB,kBAAkB,CACpC,MAAM,EAAE,UAAU,EAClB,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GACzB,OAAO,CAAC,UAAU,CAAC,CAyBrB;AAsBD,oFAAoF;AACpF,wBAAgB,+BAA+B,IAAI,IAAI,CAEtD;AA4ND,wBAAsB,mBAAmB,CACrC,MAAM,EAAE,UAAU,EAClB,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAC;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,GACF,OAAO,CAAC,UAAU,CAAC,CA+NrB;AAID,wBAAsB,mBAAmB,CACrC,MAAM,EAAE,UAAU,EAClB,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,GACF,OAAO,CAAC,UAAU,CAAC,CA4ErB;AAID,wBAAsB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAoB3E;AAID;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACvC,MAAM,EAAE,UAAU,EAClB,EAAE,WAAW,EAAE,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GACzC,OAAO,CAAC,UAAU,CAAC,CA8CrB;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,CACrC,MAAM,EAAE,UAAU,EAClB,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACtF,OAAO,CAAC,UAAU,CAAC,CAoErB"}
@@ -10,8 +10,8 @@
10
10
  import { detailResult, tableResult } from '@getimo/mcp-toolkit';
11
11
  import { encodeTemplateId } from '../../client.js';
12
12
  import { flattenLayout } from '../layout-flatten.js';
13
- import { PAGES_COMPACT_COLUMNS, PAGES_TABLE_COLUMNS, SCHEMA_COMPACT_COLUMNS, SCHEMA_TABLE_COLUMNS, buildEtagDetail, buildOutlineText, buildSchemaRows, mapPageRow, } from '../format/pages-format.js';
14
- import { DEFAULT_FIELDS_PAGES_LIST, DEFAULT_FIELDS_SCHEMA, applyMaxChars, columnsFromFields, projectFields, projectedFieldsEcho, projectionFeedback, projectionWarning, } from '../sparse-fields.js';
13
+ import { PAGES_COMPACT_COLUMNS, PAGES_TABLE_COLUMNS, SCHEMA_COMPACT_COLUMNS, SCHEMA_TABLE_COLUMNS, buildEtagDetail, buildOutlineText, buildRenderPreviewDetail, buildSchemaRows, mapPageRow, } from '../format/pages-format.js';
14
+ import { DEFAULT_FIELDS_PAGES_LIST, DEFAULT_FIELDS_SCHEMA, applyMaxChars, clipTextWindow, columnsFromFields, decodeOffsetCursor, encodeOffsetCursor, projectFields, projectedFieldsEcho, projectionFeedback, projectionWarning, } from '../sparse-fields.js';
15
15
  import { errorResult, jsonResult, structuredResult, } from '../tool-builder.js';
16
16
  // ─── pages_list ─────────────────────────────────────────────────────
17
17
  /** Default page size for pages_list when `limit` is omitted (B2). */
@@ -139,9 +139,15 @@ export async function handlePagesResolve(client, { url }) {
139
139
  const data = await resolveUrlToTemplate(client, url);
140
140
  return structuredResult(jsonResult(data), {
141
141
  template_id: data.template_id,
142
- post_id: data.post_id,
142
+ // G-A2: post_id is null for a theme-template resolution.
143
+ post_id: data.post_id ?? null,
143
144
  type: data.type,
144
145
  frontend_url: data.frontend_url ?? null,
146
+ // G-A2: context/resolved_via are additive. An OLDER plugin (pre-G-A2)
147
+ // only ever resolved per-page layouts and omits both — default to the
148
+ // per-page shape so a strict host still accepts the success.
149
+ context: data.context ?? null,
150
+ resolved_via: data.resolved_via ?? 'per_page',
145
151
  });
146
152
  }
147
153
  catch (e) {
@@ -274,9 +280,9 @@ async function resolveEffectiveTemplateId(client, args) {
274
280
  error: errorResult({
275
281
  error: e,
276
282
  context: { url: args.url },
277
- hint: 'This URL did not resolve to a per-page layout it likely ' +
278
- 'renders via a theme template. Use yootheme_builder_pages_list ' +
279
- 'to find its template_id.',
283
+ hint: 'This URL did not resolve to a per-page layout or a governing ' +
284
+ 'theme template (home/front-page/search/date are not mapped). ' +
285
+ 'Use yootheme_builder_pages_list to find its template_id.',
280
286
  }),
281
287
  };
282
288
  }
@@ -327,7 +333,47 @@ function parseOutlineNodes(raw) {
327
333
  }
328
334
  return out;
329
335
  }
330
- export async function handlePageGetLayout(client, { template_id, post_id, url, flat, fields, mode, force, max_chars }) {
336
+ /**
337
+ * B7 (Glöckle continuation cursor) — build the full-dump TEXT leg windowed at
338
+ * `[offset, offset+max_chars)` and, when more remains, append a `next_cursor`.
339
+ *
340
+ * The truncated full/bindings_only TEXT leg of page_get_layout had NO
341
+ * continuation: once `max_chars` clipped the JSON dump there was no way to
342
+ * fetch the rest of THAT subtree. This windows the SAME serialized JSON
343
+ * `jsonResult(data)` would emit, slices it from `offset` for up to `max_chars`
344
+ * chars, and emits a `next_cursor` (base64url `o:<n>`, the SAME opaque
345
+ * offset-cursor contract pages_list/sources_list use) when the body is clipped
346
+ * so a follow-up call resumes from the offset. The structured leg carries the
347
+ * cursor + offsets verbatim (page_get_layout declares no outputSchema).
348
+ *
349
+ * `max_chars === undefined` AND `offset === 0` returns the whole body with NO
350
+ * cursor — byte-identical to the pre-B7 `applyMaxChars(jsonResult(data),
351
+ * undefined)` no-op. A final slice (nothing left after it) carries no cursor.
352
+ */
353
+ function windowedFullDump(data, offset, maxChars) {
354
+ const firstBlock = jsonResult(data).content[0];
355
+ const fullText = firstBlock !== undefined && firstBlock.type === 'text' && typeof firstBlock.text === 'string'
356
+ ? firstBlock.text
357
+ : '';
358
+ const fullLength = fullText.length;
359
+ const window = clipTextWindow(fullText, offset, maxChars);
360
+ const nextCursor = window.clipped ? encodeOffsetCursor(window.nextOffset) : undefined;
361
+ // The text leg the LLM reads: the windowed slice. When a cursor is emitted
362
+ // the clip marker already rides inside `window.text`; append the resume
363
+ // hint so an agent reading ONLY the text leg can still page.
364
+ const text = nextCursor !== undefined
365
+ ? `${window.text}\n[continued] pass cursor:"${nextCursor}" to page_get_layout to read chars ` +
366
+ `${String(window.nextOffset)}–${String(fullLength)} of this layout.`
367
+ : window.text;
368
+ return structuredResult({ content: [{ type: 'text', text }] }, {
369
+ ...data,
370
+ ...(nextCursor !== undefined ? { next_cursor: nextCursor } : {}),
371
+ char_offset: window.offset,
372
+ char_total: fullLength,
373
+ returned_chars: window.text.length,
374
+ });
375
+ }
376
+ export async function handlePageGetLayout(client, { template_id, post_id, url, flat, fields, mode, force, cursor, max_chars }) {
331
377
  try {
332
378
  // G-A: resolve the effective template_id from template_id | post_id | url.
333
379
  const effective = await resolveEffectiveTemplateId(client, { template_id, post_id, url });
@@ -335,6 +381,14 @@ export async function handlePageGetLayout(client, { template_id, post_id, url, f
335
381
  return effective.error;
336
382
  }
337
383
  const templateId = effective.templateId;
384
+ // B7 (Glöckle continuation cursor): an opaque char-offset cursor
385
+ // (base64url `o:<n>`) resumes a previously-clipped full/bindings_only
386
+ // text leg from the offset. A present cursor makes the read a
387
+ // CONTINUATION — it is NEVER served from the [unchanged] dedup cache
388
+ // (the agent is intentionally paging the rest of the dump). `0` (no
389
+ // cursor / start) keeps the pre-B7 behaviour.
390
+ const charOffset = decodeOffsetCursor(cursor);
391
+ const isContinuation = cursor !== undefined && cursor !== '';
338
392
  // F195 (P0): forward `mode=bindings_only` so the server returns the
339
393
  // trimmed binding skeleton the dynamize/bind workflow needs. G1 (V3):
340
394
  // `mode=outline` forwards `?mode=outline` for the flat semantic-outline
@@ -355,13 +409,26 @@ export async function handlePageGetLayout(client, { template_id, post_id, url, f
355
409
  }
356
410
  // F195 (P0): per-process dedup of REPEATED full reads. bindings_only
357
411
  // is already cheap (and the recommended path), so it is never deduped.
358
- // The skeleton passes straight through unchanged.
412
+ // The skeleton passes straight through unchanged — EXCEPT B7: when
413
+ // `max_chars` clips it (or the caller resumes with a `cursor`), it gets
414
+ // the SAME char-offset continuation window the full leg does, so the
415
+ // binding skeleton of a very large template is pageable too.
359
416
  if (isBindingsOnly) {
417
+ if (max_chars !== undefined || isContinuation) {
418
+ return windowedFullDump(data, charOffset, max_chars);
419
+ }
360
420
  return jsonResult(data);
361
421
  }
362
422
  const etag = typeof data.etag === 'string' ? data.etag : undefined;
363
423
  const dedupKey = `${client.getPlatform().baseUrl}|${templateId}`;
364
- if (force !== true && flat !== true && etag !== undefined) {
424
+ // B7: a WINDOWED read either a continuation (cursor present) or a
425
+ // first slice (max_chars set) — must NEVER short-circuit on the
426
+ // [unchanged] dedup. The agent explicitly wants a (paged) slice of the
427
+ // body, and the one-line `[unchanged]` notice carries no slice + no
428
+ // cursor, which would strand the pager. Only the un-windowed full read
429
+ // is deduped (the forensic's duplicate-84KB waste this guards).
430
+ const isWindowedRead = isContinuation || max_chars !== undefined;
431
+ if (!isWindowedRead && force !== true && flat !== true && etag !== undefined) {
365
432
  const lastServed = layoutDedupCache.get(dedupKey);
366
433
  if (lastServed === etag) {
367
434
  // Identical (template, etag) already emitted this process —
@@ -384,8 +451,16 @@ export async function handlePageGetLayout(client, { template_id, post_id, url, f
384
451
  if (flat !== true) {
385
452
  // Default: nested passthrough — unchanged from pre-G.3, except an
386
453
  // OPTIONAL G-B `max_chars` caps the (potentially large) JSON text
387
- // leg. jsonResult is otherwise un-capped, so this is the only knob
388
- // an agent on a tight budget has to bound a full layout dump.
454
+ // leg. B7 (Glöckle continuation cursor): when the dump is clipped
455
+ // (by `max_chars` or resumed via `cursor`) it now also emits a
456
+ // `next_cursor` so an agent can page through the REST of the
457
+ // subtree instead of being stuck with the first slice. With no
458
+ // `max_chars` AND no cursor the whole body is returned with no
459
+ // cursor — byte-identical to the pre-B7 `applyMaxChars(…,
460
+ // undefined)` no-op.
461
+ if (max_chars !== undefined || isContinuation) {
462
+ return windowedFullDump(data, charOffset, max_chars);
463
+ }
389
464
  return applyMaxChars(jsonResult(data), max_chars);
390
465
  }
391
466
  // flat: true → depth-first walk on the nested layout. Apply
@@ -633,4 +708,75 @@ export async function handleTemplateSummary(client, { template_id }) {
633
708
  });
634
709
  }
635
710
  }
711
+ // ─── render_preview (F5 + N5 — authenticated post-write render check) ──
712
+ /**
713
+ * F5 + N5 (Glöckle HANDOFF-4/5): the authenticated post-write render
714
+ * HEALTHCHECK. Resolves the EFFECTIVE template_id from `template_id` OR `url`
715
+ * (the SAME `resolveEffectiveTemplateId` precedence page_get_layout uses — a
716
+ * pasted public URL is reverse-resolved via GET /pages/resolve first), then
717
+ * GETs `/pages/{id}/render-preview` which runs the in-process read-only Builder
718
+ * render server-side over the already-authenticated Bearer channel — answering
719
+ * "renders / N items / blank?" where an external cURL 401s behind QA Basic-Auth.
720
+ *
721
+ * Returns the strict RENDER_PREVIEW_OUTPUT_SCHEMA shape: `{rendered, item_count,
722
+ * empty, error?, cache_purge_hint, template_id}`. A render that resolved to zero
723
+ * items, or that threw inside the Builder pipeline (the swallowed YOOtheme
724
+ * render error surfaced as `error`), is a SUCCESS — not a tool error.
725
+ */
726
+ export async function handleRenderPreview(client, { template_id, url, expect }) {
727
+ try {
728
+ // G-A precedence: template_id wins, else resolve `url` to its template_id.
729
+ const effective = await resolveEffectiveTemplateId(client, { template_id, url });
730
+ if ('error' in effective) {
731
+ return effective.error;
732
+ }
733
+ const templateId = effective.templateId;
734
+ // Glöckle HANDOFF-6 #4: an `expect` substring is passed to the render
735
+ // endpoint as a query param (the server greps the rendered HTML and adds
736
+ // {matched, snippet}). A blank value is treated as "no check".
737
+ const wantMatch = typeof expect === 'string' && expect !== '';
738
+ const query = wantMatch ? `?${new URLSearchParams({ expect }).toString()}` : '';
739
+ const data = await client.get(`/pages/${encodeTemplateId(templateId)}/render-preview${query}`);
740
+ // Normalize the REST body into the strict output shape. Defensive
741
+ // coercion keeps a malformed/partial host payload from tripping the
742
+ // strict outputSchema (-32602) — the structured leg MUST validate.
743
+ const payload = {
744
+ template_id: typeof data.template_id === 'string' ? data.template_id : templateId,
745
+ rendered: data.rendered === true,
746
+ item_count: typeof data.item_count === 'number' && Number.isFinite(data.item_count)
747
+ ? Math.max(0, Math.trunc(data.item_count))
748
+ : 0,
749
+ empty: data.empty !== false,
750
+ cache_purge_hint: typeof data.cache_purge_hint === 'string' ? data.cache_purge_hint : '',
751
+ ...(typeof data.error === 'string' ? { error: data.error } : {}),
752
+ // The {matched, snippet} pair is surfaced ONLY when `expect` was
753
+ // requested. `matched` coerces to a strict boolean; `snippet` is a
754
+ // string when present, else null (a miss / a render that threw).
755
+ ...(wantMatch
756
+ ? {
757
+ matched: data.matched === true,
758
+ snippet: typeof data.snippet === 'string' ? data.snippet : null,
759
+ }
760
+ : {}),
761
+ };
762
+ return structuredResult(detailResult(buildRenderPreviewDetail(payload)), {
763
+ rendered: payload.rendered,
764
+ item_count: payload.item_count,
765
+ empty: payload.empty,
766
+ cache_purge_hint: payload.cache_purge_hint,
767
+ template_id: payload.template_id,
768
+ ...(payload.error !== undefined ? { error: payload.error } : {}),
769
+ ...(payload.matched !== undefined ? { matched: payload.matched } : {}),
770
+ ...(wantMatch ? { snippet: payload.snippet ?? null } : {}),
771
+ });
772
+ }
773
+ catch (e) {
774
+ return errorResult({
775
+ error: e,
776
+ context: { template_id, url, expect },
777
+ hint: 'Verify the template_id exists via yootheme_builder_pages_list ' +
778
+ '(or that the url resolves). Run yootheme_builder_diagnose to check auth.',
779
+ });
780
+ }
781
+ }
636
782
  //# sourceMappingURL=handlers-read.js.map