elementor-mcp-agent 1.2.0 → 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 +26 -0
- package/dist/server.js +10 -0
- package/dist/server.js.map +1 -1
- package/package.json +13 -7
- package/scripts/fetch-elementor-docs.ts +26 -0
- package/scripts/postinstall.cjs +64 -0
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/throttle/token-bucket.ts","../src/api/errors.ts","../src/utils/logger.ts","../src/api/wp-rest.ts","../src/transport/ssh-wpcli.ts","../src/elementor/backup.ts","../src/elementor/css-flush.ts","../src/elementor/policies.ts","../src/utils/confirmation.ts","../src/server.ts","../src/tools/sites.ts","../src/types/tool.ts","../src/tools/pages.ts","../src/elementor/data-parser.ts","../src/elementor/validator.ts","../src/elementor/globals.ts","../src/tools/templates.ts","../src/tools/wpcli.ts","../src/tools/visual.ts","../src/transport/screenshot.ts","../src/tools/updates.ts","../src/tools/widgets.ts","../src/elementor/widget-ops.ts","../src/elementor/verify.ts","../src/tools/bulk.ts","../src/tools/index.ts","../src/resources/index.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { z } from \"zod\";\n\nconst SiteSchema = z.object({\n id: z.string().min(1, \"site id required\"),\n url: z.string().url(\"invalid site url\"),\n username: z.string().min(1),\n application_password: z.string().min(20, \"WP application password should be ~24 chars\"),\n ssh: z\n .object({\n host: z.string(),\n user: z.string(),\n port: z.coerce.number().int().min(1).max(65535).default(22),\n path: z.string().describe(\"WP root path on remote, e.g. ~/sites/example.com\"),\n key_path: z.string().optional().describe(\"absolute path to private key\"),\n wp_cli_path: z.string().optional().describe(\"Explicit wp-cli invocation prefix. Examples: 'wp' (default, if wp is in PATH), 'php ~/bin/wp.phar', '/usr/local/bin/wp'. Auto-detected if omitted.\"),\n })\n .optional(),\n});\n\nconst ConfigSchema = z.object({\n sites: z.array(SiteSchema).min(1, \"at least one site is required\"),\n default_site_id: z.string().optional(),\n rate_limit_per_minute: z.coerce.number().int().min(1).max(600).default(60),\n confirmation_ttl_seconds: z.coerce.number().int().min(10).max(600).default(60),\n log_level: z.enum([\"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\", \"silent\"]).default(\"info\"),\n});\n\nexport type Site = z.infer<typeof SiteSchema>;\nexport type Config = z.infer<typeof ConfigSchema>;\n\nlet cached: Config | null = null;\n\n/**\n * Loads configuration from environment.\n *\n * Two supported formats:\n * 1) ELEMENTOR_MCP_SITES — JSON array of Site objects (recommended)\n * 2) ELEMENTOR_MCP_CONFIG_PATH — path to a JSON file containing {sites: [...], ...}\n *\n * Plus optional env vars: ELEMENTOR_MCP_DEFAULT_SITE_ID, ELEMENTOR_MCP_RATE_LIMIT,\n * ELEMENTOR_MCP_CONFIRMATION_TTL, LOG_LEVEL.\n */\nexport function loadConfig(): Config {\n if (cached) return cached;\n\n let raw: unknown;\n if (process.env.ELEMENTOR_MCP_SITES) {\n try {\n raw = { sites: JSON.parse(process.env.ELEMENTOR_MCP_SITES) };\n } catch (e) {\n throw new Error(\"ELEMENTOR_MCP_SITES must be valid JSON: \" + (e as Error).message);\n }\n } else if (process.env.ELEMENTOR_MCP_CONFIG_PATH) {\n try {\n raw = JSON.parse(readFileSync(process.env.ELEMENTOR_MCP_CONFIG_PATH, \"utf8\"));\n } catch (e) {\n throw new Error(\"Cannot read ELEMENTOR_MCP_CONFIG_PATH: \" + (e as Error).message);\n }\n } else {\n throw new Error(\n [\n \"No site configuration provided.\",\n \"\",\n \"How to set it up:\",\n \" • Easiest: set ELEMENTOR_MCP_SITES to a JSON array of sites. Example:\",\n ' ELEMENTOR_MCP_SITES=\\'[{\"id\":\"my-site\",\"url\":\"https://example.com\",',\n ' \"username\":\"admin\",\"application_password\":\"xxxx xxxx xxxx xxxx xxxx xxxx\"}]\\'',\n \"\",\n \" • Or: set ELEMENTOR_MCP_CONFIG_PATH to a JSON file with the same structure.\",\n \"\",\n \"Get a WordPress Application Password at:\",\n \" https://{your-site}/wp-admin/profile.php#application-passwords-section\",\n \"\",\n \"Full docs: https://github.com/Mogacode-ma/elementor-mcp-agent#configure\",\n ].join(\"\\n\"),\n );\n }\n\n const r = raw as Record<string, unknown>;\n const merged = {\n sites: (r.sites as unknown) ?? [],\n default_site_id: r.default_site_id ?? process.env.ELEMENTOR_MCP_DEFAULT_SITE_ID,\n rate_limit_per_minute:\n r.rate_limit_per_minute ?? process.env.ELEMENTOR_MCP_RATE_LIMIT ?? undefined,\n confirmation_ttl_seconds:\n r.confirmation_ttl_seconds ?? process.env.ELEMENTOR_MCP_CONFIRMATION_TTL ?? undefined,\n log_level: r.log_level ?? process.env.LOG_LEVEL ?? undefined,\n };\n\n const parsed = ConfigSchema.safeParse(merged);\n if (!parsed.success) {\n const issues = parsed.error.issues\n .map((i) => ` - ${i.path.join(\".\")}: ${i.message}`)\n .join(\"\\n\");\n throw new Error(\n [\n \"Invalid configuration — required values missing or malformed:\",\n issues,\n \"\",\n \"See https://github.com/Mogacode-ma/elementor-mcp-agent#configure\",\n ].join(\"\\n\"),\n );\n }\n cached = parsed.data;\n return cached;\n}\n\nexport function _resetConfigCache(): void {\n cached = null;\n}\n\nexport function getSite(siteId?: string): Site {\n const cfg = loadConfig();\n if (!siteId) {\n const def = cfg.default_site_id ?? cfg.sites[0]?.id;\n if (!def) throw new Error(\"No site configured\");\n const s = cfg.sites.find((x) => x.id === def);\n if (!s) throw new Error(`Default site '${def}' not found in sites list`);\n return s;\n }\n const s = cfg.sites.find((x) => x.id === siteId);\n if (!s) {\n const available = cfg.sites.map((x) => x.id).join(\", \");\n throw new Error(`Site '${siteId}' not found. Available: ${available}`);\n }\n return s;\n}\n","/**\n * Per-site token bucket so we don't hammer a WordPress install.\n * Default 60 req/min — most managed hosts (incl. Infomaniak) start throttling\n * around that rate on the wp-json endpoint.\n */\nexport class TokenBucket {\n private tokens: number;\n private lastRefill = Date.now();\n private readonly refillPerMs: number;\n\n constructor(private readonly capacityPerMinute: number) {\n this.tokens = capacityPerMinute;\n this.refillPerMs = capacityPerMinute / 60_000;\n }\n\n async acquire(): Promise<void> {\n while (this.tokens < 1) {\n this.refill();\n if (this.tokens < 1) await new Promise((r) => setTimeout(r, 80));\n }\n this.tokens -= 1;\n }\n\n private refill(): void {\n const now = Date.now();\n this.tokens = Math.min(\n this.capacityPerMinute,\n this.tokens + (now - this.lastRefill) * this.refillPerMs,\n );\n this.lastRefill = now;\n }\n\n get available(): number {\n this.refill();\n return Math.floor(this.tokens);\n }\n}\n\nconst buckets = new Map<string, TokenBucket>();\nexport function bucketFor(siteId: string, perMinute: number): TokenBucket {\n let b = buckets.get(siteId);\n if (!b) {\n b = new TokenBucket(perMinute);\n buckets.set(siteId, b);\n }\n return b;\n}\n","export type WPErrorKind = \"auth\" | \"not_found\" | \"validation\" | \"rate_limited\" | \"server\" | \"network\" | \"unknown\";\n\nexport class WPError extends Error {\n constructor(\n public readonly kind: WPErrorKind,\n public readonly code: string,\n message: string,\n public readonly raw?: unknown,\n ) {\n super(message);\n this.name = \"WPError\";\n }\n}\n\nexport function fromHttp(status: number, body: unknown, fallback = \"WordPress API error\"): WPError {\n const raw = body as Record<string, unknown> | undefined;\n const code = (raw?.code as string) ?? `http_${status}`;\n const msg = (raw?.message as string) ?? fallback;\n let kind: WPErrorKind = \"unknown\";\n if (status === 401 || status === 403) kind = \"auth\";\n else if (status === 404) kind = \"not_found\";\n else if (status === 422 || status === 400) kind = \"validation\";\n else if (status === 429) kind = \"rate_limited\";\n else if (status >= 500) kind = \"server\";\n return new WPError(kind, code, msg, body);\n}\n","import pino from \"pino\";\n\nexport const logger = pino(\n {\n level: process.env.LOG_LEVEL ?? \"info\",\n base: { name: \"elementor-mcp-agent\" },\n },\n // Critical: stdout is reserved for MCP JSON-RPC. All logs MUST go to stderr.\n pino.destination(2),\n);\n","import { loadConfig, getSite, Site } from \"../config.js\";\nimport { bucketFor } from \"../throttle/token-bucket.js\";\nimport { fromHttp, WPError } from \"./errors.js\";\nimport { logger } from \"../utils/logger.js\";\n\nfunction authHeader(site: Site): string {\n const encoded = Buffer.from(`${site.username}:${site.application_password}`).toString(\"base64\");\n return `Basic ${encoded}`;\n}\n\nexport interface RequestOptions {\n siteId?: string;\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n headers?: Record<string, string>;\n method?: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n}\n\nexport async function wpRequest<T = unknown>(\n path: string,\n opts: RequestOptions = {},\n): Promise<T> {\n const cfg = loadConfig();\n const site = getSite(opts.siteId);\n await bucketFor(site.id, cfg.rate_limit_per_minute).acquire();\n\n const url = new URL(path.startsWith(\"http\") ? path : `${site.url.replace(/\\/$/, \"\")}/wp-json${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`);\n if (opts.query) {\n for (const [k, v] of Object.entries(opts.query)) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n }\n\n const method = opts.method ?? (opts.body ? \"POST\" : \"GET\");\n const headers: Record<string, string> = {\n Authorization: authHeader(site),\n Accept: \"application/json\",\n \"User-Agent\": \"elementor-mcp-agent\",\n ...(opts.headers ?? {}),\n };\n if (opts.body && !headers[\"Content-Type\"]) headers[\"Content-Type\"] = \"application/json\";\n\n logger.debug({ method, url: url.toString(), site_id: site.id }, \"wp request\");\n\n let res: Response;\n try {\n res = await fetch(url.toString(), {\n method,\n headers,\n body: opts.body ? JSON.stringify(opts.body) : undefined,\n });\n } catch (e) {\n throw new WPError(\"network\", \"fetch_failed\", `Network error: ${(e as Error).message}`, e);\n }\n\n const text = await res.text();\n let parsed: unknown = text;\n if (text && (res.headers.get(\"content-type\") ?? \"\").includes(\"application/json\")) {\n try {\n parsed = JSON.parse(text);\n } catch {\n // fall through with raw text\n }\n }\n\n if (!res.ok) {\n throw fromHttp(res.status, parsed);\n }\n return parsed as T;\n}\n","import { spawn } from \"node:child_process\";\nimport { logger } from \"../utils/logger.js\";\nimport type { Site } from \"../config.js\";\n\nexport interface WpCliResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n duration_ms: number;\n command: string;\n}\n\nconst wpCliPathCache = new Map<string, string>();\n\nasync function detectWpCliPath(site: Site, sshOpts: string[]): Promise<string> {\n if (site.ssh?.wp_cli_path) return site.ssh.wp_cli_path;\n const cached = wpCliPathCache.get(site.id);\n if (cached) return cached;\n // Try a probe command: which wp || ls ~/bin/wp.phar || ls ~/wp-cli.phar\n const probe = `command -v wp 2>/dev/null && echo wp || (test -f \"$HOME/bin/wp.phar\" && echo \"php $HOME/bin/wp.phar\") || (test -f \"$HOME/wp-cli.phar\" && echo \"php $HOME/wp-cli.phar\") || echo NONE`;\n const { spawn } = await import(\"node:child_process\");\n const result = await new Promise<string>((resolve) => {\n const child = spawn(\"ssh\", [...sshOpts, `${site.ssh!.user}@${site.ssh!.host}`, probe], { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let out = \"\";\n child.stdout.on(\"data\", (b: Buffer) => { out += b.toString(); });\n child.on(\"close\", () => resolve(out.trim().split(\"\\n\").pop() ?? \"NONE\"));\n });\n const detected = result === \"NONE\" ? \"wp\" : result;\n wpCliPathCache.set(site.id, detected);\n return detected;\n}\n\nexport async function sshWpCli(site: Site, wpArgs: string, opts: { timeout_ms?: number } = {}): Promise<WpCliResult> {\n if (!site.ssh) {\n throw new Error(\n `Site '${site.id}' has no SSH configuration. WP-CLI tools require SSH access. ` +\n `Add an \"ssh\" object to the site config with at least {host, user, path}.`,\n );\n }\n const { host, user, port, path: wpPath, key_path } = site.ssh;\n const timeout = opts.timeout_ms ?? 60_000;\n\n const sshArgs = [\n \"-o\", \"StrictHostKeyChecking=no\",\n \"-o\", \"BatchMode=yes\",\n \"-o\", `ConnectTimeout=${Math.min(15, Math.floor(timeout / 1000))}`,\n \"-p\", String(port ?? 22),\n ];\n if (key_path) sshArgs.push(\"-i\", key_path);\n\n const wpCmd = await detectWpCliPath(site, sshArgs);\n sshArgs.push(`${user}@${host}`);\n const remoteCmd = `${wpCmd} --path=${shellEscape(wpPath)} ${wpArgs}`;\n sshArgs.push(remoteCmd);\n\n logger.debug({ site_id: site.id, cmd: remoteCmd }, \"ssh wp-cli\");\n const t0 = Date.now();\n\n return new Promise<WpCliResult>((resolve, reject) => {\n const child = spawn(\"ssh\", sshArgs, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n const killer = setTimeout(() => {\n child.kill(\"SIGKILL\");\n reject(new Error(`SSH wp-cli timed out after ${timeout}ms: ${remoteCmd}`));\n }, timeout);\n child.stdout.on(\"data\", (b: Buffer) => { stdout += b.toString(); });\n child.stderr.on(\"data\", (b: Buffer) => { stderr += b.toString(); });\n child.on(\"error\", (e) => { clearTimeout(killer); reject(e); });\n child.on(\"close\", (code) => {\n clearTimeout(killer);\n const duration_ms = Date.now() - t0;\n // Filter out non-error SSH banner warnings that pollute stderr (e.g. post-quantum advisory)\n const cleanedStderr = stderr.split(\"\\n\").filter((l) => !l.includes(\"post-quantum\") && !l.includes(\"openssh.com/pq\") && !l.includes(\"decrypt later\") && !l.includes(\"This session may be\") && !l.includes(\"server may need to be\")).join(\"\\n\").trim();\n resolve({\n stdout: stdout.trim(),\n stderr: cleanedStderr,\n exitCode: code ?? -1,\n duration_ms,\n command: remoteCmd,\n });\n });\n });\n}\n\nfunction shellEscape(s: string): string {\n return `'${s.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nexport const DESTRUCTIVE_WPCLI_PATTERNS: RegExp[] = [\n /\\bdelete-all\\b/i,\n /\\bdelete\\b(?!.*--dry-run)/i,\n /\\bdrop\\b/i,\n /\\bdb\\s+(reset|drop)\\b/i,\n /\\bpost\\s+delete\\b/i,\n /\\boption\\s+delete\\b/i,\n /\\bplugin\\s+(deactivate|uninstall)\\b/i,\n /\\bsearch-replace\\b(?!.*--dry-run)/i,\n /\\buser\\s+delete\\b/i,\n];\n\nexport function isDestructiveWpCli(args: string): boolean {\n return DESTRUCTIVE_WPCLI_PATTERNS.some((p) => p.test(args));\n}\n","import { writeFileSync, mkdirSync, existsSync, readFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { wpRequest } from \"../api/wp-rest.js\";\nimport { sshWpCli } from \"../transport/ssh-wpcli.js\";\nimport { getSite } from \"../config.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst BACKUP_DIR = process.env.ELEMENTOR_MCP_BACKUP_DIR ?? join(tmpdir(), \"elementor-mcp-backups\");\n\nexport interface BackupResult {\n meta_key: string;\n page_settings_meta_key?: string;\n file_path?: string;\n size_bytes: number;\n method: \"wp-cli\" | \"file\" | \"rest\";\n}\n\n/**\n * Full backup of _elementor_data + _elementor_page_settings.\n *\n * Strategy (priorities):\n * 1) WP-CLI via SSH — always works, writes real postmeta even for unregistered keys\n * 2) File-based — if SSH unavailable, dump to /tmp/elementor-mcp-backups/\n * 3) REST PUT — only works if the meta key is registered with show_in_rest=true\n * (NOT the case for our timestamped backup keys → silent loss)\n *\n * REST is deliberately deprioritized because WP silently drops writes to\n * unregistered meta keys. We always prefer WP-CLI when available.\n */\nexport async function fullBackup(\n siteId: string | undefined,\n postId: number,\n opts: { to_file?: boolean; force_file_only?: boolean } = {},\n): Promise<BackupResult> {\n // Read current state via REST (works for the canonical Elementor keys)\n const current = await wpRequest<{ meta: Record<string, unknown>; title: { rendered: string } }>(\n `/wp/v2/pages/${postId}?context=edit&_fields=meta,title`,\n { siteId },\n );\n const data_raw_v = current.meta?._elementor_data;\n const data_raw = typeof data_raw_v === \"string\" ? data_raw_v : JSON.stringify(data_raw_v ?? []);\n const settings_raw_v = current.meta?._elementor_page_settings;\n const settings_raw = typeof settings_raw_v === \"string\" ? settings_raw_v : JSON.stringify(settings_raw_v ?? {});\n const ts = new Date().toISOString().replace(/[:.]/g, \"-\");\n const meta_key = `_elementor_data_backup_${ts}`;\n const page_settings_meta_key = `_elementor_page_settings_backup_${ts}`;\n const size_bytes = data_raw.length + settings_raw.length;\n\n const site = getSite(siteId);\n let method: BackupResult[\"method\"] = \"file\";\n\n // Strategy 1: WP-CLI postmeta write (preferred)\n if (site.ssh && !opts.force_file_only) {\n try {\n // wp post meta update uses positional args; we pipe the value via stdin to avoid shell quoting issues\n const setDataCmd = `post meta update ${postId} ${meta_key} ${shellQuote(data_raw)}`;\n const setSettingsCmd = `post meta update ${postId} ${page_settings_meta_key} ${shellQuote(settings_raw)}`;\n const r1 = await sshWpCli(site, setDataCmd, { timeout_ms: 30_000 });\n if (r1.exitCode !== 0) throw new Error(`wp-cli postmeta data set failed: ${r1.stderr}`);\n const r2 = await sshWpCli(site, setSettingsCmd, { timeout_ms: 30_000 });\n if (r2.exitCode !== 0) throw new Error(`wp-cli postmeta settings set failed: ${r2.stderr}`);\n method = \"wp-cli\";\n } catch (e) {\n logger.warn({ err: (e as Error).message }, \"WP-CLI backup failed, falling back to file\");\n }\n }\n\n // Strategy 2: File backup (always do it if requested OR if WP-CLI failed AND no postmeta was written)\n let file_path: string | undefined;\n if (opts.to_file || method !== \"wp-cli\") {\n if (!existsSync(BACKUP_DIR)) mkdirSync(BACKUP_DIR, { recursive: true });\n const safeSiteId = (siteId ?? \"default\").replace(/[^a-zA-Z0-9_-]/g, \"_\");\n const filename = `${safeSiteId}_page${postId}_${ts}.json`;\n file_path = join(BACKUP_DIR, filename);\n writeFileSync(file_path, JSON.stringify({\n site_id: siteId,\n page_id: postId,\n title: current.title.rendered,\n timestamp: ts,\n _elementor_data: data_raw,\n _elementor_page_settings: settings_raw,\n }, null, 2));\n if (method !== \"wp-cli\") method = \"file\";\n logger.info({ file_path }, \"backup written to file\");\n }\n\n return {\n meta_key,\n page_settings_meta_key,\n file_path,\n size_bytes,\n method,\n };\n}\n\n/**\n * Restore from a postmeta backup (created by fullBackup with WP-CLI strategy).\n * Uses WP-CLI to read the backup meta value (since REST won't expose it) and\n * then REST to write back the canonical _elementor_data.\n */\nexport async function restoreBackup(\n siteId: string | undefined,\n postId: number,\n data_meta_key: string,\n settings_meta_key?: string,\n): Promise<{ restored: boolean; method: \"wp-cli\" | \"rest\" }> {\n const site = getSite(siteId);\n if (!site.ssh) {\n throw new Error(\"Restoring from postmeta backup requires SSH (WP-CLI). For file backups, use restoreFromFile.\");\n }\n // Read backup value via WP-CLI\n const r1 = await sshWpCli(site, `post meta get ${postId} ${data_meta_key}`, { timeout_ms: 30_000 });\n if (r1.exitCode !== 0) throw new Error(`Backup '${data_meta_key}' not found: ${r1.stderr}`);\n const data_value = r1.stdout;\n if (!data_value) throw new Error(`Backup '${data_meta_key}' is empty`);\n\n let settings_value: string | undefined;\n if (settings_meta_key) {\n const r2 = await sshWpCli(site, `post meta get ${postId} ${settings_meta_key}`, { timeout_ms: 30_000 });\n if (r2.exitCode === 0 && r2.stdout) settings_value = r2.stdout;\n }\n\n // Write back via WP-CLI (so we don't depend on _elementor_data being REST-writable; it is, but consistency)\n const writeData = await sshWpCli(site, `post meta update ${postId} _elementor_data ${shellQuote(data_value)}`, { timeout_ms: 30_000 });\n if (writeData.exitCode !== 0) throw new Error(`Restore write failed: ${writeData.stderr}`);\n if (settings_value !== undefined) {\n await sshWpCli(site, `post meta update ${postId} _elementor_page_settings ${shellQuote(settings_value)}`, { timeout_ms: 30_000 });\n }\n return { restored: true, method: \"wp-cli\" };\n}\n\n/**\n * List backups on a page using WP-CLI (REST won't expose custom postmeta keys).\n */\nexport async function listBackups(\n siteId: string | undefined,\n postId: number,\n): Promise<Array<{ meta_key: string; settings_key?: string; timestamp: string }>> {\n const site = getSite(siteId);\n if (!site.ssh) {\n throw new Error(\"Listing postmeta backups requires SSH (WP-CLI). REST API doesn't expose unregistered custom postmeta keys.\");\n }\n const r = await sshWpCli(site, `post meta list ${postId} --format=json --fields=meta_key`, { timeout_ms: 30_000 });\n if (r.exitCode !== 0) throw new Error(`wp-cli post meta list failed: ${r.stderr}`);\n interface MetaKey { meta_key: string; }\n const all = JSON.parse(r.stdout) as MetaKey[];\n const dataBackupKeys = all.filter((m) => m.meta_key.startsWith(\"_elementor_data_backup_\"));\n const settingsBackupKeys = new Set(all.filter((m) => m.meta_key.startsWith(\"_elementor_page_settings_backup_\")).map((m) => m.meta_key));\n return dataBackupKeys.map((m) => {\n const ts = m.meta_key.replace(\"_elementor_data_backup_\", \"\");\n const expectedSettingsKey = `_elementor_page_settings_backup_${ts}`;\n return {\n meta_key: m.meta_key,\n settings_key: settingsBackupKeys.has(expectedSettingsKey) ? expectedSettingsKey : undefined,\n timestamp: ts,\n };\n });\n}\n\n/**\n * Restore from a file backup (output of fullBackup with to_file=true).\n * Uses WP-CLI if available, falls back to REST (works for _elementor_data which is registered).\n */\nexport async function restoreFromFile(\n siteId: string | undefined,\n postId: number,\n file_path: string,\n): Promise<{ restored: boolean; method: \"wp-cli\" | \"rest\" }> {\n if (!existsSync(file_path)) throw new Error(`Backup file not found: ${file_path}`);\n const j = JSON.parse(readFileSync(file_path, \"utf8\")) as {\n _elementor_data?: string;\n _elementor_page_settings?: string;\n };\n if (!j._elementor_data) throw new Error(\"Backup file missing _elementor_data\");\n\n const site = getSite(siteId);\n if (site.ssh) {\n await sshWpCli(site, `post meta update ${postId} _elementor_data ${shellQuote(j._elementor_data)}`, { timeout_ms: 30_000 });\n if (j._elementor_page_settings) {\n await sshWpCli(site, `post meta update ${postId} _elementor_page_settings ${shellQuote(j._elementor_page_settings)}`, { timeout_ms: 30_000 });\n }\n return { restored: true, method: \"wp-cli\" };\n }\n // REST fallback (works for _elementor_data, may silently no-op for _elementor_page_settings)\n await wpRequest(`/wp/v2/pages/${postId}`, {\n siteId, method: \"PUT\",\n body: {\n meta: {\n _elementor_data: j._elementor_data,\n ...(j._elementor_page_settings ? { _elementor_page_settings: j._elementor_page_settings } : {}),\n },\n },\n });\n return { restored: true, method: \"rest\" };\n}\n\nfunction shellQuote(s: string): string {\n return `'${s.replace(/'/g, \"'\\\\''\")}'`;\n}\n","import { wpRequest } from \"../api/wp-rest.js\";\nimport { sshWpCli } from \"../transport/ssh-wpcli.js\";\nimport { getSite } from \"../config.js\";\nimport { logger } from \"../utils/logger.js\";\n\nexport type FlushMethod = \"rest\" | \"wp-cli\" | \"option-delete\" | \"resave\" | \"none\";\n\nexport interface FlushResult {\n method: FlushMethod;\n details?: string;\n}\n\n/**\n * Flush Elementor CSS cache. Three-level fallback strategy:\n * 1) REST endpoint (newer Elementor versions)\n * 2) WP-CLI `wp elementor flush-css` (if SSH configured + plugin CLI extension installed)\n * 3) Manual option/meta delete via REST or WP-CLI\n * 4) Last resort: re-save the page (causes regen on next view)\n */\nexport async function flushCSS(\n siteId: string | undefined,\n postId?: number,\n): Promise<FlushResult> {\n // Strategy 1: REST endpoint\n try {\n const url = postId ? `/elementor/v1/css?id=${postId}&action=regenerate` : `/elementor/v1/css?action=regenerate`;\n await wpRequest(url, { siteId, method: \"POST\" });\n return { method: \"rest\" };\n } catch (e) {\n logger.debug({ err: (e as Error).message }, \"REST css flush failed, trying next\");\n }\n\n // Strategy 2: WP-CLI native command\n try {\n const site = getSite(siteId);\n if (site.ssh) {\n const r = await sshWpCli(site, \"elementor flush-css\");\n if (r.exitCode === 0) return { method: \"wp-cli\", details: r.stdout };\n }\n } catch (e) {\n logger.debug({ err: (e as Error).message }, \"WP-CLI css flush failed, trying next\");\n }\n\n // Strategy 3: option + post-meta delete via WP-CLI\n try {\n const site = getSite(siteId);\n if (site.ssh) {\n await sshWpCli(site, \"option delete _elementor_global_css\", { timeout_ms: 30_000 });\n await sshWpCli(site, \"post meta delete-all _elementor_css\", { timeout_ms: 30_000 });\n return { method: \"option-delete\" };\n }\n } catch (e) {\n logger.debug({ err: (e as Error).message }, \"WP-CLI option-delete failed, trying next\");\n }\n\n // Strategy 4: re-save the page to trigger regen\n if (postId) {\n try {\n await wpRequest(`/wp/v2/pages/${postId}`, {\n siteId,\n method: \"PUT\",\n body: { date: new Date().toISOString() },\n });\n return { method: \"resave\" };\n } catch (e) {\n logger.warn({ err: (e as Error).message }, \"Resave fallback also failed\");\n }\n }\n\n return { method: \"none\", details: \"All CSS flush strategies failed\" };\n}\n","/**\n * Hardcoded safety policies for the Elementor MCP.\n * These rules are intentionally inflexible — they encode lessons from real\n * production incidents on client sites.\n */\n\nexport const POLICIES = {\n // Always backup _elementor_data BEFORE any write\n BACKUP_BEFORE_WRITE: true,\n // Always backup _elementor_page_settings too (it carries page-level CSS, fonts, layout)\n BACKUP_PAGE_SETTINGS: true,\n // Re-validate the JSON after a programmatic edit; abort + auto-restore if invalid\n VALIDATE_JSON_AFTER_EDIT: true,\n // Block edits to global widgets unless caller explicitly opts in\n BLOCK_GLOBAL_WIDGET_WRITES_BY_DEFAULT: true,\n // Confirmation token TTL — short for destructive ops\n CONFIRMATION_TTL_SECONDS: 60,\n // Stricter TTL for global widget ops (less margin for mistakes)\n GLOBAL_WIDGET_CONFIRMATION_TTL_SECONDS: 30,\n // CSS flush is non-optional after _elementor_data writes\n FLUSH_CSS_AFTER_WRITE: true,\n // Maximum size of a single page's _elementor_data we'll touch (sanity bound)\n MAX_ELEMENTOR_DATA_BYTES: 5 * 1024 * 1024, // 5 MB\n // wp-cli commands matching this pattern require confirmation\n WP_CLI_DESTRUCTIVE_REQUIRES_CONFIRM: true,\n} as const;\n\nexport const FORBIDDEN_WPCLI_PATTERNS: RegExp[] = [\n // Hard 'no' regardless of confirmation — we never accept these\n /\\brm\\s+-rf\\b/i,\n /\\bsudo\\b/i,\n /\\bdb\\s+reset\\s+--yes\\b/i,\n /\\bdb\\s+drop\\s+--yes\\b/i,\n];\n\nexport function isForbiddenWpCli(args: string): { forbidden: boolean; reason?: string } {\n for (const p of FORBIDDEN_WPCLI_PATTERNS) {\n if (p.test(args)) return { forbidden: true, reason: `Pattern ${p} is hard-blocked.` };\n }\n return { forbidden: false };\n}\n","import { randomBytes } from \"node:crypto\";\n\ninterface PendingConfirmation {\n token: string;\n intent: string;\n payload: unknown;\n expiresAt: number;\n}\n\nconst pending = new Map<string, PendingConfirmation>();\n\nexport function issueConfirmation(intent: string, payload: unknown, ttlSeconds: number): string {\n const token = randomBytes(8).toString(\"hex\");\n pending.set(token, {\n token,\n intent,\n payload,\n expiresAt: Date.now() + ttlSeconds * 1000,\n });\n return token;\n}\n\nexport function consumeConfirmation(\n token: string,\n expectedIntent: string,\n): PendingConfirmation | null {\n const c = pending.get(token);\n if (!c) return null;\n pending.delete(token);\n if (c.expiresAt < Date.now()) return null;\n if (c.intent !== expectedIntent) return null;\n return c;\n}\n\nexport function _clearAllConfirmations(): void {\n pending.clear();\n}\n","/**\n * MCP server entry point — stdio transport.\n *\n * Run with: `npm run dev` (watch) or `npm start` (compiled).\n * Test interactively: `npm run inspector`.\n */\nimport { readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\n\nimport { loadConfig } from \"./config.js\";\nimport { tools } from \"./tools/index.js\";\nimport { logger } from \"./utils/logger.js\";\nimport { listResources, readResource } from \"./resources/index.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(resolve(__dirname, \"../package.json\"), \"utf8\")) as {\n name: string;\n version: string;\n};\n\nfunction toMcpInputSchema(zod: z.ZodType<unknown>): Record<string, unknown> {\n // Draft 7 — accepted by both Anthropic API and the broader MCP ecosystem.\n return zodToJsonSchema(zod, { target: \"jsonSchema7\", $refStrategy: \"none\" }) as Record<string, unknown>;\n}\n\nasync function main() {\n // Validate config early — fail fast with a clear message rather than letting tools blow up\n try {\n loadConfig();\n } catch (e) {\n logger.error((e as Error).message);\n process.stderr.write(\"\\n\" + (e as Error).message + \"\\n\");\n process.exit(1);\n }\n\n const server = new Server(\n { name: pkg.name, version: pkg.version },\n { capabilities: { tools: {}, resources: {} } },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: tools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: toMcpInputSchema(t.inputSchema),\n outputSchema: t.outputSchema ? toMcpInputSchema(t.outputSchema) : undefined,\n annotations: t.annotations,\n })),\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (req) => {\n const tool = tools.find((t) => t.name === req.params.name);\n if (!tool) throw new Error(`Unknown tool: ${req.params.name}`);\n const args = (req.params.arguments ?? {}) as unknown;\n const parsed = tool.inputSchema.safeParse(args);\n if (!parsed.success) {\n const msg = parsed.error.issues.map((i) => ` ${i.path.join(\".\")}: ${i.message}`).join(\"\\n\");\n return {\n content: [{ type: \"text\" as const, text: `Invalid arguments for ${tool.name}:\\n${msg}` }],\n isError: true,\n };\n }\n try {\n const result = await tool.handler(parsed.data);\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (e) {\n logger.error({ tool: tool.name, err: (e as Error).message }, \"tool error\");\n return {\n content: [{ type: \"text\" as const, text: `${tool.name} failed: ${(e as Error).message}` }],\n isError: true,\n };\n }\n });\n\n // Resources — Elementor docs corpus\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: await listResources(),\n }));\n server.setRequestHandler(ReadResourceRequestSchema, async (req) => readResource(req.params.uri));\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n logger.info({ tools: tools.length }, `${pkg.name} v${pkg.version} ready`);\n}\n\nmain().catch((e) => {\n logger.error((e as Error).message);\n process.stderr.write(\"\\n\" + (e as Error).message + \"\\n\");\n process.exit(1);\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../types/tool.js\";\nimport { loadConfig, getSite } from \"../config.js\";\nimport { wpRequest } from \"../api/wp-rest.js\";\n\nexport const listSitesTool = defineTool({\n name: \"list_sites\",\n description: \"List every WordPress site configured. Best called first in a session.\",\n inputSchema: z.object({}),\n outputSchema: z.object({\n total: z.number(),\n default_site_id: z.string().optional(),\n sites: z.array(z.object({\n id: z.string(), url: z.string(), username: z.string(), has_ssh: z.boolean(),\n })),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },\n async handler() {\n const cfg = loadConfig();\n return {\n total: cfg.sites.length,\n default_site_id: cfg.default_site_id ?? cfg.sites[0]?.id,\n sites: cfg.sites.map((s) => ({ id: s.id, url: s.url, username: s.username, has_ssh: !!s.ssh })),\n };\n },\n});\n\nexport const pingSiteTool = defineTool({\n name: \"ping_site\",\n description: \"Verify connectivity + authentication to a WordPress site. Returns user identity + WP/Elementor/Elementor Pro versions if accessible.\",\n inputSchema: z.object({ site_id: z.string().optional() }),\n outputSchema: z.object({\n ok: z.boolean(),\n site_id: z.string(),\n url: z.string(),\n wp_version: z.string().optional(),\n elementor_version: z.string().optional(),\n elementor_pro_version: z.string().optional(),\n user: z.object({ id: z.number(), name: z.string(), roles: z.array(z.string()).optional() }).optional(),\n error: z.string().optional(),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const site = getSite(input.site_id);\n try {\n const me = await wpRequest<{ id: number; name: string; roles?: string[] }>(\"/wp/v2/users/me?context=edit\", { siteId: site.id });\n let wp_version: string | undefined;\n try {\n const health = await wpRequest<{ wordpress: { version: string } }>(\"/wp-site-health/v1/info\", { siteId: site.id });\n wp_version = health.wordpress?.version;\n } catch { /* admin restricted */ }\n let elementor_version: string | undefined;\n let elementor_pro_version: string | undefined;\n try {\n const plugins = await wpRequest<Array<{ plugin: string; version: string; status: string }>>(\"/wp/v2/plugins\", { siteId: site.id });\n for (const p of plugins) {\n if (p.plugin.startsWith(\"elementor/\") && p.plugin.endsWith(\"/elementor.php\")) elementor_version = p.version;\n if (p.plugin.startsWith(\"elementor-pro/\")) elementor_pro_version = p.version;\n }\n } catch { /* may require admin */ }\n return {\n ok: true, site_id: site.id, url: site.url,\n wp_version, elementor_version, elementor_pro_version,\n user: { id: me.id, name: me.name, roles: me.roles },\n };\n } catch (e) {\n return { ok: false, site_id: site.id, url: site.url, error: (e as Error).message };\n }\n },\n});\n\nexport const siteHealthTool = defineTool({\n name: \"site_health\",\n description: \"Comprehensive site health snapshot: WP/PHP/Elementor versions, disk space (if SSH), plugin count, theme info. Aggregates multiple REST calls into a single overview.\",\n inputSchema: z.object({ site_id: z.string().optional() }),\n outputSchema: z.object({\n site_id: z.string(),\n url: z.string(),\n wp_version: z.string().optional(),\n php_version: z.string().optional(),\n elementor_version: z.string().optional(),\n elementor_pro_version: z.string().optional(),\n active_theme: z.string().optional(),\n plugins_total: z.number().optional(),\n plugins_active: z.number().optional(),\n plugins_outdated: z.number().optional(),\n elementor_pages_count: z.number().optional(),\n errors: z.array(z.string()),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const site = getSite(input.site_id);\n const errors: string[] = [];\n let wp_version, php_version, elementor_version, elementor_pro_version, active_theme;\n let plugins_total, plugins_active, plugins_outdated, elementor_pages_count;\n\n try {\n const info = await wpRequest<{ wordpress: { version: string }; \"wp-server\"?: { fields?: { php_version?: { value?: string } } } }>(\"/wp-site-health/v1/info\", { siteId: site.id });\n wp_version = info.wordpress?.version;\n php_version = info[\"wp-server\"]?.fields?.php_version?.value;\n } catch (e) { errors.push(\"site-health: \" + (e as Error).message); }\n\n try {\n const plugins = await wpRequest<Array<{ plugin: string; version: string; status: string }>>(\"/wp/v2/plugins\", { siteId: site.id });\n plugins_total = plugins.length;\n plugins_active = plugins.filter((p) => p.status === \"active\").length;\n for (const p of plugins) {\n if (p.plugin.startsWith(\"elementor/\") && p.plugin.endsWith(\"/elementor.php\")) elementor_version = p.version;\n if (p.plugin.startsWith(\"elementor-pro/\")) elementor_pro_version = p.version;\n }\n } catch (e) { errors.push(\"plugins: \" + (e as Error).message); }\n\n try {\n const themes = await wpRequest<Array<{ stylesheet: string; status: string; name: { raw: string } }>>(\"/wp/v2/themes\", { siteId: site.id });\n const active = themes.find((t) => t.status === \"active\");\n active_theme = active?.name?.raw;\n } catch (e) { errors.push(\"themes: \" + (e as Error).message); }\n\n try {\n const pages = await wpRequest<unknown[]>(\"/wp/v2/pages\", { siteId: site.id, query: { meta_key: \"_elementor_edit_mode\", meta_value: \"builder\", per_page: 1, _fields: \"id\" } });\n // We don't get total from headers easily — at least say \"≥ 1\" if any\n elementor_pages_count = pages.length > 0 ? -1 : 0; // -1 means \"at least one, count not reliably known\"\n } catch (e) { errors.push(\"pages: \" + (e as Error).message); }\n\n return {\n site_id: site.id, url: site.url,\n wp_version, php_version, elementor_version, elementor_pro_version, active_theme,\n plugins_total, plugins_active, plugins_outdated,\n elementor_pages_count,\n errors,\n };\n },\n});\n","import type { z } from \"zod\";\n\nexport interface ToolDefinition<TInput = unknown, TOutput = unknown> {\n name: string;\n description: string;\n inputSchema: z.ZodType<TInput>;\n outputSchema?: z.ZodType<TOutput>;\n annotations?: {\n readOnlyHint?: boolean;\n idempotentHint?: boolean;\n destructiveHint?: boolean;\n openWorldHint?: boolean;\n title?: string;\n };\n handler: (input: TInput) => Promise<TOutput>;\n}\n\n/**\n * Helper that lets each tool infer its input/output types from the Zod schemas\n * without needing explicit generic parameters.\n */\nexport function defineTool<S extends z.ZodType, O extends z.ZodType>(\n def: Omit<ToolDefinition<z.infer<S>, z.infer<O>>, \"inputSchema\" | \"outputSchema\"> & {\n inputSchema: S;\n outputSchema?: O;\n },\n): ToolDefinition<z.infer<S>, z.infer<O>> {\n return def as ToolDefinition<z.infer<S>, z.infer<O>>;\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"../types/tool.js\";\nimport { wpRequest } from \"../api/wp-rest.js\";\nimport {\n parseElementorData,\n summarize,\n serializeElementorData,\n findReplaceInWidgets,\n walkElements,\n findElementById,\n} from \"../elementor/data-parser.js\";\nimport { fullBackup, listBackups, restoreBackup } from \"../elementor/backup.js\";\nimport { flushCSS } from \"../elementor/css-flush.js\";\nimport { validateElementorData } from \"../elementor/validator.js\";\nimport { listGlobalWidgets, findGlobalReferences } from \"../elementor/globals.js\";\nimport { issueConfirmation, consumeConfirmation } from \"../utils/confirmation.js\";\nimport { POLICIES } from \"../elementor/policies.js\";\n\nexport const listElementorPagesTool = defineTool({\n name: \"list_elementor_pages\",\n description: \"List pages built with Elementor (have _elementor_edit_mode = 'builder'). Returns id, title, slug, status, modified date.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n per_page: z.number().int().min(1).max(100).default(25),\n search: z.string().optional(),\n }),\n outputSchema: z.object({\n total: z.number(),\n pages: z.array(z.object({\n id: z.number(), title: z.string(), slug: z.string(), status: z.string(),\n link: z.string(), modified: z.string(),\n })),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n interface RawPage { id: number; title: { rendered: string }; slug: string; status: string; link: string; modified: string; }\n const pages = await wpRequest<RawPage[]>(\"/wp/v2/pages\", {\n siteId: input.site_id,\n query: {\n per_page: input.per_page,\n search: input.search,\n meta_key: \"_elementor_edit_mode\",\n meta_value: \"builder\",\n context: \"edit\",\n _fields: \"id,title,slug,status,link,modified\",\n },\n });\n return {\n total: pages.length,\n pages: pages.map((p) => ({\n id: p.id, title: p.title.rendered, slug: p.slug,\n status: p.status, link: p.link, modified: p.modified,\n })),\n };\n },\n});\n\nexport const readPageElementorTool = defineTool({\n name: \"read_page_elementor\",\n description: \"Fetch a page's Elementor data structure summary. With verbose=true returns the full parsed tree (potentially MBs).\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n verbose: z.boolean().default(false),\n }),\n outputSchema: z.object({\n page_id: z.number(),\n title: z.string(),\n summary: z.object({\n totalElements: z.number(), sections: z.number(), containers: z.number(),\n columns: z.number(), widgets: z.number(), maxDepth: z.number(),\n byWidgetType: z.record(z.number()),\n }),\n global_references: z.array(z.object({ widget_id: z.string(), template_id: z.number() })),\n data: z.array(z.any()).optional(),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const page = await wpRequest<{ id: number; title: { rendered: string }; meta?: Record<string, unknown> }>(\n `/wp/v2/pages/${input.page_id}?context=edit`,\n { siteId: input.site_id },\n );\n const raw = (page.meta?._elementor_data as string) ?? \"[]\";\n const data = parseElementorData(raw);\n return {\n page_id: page.id,\n title: page.title.rendered,\n summary: summarize(data),\n global_references: findGlobalReferences(raw),\n data: input.verbose ? data : undefined,\n };\n },\n});\n\nexport const listWidgetsInPageTool = defineTool({\n name: \"list_widgets_in_page\",\n description: \"Flat list of every widget in a page with id, type, parent path, and an excerpt of the first text setting (for spot-checking before find/replace).\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n widget_type: z.string().optional(),\n }),\n outputSchema: z.object({\n page_id: z.number(),\n total: z.number(),\n widgets: z.array(z.object({\n widget_id: z.string(),\n widget_type: z.string(),\n path: z.array(z.string()),\n excerpt: z.string().optional(),\n })),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const page = await wpRequest<{ id: number; meta?: Record<string, unknown> }>(\n `/wp/v2/pages/${input.page_id}?context=edit&_fields=id,meta`,\n { siteId: input.site_id },\n );\n const data = parseElementorData((page.meta?._elementor_data as string) ?? \"[]\");\n const widgets: Array<{ widget_id: string; widget_type: string; path: string[]; excerpt?: string }> = [];\n for (const { element, path } of walkElements(data)) {\n if (element.elType !== \"widget\") continue;\n if (input.widget_type && element.widgetType !== input.widget_type) continue;\n // First string field as excerpt\n let excerpt: string | undefined;\n for (const v of Object.values(element.settings ?? {})) {\n if (typeof v === \"string\" && v.length > 0) {\n excerpt = v.replace(/<[^>]+>/g, \"\").slice(0, 80);\n break;\n }\n }\n widgets.push({\n widget_id: element.id,\n widget_type: element.widgetType ?? \"unknown\",\n path: path.slice(0, -1),\n excerpt,\n });\n }\n return { page_id: page.id, total: widgets.length, widgets };\n },\n});\n\nexport const listGlobalWidgetsTool = defineTool({\n name: \"list_global_widgets\",\n description: \"List all global widgets on a site (Elementor library entries of type 'widget'). These are shared across pages — editing one affects every page using it.\",\n inputSchema: z.object({ site_id: z.string().optional() }),\n outputSchema: z.object({\n total: z.number(),\n globals: z.array(z.object({\n template_id: z.number(),\n title: z.string(),\n widget_type: z.string().optional(),\n })),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const globals = await listGlobalWidgets(input.site_id);\n return { total: globals.length, globals };\n },\n});\n\nexport const preflightCheckTool = defineTool({\n name: \"preflight_check\",\n description: \"Validate a page is safe to edit. Checks: page exists, is Elementor-built, data parses cleanly, references valid global widgets, isn't currently locked by another editor.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n }),\n outputSchema: z.object({\n safe_to_edit: z.boolean(),\n page_id: z.number(),\n title: z.string(),\n issues: z.array(z.string()),\n warnings: z.array(z.string()),\n data_bytes: z.number(),\n global_widget_references: z.number(),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const issues: string[] = [];\n const warnings: string[] = [];\n let title = \"\";\n let data_bytes = 0;\n let global_widget_references = 0;\n try {\n const page = await wpRequest<{ id: number; title: { rendered: string }; meta?: Record<string, unknown> }>(\n `/wp/v2/pages/${input.page_id}?context=edit`,\n { siteId: input.site_id },\n );\n title = page.title.rendered;\n const raw = (page.meta?._elementor_data as string) ?? \"[]\";\n data_bytes = raw.length;\n if ((page.meta?._elementor_edit_mode as string) !== \"builder\") {\n issues.push(\"Page is not in Elementor builder mode\");\n }\n const v = validateElementorData(raw);\n if (!v.valid) issues.push(...v.errors);\n warnings.push(...v.warnings);\n global_widget_references = findGlobalReferences(raw).length;\n if (global_widget_references > 0) {\n warnings.push(`Page references ${global_widget_references} global widget(s). Edits via find_replace will NOT affect the globals themselves — modify the global template directly if needed.`);\n }\n if (data_bytes > POLICIES.MAX_ELEMENTOR_DATA_BYTES) {\n issues.push(`Elementor data exceeds policy max (${POLICIES.MAX_ELEMENTOR_DATA_BYTES} bytes)`);\n }\n } catch (e) {\n issues.push(`Cannot fetch page: ${(e as Error).message}`);\n }\n return { safe_to_edit: issues.length === 0, page_id: input.page_id, title, issues, warnings, data_bytes, global_widget_references };\n },\n});\n\nexport const findReplaceTool = defineTool({\n name: \"elementor_find_replace\",\n description: \"Find/replace plain text in every widget on one page. TWO-CALL FLOW: dry-run returns match_count + detailed widget hits + confirmation_token. Second call with token applies the change with auto-backup + JSON validation + auto-rollback if validation fails + CSS flush.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n find: z.string().min(1),\n replace: z.string(),\n widget_type: z.string().optional(),\n case_sensitive: z.boolean().default(false),\n backup_to_file: z.boolean().default(false).describe(\"Also dump backup to /tmp/elementor-mcp-backups/\"),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n mode: z.enum([\"dry_run\", \"applied\", \"rolled_back\"]),\n page_id: z.number(),\n match_count: z.number(),\n affected_widgets: z.array(z.object({\n widget_id: z.string(),\n widget_type: z.string(),\n before: z.string(),\n after: z.string(),\n })).optional(),\n confirmation_token: z.string().optional(),\n expires_in_seconds: z.number().optional(),\n backup_meta_key: z.string().optional(),\n backup_file: z.string().optional(),\n css_flush: z.string().optional(),\n validation_error: z.string().optional(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n const page = await wpRequest<{ id: number; meta?: Record<string, unknown> }>(\n `/wp/v2/pages/${input.page_id}?context=edit&_fields=id,meta`,\n { siteId: input.site_id },\n );\n const raw = (page.meta?._elementor_data as string) ?? \"[]\";\n // Dry run on a deep copy\n const dryData = parseElementorData(raw);\n const dry = findReplaceInWidgets(JSON.parse(JSON.stringify(dryData)), input.find, input.replace, {\n widgetType: input.widget_type,\n caseSensitive: input.case_sensitive,\n });\n\n // Enrich dry-run: collect affected widgets with before/after excerpts\n const affected: Array<{ widget_id: string; widget_type: string; before: string; after: string }> = [];\n const beforeData = parseElementorData(raw);\n const afterCopy = JSON.parse(JSON.stringify(beforeData));\n findReplaceInWidgets(afterCopy, input.find, input.replace, {\n widgetType: input.widget_type, caseSensitive: input.case_sensitive,\n });\n function collectAffected(orig: ReturnType<typeof parseElementorData>, modified: ReturnType<typeof parseElementorData>): void {\n const beforeMap = new Map<string, { type: string; first: string }>();\n for (const { element } of walkElements(orig)) {\n if (element.elType !== \"widget\") continue;\n const firstStr = Object.values(element.settings ?? {}).find((v) => typeof v === \"string\") as string | undefined;\n if (firstStr) beforeMap.set(element.id, { type: element.widgetType ?? \"?\", first: firstStr });\n }\n for (const { element } of walkElements(modified)) {\n if (element.elType !== \"widget\") continue;\n const firstStr = Object.values(element.settings ?? {}).find((v) => typeof v === \"string\") as string | undefined;\n const b = beforeMap.get(element.id);\n if (b && firstStr && b.first !== firstStr) {\n affected.push({\n widget_id: element.id,\n widget_type: element.widgetType ?? \"?\",\n before: b.first.slice(0, 120),\n after: firstStr.slice(0, 120),\n });\n }\n }\n }\n collectAffected(beforeData, afterCopy);\n\n if (!input.confirmation) {\n if (dry.replacementCount === 0) {\n return {\n mode: \"dry_run\" as const,\n page_id: input.page_id,\n match_count: 0,\n affected_widgets: [],\n };\n }\n const token = issueConfirmation(\n \"elementor_find_replace\",\n { page_id: input.page_id, find: input.find, replace: input.replace },\n POLICIES.CONFIRMATION_TTL_SECONDS,\n );\n return {\n mode: \"dry_run\" as const,\n page_id: input.page_id,\n match_count: dry.replacementCount,\n affected_widgets: affected.slice(0, 25),\n confirmation_token: token,\n expires_in_seconds: POLICIES.CONFIRMATION_TTL_SECONDS,\n };\n }\n\n // Apply\n const conf = consumeConfirmation(input.confirmation, \"elementor_find_replace\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const o = conf.payload as { page_id: number; find: string; replace: string };\n if (o.page_id !== input.page_id || o.find !== input.find || o.replace !== input.replace) {\n throw new Error(\"Confirmation parameters don't match the original dry-run\");\n }\n\n const backup = await fullBackup(input.site_id, input.page_id, { to_file: input.backup_to_file });\n const newData = parseElementorData(raw);\n findReplaceInWidgets(newData, input.find, input.replace, {\n widgetType: input.widget_type, caseSensitive: input.case_sensitive,\n });\n const serialized = serializeElementorData(newData);\n\n // Validate before write\n const validation = validateElementorData(serialized);\n if (!validation.valid) {\n return {\n mode: \"rolled_back\" as const,\n page_id: input.page_id,\n match_count: dry.replacementCount,\n affected_widgets: affected.slice(0, 25),\n backup_meta_key: backup.meta_key,\n validation_error: validation.errors.join(\"; \"),\n };\n }\n\n await wpRequest(`/wp/v2/pages/${input.page_id}`, {\n siteId: input.site_id,\n method: \"PUT\",\n body: { meta: { _elementor_data: serialized } },\n });\n const flush = POLICIES.FLUSH_CSS_AFTER_WRITE ? await flushCSS(input.site_id, input.page_id) : { method: \"none\" as const };\n return {\n mode: \"applied\" as const,\n page_id: input.page_id,\n match_count: dry.replacementCount,\n affected_widgets: affected.slice(0, 25),\n backup_meta_key: backup.meta_key,\n backup_file: backup.file_path,\n css_flush: flush.method,\n };\n },\n});\n\nexport const listElementorBackupsTool = defineTool({\n name: \"list_elementor_backups\",\n description: \"List timestamped backups of a page's Elementor data (created by previous edit ops). Use restore_elementor_backup with one of these meta keys to roll back.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n }),\n outputSchema: z.object({\n page_id: z.number(),\n total: z.number(),\n backups: z.array(z.object({\n meta_key: z.string(),\n settings_key: z.string().optional(),\n timestamp: z.string(),\n })),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const backups = await listBackups(input.site_id, input.page_id);\n return {\n page_id: input.page_id,\n total: backups.length,\n backups,\n };\n },\n});\n\nexport const restoreElementorBackupTool = defineTool({\n name: \"restore_elementor_backup\",\n description: \"Restore a page's _elementor_data and _elementor_page_settings from a backup created by a previous edit. TWO-CALL FLOW with confirmation token.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n backup_meta_key: z.string().describe(\"From list_elementor_backups.\"),\n settings_meta_key: z.string().optional(),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n mode: z.enum([\"dry_run\", \"restored\"]),\n page_id: z.number(),\n backup_meta_key: z.string(),\n settings_meta_key: z.string().optional(),\n confirmation_token: z.string().optional(),\n expires_in_seconds: z.number().optional(),\n css_flush: z.string().optional(),\n pre_restore_backup_meta_key: z.string().optional(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n if (!input.confirmation) {\n const token = issueConfirmation(\"restore_elementor_backup\", {\n page_id: input.page_id, backup_meta_key: input.backup_meta_key,\n }, POLICIES.CONFIRMATION_TTL_SECONDS);\n return {\n mode: \"dry_run\" as const,\n page_id: input.page_id,\n backup_meta_key: input.backup_meta_key,\n settings_meta_key: input.settings_meta_key,\n confirmation_token: token,\n expires_in_seconds: POLICIES.CONFIRMATION_TTL_SECONDS,\n };\n }\n const conf = consumeConfirmation(input.confirmation, \"restore_elementor_backup\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n // Snapshot current state before restoring\n const pre = await fullBackup(input.site_id, input.page_id);\n await restoreBackup(input.site_id, input.page_id, input.backup_meta_key, input.settings_meta_key);\n const flush = await flushCSS(input.site_id, input.page_id);\n return {\n mode: \"restored\" as const,\n page_id: input.page_id,\n backup_meta_key: input.backup_meta_key,\n settings_meta_key: input.settings_meta_key,\n css_flush: flush.method,\n pre_restore_backup_meta_key: pre.meta_key,\n };\n },\n});\n\nexport const duplicateElementorPageTool = defineTool({\n name: \"duplicate_elementor_page\",\n description: \"Duplicate an Elementor page within the same site. Creates a new draft page, copies _elementor_data + _elementor_page_settings + _elementor_edit_mode, flushes CSS.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n source_page_id: z.number().int().positive(),\n new_title: z.string().optional().describe(\"Defaults to '<original> (Copy)'\"),\n status: z.enum([\"draft\", \"publish\", \"private\"]).default(\"draft\"),\n }),\n outputSchema: z.object({\n new_page_id: z.number(),\n new_page_url: z.string(),\n source_page_id: z.number(),\n title: z.string(),\n status: z.string(),\n css_flush: z.string().optional(),\n }),\n annotations: { destructiveHint: false, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n const source = await wpRequest<{ id: number; title: { rendered: string }; meta?: Record<string, unknown> }>(\n `/wp/v2/pages/${input.source_page_id}?context=edit`,\n { siteId: input.site_id },\n );\n const title = input.new_title ?? `${source.title.rendered} (Copy)`;\n const data_raw = (source.meta?._elementor_data as string) ?? \"[]\";\n const settings_raw = (source.meta?._elementor_page_settings as string) ?? \"{}\";\n const created = await wpRequest<{ id: number; link: string }>(\"/wp/v2/pages\", {\n siteId: input.site_id,\n method: \"POST\",\n body: {\n title,\n status: input.status,\n meta: {\n _elementor_data: data_raw,\n _elementor_page_settings: parseSettingsForRest(settings_raw),\n _elementor_edit_mode: \"builder\",\n },\n },\n });\n const flush = await flushCSS(input.site_id, created.id);\n return {\n new_page_id: created.id,\n new_page_url: created.link,\n source_page_id: input.source_page_id,\n title,\n status: input.status,\n css_flush: flush.method,\n };\n },\n});\n\n// re-export helper not used here directly but consumed elsewhere\nexport { findElementById };\n\n/**\n * The WP REST API expects _elementor_page_settings as an object, not a JSON-encoded string.\n * Parse it if it looks like JSON; fall back to empty object on parse failure.\n */\nfunction parseSettingsForRest(raw: unknown): Record<string, unknown> {\n if (typeof raw === \"object\" && raw !== null) return raw as Record<string, unknown>;\n if (typeof raw === \"string\") {\n if (!raw.trim()) return {};\n try { return JSON.parse(raw); } catch { return {}; }\n }\n return {};\n}\n","/**\n * Elementor stores its page builder data as a JSON string in postmeta\n * (`_elementor_data`). Each top-level entry is a \"section\". Sections contain\n * columns, which contain widgets. Widgets have a `widgetType` (\"heading\",\n * \"text-editor\", \"image\", etc.) and a `settings` object.\n *\n * This module provides a typed wrapper + safe deep traversal helpers.\n */\n\nexport interface ElementorElement {\n id: string;\n elType: \"section\" | \"column\" | \"widget\" | \"container\";\n widgetType?: string;\n settings: Record<string, unknown>;\n elements?: ElementorElement[];\n isInner?: boolean;\n}\n\nexport type ElementorData = ElementorElement[];\n\nexport function parseElementorData(raw: string | ElementorData): ElementorData {\n if (Array.isArray(raw)) return raw;\n if (!raw || raw === \"[]\") return [];\n try {\n const decoded = JSON.parse(raw);\n if (!Array.isArray(decoded)) throw new Error(\"not an array\");\n return decoded as ElementorData;\n } catch (e) {\n throw new Error(`Failed to parse _elementor_data JSON: ${(e as Error).message}`);\n }\n}\n\nexport function serializeElementorData(data: ElementorData): string {\n return JSON.stringify(data);\n}\n\n/**\n * Walks every element top-down, yielding {element, path, depth}.\n * Path is the array of ids from root to current element.\n */\nexport function* walkElements(\n data: ElementorData,\n path: string[] = [],\n depth = 0,\n): Generator<{ element: ElementorElement; path: string[]; depth: number }> {\n for (const el of data) {\n const here = [...path, el.id];\n yield { element: el, path: here, depth };\n if (el.elements && el.elements.length > 0) {\n yield* walkElements(el.elements, here, depth + 1);\n }\n }\n}\n\nexport function findElementById(data: ElementorData, id: string): ElementorElement | null {\n for (const { element } of walkElements(data)) {\n if (element.id === id) return element;\n }\n return null;\n}\n\nexport function findWidgets(\n data: ElementorData,\n widgetType?: string,\n): { widget: ElementorElement; path: string[] }[] {\n const out: { widget: ElementorElement; path: string[] }[] = [];\n for (const { element, path } of walkElements(data)) {\n if (element.elType === \"widget\") {\n if (!widgetType || element.widgetType === widgetType) {\n out.push({ widget: element, path });\n }\n }\n }\n return out;\n}\n\n/**\n * Find/replace plain-text occurrences in every widget's settings.\n * Returns the modified data + how many replacements happened.\n *\n * Replacement is limited to string fields. Nested objects are recursed into.\n */\nexport function findReplaceInWidgets(\n data: ElementorData,\n find: string,\n replace: string,\n options: { widgetType?: string; caseSensitive?: boolean } = {},\n): { data: ElementorData; replacementCount: number } {\n let count = 0;\n const flags = options.caseSensitive ? \"g\" : \"gi\";\n const pattern = new RegExp(find.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"), flags);\n\n function replaceInValue(value: unknown): unknown {\n if (typeof value === \"string\") {\n const next = value.replace(pattern, () => {\n count++;\n return replace;\n });\n return next;\n }\n if (Array.isArray(value)) return value.map(replaceInValue);\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) out[k] = replaceInValue(v);\n return out;\n }\n return value;\n }\n\n for (const { element } of walkElements(data)) {\n if (element.elType !== \"widget\") continue;\n if (options.widgetType && element.widgetType !== options.widgetType) continue;\n element.settings = replaceInValue(element.settings) as Record<string, unknown>;\n }\n\n return { data, replacementCount: count };\n}\n\n/**\n * Summary of an Elementor page — counts by widgetType and section depth.\n */\nexport function summarize(data: ElementorData): {\n totalElements: number;\n sections: number;\n containers: number;\n columns: number;\n widgets: number;\n byWidgetType: Record<string, number>;\n maxDepth: number;\n} {\n let totalElements = 0;\n let sections = 0;\n let containers = 0;\n let columns = 0;\n let widgets = 0;\n let maxDepth = 0;\n const byWidgetType: Record<string, number> = {};\n for (const { element, depth } of walkElements(data)) {\n totalElements++;\n maxDepth = Math.max(maxDepth, depth);\n if (element.elType === \"section\") sections++;\n else if (element.elType === \"container\") containers++;\n else if (element.elType === \"column\") columns++;\n else if (element.elType === \"widget\") {\n widgets++;\n const w = element.widgetType ?? \"unknown\";\n byWidgetType[w] = (byWidgetType[w] ?? 0) + 1;\n }\n }\n return { totalElements, sections, containers, columns, widgets, byWidgetType, maxDepth };\n}\n","import { parseElementorData, ElementorData, ElementorElement } from \"./data-parser.js\";\nimport { POLICIES } from \"./policies.js\";\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * Validate Elementor data shape integrity. Used after programmatic edits to\n * catch corruption before we PUT back to the server.\n *\n * Checks:\n * - Each element has id, elType, settings\n * - id is a non-empty string (don't enforce hex format — Elementor's evolved)\n * - elType is one of the known values\n * - settings is an object (not null, not array)\n * - Recursive: every `.elements` array is also valid\n * - Size cap\n */\nexport function validateElementorData(input: string | ElementorData): ValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (typeof input === \"string\" && input.length > POLICIES.MAX_ELEMENTOR_DATA_BYTES) {\n errors.push(`_elementor_data exceeds ${POLICIES.MAX_ELEMENTOR_DATA_BYTES} bytes (got ${input.length})`);\n return { valid: false, errors, warnings };\n }\n\n let data: ElementorData;\n try {\n data = parseElementorData(input);\n } catch (e) {\n errors.push(`JSON parse failed: ${(e as Error).message}`);\n return { valid: false, errors, warnings };\n }\n\n function validateElement(el: ElementorElement, depth: number, path: string[]): void {\n const here = [...path, el.id ?? \"?\"];\n if (typeof el.id !== \"string\" || el.id.length === 0) {\n errors.push(`element at ${here.join(\".\")}: missing or empty id`);\n }\n if (![\"section\", \"container\", \"column\", \"widget\"].includes(el.elType)) {\n errors.push(`element ${el.id}: unknown elType \"${el.elType}\"`);\n }\n if (el.elType === \"widget\" && (typeof el.widgetType !== \"string\" || el.widgetType.length === 0)) {\n errors.push(`widget ${el.id}: missing widgetType`);\n }\n if (el.settings === null || el.settings === undefined || typeof el.settings !== \"object\" || Array.isArray(el.settings)) {\n errors.push(`element ${el.id}: settings must be an object (got ${typeof el.settings})`);\n }\n if (depth > 20) warnings.push(`element ${el.id}: depth ${depth} is unusually deep`);\n if (Array.isArray(el.elements)) {\n for (const child of el.elements) validateElement(child, depth + 1, here);\n }\n }\n\n if (!Array.isArray(data)) {\n errors.push(\"Top-level must be an array\");\n return { valid: false, errors, warnings };\n }\n for (const el of data) validateElement(el, 0, []);\n\n return { valid: errors.length === 0, errors, warnings };\n}\n","import { wpRequest } from \"../api/wp-rest.js\";\nimport { parseElementorData, walkElements } from \"./data-parser.js\";\n\nexport interface GlobalWidget {\n template_id: number;\n title: string;\n widget_type?: string;\n used_on_pages?: number[];\n}\n\n/**\n * List all global widgets on a site.\n * Global widgets are stored as posts of type `elementor_library` with\n * `_elementor_template_type = widget`.\n */\nexport async function listGlobalWidgets(siteId: string | undefined): Promise<GlobalWidget[]> {\n interface Tpl {\n id: number;\n title: { rendered: string };\n meta?: { _elementor_template_type?: string; _elementor_data?: string };\n }\n const items = await wpRequest<Tpl[]>(\"/wp/v2/elementor_library\", {\n siteId,\n query: {\n context: \"edit\",\n per_page: 100,\n _fields: \"id,title,meta\",\n },\n });\n // Filter client-side — REST won't reliably filter on unregistered meta\n const widgetsOnly = items.filter((t) => t.meta?._elementor_template_type === \"widget\");\n return widgetsOnly.map((t) => {\n const data = parseElementorData(t.meta?._elementor_data ?? \"[]\");\n let widget_type: string | undefined;\n for (const { element } of walkElements(data)) {\n if (element.elType === \"widget\") {\n widget_type = element.widgetType;\n break;\n }\n }\n return {\n template_id: t.id,\n title: t.title.rendered,\n widget_type,\n };\n });\n}\n\n/**\n * In a parsed _elementor_data tree, find widgets that reference a global widget\n * template (Elementor stores a reference via the `templateID` setting on a\n * `global` widgetType).\n */\nexport function findGlobalReferences(data: unknown): { widget_id: string; template_id: number }[] {\n const out: { widget_id: string; template_id: number }[] = [];\n try {\n for (const { element } of walkElements(parseElementorData(data as string | []))) {\n if (element.elType === \"widget\" && element.widgetType === \"global\") {\n const tid = (element.settings as { template_id?: number; templateID?: number }).template_id\n ?? (element.settings as { template_id?: number; templateID?: number }).templateID;\n if (typeof tid === \"number\") out.push({ widget_id: element.id, template_id: tid });\n }\n }\n } catch {\n /* ignore */\n }\n return out;\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"../types/tool.js\";\nimport { wpRequest } from \"../api/wp-rest.js\";\nimport { parseElementorData, summarize, serializeElementorData } from \"../elementor/data-parser.js\";\n\nconst TEMPLATE_TYPES = [\"section\", \"page\", \"popup\", \"header\", \"footer\", \"archive\", \"single\", \"widget\", \"any\"] as const;\n\nexport const listTemplatesTool = defineTool({\n name: \"list_elementor_templates\",\n description: \"List Elementor library entries on a site: saved sections, pages, popups, headers/footers (Theme Builder Pro), single/archive templates (Theme Builder Pro), and global widgets. Type filter narrows results.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n type: z.enum(TEMPLATE_TYPES).default(\"any\"),\n per_page: z.number().int().min(1).max(100).default(50),\n }),\n outputSchema: z.object({\n total: z.number(),\n templates: z.array(z.object({\n id: z.number(),\n title: z.string(),\n type: z.string(),\n is_theme_builder: z.boolean(),\n display_conditions_count: z.number(),\n modified: z.string(),\n })),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const query: Record<string, string | number> = {\n per_page: input.per_page, context: \"edit\",\n _fields: \"id,title,modified,meta\",\n };\n interface RawTpl {\n id: number;\n title: { rendered: string };\n modified: string;\n meta?: { _elementor_template_type?: string; _elementor_conditions?: string };\n }\n const allItems = await wpRequest<RawTpl[]>(\"/wp/v2/elementor_library\", { siteId: input.site_id, query });\n // Filter client-side — REST won't reliably filter on unregistered meta keys\n const items = input.type === \"any\"\n ? allItems\n : allItems.filter((t) => t.meta?._elementor_template_type === input.type);\n const themeBuilderTypes = new Set([\"header\", \"footer\", \"archive\", \"single\"]);\n return {\n total: items.length,\n templates: items.map((t) => {\n const type = t.meta?._elementor_template_type ?? \"unknown\";\n let conds = 0;\n try {\n const c = t.meta?._elementor_conditions;\n if (typeof c === \"string\") conds = (JSON.parse(c) as unknown[]).length;\n else if (Array.isArray(c)) conds = (c as unknown[]).length;\n } catch { /* ignore */ }\n return {\n id: t.id,\n title: t.title.rendered,\n type,\n is_theme_builder: themeBuilderTypes.has(type),\n display_conditions_count: conds,\n modified: t.modified,\n };\n }),\n };\n },\n});\n\nexport const exportTemplateTool = defineTool({\n name: \"export_elementor_template\",\n description: \"Export an Elementor template (section, page, header, footer, etc.) as a portable JSON object. Output goes into import_elementor_template on another site.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n template_id: z.number().int().positive(),\n }),\n outputSchema: z.object({\n template_id: z.number(),\n title: z.string(),\n type: z.string(),\n summary: z.object({ totalElements: z.number(), widgets: z.number(), sections: z.number() }),\n portable_json: z.string(),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const tpl = await wpRequest<{\n id: number;\n title: { rendered: string };\n meta?: { _elementor_template_type?: string; _elementor_data?: string };\n }>(`/wp/v2/elementor_library/${input.template_id}?context=edit`, { siteId: input.site_id });\n const data = parseElementorData(tpl.meta?._elementor_data ?? \"[]\");\n const sum = summarize(data);\n const portable = {\n version: \"0.4\",\n title: tpl.title.rendered,\n type: tpl.meta?._elementor_template_type ?? \"page\",\n content: data,\n };\n return {\n template_id: tpl.id,\n title: tpl.title.rendered,\n type: tpl.meta?._elementor_template_type ?? \"unknown\",\n summary: { totalElements: sum.totalElements, widgets: sum.widgets, sections: sum.sections },\n portable_json: JSON.stringify(portable),\n };\n },\n});\n\nexport const importTemplateTool = defineTool({\n name: \"import_elementor_template\",\n description: \"Import a portable template JSON (output of export_elementor_template) into a target site as a new library entry. Useful for cross-site template sync.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n portable_json: z.string(),\n override_title: z.string().optional(),\n }),\n outputSchema: z.object({\n new_template_id: z.number(),\n title: z.string(),\n type: z.string(),\n url: z.string(),\n }),\n annotations: { destructiveHint: false, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n let payload: { title: string; type: string; content: unknown };\n try { payload = JSON.parse(input.portable_json); }\n catch (e) { throw new Error(\"portable_json is not valid JSON: \" + (e as Error).message); }\n const title = input.override_title ?? payload.title;\n const data = Array.isArray(payload.content) ? payload.content : parseElementorData(payload.content as string);\n const res = await wpRequest<{ id: number; link: string }>(`/wp/v2/elementor_library`, {\n siteId: input.site_id, method: \"POST\",\n body: {\n title, status: \"publish\",\n meta: {\n _elementor_template_type: payload.type,\n _elementor_data: serializeElementorData(data),\n _elementor_edit_mode: \"builder\",\n },\n },\n });\n return { new_template_id: res.id, title, type: payload.type, url: res.link };\n },\n});\n\nexport const applyTemplateToPageTool = defineTool({\n name: \"apply_template_to_page\",\n description: \"Copy the _elementor_data + _elementor_page_settings of a SOURCE template (or page) onto a TARGET page on the same site. Backs up the target first. Use to apply a section/page template to an existing draft.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n source_id: z.number().int().positive().describe(\"Source post id: a template or a page.\"),\n target_page_id: z.number().int().positive(),\n backup_to_file: z.boolean().default(false),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n mode: z.enum([\"dry_run\", \"applied\"]),\n target_page_id: z.number(),\n source_id: z.number(),\n confirmation_token: z.string().optional(),\n expires_in_seconds: z.number().optional(),\n backup_meta_key: z.string().optional(),\n backup_file: z.string().optional(),\n css_flush: z.string().optional(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n const { issueConfirmation, consumeConfirmation } = await import(\"../utils/confirmation.js\");\n const { POLICIES } = await import(\"../elementor/policies.js\");\n const { fullBackup } = await import(\"../elementor/backup.js\");\n const { flushCSS } = await import(\"../elementor/css-flush.js\");\n\n if (!input.confirmation) {\n const token = issueConfirmation(\"apply_template_to_page\", { src: input.source_id, tgt: input.target_page_id, site: input.site_id }, POLICIES.CONFIRMATION_TTL_SECONDS);\n return {\n mode: \"dry_run\" as const,\n target_page_id: input.target_page_id,\n source_id: input.source_id,\n confirmation_token: token,\n expires_in_seconds: POLICIES.CONFIRMATION_TTL_SECONDS,\n };\n }\n const conf = consumeConfirmation(input.confirmation, \"apply_template_to_page\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n\n // Read source (try elementor_library first, fallback to pages)\n let src_meta: Record<string, unknown> | undefined;\n try {\n const src = await wpRequest<{ meta?: Record<string, unknown> }>(`/wp/v2/elementor_library/${input.source_id}?context=edit`, { siteId: input.site_id });\n src_meta = src.meta;\n } catch {\n const src = await wpRequest<{ meta?: Record<string, unknown> }>(`/wp/v2/pages/${input.source_id}?context=edit`, { siteId: input.site_id });\n src_meta = src.meta;\n }\n const data_raw = (src_meta?._elementor_data as string) ?? \"[]\";\n const settings_raw = (src_meta?._elementor_page_settings as string) ?? \"{}\";\n\n // Backup target\n const backup = await fullBackup(input.site_id, input.target_page_id, { to_file: input.backup_to_file });\n // Apply\n await wpRequest(`/wp/v2/pages/${input.target_page_id}`, {\n siteId: input.site_id, method: \"PUT\",\n body: {\n meta: {\n _elementor_data: data_raw,\n _elementor_page_settings: parseSettingsForRest(settings_raw),\n _elementor_edit_mode: \"builder\",\n },\n },\n });\n const flush = await flushCSS(input.site_id, input.target_page_id);\n return {\n mode: \"applied\" as const,\n target_page_id: input.target_page_id,\n source_id: input.source_id,\n backup_meta_key: backup.meta_key,\n backup_file: backup.file_path,\n css_flush: flush.method,\n };\n },\n});\n\nfunction parseSettingsForRest(raw: unknown): Record<string, unknown> {\n if (typeof raw === \"object\" && raw !== null) return raw as Record<string, unknown>;\n if (typeof raw === \"string\") {\n if (!raw.trim()) return {};\n try { return JSON.parse(raw); } catch { return {}; }\n }\n return {};\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"../types/tool.js\";\nimport { getSite } from \"../config.js\";\nimport { sshWpCli, isDestructiveWpCli } from \"../transport/ssh-wpcli.js\";\nimport { isForbiddenWpCli, POLICIES } from \"../elementor/policies.js\";\nimport { issueConfirmation, consumeConfirmation } from \"../utils/confirmation.js\";\n\nexport const wpCliRunTool = defineTool({\n name: \"wp_cli_run\",\n description: \"Execute an arbitrary wp-cli command on a site via SSH. The `wp` prefix and `--path` are added automatically — pass only the args (e.g. 'post list --post_type=page'). Destructive commands (delete, drop, search-replace without --dry-run, plugin deactivate/uninstall) require a two-call confirmation flow.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n args: z.string().min(1).describe(\"WP-CLI args without leading 'wp', e.g. 'post list --post_type=page'\"),\n timeout_ms: z.number().int().min(1000).max(300_000).default(60_000),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n mode: z.enum([\"dry_run_destructive\", \"executed\"]),\n command: z.string(),\n stdout: z.string().optional(),\n stderr: z.string().optional(),\n exit_code: z.number().optional(),\n duration_ms: z.number().optional(),\n destructive_pattern_detected: z.boolean().optional(),\n confirmation_token: z.string().optional(),\n expires_in_seconds: z.number().optional(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n const forbidden = isForbiddenWpCli(input.args);\n if (forbidden.forbidden) {\n throw new Error(`Forbidden wp-cli command. ${forbidden.reason}`);\n }\n const isDestructive = isDestructiveWpCli(input.args);\n\n if (isDestructive && !input.confirmation) {\n const token = issueConfirmation(\"wp_cli_run\", { site_id: input.site_id, args: input.args }, POLICIES.CONFIRMATION_TTL_SECONDS);\n return {\n mode: \"dry_run_destructive\" as const,\n command: `wp <path> ${input.args}`,\n destructive_pattern_detected: true,\n confirmation_token: token,\n expires_in_seconds: POLICIES.CONFIRMATION_TTL_SECONDS,\n };\n }\n if (isDestructive && input.confirmation) {\n const conf = consumeConfirmation(input.confirmation, \"wp_cli_run\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const o = conf.payload as { args: string; site_id?: string };\n if (o.args !== input.args || o.site_id !== input.site_id) {\n throw new Error(\"Confirmation parameters don't match the original dry-run\");\n }\n }\n\n const site = getSite(input.site_id);\n const r = await sshWpCli(site, input.args, { timeout_ms: input.timeout_ms });\n return {\n mode: \"executed\" as const,\n command: r.command,\n stdout: r.stdout,\n stderr: r.stderr,\n exit_code: r.exitCode,\n duration_ms: r.duration_ms,\n destructive_pattern_detected: isDestructive,\n };\n },\n});\n\nexport const wpSearchReplaceTool = defineTool({\n name: \"wp_search_replace\",\n description: \"Run `wp search-replace` against wp_postmeta (default) — the standard agency way to update Elementor text content. ALWAYS dry-run first; the apply call requires a confirmation token. Includes --precise --all-tables-with-prefix by default if you specify table='all'.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n find: z.string().min(1),\n replace: z.string(),\n table: z.string().default(\"wp_postmeta\"),\n include_columns: z.string().optional().describe(\"e.g. 'meta_value'. Default: meta_value when table=wp_postmeta.\"),\n precise: z.boolean().default(true),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n mode: z.enum([\"dry_run\", \"applied\"]),\n command: z.string(),\n stdout: z.string().optional(),\n stderr: z.string().optional(),\n exit_code: z.number().optional(),\n replacement_count: z.number().optional(),\n confirmation_token: z.string().optional(),\n expires_in_seconds: z.number().optional(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n const includeCols = input.include_columns ?? (input.table === \"wp_postmeta\" ? \"meta_value\" : \"\");\n const baseArgs = [\n \"search-replace\",\n `'${input.find.replace(/'/g, \"'\\\\''\")}'`,\n `'${input.replace.replace(/'/g, \"'\\\\''\")}'`,\n input.table,\n includeCols ? `--include-columns=${includeCols}` : \"\",\n input.precise ? \"--precise\" : \"\",\n ].filter(Boolean).join(\" \");\n\n const site = getSite(input.site_id);\n\n if (!input.confirmation) {\n // Dry run\n const dry = await sshWpCli(site, baseArgs + \" --dry-run\");\n const m = dry.stdout.match(/Success: (\\d+) replacement/);\n const count = m ? parseInt(m[1], 10) : 0;\n if (count === 0) {\n return { mode: \"dry_run\" as const, command: dry.command, stdout: dry.stdout, exit_code: dry.exitCode, replacement_count: 0 };\n }\n const token = issueConfirmation(\"wp_search_replace\", { args: baseArgs, site_id: input.site_id }, POLICIES.CONFIRMATION_TTL_SECONDS);\n return {\n mode: \"dry_run\" as const,\n command: dry.command,\n stdout: dry.stdout,\n replacement_count: count,\n confirmation_token: token,\n expires_in_seconds: POLICIES.CONFIRMATION_TTL_SECONDS,\n };\n }\n const conf = consumeConfirmation(input.confirmation, \"wp_search_replace\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const o = conf.payload as { args: string; site_id?: string };\n if (o.args !== baseArgs || o.site_id !== input.site_id) throw new Error(\"Confirmation params mismatch\");\n const r = await sshWpCli(site, baseArgs);\n const m = r.stdout.match(/Success: (\\d+) replacement/);\n return {\n mode: \"applied\" as const,\n command: r.command,\n stdout: r.stdout,\n stderr: r.stderr,\n exit_code: r.exitCode,\n replacement_count: m ? parseInt(m[1], 10) : 0,\n };\n },\n});\n\nexport const wpElementorFlushCssTool = defineTool({\n name: \"wp_elementor_flush_css\",\n description: \"Flush Elementor's CSS cache on a site using the 3-level fallback strategy (REST endpoint → wp-cli native → option/meta delete). Always call after writing _elementor_data programmatically.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive().optional().describe(\"Optional: flush only this page's cache. If omitted, flushes site-wide.\"),\n }),\n outputSchema: z.object({\n method: z.enum([\"rest\", \"wp-cli\", \"option-delete\", \"resave\", \"none\"]),\n details: z.string().optional(),\n }),\n annotations: { destructiveHint: false, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const { flushCSS } = await import(\"../elementor/css-flush.js\");\n return flushCSS(input.site_id, input.page_id);\n },\n});\n\nexport const wpPluginListTool = defineTool({\n name: \"wp_plugin_list\",\n description: \"List installed plugins on a site with name, version, status (active/inactive), and update_version (if outdated). Uses WP-CLI for accurate version data including update_version.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n only_outdated: z.boolean().default(false),\n }),\n outputSchema: z.object({\n total: z.number(),\n plugins: z.array(z.object({\n name: z.string(),\n status: z.string(),\n version: z.string(),\n update: z.string().optional(),\n update_version: z.string().optional(),\n })),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const site = getSite(input.site_id);\n const r = await sshWpCli(site, \"plugin list --format=json\");\n if (r.exitCode !== 0) throw new Error(`wp plugin list failed: ${r.stderr}`);\n interface PluginRow { name: string; status: string; version: string; update: string; update_version?: string; }\n const arr = JSON.parse(r.stdout) as PluginRow[];\n const filtered = input.only_outdated ? arr.filter((p) => p.update === \"available\") : arr;\n return { total: filtered.length, plugins: filtered };\n },\n});\n\nexport const wpPluginUpdateTool = defineTool({\n name: \"wp_plugin_update\",\n description: \"Update one or more plugins on a site to their latest version. Requires confirmation token (uses wp-cli).\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n plugins: z.array(z.string()).min(1).describe(\"Plugin slugs to update, e.g. ['elementor', 'elementor-pro']. Use 'all' for everything outdated.\"),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n mode: z.enum([\"dry_run\", \"applied\"]),\n plugins: z.array(z.string()),\n command: z.string().optional(),\n stdout: z.string().optional(),\n stderr: z.string().optional(),\n exit_code: z.number().optional(),\n confirmation_token: z.string().optional(),\n expires_in_seconds: z.number().optional(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n if (!input.confirmation) {\n const token = issueConfirmation(\"wp_plugin_update\", { site_id: input.site_id, plugins: input.plugins }, POLICIES.CONFIRMATION_TTL_SECONDS);\n return {\n mode: \"dry_run\" as const,\n plugins: input.plugins,\n confirmation_token: token,\n expires_in_seconds: POLICIES.CONFIRMATION_TTL_SECONDS,\n };\n }\n const conf = consumeConfirmation(input.confirmation, \"wp_plugin_update\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const site = getSite(input.site_id);\n const target = input.plugins.includes(\"all\") ? \"--all\" : input.plugins.map((p) => `'${p}'`).join(\" \");\n const r = await sshWpCli(site, `plugin update ${target}`, { timeout_ms: 180_000 });\n return {\n mode: \"applied\" as const,\n plugins: input.plugins,\n command: r.command,\n stdout: r.stdout,\n stderr: r.stderr,\n exit_code: r.exitCode,\n };\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../types/tool.js\";\nimport { screenshotUrl } from \"../transport/screenshot.js\";\nimport { wpRequest } from \"../api/wp-rest.js\";\nimport { readFileSync } from \"node:fs\";\nimport { createHash } from \"node:crypto\";\n\nexport const screenshotPageTool = defineTool({\n name: \"screenshot_page\",\n description: \"Capture a PNG screenshot of a page's frontend (visitor-facing URL). Requires a Chrome/Chromium binary on the host. Returns the local file path so the LLM can analyse it or compare against another shot.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive().optional(),\n url: z.string().url().optional().describe(\"Alternative to page_id: hit any URL directly.\"),\n width: z.number().int().min(320).max(3840).default(1440),\n height: z.number().int().min(240).max(2400).default(900),\n full_page: z.boolean().default(false),\n }),\n outputSchema: z.object({\n url: z.string(),\n file_path: z.string(),\n bytes: z.number(),\n sha256: z.string(),\n width: z.number(),\n height: z.number(),\n }),\n annotations: { readOnlyHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n let target = input.url;\n if (!target) {\n if (!input.page_id) throw new Error(\"Provide either 'url' or 'page_id'.\");\n const page = await wpRequest<{ link: string }>(`/wp/v2/pages/${input.page_id}?_fields=link`, { siteId: input.site_id });\n target = page.link;\n }\n const shot = await screenshotUrl(target, { width: input.width, height: input.height, full_page: input.full_page });\n const hash = createHash(\"sha256\").update(readFileSync(shot.path)).digest(\"hex\");\n return {\n url: target,\n file_path: shot.path,\n bytes: shot.bytes,\n sha256: hash,\n width: input.width,\n height: input.height,\n };\n },\n});\n\nexport const compareScreenshotsTool = defineTool({\n name: \"compare_screenshots\",\n description: \"Compare two screenshot files via SHA-256 hash equality and size delta. Quick way to spot whether a page changed visually after an edit. For pixel diffs, use a dedicated tool externally.\",\n inputSchema: z.object({\n before_path: z.string(),\n after_path: z.string(),\n }),\n outputSchema: z.object({\n identical: z.boolean(),\n before_bytes: z.number(),\n after_bytes: z.number(),\n delta_bytes: z.number(),\n before_sha256: z.string(),\n after_sha256: z.string(),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },\n async handler(input) {\n const a = readFileSync(input.before_path);\n const b = readFileSync(input.after_path);\n const ah = createHash(\"sha256\").update(a).digest(\"hex\");\n const bh = createHash(\"sha256\").update(b).digest(\"hex\");\n return {\n identical: ah === bh,\n before_bytes: a.length,\n after_bytes: b.length,\n delta_bytes: b.length - a.length,\n before_sha256: ah,\n after_sha256: bh,\n };\n },\n});\n","import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { logger } from \"../utils/logger.js\";\n\nconst CHROME_PATHS = [\n \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\n \"/Applications/Chromium.app/Contents/MacOS/Chromium\",\n \"/usr/bin/google-chrome\",\n \"/usr/bin/chromium\",\n \"/usr/bin/chromium-browser\",\n];\n\nexport function findChrome(): string | null {\n // Honour explicit override\n if (process.env.ELEMENTOR_MCP_CHROME) {\n return existsSync(process.env.ELEMENTOR_MCP_CHROME) ? process.env.ELEMENTOR_MCP_CHROME : null;\n }\n for (const p of CHROME_PATHS) {\n if (existsSync(p)) return p;\n }\n return null;\n}\n\nexport async function screenshotUrl(\n url: string,\n opts: { width?: number; height?: number; timeout_ms?: number; full_page?: boolean } = {},\n): Promise<{ path: string; bytes: number }> {\n const chrome = findChrome();\n if (!chrome) {\n throw new Error(\n \"Could not locate a Chrome/Chromium binary for screenshots. Set ELEMENTOR_MCP_CHROME to its path \" +\n \"or install Chrome at one of: \" + CHROME_PATHS.join(\", \"),\n );\n }\n const filename = `elementor-mcp-${randomBytes(4).toString(\"hex\")}-${Date.now()}.png`;\n const path = join(tmpdir(), filename);\n const args = [\n \"--headless=new\",\n \"--disable-gpu\",\n \"--no-sandbox\",\n \"--hide-scrollbars\",\n `--window-size=${opts.width ?? 1440},${opts.height ?? 900}`,\n `--screenshot=${path}`,\n ...(opts.full_page ? [\"--virtual-time-budget=10000\"] : []),\n \"--default-background-color=00000000\",\n url,\n ];\n const timeout = opts.timeout_ms ?? 60_000;\n logger.debug({ url, chrome }, \"screenshot\");\n await new Promise<void>((resolve, reject) => {\n const child = spawn(chrome, args, { stdio: [\"ignore\", \"ignore\", \"pipe\"] });\n let stderr = \"\";\n const killer = setTimeout(() => {\n child.kill(\"SIGKILL\");\n reject(new Error(`Screenshot timed out after ${timeout}ms`));\n }, timeout);\n child.stderr.on(\"data\", (b: Buffer) => { stderr += b.toString(); });\n child.on(\"close\", (code) => {\n clearTimeout(killer);\n if (code !== 0) reject(new Error(`Chrome exited ${code}: ${stderr.slice(0, 300)}`));\n else resolve();\n });\n child.on(\"error\", (e) => { clearTimeout(killer); reject(e); });\n });\n if (!existsSync(path)) throw new Error(`Screenshot file not created: ${path}`);\n const fs = await import(\"node:fs\");\n const stat = fs.statSync(path);\n return { path, bytes: stat.size };\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"../types/tool.js\";\nimport { wpRequest } from \"../api/wp-rest.js\";\nimport { loadConfig } from \"../config.js\";\n\nasync function fetchLatestElementor(): Promise<{ free: string }> {\n try {\n const free = await fetch(\"https://api.wordpress.org/plugins/info/1.0/elementor.json\", {\n headers: { \"User-Agent\": \"elementor-mcp-agent\" },\n }).then((r) => r.json() as Promise<Record<string, unknown>>);\n return { free: (free.version as string) ?? \"unknown\" };\n } catch { return { free: \"unknown\" }; }\n}\n\nexport const checkElementorVersionsTool = defineTool({\n name: \"check_elementor_versions\",\n description: \"Fleet-wide Elementor version audit. For every site, fetches installed Elementor/Pro versions and compares against wordpress.org latest. Flags outdated installs.\",\n inputSchema: z.object({\n site_ids: z.array(z.string()).optional(),\n }),\n outputSchema: z.object({\n checked: z.number(),\n latest_elementor_free: z.string(),\n sites: z.array(z.object({\n site_id: z.string(),\n url: z.string(),\n elementor_version: z.string().optional(),\n elementor_pro_version: z.string().optional(),\n outdated_free: z.boolean(),\n error: z.string().optional(),\n })),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const cfg = loadConfig();\n const latest = await fetchLatestElementor();\n const targets = input.site_ids ? cfg.sites.filter((s) => input.site_ids?.includes(s.id)) : cfg.sites;\n const rows: Array<{\n site_id: string; url: string;\n elementor_version?: string; elementor_pro_version?: string;\n outdated_free: boolean; error?: string;\n }> = [];\n for (const site of targets) {\n try {\n const plugins = await wpRequest<Array<{ plugin: string; version: string }>>(\"/wp/v2/plugins\", { siteId: site.id });\n let elementor_version: string | undefined;\n let elementor_pro_version: string | undefined;\n for (const p of plugins) {\n if (p.plugin.startsWith(\"elementor/\") && p.plugin.endsWith(\"/elementor.php\")) elementor_version = p.version;\n if (p.plugin.startsWith(\"elementor-pro/\")) elementor_pro_version = p.version;\n }\n rows.push({\n site_id: site.id, url: site.url,\n elementor_version, elementor_pro_version,\n outdated_free: !!elementor_version && elementor_version !== latest.free && latest.free !== \"unknown\",\n });\n } catch (e) {\n rows.push({ site_id: site.id, url: site.url, outdated_free: false, error: (e as Error).message });\n }\n }\n return { checked: rows.length, latest_elementor_free: latest.free, sites: rows };\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../types/tool.js\";\nimport { wpRequest } from \"../api/wp-rest.js\";\nimport {\n parseElementorData,\n serializeElementorData,\n findElementById,\n} from \"../elementor/data-parser.js\";\nimport {\n readWidget, updateWidgetSettings, deleteWidget, duplicateWidget,\n swapWidgetType, addWidget, moveWidget,\n} from \"../elementor/widget-ops.js\";\nimport { validateElementorData } from \"../elementor/validator.js\";\nimport { fullBackup } from \"../elementor/backup.js\";\nimport { flushCSS } from \"../elementor/css-flush.js\";\nimport { POLICIES } from \"../elementor/policies.js\";\nimport { issueConfirmation, consumeConfirmation } from \"../utils/confirmation.js\";\nimport { verifyWrite, deepEqual, VerificationSchema } from \"../elementor/verify.js\";\n\n/**\n * Shared output contract for every mutating widget tool (v1.2+).\n *\n * Beyond the legacy `mode/page_id/...` fields we keep for compatibility, every\n * `applied` response now includes:\n *\n * - `verification` — canonical re-read of the page after write + per-op\n * predicate. `matches_requested: false` means the write API lied\n * (e.g. REST silently dropped the meta update). The model MUST treat\n * a falsy `matches_requested` as a hard failure even if the HTTP layer\n * said OK.\n * - `mutated` — true iff the serialized `_elementor_data` actually changed.\n * `false` means the requested op was a no-op (idempotent re-apply, or\n * silent drop — disambiguated by `verification.matches_requested`).\n * - `warnings` — non-fatal issues collected during the op (CSS flush\n * fallback used, SSH stderr noise, etc.). Always an array, never null.\n * - `backup_meta_key` — postmeta key where the pre-write snapshot lives,\n * so a model or operator can `restore_elementor_backup` if needed.\n *\n * This contract was prompted by Mads Hansen's comment on the v1.0 write-bug\n * post-mortem: a mutating tool MUST force the model to see ground truth,\n * not the write API's optimistic 200 OK.\n */\nconst MutationResponseShape = {\n mode: z.enum([\"dry_run\", \"applied\"]),\n page_id: z.number(),\n confirmation_token: z.string().optional(),\n backup_meta_key: z.string().optional(),\n css_flush: z.string().optional(),\n mutated: z.boolean().optional(),\n warnings: z.array(z.string()).optional(),\n verification: VerificationSchema.optional(),\n};\n\nasync function fetchData(\n siteId: string | undefined,\n pageId: number,\n): Promise<{ raw: string; data: ReturnType<typeof parseElementorData> }> {\n const page = await wpRequest<{ meta?: Record<string, unknown> }>(\n `/wp/v2/pages/${pageId}?context=edit&_fields=meta`,\n { siteId },\n );\n const v = page.meta?._elementor_data;\n const raw = typeof v === \"string\" ? v : JSON.stringify(v ?? []);\n return { raw, data: parseElementorData(raw) };\n}\n\nasync function writeData(\n siteId: string | undefined,\n pageId: number,\n data: ReturnType<typeof parseElementorData>,\n): Promise<{ method: string; serialized: string }> {\n const ser = serializeElementorData(data);\n const validation = validateElementorData(ser);\n if (!validation.valid) {\n throw new Error(\"Validation failed after edit: \" + validation.errors.join(\"; \"));\n }\n await wpRequest(`/wp/v2/pages/${pageId}`, {\n siteId, method: \"PUT\",\n body: { meta: { _elementor_data: ser } },\n });\n const flush = await flushCSS(siteId, pageId);\n return { method: flush.method, serialized: ser };\n}\n\nexport const readWidgetTool = defineTool({\n name: \"read_widget\",\n description: \"Fetch a single widget's full settings by id. Use list_widgets_in_page to find the id first.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n widget_id: z.string().min(1),\n }),\n outputSchema: z.object({\n widget_id: z.string(),\n widget_type: z.string().optional(),\n settings: z.record(z.any()),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const { data } = await fetchData(input.site_id, input.page_id);\n const w = readWidget(data, input.widget_id);\n if (!w) throw new Error(`Widget ${input.widget_id} not found on page ${input.page_id}`);\n return { widget_id: w.id, widget_type: w.widgetType, settings: w.settings as Record<string, unknown> };\n },\n});\n\nexport const updateWidgetSettingsTool = defineTool({\n name: \"update_widget_settings\",\n description: \"Shallow-merge a partial settings object into one widget. Backs up the page first, validates the result, auto-flushes CSS, then re-reads the page and verifies the patch persisted (matches_requested in the response). Two-call confirmation.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n widget_id: z.string().min(1),\n settings_patch: z.record(z.any()),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n ...MutationResponseShape,\n widget_id: z.string(),\n keys_changed: z.array(z.string()),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n if (!input.confirmation) {\n const token = issueConfirmation(\"update_widget_settings\", input, POLICIES.CONFIRMATION_TTL_SECONDS);\n return {\n mode: \"dry_run\" as const,\n page_id: input.page_id,\n widget_id: input.widget_id,\n keys_changed: Object.keys(input.settings_patch),\n confirmation_token: token,\n };\n }\n const conf = consumeConfirmation(input.confirmation, \"update_widget_settings\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const { raw: rawBefore, data } = await fetchData(input.site_id, input.page_id);\n if (!updateWidgetSettings(data, input.widget_id, input.settings_patch)) {\n throw new Error(`Widget ${input.widget_id} not found`);\n }\n const backup = await fullBackup(input.site_id, input.page_id);\n const w = await writeData(input.site_id, input.page_id, data);\n const verification = await verifyWrite({\n siteId: input.site_id,\n pageId: input.page_id,\n description: `Re-read /wp/v2/pages/${input.page_id} and check widget ${input.widget_id} settings include the requested patch`,\n predicate: (canonical) => {\n const widget = findElementById(canonical, input.widget_id);\n if (!widget) return { ok: false, notes: \"Widget no longer present after write\" };\n const persisted = widget.settings as Record<string, unknown>;\n const mismatches: string[] = [];\n for (const [k, want] of Object.entries(input.settings_patch)) {\n if (!deepEqual(persisted[k], want)) mismatches.push(k);\n }\n return {\n ok: mismatches.length === 0,\n persisted,\n notes: mismatches.length === 0\n ? undefined\n : `Persisted state diverges from requested patch on key(s): ${mismatches.join(\", \")}`,\n };\n },\n });\n return {\n mode: \"applied\" as const,\n page_id: input.page_id,\n widget_id: input.widget_id,\n keys_changed: Object.keys(input.settings_patch),\n backup_meta_key: backup.meta_key,\n css_flush: w.method,\n mutated: rawBefore !== w.serialized,\n warnings: [],\n verification,\n };\n },\n});\n\nexport const deleteWidgetTool = defineTool({\n name: \"delete_widget\",\n description: \"Remove a widget from a page by id. Two-call confirmation. Backs up before deleting; re-reads to confirm the widget is gone.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n widget_id: z.string().min(1),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n ...MutationResponseShape,\n widget_id: z.string(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n if (!input.confirmation) {\n const token = issueConfirmation(\"delete_widget\", input, POLICIES.CONFIRMATION_TTL_SECONDS);\n return { mode: \"dry_run\" as const, page_id: input.page_id, widget_id: input.widget_id, confirmation_token: token };\n }\n const conf = consumeConfirmation(input.confirmation, \"delete_widget\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const { raw: rawBefore, data } = await fetchData(input.site_id, input.page_id);\n if (!deleteWidget(data, input.widget_id)) throw new Error(`Widget ${input.widget_id} not found`);\n const backup = await fullBackup(input.site_id, input.page_id);\n const w = await writeData(input.site_id, input.page_id, data);\n const verification = await verifyWrite({\n siteId: input.site_id,\n pageId: input.page_id,\n description: `Re-read /wp/v2/pages/${input.page_id} and assert widget ${input.widget_id} is gone`,\n predicate: (canonical) => {\n const found = findElementById(canonical, input.widget_id);\n return {\n ok: found === null,\n notes: found ? \"Widget still present in canonical re-read — delete did not persist\" : undefined,\n };\n },\n });\n return {\n mode: \"applied\" as const,\n page_id: input.page_id,\n widget_id: input.widget_id,\n backup_meta_key: backup.meta_key,\n css_flush: w.method,\n mutated: rawBefore !== w.serialized,\n warnings: [],\n verification,\n };\n },\n});\n\nexport const duplicateWidgetTool = defineTool({\n name: \"duplicate_widget\",\n description: \"Duplicate a widget in place (right after the original). The clone gets a new id. Re-reads to confirm the clone persisted. Two-call confirmation.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n widget_id: z.string().min(1),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n ...MutationResponseShape,\n source_widget_id: z.string(),\n new_widget_id: z.string().optional(),\n }),\n annotations: { destructiveHint: false, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n if (!input.confirmation) {\n const token = issueConfirmation(\"duplicate_widget\", input, POLICIES.CONFIRMATION_TTL_SECONDS);\n return { mode: \"dry_run\" as const, page_id: input.page_id, source_widget_id: input.widget_id, confirmation_token: token };\n }\n const conf = consumeConfirmation(input.confirmation, \"duplicate_widget\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const { raw: rawBefore, data } = await fetchData(input.site_id, input.page_id);\n const r = duplicateWidget(data, input.widget_id);\n if (!r.ok || !r.new_widget_id) throw new Error(`Widget ${input.widget_id} not found`);\n const newId = r.new_widget_id;\n const backup = await fullBackup(input.site_id, input.page_id);\n const w = await writeData(input.site_id, input.page_id, data);\n const verification = await verifyWrite({\n siteId: input.site_id,\n pageId: input.page_id,\n description: `Re-read /wp/v2/pages/${input.page_id} and assert the clone (${newId}) exists alongside the source`,\n predicate: (canonical) => {\n const source = findElementById(canonical, input.widget_id);\n const clone = findElementById(canonical, newId);\n return {\n ok: source !== null && clone !== null,\n notes: !clone ? \"Clone not present in canonical re-read\" : (!source ? \"Original is missing after duplicate\" : undefined),\n };\n },\n });\n return {\n mode: \"applied\" as const,\n page_id: input.page_id,\n source_widget_id: input.widget_id,\n new_widget_id: newId,\n backup_meta_key: backup.meta_key,\n css_flush: w.method,\n mutated: rawBefore !== w.serialized,\n warnings: [],\n verification,\n };\n },\n});\n\nexport const swapWidgetTypeTool = defineTool({\n name: \"swap_widget_type\",\n description: \"Replace a widget's type (e.g., heading → button) while preserving its id and position. Provide full new_settings — the old settings are NOT carried over (different widget types have incompatible schemas). Re-reads to confirm. Two-call confirmation.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n widget_id: z.string().min(1),\n new_widget_type: z.string().min(1),\n new_settings: z.record(z.any()).default({}),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n ...MutationResponseShape,\n widget_id: z.string(),\n new_widget_type: z.string(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n if (!input.confirmation) {\n const token = issueConfirmation(\"swap_widget_type\", input, POLICIES.CONFIRMATION_TTL_SECONDS);\n return { mode: \"dry_run\" as const, page_id: input.page_id, widget_id: input.widget_id, new_widget_type: input.new_widget_type, confirmation_token: token };\n }\n const conf = consumeConfirmation(input.confirmation, \"swap_widget_type\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const { raw: rawBefore, data } = await fetchData(input.site_id, input.page_id);\n if (!swapWidgetType(data, input.widget_id, input.new_widget_type, input.new_settings)) {\n throw new Error(`Widget ${input.widget_id} not found`);\n }\n const backup = await fullBackup(input.site_id, input.page_id);\n const w = await writeData(input.site_id, input.page_id, data);\n const verification = await verifyWrite({\n siteId: input.site_id,\n pageId: input.page_id,\n description: `Re-read /wp/v2/pages/${input.page_id} and assert widget ${input.widget_id} now has widgetType=\"${input.new_widget_type}\"`,\n predicate: (canonical) => {\n const widget = findElementById(canonical, input.widget_id);\n if (!widget) return { ok: false, notes: \"Widget missing after swap\" };\n return {\n ok: widget.widgetType === input.new_widget_type,\n persisted: { widgetType: widget.widgetType, settings: widget.settings },\n notes: widget.widgetType === input.new_widget_type\n ? undefined\n : `Expected widgetType=\"${input.new_widget_type}\", canonical state has \"${widget.widgetType}\"`,\n };\n },\n });\n return {\n mode: \"applied\" as const,\n page_id: input.page_id,\n widget_id: input.widget_id,\n new_widget_type: input.new_widget_type,\n backup_meta_key: backup.meta_key,\n css_flush: w.method,\n mutated: rawBefore !== w.serialized,\n warnings: [],\n verification,\n };\n },\n});\n\nexport const addWidgetTool = defineTool({\n name: \"add_widget\",\n description: \"Append a new widget to a parent container (section, column, or container) on a page. Re-reads to confirm the new widget exists under the parent. Two-call confirmation.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n parent_id: z.string().min(1).describe(\"Id of the section/column/container that will receive the widget.\"),\n widget_type: z.string().min(1).describe(\"e.g., 'heading', 'text-editor', 'button', 'image'.\"),\n settings: z.record(z.any()).default({}),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n ...MutationResponseShape,\n parent_id: z.string(),\n widget_type: z.string(),\n new_widget_id: z.string().optional(),\n }),\n annotations: { destructiveHint: false, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n if (!input.confirmation) {\n const token = issueConfirmation(\"add_widget\", input, POLICIES.CONFIRMATION_TTL_SECONDS);\n return { mode: \"dry_run\" as const, page_id: input.page_id, parent_id: input.parent_id, widget_type: input.widget_type, confirmation_token: token };\n }\n const conf = consumeConfirmation(input.confirmation, \"add_widget\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const { raw: rawBefore, data } = await fetchData(input.site_id, input.page_id);\n const r = addWidget(data, input.parent_id, input.widget_type, input.settings);\n if (!r.ok || !r.new_widget_id) throw new Error(`Parent ${input.parent_id} not found`);\n const newId = r.new_widget_id;\n const backup = await fullBackup(input.site_id, input.page_id);\n const w = await writeData(input.site_id, input.page_id, data);\n const verification = await verifyWrite({\n siteId: input.site_id,\n pageId: input.page_id,\n description: `Re-read /wp/v2/pages/${input.page_id} and assert new widget ${newId} exists under parent ${input.parent_id} with widgetType=\"${input.widget_type}\"`,\n predicate: (canonical) => {\n const widget = findElementById(canonical, newId);\n if (!widget) return { ok: false, notes: \"New widget not found after add\" };\n const parent = findElementById(canonical, input.parent_id);\n const isUnderParent = parent?.elements?.some((e) => e.id === newId) === true;\n return {\n ok: widget.widgetType === input.widget_type && isUnderParent,\n notes: !isUnderParent\n ? `Widget exists but is not under expected parent ${input.parent_id}`\n : widget.widgetType !== input.widget_type\n ? `Widget exists with wrong widgetType \"${widget.widgetType}\"`\n : undefined,\n };\n },\n });\n return {\n mode: \"applied\" as const,\n page_id: input.page_id,\n parent_id: input.parent_id,\n widget_type: input.widget_type,\n new_widget_id: newId,\n backup_meta_key: backup.meta_key,\n css_flush: w.method,\n mutated: rawBefore !== w.serialized,\n warnings: [],\n verification,\n };\n },\n});\n\nexport const moveWidgetTool = defineTool({\n name: \"move_widget\",\n description: \"Move a widget to a different parent (or different position in the same parent). Re-reads to confirm new parent. Two-call confirmation.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n widget_id: z.string().min(1),\n new_parent_id: z.string().min(1),\n position: z.number().int().default(-1).describe(\"0-based position in the new parent. -1 = append.\"),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n ...MutationResponseShape,\n widget_id: z.string(),\n new_parent_id: z.string(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n if (!input.confirmation) {\n const token = issueConfirmation(\"move_widget\", input, POLICIES.CONFIRMATION_TTL_SECONDS);\n return { mode: \"dry_run\" as const, page_id: input.page_id, widget_id: input.widget_id, new_parent_id: input.new_parent_id, confirmation_token: token };\n }\n const conf = consumeConfirmation(input.confirmation, \"move_widget\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const { raw: rawBefore, data } = await fetchData(input.site_id, input.page_id);\n if (!moveWidget(data, input.widget_id, input.new_parent_id, input.position)) {\n throw new Error(`Widget or parent not found`);\n }\n const backup = await fullBackup(input.site_id, input.page_id);\n const w = await writeData(input.site_id, input.page_id, data);\n const verification = await verifyWrite({\n siteId: input.site_id,\n pageId: input.page_id,\n description: `Re-read /wp/v2/pages/${input.page_id} and assert widget ${input.widget_id} is now a direct child of ${input.new_parent_id}`,\n predicate: (canonical) => {\n const parent = findElementById(canonical, input.new_parent_id);\n const isUnderNewParent = parent?.elements?.some((e) => e.id === input.widget_id) === true;\n return {\n ok: isUnderNewParent,\n notes: isUnderNewParent ? undefined : `Widget ${input.widget_id} not found under ${input.new_parent_id} after move`,\n };\n },\n });\n return {\n mode: \"applied\" as const,\n page_id: input.page_id,\n widget_id: input.widget_id,\n new_parent_id: input.new_parent_id,\n backup_meta_key: backup.meta_key,\n css_flush: w.method,\n mutated: rawBefore !== w.serialized,\n warnings: [],\n verification,\n };\n },\n});\n","import { ElementorData, ElementorElement, findElementById, walkElements } from \"./data-parser.js\";\n\n/**\n * Operations on individual widgets inside an Elementor data tree.\n * All operations work on a deep-cloned tree — caller is responsible for\n * serializing the result and writing back.\n */\n\nexport function readWidget(data: ElementorData, widgetId: string): ElementorElement | null {\n return findElementById(data, widgetId);\n}\n\n/**\n * Shallow-merge new settings into an existing widget's settings.\n * Returns true if the widget was found and updated.\n */\nexport function updateWidgetSettings(\n data: ElementorData,\n widgetId: string,\n patch: Record<string, unknown>,\n): boolean {\n const widget = findElementById(data, widgetId);\n if (!widget || widget.elType !== \"widget\") return false;\n widget.settings = { ...widget.settings, ...patch };\n return true;\n}\n\n/**\n * Delete a widget by id. Returns true if removed.\n */\nexport function deleteWidget(data: ElementorData, widgetId: string): boolean {\n function removeFrom(arr: ElementorElement[]): boolean {\n for (let i = 0; i < arr.length; i++) {\n if (arr[i].id === widgetId) {\n arr.splice(i, 1);\n return true;\n }\n if (arr[i].elements && removeFrom(arr[i].elements!)) return true;\n }\n return false;\n }\n return removeFrom(data);\n}\n\n/**\n * Find the parent (section/column/container) of a widget.\n */\nexport function findParent(data: ElementorData, widgetId: string): ElementorElement | null {\n for (const { element } of walkElements(data)) {\n if (element.elements?.some((e) => e.id === widgetId)) return element;\n }\n return null;\n}\n\n/**\n * Duplicate a widget in place (right after the original in the parent's elements array).\n * Generates a new id for the clone.\n */\nexport function duplicateWidget(data: ElementorData, widgetId: string): { ok: boolean; new_widget_id?: string } {\n const parent = findParent(data, widgetId);\n if (!parent || !parent.elements) return { ok: false };\n const idx = parent.elements.findIndex((e) => e.id === widgetId);\n if (idx < 0) return { ok: false };\n const clone = JSON.parse(JSON.stringify(parent.elements[idx])) as ElementorElement;\n clone.id = generateId();\n parent.elements.splice(idx + 1, 0, clone);\n return { ok: true, new_widget_id: clone.id };\n}\n\n/**\n * Replace a widget's type while preserving id, position, and as many compatible\n * settings as possible. Useful for migrating from one widget type to another\n * (e.g., heading → text-editor).\n */\nexport function swapWidgetType(\n data: ElementorData,\n widgetId: string,\n newType: string,\n newSettings: Record<string, unknown> = {},\n): boolean {\n const widget = findElementById(data, widgetId);\n if (!widget || widget.elType !== \"widget\") return false;\n widget.widgetType = newType;\n widget.settings = newSettings;\n return true;\n}\n\n/**\n * Add a widget at the end of a parent container.\n */\nexport function addWidget(\n data: ElementorData,\n parentId: string,\n widgetType: string,\n settings: Record<string, unknown> = {},\n): { ok: boolean; new_widget_id?: string } {\n const parent = findElementById(data, parentId);\n if (!parent) return { ok: false };\n if (!parent.elements) parent.elements = [];\n const newWidget: ElementorElement = {\n id: generateId(),\n elType: \"widget\",\n widgetType,\n settings,\n elements: [],\n isInner: false,\n };\n parent.elements.push(newWidget);\n return { ok: true, new_widget_id: newWidget.id };\n}\n\n/**\n * Move a widget to a different parent (or different position in same parent).\n */\nexport function moveWidget(\n data: ElementorData,\n widgetId: string,\n newParentId: string,\n position: number = -1,\n): boolean {\n const widget = findElementById(data, widgetId);\n if (!widget) return false;\n const oldParent = findParent(data, widgetId);\n if (!oldParent || !oldParent.elements) return false;\n const newParent = findElementById(data, newParentId);\n if (!newParent) return false;\n if (!newParent.elements) newParent.elements = [];\n const idx = oldParent.elements.findIndex((e) => e.id === widgetId);\n if (idx < 0) return false;\n oldParent.elements.splice(idx, 1);\n if (position < 0 || position >= newParent.elements.length) {\n newParent.elements.push(widget);\n } else {\n newParent.elements.splice(position, 0, widget);\n }\n return true;\n}\n\n/**\n * Elementor uses 7-character hex ids by historical convention. We generate\n * something compatible-shaped.\n */\nfunction generateId(): string {\n return Math.random().toString(16).slice(2, 9).padEnd(7, \"0\");\n}\n","/**\n * Post-write verification — never trust the write API, always re-read.\n *\n * Background: WordPress REST API silently drops writes to unregistered postmeta\n * keys and returns 200 OK. Other failure modes exist (cache layers, race\n * conditions, plugin filters mutating data on save). A tool that returns\n * `{ success: true }` based purely on the HTTP response is lying to the model.\n *\n * This module re-fetches the canonical state from WP after every write and\n * runs an operation-specific predicate against it. The result is folded into\n * the tool response as a `verification` block, so the model can decide based\n * on what actually persisted, not what the API claimed.\n *\n * Pattern proposed by Mads Hansen (dev.to, May 22 2026) in response to the\n * v1.0 \"REST silently drops writes\" gotcha — implemented in v1.2 as a\n * generic primitive every mutating tool plugs into.\n */\nimport { z } from \"zod\";\nimport { wpRequest } from \"../api/wp-rest.js\";\nimport { parseElementorData, type ElementorData } from \"./data-parser.js\";\n\nexport const VerificationSchema = z.object({\n /** Plain-English description of what we re-read and compared. */\n method: z.string(),\n /** Whether a canonical re-read of the page succeeded. */\n reread_ok: z.boolean(),\n /** Op-specific: did the change we requested actually persist? */\n matches_requested: z.boolean(),\n /** Op-specific extra data (e.g. the actual persisted widget settings). */\n persisted: z.record(z.any()).optional(),\n /** Free-text notes / explanation when matches_requested is false. */\n notes: z.string().optional(),\n});\n\nexport type Verification = z.infer<typeof VerificationSchema>;\n\n/**\n * Re-fetches the page's `_elementor_data` from WP (canonical source after the\n * write) and runs the predicate. The predicate returns whether the requested\n * mutation is present in the persisted state.\n */\nexport async function verifyWrite(args: {\n siteId: string | undefined;\n pageId: number;\n predicate: (data: ElementorData) => { ok: boolean; persisted?: Record<string, unknown>; notes?: string };\n description: string;\n}): Promise<Verification> {\n try {\n const page = await wpRequest<{ meta?: Record<string, unknown> }>(\n `/wp/v2/pages/${args.pageId}?context=edit&_fields=meta`,\n { siteId: args.siteId },\n );\n const v = page.meta?._elementor_data;\n const raw = typeof v === \"string\" ? v : JSON.stringify(v ?? []);\n const data = parseElementorData(raw);\n const result = args.predicate(data);\n return {\n method: args.description,\n reread_ok: true,\n matches_requested: result.ok,\n persisted: result.persisted,\n notes: result.notes,\n };\n } catch (err) {\n return {\n method: args.description,\n reread_ok: false,\n matches_requested: false,\n notes: `Canonical re-read failed: ${(err as Error).message}`,\n };\n }\n}\n\n/** Deep equality good-enough for Elementor settings comparison. */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (a === null || b === null) return a === b;\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;\n return a.every((x, i) => deepEqual(x, b[i]));\n }\n if (typeof a === \"object\" && typeof b === \"object\") {\n const ka = Object.keys(a as object);\n const kb = Object.keys(b as object);\n if (ka.length !== kb.length) return false;\n return ka.every((k) =>\n deepEqual((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]),\n );\n }\n return false;\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"../types/tool.js\";\nimport { wpRequest } from \"../api/wp-rest.js\";\nimport { loadConfig } from \"../config.js\";\nimport { parseElementorData, serializeElementorData, findReplaceInWidgets } from \"../elementor/data-parser.js\";\nimport { fullBackup, restoreFromFile } from \"../elementor/backup.js\";\nimport { flushCSS } from \"../elementor/css-flush.js\";\nimport { validateElementorData } from \"../elementor/validator.js\";\nimport { POLICIES } from \"../elementor/policies.js\";\nimport { issueConfirmation, consumeConfirmation } from \"../utils/confirmation.js\";\n\nasync function listElementorPageIds(siteId: string | undefined): Promise<Array<{ id: number; title: string }>> {\n interface P { id: number; title: { rendered: string } }\n const out: Array<{ id: number; title: string }> = [];\n let page = 1;\n for (;;) {\n const items = await wpRequest<P[]>(\"/wp/v2/pages\", {\n siteId,\n query: {\n meta_key: \"_elementor_edit_mode\",\n meta_value: \"builder\",\n context: \"edit\",\n per_page: 100,\n page,\n _fields: \"id,title\",\n },\n });\n if (items.length === 0) break;\n out.push(...items.map((p) => ({ id: p.id, title: p.title.rendered })));\n if (items.length < 100) break;\n page++;\n if (page > 50) break; // sanity cap: 5000 pages\n }\n return out;\n}\n\nexport const bulkFindReplaceSiteTool = defineTool({\n name: \"bulk_find_replace_site\",\n description: \"Find/replace plain text in every Elementor page on a single site. TWO-CALL FLOW: dry-run returns per-page match_count + total + confirmation_token. Apply iterates each page (auto-backup + validate + flush per page). Slower than wp_search_replace but works without SSH and gives per-page granularity.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n find: z.string().min(1),\n replace: z.string(),\n widget_type: z.string().optional(),\n case_sensitive: z.boolean().default(false),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n mode: z.enum([\"dry_run\", \"applied\"]),\n site_id: z.string(),\n pages_scanned: z.number(),\n total_match_count: z.number(),\n pages_with_matches: z.array(z.object({\n page_id: z.number(),\n title: z.string(),\n match_count: z.number(),\n })),\n pages_applied: z.array(z.object({\n page_id: z.number(),\n backup_meta_key: z.string().optional(),\n css_flush: z.string().optional(),\n mode: z.enum([\"applied\", \"rolled_back\", \"skipped\"]),\n error: z.string().optional(),\n })).optional(),\n confirmation_token: z.string().optional(),\n expires_in_seconds: z.number().optional(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n const pages = await listElementorPageIds(input.site_id);\n const matches: Array<{ page_id: number; title: string; match_count: number }> = [];\n for (const p of pages) {\n try {\n const page = await wpRequest<{ meta?: Record<string, unknown> }>(`/wp/v2/pages/${p.id}?context=edit&_fields=meta`, { siteId: input.site_id });\n const v = page.meta?._elementor_data;\n const raw = typeof v === \"string\" ? v : JSON.stringify(v ?? []);\n const data = parseElementorData(raw);\n const dry = findReplaceInWidgets(JSON.parse(JSON.stringify(data)), input.find, input.replace, {\n widgetType: input.widget_type, caseSensitive: input.case_sensitive,\n });\n if (dry.replacementCount > 0) matches.push({ page_id: p.id, title: p.title, match_count: dry.replacementCount });\n } catch { /* skip pages we can't read */ }\n }\n const total = matches.reduce((s, m) => s + m.match_count, 0);\n\n if (!input.confirmation) {\n if (total === 0) {\n return {\n mode: \"dry_run\" as const,\n site_id: loadConfig().default_site_id ?? \"default\",\n pages_scanned: pages.length,\n total_match_count: 0,\n pages_with_matches: [],\n };\n }\n const token = issueConfirmation(\"bulk_find_replace_site\", { find: input.find, replace: input.replace, page_ids: matches.map((m) => m.page_id) }, POLICIES.CONFIRMATION_TTL_SECONDS);\n return {\n mode: \"dry_run\" as const,\n site_id: input.site_id ?? loadConfig().default_site_id ?? \"default\",\n pages_scanned: pages.length,\n total_match_count: total,\n pages_with_matches: matches,\n confirmation_token: token,\n expires_in_seconds: POLICIES.CONFIRMATION_TTL_SECONDS,\n };\n }\n\n const conf = consumeConfirmation(input.confirmation, \"bulk_find_replace_site\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n\n const applied: Array<{ page_id: number; backup_meta_key?: string; css_flush?: string; mode: \"applied\" | \"rolled_back\" | \"skipped\"; error?: string }> = [];\n for (const m of matches) {\n try {\n const page = await wpRequest<{ meta?: Record<string, unknown> }>(`/wp/v2/pages/${m.page_id}?context=edit&_fields=meta`, { siteId: input.site_id });\n const v = page.meta?._elementor_data;\n const raw = typeof v === \"string\" ? v : JSON.stringify(v ?? []);\n const data = parseElementorData(raw);\n findReplaceInWidgets(data, input.find, input.replace, { widgetType: input.widget_type, caseSensitive: input.case_sensitive });\n const ser = serializeElementorData(data);\n const validation = validateElementorData(ser);\n if (!validation.valid) {\n applied.push({ page_id: m.page_id, mode: \"rolled_back\", error: validation.errors.join(\"; \") });\n continue;\n }\n const backup = await fullBackup(input.site_id, m.page_id);\n await wpRequest(`/wp/v2/pages/${m.page_id}`, {\n siteId: input.site_id, method: \"PUT\",\n body: { meta: { _elementor_data: ser } },\n });\n const flush = await flushCSS(input.site_id, m.page_id);\n applied.push({ page_id: m.page_id, backup_meta_key: backup.meta_key, css_flush: flush.method, mode: \"applied\" });\n } catch (e) {\n applied.push({ page_id: m.page_id, mode: \"skipped\", error: (e as Error).message });\n }\n }\n return {\n mode: \"applied\" as const,\n site_id: input.site_id ?? loadConfig().default_site_id ?? \"default\",\n pages_scanned: pages.length,\n total_match_count: total,\n pages_with_matches: matches,\n pages_applied: applied,\n };\n },\n});\n\nexport const fleetFindReplaceTool = defineTool({\n name: \"fleet_find_replace\",\n description: \"Find/replace plain text across every Elementor page of every site in the pool. Same flow as bulk_find_replace_site but iterates across sites. Returns per-site + grand-total summary. Dry-run first; second call applies. Use sparingly — this is the nuclear option.\",\n inputSchema: z.object({\n find: z.string().min(1),\n replace: z.string(),\n site_ids: z.array(z.string()).optional().describe(\"Subset of sites to hit. Defaults to all.\"),\n widget_type: z.string().optional(),\n case_sensitive: z.boolean().default(false),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n mode: z.enum([\"dry_run\", \"applied\"]),\n sites_scanned: z.number(),\n total_match_count: z.number(),\n by_site: z.array(z.object({\n site_id: z.string(),\n url: z.string(),\n pages_scanned: z.number(),\n matches: z.number(),\n error: z.string().optional(),\n })),\n confirmation_token: z.string().optional(),\n expires_in_seconds: z.number().optional(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n const cfg = loadConfig();\n const targets = input.site_ids ? cfg.sites.filter((s) => input.site_ids?.includes(s.id)) : cfg.sites;\n const by_site: Array<{ site_id: string; url: string; pages_scanned: number; matches: number; error?: string }> = [];\n let total = 0;\n\n for (const site of targets) {\n try {\n const pages = await listElementorPageIds(site.id);\n let siteMatches = 0;\n for (const p of pages) {\n try {\n const page = await wpRequest<{ meta?: Record<string, unknown> }>(`/wp/v2/pages/${p.id}?context=edit&_fields=meta`, { siteId: site.id });\n const v = page.meta?._elementor_data;\n const raw = typeof v === \"string\" ? v : JSON.stringify(v ?? []);\n const data = parseElementorData(raw);\n const dry = findReplaceInWidgets(JSON.parse(JSON.stringify(data)), input.find, input.replace, {\n widgetType: input.widget_type, caseSensitive: input.case_sensitive,\n });\n siteMatches += dry.replacementCount;\n } catch { /* skip */ }\n }\n by_site.push({ site_id: site.id, url: site.url, pages_scanned: pages.length, matches: siteMatches });\n total += siteMatches;\n } catch (e) {\n by_site.push({ site_id: site.id, url: site.url, pages_scanned: 0, matches: 0, error: (e as Error).message });\n }\n }\n\n if (!input.confirmation) {\n if (total === 0) {\n return {\n mode: \"dry_run\" as const,\n sites_scanned: by_site.length,\n total_match_count: 0,\n by_site,\n };\n }\n const token = issueConfirmation(\"fleet_find_replace\", { find: input.find, replace: input.replace }, POLICIES.CONFIRMATION_TTL_SECONDS);\n return {\n mode: \"dry_run\" as const,\n sites_scanned: by_site.length,\n total_match_count: total,\n by_site,\n confirmation_token: token,\n expires_in_seconds: POLICIES.CONFIRMATION_TTL_SECONDS,\n };\n }\n\n const conf = consumeConfirmation(input.confirmation, \"fleet_find_replace\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n\n // Re-apply per site (sequentially — could parallelize later, but parallel writes across the fleet are scary)\n for (const site of targets) {\n const pages = await listElementorPageIds(site.id);\n for (const p of pages) {\n try {\n const page = await wpRequest<{ meta?: Record<string, unknown> }>(`/wp/v2/pages/${p.id}?context=edit&_fields=meta`, { siteId: site.id });\n const v = page.meta?._elementor_data;\n const raw = typeof v === \"string\" ? v : JSON.stringify(v ?? []);\n const data = parseElementorData(raw);\n const r = findReplaceInWidgets(data, input.find, input.replace, { widgetType: input.widget_type, caseSensitive: input.case_sensitive });\n if (r.replacementCount === 0) continue;\n const ser = serializeElementorData(data);\n const validation = validateElementorData(ser);\n if (!validation.valid) continue;\n await fullBackup(site.id, p.id);\n await wpRequest(`/wp/v2/pages/${p.id}`, {\n siteId: site.id, method: \"PUT\",\n body: { meta: { _elementor_data: ser } },\n });\n await flushCSS(site.id, p.id);\n } catch { /* skip */ }\n }\n }\n\n return {\n mode: \"applied\" as const,\n sites_scanned: by_site.length,\n total_match_count: total,\n by_site,\n };\n },\n});\n\nexport const restoreFromFileTool = defineTool({\n name: \"restore_from_file\",\n description: \"Restore a page from a JSON backup file (created by ANY earlier op with backup_to_file=true or by direct fullBackup with to_file). Requires the file_path returned by that backup. Two-call confirmation.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n file_path: z.string().min(1),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n mode: z.enum([\"dry_run\", \"restored\"]),\n page_id: z.number(),\n file_path: z.string(),\n method: z.enum([\"wp-cli\", \"rest\"]).optional(),\n pre_restore_backup_meta_key: z.string().optional(),\n css_flush: z.string().optional(),\n confirmation_token: z.string().optional(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n if (!input.confirmation) {\n const token = issueConfirmation(\"restore_from_file\", input, POLICIES.CONFIRMATION_TTL_SECONDS);\n return {\n mode: \"dry_run\" as const,\n page_id: input.page_id,\n file_path: input.file_path,\n confirmation_token: token,\n };\n }\n const conf = consumeConfirmation(input.confirmation, \"restore_from_file\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const pre = await fullBackup(input.site_id, input.page_id);\n const r = await restoreFromFile(input.site_id, input.page_id, input.file_path);\n const flush = await flushCSS(input.site_id, input.page_id);\n return {\n mode: \"restored\" as const,\n page_id: input.page_id,\n file_path: input.file_path,\n method: r.method,\n pre_restore_backup_meta_key: pre.meta_key,\n css_flush: flush.method,\n };\n },\n});\n","import type { ToolDefinition } from \"../types/tool.js\";\nimport { listSitesTool, pingSiteTool, siteHealthTool } from \"./sites.js\";\nimport {\n listElementorPagesTool, readPageElementorTool, listWidgetsInPageTool,\n listGlobalWidgetsTool, preflightCheckTool, findReplaceTool,\n listElementorBackupsTool, restoreElementorBackupTool, duplicateElementorPageTool,\n} from \"./pages.js\";\nimport {\n listTemplatesTool, exportTemplateTool, importTemplateTool, applyTemplateToPageTool,\n} from \"./templates.js\";\nimport {\n wpCliRunTool, wpSearchReplaceTool, wpElementorFlushCssTool, wpPluginListTool, wpPluginUpdateTool,\n} from \"./wpcli.js\";\nimport { screenshotPageTool, compareScreenshotsTool } from \"./visual.js\";\nimport { checkElementorVersionsTool } from \"./updates.js\";\nimport {\n readWidgetTool, updateWidgetSettingsTool, deleteWidgetTool, duplicateWidgetTool,\n swapWidgetTypeTool, addWidgetTool, moveWidgetTool,\n} from \"./widgets.js\";\nimport {\n bulkFindReplaceSiteTool, fleetFindReplaceTool, restoreFromFileTool,\n} from \"./bulk.js\";\n\nexport const tools: ToolDefinition[] = [\n // Sites & health\n listSitesTool, pingSiteTool, siteHealthTool,\n // Pages\n listElementorPagesTool, readPageElementorTool, listWidgetsInPageTool,\n listGlobalWidgetsTool, preflightCheckTool, findReplaceTool,\n listElementorBackupsTool, restoreElementorBackupTool, duplicateElementorPageTool,\n // Widget-level CRUD (v1.1)\n readWidgetTool, updateWidgetSettingsTool, deleteWidgetTool, duplicateWidgetTool,\n swapWidgetTypeTool, addWidgetTool, moveWidgetTool,\n // Templates\n listTemplatesTool, exportTemplateTool, importTemplateTool, applyTemplateToPageTool,\n // Bulk + fleet (v1.1)\n bulkFindReplaceSiteTool, fleetFindReplaceTool, restoreFromFileTool,\n // WP-CLI escape\n wpCliRunTool, wpSearchReplaceTool, wpElementorFlushCssTool, wpPluginListTool, wpPluginUpdateTool,\n // Visual\n screenshotPageTool, compareScreenshotsTool,\n // Versions\n checkElementorVersionsTool,\n] as unknown as ToolDefinition[];\n","import { readFileSync, existsSync, readdirSync } from \"node:fs\";\nimport { dirname, resolve, join, basename } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst DOCS_DIR = resolve(__dirname, \"../resources/elementor-docs\");\n\nexport interface Resource {\n uri: string;\n name: string;\n description?: string;\n mimeType: string;\n}\n\nexport async function listResources(): Promise<Resource[]> {\n if (!existsSync(DOCS_DIR)) return [];\n const files = readdirSync(DOCS_DIR).filter((f) => f.endsWith(\".md\"));\n return files.map((f) => ({\n uri: `elementor-docs://${f}`,\n name: basename(f, \".md\"),\n description: `Elementor documentation snippet (scraped from developer.elementor.com)`,\n mimeType: \"text/markdown\",\n }));\n}\n\nexport async function readResource(uri: string): Promise<{ contents: { uri: string; mimeType: string; text: string }[] }> {\n if (!uri.startsWith(\"elementor-docs://\")) {\n throw new Error(`Unknown resource URI: ${uri}`);\n }\n const filename = uri.replace(\"elementor-docs://\", \"\");\n const path = join(DOCS_DIR, filename);\n if (!existsSync(path)) throw new Error(`Resource not found: ${filename}`);\n return {\n contents: [\n {\n uri,\n mimeType: \"text/markdown\",\n text: readFileSync(path, \"utf8\"),\n },\n ],\n };\n}\n"],"mappings":"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","names":["s","cached","spawn","resolve","readFileSync","writeData","readFileSync","dirname","resolve","fileURLToPath","z","z","z","z","z","z","issueConfirmation","consumeConfirmation","POLICIES","fullBackup","flushCSS","parseSettingsForRest","z","z","m","flushCSS","z","spawn","existsSync","tmpdir","join","randomBytes","resolve","readFileSync","z","z","z","z","z","z","z","z","z","readFileSync","existsSync","join","__dirname","dirname","fileURLToPath","readFileSync","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/throttle/token-bucket.ts","../src/api/errors.ts","../src/utils/logger.ts","../src/api/wp-rest.ts","../src/transport/ssh-wpcli.ts","../src/elementor/backup.ts","../src/elementor/css-flush.ts","../src/elementor/policies.ts","../src/utils/confirmation.ts","../src/server.ts","../src/tools/sites.ts","../src/types/tool.ts","../src/tools/pages.ts","../src/elementor/data-parser.ts","../src/elementor/validator.ts","../src/elementor/globals.ts","../src/tools/templates.ts","../src/tools/wpcli.ts","../src/tools/visual.ts","../src/transport/screenshot.ts","../src/tools/updates.ts","../src/tools/widgets.ts","../src/elementor/widget-ops.ts","../src/elementor/verify.ts","../src/tools/bulk.ts","../src/tools/index.ts","../src/resources/index.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { z } from \"zod\";\n\nconst SiteSchema = z.object({\n id: z.string().min(1, \"site id required\"),\n url: z.string().url(\"invalid site url\"),\n username: z.string().min(1),\n application_password: z.string().min(20, \"WP application password should be ~24 chars\"),\n ssh: z\n .object({\n host: z.string(),\n user: z.string(),\n port: z.coerce.number().int().min(1).max(65535).default(22),\n path: z.string().describe(\"WP root path on remote, e.g. ~/sites/example.com\"),\n key_path: z.string().optional().describe(\"absolute path to private key\"),\n wp_cli_path: z.string().optional().describe(\"Explicit wp-cli invocation prefix. Examples: 'wp' (default, if wp is in PATH), 'php ~/bin/wp.phar', '/usr/local/bin/wp'. Auto-detected if omitted.\"),\n })\n .optional(),\n});\n\nconst ConfigSchema = z.object({\n sites: z.array(SiteSchema).min(1, \"at least one site is required\"),\n default_site_id: z.string().optional(),\n rate_limit_per_minute: z.coerce.number().int().min(1).max(600).default(60),\n confirmation_ttl_seconds: z.coerce.number().int().min(10).max(600).default(60),\n log_level: z.enum([\"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\", \"silent\"]).default(\"info\"),\n});\n\nexport type Site = z.infer<typeof SiteSchema>;\nexport type Config = z.infer<typeof ConfigSchema>;\n\nlet cached: Config | null = null;\n\n/**\n * Loads configuration from environment.\n *\n * Two supported formats:\n * 1) ELEMENTOR_MCP_SITES — JSON array of Site objects (recommended)\n * 2) ELEMENTOR_MCP_CONFIG_PATH — path to a JSON file containing {sites: [...], ...}\n *\n * Plus optional env vars: ELEMENTOR_MCP_DEFAULT_SITE_ID, ELEMENTOR_MCP_RATE_LIMIT,\n * ELEMENTOR_MCP_CONFIRMATION_TTL, LOG_LEVEL.\n */\nexport function loadConfig(): Config {\n if (cached) return cached;\n\n let raw: unknown;\n if (process.env.ELEMENTOR_MCP_SITES) {\n try {\n raw = { sites: JSON.parse(process.env.ELEMENTOR_MCP_SITES) };\n } catch (e) {\n throw new Error(\"ELEMENTOR_MCP_SITES must be valid JSON: \" + (e as Error).message);\n }\n } else if (process.env.ELEMENTOR_MCP_CONFIG_PATH) {\n try {\n raw = JSON.parse(readFileSync(process.env.ELEMENTOR_MCP_CONFIG_PATH, \"utf8\"));\n } catch (e) {\n throw new Error(\"Cannot read ELEMENTOR_MCP_CONFIG_PATH: \" + (e as Error).message);\n }\n } else {\n throw new Error(\n [\n \"No site configuration provided.\",\n \"\",\n \"How to set it up:\",\n \" • Easiest: set ELEMENTOR_MCP_SITES to a JSON array of sites. Example:\",\n ' ELEMENTOR_MCP_SITES=\\'[{\"id\":\"my-site\",\"url\":\"https://example.com\",',\n ' \"username\":\"admin\",\"application_password\":\"xxxx xxxx xxxx xxxx xxxx xxxx\"}]\\'',\n \"\",\n \" • Or: set ELEMENTOR_MCP_CONFIG_PATH to a JSON file with the same structure.\",\n \"\",\n \"Get a WordPress Application Password at:\",\n \" https://{your-site}/wp-admin/profile.php#application-passwords-section\",\n \"\",\n \"Full docs: https://github.com/Mogacode-ma/elementor-mcp-agent#configure\",\n ].join(\"\\n\"),\n );\n }\n\n const r = raw as Record<string, unknown>;\n const merged = {\n sites: (r.sites as unknown) ?? [],\n default_site_id: r.default_site_id ?? process.env.ELEMENTOR_MCP_DEFAULT_SITE_ID,\n rate_limit_per_minute:\n r.rate_limit_per_minute ?? process.env.ELEMENTOR_MCP_RATE_LIMIT ?? undefined,\n confirmation_ttl_seconds:\n r.confirmation_ttl_seconds ?? process.env.ELEMENTOR_MCP_CONFIRMATION_TTL ?? undefined,\n log_level: r.log_level ?? process.env.LOG_LEVEL ?? undefined,\n };\n\n const parsed = ConfigSchema.safeParse(merged);\n if (!parsed.success) {\n const issues = parsed.error.issues\n .map((i) => ` - ${i.path.join(\".\")}: ${i.message}`)\n .join(\"\\n\");\n throw new Error(\n [\n \"Invalid configuration — required values missing or malformed:\",\n issues,\n \"\",\n \"See https://github.com/Mogacode-ma/elementor-mcp-agent#configure\",\n ].join(\"\\n\"),\n );\n }\n cached = parsed.data;\n return cached;\n}\n\nexport function _resetConfigCache(): void {\n cached = null;\n}\n\nexport function getSite(siteId?: string): Site {\n const cfg = loadConfig();\n if (!siteId) {\n const def = cfg.default_site_id ?? cfg.sites[0]?.id;\n if (!def) throw new Error(\"No site configured\");\n const s = cfg.sites.find((x) => x.id === def);\n if (!s) throw new Error(`Default site '${def}' not found in sites list`);\n return s;\n }\n const s = cfg.sites.find((x) => x.id === siteId);\n if (!s) {\n const available = cfg.sites.map((x) => x.id).join(\", \");\n throw new Error(`Site '${siteId}' not found. Available: ${available}`);\n }\n return s;\n}\n","/**\n * Per-site token bucket so we don't hammer a WordPress install.\n * Default 60 req/min — most managed hosts (incl. Infomaniak) start throttling\n * around that rate on the wp-json endpoint.\n */\nexport class TokenBucket {\n private tokens: number;\n private lastRefill = Date.now();\n private readonly refillPerMs: number;\n\n constructor(private readonly capacityPerMinute: number) {\n this.tokens = capacityPerMinute;\n this.refillPerMs = capacityPerMinute / 60_000;\n }\n\n async acquire(): Promise<void> {\n while (this.tokens < 1) {\n this.refill();\n if (this.tokens < 1) await new Promise((r) => setTimeout(r, 80));\n }\n this.tokens -= 1;\n }\n\n private refill(): void {\n const now = Date.now();\n this.tokens = Math.min(\n this.capacityPerMinute,\n this.tokens + (now - this.lastRefill) * this.refillPerMs,\n );\n this.lastRefill = now;\n }\n\n get available(): number {\n this.refill();\n return Math.floor(this.tokens);\n }\n}\n\nconst buckets = new Map<string, TokenBucket>();\nexport function bucketFor(siteId: string, perMinute: number): TokenBucket {\n let b = buckets.get(siteId);\n if (!b) {\n b = new TokenBucket(perMinute);\n buckets.set(siteId, b);\n }\n return b;\n}\n","export type WPErrorKind = \"auth\" | \"not_found\" | \"validation\" | \"rate_limited\" | \"server\" | \"network\" | \"unknown\";\n\nexport class WPError extends Error {\n constructor(\n public readonly kind: WPErrorKind,\n public readonly code: string,\n message: string,\n public readonly raw?: unknown,\n ) {\n super(message);\n this.name = \"WPError\";\n }\n}\n\nexport function fromHttp(status: number, body: unknown, fallback = \"WordPress API error\"): WPError {\n const raw = body as Record<string, unknown> | undefined;\n const code = (raw?.code as string) ?? `http_${status}`;\n const msg = (raw?.message as string) ?? fallback;\n let kind: WPErrorKind = \"unknown\";\n if (status === 401 || status === 403) kind = \"auth\";\n else if (status === 404) kind = \"not_found\";\n else if (status === 422 || status === 400) kind = \"validation\";\n else if (status === 429) kind = \"rate_limited\";\n else if (status >= 500) kind = \"server\";\n return new WPError(kind, code, msg, body);\n}\n","import pino from \"pino\";\n\nexport const logger = pino(\n {\n level: process.env.LOG_LEVEL ?? \"info\",\n base: { name: \"elementor-mcp-agent\" },\n },\n // Critical: stdout is reserved for MCP JSON-RPC. All logs MUST go to stderr.\n pino.destination(2),\n);\n","import { loadConfig, getSite, Site } from \"../config.js\";\nimport { bucketFor } from \"../throttle/token-bucket.js\";\nimport { fromHttp, WPError } from \"./errors.js\";\nimport { logger } from \"../utils/logger.js\";\n\nfunction authHeader(site: Site): string {\n const encoded = Buffer.from(`${site.username}:${site.application_password}`).toString(\"base64\");\n return `Basic ${encoded}`;\n}\n\nexport interface RequestOptions {\n siteId?: string;\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n headers?: Record<string, string>;\n method?: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n}\n\nexport async function wpRequest<T = unknown>(\n path: string,\n opts: RequestOptions = {},\n): Promise<T> {\n const cfg = loadConfig();\n const site = getSite(opts.siteId);\n await bucketFor(site.id, cfg.rate_limit_per_minute).acquire();\n\n const url = new URL(path.startsWith(\"http\") ? path : `${site.url.replace(/\\/$/, \"\")}/wp-json${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`);\n if (opts.query) {\n for (const [k, v] of Object.entries(opts.query)) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n }\n\n const method = opts.method ?? (opts.body ? \"POST\" : \"GET\");\n const headers: Record<string, string> = {\n Authorization: authHeader(site),\n Accept: \"application/json\",\n \"User-Agent\": \"elementor-mcp-agent\",\n ...(opts.headers ?? {}),\n };\n if (opts.body && !headers[\"Content-Type\"]) headers[\"Content-Type\"] = \"application/json\";\n\n logger.debug({ method, url: url.toString(), site_id: site.id }, \"wp request\");\n\n let res: Response;\n try {\n res = await fetch(url.toString(), {\n method,\n headers,\n body: opts.body ? JSON.stringify(opts.body) : undefined,\n });\n } catch (e) {\n throw new WPError(\"network\", \"fetch_failed\", `Network error: ${(e as Error).message}`, e);\n }\n\n const text = await res.text();\n let parsed: unknown = text;\n if (text && (res.headers.get(\"content-type\") ?? \"\").includes(\"application/json\")) {\n try {\n parsed = JSON.parse(text);\n } catch {\n // fall through with raw text\n }\n }\n\n if (!res.ok) {\n throw fromHttp(res.status, parsed);\n }\n return parsed as T;\n}\n","import { spawn } from \"node:child_process\";\nimport { logger } from \"../utils/logger.js\";\nimport type { Site } from \"../config.js\";\n\nexport interface WpCliResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n duration_ms: number;\n command: string;\n}\n\nconst wpCliPathCache = new Map<string, string>();\n\nasync function detectWpCliPath(site: Site, sshOpts: string[]): Promise<string> {\n if (site.ssh?.wp_cli_path) return site.ssh.wp_cli_path;\n const cached = wpCliPathCache.get(site.id);\n if (cached) return cached;\n // Try a probe command: which wp || ls ~/bin/wp.phar || ls ~/wp-cli.phar\n const probe = `command -v wp 2>/dev/null && echo wp || (test -f \"$HOME/bin/wp.phar\" && echo \"php $HOME/bin/wp.phar\") || (test -f \"$HOME/wp-cli.phar\" && echo \"php $HOME/wp-cli.phar\") || echo NONE`;\n const { spawn } = await import(\"node:child_process\");\n const result = await new Promise<string>((resolve) => {\n const child = spawn(\"ssh\", [...sshOpts, `${site.ssh!.user}@${site.ssh!.host}`, probe], { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let out = \"\";\n child.stdout.on(\"data\", (b: Buffer) => { out += b.toString(); });\n child.on(\"close\", () => resolve(out.trim().split(\"\\n\").pop() ?? \"NONE\"));\n });\n const detected = result === \"NONE\" ? \"wp\" : result;\n wpCliPathCache.set(site.id, detected);\n return detected;\n}\n\nexport async function sshWpCli(site: Site, wpArgs: string, opts: { timeout_ms?: number } = {}): Promise<WpCliResult> {\n if (!site.ssh) {\n throw new Error(\n `Site '${site.id}' has no SSH configuration. WP-CLI tools require SSH access. ` +\n `Add an \"ssh\" object to the site config with at least {host, user, path}.`,\n );\n }\n const { host, user, port, path: wpPath, key_path } = site.ssh;\n const timeout = opts.timeout_ms ?? 60_000;\n\n const sshArgs = [\n \"-o\", \"StrictHostKeyChecking=no\",\n \"-o\", \"BatchMode=yes\",\n \"-o\", `ConnectTimeout=${Math.min(15, Math.floor(timeout / 1000))}`,\n \"-p\", String(port ?? 22),\n ];\n if (key_path) sshArgs.push(\"-i\", key_path);\n\n const wpCmd = await detectWpCliPath(site, sshArgs);\n sshArgs.push(`${user}@${host}`);\n const remoteCmd = `${wpCmd} --path=${shellEscape(wpPath)} ${wpArgs}`;\n sshArgs.push(remoteCmd);\n\n logger.debug({ site_id: site.id, cmd: remoteCmd }, \"ssh wp-cli\");\n const t0 = Date.now();\n\n return new Promise<WpCliResult>((resolve, reject) => {\n const child = spawn(\"ssh\", sshArgs, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n const killer = setTimeout(() => {\n child.kill(\"SIGKILL\");\n reject(new Error(`SSH wp-cli timed out after ${timeout}ms: ${remoteCmd}`));\n }, timeout);\n child.stdout.on(\"data\", (b: Buffer) => { stdout += b.toString(); });\n child.stderr.on(\"data\", (b: Buffer) => { stderr += b.toString(); });\n child.on(\"error\", (e) => { clearTimeout(killer); reject(e); });\n child.on(\"close\", (code) => {\n clearTimeout(killer);\n const duration_ms = Date.now() - t0;\n // Filter out non-error SSH banner warnings that pollute stderr (e.g. post-quantum advisory)\n const cleanedStderr = stderr.split(\"\\n\").filter((l) => !l.includes(\"post-quantum\") && !l.includes(\"openssh.com/pq\") && !l.includes(\"decrypt later\") && !l.includes(\"This session may be\") && !l.includes(\"server may need to be\")).join(\"\\n\").trim();\n resolve({\n stdout: stdout.trim(),\n stderr: cleanedStderr,\n exitCode: code ?? -1,\n duration_ms,\n command: remoteCmd,\n });\n });\n });\n}\n\nfunction shellEscape(s: string): string {\n return `'${s.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nexport const DESTRUCTIVE_WPCLI_PATTERNS: RegExp[] = [\n /\\bdelete-all\\b/i,\n /\\bdelete\\b(?!.*--dry-run)/i,\n /\\bdrop\\b/i,\n /\\bdb\\s+(reset|drop)\\b/i,\n /\\bpost\\s+delete\\b/i,\n /\\boption\\s+delete\\b/i,\n /\\bplugin\\s+(deactivate|uninstall)\\b/i,\n /\\bsearch-replace\\b(?!.*--dry-run)/i,\n /\\buser\\s+delete\\b/i,\n];\n\nexport function isDestructiveWpCli(args: string): boolean {\n return DESTRUCTIVE_WPCLI_PATTERNS.some((p) => p.test(args));\n}\n","import { writeFileSync, mkdirSync, existsSync, readFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { wpRequest } from \"../api/wp-rest.js\";\nimport { sshWpCli } from \"../transport/ssh-wpcli.js\";\nimport { getSite } from \"../config.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst BACKUP_DIR = process.env.ELEMENTOR_MCP_BACKUP_DIR ?? join(tmpdir(), \"elementor-mcp-backups\");\n\nexport interface BackupResult {\n meta_key: string;\n page_settings_meta_key?: string;\n file_path?: string;\n size_bytes: number;\n method: \"wp-cli\" | \"file\" | \"rest\";\n}\n\n/**\n * Full backup of _elementor_data + _elementor_page_settings.\n *\n * Strategy (priorities):\n * 1) WP-CLI via SSH — always works, writes real postmeta even for unregistered keys\n * 2) File-based — if SSH unavailable, dump to /tmp/elementor-mcp-backups/\n * 3) REST PUT — only works if the meta key is registered with show_in_rest=true\n * (NOT the case for our timestamped backup keys → silent loss)\n *\n * REST is deliberately deprioritized because WP silently drops writes to\n * unregistered meta keys. We always prefer WP-CLI when available.\n */\nexport async function fullBackup(\n siteId: string | undefined,\n postId: number,\n opts: { to_file?: boolean; force_file_only?: boolean } = {},\n): Promise<BackupResult> {\n // Read current state via REST (works for the canonical Elementor keys)\n const current = await wpRequest<{ meta: Record<string, unknown>; title: { rendered: string } }>(\n `/wp/v2/pages/${postId}?context=edit&_fields=meta,title`,\n { siteId },\n );\n const data_raw_v = current.meta?._elementor_data;\n const data_raw = typeof data_raw_v === \"string\" ? data_raw_v : JSON.stringify(data_raw_v ?? []);\n const settings_raw_v = current.meta?._elementor_page_settings;\n const settings_raw = typeof settings_raw_v === \"string\" ? settings_raw_v : JSON.stringify(settings_raw_v ?? {});\n const ts = new Date().toISOString().replace(/[:.]/g, \"-\");\n const meta_key = `_elementor_data_backup_${ts}`;\n const page_settings_meta_key = `_elementor_page_settings_backup_${ts}`;\n const size_bytes = data_raw.length + settings_raw.length;\n\n const site = getSite(siteId);\n let method: BackupResult[\"method\"] = \"file\";\n\n // Strategy 1: WP-CLI postmeta write (preferred)\n if (site.ssh && !opts.force_file_only) {\n try {\n // wp post meta update uses positional args; we pipe the value via stdin to avoid shell quoting issues\n const setDataCmd = `post meta update ${postId} ${meta_key} ${shellQuote(data_raw)}`;\n const setSettingsCmd = `post meta update ${postId} ${page_settings_meta_key} ${shellQuote(settings_raw)}`;\n const r1 = await sshWpCli(site, setDataCmd, { timeout_ms: 30_000 });\n if (r1.exitCode !== 0) throw new Error(`wp-cli postmeta data set failed: ${r1.stderr}`);\n const r2 = await sshWpCli(site, setSettingsCmd, { timeout_ms: 30_000 });\n if (r2.exitCode !== 0) throw new Error(`wp-cli postmeta settings set failed: ${r2.stderr}`);\n method = \"wp-cli\";\n } catch (e) {\n logger.warn({ err: (e as Error).message }, \"WP-CLI backup failed, falling back to file\");\n }\n }\n\n // Strategy 2: File backup (always do it if requested OR if WP-CLI failed AND no postmeta was written)\n let file_path: string | undefined;\n if (opts.to_file || method !== \"wp-cli\") {\n if (!existsSync(BACKUP_DIR)) mkdirSync(BACKUP_DIR, { recursive: true });\n const safeSiteId = (siteId ?? \"default\").replace(/[^a-zA-Z0-9_-]/g, \"_\");\n const filename = `${safeSiteId}_page${postId}_${ts}.json`;\n file_path = join(BACKUP_DIR, filename);\n writeFileSync(file_path, JSON.stringify({\n site_id: siteId,\n page_id: postId,\n title: current.title.rendered,\n timestamp: ts,\n _elementor_data: data_raw,\n _elementor_page_settings: settings_raw,\n }, null, 2));\n if (method !== \"wp-cli\") method = \"file\";\n logger.info({ file_path }, \"backup written to file\");\n }\n\n return {\n meta_key,\n page_settings_meta_key,\n file_path,\n size_bytes,\n method,\n };\n}\n\n/**\n * Restore from a postmeta backup (created by fullBackup with WP-CLI strategy).\n * Uses WP-CLI to read the backup meta value (since REST won't expose it) and\n * then REST to write back the canonical _elementor_data.\n */\nexport async function restoreBackup(\n siteId: string | undefined,\n postId: number,\n data_meta_key: string,\n settings_meta_key?: string,\n): Promise<{ restored: boolean; method: \"wp-cli\" | \"rest\" }> {\n const site = getSite(siteId);\n if (!site.ssh) {\n throw new Error(\"Restoring from postmeta backup requires SSH (WP-CLI). For file backups, use restoreFromFile.\");\n }\n // Read backup value via WP-CLI\n const r1 = await sshWpCli(site, `post meta get ${postId} ${data_meta_key}`, { timeout_ms: 30_000 });\n if (r1.exitCode !== 0) throw new Error(`Backup '${data_meta_key}' not found: ${r1.stderr}`);\n const data_value = r1.stdout;\n if (!data_value) throw new Error(`Backup '${data_meta_key}' is empty`);\n\n let settings_value: string | undefined;\n if (settings_meta_key) {\n const r2 = await sshWpCli(site, `post meta get ${postId} ${settings_meta_key}`, { timeout_ms: 30_000 });\n if (r2.exitCode === 0 && r2.stdout) settings_value = r2.stdout;\n }\n\n // Write back via WP-CLI (so we don't depend on _elementor_data being REST-writable; it is, but consistency)\n const writeData = await sshWpCli(site, `post meta update ${postId} _elementor_data ${shellQuote(data_value)}`, { timeout_ms: 30_000 });\n if (writeData.exitCode !== 0) throw new Error(`Restore write failed: ${writeData.stderr}`);\n if (settings_value !== undefined) {\n await sshWpCli(site, `post meta update ${postId} _elementor_page_settings ${shellQuote(settings_value)}`, { timeout_ms: 30_000 });\n }\n return { restored: true, method: \"wp-cli\" };\n}\n\n/**\n * List backups on a page using WP-CLI (REST won't expose custom postmeta keys).\n */\nexport async function listBackups(\n siteId: string | undefined,\n postId: number,\n): Promise<Array<{ meta_key: string; settings_key?: string; timestamp: string }>> {\n const site = getSite(siteId);\n if (!site.ssh) {\n throw new Error(\"Listing postmeta backups requires SSH (WP-CLI). REST API doesn't expose unregistered custom postmeta keys.\");\n }\n const r = await sshWpCli(site, `post meta list ${postId} --format=json --fields=meta_key`, { timeout_ms: 30_000 });\n if (r.exitCode !== 0) throw new Error(`wp-cli post meta list failed: ${r.stderr}`);\n interface MetaKey { meta_key: string; }\n const all = JSON.parse(r.stdout) as MetaKey[];\n const dataBackupKeys = all.filter((m) => m.meta_key.startsWith(\"_elementor_data_backup_\"));\n const settingsBackupKeys = new Set(all.filter((m) => m.meta_key.startsWith(\"_elementor_page_settings_backup_\")).map((m) => m.meta_key));\n return dataBackupKeys.map((m) => {\n const ts = m.meta_key.replace(\"_elementor_data_backup_\", \"\");\n const expectedSettingsKey = `_elementor_page_settings_backup_${ts}`;\n return {\n meta_key: m.meta_key,\n settings_key: settingsBackupKeys.has(expectedSettingsKey) ? expectedSettingsKey : undefined,\n timestamp: ts,\n };\n });\n}\n\n/**\n * Restore from a file backup (output of fullBackup with to_file=true).\n * Uses WP-CLI if available, falls back to REST (works for _elementor_data which is registered).\n */\nexport async function restoreFromFile(\n siteId: string | undefined,\n postId: number,\n file_path: string,\n): Promise<{ restored: boolean; method: \"wp-cli\" | \"rest\" }> {\n if (!existsSync(file_path)) throw new Error(`Backup file not found: ${file_path}`);\n const j = JSON.parse(readFileSync(file_path, \"utf8\")) as {\n _elementor_data?: string;\n _elementor_page_settings?: string;\n };\n if (!j._elementor_data) throw new Error(\"Backup file missing _elementor_data\");\n\n const site = getSite(siteId);\n if (site.ssh) {\n await sshWpCli(site, `post meta update ${postId} _elementor_data ${shellQuote(j._elementor_data)}`, { timeout_ms: 30_000 });\n if (j._elementor_page_settings) {\n await sshWpCli(site, `post meta update ${postId} _elementor_page_settings ${shellQuote(j._elementor_page_settings)}`, { timeout_ms: 30_000 });\n }\n return { restored: true, method: \"wp-cli\" };\n }\n // REST fallback (works for _elementor_data, may silently no-op for _elementor_page_settings)\n await wpRequest(`/wp/v2/pages/${postId}`, {\n siteId, method: \"PUT\",\n body: {\n meta: {\n _elementor_data: j._elementor_data,\n ...(j._elementor_page_settings ? { _elementor_page_settings: j._elementor_page_settings } : {}),\n },\n },\n });\n return { restored: true, method: \"rest\" };\n}\n\nfunction shellQuote(s: string): string {\n return `'${s.replace(/'/g, \"'\\\\''\")}'`;\n}\n","import { wpRequest } from \"../api/wp-rest.js\";\nimport { sshWpCli } from \"../transport/ssh-wpcli.js\";\nimport { getSite } from \"../config.js\";\nimport { logger } from \"../utils/logger.js\";\n\nexport type FlushMethod = \"rest\" | \"wp-cli\" | \"option-delete\" | \"resave\" | \"none\";\n\nexport interface FlushResult {\n method: FlushMethod;\n details?: string;\n}\n\n/**\n * Flush Elementor CSS cache. Three-level fallback strategy:\n * 1) REST endpoint (newer Elementor versions)\n * 2) WP-CLI `wp elementor flush-css` (if SSH configured + plugin CLI extension installed)\n * 3) Manual option/meta delete via REST or WP-CLI\n * 4) Last resort: re-save the page (causes regen on next view)\n */\nexport async function flushCSS(\n siteId: string | undefined,\n postId?: number,\n): Promise<FlushResult> {\n // Strategy 1: REST endpoint\n try {\n const url = postId ? `/elementor/v1/css?id=${postId}&action=regenerate` : `/elementor/v1/css?action=regenerate`;\n await wpRequest(url, { siteId, method: \"POST\" });\n return { method: \"rest\" };\n } catch (e) {\n logger.debug({ err: (e as Error).message }, \"REST css flush failed, trying next\");\n }\n\n // Strategy 2: WP-CLI native command\n try {\n const site = getSite(siteId);\n if (site.ssh) {\n const r = await sshWpCli(site, \"elementor flush-css\");\n if (r.exitCode === 0) return { method: \"wp-cli\", details: r.stdout };\n }\n } catch (e) {\n logger.debug({ err: (e as Error).message }, \"WP-CLI css flush failed, trying next\");\n }\n\n // Strategy 3: option + post-meta delete via WP-CLI\n try {\n const site = getSite(siteId);\n if (site.ssh) {\n await sshWpCli(site, \"option delete _elementor_global_css\", { timeout_ms: 30_000 });\n await sshWpCli(site, \"post meta delete-all _elementor_css\", { timeout_ms: 30_000 });\n return { method: \"option-delete\" };\n }\n } catch (e) {\n logger.debug({ err: (e as Error).message }, \"WP-CLI option-delete failed, trying next\");\n }\n\n // Strategy 4: re-save the page to trigger regen\n if (postId) {\n try {\n await wpRequest(`/wp/v2/pages/${postId}`, {\n siteId,\n method: \"PUT\",\n body: { date: new Date().toISOString() },\n });\n return { method: \"resave\" };\n } catch (e) {\n logger.warn({ err: (e as Error).message }, \"Resave fallback also failed\");\n }\n }\n\n return { method: \"none\", details: \"All CSS flush strategies failed\" };\n}\n","/**\n * Hardcoded safety policies for the Elementor MCP.\n * These rules are intentionally inflexible — they encode lessons from real\n * production incidents on client sites.\n */\n\nexport const POLICIES = {\n // Always backup _elementor_data BEFORE any write\n BACKUP_BEFORE_WRITE: true,\n // Always backup _elementor_page_settings too (it carries page-level CSS, fonts, layout)\n BACKUP_PAGE_SETTINGS: true,\n // Re-validate the JSON after a programmatic edit; abort + auto-restore if invalid\n VALIDATE_JSON_AFTER_EDIT: true,\n // Block edits to global widgets unless caller explicitly opts in\n BLOCK_GLOBAL_WIDGET_WRITES_BY_DEFAULT: true,\n // Confirmation token TTL — short for destructive ops\n CONFIRMATION_TTL_SECONDS: 60,\n // Stricter TTL for global widget ops (less margin for mistakes)\n GLOBAL_WIDGET_CONFIRMATION_TTL_SECONDS: 30,\n // CSS flush is non-optional after _elementor_data writes\n FLUSH_CSS_AFTER_WRITE: true,\n // Maximum size of a single page's _elementor_data we'll touch (sanity bound)\n MAX_ELEMENTOR_DATA_BYTES: 5 * 1024 * 1024, // 5 MB\n // wp-cli commands matching this pattern require confirmation\n WP_CLI_DESTRUCTIVE_REQUIRES_CONFIRM: true,\n} as const;\n\nexport const FORBIDDEN_WPCLI_PATTERNS: RegExp[] = [\n // Hard 'no' regardless of confirmation — we never accept these\n /\\brm\\s+-rf\\b/i,\n /\\bsudo\\b/i,\n /\\bdb\\s+reset\\s+--yes\\b/i,\n /\\bdb\\s+drop\\s+--yes\\b/i,\n];\n\nexport function isForbiddenWpCli(args: string): { forbidden: boolean; reason?: string } {\n for (const p of FORBIDDEN_WPCLI_PATTERNS) {\n if (p.test(args)) return { forbidden: true, reason: `Pattern ${p} is hard-blocked.` };\n }\n return { forbidden: false };\n}\n","import { randomBytes } from \"node:crypto\";\n\ninterface PendingConfirmation {\n token: string;\n intent: string;\n payload: unknown;\n expiresAt: number;\n}\n\nconst pending = new Map<string, PendingConfirmation>();\n\nexport function issueConfirmation(intent: string, payload: unknown, ttlSeconds: number): string {\n const token = randomBytes(8).toString(\"hex\");\n pending.set(token, {\n token,\n intent,\n payload,\n expiresAt: Date.now() + ttlSeconds * 1000,\n });\n return token;\n}\n\nexport function consumeConfirmation(\n token: string,\n expectedIntent: string,\n): PendingConfirmation | null {\n const c = pending.get(token);\n if (!c) return null;\n pending.delete(token);\n if (c.expiresAt < Date.now()) return null;\n if (c.intent !== expectedIntent) return null;\n return c;\n}\n\nexport function _clearAllConfirmations(): void {\n pending.clear();\n}\n","/**\n * MCP server entry point — stdio transport.\n *\n * Run with: `npm run dev` (watch) or `npm start` (compiled).\n * Test interactively: `npm run inspector`.\n */\nimport { readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\n\nimport { loadConfig } from \"./config.js\";\nimport { tools } from \"./tools/index.js\";\nimport { logger } from \"./utils/logger.js\";\nimport { listResources, readResource } from \"./resources/index.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(resolve(__dirname, \"../package.json\"), \"utf8\")) as {\n name: string;\n version: string;\n};\n\nfunction toMcpInputSchema(zod: z.ZodType<unknown>): Record<string, unknown> {\n // Draft 7 — accepted by both Anthropic API and the broader MCP ecosystem.\n return zodToJsonSchema(zod, { target: \"jsonSchema7\", $refStrategy: \"none\" }) as Record<string, unknown>;\n}\n\nasync function main() {\n // Validate config early — fail fast with a clear message rather than letting tools blow up\n try {\n loadConfig();\n } catch (e) {\n logger.error((e as Error).message);\n process.stderr.write(\"\\n\" + (e as Error).message + \"\\n\");\n process.exit(1);\n }\n\n const server = new Server(\n { name: pkg.name, version: pkg.version },\n { capabilities: { tools: {}, resources: {} } },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: tools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: toMcpInputSchema(t.inputSchema),\n outputSchema: t.outputSchema ? toMcpInputSchema(t.outputSchema) : undefined,\n annotations: t.annotations,\n })),\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (req) => {\n const tool = tools.find((t) => t.name === req.params.name);\n if (!tool) throw new Error(`Unknown tool: ${req.params.name}`);\n const args = (req.params.arguments ?? {}) as unknown;\n const parsed = tool.inputSchema.safeParse(args);\n if (!parsed.success) {\n const msg = parsed.error.issues.map((i) => ` ${i.path.join(\".\")}: ${i.message}`).join(\"\\n\");\n return {\n content: [{ type: \"text\" as const, text: `Invalid arguments for ${tool.name}:\\n${msg}` }],\n isError: true,\n };\n }\n try {\n const result = await tool.handler(parsed.data);\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (e) {\n logger.error({ tool: tool.name, err: (e as Error).message }, \"tool error\");\n return {\n content: [{ type: \"text\" as const, text: `${tool.name} failed: ${(e as Error).message}` }],\n isError: true,\n };\n }\n });\n\n // Resources — Elementor docs corpus\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: await listResources(),\n }));\n server.setRequestHandler(ReadResourceRequestSchema, async (req) => readResource(req.params.uri));\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n logger.info({ tools: tools.length }, `${pkg.name} v${pkg.version} ready`);\n\n // Friendly greeting on stderr — discreet, polite, suppressible.\n // stderr is the convention for human-readable logs in MCP servers\n // (stdout is reserved for the JSON-RPC transport).\n if (!process.env[\"SUPPRESS_BANNER\"] && !process.env[\"CI\"]) {\n process.stderr.write(\n `\\n ▸ ${pkg.name} v${pkg.version} — ${tools.length} tools ready.\\n` +\n ` if this helps you, a ⭐ on github.com/Mogacode-ma/elementor-mcp-agent\\n` +\n ` is the best thanks. (set SUPPRESS_BANNER=1 to silence this)\\n\\n`,\n );\n }\n}\n\nmain().catch((e) => {\n logger.error((e as Error).message);\n process.stderr.write(\"\\n\" + (e as Error).message + \"\\n\");\n process.exit(1);\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../types/tool.js\";\nimport { loadConfig, getSite } from \"../config.js\";\nimport { wpRequest } from \"../api/wp-rest.js\";\n\nexport const listSitesTool = defineTool({\n name: \"list_sites\",\n description: \"List every WordPress site configured. Best called first in a session.\",\n inputSchema: z.object({}),\n outputSchema: z.object({\n total: z.number(),\n default_site_id: z.string().optional(),\n sites: z.array(z.object({\n id: z.string(), url: z.string(), username: z.string(), has_ssh: z.boolean(),\n })),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },\n async handler() {\n const cfg = loadConfig();\n return {\n total: cfg.sites.length,\n default_site_id: cfg.default_site_id ?? cfg.sites[0]?.id,\n sites: cfg.sites.map((s) => ({ id: s.id, url: s.url, username: s.username, has_ssh: !!s.ssh })),\n };\n },\n});\n\nexport const pingSiteTool = defineTool({\n name: \"ping_site\",\n description: \"Verify connectivity + authentication to a WordPress site. Returns user identity + WP/Elementor/Elementor Pro versions if accessible.\",\n inputSchema: z.object({ site_id: z.string().optional() }),\n outputSchema: z.object({\n ok: z.boolean(),\n site_id: z.string(),\n url: z.string(),\n wp_version: z.string().optional(),\n elementor_version: z.string().optional(),\n elementor_pro_version: z.string().optional(),\n user: z.object({ id: z.number(), name: z.string(), roles: z.array(z.string()).optional() }).optional(),\n error: z.string().optional(),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const site = getSite(input.site_id);\n try {\n const me = await wpRequest<{ id: number; name: string; roles?: string[] }>(\"/wp/v2/users/me?context=edit\", { siteId: site.id });\n let wp_version: string | undefined;\n try {\n const health = await wpRequest<{ wordpress: { version: string } }>(\"/wp-site-health/v1/info\", { siteId: site.id });\n wp_version = health.wordpress?.version;\n } catch { /* admin restricted */ }\n let elementor_version: string | undefined;\n let elementor_pro_version: string | undefined;\n try {\n const plugins = await wpRequest<Array<{ plugin: string; version: string; status: string }>>(\"/wp/v2/plugins\", { siteId: site.id });\n for (const p of plugins) {\n if (p.plugin.startsWith(\"elementor/\") && p.plugin.endsWith(\"/elementor.php\")) elementor_version = p.version;\n if (p.plugin.startsWith(\"elementor-pro/\")) elementor_pro_version = p.version;\n }\n } catch { /* may require admin */ }\n return {\n ok: true, site_id: site.id, url: site.url,\n wp_version, elementor_version, elementor_pro_version,\n user: { id: me.id, name: me.name, roles: me.roles },\n };\n } catch (e) {\n return { ok: false, site_id: site.id, url: site.url, error: (e as Error).message };\n }\n },\n});\n\nexport const siteHealthTool = defineTool({\n name: \"site_health\",\n description: \"Comprehensive site health snapshot: WP/PHP/Elementor versions, disk space (if SSH), plugin count, theme info. Aggregates multiple REST calls into a single overview.\",\n inputSchema: z.object({ site_id: z.string().optional() }),\n outputSchema: z.object({\n site_id: z.string(),\n url: z.string(),\n wp_version: z.string().optional(),\n php_version: z.string().optional(),\n elementor_version: z.string().optional(),\n elementor_pro_version: z.string().optional(),\n active_theme: z.string().optional(),\n plugins_total: z.number().optional(),\n plugins_active: z.number().optional(),\n plugins_outdated: z.number().optional(),\n elementor_pages_count: z.number().optional(),\n errors: z.array(z.string()),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const site = getSite(input.site_id);\n const errors: string[] = [];\n let wp_version, php_version, elementor_version, elementor_pro_version, active_theme;\n let plugins_total, plugins_active, plugins_outdated, elementor_pages_count;\n\n try {\n const info = await wpRequest<{ wordpress: { version: string }; \"wp-server\"?: { fields?: { php_version?: { value?: string } } } }>(\"/wp-site-health/v1/info\", { siteId: site.id });\n wp_version = info.wordpress?.version;\n php_version = info[\"wp-server\"]?.fields?.php_version?.value;\n } catch (e) { errors.push(\"site-health: \" + (e as Error).message); }\n\n try {\n const plugins = await wpRequest<Array<{ plugin: string; version: string; status: string }>>(\"/wp/v2/plugins\", { siteId: site.id });\n plugins_total = plugins.length;\n plugins_active = plugins.filter((p) => p.status === \"active\").length;\n for (const p of plugins) {\n if (p.plugin.startsWith(\"elementor/\") && p.plugin.endsWith(\"/elementor.php\")) elementor_version = p.version;\n if (p.plugin.startsWith(\"elementor-pro/\")) elementor_pro_version = p.version;\n }\n } catch (e) { errors.push(\"plugins: \" + (e as Error).message); }\n\n try {\n const themes = await wpRequest<Array<{ stylesheet: string; status: string; name: { raw: string } }>>(\"/wp/v2/themes\", { siteId: site.id });\n const active = themes.find((t) => t.status === \"active\");\n active_theme = active?.name?.raw;\n } catch (e) { errors.push(\"themes: \" + (e as Error).message); }\n\n try {\n const pages = await wpRequest<unknown[]>(\"/wp/v2/pages\", { siteId: site.id, query: { meta_key: \"_elementor_edit_mode\", meta_value: \"builder\", per_page: 1, _fields: \"id\" } });\n // We don't get total from headers easily — at least say \"≥ 1\" if any\n elementor_pages_count = pages.length > 0 ? -1 : 0; // -1 means \"at least one, count not reliably known\"\n } catch (e) { errors.push(\"pages: \" + (e as Error).message); }\n\n return {\n site_id: site.id, url: site.url,\n wp_version, php_version, elementor_version, elementor_pro_version, active_theme,\n plugins_total, plugins_active, plugins_outdated,\n elementor_pages_count,\n errors,\n };\n },\n});\n","import type { z } from \"zod\";\n\nexport interface ToolDefinition<TInput = unknown, TOutput = unknown> {\n name: string;\n description: string;\n inputSchema: z.ZodType<TInput>;\n outputSchema?: z.ZodType<TOutput>;\n annotations?: {\n readOnlyHint?: boolean;\n idempotentHint?: boolean;\n destructiveHint?: boolean;\n openWorldHint?: boolean;\n title?: string;\n };\n handler: (input: TInput) => Promise<TOutput>;\n}\n\n/**\n * Helper that lets each tool infer its input/output types from the Zod schemas\n * without needing explicit generic parameters.\n */\nexport function defineTool<S extends z.ZodType, O extends z.ZodType>(\n def: Omit<ToolDefinition<z.infer<S>, z.infer<O>>, \"inputSchema\" | \"outputSchema\"> & {\n inputSchema: S;\n outputSchema?: O;\n },\n): ToolDefinition<z.infer<S>, z.infer<O>> {\n return def as ToolDefinition<z.infer<S>, z.infer<O>>;\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"../types/tool.js\";\nimport { wpRequest } from \"../api/wp-rest.js\";\nimport {\n parseElementorData,\n summarize,\n serializeElementorData,\n findReplaceInWidgets,\n walkElements,\n findElementById,\n} from \"../elementor/data-parser.js\";\nimport { fullBackup, listBackups, restoreBackup } from \"../elementor/backup.js\";\nimport { flushCSS } from \"../elementor/css-flush.js\";\nimport { validateElementorData } from \"../elementor/validator.js\";\nimport { listGlobalWidgets, findGlobalReferences } from \"../elementor/globals.js\";\nimport { issueConfirmation, consumeConfirmation } from \"../utils/confirmation.js\";\nimport { POLICIES } from \"../elementor/policies.js\";\n\nexport const listElementorPagesTool = defineTool({\n name: \"list_elementor_pages\",\n description: \"List pages built with Elementor (have _elementor_edit_mode = 'builder'). Returns id, title, slug, status, modified date.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n per_page: z.number().int().min(1).max(100).default(25),\n search: z.string().optional(),\n }),\n outputSchema: z.object({\n total: z.number(),\n pages: z.array(z.object({\n id: z.number(), title: z.string(), slug: z.string(), status: z.string(),\n link: z.string(), modified: z.string(),\n })),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n interface RawPage { id: number; title: { rendered: string }; slug: string; status: string; link: string; modified: string; }\n const pages = await wpRequest<RawPage[]>(\"/wp/v2/pages\", {\n siteId: input.site_id,\n query: {\n per_page: input.per_page,\n search: input.search,\n meta_key: \"_elementor_edit_mode\",\n meta_value: \"builder\",\n context: \"edit\",\n _fields: \"id,title,slug,status,link,modified\",\n },\n });\n return {\n total: pages.length,\n pages: pages.map((p) => ({\n id: p.id, title: p.title.rendered, slug: p.slug,\n status: p.status, link: p.link, modified: p.modified,\n })),\n };\n },\n});\n\nexport const readPageElementorTool = defineTool({\n name: \"read_page_elementor\",\n description: \"Fetch a page's Elementor data structure summary. With verbose=true returns the full parsed tree (potentially MBs).\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n verbose: z.boolean().default(false),\n }),\n outputSchema: z.object({\n page_id: z.number(),\n title: z.string(),\n summary: z.object({\n totalElements: z.number(), sections: z.number(), containers: z.number(),\n columns: z.number(), widgets: z.number(), maxDepth: z.number(),\n byWidgetType: z.record(z.number()),\n }),\n global_references: z.array(z.object({ widget_id: z.string(), template_id: z.number() })),\n data: z.array(z.any()).optional(),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const page = await wpRequest<{ id: number; title: { rendered: string }; meta?: Record<string, unknown> }>(\n `/wp/v2/pages/${input.page_id}?context=edit`,\n { siteId: input.site_id },\n );\n const raw = (page.meta?._elementor_data as string) ?? \"[]\";\n const data = parseElementorData(raw);\n return {\n page_id: page.id,\n title: page.title.rendered,\n summary: summarize(data),\n global_references: findGlobalReferences(raw),\n data: input.verbose ? data : undefined,\n };\n },\n});\n\nexport const listWidgetsInPageTool = defineTool({\n name: \"list_widgets_in_page\",\n description: \"Flat list of every widget in a page with id, type, parent path, and an excerpt of the first text setting (for spot-checking before find/replace).\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n widget_type: z.string().optional(),\n }),\n outputSchema: z.object({\n page_id: z.number(),\n total: z.number(),\n widgets: z.array(z.object({\n widget_id: z.string(),\n widget_type: z.string(),\n path: z.array(z.string()),\n excerpt: z.string().optional(),\n })),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const page = await wpRequest<{ id: number; meta?: Record<string, unknown> }>(\n `/wp/v2/pages/${input.page_id}?context=edit&_fields=id,meta`,\n { siteId: input.site_id },\n );\n const data = parseElementorData((page.meta?._elementor_data as string) ?? \"[]\");\n const widgets: Array<{ widget_id: string; widget_type: string; path: string[]; excerpt?: string }> = [];\n for (const { element, path } of walkElements(data)) {\n if (element.elType !== \"widget\") continue;\n if (input.widget_type && element.widgetType !== input.widget_type) continue;\n // First string field as excerpt\n let excerpt: string | undefined;\n for (const v of Object.values(element.settings ?? {})) {\n if (typeof v === \"string\" && v.length > 0) {\n excerpt = v.replace(/<[^>]+>/g, \"\").slice(0, 80);\n break;\n }\n }\n widgets.push({\n widget_id: element.id,\n widget_type: element.widgetType ?? \"unknown\",\n path: path.slice(0, -1),\n excerpt,\n });\n }\n return { page_id: page.id, total: widgets.length, widgets };\n },\n});\n\nexport const listGlobalWidgetsTool = defineTool({\n name: \"list_global_widgets\",\n description: \"List all global widgets on a site (Elementor library entries of type 'widget'). These are shared across pages — editing one affects every page using it.\",\n inputSchema: z.object({ site_id: z.string().optional() }),\n outputSchema: z.object({\n total: z.number(),\n globals: z.array(z.object({\n template_id: z.number(),\n title: z.string(),\n widget_type: z.string().optional(),\n })),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const globals = await listGlobalWidgets(input.site_id);\n return { total: globals.length, globals };\n },\n});\n\nexport const preflightCheckTool = defineTool({\n name: \"preflight_check\",\n description: \"Validate a page is safe to edit. Checks: page exists, is Elementor-built, data parses cleanly, references valid global widgets, isn't currently locked by another editor.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n }),\n outputSchema: z.object({\n safe_to_edit: z.boolean(),\n page_id: z.number(),\n title: z.string(),\n issues: z.array(z.string()),\n warnings: z.array(z.string()),\n data_bytes: z.number(),\n global_widget_references: z.number(),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const issues: string[] = [];\n const warnings: string[] = [];\n let title = \"\";\n let data_bytes = 0;\n let global_widget_references = 0;\n try {\n const page = await wpRequest<{ id: number; title: { rendered: string }; meta?: Record<string, unknown> }>(\n `/wp/v2/pages/${input.page_id}?context=edit`,\n { siteId: input.site_id },\n );\n title = page.title.rendered;\n const raw = (page.meta?._elementor_data as string) ?? \"[]\";\n data_bytes = raw.length;\n if ((page.meta?._elementor_edit_mode as string) !== \"builder\") {\n issues.push(\"Page is not in Elementor builder mode\");\n }\n const v = validateElementorData(raw);\n if (!v.valid) issues.push(...v.errors);\n warnings.push(...v.warnings);\n global_widget_references = findGlobalReferences(raw).length;\n if (global_widget_references > 0) {\n warnings.push(`Page references ${global_widget_references} global widget(s). Edits via find_replace will NOT affect the globals themselves — modify the global template directly if needed.`);\n }\n if (data_bytes > POLICIES.MAX_ELEMENTOR_DATA_BYTES) {\n issues.push(`Elementor data exceeds policy max (${POLICIES.MAX_ELEMENTOR_DATA_BYTES} bytes)`);\n }\n } catch (e) {\n issues.push(`Cannot fetch page: ${(e as Error).message}`);\n }\n return { safe_to_edit: issues.length === 0, page_id: input.page_id, title, issues, warnings, data_bytes, global_widget_references };\n },\n});\n\nexport const findReplaceTool = defineTool({\n name: \"elementor_find_replace\",\n description: \"Find/replace plain text in every widget on one page. TWO-CALL FLOW: dry-run returns match_count + detailed widget hits + confirmation_token. Second call with token applies the change with auto-backup + JSON validation + auto-rollback if validation fails + CSS flush.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n find: z.string().min(1),\n replace: z.string(),\n widget_type: z.string().optional(),\n case_sensitive: z.boolean().default(false),\n backup_to_file: z.boolean().default(false).describe(\"Also dump backup to /tmp/elementor-mcp-backups/\"),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n mode: z.enum([\"dry_run\", \"applied\", \"rolled_back\"]),\n page_id: z.number(),\n match_count: z.number(),\n affected_widgets: z.array(z.object({\n widget_id: z.string(),\n widget_type: z.string(),\n before: z.string(),\n after: z.string(),\n })).optional(),\n confirmation_token: z.string().optional(),\n expires_in_seconds: z.number().optional(),\n backup_meta_key: z.string().optional(),\n backup_file: z.string().optional(),\n css_flush: z.string().optional(),\n validation_error: z.string().optional(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n const page = await wpRequest<{ id: number; meta?: Record<string, unknown> }>(\n `/wp/v2/pages/${input.page_id}?context=edit&_fields=id,meta`,\n { siteId: input.site_id },\n );\n const raw = (page.meta?._elementor_data as string) ?? \"[]\";\n // Dry run on a deep copy\n const dryData = parseElementorData(raw);\n const dry = findReplaceInWidgets(JSON.parse(JSON.stringify(dryData)), input.find, input.replace, {\n widgetType: input.widget_type,\n caseSensitive: input.case_sensitive,\n });\n\n // Enrich dry-run: collect affected widgets with before/after excerpts\n const affected: Array<{ widget_id: string; widget_type: string; before: string; after: string }> = [];\n const beforeData = parseElementorData(raw);\n const afterCopy = JSON.parse(JSON.stringify(beforeData));\n findReplaceInWidgets(afterCopy, input.find, input.replace, {\n widgetType: input.widget_type, caseSensitive: input.case_sensitive,\n });\n function collectAffected(orig: ReturnType<typeof parseElementorData>, modified: ReturnType<typeof parseElementorData>): void {\n const beforeMap = new Map<string, { type: string; first: string }>();\n for (const { element } of walkElements(orig)) {\n if (element.elType !== \"widget\") continue;\n const firstStr = Object.values(element.settings ?? {}).find((v) => typeof v === \"string\") as string | undefined;\n if (firstStr) beforeMap.set(element.id, { type: element.widgetType ?? \"?\", first: firstStr });\n }\n for (const { element } of walkElements(modified)) {\n if (element.elType !== \"widget\") continue;\n const firstStr = Object.values(element.settings ?? {}).find((v) => typeof v === \"string\") as string | undefined;\n const b = beforeMap.get(element.id);\n if (b && firstStr && b.first !== firstStr) {\n affected.push({\n widget_id: element.id,\n widget_type: element.widgetType ?? \"?\",\n before: b.first.slice(0, 120),\n after: firstStr.slice(0, 120),\n });\n }\n }\n }\n collectAffected(beforeData, afterCopy);\n\n if (!input.confirmation) {\n if (dry.replacementCount === 0) {\n return {\n mode: \"dry_run\" as const,\n page_id: input.page_id,\n match_count: 0,\n affected_widgets: [],\n };\n }\n const token = issueConfirmation(\n \"elementor_find_replace\",\n { page_id: input.page_id, find: input.find, replace: input.replace },\n POLICIES.CONFIRMATION_TTL_SECONDS,\n );\n return {\n mode: \"dry_run\" as const,\n page_id: input.page_id,\n match_count: dry.replacementCount,\n affected_widgets: affected.slice(0, 25),\n confirmation_token: token,\n expires_in_seconds: POLICIES.CONFIRMATION_TTL_SECONDS,\n };\n }\n\n // Apply\n const conf = consumeConfirmation(input.confirmation, \"elementor_find_replace\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const o = conf.payload as { page_id: number; find: string; replace: string };\n if (o.page_id !== input.page_id || o.find !== input.find || o.replace !== input.replace) {\n throw new Error(\"Confirmation parameters don't match the original dry-run\");\n }\n\n const backup = await fullBackup(input.site_id, input.page_id, { to_file: input.backup_to_file });\n const newData = parseElementorData(raw);\n findReplaceInWidgets(newData, input.find, input.replace, {\n widgetType: input.widget_type, caseSensitive: input.case_sensitive,\n });\n const serialized = serializeElementorData(newData);\n\n // Validate before write\n const validation = validateElementorData(serialized);\n if (!validation.valid) {\n return {\n mode: \"rolled_back\" as const,\n page_id: input.page_id,\n match_count: dry.replacementCount,\n affected_widgets: affected.slice(0, 25),\n backup_meta_key: backup.meta_key,\n validation_error: validation.errors.join(\"; \"),\n };\n }\n\n await wpRequest(`/wp/v2/pages/${input.page_id}`, {\n siteId: input.site_id,\n method: \"PUT\",\n body: { meta: { _elementor_data: serialized } },\n });\n const flush = POLICIES.FLUSH_CSS_AFTER_WRITE ? await flushCSS(input.site_id, input.page_id) : { method: \"none\" as const };\n return {\n mode: \"applied\" as const,\n page_id: input.page_id,\n match_count: dry.replacementCount,\n affected_widgets: affected.slice(0, 25),\n backup_meta_key: backup.meta_key,\n backup_file: backup.file_path,\n css_flush: flush.method,\n };\n },\n});\n\nexport const listElementorBackupsTool = defineTool({\n name: \"list_elementor_backups\",\n description: \"List timestamped backups of a page's Elementor data (created by previous edit ops). Use restore_elementor_backup with one of these meta keys to roll back.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n }),\n outputSchema: z.object({\n page_id: z.number(),\n total: z.number(),\n backups: z.array(z.object({\n meta_key: z.string(),\n settings_key: z.string().optional(),\n timestamp: z.string(),\n })),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const backups = await listBackups(input.site_id, input.page_id);\n return {\n page_id: input.page_id,\n total: backups.length,\n backups,\n };\n },\n});\n\nexport const restoreElementorBackupTool = defineTool({\n name: \"restore_elementor_backup\",\n description: \"Restore a page's _elementor_data and _elementor_page_settings from a backup created by a previous edit. TWO-CALL FLOW with confirmation token.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n backup_meta_key: z.string().describe(\"From list_elementor_backups.\"),\n settings_meta_key: z.string().optional(),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n mode: z.enum([\"dry_run\", \"restored\"]),\n page_id: z.number(),\n backup_meta_key: z.string(),\n settings_meta_key: z.string().optional(),\n confirmation_token: z.string().optional(),\n expires_in_seconds: z.number().optional(),\n css_flush: z.string().optional(),\n pre_restore_backup_meta_key: z.string().optional(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n if (!input.confirmation) {\n const token = issueConfirmation(\"restore_elementor_backup\", {\n page_id: input.page_id, backup_meta_key: input.backup_meta_key,\n }, POLICIES.CONFIRMATION_TTL_SECONDS);\n return {\n mode: \"dry_run\" as const,\n page_id: input.page_id,\n backup_meta_key: input.backup_meta_key,\n settings_meta_key: input.settings_meta_key,\n confirmation_token: token,\n expires_in_seconds: POLICIES.CONFIRMATION_TTL_SECONDS,\n };\n }\n const conf = consumeConfirmation(input.confirmation, \"restore_elementor_backup\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n // Snapshot current state before restoring\n const pre = await fullBackup(input.site_id, input.page_id);\n await restoreBackup(input.site_id, input.page_id, input.backup_meta_key, input.settings_meta_key);\n const flush = await flushCSS(input.site_id, input.page_id);\n return {\n mode: \"restored\" as const,\n page_id: input.page_id,\n backup_meta_key: input.backup_meta_key,\n settings_meta_key: input.settings_meta_key,\n css_flush: flush.method,\n pre_restore_backup_meta_key: pre.meta_key,\n };\n },\n});\n\nexport const duplicateElementorPageTool = defineTool({\n name: \"duplicate_elementor_page\",\n description: \"Duplicate an Elementor page within the same site. Creates a new draft page, copies _elementor_data + _elementor_page_settings + _elementor_edit_mode, flushes CSS.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n source_page_id: z.number().int().positive(),\n new_title: z.string().optional().describe(\"Defaults to '<original> (Copy)'\"),\n status: z.enum([\"draft\", \"publish\", \"private\"]).default(\"draft\"),\n }),\n outputSchema: z.object({\n new_page_id: z.number(),\n new_page_url: z.string(),\n source_page_id: z.number(),\n title: z.string(),\n status: z.string(),\n css_flush: z.string().optional(),\n }),\n annotations: { destructiveHint: false, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n const source = await wpRequest<{ id: number; title: { rendered: string }; meta?: Record<string, unknown> }>(\n `/wp/v2/pages/${input.source_page_id}?context=edit`,\n { siteId: input.site_id },\n );\n const title = input.new_title ?? `${source.title.rendered} (Copy)`;\n const data_raw = (source.meta?._elementor_data as string) ?? \"[]\";\n const settings_raw = (source.meta?._elementor_page_settings as string) ?? \"{}\";\n const created = await wpRequest<{ id: number; link: string }>(\"/wp/v2/pages\", {\n siteId: input.site_id,\n method: \"POST\",\n body: {\n title,\n status: input.status,\n meta: {\n _elementor_data: data_raw,\n _elementor_page_settings: parseSettingsForRest(settings_raw),\n _elementor_edit_mode: \"builder\",\n },\n },\n });\n const flush = await flushCSS(input.site_id, created.id);\n return {\n new_page_id: created.id,\n new_page_url: created.link,\n source_page_id: input.source_page_id,\n title,\n status: input.status,\n css_flush: flush.method,\n };\n },\n});\n\n// re-export helper not used here directly but consumed elsewhere\nexport { findElementById };\n\n/**\n * The WP REST API expects _elementor_page_settings as an object, not a JSON-encoded string.\n * Parse it if it looks like JSON; fall back to empty object on parse failure.\n */\nfunction parseSettingsForRest(raw: unknown): Record<string, unknown> {\n if (typeof raw === \"object\" && raw !== null) return raw as Record<string, unknown>;\n if (typeof raw === \"string\") {\n if (!raw.trim()) return {};\n try { return JSON.parse(raw); } catch { return {}; }\n }\n return {};\n}\n","/**\n * Elementor stores its page builder data as a JSON string in postmeta\n * (`_elementor_data`). Each top-level entry is a \"section\". Sections contain\n * columns, which contain widgets. Widgets have a `widgetType` (\"heading\",\n * \"text-editor\", \"image\", etc.) and a `settings` object.\n *\n * This module provides a typed wrapper + safe deep traversal helpers.\n */\n\nexport interface ElementorElement {\n id: string;\n elType: \"section\" | \"column\" | \"widget\" | \"container\";\n widgetType?: string;\n settings: Record<string, unknown>;\n elements?: ElementorElement[];\n isInner?: boolean;\n}\n\nexport type ElementorData = ElementorElement[];\n\nexport function parseElementorData(raw: string | ElementorData): ElementorData {\n if (Array.isArray(raw)) return raw;\n if (!raw || raw === \"[]\") return [];\n try {\n const decoded = JSON.parse(raw);\n if (!Array.isArray(decoded)) throw new Error(\"not an array\");\n return decoded as ElementorData;\n } catch (e) {\n throw new Error(`Failed to parse _elementor_data JSON: ${(e as Error).message}`);\n }\n}\n\nexport function serializeElementorData(data: ElementorData): string {\n return JSON.stringify(data);\n}\n\n/**\n * Walks every element top-down, yielding {element, path, depth}.\n * Path is the array of ids from root to current element.\n */\nexport function* walkElements(\n data: ElementorData,\n path: string[] = [],\n depth = 0,\n): Generator<{ element: ElementorElement; path: string[]; depth: number }> {\n for (const el of data) {\n const here = [...path, el.id];\n yield { element: el, path: here, depth };\n if (el.elements && el.elements.length > 0) {\n yield* walkElements(el.elements, here, depth + 1);\n }\n }\n}\n\nexport function findElementById(data: ElementorData, id: string): ElementorElement | null {\n for (const { element } of walkElements(data)) {\n if (element.id === id) return element;\n }\n return null;\n}\n\nexport function findWidgets(\n data: ElementorData,\n widgetType?: string,\n): { widget: ElementorElement; path: string[] }[] {\n const out: { widget: ElementorElement; path: string[] }[] = [];\n for (const { element, path } of walkElements(data)) {\n if (element.elType === \"widget\") {\n if (!widgetType || element.widgetType === widgetType) {\n out.push({ widget: element, path });\n }\n }\n }\n return out;\n}\n\n/**\n * Find/replace plain-text occurrences in every widget's settings.\n * Returns the modified data + how many replacements happened.\n *\n * Replacement is limited to string fields. Nested objects are recursed into.\n */\nexport function findReplaceInWidgets(\n data: ElementorData,\n find: string,\n replace: string,\n options: { widgetType?: string; caseSensitive?: boolean } = {},\n): { data: ElementorData; replacementCount: number } {\n let count = 0;\n const flags = options.caseSensitive ? \"g\" : \"gi\";\n const pattern = new RegExp(find.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"), flags);\n\n function replaceInValue(value: unknown): unknown {\n if (typeof value === \"string\") {\n const next = value.replace(pattern, () => {\n count++;\n return replace;\n });\n return next;\n }\n if (Array.isArray(value)) return value.map(replaceInValue);\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) out[k] = replaceInValue(v);\n return out;\n }\n return value;\n }\n\n for (const { element } of walkElements(data)) {\n if (element.elType !== \"widget\") continue;\n if (options.widgetType && element.widgetType !== options.widgetType) continue;\n element.settings = replaceInValue(element.settings) as Record<string, unknown>;\n }\n\n return { data, replacementCount: count };\n}\n\n/**\n * Summary of an Elementor page — counts by widgetType and section depth.\n */\nexport function summarize(data: ElementorData): {\n totalElements: number;\n sections: number;\n containers: number;\n columns: number;\n widgets: number;\n byWidgetType: Record<string, number>;\n maxDepth: number;\n} {\n let totalElements = 0;\n let sections = 0;\n let containers = 0;\n let columns = 0;\n let widgets = 0;\n let maxDepth = 0;\n const byWidgetType: Record<string, number> = {};\n for (const { element, depth } of walkElements(data)) {\n totalElements++;\n maxDepth = Math.max(maxDepth, depth);\n if (element.elType === \"section\") sections++;\n else if (element.elType === \"container\") containers++;\n else if (element.elType === \"column\") columns++;\n else if (element.elType === \"widget\") {\n widgets++;\n const w = element.widgetType ?? \"unknown\";\n byWidgetType[w] = (byWidgetType[w] ?? 0) + 1;\n }\n }\n return { totalElements, sections, containers, columns, widgets, byWidgetType, maxDepth };\n}\n","import { parseElementorData, ElementorData, ElementorElement } from \"./data-parser.js\";\nimport { POLICIES } from \"./policies.js\";\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * Validate Elementor data shape integrity. Used after programmatic edits to\n * catch corruption before we PUT back to the server.\n *\n * Checks:\n * - Each element has id, elType, settings\n * - id is a non-empty string (don't enforce hex format — Elementor's evolved)\n * - elType is one of the known values\n * - settings is an object (not null, not array)\n * - Recursive: every `.elements` array is also valid\n * - Size cap\n */\nexport function validateElementorData(input: string | ElementorData): ValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (typeof input === \"string\" && input.length > POLICIES.MAX_ELEMENTOR_DATA_BYTES) {\n errors.push(`_elementor_data exceeds ${POLICIES.MAX_ELEMENTOR_DATA_BYTES} bytes (got ${input.length})`);\n return { valid: false, errors, warnings };\n }\n\n let data: ElementorData;\n try {\n data = parseElementorData(input);\n } catch (e) {\n errors.push(`JSON parse failed: ${(e as Error).message}`);\n return { valid: false, errors, warnings };\n }\n\n function validateElement(el: ElementorElement, depth: number, path: string[]): void {\n const here = [...path, el.id ?? \"?\"];\n if (typeof el.id !== \"string\" || el.id.length === 0) {\n errors.push(`element at ${here.join(\".\")}: missing or empty id`);\n }\n if (![\"section\", \"container\", \"column\", \"widget\"].includes(el.elType)) {\n errors.push(`element ${el.id}: unknown elType \"${el.elType}\"`);\n }\n if (el.elType === \"widget\" && (typeof el.widgetType !== \"string\" || el.widgetType.length === 0)) {\n errors.push(`widget ${el.id}: missing widgetType`);\n }\n if (el.settings === null || el.settings === undefined || typeof el.settings !== \"object\" || Array.isArray(el.settings)) {\n errors.push(`element ${el.id}: settings must be an object (got ${typeof el.settings})`);\n }\n if (depth > 20) warnings.push(`element ${el.id}: depth ${depth} is unusually deep`);\n if (Array.isArray(el.elements)) {\n for (const child of el.elements) validateElement(child, depth + 1, here);\n }\n }\n\n if (!Array.isArray(data)) {\n errors.push(\"Top-level must be an array\");\n return { valid: false, errors, warnings };\n }\n for (const el of data) validateElement(el, 0, []);\n\n return { valid: errors.length === 0, errors, warnings };\n}\n","import { wpRequest } from \"../api/wp-rest.js\";\nimport { parseElementorData, walkElements } from \"./data-parser.js\";\n\nexport interface GlobalWidget {\n template_id: number;\n title: string;\n widget_type?: string;\n used_on_pages?: number[];\n}\n\n/**\n * List all global widgets on a site.\n * Global widgets are stored as posts of type `elementor_library` with\n * `_elementor_template_type = widget`.\n */\nexport async function listGlobalWidgets(siteId: string | undefined): Promise<GlobalWidget[]> {\n interface Tpl {\n id: number;\n title: { rendered: string };\n meta?: { _elementor_template_type?: string; _elementor_data?: string };\n }\n const items = await wpRequest<Tpl[]>(\"/wp/v2/elementor_library\", {\n siteId,\n query: {\n context: \"edit\",\n per_page: 100,\n _fields: \"id,title,meta\",\n },\n });\n // Filter client-side — REST won't reliably filter on unregistered meta\n const widgetsOnly = items.filter((t) => t.meta?._elementor_template_type === \"widget\");\n return widgetsOnly.map((t) => {\n const data = parseElementorData(t.meta?._elementor_data ?? \"[]\");\n let widget_type: string | undefined;\n for (const { element } of walkElements(data)) {\n if (element.elType === \"widget\") {\n widget_type = element.widgetType;\n break;\n }\n }\n return {\n template_id: t.id,\n title: t.title.rendered,\n widget_type,\n };\n });\n}\n\n/**\n * In a parsed _elementor_data tree, find widgets that reference a global widget\n * template (Elementor stores a reference via the `templateID` setting on a\n * `global` widgetType).\n */\nexport function findGlobalReferences(data: unknown): { widget_id: string; template_id: number }[] {\n const out: { widget_id: string; template_id: number }[] = [];\n try {\n for (const { element } of walkElements(parseElementorData(data as string | []))) {\n if (element.elType === \"widget\" && element.widgetType === \"global\") {\n const tid = (element.settings as { template_id?: number; templateID?: number }).template_id\n ?? (element.settings as { template_id?: number; templateID?: number }).templateID;\n if (typeof tid === \"number\") out.push({ widget_id: element.id, template_id: tid });\n }\n }\n } catch {\n /* ignore */\n }\n return out;\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"../types/tool.js\";\nimport { wpRequest } from \"../api/wp-rest.js\";\nimport { parseElementorData, summarize, serializeElementorData } from \"../elementor/data-parser.js\";\n\nconst TEMPLATE_TYPES = [\"section\", \"page\", \"popup\", \"header\", \"footer\", \"archive\", \"single\", \"widget\", \"any\"] as const;\n\nexport const listTemplatesTool = defineTool({\n name: \"list_elementor_templates\",\n description: \"List Elementor library entries on a site: saved sections, pages, popups, headers/footers (Theme Builder Pro), single/archive templates (Theme Builder Pro), and global widgets. Type filter narrows results.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n type: z.enum(TEMPLATE_TYPES).default(\"any\"),\n per_page: z.number().int().min(1).max(100).default(50),\n }),\n outputSchema: z.object({\n total: z.number(),\n templates: z.array(z.object({\n id: z.number(),\n title: z.string(),\n type: z.string(),\n is_theme_builder: z.boolean(),\n display_conditions_count: z.number(),\n modified: z.string(),\n })),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const query: Record<string, string | number> = {\n per_page: input.per_page, context: \"edit\",\n _fields: \"id,title,modified,meta\",\n };\n interface RawTpl {\n id: number;\n title: { rendered: string };\n modified: string;\n meta?: { _elementor_template_type?: string; _elementor_conditions?: string };\n }\n const allItems = await wpRequest<RawTpl[]>(\"/wp/v2/elementor_library\", { siteId: input.site_id, query });\n // Filter client-side — REST won't reliably filter on unregistered meta keys\n const items = input.type === \"any\"\n ? allItems\n : allItems.filter((t) => t.meta?._elementor_template_type === input.type);\n const themeBuilderTypes = new Set([\"header\", \"footer\", \"archive\", \"single\"]);\n return {\n total: items.length,\n templates: items.map((t) => {\n const type = t.meta?._elementor_template_type ?? \"unknown\";\n let conds = 0;\n try {\n const c = t.meta?._elementor_conditions;\n if (typeof c === \"string\") conds = (JSON.parse(c) as unknown[]).length;\n else if (Array.isArray(c)) conds = (c as unknown[]).length;\n } catch { /* ignore */ }\n return {\n id: t.id,\n title: t.title.rendered,\n type,\n is_theme_builder: themeBuilderTypes.has(type),\n display_conditions_count: conds,\n modified: t.modified,\n };\n }),\n };\n },\n});\n\nexport const exportTemplateTool = defineTool({\n name: \"export_elementor_template\",\n description: \"Export an Elementor template (section, page, header, footer, etc.) as a portable JSON object. Output goes into import_elementor_template on another site.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n template_id: z.number().int().positive(),\n }),\n outputSchema: z.object({\n template_id: z.number(),\n title: z.string(),\n type: z.string(),\n summary: z.object({ totalElements: z.number(), widgets: z.number(), sections: z.number() }),\n portable_json: z.string(),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const tpl = await wpRequest<{\n id: number;\n title: { rendered: string };\n meta?: { _elementor_template_type?: string; _elementor_data?: string };\n }>(`/wp/v2/elementor_library/${input.template_id}?context=edit`, { siteId: input.site_id });\n const data = parseElementorData(tpl.meta?._elementor_data ?? \"[]\");\n const sum = summarize(data);\n const portable = {\n version: \"0.4\",\n title: tpl.title.rendered,\n type: tpl.meta?._elementor_template_type ?? \"page\",\n content: data,\n };\n return {\n template_id: tpl.id,\n title: tpl.title.rendered,\n type: tpl.meta?._elementor_template_type ?? \"unknown\",\n summary: { totalElements: sum.totalElements, widgets: sum.widgets, sections: sum.sections },\n portable_json: JSON.stringify(portable),\n };\n },\n});\n\nexport const importTemplateTool = defineTool({\n name: \"import_elementor_template\",\n description: \"Import a portable template JSON (output of export_elementor_template) into a target site as a new library entry. Useful for cross-site template sync.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n portable_json: z.string(),\n override_title: z.string().optional(),\n }),\n outputSchema: z.object({\n new_template_id: z.number(),\n title: z.string(),\n type: z.string(),\n url: z.string(),\n }),\n annotations: { destructiveHint: false, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n let payload: { title: string; type: string; content: unknown };\n try { payload = JSON.parse(input.portable_json); }\n catch (e) { throw new Error(\"portable_json is not valid JSON: \" + (e as Error).message); }\n const title = input.override_title ?? payload.title;\n const data = Array.isArray(payload.content) ? payload.content : parseElementorData(payload.content as string);\n const res = await wpRequest<{ id: number; link: string }>(`/wp/v2/elementor_library`, {\n siteId: input.site_id, method: \"POST\",\n body: {\n title, status: \"publish\",\n meta: {\n _elementor_template_type: payload.type,\n _elementor_data: serializeElementorData(data),\n _elementor_edit_mode: \"builder\",\n },\n },\n });\n return { new_template_id: res.id, title, type: payload.type, url: res.link };\n },\n});\n\nexport const applyTemplateToPageTool = defineTool({\n name: \"apply_template_to_page\",\n description: \"Copy the _elementor_data + _elementor_page_settings of a SOURCE template (or page) onto a TARGET page on the same site. Backs up the target first. Use to apply a section/page template to an existing draft.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n source_id: z.number().int().positive().describe(\"Source post id: a template or a page.\"),\n target_page_id: z.number().int().positive(),\n backup_to_file: z.boolean().default(false),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n mode: z.enum([\"dry_run\", \"applied\"]),\n target_page_id: z.number(),\n source_id: z.number(),\n confirmation_token: z.string().optional(),\n expires_in_seconds: z.number().optional(),\n backup_meta_key: z.string().optional(),\n backup_file: z.string().optional(),\n css_flush: z.string().optional(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n const { issueConfirmation, consumeConfirmation } = await import(\"../utils/confirmation.js\");\n const { POLICIES } = await import(\"../elementor/policies.js\");\n const { fullBackup } = await import(\"../elementor/backup.js\");\n const { flushCSS } = await import(\"../elementor/css-flush.js\");\n\n if (!input.confirmation) {\n const token = issueConfirmation(\"apply_template_to_page\", { src: input.source_id, tgt: input.target_page_id, site: input.site_id }, POLICIES.CONFIRMATION_TTL_SECONDS);\n return {\n mode: \"dry_run\" as const,\n target_page_id: input.target_page_id,\n source_id: input.source_id,\n confirmation_token: token,\n expires_in_seconds: POLICIES.CONFIRMATION_TTL_SECONDS,\n };\n }\n const conf = consumeConfirmation(input.confirmation, \"apply_template_to_page\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n\n // Read source (try elementor_library first, fallback to pages)\n let src_meta: Record<string, unknown> | undefined;\n try {\n const src = await wpRequest<{ meta?: Record<string, unknown> }>(`/wp/v2/elementor_library/${input.source_id}?context=edit`, { siteId: input.site_id });\n src_meta = src.meta;\n } catch {\n const src = await wpRequest<{ meta?: Record<string, unknown> }>(`/wp/v2/pages/${input.source_id}?context=edit`, { siteId: input.site_id });\n src_meta = src.meta;\n }\n const data_raw = (src_meta?._elementor_data as string) ?? \"[]\";\n const settings_raw = (src_meta?._elementor_page_settings as string) ?? \"{}\";\n\n // Backup target\n const backup = await fullBackup(input.site_id, input.target_page_id, { to_file: input.backup_to_file });\n // Apply\n await wpRequest(`/wp/v2/pages/${input.target_page_id}`, {\n siteId: input.site_id, method: \"PUT\",\n body: {\n meta: {\n _elementor_data: data_raw,\n _elementor_page_settings: parseSettingsForRest(settings_raw),\n _elementor_edit_mode: \"builder\",\n },\n },\n });\n const flush = await flushCSS(input.site_id, input.target_page_id);\n return {\n mode: \"applied\" as const,\n target_page_id: input.target_page_id,\n source_id: input.source_id,\n backup_meta_key: backup.meta_key,\n backup_file: backup.file_path,\n css_flush: flush.method,\n };\n },\n});\n\nfunction parseSettingsForRest(raw: unknown): Record<string, unknown> {\n if (typeof raw === \"object\" && raw !== null) return raw as Record<string, unknown>;\n if (typeof raw === \"string\") {\n if (!raw.trim()) return {};\n try { return JSON.parse(raw); } catch { return {}; }\n }\n return {};\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"../types/tool.js\";\nimport { getSite } from \"../config.js\";\nimport { sshWpCli, isDestructiveWpCli } from \"../transport/ssh-wpcli.js\";\nimport { isForbiddenWpCli, POLICIES } from \"../elementor/policies.js\";\nimport { issueConfirmation, consumeConfirmation } from \"../utils/confirmation.js\";\n\nexport const wpCliRunTool = defineTool({\n name: \"wp_cli_run\",\n description: \"Execute an arbitrary wp-cli command on a site via SSH. The `wp` prefix and `--path` are added automatically — pass only the args (e.g. 'post list --post_type=page'). Destructive commands (delete, drop, search-replace without --dry-run, plugin deactivate/uninstall) require a two-call confirmation flow.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n args: z.string().min(1).describe(\"WP-CLI args without leading 'wp', e.g. 'post list --post_type=page'\"),\n timeout_ms: z.number().int().min(1000).max(300_000).default(60_000),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n mode: z.enum([\"dry_run_destructive\", \"executed\"]),\n command: z.string(),\n stdout: z.string().optional(),\n stderr: z.string().optional(),\n exit_code: z.number().optional(),\n duration_ms: z.number().optional(),\n destructive_pattern_detected: z.boolean().optional(),\n confirmation_token: z.string().optional(),\n expires_in_seconds: z.number().optional(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n const forbidden = isForbiddenWpCli(input.args);\n if (forbidden.forbidden) {\n throw new Error(`Forbidden wp-cli command. ${forbidden.reason}`);\n }\n const isDestructive = isDestructiveWpCli(input.args);\n\n if (isDestructive && !input.confirmation) {\n const token = issueConfirmation(\"wp_cli_run\", { site_id: input.site_id, args: input.args }, POLICIES.CONFIRMATION_TTL_SECONDS);\n return {\n mode: \"dry_run_destructive\" as const,\n command: `wp <path> ${input.args}`,\n destructive_pattern_detected: true,\n confirmation_token: token,\n expires_in_seconds: POLICIES.CONFIRMATION_TTL_SECONDS,\n };\n }\n if (isDestructive && input.confirmation) {\n const conf = consumeConfirmation(input.confirmation, \"wp_cli_run\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const o = conf.payload as { args: string; site_id?: string };\n if (o.args !== input.args || o.site_id !== input.site_id) {\n throw new Error(\"Confirmation parameters don't match the original dry-run\");\n }\n }\n\n const site = getSite(input.site_id);\n const r = await sshWpCli(site, input.args, { timeout_ms: input.timeout_ms });\n return {\n mode: \"executed\" as const,\n command: r.command,\n stdout: r.stdout,\n stderr: r.stderr,\n exit_code: r.exitCode,\n duration_ms: r.duration_ms,\n destructive_pattern_detected: isDestructive,\n };\n },\n});\n\nexport const wpSearchReplaceTool = defineTool({\n name: \"wp_search_replace\",\n description: \"Run `wp search-replace` against wp_postmeta (default) — the standard agency way to update Elementor text content. ALWAYS dry-run first; the apply call requires a confirmation token. Includes --precise --all-tables-with-prefix by default if you specify table='all'.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n find: z.string().min(1),\n replace: z.string(),\n table: z.string().default(\"wp_postmeta\"),\n include_columns: z.string().optional().describe(\"e.g. 'meta_value'. Default: meta_value when table=wp_postmeta.\"),\n precise: z.boolean().default(true),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n mode: z.enum([\"dry_run\", \"applied\"]),\n command: z.string(),\n stdout: z.string().optional(),\n stderr: z.string().optional(),\n exit_code: z.number().optional(),\n replacement_count: z.number().optional(),\n confirmation_token: z.string().optional(),\n expires_in_seconds: z.number().optional(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n const includeCols = input.include_columns ?? (input.table === \"wp_postmeta\" ? \"meta_value\" : \"\");\n const baseArgs = [\n \"search-replace\",\n `'${input.find.replace(/'/g, \"'\\\\''\")}'`,\n `'${input.replace.replace(/'/g, \"'\\\\''\")}'`,\n input.table,\n includeCols ? `--include-columns=${includeCols}` : \"\",\n input.precise ? \"--precise\" : \"\",\n ].filter(Boolean).join(\" \");\n\n const site = getSite(input.site_id);\n\n if (!input.confirmation) {\n // Dry run\n const dry = await sshWpCli(site, baseArgs + \" --dry-run\");\n const m = dry.stdout.match(/Success: (\\d+) replacement/);\n const count = m ? parseInt(m[1], 10) : 0;\n if (count === 0) {\n return { mode: \"dry_run\" as const, command: dry.command, stdout: dry.stdout, exit_code: dry.exitCode, replacement_count: 0 };\n }\n const token = issueConfirmation(\"wp_search_replace\", { args: baseArgs, site_id: input.site_id }, POLICIES.CONFIRMATION_TTL_SECONDS);\n return {\n mode: \"dry_run\" as const,\n command: dry.command,\n stdout: dry.stdout,\n replacement_count: count,\n confirmation_token: token,\n expires_in_seconds: POLICIES.CONFIRMATION_TTL_SECONDS,\n };\n }\n const conf = consumeConfirmation(input.confirmation, \"wp_search_replace\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const o = conf.payload as { args: string; site_id?: string };\n if (o.args !== baseArgs || o.site_id !== input.site_id) throw new Error(\"Confirmation params mismatch\");\n const r = await sshWpCli(site, baseArgs);\n const m = r.stdout.match(/Success: (\\d+) replacement/);\n return {\n mode: \"applied\" as const,\n command: r.command,\n stdout: r.stdout,\n stderr: r.stderr,\n exit_code: r.exitCode,\n replacement_count: m ? parseInt(m[1], 10) : 0,\n };\n },\n});\n\nexport const wpElementorFlushCssTool = defineTool({\n name: \"wp_elementor_flush_css\",\n description: \"Flush Elementor's CSS cache on a site using the 3-level fallback strategy (REST endpoint → wp-cli native → option/meta delete). Always call after writing _elementor_data programmatically.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive().optional().describe(\"Optional: flush only this page's cache. If omitted, flushes site-wide.\"),\n }),\n outputSchema: z.object({\n method: z.enum([\"rest\", \"wp-cli\", \"option-delete\", \"resave\", \"none\"]),\n details: z.string().optional(),\n }),\n annotations: { destructiveHint: false, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const { flushCSS } = await import(\"../elementor/css-flush.js\");\n return flushCSS(input.site_id, input.page_id);\n },\n});\n\nexport const wpPluginListTool = defineTool({\n name: \"wp_plugin_list\",\n description: \"List installed plugins on a site with name, version, status (active/inactive), and update_version (if outdated). Uses WP-CLI for accurate version data including update_version.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n only_outdated: z.boolean().default(false),\n }),\n outputSchema: z.object({\n total: z.number(),\n plugins: z.array(z.object({\n name: z.string(),\n status: z.string(),\n version: z.string(),\n update: z.string().optional(),\n update_version: z.string().optional(),\n })),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const site = getSite(input.site_id);\n const r = await sshWpCli(site, \"plugin list --format=json\");\n if (r.exitCode !== 0) throw new Error(`wp plugin list failed: ${r.stderr}`);\n interface PluginRow { name: string; status: string; version: string; update: string; update_version?: string; }\n const arr = JSON.parse(r.stdout) as PluginRow[];\n const filtered = input.only_outdated ? arr.filter((p) => p.update === \"available\") : arr;\n return { total: filtered.length, plugins: filtered };\n },\n});\n\nexport const wpPluginUpdateTool = defineTool({\n name: \"wp_plugin_update\",\n description: \"Update one or more plugins on a site to their latest version. Requires confirmation token (uses wp-cli).\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n plugins: z.array(z.string()).min(1).describe(\"Plugin slugs to update, e.g. ['elementor', 'elementor-pro']. Use 'all' for everything outdated.\"),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n mode: z.enum([\"dry_run\", \"applied\"]),\n plugins: z.array(z.string()),\n command: z.string().optional(),\n stdout: z.string().optional(),\n stderr: z.string().optional(),\n exit_code: z.number().optional(),\n confirmation_token: z.string().optional(),\n expires_in_seconds: z.number().optional(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n if (!input.confirmation) {\n const token = issueConfirmation(\"wp_plugin_update\", { site_id: input.site_id, plugins: input.plugins }, POLICIES.CONFIRMATION_TTL_SECONDS);\n return {\n mode: \"dry_run\" as const,\n plugins: input.plugins,\n confirmation_token: token,\n expires_in_seconds: POLICIES.CONFIRMATION_TTL_SECONDS,\n };\n }\n const conf = consumeConfirmation(input.confirmation, \"wp_plugin_update\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const site = getSite(input.site_id);\n const target = input.plugins.includes(\"all\") ? \"--all\" : input.plugins.map((p) => `'${p}'`).join(\" \");\n const r = await sshWpCli(site, `plugin update ${target}`, { timeout_ms: 180_000 });\n return {\n mode: \"applied\" as const,\n plugins: input.plugins,\n command: r.command,\n stdout: r.stdout,\n stderr: r.stderr,\n exit_code: r.exitCode,\n };\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../types/tool.js\";\nimport { screenshotUrl } from \"../transport/screenshot.js\";\nimport { wpRequest } from \"../api/wp-rest.js\";\nimport { readFileSync } from \"node:fs\";\nimport { createHash } from \"node:crypto\";\n\nexport const screenshotPageTool = defineTool({\n name: \"screenshot_page\",\n description: \"Capture a PNG screenshot of a page's frontend (visitor-facing URL). Requires a Chrome/Chromium binary on the host. Returns the local file path so the LLM can analyse it or compare against another shot.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive().optional(),\n url: z.string().url().optional().describe(\"Alternative to page_id: hit any URL directly.\"),\n width: z.number().int().min(320).max(3840).default(1440),\n height: z.number().int().min(240).max(2400).default(900),\n full_page: z.boolean().default(false),\n }),\n outputSchema: z.object({\n url: z.string(),\n file_path: z.string(),\n bytes: z.number(),\n sha256: z.string(),\n width: z.number(),\n height: z.number(),\n }),\n annotations: { readOnlyHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n let target = input.url;\n if (!target) {\n if (!input.page_id) throw new Error(\"Provide either 'url' or 'page_id'.\");\n const page = await wpRequest<{ link: string }>(`/wp/v2/pages/${input.page_id}?_fields=link`, { siteId: input.site_id });\n target = page.link;\n }\n const shot = await screenshotUrl(target, { width: input.width, height: input.height, full_page: input.full_page });\n const hash = createHash(\"sha256\").update(readFileSync(shot.path)).digest(\"hex\");\n return {\n url: target,\n file_path: shot.path,\n bytes: shot.bytes,\n sha256: hash,\n width: input.width,\n height: input.height,\n };\n },\n});\n\nexport const compareScreenshotsTool = defineTool({\n name: \"compare_screenshots\",\n description: \"Compare two screenshot files via SHA-256 hash equality and size delta. Quick way to spot whether a page changed visually after an edit. For pixel diffs, use a dedicated tool externally.\",\n inputSchema: z.object({\n before_path: z.string(),\n after_path: z.string(),\n }),\n outputSchema: z.object({\n identical: z.boolean(),\n before_bytes: z.number(),\n after_bytes: z.number(),\n delta_bytes: z.number(),\n before_sha256: z.string(),\n after_sha256: z.string(),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },\n async handler(input) {\n const a = readFileSync(input.before_path);\n const b = readFileSync(input.after_path);\n const ah = createHash(\"sha256\").update(a).digest(\"hex\");\n const bh = createHash(\"sha256\").update(b).digest(\"hex\");\n return {\n identical: ah === bh,\n before_bytes: a.length,\n after_bytes: b.length,\n delta_bytes: b.length - a.length,\n before_sha256: ah,\n after_sha256: bh,\n };\n },\n});\n","import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { logger } from \"../utils/logger.js\";\n\nconst CHROME_PATHS = [\n \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\n \"/Applications/Chromium.app/Contents/MacOS/Chromium\",\n \"/usr/bin/google-chrome\",\n \"/usr/bin/chromium\",\n \"/usr/bin/chromium-browser\",\n];\n\nexport function findChrome(): string | null {\n // Honour explicit override\n if (process.env.ELEMENTOR_MCP_CHROME) {\n return existsSync(process.env.ELEMENTOR_MCP_CHROME) ? process.env.ELEMENTOR_MCP_CHROME : null;\n }\n for (const p of CHROME_PATHS) {\n if (existsSync(p)) return p;\n }\n return null;\n}\n\nexport async function screenshotUrl(\n url: string,\n opts: { width?: number; height?: number; timeout_ms?: number; full_page?: boolean } = {},\n): Promise<{ path: string; bytes: number }> {\n const chrome = findChrome();\n if (!chrome) {\n throw new Error(\n \"Could not locate a Chrome/Chromium binary for screenshots. Set ELEMENTOR_MCP_CHROME to its path \" +\n \"or install Chrome at one of: \" + CHROME_PATHS.join(\", \"),\n );\n }\n const filename = `elementor-mcp-${randomBytes(4).toString(\"hex\")}-${Date.now()}.png`;\n const path = join(tmpdir(), filename);\n const args = [\n \"--headless=new\",\n \"--disable-gpu\",\n \"--no-sandbox\",\n \"--hide-scrollbars\",\n `--window-size=${opts.width ?? 1440},${opts.height ?? 900}`,\n `--screenshot=${path}`,\n ...(opts.full_page ? [\"--virtual-time-budget=10000\"] : []),\n \"--default-background-color=00000000\",\n url,\n ];\n const timeout = opts.timeout_ms ?? 60_000;\n logger.debug({ url, chrome }, \"screenshot\");\n await new Promise<void>((resolve, reject) => {\n const child = spawn(chrome, args, { stdio: [\"ignore\", \"ignore\", \"pipe\"] });\n let stderr = \"\";\n const killer = setTimeout(() => {\n child.kill(\"SIGKILL\");\n reject(new Error(`Screenshot timed out after ${timeout}ms`));\n }, timeout);\n child.stderr.on(\"data\", (b: Buffer) => { stderr += b.toString(); });\n child.on(\"close\", (code) => {\n clearTimeout(killer);\n if (code !== 0) reject(new Error(`Chrome exited ${code}: ${stderr.slice(0, 300)}`));\n else resolve();\n });\n child.on(\"error\", (e) => { clearTimeout(killer); reject(e); });\n });\n if (!existsSync(path)) throw new Error(`Screenshot file not created: ${path}`);\n const fs = await import(\"node:fs\");\n const stat = fs.statSync(path);\n return { path, bytes: stat.size };\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"../types/tool.js\";\nimport { wpRequest } from \"../api/wp-rest.js\";\nimport { loadConfig } from \"../config.js\";\n\nasync function fetchLatestElementor(): Promise<{ free: string }> {\n try {\n const free = await fetch(\"https://api.wordpress.org/plugins/info/1.0/elementor.json\", {\n headers: { \"User-Agent\": \"elementor-mcp-agent\" },\n }).then((r) => r.json() as Promise<Record<string, unknown>>);\n return { free: (free.version as string) ?? \"unknown\" };\n } catch { return { free: \"unknown\" }; }\n}\n\nexport const checkElementorVersionsTool = defineTool({\n name: \"check_elementor_versions\",\n description: \"Fleet-wide Elementor version audit. For every site, fetches installed Elementor/Pro versions and compares against wordpress.org latest. Flags outdated installs.\",\n inputSchema: z.object({\n site_ids: z.array(z.string()).optional(),\n }),\n outputSchema: z.object({\n checked: z.number(),\n latest_elementor_free: z.string(),\n sites: z.array(z.object({\n site_id: z.string(),\n url: z.string(),\n elementor_version: z.string().optional(),\n elementor_pro_version: z.string().optional(),\n outdated_free: z.boolean(),\n error: z.string().optional(),\n })),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const cfg = loadConfig();\n const latest = await fetchLatestElementor();\n const targets = input.site_ids ? cfg.sites.filter((s) => input.site_ids?.includes(s.id)) : cfg.sites;\n const rows: Array<{\n site_id: string; url: string;\n elementor_version?: string; elementor_pro_version?: string;\n outdated_free: boolean; error?: string;\n }> = [];\n for (const site of targets) {\n try {\n const plugins = await wpRequest<Array<{ plugin: string; version: string }>>(\"/wp/v2/plugins\", { siteId: site.id });\n let elementor_version: string | undefined;\n let elementor_pro_version: string | undefined;\n for (const p of plugins) {\n if (p.plugin.startsWith(\"elementor/\") && p.plugin.endsWith(\"/elementor.php\")) elementor_version = p.version;\n if (p.plugin.startsWith(\"elementor-pro/\")) elementor_pro_version = p.version;\n }\n rows.push({\n site_id: site.id, url: site.url,\n elementor_version, elementor_pro_version,\n outdated_free: !!elementor_version && elementor_version !== latest.free && latest.free !== \"unknown\",\n });\n } catch (e) {\n rows.push({ site_id: site.id, url: site.url, outdated_free: false, error: (e as Error).message });\n }\n }\n return { checked: rows.length, latest_elementor_free: latest.free, sites: rows };\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../types/tool.js\";\nimport { wpRequest } from \"../api/wp-rest.js\";\nimport {\n parseElementorData,\n serializeElementorData,\n findElementById,\n} from \"../elementor/data-parser.js\";\nimport {\n readWidget, updateWidgetSettings, deleteWidget, duplicateWidget,\n swapWidgetType, addWidget, moveWidget,\n} from \"../elementor/widget-ops.js\";\nimport { validateElementorData } from \"../elementor/validator.js\";\nimport { fullBackup } from \"../elementor/backup.js\";\nimport { flushCSS } from \"../elementor/css-flush.js\";\nimport { POLICIES } from \"../elementor/policies.js\";\nimport { issueConfirmation, consumeConfirmation } from \"../utils/confirmation.js\";\nimport { verifyWrite, deepEqual, VerificationSchema } from \"../elementor/verify.js\";\n\n/**\n * Shared output contract for every mutating widget tool (v1.2+).\n *\n * Beyond the legacy `mode/page_id/...` fields we keep for compatibility, every\n * `applied` response now includes:\n *\n * - `verification` — canonical re-read of the page after write + per-op\n * predicate. `matches_requested: false` means the write API lied\n * (e.g. REST silently dropped the meta update). The model MUST treat\n * a falsy `matches_requested` as a hard failure even if the HTTP layer\n * said OK.\n * - `mutated` — true iff the serialized `_elementor_data` actually changed.\n * `false` means the requested op was a no-op (idempotent re-apply, or\n * silent drop — disambiguated by `verification.matches_requested`).\n * - `warnings` — non-fatal issues collected during the op (CSS flush\n * fallback used, SSH stderr noise, etc.). Always an array, never null.\n * - `backup_meta_key` — postmeta key where the pre-write snapshot lives,\n * so a model or operator can `restore_elementor_backup` if needed.\n *\n * This contract was prompted by Mads Hansen's comment on the v1.0 write-bug\n * post-mortem: a mutating tool MUST force the model to see ground truth,\n * not the write API's optimistic 200 OK.\n */\nconst MutationResponseShape = {\n mode: z.enum([\"dry_run\", \"applied\"]),\n page_id: z.number(),\n confirmation_token: z.string().optional(),\n backup_meta_key: z.string().optional(),\n css_flush: z.string().optional(),\n mutated: z.boolean().optional(),\n warnings: z.array(z.string()).optional(),\n verification: VerificationSchema.optional(),\n};\n\nasync function fetchData(\n siteId: string | undefined,\n pageId: number,\n): Promise<{ raw: string; data: ReturnType<typeof parseElementorData> }> {\n const page = await wpRequest<{ meta?: Record<string, unknown> }>(\n `/wp/v2/pages/${pageId}?context=edit&_fields=meta`,\n { siteId },\n );\n const v = page.meta?._elementor_data;\n const raw = typeof v === \"string\" ? v : JSON.stringify(v ?? []);\n return { raw, data: parseElementorData(raw) };\n}\n\nasync function writeData(\n siteId: string | undefined,\n pageId: number,\n data: ReturnType<typeof parseElementorData>,\n): Promise<{ method: string; serialized: string }> {\n const ser = serializeElementorData(data);\n const validation = validateElementorData(ser);\n if (!validation.valid) {\n throw new Error(\"Validation failed after edit: \" + validation.errors.join(\"; \"));\n }\n await wpRequest(`/wp/v2/pages/${pageId}`, {\n siteId, method: \"PUT\",\n body: { meta: { _elementor_data: ser } },\n });\n const flush = await flushCSS(siteId, pageId);\n return { method: flush.method, serialized: ser };\n}\n\nexport const readWidgetTool = defineTool({\n name: \"read_widget\",\n description: \"Fetch a single widget's full settings by id. Use list_widgets_in_page to find the id first.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n widget_id: z.string().min(1),\n }),\n outputSchema: z.object({\n widget_id: z.string(),\n widget_type: z.string().optional(),\n settings: z.record(z.any()),\n }),\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n async handler(input) {\n const { data } = await fetchData(input.site_id, input.page_id);\n const w = readWidget(data, input.widget_id);\n if (!w) throw new Error(`Widget ${input.widget_id} not found on page ${input.page_id}`);\n return { widget_id: w.id, widget_type: w.widgetType, settings: w.settings as Record<string, unknown> };\n },\n});\n\nexport const updateWidgetSettingsTool = defineTool({\n name: \"update_widget_settings\",\n description: \"Shallow-merge a partial settings object into one widget. Backs up the page first, validates the result, auto-flushes CSS, then re-reads the page and verifies the patch persisted (matches_requested in the response). Two-call confirmation.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n widget_id: z.string().min(1),\n settings_patch: z.record(z.any()),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n ...MutationResponseShape,\n widget_id: z.string(),\n keys_changed: z.array(z.string()),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n if (!input.confirmation) {\n const token = issueConfirmation(\"update_widget_settings\", input, POLICIES.CONFIRMATION_TTL_SECONDS);\n return {\n mode: \"dry_run\" as const,\n page_id: input.page_id,\n widget_id: input.widget_id,\n keys_changed: Object.keys(input.settings_patch),\n confirmation_token: token,\n };\n }\n const conf = consumeConfirmation(input.confirmation, \"update_widget_settings\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const { raw: rawBefore, data } = await fetchData(input.site_id, input.page_id);\n if (!updateWidgetSettings(data, input.widget_id, input.settings_patch)) {\n throw new Error(`Widget ${input.widget_id} not found`);\n }\n const backup = await fullBackup(input.site_id, input.page_id);\n const w = await writeData(input.site_id, input.page_id, data);\n const verification = await verifyWrite({\n siteId: input.site_id,\n pageId: input.page_id,\n description: `Re-read /wp/v2/pages/${input.page_id} and check widget ${input.widget_id} settings include the requested patch`,\n predicate: (canonical) => {\n const widget = findElementById(canonical, input.widget_id);\n if (!widget) return { ok: false, notes: \"Widget no longer present after write\" };\n const persisted = widget.settings as Record<string, unknown>;\n const mismatches: string[] = [];\n for (const [k, want] of Object.entries(input.settings_patch)) {\n if (!deepEqual(persisted[k], want)) mismatches.push(k);\n }\n return {\n ok: mismatches.length === 0,\n persisted,\n notes: mismatches.length === 0\n ? undefined\n : `Persisted state diverges from requested patch on key(s): ${mismatches.join(\", \")}`,\n };\n },\n });\n return {\n mode: \"applied\" as const,\n page_id: input.page_id,\n widget_id: input.widget_id,\n keys_changed: Object.keys(input.settings_patch),\n backup_meta_key: backup.meta_key,\n css_flush: w.method,\n mutated: rawBefore !== w.serialized,\n warnings: [],\n verification,\n };\n },\n});\n\nexport const deleteWidgetTool = defineTool({\n name: \"delete_widget\",\n description: \"Remove a widget from a page by id. Two-call confirmation. Backs up before deleting; re-reads to confirm the widget is gone.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n widget_id: z.string().min(1),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n ...MutationResponseShape,\n widget_id: z.string(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n if (!input.confirmation) {\n const token = issueConfirmation(\"delete_widget\", input, POLICIES.CONFIRMATION_TTL_SECONDS);\n return { mode: \"dry_run\" as const, page_id: input.page_id, widget_id: input.widget_id, confirmation_token: token };\n }\n const conf = consumeConfirmation(input.confirmation, \"delete_widget\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const { raw: rawBefore, data } = await fetchData(input.site_id, input.page_id);\n if (!deleteWidget(data, input.widget_id)) throw new Error(`Widget ${input.widget_id} not found`);\n const backup = await fullBackup(input.site_id, input.page_id);\n const w = await writeData(input.site_id, input.page_id, data);\n const verification = await verifyWrite({\n siteId: input.site_id,\n pageId: input.page_id,\n description: `Re-read /wp/v2/pages/${input.page_id} and assert widget ${input.widget_id} is gone`,\n predicate: (canonical) => {\n const found = findElementById(canonical, input.widget_id);\n return {\n ok: found === null,\n notes: found ? \"Widget still present in canonical re-read — delete did not persist\" : undefined,\n };\n },\n });\n return {\n mode: \"applied\" as const,\n page_id: input.page_id,\n widget_id: input.widget_id,\n backup_meta_key: backup.meta_key,\n css_flush: w.method,\n mutated: rawBefore !== w.serialized,\n warnings: [],\n verification,\n };\n },\n});\n\nexport const duplicateWidgetTool = defineTool({\n name: \"duplicate_widget\",\n description: \"Duplicate a widget in place (right after the original). The clone gets a new id. Re-reads to confirm the clone persisted. Two-call confirmation.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n widget_id: z.string().min(1),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n ...MutationResponseShape,\n source_widget_id: z.string(),\n new_widget_id: z.string().optional(),\n }),\n annotations: { destructiveHint: false, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n if (!input.confirmation) {\n const token = issueConfirmation(\"duplicate_widget\", input, POLICIES.CONFIRMATION_TTL_SECONDS);\n return { mode: \"dry_run\" as const, page_id: input.page_id, source_widget_id: input.widget_id, confirmation_token: token };\n }\n const conf = consumeConfirmation(input.confirmation, \"duplicate_widget\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const { raw: rawBefore, data } = await fetchData(input.site_id, input.page_id);\n const r = duplicateWidget(data, input.widget_id);\n if (!r.ok || !r.new_widget_id) throw new Error(`Widget ${input.widget_id} not found`);\n const newId = r.new_widget_id;\n const backup = await fullBackup(input.site_id, input.page_id);\n const w = await writeData(input.site_id, input.page_id, data);\n const verification = await verifyWrite({\n siteId: input.site_id,\n pageId: input.page_id,\n description: `Re-read /wp/v2/pages/${input.page_id} and assert the clone (${newId}) exists alongside the source`,\n predicate: (canonical) => {\n const source = findElementById(canonical, input.widget_id);\n const clone = findElementById(canonical, newId);\n return {\n ok: source !== null && clone !== null,\n notes: !clone ? \"Clone not present in canonical re-read\" : (!source ? \"Original is missing after duplicate\" : undefined),\n };\n },\n });\n return {\n mode: \"applied\" as const,\n page_id: input.page_id,\n source_widget_id: input.widget_id,\n new_widget_id: newId,\n backup_meta_key: backup.meta_key,\n css_flush: w.method,\n mutated: rawBefore !== w.serialized,\n warnings: [],\n verification,\n };\n },\n});\n\nexport const swapWidgetTypeTool = defineTool({\n name: \"swap_widget_type\",\n description: \"Replace a widget's type (e.g., heading → button) while preserving its id and position. Provide full new_settings — the old settings are NOT carried over (different widget types have incompatible schemas). Re-reads to confirm. Two-call confirmation.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n widget_id: z.string().min(1),\n new_widget_type: z.string().min(1),\n new_settings: z.record(z.any()).default({}),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n ...MutationResponseShape,\n widget_id: z.string(),\n new_widget_type: z.string(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n if (!input.confirmation) {\n const token = issueConfirmation(\"swap_widget_type\", input, POLICIES.CONFIRMATION_TTL_SECONDS);\n return { mode: \"dry_run\" as const, page_id: input.page_id, widget_id: input.widget_id, new_widget_type: input.new_widget_type, confirmation_token: token };\n }\n const conf = consumeConfirmation(input.confirmation, \"swap_widget_type\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const { raw: rawBefore, data } = await fetchData(input.site_id, input.page_id);\n if (!swapWidgetType(data, input.widget_id, input.new_widget_type, input.new_settings)) {\n throw new Error(`Widget ${input.widget_id} not found`);\n }\n const backup = await fullBackup(input.site_id, input.page_id);\n const w = await writeData(input.site_id, input.page_id, data);\n const verification = await verifyWrite({\n siteId: input.site_id,\n pageId: input.page_id,\n description: `Re-read /wp/v2/pages/${input.page_id} and assert widget ${input.widget_id} now has widgetType=\"${input.new_widget_type}\"`,\n predicate: (canonical) => {\n const widget = findElementById(canonical, input.widget_id);\n if (!widget) return { ok: false, notes: \"Widget missing after swap\" };\n return {\n ok: widget.widgetType === input.new_widget_type,\n persisted: { widgetType: widget.widgetType, settings: widget.settings },\n notes: widget.widgetType === input.new_widget_type\n ? undefined\n : `Expected widgetType=\"${input.new_widget_type}\", canonical state has \"${widget.widgetType}\"`,\n };\n },\n });\n return {\n mode: \"applied\" as const,\n page_id: input.page_id,\n widget_id: input.widget_id,\n new_widget_type: input.new_widget_type,\n backup_meta_key: backup.meta_key,\n css_flush: w.method,\n mutated: rawBefore !== w.serialized,\n warnings: [],\n verification,\n };\n },\n});\n\nexport const addWidgetTool = defineTool({\n name: \"add_widget\",\n description: \"Append a new widget to a parent container (section, column, or container) on a page. Re-reads to confirm the new widget exists under the parent. Two-call confirmation.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n parent_id: z.string().min(1).describe(\"Id of the section/column/container that will receive the widget.\"),\n widget_type: z.string().min(1).describe(\"e.g., 'heading', 'text-editor', 'button', 'image'.\"),\n settings: z.record(z.any()).default({}),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n ...MutationResponseShape,\n parent_id: z.string(),\n widget_type: z.string(),\n new_widget_id: z.string().optional(),\n }),\n annotations: { destructiveHint: false, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n if (!input.confirmation) {\n const token = issueConfirmation(\"add_widget\", input, POLICIES.CONFIRMATION_TTL_SECONDS);\n return { mode: \"dry_run\" as const, page_id: input.page_id, parent_id: input.parent_id, widget_type: input.widget_type, confirmation_token: token };\n }\n const conf = consumeConfirmation(input.confirmation, \"add_widget\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const { raw: rawBefore, data } = await fetchData(input.site_id, input.page_id);\n const r = addWidget(data, input.parent_id, input.widget_type, input.settings);\n if (!r.ok || !r.new_widget_id) throw new Error(`Parent ${input.parent_id} not found`);\n const newId = r.new_widget_id;\n const backup = await fullBackup(input.site_id, input.page_id);\n const w = await writeData(input.site_id, input.page_id, data);\n const verification = await verifyWrite({\n siteId: input.site_id,\n pageId: input.page_id,\n description: `Re-read /wp/v2/pages/${input.page_id} and assert new widget ${newId} exists under parent ${input.parent_id} with widgetType=\"${input.widget_type}\"`,\n predicate: (canonical) => {\n const widget = findElementById(canonical, newId);\n if (!widget) return { ok: false, notes: \"New widget not found after add\" };\n const parent = findElementById(canonical, input.parent_id);\n const isUnderParent = parent?.elements?.some((e) => e.id === newId) === true;\n return {\n ok: widget.widgetType === input.widget_type && isUnderParent,\n notes: !isUnderParent\n ? `Widget exists but is not under expected parent ${input.parent_id}`\n : widget.widgetType !== input.widget_type\n ? `Widget exists with wrong widgetType \"${widget.widgetType}\"`\n : undefined,\n };\n },\n });\n return {\n mode: \"applied\" as const,\n page_id: input.page_id,\n parent_id: input.parent_id,\n widget_type: input.widget_type,\n new_widget_id: newId,\n backup_meta_key: backup.meta_key,\n css_flush: w.method,\n mutated: rawBefore !== w.serialized,\n warnings: [],\n verification,\n };\n },\n});\n\nexport const moveWidgetTool = defineTool({\n name: \"move_widget\",\n description: \"Move a widget to a different parent (or different position in the same parent). Re-reads to confirm new parent. Two-call confirmation.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n widget_id: z.string().min(1),\n new_parent_id: z.string().min(1),\n position: z.number().int().default(-1).describe(\"0-based position in the new parent. -1 = append.\"),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n ...MutationResponseShape,\n widget_id: z.string(),\n new_parent_id: z.string(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n if (!input.confirmation) {\n const token = issueConfirmation(\"move_widget\", input, POLICIES.CONFIRMATION_TTL_SECONDS);\n return { mode: \"dry_run\" as const, page_id: input.page_id, widget_id: input.widget_id, new_parent_id: input.new_parent_id, confirmation_token: token };\n }\n const conf = consumeConfirmation(input.confirmation, \"move_widget\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const { raw: rawBefore, data } = await fetchData(input.site_id, input.page_id);\n if (!moveWidget(data, input.widget_id, input.new_parent_id, input.position)) {\n throw new Error(`Widget or parent not found`);\n }\n const backup = await fullBackup(input.site_id, input.page_id);\n const w = await writeData(input.site_id, input.page_id, data);\n const verification = await verifyWrite({\n siteId: input.site_id,\n pageId: input.page_id,\n description: `Re-read /wp/v2/pages/${input.page_id} and assert widget ${input.widget_id} is now a direct child of ${input.new_parent_id}`,\n predicate: (canonical) => {\n const parent = findElementById(canonical, input.new_parent_id);\n const isUnderNewParent = parent?.elements?.some((e) => e.id === input.widget_id) === true;\n return {\n ok: isUnderNewParent,\n notes: isUnderNewParent ? undefined : `Widget ${input.widget_id} not found under ${input.new_parent_id} after move`,\n };\n },\n });\n return {\n mode: \"applied\" as const,\n page_id: input.page_id,\n widget_id: input.widget_id,\n new_parent_id: input.new_parent_id,\n backup_meta_key: backup.meta_key,\n css_flush: w.method,\n mutated: rawBefore !== w.serialized,\n warnings: [],\n verification,\n };\n },\n});\n","import { ElementorData, ElementorElement, findElementById, walkElements } from \"./data-parser.js\";\n\n/**\n * Operations on individual widgets inside an Elementor data tree.\n * All operations work on a deep-cloned tree — caller is responsible for\n * serializing the result and writing back.\n */\n\nexport function readWidget(data: ElementorData, widgetId: string): ElementorElement | null {\n return findElementById(data, widgetId);\n}\n\n/**\n * Shallow-merge new settings into an existing widget's settings.\n * Returns true if the widget was found and updated.\n */\nexport function updateWidgetSettings(\n data: ElementorData,\n widgetId: string,\n patch: Record<string, unknown>,\n): boolean {\n const widget = findElementById(data, widgetId);\n if (!widget || widget.elType !== \"widget\") return false;\n widget.settings = { ...widget.settings, ...patch };\n return true;\n}\n\n/**\n * Delete a widget by id. Returns true if removed.\n */\nexport function deleteWidget(data: ElementorData, widgetId: string): boolean {\n function removeFrom(arr: ElementorElement[]): boolean {\n for (let i = 0; i < arr.length; i++) {\n if (arr[i].id === widgetId) {\n arr.splice(i, 1);\n return true;\n }\n if (arr[i].elements && removeFrom(arr[i].elements!)) return true;\n }\n return false;\n }\n return removeFrom(data);\n}\n\n/**\n * Find the parent (section/column/container) of a widget.\n */\nexport function findParent(data: ElementorData, widgetId: string): ElementorElement | null {\n for (const { element } of walkElements(data)) {\n if (element.elements?.some((e) => e.id === widgetId)) return element;\n }\n return null;\n}\n\n/**\n * Duplicate a widget in place (right after the original in the parent's elements array).\n * Generates a new id for the clone.\n */\nexport function duplicateWidget(data: ElementorData, widgetId: string): { ok: boolean; new_widget_id?: string } {\n const parent = findParent(data, widgetId);\n if (!parent || !parent.elements) return { ok: false };\n const idx = parent.elements.findIndex((e) => e.id === widgetId);\n if (idx < 0) return { ok: false };\n const clone = JSON.parse(JSON.stringify(parent.elements[idx])) as ElementorElement;\n clone.id = generateId();\n parent.elements.splice(idx + 1, 0, clone);\n return { ok: true, new_widget_id: clone.id };\n}\n\n/**\n * Replace a widget's type while preserving id, position, and as many compatible\n * settings as possible. Useful for migrating from one widget type to another\n * (e.g., heading → text-editor).\n */\nexport function swapWidgetType(\n data: ElementorData,\n widgetId: string,\n newType: string,\n newSettings: Record<string, unknown> = {},\n): boolean {\n const widget = findElementById(data, widgetId);\n if (!widget || widget.elType !== \"widget\") return false;\n widget.widgetType = newType;\n widget.settings = newSettings;\n return true;\n}\n\n/**\n * Add a widget at the end of a parent container.\n */\nexport function addWidget(\n data: ElementorData,\n parentId: string,\n widgetType: string,\n settings: Record<string, unknown> = {},\n): { ok: boolean; new_widget_id?: string } {\n const parent = findElementById(data, parentId);\n if (!parent) return { ok: false };\n if (!parent.elements) parent.elements = [];\n const newWidget: ElementorElement = {\n id: generateId(),\n elType: \"widget\",\n widgetType,\n settings,\n elements: [],\n isInner: false,\n };\n parent.elements.push(newWidget);\n return { ok: true, new_widget_id: newWidget.id };\n}\n\n/**\n * Move a widget to a different parent (or different position in same parent).\n */\nexport function moveWidget(\n data: ElementorData,\n widgetId: string,\n newParentId: string,\n position: number = -1,\n): boolean {\n const widget = findElementById(data, widgetId);\n if (!widget) return false;\n const oldParent = findParent(data, widgetId);\n if (!oldParent || !oldParent.elements) return false;\n const newParent = findElementById(data, newParentId);\n if (!newParent) return false;\n if (!newParent.elements) newParent.elements = [];\n const idx = oldParent.elements.findIndex((e) => e.id === widgetId);\n if (idx < 0) return false;\n oldParent.elements.splice(idx, 1);\n if (position < 0 || position >= newParent.elements.length) {\n newParent.elements.push(widget);\n } else {\n newParent.elements.splice(position, 0, widget);\n }\n return true;\n}\n\n/**\n * Elementor uses 7-character hex ids by historical convention. We generate\n * something compatible-shaped.\n */\nfunction generateId(): string {\n return Math.random().toString(16).slice(2, 9).padEnd(7, \"0\");\n}\n","/**\n * Post-write verification — never trust the write API, always re-read.\n *\n * Background: WordPress REST API silently drops writes to unregistered postmeta\n * keys and returns 200 OK. Other failure modes exist (cache layers, race\n * conditions, plugin filters mutating data on save). A tool that returns\n * `{ success: true }` based purely on the HTTP response is lying to the model.\n *\n * This module re-fetches the canonical state from WP after every write and\n * runs an operation-specific predicate against it. The result is folded into\n * the tool response as a `verification` block, so the model can decide based\n * on what actually persisted, not what the API claimed.\n *\n * Pattern proposed by Mads Hansen (dev.to, May 22 2026) in response to the\n * v1.0 \"REST silently drops writes\" gotcha — implemented in v1.2 as a\n * generic primitive every mutating tool plugs into.\n */\nimport { z } from \"zod\";\nimport { wpRequest } from \"../api/wp-rest.js\";\nimport { parseElementorData, type ElementorData } from \"./data-parser.js\";\n\nexport const VerificationSchema = z.object({\n /** Plain-English description of what we re-read and compared. */\n method: z.string(),\n /** Whether a canonical re-read of the page succeeded. */\n reread_ok: z.boolean(),\n /** Op-specific: did the change we requested actually persist? */\n matches_requested: z.boolean(),\n /** Op-specific extra data (e.g. the actual persisted widget settings). */\n persisted: z.record(z.any()).optional(),\n /** Free-text notes / explanation when matches_requested is false. */\n notes: z.string().optional(),\n});\n\nexport type Verification = z.infer<typeof VerificationSchema>;\n\n/**\n * Re-fetches the page's `_elementor_data` from WP (canonical source after the\n * write) and runs the predicate. The predicate returns whether the requested\n * mutation is present in the persisted state.\n */\nexport async function verifyWrite(args: {\n siteId: string | undefined;\n pageId: number;\n predicate: (data: ElementorData) => { ok: boolean; persisted?: Record<string, unknown>; notes?: string };\n description: string;\n}): Promise<Verification> {\n try {\n const page = await wpRequest<{ meta?: Record<string, unknown> }>(\n `/wp/v2/pages/${args.pageId}?context=edit&_fields=meta`,\n { siteId: args.siteId },\n );\n const v = page.meta?._elementor_data;\n const raw = typeof v === \"string\" ? v : JSON.stringify(v ?? []);\n const data = parseElementorData(raw);\n const result = args.predicate(data);\n return {\n method: args.description,\n reread_ok: true,\n matches_requested: result.ok,\n persisted: result.persisted,\n notes: result.notes,\n };\n } catch (err) {\n return {\n method: args.description,\n reread_ok: false,\n matches_requested: false,\n notes: `Canonical re-read failed: ${(err as Error).message}`,\n };\n }\n}\n\n/** Deep equality good-enough for Elementor settings comparison. */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (a === null || b === null) return a === b;\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;\n return a.every((x, i) => deepEqual(x, b[i]));\n }\n if (typeof a === \"object\" && typeof b === \"object\") {\n const ka = Object.keys(a as object);\n const kb = Object.keys(b as object);\n if (ka.length !== kb.length) return false;\n return ka.every((k) =>\n deepEqual((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]),\n );\n }\n return false;\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"../types/tool.js\";\nimport { wpRequest } from \"../api/wp-rest.js\";\nimport { loadConfig } from \"../config.js\";\nimport { parseElementorData, serializeElementorData, findReplaceInWidgets } from \"../elementor/data-parser.js\";\nimport { fullBackup, restoreFromFile } from \"../elementor/backup.js\";\nimport { flushCSS } from \"../elementor/css-flush.js\";\nimport { validateElementorData } from \"../elementor/validator.js\";\nimport { POLICIES } from \"../elementor/policies.js\";\nimport { issueConfirmation, consumeConfirmation } from \"../utils/confirmation.js\";\n\nasync function listElementorPageIds(siteId: string | undefined): Promise<Array<{ id: number; title: string }>> {\n interface P { id: number; title: { rendered: string } }\n const out: Array<{ id: number; title: string }> = [];\n let page = 1;\n for (;;) {\n const items = await wpRequest<P[]>(\"/wp/v2/pages\", {\n siteId,\n query: {\n meta_key: \"_elementor_edit_mode\",\n meta_value: \"builder\",\n context: \"edit\",\n per_page: 100,\n page,\n _fields: \"id,title\",\n },\n });\n if (items.length === 0) break;\n out.push(...items.map((p) => ({ id: p.id, title: p.title.rendered })));\n if (items.length < 100) break;\n page++;\n if (page > 50) break; // sanity cap: 5000 pages\n }\n return out;\n}\n\nexport const bulkFindReplaceSiteTool = defineTool({\n name: \"bulk_find_replace_site\",\n description: \"Find/replace plain text in every Elementor page on a single site. TWO-CALL FLOW: dry-run returns per-page match_count + total + confirmation_token. Apply iterates each page (auto-backup + validate + flush per page). Slower than wp_search_replace but works without SSH and gives per-page granularity.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n find: z.string().min(1),\n replace: z.string(),\n widget_type: z.string().optional(),\n case_sensitive: z.boolean().default(false),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n mode: z.enum([\"dry_run\", \"applied\"]),\n site_id: z.string(),\n pages_scanned: z.number(),\n total_match_count: z.number(),\n pages_with_matches: z.array(z.object({\n page_id: z.number(),\n title: z.string(),\n match_count: z.number(),\n })),\n pages_applied: z.array(z.object({\n page_id: z.number(),\n backup_meta_key: z.string().optional(),\n css_flush: z.string().optional(),\n mode: z.enum([\"applied\", \"rolled_back\", \"skipped\"]),\n error: z.string().optional(),\n })).optional(),\n confirmation_token: z.string().optional(),\n expires_in_seconds: z.number().optional(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n const pages = await listElementorPageIds(input.site_id);\n const matches: Array<{ page_id: number; title: string; match_count: number }> = [];\n for (const p of pages) {\n try {\n const page = await wpRequest<{ meta?: Record<string, unknown> }>(`/wp/v2/pages/${p.id}?context=edit&_fields=meta`, { siteId: input.site_id });\n const v = page.meta?._elementor_data;\n const raw = typeof v === \"string\" ? v : JSON.stringify(v ?? []);\n const data = parseElementorData(raw);\n const dry = findReplaceInWidgets(JSON.parse(JSON.stringify(data)), input.find, input.replace, {\n widgetType: input.widget_type, caseSensitive: input.case_sensitive,\n });\n if (dry.replacementCount > 0) matches.push({ page_id: p.id, title: p.title, match_count: dry.replacementCount });\n } catch { /* skip pages we can't read */ }\n }\n const total = matches.reduce((s, m) => s + m.match_count, 0);\n\n if (!input.confirmation) {\n if (total === 0) {\n return {\n mode: \"dry_run\" as const,\n site_id: loadConfig().default_site_id ?? \"default\",\n pages_scanned: pages.length,\n total_match_count: 0,\n pages_with_matches: [],\n };\n }\n const token = issueConfirmation(\"bulk_find_replace_site\", { find: input.find, replace: input.replace, page_ids: matches.map((m) => m.page_id) }, POLICIES.CONFIRMATION_TTL_SECONDS);\n return {\n mode: \"dry_run\" as const,\n site_id: input.site_id ?? loadConfig().default_site_id ?? \"default\",\n pages_scanned: pages.length,\n total_match_count: total,\n pages_with_matches: matches,\n confirmation_token: token,\n expires_in_seconds: POLICIES.CONFIRMATION_TTL_SECONDS,\n };\n }\n\n const conf = consumeConfirmation(input.confirmation, \"bulk_find_replace_site\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n\n const applied: Array<{ page_id: number; backup_meta_key?: string; css_flush?: string; mode: \"applied\" | \"rolled_back\" | \"skipped\"; error?: string }> = [];\n for (const m of matches) {\n try {\n const page = await wpRequest<{ meta?: Record<string, unknown> }>(`/wp/v2/pages/${m.page_id}?context=edit&_fields=meta`, { siteId: input.site_id });\n const v = page.meta?._elementor_data;\n const raw = typeof v === \"string\" ? v : JSON.stringify(v ?? []);\n const data = parseElementorData(raw);\n findReplaceInWidgets(data, input.find, input.replace, { widgetType: input.widget_type, caseSensitive: input.case_sensitive });\n const ser = serializeElementorData(data);\n const validation = validateElementorData(ser);\n if (!validation.valid) {\n applied.push({ page_id: m.page_id, mode: \"rolled_back\", error: validation.errors.join(\"; \") });\n continue;\n }\n const backup = await fullBackup(input.site_id, m.page_id);\n await wpRequest(`/wp/v2/pages/${m.page_id}`, {\n siteId: input.site_id, method: \"PUT\",\n body: { meta: { _elementor_data: ser } },\n });\n const flush = await flushCSS(input.site_id, m.page_id);\n applied.push({ page_id: m.page_id, backup_meta_key: backup.meta_key, css_flush: flush.method, mode: \"applied\" });\n } catch (e) {\n applied.push({ page_id: m.page_id, mode: \"skipped\", error: (e as Error).message });\n }\n }\n return {\n mode: \"applied\" as const,\n site_id: input.site_id ?? loadConfig().default_site_id ?? \"default\",\n pages_scanned: pages.length,\n total_match_count: total,\n pages_with_matches: matches,\n pages_applied: applied,\n };\n },\n});\n\nexport const fleetFindReplaceTool = defineTool({\n name: \"fleet_find_replace\",\n description: \"Find/replace plain text across every Elementor page of every site in the pool. Same flow as bulk_find_replace_site but iterates across sites. Returns per-site + grand-total summary. Dry-run first; second call applies. Use sparingly — this is the nuclear option.\",\n inputSchema: z.object({\n find: z.string().min(1),\n replace: z.string(),\n site_ids: z.array(z.string()).optional().describe(\"Subset of sites to hit. Defaults to all.\"),\n widget_type: z.string().optional(),\n case_sensitive: z.boolean().default(false),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n mode: z.enum([\"dry_run\", \"applied\"]),\n sites_scanned: z.number(),\n total_match_count: z.number(),\n by_site: z.array(z.object({\n site_id: z.string(),\n url: z.string(),\n pages_scanned: z.number(),\n matches: z.number(),\n error: z.string().optional(),\n })),\n confirmation_token: z.string().optional(),\n expires_in_seconds: z.number().optional(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n const cfg = loadConfig();\n const targets = input.site_ids ? cfg.sites.filter((s) => input.site_ids?.includes(s.id)) : cfg.sites;\n const by_site: Array<{ site_id: string; url: string; pages_scanned: number; matches: number; error?: string }> = [];\n let total = 0;\n\n for (const site of targets) {\n try {\n const pages = await listElementorPageIds(site.id);\n let siteMatches = 0;\n for (const p of pages) {\n try {\n const page = await wpRequest<{ meta?: Record<string, unknown> }>(`/wp/v2/pages/${p.id}?context=edit&_fields=meta`, { siteId: site.id });\n const v = page.meta?._elementor_data;\n const raw = typeof v === \"string\" ? v : JSON.stringify(v ?? []);\n const data = parseElementorData(raw);\n const dry = findReplaceInWidgets(JSON.parse(JSON.stringify(data)), input.find, input.replace, {\n widgetType: input.widget_type, caseSensitive: input.case_sensitive,\n });\n siteMatches += dry.replacementCount;\n } catch { /* skip */ }\n }\n by_site.push({ site_id: site.id, url: site.url, pages_scanned: pages.length, matches: siteMatches });\n total += siteMatches;\n } catch (e) {\n by_site.push({ site_id: site.id, url: site.url, pages_scanned: 0, matches: 0, error: (e as Error).message });\n }\n }\n\n if (!input.confirmation) {\n if (total === 0) {\n return {\n mode: \"dry_run\" as const,\n sites_scanned: by_site.length,\n total_match_count: 0,\n by_site,\n };\n }\n const token = issueConfirmation(\"fleet_find_replace\", { find: input.find, replace: input.replace }, POLICIES.CONFIRMATION_TTL_SECONDS);\n return {\n mode: \"dry_run\" as const,\n sites_scanned: by_site.length,\n total_match_count: total,\n by_site,\n confirmation_token: token,\n expires_in_seconds: POLICIES.CONFIRMATION_TTL_SECONDS,\n };\n }\n\n const conf = consumeConfirmation(input.confirmation, \"fleet_find_replace\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n\n // Re-apply per site (sequentially — could parallelize later, but parallel writes across the fleet are scary)\n for (const site of targets) {\n const pages = await listElementorPageIds(site.id);\n for (const p of pages) {\n try {\n const page = await wpRequest<{ meta?: Record<string, unknown> }>(`/wp/v2/pages/${p.id}?context=edit&_fields=meta`, { siteId: site.id });\n const v = page.meta?._elementor_data;\n const raw = typeof v === \"string\" ? v : JSON.stringify(v ?? []);\n const data = parseElementorData(raw);\n const r = findReplaceInWidgets(data, input.find, input.replace, { widgetType: input.widget_type, caseSensitive: input.case_sensitive });\n if (r.replacementCount === 0) continue;\n const ser = serializeElementorData(data);\n const validation = validateElementorData(ser);\n if (!validation.valid) continue;\n await fullBackup(site.id, p.id);\n await wpRequest(`/wp/v2/pages/${p.id}`, {\n siteId: site.id, method: \"PUT\",\n body: { meta: { _elementor_data: ser } },\n });\n await flushCSS(site.id, p.id);\n } catch { /* skip */ }\n }\n }\n\n return {\n mode: \"applied\" as const,\n sites_scanned: by_site.length,\n total_match_count: total,\n by_site,\n };\n },\n});\n\nexport const restoreFromFileTool = defineTool({\n name: \"restore_from_file\",\n description: \"Restore a page from a JSON backup file (created by ANY earlier op with backup_to_file=true or by direct fullBackup with to_file). Requires the file_path returned by that backup. Two-call confirmation.\",\n inputSchema: z.object({\n site_id: z.string().optional(),\n page_id: z.number().int().positive(),\n file_path: z.string().min(1),\n confirmation: z.string().optional(),\n }),\n outputSchema: z.object({\n mode: z.enum([\"dry_run\", \"restored\"]),\n page_id: z.number(),\n file_path: z.string(),\n method: z.enum([\"wp-cli\", \"rest\"]).optional(),\n pre_restore_backup_meta_key: z.string().optional(),\n css_flush: z.string().optional(),\n confirmation_token: z.string().optional(),\n }),\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n async handler(input) {\n if (!input.confirmation) {\n const token = issueConfirmation(\"restore_from_file\", input, POLICIES.CONFIRMATION_TTL_SECONDS);\n return {\n mode: \"dry_run\" as const,\n page_id: input.page_id,\n file_path: input.file_path,\n confirmation_token: token,\n };\n }\n const conf = consumeConfirmation(input.confirmation, \"restore_from_file\");\n if (!conf) throw new Error(\"Invalid or expired confirmation token\");\n const pre = await fullBackup(input.site_id, input.page_id);\n const r = await restoreFromFile(input.site_id, input.page_id, input.file_path);\n const flush = await flushCSS(input.site_id, input.page_id);\n return {\n mode: \"restored\" as const,\n page_id: input.page_id,\n file_path: input.file_path,\n method: r.method,\n pre_restore_backup_meta_key: pre.meta_key,\n css_flush: flush.method,\n };\n },\n});\n","import type { ToolDefinition } from \"../types/tool.js\";\nimport { listSitesTool, pingSiteTool, siteHealthTool } from \"./sites.js\";\nimport {\n listElementorPagesTool, readPageElementorTool, listWidgetsInPageTool,\n listGlobalWidgetsTool, preflightCheckTool, findReplaceTool,\n listElementorBackupsTool, restoreElementorBackupTool, duplicateElementorPageTool,\n} from \"./pages.js\";\nimport {\n listTemplatesTool, exportTemplateTool, importTemplateTool, applyTemplateToPageTool,\n} from \"./templates.js\";\nimport {\n wpCliRunTool, wpSearchReplaceTool, wpElementorFlushCssTool, wpPluginListTool, wpPluginUpdateTool,\n} from \"./wpcli.js\";\nimport { screenshotPageTool, compareScreenshotsTool } from \"./visual.js\";\nimport { checkElementorVersionsTool } from \"./updates.js\";\nimport {\n readWidgetTool, updateWidgetSettingsTool, deleteWidgetTool, duplicateWidgetTool,\n swapWidgetTypeTool, addWidgetTool, moveWidgetTool,\n} from \"./widgets.js\";\nimport {\n bulkFindReplaceSiteTool, fleetFindReplaceTool, restoreFromFileTool,\n} from \"./bulk.js\";\n\nexport const tools: ToolDefinition[] = [\n // Sites & health\n listSitesTool, pingSiteTool, siteHealthTool,\n // Pages\n listElementorPagesTool, readPageElementorTool, listWidgetsInPageTool,\n listGlobalWidgetsTool, preflightCheckTool, findReplaceTool,\n listElementorBackupsTool, restoreElementorBackupTool, duplicateElementorPageTool,\n // Widget-level CRUD (v1.1)\n readWidgetTool, updateWidgetSettingsTool, deleteWidgetTool, duplicateWidgetTool,\n swapWidgetTypeTool, addWidgetTool, moveWidgetTool,\n // Templates\n listTemplatesTool, exportTemplateTool, importTemplateTool, applyTemplateToPageTool,\n // Bulk + fleet (v1.1)\n bulkFindReplaceSiteTool, fleetFindReplaceTool, restoreFromFileTool,\n // WP-CLI escape\n wpCliRunTool, wpSearchReplaceTool, wpElementorFlushCssTool, wpPluginListTool, wpPluginUpdateTool,\n // Visual\n screenshotPageTool, compareScreenshotsTool,\n // Versions\n checkElementorVersionsTool,\n] as unknown as ToolDefinition[];\n","import { readFileSync, existsSync, readdirSync } from \"node:fs\";\nimport { dirname, resolve, join, basename } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst DOCS_DIR = resolve(__dirname, \"../resources/elementor-docs\");\n\nexport interface Resource {\n uri: string;\n name: string;\n description?: string;\n mimeType: string;\n}\n\nexport async function listResources(): Promise<Resource[]> {\n if (!existsSync(DOCS_DIR)) return [];\n const files = readdirSync(DOCS_DIR).filter((f) => f.endsWith(\".md\"));\n return files.map((f) => ({\n uri: `elementor-docs://${f}`,\n name: basename(f, \".md\"),\n description: `Elementor documentation snippet (scraped from developer.elementor.com)`,\n mimeType: \"text/markdown\",\n }));\n}\n\nexport async function readResource(uri: string): Promise<{ contents: { uri: string; mimeType: string; text: string }[] }> {\n if (!uri.startsWith(\"elementor-docs://\")) {\n throw new Error(`Unknown resource URI: ${uri}`);\n }\n const filename = uri.replace(\"elementor-docs://\", \"\");\n const path = join(DOCS_DIR, filename);\n if (!existsSync(path)) throw new Error(`Resource not found: ${filename}`);\n return {\n contents: [\n {\n uri,\n mimeType: \"text/markdown\",\n text: readFileSync(path, \"utf8\"),\n },\n ],\n };\n}\n"],"mappings":"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","names":["s","cached","spawn","resolve","readFileSync","writeData","readFileSync","dirname","resolve","fileURLToPath","z","z","z","z","z","z","issueConfirmation","consumeConfirmation","POLICIES","fullBackup","flushCSS","parseSettingsForRest","z","z","m","flushCSS","z","spawn","existsSync","tmpdir","join","randomBytes","resolve","readFileSync","z","z","z","z","z","z","z","z","z","readFileSync","existsSync","join","__dirname","dirname","fileURLToPath","readFileSync","resolve"]}
|