/** * REST client for the MCP & AI admin endpoints * (includes/class-mcp-admin-rest.php, namespace llm-analytics/v1). */ import type { McpActivityEntry, McpCreatedToken, McpSelfTestResult, McpSettings, McpStatus, McpTokenInfo, McpTokenScope, } from './types'; const NS = 'llm-analytics/v1'; function apiRoot(): string { const root = (window as unknown as { wpApiSettings?: { root?: string } }).wpApiSettings?.root || '/wp-json/'; return root.replace(/\/$/, ''); } function nonce(): string { return (window as unknown as { wpApiSettings?: { nonce?: string } }).wpApiSettings?.nonce || ''; } async function request(path: string, init: RequestInit = {}): Promise { const res = await fetch(`${apiRoot()}/${NS}${path}`, { credentials: 'same-origin', ...init, headers: { 'X-WP-Nonce': nonce(), ...(init.body ? { 'Content-Type': 'application/json' } : {}), ...(init.headers || {}), }, }); const data = (await res.json().catch(() => ({}))) as T & { message?: string }; if (!res.ok) { throw new Error( typeof data?.message === 'string' && data.message ? data.message : `Request failed (${res.status})`, ); } return data; } export function getStatus(): Promise { return request('/mcp/status'); } export function saveSettings(partial: Partial): Promise { return request('/mcp/settings', { method: 'POST', body: JSON.stringify(partial), }); } export function listTokens(): Promise<{ tokens: McpTokenInfo[]; has_legacy_token: boolean }> { return request('/mcp/tokens'); } export function createToken(label: string, scope: McpTokenScope): Promise { return request('/mcp/tokens', { method: 'POST', body: JSON.stringify({ label, scope }), }); } /** Pass `legacy` as id to delete the legacy WP-CLI plaintext token. */ export function revokeToken(id: string): Promise<{ revoked?: boolean; deleted?: boolean }> { return request(`/mcp/tokens/${encodeURIComponent(id)}`, { method: 'DELETE' }); } export function getActivity(limit = 50): Promise<{ entries: McpActivityEntry[] }> { return request(`/mcp/activity?limit=${limit}`); } export function runSelfTest(): Promise { return request('/mcp/self-test', { method: 'POST' }); }