Skip to content

PressPilot 2.2.2

Choose a tag to compare

@babak-majd babak-majd released this 11 Sep 15:33
· 3 commits to main since this release

PressPilot 2.2.2

First tagged release of the 2.x line — the version where an AI agent connects directly to WordPress.

Install: upload presspilot.zip (attached) via Plugins → Add New → Upload Plugin. Requires WordPress 5.8+ and PHP 7.4+ (verified on WP 5.8 → 7.1, PHP 7.4 → 8.4).

Highlights

  • MCP server — POST /wp-json/presspilot/v1/mcp. Claude Code, OpenAI Codex, Cursor and any MCP client see the site as native tools. Both the legacy initialize handshake and the modern stateless server/discover shape on one endpoint.
  • Built-in copilot — Anthropic, OpenAI, OpenRouter, AgentRouter, Dahl Inference, or any OpenAI-compatible endpoint, driven from wp-admin with the same tools, permissions and Skill.
  • Multilingual dashboard, automatic RTL — English, Persian, Arabic, German. Language and direction come from WordPress alone; nothing about the site's URLs changes.
  • Permissions carry through — a disabled capability's tools are hidden from the agent entirely, not refused at call time.

Changelog

2.2.2

  • Fix: the Copilot screen now notices when the plugin has been updated underneath it. Its behaviour ships inside the page it was served with, so a screen left open across an update kept running the old code — which looks exactly like a fix that did not work. It now checks the running version and says plainly that a reload is needed.

2.2.1

  • Fix: the copilot chat showed raw markup. Models do not agree on a format — some answer in Markdown (**bold**), some in HTML, some mix the two — and the chat rendered every reply as plain text, so the markup itself was visible. Replies now go through one pipeline that converts Markdown, passes model-written HTML through, and filters the result against a strict allowlist (no script, no styles, no attributes beyond a validated href). Anything unrecognised is unwrapped to its text, so a stray tag reads as words rather than executing.
  • Fix: reasoning models (Kimi, DeepSeek and friends) emit their chain of thought inline as <think>…</think> in the normal content field. That is not an answer and is now stripped server-side, so headless callers of /agent/run get clean text too. Unclosed and orphaned tags are handled. The assistant turn echoed back into the conversation is left verbatim.
  • Chat code blocks and inline code stay left-to-right on an RTL dashboard.

2.2.0

  • New copilot provider: Dahl Inference (inference.dahl.global) — open models (MiniMax M2.7, Kimi K2.6, DeepSeek V4 Flash) served over a decentralised GPU network at a fraction of the usual price, with the first 100M tokens free. OpenAI-compatible, so it plugs into the existing wire layer; pick it on the Copilot screen and Load available models lists what it currently serves. Model ids are namespaced, e.g. MiniMaxAI/MiniMax-M2.7.

2.1.1

  • Fix: copilot errors were invisible behind a CDN. Provider failures returned HTTP 502, and Cloudflare (by default) replaces a 5xx from the origin with its own generic error page — so the plugin's actual diagnostic never reached the user, who just saw "error code: 502". Upstream failures now return 424 Failed Dependency, a 4xx that proxies pass through untouched.
  • Fix: a provider base URL saved as the bare origin (e.g. https://agentrouter.org instead of https://agentrouter.org/v1) silently sent every call to the vendor's marketing site, which answers 200 with HTML. Known providers are now normalised back to their documented API base; a path you chose yourself, and the custom provider, are left alone.
  • The "not JSON" error now names the URL it called and points at the missing /v1.

2.1.0

  • The dashboard is now multilingual — every screen is fully translatable, and the plugin ships with Persian (fa_IR), Arabic (ar) and German (de_DE) alongside English. 169 strings, no gaps.
  • Right-to-left support is automatic. The language comes from WordPress alone (Settings → Site Language, or the per-user language on a profile) and RTL follows the locale's own direction. The plugin adds no rewrite rules, no query parameters and no URL segments — translating it changes nothing about this site's addresses.
  • The admin stylesheet is written with CSS logical properties, so every screen mirrors correctly on an RTL locale with no separate RTL stylesheet to load. API keys, endpoint URLs, curl lines, TOML and JSON snippets are pinned left-to-right so they stay readable and copyable in an RTL dashboard, and chat messages use unicode-bidi: plaintext so each message picks up its own direction.
  • What a model reads stays English on every locale by design — the agent prompt, the MCP instructions, and tool descriptions. They pair with an English operating manual, and mixing languages in an LLM's context makes its output worse.
  • Capability descriptions, provider notes and MCP client hints are translated; capability keys and vendor names are not (they are wire identifiers and brands).

2.0.1

  • Compatibility verified end to end (activation, MCP handshake, tools/list, a real block-content write through tools/call, and the full copilot loop) on WordPress 5.8, 6.9.5 and 7.1 across PHP 7.4, 8.2 and 8.4 — no notices, warnings or deprecations on any combination. Syntax additionally checked on PHP 8.0 and 8.3.
  • Tested up to raised to 7.1 (previously 7.0), now actually exercised rather than assumed.
  • Fix: GET /agent/models reported "the provider returned HTTP 200" when a 2xx response body was not JSON — it now says the base URL is likely pointing at a web page rather than an API root.
  • Fix: the MCP authentication-failure path read the error status without checking its shape; hardened so the failure path cannot itself raise a warning.
  • Remove dead code in the /agent/config write handler.

2.0.0

  • MCP server — POST /mcp, a Model Context Protocol endpoint over Streamable HTTP (JSON-RPC 2.0). Connect Claude Code, OpenAI Codex, Cursor or any MCP client directly; the site shows up as native tools.
    • Dual-era on one endpoint: the legacy initialize handshake (2024-11-05 … 2025-11-25) and the modern stateless server/discover shape (2026-07-28), with spec-correct version negotiation (-32022) and header/body validation (-32020).
    • Tools, resources (presspilot://skill, presspilot://site, presspilot://openapi) and prompts (build_site, migrate_to_gutenberg, configure_plugin, audit_site).
    • The agent Skill is delivered on connect as MCP instructions, so agents follow the site's build rules from their first message.
  • Built-in copilot — connect Anthropic, OpenAI, OpenRouter, AgentRouter or any OpenAI-compatible endpoint and chat with your site from wp-admin. GET /agent/models pulls the live model list from the provider; POST /agent/step runs one round trip (the browser drives the loop, so no request can hit max_execution_time) and POST /agent/run runs the whole loop server-side for headless callers.
  • One tool registry behind both surfaces (GET /tools, POST /tools/call) — every tool is a thin wrapper over an existing REST route, dispatched internally, so handlers, validation and capability scopes stay the single source of truth.
  • Permissions carry over: a tool whose capability scope is disabled is omitted from tools/list entirely rather than failing at call time. New "Essential/Full" tool-profile setting trims the surface for smaller models.
  • New admin screens: Agents (MCP) (endpoint, per-client copy-paste setup, tool inventory) and Copilot (provider, model, chat).
  • Optional ?key= URL auth for clients that cannot send custom headers (off by default).