{"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/mcp/transports/relay.ts","../src/human-plus/events.ts","../src/presence/index.ts","../src/presence/wrap-tool-with-activity.ts","../src/presence/use-agent-activity.ts","../src/bridges/tui.ts","../src/undo/undo-tools.ts","../src/bridges/forms.ts","../src/bridges/sheets.ts","../src/sheets-adapter.ts","../src/bridges/code.ts","../src/bridges/charts.ts","../src/bridges/grid.ts","../src/bridges/scene.ts","../src/bridges/screens.ts","../src/bridges/slides.ts","../src/bridges/map.ts","../src/bridges/git.ts","../src/bridges/files.ts","../src/bridges/terminal.ts","../src/bridges/navigation.ts","../src/bridges/catalog.ts","../src/bridges/features.ts","../src/bridges/passkeys.ts","../src/bridges/doc.ts","../src/bridges/cms.ts","../src/bridges/screen-doc.ts","../src/sharing/token.ts","../src/sharing/sse-relay.ts","../src/sharing/use-co-browse-session.ts","../src/sharing/bridge-contributions.ts","../src/components/AgentPanel/AgentPanel.tsx","../src/components/AgentCursor/AgentCursor.tsx","../src/components/AgentActivityHighlight/AgentActivityHighlight.tsx","../src/components/BridgedForm/BridgedForm.tsx","../src/components/ScreensActivityBridge/ScreensActivityBridge.tsx","../src/components/ShareControls/ShareControls.tsx","../src/connectors/targets.ts","../src/connectors/glyphs.tsx","../src/connectors/ConnectorButtons.tsx","../src/components/CoBrowsePresence/CoBrowsePresence.tsx","../src/components/CoBrowseCursorLayer/CoBrowseCursorLayer.tsx","../src/components/SimulateUsersButton/SimulateUsersButton.tsx","../src/heuristics/sink.ts","../src/undo/use-undo-stack.ts","../src/connectors/mcpb.ts"],"names":["emitActivity","onActivity","readActivityHistory","resetActivityRegistry","useState","useEffect","undoOne","redoOne","readHistory","DEFAULT_AGENT","useRef","useCallback","useMemo","pushUndoEntry","commit","newId","num","str","mutation","p","treeReducer","autoApply","childrenOf","appendOrder","descendantsOf","jsxs","jsx","useId","LIFECYCLE_ACTIONS","createPortal","ev","randomId"],"mappings":"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","file":"index.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","import type { JsonRpcMessage } from \"../types\";\nimport type { MicroMcpServer, Transport } from \"../server\";\n\n/**\n * RelayTransport — wraps any duplex JSON-frame channel (e.g. a Reverb\n * websocket private channel, a WebRTC data channel) so external agents\n * can talk to a browser-side MicroMcpServer.\n *\n * The host app owns the actual channel. This class only handles framing\n * (JSON.stringify / JSON.parse) and the server contract.\n *\n * Channel contract:\n *   - host calls `transport.deliverFromRemote(payload)` with each frame\n *     it receives from the remote agent\n *   - host implements `sendToRemote(frame)` so the transport can deliver\n *     server → client frames outward\n *\n * See docs/relay-protocol.md for the wire format.\n */\nexport type RelayChannel = {\n  sendToRemote: (frame: JsonRpcMessage) => void;\n  /** Optional: notify the channel that the server is gone. */\n  onClose?: () => void;\n};\n\nexport class RelayTransport implements Transport {\n  private server?: MicroMcpServer;\n  constructor(private channel: RelayChannel) {}\n\n  bindServer(server: MicroMcpServer): void {\n    this.server = server;\n  }\n\n  send(message: JsonRpcMessage): void {\n    this.channel.sendToRemote(message);\n  }\n\n  /**\n   * Host calls this with each frame received from the remote agent. Accepts\n   * either a parsed object or a raw JSON string.\n   */\n  async deliverFromRemote(payload: JsonRpcMessage | string): Promise<void> {\n    if (!this.server) throw new Error(\"RelayTransport has no bound server\");\n    const message = typeof payload === \"string\"\n      ? (JSON.parse(payload) as JsonRpcMessage)\n      : payload;\n    await this.server.receive(this, message);\n  }\n\n  close(): void {\n    this.channel.onClose?.();\n  }\n}\n\n/**\n * Convenience wiring. Returns the bound transport.\n */\nexport function attachRelay(server: MicroMcpServer, channel: RelayChannel): RelayTransport {\n  const transport = new RelayTransport(channel);\n  transport.bindServer(server);\n  server.attach(transport);\n  return transport;\n}\n","export type HumanPlusActor = { kind: \"human\" | \"agent\" | \"system\"; id: string; name?: string };\nexport type HumanPlusPriority = \"background\" | \"normal\" | \"attention\" | \"blocking\";\nexport type HumanPlusDisposition = \"seen\" | \"handled\" | \"rejected\" | \"ignored\";\n\nexport interface HumanPlusEvent<T = unknown> {\n  id: string;\n  sequence: number;\n  timestamp: number;\n  appId: string;\n  surfaceId: string;\n  sessionId?: string;\n  type: string;\n  payload: T;\n  actor: HumanPlusActor;\n  priority: HumanPlusPriority;\n  correlationId?: string;\n  causationId?: string;\n}\nexport type NewHumanPlusEvent<T = unknown> = Omit<HumanPlusEvent<T>, \"id\" | \"sequence\" | \"timestamp\"> & Partial<Pick<HumanPlusEvent<T>, \"id\" | \"timestamp\">>;\nexport interface HumanPlusEventQuery { consumerId: string; after?: number; limit?: number; unacknowledgedOnly?: boolean; types?: string[]; surfaces?: string[]; }\nexport interface HumanPlusEventPage { events: HumanPlusEvent[]; nextCursor: number; }\nexport type HumanPlusEventListener = (event: HumanPlusEvent) => void;\n\nexport interface HumanPlusEventStore {\n  append(event: NewHumanPlusEvent): Promise<HumanPlusEvent>;\n  list(query: HumanPlusEventQuery): Promise<HumanPlusEventPage>;\n  acknowledge(consumerId: string, eventIds: string[], disposition: HumanPlusDisposition): Promise<void>;\n  subscribe(listener: HumanPlusEventListener): () => void;\n  compact?(options?: { before?: number; keepLast?: number }): Promise<void>;\n}\n\nexport class MemoryHumanPlusEventStore implements HumanPlusEventStore {\n  protected events: HumanPlusEvent[] = [];\n  protected acknowledgements = new Map<string, Map<string, HumanPlusDisposition>>();\n  protected listeners = new Set<HumanPlusEventListener>();\n  protected nextSequence = 1;\n\n  async append(input: NewHumanPlusEvent): Promise<HumanPlusEvent> {\n    const event: HumanPlusEvent = { ...input, id: input.id ?? globalThis.crypto.randomUUID(), timestamp: input.timestamp ?? Date.now(), sequence: this.nextSequence++ };\n    this.events.push(event); this.listeners.forEach((listener) => listener(event)); return event;\n  }\n  async list(query: HumanPlusEventQuery): Promise<HumanPlusEventPage> {\n    const acknowledged = this.acknowledgements.get(query.consumerId);\n    const events = this.events.filter((event) => event.sequence > (query.after ?? 0)\n      && (!query.unacknowledgedOnly || !acknowledged?.has(event.id))\n      && (!query.types?.length || query.types.includes(event.type))\n      && (!query.surfaces?.length || query.surfaces.includes(event.surfaceId)))\n      .slice(0, Math.max(1, Math.min(500, query.limit ?? 50)));\n    return { events, nextCursor: events.at(-1)?.sequence ?? query.after ?? 0 };\n  }\n  async acknowledge(consumerId: string, eventIds: string[], disposition: HumanPlusDisposition): Promise<void> {\n    let values = this.acknowledgements.get(consumerId); if (!values) { values = new Map(); this.acknowledgements.set(consumerId, values); }\n    eventIds.forEach((id) => values!.set(id, disposition));\n  }\n  subscribe(listener: HumanPlusEventListener): () => void { this.listeners.add(listener); return () => this.listeners.delete(listener); }\n  async compact(options: { before?: number; keepLast?: number } = {}): Promise<void> {\n    const cutoff = options.before ?? Number.POSITIVE_INFINITY; const keep = options.keepLast ?? 1000;\n    const removable = Math.max(0, this.events.length - keep);\n    this.events = this.events.filter((event, index) => index >= removable || event.timestamp >= cutoff);\n    const ids = new Set(this.events.map((event) => event.id));\n    for (const values of this.acknowledgements.values()) for (const id of values.keys()) if (!ids.has(id)) values.delete(id);\n  }\n}\n","export type {\n  AgentActivityEvent,\n  AgentActivityListener,\n  AgentTarget,\n  AgentTargetKind,\n  ActivityFilter,\n} from \"./types\";\nexport {\n  emitActivity,\n  onActivity,\n  readActivityHistory,\n  resetActivityRegistry,\n} from \"./registry\";\nexport {\n  wrapToolWithActivity,\n  type ActivityAgent,\n  type ActivityResolverContext,\n  type ActivityTargetResolver,\n  type ToolHandler,\n} from \"./wrap-tool-with-activity\";\nexport {\n  useAgentActivity,\n  useAgentActivityForScreen,\n} from \"./use-agent-activity\";\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 { useEffect, useState } from \"react\";\nimport { onActivity, readActivityHistory } from \"./registry\";\nimport type { ActivityFilter, AgentActivityEvent } from \"./types\";\n\n/**\n * useAgentActivity — React subscription to the in-process activity stream.\n *\n * Returns:\n *   - `events`: capped scrollback of recent events matching the filter\n *   - `latest`: the most recent event (handy for transient highlights)\n */\nexport function useAgentActivity(\n  filter?: ActivityFilter,\n  options: { capacity?: number } = {},\n): { events: AgentActivityEvent[]; latest: AgentActivityEvent | null } {\n  const cap = options.capacity ?? 50;\n  const [events, setEvents] = useState<AgentActivityEvent[]>(() => readActivityHistory(filter).slice(-cap));\n\n  useEffect(() => {\n    setEvents(readActivityHistory(filter).slice(-cap));\n    return onActivity((event) => {\n      setEvents((prev) => {\n        const next = prev.length >= cap ? prev.slice(prev.length - cap + 1) : prev.slice();\n        next.push(event);\n        return next;\n      });\n    }, filter);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [filter?.agentId, filter?.screenId, filter?.kind, cap]);\n\n  return { events, latest: events.length > 0 ? events[events.length - 1] : null };\n}\n\n/**\n * useAgentActivityForScreen — convenience wrapper that filters by screen id.\n * Drives \"agent is here\" badges in fancy-screens-based shells.\n */\nexport function useAgentActivityForScreen(\n  screenId: string,\n  options: { capacity?: number } = {},\n): { events: AgentActivityEvent[]; latest: AgentActivityEvent | null; isAgentActive: boolean } {\n  const { events, latest } = useAgentActivity({ screenId }, options);\n  const fadeAfter = latest?.ttlMs ?? 1500;\n  const [isAgentActive, setActive] = useState(false);\n\n  useEffect(() => {\n    if (!latest) {\n      setActive(false);\n      return;\n    }\n    setActive(true);\n    const timer = setTimeout(() => setActive(false), fadeAfter);\n    return () => clearTimeout(timer);\n  }, [latest, fadeAfter]);\n\n  return { events, latest, isAgentActive };\n}\n","import { emitActivity } from \"../presence\";\nimport { errorResult, textResult, type MicroMcpServer, type Transport } from \"../mcp/server\";\nimport type { JsonObject, ToolCallContext } from \"../mcp/types\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { HumanPlusActor, HumanPlusEventStore, HumanPlusPriority } from \"../human-plus/events\";\n\nexport type TuiActionPolicy = \"observe\" | \"execute\" | \"propose\" | \"confirm\" | \"human-only\";\nexport interface TuiSurfaceCommandLike { name: string; description?: string; policy?: TuiActionPolicy; inputSchema?: Record<string, unknown>; invoke(input?: Record<string, unknown>): unknown | Promise<unknown>; }\nexport interface TuiSurfaceLike { id: string; kind: string; label?: string; read(): unknown; commands?: TuiSurfaceCommandLike[]; }\nexport interface TuiSurfaceRegistryLike { list(): TuiSurfaceLike[]; get(id: string): TuiSurfaceLike | undefined; }\nexport interface TuiBridgeOptions {\n  registry: TuiSurfaceRegistryLike;\n  eventStore: HumanPlusEventStore;\n  appId: string;\n  sessionId?: string;\n  actor?: HumanPlusActor;\n}\n\ntype Subscription = { consumerId: string; types?: string[]; surfaces?: string[] };\ntype PendingAction = { id: string; surfaceId: string; command: string; input: Record<string, unknown>; actor: HumanPlusActor };\n\nexport function registerTuiBridge(host: ToolHost, options: TuiBridgeOptions) {\n  const disposers: Array<() => void> = []; const subscriptions = new Map<unknown, Subscription>(); const pending = new Map<string, PendingAction>();\n  const defaultActor = options.actor ?? { kind: \"agent\" as const, id: \"agent\", name: \"Agent\" };\n  const serverCapabilities = (host as ToolHost & { capabilities?: { experimental?: Record<string, unknown> } }).capabilities;\n  if (serverCapabilities) serverCapabilities.experimental = { ...serverCapabilities.experimental, \"io.particle-academy/human-plus\": { version: \"1\", push: true, durableCursor: true, stagedActions: true, wakesAgent: false } };\n  const register = (name: string, description: string, properties: Record<string, unknown>, required: string[], handler: (args: JsonObject, context?: ToolCallContext) => unknown | Promise<unknown>) => {\n    disposers.push(host.registerTool({ name, description, inputSchema: { type: \"object\", properties: properties as never, required } }, async (args, context) => {\n      try { const result = await handler(args, context); return textResult(typeof result === \"string\" ? result : JSON.stringify(result), result); }\n      catch (error) { return errorResult(error instanceof Error ? error.message : String(error)); }\n    }, { owner: \"tui\" }));\n  };\n  const publish = async (surfaceId: string, type: string, payload: unknown, actor = defaultActor, priority: HumanPlusPriority = \"normal\") => options.eventStore.append({ appId: options.appId, sessionId: options.sessionId, surfaceId, type, payload, actor, priority });\n\n  register(\"tui_surfaces_list\", \"List addressable Fancy TUI surfaces and commands.\", {}, [], () => options.registry.list().map((surface) => ({ id: surface.id, kind: surface.kind, label: surface.label, commands: surface.commands?.map((command) => ({ name: command.name, description: command.description, policy: command.policy ?? \"execute\", inputSchema: command.inputSchema })) ?? [] })));\n  register(\"tui_surface_read\", \"Read a Fancy TUI surface by stable id.\", { id: { type: \"string\" } }, [\"id\"], (args) => {\n    const surface = options.registry.get(String(args.id)); if (!surface) throw new Error(`Unknown TUI surface: ${String(args.id)}`); return { id: surface.id, kind: surface.kind, state: surface.read() };\n  });\n  register(\"tui_action_invoke\", \"Invoke or propose an action on a Fancy TUI surface.\", { surfaceId: { type: \"string\" }, command: { type: \"string\" }, input: { type: \"object\" } }, [\"surfaceId\", \"command\"], async (args) => {\n    const surfaceId = String(args.surfaceId); const commandName = String(args.command); const surface = options.registry.get(surfaceId); if (!surface) throw new Error(`Unknown TUI surface: ${surfaceId}`);\n    const command = surface.commands?.find((value) => value.name === commandName); if (!command) throw new Error(`Unknown command '${commandName}' on ${surfaceId}`);\n    const policy = command.policy ?? \"execute\"; if (policy === \"observe\" || policy === \"human-only\") throw new Error(`Action ${surfaceId}.${commandName} is ${policy}`);\n    const input = (args.input && typeof args.input === \"object\" && !Array.isArray(args.input) ? args.input : {}) as Record<string, unknown>;\n    if (policy === \"propose\" || policy === \"confirm\") {\n      const id = globalThis.crypto.randomUUID(); pending.set(id, { id, surfaceId, command: commandName, input, actor: defaultActor });\n      await publish(surfaceId, \"action.proposed\", { id, command: commandName, input }, defaultActor, \"attention\"); return { pending: true, id };\n    }\n    const result = await command.invoke(input); await publish(surfaceId, \"action.executed\", { command: commandName, input, result });\n    emitActivity({ agentId: defaultActor.id, agentName: defaultActor.name, target: { kind: \"custom\", elementId: surfaceId }, action: `tui_${commandName}`, timestamp: Date.now(), meta: { surfaceId } });\n    return { executed: true, result };\n  });\n  register(\"tui_action_confirm\", \"Confirm and execute a pending TUI action.\", { id: { type: \"string\" } }, [\"id\"], async (args) => {\n    const id = String(args.id); const value = pending.get(id); if (!value) throw new Error(`Unknown pending action: ${id}`); const surface = options.registry.get(value.surfaceId); const command = surface?.commands?.find((x) => x.name === value.command); if (!command) throw new Error(\"Pending action target is no longer available\");\n    pending.delete(id); const result = await command.invoke(value.input); await publish(value.surfaceId, \"action.confirmed\", { id, command: value.command, result }, { kind: \"human\", id: \"human\" }); return { executed: true, result };\n  });\n  register(\"tui_action_reject\", \"Reject a pending TUI action.\", { id: { type: \"string\" } }, [\"id\"], async (args) => { const id = String(args.id); const value = pending.get(id); if (!value) throw new Error(`Unknown pending action: ${id}`); pending.delete(id); await publish(value.surfaceId, \"action.rejected\", { id, command: value.command }, { kind: \"human\", id: \"human\" }); return { rejected: true }; });\n  register(\"human_plus_events_list\", \"Pull durable Human+ events for a consumer.\", { consumerId: { type: \"string\" }, after: { type: \"number\" }, limit: { type: \"number\" }, unacknowledgedOnly: { type: \"boolean\" } }, [\"consumerId\"], (args) => options.eventStore.list({ consumerId: String(args.consumerId), after: typeof args.after === \"number\" ? args.after : undefined, limit: typeof args.limit === \"number\" ? args.limit : undefined, unacknowledgedOnly: args.unacknowledgedOnly === true }));\n  register(\"human_plus_events_ack\", \"Acknowledge durable Human+ events.\", { consumerId: { type: \"string\" }, eventIds: { type: \"array\", items: { type: \"string\" } }, disposition: { type: \"string\" } }, [\"consumerId\", \"eventIds\"], async (args) => { const ids = Array.isArray(args.eventIds) ? args.eventIds.map(String) : []; await options.eventStore.acknowledge(String(args.consumerId), ids, [\"seen\", \"handled\", \"rejected\", \"ignored\"].includes(String(args.disposition)) ? String(args.disposition) as any : \"handled\"); return { acknowledged: ids.length }; });\n  register(\"human_plus_events_subscribe\", \"Push matching Human+ events on this MCP transport while retaining them in the inbox.\", { consumerId: { type: \"string\" }, types: { type: \"array\" }, surfaces: { type: \"array\" } }, [\"consumerId\"], (args, context) => { if (!context?.transport) throw new Error(\"Subscriptions require an attached MCP transport\"); subscriptions.set(context.transport, { consumerId: String(args.consumerId), types: Array.isArray(args.types) ? args.types.map(String) : undefined, surfaces: Array.isArray(args.surfaces) ? args.surfaces.map(String) : undefined }); return { subscribed: true, delivery: \"at-least-once\", wakesAgent: false }; });\n\n  const unsubscribeStore = options.eventStore.subscribe((event) => {\n    const server = host as ToolHost & Pick<MicroMcpServer, \"notify\">;\n    if (typeof server.notify !== \"function\") return;\n    for (const [transport, subscription] of subscriptions) {\n      if (subscription.types?.length && !subscription.types.includes(event.type)) continue;\n      if (subscription.surfaces?.length && !subscription.surfaces.includes(event.surfaceId)) continue;\n      server.notify({ jsonrpc: \"2.0\", method: \"notifications/human_plus/event\", params: event as never }, transport as Transport);\n    }\n  });\n  return { id: \"tui\", title: \"Fancy TUI\", pending: () => [...pending.values()], dispose: () => { disposers.forEach((dispose) => dispose()); unsubscribeStore(); subscriptions.clear(); pending.clear(); } };\n}\n","import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport { readHistory, redoOne, undoOne } from \"./undo-stack\";\n\nexport type UndoToolsOptions = {\n  /** Default agent id when the caller doesn't pass one. */\n  defaultAgentId?: string;\n};\n\n/**\n * Idempotent tracker so multiple bridges on the same server only register\n * agent_undo / agent_redo / agent_history once.\n */\nconst installedHosts = new WeakSet<ToolHost>();\n\n/**\n * The one owner every copy of the undo tools registers under. They are SHARED\n * on purpose — every bridge ensures them, and a host may also call\n * `registerUndoTools` itself — so all of those are the same registrant, and a\n * second registration replaces the first instead of being refused as a\n * collision. Anything else claiming `agent_undo` is still refused.\n */\nconst UNDO_TOOLS_OWNER = \"agent-undo\";\n\n/**\n * ensureUndoToolsRegistered — bridges call this on construction. Safe to\n * call repeatedly with the same server; subsequent calls are no-ops.\n */\nexport function ensureUndoToolsRegistered(host: ToolHost, options: UndoToolsOptions = {}): void {\n  if (installedHosts.has(host)) return;\n  installedHosts.add(host);\n  registerUndoTools(host, options);\n}\n\n/**\n * registerUndoTools — add agent_undo / agent_redo / agent_history to the\n * server. Returns a disposer that unregisters all three.\n */\nexport function registerUndoTools(host: ToolHost, options: UndoToolsOptions = {}): () => void {\n  const defaultAgent = options.defaultAgentId ?? \"agent\";\n  const disposers: Array<() => void> = [];\n  const agentOf = (args: any): string =>\n    typeof args?.agentId === \"string\" ? args.agentId : defaultAgent;\n\n  disposers.push(\n    host.registerTool(\n      {\n        name: \"agent_undo\",\n        description: \"Undo the most recent action on the agent's stack. Optional agentId targets a specific agent.\",\n        inputSchema: {\n          type: \"object\",\n          properties: { agentId: { type: \"string\" } },\n          additionalProperties: false,\n        },\n      },\n      async (args) => {\n        const entry = await undoOne(agentOf(args));\n        if (!entry) return errorResult(\"Nothing to undo.\");\n        return textResult(`Undid: ${entry.label}`, { entry: serialize(entry) });\n      },\n      { owner: UNDO_TOOLS_OWNER },\n    ),\n  );\n\n  disposers.push(\n    host.registerTool(\n      {\n        name: \"agent_redo\",\n        description: \"Redo the most recently undone action.\",\n        inputSchema: {\n          type: \"object\",\n          properties: { agentId: { type: \"string\" } },\n          additionalProperties: false,\n        },\n      },\n      async (args) => {\n        const entry = await redoOne(agentOf(args));\n        if (!entry) return errorResult(\"Nothing to redo.\");\n        return textResult(`Redid: ${entry.label}`, { entry: serialize(entry) });\n      },\n      { owner: UNDO_TOOLS_OWNER },\n    ),\n  );\n\n  disposers.push(\n    host.registerTool(\n      {\n        name: \"agent_history\",\n        description: \"List the agent's undo stack (oldest first). Useful for understanding what's reversible.\",\n        inputSchema: {\n          type: \"object\",\n          properties: { agentId: { type: \"string\" } },\n          additionalProperties: false,\n        },\n      },\n      async (args) => {\n        const history = readHistory(agentOf(args)).map(serialize);\n        const text = history.map((e) => `${new Date(e.timestamp).toISOString()} ${e.bridgeId} ${e.action}: ${e.label}`).join(\"\\n\");\n        return textResult(text || \"(empty)\", history);\n      },\n      { owner: UNDO_TOOLS_OWNER },\n    ),\n  );\n\n  return () => disposers.forEach((d) => d());\n}\n\nfunction serialize(entry: import(\"./undo-stack\").UndoEntry) {\n  return {\n    timestamp: entry.timestamp,\n    bridgeId: entry.bridgeId,\n    action: entry.action,\n    label: entry.label,\n  };\n}\n","import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\nimport type { AgentTarget } from \"../presence/types\";\n\n/**\n * Field descriptor — what the host says about each form field. Mirrors the\n * subset of HTML / react-fancy input shapes agents care about.\n */\nexport type FormFieldDescriptor = {\n  /** Form-local field name. Matches the key the host uses in its values map. */\n  name: string;\n  /** Display label. */\n  label?: string;\n  /** Logical type. Drives validation + agent expectations. */\n  type:\n    | \"text\"\n    | \"textarea\"\n    | \"number\"\n    | \"email\"\n    | \"password\"\n    | \"url\"\n    | \"date\"\n    | \"select\"\n    | \"multi-select\"\n    | \"checkbox\"\n    | \"switch\"\n    | \"radio\"\n    | \"file\"\n    | \"json\";\n  /** Allowed values for select / radio. */\n  options?: Array<{ value: string; label: string }>;\n  /** Whether the field must be filled before submit. */\n  required?: boolean;\n  /** Free-text hint surfaced to the agent. */\n  description?: string;\n  /** Default value (presented in get_value when nothing set). */\n  defaultValue?: unknown;\n};\n\n/**\n * Adapter the host wires per form. Matches the controlled-state pattern\n * react-fancy already uses (`value` / `onValueChange`); this adapter just\n * exposes those state slots in a form-shaped way the bridge can call.\n */\nexport type FormBridgeAdapter = {\n  /** Stable id for the form (used in form_describe + presence target). */\n  id: string;\n  /** Display title for human-readable logs. */\n  title?: string;\n  /** Optional fancy-screens screen id this form belongs to. */\n  screenId?: string;\n  /** Field descriptors. The bridge uses these for schema introspection\n   *  (form_describe). Agents call this first to know what to fill. */\n  getFields: () => FormFieldDescriptor[];\n  /** Read a single field's current value. */\n  getValue: (name: string) => unknown;\n  /** Read all values as { fieldName: value }. */\n  getValues: () => Record<string, unknown>;\n  /** Set a single field's value. The host wires this to its setState. */\n  setValue: (name: string, value: unknown) => void;\n  /** Set many at once. Defaults to calling setValue in a loop. */\n  setValues?: (values: Record<string, unknown>) => void;\n  /** Programmatically focus a field (host implements DOM focus). Optional. */\n  focus?: (name: string) => void;\n  /** Submit the form. Returns the values that were submitted (or rejection). */\n  submit?: () => Promise<{ ok: boolean; values?: Record<string, unknown>; error?: string }>;\n  /**\n   * Human confirm gate for `form_submit` (trust-but-verify). When `pendingMode`\n   * is on, the bridge calls this before submitting; return false to decline.\n   * Wire it to a human control — submitting a form is a human-visible,\n   * often-destructive action (checkout, delete, invite).\n   */\n  confirm?: (request: FormConfirmRequest) => Promise<boolean> | boolean;\n};\n\n/** What a `form_submit` confirm gate is asked to approve. */\nexport type FormConfirmRequest = {\n  action: \"submit\";\n  form: string;\n  title?: string;\n  values: Record<string, unknown>;\n};\n\nexport type FormBridgeOptions = {\n  adapter: FormBridgeAdapter;\n  /** Identity tagged into activity events. */\n  agent?: { id: string; name?: string; color?: string };\n  /**\n   * Stage `form_submit` for human confirmation via `adapter.confirm` instead of\n   * submitting immediately. **Default: ON** (matches the navigation bridge and\n   * the Human+ trust-but-verify contract). Set false only when auto-submit is\n   * safe. If on without an `adapter.confirm`, submit proceeds (nothing to gate).\n   */\n  pendingMode?: boolean;\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * registerFormBridge — wires schema-driven MCP access to a single form.\n * Hosts can register multiple bridges (one per form on the screen) by\n * giving each adapter a distinct `id`.\n */\nexport function registerFormBridge(\n  host: ToolHost,\n  options: FormBridgeOptions,\n): Bridge {\n  const { adapter } = options;\n  const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n  const pendingMode = options.pendingMode ?? true;\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 = `form:${adapter.id}`;\n\n  // agent_undo / agent_redo / agent_history are registered whenever any bridge\n  // mounts, so undo availability doesn't hinge on which bridges are co-present.\n  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n  const formId = adapter.id;\n\n  const target = (args: any): AgentTarget => ({\n    kind: \"form\",\n    screenId: adapter.screenId,\n    elementId: typeof args?.field === \"string\" ? `${formId}:${args.field}` : formId,\n    label: typeof args?.field === \"string\"\n      ? `${adapter.title ?? formId} → ${args.field}`\n      : adapter.title ?? formId,\n  });\n\n  const reg = (\n    name: string,\n    description: string,\n    properties: Record<string, unknown>,\n    required: string[],\n    handler: (args: JsonObject) => Promise<any> | any,\n    isMutation: boolean,\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 = isMutation\n      ? wrapToolWithActivity(wrapped, {\n          toolName: name,\n          agent: { id: agent.id, name: agent.name, color: agent.color },\n          kind: \"form\",\n          screenId: adapter.screenId,\n          resolveTarget: ({ args }) => target(args),\n        })\n      : wrapped;\n    disposers.push(\n      host.registerTool(\n        {\n          name,\n          description,\n          inputSchema: { type: \"object\", properties: properties as any, required, additionalProperties: false },\n        },\n        final as any,\n        { owner: bridgeId },\n      ),\n    );\n  };\n\n  // ───────────── Read tools ─────────────\n\n  reg(\n    \"form_describe\",\n    `Describe the form \"${formId}\" — fields, types, options, required flags. Call this first to know what's fillable.`,\n    {},\n    [],\n    () => {\n      const fields = adapter.getFields();\n      const text = fields\n        .map((f) => `${f.name}${f.required ? \"*\" : \"\"} (${f.type})${f.label ? ` — ${f.label}` : \"\"}`)\n        .join(\"\\n\");\n      return textResult(text || \"(no fields)\", { id: formId, title: adapter.title, fields });\n    },\n    false,\n  );\n\n  reg(\n    \"form_get_value\",\n    \"Read a single field's current value.\",\n    { field: { type: \"string\" } },\n    [\"field\"],\n    (args) => {\n      const name = String(args.field ?? \"\");\n      if (!adapter.getFields().find((f) => f.name === name)) {\n        return errorResult(`Unknown field: ${name}`);\n      }\n      const value = adapter.getValue(name);\n      return textResult(JSON.stringify(value), { field: name, value });\n    },\n    false,\n  );\n\n  reg(\n    \"form_get_values\",\n    \"Read every field's current value as a JSON object.\",\n    {},\n    [],\n    () => {\n      const values = adapter.getValues();\n      return textResult(JSON.stringify(values, null, 2), values);\n    },\n    false,\n  );\n\n  // ───────────── Mutation tools ─────────────\n\n  reg(\n    \"form_set_value\",\n    \"Set one field's value. The host's controlled state updates and the human sees the field change.\",\n    {\n      field: { type: \"string\" },\n      value: { description: \"Value to set. Type depends on the field's `type`.\" },\n    },\n    [\"field\", \"value\"],\n    (args) => {\n      const name = String(args.field ?? \"\");\n      const fieldDef = adapter.getFields().find((f) => f.name === name);\n      if (!fieldDef) return errorResult(`Unknown field: ${name}`);\n      adapter.setValue(name, args.value);\n      return textResult(`${name} ← ${JSON.stringify(args.value)}`, { field: name, value: args.value });\n    },\n    true,\n  );\n\n  reg(\n    \"form_set_values\",\n    \"Set multiple fields atomically. Pass a `values` object keyed by field name.\",\n    { values: { type: \"object\" } },\n    [\"values\"],\n    (args) => {\n      const values = (args.values && typeof args.values === \"object\") ? args.values as Record<string, unknown> : {};\n      const fields = adapter.getFields();\n      const known = new Set(fields.map((f) => f.name));\n      const unknownKeys = Object.keys(values).filter((k) => !known.has(k));\n      if (unknownKeys.length) return errorResult(`Unknown fields: ${unknownKeys.join(\", \")}`);\n      if (adapter.setValues) {\n        adapter.setValues(values);\n      } else {\n        for (const [k, v] of Object.entries(values)) adapter.setValue(k, v);\n      }\n      return textResult(`Set ${Object.keys(values).length} field(s)`, { values });\n    },\n    true,\n  );\n\n  reg(\n    \"form_focus\",\n    \"Move browser focus to a field (host-implemented). Useful before streaming text into it.\",\n    { field: { type: \"string\" } },\n    [\"field\"],\n    (args) => {\n      const name = String(args.field ?? \"\");\n      if (!adapter.focus) return errorResult(\"Host did not provide a focus implementation.\");\n      if (!adapter.getFields().find((f) => f.name === name)) {\n        return errorResult(`Unknown field: ${name}`);\n      }\n      adapter.focus(name);\n      return textResult(`Focused ${name}`, { field: name });\n    },\n    true,\n  );\n\n  reg(\n    \"form_submit\",\n    \"Submit the form. Host returns ok + values (or an error). In pendingMode this is staged for the human to confirm first.\",\n    {},\n    [],\n    async () => {\n      if (!adapter.submit) return errorResult(\"Host did not provide a submit implementation.\");\n      // Trust-but-verify: a form submit is a human-visible / often-destructive\n      // action, so gate it on a human confirm when one is wired.\n      if (pendingMode && adapter.confirm) {\n        const ok = await adapter.confirm({\n          action: \"submit\",\n          form: formId,\n          title: adapter.title,\n          values: adapter.getValues(),\n        });\n        if (!ok) return errorResult(\"Declined by user\");\n      }\n      const result = await adapter.submit();\n      if (!result.ok) return errorResult(result.error ?? \"Submit failed\");\n      return textResult(\"Submitted\", { values: result.values });\n    },\n    true,\n  );\n\n  return {\n    id: bridgeId,\n    title: adapter.title ?? formId,\n    dispose: () => {\n      for (const d of disposers) d();\n    },\n  };\n}\n","import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\nimport type { AgentTarget } from \"../presence/types\";\nimport type { CellValue, SheetData, SheetOp, WorkbookData } from \"@particle-academy/fancy-sheets\";\n\n/**\n * Cell writes funnel through fancy-sheets' own `reduceWorkbook` + `SheetOp` —\n * the same reducer that drives `<SheetWorkbook>` — so agent edits recalculate\n * formulas and land byte-identical to human edits, mirroring how the slides\n * bridge works. Types come straight from the package (no drift); the reducer\n * VALUE is lazy-imported inside the mutation handlers so the package barrel\n * never statically pulls this optional peer (see issue #3).\n */\n\nexport type SheetsBridgeAdapter = {\n  /** fancy-screens screen id (optional) so activity events know which screen the sheet lives in. */\n  screenId?: string;\n  /** Read the current workbook. */\n  getWorkbook: () => WorkbookData;\n  /** Replace the workbook. Host wires this to its onChange. */\n  setWorkbook: (next: WorkbookData) => void;\n  /** Optional: programmatically change the active cell. */\n  setActiveCell?: (sheetId: string, address: string) => void;\n};\n\nexport type SheetsBridgeOptions = {\n  adapter: SheetsBridgeAdapter;\n  agent?: { id: string; name?: string; color?: string };\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * registerSheetsBridge — schema-aware MCP access to a fancy-sheets workbook.\n * Tools are sheet-aware (every mutator takes an explicit `sheet` id, defaulting\n * to the active sheet when omitted) so an agent can author multi-sheet docs.\n */\nexport function registerSheetsBridge(\n  host: ToolHost,\n  options: SheetsBridgeOptions,\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 = \"sheets\";\n\n  // agent_undo / agent_redo / agent_history are registered whenever any bridge\n  // mounts, so undo availability doesn't hinge on which bridges are co-present.\n  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n  const target = (sheetId: string, address?: string): AgentTarget => ({\n    kind: \"sheet\",\n    screenId: adapter.screenId,\n    elementId: address ? `${sheetId}!${address}` : sheetId,\n    label: address ? `${sheetId}!${address}` : sheetId,\n  });\n\n  const reg = (\n    name: string,\n    description: string,\n    properties: Record<string, unknown>,\n    required: string[],\n    handler: (args: JsonObject) => Promise<any> | any,\n    isMutation: boolean,\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 = isMutation\n      ? wrapToolWithActivity(wrapped, {\n          toolName: name,\n          agent,\n          kind: \"sheet\",\n          screenId: adapter.screenId,\n          resolveTarget: ({ args, result }) =>\n            resolveTarget?.(args, result) ?? target(getSheetId(args)),\n        })\n      : wrapped;\n    disposers.push(\n      host.registerTool(\n        {\n          name,\n          description,\n          inputSchema: { type: \"object\", properties: properties as any, required, additionalProperties: false },\n        },\n        final as any,\n        { owner: bridgeId },\n      ),\n    );\n  };\n\n  function activeSheetId(): string {\n    return adapter.getWorkbook().activeSheetId;\n  }\n  function getSheetId(args: JsonObject): string {\n    return typeof args.sheet === \"string\" ? args.sheet : activeSheetId();\n  }\n  function getSheet(workbook: WorkbookData, sheetId: string): SheetData | undefined {\n    return workbook.sheets.find((s) => s.id === sheetId);\n  }\n\n  // ───────────── Read tools ─────────────\n\n  reg(\n    \"sheet_describe\",\n    \"Describe the workbook: every sheet's id, name, dimensions, cell count, active sheet. Call before reading or writing.\",\n    {},\n    [],\n    () => {\n      const wb = adapter.getWorkbook();\n      const summary = {\n        activeSheetId: wb.activeSheetId,\n        sheets: wb.sheets.map((s) => ({\n          id: s.id,\n          name: s.name,\n          cellCount: Object.keys(s.cells).length,\n          columnCount: Object.keys(s.columnWidths).length,\n          frozenRows: s.frozenRows,\n          frozenCols: s.frozenCols,\n        })),\n      };\n      const text = `Active: ${summary.activeSheetId}\\n` + summary.sheets\n        .map((s) => `${s.id} \"${s.name}\" — ${s.cellCount} cells`)\n        .join(\"\\n\");\n      return textResult(text, summary);\n    },\n    false,\n  );\n\n  reg(\n    \"sheet_get_cell\",\n    \"Read a single cell's raw + computed value.\",\n    {\n      sheet: { type: \"string\", description: \"Sheet id (defaults to active).\" },\n      address: { type: \"string\", description: \"A1-style address, e.g. \\\"B12\\\".\" },\n    },\n    [\"address\"],\n    (args) => {\n      const sheetId = getSheetId(args);\n      const address = String(args.address);\n      const sheet = getSheet(adapter.getWorkbook(), sheetId);\n      if (!sheet) return errorResult(`No sheet ${sheetId}`);\n      const cell = sheet.cells[address];\n      if (!cell) {\n        return textResult(`(empty)`, { sheet: sheetId, address, value: null });\n      }\n      return textResult(`${address} = ${JSON.stringify(cell.computedValue ?? cell.value)}`, { ...cell, sheet: sheetId, address });\n    },\n    false,\n  );\n\n  reg(\n    \"sheet_get_range\",\n    \"Read a rectangular range as a 2D array of values.\",\n    {\n      sheet: { type: \"string\" },\n      start: { type: \"string\", description: \"Top-left A1 address.\" },\n      end: { type: \"string\", description: \"Bottom-right A1 address.\" },\n    },\n    [\"start\", \"end\"],\n    (args) => {\n      const sheetId = getSheetId(args);\n      const sheet = getSheet(adapter.getWorkbook(), sheetId);\n      if (!sheet) return errorResult(`No sheet ${sheetId}`);\n      const grid = readRange(sheet, String(args.start), String(args.end));\n      return textResult(JSON.stringify(grid), { sheet: sheetId, start: args.start, end: args.end, values: grid });\n    },\n    false,\n  );\n\n  // ───────────── Mutation tools ─────────────\n\n  reg(\n    \"sheet_set_cell\",\n    \"Set a single cell's value. To set a formula, pass a string starting with '='.\",\n    {\n      sheet: { type: \"string\" },\n      address: { type: \"string\" },\n      value: { description: \"string | number | boolean | null. Strings starting with '=' are stored as formulas.\" },\n    },\n    [\"address\", \"value\"],\n    async (args) => {\n      const sheetId = getSheetId(args);\n      const address = String(args.address);\n      const value = args.value as CellValue;\n      const wb = adapter.getWorkbook();\n      if (!getSheet(wb, sheetId)) return errorResult(`No sheet ${sheetId}`);\n      const { reduceWorkbook } = await import(\"@particle-academy/fancy-sheets\");\n      adapter.setWorkbook(reduceWorkbook(wb, setCellOp(sheetId, address, value)));\n      return textResult(`${sheetId}!${address} ← ${JSON.stringify(value)}`, { sheet: sheetId, address, value });\n    },\n    true,\n    (args) => target(getSheetId(args), String(args.address ?? \"\")),\n  );\n\n  reg(\n    \"sheet_set_range\",\n    \"Set many cells atomically. `cells` is an object map of { \\\"A1\\\": value, \\\"B2\\\": value, ... }.\",\n    {\n      sheet: { type: \"string\" },\n      cells: { type: \"object\" },\n    },\n    [\"cells\"],\n    async (args) => {\n      const sheetId = getSheetId(args);\n      const wb = adapter.getWorkbook();\n      if (!getSheet(wb, sheetId)) return errorResult(`No sheet ${sheetId}`);\n      const cells = (args.cells && typeof args.cells === \"object\") ? args.cells as Record<string, CellValue> : {};\n      const { reduceWorkbook } = await import(\"@particle-academy/fancy-sheets\");\n      let next = wb;\n      for (const [addr, v] of Object.entries(cells)) next = reduceWorkbook(next, setCellOp(sheetId, addr, v));\n      adapter.setWorkbook(next);\n      return textResult(`Set ${Object.keys(cells).length} cells in ${sheetId}`, { sheet: sheetId, count: Object.keys(cells).length });\n    },\n    true,\n  );\n\n  reg(\n    \"sheet_add_sheet\",\n    \"Add a new sheet (tab) to the workbook.\",\n    { id: { type: \"string\" }, name: { type: \"string\" } },\n    [\"id\", \"name\"],\n    (args) => {\n      const wb = adapter.getWorkbook();\n      const id = String(args.id);\n      const name = String(args.name);\n      if (wb.sheets.find((s) => s.id === id)) return errorResult(`Sheet ${id} already exists`);\n      const next: WorkbookData = {\n        ...wb,\n        sheets: [\n          ...wb.sheets,\n          {\n            id, name, cells: {}, columnWidths: {}, mergedRegions: [],\n            columnFilters: {}, frozenRows: 0, frozenCols: 0,\n          },\n        ],\n      };\n      adapter.setWorkbook(next);\n      return textResult(`Added sheet ${id} (\"${name}\")`, { id, name });\n    },\n    true,\n    (args) => target(String(args.id ?? \"\")),\n  );\n\n  reg(\n    \"sheet_set_active\",\n    \"Switch to a different sheet tab.\",\n    { sheet: { type: \"string\" } },\n    [\"sheet\"],\n    (args) => {\n      const sheetId = String(args.sheet);\n      const wb = adapter.getWorkbook();\n      if (!getSheet(wb, sheetId)) return errorResult(`No sheet ${sheetId}`);\n      adapter.setWorkbook({ ...wb, activeSheetId: sheetId });\n      return textResult(`Active sheet → ${sheetId}`, { sheet: sheetId });\n    },\n    true,\n  );\n\n  reg(\n    \"sheet_set_active_cell\",\n    \"Move the active cell selection (host implements DOM focus + scroll).\",\n    { sheet: { type: \"string\" }, address: { type: \"string\" } },\n    [\"address\"],\n    (args) => {\n      if (!adapter.setActiveCell) return errorResult(\"Host did not provide setActiveCell.\");\n      const sheetId = getSheetId(args);\n      adapter.setActiveCell(sheetId, String(args.address));\n      return textResult(`Active cell → ${sheetId}!${args.address}`, { sheet: sheetId, address: args.address });\n    },\n    true,\n    (args) => target(getSheetId(args), String(args.address ?? \"\")),\n  );\n\n  return {\n    id: bridgeId,\n    title: \"Sheets\",\n    dispose: () => {\n      for (const d of disposers) d();\n    },\n  };\n}\n\n// ───────────── helpers ─────────────\n\n/** Build a `set_cell` op, treating a leading-\"=\" string as a formula — matching\n *  the in-app editor (value keeps the raw \"=…\"; formula drops the \"=\"). */\nfunction setCellOp(sheet: string, address: string, value: CellValue): SheetOp {\n  if (typeof value === \"string\" && value.startsWith(\"=\")) {\n    return { type: \"set_cell\", sheet, address, value, formula: value.slice(1) };\n  }\n  return { type: \"set_cell\", sheet, address, value };\n}\n\n/** Parse \"B12\" → { col: 1, row: 11 }. Letters are 1-based, rows 1-based. */\nfunction parseAddress(addr: string): { col: number; row: number } {\n  const m = /^([A-Za-z]+)(\\d+)$/.exec(addr.trim());\n  if (!m) throw new Error(`Bad address: ${addr}`);\n  const letters = m[1].toUpperCase();\n  let col = 0;\n  for (let i = 0; i < letters.length; i++) {\n    col = col * 26 + (letters.charCodeAt(i) - 64);\n  }\n  return { col: col - 1, row: parseInt(m[2], 10) - 1 };\n}\n\nfunction colToLetter(col: number): string {\n  let s = \"\";\n  let n = col + 1;\n  while (n > 0) {\n    const r = (n - 1) % 26;\n    s = String.fromCharCode(65 + r) + s;\n    n = Math.floor((n - 1) / 26);\n  }\n  return s;\n}\n\nfunction readRange(sheet: SheetData, startAddr: string, endAddr: string): CellValue[][] {\n  const start = parseAddress(startAddr);\n  const end = parseAddress(endAddr);\n  const r0 = Math.min(start.row, end.row);\n  const r1 = Math.max(start.row, end.row);\n  const c0 = Math.min(start.col, end.col);\n  const c1 = Math.max(start.col, end.col);\n  const grid: CellValue[][] = [];\n  for (let r = r0; r <= r1; r++) {\n    const row: CellValue[] = [];\n    for (let c = c0; c <= c1; c++) {\n      const addr = `${colToLetter(c)}${r + 1}`;\n      const cell = sheet.cells[addr];\n      row.push(cell?.computedValue ?? cell?.value ?? null);\n    }\n    grid.push(row);\n  }\n  return grid;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { SheetsBridgeAdapter } from \"./bridges/sheets\";\nimport { onActivity } from \"./presence/registry\";\nimport type { AgentActivityEvent } from \"./presence/types\";\n\n/**\n * Shared-session helpers for `@particle-academy/fancy-sheets`.\n *\n * fancy-sheets' `SheetWorkbook` is already controlled (`data` + `onChange`).\n * The two missing pieces for a clean shared-session experience are:\n *\n *   1. an adapter object the host can hand to {@link registerSheetsBridge}\n *      without writing boilerplate, and\n *   2. a derived `CellHighlightMap` so agent edits visibly pulse on the\n *      humans' screens — wired from the presence registry's per-bridge\n *      activity stream.\n *\n * These are kept as host-side hooks (not part of the bridge itself) so\n * agent-integrations keeps zero hard deps on fancy-sheets. The host\n * imports SheetWorkbook directly and feeds these hooks' outputs into\n * its props.\n *\n *   const wb = useSheetsAdapter(initial, { screenId: \"deal-sheet\" });\n *   const highlights = useSheetsActivityHighlights({ screenId: \"deal-sheet\" });\n *\n *   useEffect(() => {\n *     const bridge = registerSheetsBridge(host, { adapter: wb.adapter });\n *     return bridge.dispose;\n *   }, [host, wb.adapter]);\n *\n *   <SheetWorkbook\n *     data={wb.workbook}\n *     onChange={wb.setWorkbook}\n *     highlights={highlights}\n *     onActiveCellChange={wb.onActiveCellChange}\n *   />\n */\n\n// Loose structural mirror of fancy-sheets' WorkbookData — kept local so\n// this helper doesn't pull a runtime dep on the package. The constraint\n// only names the fields the hook itself reads (`sheets` + `activeSheetId`);\n// it does NOT add a `[k: string]: unknown` index signature, so consumers\n// can pass the real `WorkbookData` from fancy-sheets through without\n// triggering an \"index signature missing\" error.\nexport type WorkbookLike = {\n  sheets: Array<{ id: string; name: string }>;\n  activeSheetId: string;\n};\n\nexport type SheetsAdapterOptions = {\n  /** Tags the bridge's screen id so presence events route correctly. */\n  screenId?: string;\n};\n\nexport type UseSheetsAdapterResult<W extends WorkbookLike> = {\n  /** Controlled workbook state. Wire to `<SheetWorkbook data={…} />`. */\n  workbook: W;\n  /** Setter for the controlled state. Wire to `<SheetWorkbook onChange={…} />`. */\n  setWorkbook: (next: W) => void;\n  /** Wire to `<SheetWorkbook onActiveCellChange={…} />` to track focus. */\n  onActiveCellChange: (address: string) => void;\n  /** Stable adapter to hand to `registerSheetsBridge({ adapter })`. */\n  adapter: SheetsBridgeAdapter;\n  /** Imperative: set the active sheet + cell. Mirrors the adapter's hook. */\n  setActiveCell: (sheetId: string, address: string) => void;\n  /** Read-only: the address last focused (any source). */\n  activeCell: string | null;\n};\n\n/**\n * useSheetsAdapter — one-liner glue between fancy-sheets' SheetWorkbook\n * and the sheets bridge.\n *\n *   const wb = useSheetsAdapter(initialWorkbook, { screenId: \"...\" });\n *\n *   useEffect(() => registerSheetsBridge(host, { adapter: wb.adapter }).dispose,\n *             [host, wb.adapter]);\n *\n *   <SheetWorkbook\n *     data={wb.workbook}\n *     onChange={wb.setWorkbook}\n *     onActiveCellChange={wb.onActiveCellChange}\n *   />\n */\nexport function useSheetsAdapter<W extends WorkbookLike>(\n  initial: W,\n  options: SheetsAdapterOptions = {},\n): UseSheetsAdapterResult<W> {\n  const [workbook, setWorkbook] = useState<W>(initial);\n  const [activeCell, setActiveCellState] = useState<string | null>(null);\n  const workbookRef = useRef(workbook);\n  workbookRef.current = workbook;\n\n  const setActiveCell = useCallback((sheetId: string, address: string) => {\n    setWorkbook((cur) => (cur.activeSheetId === sheetId ? cur : { ...cur, activeSheetId: sheetId }));\n    setActiveCellState(address);\n  }, []);\n\n  const onActiveCellChange = useCallback((address: string) => {\n    setActiveCellState(address);\n  }, []);\n\n  // Adapter must be stable across renders so the bridge's tool catalog\n  // doesn't churn — bind it to refs that hold the latest state + setter.\n  const setWorkbookRef = useRef(setWorkbook);\n  setWorkbookRef.current = setWorkbook;\n\n  const adapter = useMemo<SheetsBridgeAdapter>(\n    () => ({\n      screenId: options.screenId,\n      getWorkbook: () => workbookRef.current as unknown as ReturnType<SheetsBridgeAdapter[\"getWorkbook\"]>,\n      setWorkbook: (next) => setWorkbookRef.current(next as unknown as W),\n      setActiveCell,\n    }),\n    [options.screenId, setActiveCell],\n  );\n\n  return {\n    workbook,\n    setWorkbook,\n    onActiveCellChange,\n    adapter,\n    setActiveCell,\n    activeCell,\n  };\n}\n\n/**\n * Mirror of fancy-sheets' `CellHighlight` — structurally identical so the\n * map returned from {@link useSheetsActivityHighlights} can be passed\n * straight into `<SheetWorkbook highlights={…} />` without any casts.\n *\n * Fields match `@particle-academy/fancy-sheets` exactly:\n *   - `color: string` (required) — border/outline color\n *   - `backgroundColor?: string` — auto-derived from `color` if omitted\n *   - `label?: string` — small badge in the cell's top-left corner\n */\nexport type SheetsCellHighlight = {\n  /** Border/outline color (any CSS color value). Required. */\n  color: string;\n  /** Background tint; if omitted, derived from `color` at low alpha. */\n  backgroundColor?: string;\n  /** Optional label rendered in a chip on the cell. */\n  label?: string;\n};\n\nexport type SheetsCellHighlightMap = Record<string, SheetsCellHighlight>;\n\nexport type SheetsHighlightOptions = {\n  /** Only include events for this screen (recommended). */\n  screenId?: string;\n  /** Highlight TTL in ms before a hit fades from the map. Default 2200. */\n  ttlMs?: number;\n};\n\n/**\n * useSheetsActivityHighlights — subscribe to the presence registry,\n * produce a CellHighlightMap reflecting recent sheet-bridge activity.\n *\n * Pass the result straight into `<SheetWorkbook highlights={…} />`. Each\n * agent edit pulses in the agent's color for `ttlMs` then fades out.\n *\n * The bridge's target shape is `${sheetId}!${address}` — this hook\n * filters for the currently-active sheet and exposes only its cells.\n *\n *   const highlights = useSheetsActivityHighlights({ screenId: \"deal-sheet\" });\n *   <SheetWorkbook highlights={highlights} … />\n */\nexport function useSheetsActivityHighlights(\n  options: SheetsHighlightOptions = {},\n): SheetsCellHighlightMap {\n  const ttlMs = options.ttlMs ?? 2200;\n  const screenId = options.screenId;\n  const [, force] = useState(0);\n  const hitsRef = useRef<\n    Map<string, { event: AgentActivityEvent; expiresAt: number }>\n  >(new Map());\n\n  useEffect(() => {\n    const off = onActivity((event) => {\n      if (event.target?.kind !== \"sheet\") return;\n      if (screenId && event.target.screenId && event.target.screenId !== screenId) return;\n      const elementId = event.target.elementId;\n      if (!elementId || !elementId.includes(\"!\")) return;\n      hitsRef.current.set(elementId, { event, expiresAt: Date.now() + ttlMs });\n      force((n) => n + 1);\n    });\n    return off;\n  }, [screenId, ttlMs]);\n\n  // Periodic GC — drop expired entries and force a re-render.\n  useEffect(() => {\n    const t = window.setInterval(() => {\n      const now = Date.now();\n      let dirty = false;\n      for (const [k, v] of hitsRef.current) {\n        if (v.expiresAt < now) {\n          hitsRef.current.delete(k);\n          dirty = true;\n        }\n      }\n      if (dirty) force((n) => n + 1);\n    }, 500);\n    return () => window.clearInterval(t);\n  }, []);\n\n  // Re-derived on every render — the listener + GC timer above call\n  // `force` so renders happen exactly when the map changes.\n  const out: SheetsCellHighlightMap = {};\n  for (const [elementId, { event }] of hitsRef.current) {\n    const idx = elementId.indexOf(\"!\");\n    const address = elementId.slice(idx + 1);\n    if (!address) continue;\n    const color = event.agentColor ?? \"#a855f7\";\n    out[address] = {\n      color,\n      backgroundColor: color + \"33\",\n      label: event.agentName ?? event.agentId ?? \"agent\",\n    };\n  }\n  return out;\n}\n","import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\nimport { pushUndoEntry } from \"../undo/undo-stack\";\nimport type { AgentTarget } from \"../presence/types\";\n\n/** Streaming append is a UX nicety; large content must use code_set_value. */\nconst MAX_STREAM_CHARS = 10_000;\n\n/**\n * Adapter the host wires to a fancy-code CodeEditor (typically via the\n * useCodeEditor hook's context value).\n */\nexport type CodeBridgeAdapter = {\n  /** Stable id for this editor instance. */\n  id: string;\n  /** Display label. */\n  title?: string;\n  /** Optional fancy-screens screen id. */\n  screenId?: string;\n  /** Read the current document text. */\n  getValue: () => string;\n  /** Replace the document. */\n  setValue: (value: string) => void;\n  /** Read the current selection text (empty string if none). */\n  getSelection?: () => string;\n  /** Replace the current selection with text. */\n  replaceSelection?: (text: string) => void;\n  /** Programmatic focus. */\n  focus?: () => void;\n  /** Read / set the active language. */\n  getLanguage?: () => string;\n  /** Set the active language. */\n  setLanguage?: (lang: string) => void;\n};\n\nexport type CodeBridgeOptions = {\n  adapter: CodeBridgeAdapter;\n  agent?: { id: string; name?: string; color?: string };\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * registerCodeBridge — schema-aware MCP access to a single CodeEditor.\n * Tools cover read, full replace, append, selection replace, language\n * switch, and a streaming append helper for \"type characters into the\n * editor over time\" UX.\n */\nexport function registerCodeBridge(\n  host: ToolHost,\n  options: CodeBridgeOptions,\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 = `code:${adapter.id}`;\n\n  // agent_undo / agent_redo / agent_history are registered whenever any bridge\n  // mounts, so undo availability doesn't hinge on which bridges are co-present.\n  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n  const target: AgentTarget = {\n    kind: \"code\",\n    screenId: adapter.screenId,\n    elementId: adapter.id,\n    label: adapter.title ?? adapter.id,\n  };\n\n  // Record a reversible document edit so agent_undo/redo actually work for code\n  // (they were registered but the code bridge pushed nothing — false\n  // recoverability). Captures the whole-document before/after; restore is a\n  // full setValue either way.\n  const recordUndo = (action: string, label: string, prevValue: string, nextValue: string): void => {\n    pushUndoEntry(agent.id, {\n      timestamp: Date.now(),\n      bridgeId: \"code\",\n      action,\n      label,\n      undo: () => adapter.setValue(prevValue),\n      redo: () => adapter.setValue(nextValue),\n    });\n  };\n\n  const reg = (\n    name: string,\n    description: string,\n    properties: Record<string, unknown>,\n    required: string[],\n    handler: (args: JsonObject) => Promise<any> | any,\n    isMutation: boolean,\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 = isMutation\n      ? wrapToolWithActivity(wrapped, {\n          toolName: name,\n          agent,\n          kind: \"code\",\n          screenId: adapter.screenId,\n          resolveTarget: () => target,\n        })\n      : wrapped;\n    disposers.push(\n      host.registerTool(\n        {\n          name,\n          description,\n          inputSchema: { type: \"object\", properties: properties as any, required, additionalProperties: false },\n        },\n        final as any,\n        { owner: bridgeId },\n      ),\n    );\n  };\n\n  reg(\n    \"code_describe\",\n    `Describe the editor \"${adapter.id}\" — language + length + has-selection.`,\n    {},\n    [],\n    () => {\n      const value = adapter.getValue();\n      const language = adapter.getLanguage?.() ?? \"unknown\";\n      const summary = { id: adapter.id, language, length: value.length, lines: value.split(\"\\n\").length };\n      return textResult(JSON.stringify(summary), summary);\n    },\n    false,\n  );\n\n  reg(\n    \"code_get_value\",\n    \"Read the full document text.\",\n    {},\n    [],\n    () => {\n      const value = adapter.getValue();\n      return textResult(value, { value });\n    },\n    false,\n  );\n\n  reg(\n    \"code_get_selection\",\n    \"Read the currently-selected text (empty string if no selection).\",\n    {},\n    [],\n    () => {\n      if (!adapter.getSelection) return errorResult(\"Host did not provide getSelection.\");\n      const value = adapter.getSelection();\n      return textResult(value, { value });\n    },\n    false,\n  );\n\n  reg(\n    \"code_set_value\",\n    \"Replace the entire document.\",\n    { value: { type: \"string\" } },\n    [\"value\"],\n    (args) => {\n      const value = String(args.value ?? \"\");\n      const prev = adapter.getValue();\n      adapter.setValue(value);\n      recordUndo(\"code_set_value\", \"Replace document\", prev, value);\n      return textResult(`Replaced document (${value.length} chars)`, { length: value.length });\n    },\n    true,\n  );\n\n  reg(\n    \"code_append\",\n    \"Append text to the end of the document.\",\n    { text: { type: \"string\" } },\n    [\"text\"],\n    (args) => {\n      const text = String(args.text ?? \"\");\n      const prev = adapter.getValue();\n      const next = prev + text;\n      adapter.setValue(next);\n      recordUndo(\"code_append\", `Append ${text.length} chars`, prev, next);\n      return textResult(`Appended ${text.length} chars`, { length: next.length });\n    },\n    true,\n  );\n\n  reg(\n    \"code_stream_append\",\n    \"Type characters into the document one at a time so the human can read it forming. Returns when streaming finishes.\",\n    {\n      text: { type: \"string\" },\n      cps: { type: \"number\", description: \"Characters per second. Default 25.\" },\n    },\n    [\"text\"],\n    async (args) => {\n      const text = String(args.text ?? \"\");\n      if (text.length > MAX_STREAM_CHARS) {\n        return errorResult(\n          `Text too long to stream (${text.length} > ${MAX_STREAM_CHARS}). Use code_set_value / code_append for large content.`,\n        );\n      }\n      const cps = Math.max(1, Number(args.cps ?? 25));\n      const interval = Math.max(8, Math.round(1000 / cps));\n      const start = adapter.getValue();\n      for (let i = 1; i <= text.length; i++) {\n        adapter.setValue(start + text.slice(0, i));\n        if (i < text.length) await new Promise((r) => setTimeout(r, interval));\n      }\n      recordUndo(\"code_stream_append\", `Append ${text.length} chars`, start, start + text);\n      return textResult(`Streamed ${text.length} chars`, { length: text.length });\n    },\n    true,\n  );\n\n  reg(\n    \"code_replace_selection\",\n    \"Replace the currently-selected text with the supplied text.\",\n    { text: { type: \"string\" } },\n    [\"text\"],\n    (args) => {\n      if (!adapter.replaceSelection) return errorResult(\"Host did not provide replaceSelection.\");\n      // No selection-range API, so restore is whole-document before/after.\n      const prev = adapter.getValue();\n      adapter.replaceSelection(String(args.text ?? \"\"));\n      recordUndo(\"code_replace_selection\", \"Replace selection\", prev, adapter.getValue());\n      return textResult(\"Selection replaced\", { });\n    },\n    true,\n  );\n\n  reg(\n    \"code_set_language\",\n    \"Switch the active syntax highlighting / formatter.\",\n    { language: { type: \"string\", description: \"e.g. 'javascript', 'php', 'sql'.\" } },\n    [\"language\"],\n    (args) => {\n      if (!adapter.setLanguage) return errorResult(\"Host did not provide setLanguage.\");\n      const lang = String(args.language ?? \"\");\n      const prevLang = adapter.getLanguage?.();\n      adapter.setLanguage(lang);\n      if (prevLang !== undefined) {\n        pushUndoEntry(agent.id, {\n          timestamp: Date.now(),\n          bridgeId: \"code\",\n          action: \"code_set_language\",\n          label: `Language → ${lang}`,\n          undo: () => adapter.setLanguage?.(prevLang),\n          redo: () => adapter.setLanguage?.(lang),\n        });\n      }\n      return textResult(`Language → ${lang}`, { language: lang });\n    },\n    true,\n  );\n\n  reg(\n    \"code_focus\",\n    \"Move browser focus to the editor.\",\n    {},\n    [],\n    () => {\n      if (!adapter.focus) return errorResult(\"Host did not provide focus.\");\n      adapter.focus();\n      return textResult(\"Focused\", { });\n    },\n    // Focus is not a document mutation — don't broadcast it as one or log undo.\n    false,\n  );\n\n  return {\n    id: bridgeId,\n    title: adapter.title ?? adapter.id,\n    dispose: () => {\n      for (const d of disposers) d();\n    },\n  };\n}\n","import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\nimport type { AgentTarget } from \"../presence/types\";\n\n/**\n * Adapter wires a single fancy-echarts chart to the bridge. Charts are\n * already prop-driven, so the adapter just exposes the data + option\n * setters and a way to read what's currently rendered.\n */\nexport type ChartsBridgeAdapter = {\n  /** Stable id for this chart instance. */\n  id: string;\n  title?: string;\n  screenId?: string;\n  /** Read the current ECharts option object the chart is rendering. */\n  getOption: () => Record<string, unknown>;\n  /** Replace the entire option. */\n  setOption: (option: Record<string, unknown>) => void;\n  /** Convenience: shallow-merge a partial option update. */\n  updateOption?: (partial: Record<string, unknown>) => void;\n  /** Read just the data series (subset of option for quick agent reads). */\n  getData?: () => unknown;\n  /** Update only the data, leaving axes/colors/etc. alone. */\n  updateData?: (data: unknown) => void;\n};\n\nexport type ChartsBridgeOptions = {\n  adapter: ChartsBridgeAdapter;\n  agent?: { id: string; name?: string; color?: string };\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * registerChartsBridge — schema-aware MCP access to a single chart.\n */\nexport function registerChartsBridge(\n  host: ToolHost,\n  options: ChartsBridgeOptions,\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 = `chart:${adapter.id}`;\n\n  // agent_undo / agent_redo / agent_history are registered whenever any bridge\n  // mounts, so undo availability doesn't hinge on which bridges are co-present.\n  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n  const target: AgentTarget = {\n    kind: \"chart\",\n    screenId: adapter.screenId,\n    elementId: adapter.id,\n    label: adapter.title ?? adapter.id,\n  };\n\n  const reg = (\n    name: string,\n    description: string,\n    properties: Record<string, unknown>,\n    required: string[],\n    handler: (args: JsonObject) => Promise<any> | any,\n    isMutation: boolean,\n  ) => {\n    const wrapped = async (args: JsonObject) => {\n      try { return await handler(args); }\n      catch (e) { return errorResult(e instanceof Error ? e.message : String(e)); }\n    };\n    const final = isMutation\n      ? wrapToolWithActivity(wrapped, {\n          toolName: name, agent, kind: \"chart\", screenId: adapter.screenId,\n          resolveTarget: () => target,\n        })\n      : wrapped;\n    disposers.push(\n      host.registerTool(\n        { name, description, inputSchema: { type: \"object\", properties: properties as any, required, additionalProperties: false } },\n        final as any,\n        { owner: bridgeId },\n      ),\n    );\n  };\n\n  reg(\n    \"chart_describe\",\n    `Describe the chart \"${adapter.id}\" — series count, type guesses, axis info.`,\n    {},\n    [],\n    () => {\n      const opt = adapter.getOption();\n      const series = Array.isArray(opt.series) ? opt.series : [];\n      const summary = {\n        id: adapter.id,\n        title: adapter.title,\n        seriesCount: series.length,\n        seriesTypes: series.map((s: any) => s?.type ?? \"unknown\"),\n        hasXAxis: !!opt.xAxis,\n        hasYAxis: !!opt.yAxis,\n      };\n      return textResult(JSON.stringify(summary), summary);\n    },\n    false,\n  );\n\n  reg(\n    \"chart_get_option\",\n    \"Read the full ECharts option object the chart is rendering.\",\n    {},\n    [],\n    () => {\n      const opt = adapter.getOption();\n      return textResult(JSON.stringify(opt, null, 2), opt);\n    },\n    false,\n  );\n\n  reg(\n    \"chart_set_option\",\n    \"Replace the entire ECharts option. Use chart_update_option for partial updates.\",\n    { option: { type: \"object\" } },\n    [\"option\"],\n    (args) => {\n      const opt = (args.option && typeof args.option === \"object\") ? args.option as Record<string, unknown> : {};\n      adapter.setOption(opt);\n      return textResult(\"Replaced chart option\", { });\n    },\n    true,\n  );\n\n  reg(\n    \"chart_update_option\",\n    \"Shallow-merge a partial option update — only the keys you provide change.\",\n    { partial: { type: \"object\" } },\n    [\"partial\"],\n    (args) => {\n      const partial = (args.partial && typeof args.partial === \"object\") ? args.partial as Record<string, unknown> : {};\n      if (adapter.updateOption) {\n        adapter.updateOption(partial);\n      } else {\n        adapter.setOption({ ...adapter.getOption(), ...partial });\n      }\n      return textResult(\"Merged chart option\", { keys: Object.keys(partial) });\n    },\n    true,\n  );\n\n  reg(\n    \"chart_update_data\",\n    \"Update only the data (typically the `series` field). Leaves layout / axes / colors alone.\",\n    { data: { description: \"New series array (or whatever shape the host's adapter expects).\" } },\n    [\"data\"],\n    (args) => {\n      if (!adapter.updateData) return errorResult(\"Host did not provide updateData.\");\n      adapter.updateData(args.data);\n      return textResult(\"Updated chart data\", { });\n    },\n    true,\n  );\n\n  return {\n    id: bridgeId,\n    title: adapter.title ?? adapter.id,\n    dispose: () => { for (const d of disposers) d(); },\n  };\n}\n","import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\nimport { pushUndoEntry } from \"../undo/undo-stack\";\nimport type { AgentTarget } from \"../presence/types\";\n\n/**\n * Loose grid types — the public state shape of `@particle-academy/fancy-grid`,\n * mirrored here rather than imported.\n *\n * Same reason the scene bridge mirrors fancy-3d's descriptor: a bridge must not\n * drag its surface package into every consumer's tree. fancy-grid keeps\n * TanStack Table and Virtual as PEERS specifically so nothing bundles them, and\n * an `import type` here would still make fancy-grid a build-time dependency of\n * agent-integrations. The state is four small JSON shapes; the coupling is not\n * worth it.\n */\nexport type GridSort = { id: string; desc: boolean };\nexport type GridFilter = { id: string; value: string };\nexport type GridPagination = { pageIndex: number; pageSize: number };\n\nexport type GridState = {\n  sorting?: GridSort[];\n  filters?: GridFilter[];\n  /** Keyed by row id — see the grid's `getRowId`. */\n  rowSelection?: Record<string, boolean>;\n  pagination?: GridPagination;\n};\n\nexport type GridBridgeAdapter = {\n  id: string;\n  title?: string;\n  screenId?: string;\n  /** Controlled state — the same object the grid's `onStateChange` emits. */\n  getState: () => GridState;\n  setState: (next: GridState) => void;\n  /**\n   * Column ids an agent may address. Supplied so a tool can REJECT an unknown\n   * column instead of writing a sort nothing applies — a silently ignored sort\n   * looks identical to a grid that simply is not sorted.\n   */\n  getColumnIds?: () => string[];\n  /** Row ids currently on screen, for `grid_select_rows` validation. */\n  getRowIds?: () => string[];\n  /**\n   * Write one cell. Absent when the grid is read-only, in which case\n   * `grid_edit_cell` is not registered at all rather than failing at call time\n   * — an agent should discover the capability from the tool list.\n   */\n  editCell?: (rowId: string, columnId: string, value: unknown) => void | Promise<void>;\n};\n\nexport type GridBridgeOptions = {\n  adapter: GridBridgeAdapter;\n  agent?: { id: string; name?: string; color?: string };\n  /**\n   * Gate writes behind a human confirmation. `grid_edit_cell` is the only\n   * mutation that changes DATA rather than view state, so it is the one that\n   * matters here — sorting a grid is not a trust-but-verify action.\n   */\n  pendingMode?: boolean;\n  onPending?: (staged: { id: string; label: string; apply: () => void | Promise<void> }) => void;\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * registerGridBridge — MCP access to a `fancy-grid` surface.\n *\n * `grid_sort`, `grid_filter`, `grid_select_rows` and `grid_edit_cell`, plus a\n * read tool. View state (sort / filter / selection / page) goes through one\n * `setState` channel because that is how the grid is controlled — a bridge that\n * mutated pieces separately would drift from what the component actually\n * accepts.\n */\nexport function registerGridBridge(host: ToolHost, options: GridBridgeOptions): 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 = `grid:${adapter.id}`;\n\n  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n  const target = (part?: string): AgentTarget => ({\n    kind: \"grid\",\n    screenId: adapter.screenId,\n    elementId: part ? `${adapter.id}:${part}` : adapter.id,\n    label: part ? `${adapter.title ?? adapter.id} → ${part}` : (adapter.title ?? adapter.id),\n  });\n\n  const reg = (\n    name: string,\n    description: string,\n    properties: Record<string, unknown>,\n    required: string[],\n    handler: (args: JsonObject) => Promise<ReturnType<typeof textResult>> | ReturnType<typeof textResult>,\n    isMutation: boolean,\n    partFromArgs?: (args: JsonObject) => string | undefined,\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 = isMutation\n      ? wrapToolWithActivity(wrapped, {\n          toolName: name,\n          agent,\n          kind: \"grid\",\n          screenId: adapter.screenId,\n          resolveTarget: ({ args }) => target(partFromArgs?.(args)),\n        })\n      : wrapped;\n\n    disposers.push(\n      host.registerTool(\n        {\n          name,\n          description,\n          inputSchema: { type: \"object\", properties: properties as never, required, additionalProperties: false },\n        },\n        final as never,\n        { owner: bridgeId },\n      ),\n    );\n  };\n\n  /** Reject an unknown column rather than writing state nothing applies. */\n  const assertColumn = (id: string): void => {\n    const known = adapter.getColumnIds?.();\n    if (known && !known.includes(id)) {\n      throw new Error(`Unknown column \"${id}\". Available: ${known.join(\", \")}`);\n    }\n  };\n\n  const commit = (next: GridState, action: string, label: string, previous: GridState): void => {\n    adapter.setState(next);\n    pushUndoEntry(agent.id, {\n      timestamp: Date.now(),\n      bridgeId: `grid:${adapter.id}`,\n      action,\n      label,\n      undo: () => adapter.setState(previous),\n      redo: () => adapter.setState(next),\n    });\n  };\n\n  // ───────────── Read ─────────────\n\n  reg(\n    \"grid_get\",\n    \"Read the grid's view state — sorting, filters, selected row ids, pagination — plus the addressable column and row ids.\",\n    {},\n    [],\n    () => {\n      const state = adapter.getState();\n      return textResult(\n        JSON.stringify(\n          {\n            id: adapter.id,\n            title: adapter.title,\n            sorting: state.sorting ?? [],\n            filters: state.filters ?? [],\n            selectedRowIds: Object.entries(state.rowSelection ?? {})\n              .filter(([, on]) => on)\n              .map(([id]) => id),\n            pagination: state.pagination,\n            columnIds: adapter.getColumnIds?.() ?? null,\n            rowIds: adapter.getRowIds?.() ?? null,\n            editable: Boolean(adapter.editCell),\n          },\n          null,\n          2,\n        ),\n      );\n    },\n    false,\n  );\n\n  // ───────────── View state ─────────────\n\n  reg(\n    \"grid_sort\",\n    \"Sort the grid. Pass an empty array to clear sorting. Multiple entries sort by each in order.\",\n    {\n      sorting: {\n        type: \"array\",\n        description: 'e.g. [{ \"id\": \"createdAt\", \"desc\": true }]',\n        items: {\n          type: \"object\",\n          properties: { id: { type: \"string\" }, desc: { type: \"boolean\" } },\n          required: [\"id\"],\n          additionalProperties: false,\n        },\n      },\n    },\n    [\"sorting\"],\n    (args) => {\n      const raw = Array.isArray(args.sorting) ? (args.sorting as GridSort[]) : [];\n      const sorting = raw.map((s) => {\n        assertColumn(String(s.id));\n        return { id: String(s.id), desc: Boolean(s.desc) };\n      });\n\n      const previous = adapter.getState();\n      commit({ ...previous, sorting }, \"grid_sort\", `Sorted by ${sorting.map((s) => s.id).join(\", \") || \"nothing\"}`, previous);\n      return textResult(`Sorted by ${sorting.map((s) => `${s.id}${s.desc ? \" desc\" : \"\"}`).join(\", \") || \"nothing\"}.`);\n    },\n    true,\n    (args) => (Array.isArray(args.sorting) && args.sorting[0] ? String((args.sorting[0] as GridSort).id) : undefined),\n  );\n\n  reg(\n    \"grid_filter\",\n    \"Filter the grid. Pass an empty array to clear all filters.\",\n    {\n      filters: {\n        type: \"array\",\n        description: 'e.g. [{ \"id\": \"status\", \"value\": \"open\" }]',\n        items: {\n          type: \"object\",\n          properties: { id: { type: \"string\" }, value: { type: \"string\" } },\n          required: [\"id\", \"value\"],\n          additionalProperties: false,\n        },\n      },\n    },\n    [\"filters\"],\n    (args) => {\n      const raw = Array.isArray(args.filters) ? (args.filters as GridFilter[]) : [];\n      const filters = raw.map((f) => {\n        assertColumn(String(f.id));\n        return { id: String(f.id), value: String(f.value) };\n      });\n\n      const previous = adapter.getState();\n      commit({ ...previous, filters }, \"grid_filter\", `Filtered ${filters.map((f) => f.id).join(\", \") || \"cleared\"}`, previous);\n      return textResult(`Filtering on ${filters.map((f) => `${f.id}=${f.value}`).join(\", \") || \"nothing\"}.`);\n    },\n    true,\n    (args) => (Array.isArray(args.filters) && args.filters[0] ? String((args.filters[0] as GridFilter).id) : undefined),\n  );\n\n  reg(\n    \"grid_select_rows\",\n    \"Replace the grid's row selection with the given row ids. Pass an empty array to clear.\",\n    { rowIds: { type: \"array\", items: { type: \"string\" }, description: \"Row ids, per the grid's getRowId.\" } },\n    [\"rowIds\"],\n    (args) => {\n      const ids = Array.isArray(args.rowIds) ? args.rowIds.map(String) : [];\n      const known = adapter.getRowIds?.();\n      if (known) {\n        const missing = ids.filter((id) => !known.includes(id));\n        if (missing.length) {\n          // Selecting a row that is not loaded looks like it worked and shows\n          // nothing — worth an error rather than a silent no-op.\n          throw new Error(`Row id(s) not on this page: ${missing.join(\", \")}`);\n        }\n      }\n\n      const previous = adapter.getState();\n      const rowSelection: Record<string, boolean> = {};\n      for (const id of ids) rowSelection[id] = true;\n\n      commit({ ...previous, rowSelection }, \"grid_select_rows\", `Selected ${ids.length} row${ids.length === 1 ? \"\" : \"s\"}`, previous);\n      return textResult(`Selected ${ids.length} row${ids.length === 1 ? \"\" : \"s\"}.`);\n    },\n    true,\n  );\n\n  // ───────────── Data ─────────────\n\n  if (adapter.editCell) {\n    reg(\n      \"grid_edit_cell\",\n      \"Write one cell. This changes DATA, not just the view.\",\n      {\n        rowId: { type: \"string\" },\n        columnId: { type: \"string\" },\n        value: { description: \"New value. Any JSON scalar or object the column accepts.\" },\n      },\n      [\"rowId\", \"columnId\"],\n      async (args) => {\n        const rowId = String(args.rowId);\n        const columnId = String(args.columnId);\n        assertColumn(columnId);\n\n        const apply = async () => {\n          await adapter.editCell?.(rowId, columnId, args.value);\n        };\n\n        if (options.pendingMode) {\n          // Trust-but-verify: the only tool here that changes stored data\n          // stages instead of writing. Sorting a grid is not a destructive act;\n          // editing a cell is.\n          const id = `grid-edit-${Date.now().toString(36)}`;\n          options.onPending?.({ id, label: `set ${columnId} on row ${rowId}`, apply });\n          return textResult(`Staged: set ${columnId} on row ${rowId}. Awaiting confirmation.`);\n        }\n\n        await apply();\n        return textResult(`Set ${columnId} on row ${rowId}.`);\n      },\n      true,\n      (args) => `${String(args.rowId)}:${String(args.columnId)}`,\n    );\n  }\n\n  return {\n    id: bridgeId,\n    title: adapter.title ?? adapter.id,\n    dispose: () => {\n      for (const d of disposers) d();\n      disposers.length = 0;\n    },\n  };\n}\n","import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\nimport type { AgentTarget } from \"../presence/types\";\n\n/**\n * Loose Scene types — mirror the public surface of fancy-3d's Scene\n * descriptor (engine-agnostic JSON the package's adapters consume).\n */\nexport type SceneObjectKind = \"box\" | \"sphere\" | \"cylinder\" | \"plane\" | \"screen\" | \"group\" | \"custom\";\n\nexport type SceneObject = {\n  id: string;\n  kind: SceneObjectKind | string;\n  position?: [number, number, number];\n  rotation?: [number, number, number];\n  scale?: [number, number, number];\n  color?: string;\n  /** Free-form per-kind config (e.g. text content for screens). */\n  props?: Record<string, unknown>;\n  children?: SceneObject[];\n};\n\nexport type SceneCamera = {\n  position?: [number, number, number];\n  target?: [number, number, number];\n  fov?: number;\n};\n\nexport type SceneState = {\n  objects: SceneObject[];\n  camera?: SceneCamera;\n  background?: string;\n};\n\nexport type SceneBridgeAdapter = {\n  id: string;\n  title?: string;\n  screenId?: string;\n  getScene: () => SceneState;\n  setScene: (next: SceneState) => void;\n  /** Convenience: set just the camera without touching objects. */\n  setCamera?: (next: SceneCamera) => void;\n};\n\nexport type SceneBridgeOptions = {\n  adapter: SceneBridgeAdapter;\n  agent?: { id: string; name?: string; color?: string };\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * registerSceneBridge — schema-aware MCP access to a fancy-3d Scene.\n * Tools cover read, add/update/delete object, set camera, set background.\n */\nexport function registerSceneBridge(\n  host: ToolHost,\n  options: SceneBridgeOptions,\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 = `scene:${adapter.id}`;\n\n  // agent_undo / agent_redo / agent_history are registered whenever any bridge\n  // mounts, so undo availability doesn't hinge on which bridges are co-present.\n  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n  const target = (objectId?: string): AgentTarget => ({\n    kind: \"scene\",\n    screenId: adapter.screenId,\n    elementId: objectId ? `${adapter.id}:${objectId}` : adapter.id,\n    label: objectId ? `${adapter.title ?? adapter.id} → ${objectId}` : adapter.title ?? adapter.id,\n  });\n\n  const reg = (\n    name: string,\n    description: string,\n    properties: Record<string, unknown>,\n    required: string[],\n    handler: (args: JsonObject) => Promise<any> | any,\n    isMutation: boolean,\n    objectIdFromArgs?: (args: JsonObject) => string | undefined,\n  ) => {\n    const wrapped = async (args: JsonObject) => {\n      try { return await handler(args); }\n      catch (e) { return errorResult(e instanceof Error ? e.message : String(e)); }\n    };\n    const final = isMutation\n      ? wrapToolWithActivity(wrapped, {\n          toolName: name, agent, kind: \"scene\", screenId: adapter.screenId,\n          resolveTarget: ({ args }) => target(objectIdFromArgs?.(args)),\n        })\n      : wrapped;\n    disposers.push(\n      host.registerTool(\n        { name, description, inputSchema: { type: \"object\", properties: properties as any, required, additionalProperties: false } },\n        final as any,\n        { owner: bridgeId },\n      ),\n    );\n  };\n\n  const newId = (kind: string) => `${kind}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`;\n\n  // ───────────── Read ─────────────\n\n  reg(\n    \"scene_describe\",\n    \"Describe the scene — object count, kinds, camera position.\",\n    {},\n    [],\n    () => {\n      const scene = adapter.getScene();\n      const summary = {\n        id: adapter.id,\n        objectCount: scene.objects.length,\n        kinds: scene.objects.map((o) => o.kind),\n        camera: scene.camera,\n        background: scene.background,\n      };\n      return textResult(JSON.stringify(summary, null, 2), summary);\n    },\n    false,\n  );\n\n  reg(\n    \"scene_get_state\",\n    \"Read the full SceneState (objects + camera + background).\",\n    {},\n    [],\n    () => {\n      const scene = adapter.getScene();\n      return textResult(JSON.stringify(scene, null, 2), scene);\n    },\n    false,\n  );\n\n  // ───────────── Mutations ─────────────\n\n  reg(\n    \"scene_add_object\",\n    \"Add an object to the scene root. Returns the new object's id.\",\n    {\n      kind: { type: \"string\", description: \"box | sphere | cylinder | plane | screen | group | custom kind\" },\n      position: { type: \"array\", description: \"[x, y, z]\" },\n      rotation: { type: \"array\", description: \"[x, y, z] euler\" },\n      scale: { type: \"array\", description: \"[x, y, z]\" },\n      color: { type: \"string\" },\n      props: { type: \"object\", description: \"Per-kind config.\" },\n    },\n    [\"kind\"],\n    (args) => {\n      const obj: SceneObject = {\n        id: newId(String(args.kind)),\n        kind: String(args.kind),\n        position: parseTriple(args.position),\n        rotation: parseTriple(args.rotation),\n        scale: parseTriple(args.scale),\n        color: typeof args.color === \"string\" ? args.color : undefined,\n        props: (args.props && typeof args.props === \"object\") ? args.props as Record<string, unknown> : undefined,\n      };\n      const scene = adapter.getScene();\n      adapter.setScene({ ...scene, objects: [...scene.objects, obj] });\n      return textResult(`Added ${obj.kind} ${obj.id}`, obj);\n    },\n    true,\n    (args) => undefined, // id resolved from result.structuredContent.id\n  );\n\n  reg(\n    \"scene_update_object\",\n    \"Update fields on an object. Only provided fields change.\",\n    {\n      id: { type: \"string\" },\n      position: { type: \"array\" },\n      rotation: { type: \"array\" },\n      scale: { type: \"array\" },\n      color: { type: \"string\" },\n      props: { type: \"object\" },\n    },\n    [\"id\"],\n    (args) => {\n      const id = String(args.id);\n      const scene = adapter.getScene();\n      const idx = scene.objects.findIndex((o) => o.id === id);\n      if (idx === -1) return errorResult(`No object ${id}`);\n      const orig = scene.objects[idx];\n      const next: SceneObject = {\n        ...orig,\n        ...(args.position !== undefined ? { position: parseTriple(args.position) } : {}),\n        ...(args.rotation !== undefined ? { rotation: parseTriple(args.rotation) } : {}),\n        ...(args.scale !== undefined ? { scale: parseTriple(args.scale) } : {}),\n        ...(args.color !== undefined ? { color: String(args.color) } : {}),\n        ...(args.props && typeof args.props === \"object\" ? { props: { ...(orig.props ?? {}), ...(args.props as Record<string, unknown>) } } : {}),\n      };\n      const objects = [...scene.objects];\n      objects[idx] = next;\n      adapter.setScene({ ...scene, objects });\n      return textResult(`Updated ${id}`, next);\n    },\n    true,\n    (args) => String(args.id ?? \"\"),\n  );\n\n  reg(\n    \"scene_delete_object\",\n    \"Remove an object from the scene root.\",\n    { id: { type: \"string\" } },\n    [\"id\"],\n    (args) => {\n      const id = String(args.id);\n      const scene = adapter.getScene();\n      const next = scene.objects.filter((o) => o.id !== id);\n      if (next.length === scene.objects.length) return errorResult(`No object ${id}`);\n      adapter.setScene({ ...scene, objects: next });\n      return textResult(`Deleted ${id}`);\n    },\n    true,\n    (args) => String(args.id ?? \"\"),\n  );\n\n  reg(\n    \"scene_set_camera\",\n    \"Move the camera. Pass any subset of position/target/fov.\",\n    {\n      position: { type: \"array\", description: \"[x, y, z]\" },\n      target: { type: \"array\", description: \"[x, y, z] look-at point\" },\n      fov: { type: \"number\" },\n    },\n    [],\n    (args) => {\n      const scene = adapter.getScene();\n      const next: SceneCamera = {\n        ...(scene.camera ?? {}),\n        ...(args.position !== undefined ? { position: parseTriple(args.position) } : {}),\n        ...(args.target !== undefined ? { target: parseTriple(args.target) } : {}),\n        ...(args.fov !== undefined ? { fov: Number(args.fov) } : {}),\n      };\n      if (adapter.setCamera) {\n        adapter.setCamera(next);\n      } else {\n        adapter.setScene({ ...scene, camera: next });\n      }\n      return textResult(`Camera updated`, next);\n    },\n    true,\n  );\n\n  reg(\n    \"scene_set_background\",\n    \"Change the scene background color (CSS color).\",\n    { color: { type: \"string\" } },\n    [\"color\"],\n    (args) => {\n      const scene = adapter.getScene();\n      adapter.setScene({ ...scene, background: String(args.color) });\n      return textResult(`Background → ${args.color}`, { background: args.color });\n    },\n    true,\n  );\n\n  return {\n    id: bridgeId,\n    title: adapter.title ?? adapter.id,\n    dispose: () => { for (const d of disposers) d(); },\n  };\n}\n\nfunction parseTriple(v: unknown): [number, number, number] | undefined {\n  if (!Array.isArray(v) || v.length !== 3) return undefined;\n  const out = v.map((x) => Number(x));\n  if (out.some((x) => !Number.isFinite(x))) return undefined;\n  return out as [number, number, number];\n}\n","import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\nimport { emitActivity } from \"../presence/registry\";\nimport type { AgentTarget } from \"../presence/types\";\n\n/**\n * Loose snapshot of a screen — what's in fancy-screens' ScreenMeta plus\n * the host's optional activity status. Kept here so this bridge has no\n * hard dep on fancy-screens.\n */\nexport type ScreenSnapshot = {\n  id: string;\n  title?: string;\n  /** Whether this screen is the one the human / agent is looking at. */\n  active: boolean;\n  /** Optional category / kind (e.g. \"form\", \"whiteboard\"). */\n  kind?: string;\n};\n\n/**\n * Spec for a dynamically-created screen. The host's `createScreen`\n * implementation looks up `kind` in its template registry and instantiates\n * the matching surface (form / whiteboard / sheet / chart / markdown / etc.).\n */\nexport type ScreenCreateSpec = {\n  id: string;\n  title?: string;\n  /** Template kind. Hosts decide the catalog. */\n  kind: string;\n  /** Template-specific config. Form: { fields }. Sheet: { headers }. etc. */\n  config?: Record<string, unknown>;\n};\n\n/**\n * What a mutating adapter method may resolve to, to acknowledge (or refuse)\n * a commit. `{ ok: false }` is a refusal the agent can act on: `error` is\n * shown to the agent verbatim, so keep it a human-readable sentence, never a\n * stack trace or an internal path. `code` is a machine-readable hint\n * (e.g. `\"conflict\"`) for the host's own use; it is not shown to the agent.\n */\nexport type ScreensAdapterResult = { ok: true } | { ok: false; error: string; code?: string };\n\n/**\n * Return type of every mutating adapter method. A sync `void` return keeps\n * the original behaviour. A Promise makes the bridge WAIT: the tool reports\n * success, and emits its AgentActivity event, only after the promise\n * resolves. A rejection or an `{ ok: false }` result becomes an error result\n * and emits no activity.\n */\nexport type ScreensAdapterCommit = void | Promise<void | ScreensAdapterResult>;\n\n/**\n * Adapter exposes the host's screen-navigation surface to the bridge.\n * Hosts wire this up against react-router, a custom tab state, or the\n * fancy-screens registry — wherever \"current screen\" lives.\n *\n * The optional create / destroy / update hooks let agents author screens\n * dynamically against a host-defined template catalog.\n *\n * Every mutating method may be sync (`void`) or async (`Promise`); see\n * {@link ScreensAdapterCommit}. Return a Promise when the host's commit is\n * authoritative — persisted, or able to refuse or conflict — so the agent is\n * told the truth instead of \"success\" before anything was committed.\n *\n * This bridge pushes NO undo entries: `agent_undo` cannot revert a screens\n * tool. A host that needs undo for navigation or screen authoring must keep\n * its own history.\n */\nexport type ScreensBridgeAdapter = {\n  /** List every available screen. */\n  listScreens: () => ScreenSnapshot[];\n  /** Read which screen is currently active. */\n  getActive: () => string | null;\n  /** Navigate to a screen by id. Host updates router / tab state. */\n  setActive: (screenId: string) => ScreensAdapterCommit;\n  /** Optional: instantiate a new screen from a template + config. */\n  createScreen?: (spec: ScreenCreateSpec) => ScreensAdapterCommit;\n  /** Optional: remove a previously-created screen. */\n  destroyScreen?: (screenId: string) => ScreensAdapterCommit;\n  /** Optional: shallow-merge new config into an existing screen. */\n  updateScreenContent?: (screenId: string, partial: Record<string, unknown>) => ScreensAdapterCommit;\n  /** Optional: enumerate the kinds the host knows how to instantiate. */\n  listKinds?: () => Array<{ kind: string; label?: string; description?: string; configSchema?: unknown }>;\n};\n\nexport type ScreensBridgeOptions = {\n  adapter: ScreensBridgeAdapter;\n  agent?: { id: string; name?: string; color?: string };\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * The agent-facing text for a host failure. Only the message is used — never\n * `stack`, which carries file paths — matching the other bridges. A message\n * that itself embeds stack frames is cut at the first frame. A non-Error\n * rejection (a plain object, a response) has no reliable message, so it gets\n * the fallback rather than \"[object Object]\".\n */\nfunction hostErrorMessage(e: unknown, fallback: string): string {\n  let msg: string | undefined;\n  if (e instanceof Error) msg = e.message;\n  else if (typeof e === \"string\") msg = e;\n  else if (e && typeof e === \"object\" && typeof (e as { message?: unknown }).message === \"string\") {\n    msg = (e as { message: string }).message;\n  }\n  const firstFrame = msg ? msg.search(/\\n\\s+at\\s/) : -1;\n  if (msg && firstFrame >= 0) msg = msg.slice(0, firstFrame);\n  msg = msg?.trim();\n  return msg ? msg : fallback;\n}\n\ntype CommitOutcome = { ok: true } | { ok: false; error: string };\n\n/** Run one adapter commit, await it, and normalise every way it can fail. */\nasync function commit(run: () => ScreensAdapterCommit, fallback: string): Promise<CommitOutcome> {\n  try {\n    const r = await run();\n    if (r && typeof r === \"object\" && r.ok === false) {\n      return { ok: false, error: hostErrorMessage(r.error, fallback) };\n    }\n    return { ok: true };\n  } catch (e) {\n    return { ok: false, error: hostErrorMessage(e, fallback) };\n  }\n}\n\n/**\n * registerScreensBridge — top-level navigation bridge so agents can\n * switch between screens (`screens_navigate`) and discover what surfaces\n * exist (`screens_list`, `screens_describe_active`).\n *\n * Pair with the per-surface bridges (whiteboard, form, sheet, etc.) so\n * the agent has both navigation and per-screen control.\n */\nexport function registerScreensBridge(\n  host: ToolHost,\n  options: ScreensBridgeOptions,\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 = \"screens\";\n\n  // agent_undo / agent_redo / agent_history are registered whenever any bridge\n  // mounts, so undo availability doesn't hinge on which bridges are co-present.\n  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n  const target = (screenId: string): AgentTarget => ({\n    kind: \"screens\",\n    screenId,\n    label: `Screen ${screenId}`,\n  });\n\n  const reg = (\n    name: string,\n    description: string,\n    properties: Record<string, unknown>,\n    required: string[],\n    handler: (args: JsonObject) => Promise<any> | any,\n    isMutation: boolean,\n    targetFromArgs?: (args: JsonObject) => AgentTarget,\n  ) => {\n    const wrapped = async (args: JsonObject) => {\n      try { return await handler(args); }\n      catch (e) { return errorResult(hostErrorMessage(e, `${name} failed.`)); }\n    };\n    const final = isMutation\n      ? wrapToolWithActivity(wrapped, {\n          toolName: name, agent, kind: \"screens\",\n          resolveTarget: ({ args }) => targetFromArgs?.(args) ?? null,\n        })\n      : wrapped;\n    disposers.push(\n      host.registerTool(\n        { name, description, inputSchema: { type: \"object\", properties: properties as any, required, additionalProperties: false } },\n        final as any,\n        { owner: bridgeId },\n      ),\n    );\n  };\n\n  reg(\n    \"screens_list\",\n    \"List every screen the host has registered. Returns id, title, active flag, and optional kind.\",\n    {},\n    [],\n    () => {\n      const screens = adapter.listScreens();\n      const text = screens\n        .map((s) => `${s.active ? \"▸\" : \" \"} ${s.id}${s.title ? ` — ${s.title}` : \"\"}${s.kind ? ` [${s.kind}]` : \"\"}`)\n        .join(\"\\n\");\n      return textResult(text || \"(no screens)\", { screens, active: adapter.getActive() });\n    },\n    false,\n  );\n\n  reg(\n    \"screens_describe_active\",\n    \"Get the currently-active screen id (or null).\",\n    {},\n    [],\n    () => {\n      const active = adapter.getActive();\n      return textResult(active ?? \"(none)\", { active });\n    },\n    false,\n  );\n\n  reg(\n    \"screens_list_kinds\",\n    \"List the screen kinds (templates) the host knows how to instantiate. Use this before screens_create to know what's available.\",\n    {},\n    [],\n    () => {\n      if (!adapter.listKinds) return errorResult(\"Host did not register a kind catalog. Cannot create screens dynamically.\");\n      const kinds = adapter.listKinds();\n      const text = kinds.map((k) => `${k.kind}${k.label ? ` — ${k.label}` : \"\"}${k.description ? ` (${k.description})` : \"\"}`).join(\"\\n\");\n      return textResult(text || \"(no kinds registered)\", kinds);\n    },\n    false,\n  );\n\n  reg(\n    \"screens_create\",\n    \"Instantiate a new screen from a template kind + config. Switches the active view to the new screen.\",\n    {\n      id: { type: \"string\", description: \"Stable screen id. Must be unique.\" },\n      title: { type: \"string\" },\n      kind: { type: \"string\", description: \"Template kind — call screens_list_kinds for the catalog.\" },\n      config: { type: \"object\", description: \"Template-specific config (e.g. { fields: [...] } for a form).\" },\n    },\n    [\"id\", \"kind\"],\n    async (args) => {\n      const createScreen = adapter.createScreen;\n      if (!createScreen) return errorResult(\"Host did not provide createScreen.\");\n      const id = String(args.id);\n      const kind = String(args.kind);\n      if (adapter.listScreens().find((s) => s.id === id)) {\n        return errorResult(`Screen ${id} already exists. Use screens_destroy first or pick a fresh id.`);\n      }\n      const created = await commit(() => createScreen({\n        id,\n        title: typeof args.title === \"string\" ? args.title : undefined,\n        kind,\n        config: (args.config && typeof args.config === \"object\") ? args.config as Record<string, unknown> : undefined,\n      }), `Host failed to create screen \"${id}\".`);\n      // Nothing was created, so there is nothing to activate.\n      if (!created.ok) return errorResult(created.error);\n\n      const activated = await commit(() => adapter.setActive(id), `Host failed to activate screen \"${id}\".`);\n      if (!activated.ok) {\n        // Partial commit: the screen EXISTS but is not showing. Reported as an\n        // error so an agent branching on isError does not go on to tell the\n        // human \"look at the new screen\". The create DID commit, though, and\n        // every committed mutation must be observable, so its activity is\n        // emitted here by hand (wrapToolWithActivity skips error results).\n        const state = { id, kind, created: true, activated: false };\n        emitActivity({\n          agentId: agent.id,\n          agentName: agent.name,\n          agentColor: agent.color,\n          target: target(id),\n          action: \"screens_create\",\n          timestamp: Date.now(),\n          meta: state,\n        });\n        return {\n          ...errorResult(\n            `Screen \"${id}\" was created but not activated: ${activated.error} ` +\n              \"The screen exists; do not call screens_create again. \" +\n              \"Call screens_navigate to show it, or screens_destroy to remove it.\",\n          ),\n          structuredContent: state,\n        };\n      }\n      return textResult(`Created ${kind} screen \"${id}\"`, { id, kind });\n    },\n    true,\n    (args) => target(String(args.id ?? \"\")),\n  );\n\n  reg(\n    \"screens_destroy\",\n    \"Remove a previously-created screen. Active screen falls back to the first remaining one (or null).\",\n    { id: { type: \"string\" } },\n    [\"id\"],\n    async (args) => {\n      const destroyScreen = adapter.destroyScreen;\n      if (!destroyScreen) return errorResult(\"Host did not provide destroyScreen.\");\n      const id = String(args.id);\n      if (!adapter.listScreens().find((s) => s.id === id)) {\n        return errorResult(`No screen with id ${id}`);\n      }\n      const done = await commit(() => destroyScreen(id), `Host failed to destroy screen \"${id}\".`);\n      if (!done.ok) return errorResult(done.error);\n      return textResult(`Destroyed screen ${id}`, { id });\n    },\n    true,\n    (args) => target(String(args.id ?? \"\")),\n  );\n\n  reg(\n    \"screens_set_layout\",\n    \"Change the layout of an existing composite screen. Layouts: 'single', 'split-h' (left/right), 'split-v' (top/bottom), 'grid-2x2', 'stack' (tabs).\",\n    {\n      id: { type: \"string\" },\n      layout: { type: \"string\", enum: [\"single\", \"split-h\", \"split-v\", \"grid-2x2\", \"stack\"] },\n    },\n    [\"id\", \"layout\"],\n    async (args) => {\n      const updateScreenContent = adapter.updateScreenContent;\n      if (!updateScreenContent) return errorResult(\"Host did not provide updateScreenContent.\");\n      const id = String(args.id);\n      const done = await commit(\n        () => updateScreenContent(id, { layout: String(args.layout) }),\n        `Host failed to change the layout of screen \"${id}\".`,\n      );\n      if (!done.ok) return errorResult(done.error);\n      return textResult(`Layout of ${args.id} → ${args.layout}`, { id: args.id, layout: args.layout });\n    },\n    true,\n    (args) => target(String(args.id ?? \"\")),\n  );\n\n  reg(\n    \"screens_update_content\",\n    \"Merge new config into an existing screen (e.g. add a field to a form, append a sheet column, change chart series).\",\n    {\n      id: { type: \"string\" },\n      partial: { type: \"object\", description: \"Shallow-merged into the screen's config.\" },\n    },\n    [\"id\", \"partial\"],\n    async (args) => {\n      const updateScreenContent = adapter.updateScreenContent;\n      if (!updateScreenContent) return errorResult(\"Host did not provide updateScreenContent.\");\n      const id = String(args.id);\n      const partial = (args.partial && typeof args.partial === \"object\") ? args.partial as Record<string, unknown> : {};\n      const done = await commit(() => updateScreenContent(id, partial), `Host failed to update screen \"${id}\".`);\n      if (!done.ok) return errorResult(done.error);\n      return textResult(`Updated content of ${id}`, { id });\n    },\n    true,\n    (args) => target(String(args.id ?? \"\")),\n  );\n\n  reg(\n    \"screens_navigate\",\n    \"Switch the human's view to a different screen. The host updates its router / tab state and re-renders.\",\n    { screen: { type: \"string\", description: \"Screen id to activate.\" } },\n    [\"screen\"],\n    async (args) => {\n      const screenId = String(args.screen ?? \"\");\n      const screens = adapter.listScreens();\n      if (!screens.find((s) => s.id === screenId)) {\n        return errorResult(`No screen registered with id \"${screenId}\". Call screens_list first.`);\n      }\n      const done = await commit(() => adapter.setActive(screenId), `Host failed to navigate to screen \"${screenId}\".`);\n      if (!done.ok) return errorResult(done.error);\n      return textResult(`Navigated to ${screenId}`, { screen: screenId });\n    },\n    true,\n    (args) => target(String(args.screen ?? \"\")),\n  );\n\n  return {\n    id: bridgeId,\n    title: \"Screens\",\n    dispose: () => { for (const d of disposers) d(); },\n  };\n}\n","// `Slide` is a React component in @particle-academy/fancy-slides; the slide\n// *data* type is exported as `SlideData`. Same naming convention applies to\n// other element data shapes.\n// Types are import-type-only (erased at build); the fancy-slides VALUES\n// (parseDeck / slideId / elementId) are lazy-imported inside the handlers so the\n// package barrel never statically pulls this optional peer (see issue #3).\nimport type { Deck, DeckOp, ElementAnimation, SlideData, SlideElement, Theme } from \"@particle-academy/fancy-slides\";\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 { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\nimport type { AgentTarget } from \"../presence/types\";\n\n/**\n * Adapter — the bridge calls into these to read or change deck state. The\n * host owns the deck (it's a controlled prop on `DeckEditor` / `SlideViewer`).\n * Every mutation funnels through `apply(op)`, which the host typically\n * implements as `setDeck(deck => reduceDeck(deck, op))`.\n */\nexport type SlidesBridgeAdapter = {\n    /** Read the current deck. */\n    getDeck: () => Deck;\n    /**\n     * Apply a typed DeckOp. The same operations the editor + agent use,\n     * so the host's reducer + undo stack handle both code paths identically.\n     */\n    apply: (op: DeckOp) => void;\n    /** Optional screen id for cross-screen presence highlighting. */\n    screenId?: string;\n};\n\nexport type SlidesBridgeOptions = {\n    adapter: SlidesBridgeAdapter;\n    /** Identity stamped on activity / op metadata. */\n    agent?: { id: string; name?: string; color?: string };\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * registerSlidesBridge — wires the full slide-editor MCP surface against\n * a fancy-slides Deck. Tools map 1:1 to `DeckOp` cases (plus read-only\n * helpers); humans and agents take identical paths through the reducer.\n *\n *   deck_describe              read-only deck summary\n *   deck_get                   full deck JSON\n *   deck_set                   replace the whole deck (stream a presentation in)\n *   deck_set_title             rename\n *   deck_apply_theme           swap theme\n *   slide_list                 ordered list of slide ids + titles\n *   slide_get                  full slide JSON\n *   slide_add                  insert a slide\n *   slide_remove               delete a slide\n *   slide_reorder              move a slide\n *   slide_set_layout           change layout preset\n *   slide_set_notes            update speaker notes\n *   slide_set_background       background color / image / gradient\n *   slide_set_transition       entrance transition (fade / slide / zoom)\n *   element_add                insert an element onto a slide\n *   element_remove             delete an element\n *   element_update             patch an element's fields\n *   element_move               set element x/y\n *   element_resize             set element w/h\n *   element_set_animation      set/clear an element's entrance build (fade/fly-in/zoom/wipe)\n */\nexport function registerSlidesBridge(host: ToolHost, options: SlidesBridgeOptions): 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 = \"slides\";\n\n    // agent_undo / agent_redo / agent_history are registered whenever any bridge\n    // mounts, so undo availability doesn't hinge on which bridges are co-present.\n    ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n    const deckTarget = (): AgentTarget => ({\n        kind: \"deck\",\n        screenId: adapter.screenId,\n        elementId: adapter.getDeck().id,\n        label: adapter.getDeck().title,\n    });\n\n    const slideTarget = (slideId: string): AgentTarget => ({\n        kind: \"slide\",\n        screenId: adapter.screenId,\n        elementId: slideId,\n        label: `slide:${slideId}`,\n    });\n\n    const elementTarget = (slideId: string, elementId: string): AgentTarget => ({\n        kind: \"slide-element\",\n        screenId: adapter.screenId,\n        elementId,\n        label: `${slideId}/${elementId}`,\n    });\n\n    const reg = (\n        name: string,\n        description: string,\n        properties: Record<string, unknown>,\n        required: string[],\n        handler: (args: JsonObject) => Promise<unknown> | unknown,\n        isMutation: boolean,\n        resolveTarget?: (args: JsonObject) => AgentTarget,\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        }) as never;\n        const final = isMutation && resolveTarget\n            ? wrapToolWithActivity(wrapped, {\n                  toolName: name,\n                  agent,\n                  kind: \"deck\",\n                  screenId: adapter.screenId,\n                  resolveTarget: (ctx) => resolveTarget(ctx.args as JsonObject),\n              })\n            : wrapped;\n        disposers.push(\n            host.registerTool(\n                {\n                    name,\n                    description,\n                    inputSchema: {\n                        type: \"object\",\n                        properties: properties as Record<string, never>,\n                        required,\n                        additionalProperties: false,\n                    },\n                },\n                final as never,\n                { owner: bridgeId },\n            ),\n        );\n    };\n\n    // ─── Read-only ─────────────────────────────────────────────────────────\n\n    reg(\n        \"deck_describe\",\n        \"Summary of the active deck — title, slide count, theme name, element-type counts.\",\n        {},\n        [],\n        () => {\n            const deck = adapter.getDeck();\n            const elementCounts: Record<string, number> = {};\n            for (const s of deck.slides) {\n                for (const e of s.elements) {\n                    elementCounts[e.type] = (elementCounts[e.type] ?? 0) + 1;\n                }\n            }\n            const summary = {\n                id: deck.id,\n                title: deck.title,\n                slides: deck.slides.length,\n                theme: deck.theme?.name,\n                elementCounts,\n            };\n            return textResult(JSON.stringify(summary, null, 2), summary);\n        },\n        false,\n    );\n\n    reg(\n        \"deck_get\",\n        \"Read the full deck JSON.\",\n        {},\n        [],\n        () => {\n            const deck = adapter.getDeck();\n            return textResult(JSON.stringify(deck, null, 2), deck);\n        },\n        false,\n    );\n\n    reg(\n        \"slide_list\",\n        \"List slides in order — `{ id, layout, elementCount, title? }`.\",\n        {},\n        [],\n        () => {\n            const deck = adapter.getDeck();\n            const list = deck.slides.map((s) => ({\n                id: s.id,\n                layout: s.layout,\n                elementCount: s.elements.length,\n                title: (s.metadata?.title as string | undefined) ?? firstTextContent(s),\n            }));\n            return textResult(JSON.stringify(list, null, 2), list);\n        },\n        false,\n    );\n\n    reg(\n        \"slide_get\",\n        \"Read a single slide's JSON by id.\",\n        { id: { type: \"string\" } },\n        [\"id\"],\n        (args) => {\n            const id = str(args.id);\n            const slide = adapter.getDeck().slides.find((s) => s.id === id);\n            if (!slide) return errorResult(`Slide not found: ${id}`);\n            return textResult(JSON.stringify(slide, null, 2), slide);\n        },\n        false,\n    );\n\n    // ─── Deck-level mutations ──────────────────────────────────────────────\n\n    reg(\n        \"deck_set_title\",\n        \"Rename the deck.\",\n        { title: { type: \"string\" } },\n        [\"title\"],\n        (args) => {\n            const title = str(args.title);\n            adapter.apply({ op: \"deck.setTitle\", title });\n            return textResult(`Title set to \"${title}\"`, { title });\n        },\n        true,\n        deckTarget,\n    );\n\n    reg(\n        \"deck_apply_theme\",\n        \"Apply a Theme to the deck. Pass either a built-in name (default / dark / vivid) or a full Theme object.\",\n        { theme: { description: \"Theme name string or Theme object.\" } },\n        [\"theme\"],\n        (args) => {\n            const t = args.theme;\n            let theme: Theme;\n            if (typeof t === \"string\") {\n                theme = { name: t };\n            } else if (t && typeof t === \"object\" && \"name\" in (t as Record<string, unknown>)) {\n                theme = t as unknown as Theme;\n            } else {\n                return errorResult(\"theme must be a string name or an object with a `name` field.\");\n            }\n            adapter.apply({ op: \"deck.setTheme\", theme });\n            return textResult(`Applied theme: ${theme.name}`, { theme });\n        },\n        true,\n        deckTarget,\n    );\n\n    reg(\n        \"deck_set\",\n        \"Replace the entire deck atomically — stream a full presentation in. Pass a complete Deck object ({ id, title, theme, slides }). Validated + migrated before it lands; the prior deck is the undo snapshot.\",\n        { deck: { description: \"A complete Deck object.\" } },\n        [\"deck\"],\n        async (args) => {\n            const incoming = args.deck;\n            if (!incoming || typeof incoming !== \"object\") {\n                return errorResult(\"deck must be a complete Deck object ({ id, title, theme, slides }).\");\n            }\n            const { parseDeck } = await import(\"@particle-academy/fancy-slides\");\n            let deck: Deck;\n            try {\n                // parseDeck validates structure + migrates forward; throws on bad input.\n                deck = parseDeck(incoming as unknown);\n            } catch (e) {\n                return errorResult(e instanceof Error ? e.message : String(e));\n            }\n            adapter.apply({ op: \"deck.replace\", deck });\n            return textResult(`Loaded deck \"${deck.title}\" (${deck.slides.length} slides)`, { id: deck.id, slides: deck.slides.length });\n        },\n        true,\n        deckTarget,\n    );\n\n    // ─── Slide-level mutations ─────────────────────────────────────────────\n\n    reg(\n        \"slide_add\",\n        \"Insert a slide at `index` (defaults to end). Returns the new slide's id. Accepts a partial slide payload.\",\n        {\n            index: { type: \"number\" },\n            slide: { description: \"Partial slide payload — id is auto-generated when absent.\" },\n        },\n        [],\n        async (args) => {\n            const deck = adapter.getDeck();\n            const incoming = (args.slide && typeof args.slide === \"object\" ? args.slide : {}) as Partial<SlideData>;\n            const { slideId: newSlideId } = await import(\"@particle-academy/fancy-slides\");\n            const slide: SlideData = {\n                id: incoming.id ?? newSlideId(),\n                layout: incoming.layout ?? \"blank\",\n                elements: incoming.elements ?? [],\n                background: incoming.background,\n                transition: incoming.transition,\n                notes: incoming.notes,\n                metadata: incoming.metadata,\n            };\n            const index = clamp(num(args.index, deck.slides.length), 0, deck.slides.length);\n            adapter.apply({ op: \"slide.add\", index, slide });\n            return textResult(`Added slide ${slide.id} at index ${index}`, { id: slide.id, index });\n        },\n        true,\n        () => deckTarget(),\n    );\n\n    reg(\n        \"slide_remove\",\n        \"Delete a slide by id.\",\n        { id: { type: \"string\" } },\n        [\"id\"],\n        (args) => {\n            const id = str(args.id);\n            adapter.apply({ op: \"slide.remove\", slideId: id });\n            return textResult(`Removed slide ${id}`, { id });\n        },\n        true,\n        (args) => slideTarget(str(args?.id)),\n    );\n\n    reg(\n        \"slide_reorder\",\n        \"Move a slide to a new index.\",\n        { id: { type: \"string\" }, toIndex: { type: \"number\" } },\n        [\"id\", \"toIndex\"],\n        (args) => {\n            const id = str(args.id);\n            const toIndex = num(args.toIndex, 0);\n            adapter.apply({ op: \"slide.reorder\", slideId: id, toIndex });\n            return textResult(`Moved slide ${id} → ${toIndex}`, { id, toIndex });\n        },\n        true,\n        (args) => slideTarget(str(args?.id)),\n    );\n\n    reg(\n        \"slide_set_layout\",\n        \"Change a slide's layout preset.\",\n        { id: { type: \"string\" }, layout: { type: \"string\" } },\n        [\"id\", \"layout\"],\n        (args) => {\n            const id = str(args.id);\n            const layout = str(args.layout) as SlideData[\"layout\"];\n            adapter.apply({ op: \"slide.setLayout\", slideId: id, layout: layout ?? \"blank\" });\n            return textResult(`Slide ${id} layout → ${layout}`, { id, layout });\n        },\n        true,\n        (args) => slideTarget(str(args?.id)),\n    );\n\n    reg(\n        \"slide_set_notes\",\n        \"Set a slide's speaker notes.\",\n        { id: { type: \"string\" }, notes: { type: \"string\" } },\n        [\"id\", \"notes\"],\n        (args) => {\n            const id = str(args.id);\n            const notes = str(args.notes);\n            adapter.apply({ op: \"slide.setNotes\", slideId: id, notes });\n            return textResult(`Notes updated on slide ${id}`, { id });\n        },\n        true,\n        (args) => slideTarget(str(args?.id)),\n    );\n\n    reg(\n        \"slide_set_background\",\n        \"Set or clear a slide's background.\",\n        {\n            id: { type: \"string\" },\n            background: { description: \"Background object `{ color?, image?, gradient? }` — pass null to clear.\" },\n        },\n        [\"id\"],\n        (args) => {\n            const id = str(args.id);\n            const bg = (args.background && typeof args.background === \"object\" ? args.background : undefined) as SlideData[\"background\"];\n            adapter.apply({ op: \"slide.setBackground\", slideId: id, background: bg });\n            return textResult(`Background set on slide ${id}`, { id });\n        },\n        true,\n        (args) => slideTarget(str(args?.id)),\n    );\n\n    reg(\n        \"slide_set_transition\",\n        \"Set or clear a slide's entrance transition.\",\n        {\n            id: { type: \"string\" },\n            transition: {\n                description:\n                    \"Transition object `{ kind: 'none'|'fade'|'slide'|'zoom', duration?: number(ms), direction?: 'left'|'right'|'up'|'down' }` — pass null to clear.\",\n            },\n        },\n        [\"id\"],\n        (args) => {\n            const id = str(args.id);\n            const transition = (args.transition && typeof args.transition === \"object\" ? args.transition : undefined) as SlideData[\"transition\"];\n            adapter.apply({ op: \"slide.setTransition\", slideId: id, transition });\n            return textResult(`Transition set on slide ${id}`, { id });\n        },\n        true,\n        (args) => slideTarget(str(args?.id)),\n    );\n\n    // ─── Element-level mutations ───────────────────────────────────────────\n\n    reg(\n        \"element_add\",\n        \"Insert an element on a slide. Returns the new element id.\",\n        {\n            slideId: { type: \"string\" },\n            element: { description: \"Partial element — type/x/y/w/h required, id auto-generated when absent.\" },\n        },\n        [\"slideId\", \"element\"],\n        async (args) => {\n            const slideId = str(args.slideId);\n            const incoming = (args.element && typeof args.element === \"object\" ? args.element : {}) as Partial<SlideElement>;\n            if (!incoming.type) return errorResult(\"element.type is required.\");\n            const { elementId: newElementId } = await import(\"@particle-academy/fancy-slides\");\n            const element = {\n                id: incoming.id ?? newElementId(),\n                ...incoming,\n            } as SlideElement;\n            adapter.apply({ op: \"element.add\", slideId, element });\n            return textResult(`Added ${element.type} element ${element.id} on ${slideId}`, { id: element.id, slideId });\n        },\n        true,\n        (args) => slideTarget(str(args?.slideId)),\n    );\n\n    reg(\n        \"element_remove\",\n        \"Delete an element by id.\",\n        { slideId: { type: \"string\" }, elementId: { type: \"string\" } },\n        [\"slideId\", \"elementId\"],\n        (args) => {\n            const slideId = str(args.slideId);\n            const elementId = str(args.elementId);\n            adapter.apply({ op: \"element.remove\", slideId, elementId });\n            return textResult(`Removed element ${elementId} from ${slideId}`, { slideId, elementId });\n        },\n        true,\n        (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n    );\n\n    reg(\n        \"element_update\",\n        \"Patch arbitrary fields on an element. Only the keys in `patch` change.\",\n        {\n            slideId: { type: \"string\" },\n            elementId: { type: \"string\" },\n            patch: { type: \"object\" },\n        },\n        [\"slideId\", \"elementId\", \"patch\"],\n        (args) => {\n            const slideId = str(args.slideId);\n            const elementId = str(args.elementId);\n            const patch = (args.patch && typeof args.patch === \"object\" ? args.patch : {}) as Partial<SlideElement>;\n            adapter.apply({ op: \"element.update\", slideId, elementId, patch });\n            return textResult(`Patched element ${elementId}`, { keys: Object.keys(patch) });\n        },\n        true,\n        (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n    );\n\n    reg(\n        \"element_move\",\n        \"Set element x/y (slide-relative, 0..1).\",\n        {\n            slideId: { type: \"string\" },\n            elementId: { type: \"string\" },\n            x: { type: \"number\" },\n            y: { type: \"number\" },\n        },\n        [\"slideId\", \"elementId\", \"x\", \"y\"],\n        (args) => {\n            const slideId = str(args.slideId);\n            const elementId = str(args.elementId);\n            const x = clamp(num(args.x, 0), 0, 1);\n            const y = clamp(num(args.y, 0), 0, 1);\n            adapter.apply({ op: \"element.move\", slideId, elementId, x, y });\n            return textResult(`Moved element ${elementId} → (${x}, ${y})`, { x, y });\n        },\n        true,\n        (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n    );\n\n    reg(\n        \"element_resize\",\n        \"Set element width/height (slide-relative, 0..1).\",\n        {\n            slideId: { type: \"string\" },\n            elementId: { type: \"string\" },\n            w: { type: \"number\" },\n            h: { type: \"number\" },\n        },\n        [\"slideId\", \"elementId\", \"w\", \"h\"],\n        (args) => {\n            const slideId = str(args.slideId);\n            const elementId = str(args.elementId);\n            const w = clamp(num(args.w, 0), 0, 1);\n            const h = clamp(num(args.h, 0), 0, 1);\n            adapter.apply({ op: \"element.resize\", slideId, elementId, w, h });\n            return textResult(`Resized element ${elementId} → (${w}, ${h})`, { w, h });\n        },\n        true,\n        (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n    );\n\n    reg(\n        \"element_set_animation\",\n        \"Set or clear an element's entrance animation (build step).\",\n        {\n            slideId: { type: \"string\" },\n            elementId: { type: \"string\" },\n            animation: {\n                description:\n                    \"Animation `{ effect: 'fade'|'fly-in'|'zoom'|'wipe', trigger?: 'on-click'|'with-prev'|'after-prev', direction?: 'left'|'right'|'up'|'down', duration?: ms, delay?: ms, order?: number }` — pass null to clear.\",\n            },\n        },\n        [\"slideId\", \"elementId\"],\n        (args) => {\n            const slideId = str(args.slideId);\n            const elementId = str(args.elementId);\n            const animation = (args.animation && typeof args.animation === \"object\" ? args.animation : undefined) as ElementAnimation | undefined;\n            adapter.apply({ op: \"element.setAnimation\", slideId, elementId, animation });\n            return textResult(`Animation ${animation ? \"set on\" : \"cleared from\"} element ${elementId}`, { elementId });\n        },\n        true,\n        (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n    );\n\n    return {\n        id: bridgeId,\n        title: \"Slides\",\n        dispose: () => {\n            for (const d of disposers.splice(0)) d();\n        },\n    };\n}\n\n// ─── helpers ───────────────────────────────────────────────────────────────\n\nfunction num(v: unknown, fallback = 0): number {\n    return typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\n\nfunction str(v: unknown, fallback = \"\"): string {\n    return typeof v === \"string\" ? v : fallback;\n}\n\nfunction clamp(v: number, min: number, max: number): number {\n    return Math.max(min, Math.min(max, v));\n}\n\nfunction firstTextContent(slide: SlideData): string | undefined {\n    for (const e of slide.elements) {\n        if (e.type === \"text\") {\n            const t = (e as { content?: string }).content;\n            if (typeof t === \"string\") return t.split(\"\\n\")[0]?.slice(0, 60);\n        }\n    }\n    return undefined;\n}\n\n// NOTE: `reduceDeck` is intentionally NOT re-exported — a static re-export forces\n// the barrel to statically import the optional peer @particle-academy/fancy-slides\n// (issue #3). Consumers writing their own adapter import it from fancy-slides\n// directly: `import { reduceDeck } from \"@particle-academy/fancy-slides\"`.\n","// Loose types so this bridge builds standalone without a hard dep on\n// @particle-academy/fancy-map. Hosts that use fancy-map pass its own\n// MapMarker / MapView values straight through — the shapes match.\ntype LatLng = { lat: number; lng: number };\ntype MapView = { center: LatLng; zoom: number; bearing?: number; pitch?: number };\ntype MapMarker = {\n  id: string;\n  position: LatLng;\n  label?: string;\n  color?: string;\n  icon?: string;\n  draggable?: boolean;\n  data?: Record<string, unknown>;\n};\n\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 as MapAgentTarget } from \"../presence/types\";\nimport { pushUndoEntry } from \"../undo/undo-stack\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\n\n/**\n * Adapter the host provides — getters/setters over the SAME controlled state it\n * passes to fancy-map's `<Map>` (view, markers, selection), plus optional\n * `fitBounds` (from the map's onReady handle) and `setFollow` (drives the map's\n * `follow` prop so an agent can make the camera track a moving marker).\n */\nexport type MapBridgeAdapter = {\n  getView: () => MapView;\n  setView: (next: MapView) => void;\n  getMarkers: () => MapMarker[];\n  setMarkers: (next: MapMarker[] | ((prev: MapMarker[]) => MapMarker[])) => void;\n  getSelected: () => string | null;\n  setSelected: (id: string | null) => void;\n  /** Fit the camera to points (wire to the `MapHandle.fitBounds` from `<Map onReady>`). */\n  fitBounds?: (points: LatLng[], padding?: number) => void;\n  /** Make the camera follow a marker as it moves (drives the map's `follow` prop). */\n  setFollow?: (id: string | null) => void;\n};\n\nexport type MapBridgeOptions = {\n  adapter: MapBridgeAdapter;\n  /** Identity tagged onto agent-authored markers. */\n  agent?: { id: string; name?: string; color?: string };\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\nconst num = (v: unknown, fallback?: number): number =>\n  typeof v === \"number\" && Number.isFinite(v) ? v : fallback ?? 0;\nconst str = (v: unknown, fallback = \"\"): string => (typeof v === \"string\" ? v : fallback);\nconst newId = (prefix: string) =>\n  `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;\n\n/**\n * registerMapBridge — an MCP tool set over a fancy-map `<Map>`'s controlled\n * state, so a human and an agent cohabit one map. The agent moves the camera,\n * drops/updates/removes markers, selects, fits bounds, and follows a live\n * track; every mutation broadcasts AgentActivity (for presence) and pushes an\n * undo entry (so the human can step the agent back). Mirrors the whiteboard /\n * flow bridges in shape.\n */\nexport function registerMapBridge(host: ToolHost, options: MapBridgeOptions): 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 = \"map\";\n\n  // Register agent_undo / agent_redo / agent_history once per host. Idempotent.\n  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n  const mTarget = (args: any, result: any): MapAgentTarget => ({\n    kind: \"map\",\n    elementId:\n      (result?.structuredContent?.id as string | undefined) ?? (args?.id as string | undefined),\n  });\n\n  const reg = (\n    name: string,\n    description: string,\n    properties: Record<string, unknown>,\n    required: string[],\n    handler: (args: JsonObject) => Promise<any> | any,\n    resolveTarget?: (args: JsonObject, result: any) => MapAgentTarget | 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: \"map\",\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: properties as any,\n            required,\n            additionalProperties: false,\n          },\n        },\n        final as any,\n        { owner: bridgeId },\n      ),\n    );\n  };\n\n  // ───────────── Read ─────────────\n\n  reg(\"map_get_state\", \"Get the map's camera, markers, and current selection.\", {}, [], () => {\n    const state = {\n      view: adapter.getView(),\n      markers: adapter.getMarkers(),\n      selectedId: adapter.getSelected(),\n    };\n    return textResult(JSON.stringify(state, null, 2), state);\n  });\n\n  // ───────────── Camera ─────────────\n\n  reg(\n    \"map_set_view\",\n    \"Move the camera to an absolute position. Any omitted field is left unchanged.\",\n    {\n      lat: { type: \"number\", description: \"New center latitude.\" },\n      lng: { type: \"number\", description: \"New center longitude.\" },\n      zoom: { type: \"number\", description: \"New zoom level (higher = closer).\" },\n    },\n    [],\n    (args) => {\n      const prev = adapter.getView();\n      const next: MapView = {\n        center: {\n          lat: args.lat !== undefined ? num(args.lat) : prev.center.lat,\n          lng: args.lng !== undefined ? num(args.lng) : prev.center.lng,\n        },\n        zoom: args.zoom !== undefined ? num(args.zoom) : prev.zoom,\n      };\n      adapter.setView(next);\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"map\",\n        action: \"map_set_view\",\n        label: `Moved camera to ${next.center.lat.toFixed(4)},${next.center.lng.toFixed(4)} z${next.zoom}`,\n        undo: () => adapter.setView(prev),\n        redo: () => adapter.setView(next),\n      });\n      return textResult(`Camera → ${next.center.lat.toFixed(4)},${next.center.lng.toFixed(4)} z${next.zoom}`, next);\n    },\n    mTarget,\n  );\n\n  reg(\n    \"map_pan\",\n    \"Pan the camera by a relative offset in degrees (positive dLat = north, positive dLng = east).\",\n    { dLat: { type: \"number\" }, dLng: { type: \"number\" } },\n    [],\n    (args) => {\n      const prev = adapter.getView();\n      const next: MapView = {\n        ...prev,\n        center: { lat: prev.center.lat + num(args.dLat), lng: prev.center.lng + num(args.dLng) },\n      };\n      adapter.setView(next);\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"map\",\n        action: \"map_pan\",\n        label: \"Panned camera\",\n        undo: () => adapter.setView(prev),\n        redo: () => adapter.setView(next),\n      });\n      return textResult(`Panned to ${next.center.lat.toFixed(4)},${next.center.lng.toFixed(4)}`, next);\n    },\n    mTarget,\n  );\n\n  reg(\n    \"map_zoom\",\n    \"Zoom the camera by a relative delta (e.g. +1 zooms in one level, -2 out two).\",\n    { delta: { type: \"number\" } },\n    [\"delta\"],\n    (args) => {\n      const prev = adapter.getView();\n      const next: MapView = { ...prev, zoom: prev.zoom + num(args.delta) };\n      adapter.setView(next);\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"map\",\n        action: \"map_zoom\",\n        label: `Zoom → ${next.zoom}`,\n        undo: () => adapter.setView(prev),\n        redo: () => adapter.setView(next),\n      });\n      return textResult(`Zoom → ${next.zoom}`, next);\n    },\n  );\n\n  reg(\n    \"map_fit_bounds\",\n    \"Fit the camera to enclose points. Pass `points`, or omit to fit all current markers.\",\n    {\n      points: {\n        type: \"array\",\n        description: \"Points to enclose, e.g. [{lat,lng},…].\",\n        items: {\n          type: \"object\",\n          properties: { lat: { type: \"number\" }, lng: { type: \"number\" } },\n          required: [\"lat\", \"lng\"],\n        },\n      },\n      padding: { type: \"number\", description: \"Padding in pixels (default 40).\" },\n    },\n    [],\n    (args) => {\n      if (!adapter.fitBounds) {\n        return errorResult(\"Host did not wire fitBounds (pass the <Map onReady> handle's fitBounds).\");\n      }\n      const points: LatLng[] = Array.isArray(args.points)\n        ? (args.points as any[]).map((p) => ({ lat: num(p?.lat), lng: num(p?.lng) }))\n        : adapter.getMarkers().map((m) => m.position);\n      if (!points.length) {\n        return errorResult(\"No points to fit (map has no markers).\");\n      }\n      adapter.fitBounds(points, args.padding !== undefined ? num(args.padding) : undefined);\n      return textResult(`Fit camera to ${points.length} point(s).`);\n    },\n  );\n\n  // ───────────── Markers ─────────────\n\n  reg(\n    \"map_add_marker\",\n    \"Drop a marker. `id` is optional (auto-generated); `icon` is an emoji or 1–2 chars.\",\n    {\n      id: { type: \"string\" },\n      lat: { type: \"number\" },\n      lng: { type: \"number\" },\n      label: { type: \"string\" },\n      color: { type: \"string\", description: \"CSS color, e.g. #2563eb.\" },\n      icon: { type: \"string\", description: \"Emoji / short text in the pin.\" },\n      draggable: { type: \"boolean\" },\n      data: { type: \"object\", description: \"Arbitrary JSON payload carried with the marker.\" },\n    },\n    [\"lat\", \"lng\"],\n    (args) => {\n      const id = args.id ? str(args.id) : newId(\"m\");\n      if (adapter.getMarkers().some((m) => m.id === id)) {\n        return errorResult(`A marker with id ${id} already exists — use map_update_marker.`);\n      }\n      const marker: MapMarker = {\n        id,\n        position: { lat: num(args.lat), lng: num(args.lng) },\n        ...(args.label !== undefined ? { label: str(args.label) } : {}),\n        ...(args.color !== undefined ? { color: str(args.color) } : {}),\n        ...(args.icon !== undefined ? { icon: str(args.icon) } : {}),\n        ...(args.draggable !== undefined ? { draggable: !!args.draggable } : {}),\n        ...(args.data && typeof args.data === \"object\"\n          ? { data: args.data as Record<string, unknown> }\n          : {}),\n      };\n      adapter.setMarkers((all) => [...all, marker]);\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"map\",\n        action: \"map_add_marker\",\n        label: `Added marker ${id}`,\n        undo: () => adapter.setMarkers((all) => all.filter((m) => m.id !== id)),\n        redo: () => adapter.setMarkers((all) => [...all, marker]),\n      });\n      return textResult(`Added marker ${id} at ${marker.position.lat.toFixed(4)},${marker.position.lng.toFixed(4)}`, marker);\n    },\n    mTarget,\n  );\n\n  reg(\n    \"map_update_marker\",\n    \"Update a marker. Only provided fields change — update lat/lng repeatedly to drive a live track.\",\n    {\n      id: { type: \"string\" },\n      lat: { type: \"number\" },\n      lng: { type: \"number\" },\n      label: { type: \"string\" },\n      color: { type: \"string\" },\n      icon: { type: \"string\" },\n      draggable: { type: \"boolean\" },\n    },\n    [\"id\"],\n    (args) => {\n      const id = str(args.id);\n      const prev = adapter.getMarkers().find((m) => m.id === id);\n      if (!prev) {\n        return errorResult(`No marker with id ${id}`);\n      }\n      const next: MapMarker = {\n        ...prev,\n        position: {\n          lat: args.lat !== undefined ? num(args.lat) : prev.position.lat,\n          lng: args.lng !== undefined ? num(args.lng) : prev.position.lng,\n        },\n        ...(args.label !== undefined ? { label: str(args.label) } : {}),\n        ...(args.color !== undefined ? { color: str(args.color) } : {}),\n        ...(args.icon !== undefined ? { icon: str(args.icon) } : {}),\n        ...(args.draggable !== undefined ? { draggable: !!args.draggable } : {}),\n      };\n      adapter.setMarkers((all) => all.map((m) => (m.id === id ? next : m)));\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"map\",\n        action: \"map_update_marker\",\n        label: `Updated marker ${id}`,\n        undo: () => adapter.setMarkers((all) => all.map((m) => (m.id === id ? prev : m))),\n        redo: () => adapter.setMarkers((all) => all.map((m) => (m.id === id ? next : m))),\n      });\n      return textResult(`Updated marker ${id}`, next);\n    },\n    mTarget,\n  );\n\n  reg(\n    \"map_remove_marker\",\n    \"Remove a marker by id.\",\n    { id: { type: \"string\" } },\n    [\"id\"],\n    (args) => {\n      const id = str(args.id);\n      const prev = adapter.getMarkers().find((m) => m.id === id);\n      if (!prev) {\n        return errorResult(`No marker with id ${id}`);\n      }\n      adapter.setMarkers((all) => all.filter((m) => m.id !== id));\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"map\",\n        action: \"map_remove_marker\",\n        label: `Removed marker ${id}`,\n        undo: () => adapter.setMarkers((all) => [...all, prev]),\n        redo: () => adapter.setMarkers((all) => all.filter((m) => m.id !== id)),\n      });\n      return textResult(`Removed marker ${id}`);\n    },\n    mTarget,\n  );\n\n  reg(\n    \"map_select\",\n    \"Select a marker (or pass no id / null to clear the selection).\",\n    { id: { type: \"string\" } },\n    [],\n    (args) => {\n      const prev = adapter.getSelected();\n      const id = args.id === undefined || args.id === null ? null : str(args.id);\n      if (id !== null && !adapter.getMarkers().some((m) => m.id === id)) {\n        return errorResult(`No marker with id ${id}`);\n      }\n      adapter.setSelected(id);\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"map\",\n        action: \"map_select\",\n        label: id ? `Selected ${id}` : \"Cleared selection\",\n        undo: () => adapter.setSelected(prev),\n        redo: () => adapter.setSelected(id),\n      });\n      return textResult(id ? `Selected marker ${id}` : \"Cleared selection\", { selectedId: id });\n    },\n    mTarget,\n  );\n\n  // ───────────── Live tracking (camera follow) ─────────────\n\n  reg(\n    \"map_start_track\",\n    \"Make the camera follow a marker as its position updates (live tracking). Requires the host to wire setFollow.\",\n    { id: { type: \"string\" } },\n    [\"id\"],\n    (args) => {\n      if (!adapter.setFollow) {\n        return errorResult(\"Host did not wire setFollow (pass the map's `follow` setter).\");\n      }\n      const id = str(args.id);\n      if (!adapter.getMarkers().some((m) => m.id === id)) {\n        return errorResult(`No marker with id ${id}`);\n      }\n      adapter.setFollow(id);\n      return textResult(`Camera now following ${id}`, { follow: id });\n    },\n    mTarget,\n  );\n\n  reg(\n    \"map_stop_track\",\n    \"Stop following any marker (releases the camera). Requires the host to wire setFollow.\",\n    {},\n    [],\n    () => {\n      if (!adapter.setFollow) {\n        return errorResult(\"Host did not wire setFollow.\");\n      }\n      adapter.setFollow(null);\n      return textResult(\"Camera released (no longer following).\", { follow: null });\n    },\n  );\n\n  return {\n    id: bridgeId,\n    title: \"Map\",\n    dispose: () => {\n      for (const d of disposers) d();\n    },\n  };\n}\n","import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\n\nexport type GitProposal = {\n  operation: string;\n  arguments: Record<string, unknown>;\n  summary: string;\n};\n\nexport type GitBridgeAdapter = {\n  status: () => Promise<unknown>;\n  log: (query: { ref?: string; limit?: number; skip?: number }) => Promise<unknown>;\n  diff: (query: { from?: string; to?: string; staged?: boolean; paths?: string[] }) => Promise<unknown>;\n  reviews?: (query: { state?: string; cursor?: string; limit?: number }) => Promise<unknown>;\n  checks?: (revision: string) => Promise<unknown>;\n  propose: (operation: string, args: Record<string, unknown>) => Promise<GitProposal>;\n  applyProposal?: (proposal: GitProposal) => Promise<unknown>;\n};\n\nexport type GitBridgeOptions = {\n  adapter: GitBridgeAdapter;\n  agent?: { id: string; name?: string; color?: string };\n  /** Defaults to proposal-only. Set true only when the host has its own confirmation policy. */\n  allowApply?: boolean;\n};\n\nexport function registerGitBridge(host: ToolHost, options: GitBridgeOptions): Bridge {\n  const agent = { id: \"agent\", name: \"Agent\", color: \"#a855f7\", ...(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 = \"git\";\n  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n  const reg = (\n    name: string,\n    description: string,\n    properties: Record<string, unknown>,\n    required: string[],\n    handler: (args: JsonObject) => Promise<unknown>,\n    mutation = false,\n  ) => {\n    const wrapped = async (args: JsonObject) => {\n      try {\n        return await handler(args);\n      } catch (error) {\n        return errorResult(error instanceof Error ? error.message : String(error));\n      }\n    };\n    const final = mutation\n      ? wrapToolWithActivity(wrapped as any, {\n          toolName: name,\n          agent,\n          kind: \"git\",\n          resolveTarget: ({ args }) => ({ kind: \"git\", elementId: typeof args.path === \"string\" ? args.path : undefined } as any),\n        })\n      : wrapped;\n    disposers.push(host.registerTool({\n      name,\n      description,\n      inputSchema: { type: \"object\", properties: properties as any, required, additionalProperties: false },\n    }, final as any, { owner: bridgeId }));\n  };\n\n  reg(\"git_status\", \"Read normalized working-tree and branch status.\", {}, [], async () => {\n    const result = await options.adapter.status();\n    return textResult(JSON.stringify(result, null, 2), result as any);\n  });\n  reg(\"git_log\", \"Read normalized commit history.\", {\n    ref: { type: \"string\" }, limit: { type: \"number\" }, skip: { type: \"number\" },\n  }, [], async (args) => {\n    const result = await options.adapter.log(args as any);\n    return textResult(JSON.stringify(result, null, 2), result as any);\n  });\n  reg(\"git_diff\", \"Read a normalized Git diff.\", {\n    from: { type: \"string\" }, to: { type: \"string\" }, staged: { type: \"boolean\" },\n    paths: { type: \"array\", items: { type: \"string\" } },\n  }, [], async (args) => {\n    const result = await options.adapter.diff(args as any);\n    return textResult(JSON.stringify(result, null, 2), result as any);\n  });\n  if (options.adapter.reviews) reg(\"git_reviews_list\", \"List normalized pull/merge requests.\", {\n    state: { type: \"string\" }, cursor: { type: \"string\" }, limit: { type: \"number\" },\n  }, [], async (args) => {\n    const result = await options.adapter.reviews!(args as any);\n    return textResult(JSON.stringify(result, null, 2), result as any);\n  });\n  if (options.adapter.checks) reg(\"git_checks\", \"Read checks or pipeline summaries for a revision.\", {\n    revision: { type: \"string\" },\n  }, [\"revision\"], async (args) => {\n    const result = await options.adapter.checks!(String(args.revision));\n    return textResult(JSON.stringify(result, null, 2), result as any);\n  });\n\n  const mutation = (name: string, description: string, properties: Record<string, unknown>, required: string[]) =>\n    reg(name, description, properties, required, async (args) => {\n      const proposal = await options.adapter.propose(name.slice(4), args);\n      if (args.apply === true) {\n        if (!options.allowApply || !options.adapter.applyProposal) return errorResult(\"This host requires human confirmation before applying Git writes.\");\n        const result = await options.adapter.applyProposal(proposal);\n        return textResult(`Applied: ${proposal.summary}`, result as any);\n      }\n      return textResult(`Proposed: ${proposal.summary}`, proposal as any);\n    }, true);\n\n  mutation(\"git_stage\", \"Propose staging paths.\", { paths: { type: \"array\", items: { type: \"string\" } }, apply: { type: \"boolean\" } }, [\"paths\"]);\n  mutation(\"git_unstage\", \"Propose unstaging paths.\", { paths: { type: \"array\", items: { type: \"string\" } }, apply: { type: \"boolean\" } }, [\"paths\"]);\n  mutation(\"git_commit\", \"Propose committing staged changes.\", { message: { type: \"string\" }, apply: { type: \"boolean\" } }, [\"message\"]);\n  mutation(\"git_checkout\", \"Propose checking out a ref.\", { target: { type: \"string\" }, apply: { type: \"boolean\" } }, [\"target\"]);\n  mutation(\"git_fetch\", \"Propose fetching a remote.\", { remote: { type: \"string\" }, apply: { type: \"boolean\" } }, []);\n  mutation(\"git_pull\", \"Propose a fast-forward-only pull.\", { remote: { type: \"string\" }, branch: { type: \"string\" }, apply: { type: \"boolean\" } }, []);\n  mutation(\"git_push\", \"Propose pushing a branch.\", { remote: { type: \"string\" }, branch: { type: \"string\" }, apply: { type: \"boolean\" } }, []);\n  mutation(\"git_review_create\", \"Propose creating a pull/merge request.\", {\n    title: { type: \"string\" }, body: { type: \"string\" }, sourceBranch: { type: \"string\" }, targetBranch: { type: \"string\" }, draft: { type: \"boolean\" }, apply: { type: \"boolean\" },\n  }, [\"title\", \"sourceBranch\", \"targetBranch\"]);\n\n  return { id: bridgeId, title: \"Git\", dispose: () => disposers.forEach((dispose) => dispose()) };\n}\n","// Loose types so this bridge builds standalone without a hard dep on\n// @particle-academy/react-fancy. Hosts using FileBrowser pass its own\n// FileEntry / FileSnapshotNode values straight through — the shapes match.\ntype FileKind = \"file\" | \"dir\";\ntype FileEntry = {\n  path: string;\n  name: string;\n  kind: FileKind;\n  size?: number;\n  mtime?: string;\n  hasChildren?: boolean;\n  disabled?: boolean;\n};\ntype FileSnapshotNode = FileEntry & { children?: FileSnapshotNode[] };\n\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 as FilesAgentTarget } from \"../presence/types\";\nimport { pushUndoEntry } from \"../undo/undo-stack\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\n\n/**\n * Adapter the host provides — getters/setters over the SAME controlled props it\n * passes to react-fancy's `<FileBrowser>` (`value`/`path`/`expandedPaths`), plus\n * `listChildren` (wire to your `provider.loadChildren` or the loaded cache) and,\n * for snapshot mode, an optional `requestSnapshot`.\n */\nexport type FilesBridgeAdapter = {\n  /** Current directory (the `path` prop). */\n  getPath: () => string;\n  setPath: (path: string) => void;\n  /** Selected path(s) — normalize FileBrowser's `value` (string | string[] | null) to an array. */\n  getSelection: () => string[];\n  setSelection: (paths: string[]) => void;\n  /** Expanded folder paths (the `expandedPaths` prop). */\n  getExpanded: () => string[];\n  setExpanded: (next: string[] | ((prev: string[]) => string[])) => void;\n  /** Direct children of a path — wire to `provider.loadChildren` (async) or the loaded/snapshot cache. */\n  listChildren: (path: string) => Promise<FileEntry[]> | FileEntry[];\n  /** Optional (snapshot mode): fetch/refresh a snapshot subtree so an agent can pull remote state on demand. */\n  requestSnapshot?: (path: string, depth?: number) => Promise<FileSnapshotNode[]> | FileSnapshotNode[];\n  /**\n   * Create a folder. **Supplying this is the opt-in** — `files_create_folder`\n   * is registered only when it is present, so an agent cannot be handed a write\n   * a host never wired, and the advertised tool list tells the truth about what\n   * is possible.\n   *\n   * Pairs with `FileBrowser`'s `onCreateFolder` (react-fancy 5.18+): the same\n   * operation the human has, given to the agent.\n   */\n  createFolder?: (input: { parentPath: string; name: string }) => Promise<void> | void;\n};\n\nexport type FilesBridgeOptions = {\n  adapter: FilesBridgeAdapter;\n  /** Identity tagged onto agent-driven actions. */\n  agent?: { id: string; name?: string; color?: string };\n  /**\n   * Optional containment root. When set, every agent-supplied path is checked\n   * with {@link assertPathWithinRoot} before it reaches the adapter: a `..`\n   * segment or an absolute path outside `root` is rejected. This is a\n   * fail-closed, string-level guard (no filesystem access — the bridge runs in\n   * the browser). It is NOT sufficient on its own: a host over a real\n   * filesystem MUST additionally resolve symlinks/junctions (realpath) and\n   * enforce the root, because a link under `root` can still point outside it.\n   * When `root` is unset the bridge does no containment and the adapter is\n   * SOLELY responsible for sandboxing what `listChildren`/`requestSnapshot` expose.\n   */\n  root?: string;\n  /**\n   * Stage writes for human confirmation. Default **true**, matching the\n   * catalog bridge's destructive ops.\n   *\n   * This bridge writes to a filesystem on the strength of a model's output, so\n   * the safe mode is the default and turning it off is the deliberate act.\n   */\n  pendingMode?: boolean;\n  /** Host confirm hook for staged writes. Resolves true to proceed. */\n  confirm?: (req: { action: string; path: string; label: string }) => Promise<boolean> | boolean;\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/** Host default cap on snapshot recursion, so an agent can't request an\n *  unbounded deep walk. */\nconst MAX_SNAPSHOT_DEPTH = 8;\n\n/**\n * Fail-closed, filesystem-free path containment. Throws when `path` contains a\n * `..` segment, or is absolute and not within `root`. Relative paths without\n * `..` pass (resolved within root by the host). String-level only — see the\n * `root` docs: hosts over a real fs must ALSO realpath to defeat symlinks.\n */\n/**\n * Why a folder NAME cannot be used, or `null`.\n *\n * `assertPathWithinRoot` inspects the parent path; the name is appended to it\n * afterwards, so `{ parentPath: \"/root\", name: \"../..\" }` clears that check and\n * still escapes. A name containing a separator is not a name.\n */\nexport function invalidFolderName(name: string): string | null {\n  const trimmed = name.trim();\n  if (trimmed === \"\") return \"A folder name is required.\";\n  if (trimmed.includes(\"/\") || trimmed.includes(\"\\\\\")) return \"A folder name may not contain a path separator.\";\n  if (trimmed === \".\" || trimmed === \"..\") return \"That folder name is reserved.\";\n  return null;\n}\n\nexport function assertPathWithinRoot(root: string, path: string): void {\n  const segments = path.replace(/[\\\\/]+/g, \"/\").split(\"/\");\n  if (segments.includes(\"..\")) {\n    throw new Error(`Path may not contain '..': ${path}`);\n  }\n  const isAbsolute = /^([A-Za-z]:)?[\\\\/]/.test(path) || /^[A-Za-z]:/.test(path);\n  if (isAbsolute) {\n    // Strip a trailing slash with `\\/$`, NOT `\\/+$`. The quantified `\\/+$`\n    // is a polynomial-ReDoS on paths with many slashes (CodeQL js/polynomial-\n    // redos), and the `+` is redundant here: the preceding\n    // `.replace(/[\\\\/]+/g, \"/\")` has already collapsed every slash-run to a\n    // single `/`, so at most one trailing slash can remain. Non-quantified\n    // `\\/$` matches the same input in linear time.\n    const norm = (p: string): string => p.replace(/[\\\\/]+/g, \"/\").replace(/\\/$/, \"\").toLowerCase();\n    const r = norm(root);\n    const p = norm(path);\n    if (p !== r && !p.startsWith(r + \"/\")) {\n      throw new Error(`Path escapes the configured root: ${path}`);\n    }\n  }\n}\n\nconst str = (v: unknown, fallback = \"\"): string => (typeof v === \"string\" ? v : fallback);\nconst num = (v: unknown, fallback?: number): number =>\n  typeof v === \"number\" && Number.isFinite(v) ? v : fallback ?? 0;\nconst asPaths = (v: unknown): string[] => {\n  if (typeof v === \"string\") {\n    return [v];\n  }\n  if (Array.isArray(v)) {\n    return v.filter((x): x is string => typeof x === \"string\");\n  }\n  return [];\n};\n\n/**\n * registerFilesBridge — an MCP tool set over a react-fancy `<FileBrowser>`'s\n * controlled state, so a human and an agent share one file browser. The agent\n * lists a folder's children, navigates, expands/collapses folders, selects\n * entries, and (in snapshot mode) requests a fresh subtree — driving the same\n * `value`/`path`/`expandedPaths` props, no DOM scraping. Every mutation\n * broadcasts AgentActivity (presence) and pushes an undo entry. Mirrors the\n * map / whiteboard / flow bridges in shape.\n *\n * Read-only browse in v1: no content preview (pair with fancy-code's\n * FileViewer) and no write ops (rename/delete/upload) — those arrive later\n * behind a pendingMode-gated iteration.\n */\nexport function registerFilesBridge(host: ToolHost, options: FilesBridgeOptions): Bridge {\n  const { adapter } = options;\n  const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n  const pendingMode = options.pendingMode ?? true;\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 = \"files\";\n\n  // Reject traversal / out-of-root paths before they reach the adapter (no-op\n  // when no root is configured — the adapter is then responsible for sandboxing).\n  const guard = (path: string): string => {\n    if (options.root !== undefined) assertPathWithinRoot(options.root, path);\n    return path;\n  };\n\n  // Register agent_undo / agent_redo / agent_history once per host. Idempotent.\n  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n  const fTarget = (args: any, _result: any): FilesAgentTarget => ({\n    kind: \"files\",\n    elementId: (args?.path as string | undefined) ?? undefined,\n  });\n\n  const reg = (\n    name: string,\n    description: string,\n    properties: Record<string, unknown>,\n    required: string[],\n    handler: (args: JsonObject) => Promise<any> | any,\n    resolveTarget?: (args: JsonObject, result: any) => FilesAgentTarget | 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: \"files\",\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: properties as any,\n            required,\n            additionalProperties: false,\n          },\n        },\n        final as any,\n        { owner: bridgeId },\n      ),\n    );\n  };\n\n  // ───────────── Read ─────────────\n\n  reg(\n    \"files_get_state\",\n    \"Get the file browser's current directory, selected path(s), and expanded folders.\",\n    {},\n    [],\n    () => {\n      const state = {\n        path: adapter.getPath(),\n        selected: adapter.getSelection(),\n        expanded: adapter.getExpanded(),\n      };\n      return textResult(JSON.stringify(state, null, 2), state);\n    },\n  );\n\n  reg(\n    \"files_list\",\n    \"List the direct children of a folder (files + subfolders). Omit `path` for the current directory. Loads lazily from the host's provider/snapshot — never an eager tree walk.\",\n    { path: { type: \"string\", description: \"Folder path to list; defaults to the current directory.\" } },\n    [],\n    async (args) => {\n      const path = guard(args.path !== undefined ? str(args.path) : adapter.getPath());\n      const entries = await adapter.listChildren(path);\n      const summary = entries.map((e) => ({\n        path: e.path,\n        name: e.name,\n        kind: e.kind,\n        ...(e.size !== undefined ? { size: e.size } : {}),\n        ...(e.mtime !== undefined ? { mtime: e.mtime } : {}),\n      }));\n      const text =\n        summary.map((e) => `${e.kind === \"dir\" ? \"📁\" : \"📄\"} ${e.path}`).join(\"\\n\") ||\n        `(empty: ${path})`;\n      return textResult(text, { path, entries: summary });\n    },\n  );\n\n  // ───────────── Navigation ─────────────\n\n  reg(\n    \"files_navigate\",\n    \"Set the current directory (as if the user clicked a breadcrumb or opened a folder).\",\n    { path: { type: \"string\" } },\n    [\"path\"],\n    (args) => {\n      const path = guard(str(args.path));\n      const prev = adapter.getPath();\n      adapter.setPath(path);\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"files\",\n        action: \"files_navigate\",\n        label: `Navigated to ${path}`,\n        undo: () => adapter.setPath(prev),\n        redo: () => adapter.setPath(path),\n      });\n      return textResult(`Current directory → ${path}`, { path });\n    },\n    fTarget,\n  );\n\n  // ───────────── Expansion ─────────────\n\n  reg(\n    \"files_expand\",\n    \"Expand a folder in the tree (loads its children if needed).\",\n    { path: { type: \"string\" } },\n    [\"path\"],\n    (args) => {\n      const path = guard(str(args.path));\n      if (adapter.getExpanded().includes(path)) {\n        return textResult(`${path} already expanded`, { path, expanded: true });\n      }\n      adapter.setExpanded((prev) => [...prev, path]);\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"files\",\n        action: \"files_expand\",\n        label: `Expanded ${path}`,\n        undo: () => adapter.setExpanded((prev) => prev.filter((p) => p !== path)),\n        redo: () => adapter.setExpanded((prev) => (prev.includes(path) ? prev : [...prev, path])),\n      });\n      return textResult(`Expanded ${path}`, { path, expanded: true });\n    },\n    fTarget,\n  );\n\n  reg(\n    \"files_collapse\",\n    \"Collapse a folder in the tree.\",\n    { path: { type: \"string\" } },\n    [\"path\"],\n    (args) => {\n      const path = guard(str(args.path));\n      if (!adapter.getExpanded().includes(path)) {\n        return textResult(`${path} already collapsed`, { path, expanded: false });\n      }\n      adapter.setExpanded((prev) => prev.filter((p) => p !== path));\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"files\",\n        action: \"files_collapse\",\n        label: `Collapsed ${path}`,\n        undo: () => adapter.setExpanded((prev) => (prev.includes(path) ? prev : [...prev, path])),\n        redo: () => adapter.setExpanded((prev) => prev.filter((p) => p !== path)),\n      });\n      return textResult(`Collapsed ${path}`, { path, expanded: false });\n    },\n    fTarget,\n  );\n\n  // ───────────── Selection ─────────────\n\n  reg(\n    \"files_select\",\n    \"Set the selection to the given path(s). Pass a single `path`, or `paths` for a multi-select browser; either empty clears the selection.\",\n    {\n      path: { type: \"string\", description: \"A single path to select.\" },\n      paths: { type: \"array\", items: { type: \"string\" }, description: \"Multiple paths (multi-select browsers).\" },\n    },\n    [],\n    (args) => {\n      const next = (args.paths !== undefined ? asPaths(args.paths) : asPaths(args.path)).map(guard);\n      const prev = adapter.getSelection();\n      adapter.setSelection(next);\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"files\",\n        action: \"files_select\",\n        label: next.length ? `Selected ${next.join(\", \")}` : \"Cleared selection\",\n        undo: () => adapter.setSelection(prev),\n        redo: () => adapter.setSelection(next),\n      });\n      return textResult(next.length ? `Selected ${next.join(\", \")}` : \"Cleared selection\", {\n        selected: next,\n      });\n    },\n    fTarget,\n  );\n\n  // ───────────── Write (staged) ─────────────\n\n  if (adapter.createFolder) {\n    reg(\n      \"files_create_folder\",\n      \"Create a folder inside `parentPath`. Staged for human confirmation unless the host disabled pendingMode.\",\n      {\n        parentPath: { type: \"string\", description: \"Directory to create in; defaults to the current directory.\" },\n        name: { type: \"string\", description: \"The new folder's name. A leaf name — no separators.\" },\n        confirm: { type: \"boolean\", description: \"Acknowledge a staged write when the host wired no confirm hook.\" },\n      },\n      [\"name\"],\n      async (args) => {\n        const parentPath = guard(args.parentPath !== undefined ? str(args.parentPath) : adapter.getPath());\n        const name = str(args.name).trim();\n\n        const invalid = invalidFolderName(name);\n        if (invalid) return errorResult(invalid);\n\n        const label = `${parentPath}/${name}`;\n\n        if (pendingMode) {\n          if (options.confirm) {\n            const ok = await options.confirm({ action: \"files_create_folder\", path: label, label });\n            if (!ok) return errorResult(`Declined: create folder ${label} (human did not confirm).`);\n          } else if (args.confirm !== true) {\n            return errorResult(\n              `Staged: create folder ${label}. Re-call with confirm:true to proceed.`,\n            );\n          }\n        }\n\n        try {\n          await adapter.createFolder!({ parentPath, name });\n        } catch (e) {\n          // The host's filesystem is the authority on what is allowed —\n          // permissions, name rules, a race with another writer. Reporting its\n          // refusal as success would tell the agent a folder exists that does not.\n          return errorResult(e instanceof Error ? e.message : String(e));\n        }\n\n        return textResult(`Created folder ${label}.`, { parentPath, name, path: label });\n      },\n      (args) => ({ kind: \"directory\", path: `${str(args.parentPath)}/${str(args.name)}`, label: str(args.name) }),\n    );\n  }\n\n  // ───────────── Snapshot (streamed remote trees) ─────────────\n\n  reg(\n    \"files_request_snapshot\",\n    \"Request a fresh snapshot subtree rooted at `path` (snapshot mode) — e.g. to pull a remote machine's current tree. Requires the host to wire requestSnapshot.\",\n    {\n      path: { type: \"string\", description: \"Root of the subtree; defaults to the current directory.\" },\n      depth: { type: \"number\", description: \"How many levels deep to materialize (host-defined default).\" },\n    },\n    [],\n    async (args) => {\n      if (!adapter.requestSnapshot) {\n        return errorResult(\"Host did not wire requestSnapshot (snapshot mode not enabled).\");\n      }\n      const path = guard(args.path !== undefined ? str(args.path) : adapter.getPath());\n      // Clamp depth so an agent can't demand an unbounded recursive walk.\n      const depth =\n        args.depth !== undefined ? Math.max(0, Math.min(MAX_SNAPSHOT_DEPTH, num(args.depth))) : undefined;\n      const tree = await adapter.requestSnapshot(path, depth);\n      const count = Array.isArray(tree) ? tree.length : 0;\n      return textResult(`Snapshot of ${path}: ${count} top-level entr${count === 1 ? \"y\" : \"ies\"}.`, {\n        path,\n        snapshot: tree,\n      });\n    },\n    fTarget,\n  );\n\n  return {\n    id: bridgeId,\n    title: \"Files\",\n    dispose: () => {\n      for (const d of disposers) d();\n    },\n  };\n}\n","import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { CallToolResult, JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\nimport type { AgentTarget } from \"../presence/types\";\n\n/**\n * A shell/profile an agent can switch a terminal to. Mirrors fancy-term's\n * `ShellProfile` (kept local so the bridge never imports fancy-term).\n */\nexport type TerminalShell = { id: string; label: string; icon?: string };\n\n/**\n * One terminal the bridge can drive. A Human+ app often hosts **several**\n * terminals on a screen (a build pane, a server pane, an agent scratch shell);\n * each is a `TerminalRef` with a stable `id` so an agent can read/write any of\n * them — not just \"its own\". Wire the function fields to that terminal's\n * fancy-term `TerminalHandle`.\n */\nexport type TerminalRef = {\n  /** Stable id used to address this terminal (`terminal_list` enumerates them). */\n  id: string;\n  /** Human label, e.g. \"Build\", \"Server\". Defaults to the id. */\n  label?: string;\n  /** True for the focused terminal — the default target when no id is passed. */\n  active?: boolean;\n  /** Read the visible buffer as text (wire to `TerminalHandle.getBuffer`). */\n  getBuffer: () => string;\n  /** Write raw data / keystrokes (wire to `TerminalHandle.write`). */\n  write: (data: string) => void;\n  /** Run a command. Defaults to writing `${command}\\r`; override for a real runner. */\n  runCommand?: (command: string) => void | Promise<void>;\n  /** Clear the viewport (wire to `TerminalHandle.clear`). */\n  clear?: () => void;\n  /** Current text selection (wire to `TerminalHandle.getSelection`). */\n  getSelection?: () => string;\n  /** Shells this terminal offers (cmd, PowerShell, …). */\n  listShells?: () => TerminalShell[];\n  /** Switch this terminal's active shell by id. */\n  setShell?: (id: string) => void | Promise<void>;\n  /** This terminal's active shell id. */\n  getShell?: () => string | undefined;\n};\n\n/**\n * Single-terminal adapter (back-compat). A `TerminalRef` without the\n * `id`/`label`/`active` bookkeeping — pass it as `{ adapter }` and the bridge\n * treats it as the one (active) terminal. Use `{ terminals }` for multiple.\n */\nexport type TerminalBridgeAdapter = Omit<TerminalRef, \"id\" | \"label\" | \"active\"> & {\n  /** fancy-screens screen id (optional) so activity events know which screen the terminal lives in. */\n  screenId?: string;\n};\n\ntype StagedKind = \"write\" | \"run\";\ntype Staged = { id: string; kind: StagedKind; data: string; terminalId: string };\n\nexport type TerminalBridgeOptions = {\n  /** A single terminal (back-compat). Mutually exclusive with `terminals`. */\n  adapter?: TerminalBridgeAdapter;\n  /**\n   * The live list of terminals on the screen. Use this when the app hosts more\n   * than one terminal so an agent can `terminal_list` then target any of them by\n   * id — i.e. reach into another terminal in the same screen.\n   */\n  terminals?: () => TerminalRef[];\n  /** fancy-screens screen id for activity events (defaults to `adapter.screenId`). */\n  screenId?: string;\n  agent?: { id: string; name?: string; color?: string };\n  /**\n   * Trust-but-verify (Human+ contract for inhabited surfaces). When on,\n   * `terminal_write` + `terminal_run` don't execute — they **stage** the command\n   * (returning a pending id) and fire `onPending`. A human confirms via the\n   * returned bridge's `confirm(id)` (wire it to a human-only control).\n   *\n   * **Default: ON.** The terminal is the most dangerous surface (arbitrary shell),\n   * and possession of the relay session token = permission to call every tool, so\n   * it must fail SAFE. Pass `false` only for a fully-trusted, non-shared terminal\n   * where auto-execution is acceptable. A host that leaves this on MUST wire a\n   * human confirm path (`onPending` + `bridge.confirm`), or staged commands never run.\n   */\n  pendingMode?: boolean;\n  /** Notified when a command is staged (pendingMode) — show it + offer confirm / reject. */\n  onPending?: (pending: Staged) => void;\n  /**\n   * Expose `terminal_confirm` / `terminal_reject` as agent-callable tools.\n   * **Default: false** — otherwise the *same* agent that staged a command could\n   * confirm it, defeating the human-in-the-loop. Leave off and confirm via the\n   * returned `bridge.confirm(id)` wired to a human control.\n   */\n  allowAgentConfirm?: boolean;\n  /**\n   * Per-terminal authorization. Return false to hide a terminal id from this\n   * agent entirely (it won't appear in `terminal_list` and can't be targeted).\n   * Use it to scope an agent to its own pane(s); without it, `{ terminals }`\n   * grants the agent full read/write over EVERY terminal in the list.\n   */\n  canAccess?: (terminalId: string) => boolean;\n};\n\nexport type TerminalBridge = Bridge & {\n  /** Execute a staged command by id — wire a host confirm button to this. No-op if not pending. */\n  confirm: (id: string) => void;\n  /** Drop a staged command by id without executing. */\n  reject: (id: string) => void;\n  /** Commands currently awaiting confirmation. */\n  pending: () => Staged[];\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\nconst truncate = (s: string, n = 60): string => (s.length > n ? s.slice(0, n) + \"…\" : s);\n\n/**\n * registerTerminalBridge — MCP access to one **or many** terminal surfaces on a\n * screen. An agent reads the visible buffer (`terminal_read`), writes input\n * (`terminal_write`), and runs commands (`terminal_run`) through the host; every\n * mutation broadcasts an `AgentActivity` event. With `pendingMode`, destructive\n * actions are staged for human confirmation (`terminal_confirm` / `terminal_reject`\n * / `terminal_pending`).\n *\n * **Multi-terminal:** pass `{ terminals }` (vs a single `{ adapter }`) and every\n * tool takes an optional `terminal` id; `terminal_list` enumerates them. This is\n * how an agent **reaches into another terminal in the same screen** rather than\n * being stuck in one. When a terminal offers shells, the agent can also list\n * (`terminal_list_shells`) and switch (`terminal_set_shell`) its shell. Tool\n * prefix `terminal_*`.\n */\nexport function registerTerminalBridge(host: ToolHost, options: TerminalBridgeOptions): TerminalBridge {\n  const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n  // Safe-by-default: the terminal stages for human confirmation unless a host\n  // explicitly opts a trusted, non-shared terminal into auto-exec (see the\n  // pendingMode docs). Every other write bridge already defaults to staged.\n  const pendingMode = options.pendingMode ?? true;\n  const screenId = options.screenId ?? options.adapter?.screenId;\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 = \"terminal\";\n  const staged = new Map<string, Staged>();\n  let seq = 0;\n\n  // Enables agent_history (a log of what agents did across every bridge).\n  ensureUndoToolsRegistered(host);\n\n  // The live terminal list — from `terminals()` (multi) or the single `adapter`\n  // normalized to one active ref with the id \"terminal\".\n  const listTerminals = (): TerminalRef[] => {\n    const all = options.terminals\n      ? options.terminals()\n      : options.adapter\n        ? [{ id: \"terminal\", label: \"Terminal\", active: true, ...options.adapter }]\n        : [];\n    // Per-terminal ACL: an agent can only see/target terminals it's allowed to.\n    return options.canAccess ? all.filter((t) => options.canAccess!(t.id)) : all;\n  };\n\n  /** Resolve a terminal by id; with no id, the active one, else the first. */\n  const resolve = (id?: unknown): TerminalRef | undefined => {\n    const list = listTerminals();\n    if (typeof id === \"string\" && id !== \"\") return list.find((t) => t.id === id);\n    return list.find((t) => t.active) ?? list[0];\n  };\n\n  // Whether any host config can offer these capabilities (gates tool registration;\n  // per-call we still check the *resolved* terminal supports it).\n  const anyMulti = !!options.terminals;\n  const canClear = anyMulti || !!options.adapter?.clear;\n  const canShells = anyMulti || !!options.adapter?.listShells;\n  const canSetShell = anyMulti || !!options.adapter?.setShell;\n\n  const target = (label?: string, terminalId?: string): AgentTarget => ({\n    kind: \"terminal\",\n    screenId,\n    elementId: terminalId ?? screenId ?? \"terminal\",\n    label: label ?? \"terminal\",\n  });\n\n  // Broadcast meta for terminal mutations: shape only, never the raw command /\n  // keystroke bytes (those may hold secrets, and the relay fans meta to every\n  // peer). Full data stays local to the tool result + onPending / bridge.confirm.\n  const redactMeta = (result: CallToolResult): Record<string, unknown> | undefined => {\n    const sc = result.structuredContent as Record<string, unknown> | undefined;\n    if (!sc || typeof sc !== \"object\") return undefined;\n    return {\n      terminal: sc.terminal,\n      kind: sc.kind,\n      length: typeof sc.data === \"string\" ? (sc.data as string).length : undefined,\n      executed: sc.executed,\n      pending: sc.pending,\n    };\n  };\n\n  const TERMINAL_ARG = {\n    terminal: {\n      type: \"string\",\n      description: \"Terminal id to target (call terminal_list for ids). Omit for the active / only terminal.\",\n    },\n  };\n\n  const reg = (\n    name: string,\n    description: string,\n    properties: Record<string, unknown>,\n    required: string[],\n    handler: (args: JsonObject) => Promise<any> | any,\n    isMutation: boolean,\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 = isMutation\n      ? wrapToolWithActivity(wrapped, {\n          toolName: name,\n          agent,\n          kind: \"terminal\",\n          screenId,\n          // A per-call resolver may return null to SKIP the broadcast (e.g. a\n          // merely-staged command); only fall back to the default target when no\n          // resolver was supplied.\n          resolveTarget: ({ args, result }) => (resolveTarget ? resolveTarget(args, result) : target()),\n          // Never fan raw command/keystroke bytes to peers — broadcast shape only.\n          buildMeta: redactMeta,\n        })\n      : wrapped;\n    disposers.push(\n      host.registerTool(\n        {\n          name,\n          description,\n          inputSchema: { type: \"object\", properties: properties as any, required, additionalProperties: false },\n        },\n        final as any,\n        { owner: bridgeId },\n      ),\n    );\n  };\n\n  /** Resolve the targeted terminal or throw a clear error for the agent. */\n  const need = (args: JsonObject): TerminalRef => {\n    const t = resolve(args.terminal);\n    if (!t) {\n      const ids = listTerminals().map((x) => x.id).join(\", \") || \"(none)\";\n      throw new Error(\n        typeof args.terminal === \"string\" && args.terminal\n          ? `Unknown terminal '${args.terminal}'. Available: ${ids}. Use terminal_list.`\n          : \"No terminal available.\",\n      );\n    }\n    return t;\n  };\n\n  async function exec(t: TerminalRef, kind: StagedKind, data: string): Promise<void> {\n    if (kind === \"run\") {\n      if (t.runCommand) await t.runCommand(data);\n      else t.write(data + \"\\r\");\n    } else {\n      t.write(data);\n    }\n  }\n\n  async function stageOrExec(t: TerminalRef, kind: StagedKind, data: string) {\n    // The human-facing summary truncates for readability, but the full payload\n    // + its length ride in structuredContent / onPending so a confirm UI never\n    // silently under-shows a long escape/injection payload.\n    if (!pendingMode) {\n      await exec(t, kind, data);\n      return textResult(`${kind === \"run\" ? \"ran\" : \"wrote\"} on ${t.id}: ${truncate(data)}`, {\n        kind,\n        data,\n        length: data.length,\n        terminal: t.id,\n        executed: true,\n      });\n    }\n    const id = `t${++seq}`;\n    const entry: Staged = { id, kind, data, terminalId: t.id };\n    staged.set(id, entry);\n    options.onPending?.(entry);\n    return textResult(\n      `Staged ${kind} on ${t.id} (id ${id}) — awaiting human confirmation: ${truncate(data)}`,\n      { ...entry, length: data.length, pending: true },\n    );\n  }\n\n  // ── List ──────────────────────────────────────────────────────────────────\n  reg(\n    \"terminal_list\",\n    \"List the terminals on this screen (id, label, which is active) — so you can reach into another terminal, not just the active one. Pass the chosen id as `terminal` to the other tools.\",\n    {},\n    [],\n    () => {\n      const list = listTerminals().map((t) => ({ id: t.id, label: t.label ?? t.id, active: !!t.active }));\n      const text = list.length\n        ? list.map((t) => `${t.active ? \"* \" : \"  \"}${t.id} — ${t.label}`).join(\"\\n\")\n        : \"(no terminals)\";\n      return textResult(text, { terminals: list });\n    },\n    false,\n  );\n\n  // ── Read ──────────────────────────────────────────────────────────────────\n  reg(\n    \"terminal_read\",\n    \"Read a terminal's visible buffer as text — what the user sees. Pass `tail` for only the last N lines, `terminal` to read a specific one.\",\n    { ...TERMINAL_ARG, tail: { type: \"number\", description: \"Return only the last N lines.\" } },\n    [],\n    (args) => {\n      const t = need(args);\n      let buf = t.getBuffer();\n      const tail = typeof args.tail === \"number\" ? args.tail : undefined;\n      if (tail && tail > 0) buf = buf.split(\"\\n\").slice(-tail).join(\"\\n\");\n      return textResult(buf, { buffer: buf, terminal: t.id });\n    },\n    false,\n  );\n\n  reg(\n    \"terminal_pending\",\n    \"List commands staged for human confirmation (pendingMode).\",\n    {},\n    [],\n    () => {\n      const list = [...staged.values()];\n      return textResult(\n        list.length ? list.map((s) => `${s.id}: ${s.kind} on ${s.terminalId} ${truncate(s.data)}`).join(\"\\n\") : \"(none)\",\n        { pending: list },\n      );\n    },\n    false,\n  );\n\n  // ── Mutations ───────────────────────────────────────────────────────────────\n  reg(\n    \"terminal_write\",\n    \"Write raw data / keystrokes to a terminal (input, control chars, ANSI). Pass `terminal` to target a specific one. In pendingMode this stages instead of executing. NOTE: bytes are written verbatim — an embedded CR runs a command, and ANSI/OSC sequences reach the terminal; treat this exactly like terminal_run for gating.\",\n    { ...TERMINAL_ARG, data: { type: \"string\", description: \"Raw bytes to write.\" } },\n    [\"data\"],\n    (args) => stageOrExec(need(args), \"write\", String(args.data)),\n    true,\n    // Skip the peer broadcast while only staged; emit once it actually executes.\n    (args, result) =>\n      result?.structuredContent?.pending ? null : target(`write:${String(args.terminal ?? \"\")}`, resolve(args.terminal)?.id),\n  );\n\n  reg(\n    \"terminal_run\",\n    \"Run a shell command in a terminal — writes the command + Enter (or the host's runner). Pass `terminal` to target a specific one. In pendingMode this stages it for confirmation.\",\n    { ...TERMINAL_ARG, command: { type: \"string\", description: \"The command line to run.\" } },\n    [\"command\"],\n    (args) => stageOrExec(need(args), \"run\", String(args.command)),\n    true,\n    (args, result) =>\n      result?.structuredContent?.pending ? null : target(truncate(String(args.command ?? \"\")), resolve(args.terminal)?.id),\n  );\n\n  // Confirmation is HUMAN-driven by default: the acting agent must not be able to\n  // confirm its own staged command (that would defeat pendingMode). Hosts confirm\n  // via the returned `bridge.confirm(id)` wired to a human control. Only expose\n  // the agent-callable tools when a host explicitly opts in.\n  if (options.allowAgentConfirm) {\n    reg(\n      \"terminal_confirm\",\n      \"Confirm + execute a staged command by id (pendingMode).\",\n      { id: { type: \"string\" } },\n      [\"id\"],\n      async (args) => {\n        const id = String(args.id);\n        const entry = staged.get(id);\n        if (!entry) return errorResult(`No staged command ${id}`);\n        const t = resolve(entry.terminalId);\n        if (!t) return errorResult(`Terminal '${entry.terminalId}' is gone — cannot run ${id}`);\n        staged.delete(id);\n        await exec(t, entry.kind, entry.data);\n        return textResult(`Confirmed ${id}: ${entry.kind} on ${t.id} ${truncate(entry.data)}`, {\n          ...entry,\n          length: entry.data.length,\n          executed: true,\n        });\n      },\n      true,\n      (args) => {\n        const e = staged.get(String(args.id));\n        return target(`confirm:${String(args.id ?? \"\")}`, e?.terminalId);\n      },\n    );\n\n    reg(\n      \"terminal_reject\",\n      \"Drop a staged command by id without executing it.\",\n      { id: { type: \"string\" } },\n      [\"id\"],\n      (args) => {\n        const id = String(args.id);\n        if (!staged.delete(id)) return errorResult(`No staged command ${id}`);\n        return textResult(`Rejected ${id}`, { id, rejected: true });\n      },\n      false,\n    );\n  }\n\n  if (canClear) {\n    reg(\n      \"terminal_clear\",\n      \"Clear a terminal's viewport. Pass `terminal` to target a specific one.\",\n      { ...TERMINAL_ARG },\n      [],\n      (args) => {\n        const t = need(args);\n        if (!t.clear) return errorResult(`Terminal '${t.id}' can't be cleared.`);\n        t.clear();\n        return textResult(`cleared ${t.id}`, { terminal: t.id });\n      },\n      true,\n      (args) => target(`clear:${String(args.terminal ?? \"\")}`, resolve(args.terminal)?.id),\n    );\n  }\n\n  // ── Shells ──────────────────────────────────────────────────────────────────\n  if (canShells) {\n    reg(\n      \"terminal_list_shells\",\n      \"List the shells a terminal can switch to (cmd, PowerShell, Git Bash, …) — id + label, active one marked. Pass `terminal` to target a specific one.\",\n      { ...TERMINAL_ARG },\n      [],\n      (args) => {\n        const t = need(args);\n        if (!t.listShells) return errorResult(`Terminal '${t.id}' has no switchable shells.`);\n        const shells = t.listShells();\n        const active = t.getShell?.();\n        const text = shells.length\n          ? shells.map((s) => `${s.id === active ? \"* \" : \"  \"}${s.id} — ${s.label}`).join(\"\\n\")\n          : \"(none)\";\n        return textResult(text, { shells, active, terminal: t.id });\n      },\n      false,\n    );\n  }\n\n  if (canSetShell) {\n    reg(\n      \"terminal_set_shell\",\n      \"Switch a terminal's active shell by id (e.g. 'powershell', 'git-bash'). Call terminal_list_shells first for valid ids. Pass `terminal` to target a specific one.\",\n      { ...TERMINAL_ARG, id: { type: \"string\", description: \"Shell id to switch to.\" } },\n      [\"id\"],\n      async (args) => {\n        const t = need(args);\n        if (!t.setShell) return errorResult(`Terminal '${t.id}' can't switch shells.`);\n        const id = String(args.id);\n        // Fail closed: only allow a shell that is explicitly listed. A terminal\n        // exposing setShell without listShells (or with an empty list) rejects\n        // every id, so an unvalidated agent string can never reach setShell\n        // (which a host may map to an executable = arbitrary-binary launch).\n        const shells = t.listShells?.();\n        if (!shells || !shells.some((s) => s.id === id)) {\n          return errorResult(\n            `Unknown or unlisted shell '${id}' for ${t.id}. Call terminal_list_shells for valid ids.`,\n          );\n        }\n        await t.setShell(id);\n        return textResult(`Switched ${t.id} shell to ${id}`, { shell: id, terminal: t.id });\n      },\n      true,\n      (args) => target(`shell:${String(args.id ?? \"\")}`, resolve(args.terminal)?.id),\n    );\n  }\n\n  return {\n    id: bridgeId,\n    title: \"Terminal\",\n    dispose: () => {\n      disposers.forEach((d) => d());\n      disposers.length = 0;\n      staged.clear();\n    },\n    confirm: (id: string) => {\n      const e = staged.get(id);\n      if (e) {\n        const t = resolve(e.terminalId);\n        staged.delete(id);\n        if (t) void exec(t, e.kind, e.data);\n      }\n    },\n    reject: (id: string) => {\n      staged.delete(id);\n    },\n    pending: () => [...staged.values()],\n  };\n}\n","import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport type { AgentTarget } from \"../presence/types\";\nimport { pushUndoEntry } from \"../undo/undo-stack\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\n\n/**\n * One interactive element the agent can act on, addressed by a STABLE handle\n * (not a CSS selector) so the agent drives the page the Human+ way — never DOM\n * scraping. The host builds these in `describe()` (data-co-handle → name/id →\n * ARIA role + accessible name).\n */\nexport type PageAction = {\n  /** Stable, opaque handle the agent passes back to act on this element. */\n  handle: string;\n  /** ARIA-ish role: \"link\" | \"button\" | \"textbox\" | \"checkbox\" | \"select\" | … */\n  role: string;\n  /** Accessible name / label. */\n  label: string;\n  /** Current value for inputs (omitted/masked for sensitive fields). */\n  value?: unknown;\n  /** True when activating this is destructive / submits (agent should stage). */\n  destructive?: boolean;\n};\n\n/** The page as the agent sees it: where it is + what it can do. */\nexport type PageSnapshot = {\n  url: string;\n  title: string;\n  actions: PageAction[];\n  /** Monotonic host revision. Human input advances it and invalidates stale agent intent. */\n  revision?: number;\n};\n\n/**\n * Structured page text. Preferred over a plain string from `read()`: the bridge\n * can then put every page-supplied string on its own single line and keep the\n * outline. A plain string is untrusted as a whole and is rendered as ONE line.\n */\nexport type PageReadout = {\n  title: string;\n  headings: Array<{ level: number; text: string }>;\n  text: string;\n};\n\n/** A write the host may want the human to confirm (trust-but-verify). */\nexport type NavigationConfirmRequest = {\n  action: \"submit\" | \"click\";\n  handle: string;\n  label: string;\n};\n\ntype MaybePromise<T> = T | Promise<T>;\n\n/**\n * Host-provided adapter. In the sandbox this is backed by Inertia's `router` +\n * the DOM walker from `@particle-academy/agent-integrations/dom-navigation`.\n * Every method works on stable handles, never raw selectors.\n *\n * Any method may return a Promise: a host driving a page it does not run in\n * (an Electron WebContentsView, via `createRemoteNavigationAdapter`) can only\n * answer asynchronously. The bridge awaits every call.\n */\nexport type NavigationBridgeAdapter = {\n  /** Optional fancy-screens screen id for presence targeting. */\n  screenId?: string;\n  /** Current location. */\n  getLocation: () => MaybePromise<{ url: string; title: string }>;\n  /** Current human-control revision. Omit to disable stale-intent protection. */\n  getRevision?: () => MaybePromise<number>;\n  /** Snapshot of the page's actionable elements (stable handles + labels). */\n  describe: () => MaybePromise<PageSnapshot>;\n  /** Visible text / heading outline for grounding (optional). Prefer a {@link PageReadout}. */\n  read?: () => MaybePromise<string | PageReadout>;\n  /** Navigate to a URL (host wires to router.visit). */\n  visit: (url: string) => void | Promise<void>;\n  back?: () => void | Promise<void>;\n  forward?: () => void | Promise<void>;\n  /** Scroll to coords or to a handle's element. */\n  scrollTo: (opts: { x?: number; y?: number; handle?: string }) => void | Promise<void>;\n  scrollBy: (dy: number) => void | Promise<void>;\n  /** Set a field's value by handle (host dispatches input/change for React). */\n  setField: (handle: string, value: unknown) => MaybePromise<{ ok: boolean; error?: string }>;\n  /** Activate an element by handle. */\n  click: (handle: string) => MaybePromise<{ ok: boolean; error?: string }>;\n  /** Submit a form by handle. */\n  submit: (handle: string) => Promise<{ ok: boolean; error?: string }> | { ok: boolean; error?: string };\n  /**\n   * Viewport rect of a handle's element, for agent-presence rendering (cursor +\n   * highlight). Returned in tool `meta.rect` so `<CoBrowseCursorLayer>` can show\n   * the agent acting on the page. Optional — omit and there's just no cursor.\n   */\n  rectFor?: (handle: string) => MaybePromise<{ x: number; y: number; width: number; height: number } | null>;\n  /**\n   * Trust-but-verify hook. When `pendingMode` is on, `page_submit` and\n   * destructive `page_click` route through this; the host shows a prompt and\n   * resolves true (proceed) / false (declined).\n   */\n  confirm?: (req: NavigationConfirmRequest) => Promise<boolean>;\n};\n\nexport type NavigationBridgeOptions = {\n  adapter: NavigationBridgeAdapter;\n  /** Identity tagged into activity events (so the human sees who's driving). */\n  agent?: { id: string; name?: string; color?: string };\n  /** Route submit + destructive clicks through `adapter.confirm`. Default true. */\n  pendingMode?: boolean;\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n// ───────────── Text safety ─────────────\n//\n// Every string below the adapter is page-supplied, and the page may be hostile.\n// The tool TEXT is what lands in the agent's context, so a line break inside a\n// label would let the page write its own lines there: a forged action, a forged\n// heading, forged tool framing. Each page string is therefore rendered on ONE\n// line, with C0/C1 controls and the Unicode line/paragraph separators replaced,\n// and capped. (Control characters are tested by code point, so no escape\n// sequence is involved.)\n\nconst isControl = (code: number) =>\n  code < 0x20 || (code >= 0x7f && code <= 0x9f) || code === 0x2028 || code === 0x2029;\n\n/** One line, controls replaced by spaces, whitespace collapsed, capped at `max`. */\nfunction oneLine(value: unknown, max: number): string {\n  const raw = typeof value === \"string\" ? value : value == null ? \"\" : String(value);\n  // Bound the work on a hostile multi-megabyte string before scanning it.\n  const bounded = raw.length > max * 4 ? raw.slice(0, max * 4) : raw;\n  let out = \"\";\n  for (const c of bounded) out += isControl(c.charCodeAt(0)) ? \" \" : c;\n  out = out.replace(/\\s+/g, \" \").trim();\n  return out.length > max ? out.slice(0, max - 3) + \"...\" : out;\n}\n\n/**\n * A handle shown verbatim must not be able to imitate the `[handle] role:`\n * syntax, so only this charset is shown as-is. Anything else — spaces,\n * brackets, controls, or a `~`, which is reserved so a page cannot squat on an\n * alias — is shown as a bridge-minted `~N` alias that resolves back to it.\n */\nconst SAFE_HANDLE = /^[A-Za-z0-9_.:#@/-]{1,80}$/;\n\nconst CAP = { url: 500, title: 200, role: 40, label: 200, heading: 200, text: 4000, error: 300, headings: 50 };\n\nfunction formatReadout(r: string | PageReadout): string {\n  if (typeof r === \"string\") return oneLine(r, CAP.text);\n  const headings = (Array.isArray(r.headings) ? r.headings : [])\n    .slice(0, CAP.headings)\n    .map((h) => `H${Math.min(6, Math.max(1, Math.trunc(Number(h?.level)) || 1))}: ${oneLine(h?.text, CAP.heading)}`);\n  return [oneLine(r.title, CAP.title), ...headings, \"\", oneLine(r.text, CAP.text)].join(\"\\n\");\n}\n\n/**\n * registerNavigationBridge — site-wide co-browsing. Lets a connected agent\n * navigate, scroll, and (with staged confirm) fill + click any page, addressed\n * by stable handles. Pairs with `useCoBrowseSession` (server + relay) and\n * `<CoBrowsePresence>` (the human's view of the agent). The 12th Fancy bridge.\n */\nexport function registerNavigationBridge(\n  host: ToolHost,\n  options: NavigationBridgeOptions,\n): Bridge {\n  const { adapter } = options;\n  const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n  const pendingMode = options.pendingMode ?? true;\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 = \"navigation\";\n  let groundedRevision: number | null = null;\n\n  const staleIntent = async () => {\n    const current = await adapter.getRevision?.();\n    if (current === undefined) return null;\n    if (groundedRevision === null || groundedRevision !== current) {\n      return errorResult(\n        `Human took control at page revision ${current}. This agent action was cancelled; call page_describe before acting again.`,\n      );\n    }\n    return null;\n  };\n\n  /** Alias → page handle, from the latest page_describe. */\n  let aliases = new Map<string, string>();\n  /** The handle the adapter knows, for a handle the agent passed back. */\n  const pageHandle = (handle: string) => aliases.get(handle) ?? handle;\n  /** A failure message that may carry page-supplied text. */\n  const failure = (message: unknown, fallback: string) => errorResult(oneLine(message ?? fallback, CAP.error) || fallback);\n\n  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n  const target = (label: string, elementId?: string): AgentTarget => ({\n    kind: \"navigation\",\n    screenId: adapter.screenId,\n    elementId,\n    label,\n  });\n\n  const reg = (\n    name: string,\n    description: string,\n    properties: Record<string, unknown>,\n    required: string[],\n    handler: (args: JsonObject) => Promise<any> | any,\n    activity: false | ((args: JsonObject) => AgentTarget),\n  ) => {\n    const wrapped = async (args: JsonObject) => {\n      try {\n        return await handler(args);\n      } catch (e) {\n        // A transport into the page can surface the page's own error text.\n        return failure(e instanceof Error ? e.message : String(e), `${name} failed`);\n      }\n    };\n    const final = activity\n      ? wrapToolWithActivity(wrapped, {\n          toolName: name,\n          agent: { id: agent.id, name: agent.name, color: agent.color },\n          kind: \"navigation\",\n          screenId: adapter.screenId,\n          resolveTarget: ({ args }) => activity(args),\n        })\n      : wrapped;\n    disposers.push(\n      host.registerTool(\n        {\n          name,\n          description,\n          inputSchema: { type: \"object\", properties: properties as any, required, additionalProperties: false },\n        },\n        final as any,\n        { owner: bridgeId },\n      ),\n    );\n  };\n\n  // ───────────── Read ─────────────\n\n  reg(\n    \"page_describe\",\n    \"Describe the current page: its URL, title, and the interactive elements you can act on (each with a stable `handle`, role, and label). Call this first, and again after navigating.\",\n    {},\n    [],\n    async () => {\n      const raw = await adapter.describe();\n      const next = new Map<string, string>();\n      const actions = (Array.isArray(raw.actions) ? raw.actions : []).map((a) => {\n        const handle = String(a.handle ?? \"\");\n        if (SAFE_HANDLE.test(handle)) return a;\n        const alias = `~${next.size}`;\n        next.set(alias, handle);\n        return { ...a, handle: alias };\n      });\n      aliases = next;\n      const snap: PageSnapshot = { ...raw, actions };\n      const revision = await adapter.getRevision?.();\n      if (revision !== undefined) {\n        snap.revision = revision;\n        groundedRevision = revision;\n      }\n      const text = [\n        `URL: ${oneLine(snap.url, CAP.url)}`,\n        `Title: ${oneLine(snap.title, CAP.title)}`,\n        \"\",\n        ...actions.map(\n          (a) =>\n            `[${a.handle}] ${oneLine(a.role, CAP.role)}: ${oneLine(a.label, CAP.label)}${a.destructive ? \" (destructive)\" : \"\"}`,\n        ),\n      ].join(\"\\n\");\n      return textResult(text, snap);\n    },\n    () => target(\"Inspect page\"),\n  );\n\n  reg(\n    \"page_read\",\n    \"Read the page's visible text / heading outline for grounding.\",\n    {},\n    [],\n    async () => {\n      const r = adapter.read ? await adapter.read() : undefined;\n      return textResult(r == null ? \"(host did not provide page text)\" : formatReadout(r));\n    },\n    () => target(\"Read page\"),\n  );\n\n  reg(\n    \"page_focus\",\n    \"Move the agent's visible focus to an interactive element by stable handle without activating it.\",\n    { handle: { type: \"string\" } },\n    [\"handle\"],\n    async (args) => {\n      const stale = await staleIntent();\n      if (stale) return stale;\n      const shown = String(args.handle ?? \"\");\n      const handle = pageHandle(shown);\n      const action = (await adapter.describe()).actions.find((candidate) => candidate.handle === handle);\n      if (!action) return failure(`No element for handle \"${shown}\"`, \"No element for that handle\");\n      return textResult(`Focused ${oneLine(shown, CAP.label)}`, {\n        handle: shown,\n        rect: (await adapter.rectFor?.(handle)) ?? undefined,\n      });\n    },\n    (args) => target(`Focus ${String(args.handle ?? \"\")}`, String(args.handle ?? \"\")),\n  );\n\n  // ───────────── Navigate / scroll ─────────────\n\n  reg(\n    \"nav_visit\",\n    \"Navigate to a URL (same-site path or absolute). The human watches the page change.\",\n    { url: { type: \"string\", description: \"Path like /packages or an absolute URL.\" } },\n    [\"url\"],\n    async (args) => {\n      const stale = await staleIntent();\n      if (stale) return stale;\n      const url = String(args.url ?? \"\");\n      if (!url) return errorResult(\"url is required\");\n      // Scheme allow-list: permit only same-site/relative paths and http(s)\n      // absolutes. A `javascript:` / `data:` / `file:` / `vbscript:` URL handed\n      // to a host that wires visit() to window.location would execute as the\n      // human — a semi-trusted agent (steerable via page_read prompt injection)\n      // must not reach those.\n      const scheme = /^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(url)?.[1]?.toLowerCase();\n      if (scheme && scheme !== \"http\" && scheme !== \"https\") {\n        return errorResult(\n          `Refusing to navigate to a '${scheme}:' URL. Only http(s) URLs or same-site paths are allowed.`,\n        );\n      }\n      const from = (await adapter.getLocation()).url;\n      await adapter.visit(url);\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: \"navigation\",\n        action: \"nav_visit\",\n        label: `Navigate to ${url}`,\n        undo: async () => {\n          await adapter.visit(from);\n        },\n        redo: async () => {\n          await adapter.visit(url);\n        },\n      });\n      return textResult(`Navigated to ${url}`, { url });\n    },\n    (args) => target(`Navigate → ${String(args.url ?? \"\")}`),\n  );\n\n  reg(\n    \"nav_back\",\n    \"Go back to the previous page.\",\n    {},\n    [],\n    async () => {\n      const stale = await staleIntent();\n      if (stale) return stale;\n      if (!adapter.back) return errorResult(\"Host did not provide back navigation.\");\n      await adapter.back();\n      return textResult(\"Went back\");\n    },\n    () => target(\"Back\"),\n  );\n\n  reg(\n    \"nav_forward\",\n    \"Go forward to the next page.\",\n    {},\n    [],\n    async () => {\n      const stale = await staleIntent();\n      if (stale) return stale;\n      if (!adapter.forward) return errorResult(\"Host did not provide forward navigation.\");\n      await adapter.forward();\n      return textResult(\"Went forward\");\n    },\n    () => target(\"Forward\"),\n  );\n\n  reg(\n    \"nav_scroll_to\",\n    \"Scroll the page to absolute coordinates, or to a specific element by its handle.\",\n    {\n      handle: { type: \"string\", description: \"Scroll this element into view.\" },\n      x: { type: \"number\" },\n      y: { type: \"number\" },\n    },\n    [],\n    async (args) => {\n      const stale = await staleIntent();\n      if (stale) return stale;\n      const shown = typeof args.handle === \"string\" ? args.handle : undefined;\n      const handle = shown === undefined ? undefined : pageHandle(shown);\n      await adapter.scrollTo({\n        handle,\n        x: typeof args.x === \"number\" ? args.x : undefined,\n        y: typeof args.y === \"number\" ? args.y : undefined,\n      });\n      return textResult(\n        \"Scrolled\",\n        handle ? { handle: shown, rect: (await adapter.rectFor?.(handle)) ?? undefined } : undefined,\n      );\n    },\n    () => target(\"Scroll\"),\n  );\n\n  reg(\n    \"nav_scroll_by\",\n    \"Scroll the page by a vertical delta in pixels (negative scrolls up).\",\n    { dy: { type: \"number\" } },\n    [\"dy\"],\n    async (args) => {\n      const stale = await staleIntent();\n      if (stale) return stale;\n      await adapter.scrollBy(Number(args.dy ?? 0));\n      return textResult(`Scrolled by ${Number(args.dy ?? 0)}px`);\n    },\n    () => target(\"Scroll\"),\n  );\n\n  // ───────────── Co-drive (fill / click / submit) ─────────────\n\n  reg(\n    \"page_set_field\",\n    \"Set a form field's value by handle. The host updates the controlled input and the human sees it change.\",\n    {\n      handle: { type: \"string\" },\n      value: { description: \"Value to set; type matches the field.\" },\n    },\n    [\"handle\", \"value\"],\n    async (args) => {\n      const stale = await staleIntent();\n      if (stale) return stale;\n      const shown = String(args.handle ?? \"\");\n      const handle = pageHandle(shown);\n      const res = await adapter.setField(handle, args.value);\n      if (!res.ok) return failure(res.error, `Could not set ${oneLine(shown, CAP.label)}`);\n      return textResult(`${oneLine(shown, CAP.label)} ← ${JSON.stringify(args.value)}`, {\n        handle: shown,\n        value: args.value,\n        rect: (await adapter.rectFor?.(handle)) ?? undefined,\n      });\n    },\n    (args) => target(`Set ${String(args.handle ?? \"\")}`, String(args.handle ?? \"\")),\n  );\n\n  reg(\n    \"page_click\",\n    \"Activate an element by handle (link, button, checkbox…). Destructive elements are staged for the human to confirm.\",\n    { handle: { type: \"string\" } },\n    [\"handle\"],\n    async (args) => {\n      const stale = await staleIntent();\n      if (stale) return stale;\n      const shown = String(args.handle ?? \"\");\n      const handle = pageHandle(shown);\n      const action = (await adapter.describe()).actions.find((a) => a.handle === handle);\n      const rect = (await adapter.rectFor?.(handle)) ?? undefined; // capture before the click may navigate away\n      if (pendingMode && action?.destructive && adapter.confirm) {\n        const ok = await adapter.confirm({ action: \"click\", handle, label: action.label });\n        if (!ok) return errorResult(\"Declined by user\");\n      }\n      const res = await adapter.click(handle);\n      if (!res.ok) return failure(res.error, `Could not click ${oneLine(shown, CAP.label)}`);\n      return textResult(`Clicked ${oneLine(shown, CAP.label)}`, { handle: shown, rect });\n    },\n    (args) => target(`Click ${String(args.handle ?? \"\")}`, String(args.handle ?? \"\")),\n  );\n\n  reg(\n    \"page_submit\",\n    \"Submit a form by handle. Always staged for the human to confirm when pendingMode is on.\",\n    { handle: { type: \"string\" } },\n    [\"handle\"],\n    async (args) => {\n      const stale = await staleIntent();\n      if (stale) return stale;\n      const shown = String(args.handle ?? \"\");\n      const handle = pageHandle(shown);\n      const rect = (await adapter.rectFor?.(handle)) ?? undefined; // capture before the submit navigates\n      if (pendingMode && adapter.confirm) {\n        const ok = await adapter.confirm({ action: \"submit\", handle, label: handle });\n        if (!ok) return errorResult(\"Declined by user\");\n      }\n      const res = await adapter.submit(handle);\n      if (!res.ok) return failure(res.error, \"Submit failed\");\n      return textResult(`Submitted ${oneLine(shown, CAP.label)}`, { handle: shown, rect });\n    },\n    (args) => target(`Submit ${String(args.handle ?? \"\")}`, String(args.handle ?? \"\")),\n  );\n\n  return {\n    id: bridgeId,\n    title: \"Co-browsing\",\n    dispose: () => {\n      for (const d of disposers) d();\n    },\n  };\n}\n","import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport type { AgentTarget } from \"../presence/types\";\nimport { pushUndoEntry } from \"../undo/undo-stack\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\n\n/**\n * Headless bridge for `@particle-academy/fancy-catalog` — a Stripe catalog with\n * NO UI surface. The adapter exposes the catalog's STORES + operations (not UI\n * getters/setters), and the tools are CRUD over products / prices + checkout +\n * Stripe sync. Mutations still funnel through `wrapToolWithActivity` so presence\n * + undo compose, and the destructive delete is `pendingMode`-gated.\n *\n * The adapter shapes below are STRUCTURAL mirrors of fancy-catalog's public\n * `Catalog` + store interfaces, defined LOCALLY so this bridge builds with the\n * sibling package absent (it's an optional peer). A real `Catalog` instance is\n * assignable to `CatalogBridgeAdapter` with no import — TypeScript is structural.\n */\n\n/** Minimal product shape crossing the MCP wire (mirror of fancy-catalog `Product`). */\nexport type CatalogProduct = {\n  id: string;\n  name: string;\n  description?: string | null;\n  active?: boolean;\n  lookupKey?: string | null;\n  externalId?: string | null;\n  metadata?: Record<string, unknown> | null;\n  [k: string]: unknown;\n};\n\n/** Minimal price shape crossing the MCP wire (mirror of fancy-catalog `Price`). */\nexport type CatalogPrice = {\n  id: string;\n  productId: string;\n  active?: boolean;\n  currency: string;\n  unitAmount: number;\n  type: \"recurring\" | \"one_time\";\n  externalId?: string | null;\n  [k: string]: unknown;\n};\n\n/** Common checkout args (mirror of fancy-catalog `CheckoutArgs`). */\nexport type CatalogCheckoutArgs = {\n  customer?: string;\n  successUrl: string;\n  cancelUrl: string;\n  metadata?: Record<string, string>;\n  /** One-time checkouts only. */\n  quantity?: number;\n};\n\n/**\n * Adapter = the catalog instance / stores. A live `Catalog` from fancy-catalog\n * satisfies this directly (`catalog.products`, `catalog.createProduct`, …); a\n * host can also hand-roll one over its own persistence.\n */\nexport type CatalogBridgeAdapter = {\n  /** Stable id for this catalog instance (multiple catalogs ⇒ distinct ids). */\n  id?: string;\n  /** Display label for logs / presence. */\n  title?: string;\n  /** Optional fancy-screens screen id (usually unset — this is headless). */\n  screenId?: string;\n\n  /** Product store — `catalog.products`. */\n  products: {\n    find(id: string, opts?: { withTrashed?: boolean }): CatalogProduct | null | Promise<CatalogProduct | null>;\n    all(opts?: { withTrashed?: boolean }): CatalogProduct[] | Promise<CatalogProduct[]>;\n    remove(id: string): void | Promise<void>;\n  };\n  /** Price store — `catalog.prices`. */\n  prices: {\n    find(id: string, opts?: { withTrashed?: boolean }): CatalogPrice | null | Promise<CatalogPrice | null>;\n    forProduct(productId: string, opts?: { withTrashed?: boolean }): CatalogPrice[] | Promise<CatalogPrice[]>;\n    all(opts?: { withTrashed?: boolean }): CatalogPrice[] | Promise<CatalogPrice[]>;\n    remove(id: string): void | Promise<void>;\n  };\n\n  /** Authoring helpers — `catalog.createProduct` / `catalog.createPrice` (ULIDs auto-assigned). */\n  createProduct(input: Partial<CatalogProduct> & { name: string }): Promise<CatalogProduct> | CatalogProduct;\n  createPrice(\n    input: Partial<CatalogPrice> & { productId: string; currency: string; unitAmount: number; type: \"recurring\" | \"one_time\" },\n  ): Promise<CatalogPrice> | CatalogPrice;\n\n  /** Stripe sync — `catalog.syncProductAndPrices`. Optional (no-op when absent). */\n  syncProductAndPrices?(product: CatalogProduct): Promise<CatalogProduct> | CatalogProduct;\n  /** Connection test — `catalog.testConnection`. Optional. */\n  testConnection?(): Promise<{ success: boolean; message: string; productCount?: number }> | { success: boolean; message: string; productCount?: number };\n\n  /** Hosted Checkout — `catalog.getSubscriptionCheckoutUrl` / `getOneTimeCheckoutUrl`. Optional. */\n  getSubscriptionCheckoutUrl?(price: CatalogPrice, args: CatalogCheckoutArgs): Promise<string> | string;\n  getOneTimeCheckoutUrl?(price: CatalogPrice, args: CatalogCheckoutArgs): Promise<string> | string;\n};\n\nexport type CatalogBridgeOptions = {\n  adapter: CatalogBridgeAdapter;\n  /** Identity stamped on activity + undo entries. */\n  agent?: { id: string; name?: string; color?: string };\n  /**\n   * Trust-but-verify. When on (default), destructive ops (`catalog_delete_product`,\n   * `catalog_delete_price`) route through `adapter`-less staging: they require an\n   * explicit `confirm: true` arg OR a host `confirm` callback. Read + create +\n   * checkout-url tools are unaffected.\n   */\n  pendingMode?: boolean;\n  /** Host confirm hook for destructive ops (pendingMode). Resolves true to proceed. */\n  confirm?: (req: { action: string; id: string; label: string }) => Promise<boolean> | boolean;\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\nconst str = (v: unknown, fallback = \"\"): string => (typeof v === \"string\" ? v : fallback);\nconst num = (v: unknown, fallback = 0): number => (typeof v === \"number\" && Number.isFinite(v) ? v : fallback);\n\n/**\n * registerCatalogBridge — full MCP tool set over a headless Stripe catalog.\n *\n *   catalog_list_products    list products ({ id, name, active, priceCount })\n *   catalog_get_product      full product JSON + its prices\n *   catalog_create_product   create a product (ULID auto-assigned)\n *   catalog_delete_product   soft-delete a product (pendingMode-gated, undoable*)\n *   catalog_list_prices      list a product's prices (or all)\n *   catalog_create_price     create a price under a product\n *   catalog_delete_price     soft-delete a price (pendingMode-gated)\n *   catalog_sync_product     push a product + its prices to Stripe\n *   catalog_test_connection  verify the Stripe connection\n *   catalog_create_checkout  build a hosted Checkout URL for a price\n *\n * *delete undo is best-effort: stores expose soft-delete (`remove`) but no\n *  un-delete, so the undo closure re-creates from the captured snapshot.\n */\nexport function registerCatalogBridge(host: ToolHost, options: CatalogBridgeOptions): Bridge {\n  const { adapter } = options;\n  const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n  const pendingMode = options.pendingMode ?? true;\n  const catalogId = adapter.id ?? \"catalog\";\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 = `catalog:${catalogId}`;\n\n  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n  const target = (elementId?: string, label?: string): AgentTarget => ({\n    kind: \"custom\",\n    screenId: adapter.screenId,\n    elementId,\n    label: label ?? catalogId,\n  });\n\n  const reg = (\n    name: string,\n    description: string,\n    properties: Record<string, unknown>,\n    required: string[],\n    handler: (args: JsonObject) => Promise<unknown> | unknown,\n    resolveTarget: false | ((args: JsonObject) => AgentTarget),\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 as never, {\n          toolName: name,\n          agent,\n          kind: \"custom\",\n          screenId: adapter.screenId,\n          resolveTarget: ({ args }) => resolveTarget(args as JsonObject),\n        })\n      : wrapped;\n    disposers.push(\n      host.registerTool(\n        { name, description, inputSchema: { type: \"object\", properties: properties as Record<string, never>, required, additionalProperties: false } },\n        final as never,\n        { owner: bridgeId },\n      ),\n    );\n  };\n\n  /** Stage a destructive op behind the human (pendingMode). Returns null to proceed, or an errorResult to block. */\n  const guardDestructive = async (action: string, id: string, label: string, hasConfirmArg: boolean) => {\n    if (!pendingMode) return null;\n    if (options.confirm) {\n      const ok = await options.confirm({ action, id, label });\n      return ok ? null : errorResult(`Declined: ${action} ${id} (human did not confirm).`);\n    }\n    // No host confirm hook → require an explicit confirm:true arg as the staged ack.\n    if (!hasConfirmArg) {\n      return errorResult(`${action} is staged (pendingMode). Re-call with confirm:true to apply, or wire a host confirm hook.`);\n    }\n    return null;\n  };\n\n  // ─── Read tools ──────────────────────────────────────────────────────────\n\n  reg(\n    \"catalog_list_products\",\n    \"List products: { id, name, active, lookupKey, priceCount }. Pass withTrashed:true to include soft-deleted.\",\n    { withTrashed: { type: \"boolean\" } },\n    [],\n    async (args) => {\n      const products = await adapter.products.all({ withTrashed: args.withTrashed === true });\n      const list = await Promise.all(\n        products.map(async (p) => ({\n          id: p.id,\n          name: p.name,\n          active: p.active ?? true,\n          lookupKey: p.lookupKey ?? null,\n          priceCount: (await adapter.prices.forProduct(p.id)).length,\n        })),\n      );\n      return textResult(JSON.stringify(list, null, 2), list);\n    },\n    false,\n  );\n\n  reg(\n    \"catalog_get_product\",\n    \"Read a product's full JSON plus its prices.\",\n    { id: { type: \"string\" }, withTrashed: { type: \"boolean\" } },\n    [\"id\"],\n    async (args) => {\n      const id = str(args.id);\n      const product = await adapter.products.find(id, { withTrashed: args.withTrashed === true });\n      if (!product) return errorResult(`No product with id ${id}`);\n      const prices = await adapter.prices.forProduct(id, { withTrashed: args.withTrashed === true });\n      const out = { product, prices };\n      return textResult(JSON.stringify(out, null, 2), out);\n    },\n    false,\n  );\n\n  reg(\n    \"catalog_list_prices\",\n    \"List prices for a product (pass productId), or every price (omit it).\",\n    { productId: { type: \"string\" }, withTrashed: { type: \"boolean\" } },\n    [],\n    async (args) => {\n      const withTrashed = args.withTrashed === true;\n      const prices = args.productId !== undefined\n        ? await adapter.prices.forProduct(str(args.productId), { withTrashed })\n        : await adapter.prices.all({ withTrashed });\n      const list = prices.map((p) => ({\n        id: p.id,\n        productId: p.productId,\n        currency: p.currency,\n        unitAmount: p.unitAmount,\n        type: p.type,\n        active: p.active ?? true,\n        externalId: p.externalId ?? null,\n      }));\n      return textResult(JSON.stringify(list, null, 2), list);\n    },\n    false,\n  );\n\n  // ─── Create tools ────────────────────────────────────────────────────────\n\n  reg(\n    \"catalog_create_product\",\n    \"Create a product. `name` is required; id (ULID) is auto-assigned. Returns the created product.\",\n    {\n      name: { type: \"string\" },\n      description: { type: \"string\" },\n      active: { type: \"boolean\" },\n      lookupKey: { type: \"string\" },\n      metadata: { type: \"object\" },\n    },\n    [\"name\"],\n    async (args) => {\n      const name = str(args.name);\n      if (!name) return errorResult(\"name is required.\");\n      const product = await adapter.createProduct({\n        name,\n        ...(args.description !== undefined ? { description: str(args.description) } : {}),\n        ...(args.active !== undefined ? { active: args.active === true } : {}),\n        ...(args.lookupKey !== undefined ? { lookupKey: str(args.lookupKey) } : {}),\n        ...(args.metadata && typeof args.metadata === \"object\" ? { metadata: args.metadata as Record<string, unknown> } : {}),\n      });\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: catalogId,\n        action: \"catalog_create_product\",\n        label: `Created product ${product.id} (${product.name})`,\n        undo: async () => { await adapter.products.remove(product.id); },\n        redo: async () => { await adapter.createProduct({ ...product }); },\n      });\n      return textResult(`Created product ${product.id} (${product.name})`, product);\n    },\n    (args) => target(undefined, `create product ${str(args.name)}`),\n  );\n\n  reg(\n    \"catalog_create_price\",\n    \"Create a price under a product. unitAmount is integer minor units (cents). type is 'recurring' | 'one_time'.\",\n    {\n      productId: { type: \"string\" },\n      currency: { type: \"string\", description: \"ISO-4217, e.g. 'USD'.\" },\n      unitAmount: { type: \"number\", description: \"Price in cents.\" },\n      type: { type: \"string\", enum: [\"recurring\", \"one_time\"] },\n      recurringInterval: { type: \"string\", description: \"'month' | 'year' | … (recurring only).\" },\n      nickname: { type: \"string\" },\n      lookupKey: { type: \"string\" },\n      metadata: { type: \"object\" },\n    },\n    [\"productId\", \"currency\", \"unitAmount\", \"type\"],\n    async (args) => {\n      const productId = str(args.productId);\n      const product = await adapter.products.find(productId);\n      if (!product) return errorResult(`No product with id ${productId}`);\n      const type = str(args.type) as \"recurring\" | \"one_time\";\n      if (type !== \"recurring\" && type !== \"one_time\") return errorResult(\"type must be 'recurring' or 'one_time'.\");\n      const price = await adapter.createPrice({\n        productId,\n        currency: str(args.currency),\n        unitAmount: num(args.unitAmount),\n        type,\n        ...(args.recurringInterval !== undefined ? { recurringInterval: str(args.recurringInterval) } : {}),\n        ...(args.nickname !== undefined ? { nickname: str(args.nickname) } : {}),\n        ...(args.lookupKey !== undefined ? { lookupKey: str(args.lookupKey) } : {}),\n        ...(args.metadata && typeof args.metadata === \"object\" ? { metadata: args.metadata as Record<string, unknown> } : {}),\n      });\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: catalogId,\n        action: \"catalog_create_price\",\n        label: `Created price ${price.id} on ${productId}`,\n        undo: async () => { await adapter.prices.remove(price.id); },\n        redo: async () => { await adapter.createPrice({ ...price }); },\n      });\n      return textResult(`Created ${type} price ${price.id} on ${productId}`, price);\n    },\n    (args) => target(str(args.productId), `create price on ${str(args.productId)}`),\n  );\n\n  // ─── Destructive tools (pendingMode-gated) ───────────────────────────────\n\n  reg(\n    \"catalog_delete_product\",\n    \"Soft-delete a product (preserves financial history). Staged in pendingMode — pass confirm:true or wire a host confirm hook.\",\n    { id: { type: \"string\" }, confirm: { type: \"boolean\" } },\n    [\"id\"],\n    async (args) => {\n      const id = str(args.id);\n      const product = await adapter.products.find(id, { withTrashed: true });\n      if (!product) return errorResult(`No product with id ${id}`);\n      const blocked = await guardDestructive(\"catalog_delete_product\", id, product.name, args.confirm === true);\n      if (blocked) return blocked;\n      const snapshot = { ...product };\n      await adapter.products.remove(id);\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: catalogId,\n        action: \"catalog_delete_product\",\n        label: `Deleted product ${id} (${product.name})`,\n        undo: async () => { await adapter.createProduct({ ...snapshot }); },\n        redo: async () => { await adapter.products.remove(id); },\n      });\n      return textResult(`Deleted product ${id}`, { id });\n    },\n    (args) => target(str(args.id), `delete product ${str(args.id)}`),\n  );\n\n  reg(\n    \"catalog_delete_price\",\n    \"Soft-delete a price (mirrors Stripe archiving). Staged in pendingMode — pass confirm:true or wire a host confirm hook.\",\n    { id: { type: \"string\" }, confirm: { type: \"boolean\" } },\n    [\"id\"],\n    async (args) => {\n      const id = str(args.id);\n      const price = await adapter.prices.find(id, { withTrashed: true });\n      if (!price) return errorResult(`No price with id ${id}`);\n      const blocked = await guardDestructive(\"catalog_delete_price\", id, id, args.confirm === true);\n      if (blocked) return blocked;\n      const snapshot = { ...price };\n      await adapter.prices.remove(id);\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: catalogId,\n        action: \"catalog_delete_price\",\n        label: `Deleted price ${id}`,\n        undo: async () => { await adapter.createPrice({ ...snapshot }); },\n        redo: async () => { await adapter.prices.remove(id); },\n      });\n      return textResult(`Deleted price ${id}`, { id });\n    },\n    (args) => target(str(args.id), `delete price ${str(args.id)}`),\n  );\n\n  // ─── Stripe sync ─────────────────────────────────────────────────────────\n\n  reg(\n    \"catalog_sync_product\",\n    \"Push a product + its prices to Stripe (creates/updates the Stripe Product + Prices, stamps external ids).\",\n    { id: { type: \"string\" } },\n    [\"id\"],\n    async (args) => {\n      if (!adapter.syncProductAndPrices) return errorResult(\"Host did not wire Stripe sync.\");\n      const id = str(args.id);\n      const product = await adapter.products.find(id);\n      if (!product) return errorResult(`No product with id ${id}`);\n      const synced = await adapter.syncProductAndPrices(product);\n      return textResult(`Synced product ${id} to Stripe (${synced.externalId ?? \"no external id\"})`, synced);\n    },\n    (args) => target(str(args.id), `sync product ${str(args.id)}`),\n  );\n\n  reg(\n    \"catalog_test_connection\",\n    \"Verify the Stripe connection — returns { success, message, productCount? }.\",\n    {},\n    [],\n    async () => {\n      if (!adapter.testConnection) return errorResult(\"Host did not wire a Stripe connection test.\");\n      const result = await adapter.testConnection();\n      return textResult(JSON.stringify(result, null, 2), result);\n    },\n    false,\n  );\n\n  // ─── Checkout ────────────────────────────────────────────────────────────\n\n  reg(\n    \"catalog_create_checkout\",\n    \"Build a hosted Stripe Checkout URL for a price. Recurring prices → subscription; one-time → payment (pass quantity). Requires the price be synced to Stripe first.\",\n    {\n      priceId: { type: \"string\" },\n      successUrl: { type: \"string\" },\n      cancelUrl: { type: \"string\" },\n      customer: { type: \"string\", description: \"Stripe customer id (optional — Checkout collects one if omitted).\" },\n      quantity: { type: \"number\", description: \"One-time checkouts only. Default 1.\" },\n      metadata: { type: \"object\" },\n    },\n    [\"priceId\", \"successUrl\", \"cancelUrl\"],\n    async (args) => {\n      const priceId = str(args.priceId);\n      const price = await adapter.prices.find(priceId);\n      if (!price) return errorResult(`No price with id ${priceId}`);\n      const checkoutArgs: CatalogCheckoutArgs = {\n        successUrl: str(args.successUrl),\n        cancelUrl: str(args.cancelUrl),\n        ...(args.customer !== undefined ? { customer: str(args.customer) } : {}),\n        ...(args.metadata && typeof args.metadata === \"object\" ? { metadata: args.metadata as Record<string, string> } : {}),\n      };\n      let url: string;\n      if (price.type === \"recurring\") {\n        if (!adapter.getSubscriptionCheckoutUrl) return errorResult(\"Host did not wire subscription checkout.\");\n        url = await adapter.getSubscriptionCheckoutUrl(price, checkoutArgs);\n      } else {\n        if (!adapter.getOneTimeCheckoutUrl) return errorResult(\"Host did not wire one-time checkout.\");\n        url = await adapter.getOneTimeCheckoutUrl(price, { ...checkoutArgs, quantity: num(args.quantity, 1) });\n      }\n      return textResult(url || \"(no url)\", { priceId, type: price.type, url });\n    },\n    (args) => target(str(args.priceId), `checkout ${str(args.priceId)}`),\n  );\n\n  return {\n    id: bridgeId,\n    title: adapter.title ?? \"Catalog\",\n    dispose: () => {\n      for (const d of disposers.splice(0)) d();\n    },\n  };\n}\n","import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport type { AgentTarget } from \"../presence/types\";\nimport { pushUndoEntry } from \"../undo/undo-stack\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\n\n/**\n * Headless bridge for `@particle-academy/fancy-features` — feature management\n * with NO UI surface. The adapter is the `FeatureManager` (a `FeatureSource`\n * consumer): define features in the registry, check access for a subject,\n * grant/revoke via group assignment, and meter resource usage. Mutations\n * funnel through `wrapToolWithActivity` so presence + undo compose; `grant` /\n * `revoke` are `pendingMode`-gated (they change what a real user can do).\n *\n * The adapter shapes mirror fancy-features' public `FeatureManager` +\n * `FeatureRegistry` + `GroupStore`, defined LOCALLY so the bridge builds with\n * the sibling absent (optional peer). A live `FeatureManager` (plus its\n * `.registry` / `.groupStore`) satisfies this structurally with no import.\n *\n * SUBJECTS over the wire: `Subject` is opaque (`unknown`) in fancy-features.\n * Agents pass a JSON-serializable subject (string id or `{ id, … }` object);\n * the host's stores key on it via their `defaultSubjectKey`.\n */\n\nexport type FeatureGrant = {\n  key: string;\n  type: \"boolean\" | \"resource\";\n  enabled: boolean;\n  includedQuantity?: number | null;\n  overageLimit?: number | null;\n  source?: string;\n  config?: Record<string, unknown>;\n};\n\n/** Normalized feature definition (mirror of fancy-features `FeatureDefinition`). */\nexport type FeatureDefinition = {\n  key?: string;\n  name?: string;\n  description?: string;\n  type?: \"boolean\" | \"resource\";\n  enabled?: boolean;\n  limit?: number;\n  [k: string]: unknown;\n};\n\n/**\n * Adapter = the `FeatureManager` + its registry + group store. The bridge only\n * needs these members; a real manager exposes them directly.\n */\nexport type FeaturesBridgeAdapter = {\n  /** Stable id for this feature manager instance. */\n  id?: string;\n  title?: string;\n  screenId?: string;\n\n  // ── Access checks (FeatureManager) ──\n  /** Can the subject access the feature now? `manager.canAccess`. */\n  canAccess(feature: string, subject?: unknown, context?: unknown): boolean | Promise<boolean>;\n  /** Remaining quota for a resource feature (null = unlimited / n-a). `manager.remaining`. */\n  remaining(feature: string, subject?: unknown, context?: unknown): number | null | Promise<number | null>;\n  /** All enabled feature keys for the subject. `manager.enabled`. */\n  enabled(subject?: unknown, context?: unknown): string[] | Promise<string[]>;\n  /** Trace a feature's resolution to an AccessResult. `manager.explain`. */\n  explain?(feature: string, subject?: unknown, context?: unknown): Promise<unknown> | unknown;\n\n  // ── Registry (define) ──\n  /** Register a programmatic feature. `manager.registerFeature` / `manager.registry.register`. */\n  registerFeature(key: string, definition: FeatureDefinition): void;\n  /** Registered feature keys. `manager.registry.keys`. */\n  registryKeys(): string[];\n  /** Resolve a registered definition (or null). `manager.registry.definition`. */\n  definition?(key: string): FeatureDefinition | null | Promise<FeatureDefinition | null>;\n\n  // ── Group store (grant / revoke) ──\n  /** Assign a subject to a feature group (the grant primitive). `manager.groupStore.assign`. */\n  assignGroup(subject: unknown, groupKey: string): void | Promise<void>;\n  /** Detach a subject from a group (the revoke primitive). `manager.groupStore.detach`. */\n  detachGroup(subject: unknown, groupKey: string): void | Promise<void>;\n  /** Group keys assigned to a subject. `manager.groupStore.list`. */\n  listGroups(subject: unknown): string[] | Promise<string[]>;\n\n  // ── Usage / metering (resource features) ──\n  /** Current usage for a resource feature. `manager.usageFor`. Optional. */\n  usageFor?(feature: string, subject: unknown): number | Promise<number>;\n  /** Atomic check-and-increment quota. `manager.tryConsume`. Optional. */\n  tryConsume?(feature: string, subject: unknown, amount?: number, context?: unknown): boolean | Promise<boolean>;\n};\n\nexport type FeaturesBridgeOptions = {\n  adapter: FeaturesBridgeAdapter;\n  agent?: { id: string; name?: string; color?: string };\n  /**\n   * Trust-but-verify. When on (default), `features_grant` / `features_revoke`\n   * (they change a real subject's entitlements) require `confirm:true` OR a\n   * host `confirm` hook. Checks + define + usage are unaffected.\n   */\n  pendingMode?: boolean;\n  confirm?: (req: { action: string; subject: unknown; groupKey: string }) => Promise<boolean> | boolean;\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\nconst str = (v: unknown, fallback = \"\"): string => (typeof v === \"string\" ? v : fallback);\nconst num = (v: unknown, fallback = 0): number => (typeof v === \"number\" && Number.isFinite(v) ? v : fallback);\n\n/**\n * registerFeaturesBridge — full MCP tool set over a headless feature manager.\n *\n *   features_list      enabled feature keys for a subject\n *   features_check     can a subject access a feature? (+ remaining for resources)\n *   features_explain   trace why a feature is on/off for a subject\n *   features_define    register a feature definition (boolean / resource)\n *   features_grant     assign a subject to a group (pendingMode-gated, undoable)\n *   features_revoke    detach a subject from a group (pendingMode-gated, undoable)\n *   features_groups    list a subject's assigned groups\n *   features_consume   meter a resource feature (atomic check-and-increment)\n */\nexport function registerFeaturesBridge(host: ToolHost, options: FeaturesBridgeOptions): Bridge {\n  const { adapter } = options;\n  const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n  const pendingMode = options.pendingMode ?? true;\n  const featuresId = adapter.id ?? \"features\";\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 = `features:${featuresId}`;\n\n  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n  const target = (elementId?: string, label?: string): AgentTarget => ({\n    kind: \"custom\",\n    screenId: adapter.screenId,\n    elementId,\n    label: label ?? featuresId,\n  });\n\n  const reg = (\n    name: string,\n    description: string,\n    properties: Record<string, unknown>,\n    required: string[],\n    handler: (args: JsonObject) => Promise<unknown> | unknown,\n    resolveTarget: false | ((args: JsonObject) => AgentTarget),\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 as never, {\n          toolName: name,\n          agent,\n          kind: \"custom\",\n          screenId: adapter.screenId,\n          resolveTarget: ({ args }) => resolveTarget(args as JsonObject),\n        })\n      : wrapped;\n    disposers.push(\n      host.registerTool(\n        { name, description, inputSchema: { type: \"object\", properties: properties as Record<string, never>, required, additionalProperties: false } },\n        final as never,\n        { owner: bridgeId },\n      ),\n    );\n  };\n\n  const guardGrant = async (action: string, subject: unknown, groupKey: string, hasConfirmArg: boolean) => {\n    if (!pendingMode) return null;\n    if (options.confirm) {\n      const ok = await options.confirm({ action, subject, groupKey });\n      return ok ? null : errorResult(`Declined: ${action} ${groupKey} (human did not confirm).`);\n    }\n    if (!hasConfirmArg) {\n      return errorResult(`${action} is staged (pendingMode). Re-call with confirm:true to apply, or wire a host confirm hook.`);\n    }\n    return null;\n  };\n\n  // ─── Read / check tools ──────────────────────────────────────────────────\n\n  reg(\n    \"features_list\",\n    \"List the feature keys enabled for a subject. Pass `subject` (a string id or object).\",\n    { subject: { description: \"Opaque subject — string id or { id, … } object.\" }, context: { description: \"Optional resolution context.\" } },\n    [],\n    async (args) => {\n      const keys = await adapter.enabled(args.subject, args.context);\n      return textResult(JSON.stringify(keys, null, 2), { subject: args.subject, enabled: keys });\n    },\n    false,\n  );\n\n  reg(\n    \"features_check\",\n    \"Check whether a subject can access a feature. For resource features also returns the remaining quota.\",\n    { feature: { type: \"string\" }, subject: { description: \"Opaque subject.\" }, context: { description: \"Optional context.\" } },\n    [\"feature\"],\n    async (args) => {\n      const feature = str(args.feature);\n      const allowed = await adapter.canAccess(feature, args.subject, args.context);\n      const remaining = await adapter.remaining(feature, args.subject, args.context);\n      const out = { feature, allowed, remaining };\n      return textResult(JSON.stringify(out), out);\n    },\n    false,\n  );\n\n  reg(\n    \"features_explain\",\n    \"Trace why a feature is on/off for a subject — returns the AccessResult (source, remaining, limit, used).\",\n    { feature: { type: \"string\" }, subject: { description: \"Opaque subject.\" }, context: { description: \"Optional context.\" } },\n    [\"feature\"],\n    async (args) => {\n      if (!adapter.explain) return errorResult(\"Host did not wire explain().\");\n      const result = await adapter.explain(str(args.feature), args.subject, args.context);\n      return textResult(JSON.stringify(result, null, 2), result as Record<string, unknown>);\n    },\n    false,\n  );\n\n  reg(\n    \"features_groups\",\n    \"List the feature groups a subject is assigned to.\",\n    { subject: { description: \"Opaque subject.\" } },\n    [\"subject\"],\n    async (args) => {\n      const groups = await adapter.listGroups(args.subject);\n      return textResult(JSON.stringify(groups, null, 2), { subject: args.subject, groups });\n    },\n    false,\n  );\n\n  // ─── Define ──────────────────────────────────────────────────────────────\n\n  reg(\n    \"features_define\",\n    \"Register a feature definition. type 'boolean' (on/off) or 'resource' (metered with a `limit`). `enabled` sets the default gate.\",\n    {\n      key: { type: \"string\" },\n      name: { type: \"string\" },\n      description: { type: \"string\" },\n      type: { type: \"string\", enum: [\"boolean\", \"resource\"] },\n      enabled: { type: \"boolean\" },\n      limit: { type: \"number\", description: \"Resource quota per period (resource type).\" },\n    },\n    [\"key\"],\n    (args) => {\n      const key = str(args.key);\n      if (!key) return errorResult(\"key is required.\");\n      const existed = adapter.registryKeys().includes(key);\n      const definition: FeatureDefinition = {\n        ...(args.name !== undefined ? { name: str(args.name) } : {}),\n        ...(args.description !== undefined ? { description: str(args.description) } : {}),\n        ...(args.type !== undefined ? { type: str(args.type) as \"boolean\" | \"resource\" } : {}),\n        ...(args.enabled !== undefined ? { enabled: args.enabled === true } : {}),\n        ...(args.limit !== undefined ? { limit: num(args.limit) } : {}),\n      };\n      adapter.registerFeature(key, definition);\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: featuresId,\n        action: \"features_define\",\n        // Registry has no unregister; undo re-registers the prior definition when we had one.\n        label: existed ? `Redefined feature ${key}` : `Defined feature ${key}`,\n        undo: () => {},\n        redo: () => adapter.registerFeature(key, definition),\n      });\n      return textResult(`${existed ? \"Redefined\" : \"Defined\"} feature ${key} (${definition.type ?? \"boolean\"})`, { key, definition });\n    },\n    (args) => target(str(args.key), `define ${str(args.key)}`),\n  );\n\n  // ─── Grant / revoke (pendingMode-gated) ──────────────────────────────────\n\n  reg(\n    \"features_grant\",\n    \"Grant a subject access by assigning it to a feature group. Staged in pendingMode — pass confirm:true or wire a host confirm hook.\",\n    { subject: { description: \"Opaque subject.\" }, group: { type: \"string\", description: \"Feature group key.\" }, confirm: { type: \"boolean\" } },\n    [\"subject\", \"group\"],\n    async (args) => {\n      const groupKey = str(args.group);\n      if (!groupKey) return errorResult(\"group is required.\");\n      const blocked = await guardGrant(\"features_grant\", args.subject, groupKey, args.confirm === true);\n      if (blocked) return blocked;\n      const already = (await adapter.listGroups(args.subject)).includes(groupKey);\n      await adapter.assignGroup(args.subject, groupKey);\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: featuresId,\n        action: \"features_grant\",\n        label: `Granted group ${groupKey}`,\n        // Only reverse if WE added it (idempotent assign — don't revoke a pre-existing grant).\n        undo: async () => { if (!already) await adapter.detachGroup(args.subject, groupKey); },\n        redo: async () => { await adapter.assignGroup(args.subject, groupKey); },\n      });\n      return textResult(`Granted group ${groupKey}`, { subject: args.subject, group: groupKey });\n    },\n    (args) => target(str(args.group), `grant ${str(args.group)}`),\n  );\n\n  reg(\n    \"features_revoke\",\n    \"Revoke access by detaching a subject from a feature group. Staged in pendingMode — pass confirm:true or wire a host confirm hook.\",\n    { subject: { description: \"Opaque subject.\" }, group: { type: \"string\" }, confirm: { type: \"boolean\" } },\n    [\"subject\", \"group\"],\n    async (args) => {\n      const groupKey = str(args.group);\n      if (!groupKey) return errorResult(\"group is required.\");\n      const blocked = await guardGrant(\"features_revoke\", args.subject, groupKey, args.confirm === true);\n      if (blocked) return blocked;\n      const had = (await adapter.listGroups(args.subject)).includes(groupKey);\n      await adapter.detachGroup(args.subject, groupKey);\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: featuresId,\n        action: \"features_revoke\",\n        label: `Revoked group ${groupKey}`,\n        undo: async () => { if (had) await adapter.assignGroup(args.subject, groupKey); },\n        redo: async () => { await adapter.detachGroup(args.subject, groupKey); },\n      });\n      return textResult(`Revoked group ${groupKey}`, { subject: args.subject, group: groupKey });\n    },\n    (args) => target(str(args.group), `revoke ${str(args.group)}`),\n  );\n\n  // ─── Usage / metering ────────────────────────────────────────────────────\n\n  reg(\n    \"features_consume\",\n    \"Meter a resource feature: atomic check-and-increment. Returns ok:false if the quota would be exceeded (nothing recorded).\",\n    { feature: { type: \"string\" }, subject: { description: \"Opaque subject.\" }, amount: { type: \"number\", description: \"Units to consume. Default 1.\" }, context: { description: \"Optional context.\" } },\n    [\"feature\", \"subject\"],\n    async (args) => {\n      if (!adapter.tryConsume) return errorResult(\"Host did not wire usage metering (tryConsume).\");\n      const feature = str(args.feature);\n      const amount = num(args.amount, 1);\n      const ok = await adapter.tryConsume(feature, args.subject, amount, args.context);\n      const remaining = await adapter.remaining(feature, args.subject, args.context);\n      const out = { feature, ok, amount, remaining };\n      return textResult(JSON.stringify(out), out);\n    },\n    (args) => target(str(args.feature), `consume ${str(args.feature)}`),\n  );\n\n  return {\n    id: bridgeId,\n    title: adapter.title ?? \"Features\",\n    dispose: () => {\n      for (const d of disposers.splice(0)) d();\n    },\n  };\n}\n","import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport type { AgentTarget } from \"../presence/types\";\nimport { pushUndoEntry } from \"../undo/undo-stack\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\n\n/**\n * Bridge for `@particle-academy/fancy-passkeys-ui` — the **management** half of\n * a passkey (WebAuthn) surface, and only that half.\n *\n * ## The absence is the design\n *\n * There is **no tool here that completes an authentication or registration\n * ceremony**, and there must never be one. Not `passkey_authenticate`, not\n * `passkey_sign_in`, not `passkey_complete`, not a \"headless\" variant behind a\n * flag.\n *\n * The reason is construction, not policy. `navigator.credentials.get()` requires\n * a user gesture and a biometric or PIN — both things only the person at the\n * keyboard has. An agent-drivable passkey login would be a bypass of the exact\n * property that makes a passkey worth more than a password: that possession of\n * the credential cannot be delegated, replayed, or phished. A bridge offering\n * one would quietly turn a phishing-resistant factor back into a bearer token.\n *\n * So the boundary sits where the cryptography already puts it, and the tool set\n * is drawn to match: **read the management surface, rename, propose, ask the\n * human to start a ceremony.** `bridges/__tests__/passkeys.test.ts` asserts the\n * registered tool names against a closed list, so \"finishing\" this bridge with a\n * sign-in tool fails CI rather than shipping.\n *\n * ## What it does do\n *\n *   passkey_list              the user's credentials (whitelisted fields only)\n *   passkey_status            browser support + what the surface currently shows\n *   passkey_rename            relabel one credential, by credential ID (undoable)\n *   passkey_revoke            **STAGES** a revoke for the human to confirm\n *   passkey_begin_enrollment  opens the enrollment prompt; returns immediately\n *\n * `passkey_revoke` never revokes. Revoking a passkey is destructive and revoking\n * the last one is a lockout, so the confirming click comes from the human at the\n * surface — there is deliberately **no `pendingMode: false`**, no `confirm: true`\n * argument, and no host hook that turns staging off. On this bridge staging is\n * not a mode.\n *\n * The adapter type is declared LOCALLY (like `features` / `catalog`) so the\n * bridge builds and type-checks with the sibling package absent. A host wiring a\n * live `PasskeyManager` satisfies it structurally, with no import.\n */\n\n/**\n * One credential as the bridge is willing to describe it — the `PasskeySummary`\n * shape both passkey backends already serialise.\n *\n * Everything the server stores that is NOT on this list — the COSE public key,\n * the user handle, the signature counter, the attestation statement and trust\n * path — is absent on purpose, and {@link toSummary} re-projects onto exactly\n * these keys rather than trusting the adapter to have withheld them. A host that\n * hands `list()` its raw ORM model (the obvious thing to do) therefore cannot\n * leak credential material through an MCP tool by accident.\n */\nexport type PasskeySummaryLike = {\n  /** base64url credential ID — the handle every action here is keyed by. */\n  id: string;\n  /** Human-chosen label, or null when the user never named it. */\n  name: string | null;\n  /** ISO-8601. */\n  createdAt: string;\n  /** ISO-8601, or null when never used to sign in. */\n  lastUsedAt: string | null;\n  /** Transport hints (\"internal\", \"hybrid\", \"usb\", …). */\n  transports: string[];\n  /** True for a synced passkey (BE/BS flags); false means this device only. */\n  backedUp: boolean;\n  /** Authenticator model id. Stored, never a trust decision. */\n  aaguid: string;\n  /** ISO-8601 when the signature counter regressed — a suspected clone. */\n  clonedAt: string | null;\n};\n\n/** What the browser can do, as the three `./client` predicates report it. */\nexport type PasskeySupport = {\n  supported: boolean;\n  /** Touch ID / Windows Hello present? `null` while unknown. */\n  platformAuthenticator?: boolean | null;\n  /** Can the browser offer a passkey from a username field? `null` while unknown. */\n  conditionalUi?: boolean | null;\n};\n\n/** A read of what the management surface is currently showing. */\nexport type PasskeySurfaceState = {\n  status?: \"idle\" | \"busy\" | \"error\";\n  /** `{ code, message }` as carried in surface state — never an Error. */\n  error?: { code: string; message: string } | null;\n  /** The revoke awaiting a human's confirmation, if any. */\n  pendingRevoke?: { id: string; isLastPasskey: boolean } | null;\n  /** Credential ID currently being renamed, if any. */\n  renamingId?: string | null;\n};\n\n/**\n * Host-provided access to the management surface. Mirrors the props a\n * `PasskeyManager` is already wired with, so a host usually passes the same four\n * callbacks it passed the component.\n */\nexport type PasskeyBridgeAdapter = {\n  /** Stable id for this surface instance. Surfaces in activity logs. */\n  id?: string;\n  title?: string;\n  screenId?: string;\n\n  /** The signed-in user's credentials. */\n  list(): PasskeySummaryLike[] | Promise<PasskeySummaryLike[]>;\n\n  /** Relabel one credential. Cosmetic, reversible, and undoable here. */\n  rename(input: { id: string; name: string }): void | Promise<void>;\n\n  /**\n   * **Stage** a revoke for human confirmation — the `pendingRevoke` the surface\n   * renders a confirm/cancel dialog for. It must NOT revoke; a host that wires\n   * this to a delete call has removed the human from the loop the bridge was\n   * built around.\n   */\n  proposeRevoke(input: { id: string }): PasskeyProposal | Promise<PasskeyProposal>;\n\n  /**\n   * Open the enrollment prompt on the human's screen and return immediately.\n   * The ceremony completes on their authenticator or not at all.\n   */\n  beginEnrollment?(input: { name?: string }): void | Promise<void>;\n\n  /** Browser capability flags, if the host tracks them. */\n  support?(): PasskeySupport | Promise<PasskeySupport>;\n\n  /** What the surface currently shows. */\n  state?(): PasskeySurfaceState | Promise<PasskeySurfaceState>;\n};\n\nexport type PasskeyProposal = { staged: true; isLastPasskey: boolean };\n\nexport type PasskeyBridgeOptions = {\n  adapter: PasskeyBridgeAdapter;\n  agent?: { id: string; name?: string; color?: string };\n  /**\n   * Also route `passkey_rename` through {@link confirm}. Off by default: a\n   * rename is cosmetic, reversible and pushed onto the undo stack. Worth turning\n   * on where the label itself carries trust — a rogue credential relabelled\n   * \"Avery's iPhone\" survives a human's audit of the list.\n   */\n  confirmRename?: boolean;\n  /**\n   * Host confirmation hook for renames, when {@link confirmRename} is on.\n   *\n   * Note there is no revoke case: a revoke is staged into the surface and\n   * confirmed there, never through a hook the agent's own host supplies.\n   */\n  confirm?: (req: { action: \"passkey_rename\"; id: string; name: string }) => boolean | Promise<boolean>;\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\nconst str = (v: unknown, fallback = \"\"): string => (typeof v === \"string\" ? v : fallback);\n\n/**\n * Project an adapter record onto exactly the public summary fields.\n *\n * Deliberately a whitelist and not a `delete` of known-bad keys: a blacklist has\n * to be updated every time a backend grows a column, and the failure mode of\n * forgetting is silently publishing credential material to every agent in the\n * session.\n */\nfunction toSummary(record: PasskeySummaryLike): PasskeySummaryLike {\n  return {\n    id: str(record?.id),\n    name: typeof record?.name === \"string\" ? record.name : null,\n    createdAt: str(record?.createdAt),\n    lastUsedAt: typeof record?.lastUsedAt === \"string\" ? record.lastUsedAt : null,\n    transports: Array.isArray(record?.transports) ? record.transports.map((t) => String(t)) : [],\n    backedUp: record?.backedUp === true,\n    aaguid: str(record?.aaguid),\n    clonedAt: typeof record?.clonedAt === \"string\" ? record.clonedAt : null,\n  };\n}\n\n/**\n * The complete set of tools this bridge may ever register.\n *\n * Exported so the test suite — and anyone auditing what an agent can reach —\n * can assert the registered names against it rather than eyeballing the file.\n */\nexport const PASSKEY_BRIDGE_TOOLS = [\n  \"passkey_list\",\n  \"passkey_status\",\n  \"passkey_rename\",\n  \"passkey_revoke\",\n  \"passkey_begin_enrollment\",\n] as const;\n\n/**\n * registerPasskeyBridge — MCP tools over a passkey **management** surface.\n *\n * Read the credential list, read browser support and surface state, rename a\n * credential, propose a revoke for the human to confirm, and ask for an\n * enrollment prompt. Nothing signs anyone in; see the file header for why that\n * is a property rather than a gap.\n */\nexport function registerPasskeyBridge(host: ToolHost, options: PasskeyBridgeOptions): Bridge {\n  const { adapter } = options;\n  const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n  const surfaceId = adapter.id ?? \"passkeys\";\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 = `passkeys:${surfaceId}`;\n\n  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n  const target = (elementId?: string, label?: string): AgentTarget => ({\n    kind: \"custom\",\n    screenId: adapter.screenId,\n    elementId,\n    label: label ?? surfaceId,\n  });\n\n  const reg = (\n    name: string,\n    description: string,\n    properties: Record<string, unknown>,\n    required: string[],\n    handler: (args: JsonObject) => Promise<unknown> | unknown,\n    resolveTarget: false | ((args: JsonObject) => AgentTarget),\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 as never, {\n          toolName: name,\n          agent,\n          kind: \"custom\",\n          screenId: adapter.screenId,\n          resolveTarget: ({ args }) => resolveTarget(args as JsonObject),\n        })\n      : wrapped;\n    disposers.push(\n      host.registerTool(\n        {\n          name,\n          description,\n          inputSchema: {\n            type: \"object\",\n            properties: properties as Record<string, never>,\n            required,\n            additionalProperties: false,\n          },\n        },\n        final as never,\n        { owner: bridgeId },\n      ),\n    );\n  };\n\n  const findById = async (id: string): Promise<PasskeySummaryLike | null> =>\n    (await adapter.list()).map(toSummary).find((p) => p.id === id) ?? null;\n\n  // ─── Read ────────────────────────────────────────────────────────────────\n\n  reg(\n    \"passkey_list\",\n    \"List the signed-in user's passkeys: credential id, label, when it was added and last used, transports, whether it is a synced passkey, and whether the server flagged it as a possible clone. Read-only. Public keys, user handles and signature counters are never returned.\",\n    {},\n    [],\n    async () => {\n      const passkeys = (await adapter.list()).map(toSummary);\n      return textResult(JSON.stringify(passkeys, null, 2), { passkeys, count: passkeys.length });\n    },\n    false,\n  );\n\n  reg(\n    \"passkey_status\",\n    \"Read what this browser can do (passkey support, a built-in authenticator, autofill sign-in) and what the management surface is currently showing (busy/error, a revoke awaiting confirmation, a rename in progress).\",\n    {},\n    [],\n    async () => {\n      const support = adapter.support ? await adapter.support() : null;\n      const state = adapter.state ? await adapter.state() : null;\n      const out = {\n        support,\n        state,\n        // Said in the payload, not only in the docs: an agent reading this to\n        // work out \"how do I sign the user in\" should find the answer here.\n        canCompleteCeremony: false,\n        note: \"A passkey ceremony needs a user gesture and a biometric or PIN. No tool on this bridge can perform one; ask the human to complete it on their device.\",\n      };\n      return textResult(JSON.stringify(out, null, 2), out);\n    },\n    false,\n  );\n\n  // ─── Rename (undoable) ───────────────────────────────────────────────────\n\n  reg(\n    \"passkey_rename\",\n    \"Rename one passkey, by credential id (from passkey_list). Cosmetic and undoable with agent_undo.\",\n    {\n      id: { type: \"string\", description: \"base64url credential id.\" },\n      name: { type: \"string\", description: \"New label, e.g. 'MacBook Touch ID'. Empty string clears it.\" },\n    },\n    [\"id\", \"name\"],\n    async (args) => {\n      const id = str(args.id);\n      const name = str(args.name);\n      if (!id) return errorResult(\"id is required.\");\n\n      const existing = await findById(id);\n      if (!existing) return errorResult(`No passkey with id ${id}.`);\n\n      if (options.confirmRename) {\n        if (!options.confirm) {\n          return errorResult(\n            \"passkey_rename requires confirmation (confirmRename), but the host wired no confirm hook.\",\n          );\n        }\n        const ok = await options.confirm({ action: \"passkey_rename\", id, name });\n        if (!ok) return errorResult(`Declined: rename ${id} (human did not confirm).`);\n      }\n\n      const previous = existing.name ?? \"\";\n      await adapter.rename({ id, name });\n      pushUndoEntry(agent.id, {\n        timestamp: Date.now(),\n        bridgeId: surfaceId,\n        action: \"passkey_rename\",\n        label: `Renamed passkey to ${name || \"(unnamed)\"}`,\n        undo: async () => { await adapter.rename({ id, name: previous }); },\n        redo: async () => { await adapter.rename({ id, name }); },\n      });\n\n      return textResult(`Renamed passkey ${id} to ${name || \"(unnamed)\"}`, { id, name, previous });\n    },\n    (args) => target(str(args.id), `rename ${str(args.id)}`),\n  );\n\n  // ─── Revoke — PROPOSAL ONLY ──────────────────────────────────────────────\n\n  reg(\n    \"passkey_revoke\",\n    \"PROPOSE revoking one passkey. This does NOT revoke it: the request is staged on the surface and the human confirms or cancels there. Revoking the last passkey can lock the user out, and the response says when that is the case so you can tell them before they confirm.\",\n    { id: { type: \"string\", description: \"base64url credential id.\" } },\n    [\"id\"],\n    async (args) => {\n      const id = str(args.id);\n      if (!id) return errorResult(\"id is required.\");\n\n      const existing = await findById(id);\n      if (!existing) return errorResult(`No passkey with id ${id}.`);\n\n      const proposal = await adapter.proposeRevoke({ id });\n      const isLastPasskey = proposal?.isLastPasskey === true;\n      const out = {\n        id,\n        name: existing.name,\n        staged: true as const,\n        awaitingHuman: true as const,\n        isLastPasskey,\n      };\n\n      return textResult(\n        isLastPasskey\n          ? `Staged a revoke of ${existing.name ?? id}. This is the account's LAST passkey — confirming it removes passkey sign-in entirely. Waiting for the human to confirm or cancel.`\n          : `Staged a revoke of ${existing.name ?? id}. Waiting for the human to confirm or cancel on the surface.`,\n        out,\n      );\n    },\n    (args) => target(str(args.id), `propose revoke ${str(args.id)}`),\n  );\n\n  // ─── Enrollment — opens the prompt, never completes it ───────────────────\n\n  reg(\n    \"passkey_begin_enrollment\",\n    \"Ask the surface to start enrolling a new passkey. This only opens the prompt: the ceremony completes on the human's authenticator (Touch ID, Windows Hello, phone, security key) or it does not complete at all. Returns immediately.\",\n    { name: { type: \"string\", description: \"Optional label to pre-fill for the new passkey.\" } },\n    [],\n    async (args) => {\n      if (!adapter.beginEnrollment) return errorResult(\"Host did not wire beginEnrollment().\");\n      const name = args.name === undefined ? undefined : str(args.name);\n      await adapter.beginEnrollment(name === undefined ? {} : { name });\n      const out = { awaitingHuman: true as const, ...(name === undefined ? {} : { name }) };\n      return textResult(\n        \"Enrollment prompt opened. The human has to complete it on their authenticator — there is no tool that can finish it for them.\",\n        out,\n      );\n    },\n    (args) => target(undefined, `begin enrollment${args.name ? ` (${str(args.name)})` : \"\"}`),\n  );\n\n  // ── There is deliberately NO tool below that completes a ceremony. ────────\n  // No passkey_authenticate, no passkey_sign_in, no passkey_complete, no\n  // passkey_assert. Do not \"finish\" this bridge by adding one — see the header,\n  // and see the closed-tool-list test that will fail if you do.\n\n  return {\n    id: bridgeId,\n    title: adapter.title ?? \"Passkeys\",\n    dispose: () => {\n      for (const d of disposers.splice(0)) d();\n    },\n  };\n}\n","/**\n * registerDocBridge — a GENERIC MCP bridge over a `@particle-academy/fancy-doc-commons`\n * `DocTree`. Give it an adapter (`{ get, set }`) and it generates, from the shared\n * op-spine, a full Human+ surface: uniform read tools + the canonical node op tools\n * (add / update / remove / move) under one verb lexicon, with **undo derived from\n * the reducer**, agent-activity broadcasts, unconditional `agent_undo/redo/history`,\n * and an optional **staged-write** (confirm / reject) channel — replacing the ~500-line\n * bespoke bridges (whiteboard/flow/artboard/…) with one builder. A surface adds its\n * domain ops (e.g. cms `set_style`) via `opTools` + a matching reducer.\n */\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\";\nimport {\n  treeReducer,\n  childrenOf,\n  descendantsOf,\n  appendOrder,\n  autoApply,\n  type DocTree,\n  type DocNode,\n  type TreeOp,\n  type DocReducer,\n  type StagePolicy,\n} from \"@particle-academy/fancy-doc-commons\";\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/** Host-provided access to the document tree. */\nexport interface DocAdapter<N extends DocNode> {\n  /** Read the current tree. */\n  get(): DocTree<N>;\n  /** Replace the tree — host wires this to its `onChange` / `setState`. */\n  set(next: DocTree<N>): void;\n  /** Optional fancy-screens screen id, for presence scoping. */\n  screenId?: string;\n  /** Mint a fresh, unique node id. Default: `<surface>-<n>`. */\n  newId?(): string;\n}\n\n/**\n * A domain op tool beyond the built-in add/update/remove/move — lets a surface\n * expose its own ops (e.g. cms `set_style`) through the same undo + activity path.\n */\nexport interface DocOpTool<N extends DocNode, TOp> {\n  /** Verb, prefixed with the surface (e.g. `set_style` → `cms_set_style`). */\n  verb: string;\n  description: string;\n  properties: Record<string, unknown>;\n  required: string[];\n  /** Build the op from the args (or return `{ error }`). */\n  build(args: JsonObject, tree: DocTree<N>): TOp | { error: string };\n  /** Node id this op targets (for the activity target + undo label). */\n  targetId?(args: JsonObject): string | undefined;\n}\n\nexport interface DocBridgeOptions<N extends DocNode, TOp = TreeOp<N>> {\n  adapter: DocAdapter<N>;\n  /** Tool-name prefix + activity kind (e.g. `\"cms\"` → `cms_add`, kind `\"cms\"`). */\n  surface: string;\n  agent?: { id: string; name?: string; color?: string };\n  /** Reducer for reduce + invert. Default: the substrate `treeReducer<N>()`. */\n  reducer?: DocReducer<DocTree<N>, TOp>;\n  /** Build a full node from the core fields + props (fill surface defaults, e.g. `style`). */\n  makeNode?: (core: { id: string; type: string; parent: string | null; order: string }, props: Record<string, unknown>) => N;\n  /** Domain op tools beyond the built-ins. */\n  opTools?: DocOpTool<N, TOp>[];\n  /** Decide auto-apply vs. confirm per op. Default: everything auto-applies. */\n  stagePolicy?: StagePolicy<TOp>;\n  /** Fired when an op is staged pending human confirmation. */\n  onPending?: (staged: { id: string; op: TOp; label: string }) => void;\n  /** Summarize a node for describe/list. Default: id/type/parent + prop keys. */\n  describeNode?: (node: N) => Record<string, unknown>;\n}\n\n/** Register the generic doc-surface bridge. Returns a {@link Bridge}. */\nexport function registerDocBridge<N extends DocNode, TOp = TreeOp<N>>(\n  host: ToolHost,\n  options: DocBridgeOptions<N, TOp>,\n): Bridge {\n  const { adapter, surface } = options;\n  const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n  const reducer = (options.reducer ?? (treeReducer<N>() as unknown as DocReducer<DocTree<N>, TOp>));\n  const stage = options.stagePolicy ?? (autoApply as StagePolicy<TOp>);\n  const makeNode =\n    options.makeNode ?? (({ id, type, parent, order }, props) => ({ id, type, parent, order, props }) as N);\n  const describeNode =\n    options.describeNode ?? ((n: N) => ({ id: n.id, type: n.type, parent: n.parent, props: Object.keys(n.props ?? {}) }));\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 = surface;\n\n  // agent_undo / agent_redo / agent_history — always present (undo derives from\n  // the reducer, so every doc surface gets working undo for free).\n  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n  let idSeq = 0;\n  // The counter restarts with the bridge, so on a tree loaded from elsewhere\n  // `surface-1` may well be taken. Skip past anything that already exists\n  // rather than minting an id that silently overwrites a node.\n  const mintId = () => {\n    if (adapter.newId) return adapter.newId();\n    const taken = adapter.get().nodes;\n    let id: string;\n    do id = `${surface}-${(idSeq += 1)}`;\n    while (taken[id]);\n    return id;\n  };\n  const target = (elementId?: string): AgentTarget => ({ kind: surface, screenId: adapter.screenId, elementId });\n\n  // Staged ops awaiting confirmation.\n  const pending = new Map<string, { op: TOp; label: string; targetId?: string }>();\n\n  /** Apply an op immediately: reduce → set → push a snapshot-based undo entry. */\n  function commit(op: TOp, label: string, targetId?: string): Record<string, unknown> {\n    const prev = adapter.get();\n    const next = reducer.reduce(prev, op);\n    adapter.set(next);\n    pushUndoEntry(agent.id, {\n      timestamp: Date.now(),\n      bridgeId: surface,\n      action: label,\n      label,\n      undo: () => adapter.set(prev),\n      redo: () => adapter.set(next),\n    });\n    return { ok: true, id: targetId };\n  }\n\n  /**\n   * Auto-apply, or stage for confirmation per the stage policy.\n   *\n   * The staged case reports the pending id under its OWN key. Returning it as\n   * `id` — as this used to — collided with the node id every mutation already\n   * reports, so `update`/`remove`/`move` overwrote it and left the agent holding\n   * a node id that `confirm` does not accept. The staged write was unconfirmable\n   * for three of the four canonical ops, and looked fine from the outside.\n   */\n  function submit(op: TOp, label: string, targetId?: string): { staged: boolean; id?: string; pendingId?: string } {\n    if (stage(op) === \"confirm\") {\n      const pendingId = `${surface}-pending-${(idSeq += 1)}`;\n      pending.set(pendingId, { op, label, targetId });\n      options.onPending?.({ id: pendingId, op, label });\n      return { staged: true, id: targetId, pendingId };\n    }\n    commit(op, label, targetId);\n    return { staged: false, id: targetId };\n  }\n\n  const reg = (\n    verb: string,\n    description: string,\n    properties: Record<string, unknown>,\n    required: string[],\n    handler: (args: JsonObject) => Record<string, unknown> | Promise<Record<string, unknown>>,\n    isMutation: boolean,\n    resolveTarget?: (args: JsonObject, result: Record<string, unknown>) => AgentTarget | null,\n  ): void => {\n    const name = `${surface}_${verb}`;\n    const wrapped = async (args: JsonObject) => {\n      try {\n        // `_text` is the human-facing line; the rest is structuredContent.\n        const { _text, ...structured } = await handler(args);\n        return textResult(typeof _text === \"string\" ? _text : name, structured);\n      } catch (e) {\n        return errorResult(e instanceof Error ? e.message : String(e));\n      }\n    };\n    const final = isMutation\n      ? wrapToolWithActivity(wrapped, {\n          toolName: name,\n          agent,\n          kind: surface,\n          screenId: adapter.screenId,\n          resolveTarget: ({ args, result }) => {\n            if ((result.structuredContent as JsonObject | undefined)?.staged) return null;\n            return resolveTarget?.(args, (result.structuredContent as JsonObject) ?? {}) ?? target();\n          },\n        })\n      : wrapped;\n    disposers.push(\n      host.registerTool(\n        { name, description, inputSchema: { type: \"object\", properties: properties as never, required, additionalProperties: false } },\n        final as never,\n        { owner: bridgeId },\n      ),\n    );\n  };\n\n  // ── Read tools ──────────────────────────────────────────────────────────\n  reg(\n    \"describe\",\n    `Summarize the ${surface} document: node count, roots, and the active surface. Call before reading or writing.`,\n    {},\n    [],\n    () => {\n      const tree = adapter.get();\n      const ids = Object.keys(tree.nodes);\n      return { nodeCount: ids.length, roots: childrenOf(tree, null).map((n) => n.id), _text: `${ids.length} nodes` };\n    },\n    false,\n  );\n  reg(\n    \"get\",\n    `Get the whole ${surface} document tree as JSON.`,\n    {},\n    [],\n    () => ({ tree: adapter.get(), _text: \"full tree\" }),\n    false,\n  );\n  reg(\n    \"list\",\n    \"List nodes (optionally the children of `parent`), in order.\",\n    { parent: { type: [\"string\", \"null\"], description: \"Parent id, or null/omitted for roots.\" } },\n    [],\n    (args) => {\n      const tree = adapter.get();\n      const parent = typeof args.parent === \"string\" ? args.parent : null;\n      return { nodes: childrenOf(tree, parent).map(describeNode), _text: `children of ${parent ?? \"root\"}` };\n    },\n    false,\n  );\n  reg(\n    \"get_node\",\n    \"Get one node by id.\",\n    { id: { type: \"string\" } },\n    [\"id\"],\n    (args) => {\n      const node = adapter.get().nodes[String(args.id)];\n      if (!node) throw new Error(`No node ${args.id}`);\n      return { node, _text: `node ${node.id}` };\n    },\n    false,\n  );\n\n  // ── Canonical op tools ──────────────────────────────────────────────────\n  reg(\n    \"add\",\n    \"Insert a node. Returns its id. Appends under `parent` (or roots) unless `order` is given.\",\n    {\n      type: { type: \"string\", description: \"Node type discriminant.\" },\n      parent: { type: [\"string\", \"null\"], description: \"Parent id, or null for a root.\" },\n      props: { type: \"object\", description: \"JSON props bag.\" },\n      order: { type: \"string\", description: \"Fractional order key (default: append).\" },\n      id: {\n        type: \"string\",\n        description:\n          \"Id for the new node. Supply a meaningful one if you intend to address this node later; omitted means one is minted for you. Must not already exist.\",\n      },\n    },\n    [\"type\"],\n    (args) => {\n      const tree = adapter.get();\n      const parent = typeof args.parent === \"string\" ? args.parent : null;\n      // An agent that names the node names the handle it will use afterwards.\n      // Minted ids are addressable too, just less memorable.\n      const requested = typeof args.id === \"string\" ? args.id : undefined;\n      if (requested !== undefined && tree.nodes[requested]) {\n        throw new Error(`Node ${requested} already exists — pick a different id or update it instead`);\n      }\n      const id = requested ?? mintId();\n      const order = typeof args.order === \"string\" ? args.order : appendOrder(tree, parent);\n      const props = (args.props && typeof args.props === \"object\" ? args.props : {}) as Record<string, unknown>;\n      const node = makeNode({ id, type: String(args.type), parent, order }, props);\n      const res = submit({ t: \"insert\", node } as unknown as TOp, `add ${args.type} ${id}`, id);\n      return { ...res, _text: res.staged ? `staged add ${id} — confirm ${res.pendingId}` : `added ${id}` };\n    },\n    true,\n    (_args, result) => target(result.id as string | undefined),\n  );\n  reg(\n    \"update\",\n    \"Merge a props patch into a node.\",\n    { id: { type: \"string\" }, patch: { type: \"object\" } },\n    [\"id\", \"patch\"],\n    (args) => {\n      const id = String(args.id);\n      if (!adapter.get().nodes[id]) throw new Error(`No node ${id}`);\n      const patch = (args.patch && typeof args.patch === \"object\" ? args.patch : {}) as Record<string, unknown>;\n      const res = submit({ t: \"set_props\", id, patch } as unknown as TOp, `update ${id}`, id);\n      return { ...res, id, _text: res.staged ? `staged update ${id} — confirm ${res.pendingId}` : `updated ${id}` };\n    },\n    true,\n    (args) => target(String(args.id)),\n  );\n  reg(\n    \"remove\",\n    \"Remove a node and its subtree.\",\n    { id: { type: \"string\" } },\n    [\"id\"],\n    (args) => {\n      const id = String(args.id);\n      const tree = adapter.get();\n      if (!tree.nodes[id]) throw new Error(`No node ${id}`);\n      const count = descendantsOf(tree, id).length + 1;\n      const res = submit({ t: \"remove\", id } as unknown as TOp, `remove ${id} (${count} node${count === 1 ? \"\" : \"s\"})`, id);\n      return { ...res, id, removed: count, _text: res.staged ? `staged remove ${id} — confirm ${res.pendingId}` : `removed ${id}` };\n    },\n    true,\n    (args) => target(String(args.id)),\n  );\n  reg(\n    \"move\",\n    \"Reparent + reorder a node.\",\n    { id: { type: \"string\" }, parent: { type: [\"string\", \"null\"] }, order: { type: \"string\", description: \"Fractional order key (default: append under the new parent).\" } },\n    [\"id\"],\n    (args) => {\n      const id = String(args.id);\n      const tree = adapter.get();\n      if (!tree.nodes[id]) throw new Error(`No node ${id}`);\n      const parent = args.parent === null ? null : typeof args.parent === \"string\" ? args.parent : tree.nodes[id]!.parent;\n      const order = typeof args.order === \"string\" ? args.order : appendOrder(tree, parent);\n      const res = submit({ t: \"move\", id, parent, order } as unknown as TOp, `move ${id}`, id);\n      return { ...res, id, _text: res.staged ? `staged move ${id} — confirm ${res.pendingId}` : `moved ${id}` };\n    },\n    true,\n    (args) => target(String(args.id)),\n  );\n\n  // ── Domain op tools ─────────────────────────────────────────────────────\n  for (const t of options.opTools ?? []) {\n    reg(\n      t.verb,\n      t.description,\n      t.properties,\n      t.required,\n      (args) => {\n        const built = t.build(args, adapter.get());\n        if (built && typeof built === \"object\" && \"error\" in built) throw new Error((built as { error: string }).error);\n        const tid = t.targetId?.(args);\n        const res = submit(built as TOp, `${t.verb} ${tid ?? \"\"}`.trim(), tid);\n        return { ...res, id: tid, _text: res.staged ? `staged ${t.verb} — confirm ${res.pendingId}` : t.verb };\n      },\n      true,\n      (args) => target(t.targetId?.(args)),\n    );\n  }\n\n  // ── Staged-write confirm / reject ───────────────────────────────────────\n  reg(\n    \"confirm\",\n    \"Apply a staged op. Pass the `pendingId` a staged mutation returned — not the node `id` it also returns.\",\n    { id: { type: \"string\", description: \"The `pendingId` from a staged mutation.\" } },\n    [\"id\"],\n    (args) => {\n      const id = String(args.id);\n      const p = pending.get(id);\n      if (!p) throw new Error(`No pending op ${id}`);\n      pending.delete(id);\n      commit(p.op, p.label, p.targetId);\n      return { ok: true, applied: p.label, id: p.targetId, _text: `applied ${p.label}` };\n    },\n    true,\n    (_args, result) => target(result.id as string | undefined),\n  );\n  reg(\n    \"reject\",\n    \"Discard a staged op. Pass the `pendingId` a staged mutation returned — not the node `id` it also returns.\",\n    { id: { type: \"string\", description: \"The `pendingId` from a staged mutation.\" } },\n    [\"id\"],\n    (args) => {\n      const id = String(args.id);\n      const p = pending.get(id);\n      if (!p) throw new Error(`No pending op ${id}`);\n      pending.delete(id);\n      return { ok: true, rejected: p.label, _text: `rejected ${p.label}` };\n    },\n    false,\n  );\n\n  return {\n    id: bridgeId,\n    title: surface,\n    dispose: () => {\n      for (const d of disposers) d();\n      pending.clear();\n    },\n  };\n}\n","/**\n * registerCmsBridge — the greenfield CMS agent bridge, built entirely on\n * {@link registerDocBridge}. cms had NO bridge before (its op-spine was\n * agent-ready but unwired); this is the §8-decided \"build registerCmsBridge on\n * registerDocBridge BEFORE deprecating ScreenSchema\" step.\n *\n * A CMS page is a `DocTree<StyledNode>` (fancy-doc-commons): the generic bridge\n * supplies `cms_describe/get/list/get_node` + `cms_add/update/remove/move` +\n * undo/activity/staging for free; this layer adds the two domain ops a page\n * needs — `cms_set_style` (per-node base StyleProps) and `cms_set_layout` — and a\n * reducer that handles them alongside the substrate tree ops.\n */\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { Bridge } from \"./types\";\nimport { registerDocBridge, type DocAdapter } from \"./doc\";\nimport {\n  treeReducer,\n  type DocReducer,\n  type DocTree,\n  type LayoutMode,\n  type StyledNode,\n  type StyleProps,\n  type TreeOp,\n  type StagePolicy,\n} from \"@particle-academy/fancy-doc-commons\";\n\n/** The CMS op union: the substrate tree ops + per-node style/layout. */\nexport type CmsOp =\n  | TreeOp<StyledNode>\n  | { t: \"set_style\"; id: string; patch: Partial<StyleProps> }\n  | { t: \"set_layout\"; id: string; layout?: LayoutMode };\n\n/** A pure reducer over a `DocTree<StyledNode>` handling tree ops + style/layout. */\nexport function cmsReducer(): DocReducer<DocTree<StyledNode>, CmsOp> {\n  const base = treeReducer<StyledNode>();\n  return {\n    reduce(doc, op) {\n      if (op.t === \"set_style\") {\n        const node = doc.nodes[op.id];\n        if (!node) return doc;\n        return { nodes: { ...doc.nodes, [op.id]: { ...node, style: { ...node.style, base: { ...node.style.base, ...op.patch } } } } };\n      }\n      if (op.t === \"set_layout\") {\n        const node = doc.nodes[op.id];\n        if (!node) return doc;\n        return { nodes: { ...doc.nodes, [op.id]: { ...node, layout: op.layout } } };\n      }\n      return base.reduce(doc, op);\n    },\n    invert(doc, op) {\n      if (op.t === \"set_style\") {\n        const node = doc.nodes[op.id];\n        if (!node) return [];\n        const prev: Partial<StyleProps> = {};\n        for (const k in op.patch) (prev as Record<string, unknown>)[k as keyof StyleProps] = node.style.base[k as keyof StyleProps];\n        return [{ t: \"set_style\", id: op.id, patch: prev }];\n      }\n      if (op.t === \"set_layout\") {\n        const node = doc.nodes[op.id];\n        if (!node) return [];\n        return [{ t: \"set_layout\", id: op.id, layout: node.layout }];\n      }\n      return base.invert(doc, op) as CmsOp[];\n    },\n  };\n}\n\nexport interface CmsBridgeOptions {\n  adapter: DocAdapter<StyledNode>;\n  agent?: { id: string; name?: string; color?: string };\n  /** Auto-apply vs. confirm per op (trust-but-verify). Default: auto. */\n  stagePolicy?: StagePolicy<CmsOp>;\n  onPending?: (staged: { id: string; op: CmsOp; label: string }) => void;\n}\n\n/** Register the CMS bridge (prefix `cms_`) over a `DocTree<StyledNode>`. */\nexport function registerCmsBridge(host: ToolHost, options: CmsBridgeOptions): Bridge {\n  return registerDocBridge<StyledNode, CmsOp>(host, {\n    adapter: options.adapter,\n    surface: \"cms\",\n    agent: options.agent,\n    reducer: cmsReducer(),\n    stagePolicy: options.stagePolicy,\n    onPending: options.onPending,\n    // New nodes get an empty base style so they satisfy StyledNode.\n    makeNode: ({ id, type, parent, order }, props) => ({ id, type, parent, order, props, style: { base: {} } }),\n    describeNode: (n) => ({ id: n.id, type: n.type, parent: n.parent, layout: n.layout }),\n    opTools: [\n      {\n        verb: \"set_style\",\n        description: \"Merge a StyleProps patch into a node's base style (color, background, padding, fontSize, gap, …).\",\n        properties: { id: { type: \"string\" }, patch: { type: \"object\", description: \"Partial StyleProps.\" } },\n        required: [\"id\", \"patch\"],\n        build: (args, tree) => {\n          const id = String(args.id);\n          if (!tree.nodes[id]) return { error: `No node ${id}` };\n          return { t: \"set_style\", id, patch: (args.patch && typeof args.patch === \"object\" ? args.patch : {}) as Partial<StyleProps> };\n        },\n        targetId: (args) => String(args.id),\n      },\n      {\n        verb: \"set_layout\",\n        description: \"Set a container node's layout mode (free | stack | grid).\",\n        properties: { id: { type: \"string\" }, layout: { type: \"string\", enum: [\"free\", \"stack\", \"grid\"] } },\n        required: [\"id\"],\n        build: (args, tree) => {\n          const id = String(args.id);\n          if (!tree.nodes[id]) return { error: `No node ${id}` };\n          return { t: \"set_layout\", id, layout: args.layout as LayoutMode | undefined };\n        },\n        targetId: (args) => String(args.id),\n      },\n    ],\n  });\n}\n","/**\n * registerScreenDocBridge — an agent bridge over the CONTENT of one rendered\n * `<Screen doc={…}>` (fancy-screens ≥ 0.6), built on {@link registerDocBridge}.\n *\n * This is the other half of {@link registerScreensBridge}, and the halves are\n * not interchangeable. That one moves *between* screens and creates them from\n * host templates, treating a screen's contents as an opaque `config` blob. This\n * one addresses the nodes *inside* one screen: read them, patch a prop, retext a\n * label, reparent a card.\n *\n * Until fancy-screens 0.6 there was no way to do that at all — `ScreenSchema`\n * nodes had no `id`, so an agent could emit a whole surface and then not touch\n * anything in it. That was a standing violation of the component contract's\n * stable-handles requirement, on the one shipped \"agent emits a UI\" path.\n *\n * A screen document is a plain `DocTree`, so the generic bridge supplies\n * describe/get/list/get_node + add/update/remove/move + undo + agent activity +\n * staged writes for free. What this layer adds is everything that is specific to\n * a screen being a rendered React tree:\n *\n * - **Synthetic ids are reported as such.** fancy-screens mints a position-derived\n *   id for any node the author left anonymous. It looks like a handle and is not\n *   one: insert a sibling above it and it points at a different node, silently.\n *   Every read here says which kind of id it handed back, and `screen_addressable`\n *   lists only the durable ones.\n * - **Literal text is a node**, not a prop, so that a string and an element can be\n *   siblings without losing their order. `screen_set_text` hides that from the\n *   agent, which otherwise has to know the reserved `#text` type to change a label.\n *\n * No dependency on fancy-screens — the contract is the `DocTree`, mirroring how\n * `bridges/screens.ts` keeps its own snapshot types loose.\n */\nimport { textResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { Bridge } from \"./types\";\nimport { registerDocBridge, type DocAdapter, type DocOpTool } from \"./doc\";\nexport type { DocAdapter } from \"./doc\";\nimport {\n  childrenOf,\n  appendOrder,\n  type DocNode,\n  type StagePolicy,\n  type TreeOp,\n} from \"@particle-academy/fancy-doc-commons\";\n\n/**\n * Reserved node type for a literal string child. Must match fancy-screens'\n * `TEXT_NODE_TYPE`; duplicated rather than imported to keep this bridge free of\n * a fancy-screens dependency.\n */\nexport const SCREEN_TEXT_NODE_TYPE = \"#text\";\n\n/** A screen document node — a `DocNode` plus the minted-id flag. */\nexport interface ScreenDocNode extends DocNode {\n  /**\n   * True when fancy-screens minted this id because the author supplied none.\n   * A synthetic id is derived from position, so it is not a durable handle.\n   */\n  synthetic?: boolean;\n}\n\nexport type ScreenDocOp = TreeOp<ScreenDocNode>;\n\nexport interface ScreenDocBridgeOptions {\n  adapter: DocAdapter<ScreenDocNode>;\n  /**\n   * Tool-name prefix. Default `\"screen\"` → `screen_add`, `screen_set_text`, …\n   *\n   * Tool names are global, so a host wiring more than one doc-driven screen at\n   * once must give each a distinct prefix (`\"screen_checkout\"`).\n   */\n  surface?: string;\n  agent?: { id: string; name?: string; color?: string };\n  /** Auto-apply vs. confirm per op (trust-but-verify). Default: auto. */\n  stagePolicy?: StagePolicy<ScreenDocOp>;\n  onPending?: (staged: { id: string; op: ScreenDocOp; label: string }) => void;\n}\n\n/** Register the screen-content bridge (prefix `screen_`) over a screen's `DocTree`. */\nexport function registerScreenDocBridge(host: ToolHost, options: ScreenDocBridgeOptions): Bridge {\n  const { adapter } = options;\n  const surface = options.surface ?? \"screen\";\n\n  const setText: DocOpTool<ScreenDocNode, ScreenDocOp> = {\n    verb: \"set_text\",\n    description:\n      \"Replace the literal text of an element node — the natural way to change a label, heading or paragraph. Pass the ELEMENT's id, not the text node's.\",\n    properties: {\n      id: { type: \"string\", description: \"Id of the element whose text to set.\" },\n      text: { type: \"string\" },\n    },\n    required: [\"id\", \"text\"],\n    build: (args, tree) => {\n      const id = String(args.id);\n      const node = tree.nodes[id];\n      if (!node) return { error: `No node ${id}` };\n      if (node.type === SCREEN_TEXT_NODE_TYPE) {\n        return { t: \"set_props\", id, patch: { value: String(args.text) } };\n      }\n\n      const texts = childrenOf(tree, id).filter((c) => c.type === SCREEN_TEXT_NODE_TYPE);\n      if (texts.length === 1) {\n        return { t: \"set_props\", id: texts[0]!.id, patch: { value: String(args.text) } };\n      }\n      if (texts.length === 0) {\n        // Nothing to retext, so give it text. The minted child is addressable in\n        // its own right, which is what makes the follow-up edit possible.\n        return {\n          t: \"insert\",\n          node: {\n            id: `${id}-text`,\n            type: SCREEN_TEXT_NODE_TYPE,\n            parent: id,\n            order: appendOrder(tree, id),\n            props: { value: String(args.text) },\n          },\n        };\n      }\n      // Ambiguous on purpose: picking one would look like it worked.\n      return {\n        error: `Node ${id} has ${texts.length} text children (${texts.map((t) => t.id).join(\", \")}) — set_text on the one you mean`,\n      };\n    },\n    targetId: (args) => String(args.id),\n  };\n\n  const bridge = registerDocBridge<ScreenDocNode, ScreenDocOp>(host, {\n    adapter,\n    surface,\n    agent: options.agent,\n    stagePolicy: options.stagePolicy,\n    onPending: options.onPending,\n    // Anything the AGENT adds is authored by definition — it chose or was given\n    // the id — so it must not inherit the synthetic flag from its neighbours.\n    makeNode: ({ id, type, parent, order }, props) => ({ id, type, parent, order, props }),\n    describeNode: (n) => ({\n      id: n.id,\n      type: n.type,\n      parent: n.parent,\n      ...(n.synthetic ? { synthetic: true } : {}),\n      ...(n.type === SCREEN_TEXT_NODE_TYPE ? { text: String(n.props?.value ?? \"\") } : { props: Object.keys(n.props ?? {}) }),\n    }),\n    opTools: [setText],\n  });\n\n  // A read tool, so it lives here rather than in `opTools` (which are mutations).\n  const disposeAddressable = host.registerTool(\n    {\n      name: `${surface}_addressable`,\n      description:\n        \"List the node ids that are safe to remember and use later. Ids NOT listed here were minted from a node's position: they resolve today and silently point at a different node once a sibling is inserted above them. Address those in the same turn you read them, and never store one.\",\n      inputSchema: { type: \"object\", properties: {} as never, required: [], additionalProperties: false },\n    },\n    (async () => {\n      const nodes = Object.values(adapter.get().nodes);\n      const authored = nodes.filter((n) => !n.synthetic).map((n) => ({ id: n.id, type: n.type }));\n      const syntheticCount = nodes.length - authored.length;\n\n      return textResult(\n        authored.length\n          ? `${authored.length} addressable, ${syntheticCount} positional`\n          : `no addressable ids — all ${syntheticCount} nodes are positional`,\n        { addressable: authored, syntheticCount },\n      );\n    }) as never,\n    // Same registrant as the doc bridge above, which registers under its surface.\n    { owner: surface },\n  );\n\n  return {\n    id: surface,\n    title: \"Screen content\",\n    dispose: () => {\n      disposeAddressable();\n      bridge.dispose();\n    },\n  };\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 { useCallback, useEffect, useRef, useState } from \"react\";\nimport { MicroMcpServer } from \"../mcp/server\";\nimport { attachInProcess } from \"../mcp/transports\";\nimport { attachSseRelay, type RelayState, type SseRelayTransport } from \"./sse-relay\";\nimport { createSessionDescriptor, type SessionDescriptor } from \"./token\";\nimport { emitActivity } from \"../presence/registry\";\nimport type { AgentActivityEvent } from \"../presence/types\";\nimport { registerNavigationBridge, type NavigationBridgeAdapter } from \"../bridges/navigation\";\nimport { BridgeContributions, type BridgeContribution } from \"./bridge-contributions\";\n\n/** A thing the human did, surfaced so the connected agent stays aware. */\nexport type CoBrowseUserEvent =\n  | { kind: \"navigation\"; url: string; title?: string; revision?: number }\n  | { kind: \"scroll\"; y: number; revision?: number }\n  | { kind: \"form\"; handle: string; value?: unknown; masked?: boolean; revision?: number }\n  | { kind: \"click\"; handle: string; label?: string; revision?: number };\n\nexport type UseCoBrowseSessionOptions = {\n  /**\n   * The navigation adapter (Inertia + DOM in the sandbox). MUST be stable —\n   * its methods should read live state via refs, since the bridge captures it\n   * once on mount. Memoize it.\n   */\n  adapter: NavigationBridgeAdapter;\n  /** Identity for the agent's presence (cursor/log color + name). */\n  agent?: { id: string; name?: string; color?: string };\n  /**\n   * Which activity events this session forwards to its agent.\n   *\n   * Only needed when a page runs MORE THAN ONE session — site co-browse plus\n   * the agent playground, say. The activity bus is global to the page, so\n   * without a filter each relay forwards the other's traffic and every agent\n   * sees every other agent's navigations.\n   *\n   * Omitted forwards everything, which is right for the single-session case.\n   */\n  activityFilter?: (event: AgentActivityEvent) => boolean;\n  /** Relay base path. Default \"/agent-relay\" (the generic frame broker). */\n  relayBaseUrl?: string;\n  /** MCP server info advertised to the agent. */\n  info?: { name: string; version: string; instructions?: string };\n  /**\n   * Register extra bridges (forms/screens/…) on the same server, once, at\n   * construction.\n   *\n   * For a surface that comes and goes with navigation use\n   * {@link CoBrowseSession.contributeBridges} instead: this callback fires\n   * exactly once while the server is built, so a page mounted afterwards can\n   * never contribute through it, and one that unmounts can never withdraw.\n   */\n  extraBridges?: (server: MicroMcpServer) => void;\n  /** CSRF token for the relay register/unregister POSTs. */\n  csrfToken?: () => string | null | undefined;\n  /** Stage submit + destructive clicks for human confirm. Default true. */\n  pendingMode?: boolean;\n};\n\nexport type CoBrowseSession = {\n  server: MicroMcpServer | null;\n  /**\n   * Contribute bridges for as long as the returned disposer is uncalled —\n   * \"site tools always; page tools while mounted\".\n   *\n   * Call it from a page's mount effect and return its disposer:\n   *\n   * ```tsx\n   * useEffect(() => contributeBridges((server) =>\n   *   registerArtboardBridge(server, { adapter }).dispose), []);\n   * ```\n   *\n   * Safe to call before sharing starts — the contribution is applied to the\n   * server as soon as one exists, and re-applied if the session is restarted.\n   */\n  contributeBridges: (contribute: BridgeContribution) => () => void;\n  session: SessionDescriptor | null;\n  relayState: RelayState;\n  /**\n   * True once at least one remote agent is actually attached to the session.\n   *\n   * Distinct from `relayState === \"open\"`, which only says the BROWSER reached\n   * the relay — true the moment sharing starts, before the link has been handed\n   * to anyone. A UI that keys \"Agent is driving\" off the relay state therefore\n   * announces a driver who does not exist, and stays silent when a real one\n   * arrives.\n   */\n  agentConnected: boolean;\n  /** How many remote agents are attached (0 when nobody has joined). */\n  agentCount: number;\n  startShare: () => Promise<void>;\n  stopShare: () => void;\n  /**\n   * Report a human action so the connected agent is notified. Emits a\n   * `source:\"user\"` activity event, which the SSE relay forwards to the agent\n   * as a `notifications/agent_activity` frame.\n   */\n  observeUser: (event: CoBrowseUserEvent) => void;\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\nconst USER = { id: \"human\", name: \"You\" };\n\n/**\n * Site-wide co-browsing session: one persistent in-page `MicroMcpServer` running\n * the navigation bridge, joinable by an external agent over the relay. Mount it\n * once at the app root; render `<CoBrowsePresence>` to show the agent + a Stop\n * control. The host wires `observeUser(...)` to navigation/scroll/form listeners\n * so the agent sees what the human does.\n */\nexport function useCoBrowseSession(options: UseCoBrowseSessionOptions): CoBrowseSession {\n  const { adapter, extraBridges } = options;\n  const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n  const relayBaseUrl = options.relayBaseUrl ?? \"/agent-relay\";\n\n  const serverRef = useRef<MicroMcpServer | null>(null);\n  // Survives re-renders AND server rebuilds: a page's contribution outlives any\n  // one session, which is the entire reason this is not a captured callback.\n  const contributionsRef = useRef<BridgeContributions>(null as unknown as BridgeContributions);\n  if (!contributionsRef.current) contributionsRef.current = new BridgeContributions();\n  const relayRef = useRef<SseRelayTransport | null>(null);\n  const detachInProc = useRef<(() => void) | null>(null);\n  const disposeBridge = useRef<(() => void) | null>(null);\n\n  const [session, setSession] = useState<SessionDescriptor | null>(null);\n  const [relayState, setRelayState] = useState<RelayState>(\"idle\");\n  const [agentCount, setAgentCount] = useState(0);\n\n  // Build the server + bridges once. The adapter is captured here, so it must\n  // be stable (its methods read live state).\n  useEffect(() => {\n    const server = new MicroMcpServer({\n      info: options.info ?? { name: \"fancy-co-browse\", version: \"0.1.0\" },\n      instructions:\n        options.info?.instructions ??\n        \"Co-browse with a watching human. Call page_describe first; navigate, scroll, and (with confirm) fill/click via stable handles. You receive notifications/agent_activity for the human's actions (source:\\\"user\\\").\",\n    });\n    const bridge = registerNavigationBridge(server, { adapter, agent, pendingMode: options.pendingMode });\n    extraBridges?.(server);\n    // Apply whatever pages are already mounted, and keep the registry attached\n    // so later mounts/unmounts add and withdraw live.\n    contributionsRef.current.bind(server);\n    const inProc = attachInProcess(server);\n    detachInProc.current = () => inProc.close();\n    disposeBridge.current = bridge.dispose;\n    serverRef.current = server;\n\n    return () => {\n      relayRef.current?.close();\n      relayRef.current = null;\n      contributionsRef.current.unbind();\n      disposeBridge.current?.();\n      detachInProc.current?.();\n      serverRef.current = null;\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  const startShare = useCallback(async () => {\n    const server = serverRef.current;\n    if (!server || relayRef.current) return;\n    const descriptor = createSessionDescriptor();\n    const csrf = options.csrfToken?.() ?? \"\";\n    const response = await fetch(`${relayBaseUrl}/register`, {\n      method: \"POST\",\n      headers: { \"content-type\": \"application/json\", \"x-csrf-token\": csrf },\n      body: JSON.stringify({ session: descriptor.id, token: descriptor.token }),\n    });\n    if (!response.ok) {\n      throw new Error(`Relay registration failed (${response.status})`);\n    }\n    // Pass the session's agent identity down so the relay stamps its own\n    // connect/disconnect events with it, and so a host that runs a SECOND\n    // session (the agent playground alongside site co-browse) has something to\n    // scope on. Without an `agent` this behaves exactly as before.\n    const relay = attachSseRelay(server, {\n      baseUrl: relayBaseUrl,\n      sessionId: descriptor.id,\n      token: descriptor.token,\n      agent: options.agent,\n      activityFilter: options.activityFilter,\n    });\n    relay.onStateChange(setRelayState);\n    relay.onPeersChange(setAgentCount);\n    relayRef.current = relay;\n    setSession(descriptor);\n  }, [relayBaseUrl, options]);\n\n  const stopShare = useCallback(() => {\n    const current = session;\n    relayRef.current?.close();\n    relayRef.current = null;\n    setRelayState(\"idle\");\n    setAgentCount(0);\n    setSession(null);\n    if (current) {\n      const csrf = options.csrfToken?.() ?? \"\";\n      void fetch(`${relayBaseUrl}/${current.id}/unregister?token=${encodeURIComponent(current.token)}`, {\n        method: \"POST\",\n        headers: { \"content-type\": \"application/json\", \"x-csrf-token\": csrf },\n      }).catch(() => {});\n    }\n  }, [relayBaseUrl, options, session]);\n\n  const observeUser = useCallback((event: CoBrowseUserEvent) => {\n    const label =\n      event.kind === \"navigation\"\n        ? `You navigated to ${event.url}`\n        : event.kind === \"scroll\"\n          ? \"You scrolled\"\n          : event.kind === \"click\"\n            ? `You clicked ${event.label ?? event.handle}`\n            : `You edited ${event.handle}${event.masked ? \" (hidden)\" : \"\"}`;\n    emitActivity({\n      agentId: USER.id,\n      agentName: USER.name,\n      source: \"user\",\n      target: { kind: \"navigation\", label },\n      action: `user_${event.kind}`,\n      timestamp: Date.now(),\n      meta: event as Record<string, unknown>,\n    });\n  }, []);\n\n  // Stable identity: a page passes this straight into a mount effect, so a new\n  // function each render would re-register its bridges on every render.\n  const contributeBridges = useCallback(\n    (contribute: BridgeContribution) => contributionsRef.current.add(contribute),\n    [],\n  );\n\n  return {\n    server: serverRef.current,\n    contributeBridges,\n    session,\n    relayState,\n    agentConnected: agentCount > 0,\n    agentCount,\n    startShare,\n    stopShare,\n    observeUser,\n  };\n}\n","import type { MicroMcpServer } from \"../mcp/server\";\n\n/**\n * A page's contribution to the shared tool surface.\n *\n * Return the disposer that withdraws it — typically the `Bridge`'s own\n * `dispose`, or the function `registerTool` returns. Returning nothing is\n * allowed (the original `extraBridges` was typed that way) but means the\n * contribution can never be withdrawn.\n */\nexport type BridgeContribution = (server: MicroMcpServer) => (() => void) | void;\n\n/**\n * The registry behind **\"site tools always; page tools while mounted\"**.\n *\n * `useCoBrowseSession` already had an `extraBridges` hook and already called it.\n * What that shape could not express is a tool surface that CHANGES under the\n * agent mid-session, because the callback is invoked exactly once while the\n * server is being built:\n *\n *   - a page that mounts later never gets a chance to contribute;\n *   - a page that unmounts cannot withdraw, so the agent keeps a tool aimed at\n *     a surface that is gone and only finds out by calling it.\n *\n * Both are silent. Nothing errors; the agent just never sees the tools, or sees\n * dead ones. So contributions live in a registry that is applied when a server\n * appears, re-applied if it is replaced, and withdrawn when the page unmounts —\n * rather than a callback captured at construction.\n *\n * Withdrawal needs no notification machinery of its own: a bridge's disposer\n * unregisters its tools, `ToolRegistry` fires `onToolsChanged`, and\n * `MicroMcpServer` broadcasts `notifications/tools/list_changed`. That was\n * verified before this was written — a grep for `unregisterTool` reads as\n * \"nothing unregisters\", which is a false negative, because bridges use the\n * disposer `registerTool` returns.\n */\nexport class BridgeContributions {\n  private readonly contributions = new Map<symbol, BridgeContribution>();\n  private readonly applied = new Map<symbol, () => void>();\n  private server: MicroMcpServer | null = null;\n\n  /**\n   * Contribute bridges for as long as the returned disposer is uncalled.\n   *\n   * Applies immediately when a server is already live, and is held for the next\n   * one otherwise — so a page need not know whether sharing has started.\n   */\n  add(contribute: BridgeContribution): () => void {\n    const key = Symbol(\"bridge-contribution\");\n    this.contributions.set(key, contribute);\n    if (this.server) this.apply(key, contribute, this.server);\n\n    return () => {\n      this.contributions.delete(key);\n      this.withdraw(key);\n    };\n  }\n\n  /** Attach a server and apply every live contribution to it. */\n  bind(server: MicroMcpServer): void {\n    if (this.server === server) return;\n    if (this.server) this.unbind();\n    this.server = server;\n    for (const [key, contribute] of this.contributions) this.apply(key, contribute, server);\n  }\n\n  /**\n   * Detach the current server, withdrawing what was applied to it. Contributions\n   * themselves are KEPT: a session can be stopped and restarted under a page\n   * that never unmounted, and its tools must come back rather than silently\n   * vanish.\n   */\n  unbind(): void {\n    for (const key of [...this.applied.keys()]) this.withdraw(key);\n    this.server = null;\n  }\n\n  private apply(key: symbol, contribute: BridgeContribution, server: MicroMcpServer): void {\n    const dispose = contribute(server);\n    if (typeof dispose === \"function\") this.applied.set(key, dispose);\n  }\n\n  private withdraw(key: symbol): void {\n    const dispose = this.applied.get(key);\n    this.applied.delete(key);\n    dispose?.();\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 ReactNode, useEffect, useMemo, useRef } from \"react\";\nimport type { MicroMcpServer } from \"../../mcp/server\";\nimport { registerFormBridge, type FormBridgeAdapter, type FormFieldDescriptor } from \"../../bridges/forms\";\n\nexport type BridgedFormProps = {\n  /** Stable id for this form. Used by agents in `form_*` tool calls. */\n  id: string;\n  /** Human title (also surfaced as the bridge title). */\n  title?: string;\n  /** Optional fancy-screens screen id this form lives in. */\n  screenId?: string;\n  /** Field descriptors — drives the agent-facing schema. */\n  fields: FormFieldDescriptor[];\n  /** Controlled values. */\n  values: Record<string, unknown>;\n  /** Setter — hosts pass their setState. */\n  onChange: (next: Record<string, unknown>) => void;\n  /** Optional submit handler. */\n  onSubmit?: () => Promise<{ ok: boolean; values?: Record<string, unknown>; error?: string }>;\n  /** The MicroMcpServer the bridge registers against. Pass null/undefined\n   *  to render without a bridge (useful for stories / non-shared use). */\n  server?: MicroMcpServer | null;\n  /** Identity used in activity events. */\n  agent?: { id: string; name?: string; color?: string };\n  children: ReactNode;\n};\n\n/**\n * BridgedForm — wraps a react-fancy form (or any controlled inputs)\n * with a `registerFormBridge` lifecycle. Children render the actual form\n * using `values` + `onChange`; this component only manages the bridge.\n *\n * Hosts use it like:\n *\n *   <BridgedForm id=\"signup\" fields={...} values={values} onChange={setValues} server={server}>\n *     <Field><Input value={values.email} onValueChange={(v) => onChange({ ...values, email: v })} /></Field>\n *     ...\n *   </BridgedForm>\n *\n * Agents can then call form_describe, form_set_value, form_submit, etc.\n */\nexport function BridgedForm({\n  id,\n  title,\n  screenId,\n  fields,\n  values,\n  onChange,\n  onSubmit,\n  server,\n  agent,\n  children,\n}: BridgedFormProps) {\n  // Refs so the adapter sees fresh values without re-installing the bridge.\n  const valuesRef = useRef(values);\n  const onChangeRef = useRef(onChange);\n  const fieldsRef = useRef(fields);\n  const submitRef = useRef(onSubmit);\n  useEffect(() => { valuesRef.current = values; }, [values]);\n  useEffect(() => { onChangeRef.current = onChange; }, [onChange]);\n  useEffect(() => { fieldsRef.current = fields; }, [fields]);\n  useEffect(() => { submitRef.current = onSubmit; }, [onSubmit]);\n\n  const focusElement = (name: string) => {\n    if (typeof document === \"undefined\") return;\n    const el = document.querySelector(`[data-form-id=\"${id}\"] [name=\"${name}\"]`) as HTMLElement | null;\n    el?.focus();\n  };\n\n  const adapter = useMemo<FormBridgeAdapter>(() => ({\n    id,\n    title,\n    screenId,\n    getFields: () => fieldsRef.current,\n    getValue: (name) => valuesRef.current[name],\n    getValues: () => ({ ...valuesRef.current }),\n    setValue: (name, v) => onChangeRef.current({ ...valuesRef.current, [name]: v }),\n    setValues: (next) => onChangeRef.current({ ...valuesRef.current, ...next }),\n    focus: focusElement,\n    submit: async () => {\n      if (!submitRef.current) {\n        return { ok: true, values: { ...valuesRef.current } };\n      }\n      return submitRef.current();\n    },\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  }), [id, title, screenId]);\n\n  useEffect(() => {\n    if (!server) return;\n    const bridge = registerFormBridge(server, { adapter, agent });\n    return () => bridge.dispose();\n  }, [server, adapter, agent]);\n\n  return <div data-form-id={id}>{children}</div>;\n}\n","import { useEffect } from \"react\";\nimport { onActivity } from \"../../presence/registry\";\n\n/**\n * Loose shape of the fancy-screens system context — kept here so this\n * component doesn't hard-import `@particle-academy/fancy-screens`.\n */\ntype ScreenSystemLike = {\n  registry: Map<string, { id: string; agentActivity?: unknown }>;\n  updateScreen: (id: string, patch: { agentActivity?: unknown }) => void;\n};\n\nexport type ScreensActivityBridgeProps = {\n  /** The value returned by `useScreenSystem()` from fancy-screens. */\n  system: ScreenSystemLike;\n  /** ms to wait after the last activity before clearing the screen's badge. Default 1500. */\n  fadeMs?: number;\n};\n\n/**\n * ScreensActivityBridge — subscribe to the in-process activity registry\n * and patch each event into the matching screen's `agentActivity` field.\n * Fade-out clears the badge after `fadeMs`.\n *\n * Use it once near the root of your app, ABOVE every <Screen>:\n *\n *   const system = useScreenSystem();\n *   <>\n *     <ScreensActivityBridge system={system} />\n *     <Screen id=\"dashboard\">…</Screen>\n *     <Screen id=\"form\">…</Screen>\n *   </>\n *\n * Renders nothing; pure side-effect component.\n */\nexport function ScreensActivityBridge({ system, fadeMs = 1500 }: ScreensActivityBridgeProps) {\n  useEffect(() => {\n    const fadeTimers = new Map<string, ReturnType<typeof setTimeout>>();\n    const off = onActivity((event) => {\n      const screenId = event.target.screenId;\n      if (!screenId) return;\n      // Only patch screens that are currently registered.\n      if (!system.registry.has(screenId)) return;\n      const activity = {\n        agentId: event.agentId,\n        agentName: event.agentName,\n        agentColor: event.agentColor,\n        action: event.action,\n        timestamp: event.timestamp,\n        elementId: event.target.elementId,\n        label: event.target.label,\n      };\n      system.updateScreen(screenId, { agentActivity: activity });\n      const prev = fadeTimers.get(screenId);\n      if (prev) clearTimeout(prev);\n      fadeTimers.set(\n        screenId,\n        setTimeout(() => {\n          system.updateScreen(screenId, { agentActivity: null });\n          fadeTimers.delete(screenId);\n        }, event.ttlMs ?? fadeMs),\n      );\n    });\n    return () => {\n      off();\n      for (const t of fadeTimers.values()) clearTimeout(t);\n    };\n  }, [system, fadeMs]);\n  return null;\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","// Per-client MCP \"install\" affordances — the single source of truth for the\n// subtly-different way each MCP host wants a remote server handed to it.\n//\n// These are PURE, framework-agnostic builders (no React, no DOM): a host can\n// call them to render its own buttons, and <ConnectorButtons> is a thin UI\n// over them. Every quirk below is a real one rediscovered the hard way:\n//\n//   - Claude has NO install deeplink (web or Desktop). The best a button can do\n//     is copy the URL and open the Connectors page for a manual paste; a\n//     `.mcpb` bundle is the only \"double-click\" path (Desktop only).\n//   - Cursor's deeplink wants base64-encoded JSON; for an HTTP server the\n//     payload is just `{\"url\":\"...\"}` — no `type`, no `transport`.\n//   - VS Code wants URL-ENCODED JSON (not base64), a different scheme handler.\n//   - The manual path is a `claude_desktop_config.json` snippet that wraps the\n//     remote URL with `npx -y mcp-remote` (MCPB/stdio can't take an HTTP URL).\n\n/** The MCP hosts we know how to generate an install affordance for. */\nexport type ConnectorClient =\n  | \"claude-web\"\n  | \"claude-desktop\"\n  | \"cursor\"\n  | \"vscode\"\n  | \"manual\";\n\n/** A remote MCP server to generate install artifacts for. */\nexport interface ConnectorServer {\n  /** Human-readable server name, e.g. `\"Decksmith\"`. */\n  name: string;\n  /** The remote MCP endpoint, e.g. `\"https://decksmith.dev/mcp\"`. */\n  url: string;\n}\n\n/**\n * Claude's Connectors page — the manual \"Add custom connector\" flow.\n *\n * Claude exposes no install deeplink, so a button can only copy the URL and\n * open this page for a paste. Override per-app if Claude moves it (it has\n * historically lived at both `/settings/connectors` and `/customize/connectors`).\n */\nexport const CLAUDE_CONNECTORS_URL = \"https://claude.ai/settings/connectors\";\n\n/** Base64-encode a JSON value, working in both the browser and Node. */\nexport function encodeBase64Json(value: unknown): string {\n  const json = JSON.stringify(value);\n  if (typeof btoa === \"function\") {\n    // utf8-safe: collapse multibyte → latin1 before btoa. For ASCII (URLs) this\n    // is a no-op and matches a plain `btoa(JSON.stringify(...))`.\n    return btoa(unescape(encodeURIComponent(json)));\n  }\n  // Node without a global btoa.\n  return Buffer.from(json, \"utf8\").toString(\"base64\");\n}\n\n/**\n * Cursor install deeplink for a remote (HTTP) MCP server.\n *\n * `cursor://anysphere.cursor-deeplink/mcp/install?name=<name>&config=<base64>`,\n * where `config` is base64 of `{\"url\":\"<mcpUrl>\"}` — the HTTP shape, with no\n * `type`/`transport` keys (those are for the stdio examples in the docs). The\n * base64 is intentionally NOT percent-encoded, matching Cursor's own install\n * links. Docs: https://cursor.com/docs/context/mcp/install-links\n */\nexport function buildCursorDeeplink(server: ConnectorServer): string {\n  const config = encodeBase64Json({ url: server.url });\n  return `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(\n    server.name,\n  )}&config=${config}`;\n}\n\n/**\n * VS Code install deeplink for a remote (HTTP) MCP server.\n *\n * `vscode://mcp/install?<urlencoded-json>` — URL-ENCODED JSON (not base64), the\n * opposite encoding from Cursor and an easy one to mix up. The payload is\n * `{ \"name\", \"url\" }`; for VS Code Insiders pass `{ insiders: true }`.\n */\nexport function buildVscodeDeeplink(\n  server: ConnectorServer,\n  opts: { insiders?: boolean } = {},\n): string {\n  const scheme = opts.insiders ? \"vscode-insiders\" : \"vscode\";\n  const payload = encodeURIComponent(\n    JSON.stringify({ name: server.name, url: server.url }),\n  );\n  return `${scheme}://mcp/install?${payload}`;\n}\n\n/** A normalized server key for a config file (`My App` → `my-app`). */\nexport function slugifyServerName(name: string): string {\n  const slug = name\n    .toLowerCase()\n    // Collapse every run of non-alphanumerics to a single dash, so the slug can\n    // never contain two consecutive dashes…\n    .replace(/[^a-z0-9]+/g, \"-\")\n    // …which leaves at most ONE leading/trailing dash to strip. A single-char\n    // strip (no `+` quantifier) is equivalent here and avoids a\n    // polynomial-backtracking trim regex.\n    .replace(/^-|-$/g, \"\");\n  return slug || \"mcp-server\";\n}\n\n/** The `claude_desktop_config.json` object for a manual install. */\nexport interface ManualMcpConfig {\n  mcpServers: Record<string, { command: string; args: string[] }>;\n}\n\n/**\n * The `claude_desktop_config.json` (or any stdio MCP client config) entry for a\n * remote server, wrapping it with `npx -y mcp-remote <url>` — the standard\n * stdio→HTTP bridge, since stdio clients can't take an HTTP URL directly.\n * Requires Node 18+ on the user's machine.\n */\nexport function buildManualConfig(server: ConnectorServer): ManualMcpConfig {\n  return {\n    mcpServers: {\n      [slugifyServerName(server.name)]: {\n        command: \"npx\",\n        args: [\"-y\", \"mcp-remote\", server.url],\n      },\n    },\n  };\n}\n\n/** Pretty-printed JSON snippet of {@link buildManualConfig}, for a copy box. */\nexport function buildManualConfigSnippet(server: ConnectorServer): string {\n  return JSON.stringify(buildManualConfig(server), null, 2);\n}\n\n/** How a given client's button behaves — drives the default UI. */\nexport type ConnectorMechanism =\n  | \"copy-open\" // copy URL + open a web page (claude-web)\n  | \"download\" // download a .mcpb bundle (claude-desktop)\n  | \"deeplink\" // navigate to a custom-scheme URL (cursor / vscode)\n  | \"snippet\"; // reveal a copy-paste JSON snippet (manual)\n\n/** Display metadata for a client, so consumers don't redraw the marks. */\nexport interface ConnectorTargetMeta {\n  id: ConnectorClient;\n  /** Default button label. */\n  label: string;\n  mechanism: ConnectorMechanism;\n  /** One-line tooltip explaining what the button does. */\n  hint: string;\n}\n\nexport const CONNECTOR_TARGETS: Record<ConnectorClient, ConnectorTargetMeta> = {\n  \"claude-web\": {\n    id: \"claude-web\",\n    label: \"Add to Claude\",\n    mechanism: \"copy-open\",\n    hint: \"Copy the MCP URL and open Claude's Connectors page — click 'Add custom connector' and paste.\",\n  },\n  \"claude-desktop\": {\n    id: \"claude-desktop\",\n    label: \"Claude Desktop\",\n    mechanism: \"download\",\n    hint: \"Download a .mcpb bundle and double-click it to install in Claude Desktop.\",\n  },\n  cursor: {\n    id: \"cursor\",\n    label: \"Add to Cursor\",\n    mechanism: \"deeplink\",\n    hint: \"Open Cursor with this MCP server pre-filled — confirm to install.\",\n  },\n  vscode: {\n    id: \"vscode\",\n    label: \"Add to VS Code\",\n    mechanism: \"deeplink\",\n    hint: \"Open VS Code with this MCP server pre-filled — confirm to install.\",\n  },\n  manual: {\n    id: \"manual\",\n    label: \"Manual setup\",\n    mechanism: \"snippet\",\n    hint: \"Show a config snippet to paste into any stdio MCP client.\",\n  },\n};\n\n/**\n * Resolve the navigable href for a deeplink client (cursor / vscode), or null\n * for clients whose mechanism isn't a plain navigation.\n */\nexport function connectorHref(\n  client: ConnectorClient,\n  server: ConnectorServer,\n  opts: { insiders?: boolean } = {},\n): string | null {\n  switch (client) {\n    case \"cursor\":\n      return buildCursorDeeplink(server);\n    case \"vscode\":\n      return buildVscodeDeeplink(server, opts);\n    default:\n      return null;\n  }\n}\n","// Brand-ish glyph marks for each MCP host, so consumers don't have to redraw\n// them. Deliberately simple, single-path, `currentColor` SVGs — they inherit\n// the button's text color and stay crisp at 14px.\n\nimport type { SVGProps } from \"react\";\n\ntype GlyphProps = SVGProps<SVGSVGElement>;\n\nexport function ClaudeMark(props: GlyphProps) {\n  return (\n    <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden {...props}>\n      <path d=\"M12 2 L 14 10 L 22 12 L 14 14 L 12 22 L 10 14 L 2 12 L 10 10 Z\" />\n    </svg>\n  );\n}\n\nexport function CursorMark(props: GlyphProps) {\n  return (\n    <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden {...props}>\n      <path d=\"M3 3 L 20 11 L 12 13 L 9 21 Z\" />\n    </svg>\n  );\n}\n\nexport function VscodeMark(props: GlyphProps) {\n  return (\n    <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden {...props}>\n      <path d=\"M17 2 L 22 4.5 V 19.5 L 17 22 L 6.5 13.2 L 3 16 L 1.5 15 V 9 L 3 8 L 6.5 10.8 Z M 17 6.5 L 10 12 L 17 17.5 Z\" />\n    </svg>\n  );\n}\n\nexport function DesktopMark(props: GlyphProps) {\n  return (\n    <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden {...props}>\n      <path d=\"M3 4 H 21 A 1 1 0 0 1 22 5 V 16 A 1 1 0 0 1 21 17 H 14 V 19 H 16 V 21 H 8 V 19 H 10 V 17 H 3 A 1 1 0 0 1 2 16 V 5 A 1 1 0 0 1 3 4 Z\" />\n    </svg>\n  );\n}\n\nexport function WrenchMark(props: GlyphProps) {\n  return (\n    <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden {...props}>\n      <path d=\"M21 4 a 5 5 0 0 1 -6.5 6.5 L 6 19 l -3 -3 l 8.5 -8.5 A 5 5 0 0 1 17 1 l -2.5 2.5 l 1.5 3 l 3 1.5 Z\" />\n    </svg>\n  );\n}\n\nimport type { ComponentType } from \"react\";\nimport type { ConnectorClient } from \"./targets\";\n\n/** Glyph component for a given client. */\nexport const CONNECTOR_GLYPHS: Record<\n  ConnectorClient,\n  ComponentType<GlyphProps>\n> = {\n  \"claude-web\": ClaudeMark,\n  \"claude-desktop\": DesktopMark,\n  cursor: CursorMark,\n  vscode: VscodeMark,\n  manual: WrenchMark,\n};\n","import { type CSSProperties, type ReactNode, useId, useState } from \"react\";\nimport {\n  CLAUDE_CONNECTORS_URL,\n  CONNECTOR_TARGETS,\n  type ConnectorClient,\n  type ConnectorServer,\n  buildManualConfigSnippet,\n  connectorHref,\n} from \"./targets\";\nimport { CONNECTOR_GLYPHS } from \"./glyphs\";\n\nexport interface ConnectorButtonsProps {\n  /** Human-readable server name, e.g. `\"Decksmith\"`. */\n  serverName: string;\n  /** The remote MCP endpoint, e.g. `\"https://decksmith.dev/mcp\"`. */\n  mcpUrl: string;\n  /**\n   * Which client buttons to render, in order. Defaults to\n   * `[\"claude-web\", \"cursor\", \"vscode\", \"manual\"]` — plus `\"claude-desktop\"`\n   * when {@link mcpbDownloadUrl} is set. A `\"claude-desktop\"` entry with no\n   * `mcpbDownloadUrl` is skipped (there's nothing to download).\n   */\n  clients?: ConnectorClient[];\n  /** URL of a prebuilt `.mcpb` bundle; enables the Claude Desktop button. */\n  mcpbDownloadUrl?: string;\n  /** Override Claude's Connectors page (it has moved before). */\n  claudeConnectorsUrl?: string;\n  /** Target VS Code Insiders instead of stable. */\n  vscodeInsiders?: boolean;\n  /** Fired when a value is copied to the clipboard (URL or snippet). */\n  onCopy?: (target: ConnectorClient) => void;\n  /** Fired when any button is activated (after its side effect). */\n  onAction?: (target: ConnectorClient) => void;\n  /** Per-client label override. */\n  labels?: Partial<Record<ConnectorClient, ReactNode>>;\n  className?: string;\n  style?: CSSProperties;\n}\n\nconst DEFAULT_CLIENTS: ConnectorClient[] = [\n  \"claude-web\",\n  \"cursor\",\n  \"vscode\",\n  \"manual\",\n];\n\n/**\n * Per-client \"Add to <host>\" buttons for a remote MCP server, each with the\n * right (and subtly different) install behavior baked in — see {@link\n * ./targets}. Brand glyphs, copy/feedback states, and the manual-config popover\n * are owned here so a consumer just passes a name + URL.\n *\n * Needs the package stylesheet for its default look:\n * `import \"@particle-academy/agent-integrations/styles.css\"`.\n */\nexport function ConnectorButtons({\n  serverName,\n  mcpUrl,\n  clients,\n  mcpbDownloadUrl,\n  claudeConnectorsUrl = CLAUDE_CONNECTORS_URL,\n  vscodeInsiders,\n  onCopy,\n  onAction,\n  labels,\n  className,\n  style,\n}: ConnectorButtonsProps) {\n  const server: ConnectorServer = { name: serverName, url: mcpUrl };\n  const [copied, setCopied] = useState<ConnectorClient | null>(null);\n  const [manualOpen, setManualOpen] = useState(false);\n  const manualId = useId();\n\n  const list = (clients ?? defaultClients(mcpbDownloadUrl)).filter((c) =>\n    c === \"claude-desktop\" ? !!mcpbDownloadUrl : true,\n  );\n\n  const flashCopied = (target: ConnectorClient) => {\n    setCopied(target);\n    window.setTimeout(() => setCopied((c) => (c === target ? null : c)), 2000);\n  };\n\n  const copy = async (value: string, target: ConnectorClient) => {\n    try {\n      await navigator.clipboard?.writeText(value);\n      flashCopied(target);\n      onCopy?.(target);\n    } catch {\n      /* clipboard blocked — the popover/URL is still visible */\n    }\n  };\n\n  const labelFor = (c: ConnectorClient): ReactNode =>\n    labels?.[c] ?? CONNECTOR_TARGETS[c].label;\n\n  return (\n    <div\n      className={[\"fai-connect\", className].filter(Boolean).join(\" \")}\n      style={style}\n    >\n      {list.map((client) => {\n        const meta = CONNECTOR_TARGETS[client];\n        const Glyph = CONNECTOR_GLYPHS[client];\n        const base = `fai-connect__btn fai-connect__btn--${client}`;\n\n        // Deeplink clients (cursor / vscode) are plain navigations.\n        const href = connectorHref(client, server, { insiders: vscodeInsiders });\n        if (href) {\n          return (\n            <a\n              key={client}\n              href={href}\n              className={base}\n              title={meta.hint}\n              onClick={() => onAction?.(client)}\n            >\n              <Glyph className=\"fai-connect__glyph\" />\n              {labelFor(client)}\n            </a>\n          );\n        }\n\n        if (client === \"claude-desktop\") {\n          return (\n            <a\n              key={client}\n              href={mcpbDownloadUrl}\n              download\n              className={base}\n              title={meta.hint}\n              onClick={() => onAction?.(client)}\n            >\n              <Glyph className=\"fai-connect__glyph\" />\n              {labelFor(client)}\n            </a>\n          );\n        }\n\n        if (client === \"claude-web\") {\n          return (\n            <button\n              key={client}\n              type=\"button\"\n              className={base}\n              title={meta.hint}\n              onClick={() => {\n                void copy(mcpUrl, client);\n                window.open(\n                  claudeConnectorsUrl,\n                  \"_blank\",\n                  \"noopener,noreferrer\",\n                );\n                onAction?.(client);\n              }}\n            >\n              <Glyph className=\"fai-connect__glyph\" />\n              {copied === client ? \"Copied — paste in Claude\" : labelFor(client)}\n            </button>\n          );\n        }\n\n        // manual\n        return (\n          <div key={client} className=\"fai-connect__manual-wrap\">\n            <button\n              type=\"button\"\n              className={base}\n              title={meta.hint}\n              aria-expanded={manualOpen}\n              aria-controls={manualId}\n              onClick={() => {\n                setManualOpen((o) => !o);\n                onAction?.(client);\n              }}\n            >\n              <Glyph className=\"fai-connect__glyph\" />\n              {labelFor(client)}\n            </button>\n            {manualOpen && (\n              <ManualPopover\n                id={manualId}\n                snippet={buildManualConfigSnippet(server)}\n                copied={copied === client}\n                onCopy={() => copy(buildManualConfigSnippet(server), client)}\n                onClose={() => setManualOpen(false)}\n              />\n            )}\n          </div>\n        );\n      })}\n    </div>\n  );\n}\n\nfunction defaultClients(mcpbDownloadUrl?: string): ConnectorClient[] {\n  return mcpbDownloadUrl\n    ? [\"claude-web\", \"claude-desktop\", \"cursor\", \"vscode\", \"manual\"]\n    : DEFAULT_CLIENTS;\n}\n\nfunction ManualPopover({\n  id,\n  snippet,\n  copied,\n  onCopy,\n  onClose,\n}: {\n  id: string;\n  snippet: string;\n  copied: boolean;\n  onCopy: () => void;\n  onClose: () => void;\n}) {\n  return (\n    <div id={id} className=\"fai-connect__popover\" role=\"dialog\">\n      <div className=\"fai-connect__popover-head\">\n        <span>Add to any stdio MCP client</span>\n        <button\n          type=\"button\"\n          className=\"fai-connect__popover-close\"\n          aria-label=\"Close\"\n          onClick={onClose}\n        >\n          ×\n        </button>\n      </div>\n      <p className=\"fai-connect__popover-hint\">\n        Paste into <code>claude_desktop_config.json</code> (or any stdio MCP\n        client config). Needs Node 18+.\n      </p>\n      <pre className=\"fai-connect__snippet\">{snippet}</pre>\n      <button type=\"button\" className=\"fai-connect__copy-btn\" onClick={onCopy}>\n        {copied ? \"Copied\" : \"Copy snippet\"}\n      </button>\n    </div>\n  );\n}\n","import { useMemo } from \"react\";\nimport { useAgentActivity } from \"../../presence/use-agent-activity\";\nimport { ShareControls } from \"../ShareControls/ShareControls\";\nimport { ConnectorButtons } from \"../../connectors/ConnectorButtons\";\nimport type { AgentActivity } from \"../AgentPanel\";\nimport type { AgentActivityEvent } from \"../../presence/types\";\nimport type { CoBrowseSession } from \"../../sharing/use-co-browse-session\";\n\nexport type CoBrowsePresenceProps = {\n  /** The session from `useCoBrowseSession`. */\n  session: CoBrowseSession;\n  /** Public MCP/connect URL shown to the user (for ConnectorButtons), optional. */\n  connectUrl?: string;\n  /** Base URL used to build the shareable session link. */\n  shareBaseUrl?: string;\n  className?: string;\n};\n\n/** Lifecycle chatter — real to the session, but not something the agent *did*. */\nconst LIFECYCLE_ACTIONS = new Set([\"agent_connected\", \"agent_disconnected\"]);\n\n/**\n * The human's view of a site-wide co-browsing session: a \"Let an agent drive\"\n * starter, the share/connect surface until an agent arrives, a live log of what\n * it is doing once one has, and a Stop / take-back-control button.\n *\n * Staged-action confirms are rendered by the HOST (via the navigation adapter's\n * `confirm`), so this component stays presentation-only.\n */\nexport function CoBrowsePresence({ session, connectUrl, shareBaseUrl, className }: CoBrowsePresenceProps) {\n  const { events } = useAgentActivity(undefined, { capacity: 40 });\n  const lastAgentAction = [...events]\n    .reverse()\n    .find((e) => (e.source ?? \"agent\") !== \"user\" && !LIFECYCLE_ACTIONS.has(e.action));\n\n  // Whether an agent is HERE, not whether the browser reached the relay. The\n  // latter is true the instant sharing starts, so keying the badge on it told\n  // every human \"Agent is driving\" before they had handed the link to anyone.\n  const connected = session.agentConnected;\n\n  const activity = useMemo(() => events.map(toPanelActivity), [events]);\n\n  if (!session.session) {\n    return (\n      <div className={className} data-co-browse-presence=\"idle\">\n        <button type=\"button\" onClick={() => void session.startShare()} data-co-browse-start>\n          Let an agent drive\n        </button>\n      </div>\n    );\n  }\n\n  return (\n    <div className={className} data-co-browse-presence={connected ? \"connected\" : \"waiting\"}>\n      <div data-co-browse-bar>\n        <span data-co-browse-dot data-state={session.relayState} />\n        <span data-co-browse-status>\n          {connected ? \"Agent is driving\" : `Waiting for an agent… (${session.relayState})`}\n        </span>\n        {lastAgentAction && <span data-co-browse-last>{lastAgentAction.target?.label ?? lastAgentAction.action}</span>}\n        <button type=\"button\" onClick={session.stopShare} data-co-browse-stop>\n          Stop\n        </button>\n      </div>\n\n      <ShareControls\n        session={session.session}\n        onStart={() => void session.startShare()}\n        onStop={session.stopShare}\n        status={session.relayState}\n        agentConnected={connected}\n        activity={activity}\n        shareBaseUrl={shareBaseUrl}\n      />\n\n      {connectUrl && <ConnectorButtons serverName=\"Fancy UI co-browse\" mcpUrl={connectUrl} />}\n    </div>\n  );\n}\n\n/**\n * Presence event → the `AgentActivity` row `<ShareControls>` / `<AgentPanel>`\n * render. One shape for both, so a host already collecting presence needs no\n * second stream.\n */\nfunction toPanelActivity(event: AgentActivityEvent): AgentActivity {\n  const who = (event.source ?? \"agent\") === \"user\" ? \"You\" : (event.agentName ?? \"Agent\");\n  return {\n    id: `${event.timestamp}-${event.action}-${event.target?.elementId ?? event.target?.label ?? \"\"}`,\n    at: event.timestamp,\n    kind: LIFECYCLE_ACTIONS.has(event.action) ? \"info\" : \"tool\",\n    source: who,\n    text: event.target?.label ?? event.action,\n    detail: event.meta,\n  };\n}\n\nCoBrowsePresence.displayName = \"CoBrowsePresence\";\n","import { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useAgentActivity } from \"../../presence/use-agent-activity\";\nimport { AgentCursor } from \"../AgentCursor/AgentCursor\";\nimport { AgentActivityHighlight } from \"../AgentActivityHighlight/AgentActivityHighlight\";\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\nconst CURSOR_EDGE_INSET = 24;\nconst FLUID_CURSOR_SPEED_PX_PER_SECOND = 1_050;\nconst MIN_GLIDE_MS = 240;\nconst MAX_GLIDE_MS = 1_200;\n\nexport function visibleCursorPoint(rect: Rect, viewport: { width: number; height: number }) {\n  const x = rect.x + rect.width / 2;\n  const y = rect.y + rect.height / 2;\n  return {\n    x: Math.min(Math.max(x, CURSOR_EDGE_INSET), Math.max(CURSOR_EDGE_INSET, viewport.width - CURSOR_EDGE_INSET)),\n    y: Math.min(Math.max(y, CURSOR_EDGE_INSET), Math.max(CURSOR_EDGE_INSET, viewport.height - CURSOR_EDGE_INSET)),\n  };\n}\n\nexport function fluidGlideDuration(from: { x: number; y: number } | null, to: { x: number; y: number }) {\n  if (!from) return 0;\n  const distance = Math.hypot(to.x - from.x, to.y - from.y);\n  return Math.round(Math.min(MAX_GLIDE_MS, Math.max(MIN_GLIDE_MS, (distance / FLUID_CURSOR_SPEED_PX_PER_SECOND) * 1_000)));\n}\n\nexport type CoBrowseCursorLayerProps = {\n  /** Render the overlay only while a session is live. Default true. */\n  active?: boolean;\n  /** Stacking order of the overlay. Default just under the max. */\n  zIndex?: number;\n  /**\n   * Retire the cursor after this long without a tool call. Default 15s;\n   * `0` keeps it on screen indefinitely.\n   *\n   * A cursor that sits still is not neutral — it reads as \"the agent is\n   * broken\", which is worse than showing nothing. Continuous presence belongs\n   * in the activity log; the cursor is for *motion*.\n   */\n  idleAfterMs?: number;\n};\n\n/**\n * Session lifecycle chatter. Real events, but nothing the agent DID — so they\n * must never conjure a cursor. `agent_connected` used to, parking a motionless\n * pointer captioned \"Agent connected\" in the middle of the viewport for a\n * session in which the agent had not yet made a single tool call.\n */\nconst LIFECYCLE_ACTIONS = new Set([\"agent_connected\", \"agent_disconnected\"]);\n\n/**\n * Page-wide agent presence for co-browsing — the missing \"all actors present\"\n * half of Human+ UX. A fixed, click-through overlay (portaled to <body>) that\n * shows the connected agent as a live cursor + pings/highlights the element it\n * just acted on, gliding between targets. Same visual language as the whiteboard\n * demo's agent cursor, but mapped from the navigation bridge's STABLE HANDLES\n * (the agent has no real mouse) — each tool reports the acted element's viewport\n * rect in `meta.rect` (see `NavigationBridgeAdapter.rectFor`).\n *\n * Mount it once near the app root (e.g. in your CoBrowseProvider), gated on an\n * active session. SSR-safe: renders null on the server / until the first action.\n */\nexport function CoBrowseCursorLayer({\n  active = true,\n  zIndex = 2147483000,\n  idleAfterMs = 15_000,\n}: CoBrowseCursorLayerProps) {\n  const { latest } = useAgentActivity(undefined, { capacity: 12 });\n  const [cursor, setCursor] = useState<{ x: number; y: number; name: string; color: string; status?: string; glideMs: number } | null>(\n    null,\n  );\n  const [pulse, setPulse] = useState<{ rect: Rect; color: string; key: number } | null>(null);\n  // Timestamp of the last real tool call — the only thing that keeps the cursor\n  // alive. Deliberately NOT bumped by lifecycle events, so a relay client\n  // reconnecting every call can't hold a stale pointer on screen forever.\n  const [lastActionAt, setLastActionAt] = useState(0);\n\n  useEffect(() => {\n    if (!latest || (latest.source ?? \"agent\") === \"user\") return;\n    if (LIFECYCLE_ACTIONS.has(latest.action)) {\n      // Connecting is not acting. Relay clients may also be intentionally\n      // short-lived (one process per MCP call), so a disconnect is not the end\n      // of the session either — if a cursor is already on screen from real work,\n      // leave it and just say so. What we must NOT do is create one: an agent\n      // that has connected and done nothing has nowhere to point.\n      setCursor((prev) => (prev ? { ...prev, status: \"Standing by\", glideMs: 0 } : null));\n      setPulse(null);\n      return;\n    }\n    setLastActionAt(latest.timestamp);\n    const color = latest.agentColor ?? \"#a855f7\";\n    const name = latest.agentName ?? \"Agent\";\n    const status = latest.target?.label ?? latest.action;\n    const rect = (latest.meta as { rect?: Rect } | undefined)?.rect;\n    if (rect) {\n      // Keep off-screen targets represented at the nearest viewport edge, then\n      // glide at a distance-aware pace that a watching human can comfortably\n      // follow. This is presence, not a teleport animation.\n      const target = visibleCursorPoint(rect, { width: window.innerWidth, height: window.innerHeight });\n      const reduceMotion = window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches ?? false;\n      setCursor((prev) => ({\n        ...target,\n        name,\n        color,\n        status,\n        glideMs: reduceMotion ? 0 : fluidGlideDuration(prev, target),\n      }));\n      setPulse({ rect, color, key: latest.timestamp });\n    } else {\n      // nav / scroll — no element. Keep (or first-show, at viewport center) the\n      // cursor so the agent stays visibly present; just refresh its caption.\n      setCursor((prev) =>\n        prev\n          ? { ...prev, status, name, color }\n          : { x: window.innerWidth / 2, y: window.innerHeight / 2, name, color, status, glideMs: 0 },\n      );\n    }\n  }, [latest?.timestamp]);\n\n  // Retire the cursor once the agent goes quiet. Presence that never changes\n  // stops being information — the human reads a frozen pointer as a hung agent,\n  // and the activity log is where \"still connected\" is supposed to live.\n  useEffect(() => {\n    if (!idleAfterMs || !lastActionAt) return;\n    const timer = setTimeout(() => {\n      setCursor(null);\n      setPulse(null);\n    }, idleAfterMs);\n    return () => clearTimeout(timer);\n  }, [lastActionAt, idleAfterMs]);\n\n  if (!active || !cursor || typeof document === \"undefined\") return null;\n\n  return createPortal(\n    <div data-co-browse-cursor-layer=\"\" style={{ position: \"fixed\", inset: 0, pointerEvents: \"none\", zIndex }}>\n      {pulse && (\n        <AgentActivityHighlight\n          x={pulse.rect.x}\n          y={pulse.rect.y}\n          width={pulse.rect.width}\n          height={pulse.rect.height}\n          color={pulse.color}\n          pulseKey={pulse.key}\n        />\n      )}\n      <AgentCursor\n        x={cursor.x}\n        y={cursor.y}\n        name={cursor.name}\n        color={cursor.color}\n        status={cursor.status}\n        style={{\n          transition: cursor.glideMs\n            ? `left ${cursor.glideMs}ms cubic-bezier(.22,.61,.36,1), top ${cursor.glideMs}ms cubic-bezier(.22,.61,.36,1)`\n            : \"none\",\n        }}\n      />\n    </div>,\n    document.body,\n  );\n}\n\nCoBrowseCursorLayer.displayName = \"CoBrowseCursorLayer\";\n","import { type CSSProperties, useState } from \"react\";\n\nexport type SimulateUsersButtonProps = {\n  /** Endpoint that injects the fake active users. Default `/active-users/simulate`. */\n  endpoint?: string;\n  /** How many fake users to simulate (sent as `count`). Default `10`. */\n  count?: number;\n  /** Button label. Default `Simulate {count} active users`. */\n  label?: string;\n  /**\n   * CSRF token sent as `X-CSRF-TOKEN`. If omitted, falls back to a\n   * `<meta name=\"csrf-token\">` on the page (the Laravel default).\n   */\n  csrfToken?: string;\n  /** Called after a successful trigger. */\n  onTriggered?: () => void;\n  /** Called if the request fails. */\n  onError?: (error: unknown) => void;\n  className?: string;\n  style?: CSSProperties;\n};\n\nfunction resolveCsrf(explicit?: string): string | undefined {\n  if (explicit) return explicit;\n  if (typeof document === \"undefined\") return undefined;\n  return document.querySelector<HTMLMetaElement>('meta[name=\"csrf-token\"]')?.content;\n}\n\n/**\n * A button that asks the host to inject N **fake** active users (injected\n * dummies, not real accounts) so the live ActiveUser stream / presence overlay\n * has something to animate in a demo. POSTs `{ count }` to `endpoint`.\n *\n * Self-contained (inline styles, no react-fancy dependency) so it drops into any\n * host. The fakes + their staggered activity are produced server-side; this\n * button only triggers them.\n */\nexport function SimulateUsersButton({\n  endpoint = \"/active-users/simulate\",\n  count = 10,\n  label,\n  csrfToken,\n  onTriggered,\n  onError,\n  className,\n  style,\n}: SimulateUsersButtonProps) {\n  const [busy, setBusy] = useState(false);\n\n  async function trigger() {\n    if (busy) return;\n    setBusy(true);\n    try {\n      const token = resolveCsrf(csrfToken);\n      const res = await fetch(endpoint, {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          \"X-Requested-With\": \"XMLHttpRequest\",\n          ...(token ? { \"X-CSRF-TOKEN\": token } : {}),\n        },\n        credentials: \"same-origin\",\n        body: JSON.stringify({ count }),\n      });\n      if (!res.ok) throw new Error(`Simulate request failed: ${res.status}`);\n      onTriggered?.();\n    } catch (err) {\n      onError?.(err);\n    } finally {\n      setBusy(false);\n    }\n  }\n\n  return (\n    <button\n      type=\"button\"\n      data-fai-simulate-users=\"\"\n      className={[\"fai-simulate-users\", className ?? \"\"].filter(Boolean).join(\" \")}\n      onClick={trigger}\n      disabled={busy}\n      style={{\n        display: \"inline-flex\",\n        alignItems: \"center\",\n        gap: 8,\n        padding: \"8px 14px\",\n        borderRadius: 8,\n        border: \"1px solid rgba(139,92,246,0.4)\",\n        background: busy ? \"rgba(139,92,246,0.15)\" : \"rgba(139,92,246,0.1)\",\n        color: \"#7c3aed\",\n        font: \"inherit\",\n        fontSize: 13,\n        fontWeight: 500,\n        cursor: busy ? \"progress\" : \"pointer\",\n        opacity: busy ? 0.7 : 1,\n        ...style,\n      }}\n    >\n      <span aria-hidden>{busy ? \"⏳\" : \"✨\"}</span>\n      {label ?? `Simulate ${count} active users`}\n    </button>\n  );\n}\n","/**\n * In-browser heuristics analytics sink for agent traffic.\n *\n * Agent bridge mutations emit `AutoActivityEvent`s into the in-page\n * `@particle-academy/fancy-auto-common` activity bus (presence / cursors).\n * This sink — living in THIS package so it shares the SAME bundled\n * `fancy-auto-common` module instance the bridges emit into — subscribes to\n * that bus and POSTs each event to the `fancy-heuristics` `/collect` endpoint\n * as `actor:\"agent\"`, so agent traffic shows up in the heuristics dashboard.\n *\n * It does NOT depend on `fancy-heuristics` / `fancy-heuristics-js`: it only\n * emits the frozen wire shape over HTTP. The mapping mirrors\n * `fancy-heuristics-js/src/agent.ts` `mapActivityToEvent` — keep parity.\n */\nimport { onActivity, type AgentActivityEvent } from \"../presence\";\n\n/** What kind of interaction an event captures (mirrors fancy-heuristics-js). */\ntype HeuristicsEventKind = \"pageview\" | \"click\" | \"scroll\" | \"pointer\" | \"dwell\";\n\n/** Who produced the interaction. */\ntype HeuristicsActor = \"human\" | \"agent\";\n\n/**\n * A single interaction event — mirrors `fancy-heuristics-js` `HeuristicsEvent`.\n * Optional fields are omitted (never `null`) when not relevant to the `kind`.\n */\nexport interface HeuristicsEvent {\n  kind: HeuristicsEventKind;\n  actor: HeuristicsActor;\n  /** location.pathname at capture time. */\n  path: string;\n  /** ms epoch. */\n  ts: number;\n  x?: number;\n  y?: number;\n  vw?: number;\n  vh?: number;\n  scrollPct?: number;\n  dwellMs?: number;\n  targetId?: string;\n  label?: string;\n  meta?: Record<string, unknown>;\n}\n\n/** The batched POST body sent to `${endpoint}/collect`. */\nexport interface CollectBatch {\n  siteKey: string;\n  sessionId: string;\n  events: HeuristicsEvent[];\n}\n\nexport interface AttachHeuristicsSinkOptions {\n  /** Base URL, e.g. \"/heuristics\". POSTs to `${endpoint}/collect`. */\n  endpoint: string;\n  /** Identifies the site to the ingestion endpoint. */\n  siteKey: string;\n  /** Stable session id. Default: a generated \"agent-<rand>\" per attach. */\n  sessionId?: string;\n  /** Resolves the current path. Default: `() => location.pathname`. */\n  path?: () => string;\n  /** Which activity sources to record. Default \"all\". */\n  source?: \"agent\" | \"flow\" | \"all\";\n  /** Flush interval in ms. Default 2000. */\n  batchMs?: number;\n}\n\nfunction numericMeta(\n  meta: Record<string, unknown> | undefined,\n  key: string,\n): number | undefined {\n  const v = meta?.[key];\n  return typeof v === \"number\" && Number.isFinite(v) ? v : undefined;\n}\n\n/**\n * Map one activity event to an `actor:\"agent\"` HeuristicsEvent. Activities\n * carrying a finite `meta.dwellMs` become `kind:\"dwell\"`; everything else is a\n * discrete `kind:\"click\"` with x/y/vw/vh pulled from numeric meta (default 0).\n * Mirrors `fancy-heuristics-js/src/agent.ts` `mapActivityToEvent`.\n */\nexport function mapActivityToEvent(\n  e: AgentActivityEvent,\n  path: string,\n): HeuristicsEvent {\n  const source = e.source ?? \"agent\";\n  const targetId = e.target?.elementId;\n  const label = e.target?.label;\n  const meta: Record<string, unknown> = {\n    action: e.action,\n    agentId: e.agentId,\n    source,\n    kind: e.target?.kind,\n  };\n  const dwellMs = numericMeta(e.meta, \"dwellMs\");\n\n  if (dwellMs !== undefined) {\n    const ev: HeuristicsEvent = {\n      kind: \"dwell\",\n      actor: \"agent\",\n      path,\n      ts: e.timestamp,\n      dwellMs,\n      meta,\n    };\n    if (targetId !== undefined) ev.targetId = targetId;\n    if (label !== undefined) ev.label = label;\n    return ev;\n  }\n\n  const ev: HeuristicsEvent = {\n    kind: \"click\",\n    actor: \"agent\",\n    path,\n    ts: e.timestamp,\n    x: numericMeta(e.meta, \"x\") ?? 0,\n    y: numericMeta(e.meta, \"y\") ?? 0,\n    vw: numericMeta(e.meta, \"vw\") ?? 0,\n    vh: numericMeta(e.meta, \"vh\") ?? 0,\n    meta,\n  };\n  if (targetId !== undefined) ev.targetId = targetId;\n  if (label !== undefined) ev.label = label;\n  return ev;\n}\n\nfunction randomId(): string {\n  return Math.random().toString(36).slice(2, 10);\n}\n\n/**\n * Subscribe to the in-page agent activity bus and forward each matching event\n * to the heuristics `/collect` endpoint as `actor:\"agent\"`. SSR-safe (returns a\n * no-op when there is no `window`). Returns an unsubscribe that flushes the\n * buffer and detaches all listeners/timers.\n */\nexport function attachHeuristicsSink(\n  opts: AttachHeuristicsSinkOptions,\n): () => void {\n  // Browser guard — SSR-safe no-op.\n  if (typeof window === \"undefined\") return () => {};\n\n  const endpoint = opts.endpoint.replace(/\\/$/, \"\");\n  const url = `${endpoint}/collect`;\n  const siteKey = opts.siteKey;\n  const sessionId = opts.sessionId ?? `agent-${randomId()}`;\n  const getPath = opts.path ?? (() => location.pathname);\n  const source = opts.source ?? \"all\";\n  const batchMs = opts.batchMs ?? 2000;\n\n  // onActivity's `source` filter is strict-equality; only set it when we want a\n  // single source. \"all\" subscribes unfiltered.\n  const filter = source === \"all\" ? undefined : { source };\n\n  let buffer: HeuristicsEvent[] = [];\n\n  function flush(): void {\n    if (buffer.length === 0) return;\n    const events = buffer;\n    buffer = [];\n    const batch: CollectBatch = { siteKey, sessionId, events };\n    const body = JSON.stringify(batch);\n    try {\n      if (\n        typeof navigator !== \"undefined\" &&\n        typeof navigator.sendBeacon === \"function\"\n      ) {\n        const blob = new Blob([body], { type: \"application/json\" });\n        navigator.sendBeacon(url, blob);\n        return;\n      }\n    } catch {\n      // fall through to fetch\n    }\n    try {\n      void fetch(url, {\n        method: \"POST\",\n        headers: { \"content-type\": \"application/json\" },\n        body,\n        keepalive: true,\n      });\n    } catch {\n      // never throw from a flush\n    }\n  }\n\n  const unsubscribeActivity = onActivity((e) => {\n    try {\n      buffer.push(mapActivityToEvent(e, getPath()));\n    } catch {\n      // never let a malformed event break the bus\n    }\n  }, filter);\n\n  const timer: ReturnType<typeof setInterval> = setInterval(flush, batchMs);\n\n  const onPageHide = () => flush();\n  const onVisibility = () => {\n    if (document.visibilityState === \"hidden\") flush();\n  };\n  window.addEventListener(\"pagehide\", onPageHide);\n  document.addEventListener(\"visibilitychange\", onVisibility);\n\n  return () => {\n    unsubscribeActivity();\n    window.removeEventListener(\"pagehide\", onPageHide);\n    document.removeEventListener(\"visibilitychange\", onVisibility);\n    clearInterval(timer);\n    flush();\n  };\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { readHistory } from \"./undo-stack\";\n\n/**\n * useUndoStack — minimal React snapshot of an agent's history. Polls every\n * `intervalMs` (default 500). Use this to render an inline \"agent timeline\"\n * in a sidebar or activity panel. No subscription model in v1 — keeping it\n * simple; bridge mutations are infrequent enough that polling is fine.\n */\nexport function useUndoStack(agentId: string, intervalMs = 500) {\n  const [history, setHistory] = useState(() => readHistory(agentId));\n\n  useEffect(() => {\n    let cancelled = false;\n    const tick = () => {\n      if (cancelled) return;\n      setHistory(readHistory(agentId));\n    };\n    const id = setInterval(tick, intervalMs);\n    tick();\n    return () => { cancelled = true; clearInterval(id); };\n  }, [agentId, intervalMs]);\n\n  const refresh = useCallback(() => setHistory(readHistory(agentId)), [agentId]);\n  return { history, refresh };\n}\n","// MCPB (Claude Desktop \"Extensions\" bundle) manifest + proxy generation.\n//\n// PURE — no filesystem, no child_process — so it's trivially testable. The\n// `writeMcpbBundle` Node helper (./build) layers fs + the official mcpb CLI on\n// top of these.\n//\n// The hard fact MCPB forces on you: it is STDIO-ONLY. The manifest's\n// `server.type` is one of `node` / `python` / `binary` / `uv` — there is no\n// `type: \"http\"`. So to bundle a REMOTE MCP server (what fancy-* apps almost\n// always are) you ship a thin `node` server whose `mcp_config` runs\n// `npx -y mcp-remote <url>`, bridging stdio→HTTP. The manifest validator still\n// requires `entry_point`, so an (otherwise unused) proxy stub is emitted too.\n//\n// Future-proof: when MCPB grows a real `type: \"http\"`, drop the proxy and point\n// straight at the URL — the call site here doesn't change.\n\n/** The MCPB manifest schema version this helper emits. */\nexport const MCPB_MANIFEST_VERSION = \"0.2\";\n\n/** Minimum Node the mcp-remote proxy needs on the user's machine. */\nexport const MCPB_MIN_NODE = \">=18.0.0\";\n\n/** A tool advertised in the bundle manifest (display-only metadata). */\nexport interface McpbTool {\n  name: string;\n  description?: string;\n}\n\n/** Inputs for {@link buildMcpbManifest} / `writeMcpbBundle`. */\nexport interface McpbManifestInput {\n  /** Machine name, e.g. `\"decksmith\"` (lowercase, no spaces). */\n  name: string;\n  /** Human display name, e.g. `\"Decksmith\"`. Defaults to `name`. */\n  display_name?: string;\n  /** Bundle version, e.g. `\"0.2.0\"`. */\n  version: string;\n  /** Short one-line description. */\n  description: string;\n  /** Optional longer description shown on the extension's detail view. */\n  long_description?: string;\n  author: { name: string; url?: string; email?: string };\n  homepage?: string;\n  documentation?: string;\n  support?: string;\n  /** The remote MCP endpoint the bundle proxies to. */\n  mcpUrl: string;\n  /** Advertised tools (display metadata only). */\n  tools?: McpbTool[];\n  keywords?: string[];\n  license?: string;\n  /** Entry-point path inside the bundle. Defaults to `\"server/proxy.js\"`. */\n  entryPoint?: string;\n}\n\n/** The default entry-point path the proxy stub is written to. */\nexport const DEFAULT_MCPB_ENTRY_POINT = \"server/proxy.js\";\n\n/**\n * Build the full MCPB `manifest.json` object for a remote MCP server, wrapping\n * it with `npx -y mcp-remote <url>` (stdio→HTTP). Returns a plain object ready\n * to `JSON.stringify`.\n */\nexport function buildMcpbManifest(\n  input: McpbManifestInput,\n): Record<string, unknown> {\n  const entryPoint = input.entryPoint ?? DEFAULT_MCPB_ENTRY_POINT;\n  return {\n    manifest_version: MCPB_MANIFEST_VERSION,\n    name: input.name,\n    display_name: input.display_name ?? input.name,\n    version: input.version,\n    description: input.description,\n    ...(input.long_description\n      ? { long_description: input.long_description }\n      : {}),\n    author: input.author,\n    ...(input.homepage ? { homepage: input.homepage } : {}),\n    ...(input.documentation ? { documentation: input.documentation } : {}),\n    ...(input.support ? { support: input.support } : {}),\n    server: {\n      type: \"node\",\n      entry_point: entryPoint,\n      mcp_config: {\n        command: \"npx\",\n        args: [\"-y\", \"mcp-remote\", input.mcpUrl],\n      },\n    },\n    tools: input.tools ?? [],\n    tools_generated: false,\n    prompts_generated: false,\n    ...(input.keywords ? { keywords: input.keywords } : {}),\n    license: input.license ?? \"MIT\",\n    compatibility: {\n      claude_desktop: \">=0.10.0\",\n      platforms: [\"darwin\", \"win32\", \"linux\"],\n      runtimes: { node: MCPB_MIN_NODE },\n    },\n  };\n}\n\n/**\n * The `server/proxy.js` stub. MCPB requires an `entry_point` file even though\n * `mcp_config.command` overrides it; if it ever DOES run, it spawns\n * `npx -y mcp-remote <url>` itself so the bundle still works.\n */\nexport function buildMcpbProxyStub(mcpUrl: string): string {\n  // JSON.stringify gives us a safely-quoted JS string literal for the URL.\n  const urlLiteral = JSON.stringify(mcpUrl);\n  return `#!/usr/bin/env node\n// MCPB proxy shim (generated by @particle-academy/agent-integrations).\n//\n// MCPB (Claude Desktop Extensions) only supports local stdio servers, but this\n// MCP server is a remote HTTP endpoint. The manifest's \\`mcp_config\\` invokes\n// \\`npx -y mcp-remote <url>\\` to bridge the gap — this file is the entry_point\n// fallback the manifest validator requires. If you're seeing this run,\n// mcp_config wasn't honored; spawn mcp-remote directly so the bundle still works.\n\nconst { spawn } = require(\"node:child_process\");\n\nconst url = ${urlLiteral};\nconst child = spawn(\"npx\", [\"-y\", \"mcp-remote\", url], { stdio: \"inherit\" });\n\nchild.on(\"exit\", (code) => process.exit(code ?? 0));\nprocess.on(\"SIGINT\", () => child.kill(\"SIGINT\"));\nprocess.on(\"SIGTERM\", () => child.kill(\"SIGTERM\"));\n`;\n}\n"]}