{"version":3,"sources":["../src/tools/virtual-cursor.ts"],"names":["tool","z","r"],"mappings":"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","file":"chunk-55KDZORY.cjs","sourcesContent":["/**\n * virtual-cursor.ts — A visible, agent-controlled cursor overlay.\n *\n * The browser can't move the OS cursor (security), but it can render a fake\n * cursor on top of the page and dispatch real DOM events at its position.\n * This is actually BETTER than a native cursor for demos:\n *   - Visible (the user sees what the agent's doing)\n *   - Animatable (smooth sweeps, pulse highlights)\n *   - Recordable (frame-by-frame)\n *   - Lives in OUR DOM so we can draw trails, labels, scopes\n *\n * Complements dom.ts — dom_mutate click is invisible/instant; virtual_cursor\n * is visible/deliberate (good for demos, screen-recordings, tutorials,\n * autonomous workflows the user is watching).\n *\n * Tools:\n *   vcursor_show      — mount the overlay (once per page)\n *   vcursor_hide      — remove the overlay\n *   vcursor_move      — move to (x,y) or to a selector, optionally animated\n *   vcursor_click     — click at current position (real DOM event at target)\n *   vcursor_type      — type text into the currently-focused element\n *   vcursor_highlight — pulse a ring at current position (demo emphasis)\n *   vcursor_trail     — enable/disable motion trail\n *   vcursor_status    — current position, visible, target element under cursor\n */\nimport { tool } from '@strands-agents/sdk'\nimport { z } from 'zod'\n\n// ───── Constants + global registry ─────\n\nconst OVERLAY_ID = 'careless-vcursor-overlay'\nconst CURSOR_ID = 'careless-vcursor-cursor'\n\ndeclare global {\n  interface Window {\n    __carelessVCursors?: Map<string, VCursorState>\n  }\n}\n\ninterface VCursorState {\n  id: string\n  overlay: HTMLDivElement\n  cursor: SVGSVGElement\n  label: HTMLDivElement\n  x: number\n  y: number\n  color: string\n  styleName: CursorStyleName\n  trailEnabled: boolean\n  trailPoints: Array<{ x: number; y: number; ts: number }>\n  animationFrame: number | null\n}\n\n// Default palette for auto-spawned cursors (cycles through as you spawn).\n// 'default' always gets mint green; others get assigned next-in-ring.\nconst DEFAULT_PALETTE = [\n  '#00e5a0', // mint (default)\n  '#ff6b6b', // coral\n  '#88ddff', // sky\n  '#ffcc00', // gold\n  '#c8a8ff', // lavender\n  '#ff9f43', // orange\n  '#52d681', // leaf\n  '#ff5dc8', // pink\n]\n\nfunction registry(): Map<string, VCursorState> {\n  if (!window.__carelessVCursors) {\n    window.__carelessVCursors = new Map()\n  }\n  return window.__carelessVCursors\n}\n\nfunction state(id: string = 'default'): VCursorState | null {\n  return registry().get(id) ?? null\n}\n\nfunction allStates(): VCursorState[] {\n  return Array.from(registry().values())\n}\n\n// Pick a color for a new cursor id. 'default' always mint; others cycle.\nfunction pickColorFor(id: string, override?: string): string {\n  if (override) return override\n  if (id === 'default') return DEFAULT_PALETTE[0]\n  const used = new Set(allStates().map((s) => s.color))\n  // First unused palette slot\n  for (const c of DEFAULT_PALETTE) {\n    if (!used.has(c)) return c\n  }\n  // Palette exhausted — hash the id to a hue\n  let h = 0\n  for (let i = 0; i < id.length; i++) h = (h * 31 + id.charCodeAt(i)) & 0xffff\n  return `hsl(${h % 360}, 70%, 55%)`\n}\n\n// ───── Overlay mount / unmount ─────\n\n// ───── Cursor style variants ─────\n// Users/agents can swap the pointer glyph for demos. Each style is an SVG\n// fragment rendered inside the 28x28 viewBox. Colors can be overridden.\n\ntype CursorStyleName = 'arrow' | 'hand' | 'crosshair' | 'thinking' | 'text' | 'forbidden'\n\nconst CURSOR_STYLES: Record<CursorStyleName, (color: string) => string> = {\n  // Default rounded arrow\n  arrow: (c) => `\n    <path d=\"M4 3 L4 22 L9 17 L12 24 L15 23 L12 16 L19 16 Z\"\n          fill=\"${c}\" stroke=\"#081616\" stroke-width=\"1.2\" stroke-linejoin=\"round\"/>\n    <circle cx=\"4\" cy=\"3\" r=\"1.4\" fill=\"#081616\"/>\n  `,\n  // Pointing hand (for \"click me\")\n  hand: (c) => `\n    <path d=\"M10 4 L10 14 L8 14 Q6 14 6 16 L6 20 Q6 24 10 24 L18 24 Q22 24 22 20 L22 13 Q22 11 20 11 Q18 11 18 13 L18 10 Q18 8 16 8 Q14 8 14 10 L14 6 Q14 4 12 4 Q10 4 10 4 Z\"\n          fill=\"${c}\" stroke=\"#081616\" stroke-width=\"1.2\" stroke-linejoin=\"round\"/>\n  `,\n  // Crosshair (for \"precision target\")\n  crosshair: (c) => `\n    <circle cx=\"14\" cy=\"14\" r=\"10\" fill=\"none\" stroke=\"${c}\" stroke-width=\"2\"/>\n    <circle cx=\"14\" cy=\"14\" r=\"2\" fill=\"${c}\"/>\n    <line x1=\"14\" y1=\"2\"  x2=\"14\" y2=\"7\"  stroke=\"${c}\" stroke-width=\"2\"/>\n    <line x1=\"14\" y1=\"21\" x2=\"14\" y2=\"26\" stroke=\"${c}\" stroke-width=\"2\"/>\n    <line x1=\"2\"  y1=\"14\" x2=\"7\"  y2=\"14\" stroke=\"${c}\" stroke-width=\"2\"/>\n    <line x1=\"21\" y1=\"14\" x2=\"26\" y2=\"14\" stroke=\"${c}\" stroke-width=\"2\"/>\n  `,\n  // Thinking spinner (animated in CSS via rotating class)\n  thinking: (c) => `\n    <g>\n      <circle cx=\"14\" cy=\"14\" r=\"10\" fill=\"none\" stroke=\"#081616\" stroke-width=\"1\" opacity=\"0.2\"/>\n      <path d=\"M 14 4 A 10 10 0 0 1 24 14\" fill=\"none\" stroke=\"${c}\" stroke-width=\"2.4\" stroke-linecap=\"round\">\n        <animateTransform attributeName=\"transform\" attributeType=\"XML\" type=\"rotate\" from=\"0 14 14\" to=\"360 14 14\" dur=\"0.8s\" repeatCount=\"indefinite\"/>\n      </path>\n    </g>\n  `,\n  // I-beam (for \"about to type\")\n  text: (c) => `\n    <line x1=\"14\" y1=\"4\"  x2=\"14\" y2=\"24\" stroke=\"${c}\" stroke-width=\"2.2\" stroke-linecap=\"round\"/>\n    <line x1=\"10\" y1=\"4\"  x2=\"18\" y2=\"4\"  stroke=\"${c}\" stroke-width=\"2\"/>\n    <line x1=\"10\" y1=\"24\" x2=\"18\" y2=\"24\" stroke=\"${c}\" stroke-width=\"2\"/>\n  `,\n  // No-entry / forbidden\n  forbidden: (c) => `\n    <circle cx=\"14\" cy=\"14\" r=\"11\" fill=\"none\" stroke=\"${c}\" stroke-width=\"2.4\"/>\n    <line x1=\"6\" y1=\"6\" x2=\"22\" y2=\"22\" stroke=\"${c}\" stroke-width=\"2.4\" stroke-linecap=\"round\"/>\n  `,\n}\n\nfunction applyCursorStyle(st: VCursorState, style: CursorStyleName, color: string) {\n  st.styleName = style\n  st.color = color\n  st.cursor.innerHTML = CURSOR_STYLES[style](color)\n  st.cursor.setAttribute('data-style', style)\n  // Update label border + (if present) id tag background to the new color\n  st.label.style.borderColor = color\n  const tag = st.overlay.querySelector<HTMLElement>(`[data-cursor-tag=\"${st.id}\"]`)\n  if (tag) tag.style.background = color\n}\n\nfunction mountOverlay(\n  id: string = 'default',\n  opts: { color?: string; style?: CursorStyleName; x?: number; y?: number } = {}\n): VCursorState {\n  const existing = state(id)\n  if (existing) {\n    // Respect color/style overrides on re-mount\n    if (opts.color && opts.color !== existing.color) {\n      existing.color = opts.color\n      applyCursorStyle(existing, existing.styleName, existing.color)\n    }\n    if (opts.style && opts.style !== existing.styleName) {\n      existing.styleName = opts.style\n      applyCursorStyle(existing, existing.styleName, existing.color)\n    }\n    return existing\n  }\n\n  const color = pickColorFor(id, opts.color)\n  const styleName: CursorStyleName = opts.style ?? 'arrow'\n\n  const overlay = document.createElement('div')\n  overlay.id = `${OVERLAY_ID}-${id}`\n  overlay.setAttribute('data-cursor-id', id)\n  Object.assign(overlay.style, {\n    position: 'fixed',\n    top: '0',\n    left: '0',\n    width: '100vw',\n    height: '100vh',\n    pointerEvents: 'none',\n    zIndex: '2147483646',\n  })\n  document.body.appendChild(overlay)\n\n  // Cursor glyph\n  const cursor = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n  cursor.id = `${CURSOR_ID}-${id}`\n  cursor.setAttribute('data-cursor-id', id)\n  cursor.setAttribute('width', '28')\n  cursor.setAttribute('height', '28')\n  cursor.setAttribute('viewBox', '0 0 28 28')\n  Object.assign(cursor.style, {\n    position: 'absolute',\n    left: '0',\n    top: '0',\n    transform: 'translate(-50%, -50%)',\n    filter: 'drop-shadow(0 2px 4px rgba(0,0,0,0.35))',\n    transition: 'left 0.25s cubic-bezier(.4,0,.2,1), top 0.25s cubic-bezier(.4,0,.2,1)',\n  })\n  cursor.innerHTML = CURSOR_STYLES[styleName](color)\n  cursor.setAttribute('data-style', styleName)\n  overlay.appendChild(cursor)\n\n  // Floating label — uses the cursor color for the border so multi-cursor scenes\n  // are visually distinguishable at a glance.\n  const label = document.createElement('div')\n  label.id = `${OVERLAY_ID}-${id}-label`\n  Object.assign(label.style, {\n    position: 'absolute',\n    left: '0',\n    top: '0',\n    transform: 'translate(12px, -18px)',\n    background: 'rgba(8, 22, 22, 0.88)',\n    color: '#e8fff3',\n    font: '500 11px/1.35 ui-sans-serif, system-ui, sans-serif',\n    padding: '3px 8px',\n    borderRadius: '6px',\n    backdropFilter: 'blur(6px)',\n    WebkitBackdropFilter: 'blur(6px)',\n    border: `1px solid ${color}`,\n    whiteSpace: 'nowrap',\n    pointerEvents: 'none',\n    opacity: '0',\n    transition: 'opacity 0.2s, left 0.25s cubic-bezier(.4,0,.2,1), top 0.25s cubic-bezier(.4,0,.2,1)',\n  })\n  overlay.appendChild(label)\n\n  const st: VCursorState = {\n    id,\n    overlay,\n    cursor,\n    label,\n    color,\n    styleName,\n    x: opts.x ?? window.innerWidth / 2,\n    y: opts.y ?? window.innerHeight / 2,\n    trailEnabled: false,\n    trailPoints: [],\n    animationFrame: null,\n  }\n  registry().set(id, st)\n  setPos(st, st.x, st.y)\n\n  // For non-default cursors, show an identity tag above the cursor permanently\n  // so the user can tell which agent is which.\n  if (id !== 'default') {\n    const tag = document.createElement('div')\n    tag.id = `${OVERLAY_ID}-${id}-tag`\n    Object.assign(tag.style, {\n      position: 'absolute',\n      left: '0',\n      top: '0',\n      transform: 'translate(-50%, -36px)',\n      background: color,\n      color: '#081616',\n      font: '600 10px/1 ui-sans-serif, system-ui, sans-serif',\n      padding: '3px 6px',\n      borderRadius: '4px',\n      whiteSpace: 'nowrap',\n      pointerEvents: 'none',\n      letterSpacing: '0.02em',\n      boxShadow: '0 2px 6px rgba(0,0,0,0.35)',\n      transition: 'left 0.25s cubic-bezier(.4,0,.2,1), top 0.25s cubic-bezier(.4,0,.2,1)',\n    })\n    tag.textContent = id\n    tag.setAttribute('data-cursor-tag', id)\n    overlay.appendChild(tag)\n  }\n\n  return st\n}\n\nfunction unmountOverlay(id: string = 'default') {\n  const st = state(id)\n  if (!st) return\n  if (st.animationFrame != null) cancelAnimationFrame(st.animationFrame)\n  st.overlay.remove()\n  registry().delete(id)\n}\n\nfunction unmountAll() {\n  for (const id of Array.from(registry().keys())) unmountOverlay(id)\n}\n\nfunction setPos(st: VCursorState, x: number, y: number) {\n  st.x = x\n  st.y = y\n  st.cursor.style.left = `${x}px`\n  st.cursor.style.top = `${y}px`\n  st.label.style.left = `${x}px`\n  st.label.style.top = `${y}px`\n  const tag = st.overlay.querySelector<HTMLElement>(`[data-cursor-tag=\"${st.id}\"]`)\n  if (tag) {\n    tag.style.left = `${x}px`\n    tag.style.top = `${y}px`\n  }\n  if (st.trailEnabled) {\n    st.trailPoints.push({ x, y, ts: Date.now() })\n    const cutoff = Date.now() - 2000\n    while (st.trailPoints.length > 40 || (st.trailPoints[0] && st.trailPoints[0].ts < cutoff)) {\n      st.trailPoints.shift()\n    }\n    redrawTrail(st)\n  }\n}\n\nfunction redrawTrail(st: VCursorState) {\n  let trailSvg = st.overlay.querySelector<SVGSVGElement>('#careless-vcursor-trail')\n  if (!trailSvg) {\n    trailSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n    trailSvg.id = 'careless-vcursor-trail'\n    Object.assign(trailSvg.style, {\n      position: 'absolute',\n      left: '0',\n      top: '0',\n      width: '100%',\n      height: '100%',\n      pointerEvents: 'none',\n    })\n    st.overlay.insertBefore(trailSvg, st.cursor)\n  }\n  trailSvg.innerHTML = ''\n  const pts = st.trailPoints\n  if (pts.length < 2) return\n  const d = pts.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ')\n  const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n  path.setAttribute('d', d)\n  path.setAttribute('fill', 'none')\n  path.setAttribute('stroke', st.color)\n  path.setAttribute('stroke-width', '2')\n  path.setAttribute('stroke-linecap', 'round')\n  path.setAttribute('stroke-linejoin', 'round')\n  path.setAttribute('opacity', '0.45')\n  trailSvg.appendChild(path)\n}\n\nfunction pulseRing(st: VCursorState, color?: string, radius: number = 24) {\n  const ringColor = color ?? st.color\n  const ring = document.createElement('div')\n  Object.assign(ring.style, {\n    position: 'absolute',\n    left: `${st.x}px`,\n    top: `${st.y}px`,\n    width: `${radius * 2}px`,\n    height: `${radius * 2}px`,\n    borderRadius: '50%',\n    border: `2px solid ${ringColor}`,\n    transform: 'translate(-50%, -50%) scale(0.3)',\n    opacity: '0.9',\n    pointerEvents: 'none',\n    transition: 'transform 0.6s cubic-bezier(.2,.9,.2,1), opacity 0.6s',\n  })\n  st.overlay.appendChild(ring)\n  requestAnimationFrame(() => {\n    ring.style.transform = 'translate(-50%, -50%) scale(1.4)'\n    ring.style.opacity = '0'\n  })\n  setTimeout(() => ring.remove(), 700)\n}\n\nfunction setLabel(st: VCursorState, text: string | null, durationMs?: number) {\n  if (!text) {\n    st.label.style.opacity = '0'\n    return\n  }\n  st.label.textContent = text\n  st.label.style.opacity = '1'\n  if (durationMs && durationMs > 0) {\n    window.setTimeout(() => { st.label.style.opacity = '0' }, durationMs)\n  }\n}\n\n// Move smoothly via rAF (for finer control than CSS transitions).\nfunction animateMove(st: VCursorState, toX: number, toY: number, durationMs: number): Promise<void> {\n  return new Promise((resolve) => {\n    if (st.animationFrame != null) cancelAnimationFrame(st.animationFrame)\n    const fromX = st.x\n    const fromY = st.y\n    const start = performance.now()\n    // Temporarily disable CSS transition so rAF drives it\n    const prevCursorTransition = st.cursor.style.transition\n    const prevLabelTransition = st.label.style.transition\n    st.cursor.style.transition = 'none'\n    st.label.style.transition = 'none'\n\n    const step = (now: number) => {\n      const t = Math.min(1, (now - start) / durationMs)\n      // Ease-in-out cubic for natural feel\n      const e = t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2\n      const cx = fromX + (toX - fromX) * e\n      const cy = fromY + (toY - fromY) * e\n      setPos(st, cx, cy)\n      if (t < 1) {\n        st.animationFrame = requestAnimationFrame(step)\n      } else {\n        st.animationFrame = null\n        st.cursor.style.transition = prevCursorTransition\n        st.label.style.transition = prevLabelTransition\n        resolve()\n      }\n    }\n    st.animationFrame = requestAnimationFrame(step)\n  })\n}\n\n// Hit-test: find the element under the virtual cursor.\nfunction elementUnder(st: VCursorState): Element | null {\n  // Hide overlay momentarily so elementFromPoint returns the real target.\n  const prev = st.overlay.style.display\n  st.overlay.style.display = 'none'\n  const el = document.elementFromPoint(st.x, st.y)\n  st.overlay.style.display = prev\n  return el\n}\n\nfunction elementSummary(el: Element | null): Record<string, unknown> | null {\n  if (!el) return null\n  const rect = (el as HTMLElement).getBoundingClientRect()\n  return {\n    tag: el.tagName.toLowerCase(),\n    id: (el as HTMLElement).id || undefined,\n    classes: typeof el.className === 'string' ? el.className.split(/\\s+/).filter(Boolean) : undefined,\n    text: (el.textContent || '').trim().slice(0, 120) || undefined,\n    rect: { x: rect.x, y: rect.y, w: rect.width, h: rect.height },\n  }\n}\n\n// ───── Tools ─────\n\nexport const vcursorShowTool = tool({\n  name: 'vcursor_show',\n  description:\n    'Mount a virtual cursor overlay on the page. The cursor is visible, animatable, and agent-controlled. ' +\n    'Multi-cursor: pass a unique `cursor_id` to spawn additional cursors (each with its own color, trail, position). ' +\n    'Each non-default cursor gets a small identity tag above it so the user can tell sibling agents apart. ' +\n    'If the cursor_id already exists, the call is idempotent (updates color/style if provided).',\n  inputSchema: z.object({\n    cursor_id: z.string().optional().describe('Unique id (default: \"default\"). Use \"researcher\", \"coder\", etc. to drive multiple cursors.'),\n    x: z.number().optional().describe('Initial X (CSS px from viewport left). Default: center.'),\n    y: z.number().optional().describe('Initial Y. Default: center.'),\n    color: z.string().optional().describe('CSS color for this cursor. Default: auto-picked from palette so it stays distinct from other cursors.'),\n    style: z.enum(['arrow', 'hand', 'crosshair', 'thinking', 'text', 'forbidden']).optional().describe('Initial glyph. Default: arrow.'),\n    label: z.string().optional(),\n    trail: z.boolean().optional().describe('Enable motion trail (default false).'),\n  }),\n  callback: (input) => {\n    try {\n      const id = input.cursor_id ?? 'default'\n      const st = mountOverlay(id, {\n        color: input.color,\n        style: input.style,\n        x: input.x,\n        y: input.y,\n      })\n      if (input.x !== undefined || input.y !== undefined) {\n        setPos(st, input.x ?? st.x, input.y ?? st.y)\n      }\n      if (input.label) setLabel(st, input.label)\n      if (input.trail !== undefined) st.trailEnabled = input.trail\n      return JSON.stringify({\n        status: 'success',\n        cursor_id: id,\n        x: st.x, y: st.y,\n        color: st.color,\n        style: st.styleName,\n        mounted: true,\n        total_cursors: allStates().length,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const vcursorHideTool = tool({\n  name: 'vcursor_hide',\n  description: 'Unmount one or all virtual cursors. Pass cursor_id to hide a specific cursor, or all:true to clear all.',\n  inputSchema: z.object({\n    cursor_id: z.string().optional().describe('Which cursor to hide. Default: \"default\".'),\n    all: z.boolean().optional().describe('Hide all cursors (overrides cursor_id).'),\n  }),\n  callback: (input) => {\n    try {\n      if (input.all) {\n        const ids = allStates().map((s) => s.id)\n        unmountAll()\n        return JSON.stringify({ status: 'success', unmounted: ids, remaining: 0 })\n      }\n      const id = input.cursor_id ?? 'default'\n      const existed = state(id) != null\n      unmountOverlay(id)\n      return JSON.stringify({\n        status: 'success',\n        cursor_id: id,\n        unmounted: existed,\n        remaining: allStates().length,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const vcursorMoveTool = tool({\n  name: 'vcursor_move',\n  description:\n    'Move the virtual cursor. Either pass {x, y} in viewport px, or pass {selector} to move to an element\\'s center. ' +\n    'Set animate:true for a smooth sweep (default) or animate:false for instant teleport. ' +\n    'Auto-mounts the overlay if not already shown.',\n  inputSchema: z.object({\n    cursor_id: z.string().optional().describe('Which virtual cursor to act on. Default: \"default\". Use a unique id like \"researcher\" or \"coder\" to drive multiple cursors simultaneously (each with own color + trail + position).'),\n    x: z.number().optional(),\n    y: z.number().optional(),\n    selector: z.string().optional().describe('Move to the CENTER of this element\\'s bounding rect'),\n    nth: z.number().optional().describe('Nth match if the selector has multiple'),\n    animate: z.boolean().optional().describe('Default true'),\n    duration_ms: z.number().optional().describe('Animation duration, default 500'),\n    label: z.string().optional().describe('Show a floating label at the new position'),\n    label_duration_ms: z.number().optional().describe('Auto-hide label after N ms. 0 = keep.'),\n    scroll_into_view: z.boolean().optional().describe('If targeting selector, scroll it into view first (default true)'),\n  }),\n  callback: async (input) => {\n    try {\n      const st = mountOverlay(input.cursor_id)\n      let tx: number | undefined = input.x\n      let ty: number | undefined = input.y\n\n      if (input.selector) {\n        const nodes = Array.from(document.querySelectorAll(input.selector))\n        if (nodes.length === 0) {\n          return JSON.stringify({ status: 'error', error: `No elements matched: ${input.selector}` })\n        }\n        const el = nodes[input.nth ?? 0] as HTMLElement\n        if (!el) return JSON.stringify({ status: 'error', error: `nth=${input.nth} out of range (${nodes.length})` })\n        if (input.scroll_into_view !== false) {\n          el.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' })\n          // Let the scroll settle so rect reads are stable.\n          await new Promise((r) => setTimeout(r, 250))\n        }\n        const rect = el.getBoundingClientRect()\n        tx = rect.left + rect.width / 2\n        ty = rect.top + rect.height / 2\n      }\n      if (tx === undefined || ty === undefined) {\n        return JSON.stringify({ status: 'error', error: 'Provide either {x, y} or {selector}' })\n      }\n\n      if (input.label) setLabel(st, input.label, input.label_duration_ms ?? 2500)\n      else setLabel(st, null)\n\n      const animate = input.animate !== false\n      if (animate) {\n        await animateMove(st, tx, ty, input.duration_ms ?? 500)\n      } else {\n        setPos(st, tx, ty)\n      }\n\n      const under = elementUnder(st)\n      return JSON.stringify({\n        status: 'success',\n        x: st.x, y: st.y,\n        animated: animate,\n        duration_ms: animate ? (input.duration_ms ?? 500) : 0,\n        under: elementSummary(under),\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const vcursorClickTool = tool({\n  name: 'vcursor_click',\n  description:\n    'Click at the virtual cursor\\'s current position. Dispatches a real MouseEvent on the element under the cursor ' +\n    '(via elementFromPoint). Pulses a ring for visual feedback. Supports single/double click + modifier keys.',\n  inputSchema: z.object({\n    cursor_id: z.string().optional().describe('Which virtual cursor to act on. Default: \"default\". Use a unique id like \"researcher\" or \"coder\" to drive multiple cursors simultaneously (each with own color + trail + position).'),\n    button: z.enum(['left', 'middle', 'right']).optional().describe('Default left'),\n    double: z.boolean().optional().describe('Fire dblclick instead of click'),\n    ctrlKey: z.boolean().optional(),\n    shiftKey: z.boolean().optional(),\n    altKey: z.boolean().optional(),\n    metaKey: z.boolean().optional(),\n  }),\n  callback: (input) => {\n    try {\n      const st = state(input.cursor_id)\n      if (!st) return JSON.stringify({ status: 'error', error: 'Cursor not shown. Call vcursor_show first.' })\n      const target = elementUnder(st)\n      if (!target) return JSON.stringify({ status: 'error', error: 'No element under cursor' })\n\n      const btn = input.button === 'middle' ? 1 : input.button === 'right' ? 2 : 0\n      const eventType = input.double ? 'dblclick' : 'click'\n      const eventInit: MouseEventInit = {\n        bubbles: true,\n        cancelable: true,\n        view: window,\n        clientX: st.x,\n        clientY: st.y,\n        button: btn,\n        buttons: 1 << btn,\n        ctrlKey: !!input.ctrlKey,\n        shiftKey: !!input.shiftKey,\n        altKey: !!input.altKey,\n        metaKey: !!input.metaKey,\n      }\n      // Fire mousedown + mouseup + click to mimic real interaction\n      target.dispatchEvent(new MouseEvent('mousedown', eventInit))\n      target.dispatchEvent(new MouseEvent('mouseup', eventInit))\n      const clickEv = new MouseEvent(eventType, eventInit)\n      const prevented = !target.dispatchEvent(clickEv)\n\n      pulseRing(st, input.button === 'right' ? '#ff6b6b' : '#00e5a0')\n\n      return JSON.stringify({\n        status: 'success',\n        event: eventType,\n        x: st.x,\n        y: st.y,\n        target: elementSummary(target),\n        default_prevented: prevented,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const vcursorTypeTool = tool({\n  name: 'vcursor_type',\n  description:\n    'Type text into the element under the virtual cursor (must be input/textarea/contenteditable). ' +\n    'Uses the React-compatible native value setter + fires input/change events so frameworks notice.',\n  inputSchema: z.object({\n    cursor_id: z.string().optional().describe('Which virtual cursor to act on. Default: \"default\". Use a unique id like \"researcher\" or \"coder\" to drive multiple cursors simultaneously (each with own color + trail + position).'),\n    text: z.string(),\n    per_char_delay_ms: z.number().optional().describe('Visible typing animation. Default 0 (instant).'),\n    clear: z.boolean().optional().describe('Clear existing value before typing'),\n    submit: z.boolean().optional().describe('Fire Enter keydown after typing'),\n  }),\n  callback: async (input) => {\n    try {\n      const st = state(input.cursor_id)\n      if (!st) return JSON.stringify({ status: 'error', error: 'Cursor not shown. Call vcursor_show first.' })\n      let target = elementUnder(st) as HTMLElement | null\n      if (!target) return JSON.stringify({ status: 'error', error: 'No element under cursor' })\n\n      // Climb if we hit a non-editable child of an input container\n      let attempts = 0\n      while (target && attempts < 5 &&\n             !(target instanceof HTMLInputElement ||\n               target instanceof HTMLTextAreaElement ||\n               (target as HTMLElement).isContentEditable)) {\n        target = target.parentElement\n        attempts++\n      }\n      if (!target) return JSON.stringify({ status: 'error', error: 'No editable element near cursor' })\n\n      target.focus()\n\n      const setInputValue = (el: HTMLInputElement | HTMLTextAreaElement, v: string) => {\n        const proto = Object.getPrototypeOf(el)\n        const setter = Object.getOwnPropertyDescriptor(proto, 'value')?.set\n        if (setter) setter.call(el, v)\n        else (el as unknown as { value: string }).value = v\n        el.dispatchEvent(new Event('input', { bubbles: true }))\n      }\n\n      const isInput = target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement\n      const current = isInput ? (target as HTMLInputElement).value : target.textContent || ''\n      const base = input.clear ? '' : current\n\n      if ((input.per_char_delay_ms ?? 0) > 0) {\n        for (let i = 0; i < input.text.length; i++) {\n          const chunk = base + input.text.slice(0, i + 1)\n          if (isInput) {\n            setInputValue(target as HTMLInputElement, chunk)\n          } else {\n            target.textContent = chunk\n            target.dispatchEvent(new Event('input', { bubbles: true }))\n          }\n          await new Promise((r) => setTimeout(r, input.per_char_delay_ms))\n        }\n      } else {\n        const full = base + input.text\n        if (isInput) {\n          setInputValue(target as HTMLInputElement, full)\n        } else {\n          target.textContent = full\n          target.dispatchEvent(new Event('input', { bubbles: true }))\n        }\n      }\n\n      target.dispatchEvent(new Event('change', { bubbles: true }))\n\n      if (input.submit) {\n        target.dispatchEvent(new KeyboardEvent('keydown', {\n          bubbles: true, cancelable: true, key: 'Enter', code: 'Enter',\n        }))\n      }\n\n      return JSON.stringify({\n        status: 'success',\n        typed_chars: input.text.length,\n        target: elementSummary(target),\n        submitted: !!input.submit,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const vcursorHighlightTool = tool({\n  name: 'vcursor_highlight',\n  description:\n    'Pulse a highlight ring at the cursor\\'s current position (or at a selector). Visual emphasis during narration / demos. ' +\n    'Does NOT click.',\n  inputSchema: z.object({\n    cursor_id: z.string().optional().describe('Which virtual cursor to act on. Default: \"default\". Use a unique id like \"researcher\" or \"coder\" to drive multiple cursors simultaneously (each with own color + trail + position).'),\n    selector: z.string().optional().describe('If set, move cursor there first'),\n    nth: z.number().optional(),\n    color: z.string().optional().describe('CSS color, default mint green'),\n    radius: z.number().optional().describe('Ring radius in px, default 24'),\n    repeat: z.number().optional().describe('Pulse N times (default 1)'),\n    interval_ms: z.number().optional().describe('Gap between pulses, default 280ms'),\n    label: z.string().optional(),\n  }),\n  callback: async (input) => {\n    try {\n      const st = mountOverlay(input.cursor_id)\n      if (input.selector) {\n        const nodes = Array.from(document.querySelectorAll(input.selector))\n        const el = nodes[input.nth ?? 0] as HTMLElement\n        if (!el) return JSON.stringify({ status: 'error', error: `No element for selector ${input.selector}` })\n        const rect = el.getBoundingClientRect()\n        await animateMove(st, rect.left + rect.width / 2, rect.top + rect.height / 2, 350)\n      }\n      if (input.label) setLabel(st, input.label, 2000)\n      const n = Math.max(1, input.repeat ?? 1)\n      const gap = input.interval_ms ?? 280\n      for (let i = 0; i < n; i++) {\n        pulseRing(st, input.color || '#00e5a0', input.radius ?? 24)\n        if (i < n - 1) await new Promise((r) => setTimeout(r, gap))\n      }\n      return JSON.stringify({ status: 'success', x: st.x, y: st.y, pulses: n })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const vcursorTrailTool = tool({\n  name: 'vcursor_trail',\n  description: 'Enable/disable the motion trail behind the virtual cursor. Useful for demo recordings.',\n  inputSchema: z.object({\n    cursor_id: z.string().optional().describe('Which virtual cursor to act on. Default: \"default\". Use a unique id like \"researcher\" or \"coder\" to drive multiple cursors simultaneously (each with own color + trail + position).'),\n    enabled: z.boolean(),\n  }),\n  callback: (input) => {\n    const st = state(input.cursor_id)\n    if (!st) return JSON.stringify({ status: 'error', error: 'Cursor not shown' })\n    st.trailEnabled = input.enabled\n    if (!input.enabled) {\n      st.trailPoints = []\n      const trailSvg = st.overlay.querySelector('#careless-vcursor-trail')\n      if (trailSvg) trailSvg.innerHTML = ''\n    }\n    return JSON.stringify({ status: 'success', trail_enabled: st.trailEnabled })\n  },\n})\n\nexport const vcursorStatusTool = tool({\n  name: 'vcursor_status',\n  description: 'Report the virtual cursor state: mounted, position, element under cursor, trail config.',\n  inputSchema: z.object({}),\n  callback: () => {\n    const st = state()\n    if (!st) {\n      return JSON.stringify({ status: 'success', mounted: false })\n    }\n    const under = elementUnder(st)\n    return JSON.stringify({\n      status: 'success',\n      mounted: true,\n      x: st.x,\n      y: st.y,\n      trail_enabled: st.trailEnabled,\n      trail_points: st.trailPoints.length,\n      under: elementSummary(under),\n      viewport: { w: window.innerWidth, h: window.innerHeight },\n    })\n  },\n})\n\nexport const vcursorDragTool = tool({\n  name: 'vcursor_drag',\n  description:\n    'Drag from the cursor\\'s current position (or a start selector) to a destination. Dispatches a full ' +\n    'mousedown → mousemove(*N) → mouseup sequence plus pointer/drag events, so sliders, reordering, canvas ' +\n    'drawing, and drag-and-drop UIs all react. The cursor animates the path so the user sees it.',\n  inputSchema: z.object({\n    cursor_id: z.string().optional().describe('Which virtual cursor to act on. Default: \"default\". Use a unique id like \"researcher\" or \"coder\" to drive multiple cursors simultaneously (each with own color + trail + position).'),\n    from_selector: z.string().optional().describe('Start point. If omitted, drags from current cursor position.'),\n    from_nth: z.number().optional(),\n    to_x: z.number().optional().describe('Destination X in viewport px'),\n    to_y: z.number().optional().describe('Destination Y'),\n    to_selector: z.string().optional().describe('Destination element (center of bounding rect)'),\n    to_nth: z.number().optional(),\n    dx: z.number().optional().describe('Relative delta X (from current position). Overrides to_x/to_y.'),\n    dy: z.number().optional().describe('Relative delta Y'),\n    duration_ms: z.number().optional().describe('Total drag time, default 700'),\n    steps: z.number().optional().describe('Intermediate mousemove count, default 24 (smooth). Higher = more granular events.'),\n    button: z.enum(['left', 'middle', 'right']).optional(),\n    hold_ms: z.number().optional().describe('Extra hold at the destination before releasing (for apps that need settle time). Default 0.'),\n    use_pointer_events: z.boolean().optional().describe('Also fire pointerdown/pointermove/pointerup (default true)'),\n    use_drag_events: z.boolean().optional().describe('Also fire dragstart/dragover/drop (for native HTML5 DnD). Default false — can interfere with mousemove-based UIs.'),\n  }),\n  callback: async (input) => {\n    try {\n      const st = mountOverlay(input.cursor_id)\n\n      // Resolve start position\n      if (input.from_selector) {\n        const nodes = Array.from(document.querySelectorAll(input.from_selector))\n        const el = nodes[input.from_nth ?? 0] as HTMLElement | undefined\n        if (!el) return JSON.stringify({ status: 'error', error: `No element matched from_selector: ${input.from_selector}` })\n        el.scrollIntoView({ behavior: 'smooth', block: 'center' })\n        await new Promise((r) => setTimeout(r, 200))\n        const r = el.getBoundingClientRect()\n        setPos(st, r.left + r.width / 2, r.top + r.height / 2)\n      }\n\n      const startX = st.x\n      const startY = st.y\n\n      // Resolve end position\n      let tx: number, ty: number\n      if (input.dx !== undefined || input.dy !== undefined) {\n        tx = startX + (input.dx ?? 0)\n        ty = startY + (input.dy ?? 0)\n      } else if (input.to_selector) {\n        const nodes = Array.from(document.querySelectorAll(input.to_selector))\n        const el = nodes[input.to_nth ?? 0] as HTMLElement | undefined\n        if (!el) return JSON.stringify({ status: 'error', error: `No element matched to_selector: ${input.to_selector}` })\n        const r = el.getBoundingClientRect()\n        tx = r.left + r.width / 2\n        ty = r.top + r.height / 2\n      } else if (input.to_x !== undefined && input.to_y !== undefined) {\n        tx = input.to_x\n        ty = input.to_y\n      } else {\n        return JSON.stringify({ status: 'error', error: 'Provide dx/dy, to_x/to_y, or to_selector' })\n      }\n\n      const btn = input.button === 'middle' ? 1 : input.button === 'right' ? 2 : 0\n      const startTarget = elementUnder(st)\n      if (!startTarget) return JSON.stringify({ status: 'error', error: 'No element at drag start' })\n\n      const duration = Math.max(50, input.duration_ms ?? 700)\n      const steps = Math.max(2, input.steps ?? 24)\n      const usePointer = input.use_pointer_events !== false\n      const useDrag = !!input.use_drag_events\n\n      const fire = (el: Element, type: string, x: number, y: number) => {\n        const init: MouseEventInit = {\n          bubbles: true, cancelable: true, view: window,\n          clientX: x, clientY: y, screenX: x, screenY: y,\n          button: btn, buttons: 1 << btn,\n        }\n        el.dispatchEvent(new MouseEvent(type, init))\n      }\n      const firePointer = (el: Element, type: string, x: number, y: number) => {\n        if (!usePointer) return\n        try {\n          const init: PointerEventInit = {\n            bubbles: true, cancelable: true, view: window,\n            clientX: x, clientY: y, pointerType: 'mouse', isPrimary: true,\n            button: btn, buttons: 1 << btn,\n          }\n          el.dispatchEvent(new PointerEvent(type, init))\n        } catch { /* older browsers: skip pointer events */ }\n      }\n      const fireDrag = (el: Element, type: string, x: number, y: number) => {\n        if (!useDrag) return\n        try {\n          const ev = new DragEvent(type, { bubbles: true, cancelable: true, clientX: x, clientY: y })\n          el.dispatchEvent(ev)\n        } catch { /* ignore */ }\n      }\n\n      // mousedown / pointerdown at start\n      firePointer(startTarget, 'pointerdown', startX, startY)\n      fire(startTarget, 'mousedown', startX, startY)\n      fireDrag(startTarget, 'dragstart', startX, startY)\n      pulseRing(st, '#ffcc00', 18)\n\n      // Disable CSS transition during drag so rAF controls motion\n      const prevCursorTransition = st.cursor.style.transition\n      const prevLabelTransition = st.label.style.transition\n      st.cursor.style.transition = 'none'\n      st.label.style.transition = 'none'\n\n      // Move in small steps, firing mousemove/pointermove each frame\n      let lastTarget: Element | null = startTarget\n      const stepDelay = duration / steps\n      for (let i = 1; i <= steps; i++) {\n        const t = i / steps\n        // Ease-in-out cubic\n        const e = t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2\n        const cx = startX + (tx - startX) * e\n        const cy = startY + (ty - startY) * e\n        setPos(st, cx, cy)\n        const under = elementUnder(st)\n        if (under) {\n          firePointer(under, 'pointermove', cx, cy)\n          fire(under, 'mousemove', cx, cy)\n          if (useDrag) {\n            fireDrag(under, 'dragover', cx, cy)\n            if (under !== lastTarget) {\n              if (lastTarget) fireDrag(lastTarget, 'dragleave', cx, cy)\n              fireDrag(under, 'dragenter', cx, cy)\n            }\n          }\n          lastTarget = under\n        }\n        // Also fire on the original target (some sliders track events on the thumb)\n        firePointer(startTarget, 'pointermove', cx, cy)\n        fire(startTarget, 'mousemove', cx, cy)\n        if (i < steps) await new Promise((r) => setTimeout(r, stepDelay))\n      }\n\n      st.cursor.style.transition = prevCursorTransition\n      st.label.style.transition = prevLabelTransition\n\n      if ((input.hold_ms ?? 0) > 0) await new Promise((r) => setTimeout(r, input.hold_ms))\n\n      // mouseup / pointerup at destination, plus drop\n      const dropTarget = elementUnder(st) || lastTarget || startTarget\n      firePointer(dropTarget, 'pointerup', tx, ty)\n      fire(dropTarget, 'mouseup', tx, ty)\n      if (useDrag) {\n        fireDrag(dropTarget, 'drop', tx, ty)\n        fireDrag(startTarget, 'dragend', tx, ty)\n      }\n      pulseRing(st, '#00e5a0', 22)\n\n      return JSON.stringify({\n        status: 'success',\n        from: { x: startX, y: startY, target: elementSummary(startTarget) },\n        to: { x: tx, y: ty, target: elementSummary(dropTarget) },\n        duration_ms: duration,\n        steps,\n        used_pointer_events: usePointer,\n        used_drag_events: useDrag,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const vcursorHoverTool = tool({\n  name: 'vcursor_hover',\n  description:\n    'Hover over an element (or the element at the current cursor position). Dispatches the full mouseenter / ' +\n    'mouseover / pointermove sequence AND keeps firing mousemove at interval_ms for hold_ms so CSS :hover + JS ' +\n    'hover handlers reveal tooltips, submenus, hidden buttons. Returns when the hover period ends.',\n  inputSchema: z.object({\n    cursor_id: z.string().optional().describe('Which virtual cursor to act on. Default: \"default\". Use a unique id like \"researcher\" or \"coder\" to drive multiple cursors simultaneously (each with own color + trail + position).'),\n    selector: z.string().optional().describe('Element to hover. If omitted, uses current cursor position.'),\n    nth: z.number().optional(),\n    x: z.number().optional().describe('Hover at explicit (x,y) instead'),\n    y: z.number().optional(),\n    hold_ms: z.number().optional().describe('How long to hold the hover state, default 800'),\n    interval_ms: z.number().optional().describe('Re-fire mousemove every N ms during hold (keeps :hover CSS active, default 120)'),\n    animate_to: z.boolean().optional().describe('Animate the cursor to the target first (default true)'),\n  }),\n  callback: async (input) => {\n    try {\n      const st = mountOverlay(input.cursor_id)\n\n      let tx = st.x\n      let ty = st.y\n      if (input.selector) {\n        const nodes = Array.from(document.querySelectorAll(input.selector))\n        const el = nodes[input.nth ?? 0] as HTMLElement | undefined\n        if (!el) return JSON.stringify({ status: 'error', error: `No element matched: ${input.selector}` })\n        el.scrollIntoView({ behavior: 'smooth', block: 'center' })\n        await new Promise((r) => setTimeout(r, 200))\n        const r = el.getBoundingClientRect()\n        tx = r.left + r.width / 2\n        ty = r.top + r.height / 2\n      } else if (input.x !== undefined && input.y !== undefined) {\n        tx = input.x\n        ty = input.y\n      }\n\n      if (input.animate_to !== false && (tx !== st.x || ty !== st.y)) {\n        await animateMove(st, tx, ty, 350)\n      } else {\n        setPos(st, tx, ty)\n      }\n\n      const target = elementUnder(st)\n      if (!target) return JSON.stringify({ status: 'error', error: 'No element under target position' })\n\n      const fire = (el: Element, type: string, x: number, y: number) => {\n        el.dispatchEvent(new MouseEvent(type, {\n          bubbles: true, cancelable: true, view: window,\n          clientX: x, clientY: y, relatedTarget: null,\n        }))\n      }\n      const firePointer = (el: Element, type: string, x: number, y: number) => {\n        try {\n          el.dispatchEvent(new PointerEvent(type, {\n            bubbles: true, cancelable: true, view: window,\n            clientX: x, clientY: y, pointerType: 'mouse', isPrimary: true,\n          }))\n        } catch { /* ignore */ }\n      }\n\n      // Enter sequence — walk up from deepest so each ancestor gets mouseenter/pointerenter\n      const chain: Element[] = []\n      let cur: Element | null = target\n      while (cur && cur !== document.body) { chain.push(cur); cur = cur.parentElement }\n      // mouseenter/pointerenter are non-bubbling → dispatch on each; mouseover bubbles\n      for (const el of chain.slice().reverse()) {\n        firePointer(el, 'pointerenter', tx, ty)\n        fire(el, 'mouseenter', tx, ty)\n      }\n      fire(target, 'mouseover', tx, ty)\n      firePointer(target, 'pointerover', tx, ty)\n\n      const holdMs = input.hold_ms ?? 800\n      const tick = Math.max(30, input.interval_ms ?? 120)\n      const start = performance.now()\n      while (performance.now() - start < holdMs) {\n        const under = elementUnder(st) || target\n        fire(under, 'mousemove', tx, ty)\n        firePointer(under, 'pointermove', tx, ty)\n        await new Promise((r) => setTimeout(r, tick))\n      }\n\n      pulseRing(st, '#88ddff', 20)\n\n      return JSON.stringify({\n        status: 'success',\n        x: tx, y: ty,\n        hold_ms: holdMs,\n        target: elementSummary(target),\n        hovered_chain_depth: chain.length,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const vcursorScrollTool = tool({\n  name: 'vcursor_scroll',\n  description:\n    'Scroll the page or the scrollable container under the cursor. Fires real wheel events so infinite-scroll / ' +\n    'lazy-load UIs react. You can scroll by pixel delta, by viewport pages, to a target selector, or to the top/bottom. ' +\n    'Auto-detects the nearest scrollable ancestor if the element under the cursor isn\\'t itself scrollable.',\n  inputSchema: z.object({\n    cursor_id: z.string().optional().describe('Which virtual cursor to act on. Default: \"default\". Use a unique id like \"researcher\" or \"coder\" to drive multiple cursors simultaneously (each with own color + trail + position).'),\n    dy: z.number().optional().describe('Vertical scroll delta in px (positive = down). Typical: 300-600 per \"tick\".'),\n    dx: z.number().optional().describe('Horizontal delta in px'),\n    pages: z.number().optional().describe('Scroll N viewport pages (positive=down). Overrides dy.'),\n    to: z.enum(['top', 'bottom', 'left', 'right']).optional().describe('Scroll container to edge'),\n    selector: z.string().optional().describe('Scroll a specific container (not auto-detected)'),\n    nth: z.number().optional(),\n    to_selector: z.string().optional().describe('Scroll until this element is in view (centered). Uses scrollIntoView.'),\n    smooth: z.boolean().optional().describe('Use smooth behavior (default true)'),\n    steps: z.number().optional().describe('For smooth simulation without native smooth: break into N steps'),\n    wait_ms: z.number().optional().describe('Wait after scroll completes (lets lazy-load settle), default 150'),\n  }),\n  callback: async (input) => {\n    try {\n      const st = mountOverlay(input.cursor_id)\n\n      // Resolve scroll container\n      let container: Element | Window | null = null\n      let containerEl: Element | null = null\n      if (input.selector) {\n        const nodes = Array.from(document.querySelectorAll(input.selector))\n        const el = nodes[input.nth ?? 0] as HTMLElement | undefined\n        if (!el) return JSON.stringify({ status: 'error', error: `No element matched: ${input.selector}` })\n        container = el\n        containerEl = el\n      } else {\n        // Find nearest scrollable ancestor of element under cursor\n        let cur = elementUnder(st) as HTMLElement | null\n        while (cur && cur !== document.body && cur !== document.documentElement) {\n          const style = getComputedStyle(cur)\n          const canScroll =\n            (cur.scrollHeight > cur.clientHeight && /(auto|scroll|overlay)/.test(style.overflowY)) ||\n            (cur.scrollWidth > cur.clientWidth && /(auto|scroll|overlay)/.test(style.overflowX))\n          if (canScroll) { container = cur; containerEl = cur; break }\n          cur = cur.parentElement\n        }\n        if (!container) {\n          container = window\n          containerEl = document.documentElement\n        }\n      }\n\n      // to_selector — scrollIntoView\n      if (input.to_selector) {\n        const nodes = Array.from(document.querySelectorAll(input.to_selector))\n        const el = nodes[0] as HTMLElement | undefined\n        if (!el) return JSON.stringify({ status: 'error', error: `No element matched to_selector: ${input.to_selector}` })\n        el.scrollIntoView({ behavior: input.smooth !== false ? 'smooth' : 'auto', block: 'center', inline: 'center' })\n        await new Promise((r) => setTimeout(r, input.wait_ms ?? 400))\n        const rect = el.getBoundingClientRect()\n        return JSON.stringify({\n          status: 'success',\n          action: 'scrolled_to_element',\n          target: elementSummary(el),\n          final_rect: { x: rect.x, y: rect.y, w: rect.width, h: rect.height },\n        })\n      }\n\n      // Compute delta\n      let dy = input.dy ?? 0\n      let dx = input.dx ?? 0\n      if (input.pages !== undefined) {\n        const vh = containerEl === document.documentElement ? window.innerHeight : (containerEl as HTMLElement).clientHeight\n        dy = input.pages * vh * 0.9\n      }\n      if (input.to) {\n        const el = containerEl as HTMLElement\n        if (input.to === 'top') dy = -(container === window ? window.scrollY : el.scrollTop)\n        else if (input.to === 'bottom') {\n          const max = container === window\n            ? document.documentElement.scrollHeight - window.innerHeight - window.scrollY\n            : el.scrollHeight - el.clientHeight - el.scrollTop\n          dy = max\n        }\n        else if (input.to === 'left') dx = -(container === window ? window.scrollX : el.scrollLeft)\n        else if (input.to === 'right') {\n          const max = container === window\n            ? document.documentElement.scrollWidth - window.innerWidth - window.scrollX\n            : el.scrollWidth - el.clientWidth - el.scrollLeft\n          dx = max\n        }\n      }\n\n      if (dy === 0 && dx === 0) {\n        return JSON.stringify({ status: 'error', error: 'Provide dy/dx, pages, to, or to_selector' })\n      }\n\n      // Fire wheel event at cursor position (for JS handlers that listen)\n      const target = elementUnder(st) || document.body\n      target.dispatchEvent(new WheelEvent('wheel', {\n        bubbles: true, cancelable: true, view: window,\n        clientX: st.x, clientY: st.y,\n        deltaX: dx, deltaY: dy, deltaMode: 0,\n      }))\n\n      // Perform actual scroll\n      const smooth = input.smooth !== false\n      const steps = Math.max(1, input.steps ?? 1)\n      if (steps === 1) {\n        if (container === window) {\n          window.scrollBy({ left: dx, top: dy, behavior: smooth ? 'smooth' : 'auto' })\n        } else {\n          (container as Element).scrollBy({ left: dx, top: dy, behavior: smooth ? 'smooth' : 'auto' })\n        }\n      } else {\n        const sy = dy / steps\n        const sx = dx / steps\n        for (let i = 0; i < steps; i++) {\n          if (container === window) window.scrollBy({ left: sx, top: sy, behavior: 'auto' })\n          else (container as Element).scrollBy({ left: sx, top: sy, behavior: 'auto' })\n          await new Promise((r) => setTimeout(r, 16))\n        }\n      }\n\n      await new Promise((r) => setTimeout(r, input.wait_ms ?? 150))\n\n      const finalY = container === window ? window.scrollY : (containerEl as HTMLElement).scrollTop\n      const finalX = container === window ? window.scrollX : (containerEl as HTMLElement).scrollLeft\n\n      return JSON.stringify({\n        status: 'success',\n        container: container === window ? 'window' : elementSummary(containerEl),\n        scrolled_by: { dx, dy },\n        final_scroll: { x: finalX, y: finalY },\n        smooth,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const vcursorKeysTool = tool({\n  name: 'vcursor_keys',\n  description:\n    'Send keyboard events to the element under the cursor (or document.activeElement). Supports single keys ' +\n    '(Enter, Tab, Escape, ArrowDown, Backspace, PageDown, Home, End...), modifier combos (Ctrl+A, Cmd+K, Shift+Tab), ' +\n    'and key sequences. Fires keydown + keypress + keyup with correct key/code/keyCode so even legacy JS handlers fire.',\n  inputSchema: z.object({\n    cursor_id: z.string().optional().describe('Which virtual cursor to act on. Default: \"default\". Use a unique id like \"researcher\" or \"coder\" to drive multiple cursors simultaneously (each with own color + trail + position).'),\n    keys: z.union([z.string(), z.array(z.string())]).describe(\n      'Key name or combo (\"Enter\", \"Tab\", \"Ctrl+A\", \"Cmd+K\", \"ArrowDown\"), OR array of those for a sequence.'\n    ),\n    target_selector: z.string().optional().describe('Element to send keys to. Default: element under cursor, or document.activeElement.'),\n    target_nth: z.number().optional(),\n    per_key_delay_ms: z.number().optional().describe('Delay between keys in a sequence, default 60'),\n    repeat: z.number().optional().describe('Send the (single) key N times. Ignored when keys is an array.'),\n    hold_ms: z.number().optional().describe('For each key, delay between keydown and keyup (default 0 = same tick)'),\n  }),\n  callback: async (input) => {\n    try {\n      const st = state(input.cursor_id)\n      // Resolve target\n      let target: Element | null = null\n      if (input.target_selector) {\n        const nodes = Array.from(document.querySelectorAll(input.target_selector))\n        target = nodes[input.target_nth ?? 0] ?? null\n        if (!target) return JSON.stringify({ status: 'error', error: `No element matched: ${input.target_selector}` })\n      } else if (st) {\n        target = elementUnder(st) ?? document.activeElement\n      } else {\n        target = document.activeElement\n      }\n      if (!target) target = document.body\n\n      // Focus it (some handlers only fire on focused element)\n      if (target instanceof HTMLElement) {\n        try { target.focus({ preventScroll: true }) } catch { /* noop */ }\n      }\n\n      // Map common key names to KeyboardEvent shape\n      const keyMap: Record<string, { key: string; code: string; keyCode: number }> = {\n        Enter:      { key: 'Enter',      code: 'Enter',       keyCode: 13 },\n        Tab:        { key: 'Tab',        code: 'Tab',         keyCode: 9 },\n        Escape:     { key: 'Escape',     code: 'Escape',      keyCode: 27 },\n        Esc:        { key: 'Escape',     code: 'Escape',      keyCode: 27 },\n        Backspace:  { key: 'Backspace',  code: 'Backspace',   keyCode: 8 },\n        Delete:     { key: 'Delete',     code: 'Delete',      keyCode: 46 },\n        Space:      { key: ' ',          code: 'Space',       keyCode: 32 },\n        ArrowUp:    { key: 'ArrowUp',    code: 'ArrowUp',     keyCode: 38 },\n        ArrowDown:  { key: 'ArrowDown',  code: 'ArrowDown',   keyCode: 40 },\n        ArrowLeft:  { key: 'ArrowLeft',  code: 'ArrowLeft',   keyCode: 37 },\n        ArrowRight: { key: 'ArrowRight', code: 'ArrowRight',  keyCode: 39 },\n        Home:       { key: 'Home',       code: 'Home',        keyCode: 36 },\n        End:        { key: 'End',        code: 'End',         keyCode: 35 },\n        PageUp:     { key: 'PageUp',     code: 'PageUp',      keyCode: 33 },\n        PageDown:   { key: 'PageDown',   code: 'PageDown',    keyCode: 34 },\n      }\n      for (let i = 1; i <= 12; i++) {\n        keyMap['F' + i] = { key: 'F' + i, code: 'F' + i, keyCode: 111 + i }\n      }\n\n      const parseKeyCombo = (combo: string) => {\n        const parts = combo.split('+').map((p) => p.trim()).filter(Boolean)\n        const mods = { ctrlKey: false, shiftKey: false, altKey: false, metaKey: false }\n        let base = ''\n        for (const p of parts) {\n          const low = p.toLowerCase()\n          if (low === 'ctrl' || low === 'control') mods.ctrlKey = true\n          else if (low === 'shift') mods.shiftKey = true\n          else if (low === 'alt' || low === 'option' || low === 'opt') mods.altKey = true\n          else if (low === 'meta' || low === 'cmd' || low === 'command' || low === 'win') mods.metaKey = true\n          else base = p\n        }\n        if (!base) throw new Error(`No base key in combo: ${combo}`)\n        const mapped = keyMap[base]\n        if (mapped) return { ...mods, ...mapped }\n        // Single character\n        if (base.length === 1) {\n          const upper = base.toUpperCase()\n          return {\n            ...mods,\n            key: mods.shiftKey ? upper : base.toLowerCase(),\n            code: /^[a-zA-Z]$/.test(base) ? 'Key' + upper : 'Digit' + base,\n            keyCode: upper.charCodeAt(0),\n          }\n        }\n        // Unknown multi-char key — pass through as-is\n        return { ...mods, key: base, code: base, keyCode: 0 }\n      }\n\n      const sendKey = async (combo: string) => {\n        const spec = parseKeyCombo(combo)\n        const init: KeyboardEventInit = {\n          bubbles: true, cancelable: true, view: window,\n          key: spec.key, code: spec.code,\n          ctrlKey: spec.ctrlKey, shiftKey: spec.shiftKey, altKey: spec.altKey, metaKey: spec.metaKey,\n        }\n        // keyCode is deprecated but some legacy handlers need it\n        const down = new KeyboardEvent('keydown', init)\n        Object.defineProperty(down, 'keyCode', { get: () => spec.keyCode })\n        Object.defineProperty(down, 'which',   { get: () => spec.keyCode })\n        const defaultPrevented = !target!.dispatchEvent(down)\n\n        // keypress only for printable keys (legacy, some apps still listen)\n        if (spec.key.length === 1 && !spec.ctrlKey && !spec.metaKey) {\n          const press = new KeyboardEvent('keypress', init)\n          Object.defineProperty(press, 'keyCode', { get: () => spec.keyCode })\n          target!.dispatchEvent(press)\n        }\n\n        if ((input.hold_ms ?? 0) > 0) await new Promise((r) => setTimeout(r, input.hold_ms))\n\n        const up = new KeyboardEvent('keyup', init)\n        Object.defineProperty(up, 'keyCode', { get: () => spec.keyCode })\n        Object.defineProperty(up, 'which',   { get: () => spec.keyCode })\n        target!.dispatchEvent(up)\n\n        return defaultPrevented\n      }\n\n      const sequence = Array.isArray(input.keys)\n        ? input.keys\n        : (input.repeat ? Array(Math.max(1, input.repeat)).fill(input.keys) : [input.keys])\n      const delay = input.per_key_delay_ms ?? 60\n\n      const results: Array<{ key: string; default_prevented: boolean }> = []\n      for (let i = 0; i < sequence.length; i++) {\n        const prevented = await sendKey(sequence[i])\n        results.push({ key: sequence[i], default_prevented: prevented })\n        if (i < sequence.length - 1) await new Promise((r) => setTimeout(r, delay))\n      }\n\n      if (st) pulseRing(st, '#c8a8ff', 16)\n\n      return JSON.stringify({\n        status: 'success',\n        keys_sent: results,\n        target: elementSummary(target),\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const vcursorStyleTool = tool({\n  name: 'vcursor_style',\n  description:\n    'Swap the virtual cursor\\'s visual style. Useful for demos: use \"hand\" before clicking, \"thinking\" during a long ' +\n    'operation, \"text\" before typing, \"crosshair\" when aiming precisely, \"forbidden\" to indicate blocked action.',\n  inputSchema: z.object({\n    cursor_id: z.string().optional().describe('Which virtual cursor to act on. Default: \"default\". Use a unique id like \"researcher\" or \"coder\" to drive multiple cursors simultaneously (each with own color + trail + position).'),\n    style: z.enum(['arrow', 'hand', 'crosshair', 'thinking', 'text', 'forbidden']),\n    color: z.string().optional().describe('CSS color for the glyph (default #00e5a0)'),\n  }),\n  callback: (input) => {\n    try {\n      const st = mountOverlay(input.cursor_id)\n      applyCursorStyle(st, input.style, input.color || '#00e5a0')\n      return JSON.stringify({ status: 'success', style: input.style, color: input.color || '#00e5a0' })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const vcursorInspectTool = tool({\n  name: 'vcursor_inspect',\n  description:\n    'Deep-read the element under the cursor (or by selector). Returns tag, id, classes, text, rect, computed visibility, ' +\n    'disabled state, aria attributes, input value, form context, and a suggested selector you can re-use. ' +\n    'Saves a hop vs. falling back to dom_query after every move.',\n  inputSchema: z.object({\n    cursor_id: z.string().optional().describe('Which virtual cursor to act on. Default: \"default\". Use a unique id like \"researcher\" or \"coder\" to drive multiple cursors simultaneously (each with own color + trail + position).'),\n    selector: z.string().optional().describe('Inspect this element instead of the one under the cursor'),\n    nth: z.number().optional(),\n    include_computed_style: z.boolean().optional().describe('Include selected computed CSS properties (default false — adds cost)'),\n    style_props: z.array(z.string()).optional().describe('Which computed style properties to include (default: display, visibility, opacity, color, background-color, cursor)'),\n  }),\n  callback: (input) => {\n    try {\n      let target: Element | null = null\n      if (input.selector) {\n        const nodes = Array.from(document.querySelectorAll(input.selector))\n        target = (nodes[input.nth ?? 0] as Element) ?? null\n        if (!target) return JSON.stringify({ status: 'error', error: `No element matched: ${input.selector}` })\n      } else {\n        const st = state(input.cursor_id)\n        if (!st) return JSON.stringify({ status: 'error', error: 'Cursor not shown and no selector provided' })\n        target = elementUnder(st)\n        if (!target) return JSON.stringify({ status: 'error', error: 'No element under cursor' })\n      }\n\n      const el = target as HTMLElement\n      const rect = el.getBoundingClientRect()\n      const style = getComputedStyle(el)\n      const visible =\n        rect.width > 0 && rect.height > 0 &&\n        style.visibility !== 'hidden' &&\n        style.display !== 'none' &&\n        parseFloat(style.opacity) > 0.01\n\n      // Collect aria-* and data-* attributes\n      const aria: Record<string, string> = {}\n      const data: Record<string, string> = {}\n      for (const attr of Array.from(el.attributes)) {\n        if (attr.name.startsWith('aria-')) aria[attr.name] = attr.value\n        else if (attr.name.startsWith('data-')) data[attr.name] = attr.value\n      }\n\n      // Form / input details\n      let formInfo: Record<string, unknown> | undefined\n      if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement) {\n        formInfo = {\n          type: (el as HTMLInputElement).type,\n          name: (el as HTMLInputElement).name,\n          value: (el as HTMLInputElement).value,\n          checked: (el as HTMLInputElement).checked,\n          required: (el as HTMLInputElement).required,\n          disabled: (el as HTMLInputElement).disabled,\n          readonly: (el as HTMLInputElement).readOnly,\n          placeholder: (el as HTMLInputElement).placeholder,\n          form_id: el.form?.id,\n          label: el.labels && el.labels.length > 0 ? el.labels[0].textContent?.trim() : undefined,\n        }\n      } else if (el instanceof HTMLButtonElement || el.getAttribute('role') === 'button') {\n        formInfo = {\n          type: (el as HTMLButtonElement).type,\n          disabled: (el as HTMLButtonElement).disabled,\n          text: el.textContent?.trim().slice(0, 200),\n        }\n      }\n\n      // Suggest a stable selector: id > data-testid > unique class combo > tag + nth-of-type\n      let suggestedSelector: string | undefined\n      if (el.id) {\n        suggestedSelector = `#${CSS.escape(el.id)}`\n      } else if (el.getAttribute('data-testid')) {\n        suggestedSelector = `[data-testid=\"${el.getAttribute('data-testid')}\"]`\n      } else if (el.getAttribute('aria-label')) {\n        suggestedSelector = `[aria-label=\"${el.getAttribute('aria-label')}\"]`\n      } else if (typeof el.className === 'string' && el.className.trim()) {\n        const classes = el.className.trim().split(/\\s+/).filter(c => !c.includes(':')).slice(0, 3)\n        if (classes.length > 0) suggestedSelector = el.tagName.toLowerCase() + '.' + classes.map(c => CSS.escape(c)).join('.')\n      }\n\n      const info: Record<string, unknown> = {\n        status: 'success',\n        tag: el.tagName.toLowerCase(),\n        id: el.id || undefined,\n        classes: typeof el.className === 'string' ? el.className.split(/\\s+/).filter(Boolean) : [],\n        text: el.textContent?.trim().slice(0, 200) || undefined,\n        href: el.getAttribute('href') || undefined,\n        rect: { x: rect.x, y: rect.y, w: rect.width, h: rect.height },\n        visible,\n        in_viewport:\n          rect.bottom > 0 && rect.right > 0 &&\n          rect.top < window.innerHeight && rect.left < window.innerWidth,\n        role: el.getAttribute('role') || undefined,\n        tabindex: el.getAttribute('tabindex') || undefined,\n        aria: Object.keys(aria).length > 0 ? aria : undefined,\n        data: Object.keys(data).length > 0 ? data : undefined,\n        form: formInfo,\n        focused: document.activeElement === el,\n        suggested_selector: suggestedSelector,\n      }\n\n      if (input.include_computed_style) {\n        const props = input.style_props ?? ['display', 'visibility', 'opacity', 'color', 'background-color', 'cursor', 'pointer-events']\n        const computed: Record<string, string> = {}\n        for (const p of props) computed[p] = style.getPropertyValue(p)\n        info.computed_style = computed\n      }\n\n      return JSON.stringify(info)\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const vcursorWaitForStableTool = tool({\n  name: 'vcursor_wait_for_stable',\n  description:\n    'Wait until a target element stops moving (e.g. dropdown finished animating in). Polls the bounding rect ' +\n    'every poll_ms and returns when N consecutive polls yield the same rect — OR times out. Use BEFORE a click ' +\n    'on an element that just animated in, to avoid clicking where it used to be.',\n  inputSchema: z.object({\n    cursor_id: z.string().optional().describe('Which virtual cursor to act on. Default: \"default\". Use a unique id like \"researcher\" or \"coder\" to drive multiple cursors simultaneously (each with own color + trail + position).'),\n    selector: z.string().describe('Element to watch'),\n    nth: z.number().optional(),\n    poll_ms: z.number().optional().describe('Poll interval, default 80'),\n    stable_polls: z.number().optional().describe('Consecutive stable polls required, default 3'),\n    timeout_ms: z.number().optional().describe('Max wait, default 3000'),\n    tolerance_px: z.number().optional().describe('Allowed pixel drift between polls, default 1'),\n    require_visible: z.boolean().optional().describe('Also wait for visibility (display/opacity), default true'),\n  }),\n  callback: async (input) => {\n    try {\n      const timeout = input.timeout_ms ?? 3000\n      const poll = Math.max(16, input.poll_ms ?? 80)\n      const need = Math.max(1, input.stable_polls ?? 3)\n      const tol = Math.max(0, input.tolerance_px ?? 1)\n      const requireVisible = input.require_visible !== false\n\n      const start = performance.now()\n      let lastRect: DOMRect | null = null\n      let stableCount = 0\n      let lastEl: Element | null = null\n\n      const rectsEqual = (a: DOMRect, b: DOMRect) =>\n        Math.abs(a.x - b.x) <= tol &&\n        Math.abs(a.y - b.y) <= tol &&\n        Math.abs(a.width - b.width) <= tol &&\n        Math.abs(a.height - b.height) <= tol\n\n      while (performance.now() - start < timeout) {\n        const nodes = Array.from(document.querySelectorAll(input.selector))\n        const el = nodes[input.nth ?? 0] as HTMLElement | undefined\n        if (!el) {\n          await new Promise((r) => setTimeout(r, poll))\n          continue\n        }\n        lastEl = el\n        const rect = el.getBoundingClientRect()\n        const style = getComputedStyle(el)\n        const visible =\n          rect.width > 0 && rect.height > 0 &&\n          style.visibility !== 'hidden' &&\n          style.display !== 'none' &&\n          parseFloat(style.opacity) > 0.01\n\n        if (requireVisible && !visible) {\n          stableCount = 0\n          lastRect = null\n          await new Promise((r) => setTimeout(r, poll))\n          continue\n        }\n        if (lastRect && rectsEqual(lastRect, rect)) {\n          stableCount++\n          if (stableCount >= need) {\n            return JSON.stringify({\n              status: 'success',\n              stable: true,\n              waited_ms: Math.round(performance.now() - start),\n              rect: { x: rect.x, y: rect.y, w: rect.width, h: rect.height },\n              target: elementSummary(el),\n            })\n          }\n        } else {\n          stableCount = 1\n        }\n        lastRect = rect\n        await new Promise((r) => setTimeout(r, poll))\n      }\n\n      return JSON.stringify({\n        status: 'error',\n        stable: false,\n        error: `Timed out after ${timeout}ms without ${need} consecutive stable polls`,\n        last_rect: lastRect ? { x: lastRect.x, y: lastRect.y, w: lastRect.width, h: lastRect.height } : null,\n        last_target: elementSummary(lastEl),\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const vcursorScriptTool = tool({\n  name: 'vcursor_script',\n  description:\n    'Run a sequence of virtual cursor actions as a single atomic macro. Each step is one of: ' +\n    '{action:\"move\",...}, {action:\"click\",...}, {action:\"type\",...}, {action:\"drag\",...}, {action:\"hover\",...}, ' +\n    '{action:\"scroll\",...}, {action:\"keys\",...}, {action:\"highlight\",...}, {action:\"wait\",ms:N}, ' +\n    '{action:\"wait_for\",selector:\"...\"}, {action:\"style\",style:\"...\"}, {action:\"label\",text:\"...\"}. ' +\n    'Steps run sequentially; a failed step stops execution unless continue_on_error is true. Returns each step result.',\n  inputSchema: z.object({\n    cursor_id: z.string().optional().describe('Which virtual cursor to act on. Default: \"default\". Use a unique id like \"researcher\" or \"coder\" to drive multiple cursors simultaneously (each with own color + trail + position).'),\n    steps: z.array(z.record(z.string(), z.unknown())).describe('Array of step objects with an \"action\" field.'),\n    continue_on_error: z.boolean().optional().describe('If true, failed steps are logged but execution continues'),\n    label: z.string().optional().describe('Optional macro label shown as floating label at start'),\n  }),\n  callback: async (input) => {\n    const st = mountOverlay(input.cursor_id)\n    if (input.label) setLabel(st, input.label, 3000)\n\n    const results: Array<Record<string, unknown>> = []\n\n    const runOne = async (step: Record<string, unknown>): Promise<Record<string, unknown>> => {\n      const action = step.action as string\n      const args = { ...step }\n      delete args.action\n      // Propagate parent script's cursor_id if the step didn't specify one.\n      // This lets you write [{action:'move',selector:'.foo'}, {action:'click'}]\n      // once with a top-level cursor_id:'researcher' and have both hit that cursor.\n      if (input.cursor_id && args.cursor_id === undefined) {\n        args.cursor_id = input.cursor_id\n      }\n\n      const call = async (tool: typeof vcursorMoveTool, payload: unknown) => {\n        const raw = await ((tool as any).callback as (x: unknown) => unknown | Promise<unknown>)(payload)\n        try { return JSON.parse(String(raw)) } catch { return { status: 'success', raw: String(raw) } }\n      }\n\n      switch (action) {\n        case 'move':      return call(vcursorMoveTool,      args)\n        case 'click':     return call(vcursorClickTool,     args)\n        case 'type':      return call(vcursorTypeTool,      args)\n        case 'highlight': return call(vcursorHighlightTool, args)\n        case 'drag':      return call(vcursorDragTool,      args)\n        case 'hover':     return call(vcursorHoverTool,     args)\n        case 'scroll':    return call(vcursorScrollTool,    args)\n        case 'keys':      return call(vcursorKeysTool,      args)\n        case 'inspect':   return call(vcursorInspectTool,   args)\n        case 'style':     return call(vcursorStyleTool,     args)\n        case 'wait': {\n          const ms = (args.ms as number) ?? 200\n          await new Promise((r) => setTimeout(r, ms))\n          return { status: 'success', action: 'wait', ms }\n        }\n        case 'wait_for': {\n          return call(vcursorWaitForStableTool, args)\n        }\n        case 'label': {\n          setLabel(st, (args.text as string) || null, (args.duration_ms as number) ?? 2000)\n          return { status: 'success', action: 'label', text: args.text }\n        }\n        default:\n          throw new Error(`Unknown action: ${action}`)\n      }\n    }\n\n    for (let i = 0; i < input.steps.length; i++) {\n      const step = input.steps[i]\n      try {\n        const res = await runOne(step)\n        results.push({ step: i, action: step.action, ...res })\n        const status = (res as { status?: string }).status\n        if (status === 'error' && !input.continue_on_error) {\n          return JSON.stringify({\n            status: 'error',\n            error: `Step ${i} (${step.action}) failed — stopping. Use continue_on_error:true to keep going.`,\n            completed: i,\n            total: input.steps.length,\n            results,\n          })\n        }\n      } catch (err: unknown) {\n        results.push({ step: i, action: step.action, status: 'error', error: (err as Error).message })\n        if (!input.continue_on_error) {\n          return JSON.stringify({\n            status: 'error',\n            error: `Step ${i} threw: ${(err as Error).message}`,\n            completed: i,\n            total: input.steps.length,\n            results,\n          })\n        }\n      }\n    }\n\n    return JSON.stringify({\n      status: 'success',\n      completed: input.steps.length,\n      total: input.steps.length,\n      results,\n    })\n  },\n})\n\n\nexport const vcursorListTool = tool({\n  name: 'vcursor_list',\n  description:\n    'List all currently mounted virtual cursors. Returns each cursor\\'s id, position, color, style, trail state, and ' +\n    'the element under it. Use BEFORE driving a named cursor to confirm it exists — or to see what your sibling ' +\n    'agents are up to if they\\'re each driving their own cursor.',\n  inputSchema: z.object({\n    include_under: z.boolean().optional().describe('Include the element under each cursor (default true)'),\n  }),\n  callback: (input) => {\n    try {\n      const cursors = allStates().map((st) => {\n        const info: Record<string, unknown> = {\n          id: st.id,\n          x: st.x,\n          y: st.y,\n          color: st.color,\n          style: st.styleName,\n          trail_enabled: st.trailEnabled,\n          trail_points: st.trailPoints.length,\n        }\n        if (input.include_under !== false) {\n          info.under = elementSummary(elementUnder(st))\n        }\n        return info\n      })\n      return JSON.stringify({\n        status: 'success',\n        total: cursors.length,\n        cursors,\n        palette: DEFAULT_PALETTE,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const vcursorColorTool = tool({\n  name: 'vcursor_color',\n  description:\n    'Recolor an existing cursor (glyph + label border + id tag). Useful for marking state changes: e.g. turn the ' +\n    'researcher cursor red while it\\'s waiting for a paused decision, then back to its palette color when it resumes.',\n  inputSchema: z.object({\n    cursor_id: z.string().optional().describe('Which cursor to recolor. Default: \"default\".'),\n    color: z.string().describe('New CSS color (e.g. \"#ff6b6b\", \"tomato\", \"hsl(200, 80%, 60%)\").'),\n  }),\n  callback: (input) => {\n    try {\n      const id = input.cursor_id ?? 'default'\n      const st = state(id)\n      if (!st) return JSON.stringify({ status: 'error', error: `No cursor with id: ${id}. Use vcursor_list to see available cursors.` })\n      applyCursorStyle(st, st.styleName, input.color)\n      return JSON.stringify({\n        status: 'success',\n        cursor_id: id,\n        color: st.color,\n        style: st.styleName,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const VIRTUAL_CURSOR_TOOLS = [\n  vcursorShowTool,\n  vcursorHideTool,\n  vcursorMoveTool,\n  vcursorClickTool,\n  vcursorTypeTool,\n  vcursorHighlightTool,\n  vcursorTrailTool,\n  vcursorStatusTool,\n  vcursorDragTool,\n  vcursorHoverTool,\n  vcursorScrollTool,\n  vcursorKeysTool,\n  vcursorStyleTool,\n  vcursorInspectTool,\n  vcursorWaitForStableTool,\n  vcursorScriptTool,\n  vcursorListTool,\n  vcursorColorTool,\n]\n"]}