{"version":3,"sources":["../src/presence/registry.ts","../src/mcp/types.ts","../src/mcp/tool-host.ts","../src/mcp/server.ts","../src/mcp/transports/in-process.ts","../src/sharing/token.ts","../src/sharing/sse-relay.ts","../src/presence/wrap-tool-with-activity.ts","../src/undo/undo-tools.ts","../src/bridges/whiteboard.ts","../src/components/ShareControls/ShareControls.tsx","../src/components/AgentPanel/AgentPanel.tsx","../src/components/AgentCursor/AgentCursor.tsx","../src/components/AgentActivityHighlight/AgentActivityHighlight.tsx","../src/components/SharedWhiteboard/SharedWhiteboard.tsx"],"names":["emitActivity","onActivity","readActivityHistory","resetActivityRegistry","undoOne","redoOne","readHistory","pushUndoEntry","useState","useRef","useEffect","jsxs","jsx","DEFAULT_AGENT","useCallback","useMemo","Board","Connector","Shape","StickyNote","CursorLayer"],"mappings":"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","file":"components-shared-whiteboard.cjs","sourcesContent":["/**\n * In-process registry of activity events. Now backed by the shared bus in\n * `@particle-academy/fancy-auto-common`, so agent activity (here) and flow\n * activity (fancy-flow's FlowRunnerUx) land in ONE stream — presence layers\n * render both. Re-exported under the same names for back-compat.\n */\nexport {\n  emitActivity,\n  onActivity,\n  readActivityHistory,\n  resetActivityRegistry,\n} from \"@particle-academy/fancy-auto-common\";\n","/**\n * Minimal MCP (Model Context Protocol) types — covers the subset this\n * package implements: initialize, tools/list, tools/call, plus JSON-RPC.\n *\n * Aligned with the public MCP spec but trimmed to v0.1 needs. See\n * https://spec.modelcontextprotocol.io/ for the full surface.\n */\n\nexport type JsonValue =\n  | string\n  | number\n  | boolean\n  | null\n  | { [key: string]: JsonValue }\n  | JsonValue[];\n\nexport type JsonObject = { [key: string]: JsonValue };\n\nexport type JsonRpcId = string | number | null;\n\nexport type JsonRpcRequest = {\n  jsonrpc: \"2.0\";\n  id: JsonRpcId;\n  method: string;\n  params?: JsonObject;\n};\n\nexport type JsonRpcNotification = {\n  jsonrpc: \"2.0\";\n  method: string;\n  params?: JsonObject;\n};\n\nexport type JsonRpcSuccess = {\n  jsonrpc: \"2.0\";\n  id: JsonRpcId;\n  result: JsonValue;\n};\n\nexport type JsonRpcError = {\n  jsonrpc: \"2.0\";\n  id: JsonRpcId;\n  error: { code: number; message: string; data?: JsonValue };\n};\n\nexport type JsonRpcMessage = JsonRpcRequest | JsonRpcNotification | JsonRpcSuccess | JsonRpcError;\n\nexport const JSONRPC_PARSE_ERROR = -32700;\nexport const JSONRPC_INVALID_REQUEST = -32600;\nexport const JSONRPC_METHOD_NOT_FOUND = -32601;\nexport const JSONRPC_INVALID_PARAMS = -32602;\nexport const JSONRPC_INTERNAL_ERROR = -32603;\n\nexport type ServerCapabilities = {\n  tools?: { listChanged?: boolean };\n  resources?: { listChanged?: boolean; subscribe?: boolean };\n  prompts?: { listChanged?: boolean };\n  logging?: Record<string, never>;\n  experimental?: Record<string, JsonValue>;\n};\n\nexport type ServerInfo = {\n  name: string;\n  version: string;\n  title?: string;\n};\n\nexport type InitializeResult = {\n  protocolVersion: string;\n  capabilities: ServerCapabilities;\n  serverInfo: ServerInfo;\n  instructions?: string;\n};\n\nexport type ToolInputSchema = {\n  /** The JSON Schema dialect, when a server states it (e.g. draft-07). */\n  $schema?: string;\n  type: \"object\";\n  properties?: Record<string, JsonValue>;\n  required?: string[];\n  additionalProperties?: boolean;\n};\n\n/** Behaviour hints a client may use when presenting or gating a tool. */\nexport type ToolAnnotations = {\n  title?: string;\n  readOnlyHint?: boolean;\n  destructiveHint?: boolean;\n  idempotentHint?: boolean;\n  openWorldHint?: boolean;\n};\n\n/**\n * A tool as `tools/list` reports it. Every field is passed to the client\n * verbatim, so the optional ones below are the spec's, not extensions.\n */\nexport type ToolDefinition = {\n  name: string;\n  title?: string;\n  description?: string;\n  inputSchema: ToolInputSchema;\n  /** JSON Schema for `structuredContent`, when the tool returns it. */\n  outputSchema?: ToolInputSchema;\n  annotations?: ToolAnnotations;\n  /** 2025-11-25: whether the tool may run as a task. */\n  execution?: { taskSupport?: \"forbidden\" | \"optional\" | \"required\" };\n  _meta?: { [key: string]: JsonValue };\n};\n\nexport type ContentBlock =\n  | { type: \"text\"; text: string }\n  | { type: \"image\"; data: string; mimeType: string }\n  | { type: \"resource\"; resource: { uri: string; text?: string; mimeType?: string } };\n\nexport type CallToolResult = {\n  content: ContentBlock[];\n  isError?: boolean;\n  /** Structured tool output — non-spec but useful for typed bridges. */\n  structuredContent?: JsonValue;\n};\n\n/** Handler signature for a tool registered on the MicroMcpServer. */\nexport type ToolCallContext = { transport?: unknown };\nexport type ToolHandler = (args: JsonObject, context?: ToolCallContext) => Promise<CallToolResult> | CallToolResult;\n\n/**\n * Options for `ToolHost.registerTool`.\n *\n * Tool names are one namespace shared by every bridge and agent on a host, so a\n * name belongs to whoever registered it. A second registrant for a held name is\n * refused rather than silently replacing the first.\n */\nexport type RegisterToolOptions = {\n  /**\n   * Who is registering — a stable identity for the surface, e.g. the bridge id\n   * (`\"whiteboard\"`, `\"chart:revenue\"`). The SAME owner may register a name it\n   * already holds again; that replaces the tool, which is what a React remount\n   * needs. A different owner is refused. A registration without an owner is a\n   * registrant nobody can identify, so it never matches another one.\n   */\n  owner?: string;\n  /**\n   * Take the name over whoever holds it. The explicit opt-in for the one thing\n   * `registerTool` used to do implicitly; reach for it only when replacing\n   * another registrant's tool is the point.\n   */\n  replace?: boolean;\n};\n\n/** Internal record kept by the server. */\nexport type RegisteredTool = {\n  definition: ToolDefinition;\n  handler: ToolHandler;\n  /** The registrant that holds this name, when it identified itself. */\n  owner?: string;\n};\n\nexport const MCP_PROTOCOL_VERSION = \"2025-06-18\";\n","import type {\n  CallToolResult,\n  JsonObject,\n  RegisteredTool,\n  RegisterToolOptions,\n  ToolDefinition,\n  ToolHandler,\n} from \"./types\";\n\n/**\n * ToolHost — the minimal surface a bridge needs to register its tools.\n *\n * Bridges (whiteboard, flow, sheets, code, charts, screens, scene, form)\n * speak only through this interface. The MCP server implements it\n * alongside its transport / JSON-RPC duties, and the standalone\n * {@link ToolRegistry} implements it for in-process agents that don't\n * need any of MCP's wire framing.\n *\n * Net effect: every bridge works equally well behind an MCP server\n * (browser ↔ external agents over SSE) or behind a plain registry\n * (in-process agent calling `host.callTool(\"sheet_set_cell\", { … })`).\n */\nexport interface ToolHost {\n  /**\n   * Register a tool. Returns a disposer that unregisters it.\n   *\n   * Throws when the name is already held by a DIFFERENT registrant (see\n   * {@link RegisterToolOptions.owner}), unless `replace: true` is passed. The\n   * same owner registering again replaces its own tool.\n   */\n  registerTool(definition: ToolDefinition, handler: ToolHandler, options?: RegisterToolOptions): () => void;\n\n  /** Look up an already-registered tool's definition + handler, or null. */\n  getTool(name: string): RegisteredTool | null;\n\n  /** Snapshot of all currently-registered tool definitions. */\n  listTools(): ToolDefinition[];\n\n  /**\n   * Invoke a registered tool directly, bypassing any transport layer.\n   * Throws if no tool is registered under `name`.\n   *\n   * This is the single entry point in-process agents use to drive the\n   * surface — no JSON-RPC framing, no transport plumbing.\n   */\n  callTool(name: string, args?: JsonObject): Promise<CallToolResult>;\n}\n\n/**\n * Standalone in-memory ToolHost. Use this when no MCP server is needed —\n * e.g. an in-process agent that just wants to register the same bridges\n * and call them directly.\n *\n * Example:\n *\n *   const host = new ToolRegistry();\n *   registerSheetsBridge(host, { adapter });\n *   const result = await host.callTool(\"sheet_set_cell\", { address: \"B3\", value: 42 });\n *\n * Pair with a MicroMcpServer in the same app to expose the same tools\n * to remote agents over SSE while in-process agents still get\n * zero-overhead direct calls.\n */\nexport class ToolRegistry implements ToolHost {\n  protected readonly tools = new Map<string, RegisteredTool>();\n\n  /**\n   * Tools that existed and were withdrawn, kept so a call that races an unmount\n   * can say WHICH thing happened.\n   *\n   * The tool surface is dynamic by design — \"site tools always, page tools while\n   * mounted\" — so an agent deciding to call a tool while the human navigates\n   * away is normal traffic, not an edge case. Reporting that as `Unknown tool`\n   * is the least useful thing available: it reads as \"the agent is broken\" or\n   * \"you asked for something imaginary\", when the truth is \"that surface just\n   * closed\".\n   *\n   * Names only. Nothing about the handler is retained, so this cannot keep a\n   * disposed surface alive.\n   */\n  protected readonly withdrawn = new Set<string>();\n\n  registerTool(definition: ToolDefinition, handler: ToolHandler, options: RegisterToolOptions = {}): () => void {\n    const name = definition.name;\n    const { owner, replace = false } = options;\n    const held = this.tools.get(name);\n\n    // A name is one surface's. Replacing it silently left the first surface\n    // listed but unreachable — every call went to the second handler and\n    // nothing said so. Only the same identified owner may re-register (a\n    // remount); anyone else must ask for it with `replace: true`.\n    if (held && !replace && (owner === undefined || held.owner !== owner)) {\n      throw new Error(\n        `Tool \"${name}\" is already registered by ${describeOwner(held.owner)}; `\n          + `${describeOwner(owner)} cannot register it too. `\n          + `Two registrants for one name would leave the first one listed but unreachable. `\n          + `Give one of them a different tool name, dispose the first registration, `\n          + `or pass { replace: true } to take the name over deliberately.`,\n      );\n    }\n\n    const record: RegisteredTool = owner === undefined ? { definition, handler } : { definition, handler, owner };\n    this.tools.set(name, record);\n    // A remounted surface must stop apologising for a previous unmount.\n    this.withdrawn.delete(name);\n    this.onToolsChanged();\n    return () => {\n      // Only withdraw what THIS registration put there. A replaced registration's\n      // disposer often runs late (a remount's cleanup), and must not take its\n      // successor down with it.\n      if (this.tools.get(name) === record) {\n        this.tools.delete(name);\n        this.withdrawn.add(name);\n        this.onToolsChanged();\n      }\n    };\n  }\n\n  /** Why `name` is not callable, phrased for whoever has to act on it. */\n  protected missingToolMessage(name: string): string {\n    return this.withdrawn.has(name)\n      ? `Tool \"${name}\" was withdrawn: the surface it targets is no longer mounted. `\n        + `Call tools/list for the current surface — the site-wide tools remain available.`\n      : `Unknown tool: ${name}`;\n  }\n\n  getTool(name: string): RegisteredTool | null {\n    return this.tools.get(name) ?? null;\n  }\n\n  listTools(): ToolDefinition[] {\n    return Array.from(this.tools.values()).map((t) => t.definition);\n  }\n\n  async callTool(name: string, args: JsonObject = {}): Promise<CallToolResult> {\n    const tool = this.tools.get(name);\n    if (!tool) {\n      throw new Error(this.missingToolMessage(name));\n    }\n    return tool.handler(args);\n  }\n\n  /**\n   * Hook for subclasses (e.g. MicroMcpServer) to notify subscribers\n   * when the tool catalog changes. Default no-op.\n   */\n  protected onToolsChanged(): void {}\n}\n\nfunction describeOwner(owner: string | undefined): string {\n  return owner === undefined\n    ? \"an unnamed registrant (pass { owner } to registerTool to identify it)\"\n    : `\"${owner}\"`;\n}\n","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 { JsonRpcMessage } from \"../types\";\nimport type { MicroMcpServer, Transport } from \"../server\";\n\n/**\n * InProcessTransport — direct function-call wiring between an in-page MCP\n * client (e.g. an embedded chat agent) and a MicroMcpServer running in\n * the same JS context. No serialization, no network.\n *\n * Usage:\n *\n *   const t = new InProcessTransport();\n *   server.attach(t);\n *   t.onServerMessage((msg) => { ... });   // client subscribes\n *   t.send({ jsonrpc: \"2.0\", id: 1, method: \"tools/list\" }); // client → server\n */\nexport class InProcessTransport implements Transport {\n  private server?: MicroMcpServer;\n  private listeners = new Set<(msg: JsonRpcMessage) => void>();\n\n  /** Bind to a server. Called from the client's setup, not directly. */\n  bindServer(server: MicroMcpServer): void {\n    this.server = server;\n  }\n\n  /** Server → client (delivered to subscribed listeners). */\n  send(message: JsonRpcMessage): void {\n    for (const l of this.listeners) l(message);\n  }\n\n  /** Client → server. Awaitable so callers can flush. */\n  async deliver(message: JsonRpcMessage): Promise<void> {\n    if (!this.server) throw new Error(\"InProcessTransport has no bound server\");\n    await this.server.receive(this, message);\n  }\n\n  /** Subscribe to messages the server pushes to this client. */\n  onServerMessage(listener: (msg: JsonRpcMessage) => void): () => void {\n    this.listeners.add(listener);\n    return () => this.listeners.delete(listener);\n  }\n\n  close(): void {\n    this.listeners.clear();\n  }\n}\n\n/**\n * Convenience: create a server-attached in-process transport in one call.\n */\nexport function attachInProcess(server: MicroMcpServer): InProcessTransport {\n  const transport = new InProcessTransport();\n  transport.bindServer(server);\n  server.attach(transport);\n  return transport;\n}\n","/**\n * Session-token utilities. The token is a high-entropy secret; possession\n * grants read/write on the session. We don't HMAC frames — frames carry\n * the token directly (which is fine for in-process / same-origin / TLS\n * transports). For lower-trust transports, host apps can layer signing\n * on top of the BroadcastChannelTransport.\n */\n\nconst TOKEN_BYTES = 24; // 192 bits, base64url-encoded → 32 chars\n\nexport type SessionDescriptor = {\n  /** Stable session identifier. Channel name = `fai:share:${id}`. */\n  id: string;\n  /** Secret token. Treat as a password — anyone with it can read/write. */\n  token: string;\n  /** Pretty hash for display (first 8 chars of token). */\n  display: string;\n};\n\nexport function createSessionDescriptor(): SessionDescriptor {\n  const id = randomId(8);\n  const token = randomToken();\n  return { id, token, display: token.slice(0, 8) };\n}\n\nexport function describeSession(id: string, token: string): SessionDescriptor {\n  return { id, token, display: token.slice(0, 8) };\n}\n\n/**\n * Build the shareable URL for the current page (preserves path, adds\n * session+token in the URL FRAGMENT).\n *\n * The token goes in the `#fragment`, never the `?query`: a fragment is never\n * transmitted to the server, so it can't leak through access/proxy logs or the\n * `Referer` header sent to third-party assets on the page. The recipient reads\n * it back with {@link readSessionFromUrl}. (The on-wire relay leg still sends\n * `?token=` today — moving that off the query is the larger transport change.)\n */\nexport function buildShareUrl(\n  descriptor: SessionDescriptor,\n  baseUrl: string = typeof window !== \"undefined\" ? window.location.href.split(\"?\")[0] : \"\",\n): string {\n  const u = new URL(baseUrl);\n  u.hash = new URLSearchParams({ session: descriptor.id, token: descriptor.token }).toString();\n  return u.toString();\n}\n\n/** Build the JSON config form (suitable for Claude Desktop / Cline / etc.). */\nexport function buildShareConfig(descriptor: SessionDescriptor, transport = \"broadcast-channel\") {\n  return {\n    name: `whiteboard-${descriptor.id}`,\n    transport,\n    session: descriptor.id,\n    token: descriptor.token,\n    channel: `fai:share:${descriptor.id}`,\n    protocol_version: \"2025-06-18\",\n  };\n}\n\n/**\n * Read session descriptor from the current URL, or null if not a shared link.\n * Prefers the fragment (the non-leaking form {@link buildShareUrl} now emits),\n * falling back to the query string for links minted before that change.\n */\nexport function readSessionFromUrl(): SessionDescriptor | null {\n  if (typeof window === \"undefined\") return null;\n  const url = new URL(window.location.href);\n  const frag = new URLSearchParams(url.hash.replace(/^#/, \"\"));\n  const id = frag.get(\"session\") ?? url.searchParams.get(\"session\");\n  const token = frag.get(\"token\") ?? url.searchParams.get(\"token\");\n  if (!id || !token) return null;\n  return describeSession(id, token);\n}\n\nfunction randomToken(): string {\n  const bytes = new Uint8Array(TOKEN_BYTES);\n  crypto.getRandomValues(bytes);\n  return base64Url(bytes);\n}\n\nfunction randomId(len: number): string {\n  const bytes = new Uint8Array(Math.ceil((len * 3) / 4));\n  crypto.getRandomValues(bytes);\n  return base64Url(bytes).slice(0, len);\n}\n\nfunction base64Url(bytes: Uint8Array): string {\n  let s = \"\";\n  for (const b of bytes) s += String.fromCharCode(b);\n  return btoa(s).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\n/** Constant-time string compare so a mismatched token leaks no timing info. */\nexport function constantTimeEqual(a: string, b: string): boolean {\n  if (a.length !== b.length) return false;\n  let diff = 0;\n  for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n  return diff === 0;\n}\n","import type { JsonRpcMessage } from \"../mcp/types\";\nimport type { Transport } from \"../mcp/server\";\nimport type { MicroMcpServer } from \"../mcp/server\";\nimport type { RelayChannelHandle } from \"@particle-academy/fancy-cf-relay\";\nimport { constantTimeEqual } from \"./token\";\nimport type { AgentActivityEvent } from \"../presence/types\";\nimport { emitActivity } from \"../presence/registry\";\n\n/**\n * SseRelayTransport — bridges the in-page MicroMcpServer to a host-app\n * relay broker over Server-Sent Events (inbound) + POST (outbound).\n *\n * Wire model:\n *   - Browser opens an EventSource at `${baseUrl}/${sessionId}/events?token=…`.\n *     Each `event: mcp` carries one JSON-RPC frame from a remote client.\n *   - Browser POSTs JSON-RPC frames to `${baseUrl}/${sessionId}/outbox?token=…`\n *     when the local server has a response/notification to send.\n *\n * The host provides the relay endpoint (any HTTP server). See the demo\n * `WhiteboardShareController` for the reference implementation.\n *\n * Token authentication is the host's job — this transport just carries the\n * token in the query string. For lower-trust deployments, layer signing on\n * top by wrapping `send` / `deliverFromRemote`.\n */\nexport type SseRelayOptions = {\n  /**\n   * Which in-process activity events this relay forwards to ITS agent.\n   *\n   * The activity bus is global to the page, so with two concurrent sessions —\n   * site co-browse and the agent playground — each relay forwarded the other's\n   * traffic and every agent saw every other agent's navigations. Returning\n   * `false` drops the event for this relay only.\n   *\n   * Omitted means forward everything, which is the historical behaviour and\n   * correct for the common single-session case. A throwing predicate drops that\n   * one event and keeps the subscription: a host predicate is host code, and\n   * one bad event must not silently end forwarding for the session — that looks\n   * exactly like the agent going quiet.\n   */\n  activityFilter?: (event: AgentActivityEvent) => boolean;\n  /**\n   * Identity stamped on the relay's own connect/disconnect activity.\n   *\n   * These were emitted with a literal `agentId: \"agent\"`, which made two\n   * sessions' connect events indistinguishable — and unfilterable, since there\n   * was nothing to tell them apart by.\n   */\n  agent?: { id: string; name?: string; color?: string };\n  baseUrl: string;\n  sessionId: string;\n  token: string;\n  /** Override fetch (testing / non-browser). Defaults to global fetch. */\n  fetch?: typeof fetch;\n};\n\nexport class SseRelayTransport implements Transport {\n  private server?: MicroMcpServer;\n  private es?: EventSource;\n  private channel?: RelayChannelHandle;\n  private disposed = false;\n  private opts: SseRelayOptions;\n  private sendQueue: JsonRpcMessage[] = [];\n  private connected = false;\n  private listeners = new Set<(state: RelayState) => void>();\n  private state: RelayState = \"idle\";\n  private expectedToken: string;\n  private peers = new Set<string>();\n  private peerListeners = new Set<(count: number) => void>();\n\n  constructor(options: SseRelayOptions) {\n    this.opts = options;\n    this.expectedToken = options.token;\n  }\n\n  bindServer(server: MicroMcpServer): void {\n    this.server = server;\n  }\n\n  /** Open the receive channel. Idempotent. */\n  start(): void {\n    if (this.connected || this.disposed || typeof window === \"undefined\") return;\n    this.setState(\"connecting\");\n    // Prefer @particle-academy/fancy-cf-relay's adaptive channel (auto SSE↔\n    // long-poll with Cloudflare detection) so the receive leg survives a\n    // Cloudflare HTTP/3 (QUIC) edge that resets long-lived SSE streams. It's an\n    // OPTIONAL peer: if it isn't installed, fall back to a plain EventSource.\n    void import(\"@particle-academy/fancy-cf-relay\")\n      .then(({ createRelayChannel }) => {\n        if (this.connected || this.disposed) return;\n        this.channel = createRelayChannel({\n          baseUrl: this.opts.baseUrl,\n          session: this.opts.sessionId,\n          token: this.opts.token,\n          transport: \"auto\",\n          receiveDirection: \"inbound\",\n          sendPath: \"outbox\",\n          onFrame: (raw) => this.handleInbound(raw),\n          onOpen: () => this.markOpen(),\n          onError: () => this.setState(\"error\"),\n          fetchImpl: this.opts.fetch,\n        });\n        this.channel.start();\n      })\n      .catch(() => {\n        if (!this.disposed) this.startSse();\n      });\n  }\n\n  /** Fallback receive leg: a plain EventSource (no fancy-cf-relay installed). */\n  private startSse(): void {\n    if (this.connected || this.disposed) return;\n    const url = `${this.opts.baseUrl}/${encodeURIComponent(this.opts.sessionId)}/events?token=${encodeURIComponent(this.opts.token)}`;\n    const es = new EventSource(url, { withCredentials: false });\n    this.es = es;\n    es.addEventListener(\"open\", () => this.markOpen());\n    es.addEventListener(\"mcp\", (ev: MessageEvent) => this.handleInbound(ev.data));\n    es.addEventListener(\"error\", () => this.setState(\"error\")); // EventSource auto-reconnects\n  }\n\n  /** Mark the channel live + flush any queued outbound frames. */\n  private markOpen(): void {\n    this.connected = true;\n    this.setState(\"open\");\n    const queued = this.sendQueue.splice(0);\n    for (const msg of queued) this.postOut(msg);\n  }\n\n  send(message: JsonRpcMessage): void {\n    if (!this.connected) {\n      this.sendQueue.push(message);\n      return;\n    }\n    this.postOut(message);\n  }\n\n  close(): void {\n    this.disposed = true;\n    this.channel?.stop();\n    this.channel = undefined;\n    this.es?.close();\n    this.es = undefined;\n    this.connected = false;\n    this.peers.clear();\n    this.notifyPeers();\n    this.setState(\"closed\");\n  }\n\n  onStateChange(listener: (state: RelayState) => void): () => void {\n    this.listeners.add(listener);\n    listener(this.state);\n    return () => this.listeners.delete(listener);\n  }\n\n  /** How many remote peers (agents) are currently attached to this session. */\n  peerCount(): number {\n    return this.peers.size;\n  }\n\n  /**\n   * Subscribe to peer arrivals/departures. Fires immediately with the current\n   * count.\n   *\n   * This is the ONLY honest answer to \"is an agent actually here?\".\n   * `onStateChange` reports the BROWSER's own channel to the relay, which opens\n   * the instant sharing starts — so a UI keyed on it announces \"Agent is\n   * driving\" to a human who has not yet handed the link to anybody, and can\n   * never tell them when one really arrives.\n   */\n  onPeersChange(listener: (count: number) => void): () => void {\n    this.peerListeners.add(listener);\n    listener(this.peers.size);\n    return () => this.peerListeners.delete(listener);\n  }\n\n  private notifyPeers(): void {\n    for (const l of this.peerListeners) l(this.peers.size);\n  }\n\n  /**\n   * For relays that wrap each frame with auth metadata: hosts can call this\n   * directly when a frame arrives via a non-SSE path. The transport will\n   * dispatch it to the bound server.\n   */\n  async deliverFromRemote(payload: JsonRpcMessage | string, token?: string): Promise<void> {\n    if (token !== undefined && !constantTimeEqual(token, this.expectedToken)) return;\n    if (!this.server) throw new Error(\"SseRelayTransport has no bound server\");\n    const message: JsonRpcMessage = typeof payload === \"string\" ? JSON.parse(payload) : payload;\n    await this.server.receive(this, message);\n  }\n\n  private async postOut(message: JsonRpcMessage): Promise<void> {\n    const url = `${this.opts.baseUrl}/${encodeURIComponent(this.opts.sessionId)}/outbox?token=${encodeURIComponent(this.opts.token)}`;\n    const f = this.opts.fetch ?? fetch;\n    try {\n      await f(url, {\n        method: \"POST\",\n        headers: { \"content-type\": \"application/json\", \"accept\": \"application/json\" },\n        body: JSON.stringify(message),\n      });\n    } catch {\n      // Drop — relay errors are surfaced via state change separately.\n    }\n  }\n\n  private async handleInbound(raw: string): Promise<void> {\n    if (!this.server) return;\n    let message: JsonRpcMessage;\n    try {\n      message = JSON.parse(raw);\n    } catch {\n      return;\n    }\n    if (\"method\" in message && message.method === \"notifications/peer_joined\") {\n      const subscriberId = String((message.params as { subscriberId?: unknown } | undefined)?.subscriberId ?? \"peer\");\n      this.peers.add(subscriberId);\n      this.notifyPeers();\n      emitActivity({\n        agentId: this.opts.agent?.id ?? \"agent\",\n        agentName: this.opts.agent?.name ?? \"Agent\",\n        agentColor: this.opts.agent?.color ?? \"#a855f7\",\n        action: \"agent_connected\",\n        timestamp: Date.now(),\n        target: { kind: \"navigation\", label: \"Agent connected\" },\n        meta: { subscriberId },\n      });\n      return;\n    }\n    if (\"method\" in message && message.method === \"notifications/peer_left\") {\n      const subscriberId = String((message.params as { subscriberId?: unknown } | undefined)?.subscriberId ?? \"peer\");\n      this.peers.delete(subscriberId);\n      this.notifyPeers();\n      if (this.peers.size === 0) {\n        emitActivity({\n          agentId: this.opts.agent?.id ?? \"agent\",\n          agentName: this.opts.agent?.name ?? \"Agent\",\n          agentColor: this.opts.agent?.color ?? \"#a855f7\",\n          action: \"agent_disconnected\",\n          timestamp: Date.now(),\n          target: { kind: \"navigation\", label: \"Agent disconnected\" },\n          meta: { subscriberId },\n        });\n      }\n      return;\n    }\n    await this.server.receive(this, message);\n  }\n\n  private setState(state: RelayState): void {\n    this.state = state;\n    for (const l of this.listeners) l(state);\n  }\n}\n\nexport type RelayState = \"idle\" | \"connecting\" | \"open\" | \"closed\" | \"error\";\n\nexport function attachSseRelay(server: MicroMcpServer, options: SseRelayOptions): SseRelayTransport {\n  const transport = new SseRelayTransport(options);\n  transport.bindServer(server);\n  server.attach(transport);\n  transport.start();\n\n  // Forward in-process agent activity events out over the relay so external\n  // subscribers can render presence indicators in real time. Uses a dynamic\n  // import so the relay doesn't hard-depend on the presence module if it's\n  // tree-shaken out.\n  import(\"../presence/registry\").then(({ onActivity }) => {\n    const off = onActivity((event) => {\n      if (options.activityFilter) {\n        let keep: boolean;\n        try {\n          keep = options.activityFilter(event);\n        } catch {\n          // Host code threw. Drop this event, keep the subscription — the\n          // alternative is a session that goes permanently silent because one\n          // event was shaped unexpectedly.\n          return;\n        }\n        if (!keep) return;\n      }\n      transport.send({\n        jsonrpc: \"2.0\",\n        method: \"notifications/agent_activity\",\n        params: event as any,\n      });\n    });\n    // Tear down the subscription when the transport closes.\n    const origClose = transport.close.bind(transport);\n    transport.close = () => {\n      off();\n      origClose();\n    };\n  }).catch(() => {\n    // Presence module unavailable — silently no-op (relay still works).\n  });\n\n  return transport;\n}\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 type {\n  BoardItem,\n  ConnectorItem,\n  RemoteCursor,\n  ShapeItem,\n  ShapeKind,\n  StickyNoteItem,\n  Stroke,\n  Viewport,\n} from \"@particle-academy/fancy-whiteboard\";\nimport { 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 * State accessors / mutators the bridge needs from the host. The host owns\n * whiteboard state (controlled props on fancy-whiteboard components); the\n * bridge calls into these to read or change it.\n */\nexport type WhiteboardBridgeAdapter = {\n  getNotes: () => StickyNoteItem[];\n  setNotes: (next: StickyNoteItem[] | ((prev: StickyNoteItem[]) => StickyNoteItem[])) => void;\n  getShapes: () => ShapeItem[];\n  setShapes: (next: ShapeItem[] | ((prev: ShapeItem[]) => ShapeItem[])) => void;\n  getConnectors: () => ConnectorItem[];\n  setConnectors: (next: ConnectorItem[] | ((prev: ConnectorItem[]) => ConnectorItem[])) => void;\n  getStrokes: () => Stroke[];\n  setStrokes: (next: Stroke[] | ((prev: Stroke[]) => Stroke[])) => void;\n  getViewport: () => Viewport;\n  setViewport: (next: Viewport) => void;\n  /** Optional: agent presence cursor (for the visualizer). */\n  setAgentCursor?: (cursor: RemoteCursor | null) => void;\n};\n\nexport type WhiteboardBridgeOptions = {\n  adapter: WhiteboardBridgeAdapter;\n  /** Identity used when the agent stamps authorId on items / cursor. */\n  agent?: { id: string; name?: string; color?: string };\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\nconst VALID_SHAPES: ShapeKind[] = [\"rect\", \"rounded-rect\", \"ellipse\", \"diamond\", \"triangle\", \"line\", \"arrow\", \"text\"];\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);\nconst bool = (v: unknown, fallback = false): boolean => (typeof v === \"boolean\" ? v : fallback);\n\nconst newId = (prefix: string) =>\n  `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;\n\n/**\n * registerWhiteboardBridge — wires a full MCP tool set against a fancy-\n * whiteboard session controlled by the host. Returns a Bridge handle the\n * host can dispose to tear everything down.\n */\nexport function registerWhiteboardBridge(\n  host: ToolHost,\n  options: WhiteboardBridgeOptions,\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 = \"whiteboard\";\n\n  // Register agent_undo / agent_redo / agent_history once per server. Idempotent.\n  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n  // Cursor narration is the agent's responsibility — call\n  // whiteboard_set_agent_cursor as a separate prerequisite before any\n  // mutation. This keeps the protocol honest: each tool does one thing.\n\n  // Activity-target resolver shared by every mutation tool. Pulls the id\n  // from the freshly-created item (structuredContent) when present, falls\n  // back to the args id (for update/delete tools).\n  const wbTarget = (args: any, result: any): AgentTarget => ({\n    kind: \"whiteboard\",\n    elementId: (result?.structuredContent?.id as string | undefined) ?? (args?.id as string | undefined),\n  });\n\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: \"whiteboard\",\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(\"whiteboard_get_state\", \"Get the full board state: viewport, all items, strokes.\", {}, [], () => {\n    const state = {\n      viewport: adapter.getViewport(),\n      notes: adapter.getNotes(),\n      shapes: adapter.getShapes(),\n      connectors: adapter.getConnectors(),\n      strokes: adapter.getStrokes(),\n    };\n    return textResult(JSON.stringify(state, null, 2), state);\n  });\n\n  reg(\"whiteboard_list_items\", \"List notes, shapes, and connectors with id, kind, and bounds.\", {}, [], () => {\n    const items: Array<{ id: string; kind: string; summary: string }> = [];\n    for (const n of adapter.getNotes()) {\n      items.push({\n        id: n.id,\n        kind: \"sticky\",\n        summary: `\"${(n.text ?? \"\").slice(0, 40)}\" @(${Math.round(n.x)},${Math.round(n.y)}) ${n.width}×${n.height}`,\n      });\n    }\n    for (const s of adapter.getShapes()) {\n      items.push({\n        id: s.id,\n        kind: `shape:${s.shape}`,\n        summary: `${s.text ? `\"${s.text}\" ` : \"\"}@(${Math.round(s.x)},${Math.round(s.y)}) ${s.width}×${s.height}`,\n      });\n    }\n    for (const c of adapter.getConnectors()) {\n      items.push({ id: c.id, kind: \"connector\", summary: `from=${JSON.stringify(c.from)} to=${JSON.stringify(c.to)}` });\n    }\n    return textResult(items.map((i) => `${i.kind} ${i.id}: ${i.summary}`).join(\"\\n\") || \"(empty board)\", items);\n  });\n\n  reg(\n    \"whiteboard_get_item\",\n    \"Get a single item (sticky / shape / connector) by id.\",\n    { id: { type: \"string\" } },\n    [\"id\"],\n    (args) => {\n      const id = str(args.id);\n      const all: BoardItem[] = [...adapter.getNotes(), ...adapter.getShapes(), ...adapter.getConnectors()];\n      const found = all.find((x) => x.id === id);\n      if (!found) return errorResult(`No item with id ${id}`);\n      return textResult(JSON.stringify(found, null, 2), found);\n    },\n  );\n\n  // ───────────── Sticky CRUD ─────────────\n\n  reg(\n    \"whiteboard_add_sticky\",\n    \"Add a sticky note. Position is in world coordinates.\",\n    {\n      x: { type: \"number\" },\n      y: { type: \"number\" },\n      text: { type: \"string\" },\n      width: { type: \"number\" },\n      height: { type: \"number\" },\n      color: { type: \"string\", description: \"CSS color, e.g. #fde68a\" },\n    },\n    [\"x\", \"y\"],\n    async (args) => {\n      const x = num(args.x);\n      const y = num(args.y);\n      const width = num(args.width, 180);\n      const height = num(args.height, 140);\n// (cursor narration is now an explicit separate tool call)\n      const note: StickyNoteItem = {\n        id: newId(\"n\"),\n        kind: \"sticky\",\n        x, y, width, height,\n        text: str(args.text),\n        color: typeof args.color === \"string\" ? args.color : \"#fde68a\",\n        authorId: agent.id,\n      };\n      adapter.setNotes((all) => [...all, note]);\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"whiteboard\",\n        action: \"whiteboard_add_sticky\",\n        label: `Added sticky ${note.id}`,\n        undo: () => adapter.setNotes((all) => all.filter((n) => n.id !== note.id)),\n        redo: () => adapter.setNotes((all) => [...all, note]),\n      });\n      return textResult(`Added sticky ${note.id}`, note);\n    },\n    wbTarget,\n  );\n\n  reg(\n    \"whiteboard_stream_text\",\n    \"Type text into a sticky note character-by-character so the human can read it forming. The tool returns once streaming finishes.\",\n    {\n      id: { type: \"string\" },\n      text: { type: \"string\" },\n      cps: { type: \"number\", description: \"Characters per second. Default 25.\" },\n      append: { type: \"boolean\", description: \"Append to existing text instead of replacing. Default false.\" },\n    },\n    [\"id\", \"text\"],\n    async (args) => {\n      const id = str(args.id);\n      const target = str(args.text);\n      const cps = Math.max(1, num(args.cps, 25));\n      const append = bool(args.append);\n      const startNote = adapter.getNotes().find((n) => n.id === id);\n      if (!startNote) return errorResult(`No sticky with id ${id}`);\n      const base = append ? (startNote.text ?? \"\") : \"\";\n      const interval = Math.max(8, Math.round(1000 / cps));\n      for (let i = 0; i <= target.length; i++) {\n        const nextText = base + target.slice(0, i);\n        adapter.setNotes((all) => all.map((n) => (n.id === id ? { ...n, text: nextText } : n)));\n        if (i < target.length) await new Promise((r) => setTimeout(r, interval));\n      }\n      return textResult(`Streamed ${target.length} chars to ${id}`, { id, text: base + target });\n    },\n  );\n\n  reg(\n    \"whiteboard_update_sticky\",\n    \"Update fields on a sticky note. Only provided fields are changed.\",\n    {\n      id: { type: \"string\" },\n      x: { type: \"number\" },\n      y: { type: \"number\" },\n      width: { type: \"number\" },\n      height: { type: \"number\" },\n      text: { type: \"string\" },\n      color: { type: \"string\" },\n    },\n    [\"id\"],\n    async (args) => {\n      const id = str(args.id);\n      const existing = adapter.getNotes().find((n) => n.id === id);\n      if (!existing) return errorResult(`No sticky with id ${id}`);\n      const nextX = args.x !== undefined ? num(args.x) : existing.x;\n      const nextY = args.y !== undefined ? num(args.y) : existing.y;\n      const nextW = args.width !== undefined ? num(args.width) : existing.width;\n      const nextH = args.height !== undefined ? num(args.height) : existing.height;\n// (cursor narration is now an explicit separate tool call)\n      let updated: StickyNoteItem | null = null;\n      adapter.setNotes((all) =>\n        all.map((n) => {\n          if (n.id !== id) return n;\n          updated = {\n            ...n,\n            x: nextX, y: nextY, width: nextW, height: nextH,\n            ...(args.text !== undefined ? { text: str(args.text) } : {}),\n            ...(args.color !== undefined ? { color: str(args.color) } : {}),\n          };\n          return updated;\n        }),\n      );\n      return textResult(`Updated sticky ${id}`, updated);\n    },\n    wbTarget,\n  );\n\n  // ───────────── Shape CRUD ─────────────\n\n  reg(\n    \"whiteboard_add_shape\",\n    `Add a shape. Kind must be one of: ${VALID_SHAPES.join(\", \")}.`,\n    {\n      shape: { type: \"string\", enum: VALID_SHAPES },\n      x: { type: \"number\" },\n      y: { type: \"number\" },\n      width: { type: \"number\" },\n      height: { type: \"number\" },\n      text: { type: \"string\" },\n      fill: { type: \"string\" },\n      stroke: { type: \"string\" },\n      flipX: { type: \"boolean\" },\n      flipY: { type: \"boolean\" },\n    },\n    [\"shape\", \"x\", \"y\", \"width\", \"height\"],\n    async (args) => {\n      const kind = str(args.shape) as ShapeKind;\n      if (!VALID_SHAPES.includes(kind)) return errorResult(`Invalid shape kind: ${kind}`);\n      const x = num(args.x);\n      const y = num(args.y);\n      const width = num(args.width);\n      const height = num(args.height);\n// (cursor narration is now an explicit separate tool call)\n      const shape: ShapeItem = {\n        id: newId(\"s\"),\n        kind: \"shape\",\n        shape: kind,\n        x, y, width, height,\n        ...(args.text !== undefined ? { text: str(args.text) } : {}),\n        ...(args.fill !== undefined ? { fill: str(args.fill) } : {}),\n        ...(args.stroke !== undefined ? { stroke: str(args.stroke) } : {}),\n        ...(args.flipX !== undefined ? { flipX: bool(args.flipX) } : {}),\n        ...(args.flipY !== undefined ? { flipY: bool(args.flipY) } : {}),\n      };\n      adapter.setShapes((all) => [...all, shape]);\n      return textResult(`Added ${kind} ${shape.id}`, shape);\n    },\n    wbTarget,\n  );\n\n  reg(\n    \"whiteboard_update_shape\",\n    \"Update fields on a shape.\",\n    {\n      id: { type: \"string\" },\n      x: { type: \"number\" },\n      y: { type: \"number\" },\n      width: { type: \"number\" },\n      height: { type: \"number\" },\n      text: { type: \"string\" },\n      fill: { type: \"string\" },\n      stroke: { type: \"string\" },\n    },\n    [\"id\"],\n    async (args) => {\n      const id = str(args.id);\n      const existing = adapter.getShapes().find((s) => s.id === id);\n      if (!existing) return errorResult(`No shape with id ${id}`);\n      const nextX = args.x !== undefined ? num(args.x) : existing.x;\n      const nextY = args.y !== undefined ? num(args.y) : existing.y;\n      const nextW = args.width !== undefined ? num(args.width) : existing.width;\n      const nextH = args.height !== undefined ? num(args.height) : existing.height;\n// (cursor narration is now an explicit separate tool call)\n      let updated: ShapeItem | null = null;\n      adapter.setShapes((all) =>\n        all.map((s) => {\n          if (s.id !== id) return s;\n          updated = {\n            ...s,\n            x: nextX, y: nextY, width: nextW, height: nextH,\n            ...(args.text !== undefined ? { text: str(args.text) } : {}),\n            ...(args.fill !== undefined ? { fill: str(args.fill) } : {}),\n            ...(args.stroke !== undefined ? { stroke: str(args.stroke) } : {}),\n          };\n          return updated;\n        }),\n      );\n      return textResult(`Updated shape ${id}`, updated);\n    },\n    wbTarget,\n  );\n\n  // ───────────── Connectors ─────────────\n\n  reg(\n    \"whiteboard_add_connector\",\n    \"Connect two items by id, or specify explicit world-space points.\",\n    {\n      from: { description: \"Item id (string) or {x,y}\" },\n      to: { description: \"Item id (string) or {x,y}\" },\n      color: { type: \"string\" },\n    },\n    [\"from\", \"to\"],\n    (args) => {\n      const c: ConnectorItem = {\n        id: newId(\"c\"),\n        kind: \"connector\",\n        from: args.from as any,\n        to: args.to as any,\n        ...(args.color !== undefined ? { color: str(args.color) } : {}),\n      };\n      adapter.setConnectors((all) => [...all, c]);\n      return textResult(`Added connector ${c.id}`, c);\n    },\n    wbTarget,\n  );\n\n  // ───────────── Drawing ─────────────\n\n  reg(\n    \"whiteboard_add_stroke\",\n    \"Add a freeform pen stroke. Points are absolute screen coords (matching the Drawing layer).\",\n    {\n      points: {\n        type: \"array\",\n        description: \"Array of {x,y} points\",\n      },\n      color: { type: \"string\" },\n      size: { type: \"number\" },\n    },\n    [\"points\"],\n    (args) => {\n      const points = (Array.isArray(args.points) ? args.points : []).map((p: any) => ({\n        x: num(p?.x),\n        y: num(p?.y),\n      }));\n      if (!points.length) return errorResult(\"Stroke requires at least one point\");\n      const stroke: Stroke = {\n        id: newId(\"st\"),\n        points,\n        color: typeof args.color === \"string\" ? args.color : \"#0f172a\",\n        size: typeof args.size === \"number\" ? args.size : 2,\n        authorId: agent.id,\n      };\n      adapter.setStrokes((all) => [...all, stroke]);\n      return textResult(`Added stroke ${stroke.id} (${points.length} points)`, stroke);\n    },\n    wbTarget,\n  );\n\n  // ───────────── Generic delete ─────────────\n\n  reg(\n    \"whiteboard_delete_item\",\n    \"Remove any item by id (sticky / shape / connector / stroke).\",\n    { id: { type: \"string\" } },\n    [\"id\"],\n    (args) => {\n      const id = str(args.id);\n      // Snapshot the items being removed so undo can re-insert them.\n      const removedNotes = adapter.getNotes().filter((x) => x.id === id);\n      const removedShapes = adapter.getShapes().filter((x) => x.id === id);\n      const removedConnectors = adapter.getConnectors().filter((x) => x.id === id);\n      const removedStrokes = adapter.getStrokes().filter((x) => x.id === id);\n      const removed = removedNotes.length + removedShapes.length + removedConnectors.length + removedStrokes.length > 0;\n      if (!removed) return errorResult(`No item with id ${id}`);\n      adapter.setNotes((all) => all.filter((x) => x.id !== id));\n      adapter.setShapes((all) => all.filter((x) => x.id !== id));\n      adapter.setConnectors((all) => all.filter((x) => x.id !== id));\n      adapter.setStrokes((all) => all.filter((x) => x.id !== id));\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"whiteboard\",\n        action: \"whiteboard_delete_item\",\n        label: `Deleted ${id}`,\n        undo: () => {\n          if (removedNotes.length) adapter.setNotes((all) => [...all, ...removedNotes]);\n          if (removedShapes.length) adapter.setShapes((all) => [...all, ...removedShapes]);\n          if (removedConnectors.length) adapter.setConnectors((all) => [...all, ...removedConnectors]);\n          if (removedStrokes.length) adapter.setStrokes((all) => [...all, ...removedStrokes]);\n        },\n        redo: () => {\n          adapter.setNotes((all) => all.filter((x) => x.id !== id));\n          adapter.setShapes((all) => all.filter((x) => x.id !== id));\n          adapter.setConnectors((all) => all.filter((x) => x.id !== id));\n          adapter.setStrokes((all) => all.filter((x) => x.id !== id));\n        },\n      });\n      return textResult(`Deleted ${id}`);\n    },\n    wbTarget,\n  );\n\n  // ───────────── Viewport / agent presence ─────────────\n\n  reg(\n    \"whiteboard_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    wbTarget,\n  );\n\n  reg(\n    \"whiteboard_set_agent_cursor\",\n    \"Move the agent's presence cursor (or pass null to hide it).\",\n    {\n      x: { type: \"number\" },\n      y: { type: \"number\" },\n      hide: { type: \"boolean\" },\n    },\n    [],\n    (args) => {\n      if (!adapter.setAgentCursor) return errorResult(\"Host did not provide setAgentCursor\");\n      if (bool(args.hide)) {\n        adapter.setAgentCursor(null);\n        return textResult(\"Agent cursor hidden\");\n      }\n      const cursor: RemoteCursor = {\n        userId: agent.id,\n        name: agent.name,\n        color: agent.color,\n        x: num(args.x),\n        y: num(args.y),\n      };\n      adapter.setAgentCursor(cursor);\n      return textResult(`Cursor → (${cursor.x}, ${cursor.y})`, cursor);\n    },\n    wbTarget,\n  );\n\n  return {\n    id: bridgeId,\n    title: \"Whiteboard\",\n    dispose: () => {\n      for (const d of disposers) d();\n      adapter.setAgentCursor?.(null);\n    },\n  };\n}\n","import { type CSSProperties, useEffect, useRef, useState } from \"react\";\nimport type { SessionDescriptor } from \"../../sharing/token\";\nimport type { AgentActivity } from \"../AgentPanel\";\nimport { buildShareConfig, buildShareUrl } from \"../../sharing/token\";\n\nexport type ShareControlsProps = {\n  /** The active session, or null when not sharing yet. */\n  session: SessionDescriptor | null;\n  onStart: () => void;\n  onStop: () => void;\n  /** Optional connection-state badge text. */\n  status?: string;\n  /**\n   * True once an agent has actually connected to the session.\n   *\n   * Flips the panel from \"here is how to connect\" to \"here is what the agent is\n   * doing\" — the paste-this-prompt UI is dead weight the moment it has been\n   * pasted, and what the human needs then is visibility.\n   */\n  agentConnected?: boolean;\n  /**\n   * What the agent has done, newest last. Reuses `AgentActivity` from\n   * `AgentPanel` rather than a second shape, so a host already collecting\n   * presence events can pass the same array to both.\n   */\n  activity?: AgentActivity[];\n  /** Override the URL base used in the share URL. */\n  shareBaseUrl?: string;\n  className?: string;\n  style?: CSSProperties;\n};\n\ntype Tab = \"activity\" | \"prompt\" | \"url\" | \"json\" | \"curl\";\n\n/**\n * ShareControls — the host-facing UI for turning sharing on/off and\n * surfacing the resulting connection details (URL / JSON / cURL).\n */\nexport function ShareControls({\n  session,\n  onStart,\n  onStop,\n  status,\n  agentConnected = false,\n  activity,\n  shareBaseUrl,\n  className,\n  style,\n}: ShareControlsProps) {\n  const [tab, setTab] = useState<Tab>(\"prompt\");\n\n  // Switch to the log the FIRST time an agent connects, then leave the tab\n  // alone. Forcing it on every render would fight a human who deliberately went\n  // back to copy the URL again — the panel should follow the session, not\n  // overrule the person reading it.\n  const wasConnected = useRef(false);\n  useEffect(() => {\n    if (agentConnected && !wasConnected.current) {\n      wasConnected.current = true;\n      setTab(\"activity\");\n    }\n    if (!agentConnected) wasConnected.current = false;\n  }, [agentConnected]);\n\n  if (!session) {\n    return (\n      <div className={[\"fai-share fai-share--idle\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n        <button type=\"button\" className=\"fai-share__start\" onClick={onStart}>\n          Start shared session\n        </button>\n        <p className=\"fai-share__hint\">\n          Generates a session id + secret token. Hand the <strong>Agent prompt</strong> to an AI agent, share the URL with humans, or give the JSON config to an MCP-capable client.\n        </p>\n      </div>\n    );\n  }\n\n  const url = buildShareUrl(session, shareBaseUrl);\n  const config = buildShareConfig(session);\n  const curl = buildCurlRecipe(session);\n  const prompt = buildAgentPrompt(url);\n\n  return (\n    <div className={[\"fai-share fai-share--active\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n      <div className=\"fai-share__header\">\n        <div>\n          <strong>Sharing</strong>\n          <span className=\"fai-share__id\">\n            session <code>{session.id}</code> · token <code>{session.display}…</code>\n          </span>\n        </div>\n        <div className=\"fai-share__header-actions\">\n          {status && <span className=\"fai-share__status\">{status}</span>}\n          <button type=\"button\" className=\"fai-share__stop\" onClick={onStop}>\n            Stop\n          </button>\n        </div>\n      </div>\n\n      <div className=\"fai-share__tabs\" role=\"tablist\">\n        {agentConnected && (\n          <TabButton tab=\"activity\" active={tab} setTab={setTab}>\n            Activity\n          </TabButton>\n        )}\n        <TabButton tab=\"prompt\" active={tab} setTab={setTab}>Agent prompt</TabButton>\n        <TabButton tab=\"url\" active={tab} setTab={setTab}>URL</TabButton>\n        <TabButton tab=\"json\" active={tab} setTab={setTab}>JSON</TabButton>\n        <TabButton tab=\"curl\" active={tab} setTab={setTab}>cURL recipe</TabButton>\n      </div>\n\n      <div className=\"fai-share__panel\">\n        {tab === \"activity\" && <ActivityLog activity={activity} />}\n        {tab === \"prompt\" && (\n          <CopyBox\n            label=\"Paste this straight into an AI agent — it connects over MCP, no browser\"\n            value={prompt}\n            multiline\n          />\n        )}\n        {tab === \"url\" && <CopyBox label=\"Open this URL in another tab to join the session\" value={url} />}\n        {tab === \"json\" && (\n          <CopyBox\n            label=\"Paste into Claude Desktop / Cline MCP server config\"\n            value={JSON.stringify(config, null, 2)}\n          />\n        )}\n        {tab === \"curl\" && (\n          <CopyBox\n            label=\"Connect from a terminal (verifies the relay is reachable)\"\n            value={curl}\n            multiline\n          />\n        )}\n      </div>\n    </div>\n  );\n}\n\n/**\n * What the agent has actually done, newest first.\n *\n * The panel used to keep showing the paste-this-prompt UI after the agent was\n * already connected and driving — dead weight at exactly the moment the human\n * needs the opposite: visibility. A connected agent with no visible activity is\n * indistinguishable from a broken one, which is precisely how a stalled session\n * goes unnoticed.\n */\nfunction ActivityLog({ activity }: { activity?: AgentActivity[] }) {\n  const entries = (activity ?? []).slice().reverse();\n\n  if (entries.length === 0) {\n    return (\n      <p className=\"fai-share__empty\">\n        Connected. Nothing yet — actions appear here as the agent takes them.\n      </p>\n    );\n  }\n\n  return (\n    <ol className=\"fai-share__activity\" aria-live=\"polite\">\n      {entries.map((entry) => (\n        <li key={entry.id} className=\"fai-share__activity-row\" data-kind={entry.kind}>\n          <time className=\"fai-share__activity-time\" dateTime={new Date(entry.at).toISOString()}>\n            {new Date(entry.at).toLocaleTimeString(undefined, {\n              hour: \"2-digit\",\n              minute: \"2-digit\",\n              second: \"2-digit\",\n            })}\n          </time>\n          <span className=\"fai-share__activity-source\">{entry.source}</span>\n          <span className=\"fai-share__activity-text\">{entry.text}</span>\n        </li>\n      ))}\n    </ol>\n  );\n}\n\nfunction TabButton({ tab, active, setTab, children }: { tab: Tab; active: Tab; setTab: (t: Tab) => void; children: React.ReactNode }) {\n  return (\n    <button\n      type=\"button\"\n      role=\"tab\"\n      aria-selected={tab === active}\n      className={`fai-share__tab${tab === active ? \" is-active\" : \"\"}`}\n      onClick={() => setTab(tab)}\n    >\n      {children}\n    </button>\n  );\n}\n\nfunction CopyBox({ label, value, multiline }: { label: string; value: string; multiline?: boolean }) {\n  const [copied, setCopied] = useState(false);\n  const copy = async () => {\n    try {\n      await navigator.clipboard.writeText(value);\n      setCopied(true);\n      setTimeout(() => setCopied(false), 1200);\n    } catch {\n      // ignore\n    }\n  };\n  return (\n    <div>\n      <div className=\"fai-share__panel-label\">{label}</div>\n      <div className=\"fai-share__copy\">\n        <pre className={`fai-share__pre${multiline ? \" is-multi\" : \"\"}`}>{value}</pre>\n        <button type=\"button\" className=\"fai-share__copy-btn\" onClick={copy}>\n          {copied ? \"Copied\" : \"Copy\"}\n        </button>\n      </div>\n    </div>\n  );\n}\n\n/**\n * Build a copy-paste natural-language prompt to hand directly to an AI agent.\n * Agents handed a bare URL tend to try to *open it in a browser* — this spells\n * out that the link is a live MCP co-browsing session it should drive over MCP\n * tools (via the zero-install relay client), never visit.\n */\nexport function buildAgentPrompt(url: string): string {\n  return [\n    `You're joining a live Human+ co-browsing session on a web app. This is an MCP`,\n    `(Model Context Protocol) session — NOT a website to visit. Do NOT open the URL`,\n    `in a browser and do NOT use any browser/Playwright tool. You drive the real,`,\n    `running app through MCP tools while a human watches and can take over.`,\n    ``,\n    `Session link (carries the session id + token — treat it as a secret):`,\n    `  ${url}`,\n    ``,\n    `Connect by running the relay client as an MCP server (zero install):`,\n    `  npx -y mcp-relay-client \"${url}\"`,\n    ``,\n    `That exposes the app's own tools (e.g. page_describe, page_read, nav_visit,`,\n    `page_click, page_set_field, page_submit, plus surface tools like whiteboard_*).`,\n    `Then:`,\n    `  1. Call page_describe first to see the current page and its interactive handles.`,\n    `  2. Act only on the STABLE HANDLES the tools return — never guess DOM selectors.`,\n    `  3. Navigate with nav_visit, type with page_set_field, click with page_click.`,\n    `     Submits and destructive clicks are staged for the human to confirm.`,\n    ``,\n    `If you can't register an MCP server but can run a shell, drive it directly:`,\n    `  curl -O https://raw.githubusercontent.com/Particle-Academy/mcp-relay-client/main/connect.sh`,\n    `  bash connect.sh \"${url}\" tools`,\n    `  bash connect.sh \"${url}\" call page_describe '{}'`,\n  ].join(\"\\n\");\n}\n\n/** Build a copy-paste cURL recipe for connecting an external MCP client. */\nfunction buildCurlRecipe(session: SessionDescriptor): string {\n  const base =\n    typeof window !== \"undefined\"\n      ? `${window.location.protocol}//${window.location.host}`\n      : \"http://localhost\";\n  const inbox = `${base}/agent-relay/${session.id}/inbox?token=${session.token}`;\n  const events = `${base}/agent-relay/${session.id}/events?token=${session.token}`;\n  return [\n    `# 1) In one terminal, subscribe to server-pushed frames (SSE)`,\n    `curl -N \"${events}\"`,\n    ``,\n    `# 2) In another terminal, send an initialize handshake`,\n    `curl -X POST \"${inbox}\" \\\\`,\n    `  -H 'content-type: application/json' \\\\`,\n    `  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{}}'`,\n    ``,\n    `# 3) List the tools the bridge exposes`,\n    `curl -X POST \"${inbox}\" \\\\`,\n    `  -H 'content-type: application/json' \\\\`,\n    `  -d '{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/list\"}'`,\n    ``,\n    `# 4) Add a sticky note`,\n    `curl -X POST \"${inbox}\" \\\\`,\n    `  -H 'content-type: application/json' \\\\`,\n    `  -d '{\"jsonrpc\":\"2.0\",\"id\":3,\"method\":\"tools/call\",\"params\":{\"name\":\"whiteboard_add_sticky\",\"arguments\":{\"x\":300,\"y\":300,\"text\":\"hello from curl\"}}}'`,\n  ].join(\"\\n\");\n}\n","import { type CSSProperties, type ReactNode, useEffect, useRef } from \"react\";\n\nexport type AgentActivity = {\n  id: string;\n  /** Wall-clock timestamp; component formats it. */\n  at: number;\n  /** \"tool\" for MCP tool invocations, \"message\" for chat, \"info\" for status. */\n  kind: \"tool\" | \"message\" | \"info\" | \"error\";\n  /** Short label, e.g. \"whiteboard_add_sticky\" or \"Agent\". */\n  source: string;\n  /** Body text. */\n  text: string;\n  /** Optional structured payload, rendered as collapsed JSON. */\n  detail?: unknown;\n\n  // ── Tool-call fields. Present when `kind === \"tool\"`; ignored otherwise. ──\n  /**\n   * The call's arguments. Rendered inline next to the tool name so the feed\n   * reads as `tool(args) → result` — the point being that the agent's\n   * reasoning is legible AS IT HAPPENS, not reconstructable afterwards from a\n   * details pane nobody opens.\n   */\n  args?: unknown;\n  /** What the call returned. */\n  result?: unknown;\n  /** Round-trip time in ms. Rendered as `· 142ms`. */\n  durationMs?: number;\n  /**\n   * Lifecycle. A row can appear as `pending` the moment a call starts and be\n   * replaced by the settled row, which is what makes this a STREAM rather than\n   * a log. Defaults to `ok`, or `error` when `kind === \"error\"`.\n   */\n  status?: \"pending\" | \"ok\" | \"error\";\n};\n\nexport type AgentPanelProps = {\n  /** The agent's identity (name + color appears in the header). */\n  agent?: { name?: string; color?: string };\n  /** Activity stream. Most recent at the end. */\n  activity: AgentActivity[];\n  /** Optional chat composer — pass an onSubmit to enable. */\n  onSubmit?: (message: string) => void;\n  /** Disabled while a request is in flight. */\n  busy?: boolean;\n  /** Right-rail header actions. */\n  actions?: ReactNode;\n  className?: string;\n  style?: CSSProperties;\n};\n\n/**\n * AgentPanel — sidebar showing the agent's identity, a tool-and-chat log,\n * and an optional input composer. Pure presentational: hosts feed it the\n * activity stream from their own state (typically the MCP transport log).\n */\nexport function AgentPanel({ agent, activity, onSubmit, busy, actions, className, style }: AgentPanelProps) {\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const inputRef = useRef<HTMLTextAreaElement>(null);\n\n  useEffect(() => {\n    const el = scrollRef.current;\n    if (!el) return;\n    el.scrollTop = el.scrollHeight;\n  }, [activity.length]);\n\n  const handleSubmit = (e: React.FormEvent) => {\n    e.preventDefault();\n    const value = inputRef.current?.value.trim();\n    if (!value || !onSubmit) return;\n    onSubmit(value);\n    if (inputRef.current) inputRef.current.value = \"\";\n  };\n\n  const color = agent?.color ?? \"#a855f7\";\n  const name = agent?.name ?? \"Agent\";\n\n  return (\n    <div className={[\"fai-panel\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n      <header className=\"fai-panel__header\">\n        <div\n          className=\"fai-panel__avatar\"\n          style={{ background: color }}\n          aria-hidden\n        >\n          {name.slice(0, 1)}\n        </div>\n        <div className=\"fai-panel__title\">\n          <strong>{name}</strong>\n          <span className=\"fai-panel__subtitle\">\n            {busy ? \"Working…\" : `${activity.length} event${activity.length === 1 ? \"\" : \"s\"}`}\n          </span>\n        </div>\n        {actions && <div className=\"fai-panel__actions\">{actions}</div>}\n      </header>\n\n      <div ref={scrollRef} className=\"fai-panel__stream\">\n        {activity.length === 0 ? (\n          <p className=\"fai-panel__empty\">No activity yet.</p>\n        ) : (\n          activity.map((a) => <ActivityRow key={a.id} item={a} />)\n        )}\n      </div>\n\n      {onSubmit && (\n        <form className=\"fai-panel__composer\" onSubmit={handleSubmit}>\n          <textarea\n            ref={inputRef}\n            className=\"fai-panel__input\"\n            placeholder={busy ? \"Working…\" : \"Ask the agent…\"}\n            disabled={busy}\n            rows={2}\n            onKeyDown={(e) => {\n              if (e.key === \"Enter\" && !e.shiftKey) {\n                e.preventDefault();\n                handleSubmit(e as unknown as React.FormEvent);\n              }\n            }}\n          />\n          <button type=\"submit\" className=\"fai-panel__send\" disabled={busy}>\n            Send\n          </button>\n        </form>\n      )}\n    </div>\n  );\n}\n\nfunction ActivityRow({ item }: { item: AgentActivity }) {\n  const time = formatTime(item.at);\n  const status = item.status ?? (item.kind === \"error\" ? \"error\" : \"ok\");\n  const isCall = item.kind === \"tool\" && (item.args !== undefined || item.result !== undefined || item.durationMs !== undefined);\n\n  return (\n    <div\n      className={`fai-row fai-row--${item.kind}${isCall ? ` fai-row--${status}` : \"\"}`}\n      data-fai-row=\"\"\n      data-kind={item.kind}\n      data-status={isCall ? status : undefined}\n    >\n      <div className=\"fai-row__meta\">\n        <span className=\"fai-row__source\">{item.source}</span>\n        {isCall && item.args !== undefined && (\n          <span className=\"fai-row__args\" data-fai-args=\"\">\n            ({inline(item.args)})\n          </span>\n        )}\n        {isCall && item.durationMs !== undefined && (\n          <span className=\"fai-row__latency\" data-fai-latency=\"\">\n            · {item.durationMs}ms\n          </span>\n        )}\n        <span className=\"fai-row__time\">{time}</span>\n      </div>\n      {isCall && item.result !== undefined && (\n        <div className=\"fai-row__result\" data-fai-result=\"\">\n          → {inline(item.result)}\n        </div>\n      )}\n      <div className=\"fai-row__text\">{item.text}</div>\n      {item.detail !== undefined && (\n        <details className=\"fai-row__detail\">\n          <summary>details</summary>\n          <pre>{safeJson(item.detail)}</pre>\n        </details>\n      )}\n    </div>\n  );\n}\n\n/**\n * One-line rendering of a call's args or result.\n *\n * Truncated hard, because a feed is scanned rather than read: an untruncated\n * result payload pushes every subsequent row off the screen, which costs more\n * than the detail is worth. The full value stays available via `detail`.\n */\nfunction inline(v: unknown, max = 80): string {\n  if (typeof v === \"string\") return v.length > max ? `${v.slice(0, max)}…` : v;\n  const json = safeJson(v).replace(/\\s+/g, \" \");\n  return json.length > max ? `${json.slice(0, max)}…` : json;\n}\n\nfunction formatTime(at: number): string {\n  const d = new Date(at);\n  const hh = d.getHours().toString().padStart(2, \"0\");\n  const mm = d.getMinutes().toString().padStart(2, \"0\");\n  const ss = d.getSeconds().toString().padStart(2, \"0\");\n  return `${hh}:${mm}:${ss}`;\n}\n\nfunction safeJson(v: unknown): string {\n  try {\n    return JSON.stringify(v, null, 2);\n  } catch {\n    return String(v);\n  }\n}\n","import type { CSSProperties } from \"react\";\n\nexport type AgentCursorProps = {\n  x: number;\n  y: number;\n  name?: string;\n  color?: string;\n  /** Optional caption shown under the name (e.g. current tool). */\n  status?: string;\n  className?: string;\n  style?: CSSProperties;\n};\n\n/**\n * AgentCursor — on-canvas presence marker for the agent. Drop it inside\n * (or alongside) a fancy-whiteboard <Board> at screen coords matching\n * the agent's reported position.\n */\nexport function AgentCursor({ x, y, name, color = \"#a855f7\", status, className, style }: AgentCursorProps) {\n  return (\n    <div\n      className={[\"fai-cursor\", className ?? \"\"].filter(Boolean).join(\" \")}\n      style={{\n        position: \"absolute\",\n        left: x,\n        top: y,\n        pointerEvents: \"none\",\n        transform: \"translate(-2px, -2px)\",\n        ...style,\n      }}\n    >\n      <svg width=\"22\" height=\"22\" viewBox=\"0 0 22 22\" aria-hidden>\n        <path\n          d=\"M2 2 L2 17 L7 13 L10 19 L12 18 L9 12 L15 12 Z\"\n          fill={color}\n          stroke=\"white\"\n          strokeWidth=\"1.2\"\n        />\n      </svg>\n      {name && (\n        <span\n          className=\"fai-cursor__tag\"\n          style={{ background: color }}\n        >\n          {name}\n          {status ? <em className=\"fai-cursor__status\"> · {status}</em> : null}\n        </span>\n      )}\n    </div>\n  );\n}\n","import { type CSSProperties, useEffect, useState } from \"react\";\n\nexport type AgentActivityHighlightProps = {\n  /** Bounds of the highlighted item in the parent's coord system. */\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  /** Trigger token — change it (e.g. set to Date.now()) to re-fire the pulse. */\n  pulseKey?: string | number;\n  /** Highlight tint. */\n  color?: string;\n  /** Pulse duration in ms. Defaults 1200. */\n  duration?: number;\n  className?: string;\n  style?: CSSProperties;\n};\n\n/**\n * AgentActivityHighlight — short pulsing outline that flashes around an\n * item the agent just touched. Position the parent so this can be placed\n * absolutely matching the item's bounds.\n */\nexport function AgentActivityHighlight({\n  x,\n  y,\n  width,\n  height,\n  pulseKey,\n  color = \"#a855f7\",\n  duration = 1200,\n  className,\n  style,\n}: AgentActivityHighlightProps) {\n  const [visible, setVisible] = useState(false);\n\n  useEffect(() => {\n    if (pulseKey === undefined) return;\n    setVisible(true);\n    const t = setTimeout(() => setVisible(false), duration);\n    return () => clearTimeout(t);\n  }, [pulseKey, duration]);\n\n  if (!visible) return null;\n\n  return (\n    <div\n      className={[\"fai-highlight\", className ?? \"\"].filter(Boolean).join(\" \")}\n      style={{\n        position: \"absolute\",\n        left: x - 4,\n        top: y - 4,\n        width: width + 8,\n        height: height + 8,\n        borderRadius: 8,\n        boxShadow: `0 0 0 2px ${color}, 0 0 16px ${color}66`,\n        pointerEvents: \"none\",\n        animation: `fai-pulse ${duration}ms ease-out forwards`,\n        ...style,\n      }}\n    />\n  );\n}\n","import { type CSSProperties, type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n  Board,\n  StickyNote,\n  Connector,\n  Shape,\n  CursorLayer,\n  type StickyNoteItem,\n  type ShapeItem,\n  type ConnectorItem,\n  type Stroke,\n  type RemoteCursor,\n  type Viewport,\n} from \"@particle-academy/fancy-whiteboard\";\nimport { MicroMcpServer, type Transport } from \"../../mcp/server\";\nimport { attachInProcess, type InProcessTransport } from \"../../mcp/transports/in-process\";\nimport { attachSseRelay, type RelayState, type SseRelayTransport } from \"../../sharing/sse-relay\";\nimport { createSessionDescriptor, type SessionDescriptor } from \"../../sharing/token\";\nimport { registerWhiteboardBridge } from \"../../bridges/whiteboard\";\nimport type { Bridge } from \"../../bridges/types\";\nimport { ShareControls } from \"../ShareControls\";\nimport { AgentPanel, type AgentActivity } from \"../AgentPanel\";\nimport { AgentCursor } from \"../AgentCursor\";\nimport { AgentActivityHighlight } from \"../AgentActivityHighlight\";\n\nexport type SharedWhiteboardProps = {\n  /** Initial board contents. */\n  initialNotes?: StickyNoteItem[];\n  initialShapes?: ShapeItem[];\n  initialConnectors?: ConnectorItem[];\n  initialStrokes?: Stroke[];\n  initialViewport?: Viewport;\n\n  /** Agent identity displayed in the panel + cursor. */\n  agent?: { id: string; name?: string; color?: string };\n\n  /**\n   * Where the relay HTTP endpoints live. The host app implements these (see\n   * docs/relay-protocol.md). Pass `null` to disable sharing — the board\n   * still works locally with the in-process MCP server.\n   */\n  shareBaseUrl?: string | null;\n\n  /**\n   * Optional callback to register a new session token with the host's\n   * relay broker. Receives `{ session, token }` and should return after\n   * registration. Defaults to POSTing JSON to `${shareBaseUrl}/register`.\n   */\n  onRegisterSession?: (descriptor: SessionDescriptor) => Promise<void>;\n\n  /** Show the agent panel. Default true. */\n  showAgentPanel?: boolean;\n\n  /** Show share controls. Default true. */\n  showShareControls?: boolean;\n\n  /** Auto-broadcast local edits as `notifications/state_update`. Default true. */\n  broadcastEdits?: boolean;\n\n  /** Pixel height of the board area. Default 640. */\n  height?: number;\n\n  /** Header content rendered above the board. */\n  header?: ReactNode;\n\n  className?: string;\n  style?: CSSProperties;\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * SharedWhiteboard — drop-in component that bundles every piece of the\n * \"agent-collaborative whiteboard\" UX: board with all primitives, in-page\n * MCP server, share controls, agent panel, presence cursor, activity\n * highlight, and outbound state broadcast.\n *\n * Most apps only need this one component. For deeper customization, swap\n * it for the lower-level primitives (Board, MicroMcpServer, ShareControls).\n */\nexport function SharedWhiteboard({\n  initialNotes = [],\n  initialShapes = [],\n  initialConnectors = [],\n  initialStrokes = [],\n  initialViewport = { x: 0, y: 0, zoom: 1 },\n  agent = DEFAULT_AGENT,\n  shareBaseUrl = \"/agent-relay\",\n  onRegisterSession,\n  showAgentPanel = true,\n  showShareControls = true,\n  broadcastEdits = true,\n  height = 640,\n  header,\n  className,\n  style,\n}: SharedWhiteboardProps) {\n  // Board state\n  const [notes, setNotes] = useState<StickyNoteItem[]>(initialNotes);\n  const [shapes, setShapes] = useState<ShapeItem[]>(initialShapes);\n  const [connectors, setConnectors] = useState<ConnectorItem[]>(initialConnectors);\n  const [strokes, setStrokes] = useState<Stroke[]>(initialStrokes);\n  const [viewport, setViewport] = useState<Viewport>(initialViewport);\n  const [agentCursor, setAgentCursor] = useState<RemoteCursor | null>(null);\n\n  // Agent UX state\n  const [activity, setActivity] = useState<AgentActivity[]>([]);\n  const [highlight, setHighlight] = useState<{ pulseKey: number; bounds: { x: number; y: number; width: number; height: number } } | null>(null);\n\n  const stateRefs = useRef({ notes, shapes, connectors, strokes, viewport });\n  useEffect(() => { stateRefs.current = { notes, shapes, connectors, strokes, viewport }; }, [notes, shapes, connectors, strokes, viewport]);\n\n  // MCP server + bridge\n  const serverRef = useRef<MicroMcpServer | null>(null);\n  const inProcRef = useRef<InProcessTransport | null>(null);\n  const bridgeRef = useRef<Bridge | null>(null);\n\n  useEffect(() => {\n    const server = new MicroMcpServer({\n      info: { name: \"shared-whiteboard\", version: \"0.2.0\" },\n      instructions: \"Collaborative whiteboard. Use whiteboard_* tools to read or modify the board.\",\n    });\n    bridgeRef.current = registerWhiteboardBridge(server, {\n      adapter: {\n        getNotes: () => stateRefs.current.notes,\n        setNotes: (next) => setNotes(typeof next === \"function\" ? next : () => next),\n        getShapes: () => stateRefs.current.shapes,\n        setShapes: (next) => setShapes(typeof next === \"function\" ? next : () => next),\n        getConnectors: () => stateRefs.current.connectors,\n        setConnectors: (next) => setConnectors(typeof next === \"function\" ? next : () => next),\n        getStrokes: () => stateRefs.current.strokes,\n        setStrokes: (next) => setStrokes(typeof next === \"function\" ? next : () => next),\n        getViewport: () => stateRefs.current.viewport,\n        setViewport,\n        setAgentCursor,\n      },\n      agent,\n    });\n    inProcRef.current = attachInProcess(server);\n    serverRef.current = server;\n\n    // Pulse a highlight whenever a tool call returns a structured id.\n    const off = inProcRef.current.onServerMessage((msg: any) => {\n      if (msg?.id !== undefined && \"result\" in msg && msg.result?.structuredContent?.id) {\n        const id = msg.result.structuredContent.id;\n        requestAnimationFrame(() => pulseFor(id));\n      }\n    });\n    return () => {\n      off();\n      bridgeRef.current?.dispose();\n      bridgeRef.current = null;\n      if (inProcRef.current) server.detach(inProcRef.current);\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  const pulseFor = (id: string) => {\n    const n = stateRefs.current.notes.find((x) => x.id === id);\n    if (n) return setHighlight({ pulseKey: Date.now(), bounds: { x: n.x, y: n.y, width: n.width, height: n.height } });\n    const s = stateRefs.current.shapes.find((x) => x.id === id);\n    if (s) return setHighlight({ pulseKey: Date.now(), bounds: { x: s.x, y: s.y, width: s.width, height: s.height } });\n  };\n\n  const log = useCallback((entry: Omit<AgentActivity, \"id\" | \"at\">) => {\n    setActivity((all) => [...all.slice(-200), { id: `a_${Date.now()}_${all.length}`, at: Date.now(), ...entry }]);\n  }, []);\n\n  // Sharing\n  const [session, setSession] = useState<SessionDescriptor | null>(null);\n  const [relayState, setRelayState] = useState<RelayState>(\"idle\");\n  const sseRef = useRef<SseRelayTransport | null>(null);\n  const logEsRef = useRef<EventSource | null>(null);\n\n  const startShare = async () => {\n    if (session || !serverRef.current || !shareBaseUrl) return;\n    const desc = createSessionDescriptor();\n\n    try {\n      if (onRegisterSession) {\n        await onRegisterSession(desc);\n      } else {\n        const csrf = (document.querySelector('meta[name=\"csrf-token\"]') as HTMLMetaElement | null)?.content ?? \"\";\n        const reg = await fetch(`${shareBaseUrl}/register`, {\n          method: \"POST\",\n          headers: { \"content-type\": \"application/json\", \"x-csrf-token\": csrf, accept: \"application/json\" },\n          body: JSON.stringify({ session: desc.id, token: desc.token }),\n        });\n        if (!reg.ok) throw new Error(`registration failed (HTTP ${reg.status})`);\n      }\n    } catch (e) {\n      log({ kind: \"error\", source: \"share\", text: e instanceof Error ? e.message : String(e) });\n      return;\n    }\n\n    const relay = attachSseRelay(serverRef.current, {\n      baseUrl: shareBaseUrl,\n      sessionId: desc.id,\n      token: desc.token,\n    });\n    sseRef.current = relay;\n    relay.onStateChange(setRelayState);\n\n    // Activity log mirror — does NOT call deliverFromRemote (relay does it).\n    const es = new EventSource(`${shareBaseUrl}/${desc.id}/events?token=${desc.token}&direction=inbound`);\n    es.addEventListener(\"mcp\", (ev: MessageEvent) => {\n      try {\n        const frame = JSON.parse(ev.data);\n        if (frame.method === \"notifications/peer_joined\") {\n          // External agent just opened an outbound subscription. Surface it\n          // so the human can see \"an agent is connecting\" before any tools\n          // arrive. The agent itself should follow up with set_agent_cursor\n          // immediately, but in case it doesn't, drop a placeholder cursor\n          // at the canvas origin so presence is visible right away.\n          setAgentCursor((c) => c ?? { userId: agent.id, name: agent.name, color: agent.color, x: 60, y: 60 });\n          log({ kind: \"info\", source: \"presence\", text: `${agent.name ?? \"Agent\"} connected` });\n          return;\n        }\n        if (frame.method === \"notifications/peer_left\") {\n          setAgentCursor(null);\n          log({ kind: \"info\", source: \"presence\", text: `${agent.name ?? \"Agent\"} disconnected` });\n          return;\n        }\n        if (frame.method === \"notifications/agent_message\") {\n          log({ kind: \"message\", source: agent.name ?? \"Agent\", text: String(frame.params?.text ?? \"\") });\n        } else if (frame.method === \"notifications/agent_status\") {\n          log({ kind: \"info\", source: agent.name ?? \"Agent\", text: String(frame.params?.text ?? \"\") });\n        } else if (frame.method?.startsWith(\"notifications/\")) {\n          // ignore other notifications in the feed\n        } else {\n          log({ kind: \"tool\", source: \"remote\", text: `← ${frame.method ?? `id:${frame.id}`}`, detail: frame });\n        }\n      } catch {\n        /* noop */\n      }\n    });\n    logEsRef.current = es;\n\n    setSession(desc);\n    log({ kind: \"info\", source: \"share\", text: `Sharing started · session ${desc.id}` });\n  };\n\n  const stopShare = async () => {\n    if (!session) return;\n    const desc = session;\n    setSession(null);\n    logEsRef.current?.close();\n    logEsRef.current = null;\n    if (sseRef.current && serverRef.current) serverRef.current.detach(sseRef.current);\n    sseRef.current = null;\n    setRelayState(\"closed\");\n    if (shareBaseUrl) {\n      const csrf = (document.querySelector('meta[name=\"csrf-token\"]') as HTMLMetaElement | null)?.content ?? \"\";\n      await fetch(`${shareBaseUrl}/${desc.id}/unregister?token=${encodeURIComponent(desc.token)}`, {\n        method: \"POST\",\n        headers: { \"x-csrf-token\": csrf, accept: \"application/json\" },\n      }).catch(() => {});\n    }\n    log({ kind: \"info\", source: \"share\", text: \"Sharing stopped.\" });\n  };\n\n  // Outbound state broadcast — every state change pushes a notification on\n  // the relay (capped to ~12 Hz) so external agents see human edits live.\n  const lastBroadcastRef = useRef(0);\n  useEffect(() => {\n    if (!broadcastEdits || !sseRef.current || !session) return;\n    const now = Date.now();\n    if (now - lastBroadcastRef.current < 80) return;\n    lastBroadcastRef.current = now;\n    sseRef.current.send({\n      jsonrpc: \"2.0\",\n      method: \"notifications/state_update\",\n      params: { notes, shapes, connectors, viewport, ts: now },\n    });\n  }, [notes, shapes, connectors, viewport, session, broadcastEdits]);\n\n  const handleSubmit = (text: string) => {\n    if (!sseRef.current) {\n      log({ kind: \"error\", source: \"you\", text: \"Start a shared session first.\" });\n      return;\n    }\n    sseRef.current.send({\n      jsonrpc: \"2.0\",\n      method: \"notifications/user_message\",\n      params: { text, ts: Date.now() },\n    });\n    log({ kind: \"message\", source: \"You\", text });\n  };\n\n  // The agent cursor is rendered by <AgentCursor> below — keep it OUT of\n  // the cursors array so we don't double-render it via CursorLayer.\n  // (CursorLayer is reserved for human participants once relay sync lands.)\n  const cursors: RemoteCursor[] = useMemo(() => [], []);\n  const statusText = (() => {\n    switch (relayState) {\n      case \"open\": return \"live\";\n      case \"connecting\": return \"connecting…\";\n      case \"error\": return \"error\";\n      case \"closed\": return \"closed\";\n      default: return undefined;\n    }\n  })();\n\n  return (\n    <div className={[\"fai-shared-whiteboard\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n      {header}\n      {showShareControls && shareBaseUrl !== null && (\n        <div className=\"fai-shared-whiteboard__controls\">\n          <ShareControls session={session} onStart={startShare} onStop={stopShare} status={statusText} />\n        </div>\n      )}\n      <div\n        className=\"fai-shared-whiteboard__layout\"\n        style={{\n          display: \"grid\",\n          gap: 16,\n          gridTemplateColumns: showAgentPanel ? \"1fr 360px\" : \"1fr\",\n        }}\n      >\n        <div\n          className=\"fai-shared-whiteboard__board\"\n          style={{\n            position: \"relative\",\n            overflow: \"hidden\",\n            borderRadius: 12,\n            border: \"1px solid #e4e4e7\",\n            background:\n              \"radial-gradient(circle at 1px 1px, rgba(0,0,0,0.07) 1px, transparent 0)\",\n            backgroundSize: \"20px 20px\",\n            height,\n          }}\n        >\n          <Board viewport={viewport} onViewportChange={setViewport} style={{ width: \"100%\", height: \"100%\" }}>\n            {connectors.map((c) => {\n              const a = resolveCenter(c.from, notes, shapes);\n              const b = resolveCenter(c.to, notes, shapes);\n              if (!a || !b) return null;\n              return <Connector key={c.id} from={a} to={b} color={c.color ?? \"#64748b\"} />;\n            })}\n            {shapes.map((s) => (\n              <Shape key={s.id} item={s} onChange={(next) => setShapes((all) => all.map((x) => (x.id === next.id ? next : x)))} />\n            ))}\n            {notes.map((n) => (\n              <StickyNote key={n.id} item={n} onChange={(next) => setNotes((all) => all.map((x) => (x.id === next.id ? next : x)))} />\n            ))}\n            <CursorLayer cursors={cursors} />\n            {agentCursor && (\n              <AgentCursor x={agentCursor.x} y={agentCursor.y} name={agentCursor.name} color={agentCursor.color} />\n            )}\n            {highlight && (\n              <AgentActivityHighlight\n                x={highlight.bounds.x}\n                y={highlight.bounds.y}\n                width={highlight.bounds.width}\n                height={highlight.bounds.height}\n                color={agent.color ?? \"#a855f7\"}\n                pulseKey={highlight.pulseKey}\n              />\n            )}\n          </Board>\n        </div>\n        {showAgentPanel && (\n          <div style={{ height }}>\n            <AgentPanel\n              agent={agent}\n              activity={activity}\n              onSubmit={handleSubmit}\n            />\n          </div>\n        )}\n      </div>\n    </div>\n  );\n}\n\nfunction resolveCenter(\n  ref: ConnectorItem[\"from\"],\n  notes: StickyNoteItem[],\n  shapes: ShapeItem[],\n): { x: number; y: number } | null {\n  if (typeof ref === \"string\") {\n    const n = notes.find((x) => x.id === ref);\n    if (n) return { x: n.x + n.width / 2, y: n.y + n.height / 2 };\n    const s = shapes.find((x) => x.id === ref);\n    if (s) return { x: s.x + s.width / 2, y: s.y + s.height / 2 };\n    return null;\n  }\n  return ref;\n}\n\n// Internal-import safety\ntype _UseTransport = Transport;\n"]}