{"version":3,"sources":["../src/tools/dom.ts"],"names":["tool","z"],"mappings":"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","file":"chunk-5SZKHISM.cjs","sourcesContent":["/**\n * dom.ts — Agent manipulates its own DOM.\n *\n * Bugs fixed vs the original:\n *   #1 dom_observe crashed when passing {types: ['childList','characterData']} without 'attributes' —\n *      code always set attributeOldValue:true / characterDataOldValue:true, which\n *      require the parent flag to also be true. Now: each *OldValue flag is set\n *      ONLY when the corresponding flag is enabled.\n *   #2 dom_mutate default all:false silently worked on 1 of N matches — now the\n *      response explicitly reports `matched` vs `affected` and the agent can\n *      detect partial application.\n *   #3 setStyle ignored kebab-case keys (background-color) — now normalizes to\n *      camelCase, accepting both forms.\n *   #4 click() just called element.click() which doesn't fire real MouseEvents\n *      in many frameworks. Now has a dispatch:'synthetic'|'native' option that\n *      fires a full MouseEvent with clientX/Y, bubbles, and modifier keys.\n *   #5 No way to dispatch keyboard / input events → agent can't test forms.\n *      New dom_dispatch_event tool supports Keyboard / Input / Mouse / Wheel /\n *      arbitrary CustomEvent.\n *   #6 No way to scroll-match or pick Nth element by index → dom_query now has\n *      an `nth` param and dom_mutate accepts `nth`.\n *   #7 Added dom_wait_for — wait until a selector appears / becomes visible,\n *      with a timeout (useful before interacting with async-rendered UI).\n */\nimport { tool } from '@strands-agents/sdk'\nimport { z } from 'zod'\n\n/* --------------------------------------------------------------------------\n * Serialization helper (unchanged behavior, minor hardening)\n * ------------------------------------------------------------------------ */\nfunction serializeElement(el: Element, depth: number = 0, maxDepth: number = 2): any {\n  const rect = el.getBoundingClientRect()\n  const style = window.getComputedStyle(el)\n  const visible = rect.width > 0 && rect.height > 0 &&\n    style.visibility !== 'hidden' &&\n    style.display !== 'none' &&\n    parseFloat(style.opacity || '1') > 0\n  const out: any = {\n    tag: el.tagName.toLowerCase(),\n    id: (el as HTMLElement).id || undefined,\n    classes: el.className && typeof el.className === 'string' ? el.className.split(/\\s+/).filter(Boolean) : undefined,\n    text: (el.textContent || '').trim().slice(0, 200) || undefined,\n    rect: { x: rect.x, y: rect.y, w: rect.width, h: rect.height },\n    visible,\n    attrs: Object.fromEntries(Array.from(el.attributes).map((a) => [a.name, a.value])),\n  }\n  if (depth < maxDepth && el.children.length > 0) {\n    out.children = Array.from(el.children).slice(0, 20).map((c) => serializeElement(c, depth + 1, maxDepth))\n    if (el.children.length > 20) out.truncated = el.children.length - 20\n  }\n  return out\n}\n\n/* kebab-case → camelCase for CSS properties. Leaves already-camel keys alone. */\nfunction kebabToCamel(k: string): string {\n  if (!/-/.test(k)) return k\n  return k.replace(/-([a-z])/g, (_, c) => c.toUpperCase())\n}\n\n/* --------------------------------------------------------------------------\n * dom_query\n * ------------------------------------------------------------------------ */\nexport const domQueryTool = tool({\n  name: 'dom_query',\n  description:\n    'Query the page DOM with a CSS selector. Returns matching elements with tag, id, classes, text, bounding rect, attrs, and (optionally) children tree. ' +\n    'Use `nth: N` (zero-indexed) to pick a single specific match.',\n  inputSchema: z.object({\n    selector: z.string().describe('CSS selector'),\n    limit: z.number().optional().describe('Max results (default 10)'),\n    depth: z.number().optional().describe('Child tree depth (default 2, 0 = no children)'),\n    all: z.boolean().optional().describe('Return ALL matches (ignores limit)'),\n    nth: z.number().optional().describe('Return only the Nth match (zero-indexed). Overrides limit/all.'),\n    root: z.string().optional().describe('Optional root selector to scope the query (default: document)'),\n  }),\n  callback: (input) => {\n    try {\n      const scope: ParentNode = input.root\n        ? (document.querySelector(input.root) ?? document)\n        : document\n      const nodes = Array.from(scope.querySelectorAll(input.selector))\n      if (input.nth !== undefined) {\n        if (input.nth < 0 || input.nth >= nodes.length) {\n          return JSON.stringify({\n            status: 'error',\n            error: `nth=${input.nth} out of range (found ${nodes.length})`,\n            selector: input.selector,\n            count: nodes.length,\n          })\n        }\n        return JSON.stringify({\n          status: 'success',\n          selector: input.selector,\n          count: nodes.length,\n          returned: 1,\n          nth: input.nth,\n          elements: [serializeElement(nodes[input.nth], 0, input.depth ?? 2)],\n        })\n      }\n      const limit = input.all ? nodes.length : input.limit ?? 10\n      const results = nodes.slice(0, limit).map((el) => serializeElement(el, 0, input.depth ?? 2))\n      return JSON.stringify({\n        status: 'success',\n        selector: input.selector,\n        count: nodes.length,\n        returned: results.length,\n        elements: results,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n/* --------------------------------------------------------------------------\n * dom_mutate\n * ------------------------------------------------------------------------ */\nexport const domMutateTool = tool({\n  name: 'dom_mutate',\n  description:\n    'Mutate the DOM. Operations: setText, setHTML, setAttr, removeAttr, addClass, removeClass, toggleClass, setStyle, remove, click, focus, blur, scrollIntoView, scrollTo, append, prepend, setValue (for inputs). ' +\n    'Default applies to the FIRST matching element; use all:true to apply to all, or nth:N for a specific index. ' +\n    'style keys may be kebab-case (\"background-color\") OR camelCase (\"backgroundColor\") — both work.',\n  inputSchema: z.object({\n    selector: z.string().describe('CSS selector of target element(s)'),\n    operation: z.enum([\n      'setText', 'setHTML', 'setAttr', 'removeAttr',\n      'addClass', 'removeClass', 'toggleClass',\n      'setStyle', 'remove', 'click', 'focus', 'blur',\n      'scrollIntoView', 'scrollTo', 'append', 'prepend',\n      'setValue',\n    ]),\n    value: z.string().optional().describe('Value for setText/setHTML/append/prepend/setValue/scrollTo (pixels for scrollTo)'),\n    attr: z.string().optional().describe('Attribute name for setAttr/removeAttr'),\n    style: z.record(z.string(), z.string()).optional().describe('Style object for setStyle; keys accept kebab-case OR camelCase'),\n    className: z.string().optional().describe('Class name(s) for addClass/removeClass/toggleClass'),\n    all: z.boolean().optional().describe('Apply to ALL matches (default: first only)'),\n    nth: z.number().optional().describe('Apply only to the Nth match (zero-indexed). Overrides all.'),\n    click_options: z.object({\n      dispatch: z.enum(['native', 'synthetic']).optional().describe('native: el.click() (default). synthetic: dispatch a real MouseEvent.'),\n      clientX: z.number().optional(),\n      clientY: z.number().optional(),\n      button: z.number().optional(),\n    }).optional(),\n  }),\n  callback: (input) => {\n    try {\n      const nodes = Array.from(document.querySelectorAll(input.selector))\n      if (nodes.length === 0) {\n        return JSON.stringify({\n          status: 'error',\n          error: 'No elements matched',\n          selector: input.selector,\n        })\n      }\n\n      let targets: Element[]\n      if (input.nth !== undefined) {\n        if (input.nth < 0 || input.nth >= nodes.length) {\n          return JSON.stringify({ status: 'error', error: `nth=${input.nth} out of range (${nodes.length} matched)` })\n        }\n        targets = [nodes[input.nth]]\n      } else {\n        targets = input.all ? nodes : nodes.slice(0, 1)\n      }\n\n      let affected = 0\n      const errors: string[] = []\n      for (const el of targets) {\n        const h = el as HTMLElement\n        try {\n          switch (input.operation) {\n            case 'setText': h.textContent = input.value ?? ''; break\n            case 'setHTML': h.innerHTML = input.value ?? ''; break\n            case 'setAttr':\n              if (!input.attr) throw new Error('attr required for setAttr')\n              h.setAttribute(input.attr, input.value ?? '')\n              break\n            case 'removeAttr':\n              if (!input.attr) throw new Error('attr required for removeAttr')\n              h.removeAttribute(input.attr)\n              break\n            case 'addClass':\n              if (input.className) input.className.split(/\\s+/).forEach((c) => c && h.classList.add(c))\n              break\n            case 'removeClass':\n              if (input.className) input.className.split(/\\s+/).forEach((c) => c && h.classList.remove(c))\n              break\n            case 'toggleClass':\n              if (input.className) input.className.split(/\\s+/).forEach((c) => c && h.classList.toggle(c))\n              break\n            case 'setStyle':\n              if (input.style) {\n                for (const [k, v] of Object.entries(input.style)) {\n                  (h.style as any)[kebabToCamel(k)] = v\n                }\n              }\n              break\n            case 'remove': h.remove(); break\n            case 'click': {\n              const opts = input.click_options || {}\n              const mode = opts.dispatch ?? 'native'\n              if (mode === 'native') {\n                h.click()\n              } else {\n                const rect = h.getBoundingClientRect()\n                const ev = new MouseEvent('click', {\n                  bubbles: true,\n                  cancelable: true,\n                  view: window,\n                  clientX: opts.clientX ?? rect.left + rect.width / 2,\n                  clientY: opts.clientY ?? rect.top + rect.height / 2,\n                  button: opts.button ?? 0,\n                })\n                h.dispatchEvent(ev)\n              }\n              break\n            }\n            case 'focus': h.focus(); break\n            case 'blur': h.blur(); break\n            case 'scrollIntoView': h.scrollIntoView({ behavior: 'smooth', block: 'center' }); break\n            case 'scrollTo': h.scrollTo({ top: parseInt(input.value ?? '0'), behavior: 'smooth' }); break\n            case 'append':\n              if (input.value) h.insertAdjacentHTML('beforeend', input.value)\n              break\n            case 'prepend':\n              if (input.value) h.insertAdjacentHTML('afterbegin', input.value)\n              break\n            case 'setValue':\n              // React-compatible value setter: uses the native value setter so\n              // React's synthetic event system notices the change.\n              if (h instanceof HTMLInputElement || h instanceof HTMLTextAreaElement || h instanceof HTMLSelectElement) {\n                const proto = Object.getPrototypeOf(h)\n                const nativeSetter = Object.getOwnPropertyDescriptor(proto, 'value')?.set\n                if (nativeSetter) {\n                  nativeSetter.call(h, input.value ?? '')\n                } else {\n                  ;(h as any).value = input.value ?? ''\n                }\n                h.dispatchEvent(new Event('input', { bubbles: true }))\n                h.dispatchEvent(new Event('change', { bubbles: true }))\n              } else {\n                throw new Error('setValue only works on input/textarea/select')\n              }\n              break\n          }\n          affected++\n        } catch (e: unknown) {\n          errors.push(`${(el as HTMLElement).tagName.toLowerCase()}: ${(e as Error).message}`)\n        }\n      }\n      return JSON.stringify({\n        status: affected > 0 ? 'success' : 'error',\n        operation: input.operation,\n        matched: nodes.length,\n        targeted: targets.length,\n        affected,\n        errors: errors.length ? errors : undefined,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n/* --------------------------------------------------------------------------\n * dom_observe — FIXED\n * ------------------------------------------------------------------------ */\nexport const domObserveTool = tool({\n  name: 'dom_observe',\n  description:\n    'Watch a DOM subtree for changes (via MutationObserver). Returns list of mutations over a duration window. ' +\n    'Safe: attributeOldValue / characterDataOldValue are only enabled when their parent flag is enabled (fixed a crash in the original impl).',\n  inputSchema: z.object({\n    selector: z.string().describe('CSS selector of root to observe'),\n    duration_ms: z.number().optional().describe('How long to observe (default 3000)'),\n    types: z.array(z.enum(['childList', 'attributes', 'characterData'])).optional().describe('Which mutation types to watch. Default: all three.'),\n    subtree: z.boolean().optional().describe('Observe descendants (default true)'),\n    attributeFilter: z.array(z.string()).optional().describe('Only report changes to these attributes (e.g. [\"class\",\"style\"])'),\n    max_mutations: z.number().optional().describe('Max mutations to return. Default 100.'),\n  }),\n  callback: async (input) => {\n    try {\n      const root = document.querySelector(input.selector)\n      if (!root) return JSON.stringify({ status: 'error', error: `Root element not found: ${input.selector}` })\n\n      // Determine which types to observe\n      const watchChild = !input.types || input.types.includes('childList')\n      const watchAttrs = !input.types || input.types.includes('attributes')\n      const watchChar = !input.types || input.types.includes('characterData')\n\n      if (!watchChild && !watchAttrs && !watchChar) {\n        return JSON.stringify({ status: 'error', error: 'At least one of types must be enabled' })\n      }\n\n      const mutations: any[] = []\n      const obs = new MutationObserver((muts) => {\n        for (const m of muts) {\n          mutations.push({\n            type: m.type,\n            target: (m.target as Element).tagName?.toLowerCase(),\n            added: m.addedNodes.length,\n            removed: m.removedNodes.length,\n            attribute: m.attributeName,\n            oldValue: m.oldValue,\n          })\n        }\n      })\n\n      // Build the init object carefully — *OldValue flags REQUIRE their parent flag.\n      const initOpts: MutationObserverInit = {\n        childList: watchChild,\n        attributes: watchAttrs,\n        characterData: watchChar,\n        subtree: input.subtree ?? true,\n      }\n      if (watchAttrs) initOpts.attributeOldValue = true\n      if (watchChar) initOpts.characterDataOldValue = true\n      if (watchAttrs && input.attributeFilter && input.attributeFilter.length > 0) {\n        initOpts.attributeFilter = input.attributeFilter\n      }\n\n      obs.observe(root, initOpts)\n      await new Promise((r) => setTimeout(r, input.duration_ms || 3000))\n      obs.disconnect()\n\n      const cap = input.max_mutations ?? 100\n      return JSON.stringify({\n        status: 'success',\n        root: input.selector,\n        duration_ms: input.duration_ms || 3000,\n        watched: { childList: watchChild, attributes: watchAttrs, characterData: watchChar },\n        total: mutations.length,\n        returned: Math.min(mutations.length, cap),\n        mutations: mutations.slice(0, cap),\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n/* --------------------------------------------------------------------------\n * dom_wait_for — wait for a selector to appear / become visible\n * ------------------------------------------------------------------------ */\nexport const domWaitForTool = tool({\n  name: 'dom_wait_for',\n  description:\n    'Wait until a selector matches (or becomes visible). Returns when found, or times out. Useful before interacting with async-rendered UI (panels, modals, routes).',\n  inputSchema: z.object({\n    selector: z.string(),\n    timeout_ms: z.number().optional().describe('Default 10000'),\n    require_visible: z.boolean().optional().describe('Wait until the element is actually visible (width>0, display!=none). Default false.'),\n    poll_ms: z.number().optional().describe('Polling interval. Default 100.'),\n  }),\n  callback: async (input) => {\n    const deadline = Date.now() + (input.timeout_ms ?? 10000)\n    const poll = input.poll_ms ?? 100\n    while (Date.now() < deadline) {\n      const el = document.querySelector(input.selector)\n      if (el) {\n        if (!input.require_visible) {\n          return JSON.stringify({\n            status: 'success',\n            selector: input.selector,\n            found_ms: Date.now() - (deadline - (input.timeout_ms ?? 10000)),\n            element: serializeElement(el, 0, 0),\n          })\n        }\n        const rect = (el as HTMLElement).getBoundingClientRect()\n        const style = window.getComputedStyle(el)\n        if (rect.width > 0 && rect.height > 0 && style.visibility !== 'hidden' && style.display !== 'none') {\n          return JSON.stringify({\n            status: 'success',\n            selector: input.selector,\n            element: serializeElement(el, 0, 0),\n          })\n        }\n      }\n      await new Promise((r) => setTimeout(r, poll))\n    }\n    return JSON.stringify({\n      status: 'error',\n      error: 'Timeout',\n      selector: input.selector,\n      timeout_ms: input.timeout_ms ?? 10000,\n    })\n  },\n})\n\n/* --------------------------------------------------------------------------\n * dom_dispatch_event — fire real user-input events\n * ------------------------------------------------------------------------ */\nexport const domDispatchEventTool = tool({\n  name: 'dom_dispatch_event',\n  description:\n    'Dispatch a real DOM event on an element. Supports keyboard (keydown/keypress/keyup), mouse (click/mousedown/mouseup/mousemove), input, change, focus, blur, submit, scroll, or any custom event. ' +\n    'Use this to simulate real user interaction (e.g. Enter key on a textarea, typing in a React input).',\n  inputSchema: z.object({\n    selector: z.string(),\n    nth: z.number().optional(),\n    event_type: z.string().describe('Event name, e.g. \"keydown\", \"click\", \"input\", \"submit\", \"custom-event\"'),\n    category: z.enum(['keyboard', 'mouse', 'input', 'custom', 'generic']).optional().describe('Default: auto-detect from event_type'),\n    bubbles: z.boolean().optional().describe('Default true'),\n    cancelable: z.boolean().optional().describe('Default true'),\n    // Keyboard specifics\n    key: z.string().optional().describe('e.g. \"Enter\", \"Escape\", \"ArrowDown\"'),\n    code: z.string().optional().describe('e.g. \"Enter\", \"KeyA\"'),\n    ctrlKey: z.boolean().optional(),\n    shiftKey: z.boolean().optional(),\n    altKey: z.boolean().optional(),\n    metaKey: z.boolean().optional(),\n    // Mouse specifics\n    clientX: z.number().optional(),\n    clientY: z.number().optional(),\n    button: z.number().optional(),\n    // CustomEvent detail\n    detail: z.any().optional(),\n  }),\n  callback: (input) => {\n    try {\n      const nodes = Array.from(document.querySelectorAll(input.selector))\n      if (nodes.length === 0) return JSON.stringify({ status: 'error', error: 'No elements matched' })\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\n      const bubbles = input.bubbles ?? true\n      const cancelable = input.cancelable ?? true\n      const category = input.category ?? (\n        /^key/i.test(input.event_type) ? 'keyboard' :\n        /^(click|mouse|contextmenu|dblclick)/i.test(input.event_type) ? 'mouse' :\n        /^(input|change|focus|blur)/i.test(input.event_type) ? 'input' :\n        'generic'\n      )\n\n      let ev: Event\n      if (category === 'keyboard') {\n        ev = new KeyboardEvent(input.event_type, {\n          bubbles, cancelable, view: window,\n          key: input.key, code: input.code,\n          ctrlKey: !!input.ctrlKey, shiftKey: !!input.shiftKey,\n          altKey: !!input.altKey, metaKey: !!input.metaKey,\n        })\n      } else if (category === 'mouse') {\n        const rect = el.getBoundingClientRect()\n        ev = new MouseEvent(input.event_type, {\n          bubbles, cancelable, view: window,\n          clientX: input.clientX ?? rect.left + rect.width / 2,\n          clientY: input.clientY ?? rect.top + rect.height / 2,\n          button: input.button ?? 0,\n          ctrlKey: !!input.ctrlKey, shiftKey: !!input.shiftKey,\n          altKey: !!input.altKey, metaKey: !!input.metaKey,\n        })\n      } else if (category === 'custom') {\n        ev = new CustomEvent(input.event_type, { bubbles, cancelable, detail: input.detail })\n      } else {\n        ev = new Event(input.event_type, { bubbles, cancelable })\n      }\n\n      const prevented = !el.dispatchEvent(ev)\n      return JSON.stringify({\n        status: 'success',\n        event_type: input.event_type,\n        category,\n        target: el.tagName.toLowerCase(),\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 DOM_TOOLS = [domQueryTool, domMutateTool, domObserveTool, domWaitForTool, domDispatchEventTool]\n"]}