@wootsup/yt-builder-mcp 1.1.7 → 1.2.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 +7 -7
- 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/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/essentials.d.ts +4 -4
- package/dist/gateway/essentials.d.ts.map +1 -1
- package/dist/gateway/essentials.js +19 -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 +9 -1
- package/dist/index.js.map +1 -1
- package/dist/install-skill.js +1 -1
- package/dist/server.d.ts +3 -3
- package/dist/server.js +3 -3
- 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/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 +51 -1
- package/dist/sites/client-pool.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 +183 -0
- package/dist/sites/tools/use-site.js.map +1 -0
- package/dist/tools/elements/builders.d.ts.map +1 -1
- package/dist/tools/elements/builders.js +16 -7
- package/dist/tools/elements/builders.js.map +1 -1
- package/dist/tools/elements/handlers-write.d.ts +1 -1
- package/dist/tools/elements/handlers-write.d.ts.map +1 -1
- package/dist/tools/elements/handlers-write.js +202 -9
- package/dist/tools/elements/handlers-write.js.map +1 -1
- package/dist/tools/elements/handlers.d.ts.map +1 -1
- package/dist/tools/elements/handlers.js +3 -3
- package/dist/tools/elements/handlers.js.map +1 -1
- package/dist/tools/format/elements-format.d.ts.map +1 -1
- package/dist/tools/format/elements-format.js +10 -11
- package/dist/tools/format/elements-format.js.map +1 -1
- package/dist/tools/format/inspection-format.d.ts +11 -0
- package/dist/tools/format/inspection-format.d.ts.map +1 -1
- package/dist/tools/format/inspection-format.js +77 -21
- package/dist/tools/format/inspection-format.js.map +1 -1
- package/dist/tools/inspection.d.ts.map +1 -1
- package/dist/tools/inspection.js +194 -1
- package/dist/tools/inspection.js.map +1 -1
- package/dist/tools/multi-items/builders.d.ts.map +1 -1
- package/dist/tools/multi-items/builders.js +7 -1
- 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 +37 -2
- package/dist/tools/multi-items/inspect-handler.d.ts.map +1 -1
- package/dist/tools/multi-items/inspect-handler.js +93 -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 +102 -9
- package/dist/tools/pages/builders.js.map +1 -1
- package/dist/tools/pages/handlers-read.d.ts +1 -1
- package/dist/tools/pages/handlers-read.d.ts.map +1 -1
- package/dist/tools/pages/handlers-read.js +78 -21
- package/dist/tools/pages/handlers-read.js.map +1 -1
- package/dist/tools/pages/handlers-write.d.ts +48 -6
- package/dist/tools/pages/handlers-write.d.ts.map +1 -1
- package/dist/tools/pages/handlers-write.js +83 -8
- package/dist/tools/pages/handlers-write.js.map +1 -1
- package/dist/tools/pages/schemas.d.ts +112 -0
- package/dist/tools/pages/schemas.d.ts.map +1 -1
- package/dist/tools/pages/schemas.js +150 -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 +15 -2
- package/dist/tools/shared-schemas.js.map +1 -1
- package/dist/tools/sources/handlers-bind.d.ts.map +1 -1
- package/dist/tools/sources/handlers-bind.js +56 -4
- package/dist/tools/sources/handlers-bind.js.map +1 -1
- package/dist/tools/sources/handlers.d.ts.map +1 -1
- package/dist/tools/sources/handlers.js +2 -2
- package/dist/tools/sources/handlers.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 +4 -2
- package/skills/yt-builder-mcp/SKILL.md +30 -26
|
@@ -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
|
*/
|
|
@@ -14,8 +18,8 @@ import { SITE_ID_SCHEMA, TEMPLATE_ID } from '../shared-schemas.js';
|
|
|
14
18
|
import { FIELDS, FLAT } from '../sparse-fields.js';
|
|
15
19
|
import { 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 { handlePagePublish, handlePagesCreate, handlePagesDelete, handlePageSave, } from './handlers-write.js';
|
|
22
|
+
import { ETAG_OUTPUT_SCHEMA, 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,6 +31,48 @@ 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({
|
|
@@ -102,9 +148,9 @@ export function buildPagesTools(pool) {
|
|
|
102
148
|
}),
|
|
103
149
|
defineTool({
|
|
104
150
|
name: 'yootheme_builder_page_save',
|
|
105
|
-
description: 'Re-run save-transforms
|
|
106
|
-
'
|
|
107
|
-
'
|
|
151
|
+
description: 'Re-run save-transforms + flush caches. Does NOT accept a layout — land edits ' +
|
|
152
|
+
'via element_add/update/bind/delete first. No-op if byte-identical. New pages: ' +
|
|
153
|
+
'pages_create. Publish: page_publish. ETag optional. ' +
|
|
108
154
|
'Operates on the default site unless site_id is provided.',
|
|
109
155
|
inputSchema: {
|
|
110
156
|
site_id: SITE_ID_SCHEMA,
|
|
@@ -112,7 +158,11 @@ export function buildPagesTools(pool) {
|
|
|
112
158
|
etag: ETAG,
|
|
113
159
|
},
|
|
114
160
|
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)
|
|
161
|
+
handler: async ({ site_id, ...rest }, extra) => withSiteRetry(pool, site_id, async (client, site) => withRenderContext(withSiteMeta(await handlePageSave(client, rest, extra), site), buildRenderContext({
|
|
162
|
+
siteUrl: site.url,
|
|
163
|
+
parentTemplateId: rest.template_id,
|
|
164
|
+
locale: localeForSite(site),
|
|
165
|
+
}))),
|
|
116
166
|
}),
|
|
117
167
|
defineTool({
|
|
118
168
|
name: 'yootheme_builder_page_publish',
|
|
@@ -129,7 +179,50 @@ export function buildPagesTools(pool) {
|
|
|
129
179
|
// unchanged template snapshots the same ETag and flushes
|
|
130
180
|
// the same caches. Matrix marks `idempotentHint:true`.
|
|
131
181
|
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)
|
|
182
|
+
handler: async ({ site_id, ...rest }, extra) => withSiteRetry(pool, site_id, async (client, site) => withRenderContext(withSiteMeta(await handlePagePublish(client, rest, extra), site), buildRenderContext({
|
|
183
|
+
siteUrl: site.url,
|
|
184
|
+
parentTemplateId: rest.template_id,
|
|
185
|
+
locale: localeForSite(site),
|
|
186
|
+
}))),
|
|
187
|
+
}),
|
|
188
|
+
// ─── C4 (v1.2) — pages_create + pages_delete ──────────────────
|
|
189
|
+
// First-class customer-facing page-level mutations. Both wrap
|
|
190
|
+
// Phase B REST endpoints (POST /pages, DELETE /pages/{id}) and
|
|
191
|
+
// are L1 essentials (see gateway/essentials.ts).
|
|
192
|
+
defineTool({
|
|
193
|
+
name: 'yootheme_builder_pages_create',
|
|
194
|
+
description: 'Create a new WordPress page with a YOOtheme per-page layout. Required: title. ' +
|
|
195
|
+
'Optional: slug (defaults to sanitize_title(title)), status (default: draft), ' +
|
|
196
|
+
'layout (JSON, default: {type:"layout",children:[]}). ' +
|
|
197
|
+
'Supports dry-run mode (dry_run:true) to preflight all hardening layers without persisting. ' +
|
|
198
|
+
'Returns page_id, slug (post-collision-resolved), template_id, etag, warnings. ' +
|
|
199
|
+
'Operates on the default site unless site_id is provided.',
|
|
200
|
+
inputSchema: { site_id: SITE_ID_SCHEMA, ...PAGES_CREATE_INPUT },
|
|
201
|
+
// No outputSchema: the response shape is a discriminated union
|
|
202
|
+
// (201 wet vs 200 dry-run). page_get_layout uses the same pattern.
|
|
203
|
+
annotations: mutating('Create Page'),
|
|
204
|
+
handler: async ({ site_id, ...rest }, extra) => withSiteRetry(pool, site_id, async (client, site) => withRenderContext(withSiteMeta(await handlePagesCreate(client, rest, extra), site), buildRenderContext({
|
|
205
|
+
siteUrl: site.url,
|
|
206
|
+
// A new page has no caller-supplied parent
|
|
207
|
+
// template; null until the REST response carries
|
|
208
|
+
// one (kept stable rather than absent).
|
|
209
|
+
parentTemplateId: null,
|
|
210
|
+
locale: localeForSite(site),
|
|
211
|
+
}))),
|
|
212
|
+
}),
|
|
213
|
+
defineTool({
|
|
214
|
+
name: 'yootheme_builder_pages_delete',
|
|
215
|
+
description: 'Delete a WordPress page (with associated YOOtheme per-page layout). ' +
|
|
216
|
+
'Requires confirm:true (gate against accidental deletion). ' +
|
|
217
|
+
'Default behavior: wp_trash_post (recoverable via wp-admin). ' +
|
|
218
|
+
'With force:true: permanent wp_delete_post(force=true). ' +
|
|
219
|
+
'Refuses non-page post types with 403 (Layer 9 defense). ' +
|
|
220
|
+
'Returns deleted:true, page_id, force_deleted, bumped etag. ' +
|
|
221
|
+
'Operates on the default site unless site_id is provided.',
|
|
222
|
+
inputSchema: { site_id: SITE_ID_SCHEMA, ...PAGES_DELETE_INPUT },
|
|
223
|
+
outputSchema: PAGES_DELETE_OUTPUT_SCHEMA,
|
|
224
|
+
annotations: mutating('Delete Page'),
|
|
225
|
+
handler: async ({ site_id, ...rest }, extra) => withSiteRetry(pool, site_id, async (client, site) => withSiteMeta(await handlePagesDelete(client, rest, extra), site)),
|
|
133
226
|
}),
|
|
134
227
|
];
|
|
135
228
|
}
|
|
@@ -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":"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"}
|
|
@@ -7,7 +7,7 @@
|
|
|
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[];
|
|
@@ -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;AAiBpE,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,CAyCrB;AAID,wBAAsB,mBAAmB,CACrC,MAAM,EAAE,UAAU,EAClB,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B,GACF,OAAO,CAAC,UAAU,CAAC,CAsGrB;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"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* @license MIT
|
|
9
9
|
*/
|
|
10
10
|
import { detailResult, tableResult } from '@getimo/mcp-toolkit';
|
|
11
|
+
import { encodeTemplateId } from '../../client.js';
|
|
11
12
|
import { flattenLayout } from '../layout-flatten.js';
|
|
12
13
|
import { PAGES_COMPACT_COLUMNS, PAGES_TABLE_COLUMNS, SCHEMA_COMPACT_COLUMNS, SCHEMA_TABLE_COLUMNS, buildEtagDetail, buildSchemaRows, mapPageRow, } from '../format/pages-format.js';
|
|
13
14
|
import { DEFAULT_FIELDS_PAGES_LIST, projectFields, projectedFieldsEcho, projectionFeedback, } from '../sparse-fields.js';
|
|
@@ -58,7 +59,7 @@ export async function handlePagesList(client, { fields }) {
|
|
|
58
59
|
// ─── page_get_layout ────────────────────────────────────────────────
|
|
59
60
|
export async function handlePageGetLayout(client, { template_id, flat, fields }) {
|
|
60
61
|
try {
|
|
61
|
-
const data = await client.get(`/pages/${
|
|
62
|
+
const data = await client.get(`/pages/${encodeTemplateId(template_id)}/layout`);
|
|
62
63
|
if (flat !== true) {
|
|
63
64
|
// Default: nested passthrough — unchanged from pre-G.3.
|
|
64
65
|
return jsonResult(data);
|
|
@@ -67,22 +68,61 @@ export async function handlePageGetLayout(client, { template_id, flat, fields })
|
|
|
67
68
|
// pickFields per element when `fields[]` was passed; echo the
|
|
68
69
|
// projection so the AI knows the per-item shape it received.
|
|
69
70
|
//
|
|
70
|
-
//
|
|
71
|
-
//
|
|
72
|
-
//
|
|
73
|
-
//
|
|
74
|
-
//
|
|
75
|
-
//
|
|
76
|
-
//
|
|
77
|
-
//
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
71
|
+
// Two distinct envelope shapes reach this handler — both must
|
|
72
|
+
// flatten to the same element list:
|
|
73
|
+
//
|
|
74
|
+
// (A) Theme templates: `data.layout = {name, layout:
|
|
75
|
+
// {0:{...},1:{...}}, ...}` — the actual children live
|
|
76
|
+
// under the INNER `layout` field, keyed by stringified
|
|
77
|
+
// indices. F-208 (Audit 2026-05-26) fix descended one
|
|
78
|
+
// extra hop here so paths anchored on `/layout/0` rather
|
|
79
|
+
// than the double-prefixed `/layout/layout/0`.
|
|
80
|
+
//
|
|
81
|
+
// (B) Per-page templates (Wave-9 F7 fix, 2026-05-29): cold-AI
|
|
82
|
+
// #8 reported `elements:[]` for a non-empty per-page
|
|
83
|
+
// template. Root cause: per-page layouts come from
|
|
84
|
+
// PerPageLayoutEncoder which decodes to the BARE node
|
|
85
|
+
// tree `{type:'layout', children:[{...},{...}]}` — there
|
|
86
|
+
// is NO outer `{name, layout:{...}}` wrapper. The
|
|
87
|
+
// previous envelope-detect only triggered on the inner
|
|
88
|
+
// `layout` key, so for per-page it fell through to
|
|
89
|
+
// walking `data.layout` directly, where flattenLayout
|
|
90
|
+
// iterates top-level entries (`['type', 'layout']` +
|
|
91
|
+
// `['children', [...]]`) and emits nothing — neither
|
|
92
|
+
// entry is a valid element node.
|
|
93
|
+
//
|
|
94
|
+
// Per-page detection: a node with `type === 'layout'` and
|
|
95
|
+
// an array `children`. Pass its `.children` array to
|
|
96
|
+
// flattenLayout so the walker iterates the real elements
|
|
97
|
+
// (and paths anchor on `/layout/0`, `/layout/1`, ... so
|
|
98
|
+
// cold agents can copy them into element_path without
|
|
99
|
+
// further bookkeeping).
|
|
100
|
+
const dataLayout = data.layout;
|
|
101
|
+
const isObjectNode = dataLayout !== null &&
|
|
102
|
+
typeof dataLayout === 'object' &&
|
|
103
|
+
!Array.isArray(dataLayout);
|
|
104
|
+
const layoutObj = isObjectNode ? dataLayout : null;
|
|
105
|
+
const hasInnerLayoutField = layoutObj !== null &&
|
|
106
|
+
'layout' in layoutObj &&
|
|
107
|
+
layoutObj.layout !== null &&
|
|
108
|
+
typeof layoutObj.layout === 'object';
|
|
109
|
+
const isPerPageRootNode = layoutObj !== null &&
|
|
110
|
+
layoutObj.type === 'layout' &&
|
|
111
|
+
Array.isArray(layoutObj.children);
|
|
112
|
+
let layoutRoot;
|
|
113
|
+
if (hasInnerLayoutField) {
|
|
114
|
+
// Shape (A) — theme template envelope.
|
|
115
|
+
layoutRoot = layoutObj.layout;
|
|
116
|
+
}
|
|
117
|
+
else if (isPerPageRootNode) {
|
|
118
|
+
// Shape (B) — per-page bare-layout-node. Iterate children
|
|
119
|
+
// directly so the walker sees real element nodes.
|
|
120
|
+
layoutRoot = layoutObj.children;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
// Back-compat: assume already in walkable form.
|
|
124
|
+
layoutRoot = dataLayout;
|
|
125
|
+
}
|
|
86
126
|
const flatElements = flattenLayout(layoutRoot);
|
|
87
127
|
const projected = projectFields(flatElements, fields,
|
|
88
128
|
// No default-set on layout.flat: keep "all" semantics
|
|
@@ -117,7 +157,7 @@ export async function handlePageGetLayout(client, { template_id, flat, fields })
|
|
|
117
157
|
// ─── page_get_schema ────────────────────────────────────────────────
|
|
118
158
|
export async function handlePageGetSchema(client, { template_id }) {
|
|
119
159
|
try {
|
|
120
|
-
const data = await client.get(`/pages/${
|
|
160
|
+
const data = await client.get(`/pages/${encodeTemplateId(template_id)}/schema`);
|
|
121
161
|
const rawNodes = Array.isArray(data.nodes) ? data.nodes : [];
|
|
122
162
|
const items = buildSchemaRows(rawNodes.filter((x) => x !== null && typeof x === 'object'));
|
|
123
163
|
// Templates routinely exceed 21 nodes (a typical home page has
|
|
@@ -182,15 +222,32 @@ export async function handleGetEtag(client) {
|
|
|
182
222
|
*/
|
|
183
223
|
export async function handleTemplateSummary(client, { template_id }) {
|
|
184
224
|
try {
|
|
185
|
-
const data = await client.get(`/pages/${
|
|
225
|
+
const data = await client.get(`/pages/${encodeTemplateId(template_id)}/summary`);
|
|
186
226
|
// F-AUDIT-2 (2026-05-26): template_summary now declares
|
|
187
227
|
// TEMPLATE_SUMMARY_OUTPUT_SCHEMA. The SDK requires
|
|
188
228
|
// `structuredContent` when an outputSchema is present, otherwise
|
|
189
229
|
// it raises `-32602 Output validation error`. Wrap the raw body
|
|
190
230
|
// with `structuredResult` so the text leg (LLM-readable JSON)
|
|
191
231
|
// stays unchanged AND the structuredContent leg validates.
|
|
192
|
-
|
|
193
|
-
|
|
232
|
+
//
|
|
233
|
+
// Task #46 Friction-3 (2026-05-29): PHP's `json_encode([])` emits
|
|
234
|
+
// `[]` (array) — not `{}` (object). The REST handler emits
|
|
235
|
+
// `counts_by_type: []` for empty templates, but the outputSchema
|
|
236
|
+
// declares `z.record(z.string(), z.number())` which requires an
|
|
237
|
+
// object. The mismatch surfaces as `-32602 counts_by_type
|
|
238
|
+
// expected record, received array`, swallowing the entire response
|
|
239
|
+
// for any empty / freshly-created template. Normalize array→object
|
|
240
|
+
// here so the schema validates and the agent sees the (valid,
|
|
241
|
+
// empty) summary. Same defensive shape applies to any future
|
|
242
|
+
// map-typed REST field that might come back empty.
|
|
243
|
+
const normalized = {
|
|
244
|
+
...data,
|
|
245
|
+
};
|
|
246
|
+
if (Array.isArray(normalized.counts_by_type)) {
|
|
247
|
+
normalized.counts_by_type = {};
|
|
248
|
+
}
|
|
249
|
+
const toolkitResult = jsonResult(normalized);
|
|
250
|
+
return structuredResult({ content: toolkitResult.content }, normalized);
|
|
194
251
|
}
|
|
195
252
|
catch (e) {
|
|
196
253
|
return errorResult({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers-read.js","sourceRoot":"","sources":["../../../src/tools/pages/handlers-read.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"handlers-read.js","sourceRoot":"","sources":["../../../src/tools/pages/handlers-read.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Page-tool WRITE handlers — `page_save`, `page_publish
|
|
3
|
-
* the 3-phase progress contract
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* boundary, not the
|
|
2
|
+
* Page-tool WRITE handlers — `page_save`, `page_publish`, `pages_create`,
|
|
3
|
+
* `pages_delete`. All implement the 3-phase progress contract
|
|
4
|
+
* (PHASE_SEND → PHASE_SERVER → PHASE_CONFIRM). PHASE_SERVER is emitted
|
|
5
|
+
* BEFORE the await so the synthetic intermediate fires even when the
|
|
6
|
+
* REST call ultimately errors — the dispatch IS the boundary, not the
|
|
7
|
+
* response.
|
|
7
8
|
*
|
|
8
9
|
* Split out of `src/tools/pages.ts` (Round-2 R2-A2-CRIT1).
|
|
10
|
+
* Extended with pages_create / pages_delete (v1.2 — C2 + C3).
|
|
9
11
|
*
|
|
10
12
|
* @license MIT
|
|
11
13
|
*/
|
|
12
|
-
import type
|
|
14
|
+
import { type RestClient } from '../../client.js';
|
|
13
15
|
import { type HandlerExtra, type ToolResult } from '../tool-builder.js';
|
|
14
16
|
interface SavePublishInput {
|
|
15
17
|
template_id: string;
|
|
@@ -17,5 +19,45 @@ interface SavePublishInput {
|
|
|
17
19
|
}
|
|
18
20
|
export declare function handlePageSave(client: RestClient, { template_id, etag }: SavePublishInput, extra?: HandlerExtra): Promise<ToolResult>;
|
|
19
21
|
export declare function handlePagePublish(client: RestClient, { template_id, etag }: SavePublishInput, extra?: HandlerExtra): Promise<ToolResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Input shape for the `pages_create` handler. Mirrors the Zod schema
|
|
24
|
+
* `PAGES_CREATE_INPUT` in `./schemas.ts` — kept as a structural
|
|
25
|
+
* `interface` here so the handler has no runtime Zod dependency and
|
|
26
|
+
* accepts whatever the MCP harness has already validated.
|
|
27
|
+
*/
|
|
28
|
+
interface PagesCreateInput {
|
|
29
|
+
readonly title: string;
|
|
30
|
+
readonly slug?: string;
|
|
31
|
+
readonly status?: 'publish' | 'draft' | 'pending' | 'private' | 'future';
|
|
32
|
+
readonly layout?: Record<string, unknown>;
|
|
33
|
+
readonly dry_run?: boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* `pages_create` — POST `/pages` with the provided body. On
|
|
37
|
+
* `dry_run:true`, the REST handler runs validation Layers 1+2+4
|
|
38
|
+
* without persisting and returns a dry-run report. On non-dry-run
|
|
39
|
+
* success, the REST handler returns 201 with the wire shape of
|
|
40
|
+
* `PAGES_CREATE_OUTPUT_SCHEMA`.
|
|
41
|
+
*/
|
|
42
|
+
export declare function handlePagesCreate(client: RestClient, input: PagesCreateInput, extra?: HandlerExtra): Promise<ToolResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Input shape for the `pages_delete` handler. Mirrors the Zod schema
|
|
45
|
+
* `PAGES_DELETE_INPUT` in `./schemas.ts`. `confirm` is `true` literal —
|
|
46
|
+
* the MCP boundary rejects requests without `confirm:true` before they
|
|
47
|
+
* ever reach this handler.
|
|
48
|
+
*/
|
|
49
|
+
interface PagesDeleteInput {
|
|
50
|
+
readonly post_id: number;
|
|
51
|
+
readonly confirm: true;
|
|
52
|
+
readonly force?: boolean;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* `pages_delete` — DELETE `/pages/{post_id}` with confirm + force in the
|
|
56
|
+
* body. `force:false` (default) trashes via `wp_delete_post(false)`
|
|
57
|
+
* (recoverable via wp-admin). `force:true` hard-deletes the post
|
|
58
|
+
* (irrecoverable). The REST handler returns 200 with the wire shape of
|
|
59
|
+
* `PAGES_DELETE_OUTPUT_SCHEMA` on success.
|
|
60
|
+
*/
|
|
61
|
+
export declare function handlePagesDelete(client: RestClient, input: PagesDeleteInput, extra?: HandlerExtra): Promise<ToolResult>;
|
|
20
62
|
export {};
|
|
21
63
|
//# sourceMappingURL=handlers-write.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers-write.d.ts","sourceRoot":"","sources":["../../../src/tools/pages/handlers-write.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"handlers-write.d.ts","sourceRoot":"","sources":["../../../src/tools/pages/handlers-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEpE,OAAO,EAKH,KAAK,YAAY,EACjB,KAAK,UAAU,EAClB,MAAM,oBAAoB,CAAC;AAE5B,UAAU,gBAAgB;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAID,wBAAsB,cAAc,CAChC,MAAM,EAAE,UAAU,EAClB,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,gBAAgB,EACvC,KAAK,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,UAAU,CAAC,CAoBrB;AAID,wBAAsB,iBAAiB,CACnC,MAAM,EAAE,UAAU,EAClB,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,gBAAgB,EACvC,KAAK,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,UAAU,CAAC,CAoBrB;AAID;;;;;GAKG;AACH,UAAU,gBAAgB;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACnC,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,gBAAgB,EACvB,KAAK,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,UAAU,CAAC,CAuBrB;AAID;;;;;GAKG;AACH,UAAU,gBAAgB;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACnC,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,gBAAgB,EACvB,KAAK,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,UAAU,CAAC,CAuCrB"}
|
|
@@ -1,23 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Page-tool WRITE handlers — `page_save`, `page_publish
|
|
3
|
-
* the 3-phase progress contract
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* boundary, not the
|
|
2
|
+
* Page-tool WRITE handlers — `page_save`, `page_publish`, `pages_create`,
|
|
3
|
+
* `pages_delete`. All implement the 3-phase progress contract
|
|
4
|
+
* (PHASE_SEND → PHASE_SERVER → PHASE_CONFIRM). PHASE_SERVER is emitted
|
|
5
|
+
* BEFORE the await so the synthetic intermediate fires even when the
|
|
6
|
+
* REST call ultimately errors — the dispatch IS the boundary, not the
|
|
7
|
+
* response.
|
|
7
8
|
*
|
|
8
9
|
* Split out of `src/tools/pages.ts` (Round-2 R2-A2-CRIT1).
|
|
10
|
+
* Extended with pages_create / pages_delete (v1.2 — C2 + C3).
|
|
9
11
|
*
|
|
10
12
|
* @license MIT
|
|
11
13
|
*/
|
|
14
|
+
import { encodeTemplateId } from '../../client.js';
|
|
12
15
|
import { PHASE_CONFIRM, PHASE_SEND, PHASE_SERVER } from '../progress-phases.js';
|
|
13
|
-
import { createProgressReporter, errorResult, jsonResult, } from '../tool-builder.js';
|
|
16
|
+
import { createProgressReporter, errorResult, jsonResult, structuredResult, } from '../tool-builder.js';
|
|
14
17
|
// ─── page_save ──────────────────────────────────────────────────────
|
|
15
18
|
export async function handlePageSave(client, { template_id, etag }, extra) {
|
|
16
19
|
const progress = extra ? createProgressReporter(extra) : null;
|
|
17
20
|
await progress?.report(0, 3, PHASE_SEND);
|
|
18
21
|
await progress?.report(1, 3, PHASE_SERVER);
|
|
19
22
|
try {
|
|
20
|
-
const data = await client.post(`/pages/${
|
|
23
|
+
const data = await client.post(`/pages/${encodeTemplateId(template_id)}/save`, { etag });
|
|
21
24
|
await progress?.report(2, 3, PHASE_CONFIRM);
|
|
22
25
|
return jsonResult(data);
|
|
23
26
|
}
|
|
@@ -36,7 +39,7 @@ export async function handlePagePublish(client, { template_id, etag }, extra) {
|
|
|
36
39
|
await progress?.report(0, 3, PHASE_SEND);
|
|
37
40
|
await progress?.report(1, 3, PHASE_SERVER);
|
|
38
41
|
try {
|
|
39
|
-
const data = await client.post(`/pages/${
|
|
42
|
+
const data = await client.post(`/pages/${encodeTemplateId(template_id)}/publish`, { etag });
|
|
40
43
|
await progress?.report(2, 3, PHASE_CONFIRM);
|
|
41
44
|
return jsonResult(data);
|
|
42
45
|
}
|
|
@@ -49,4 +52,76 @@ export async function handlePagePublish(client, { template_id, etag }, extra) {
|
|
|
49
52
|
});
|
|
50
53
|
}
|
|
51
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* `pages_create` — POST `/pages` with the provided body. On
|
|
57
|
+
* `dry_run:true`, the REST handler runs validation Layers 1+2+4
|
|
58
|
+
* without persisting and returns a dry-run report. On non-dry-run
|
|
59
|
+
* success, the REST handler returns 201 with the wire shape of
|
|
60
|
+
* `PAGES_CREATE_OUTPUT_SCHEMA`.
|
|
61
|
+
*/
|
|
62
|
+
export async function handlePagesCreate(client, input, extra) {
|
|
63
|
+
const progress = extra ? createProgressReporter(extra) : null;
|
|
64
|
+
await progress?.report(0, 3, PHASE_SEND);
|
|
65
|
+
await progress?.report(1, 3, PHASE_SERVER);
|
|
66
|
+
try {
|
|
67
|
+
const data = await client.post('/pages', { body: input });
|
|
68
|
+
await progress?.report(2, 3, PHASE_CONFIRM);
|
|
69
|
+
return jsonResult(data);
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
return errorResult({
|
|
73
|
+
error: e,
|
|
74
|
+
context: {
|
|
75
|
+
title: input.title,
|
|
76
|
+
slug: input.slug,
|
|
77
|
+
dry_run: input.dry_run ?? false,
|
|
78
|
+
},
|
|
79
|
+
hint: 'Common issues: missing title (400), unknown element type in layout ' +
|
|
80
|
+
'(422), Builder pre-check failed (422 dry-run or wet), post_type other ' +
|
|
81
|
+
'than "page" (403). For dry-run: re-submit without dry_run:true to ' +
|
|
82
|
+
'actually create.',
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* `pages_delete` — DELETE `/pages/{post_id}` with confirm + force in the
|
|
88
|
+
* body. `force:false` (default) trashes via `wp_delete_post(false)`
|
|
89
|
+
* (recoverable via wp-admin). `force:true` hard-deletes the post
|
|
90
|
+
* (irrecoverable). The REST handler returns 200 with the wire shape of
|
|
91
|
+
* `PAGES_DELETE_OUTPUT_SCHEMA` on success.
|
|
92
|
+
*/
|
|
93
|
+
export async function handlePagesDelete(client, input, extra) {
|
|
94
|
+
const progress = extra ? createProgressReporter(extra) : null;
|
|
95
|
+
await progress?.report(0, 3, PHASE_SEND);
|
|
96
|
+
await progress?.report(1, 3, PHASE_SERVER);
|
|
97
|
+
try {
|
|
98
|
+
const data = await client.delete(`/pages/${encodeURIComponent(String(input.post_id))}`, {
|
|
99
|
+
body: {
|
|
100
|
+
confirm: input.confirm,
|
|
101
|
+
force: input.force ?? false,
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
await progress?.report(2, 3, PHASE_CONFIRM);
|
|
105
|
+
// Task #38 (2026-05-29): pages_delete declares
|
|
106
|
+
// `outputSchema: PAGES_DELETE_OUTPUT_SCHEMA` in builders.ts. The
|
|
107
|
+
// host therefore validates `structuredContent` and rejects with
|
|
108
|
+
// `-32602 Output validation error` when it is missing. Use
|
|
109
|
+
// `structuredResult` (mirrors handlePagesList et al.) so the
|
|
110
|
+
// text leg stays LLM-readable AND the structured leg validates.
|
|
111
|
+
const toolkitResult = jsonResult(data);
|
|
112
|
+
return structuredResult({ content: toolkitResult.content }, data);
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
return errorResult({
|
|
116
|
+
error: e,
|
|
117
|
+
context: {
|
|
118
|
+
post_id: input.post_id,
|
|
119
|
+
force: input.force ?? false,
|
|
120
|
+
},
|
|
121
|
+
hint: 'Common issues: missing confirm:true (400), unknown post id (404), ' +
|
|
122
|
+
'post_type other than "page" (403). For permanent delete pass ' +
|
|
123
|
+
'force:true; default is trash (recoverable via wp-admin).',
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
52
127
|
//# sourceMappingURL=handlers-write.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers-write.js","sourceRoot":"","sources":["../../../src/tools/pages/handlers-write.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"handlers-write.js","sourceRoot":"","sources":["../../../src/tools/pages/handlers-write.ts"],"names":[],"mappings":"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"}
|