// ── MCP / JSON-RPC 2.0 protocol types ──────────────────────────────────────── // The Agent Bridge implements MCP over JSON-RPC 2.0, transported via WebSocket // (long-running) or HTTP POST (polling-based agents). export interface JsonRpcRequest { jsonrpc: '2.0'; id: string | number; method: string; params?: unknown; } export interface JsonRpcSuccess { jsonrpc: '2.0'; id: string | number; result: T; } export interface JsonRpcError { jsonrpc: '2.0'; id: string | number | null; error: { code: number; message: string; data?: unknown; }; } export type JsonRpcResponse = JsonRpcSuccess | JsonRpcError; // ── MCP error codes ─────────────────────────────────────────────────────────── export const MCP_ERROR = { PARSE_ERROR: -32700, INVALID_REQUEST: -32600, METHOD_NOT_FOUND: -32601, INVALID_PARAMS: -32602, INTERNAL_ERROR: -32603, // Application-level codes UNAUTHORIZED: -32001, RATE_LIMITED: -32002, NOT_FOUND: -32003, } as const; // ── Origmain-specific envelope ──────────────────────────────────────────────── // Every connection must present a signed workspace token in the first message. export interface AuthRequest { type: 'auth'; workspaceToken: string; } export interface AuthAck { type: 'auth_ack'; workspaceId: string; agentType: 'CURSOR' | 'CLAUDE_CODE' | 'GENERIC'; } // ── Intent types — Phase 5 §8.4 ────────────────────────────────────────────── // These describe the design changes the canvas wants the agent to apply to source. export interface IntentChange { type: 'style' | 'prop' | 'layout' | 'remove'; cssProperty?: string; propName?: string; from?: unknown; to?: unknown; /** CSS custom property key when the value maps to a design token (Phase 6). */ tokenKey?: string; confidence: 'exact' | 'approximate'; } export interface IntentMessage { intentId: string; component: { name: string; /** Fiber path ID — used for diff correlation. */ nodeId: string; /** Call-site location: "src/app/dashboard/page.tsx:34" */ callSite?: string; definitionFile?: string; definitionLine?: number; /** Current runtime props — context for the agent. */ props: Record; /** From AST indexer (optional — indexer may not be running). */ propsSchema?: Array<{ name: string; type: string; optional: boolean }>; }; changes: IntentChange[]; /** * Ready-to-apply code diff (when confidence is 'exact', apply verbatim; * when 'approximate', use as a guide and refine). */ codeDiff?: { file: string; originalContent: string; patchedContent: string; confidence: 'exact' | 'approximate'; }; /** Before/after visual snapshots (base64 data URLs). */ snapshot?: { before: string; after?: string; }; /** Design language context when tokens are loaded (Phase 6). */ designLanguage?: { tokensUsed: string[]; palette: Record; }; } /** * Server → agent push (sent over WebSocket, no JSON-RPC id — not a request). * Emitted immediately after `push_intent` stores a new intent. */ export interface IntentReceivedPush { type: 'INTENT_RECEIVED'; intent: IntentMessage; } // ── Tool result types ───────────────────────────────────────────────────────── export interface ToolResult { content: { type: 'text'; text: string } | { type: 'json'; json: T }; } export function textResult(text: string): ToolResult { return { content: { type: 'text', text } }; } export function jsonResult(json: T): ToolResult { return { content: { type: 'json', json } }; }