{"version":3,"sources":["../src/mcp/server.ts","../src/presence/wrap-tool-with-activity.ts","../src/undo/undo-tools.ts","../src/bridges/artboard.ts"],"names":["emitActivity","undoOne","redoOne","readHistory","pushUndoEntry"],"mappings":"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","file":"bridges-artboard.cjs","sourcesContent":["import {\n  type CallToolResult,\n  type JsonObject,\n  type JsonRpcMessage,\n  type JsonRpcRequest,\n  type JsonRpcId,\n  type RegisteredTool,\n  type ServerCapabilities,\n  type ServerInfo,\n  type ToolDefinition,\n  type ToolHandler,\n  JSONRPC_INTERNAL_ERROR,\n  JSONRPC_INVALID_PARAMS,\n  JSONRPC_METHOD_NOT_FOUND,\n  MCP_PROTOCOL_VERSION,\n} from \"./types\";\nimport { ToolRegistry } from \"./tool-host\";\n\nexport type McpServerOptions = {\n  info: ServerInfo;\n  /** Defaults to { tools: { listChanged: true } } */\n  capabilities?: ServerCapabilities;\n  /** Free-text instructions surfaced to clients during initialize. */\n  instructions?: string;\n  /**\n   * The protocol revisions this server speaks, NEWEST FIRST.\n   *\n   * `initialize` echoes the client's requested revision when it is in this\n   * list, and answers the first entry otherwise — the spec's rule, which leaves\n   * the client to decide whether it can live with the answer.\n   *\n   * Defaults to `[MCP_PROTOCOL_VERSION]`: one revision, answered whatever the\n   * client asks, which is exactly what this server did before the option\n   * existed. Only list a revision the tools you register are correct under.\n   */\n  protocolVersions?: readonly string[];\n};\n\nexport type Transport = {\n  /** Called by the server when it has a message to deliver to the client. */\n  send: (message: JsonRpcMessage) => void;\n  /** Called by the server when it's torn down so the transport can clean up. */\n  close?: () => void;\n};\n\n/**\n * MicroMcpServer — protocol-level MCP server, transport-agnostic.\n *\n * Use it like:\n *\n *   const server = new MicroMcpServer({ info: { name: \"session\", version: \"0.1\" } });\n *   server.registerTool({ name: \"...\", inputSchema: { type: \"object\" } }, async (args) => ({...}));\n *   const transport = new InProcessTransport();\n *   server.attach(transport);\n *   transport.deliver({ ... }); // client → server frames\n *\n * The same server can serve multiple transports (e.g. an in-process agent\n * AND a relayed external client) by attaching each one.\n */\nexport class MicroMcpServer extends ToolRegistry {\n  private transports = new Set<Transport>();\n  /**\n   * Transports owed a `tools/list_changed` at the end of this tick. Empty when\n   * none is scheduled. See {@link scheduleListChangedNotification}.\n   */\n  private listChangedOwed = new Set<Transport>();\n\n  readonly info: ServerInfo;\n  readonly capabilities: ServerCapabilities;\n  readonly instructions?: string;\n  readonly protocolVersions: readonly string[];\n\n  constructor(options: McpServerOptions) {\n    super();\n    this.info = options.info;\n    this.capabilities = options.capabilities ?? { tools: { listChanged: true } };\n    this.instructions = options.instructions;\n    if (options.protocolVersions && options.protocolVersions.length === 0) {\n      // No answer exists for a client's initialize. Fail here, next to the\n      // mistake, rather than in a handshake nobody is watching.\n      throw new Error(\"MicroMcpServer: protocolVersions is empty — a server must speak at least one protocol revision.\");\n    }\n    this.protocolVersions = options.protocolVersions ? [...options.protocolVersions] : [MCP_PROTOCOL_VERSION];\n  }\n\n  attach(transport: Transport): () => void {\n    this.transports.add(transport);\n    return () => this.detach(transport);\n  }\n\n  detach(transport: Transport): void {\n    if (this.transports.delete(transport)) {\n      transport.close?.();\n    }\n  }\n\n  unregisterTool(name: string): void {\n    if (this.tools.delete(name)) {\n      this.scheduleListChangedNotification();\n    }\n  }\n\n  protected onToolsChanged(): void {\n    this.scheduleListChangedNotification();\n  }\n\n  /**\n   * Receive a JSON-RPC frame from a client (called by the transport).\n   * The transport is responsible for sending the response back.\n   */\n  async receive(transport: Transport, message: JsonRpcMessage): Promise<void> {\n    if (!(\"method\" in message)) return; // It's a response, not a request — ignore.\n\n    const isNotification = !(\"id\" in message);\n    if (isNotification) {\n      // Notifications are fire-and-forget. We ignore unknown methods.\n      return;\n    }\n\n    const request = message as JsonRpcRequest;\n    try {\n      const result = await this.handle(request, transport);\n      transport.send({ jsonrpc: \"2.0\", id: request.id, result });\n    } catch (err) {\n      transport.send({\n        jsonrpc: \"2.0\",\n        id: request.id,\n        error: this.toRpcError(err),\n      });\n    }\n  }\n\n  private async handle(request: JsonRpcRequest, transport: Transport): Promise<any> {\n    const { method, params } = request;\n    switch (method) {\n      case \"initialize\":\n        return {\n          protocolVersion: this.negotiate(params?.protocolVersion),\n          capabilities: this.capabilities,\n          serverInfo: this.info,\n          ...(this.instructions ? { instructions: this.instructions } : {}),\n        };\n\n      case \"tools/list\":\n        return { tools: this.listTools() };\n\n      case \"tools/call\": {\n        const name = params?.name;\n        const args = (params?.arguments ?? {}) as JsonObject;\n        if (typeof name !== \"string\") {\n          throw rpcError(JSONRPC_INVALID_PARAMS, \"tools/call requires `name`\");\n        }\n        const tool = this.tools.get(name);\n        if (!tool) {\n          throw rpcError(JSONRPC_METHOD_NOT_FOUND, this.missingToolMessage(name));\n        }\n        const result = await tool.handler(args, { transport });\n        return result satisfies CallToolResult;\n      }\n\n      case \"ping\":\n        return {};\n\n      default:\n        throw rpcError(JSONRPC_METHOD_NOT_FOUND, `Unsupported method: ${method}`);\n    }\n  }\n\n  /** The revision to answer `initialize` with: the one asked for if spoken, else the newest. */\n  private negotiate(requested: unknown): string {\n    return typeof requested === \"string\" && this.protocolVersions.includes(requested)\n      ? requested\n      : this.protocolVersions[0];\n  }\n\n  /**\n   * Tell the transports that SAW the old tool list that it changed.\n   *\n   * Changes in one tick coalesce into one notification. The recipients are the\n   * transports attached at the moment of a change, not at the moment the\n   * notification goes out: a transport attached afterwards never had the old\n   * list, so \"your list is stale\" is noise to it — and on stdio, where a host\n   * builds the server and attaches stdin/stdout in the same tick, it was the\n   * first frame a client received, before it had even sent `initialize`.\n   */\n  private scheduleListChangedNotification(): void {\n    if (this.transports.size === 0) return;\n    const scheduled = this.listChangedOwed.size > 0;\n    for (const t of this.transports) this.listChangedOwed.add(t);\n    if (scheduled) return;\n    queueMicrotask(() => {\n      const owed = this.listChangedOwed;\n      this.listChangedOwed = new Set();\n      for (const t of owed) {\n        // Detached since the change: it is not listening any more.\n        if (this.transports.has(t)) t.send({ jsonrpc: \"2.0\", method: \"notifications/tools/list_changed\" });\n      }\n    });\n  }\n\n  /** Send an application notification to every client, or one attached transport. */\n  notify(message: JsonRpcMessage, transport?: Transport): void {\n    if (transport) transport.send(message);\n    else this.broadcast(message);\n  }\n\n  private broadcast(message: JsonRpcMessage): void {\n    for (const t of this.transports) t.send(message);\n  }\n\n  private toRpcError(err: unknown): { code: number; message: string; data?: any } {\n    if (err && typeof err === \"object\" && \"code\" in err && \"message\" in err) {\n      return err as any;\n    }\n    return {\n      code: JSONRPC_INTERNAL_ERROR,\n      message: err instanceof Error ? err.message : String(err),\n    };\n  }\n}\n\nexport function rpcError(code: number, message: string, data?: any) {\n  return { code, message, ...(data !== undefined ? { data } : {}) };\n}\n\n/**\n * Helper to build a CallToolResult from a string or structured value.\n */\nexport function textResult(text: string, structured?: any): CallToolResult {\n  return {\n    content: [{ type: \"text\", text }],\n    ...(structured !== undefined ? { structuredContent: structured } : {}),\n  };\n}\n\nexport function errorResult(text: string): CallToolResult {\n  return { content: [{ type: \"text\", text }], isError: true };\n}\n\n// Internal helper so the JsonRpcId import isn't dropped by tsup\ntype _KeepIdImport = JsonRpcId;\n","import type { CallToolResult } from \"../mcp/types\";\nimport { emitActivity } from \"./registry\";\nimport type { AgentTarget } from \"./types\";\n\nexport type ActivityAgent = { id: string; name?: string; color?: string };\n\nexport type ActivityResolverContext<TArgs = Record<string, unknown>> = {\n  /** Tool name as registered. */\n  toolName: string;\n  /** Arguments the tool was called with. */\n  args: TArgs;\n  /** The CallToolResult the underlying handler produced. */\n  result: CallToolResult;\n};\n\n/**\n * Resolves an `AgentTarget` for an executed tool. Bridges declare one of\n * these per registration so the wrapper knows which surface / element /\n * screen the activity belongs to.\n *\n * The resolver runs AFTER the tool handler so it can inspect the result\n * (e.g. read a newly-created item id from `structuredContent`).\n */\nexport type ActivityTargetResolver<TArgs = Record<string, unknown>> = (\n  ctx: ActivityResolverContext<TArgs>,\n) => AgentTarget | null;\n\nexport type ToolHandler<TArgs = Record<string, unknown>> = (\n  args: TArgs,\n) => Promise<CallToolResult> | CallToolResult;\n\n/**\n * wrapToolWithActivity — decorate a bridge tool handler so every successful\n * call emits an `AgentActivityEvent`. Returns a new handler with the same shape.\n *\n * Usage in a bridge:\n *\n *   server.registerTool(\n *     definition,\n *     wrapToolWithActivity(\n *       handler,\n *       { agent, kind: \"whiteboard\", resolveTarget: ({ args }) => ({\n *           kind: \"whiteboard\", elementId: args.id as string,\n *         }) },\n *     ),\n *   );\n */\nexport function wrapToolWithActivity<TArgs = Record<string, unknown>>(\n  handler: ToolHandler<TArgs>,\n  options: {\n    toolName: string;\n    agent: ActivityAgent;\n    /** Optional fancy-screens screen id this bridge is scoped to. */\n    screenId?: string;\n    /** Default target kind if the resolver returns one without `kind`. */\n    kind: AgentTarget[\"kind\"];\n    /** Per-call resolver. Return `null` to skip emitting (e.g. for read-only tools). */\n    resolveTarget?: ActivityTargetResolver<TArgs>;\n    /** Optional ttl override. */\n    ttlMs?: number;\n    /**\n     * Build the `meta` broadcast to all relay peers. Defaults to the tool's full\n     * `structuredContent`. Override to REDACT sensitive fields before fan-out —\n     * e.g. the terminal bridge strips raw command/keystroke bytes so a command\n     * line (or its secrets) is never broadcast verbatim to every peer.\n     */\n    buildMeta?: (result: CallToolResult) => Record<string, unknown> | undefined;\n  },\n): ToolHandler<TArgs> {\n  return async (args) => {\n    const result = await handler(args);\n    if (result.isError) return result;\n\n    let target: AgentTarget | null;\n    if (options.resolveTarget) {\n      target = options.resolveTarget({ toolName: options.toolName, args, result });\n    } else {\n      target = { kind: options.kind, screenId: options.screenId };\n    }\n    if (!target) return result;\n\n    emitActivity({\n      agentId: options.agent.id,\n      agentName: options.agent.name,\n      agentColor: options.agent.color,\n      target: { ...target, kind: target.kind ?? options.kind, screenId: target.screenId ?? options.screenId },\n      action: options.toolName,\n      timestamp: Date.now(),\n      meta: options.buildMeta ? options.buildMeta(result) : extractMeta(result),\n      ttlMs: options.ttlMs,\n    });\n    return result;\n  };\n}\n\nfunction extractMeta(result: CallToolResult): Record<string, unknown> | undefined {\n  const sc = result.structuredContent;\n  if (sc && typeof sc === \"object\" && !Array.isArray(sc)) {\n    return sc as Record<string, unknown>;\n  }\n  return undefined;\n}\n","import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport { readHistory, redoOne, undoOne } from \"./undo-stack\";\n\nexport type UndoToolsOptions = {\n  /** Default agent id when the caller doesn't pass one. */\n  defaultAgentId?: string;\n};\n\n/**\n * Idempotent tracker so multiple bridges on the same server only register\n * agent_undo / agent_redo / agent_history once.\n */\nconst installedHosts = new WeakSet<ToolHost>();\n\n/**\n * The one owner every copy of the undo tools registers under. They are SHARED\n * on purpose — every bridge ensures them, and a host may also call\n * `registerUndoTools` itself — so all of those are the same registrant, and a\n * second registration replaces the first instead of being refused as a\n * collision. Anything else claiming `agent_undo` is still refused.\n */\nconst UNDO_TOOLS_OWNER = \"agent-undo\";\n\n/**\n * ensureUndoToolsRegistered — bridges call this on construction. Safe to\n * call repeatedly with the same server; subsequent calls are no-ops.\n */\nexport function ensureUndoToolsRegistered(host: ToolHost, options: UndoToolsOptions = {}): void {\n  if (installedHosts.has(host)) return;\n  installedHosts.add(host);\n  registerUndoTools(host, options);\n}\n\n/**\n * registerUndoTools — add agent_undo / agent_redo / agent_history to the\n * server. Returns a disposer that unregisters all three.\n */\nexport function registerUndoTools(host: ToolHost, options: UndoToolsOptions = {}): () => void {\n  const defaultAgent = options.defaultAgentId ?? \"agent\";\n  const disposers: Array<() => void> = [];\n  const agentOf = (args: any): string =>\n    typeof args?.agentId === \"string\" ? args.agentId : defaultAgent;\n\n  disposers.push(\n    host.registerTool(\n      {\n        name: \"agent_undo\",\n        description: \"Undo the most recent action on the agent's stack. Optional agentId targets a specific agent.\",\n        inputSchema: {\n          type: \"object\",\n          properties: { agentId: { type: \"string\" } },\n          additionalProperties: false,\n        },\n      },\n      async (args) => {\n        const entry = await undoOne(agentOf(args));\n        if (!entry) return errorResult(\"Nothing to undo.\");\n        return textResult(`Undid: ${entry.label}`, { entry: serialize(entry) });\n      },\n      { owner: UNDO_TOOLS_OWNER },\n    ),\n  );\n\n  disposers.push(\n    host.registerTool(\n      {\n        name: \"agent_redo\",\n        description: \"Redo the most recently undone action.\",\n        inputSchema: {\n          type: \"object\",\n          properties: { agentId: { type: \"string\" } },\n          additionalProperties: false,\n        },\n      },\n      async (args) => {\n        const entry = await redoOne(agentOf(args));\n        if (!entry) return errorResult(\"Nothing to redo.\");\n        return textResult(`Redid: ${entry.label}`, { entry: serialize(entry) });\n      },\n      { owner: UNDO_TOOLS_OWNER },\n    ),\n  );\n\n  disposers.push(\n    host.registerTool(\n      {\n        name: \"agent_history\",\n        description: \"List the agent's undo stack (oldest first). Useful for understanding what's reversible.\",\n        inputSchema: {\n          type: \"object\",\n          properties: { agentId: { type: \"string\" } },\n          additionalProperties: false,\n        },\n      },\n      async (args) => {\n        const history = readHistory(agentOf(args)).map(serialize);\n        const text = history.map((e) => `${new Date(e.timestamp).toISOString()} ${e.bridgeId} ${e.action}: ${e.label}`).join(\"\\n\");\n        return textResult(text || \"(empty)\", history);\n      },\n      { owner: UNDO_TOOLS_OWNER },\n    ),\n  );\n\n  return () => disposers.forEach((d) => d());\n}\n\nfunction serialize(entry: import(\"./undo-stack\").UndoEntry) {\n  return {\n    timestamp: entry.timestamp,\n    bridgeId: entry.bridgeId,\n    action: entry.action,\n    label: entry.label,\n  };\n}\n","import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport type { AgentTarget } from \"../presence/types\";\nimport { pushUndoEntry } from \"../undo/undo-stack\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\n\n/**\n * Transport-level JSON shapes. These intentionally mirror fancy-artboard's\n * public `ArtBoardValue` but are defined LOCALLY so this bridge builds\n * independently of the sibling package — they are plain JSON crossing the\n * MCP wire, not the live component types. Keep them in sync with\n * @particle-academy/fancy-artboard's public surface.\n */\ntype Viewport = { x: number; y: number; zoom: number };\ntype ArtPieceContent =\n  | { kind: \"image\"; src: string; alt?: string }\n  | { kind: \"html\"; html: string }\n  | { kind: \"node\" };\ntype ArtPieceData = {\n  id: string;\n  label?: string;\n  width?: number;\n  height?: number;\n  content: ArtPieceContent;\n  pending?: boolean;\n};\ntype ArtSectionData = {\n  id: string;\n  title: string;\n  subtitle?: string;\n  pieces: ArtPieceData[];\n};\ntype ArtBoardValue = { sections: ArtSectionData[] };\n\n/**\n * State accessors / mutators the bridge needs from the host. The host owns\n * artboard state (controlled props on fancy-artboard components); the bridge\n * calls into these to read or change it.\n */\nexport type ArtboardBridgeAdapter = {\n  getValue: () => ArtBoardValue;\n  setValue: (next: ArtBoardValue | ((prev: ArtBoardValue) => ArtBoardValue)) => void;\n  getViewport: () => Viewport;\n  setViewport: (next: Viewport) => void;\n  getFocus: () => string | null;\n  setFocus: (id: string | null) => void;\n  /** Optional: agent presence cursor (for the visualizer). */\n  setAgentCursor?: (cursor: { x: number; y: number } | null) => void;\n};\n\nexport type ArtboardBridgeOptions = {\n  adapter: ArtboardBridgeAdapter;\n  /** Identity used when the agent stamps authorship / cursor. */\n  agent?: { id: string; name?: string; color?: string };\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\nconst num = (v: unknown, fallback?: number): number =>\n  typeof v === \"number\" && Number.isFinite(v) ? v : fallback ?? 0;\nconst str = (v: unknown, fallback = \"\"): string => (typeof v === \"string\" ? v : fallback);\n\nconst newId = (prefix: string) =>\n  `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;\n\n/** Deep-clone helper for snapshotting pieces/sections for undo closures. */\n/**\n * Deep-clone for undo snapshots.\n *\n * `undefined` is passed through rather than round-tripped. `JSON.stringify(undefined)`\n * returns the VALUE `undefined`, not a string, so `JSON.parse` then throws\n * `\"undefined\" is not valid JSON` — and this is called on optional fields.\n *\n * That was live: `artboard_set_piece_content` snapshots `existing.content`\n * before writing, so it threw for any piece that did not already have content.\n * Pieces the BRIDGE creates always do (`coerceContent` returns at least\n * `{kind:\"node\"}`), which is why it went unnoticed — but a piece the host app\n * built has no content until something sets it, so an agent adding content to a\n * human-made piece hit an error every time.\n */\nconst clone = <T,>(v: T): T => (v === undefined ? v : (JSON.parse(JSON.stringify(v)) as T));\n\n/** Coerce arbitrary JSON into a valid ArtPieceContent, defaulting to a node. */\nconst coerceContent = (v: unknown): ArtPieceContent => {\n  if (v && typeof v === \"object\") {\n    const c = v as Record<string, unknown>;\n    if (c.kind === \"image\") return { kind: \"image\", src: str(c.src), ...(c.alt !== undefined ? { alt: str(c.alt) } : {}) };\n    if (c.kind === \"html\") return { kind: \"html\", html: str(c.html) };\n    if (c.kind === \"node\") return { kind: \"node\" };\n  }\n  return { kind: \"node\" };\n};\n\n/**\n * registerArtboardBridge — wires a full MCP tool set against a fancy-artboard\n * session controlled by the host. Returns a Bridge handle the host can dispose\n * to tear everything down.\n */\nexport function registerArtboardBridge(\n  host: ToolHost,\n  options: ArtboardBridgeOptions,\n): Bridge {\n  const { adapter } = options;\n  const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n  const disposers: Array<() => void> = [];\n  // The bridge id is also its registrant identity on the host: the same bridge\n  // may re-register (a remount), a different one claiming a name is refused.\n  const bridgeId = \"artboard\";\n\n  // Register agent_undo / agent_redo / agent_history once per server. Idempotent.\n  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n  // Activity-target resolver shared by every mutation tool. Pulls the touched\n  // piece/section id from the result (structuredContent) when present, falling\n  // back to the args id for rename/remove/focus tools.\n  const abTarget = (args: any, result: any): AgentTarget => ({\n    kind: \"artboard\",\n    elementId:\n      (result?.structuredContent?.id as string | undefined) ??\n      (args?.pieceId as string | undefined) ??\n      (args?.sectionId as string | undefined),\n  } as AgentTarget);\n\n  const reg = (\n    name: string,\n    description: string,\n    inputProperties: Record<string, unknown>,\n    required: string[],\n    handler: (args: JsonObject) => Promise<any> | any,\n    /** Optional: resolve the activity target so the presence layer can render\n     *  a focus indicator on the touched element. Read tools omit this. */\n    resolveTarget?: (args: JsonObject, result: any) => AgentTarget | null,\n  ) => {\n    const wrapped = async (args: JsonObject) => {\n      try {\n        return await handler(args);\n      } catch (e) {\n        return errorResult(e instanceof Error ? e.message : String(e));\n      }\n    };\n    const final = resolveTarget\n      ? wrapToolWithActivity(wrapped, {\n          toolName: name,\n          agent: { id: agent.id, name: agent.name, color: agent.color },\n          kind: \"artboard\",\n          resolveTarget: ({ args, result }) => resolveTarget(args, result),\n        })\n      : wrapped;\n    disposers.push(\n      host.registerTool(\n        {\n          name,\n          description,\n          inputSchema: {\n            type: \"object\",\n            properties: inputProperties as any,\n            required,\n            additionalProperties: false,\n          },\n        },\n        final as any,\n        { owner: bridgeId },\n      ),\n    );\n  };\n\n  // ───────────── Read tools ─────────────\n\n  reg(\"artboard_get_state\", \"Get the full board state: viewport, focus, all sections and pieces.\", {}, [], () => {\n    const state = {\n      viewport: adapter.getViewport(),\n      focus: adapter.getFocus(),\n      sections: adapter.getValue().sections,\n    };\n    return textResult(JSON.stringify(state, null, 2), state);\n  });\n\n  reg(\"artboard_list_pieces\", \"List sections and their pieces with id, label, and content kind.\", {}, [], () => {\n    const lines: string[] = [];\n    const summary: Array<{ sectionId: string; title: string; pieces: Array<{ id: string; label?: string; kind: string; pending?: boolean }> }> = [];\n    for (const s of adapter.getValue().sections) {\n      lines.push(`section ${s.id}: \"${s.title}\"`);\n      const pieces = s.pieces.map((p) => ({\n        id: p.id,\n        ...(p.label !== undefined ? { label: p.label } : {}),\n        kind: p.content.kind,\n        ...(p.pending ? { pending: true } : {}),\n      }));\n      for (const p of s.pieces) {\n        lines.push(`  piece ${p.id}: ${p.label ? `\"${p.label}\" ` : \"\"}[${p.content.kind}]${p.pending ? \" (pending)\" : \"\"}`);\n      }\n      summary.push({ sectionId: s.id, title: s.title, pieces });\n    }\n    return textResult(lines.join(\"\\n\") || \"(empty board)\", summary);\n  });\n\n  // ───────────── Piece tools ─────────────\n\n  reg(\n    \"artboard_add_piece\",\n    \"Add a piece to a section. New agent-added pieces default to pending:true (trust-but-verify — a human confirms before it is final).\",\n    {\n      sectionId: { type: \"string\" },\n      piece: {\n        type: \"object\",\n        description: \"Piece spec: { label?, width?, height?, content }. content is { kind: 'image', src, alt? } | { kind: 'html', html } | { kind: 'node' }.\",\n      },\n      index: { type: \"number\", description: \"Insertion index within the section. Defaults to the end.\" },\n    },\n    [\"sectionId\", \"piece\"],\n    (args) => {\n      const sectionId = str(args.sectionId);\n      const section = adapter.getValue().sections.find((s) => s.id === sectionId);\n      if (!section) return errorResult(`No section with id ${sectionId}`);\n      const spec = (args.piece ?? {}) as Record<string, unknown>;\n      const piece: ArtPieceData = {\n        id: newId(\"p\"),\n        ...(spec.label !== undefined ? { label: str(spec.label) } : {}),\n        ...(spec.width !== undefined ? { width: num(spec.width) } : {}),\n        ...(spec.height !== undefined ? { height: num(spec.height) } : {}),\n        content: coerceContent(spec.content),\n        pending: true,\n      };\n      const insertAt =\n        args.index !== undefined ? Math.max(0, Math.min(num(args.index), section.pieces.length)) : section.pieces.length;\n      adapter.setValue((prev) => ({\n        sections: prev.sections.map((s) =>\n          s.id !== sectionId ? s : { ...s, pieces: [...s.pieces.slice(0, insertAt), piece, ...s.pieces.slice(insertAt)] },\n        ),\n      }));\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"artboard\",\n        action: \"artboard_add_piece\",\n        label: `Added piece ${piece.id} to ${sectionId}`,\n        undo: () =>\n          adapter.setValue((prev) => ({\n            sections: prev.sections.map((s) =>\n              s.id !== sectionId ? s : { ...s, pieces: s.pieces.filter((p) => p.id !== piece.id) },\n            ),\n          })),\n        redo: () =>\n          adapter.setValue((prev) => ({\n            sections: prev.sections.map((s) =>\n              s.id !== sectionId ? s : { ...s, pieces: [...s.pieces.slice(0, insertAt), piece, ...s.pieces.slice(insertAt)] },\n            ),\n          })),\n      });\n      return textResult(`Added piece ${piece.id} to section ${sectionId} (pending)`, piece);\n    },\n    abTarget,\n  );\n\n  reg(\n    \"artboard_remove_piece\",\n    \"Remove a piece by id.\",\n    { pieceId: { type: \"string\" } },\n    [\"pieceId\"],\n    (args) => {\n      const pieceId = str(args.pieceId);\n      let removed: ArtPieceData | null = null;\n      let fromSection: string | null = null;\n      let oldIndex = -1;\n      for (const s of adapter.getValue().sections) {\n        const idx = s.pieces.findIndex((p) => p.id === pieceId);\n        if (idx !== -1) {\n          removed = clone(s.pieces[idx]);\n          fromSection = s.id;\n          oldIndex = idx;\n          break;\n        }\n      }\n      if (!removed || fromSection === null) return errorResult(`No piece with id ${pieceId}`);\n      const sectionId = fromSection;\n      const snapshot = removed;\n      const at = oldIndex;\n      adapter.setValue((prev) => ({\n        sections: prev.sections.map((s) =>\n          s.id !== sectionId ? s : { ...s, pieces: s.pieces.filter((p) => p.id !== pieceId) },\n        ),\n      }));\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"artboard\",\n        action: \"artboard_remove_piece\",\n        label: `Removed piece ${pieceId}`,\n        undo: () =>\n          adapter.setValue((prev) => ({\n            sections: prev.sections.map((s) =>\n              s.id !== sectionId ? s : { ...s, pieces: [...s.pieces.slice(0, at), clone(snapshot), ...s.pieces.slice(at)] },\n            ),\n          })),\n        redo: () =>\n          adapter.setValue((prev) => ({\n            sections: prev.sections.map((s) =>\n              s.id !== sectionId ? s : { ...s, pieces: s.pieces.filter((p) => p.id !== pieceId) },\n            ),\n          })),\n      });\n      return textResult(`Removed piece ${pieceId}`, { id: pieceId });\n    },\n    abTarget,\n  );\n\n  reg(\n    \"artboard_reorder_piece\",\n    \"Move a piece to a new index, optionally into a different section.\",\n    {\n      pieceId: { type: \"string\" },\n      sectionId: { type: \"string\", description: \"Target section id. Defaults to the piece's current section.\" },\n      toIndex: { type: \"number\" },\n    },\n    [\"pieceId\", \"toIndex\"],\n    (args) => {\n      const pieceId = str(args.pieceId);\n      const before = adapter.getValue();\n      // Locate the piece.\n      let piece: ArtPieceData | null = null;\n      let srcSection: string | null = null;\n      for (const s of before.sections) {\n        const found = s.pieces.find((p) => p.id === pieceId);\n        if (found) {\n          piece = found;\n          srcSection = s.id;\n          break;\n        }\n      }\n      if (!piece || srcSection === null) return errorResult(`No piece with id ${pieceId}`);\n      const dstSection = args.sectionId !== undefined ? str(args.sectionId) : srcSection;\n      if (!before.sections.some((s) => s.id === dstSection)) return errorResult(`No section with id ${dstSection}`);\n      const toIndex = Math.max(0, num(args.toIndex));\n      const moving = piece;\n      const snapshot = clone(before);\n      adapter.setValue((prev) => {\n        // Remove from wherever it currently is.\n        const stripped = prev.sections.map((s) => ({ ...s, pieces: s.pieces.filter((p) => p.id !== pieceId) }));\n        return {\n          sections: stripped.map((s) => {\n            if (s.id !== dstSection) return s;\n            const clamped = Math.min(toIndex, s.pieces.length);\n            return { ...s, pieces: [...s.pieces.slice(0, clamped), moving, ...s.pieces.slice(clamped)] };\n          }),\n        };\n      });\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"artboard\",\n        action: \"artboard_reorder_piece\",\n        label: `Reordered piece ${pieceId}`,\n        undo: () => adapter.setValue(() => clone(snapshot)),\n        redo: () =>\n          adapter.setValue((prev) => {\n            const stripped = prev.sections.map((s) => ({ ...s, pieces: s.pieces.filter((p) => p.id !== pieceId) }));\n            return {\n              sections: stripped.map((s) => {\n                if (s.id !== dstSection) return s;\n                const clamped = Math.min(toIndex, s.pieces.length);\n                return { ...s, pieces: [...s.pieces.slice(0, clamped), moving, ...s.pieces.slice(clamped)] };\n              }),\n            };\n          }),\n      });\n      return textResult(`Reordered piece ${pieceId} → ${dstSection}[${toIndex}]`, { id: pieceId, sectionId: dstSection, toIndex });\n    },\n    abTarget,\n  );\n\n  reg(\n    \"artboard_rename_piece\",\n    \"Set a piece's label.\",\n    { pieceId: { type: \"string\" }, label: { type: \"string\" } },\n    [\"pieceId\", \"label\"],\n    (args) => {\n      const pieceId = str(args.pieceId);\n      const label = str(args.label);\n      const existing = adapter.getValue().sections.flatMap((s) => s.pieces).find((p) => p.id === pieceId);\n      if (!existing) return errorResult(`No piece with id ${pieceId}`);\n      const prevLabel = existing.label;\n      const apply = (l: string | undefined) =>\n        adapter.setValue((prev) => ({\n          sections: prev.sections.map((s) => ({\n            ...s,\n            pieces: s.pieces.map((p) => (p.id !== pieceId ? p : { ...p, ...(l !== undefined ? { label: l } : {}) })),\n          })),\n        }));\n      apply(label);\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"artboard\",\n        action: \"artboard_rename_piece\",\n        label: `Renamed piece ${pieceId}`,\n        undo: () => apply(prevLabel),\n        redo: () => apply(label),\n      });\n      return textResult(`Renamed piece ${pieceId} → \"${label}\"`, { id: pieceId, label });\n    },\n    abTarget,\n  );\n\n  reg(\n    \"artboard_set_piece_content\",\n    \"Replace a piece's content. content is { kind: 'image', src, alt? } | { kind: 'html', html } | { kind: 'node' }.\",\n    { pieceId: { type: \"string\" }, content: { type: \"object\" } },\n    [\"pieceId\", \"content\"],\n    (args) => {\n      const pieceId = str(args.pieceId);\n      const existing = adapter.getValue().sections.flatMap((s) => s.pieces).find((p) => p.id === pieceId);\n      if (!existing) return errorResult(`No piece with id ${pieceId}`);\n      const prevContent = clone(existing.content);\n      const nextContent = coerceContent(args.content);\n      const apply = (c: ArtPieceContent) =>\n        adapter.setValue((prev) => ({\n          sections: prev.sections.map((s) => ({\n            ...s,\n            pieces: s.pieces.map((p) => (p.id !== pieceId ? p : { ...p, content: clone(c) })),\n          })),\n        }));\n      apply(nextContent);\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"artboard\",\n        action: \"artboard_set_piece_content\",\n        label: `Set content of piece ${pieceId}`,\n        undo: () => apply(prevContent),\n        redo: () => apply(nextContent),\n      });\n      return textResult(`Set content of piece ${pieceId} → ${nextContent.kind}`, { id: pieceId, content: nextContent });\n    },\n    abTarget,\n  );\n\n  reg(\n    \"artboard_focus_piece\",\n    \"Focus a piece by id (or pass null to clear focus).\",\n    { pieceId: { type: [\"string\", \"null\"] } },\n    [],\n    (args) => {\n      const raw = args.pieceId;\n      const pieceId = typeof raw === \"string\" ? raw : null;\n      if (pieceId !== null && !adapter.getValue().sections.some((s) => s.pieces.some((p) => p.id === pieceId))) {\n        return errorResult(`No piece with id ${pieceId}`);\n      }\n      adapter.setFocus(pieceId);\n      return textResult(pieceId ? `Focused piece ${pieceId}` : \"Cleared focus\", { id: pieceId });\n    },\n    abTarget,\n  );\n\n  // ───────────── Section tools ─────────────\n\n  reg(\n    \"artboard_add_section\",\n    \"Add a section. Provide an explicit id or one is generated.\",\n    {\n      section: { type: \"object\", description: \"Section spec: { id?, title, subtitle? }.\" },\n      index: { type: \"number\", description: \"Insertion index. Defaults to the end.\" },\n    },\n    [\"section\"],\n    (args) => {\n      const spec = (args.section ?? {}) as Record<string, unknown>;\n      const section: ArtSectionData = {\n        id: spec.id !== undefined ? str(spec.id) : newId(\"sec\"),\n        title: str(spec.title),\n        ...(spec.subtitle !== undefined ? { subtitle: str(spec.subtitle) } : {}),\n        pieces: [],\n      };\n      if (adapter.getValue().sections.some((s) => s.id === section.id)) {\n        return errorResult(`Section id ${section.id} already exists`);\n      }\n      const insertAt =\n        args.index !== undefined\n          ? Math.max(0, Math.min(num(args.index), adapter.getValue().sections.length))\n          : adapter.getValue().sections.length;\n      adapter.setValue((prev) => ({\n        sections: [...prev.sections.slice(0, insertAt), section, ...prev.sections.slice(insertAt)],\n      }));\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"artboard\",\n        action: \"artboard_add_section\",\n        label: `Added section ${section.id}`,\n        undo: () => adapter.setValue((prev) => ({ sections: prev.sections.filter((s) => s.id !== section.id) })),\n        redo: () =>\n          adapter.setValue((prev) => ({\n            sections: [...prev.sections.slice(0, insertAt), section, ...prev.sections.slice(insertAt)],\n          })),\n      });\n      return textResult(`Added section ${section.id}`, section);\n    },\n    abTarget,\n  );\n\n  reg(\n    \"artboard_rename_section\",\n    \"Set a section's title and optionally its subtitle.\",\n    { sectionId: { type: \"string\" }, title: { type: \"string\" }, subtitle: { type: \"string\" } },\n    [\"sectionId\", \"title\"],\n    (args) => {\n      const sectionId = str(args.sectionId);\n      const existing = adapter.getValue().sections.find((s) => s.id === sectionId);\n      if (!existing) return errorResult(`No section with id ${sectionId}`);\n      const prevTitle = existing.title;\n      const prevSubtitle = existing.subtitle;\n      const title = str(args.title);\n      const hasSubtitle = args.subtitle !== undefined;\n      const subtitle = hasSubtitle ? str(args.subtitle) : prevSubtitle;\n      const apply = (t: string, sub: string | undefined) =>\n        adapter.setValue((prev) => ({\n          sections: prev.sections.map((s) =>\n            s.id !== sectionId\n              ? s\n              : { ...s, title: t, ...(sub !== undefined ? { subtitle: sub } : {}) },\n          ),\n        }));\n      apply(title, subtitle);\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"artboard\",\n        action: \"artboard_rename_section\",\n        label: `Renamed section ${sectionId}`,\n        undo: () => apply(prevTitle, prevSubtitle),\n        redo: () => apply(title, subtitle),\n      });\n      return textResult(`Renamed section ${sectionId} → \"${title}\"`, { id: sectionId, title, subtitle });\n    },\n    abTarget,\n  );\n\n  // ───────────── Viewport ─────────────\n\n  reg(\n    \"artboard_set_viewport\",\n    \"Pan / zoom the viewport.\",\n    { x: { type: \"number\" }, y: { type: \"number\" }, zoom: { type: \"number\" } },\n    [],\n    (args) => {\n      const v = adapter.getViewport();\n      const next: Viewport = {\n        x: args.x !== undefined ? num(args.x) : v.x,\n        y: args.y !== undefined ? num(args.y) : v.y,\n        zoom: args.zoom !== undefined ? num(args.zoom) : v.zoom,\n      };\n      adapter.setViewport(next);\n      return textResult(`Viewport → ${JSON.stringify(next)}`, next);\n    },\n    abTarget,\n  );\n\n  return {\n    id: bridgeId,\n    title: \"Artboard\",\n    dispose: () => {\n      for (const d of disposers) d();\n      adapter.setAgentCursor?.(null);\n    },\n  };\n}\n"]}