@wootsup/yt-builder-mcp 1.1.7 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -10
- package/bin/yt-builder-mcp.js +55 -40
- package/dist/auth.d.ts +18 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +18 -0
- package/dist/auth.js.map +1 -1
- package/dist/catalog/build-catalog.d.ts +63 -0
- package/dist/catalog/build-catalog.d.ts.map +1 -0
- package/dist/catalog/build-catalog.js +166 -0
- package/dist/catalog/build-catalog.js.map +1 -0
- package/dist/cli/invocation-decision.d.ts +57 -0
- package/dist/cli/invocation-decision.d.ts.map +1 -0
- package/dist/cli/invocation-decision.js +86 -0
- package/dist/cli/invocation-decision.js.map +1 -0
- package/dist/client.d.ts +28 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +40 -1
- package/dist/client.js.map +1 -1
- package/dist/clients/claude-code.d.ts.map +1 -1
- package/dist/clients/claude-code.js +3 -1
- package/dist/clients/claude-code.js.map +1 -1
- package/dist/clients/claude-desktop.d.ts.map +1 -1
- package/dist/clients/claude-desktop.js +3 -1
- package/dist/clients/claude-desktop.js.map +1 -1
- package/dist/clients/cline.d.ts.map +1 -1
- package/dist/clients/cline.js +3 -1
- package/dist/clients/cline.js.map +1 -1
- package/dist/clients/codex-cli.d.ts +1 -1
- package/dist/clients/codex-cli.d.ts.map +1 -1
- package/dist/clients/codex-cli.js +98 -0
- package/dist/clients/codex-cli.js.map +1 -1
- package/dist/clients/continue.d.ts.map +1 -1
- package/dist/clients/continue.js +70 -1
- package/dist/clients/continue.js.map +1 -1
- package/dist/clients/cursor.d.ts.map +1 -1
- package/dist/clients/cursor.js +3 -1
- package/dist/clients/cursor.js.map +1 -1
- package/dist/clients/gemini-cli.d.ts.map +1 -1
- package/dist/clients/gemini-cli.js +3 -1
- package/dist/clients/gemini-cli.js.map +1 -1
- package/dist/clients/index.d.ts +104 -0
- package/dist/clients/index.d.ts.map +1 -1
- package/dist/clients/index.js +141 -0
- package/dist/clients/index.js.map +1 -1
- package/dist/clients/roo-code.d.ts.map +1 -1
- package/dist/clients/roo-code.js +3 -1
- package/dist/clients/roo-code.js.map +1 -1
- package/dist/clients/zed.d.ts.map +1 -1
- package/dist/clients/zed.js +3 -1
- package/dist/clients/zed.js.map +1 -1
- package/dist/gateway/advanced-read-tool.d.ts +37 -0
- package/dist/gateway/advanced-read-tool.d.ts.map +1 -0
- package/dist/gateway/advanced-read-tool.js +156 -0
- package/dist/gateway/advanced-read-tool.js.map +1 -0
- package/dist/gateway/advanced-tool/domains.d.ts +18 -3
- package/dist/gateway/advanced-tool/domains.d.ts.map +1 -1
- package/dist/gateway/advanced-tool/domains.js +28 -9
- package/dist/gateway/advanced-tool/domains.js.map +1 -1
- package/dist/gateway/advanced-tool/register.d.ts.map +1 -1
- package/dist/gateway/advanced-tool/register.js +43 -11
- package/dist/gateway/advanced-tool/register.js.map +1 -1
- package/dist/gateway/essentials.d.ts +14 -4
- package/dist/gateway/essentials.d.ts.map +1 -1
- package/dist/gateway/essentials.js +55 -5
- package/dist/gateway/essentials.js.map +1 -1
- package/dist/gateway/test-support.d.ts +3 -3
- package/dist/gateway/test-support.js +3 -3
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -1
- package/dist/index.js.map +1 -1
- package/dist/install-skill.js +1 -1
- package/dist/proxy/bridge.d.ts +36 -0
- package/dist/proxy/bridge.d.ts.map +1 -0
- package/dist/proxy/bridge.js +129 -0
- package/dist/proxy/bridge.js.map +1 -0
- package/dist/proxy/mode.d.ts +10 -0
- package/dist/proxy/mode.d.ts.map +1 -0
- package/dist/proxy/mode.js +20 -0
- package/dist/proxy/mode.js.map +1 -0
- package/dist/server.d.ts +6 -4
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +14 -4
- package/dist/server.js.map +1 -1
- package/dist/setup-cli.d.ts +41 -0
- package/dist/setup-cli.d.ts.map +1 -1
- package/dist/setup-cli.js +163 -1
- package/dist/setup-cli.js.map +1 -1
- package/dist/setup-prompts.d.ts +23 -0
- package/dist/setup-prompts.d.ts.map +1 -1
- package/dist/setup-prompts.js +76 -1
- package/dist/setup-prompts.js.map +1 -1
- package/dist/setup-wizard.d.ts.map +1 -1
- package/dist/setup-wizard.js +7 -0
- package/dist/setup-wizard.js.map +1 -1
- package/dist/sites/bootstrap.d.ts +41 -0
- package/dist/sites/bootstrap.d.ts.map +1 -0
- package/dist/sites/bootstrap.js +58 -0
- package/dist/sites/bootstrap.js.map +1 -0
- package/dist/sites/client-pool.d.ts +33 -0
- package/dist/sites/client-pool.d.ts.map +1 -1
- package/dist/sites/client-pool.js +69 -1
- package/dist/sites/client-pool.js.map +1 -1
- package/dist/sites/registry.d.ts +30 -0
- package/dist/sites/registry.d.ts.map +1 -1
- package/dist/sites/registry.js.map +1 -1
- package/dist/sites/store.d.ts +8 -1
- package/dist/sites/store.d.ts.map +1 -1
- package/dist/sites/store.js +17 -2
- package/dist/sites/store.js.map +1 -1
- package/dist/sites/tools/index.d.ts.map +1 -1
- package/dist/sites/tools/index.js +9 -1
- package/dist/sites/tools/index.js.map +1 -1
- package/dist/sites/tools/use-site.d.ts +47 -0
- package/dist/sites/tools/use-site.d.ts.map +1 -0
- package/dist/sites/tools/use-site.js +203 -0
- package/dist/sites/tools/use-site.js.map +1 -0
- package/dist/tools/bind-guidance.d.ts +80 -0
- package/dist/tools/bind-guidance.d.ts.map +1 -0
- package/dist/tools/bind-guidance.js +95 -0
- package/dist/tools/bind-guidance.js.map +1 -0
- package/dist/tools/elements/builders.d.ts.map +1 -1
- package/dist/tools/elements/builders.js +75 -18
- package/dist/tools/elements/builders.js.map +1 -1
- package/dist/tools/elements/handlers-write.d.ts +20 -3
- package/dist/tools/elements/handlers-write.d.ts.map +1 -1
- package/dist/tools/elements/handlers-write.js +372 -10
- package/dist/tools/elements/handlers-write.js.map +1 -1
- package/dist/tools/elements/handlers.d.ts +6 -1
- package/dist/tools/elements/handlers.d.ts.map +1 -1
- package/dist/tools/elements/handlers.js +77 -10
- package/dist/tools/elements/handlers.js.map +1 -1
- package/dist/tools/elements/layout-hierarchy-rules.d.ts +62 -0
- package/dist/tools/elements/layout-hierarchy-rules.d.ts.map +1 -0
- package/dist/tools/elements/layout-hierarchy-rules.js +154 -0
- package/dist/tools/elements/layout-hierarchy-rules.js.map +1 -0
- package/dist/tools/format/elements-format.d.ts +35 -0
- package/dist/tools/format/elements-format.d.ts.map +1 -1
- package/dist/tools/format/elements-format.js +134 -12
- package/dist/tools/format/elements-format.js.map +1 -1
- package/dist/tools/format/inspection-format.d.ts +29 -0
- package/dist/tools/format/inspection-format.d.ts.map +1 -1
- package/dist/tools/format/inspection-format.js +99 -22
- package/dist/tools/format/inspection-format.js.map +1 -1
- package/dist/tools/format/pages-format.d.ts.map +1 -1
- package/dist/tools/format/pages-format.js +7 -0
- package/dist/tools/format/pages-format.js.map +1 -1
- package/dist/tools/format/sources-format.d.ts +8 -0
- package/dist/tools/format/sources-format.d.ts.map +1 -1
- package/dist/tools/format/sources-format.js +10 -0
- package/dist/tools/format/sources-format.js.map +1 -1
- package/dist/tools/health.d.ts.map +1 -1
- package/dist/tools/health.js +24 -0
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/inspection.d.ts +24 -0
- package/dist/tools/inspection.d.ts.map +1 -1
- package/dist/tools/inspection.js +297 -5
- package/dist/tools/inspection.js.map +1 -1
- package/dist/tools/layout-flatten.d.ts +11 -8
- package/dist/tools/layout-flatten.d.ts.map +1 -1
- package/dist/tools/layout-flatten.js +17 -6
- package/dist/tools/layout-flatten.js.map +1 -1
- package/dist/tools/multi-items/builders.d.ts.map +1 -1
- package/dist/tools/multi-items/builders.js +18 -3
- package/dist/tools/multi-items/builders.js.map +1 -1
- package/dist/tools/multi-items/clean-implode-handler.d.ts.map +1 -1
- package/dist/tools/multi-items/clean-implode-handler.js +2 -2
- package/dist/tools/multi-items/clean-implode-handler.js.map +1 -1
- package/dist/tools/multi-items/format/inspection-format.d.ts +41 -0
- package/dist/tools/multi-items/format/inspection-format.d.ts.map +1 -0
- package/dist/tools/multi-items/format/inspection-format.js +64 -0
- package/dist/tools/multi-items/format/inspection-format.js.map +1 -0
- package/dist/tools/multi-items/inspect-handler.d.ts +50 -2
- package/dist/tools/multi-items/inspect-handler.d.ts.map +1 -1
- package/dist/tools/multi-items/inspect-handler.js +237 -10
- package/dist/tools/multi-items/inspect-handler.js.map +1 -1
- package/dist/tools/multi-items/inspection-cache.d.ts +85 -0
- package/dist/tools/multi-items/inspection-cache.d.ts.map +1 -0
- package/dist/tools/multi-items/inspection-cache.js +126 -0
- package/dist/tools/multi-items/inspection-cache.js.map +1 -0
- package/dist/tools/pages/builders.d.ts +31 -2
- package/dist/tools/pages/builders.d.ts.map +1 -1
- package/dist/tools/pages/builders.js +173 -17
- package/dist/tools/pages/builders.js.map +1 -1
- package/dist/tools/pages/handlers-read.d.ts +6 -2
- package/dist/tools/pages/handlers-read.d.ts.map +1 -1
- package/dist/tools/pages/handlers-read.js +228 -26
- package/dist/tools/pages/handlers-read.js.map +1 -1
- package/dist/tools/pages/handlers-write.d.ts +143 -7
- package/dist/tools/pages/handlers-write.d.ts.map +1 -1
- package/dist/tools/pages/handlers-write.js +215 -11
- package/dist/tools/pages/handlers-write.js.map +1 -1
- package/dist/tools/pages/index.d.ts +1 -1
- package/dist/tools/pages/index.d.ts.map +1 -1
- package/dist/tools/pages/index.js +1 -1
- package/dist/tools/pages/index.js.map +1 -1
- package/dist/tools/pages/schemas.d.ts +166 -0
- package/dist/tools/pages/schemas.d.ts.map +1 -1
- package/dist/tools/pages/schemas.js +347 -0
- package/dist/tools/pages/schemas.js.map +1 -1
- package/dist/tools/shared-schemas.d.ts.map +1 -1
- package/dist/tools/shared-schemas.js +26 -11
- package/dist/tools/shared-schemas.js.map +1 -1
- package/dist/tools/sources/builders.d.ts.map +1 -1
- package/dist/tools/sources/builders.js +64 -6
- package/dist/tools/sources/builders.js.map +1 -1
- package/dist/tools/sources/handlers-bind.d.ts +13 -1
- package/dist/tools/sources/handlers-bind.d.ts.map +1 -1
- package/dist/tools/sources/handlers-bind.js +219 -5
- package/dist/tools/sources/handlers-bind.js.map +1 -1
- package/dist/tools/sources/handlers.d.ts +3 -0
- package/dist/tools/sources/handlers.d.ts.map +1 -1
- package/dist/tools/sources/handlers.js +45 -8
- package/dist/tools/sources/handlers.js.map +1 -1
- package/dist/tools/sparse-fields.d.ts +23 -0
- package/dist/tools/sparse-fields.d.ts.map +1 -1
- package/dist/tools/sparse-fields.js +29 -0
- package/dist/tools/sparse-fields.js.map +1 -1
- package/dist/tools/sublayout/builders.d.ts +23 -0
- package/dist/tools/sublayout/builders.d.ts.map +1 -0
- package/dist/tools/sublayout/builders.js +54 -0
- package/dist/tools/sublayout/builders.js.map +1 -0
- package/dist/tools/sublayout/index.d.ts +13 -0
- package/dist/tools/sublayout/index.d.ts.map +1 -0
- package/dist/tools/sublayout/index.js +13 -0
- package/dist/tools/sublayout/index.js.map +1 -0
- package/dist/tools/sublayout/inspect-sublayout-handler.d.ts +95 -0
- package/dist/tools/sublayout/inspect-sublayout-handler.d.ts.map +1 -0
- package/dist/tools/sublayout/inspect-sublayout-handler.js +181 -0
- package/dist/tools/sublayout/inspect-sublayout-handler.js.map +1 -0
- package/dist/tools/tool-builder/results.d.ts +31 -0
- package/dist/tools/tool-builder/results.d.ts.map +1 -1
- package/dist/tools/tool-builder/results.js +95 -4
- package/dist/tools/tool-builder/results.js.map +1 -1
- package/dist/uninstall-skill.d.ts +52 -0
- package/dist/uninstall-skill.d.ts.map +1 -0
- package/dist/uninstall-skill.js +146 -0
- package/dist/uninstall-skill.js.map +1 -0
- package/dist/uninstall.d.ts +73 -0
- package/dist/uninstall.d.ts.map +1 -0
- package/dist/uninstall.js +82 -0
- package/dist/uninstall.js.map +1 -0
- package/icon.png +0 -0
- package/manifest.json +10 -10
- package/package.json +7 -3
- package/skills/yt-builder-mcp/SKILL.md +157 -88
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspect-handler.js","sourceRoot":"","sources":["../../../src/tools/multi-items/inspect-handler.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"inspect-handler.js","sourceRoot":"","sources":["../../../src/tools/multi-items/inspect-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InspectionCache — Wave-16 #34 (6.2).
|
|
3
|
+
*
|
|
4
|
+
* A tiny in-process TTL cache for `inspect_multi_items_binding` results.
|
|
5
|
+
* Keyed by `(template_id, element_path, etag)`:
|
|
6
|
+
*
|
|
7
|
+
* - `template_id` + `element_path` identify the element;
|
|
8
|
+
* - `etag` is the GLOBAL state ETag (from `GET /etag`). Every write
|
|
9
|
+
* tool bumps it (see ETAG schema note: "every successful write
|
|
10
|
+
* returns a NEW ETag"). So a write to ANY template surfaces a fresh
|
|
11
|
+
* etag → a NEW cache key → a guaranteed miss. The stale entry for a
|
|
12
|
+
* mutated template can never be served. This reuses the existing
|
|
13
|
+
* etag-bump mechanism rather than inventing a parallel invalidation
|
|
14
|
+
* channel.
|
|
15
|
+
*
|
|
16
|
+
* TTL is a hard 60s upper bound so an entry cannot live indefinitely
|
|
17
|
+
* even if the etag never changes (read-only sessions). The clock is
|
|
18
|
+
* injectable so the TTL behaviour is testable without sleeping.
|
|
19
|
+
*
|
|
20
|
+
* Bounded growth — Wave-16 Phase-6 nit. The key embeds the GLOBAL etag,
|
|
21
|
+
* and every write bumps it, so each `set()` lands under a NEW key while
|
|
22
|
+
* the old-etag entries are never re-queried (the handler always reads the
|
|
23
|
+
* current etag). Without a bound they would accumulate in the Map forever
|
|
24
|
+
* in a long-lived high-write session. Two cheap defenses keep it bounded:
|
|
25
|
+
*
|
|
26
|
+
* 1. Opportunistic sweep on every `set()`: drop entries already past
|
|
27
|
+
* the TTL. The TTL is a hard upper bound, so a past-TTL entry is dead
|
|
28
|
+
* and can never be served — sweeping it changes no observable
|
|
29
|
+
* behaviour, it only reclaims the slot.
|
|
30
|
+
* 2. Hard max-size cap with oldest-first eviction (belt-and-suspenders)
|
|
31
|
+
* for the pathological case where many DISTINCT keys all stay fresh
|
|
32
|
+
* (a read-only burst the sweep cannot reclaim). `Map` preserves
|
|
33
|
+
* insertion order, so the oldest entry is the first key.
|
|
34
|
+
*
|
|
35
|
+
* Concrete generic type `T` — no `any`. The cache stores whatever the
|
|
36
|
+
* handler computed (the structured inspect payload).
|
|
37
|
+
*
|
|
38
|
+
* @license MIT
|
|
39
|
+
*/
|
|
40
|
+
/** Hard TTL upper bound for a cached inspection entry (60 seconds). */
|
|
41
|
+
export declare const INSPECTION_CACHE_TTL_MS = 60000;
|
|
42
|
+
/**
|
|
43
|
+
* Hard ceiling on live entries. Reached only when many DISTINCT keys stay
|
|
44
|
+
* fresh inside the TTL (a read-only burst the TTL-sweep cannot reclaim);
|
|
45
|
+
* the normal write-driven etag churn is reclaimed by the sweep long before
|
|
46
|
+
* this. 256 covers a generous working set while keeping the Map tiny.
|
|
47
|
+
*/
|
|
48
|
+
export declare const INSPECTION_CACHE_MAX_ENTRIES = 256;
|
|
49
|
+
/** Monotonic-ish millisecond clock; defaults to `Date.now`. */
|
|
50
|
+
export type Clock = () => number;
|
|
51
|
+
export declare class InspectionCache<T> {
|
|
52
|
+
private readonly store;
|
|
53
|
+
private readonly now;
|
|
54
|
+
private readonly ttlMs;
|
|
55
|
+
private readonly maxEntries;
|
|
56
|
+
constructor(now?: Clock, ttlMs?: number, maxEntries?: number);
|
|
57
|
+
/** Build the composite cache key. Pipe-joined; the parts are
|
|
58
|
+
* server-controlled identifiers (template id, JSON-Pointer, quoted
|
|
59
|
+
* etag) so collision via a literal `|` in a value is not a concern. */
|
|
60
|
+
private key;
|
|
61
|
+
/** Read a fresh entry, or `undefined` on miss / expiry. Expired
|
|
62
|
+
* entries are evicted on access. */
|
|
63
|
+
get(templateId: string, elementPath: string, etag: string): T | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* Store a value under the composite key, stamped with the clock.
|
|
66
|
+
*
|
|
67
|
+
* Bounds the Map first (sweep past-TTL entries, then enforce the
|
|
68
|
+
* max-size cap with oldest-first eviction) so a long-lived high-write
|
|
69
|
+
* session cannot leak old-etag keys. See class doc for the why.
|
|
70
|
+
*/
|
|
71
|
+
set(templateId: string, elementPath: string, etag: string, value: T): void;
|
|
72
|
+
/**
|
|
73
|
+
* Number of LIVE (non-expired) entries currently held. Counts rather
|
|
74
|
+
* than returns `store.size` so a caller (and the tests) sees the true
|
|
75
|
+
* working-set size even if a not-yet-swept dead entry lingers.
|
|
76
|
+
*/
|
|
77
|
+
size(): number;
|
|
78
|
+
/** Drop every entry whose TTL has elapsed. Cheap, and dead entries
|
|
79
|
+
* can never be served, so this changes no observable behaviour. */
|
|
80
|
+
private sweepExpired;
|
|
81
|
+
/** Evict oldest-first until the Map is within the max-size cap. `Map`
|
|
82
|
+
* iterates in insertion order, so the first key is the oldest. */
|
|
83
|
+
private enforceMaxEntries;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=inspection-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspection-cache.d.ts","sourceRoot":"","sources":["../../../src/tools/multi-items/inspection-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,uEAAuE;AACvE,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAE9C;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAEhD,+DAA+D;AAC/D,MAAM,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC;AAOjC,qBAAa,eAAe,CAAC,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;IAC1D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAGhC,GAAG,GAAE,KAAgB,EACrB,KAAK,GAAE,MAAgC,EACvC,UAAU,GAAE,MAAqC;IAOrD;;2EAEuE;IACvE,OAAO,CAAC,GAAG;IAIX;wCACoC;IACpC,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAWzE;;;;;;OAMG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAO1E;;;;OAIG;IACH,IAAI,IAAI,MAAM;IASd;uEACmE;IACnE,OAAO,CAAC,YAAY;IASpB;sEACkE;IAClE,OAAO,CAAC,iBAAiB;CAO5B"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InspectionCache — Wave-16 #34 (6.2).
|
|
3
|
+
*
|
|
4
|
+
* A tiny in-process TTL cache for `inspect_multi_items_binding` results.
|
|
5
|
+
* Keyed by `(template_id, element_path, etag)`:
|
|
6
|
+
*
|
|
7
|
+
* - `template_id` + `element_path` identify the element;
|
|
8
|
+
* - `etag` is the GLOBAL state ETag (from `GET /etag`). Every write
|
|
9
|
+
* tool bumps it (see ETAG schema note: "every successful write
|
|
10
|
+
* returns a NEW ETag"). So a write to ANY template surfaces a fresh
|
|
11
|
+
* etag → a NEW cache key → a guaranteed miss. The stale entry for a
|
|
12
|
+
* mutated template can never be served. This reuses the existing
|
|
13
|
+
* etag-bump mechanism rather than inventing a parallel invalidation
|
|
14
|
+
* channel.
|
|
15
|
+
*
|
|
16
|
+
* TTL is a hard 60s upper bound so an entry cannot live indefinitely
|
|
17
|
+
* even if the etag never changes (read-only sessions). The clock is
|
|
18
|
+
* injectable so the TTL behaviour is testable without sleeping.
|
|
19
|
+
*
|
|
20
|
+
* Bounded growth — Wave-16 Phase-6 nit. The key embeds the GLOBAL etag,
|
|
21
|
+
* and every write bumps it, so each `set()` lands under a NEW key while
|
|
22
|
+
* the old-etag entries are never re-queried (the handler always reads the
|
|
23
|
+
* current etag). Without a bound they would accumulate in the Map forever
|
|
24
|
+
* in a long-lived high-write session. Two cheap defenses keep it bounded:
|
|
25
|
+
*
|
|
26
|
+
* 1. Opportunistic sweep on every `set()`: drop entries already past
|
|
27
|
+
* the TTL. The TTL is a hard upper bound, so a past-TTL entry is dead
|
|
28
|
+
* and can never be served — sweeping it changes no observable
|
|
29
|
+
* behaviour, it only reclaims the slot.
|
|
30
|
+
* 2. Hard max-size cap with oldest-first eviction (belt-and-suspenders)
|
|
31
|
+
* for the pathological case where many DISTINCT keys all stay fresh
|
|
32
|
+
* (a read-only burst the sweep cannot reclaim). `Map` preserves
|
|
33
|
+
* insertion order, so the oldest entry is the first key.
|
|
34
|
+
*
|
|
35
|
+
* Concrete generic type `T` — no `any`. The cache stores whatever the
|
|
36
|
+
* handler computed (the structured inspect payload).
|
|
37
|
+
*
|
|
38
|
+
* @license MIT
|
|
39
|
+
*/
|
|
40
|
+
/** Hard TTL upper bound for a cached inspection entry (60 seconds). */
|
|
41
|
+
export const INSPECTION_CACHE_TTL_MS = 60_000;
|
|
42
|
+
/**
|
|
43
|
+
* Hard ceiling on live entries. Reached only when many DISTINCT keys stay
|
|
44
|
+
* fresh inside the TTL (a read-only burst the TTL-sweep cannot reclaim);
|
|
45
|
+
* the normal write-driven etag churn is reclaimed by the sweep long before
|
|
46
|
+
* this. 256 covers a generous working set while keeping the Map tiny.
|
|
47
|
+
*/
|
|
48
|
+
export const INSPECTION_CACHE_MAX_ENTRIES = 256;
|
|
49
|
+
export class InspectionCache {
|
|
50
|
+
store = new Map();
|
|
51
|
+
now;
|
|
52
|
+
ttlMs;
|
|
53
|
+
maxEntries;
|
|
54
|
+
constructor(now = Date.now, ttlMs = INSPECTION_CACHE_TTL_MS, maxEntries = INSPECTION_CACHE_MAX_ENTRIES) {
|
|
55
|
+
this.now = now;
|
|
56
|
+
this.ttlMs = ttlMs;
|
|
57
|
+
this.maxEntries = maxEntries;
|
|
58
|
+
}
|
|
59
|
+
/** Build the composite cache key. Pipe-joined; the parts are
|
|
60
|
+
* server-controlled identifiers (template id, JSON-Pointer, quoted
|
|
61
|
+
* etag) so collision via a literal `|` in a value is not a concern. */
|
|
62
|
+
key(templateId, elementPath, etag) {
|
|
63
|
+
return `${templateId}|${elementPath}|${etag}`;
|
|
64
|
+
}
|
|
65
|
+
/** Read a fresh entry, or `undefined` on miss / expiry. Expired
|
|
66
|
+
* entries are evicted on access. */
|
|
67
|
+
get(templateId, elementPath, etag) {
|
|
68
|
+
const k = this.key(templateId, elementPath, etag);
|
|
69
|
+
const entry = this.store.get(k);
|
|
70
|
+
if (entry === undefined)
|
|
71
|
+
return undefined;
|
|
72
|
+
if (this.now() - entry.storedAt >= this.ttlMs) {
|
|
73
|
+
this.store.delete(k);
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
return entry.value;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Store a value under the composite key, stamped with the clock.
|
|
80
|
+
*
|
|
81
|
+
* Bounds the Map first (sweep past-TTL entries, then enforce the
|
|
82
|
+
* max-size cap with oldest-first eviction) so a long-lived high-write
|
|
83
|
+
* session cannot leak old-etag keys. See class doc for the why.
|
|
84
|
+
*/
|
|
85
|
+
set(templateId, elementPath, etag, value) {
|
|
86
|
+
const k = this.key(templateId, elementPath, etag);
|
|
87
|
+
this.sweepExpired();
|
|
88
|
+
this.store.set(k, { value, storedAt: this.now() });
|
|
89
|
+
this.enforceMaxEntries();
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Number of LIVE (non-expired) entries currently held. Counts rather
|
|
93
|
+
* than returns `store.size` so a caller (and the tests) sees the true
|
|
94
|
+
* working-set size even if a not-yet-swept dead entry lingers.
|
|
95
|
+
*/
|
|
96
|
+
size() {
|
|
97
|
+
let live = 0;
|
|
98
|
+
const cutoff = this.now();
|
|
99
|
+
for (const entry of this.store.values()) {
|
|
100
|
+
if (cutoff - entry.storedAt < this.ttlMs)
|
|
101
|
+
live++;
|
|
102
|
+
}
|
|
103
|
+
return live;
|
|
104
|
+
}
|
|
105
|
+
/** Drop every entry whose TTL has elapsed. Cheap, and dead entries
|
|
106
|
+
* can never be served, so this changes no observable behaviour. */
|
|
107
|
+
sweepExpired() {
|
|
108
|
+
const cutoff = this.now();
|
|
109
|
+
for (const [k, entry] of this.store) {
|
|
110
|
+
if (cutoff - entry.storedAt >= this.ttlMs) {
|
|
111
|
+
this.store.delete(k);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/** Evict oldest-first until the Map is within the max-size cap. `Map`
|
|
116
|
+
* iterates in insertion order, so the first key is the oldest. */
|
|
117
|
+
enforceMaxEntries() {
|
|
118
|
+
while (this.store.size > this.maxEntries) {
|
|
119
|
+
const oldest = this.store.keys().next().value;
|
|
120
|
+
if (oldest === undefined)
|
|
121
|
+
break;
|
|
122
|
+
this.store.delete(oldest);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=inspection-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspection-cache.js","sourceRoot":"","sources":["../../../src/tools/multi-items/inspection-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,12 +3,41 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Split out of `src/tools/pages.ts` (Round-2 R2-A2-CRIT1). Handler
|
|
5
5
|
* bodies live in `./handlers-read.ts` (pages_list, page_get_layout,
|
|
6
|
-
* page_get_schema, get_etag) and `./handlers-write.ts`
|
|
7
|
-
* page_publish — 3-phase
|
|
6
|
+
* page_get_schema, get_etag, template_summary) and `./handlers-write.ts`
|
|
7
|
+
* (page_save, page_publish, pages_create, pages_delete — 3-phase
|
|
8
|
+
* progress contract).
|
|
9
|
+
*
|
|
10
|
+
* Surface: 9 page-level tools (pre-C4: 7; v1.2 C4 added pages_create +
|
|
11
|
+
* pages_delete wrapping POST /pages and DELETE /pages/{id}).
|
|
8
12
|
*
|
|
9
13
|
* @license MIT
|
|
10
14
|
*/
|
|
11
15
|
import type { ClientPool } from '../../sites/client-pool.js';
|
|
12
16
|
import { type AnyToolDefinition } from '../tool-builder.js';
|
|
17
|
+
/**
|
|
18
|
+
* Render-context descriptor emitted by the page builders (Wave-16 #33-C).
|
|
19
|
+
*
|
|
20
|
+
* Gives the calling agent the page's template lineage, locale, and origin
|
|
21
|
+
* site in one place so it does not need a second round-trip to reason
|
|
22
|
+
* about where/how a page renders. `site_url` is always populated from the
|
|
23
|
+
* resolved site; `parent_template_id` and `locale` are `null` when the
|
|
24
|
+
* builder cannot reach them (rather than absent) so the shape is stable
|
|
25
|
+
* for consumers.
|
|
26
|
+
*/
|
|
27
|
+
export interface RenderContext {
|
|
28
|
+
readonly parent_template_id: string | null;
|
|
29
|
+
readonly locale: string | null;
|
|
30
|
+
readonly site_url: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Build the {@link RenderContext} from the data reachable in a page
|
|
34
|
+
* builder. Pure: no I/O, no `any`. Missing `parentTemplateId` / `locale`
|
|
35
|
+
* collapse to `null`.
|
|
36
|
+
*/
|
|
37
|
+
export declare function buildRenderContext(input: {
|
|
38
|
+
siteUrl: string;
|
|
39
|
+
parentTemplateId?: string | null;
|
|
40
|
+
locale?: string | null;
|
|
41
|
+
}): RenderContext;
|
|
13
42
|
export declare function buildPagesTools(pool: ClientPool): readonly AnyToolDefinition[];
|
|
14
43
|
//# sourceMappingURL=builders.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../../../src/tools/pages/builders.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../../../src/tools/pages/builders.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAK7D,OAAO,EAMH,KAAK,iBAAiB,EACzB,MAAM,oBAAoB,CAAC;AAwC5B;;;;;;;;;GASG;AACH,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GAAG,aAAa,CAMhB;AAyCD,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,iBAAiB,EAAE,CAiR9E"}
|
|
@@ -3,8 +3,12 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Split out of `src/tools/pages.ts` (Round-2 R2-A2-CRIT1). Handler
|
|
5
5
|
* bodies live in `./handlers-read.ts` (pages_list, page_get_layout,
|
|
6
|
-
* page_get_schema, get_etag) and `./handlers-write.ts`
|
|
7
|
-
* page_publish — 3-phase
|
|
6
|
+
* page_get_schema, get_etag, template_summary) and `./handlers-write.ts`
|
|
7
|
+
* (page_save, page_publish, pages_create, pages_delete — 3-phase
|
|
8
|
+
* progress contract).
|
|
9
|
+
*
|
|
10
|
+
* Surface: 9 page-level tools (pre-C4: 7; v1.2 C4 added pages_create +
|
|
11
|
+
* pages_delete wrapping POST /pages and DELETE /pages/{id}).
|
|
8
12
|
*
|
|
9
13
|
* @license MIT
|
|
10
14
|
*/
|
|
@@ -12,10 +16,10 @@ import { z } from 'zod';
|
|
|
12
16
|
import { withSiteRetry } from '../pool-resolve-helper.js';
|
|
13
17
|
import { SITE_ID_SCHEMA, TEMPLATE_ID } from '../shared-schemas.js';
|
|
14
18
|
import { FIELDS, FLAT } from '../sparse-fields.js';
|
|
15
|
-
import { defineTool, mutating, readOnly, withSiteMeta, } from '../tool-builder.js';
|
|
19
|
+
import { creating, defineTool, mutating, readOnly, withSiteMeta, } from '../tool-builder.js';
|
|
16
20
|
import { handleGetEtag, handlePageGetLayout, handlePageGetSchema, handlePagesList, handleTemplateSummary, } from './handlers-read.js';
|
|
17
|
-
import { handlePagePublish, handlePageSave } from './handlers-write.js';
|
|
18
|
-
import { ETAG_OUTPUT_SCHEMA, PAGES_LIST_OUTPUT_SCHEMA, SCHEMA_OUTPUT_SCHEMA, TEMPLATE_SUMMARY_OUTPUT_SCHEMA, } from './schemas.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, SCHEMA_OUTPUT_SCHEMA, TEMPLATE_SUMMARY_OUTPUT_SCHEMA, } from './schemas.js';
|
|
19
23
|
// F-14: page-level save/publish accept OPTIONAL ETag (no precondition lock
|
|
20
24
|
// at template level — element/binding mutations REQUIRE one via the strict
|
|
21
25
|
// ETAG in shared-schemas.ts). Schema and description now agree: optional
|
|
@@ -27,16 +31,58 @@ const ETAG = z
|
|
|
27
31
|
.describe('Optimistic-lock ETag (from yootheme_builder_get_etag). ' +
|
|
28
32
|
'Optional; when provided, optimistic-lock is enforced (412 on conflict). ' +
|
|
29
33
|
'When omitted, last-write-wins applies. Recommended for collaborative edits.');
|
|
34
|
+
/**
|
|
35
|
+
* Build the {@link RenderContext} from the data reachable in a page
|
|
36
|
+
* builder. Pure: no I/O, no `any`. Missing `parentTemplateId` / `locale`
|
|
37
|
+
* collapse to `null`.
|
|
38
|
+
*/
|
|
39
|
+
export function buildRenderContext(input) {
|
|
40
|
+
return {
|
|
41
|
+
parent_template_id: input.parentTemplateId ?? null,
|
|
42
|
+
locale: input.locale ?? null,
|
|
43
|
+
site_url: input.siteUrl,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Best-effort locale extraction from a resolved site. The registry does
|
|
48
|
+
* not (yet) carry an explicit locale, so we read it from the platform
|
|
49
|
+
* descriptor when present; otherwise `null` (the consumer-stable
|
|
50
|
+
* "unknown" value). Kept narrow + guarded so this stays `any`-free.
|
|
51
|
+
*/
|
|
52
|
+
function localeForSite(site) {
|
|
53
|
+
const platform = site.platform;
|
|
54
|
+
if (typeof platform === 'object' && platform !== null && 'locale' in platform) {
|
|
55
|
+
const value = platform.locale;
|
|
56
|
+
if (typeof value === 'string' && value !== '') {
|
|
57
|
+
return value;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Stamp a {@link RenderContext} into a tool result's free-form
|
|
64
|
+
* result-level `_meta` (next to the site-meta `withSiteMeta` adds).
|
|
65
|
+
* Never touches `structuredContent` — that stays schema-pure so it keeps
|
|
66
|
+
* validating against the tool's `outputSchema`. Pure: returns a new
|
|
67
|
+
* result, does not mutate the input.
|
|
68
|
+
*/
|
|
69
|
+
function withRenderContext(result, ctx) {
|
|
70
|
+
const base = result._meta;
|
|
71
|
+
const mergedMeta = base !== undefined && base !== null && typeof base === 'object'
|
|
72
|
+
? { ...base, render_context: ctx }
|
|
73
|
+
: { render_context: ctx };
|
|
74
|
+
return { ...result, _meta: mergedMeta };
|
|
75
|
+
}
|
|
30
76
|
export function buildPagesTools(pool) {
|
|
31
77
|
return [
|
|
32
78
|
defineTool({
|
|
33
79
|
name: 'yootheme_builder_pages_list',
|
|
34
80
|
description: 'List all pages, templates, and layouts in the YOOtheme Pro builder. ' +
|
|
35
|
-
'Returns template_id, label, type, element count,
|
|
81
|
+
'Returns template_id, label, type, element count, frontend_url, and ' +
|
|
82
|
+
'builder_url (deep-link to open it in the builder) per row. ' +
|
|
36
83
|
'CALL THIS FIRST to discover available template IDs before any tool that needs ' +
|
|
37
84
|
'a template_id (page_get_layout, element_list, page_get_schema, etc.). ' +
|
|
38
|
-
'Keywords: list pages, list templates,
|
|
39
|
-
'index, available templates, what pages exist. ' +
|
|
85
|
+
'Keywords: list pages, list templates, discover template_id. ' +
|
|
40
86
|
'Pass `fields:["id","label"]` to slim. ' +
|
|
41
87
|
'Returns ALL pages in one call (no pagination, typically <50 templates per site). ' +
|
|
42
88
|
'Operates on the default site unless site_id is provided.',
|
|
@@ -47,13 +93,31 @@ export function buildPagesTools(pool) {
|
|
|
47
93
|
}),
|
|
48
94
|
defineTool({
|
|
49
95
|
name: 'yootheme_builder_page_get_layout',
|
|
50
|
-
description: 'Get
|
|
51
|
-
'
|
|
52
|
-
'
|
|
53
|
-
'
|
|
96
|
+
description: 'Get the layout tree for one template. For dynamize/bind work prefer ' +
|
|
97
|
+
'`mode:"bindings_only"` — just the binding skeleton (path, element_type, ' +
|
|
98
|
+
'name, has_binding, source{query_name,props,has_condition}, children), no ' +
|
|
99
|
+
'style props, typically <=15% of full size. Default `mode:"full"` returns ' +
|
|
100
|
+
'nested `{layout, etag}`. `flat:true` gives a depth-first ' +
|
|
101
|
+
'`{elements:[...], etag}` array (combine with `fields[]`). A repeated full ' +
|
|
102
|
+
'read of an unchanged template auto-skips with `[unchanged]` — `force:true` ' +
|
|
103
|
+
're-fetches. Operates on the default site unless site_id is provided.',
|
|
54
104
|
inputSchema: {
|
|
55
105
|
site_id: SITE_ID_SCHEMA,
|
|
56
106
|
template_id: TEMPLATE_ID,
|
|
107
|
+
// F195 (P0): bindings_only returns the trimmed binding skeleton —
|
|
108
|
+
// recommended for dynamize/bind workflows (token-efficient).
|
|
109
|
+
mode: z
|
|
110
|
+
.enum(['full', 'bindings_only'])
|
|
111
|
+
.optional()
|
|
112
|
+
.describe('full (default) = whole nested layout; bindings_only = trimmed ' +
|
|
113
|
+
'binding skeleton (path/type/name/has_binding/source/children, ' +
|
|
114
|
+
'no style props). Prefer bindings_only for dynamize/bind work.'),
|
|
115
|
+
// F195 (P0): bypass the per-process unchanged-read dedup.
|
|
116
|
+
force: z
|
|
117
|
+
.boolean()
|
|
118
|
+
.optional()
|
|
119
|
+
.describe('Re-fetch even if this exact (template, etag) full layout was ' +
|
|
120
|
+
'already read this session (bypasses the [unchanged] dedup).'),
|
|
57
121
|
flat: FLAT,
|
|
58
122
|
fields: FIELDS,
|
|
59
123
|
},
|
|
@@ -94,6 +158,12 @@ export function buildPagesTools(pool) {
|
|
|
94
158
|
'count, max nesting depth, and named landmark sections — computed ' +
|
|
95
159
|
'server-side in one call. Use this to grasp a large template before ' +
|
|
96
160
|
'pulling element_list or page_get_layout. ' +
|
|
161
|
+
// F206 (P3): concrete first-call example. The Desktop client
|
|
162
|
+
// rejected the first guessed call because no example showed the
|
|
163
|
+
// exact arg shape (the whole yt-builder package used none, while
|
|
164
|
+
// apimapper's schema.ts does). Mirrors apimapper's 'Example:'
|
|
165
|
+
// pattern.
|
|
166
|
+
'Example: yootheme_builder_template_summary({ template_id: "default" }). ' +
|
|
97
167
|
'Operates on the default site unless site_id is provided.',
|
|
98
168
|
inputSchema: { site_id: SITE_ID_SCHEMA, template_id: TEMPLATE_ID },
|
|
99
169
|
outputSchema: TEMPLATE_SUMMARY_OUTPUT_SCHEMA,
|
|
@@ -102,17 +172,33 @@ export function buildPagesTools(pool) {
|
|
|
102
172
|
}),
|
|
103
173
|
defineTool({
|
|
104
174
|
name: 'yootheme_builder_page_save',
|
|
105
|
-
description: 'Re-run save-transforms
|
|
106
|
-
'
|
|
107
|
-
'
|
|
175
|
+
description: 'Re-run save-transforms + flush caches. Optionally pass a whole `layout` to ' +
|
|
176
|
+
'REPLACE the template tree ATOMICALLY (F85) — ideal for wholesale dynamization ' +
|
|
177
|
+
'(read layout → swap query → remap fields → write back). A supplied layout is ' +
|
|
178
|
+
'validated + ETag-locked; on rejection nothing is persisted. Omit `layout` to just ' +
|
|
179
|
+
're-run transforms (no-op if byte-identical) — for incremental edits use ' +
|
|
180
|
+
'element_add/update/bind/delete first. New pages: pages_create. Publish: page_publish. ' +
|
|
181
|
+
'ETag optional (412 on conflict; else last-write-wins). ' +
|
|
108
182
|
'Operates on the default site unless site_id is provided.',
|
|
109
183
|
inputSchema: {
|
|
110
184
|
site_id: SITE_ID_SCHEMA,
|
|
111
185
|
template_id: TEMPLATE_ID,
|
|
112
186
|
etag: ETAG,
|
|
187
|
+
// F85: optional whole-layout atomic replacement (ARTICLE/page
|
|
188
|
+
// templates + theme templates). Same shape as pages_create.layout.
|
|
189
|
+
layout: z
|
|
190
|
+
.record(z.string(), z.unknown())
|
|
191
|
+
.optional()
|
|
192
|
+
.describe('Optional whole YT layout-node object (e.g. {type:"layout",children:[...]}) ' +
|
|
193
|
+
'to replace the template tree atomically. Validated + ETag-locked. ' +
|
|
194
|
+
'Omit to just re-run save-transforms.'),
|
|
113
195
|
},
|
|
114
196
|
annotations: mutating('Save Page'),
|
|
115
|
-
handler: async ({ site_id, ...rest }, extra) => withSiteRetry(pool, site_id, async (client, site) => withSiteMeta(await handlePageSave(client, rest, extra), site)
|
|
197
|
+
handler: async ({ site_id, ...rest }, extra) => withSiteRetry(pool, site_id, async (client, site) => withRenderContext(withSiteMeta(await handlePageSave(client, rest, extra), site), buildRenderContext({
|
|
198
|
+
siteUrl: site.url,
|
|
199
|
+
parentTemplateId: rest.template_id,
|
|
200
|
+
locale: localeForSite(site),
|
|
201
|
+
}))),
|
|
116
202
|
}),
|
|
117
203
|
defineTool({
|
|
118
204
|
name: 'yootheme_builder_page_publish',
|
|
@@ -129,7 +215,77 @@ export function buildPagesTools(pool) {
|
|
|
129
215
|
// unchanged template snapshots the same ETag and flushes
|
|
130
216
|
// the same caches. Matrix marks `idempotentHint:true`.
|
|
131
217
|
annotations: mutating('Publish Page'),
|
|
132
|
-
handler: async ({ site_id, ...rest }, extra) => withSiteRetry(pool, site_id, async (client, site) => withSiteMeta(await handlePagePublish(client, rest, extra), site)
|
|
218
|
+
handler: async ({ site_id, ...rest }, extra) => withSiteRetry(pool, site_id, async (client, site) => withRenderContext(withSiteMeta(await handlePagePublish(client, rest, extra), site), buildRenderContext({
|
|
219
|
+
siteUrl: site.url,
|
|
220
|
+
parentTemplateId: rest.template_id,
|
|
221
|
+
locale: localeForSite(site),
|
|
222
|
+
}))),
|
|
223
|
+
}),
|
|
224
|
+
// ─── C4 (v1.2) — pages_create + pages_delete ──────────────────
|
|
225
|
+
// First-class customer-facing page-level mutations. Both wrap
|
|
226
|
+
// Phase B REST endpoints (POST /pages, DELETE /pages/{id}) and
|
|
227
|
+
// are L1 essentials (see gateway/essentials.ts).
|
|
228
|
+
defineTool({
|
|
229
|
+
name: 'yootheme_builder_pages_create',
|
|
230
|
+
description: 'Create a page (WordPress) or article (Joomla 5/6) with a YOOtheme per-page ' +
|
|
231
|
+
'layout. Required: title. Optional: slug, status (default draft), published ' +
|
|
232
|
+
'(default false → live on true: WP publish / Joomla state 1), layout (JSON), ' +
|
|
233
|
+
'menu_item (Joomla SEF route), dry_run (preflight, no persist). Returns page_id ' +
|
|
234
|
+
'(WP) / article_id (Joomla), slug, template_id (page:{id} or article:{id}), etag, ' +
|
|
235
|
+
'warnings. Joomla: a published article has NO SEF route until a menu item points ' +
|
|
236
|
+
'at it — pass menu_item, else frontend_url may 404. ' +
|
|
237
|
+
'Operates on the default site unless site_id is provided.',
|
|
238
|
+
inputSchema: { site_id: SITE_ID_SCHEMA, ...PAGES_CREATE_INPUT },
|
|
239
|
+
// No outputSchema: the response shape is a discriminated union
|
|
240
|
+
// (201 wet vs 200 dry-run). page_get_layout uses the same pattern.
|
|
241
|
+
annotations: mutating('Create Page'),
|
|
242
|
+
handler: async ({ site_id, ...rest }, extra) => withSiteRetry(pool, site_id, async (client, site) => withRenderContext(withSiteMeta(await handlePagesCreate(client, rest, extra), site), buildRenderContext({
|
|
243
|
+
siteUrl: site.url,
|
|
244
|
+
// A new page has no caller-supplied parent
|
|
245
|
+
// template; null until the REST response carries
|
|
246
|
+
// one (kept stable rather than absent).
|
|
247
|
+
parentTemplateId: null,
|
|
248
|
+
locale: localeForSite(site),
|
|
249
|
+
}))),
|
|
250
|
+
}),
|
|
251
|
+
// ─── P-G (Goldstandard wave 3) — page_dynamize ────────────────
|
|
252
|
+
// THE one-call canonical path to dynamize an existing designed
|
|
253
|
+
// section. L1 essential: an agent must reach it directly INSTEAD
|
|
254
|
+
// of hand-editing layout JSON (the recipe is CODE, server-side).
|
|
255
|
+
defineTool({
|
|
256
|
+
name: 'yootheme_builder_page_dynamize',
|
|
257
|
+
description: 'One-call way to dynamize a designed section: copies the layout ' +
|
|
258
|
+
'byte-identically and swaps only what you map. Use INSTEAD of ' +
|
|
259
|
+
'hand-editing JSON. Give a REFERENCE (section_name from ' +
|
|
260
|
+
'template_summary, or element_path) + list_source_name + a leaf_map ' +
|
|
261
|
+
'(original leaf field-name → flat flow field; #parent + tuned props kept). ' +
|
|
262
|
+
'A section with several source blocks (Played/Next/Later) dynamizes in ONE ' +
|
|
263
|
+
'call via source_map ({match, source_name, leaf_map?}[]). Sub-query panels: ' +
|
|
264
|
+
'key by "<subquery>.<leaf>". Returns page + `summary`. Requires page.title. ' +
|
|
265
|
+
'Operates on the default site unless site_id is provided.',
|
|
266
|
+
inputSchema: { site_id: SITE_ID_SCHEMA, ...PAGE_DYNAMIZE_INPUT },
|
|
267
|
+
// No outputSchema: the response is the create wire-shape (WP
|
|
268
|
+
// page_id / Joomla article_id discriminated union) plus the
|
|
269
|
+
// `summary` object — pages_create uses the same no-outputSchema
|
|
270
|
+
// pattern for its discriminated union.
|
|
271
|
+
annotations: creating('Dynamize Page'),
|
|
272
|
+
handler: async ({ site_id, ...rest }, extra) => withSiteRetry(pool, site_id, async (client, site) => withRenderContext(withSiteMeta(await handlePageDynamize(client, rest, extra), site), buildRenderContext({
|
|
273
|
+
siteUrl: site.url,
|
|
274
|
+
parentTemplateId: null,
|
|
275
|
+
locale: localeForSite(site),
|
|
276
|
+
}))),
|
|
277
|
+
}),
|
|
278
|
+
defineTool({
|
|
279
|
+
name: 'yootheme_builder_pages_delete',
|
|
280
|
+
description: 'Delete a page (WordPress) or article (Joomla 5/6) with its YOOtheme per-page ' +
|
|
281
|
+
'layout. Requires confirm:true (gate against accidental deletion). Default: trash ' +
|
|
282
|
+
'(recoverable). force:true: permanent delete. Refuses non-page/article types with ' +
|
|
283
|
+
'403 (Layer 9 defense). Returns deleted:true, page_id (WP) / article_id (Joomla), ' +
|
|
284
|
+
'force_deleted, bumped etag. Operates on the default site unless site_id is provided.',
|
|
285
|
+
inputSchema: { site_id: SITE_ID_SCHEMA, ...PAGES_DELETE_INPUT },
|
|
286
|
+
outputSchema: PAGES_DELETE_OUTPUT_SCHEMA,
|
|
287
|
+
annotations: mutating('Delete Page'),
|
|
288
|
+
handler: async ({ site_id, ...rest }, extra) => withSiteRetry(pool, site_id, async (client, site) => withSiteMeta(await handlePagesDelete(client, rest, extra), site)),
|
|
133
289
|
}),
|
|
134
290
|
];
|
|
135
291
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builders.js","sourceRoot":"","sources":["../../../src/tools/pages/builders.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"builders.js","sourceRoot":"","sources":["../../../src/tools/pages/builders.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EACH,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,YAAY,GAEf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACH,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,qBAAqB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACH,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACH,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,0BAA0B,EAC1B,wBAAwB,EACxB,oBAAoB,EACpB,8BAA8B,GACjC,MAAM,cAAc,CAAC;AAEtB,2EAA2E;AAC3E,2EAA2E;AAC3E,yEAAyE;AACzE,0EAA0E;AAC1E,8EAA8E;AAC9E,MAAM,IAAI,GAAG,CAAC;KACT,MAAM,EAAE;KACR,QAAQ,EAAE;KACV,QAAQ,CACL,yDAAyD;IACrD,0EAA0E;IAC1E,6EAA6E,CACpF,CAAC;AAkBN;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAIlC;IACG,OAAO;QACH,kBAAkB,EAAE,KAAK,CAAC,gBAAgB,IAAI,IAAI;QAClD,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;QAC5B,QAAQ,EAAE,KAAK,CAAC,OAAO;KAC1B,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CAAC,IAAkB;IACrC,MAAM,QAAQ,GAAY,IAAI,CAAC,QAAQ,CAAC;IACxC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;QAC5E,MAAM,KAAK,GAAI,QAAiC,CAAC,MAAM,CAAC;QACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC5C,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAKD;;;;;;GAMG;AACH,SAAS,iBAAiB,CACtB,MAAS,EACT,GAAkB;IAElB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;IAC1B,MAAM,UAAU,GACZ,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAC3D,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE;QAClC,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC;IAClC,OAAO,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAgB;IAC5C,OAAO;QACH,UAAU,CAAC;YACP,IAAI,EAAE,6BAA6B;YACnC,WAAW,EACP,sEAAsE;gBACtE,qEAAqE;gBACrE,6DAA6D;gBAC7D,gFAAgF;gBAChF,wEAAwE;gBACxE,8DAA8D;gBAC9D,wCAAwC;gBACxC,mFAAmF;gBACnF,0DAA0D;YAC9D,WAAW,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE;YACxD,YAAY,EAAE,wBAAwB;YACtC,WAAW,EAAE,QAAQ,CAAC,YAAY,CAAC;YACnC,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CACpC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAChD,YAAY,CAAC,MAAM,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;SACnE,CAAC;QAEF,UAAU,CAAC;YACP,IAAI,EAAE,kCAAkC;YACxC,WAAW,EACP,sEAAsE;gBACtE,0EAA0E;gBAC1E,2EAA2E;gBAC3E,2EAA2E;gBAC3E,2DAA2D;gBAC3D,4EAA4E;gBAC5E,6EAA6E;gBAC7E,sEAAsE;YAC1E,WAAW,EAAE;gBACT,OAAO,EAAE,cAAc;gBACvB,WAAW,EAAE,WAAW;gBACxB,kEAAkE;gBAClE,6DAA6D;gBAC7D,IAAI,EAAE,CAAC;qBACF,IAAI,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;qBAC/B,QAAQ,EAAE;qBACV,QAAQ,CACL,gEAAgE;oBAC5D,gEAAgE;oBAChE,+DAA+D,CACtE;gBACL,0DAA0D;gBAC1D,KAAK,EAAE,CAAC;qBACH,OAAO,EAAE;qBACT,QAAQ,EAAE;qBACV,QAAQ,CACL,+DAA+D;oBAC3D,6DAA6D,CACpE;gBACL,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,MAAM;aACjB;YACD,sEAAsE;YACtE,kEAAkE;YAClE,sEAAsE;YACtE,WAAW,EAAE,QAAQ,CAAC,iBAAiB,CAAC;YACxC,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CACpC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAChD,YAAY,CAAC,MAAM,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;SACvE,CAAC;QAEF,UAAU,CAAC;YACP,IAAI,EAAE,kCAAkC;YACxC,WAAW,EACP,+EAA+E;gBAC/E,yEAAyE;gBACzE,iEAAiE;gBACjE,0DAA0D;YAC9D,WAAW,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE;YAClE,YAAY,EAAE,oBAAoB;YAClC,WAAW,EAAE,QAAQ,CAAC,iBAAiB,CAAC;YACxC,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CACpC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAChD,YAAY,CAAC,MAAM,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;SACvE,CAAC;QAEF,UAAU,CAAC;YACP,IAAI,EAAE,2BAA2B;YACjC,WAAW,EACP,kEAAkE;gBAClE,wEAAwE;gBACxE,qFAAqF;gBACrF,sFAAsF;gBACtF,yEAAyE;gBACzE,oFAAoF;gBACpF,0DAA0D;YAC9D,WAAW,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE;YACxC,YAAY,EAAE,kBAAkB;YAChC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;YACjC,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAC3B,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAChD,YAAY,CAAC,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;SAC3D,CAAC;QAEF,UAAU,CAAC;YACP,IAAI,EAAE,mCAAmC;YACzC,WAAW,EACP,qEAAqE;gBACrE,mEAAmE;gBACnE,qEAAqE;gBACrE,2CAA2C;gBAC3C,6DAA6D;gBAC7D,gEAAgE;gBAChE,iEAAiE;gBACjE,8DAA8D;gBAC9D,WAAW;gBACX,0EAA0E;gBAC1E,0DAA0D;YAC9D,WAAW,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE;YAClE,YAAY,EAAE,8BAA8B;YAC5C,WAAW,EAAE,QAAQ,CAAC,kBAAkB,CAAC;YACzC,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CACpC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAChD,YAAY,CAAC,MAAM,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;SACzE,CAAC;QAEF,UAAU,CAAC;YACP,IAAI,EAAE,4BAA4B;YAClC,WAAW,EACP,6EAA6E;gBAC7E,gFAAgF;gBAChF,+EAA+E;gBAC/E,oFAAoF;gBACpF,0EAA0E;gBAC1E,wFAAwF;gBACxF,yDAAyD;gBACzD,0DAA0D;YAC9D,WAAW,EAAE;gBACT,OAAO,EAAE,cAAc;gBACvB,WAAW,EAAE,WAAW;gBACxB,IAAI,EAAE,IAAI;gBACV,8DAA8D;gBAC9D,mEAAmE;gBACnE,MAAM,EAAE,CAAC;qBACJ,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;qBAC/B,QAAQ,EAAE;qBACV,QAAQ,CACL,6EAA6E;oBACzE,oEAAoE;oBACpE,sCAAsC,CAC7C;aACR;YACD,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC;YAClC,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,CAC3C,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAChD,iBAAiB,CACb,YAAY,CAAC,MAAM,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,EAC7D,kBAAkB,CAAC;gBACf,OAAO,EAAE,IAAI,CAAC,GAAG;gBACjB,gBAAgB,EAAE,IAAI,CAAC,WAAW;gBAClC,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC;aAC9B,CAAC,CACL,CAAC;SACb,CAAC;QAEF,UAAU,CAAC;YACP,IAAI,EAAE,+BAA+B;YACrC,WAAW,EACP,yEAAyE;gBACzE,6EAA6E;gBAC7E,iEAAiE;gBACjE,0DAA0D;YAC9D,WAAW,EAAE;gBACT,OAAO,EAAE,cAAc;gBACvB,WAAW,EAAE,WAAW;gBACxB,IAAI,EAAE,IAAI;aACb;YACD,yDAAyD;YACzD,yDAAyD;YACzD,uDAAuD;YACvD,WAAW,EAAE,QAAQ,CAAC,cAAc,CAAC;YACrC,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,CAC3C,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAChD,iBAAiB,CACb,YAAY,CAAC,MAAM,iBAAiB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,EAChE,kBAAkB,CAAC;gBACf,OAAO,EAAE,IAAI,CAAC,GAAG;gBACjB,gBAAgB,EAAE,IAAI,CAAC,WAAW;gBAClC,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC;aAC9B,CAAC,CACL,CAAC;SACb,CAAC;QAEF,iEAAiE;QACjE,8DAA8D;QAC9D,+DAA+D;QAC/D,iDAAiD;QAEjD,UAAU,CAAC;YACP,IAAI,EAAE,+BAA+B;YACrC,WAAW,EACP,6EAA6E;gBAC7E,6EAA6E;gBAC7E,8EAA8E;gBAC9E,iFAAiF;gBACjF,mFAAmF;gBACnF,kFAAkF;gBAClF,qDAAqD;gBACrD,0DAA0D;YAC9D,WAAW,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,kBAAkB,EAAE;YAC/D,+DAA+D;YAC/D,mEAAmE;YACnE,WAAW,EAAE,QAAQ,CAAC,aAAa,CAAC;YACpC,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,CAC3C,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAChD,iBAAiB,CACb,YAAY,CAAC,MAAM,iBAAiB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,EAChE,kBAAkB,CAAC;gBACf,OAAO,EAAE,IAAI,CAAC,GAAG;gBACjB,2CAA2C;gBAC3C,iDAAiD;gBACjD,wCAAwC;gBACxC,gBAAgB,EAAE,IAAI;gBACtB,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC;aAC9B,CAAC,CACL,CAAC;SACb,CAAC;QAEF,iEAAiE;QACjE,+DAA+D;QAC/D,iEAAiE;QACjE,iEAAiE;QACjE,UAAU,CAAC;YACP,IAAI,EAAE,gCAAgC;YACtC,WAAW,EACP,iEAAiE;gBACjE,+DAA+D;gBAC/D,yDAAyD;gBACzD,qEAAqE;gBACrE,4EAA4E;gBAC5E,4EAA4E;gBAC5E,6EAA6E;gBAC7E,6EAA6E;gBAC7E,0DAA0D;YAC9D,WAAW,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,mBAAmB,EAAE;YAChE,6DAA6D;YAC7D,4DAA4D;YAC5D,gEAAgE;YAChE,uCAAuC;YACvC,WAAW,EAAE,QAAQ,CAAC,eAAe,CAAC;YACtC,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,CAC3C,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAChD,iBAAiB,CACb,YAAY,CAAC,MAAM,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,EACjE,kBAAkB,CAAC;gBACf,OAAO,EAAE,IAAI,CAAC,GAAG;gBACjB,gBAAgB,EAAE,IAAI;gBACtB,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC;aAC9B,CAAC,CACL,CAAC;SACb,CAAC;QAEF,UAAU,CAAC;YACP,IAAI,EAAE,+BAA+B;YACrC,WAAW,EACP,+EAA+E;gBAC/E,mFAAmF;gBACnF,mFAAmF;gBACnF,mFAAmF;gBACnF,sFAAsF;YAC1F,WAAW,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,kBAAkB,EAAE;YAC/D,YAAY,EAAE,0BAA0B;YACxC,WAAW,EAAE,QAAQ,CAAC,aAAa,CAAC;YACpC,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,CAC3C,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAChD,YAAY,CAAC,MAAM,iBAAiB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;SAC5E,CAAC;KACL,CAAC;AACN,CAAC"}
|
|
@@ -7,15 +7,19 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @license MIT
|
|
9
9
|
*/
|
|
10
|
-
import type
|
|
10
|
+
import { type RestClient } from '../../client.js';
|
|
11
11
|
import { type ToolResult } from '../tool-builder.js';
|
|
12
12
|
export declare function handlePagesList(client: RestClient, { fields }: {
|
|
13
13
|
fields?: readonly string[];
|
|
14
14
|
}): Promise<ToolResult>;
|
|
15
|
-
|
|
15
|
+
/** Test-only: clear the dedup cache between cases (mirrors the bus reset idiom). */
|
|
16
|
+
export declare function __resetLayoutDedupCacheForTests(): void;
|
|
17
|
+
export declare function handlePageGetLayout(client: RestClient, { template_id, flat, fields, mode, force }: {
|
|
16
18
|
template_id: string;
|
|
17
19
|
flat?: boolean;
|
|
18
20
|
fields?: readonly string[];
|
|
21
|
+
mode?: 'full' | 'bindings_only';
|
|
22
|
+
force?: boolean;
|
|
19
23
|
}): Promise<ToolResult>;
|
|
20
24
|
export declare function handlePageGetSchema(client: RestClient, { template_id }: {
|
|
21
25
|
template_id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers-read.d.ts","sourceRoot":"","sources":["../../../src/tools/pages/handlers-read.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,
|
|
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;AAkBpE,OAAO,EAIH,KAAK,UAAU,EAClB,MAAM,oBAAoB,CAAC;AAI5B,wBAAsB,eAAe,CACjC,MAAM,EAAE,UAAU,EAClB,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC3C,OAAO,CAAC,UAAU,CAAC,CAwCrB;AAsBD,oFAAoF;AACpF,wBAAgB,+BAA+B,IAAI,IAAI,CAEtD;AAuED,wBAAsB,mBAAmB,CACrC,MAAM,EAAE,UAAU,EAClB,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB,GACF,OAAO,CAAC,UAAU,CAAC,CA0KrB;AAID,wBAAsB,mBAAmB,CACrC,MAAM,EAAE,UAAU,EAClB,EAAE,WAAW,EAAE,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GACzC,OAAO,CAAC,UAAU,CAAC,CA4CrB;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"}
|