page-agent 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"page-agent.js","sources":["../../../page-controller/dist/lib/page-controller.js","../../src/config/constants.ts","../../src/i18n/locales.ts","../../src/i18n/index.ts","../../src/config/index.ts","../../src/utils/bus.ts","../../src/llms/errors.ts","../../src/llms/utils.ts","../../src/llms/OpenAILenientClient.ts","../../src/llms/index.ts","../../src/prompts/system_prompt.md?raw","../../src/utils/index.ts","../../src/tools/index.ts","../../src/ui/UIState.ts","../../src/ui/Panel.ts","../../src/utils/checkDarkMode.ts","../../src/ui/SimulatorMask.ts","../../src/utils/assert.ts","../../src/PageAgent.ts"],"sourcesContent":["var __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\nasync function waitFor(seconds) {\n await new Promise((resolve) => setTimeout(resolve, seconds * 1e3));\n}\n__name(waitFor, \"waitFor\");\nasync function movePointerToElement(element) {\n const rect = element.getBoundingClientRect();\n const x = rect.left + rect.width / 2;\n const y = rect.top + rect.height / 2;\n window.dispatchEvent(new CustomEvent(\"PageAgent::MovePointerTo\", { detail: { x, y } }));\n await waitFor(0.3);\n}\n__name(movePointerToElement, \"movePointerToElement\");\nfunction getElementByIndex(selectorMap, index) {\n const interactiveNode = selectorMap.get(index);\n if (!interactiveNode) {\n throw new Error(`No interactive element found at index ${index}`);\n }\n const element = interactiveNode.ref;\n if (!element) {\n throw new Error(`Element at index ${index} does not have a reference`);\n }\n if (!(element instanceof HTMLElement)) {\n throw new Error(`Element at index ${index} is not an HTMLElement`);\n }\n return element;\n}\n__name(getElementByIndex, \"getElementByIndex\");\nlet lastClickedElement = null;\nfunction blurLastClickedElement() {\n if (lastClickedElement) {\n lastClickedElement.blur();\n lastClickedElement.dispatchEvent(\n new MouseEvent(\"mouseout\", { bubbles: true, cancelable: true })\n );\n lastClickedElement = null;\n }\n}\n__name(blurLastClickedElement, \"blurLastClickedElement\");\nasync function clickElement(element) {\n blurLastClickedElement();\n lastClickedElement = element;\n await scrollIntoViewIfNeeded(element);\n await movePointerToElement(element);\n window.dispatchEvent(new CustomEvent(\"PageAgent::ClickPointer\"));\n await waitFor(0.1);\n element.dispatchEvent(new MouseEvent(\"mouseenter\", { bubbles: true, cancelable: true }));\n element.dispatchEvent(new MouseEvent(\"mouseover\", { bubbles: true, cancelable: true }));\n element.dispatchEvent(new MouseEvent(\"mousedown\", { bubbles: true, cancelable: true }));\n element.focus();\n element.dispatchEvent(new MouseEvent(\"mouseup\", { bubbles: true, cancelable: true }));\n element.dispatchEvent(new MouseEvent(\"click\", { bubbles: true, cancelable: true }));\n await waitFor(0.1);\n}\n__name(clickElement, \"clickElement\");\nconst nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n window.HTMLInputElement.prototype,\n \"value\"\n).set;\nconst nativeTextAreaValueSetter = Object.getOwnPropertyDescriptor(\n window.HTMLTextAreaElement.prototype,\n \"value\"\n).set;\nasync function inputTextElement(element, text) {\n if (!(element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement)) {\n throw new Error(\"Element is not an input or textarea\");\n }\n await clickElement(element);\n if (element instanceof HTMLTextAreaElement) {\n nativeTextAreaValueSetter.call(element, text);\n } else {\n nativeInputValueSetter.call(element, text);\n }\n const inputEvent = new Event(\"input\", { bubbles: true });\n element.dispatchEvent(inputEvent);\n await waitFor(0.1);\n blurLastClickedElement();\n}\n__name(inputTextElement, \"inputTextElement\");\nasync function selectOptionElement(selectElement, optionText) {\n if (!(selectElement instanceof HTMLSelectElement)) {\n throw new Error(\"Element is not a select element\");\n }\n const options = Array.from(selectElement.options);\n const option = options.find((opt) => opt.textContent?.trim() === optionText.trim());\n if (!option) {\n throw new Error(`Option with text \"${optionText}\" not found in select element`);\n }\n selectElement.value = option.value;\n selectElement.dispatchEvent(new Event(\"change\", { bubbles: true }));\n await waitFor(0.1);\n}\n__name(selectOptionElement, \"selectOptionElement\");\nasync function scrollIntoViewIfNeeded(element) {\n const el = element;\n if (el.scrollIntoViewIfNeeded) {\n el.scrollIntoViewIfNeeded();\n } else {\n el.scrollIntoView({ behavior: \"auto\", block: \"center\", inline: \"nearest\" });\n }\n}\n__name(scrollIntoViewIfNeeded, \"scrollIntoViewIfNeeded\");\nasync function scrollVertically(down, scroll_amount, element) {\n if (element) {\n const targetElement = element;\n console.log(\n \"[SCROLL DEBUG] Starting direct container scroll for element:\",\n targetElement.tagName\n );\n let currentElement = targetElement;\n let scrollSuccess = false;\n let scrolledElement = null;\n let scrollDelta = 0;\n let attempts = 0;\n const dy2 = scroll_amount;\n while (currentElement && attempts < 10) {\n const computedStyle = window.getComputedStyle(currentElement);\n const hasScrollableY = /(auto|scroll|overlay)/.test(computedStyle.overflowY);\n const canScrollVertically = currentElement.scrollHeight > currentElement.clientHeight;\n console.log(\n \"[SCROLL DEBUG] Checking element:\",\n currentElement.tagName,\n \"hasScrollableY:\",\n hasScrollableY,\n \"canScrollVertically:\",\n canScrollVertically,\n \"scrollHeight:\",\n currentElement.scrollHeight,\n \"clientHeight:\",\n currentElement.clientHeight\n );\n if (hasScrollableY && canScrollVertically) {\n const beforeScroll = currentElement.scrollTop;\n const maxScroll = currentElement.scrollHeight - currentElement.clientHeight;\n let scrollAmount = dy2 / 3;\n if (scrollAmount > 0) {\n scrollAmount = Math.min(scrollAmount, maxScroll - beforeScroll);\n } else {\n scrollAmount = Math.max(scrollAmount, -beforeScroll);\n }\n currentElement.scrollTop = beforeScroll + scrollAmount;\n const afterScroll = currentElement.scrollTop;\n const actualScrollDelta = afterScroll - beforeScroll;\n console.log(\n \"[SCROLL DEBUG] Scroll attempt:\",\n currentElement.tagName,\n \"before:\",\n beforeScroll,\n \"after:\",\n afterScroll,\n \"delta:\",\n actualScrollDelta\n );\n if (Math.abs(actualScrollDelta) > 0.5) {\n scrollSuccess = true;\n scrolledElement = currentElement;\n scrollDelta = actualScrollDelta;\n console.log(\n \"[SCROLL DEBUG] Successfully scrolled container:\",\n currentElement.tagName,\n \"delta:\",\n actualScrollDelta\n );\n break;\n }\n }\n if (currentElement === document.body || currentElement === document.documentElement) {\n break;\n }\n currentElement = currentElement.parentElement;\n attempts++;\n }\n if (scrollSuccess) {\n return `Scrolled container (${scrolledElement?.tagName}) by ${scrollDelta}px`;\n } else {\n return `No scrollable container found for element (${targetElement.tagName})`;\n }\n }\n const dy = scroll_amount;\n const bigEnough = /* @__PURE__ */ __name((el2) => el2.clientHeight >= window.innerHeight * 0.5, \"bigEnough\");\n const canScroll = /* @__PURE__ */ __name((el2) => el2 && /(auto|scroll|overlay)/.test(getComputedStyle(el2).overflowY) && el2.scrollHeight > el2.clientHeight && bigEnough(el2), \"canScroll\");\n let el = document.activeElement;\n while (el && !canScroll(el) && el !== document.body) el = el.parentElement;\n el = canScroll(el) ? el : Array.from(document.querySelectorAll(\"*\")).find(canScroll) || document.scrollingElement || document.documentElement;\n if (el === document.scrollingElement || el === document.documentElement || el === document.body) {\n window.scrollBy(0, dy);\n return `✅ Scrolled page by ${dy}px.`;\n } else {\n el.scrollBy({ top: dy, behavior: \"smooth\" });\n await waitFor(0.1);\n return `✅ Scrolled container (${el.tagName}) by ${dy}px.`;\n }\n}\n__name(scrollVertically, \"scrollVertically\");\nasync function scrollHorizontally(right, scroll_amount, element) {\n if (element) {\n const targetElement = element;\n console.log(\n \"[SCROLL DEBUG] Starting direct container scroll for element:\",\n targetElement.tagName\n );\n let currentElement = targetElement;\n let scrollSuccess = false;\n let scrolledElement = null;\n let scrollDelta = 0;\n let attempts = 0;\n const dx2 = right ? scroll_amount : -scroll_amount;\n while (currentElement && attempts < 10) {\n const computedStyle = window.getComputedStyle(currentElement);\n const hasScrollableX = /(auto|scroll|overlay)/.test(computedStyle.overflowX);\n const canScrollHorizontally = currentElement.scrollWidth > currentElement.clientWidth;\n console.log(\n \"[SCROLL DEBUG] Checking element:\",\n currentElement.tagName,\n \"hasScrollableX:\",\n hasScrollableX,\n \"canScrollHorizontally:\",\n canScrollHorizontally,\n \"scrollWidth:\",\n currentElement.scrollWidth,\n \"clientWidth:\",\n currentElement.clientWidth\n );\n if (hasScrollableX && canScrollHorizontally) {\n const beforeScroll = currentElement.scrollLeft;\n const maxScroll = currentElement.scrollWidth - currentElement.clientWidth;\n let scrollAmount = dx2 / 3;\n if (scrollAmount > 0) {\n scrollAmount = Math.min(scrollAmount, maxScroll - beforeScroll);\n } else {\n scrollAmount = Math.max(scrollAmount, -beforeScroll);\n }\n currentElement.scrollLeft = beforeScroll + scrollAmount;\n const afterScroll = currentElement.scrollLeft;\n const actualScrollDelta = afterScroll - beforeScroll;\n console.log(\n \"[SCROLL DEBUG] Scroll attempt:\",\n currentElement.tagName,\n \"before:\",\n beforeScroll,\n \"after:\",\n afterScroll,\n \"delta:\",\n actualScrollDelta\n );\n if (Math.abs(actualScrollDelta) > 0.5) {\n scrollSuccess = true;\n scrolledElement = currentElement;\n scrollDelta = actualScrollDelta;\n console.log(\n \"[SCROLL DEBUG] Successfully scrolled container:\",\n currentElement.tagName,\n \"delta:\",\n actualScrollDelta\n );\n break;\n }\n }\n if (currentElement === document.body || currentElement === document.documentElement) {\n break;\n }\n currentElement = currentElement.parentElement;\n attempts++;\n }\n if (scrollSuccess) {\n return `Scrolled container (${scrolledElement?.tagName}) horizontally by ${scrollDelta}px`;\n } else {\n return `No horizontally scrollable container found for element (${targetElement.tagName})`;\n }\n }\n const dx = right ? scroll_amount : -scroll_amount;\n const bigEnough = /* @__PURE__ */ __name((el2) => el2.clientWidth >= window.innerWidth * 0.5, \"bigEnough\");\n const canScroll = /* @__PURE__ */ __name((el2) => el2 && /(auto|scroll|overlay)/.test(getComputedStyle(el2).overflowX) && el2.scrollWidth > el2.clientWidth && bigEnough(el2), \"canScroll\");\n let el = document.activeElement;\n while (el && !canScroll(el) && el !== document.body) el = el.parentElement;\n el = canScroll(el) ? el : Array.from(document.querySelectorAll(\"*\")).find(canScroll) || document.scrollingElement || document.documentElement;\n if (el === document.scrollingElement || el === document.documentElement || el === document.body) {\n window.scrollBy(dx, 0);\n return `✅ Scrolled page horizontally by ${dx}px`;\n } else {\n el.scrollBy({ left: dx, behavior: \"smooth\" });\n await waitFor(0.1);\n return `✅ Scrolled container (${el.tagName}) horizontally by ${dx}px`;\n }\n}\n__name(scrollHorizontally, \"scrollHorizontally\");\nconst VIEWPORT_EXPANSION = -1;\nconst domTree = /* @__PURE__ */ __name((args = {\n doHighlightElements: true,\n focusHighlightIndex: -1,\n viewportExpansion: 0,\n debugMode: false,\n /**\n * @edit\n */\n /** @type {Element[]} */\n interactiveBlacklist: [],\n /** @type {Element[]} */\n interactiveWhitelist: [],\n highlightOpacity: 0.1,\n highlightLabelOpacity: 0.5\n}) => {\n const { interactiveBlacklist, interactiveWhitelist, highlightOpacity, highlightLabelOpacity } = args;\n const { doHighlightElements, focusHighlightIndex, viewportExpansion, debugMode } = args;\n let highlightIndex = 0;\n const extraData = /* @__PURE__ */ new WeakMap();\n function addExtraData(element, data) {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) return;\n extraData.set(element, { ...extraData.get(element), ...data });\n }\n __name(addExtraData, \"addExtraData\");\n const DOM_CACHE = {\n boundingRects: /* @__PURE__ */ new WeakMap(),\n clientRects: /* @__PURE__ */ new WeakMap(),\n computedStyles: /* @__PURE__ */ new WeakMap(),\n clearCache: /* @__PURE__ */ __name(() => {\n DOM_CACHE.boundingRects = /* @__PURE__ */ new WeakMap();\n DOM_CACHE.clientRects = /* @__PURE__ */ new WeakMap();\n DOM_CACHE.computedStyles = /* @__PURE__ */ new WeakMap();\n }, \"clearCache\")\n };\n function getCachedBoundingRect(element) {\n if (!element) return null;\n if (DOM_CACHE.boundingRects.has(element)) {\n return DOM_CACHE.boundingRects.get(element);\n }\n const rect = element.getBoundingClientRect();\n if (rect) {\n DOM_CACHE.boundingRects.set(element, rect);\n }\n return rect;\n }\n __name(getCachedBoundingRect, \"getCachedBoundingRect\");\n function getCachedComputedStyle(element) {\n if (!element) return null;\n if (DOM_CACHE.computedStyles.has(element)) {\n return DOM_CACHE.computedStyles.get(element);\n }\n const style = window.getComputedStyle(element);\n if (style) {\n DOM_CACHE.computedStyles.set(element, style);\n }\n return style;\n }\n __name(getCachedComputedStyle, \"getCachedComputedStyle\");\n function getCachedClientRects(element) {\n if (!element) return null;\n if (DOM_CACHE.clientRects.has(element)) {\n return DOM_CACHE.clientRects.get(element);\n }\n const rects = element.getClientRects();\n if (rects) {\n DOM_CACHE.clientRects.set(element, rects);\n }\n return rects;\n }\n __name(getCachedClientRects, \"getCachedClientRects\");\n const DOM_HASH_MAP = {};\n const ID = { current: 0 };\n const HIGHLIGHT_CONTAINER_ID = \"playwright-highlight-container\";\n function highlightElement(element, index, parentIframe = null) {\n if (!element) return index;\n const overlays = [];\n let label = null;\n let labelWidth = 20;\n let labelHeight = 16;\n let cleanupFn = null;\n try {\n let container = document.getElementById(HIGHLIGHT_CONTAINER_ID);\n if (!container) {\n container = document.createElement(\"div\");\n container.id = HIGHLIGHT_CONTAINER_ID;\n container.style.position = \"fixed\";\n container.style.pointerEvents = \"none\";\n container.style.top = \"0\";\n container.style.left = \"0\";\n container.style.width = \"100%\";\n container.style.height = \"100%\";\n container.style.zIndex = \"2147483640\";\n container.style.backgroundColor = \"transparent\";\n document.body.appendChild(container);\n }\n const rects = element.getClientRects();\n if (!rects || rects.length === 0) return index;\n const colors = [\n \"#FF0000\",\n \"#00FF00\",\n \"#0000FF\",\n \"#FFA500\",\n \"#800080\",\n \"#008080\",\n \"#FF69B4\",\n \"#4B0082\",\n \"#FF4500\",\n \"#2E8B57\",\n \"#DC143C\",\n \"#4682B4\"\n ];\n const colorIndex = index % colors.length;\n let baseColor = colors[colorIndex];\n const backgroundColor = baseColor + Math.floor(highlightOpacity * 255).toString(16).padStart(2, \"0\");\n baseColor = baseColor + Math.floor(highlightLabelOpacity * 255).toString(16).padStart(2, \"0\");\n let iframeOffset = { x: 0, y: 0 };\n if (parentIframe) {\n const iframeRect = parentIframe.getBoundingClientRect();\n iframeOffset.x = iframeRect.left;\n iframeOffset.y = iframeRect.top;\n }\n const fragment = document.createDocumentFragment();\n for (const rect of rects) {\n if (rect.width === 0 || rect.height === 0) continue;\n const overlay = document.createElement(\"div\");\n overlay.style.position = \"fixed\";\n overlay.style.border = `2px solid ${baseColor}`;\n overlay.style.backgroundColor = backgroundColor;\n overlay.style.pointerEvents = \"none\";\n overlay.style.boxSizing = \"border-box\";\n const top = rect.top + iframeOffset.y;\n const left = rect.left + iframeOffset.x;\n overlay.style.top = `${top}px`;\n overlay.style.left = `${left}px`;\n overlay.style.width = `${rect.width}px`;\n overlay.style.height = `${rect.height}px`;\n fragment.appendChild(overlay);\n overlays.push({ element: overlay, initialRect: rect });\n }\n const firstRect = rects[0];\n label = document.createElement(\"div\");\n label.className = \"playwright-highlight-label\";\n label.style.position = \"fixed\";\n label.style.background = baseColor;\n label.style.color = \"white\";\n label.style.padding = \"1px 4px\";\n label.style.borderRadius = \"4px\";\n label.style.fontSize = `${Math.min(12, Math.max(8, firstRect.height / 2))}px`;\n label.textContent = index.toString();\n labelWidth = label.offsetWidth > 0 ? label.offsetWidth : labelWidth;\n labelHeight = label.offsetHeight > 0 ? label.offsetHeight : labelHeight;\n const firstRectTop = firstRect.top + iframeOffset.y;\n const firstRectLeft = firstRect.left + iframeOffset.x;\n let labelTop = firstRectTop + 2;\n let labelLeft = firstRectLeft + firstRect.width - labelWidth - 2;\n if (firstRect.width < labelWidth + 4 || firstRect.height < labelHeight + 4) {\n labelTop = firstRectTop - labelHeight - 2;\n labelLeft = firstRectLeft + firstRect.width - labelWidth;\n if (labelLeft < iframeOffset.x) labelLeft = firstRectLeft;\n }\n labelTop = Math.max(0, Math.min(labelTop, window.innerHeight - labelHeight));\n labelLeft = Math.max(0, Math.min(labelLeft, window.innerWidth - labelWidth));\n label.style.top = `${labelTop}px`;\n label.style.left = `${labelLeft}px`;\n fragment.appendChild(label);\n const updatePositions = /* @__PURE__ */ __name(() => {\n const newRects = element.getClientRects();\n let newIframeOffset = { x: 0, y: 0 };\n if (parentIframe) {\n const iframeRect = parentIframe.getBoundingClientRect();\n newIframeOffset.x = iframeRect.left;\n newIframeOffset.y = iframeRect.top;\n }\n overlays.forEach((overlayData, i) => {\n if (i < newRects.length) {\n const newRect = newRects[i];\n const newTop = newRect.top + newIframeOffset.y;\n const newLeft = newRect.left + newIframeOffset.x;\n overlayData.element.style.top = `${newTop}px`;\n overlayData.element.style.left = `${newLeft}px`;\n overlayData.element.style.width = `${newRect.width}px`;\n overlayData.element.style.height = `${newRect.height}px`;\n overlayData.element.style.display = newRect.width === 0 || newRect.height === 0 ? \"none\" : \"block\";\n } else {\n overlayData.element.style.display = \"none\";\n }\n });\n if (newRects.length < overlays.length) {\n for (let i = newRects.length; i < overlays.length; i++) {\n overlays[i].element.style.display = \"none\";\n }\n }\n if (label && newRects.length > 0) {\n const firstNewRect = newRects[0];\n const firstNewRectTop = firstNewRect.top + newIframeOffset.y;\n const firstNewRectLeft = firstNewRect.left + newIframeOffset.x;\n let newLabelTop = firstNewRectTop + 2;\n let newLabelLeft = firstNewRectLeft + firstNewRect.width - labelWidth - 2;\n if (firstNewRect.width < labelWidth + 4 || firstNewRect.height < labelHeight + 4) {\n newLabelTop = firstNewRectTop - labelHeight - 2;\n newLabelLeft = firstNewRectLeft + firstNewRect.width - labelWidth;\n if (newLabelLeft < newIframeOffset.x) newLabelLeft = firstNewRectLeft;\n }\n newLabelTop = Math.max(0, Math.min(newLabelTop, window.innerHeight - labelHeight));\n newLabelLeft = Math.max(0, Math.min(newLabelLeft, window.innerWidth - labelWidth));\n label.style.top = `${newLabelTop}px`;\n label.style.left = `${newLabelLeft}px`;\n label.style.display = \"block\";\n } else if (label) {\n label.style.display = \"none\";\n }\n }, \"updatePositions\");\n const throttleFunction = /* @__PURE__ */ __name((func, delay) => {\n let lastCall = 0;\n return (...args2) => {\n const now = performance.now();\n if (now - lastCall < delay) return;\n lastCall = now;\n return func(...args2);\n };\n }, \"throttleFunction\");\n const throttledUpdatePositions = throttleFunction(updatePositions, 16);\n window.addEventListener(\"scroll\", throttledUpdatePositions, true);\n window.addEventListener(\"resize\", throttledUpdatePositions);\n cleanupFn = /* @__PURE__ */ __name(() => {\n window.removeEventListener(\"scroll\", throttledUpdatePositions, true);\n window.removeEventListener(\"resize\", throttledUpdatePositions);\n overlays.forEach((overlay) => overlay.element.remove());\n if (label) label.remove();\n }, \"cleanupFn\");\n container.appendChild(fragment);\n return index + 1;\n } finally {\n if (cleanupFn) {\n (window._highlightCleanupFunctions = window._highlightCleanupFunctions || []).push(\n cleanupFn\n );\n }\n }\n }\n __name(highlightElement, \"highlightElement\");\n function isScrollableElement(element) {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return null;\n }\n const style = getCachedComputedStyle(element);\n if (!style) return null;\n const display = style.display;\n if (display === \"inline\" || display === \"inline-block\") {\n return null;\n }\n const overflowX = style.overflowX;\n const overflowY = style.overflowY;\n const scrollableX = overflowX === \"auto\" || overflowX === \"scroll\";\n const scrollableY = overflowY === \"auto\" || overflowY === \"scroll\";\n if (!scrollableX && !scrollableY) {\n return null;\n }\n const scrollWidth = element.scrollWidth - element.clientWidth;\n const scrollHeight = element.scrollHeight - element.clientHeight;\n const threshold = 4;\n if (scrollWidth < threshold && scrollHeight < threshold) {\n return null;\n }\n if (!scrollableY && scrollWidth < threshold) {\n return null;\n }\n if (!scrollableX && scrollHeight < threshold) {\n return null;\n }\n const distanceToTop = element.scrollTop;\n const distanceToLeft = element.scrollLeft;\n const distanceToRight = element.scrollWidth - element.clientWidth - element.scrollLeft;\n const distanceToBottom = element.scrollHeight - element.clientHeight - element.scrollTop;\n const scrollData = {\n top: distanceToTop,\n right: distanceToRight,\n bottom: distanceToBottom,\n left: distanceToLeft\n };\n addExtraData(element, {\n scrollable: true,\n scrollData\n });\n return scrollData;\n }\n __name(isScrollableElement, \"isScrollableElement\");\n function isTextNodeVisible(textNode) {\n try {\n if (viewportExpansion === -1) {\n const parentElement2 = textNode.parentElement;\n if (!parentElement2) return false;\n try {\n return parentElement2.checkVisibility({\n checkOpacity: true,\n checkVisibilityCSS: true\n });\n } catch (e) {\n const style = window.getComputedStyle(parentElement2);\n return style.display !== \"none\" && style.visibility !== \"hidden\" && style.opacity !== \"0\";\n }\n }\n const range = document.createRange();\n range.selectNodeContents(textNode);\n const rects = range.getClientRects();\n if (!rects || rects.length === 0) {\n return false;\n }\n let isAnyRectVisible = false;\n let isAnyRectInViewport = false;\n for (const rect of rects) {\n if (rect.width > 0 && rect.height > 0) {\n isAnyRectVisible = true;\n if (!(rect.bottom < -viewportExpansion || rect.top > window.innerHeight + viewportExpansion || rect.right < -viewportExpansion || rect.left > window.innerWidth + viewportExpansion)) {\n isAnyRectInViewport = true;\n break;\n }\n }\n }\n if (!isAnyRectVisible || !isAnyRectInViewport) {\n return false;\n }\n const parentElement = textNode.parentElement;\n if (!parentElement) return false;\n try {\n return parentElement.checkVisibility({\n checkOpacity: true,\n checkVisibilityCSS: true\n });\n } catch (e) {\n const style = window.getComputedStyle(parentElement);\n return style.display !== \"none\" && style.visibility !== \"hidden\" && style.opacity !== \"0\";\n }\n } catch (e) {\n console.warn(\"Error checking text node visibility:\", e);\n return false;\n }\n }\n __name(isTextNodeVisible, \"isTextNodeVisible\");\n function isElementAccepted(element) {\n if (!element || !element.tagName) return false;\n const alwaysAccept = /* @__PURE__ */ new Set([\n \"body\",\n \"div\",\n \"main\",\n \"article\",\n \"section\",\n \"nav\",\n \"header\",\n \"footer\"\n ]);\n const tagName = element.tagName.toLowerCase();\n if (alwaysAccept.has(tagName)) return true;\n const leafElementDenyList = /* @__PURE__ */ new Set([\n \"svg\",\n \"script\",\n \"style\",\n \"link\",\n \"meta\",\n \"noscript\",\n \"template\"\n ]);\n return !leafElementDenyList.has(tagName);\n }\n __name(isElementAccepted, \"isElementAccepted\");\n function isElementVisible(element) {\n const style = getCachedComputedStyle(element);\n return element.offsetWidth > 0 && element.offsetHeight > 0 && style?.visibility !== \"hidden\" && style?.display !== \"none\";\n }\n __name(isElementVisible, \"isElementVisible\");\n function isInteractiveElement(element) {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return false;\n }\n if (interactiveBlacklist.includes(element)) {\n return false;\n }\n if (interactiveWhitelist.includes(element)) {\n return true;\n }\n const tagName = element.tagName.toLowerCase();\n const style = getCachedComputedStyle(element);\n const interactiveCursors = /* @__PURE__ */ new Set([\n \"pointer\",\n // Link/clickable elements\n \"move\",\n // Movable elements\n \"text\",\n // Text selection\n \"grab\",\n // Grabbable elements\n \"grabbing\",\n // Currently grabbing\n \"cell\",\n // Table cell selection\n \"copy\",\n // Copy operation\n \"alias\",\n // Alias creation\n \"all-scroll\",\n // Scrollable content\n \"col-resize\",\n // Column resize\n \"context-menu\",\n // Context menu available\n \"crosshair\",\n // Precise selection\n \"e-resize\",\n // East resize\n \"ew-resize\",\n // East-west resize\n \"help\",\n // Help available\n \"n-resize\",\n // North resize\n \"ne-resize\",\n // Northeast resize\n \"nesw-resize\",\n // Northeast-southwest resize\n \"ns-resize\",\n // North-south resize\n \"nw-resize\",\n // Northwest resize\n \"nwse-resize\",\n // Northwest-southeast resize\n \"row-resize\",\n // Row resize\n \"s-resize\",\n // South resize\n \"se-resize\",\n // Southeast resize\n \"sw-resize\",\n // Southwest resize\n \"vertical-text\",\n // Vertical text selection\n \"w-resize\",\n // West resize\n \"zoom-in\",\n // Zoom in\n \"zoom-out\"\n // Zoom out\n ]);\n const nonInteractiveCursors = /* @__PURE__ */ new Set([\n \"not-allowed\",\n // Action not allowed\n \"no-drop\",\n // Drop not allowed\n \"wait\",\n // Processing\n \"progress\",\n // In progress\n \"initial\",\n // Initial value\n \"inherit\"\n // Inherited value\n //? Let's just include all potentially clickable elements that are not specifically blocked\n // 'none', // No cursor\n // 'default', // Default cursor\n // 'auto', // Browser default\n ]);\n function doesElementHaveInteractivePointer(element2) {\n if (element2.tagName.toLowerCase() === \"html\") return false;\n if (style?.cursor && interactiveCursors.has(style.cursor)) return true;\n return false;\n }\n __name(doesElementHaveInteractivePointer, \"doesElementHaveInteractivePointer\");\n let isInteractiveCursor = doesElementHaveInteractivePointer(element);\n if (isInteractiveCursor) {\n return true;\n }\n const interactiveElements = /* @__PURE__ */ new Set([\n \"a\",\n // Links\n \"button\",\n // Buttons\n \"input\",\n // All input types (text, checkbox, radio, etc.)\n \"select\",\n // Dropdown menus\n \"textarea\",\n // Text areas\n \"details\",\n // Expandable details\n \"summary\",\n // Summary element (clickable part of details)\n \"label\",\n // Form labels (often clickable)\n \"option\",\n // Select options\n \"optgroup\",\n // Option groups\n \"fieldset\",\n // Form fieldsets (can be interactive with legend)\n \"legend\"\n // Fieldset legends\n ]);\n const explicitDisableTags = /* @__PURE__ */ new Set([\n \"disabled\",\n // Standard disabled attribute\n // 'aria-disabled', // ARIA disabled state\n \"readonly\"\n // Read-only state\n // 'aria-readonly', // ARIA read-only state\n // 'aria-hidden', // Hidden from accessibility\n // 'hidden', // Hidden attribute\n // 'inert', // Inert attribute\n // 'aria-inert', // ARIA inert state\n // 'tabindex=\"-1\"', // Removed from tab order\n // 'aria-hidden=\"true\"' // Hidden from screen readers\n ]);\n if (interactiveElements.has(tagName)) {\n if (style?.cursor && nonInteractiveCursors.has(style.cursor)) {\n return false;\n }\n for (const disableTag of explicitDisableTags) {\n if (element.hasAttribute(disableTag) || element.getAttribute(disableTag) === \"true\" || element.getAttribute(disableTag) === \"\") {\n return false;\n }\n }\n if (element.disabled) {\n return false;\n }\n if (element.readOnly) {\n return false;\n }\n if (element.inert) {\n return false;\n }\n return true;\n }\n const role = element.getAttribute(\"role\");\n const ariaRole = element.getAttribute(\"aria-role\");\n if (element.getAttribute(\"contenteditable\") === \"true\" || element.isContentEditable) {\n return true;\n }\n if (element.classList && (element.classList.contains(\"button\") || element.classList.contains(\"dropdown-toggle\") || element.getAttribute(\"data-index\") || element.getAttribute(\"data-toggle\") === \"dropdown\" || element.getAttribute(\"aria-haspopup\") === \"true\")) {\n return true;\n }\n const interactiveRoles = /* @__PURE__ */ new Set([\n \"button\",\n // Directly clickable element\n // 'link', // Clickable link\n \"menu\",\n // Menu container (ARIA menus)\n \"menubar\",\n // Menu bar container\n \"menuitem\",\n // Clickable menu item\n \"menuitemradio\",\n // Radio-style menu item (selectable)\n \"menuitemcheckbox\",\n // Checkbox-style menu item (toggleable)\n \"radio\",\n // Radio button (selectable)\n \"checkbox\",\n // Checkbox (toggleable)\n \"tab\",\n // Tab (clickable to switch content)\n \"switch\",\n // Toggle switch (clickable to change state)\n \"slider\",\n // Slider control (draggable)\n \"spinbutton\",\n // Number input with up/down controls\n \"combobox\",\n // Dropdown with text input\n \"searchbox\",\n // Search input field\n \"textbox\",\n // Text input field\n \"listbox\",\n // Selectable list\n \"option\",\n // Selectable option in a list\n \"scrollbar\"\n // Scrollable control\n ]);\n const hasInteractiveRole = interactiveElements.has(tagName) || role && interactiveRoles.has(role) || ariaRole && interactiveRoles.has(ariaRole);\n if (hasInteractiveRole) return true;\n try {\n if (typeof getEventListeners === \"function\") {\n const listeners = getEventListeners(element);\n const mouseEvents = [\"click\", \"mousedown\", \"mouseup\", \"dblclick\"];\n for (const eventType of mouseEvents) {\n if (listeners[eventType] && listeners[eventType].length > 0) {\n return true;\n }\n }\n }\n const getEventListenersForNode = element?.ownerDocument?.defaultView?.getEventListenersForNode || window.getEventListenersForNode;\n if (typeof getEventListenersForNode === \"function\") {\n const listeners = getEventListenersForNode(element);\n const interactionEvents = [\n \"click\",\n \"mousedown\",\n \"mouseup\",\n \"keydown\",\n \"keyup\",\n \"submit\",\n \"change\",\n \"input\",\n \"focus\",\n \"blur\"\n ];\n for (const eventType of interactionEvents) {\n for (const listener of listeners) {\n if (listener.type === eventType) {\n return true;\n }\n }\n }\n }\n const commonMouseAttrs = [\"onclick\", \"onmousedown\", \"onmouseup\", \"ondblclick\"];\n for (const attr of commonMouseAttrs) {\n if (element.hasAttribute(attr) || typeof element[attr] === \"function\") {\n return true;\n }\n }\n } catch (e) {\n }\n if (isScrollableElement(element)) {\n return true;\n }\n return false;\n }\n __name(isInteractiveElement, \"isInteractiveElement\");\n function isTopElement(element) {\n if (viewportExpansion === -1) {\n return true;\n }\n const rects = getCachedClientRects(element);\n if (!rects || rects.length === 0) {\n return false;\n }\n let isAnyRectInViewport = false;\n for (const rect2 of rects) {\n if (rect2.width > 0 && rect2.height > 0 && !// Only check non-empty rects\n (rect2.bottom < -viewportExpansion || rect2.top > window.innerHeight + viewportExpansion || rect2.right < -viewportExpansion || rect2.left > window.innerWidth + viewportExpansion)) {\n isAnyRectInViewport = true;\n break;\n }\n }\n if (!isAnyRectInViewport) {\n return false;\n }\n let doc = element.ownerDocument;\n if (doc !== window.document) {\n return true;\n }\n let rect = Array.from(rects).find((r) => r.width > 0 && r.height > 0);\n if (!rect) {\n return false;\n }\n const shadowRoot = element.getRootNode();\n if (shadowRoot instanceof ShadowRoot) {\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n try {\n const topEl = shadowRoot.elementFromPoint(centerX, centerY);\n if (!topEl) return false;\n let current = topEl;\n while (current && current !== shadowRoot) {\n if (current === element) return true;\n current = current.parentElement;\n }\n return false;\n } catch (e) {\n return true;\n }\n }\n const margin = 5;\n const checkPoints = [\n // Initially only this was used, but it was not enough\n { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 },\n { x: rect.left + margin, y: rect.top + margin },\n // top left\n // { x: rect.right - margin, y: rect.top + margin }, // top right\n // { x: rect.left + margin, y: rect.bottom - margin }, // bottom left\n { x: rect.right - margin, y: rect.bottom - margin }\n // bottom right\n ];\n return checkPoints.some(({ x, y }) => {\n try {\n const topEl = document.elementFromPoint(x, y);\n if (!topEl) return false;\n let current = topEl;\n while (current && current !== document.documentElement) {\n if (current === element) return true;\n current = current.parentElement;\n }\n return false;\n } catch (e) {\n return true;\n }\n });\n }\n __name(isTopElement, \"isTopElement\");\n function isInExpandedViewport(element, viewportExpansion2) {\n if (viewportExpansion2 === -1) {\n return true;\n }\n const rects = element.getClientRects();\n if (!rects || rects.length === 0) {\n const boundingRect = getCachedBoundingRect(element);\n if (!boundingRect || boundingRect.width === 0 || boundingRect.height === 0) {\n return false;\n }\n return !(boundingRect.bottom < -viewportExpansion2 || boundingRect.top > window.innerHeight + viewportExpansion2 || boundingRect.right < -viewportExpansion2 || boundingRect.left > window.innerWidth + viewportExpansion2);\n }\n for (const rect of rects) {\n if (rect.width === 0 || rect.height === 0) continue;\n if (!(rect.bottom < -viewportExpansion2 || rect.top > window.innerHeight + viewportExpansion2 || rect.right < -viewportExpansion2 || rect.left > window.innerWidth + viewportExpansion2)) {\n return true;\n }\n }\n return false;\n }\n __name(isInExpandedViewport, \"isInExpandedViewport\");\n function isInteractiveCandidate(element) {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) return false;\n const tagName = element.tagName.toLowerCase();\n const interactiveElements = /* @__PURE__ */ new Set([\n \"a\",\n \"button\",\n \"input\",\n \"select\",\n \"textarea\",\n \"details\",\n \"summary\",\n \"label\"\n ]);\n if (interactiveElements.has(tagName)) return true;\n const hasQuickInteractiveAttr = element.hasAttribute(\"onclick\") || element.hasAttribute(\"role\") || element.hasAttribute(\"tabindex\") || element.hasAttribute(\"aria-\") || element.hasAttribute(\"data-action\") || element.getAttribute(\"contenteditable\") === \"true\";\n return hasQuickInteractiveAttr;\n }\n __name(isInteractiveCandidate, \"isInteractiveCandidate\");\n const DISTINCT_INTERACTIVE_TAGS = /* @__PURE__ */ new Set([\n \"a\",\n \"button\",\n \"input\",\n \"select\",\n \"textarea\",\n \"summary\",\n \"details\",\n \"label\",\n \"option\"\n ]);\n const INTERACTIVE_ROLES = /* @__PURE__ */ new Set([\n \"button\",\n \"link\",\n \"menuitem\",\n \"menuitemradio\",\n \"menuitemcheckbox\",\n \"radio\",\n \"checkbox\",\n \"tab\",\n \"switch\",\n \"slider\",\n \"spinbutton\",\n \"combobox\",\n \"searchbox\",\n \"textbox\",\n \"listbox\",\n \"option\",\n \"scrollbar\"\n ]);\n function isHeuristicallyInteractive(element) {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) return false;\n if (!isElementVisible(element)) return false;\n const hasInteractiveAttributes = element.hasAttribute(\"role\") || element.hasAttribute(\"tabindex\") || element.hasAttribute(\"onclick\") || typeof element.onclick === \"function\";\n const hasInteractiveClass = /\\b(btn|clickable|menu|item|entry|link)\\b/i.test(\n element.className || \"\"\n );\n const isInKnownContainer = Boolean(\n element.closest('button,a,[role=\"button\"],.menu,.dropdown,.list,.toolbar')\n );\n const hasVisibleChildren = [...element.children].some(isElementVisible);\n const isParentBody = element.parentElement && element.parentElement.isSameNode(document.body);\n return (isInteractiveElement(element) || hasInteractiveAttributes || hasInteractiveClass) && hasVisibleChildren && isInKnownContainer && !isParentBody;\n }\n __name(isHeuristicallyInteractive, \"isHeuristicallyInteractive\");\n function isElementDistinctInteraction(element) {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return false;\n }\n const tagName = element.tagName.toLowerCase();\n const role = element.getAttribute(\"role\");\n if (tagName === \"iframe\") {\n return true;\n }\n if (DISTINCT_INTERACTIVE_TAGS.has(tagName)) {\n return true;\n }\n if (role && INTERACTIVE_ROLES.has(role)) {\n return true;\n }\n if (element.isContentEditable || element.getAttribute(\"contenteditable\") === \"true\") {\n return true;\n }\n if (element.hasAttribute(\"data-testid\") || element.hasAttribute(\"data-cy\") || element.hasAttribute(\"data-test\")) {\n return true;\n }\n if (element.hasAttribute(\"onclick\") || typeof element.onclick === \"function\") {\n return true;\n }\n try {\n const getEventListenersForNode = element?.ownerDocument?.defaultView?.getEventListenersForNode || window.getEventListenersForNode;\n if (typeof getEventListenersForNode === \"function\") {\n const listeners = getEventListenersForNode(element);\n const interactionEvents = [\n \"click\",\n \"mousedown\",\n \"mouseup\",\n \"keydown\",\n \"keyup\",\n \"submit\",\n \"change\",\n \"input\",\n \"focus\",\n \"blur\"\n ];\n for (const eventType of interactionEvents) {\n for (const listener of listeners) {\n if (listener.type === eventType) {\n return true;\n }\n }\n }\n }\n const commonEventAttrs = [\n \"onmousedown\",\n \"onmouseup\",\n \"onkeydown\",\n \"onkeyup\",\n \"onsubmit\",\n \"onchange\",\n \"oninput\",\n \"onfocus\",\n \"onblur\"\n ];\n if (commonEventAttrs.some((attr) => element.hasAttribute(attr))) {\n return true;\n }\n } catch (e) {\n }\n if (isHeuristicallyInteractive(element)) {\n return true;\n }\n return false;\n }\n __name(isElementDistinctInteraction, \"isElementDistinctInteraction\");\n function handleHighlighting(nodeData, node, parentIframe, isParentHighlighted) {\n if (!nodeData.isInteractive) return false;\n let shouldHighlight = false;\n if (!isParentHighlighted) {\n shouldHighlight = true;\n } else {\n if (isElementDistinctInteraction(node)) {\n shouldHighlight = true;\n } else {\n shouldHighlight = false;\n }\n }\n if (shouldHighlight) {\n nodeData.isInViewport = isInExpandedViewport(node, viewportExpansion);\n if (nodeData.isInViewport || viewportExpansion === -1) {\n nodeData.highlightIndex = highlightIndex++;\n if (doHighlightElements) {\n if (focusHighlightIndex >= 0) {\n if (focusHighlightIndex === nodeData.highlightIndex) {\n highlightElement(node, nodeData.highlightIndex, parentIframe);\n }\n } else {\n highlightElement(node, nodeData.highlightIndex, parentIframe);\n }\n return true;\n }\n }\n }\n return false;\n }\n __name(handleHighlighting, \"handleHighlighting\");\n function buildDomTree(node, parentIframe = null, isParentHighlighted = false) {\n if (!node || node.id === HIGHLIGHT_CONTAINER_ID || node.nodeType !== Node.ELEMENT_NODE && node.nodeType !== Node.TEXT_NODE) {\n return null;\n }\n if (!node || node.id === HIGHLIGHT_CONTAINER_ID) {\n return null;\n }\n if (node.dataset?.browserUseIgnore === \"true\") {\n return true;\n }\n if (node === document.body) {\n const nodeData2 = {\n tagName: \"body\",\n attributes: {},\n xpath: \"/body\",\n children: []\n };\n for (const child of node.childNodes) {\n const domElement = buildDomTree(child, parentIframe, false);\n if (domElement) nodeData2.children.push(domElement);\n }\n const id2 = `${ID.current++}`;\n DOM_HASH_MAP[id2] = nodeData2;\n return id2;\n }\n if (node.nodeType !== Node.ELEMENT_NODE && node.nodeType !== Node.TEXT_NODE) {\n return null;\n }\n if (node.nodeType === Node.TEXT_NODE) {\n const textContent = node.textContent?.trim();\n if (!textContent) {\n return null;\n }\n const parentElement = node.parentElement;\n if (!parentElement || parentElement.tagName.toLowerCase() === \"script\") {\n return null;\n }\n const id2 = `${ID.current++}`;\n DOM_HASH_MAP[id2] = {\n type: \"TEXT_NODE\",\n text: textContent,\n isVisible: isTextNodeVisible(node)\n };\n return id2;\n }\n if (node.nodeType === Node.ELEMENT_NODE && !isElementAccepted(node)) {\n return null;\n }\n if (viewportExpansion !== -1 && !node.shadowRoot) {\n const rect = getCachedBoundingRect(node);\n const style = getCachedComputedStyle(node);\n const isFixedOrSticky = style && (style.position === \"fixed\" || style.position === \"sticky\");\n const hasSize = node.offsetWidth > 0 || node.offsetHeight > 0;\n if (!rect || !isFixedOrSticky && !hasSize && (rect.bottom < -viewportExpansion || rect.top > window.innerHeight + viewportExpansion || rect.right < -viewportExpansion || rect.left > window.innerWidth + viewportExpansion)) {\n return null;\n }\n }\n const nodeData = {\n tagName: node.tagName.toLowerCase(),\n attributes: {},\n /**\n * @edit no need for xpath\n */\n // xpath: getXPathTree(node, true),\n children: []\n };\n if (isInteractiveCandidate(node) || node.tagName.toLowerCase() === \"iframe\" || node.tagName.toLowerCase() === \"body\") {\n const attributeNames = node.getAttributeNames?.() || [];\n for (const name of attributeNames) {\n const value = node.getAttribute(name);\n nodeData.attributes[name] = value;\n }\n if (node.tagName.toLowerCase() === \"input\" && (node.type === \"checkbox\" || node.type === \"radio\")) {\n nodeData.attributes.checked = node.checked ? \"true\" : \"false\";\n }\n }\n let nodeWasHighlighted = false;\n if (node.nodeType === Node.ELEMENT_NODE) {\n nodeData.isVisible = isElementVisible(node);\n if (nodeData.isVisible) {\n nodeData.isTopElement = isTopElement(node);\n const role = node.getAttribute(\"role\");\n const isMenuContainer = role === \"menu\" || role === \"menubar\" || role === \"listbox\";\n if (nodeData.isTopElement || isMenuContainer) {\n nodeData.isInteractive = isInteractiveElement(node);\n nodeWasHighlighted = handleHighlighting(nodeData, node, parentIframe, isParentHighlighted);\n nodeData.ref = node;\n }\n }\n }\n if (node.tagName) {\n const tagName = node.tagName.toLowerCase();\n if (tagName === \"iframe\") {\n try {\n const iframeDoc = node.contentDocument || node.contentWindow?.document;\n if (iframeDoc) {\n for (const child of iframeDoc.childNodes) {\n const domElement = buildDomTree(child, node, false);\n if (domElement) nodeData.children.push(domElement);\n }\n }\n } catch (e) {\n console.warn(\"Unable to access iframe:\", e);\n }\n } else if (node.isContentEditable || node.getAttribute(\"contenteditable\") === \"true\" || node.id === \"tinymce\" || node.classList.contains(\"mce-content-body\") || tagName === \"body\" && node.getAttribute(\"data-id\")?.startsWith(\"mce_\")) {\n for (const child of node.childNodes) {\n const domElement = buildDomTree(child, parentIframe, nodeWasHighlighted);\n if (domElement) nodeData.children.push(domElement);\n }\n } else {\n if (node.shadowRoot) {\n nodeData.shadowRoot = true;\n for (const child of node.shadowRoot.childNodes) {\n const domElement = buildDomTree(child, parentIframe, nodeWasHighlighted);\n if (domElement) nodeData.children.push(domElement);\n }\n }\n for (const child of node.childNodes) {\n const passHighlightStatusToChild = nodeWasHighlighted || isParentHighlighted;\n const domElement = buildDomTree(child, parentIframe, passHighlightStatusToChild);\n if (domElement) nodeData.children.push(domElement);\n }\n }\n }\n if (nodeData.tagName === \"a\" && nodeData.children.length === 0 && !nodeData.attributes.href) {\n const rect = getCachedBoundingRect(node);\n const hasSize = rect && rect.width > 0 && rect.height > 0 || node.offsetWidth > 0 || node.offsetHeight > 0;\n if (!hasSize) {\n return null;\n }\n }\n nodeData.extra = extraData.get(node) || null;\n const id = `${ID.current++}`;\n DOM_HASH_MAP[id] = nodeData;\n return id;\n }\n __name(buildDomTree, \"buildDomTree\");\n const rootId = buildDomTree(document.body);\n DOM_CACHE.clearCache();\n return { rootId, map: DOM_HASH_MAP };\n}, \"domTree\");\nconst newElementsCache = /* @__PURE__ */ new WeakMap();\nfunction getFlatTree(config) {\n const interactiveBlacklist = [];\n for (const item of config.interactiveBlacklist || []) {\n if (typeof item === \"function\") {\n interactiveBlacklist.push(item());\n } else {\n interactiveBlacklist.push(item);\n }\n }\n const interactiveWhitelist = [];\n for (const item of config.interactiveWhitelist || []) {\n if (typeof item === \"function\") {\n interactiveWhitelist.push(item());\n } else {\n interactiveWhitelist.push(item);\n }\n }\n const elements = domTree({\n doHighlightElements: true,\n debugMode: true,\n focusHighlightIndex: -1,\n viewportExpansion: VIEWPORT_EXPANSION,\n interactiveBlacklist,\n interactiveWhitelist,\n highlightOpacity: config.highlightOpacity ?? 0,\n highlightLabelOpacity: config.highlightLabelOpacity ?? 0.1\n });\n const currentUrl = window.location.href;\n for (const nodeId in elements.map) {\n const node = elements.map[nodeId];\n if (node.isInteractive && node.ref) {\n const ref = node.ref;\n if (!newElementsCache.has(ref)) {\n newElementsCache.set(ref, currentUrl);\n node.isNew = true;\n }\n }\n }\n return elements;\n}\n__name(getFlatTree, \"getFlatTree\");\nfunction flatTreeToString(flatTree, include_attributes) {\n const DEFAULT_INCLUDE_ATTRIBUTES = [\n \"title\",\n \"type\",\n \"checked\",\n \"name\",\n \"role\",\n \"value\",\n \"placeholder\",\n \"data-date-format\",\n \"alt\",\n \"aria-label\",\n \"aria-expanded\",\n \"data-state\",\n \"aria-checked\",\n // @edit added for better form handling\n \"id\",\n \"for\",\n // for jump check\n \"target\",\n // absolute 定位的下拉菜单\n \"aria-haspopup\",\n \"aria-controls\",\n \"aria-owns\"\n ];\n const includeAttrs = [...include_attributes || [], ...DEFAULT_INCLUDE_ATTRIBUTES];\n const capTextLength = /* @__PURE__ */ __name((text, maxLength) => {\n if (text.length > maxLength) {\n return text.substring(0, maxLength) + \"...\";\n }\n return text;\n }, \"capTextLength\");\n const buildTreeNode = /* @__PURE__ */ __name((nodeId) => {\n const node = flatTree.map[nodeId];\n if (!node) return null;\n if (node.type === \"TEXT_NODE\") {\n const textNode = node;\n return {\n type: \"text\",\n text: textNode.text,\n isVisible: textNode.isVisible,\n parent: null,\n children: []\n };\n } else {\n const elementNode = node;\n const children = [];\n if (elementNode.children) {\n for (const childId of elementNode.children) {\n const child = buildTreeNode(childId);\n if (child) {\n child.parent = null;\n children.push(child);\n }\n }\n }\n return {\n type: \"element\",\n tagName: elementNode.tagName,\n attributes: elementNode.attributes ?? {},\n isVisible: elementNode.isVisible ?? false,\n isInteractive: elementNode.isInteractive ?? false,\n isTopElement: elementNode.isTopElement ?? false,\n isNew: elementNode.isNew ?? false,\n highlightIndex: elementNode.highlightIndex,\n parent: null,\n children,\n extra: elementNode.extra ?? {}\n };\n }\n }, \"buildTreeNode\");\n const setParentReferences = /* @__PURE__ */ __name((node, parent = null) => {\n node.parent = parent;\n for (const child of node.children) {\n setParentReferences(child, node);\n }\n }, \"setParentReferences\");\n const rootNode = buildTreeNode(flatTree.rootId);\n if (!rootNode) return \"\";\n setParentReferences(rootNode);\n const hasParentWithHighlightIndex = /* @__PURE__ */ __name((node) => {\n let current = node.parent;\n while (current) {\n if (current.type === \"element\" && current.highlightIndex !== void 0) {\n return true;\n }\n current = current.parent;\n }\n return false;\n }, \"hasParentWithHighlightIndex\");\n const processNode = /* @__PURE__ */ __name((node, depth, result22) => {\n let nextDepth = depth;\n const depthStr = \"\t\".repeat(depth);\n if (node.type === \"element\") {\n if (node.highlightIndex !== void 0) {\n nextDepth += 1;\n const text = getAllTextTillNextClickableElement(node);\n let attributesHtmlStr = \"\";\n if (includeAttrs.length > 0 && node.attributes) {\n const attributesToInclude = {};\n for (const key of includeAttrs) {\n const value = node.attributes[key];\n if (value && value.trim() !== \"\") {\n attributesToInclude[key] = value.trim();\n }\n }\n const orderedKeys = includeAttrs.filter((key) => key in attributesToInclude);\n if (orderedKeys.length > 1) {\n const keysToRemove = /* @__PURE__ */ new Set();\n const seenValues = {};\n for (const key of orderedKeys) {\n const value = attributesToInclude[key];\n if (value.length > 5) {\n if (value in seenValues) {\n keysToRemove.add(key);\n } else {\n seenValues[value] = key;\n }\n }\n }\n for (const key of keysToRemove) {\n delete attributesToInclude[key];\n }\n }\n if (attributesToInclude.role === node.tagName) {\n delete attributesToInclude.role;\n }\n const attrsToRemoveIfTextMatches = [\"aria-label\", \"placeholder\", \"title\"];\n for (const attr of attrsToRemoveIfTextMatches) {\n if (attributesToInclude[attr] && attributesToInclude[attr].toLowerCase().trim() === text.toLowerCase().trim()) {\n delete attributesToInclude[attr];\n }\n }\n if (Object.keys(attributesToInclude).length > 0) {\n attributesHtmlStr = Object.entries(attributesToInclude).map(([key, value]) => `${key}=${capTextLength(value, 20)}`).join(\" \");\n }\n }\n const highlightIndicator = node.isNew ? `*[${node.highlightIndex}]` : `[${node.highlightIndex}]`;\n let line = `${depthStr}${highlightIndicator}<${node.tagName ?? \"\"}`;\n if (attributesHtmlStr) {\n line += ` ${attributesHtmlStr}`;\n }\n if (node.extra) {\n if (node.extra.scrollable) {\n let scrollDataText = \"\";\n if (node.extra.scrollData?.left)\n scrollDataText += `left=${node.extra.scrollData.left}, `;\n if (node.extra.scrollData?.top) scrollDataText += `top=${node.extra.scrollData.top}, `;\n if (node.extra.scrollData?.right)\n scrollDataText += `right=${node.extra.scrollData.right}, `;\n if (node.extra.scrollData?.bottom)\n scrollDataText += `bottom=${node.extra.scrollData.bottom}`;\n line += ` data-scrollable=\"${scrollDataText}\"`;\n }\n }\n if (text) {\n const trimmedText = text.trim();\n if (!attributesHtmlStr) {\n line += \" \";\n }\n line += `>${trimmedText}`;\n } else if (!attributesHtmlStr) {\n line += \" \";\n }\n line += \" />\";\n result22.push(line);\n }\n for (const child of node.children) {\n processNode(child, nextDepth, result22);\n }\n } else if (node.type === \"text\") {\n if (hasParentWithHighlightIndex(node)) {\n return;\n }\n if (node.parent && node.parent.type === \"element\" && node.parent.isVisible && node.parent.isTopElement) {\n result22.push(`${depthStr}${node.text ?? \"\"}`);\n }\n }\n }, \"processNode\");\n const result2 = [];\n processNode(rootNode, 0, result2);\n return result2.join(\"\\n\");\n}\n__name(flatTreeToString, \"flatTreeToString\");\nconst getAllTextTillNextClickableElement = /* @__PURE__ */ __name((node, maxDepth = -1) => {\n const textParts = [];\n const collectText = /* @__PURE__ */ __name((currentNode, currentDepth) => {\n if (maxDepth !== -1 && currentDepth > maxDepth) {\n return;\n }\n if (currentNode.type === \"element\" && currentNode !== node && currentNode.highlightIndex !== void 0) {\n return;\n }\n if (currentNode.type === \"text\" && currentNode.text) {\n textParts.push(currentNode.text);\n } else if (currentNode.type === \"element\") {\n for (const child of currentNode.children) {\n collectText(child, currentDepth + 1);\n }\n }\n }, \"collectText\");\n collectText(node, 0);\n return textParts.join(\"\\n\").trim();\n}, \"getAllTextTillNextClickableElement\");\nfunction getSelectorMap(flatTree) {\n const selectorMap = /* @__PURE__ */ new Map();\n const keys = Object.keys(flatTree.map);\n for (const key of keys) {\n const node = flatTree.map[key];\n if (node.isInteractive && typeof node.highlightIndex === \"number\") {\n selectorMap.set(node.highlightIndex, node);\n }\n }\n return selectorMap;\n}\n__name(getSelectorMap, \"getSelectorMap\");\nfunction getElementTextMap(simplifiedHTML) {\n const lines = simplifiedHTML.split(\"\\n\").map((line) => line.trim()).filter((line) => line.length > 0);\n const elementTextMap = /* @__PURE__ */ new Map();\n for (const line of lines) {\n const regex = /^\\[(\\d+)\\]<[^>]+>([^<]*)/;\n const match = regex.exec(line);\n if (match) {\n const index = parseInt(match[1], 10);\n elementTextMap.set(index, line);\n }\n }\n return elementTextMap;\n}\n__name(getElementTextMap, \"getElementTextMap\");\nfunction cleanUpHighlights() {\n const cleanupFunctions = window._highlightCleanupFunctions || [];\n for (const cleanup of cleanupFunctions) {\n if (typeof cleanup === \"function\") {\n cleanup();\n }\n }\n window._highlightCleanupFunctions = [];\n}\n__name(cleanUpHighlights, \"cleanUpHighlights\");\nwindow.addEventListener(\"popstate\", () => {\n cleanUpHighlights();\n});\nwindow.addEventListener(\"hashchange\", () => {\n cleanUpHighlights();\n});\nwindow.addEventListener(\"beforeunload\", () => {\n cleanUpHighlights();\n});\nconst navigation = window.navigation;\nif (navigation && typeof navigation.addEventListener === \"function\") {\n navigation.addEventListener(\"navigate\", () => {\n cleanUpHighlights();\n });\n} else {\n let currentUrl = window.location.href;\n setInterval(() => {\n if (window.location.href !== currentUrl) {\n currentUrl = window.location.href;\n cleanUpHighlights();\n }\n }, 500);\n}\nfunction getPageInfo() {\n const viewport_width = window.innerWidth;\n const viewport_height = window.innerHeight;\n const page_width = Math.max(document.documentElement.scrollWidth, document.body.scrollWidth || 0);\n const page_height = Math.max(\n document.documentElement.scrollHeight,\n document.body.scrollHeight || 0\n );\n const scroll_x = window.scrollX || window.pageXOffset || document.documentElement.scrollLeft || 0;\n const scroll_y = window.scrollY || window.pageYOffset || document.documentElement.scrollTop || 0;\n const pixels_below = Math.max(0, page_height - (window.innerHeight + scroll_y));\n const pixels_right = Math.max(0, page_width - (window.innerWidth + scroll_x));\n return {\n // Current viewport dimensions\n viewport_width,\n viewport_height,\n // Total page dimensions\n page_width,\n page_height,\n // Current scroll position\n scroll_x,\n scroll_y,\n pixels_above: scroll_y,\n pixels_below,\n pages_above: viewport_height > 0 ? scroll_y / viewport_height : 0,\n pages_below: viewport_height > 0 ? pixels_below / viewport_height : 0,\n total_pages: viewport_height > 0 ? page_height / viewport_height : 0,\n current_page_position: scroll_y / Math.max(1, page_height - viewport_height),\n pixels_left: scroll_x,\n pixels_right\n };\n}\n__name(getPageInfo, \"getPageInfo\");\nfunction patchReact(pageController) {\n const reactRootElements = document.querySelectorAll(\n '[data-reactroot], [data-reactid], [data-react-checksum], #root, #app, [id^=\"root-\"], [id^=\"app-\"], #adex-wrapper, #adex-root'\n );\n for (const element of reactRootElements) {\n element.setAttribute(\"data-page-agent-not-interactive\", \"true\");\n }\n}\n__name(patchReact, \"patchReact\");\nconst _PageController = class _PageController extends EventTarget {\n config;\n /** Corresponds to eval_page in browser-use */\n flatTree = null;\n /**\n * All highlighted index-mapped interactive elements\n * Corresponds to DOMState.selector_map in browser-use\n */\n selectorMap = /* @__PURE__ */ new Map();\n /** Index -> element text description mapping */\n elementTextMap = /* @__PURE__ */ new Map();\n /**\n * Simplified HTML for LLM consumption.\n * Corresponds to clickable_elements_to_string in browser-use\n */\n simplifiedHTML = \"<EMPTY>\";\n /** last time the tree was updated */\n lastTimeUpdate = 0;\n constructor(config = {}) {\n super();\n this.config = config;\n patchReact();\n }\n // ======= State Queries =======\n /**\n * Get current page URL\n */\n async getCurrentUrl() {\n return window.location.href;\n }\n /**\n * Get current page title\n */\n async getPageTitle() {\n return document.title;\n }\n /**\n * Get page scroll and size info\n */\n async getPageInfo() {\n return getPageInfo();\n }\n /**\n * Get the simplified HTML representation of the page.\n * This is used by LLM to understand the page structure.\n */\n async getSimplifiedHTML() {\n return this.simplifiedHTML;\n }\n /**\n * Get text description for an element by index\n */\n async getElementText(index) {\n return this.elementTextMap.get(index);\n }\n /**\n * Get total number of indexed interactive elements\n */\n async getElementCount() {\n return this.selectorMap.size;\n }\n /**\n * Get last tree update timestamp\n */\n async getLastUpdateTime() {\n return this.lastTimeUpdate;\n }\n /**\n * Get the viewport expansion setting\n */\n async getViewportExpansion() {\n return this.config.viewportExpansion ?? VIEWPORT_EXPANSION;\n }\n // ======= DOM Tree Operations =======\n /**\n * Update DOM tree, returns simplified HTML for LLM.\n * This is the main method to refresh the page state.\n */\n async updateTree() {\n this.dispatchEvent(new Event(\"beforeUpdate\"));\n this.lastTimeUpdate = Date.now();\n cleanUpHighlights();\n const blacklist = [\n ...this.config.interactiveBlacklist || [],\n ...document.querySelectorAll(\"[data-page-agent-not-interactive]\").values()\n ];\n this.flatTree = getFlatTree({\n ...this.config,\n interactiveBlacklist: blacklist\n });\n this.simplifiedHTML = flatTreeToString(this.flatTree, this.config.include_attributes);\n this.selectorMap.clear();\n this.selectorMap = getSelectorMap(this.flatTree);\n this.elementTextMap.clear();\n this.elementTextMap = getElementTextMap(this.simplifiedHTML);\n this.dispatchEvent(new Event(\"afterUpdate\"));\n return this.simplifiedHTML;\n }\n /**\n * Clean up all element highlights\n */\n async cleanUpHighlights() {\n cleanUpHighlights();\n }\n // ======= Element Actions =======\n /**\n * Click element by index\n */\n async clickElement(index) {\n try {\n const element = getElementByIndex(this.selectorMap, index);\n const elemText = this.elementTextMap.get(index);\n await clickElement(element);\n if (element instanceof HTMLAnchorElement && element.target === \"_blank\") {\n return {\n success: true,\n message: `✅ Clicked element (${elemText ?? index}). ⚠️ Link opens in a new tab. You are not capable of reading new tabs.`\n };\n }\n return {\n success: true,\n message: `✅ Clicked element (${elemText ?? index}).`\n };\n } catch (error) {\n return {\n success: false,\n message: `❌ Failed to click element: ${error}`\n };\n }\n }\n /**\n * Input text into element by index\n */\n async inputText(index, text) {\n try {\n const element = getElementByIndex(this.selectorMap, index);\n const elemText = this.elementTextMap.get(index);\n await inputTextElement(element, text);\n return {\n success: true,\n message: `✅ Input text (${text}) into element (${elemText ?? index}).`\n };\n } catch (error) {\n return {\n success: false,\n message: `❌ Failed to input text: ${error}`\n };\n }\n }\n /**\n * Select dropdown option by index and option text\n */\n async selectOption(index, optionText) {\n try {\n const element = getElementByIndex(this.selectorMap, index);\n const elemText = this.elementTextMap.get(index);\n await selectOptionElement(element, optionText);\n return {\n success: true,\n message: `✅ Selected option (${optionText}) in element (${elemText ?? index}).`\n };\n } catch (error) {\n return {\n success: false,\n message: `❌ Failed to select option: ${error}`\n };\n }\n }\n /**\n * Scroll vertically\n */\n async scroll(options) {\n try {\n const { down, numPages, pixels, index } = options;\n const scrollAmount = pixels ?? numPages * (down ? 1 : -1) * window.innerHeight;\n const element = index !== void 0 ? getElementByIndex(this.selectorMap, index) : null;\n const message = await scrollVertically(down, scrollAmount, element);\n return {\n success: true,\n message\n };\n } catch (error) {\n return {\n success: false,\n message: `❌ Failed to scroll: ${error}`\n };\n }\n }\n /**\n * Scroll horizontally\n */\n async scrollHorizontally(options) {\n try {\n const { right, pixels, index } = options;\n const scrollAmount = pixels * (right ? 1 : -1);\n const element = index !== void 0 ? getElementByIndex(this.selectorMap, index) : null;\n const message = await scrollHorizontally(right, scrollAmount, element);\n return {\n success: true,\n message\n };\n } catch (error) {\n return {\n success: false,\n message: `❌ Failed to scroll horizontally: ${error}`\n };\n }\n }\n /**\n * Execute arbitrary JavaScript on the page\n */\n async executeJavascript(script) {\n try {\n const asyncFunction = eval(`(async () => { ${script} })`);\n const result = await asyncFunction();\n return {\n success: true,\n message: `✅ Executed JavaScript. Result: ${result}`\n };\n } catch (error) {\n return {\n success: false,\n message: `❌ Error executing JavaScript: ${error}`\n };\n }\n }\n /**\n * Dispose and clean up resources\n */\n dispose() {\n cleanUpHighlights();\n this.flatTree = null;\n this.selectorMap.clear();\n this.elementTextMap.clear();\n this.simplifiedHTML = \"<EMPTY>\";\n }\n};\n__name(_PageController, \"PageController\");\nlet PageController = _PageController;\nexport {\n PageController\n};\n//# sourceMappingURL=page-controller.js.map\n","// Dev environment: use .env config if available, otherwise fallback to testing api\nexport const DEFAULT_MODEL_NAME: string =\n\timport.meta.env.DEV && import.meta.env.LLM_MODEL_NAME\n\t\t? import.meta.env.LLM_MODEL_NAME\n\t\t: 'PAGE-AGENT-FREE-TESTING-RANDOM'\n\nexport const DEFAULT_API_KEY: string =\n\timport.meta.env.DEV && import.meta.env.LLM_API_KEY\n\t\t? import.meta.env.LLM_API_KEY\n\t\t: 'PAGE-AGENT-FREE-TESTING-RANDOM'\n\nexport const DEFAULT_BASE_URL: string =\n\timport.meta.env.DEV && import.meta.env.LLM_BASE_URL\n\t\t? import.meta.env.LLM_BASE_URL\n\t\t: 'https://hwcxiuzfylggtcktqgij.supabase.co/functions/v1/llm-testing-proxy'\n\n// internal\n\nexport const LLM_MAX_RETRIES = 2\nexport const MAX_STEPS = 20\nexport const DEFAULT_TEMPERATURE = 0.7 // higher randomness helps auto-recovery\nexport const DEFAULT_MAX_TOKENS = 4096\n","// English translations (base/reference language)\nconst enUS = {\n\tui: {\n\t\tpanel: {\n\t\t\tready: 'Ready',\n\t\t\tthinking: 'Thinking...',\n\t\t\tpaused: 'Paused',\n\t\t\ttaskInput: 'Enter new task, describe steps in detail, press Enter to submit',\n\t\t\tuserAnswerPrompt: 'Please answer the question above, press Enter to submit',\n\t\t\ttaskTerminated: 'Task terminated',\n\t\t\ttaskCompleted: 'Task completed',\n\t\t\tcontinueExecution: 'Continue execution',\n\t\t\tuserAnswer: 'User answer: {{input}}',\n\t\t\tquestion: 'Question: {{question}}',\n\t\t\twaitingPlaceholder: 'Waiting for task to start...',\n\t\t\tpause: 'Pause',\n\t\t\tcontinue: 'Continue',\n\t\t\tstop: 'Stop',\n\t\t\texpand: 'Expand history',\n\t\t\tcollapse: 'Collapse history',\n\t\t\tstep: 'Step {{number}} · {{time}}{{duration}}',\n\t\t},\n\t\ttools: {\n\t\t\tclicking: 'Clicking element [{{index}}]...',\n\t\t\tinputting: 'Inputting text to element [{{index}}]...',\n\t\t\tselecting: 'Selecting option \"{{text}}\"...',\n\t\t\tscrolling: 'Scrolling page...',\n\t\t\twaiting: 'Waiting {{seconds}} seconds...',\n\t\t\tdone: 'Task done',\n\t\t\tclicked: '🖱️ Clicked element [{{index}}]',\n\t\t\tinputted: '⌨️ Inputted text \"{{text}}\"',\n\t\t\tselected: '☑️ Selected option \"{{text}}\"',\n\t\t\tscrolled: '🛞 Page scrolled',\n\t\t\twaited: '⌛️ Wait completed',\n\t\t\texecuting: 'Executing {{toolName}}...',\n\t\t\tresultSuccess: 'success',\n\t\t\tresultFailure: 'failed',\n\t\t\tresultError: 'error',\n\t\t},\n\t\terrors: {\n\t\t\telementNotFound: 'No interactive element found at index {{index}}',\n\t\t\ttaskRequired: 'Task description is required',\n\t\t\texecutionFailed: 'Task execution failed',\n\t\t\tnotInputElement: 'Element is not an input or textarea',\n\t\t\tnotSelectElement: 'Element is not a select element',\n\t\t\toptionNotFound: 'Option \"{{text}}\" not found',\n\t\t},\n\t},\n} as const\n\n// Chinese translations (must match the structure of enUS)\nconst zhCN = {\n\tui: {\n\t\tpanel: {\n\t\t\tready: '准备就绪',\n\t\t\tthinking: '正在思考...',\n\t\t\tpaused: '暂停中,稍后',\n\t\t\ttaskInput: '输入新任务,详细描述步骤,回车提交',\n\t\t\tuserAnswerPrompt: '请回答上面问题,回车提交',\n\t\t\ttaskTerminated: '任务已终止',\n\t\t\ttaskCompleted: '任务结束',\n\t\t\tcontinueExecution: '继续执行',\n\t\t\tuserAnswer: '用户回答: {{input}}',\n\t\t\tquestion: '询问: {{question}}',\n\t\t\twaitingPlaceholder: '等待任务开始...',\n\t\t\tpause: '暂停',\n\t\t\tcontinue: '继续',\n\t\t\tstop: '终止',\n\t\t\texpand: '展开历史',\n\t\t\tcollapse: '收起历史',\n\t\t\tstep: '步骤 {{number}} · {{time}}{{duration}}',\n\t\t},\n\t\ttools: {\n\t\t\tclicking: '正在点击元素 [{{index}}]...',\n\t\t\tinputting: '正在输入文本到元素 [{{index}}]...',\n\t\t\tselecting: '正在选择选项 \"{{text}}\"...',\n\t\t\tscrolling: '正在滚动页面...',\n\t\t\twaiting: '等待 {{seconds}} 秒...',\n\t\t\tdone: '结束任务',\n\t\t\tclicked: '🖱️ 已点击元素 [{{index}}]',\n\t\t\tinputted: '⌨️ 已输入文本 \"{{text}}\"',\n\t\t\tselected: '☑️ 已选择选项 \"{{text}}\"',\n\t\t\tscrolled: '🛞 页面滚动完成',\n\t\t\twaited: '⌛️ 等待完成',\n\t\t\texecuting: '正在执行 {{toolName}}...',\n\t\t\tresultSuccess: '成功',\n\t\t\tresultFailure: '失败',\n\t\t\tresultError: '错误',\n\t\t},\n\t\terrors: {\n\t\t\telementNotFound: '未找到索引为 {{index}} 的交互元素',\n\t\t\ttaskRequired: '任务描述不能为空',\n\t\t\texecutionFailed: '任务执行失败',\n\t\t\tnotInputElement: '元素不是输入框或文本域',\n\t\t\tnotSelectElement: '元素不是选择框',\n\t\t\toptionNotFound: '未找到选项 \"{{text}}\"',\n\t\t},\n\t},\n} as const\n\n// Type definitions generated from English base structure (but with string values)\ntype DeepStringify<T> = {\n\t[K in keyof T]: T[K] extends string ? string : T[K] extends object ? DeepStringify<T[K]> : T[K]\n}\n\nexport type TranslationSchema = DeepStringify<typeof enUS>\n\n// Utility type: Extract all nested paths from translation object\ntype NestedKeyOf<ObjectType extends object> = {\n\t[Key in keyof ObjectType & (string | number)]: ObjectType[Key] extends object\n\t\t? `${Key}` | `${Key}.${NestedKeyOf<ObjectType[Key]>}`\n\t\t: `${Key}`\n}[keyof ObjectType & (string | number)]\n\n// Extract all possible key paths from translation structure\nexport type TranslationKey = NestedKeyOf<TranslationSchema>\n\n// Parameterized translation types\nexport type TranslationParams = Record<string, string | number>\n\nexport const locales = {\n\t'en-US': enUS,\n\t'zh-CN': zhCN,\n} as const\n\nexport type SupportedLanguage = keyof typeof locales\n","import {\n\ttype SupportedLanguage,\n\ttype TranslationKey,\n\ttype TranslationParams,\n\ttype TranslationSchema,\n\tlocales,\n} from './locales'\n\nexport class I18n {\n\tprivate language: SupportedLanguage\n\tprivate translations: TranslationSchema\n\n\tconstructor(language: SupportedLanguage = 'en-US') {\n\t\tthis.language = language in locales ? language : 'en-US'\n\t\tthis.translations = locales[language]\n\t}\n\n\t// 类型安全的翻译方法\n\tt(key: TranslationKey, params?: TranslationParams): string {\n\t\tconst value = this.getNestedValue(this.translations, key)\n\t\tif (!value) {\n\t\t\tconsole.warn(`Translation key \"${key}\" not found for language \"${this.language}\"`)\n\t\t\treturn key\n\t\t}\n\n\t\tif (params) {\n\t\t\treturn this.interpolate(value, params)\n\t\t}\n\t\treturn value\n\t}\n\n\tprivate getNestedValue(obj: any, path: string): string | undefined {\n\t\treturn path.split('.').reduce((current, key) => current?.[key], obj)\n\t}\n\n\tprivate interpolate(template: string, params: TranslationParams): string {\n\t\treturn template.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key) => {\n\t\t\t// Use != null to check for both null and undefined, allow empty strings\n\t\t\treturn params[key] != null ? params[key].toString() : match\n\t\t})\n\t}\n\n\tgetLanguage(): SupportedLanguage {\n\t\treturn this.language\n\t}\n}\n\n// 导出类型和实例创建函数\nexport type { TranslationKey, SupportedLanguage, TranslationParams }\nexport { locales }\n","import type { PageControllerConfig } from '@page-agent/page-controller'\n\nimport type { AgentHistory, ExecutionResult, PageAgent } from '../PageAgent'\nimport type { SupportedLanguage } from '../i18n'\nimport type { PageAgentTool } from '../tools'\nimport {\n\tDEFAULT_API_KEY,\n\tDEFAULT_BASE_URL,\n\tDEFAULT_MAX_TOKENS,\n\tDEFAULT_MODEL_NAME,\n\tDEFAULT_TEMPERATURE,\n\tLLM_MAX_RETRIES,\n} from './constants'\n\nexport interface LLMConfig {\n\tbaseURL?: string\n\tapiKey?: string\n\tmodel?: string\n\ttemperature?: number\n\tmaxTokens?: number\n\tmaxRetries?: number\n}\n\nexport interface AgentConfig {\n\t// theme?: 'light' | 'dark'\n\tlanguage?: SupportedLanguage\n\n\t/**\n\t * Custom tools to extend PageAgent capabilities\n\t * @experimental\n\t * @note You can also override or remove internal tools by using the same name.\n\t * @see [tools](../tools/index.ts)\n\t *\n\t * @example\n\t * // override internal tool\n\t * import { tool } from 'page-agent'\n\t * const customTools = {\n\t * ask_user: tool({\n\t * \tdescription:\n\t * \t\t'Ask the user or parent model a question and wait for their answer. Use this if you need more information or clarification.',\n\t * \tinputSchema: zod.object({\n\t * \t\tquestion: zod.string(),\n\t * \t}),\n\t * \texecute: async function (this: PageAgent, input) {\n\t * \t\tconst answer = await do_some_thing(input.question)\n\t * \t\treturn \"✅ Received user answer: \" + answer\n\t * \t},\n\t * })\n\t * }\n\t *\n\t * @example\n\t * // remove internal tool\n\t * const customTools = {\n\t * \task_user: null // never ask user questions\n\t * }\n\t */\n\tcustomTools?: Record<string, PageAgentTool | null>\n\n\t// lifecycle hooks\n\t// @todo: use event instead of hooks\n\n\tonBeforeStep?: (this: PageAgent, stepCnt: number) => Promise<void> | void\n\tonAfterStep?: (this: PageAgent, stepCnt: number, history: AgentHistory[]) => Promise<void> | void\n\tonBeforeTask?: (this: PageAgent) => Promise<void> | void\n\tonAfterTask?: (this: PageAgent, result: ExecutionResult) => Promise<void> | void\n\n\t/**\n\t * @note this hook can block the disposal process\n\t * @note when dispose caused by page unload, reason will be 'PAGE_UNLOADING'. this method CANNOT block unloading. async operations may be cut.\n\t */\n\tonDispose?: (this: PageAgent, reason?: string) => void\n\n\t// page behavior hooks\n\n\t/**\n\t * @experimental\n\t * Enable the experimental script execution tool that allows executing generated JavaScript code on the page.\n\t * @note Can cause unpredictable side effects.\n\t * @note May bypass some safe guards and data-masking mechanisms.\n\t */\n\texperimentalScriptExecutionTool?: boolean\n\n\t/**\n\t * TODO: @unimplemented\n\t * hook when action causes a new page to be opened\n\t * @note PageAgent will try to detect new pages and decide if it's caused by an action. But not very reliable.\n\t */\n\tonNewPageOpen?: (this: PageAgent, url: string) => Promise<void> | void\n\n\t/**\n\t * TODO: @unimplemented\n\t * try to navigate to a new page instead of opening a new tab/window.\n\t * @note will unload the current page when a action tries to open a new page. so that things keep in the same tab/window.\n\t */\n\texperimentalPreventNewPage?: boolean\n}\n\nexport type PageAgentConfig = LLMConfig & AgentConfig & PageControllerConfig\n\nexport function parseLLMConfig(config: LLMConfig): Required<LLMConfig> {\n\treturn {\n\t\tbaseURL: config.baseURL ?? DEFAULT_BASE_URL,\n\t\tapiKey: config.apiKey ?? DEFAULT_API_KEY,\n\t\tmodel: config.model ?? DEFAULT_MODEL_NAME,\n\t\ttemperature: config.temperature ?? DEFAULT_TEMPERATURE,\n\t\tmaxTokens: config.maxTokens ?? DEFAULT_MAX_TOKENS,\n\t\tmaxRetries: config.maxRetries ?? LLM_MAX_RETRIES,\n\t}\n}\n","/**\n * Type-safe event bus for decoupling PageAgent and Panel\n */\nimport type { Step } from '../ui/UIState'\n\n/**\n * Event mapping definitions\n * @note Event bus callbacks must be repeatable without errors\n */\nexport interface PageAgentEventMap {\n\t// Panel control events\n\t// call panel.show()\n\t'panel:show': { params: undefined }\n\t// call panel.hide()\n\t'panel:hide': { params: undefined }\n\t// call panel.reset()\n\t'panel:reset': { params: undefined }\n\t// call panel.update()\n\t'panel:update': { params: Omit<Step, 'id' | 'stepNumber' | 'timestamp'> }\n\t// call panel.expand()\n\t'panel:expand': { params: undefined }\n\t// call panel.collapse()\n\t'panel:collapse': { params: undefined }\n\n\t// PageAgent status events\n\t// 'agent:execute': { params: { task: string } }\n\t// 'agent:done': { params: { text: string; success: boolean } }\n\t// 'agent:paused': { params: undefined }\n\t// 'agent:resumed': { params: undefined }\n\t// 'agent:disposed': { params: undefined }\n\t// 'agent:error': { params: { error: string | Error } }\n\n\t// Task status change events\n\t// 'task:start': { params: { task: string } }\n\t// 'task:step': { params: Omit<AgentStep, 'id' | 'stepNumber' | 'timestamp'> }\n\t// 'task:complete': { params: { text: string; success: boolean } }\n\t// 'task:error': { params: { error: string | Error } }\n\n\t// Index signature for dynamic event names\n\t// [key: string]: { params: any }\n}\n\n/**\n * Event handler type definitions\n */\nexport type EventHandler<T extends keyof PageAgentEventMap> =\n\tPageAgentEventMap[T]['params'] extends undefined\n\t\t? () => void\n\t\t: (params: PageAgentEventMap[T]['params']) => void\n\n/**\n * Async event handler type definitions\n */\nexport type AsyncEventHandler<T extends keyof PageAgentEventMap> =\n\tPageAgentEventMap[T]['params'] extends undefined\n\t\t? () => Promise<void>\n\t\t: (params: PageAgentEventMap[T]['params']) => Promise<void>\n\n/**\n * Type-safe event bus\n * @note Mainly used to decouple logic and UI\n * @note All modules of a PageAgent instance share the same EventBus instance for communication\n * @note Use with caution if delivery guarantee is needed for logic communication\n * @note `on` `once` `emit` methods handle built-in events with type protection, use `addEventListener` for other events\n */\nclass EventBus extends EventTarget {\n\t/**\n\t * Listen to built-in events\n\t */\n\ton<T extends keyof PageAgentEventMap>(event: T, handler: EventHandler<T>): void {\n\t\tconst wrappedHandler = (e: Event) => {\n\t\t\tconst customEvent = e as CustomEvent\n\t\t\tconst params = customEvent.detail?.[0]\n\t\t\treturn handler(params)\n\t\t}\n\t\tthis.addEventListener(event, wrappedHandler)\n\t}\n\n\t/**\n\t * Listen to built-in events (one-time)\n\t */\n\tonce<T extends keyof PageAgentEventMap>(event: T, handler: EventHandler<T>): void {\n\t\tconst wrappedHandler = (e: Event) => {\n\t\t\tconst customEvent = e as CustomEvent\n\t\t\tconst params = customEvent.detail?.[0]\n\t\t\treturn handler(params)\n\t\t}\n\t\tthis.addEventListener(event, wrappedHandler, { once: true })\n\t}\n\n\t/**\n\t * Emit built-in events\n\t */\n\temit<T extends keyof PageAgentEventMap>(\n\t\tevent: T,\n\t\t...args: PageAgentEventMap[T]['params'] extends undefined\n\t\t\t? []\n\t\t\t: [PageAgentEventMap[T]['params']]\n\t): void {\n\t\tconst customEvent = new CustomEvent(event, { detail: args })\n\t\tthis.dispatchEvent(customEvent)\n\t\treturn\n\t}\n}\n\nconst buses = new Map<string, EventBus>()\n\n/**\n * Get the event bus for a given channel\n */\nexport function getEventBus(channel: string) {\n\tif (buses.has(channel)) {\n\t\treturn buses.get(channel)!\n\t}\n\tconst bus = new EventBus()\n\tbuses.set(channel, bus)\n\treturn bus\n}\n\nexport type { EventBus }\n","/**\n * Error types and error handling for LLM invocations\n */\n\nexport const InvokeErrorType = {\n\t// Retryable\n\tNETWORK_ERROR: 'network_error', // Network error, retry\n\tRATE_LIMIT: 'rate_limit', // Rate limit, retry\n\tSERVER_ERROR: 'server_error', // 5xx, retry\n\tNO_TOOL_CALL: 'no_tool_call', // Model did not call tool\n\tINVALID_TOOL_ARGS: 'invalid_tool_args', // Tool args don't match schema\n\tTOOL_EXECUTION_ERROR: 'tool_execution_error', // Tool execution error\n\n\tUNKNOWN: 'unknown',\n\n\t// Non-retryable\n\tAUTH_ERROR: 'auth_error', // Authentication failed\n\tCONTEXT_LENGTH: 'context_length', // Prompt too long\n\tCONTENT_FILTER: 'content_filter', // Content filtered\n} as const\n\nexport type InvokeErrorType = (typeof InvokeErrorType)[keyof typeof InvokeErrorType]\n\nexport class InvokeError extends Error {\n\ttype: InvokeErrorType\n\tretryable: boolean\n\tstatusCode?: number\n\trawError?: unknown\n\n\tconstructor(type: InvokeErrorType, message: string, rawError?: unknown) {\n\t\tsuper(message)\n\t\tthis.name = 'InvokeError'\n\t\tthis.type = type\n\t\tthis.retryable = this.isRetryable(type)\n\t\tthis.rawError = rawError\n\t}\n\n\tprivate isRetryable(type: InvokeErrorType): boolean {\n\t\tconst retryableTypes: InvokeErrorType[] = [\n\t\t\tInvokeErrorType.NETWORK_ERROR,\n\t\t\tInvokeErrorType.RATE_LIMIT,\n\t\t\tInvokeErrorType.SERVER_ERROR,\n\t\t\tInvokeErrorType.NO_TOOL_CALL,\n\t\t\tInvokeErrorType.INVALID_TOOL_ARGS,\n\t\t\tInvokeErrorType.TOOL_EXECUTION_ERROR,\n\t\t\tInvokeErrorType.UNKNOWN,\n\t\t]\n\t\treturn retryableTypes.includes(type)\n\t}\n}\n","/**\n * Utility functions for LLM integration\n */\nimport chalk from 'chalk'\nimport { z } from 'zod'\n\nimport type { MacroToolInput } from '../PageAgent'\nimport { InvokeError, InvokeErrorType } from './errors'\nimport type { Tool } from './types'\n\n/**\n * Convert Zod schema to OpenAI tool format\n * Uses Zod 4 native z.toJSONSchema()\n */\nexport function zodToOpenAITool(name: string, tool: Tool) {\n\treturn {\n\t\ttype: 'function' as const,\n\t\tfunction: {\n\t\t\tname,\n\t\t\tdescription: tool.description,\n\t\t\tparameters: z.toJSONSchema(tool.inputSchema, { target: 'openapi-3.0' }),\n\t\t},\n\t}\n}\n\n/**\n * Although some models cannot guarantee correct response. Common issues are fixable:\n * - Instead of returning a proper tool call. Return the tool call parameters in the message content.\n * - Returned tool calls or messages don't follow the nested MacroToolInput format.\n */\nexport function lenientParseMacroToolCall(\n\tresponseData: any,\n\tinputSchema: z.ZodObject<MacroToolInput & Record<string, any>>\n): MacroToolInput {\n\t// check\n\tconst choice = responseData.choices?.[0]\n\tif (!choice) {\n\t\tthrow new InvokeError(InvokeErrorType.UNKNOWN, 'No choices in response', responseData)\n\t}\n\n\t// check\n\tswitch (choice.finish_reason) {\n\t\tcase 'tool_calls':\n\t\tcase 'function_call': // gemini\n\t\tcase 'stop': // will try a robust parse\n\t\t\t// ✅ Normal\n\t\t\tbreak\n\t\tcase 'length':\n\t\t\t// ⚠️ Token limit reached\n\t\t\tthrow new InvokeError(\n\t\t\t\tInvokeErrorType.CONTEXT_LENGTH,\n\t\t\t\t'Response truncated: max tokens reached'\n\t\t\t)\n\t\tcase 'content_filter':\n\t\t\t// ❌ Content filtered\n\t\t\tthrow new InvokeError(InvokeErrorType.CONTENT_FILTER, 'Content filtered by safety system')\n\t\tdefault:\n\t\t\tthrow new InvokeError(\n\t\t\t\tInvokeErrorType.UNKNOWN,\n\t\t\t\t`Unexpected finish_reason: ${choice.finish_reason}`\n\t\t\t)\n\t}\n\n\t// Extract action schema from MacroToolInput schema\n\tconst actionSchema = inputSchema.shape.action\n\tif (!actionSchema) {\n\t\tthrow new Error('inputSchema must have an \"action\" field')\n\t}\n\n\t// patch stopReason mis-format\n\n\tlet arg: string | null = null\n\n\t// try to use tool call\n\tconst toolCall = choice.message?.tool_calls?.[0]?.function\n\targ = toolCall?.arguments ?? null\n\n\tif (arg && toolCall.name !== 'AgentOutput') {\n\t\t// TODO: check if toolCall.name is a valid action name\n\t\t// case: instead of AgentOutput, the model returned a action name as tool call\n\t\tconsole.log(chalk.yellow('lenientParseMacroToolCall: #1 fixing incorrect tool call'))\n\t\tlet tmpArg\n\t\ttry {\n\t\t\ttmpArg = JSON.parse(arg)\n\t\t} catch (error) {\n\t\t\tthrow new InvokeError(\n\t\t\t\tInvokeErrorType.INVALID_TOOL_ARGS,\n\t\t\t\t'Failed to parse tool arguments as JSON',\n\t\t\t\terror\n\t\t\t)\n\t\t}\n\t\targ = JSON.stringify({ action: { [toolCall.name]: tmpArg } })\n\t}\n\n\tif (!arg) {\n\t\t// try to use message content as JSON\n\t\targ = choice.message?.content.trim() || null\n\t}\n\n\tif (!arg) {\n\t\tthrow new InvokeError(\n\t\t\tInvokeErrorType.NO_TOOL_CALL,\n\t\t\t'No tool call or content found in response',\n\t\t\tresponseData\n\t\t)\n\t}\n\n\t// make sure is valid JSON\n\n\tlet parsedArgs: any\n\ttry {\n\t\tparsedArgs = JSON.parse(arg)\n\t} catch (error) {\n\t\tthrow new InvokeError(\n\t\t\tInvokeErrorType.INVALID_TOOL_ARGS,\n\t\t\t'Failed to parse tool arguments as JSON',\n\t\t\terror\n\t\t)\n\t}\n\n\t// patch incomplete formats\n\n\tif (parsedArgs.action || parsedArgs.evaluation_previous_goal || parsedArgs.next_goal) {\n\t\t// case: nested MacroToolInput format (correct format)\n\n\t\t// some models may give a empty action (they may think reasoning and action should be separate)\n\t\tif (!parsedArgs.action) {\n\t\t\tconsole.log(chalk.yellow('lenientParseMacroToolCall: #2 fixing incorrect tool call'))\n\t\t\tparsedArgs.action = {\n\t\t\t\twait: { seconds: 1 },\n\t\t\t}\n\t\t}\n\t} else if (parsedArgs.type && parsedArgs.function) {\n\t\t// case: upper level function call format provided. only keep its arguments\n\t\t// TODO: check if function name is a valid action name\n\t\tif (parsedArgs.function.name !== 'AgentOutput')\n\t\t\tthrow new InvokeError(\n\t\t\t\tInvokeErrorType.INVALID_TOOL_ARGS,\n\t\t\t\t`Expected function name \"AgentOutput\", got \"${parsedArgs.function.name}\"`,\n\t\t\t\tnull\n\t\t\t)\n\n\t\tconsole.log(chalk.yellow('lenientParseMacroToolCall: #3 fixing incorrect tool call'))\n\t\tparsedArgs = parsedArgs.function.arguments\n\t} else if (parsedArgs.name && parsedArgs.arguments) {\n\t\t// case: upper level function call format provided. only keep its arguments\n\t\t// TODO: check if function name is a valid action name\n\t\tif (parsedArgs.name !== 'AgentOutput')\n\t\t\tthrow new InvokeError(\n\t\t\t\tInvokeErrorType.INVALID_TOOL_ARGS,\n\t\t\t\t`Expected function name \"AgentOutput\", got \"${parsedArgs.name}\"`,\n\t\t\t\tnull\n\t\t\t)\n\n\t\tconsole.log(chalk.yellow('lenientParseMacroToolCall: #4 fixing incorrect tool call'))\n\t\tparsedArgs = parsedArgs.arguments\n\t} else {\n\t\t// case: only action parameters provided, wrap into MacroToolInput\n\t\t// TODO: check if action name is valid\n\t\tconsole.log(chalk.yellow('lenientParseMacroToolCall: #5 fixing incorrect tool call'))\n\t\tparsedArgs = { action: parsedArgs } as MacroToolInput\n\t}\n\n\t// make sure it's not wrapped as string\n\tif (typeof parsedArgs === 'string') {\n\t\tconsole.log(chalk.yellow('lenientParseMacroToolCall: #6 fixing incorrect tool call'))\n\t\ttry {\n\t\t\tparsedArgs = JSON.parse(parsedArgs)\n\t\t} catch (error) {\n\t\t\tthrow new InvokeError(\n\t\t\t\tInvokeErrorType.INVALID_TOOL_ARGS,\n\t\t\t\t'Failed to parse nested tool arguments as JSON',\n\t\t\t\terror\n\t\t\t)\n\t\t}\n\t}\n\n\tconst validation = inputSchema.safeParse(parsedArgs)\n\tif (validation.success) {\n\t\treturn validation.data as unknown as MacroToolInput\n\t} else {\n\t\tconst action = parsedArgs.action ?? {}\n\t\tconst actionName = Object.keys(action)[0] || 'unknown'\n\t\tconst actionArgs = JSON.stringify(action[actionName] || 'unknown')\n\n\t\t// TODO: check if action name is valid. give a readable error message\n\n\t\tthrow new InvokeError(\n\t\t\tInvokeErrorType.INVALID_TOOL_ARGS,\n\t\t\t`Tool arguments validation failed: action \"${actionName}\" with args ${actionArgs}`,\n\t\t\tvalidation.error\n\t\t)\n\t}\n}\n\nexport function modelPatch(body: Record<string, any>) {\n\tconst model: string = body.model || ''\n\n\tif (model.toLowerCase().startsWith('claude')) {\n\t\tbody.tool_choice = { type: 'tool', name: 'AgentOutput' }\n\t\tbody.thinking = { type: 'disabled' }\n\t\t// body.reasoning = { enabled: 'disabled' }\n\t}\n\n\tif (model.toLowerCase().includes('grok')) {\n\t\tconsole.log('Applying Grok patch: removing tool_choice')\n\t\tdelete body.tool_choice\n\t\tconsole.log('Applying Grok patch: disable reasoning and thinking')\n\t\tbody.thinking = { type: 'disabled', effort: 'minimal' }\n\t\tbody.reasoning = { enabled: false, effort: 'low' }\n\t}\n\n\treturn body\n}\n","/**\n * OpenAI Client implementation\n */\nimport type { MacroToolInput } from '../PageAgent'\nimport { InvokeError, InvokeErrorType } from './errors'\nimport type { InvokeResult, LLMClient, Message, OpenAIClientConfig, Tool } from './types'\nimport { lenientParseMacroToolCall, modelPatch, zodToOpenAITool } from './utils'\n\nexport class OpenAIClient implements LLMClient {\n\tconfig: OpenAIClientConfig\n\n\tconstructor(config: OpenAIClientConfig) {\n\t\tthis.config = config\n\t}\n\n\tasync invoke(\n\t\tmessages: Message[],\n\t\ttools: { AgentOutput: Tool<MacroToolInput> },\n\t\tabortSignal?: AbortSignal\n\t): Promise<InvokeResult> {\n\t\t// 1. Convert tools to OpenAI format\n\t\tconst openaiTools = Object.entries(tools).map(([name, tool]) => zodToOpenAITool(name, tool))\n\n\t\t// 2. Call API\n\t\tlet response: Response\n\t\ttry {\n\t\t\tresponse = await fetch(`${this.config.baseURL}/chat/completions`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.config.apiKey}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(\n\t\t\t\t\tmodelPatch({\n\t\t\t\t\t\tmodel: this.config.model,\n\t\t\t\t\t\ttemperature: this.config.temperature,\n\t\t\t\t\t\tmax_tokens: this.config.maxTokens,\n\t\t\t\t\t\tmessages,\n\n\t\t\t\t\t\ttools: openaiTools,\n\t\t\t\t\t\t// tool_choice: 'required',\n\t\t\t\t\t\ttool_choice: { type: 'function', function: { name: 'AgentOutput' } },\n\n\t\t\t\t\t\t// model specific params\n\n\t\t\t\t\t\t// reasoning_effort: 'minimal',\n\t\t\t\t\t\t// verbosity: 'low',\n\t\t\t\t\t\tparallel_tool_calls: false,\n\t\t\t\t\t})\n\t\t\t\t),\n\t\t\t\tsignal: abortSignal,\n\t\t\t})\n\t\t} catch (error: unknown) {\n\t\t\t// Network error\n\t\t\tthrow new InvokeError(InvokeErrorType.NETWORK_ERROR, 'Network request failed', error)\n\t\t}\n\n\t\t// 3. Handle HTTP errors\n\t\tif (!response.ok) {\n\t\t\tconst errorData = await response.json().catch()\n\t\t\tconst errorMessage =\n\t\t\t\t(errorData as { error?: { message?: string } }).error?.message || response.statusText\n\n\t\t\tif (response.status === 401 || response.status === 403) {\n\t\t\t\tthrow new InvokeError(\n\t\t\t\t\tInvokeErrorType.AUTH_ERROR,\n\t\t\t\t\t`Authentication failed: ${errorMessage}`,\n\t\t\t\t\terrorData\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (response.status === 429) {\n\t\t\t\tthrow new InvokeError(\n\t\t\t\t\tInvokeErrorType.RATE_LIMIT,\n\t\t\t\t\t`Rate limit exceeded: ${errorMessage}`,\n\t\t\t\t\terrorData\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (response.status >= 500) {\n\t\t\t\tthrow new InvokeError(\n\t\t\t\t\tInvokeErrorType.SERVER_ERROR,\n\t\t\t\t\t`Server error: ${errorMessage}`,\n\t\t\t\t\terrorData\n\t\t\t\t)\n\t\t\t}\n\t\t\tthrow new InvokeError(\n\t\t\t\tInvokeErrorType.UNKNOWN,\n\t\t\t\t`HTTP ${response.status}: ${errorMessage}`,\n\t\t\t\terrorData\n\t\t\t)\n\t\t}\n\n\t\t// parse response\n\n\t\tconst data = await response.json()\n\t\tconst tool = tools.AgentOutput\n\t\tconst macroToolInput = lenientParseMacroToolCall(data, tool.inputSchema as any)\n\n\t\t// Execute tool\n\t\tlet toolResult: unknown\n\t\ttry {\n\t\t\ttoolResult = await tool.execute(macroToolInput)\n\t\t} catch (e) {\n\t\t\tthrow new InvokeError(\n\t\t\t\tInvokeErrorType.TOOL_EXECUTION_ERROR,\n\t\t\t\t`Tool execution failed: ${(e as Error).message}`,\n\t\t\t\te\n\t\t\t)\n\t\t}\n\n\t\t// Return result (including cache tokens)\n\t\treturn {\n\t\t\ttoolCall: {\n\t\t\t\t// id: toolCall.id,\n\t\t\t\tname: 'AgentOutput',\n\t\t\t\targs: macroToolInput,\n\t\t\t},\n\t\t\ttoolResult,\n\t\t\tusage: {\n\t\t\t\tpromptTokens: data.usage?.prompt_tokens ?? 0,\n\t\t\t\tcompletionTokens: data.usage?.completion_tokens ?? 0,\n\t\t\t\ttotalTokens: data.usage?.total_tokens ?? 0,\n\t\t\t\tcachedTokens: data.usage?.prompt_tokens_details?.cached_tokens,\n\t\t\t\treasoningTokens: data.usage?.completion_tokens_details?.reasoning_tokens,\n\t\t\t},\n\t\t\trawResponse: data,\n\t\t}\n\t}\n}\n","/**\n * @topic LLM 与主流程的隔离\n * @reasoning\n * 将 llm 的调用和主流程分开是复杂的,\n * 因为 agent 的 tool call 通常集成在 llm 模块中,而而先得到 llm 返回,然后处理工具调用\n * tools 和 llm 调用的逻辑不可避免地耦合在一起,tool 的执行又和主流程耦合在一起\n * 而 history 的维护和更新逻辑,又必须嵌入多轮 tool call 中\n * @reasoning\n * - 放弃框架提供的自动的多轮调用,每轮调用都由主流程发起\n * - 理想情况下,llm 调用应该获得 structured output,然后由额外的模块触发 tool call,目前模型和框架都无法实现\n * - 当前只能将 llm api 和 本地 tool call 耦合在一起,不关心其中的衔接方式\n * @conclusion\n * - @llm responsibility boundary:\n * - call llm api with given messages and tools\n * - invoke tool call and get the result of the tool\n * - return the result to main loop\n * - @main_loop responsibility boundary:\n * - maintain all behaviors of an **agent**\n * @conclusion\n * - 这里的 llm 模块不是 agent,只负责一轮 llm 调用和工具调用,无状态\n */\n/**\n * @topic 结构化输出\n * @facts\n * - 几乎所有模型都支持 tool call schema\n * - 几乎所有模型都支持返回 json\n * - 只有 openAI/grok/gemini 支持 schema 并保证格式\n * - 主流模型都支持 tool_choice: required\n * - 除了 qwen 必须指定一个函数名 (9月上新后支持)\n * @conclusion\n * - 永远使用 tool call 来返回结构化数据,禁止模型直接返回(视为出错)\n * - 不能假设 tool 参数合法,必须有修复机制,而且修复也应该使用 tool call 返回\n */\nimport type { LLMConfig } from '../config'\nimport { parseLLMConfig } from '../config'\nimport { EventBus, getEventBus } from '../utils/bus'\nimport { OpenAIClient } from './OpenAILenientClient'\nimport { InvokeError } from './errors'\nimport type { InvokeResult, LLMClient, Message, Tool } from './types'\n\nexport type { Message, Tool, InvokeResult, LLMClient }\n\nexport class LLM {\n\tconfig: Required<LLMConfig>\n\tid: string\n\tclient: LLMClient\n\t#bus: EventBus\n\n\tconstructor(config: LLMConfig, id: string) {\n\t\tthis.config = parseLLMConfig(config)\n\t\tthis.id = id\n\n\t\tthis.#bus = getEventBus(id)\n\n\t\t// Default to OpenAI client\n\t\tthis.client = new OpenAIClient({\n\t\t\tmodel: this.config.model,\n\t\t\tapiKey: this.config.apiKey,\n\t\t\tbaseURL: this.config.baseURL,\n\t\t\ttemperature: this.config.temperature,\n\t\t\tmaxTokens: this.config.maxTokens,\n\t\t})\n\t}\n\n\t/**\n\t * - call llm api *once*\n\t * - invoke tool call *once*\n\t * - return the result of the tool\n\t */\n\tasync invoke(\n\t\tmessages: Message[],\n\t\ttools: Record<string, Tool>,\n\t\tabortSignal: AbortSignal\n\t): Promise<InvokeResult> {\n\t\treturn await withRetry(\n\t\t\tasync () => {\n\t\t\t\tconst result = await this.client.invoke(messages, tools, abortSignal)\n\n\t\t\t\treturn result\n\t\t\t},\n\t\t\t// retry settings\n\t\t\t{\n\t\t\t\tmaxRetries: this.config.maxRetries,\n\t\t\t\tonRetry: (retries: number) => {\n\t\t\t\t\tthis.#bus.emit('panel:update', {\n\t\t\t\t\t\ttype: 'retry',\n\t\t\t\t\t\tdisplayText: `retry-ing (${retries} / ${this.config.maxRetries})`,\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tonError: (error: Error, withRetry: boolean) => {\n\t\t\t\t\tthis.#bus.emit('panel:update', {\n\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\tdisplayText: `step failed: ${(error as Error).message}`,\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t}\n\t\t)\n\t}\n}\n\nasync function withRetry<T>(\n\tfn: () => Promise<T>,\n\tsettings: {\n\t\tmaxRetries: number\n\t\tonRetry: (retries: number) => void\n\t\tonError: (error: Error, withRetry: boolean) => void\n\t}\n): Promise<T> {\n\tlet retries = 0\n\tlet lastError: Error | null = null\n\twhile (retries <= settings.maxRetries) {\n\t\tif (retries > 0) {\n\t\t\tsettings.onRetry(retries)\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 100))\n\t\t}\n\n\t\ttry {\n\t\t\treturn await fn()\n\t\t} catch (error: unknown) {\n\t\t\tconsole.error(error)\n\t\t\tsettings.onError(error as Error, retries < settings.maxRetries)\n\n\t\t\t// do not retry if aborted by user\n\t\t\tif ((error as { name?: string })?.name === 'AbortError') throw error\n\n\t\t\t// do not retry if error is not retryable (InvokeError)\n\t\t\tif (error instanceof InvokeError && !error.retryable) throw error\n\n\t\t\tlastError = error as Error\n\t\t\tretries++\n\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 100))\n\t\t}\n\t}\n\n\tthrow lastError!\n}\n","export default \"You are an AI agent designed to operate in an iterative loop to automate browser tasks. Your ultimate goal is accomplishing the task provided in <user_request>.\\n\\n<intro>\\nYou excel at following tasks:\\n1. Navigating complex websites and extracting precise information\\n2. Automating form submissions and interactive web actions\\n3. Gathering and saving information \\n4. Operate effectively in an agent loop\\n5. Efficiently performing diverse web tasks\\n</intro>\\n\\n<language_settings>\\n- Default working language: **中文**\\n- Use the language that user is using. Return in user's language.\\n</language_settings>\\n\\n<input>\\nAt every step, your input will consist of: \\n1. <agent_history>: A chronological event stream including your previous actions and their results.\\n2. <agent_state>: Current <user_request> and <step_info>.\\n3. <browser_state>: Current URL, interactive elements indexed for actions, and visible page content.\\n</input>\\n\\n<agent_history>\\nAgent history will be given as a list of step information as follows:\\n\\n<step_{step_number}>:\\nEvaluation of Previous Step: Assessment of last action\\nMemory: Your memory of this step\\nNext Goal: Your goal for this step\\nAction Results: Your actions and their results\\n</step_{step_number}>\\n\\nand system messages wrapped in <sys> tag.\\n</agent_history>\\n\\n<user_request>\\nUSER REQUEST: This is your ultimate objective and always remains visible.\\n- This has the highest priority. Make the user happy.\\n- If the user request is very specific - then carefully follow each step and dont skip or hallucinate steps.\\n- If the task is open ended you can plan yourself how to get it done.\\n</user_request>\\n\\n<browser_state>\\n1. Browser State will be given as:\\n\\nCurrent URL: URL of the page you are currently viewing.\\nInteractive Elements: All interactive elements will be provided in format as [index]<type>text</type> where\\n- index: Numeric identifier for interaction\\n- type: HTML element type (button, input, etc.)\\n- text: Element description\\n\\nExamples:\\n[33]<div>User form</div>\\n\\\\t*[35]<button aria-label='Submit form'>Submit</button>\\n\\nNote that:\\n- Only elements with numeric indexes in [] are interactive\\n- (stacked) indentation (with \\\\t) is important and means that the element is a (html) child of the element above (with a lower index)\\n- Elements tagged with `*[` are the new clickable elements that appeared on the website since the last step - if url has not changed.\\n- Pure text elements without [] are not interactive.\\n</browser_state>\\n\\n<browser_rules>\\nStrictly follow these rules while using the browser and navigating the web:\\n- Only interact with elements that have a numeric [index] assigned.\\n- Only use indexes that are explicitly provided.\\n- If the page changes after, for example, an input text action, analyze if you need to interact with new elements, e.g. selecting the right option from the list.\\n- By default, only elements in the visible viewport are listed. Use scrolling actions if you suspect relevant content is offscreen which you need to interact with. Scroll ONLY if there are more pixels below or above the page.\\n- You can scroll by a specific number of pages using the num_pages parameter (e.g., 0.5 for half page, 2.0 for two pages).\\n- All the elements that are scrollable are marked with `data-scrollable` attribute. Including the scrollable distance in every directions. You can scroll *the element* in case some area are overflowed.\\n- If a captcha appears, tell user you can not solve captcha. finished the task and ask user to solve it.\\n- If expected elements are missing, try scrolling, or navigating back.\\n- If the page is not fully loaded, use the `wait` action.\\n- Do not repeat one action for more than 3 times unless some conditions changed.\\n- If you fill an input field and your action sequence is interrupted, most often something changed e.g. suggestions popped up under the field.\\n- If the <user_request> includes specific page information such as product type, rating, price, location, etc., try to apply filters to be more efficient.\\n- The <user_request> is the ultimate goal. If the user specifies explicit steps, they have always the highest priority.\\n- If you input_text into a field, you might need to press enter, click the search button, or select from dropdown for completion.\\n- Don't login into a page if you don't have to. Don't login if you don't have the credentials. \\n- There are 2 types of tasks always first think which type of request you are dealing with:\\n1. Very specific step by step instructions:\\n- Follow them as very precise and don't skip steps. Try to complete everything as requested.\\n2. Open ended tasks. Plan yourself, be creative in achieving them.\\n- If you get stuck e.g. with logins or captcha in open-ended tasks you can re-evaluate the task and try alternative ways, e.g. sometimes accidentally login pops up, even though there some part of the page is accessible or you get some information via web search.\\n</browser_rules>\\n\\n<capability>\\n- You can only handle single page app. Do not jump out of current page.\\n- Do not click on link if it will open in a new page (etc. <a target=\\\"_blank\\\">)\\n- It is ok to fail the task.\\n\\t- User can be wrong. If the request of user is not achievable, inappropriate or you do not have enough information or tools to achieve it. Tell user to make a better request.\\n\\t- Webpage can be broken. All webpages or apps have bugs. Some bug will make it hard for your job. It's encouraged to tell user the problem of current page. Your feedbacks (including failing) are valuable for user.\\n\\t- Trying to hard can be harmful. Repeating some action back and forth or pushing for a complex procedure with little knowledge can cause unwanted result and harmful side-effects. User would rather you to complete the task with a fail.\\n- If you are not clear about the request or steps. `ask_user` to clarify it.\\n- If you do not have knowledge for the current webpage or task. You must require user to give specific instructions and detailed steps.\\n</capability>\\n\\n<task_completion_rules>\\nYou must call the `done` action in one of three cases:\\n- When you have fully completed the USER REQUEST.\\n- When you reach the final allowed step (`max_steps`), even if the task is incomplete.\\n- When you feel stuck or unable to solve user request. Or user request is not clear or contains inappropriate content.\\n- If it is ABSOLUTELY IMPOSSIBLE to continue.\\n\\nThe `done` action is your opportunity to terminate and share your findings with the user.\\n- Set `success` to `true` only if the full USER REQUEST has been completed with no missing components.\\n- If any part of the request is missing, incomplete, or uncertain, set `success` to `false`.\\n- You can use the `text` field of the `done` action to communicate your findings and to provide a coherent reply to the user and fulfill the USER REQUEST.\\n- You are ONLY ALLOWED to call `done` as a single action. Don't call it together with other actions.\\n- If the user asks for specified format, such as \\\"return JSON with following structure\\\", \\\"return a list of format...\\\", MAKE sure to use the right format in your answer.\\n- If the user asks for a structured output, your `done` action's schema may be modified. Take this schema into account when solving the task!\\n</task_completion_rules>\\n\\n<reasoning_rules>\\nExhibit the following reasoning patterns to successfully achieve the <user_request>:\\n\\n- Reason about <agent_history> to track progress and context toward <user_request>.\\n- Analyze the most recent \\\"Next Goal\\\" and \\\"Action Result\\\" in <agent_history> and clearly state what you previously tried to achieve.\\n- Analyze all relevant items in <agent_history> and <browser_state> to understand your state.\\n- Explicitly judge success/failure/uncertainty of the last action. Never assume an action succeeded just because it appears to be executed in your last step in <agent_history>. If the expected change is missing, mark the last action as failed (or uncertain) and plan a recovery.\\n- Analyze whether you are stuck, e.g. when you repeat the same actions multiple times without any progress. Then consider alternative approaches e.g. scrolling for more context or ask user for help.\\n- `ask_user` for help if you have any difficulty. Users want to be kept in the loop.\\n- If you see information relevant to <user_request>, plan saving the information to memory.\\n- Always reason about the <user_request>. Make sure to carefully analyze the specific steps and information required. E.g. specific filters, specific form fields, specific information to search. Make sure to always compare the current trajectory with the user request and think carefully if thats how the user requested it.\\n</reasoning_rules>\\n\\n<examples>\\nHere are examples of good output patterns. Use them as reference but never copy them directly.\\n\\n<evaluation_examples>\\n- Positive Examples:\\n\\\"evaluation_previous_goal\\\": \\\"Successfully navigated to the product page and found the target information. Verdict: Success\\\"\\n\\\"evaluation_previous_goal\\\": \\\"Clicked the login button and user authentication form appeared. Verdict: Success\\\"\\n</evaluation_examples>\\n\\n<memory_examples>\\n\\\"memory\\\": \\\"Found many pending reports that need to be analyzed in the main page. Successfully processed the first 2 reports on quarterly sales data and moving on to inventory analysis and customer feedback reports.\\\"\\n</memory_examples>\\n\\n<next_goal_examples>\\n\\\"next_goal\\\": \\\"Click on the 'Add to Cart' button to proceed with the purchase flow.\\\"\\n\\\"next_goal\\\": \\\"Extract details from the first item on the page.\\\"\\n</next_goal_examples>\\n</examples>\\n\\n<output>\\nYou must ALWAYS respond with a valid JSON in this exact format:\\n\\n{\\n \\\"evaluation_previous_goal\\\": \\\"Concise one-sentence analysis of your last action. Clearly state success, failure, or uncertain.\\\",\\n \\\"memory\\\": \\\"1-3 concise sentences of specific memory of this step and overall progress. You should put here everything that will help you track progress in future steps. Like counting pages visited, items found, etc.\\\",\\n \\\"next_goal\\\": \\\"State the next immediate goal and action to achieve it, in one clear sentence.\\\"\\n \\\"action\\\":{\\\"one_action_name\\\": {// action-specific parameter}}\\n}\\n</output>\\n\"","/**\n * Wait until condition becomes true\n * @returns Returns when condition becomes true, throws otherwise\n * @param timeout Timeout in milliseconds, default 0 means no timeout, throws error on timeout\n */\nexport async function waitUntil(check: () => boolean, timeout = 60 * 60_1000): Promise<boolean> {\n\tif (check()) return true\n\n\treturn new Promise((resolve, reject) => {\n\t\tconst start = Date.now()\n\t\tconst interval = setInterval(() => {\n\t\t\tif (check()) {\n\t\t\t\tclearInterval(interval)\n\t\t\t\tresolve(true)\n\t\t\t} else if (Date.now() - start > timeout) {\n\t\t\t\tclearInterval(interval)\n\t\t\t\treject(new Error('Timeout waiting for condition to become true'))\n\t\t\t}\n\t\t}, 100)\n\t})\n}\n\nexport async function waitFor(seconds: number): Promise<void> {\n\tawait new Promise((resolve) => setTimeout(resolve, seconds * 1000))\n}\n\n//\n\nexport function truncate(text: string, maxLength: number): string {\n\tif (text.length > maxLength) {\n\t\treturn text.substring(0, maxLength) + '...'\n\t}\n\treturn text\n}\n\n//\n\nexport function trimLines(text: string): string {\n\treturn text\n\t\t.split('\\n')\n\t\t.map((line) => line.trim())\n\t\t.join('\\n')\n}\n\n//\n\nexport function randomID(existingIDs?: string[]): string {\n\tlet id = Math.random().toString(36).substring(2, 11)\n\n\tif (!existingIDs) {\n\t\treturn id\n\t}\n\n\tconst MAX_TRY = 1000\n\tlet tryCount = 0\n\n\twhile (existingIDs.includes(id)) {\n\t\tid = Math.random().toString(36).substring(2, 11)\n\t\ttryCount++\n\t\tif (tryCount > MAX_TRY) {\n\t\t\tthrow new Error('randomID: too many try')\n\t\t}\n\t}\n\n\treturn id\n}\n\n//\n\nif (!window.__PAGE_AGENT_IDS__) {\n\twindow.__PAGE_AGENT_IDS__ = []\n}\n\nconst ids = window.__PAGE_AGENT_IDS__\n\n/**\n * Generate a random ID.\n * @note Unique within this window.\n */\nexport function uid() {\n\tconst id = randomID(ids)\n\tids.push(id)\n\treturn id\n}\n","/**\n * Internal tools for PageAgent.\n * @note Adapted from browser-use\n */\nimport zod, { type z } from 'zod'\n\nimport type { PageAgent } from '../PageAgent'\nimport { waitFor } from '../utils'\n\n/**\n * Internal tool definition that has access to PageAgent `this` context\n */\nexport interface PageAgentTool<TParams = any> {\n\t// name: string\n\tdescription: string\n\tinputSchema: z.ZodType<TParams>\n\texecute: (this: PageAgent, args: TParams) => Promise<string>\n}\n\nexport function tool<TParams>(options: PageAgentTool<TParams>): PageAgentTool<TParams> {\n\treturn options\n}\n\n/**\n * Internal tools for PageAgent.\n * Note: Using any to allow different parameter types for each tool\n */\nexport const tools = new Map<string, PageAgentTool>()\n\ntools.set(\n\t'done',\n\ttool({\n\t\tdescription:\n\t\t\t'Complete task - provide a summary of results for the user. Set success=True if task completed successfully, false otherwise. Text should be your response to the user summarizing results.',\n\t\tinputSchema: zod.object({\n\t\t\ttext: zod.string(),\n\t\t\tsuccess: zod.boolean().default(true),\n\t\t}),\n\t\texecute: async function (this: PageAgent, input) {\n\t\t\t// @note main loop will handle this one\n\t\t\t// this.onDone(input.text, input.success)\n\t\t\treturn Promise.resolve('Task completed')\n\t\t},\n\t})\n)\n\ntools.set(\n\t'wait',\n\ttool({\n\t\tdescription:\n\t\t\t'Wait for x seconds. default 1s (max 10 seconds, min 1 second). This can be used to wait until the page or data is fully loaded.',\n\t\tinputSchema: zod.object({\n\t\t\tseconds: zod.number().min(1).max(10).default(1),\n\t\t}),\n\t\texecute: async function (this: PageAgent, input) {\n\t\t\tconst lastTimeUpdate = await this.pageController.getLastUpdateTime()\n\t\t\tconst actualWaitTime = Math.max(0, input.seconds - (Date.now() - lastTimeUpdate) / 1000)\n\t\t\tconsole.log(`actualWaitTime: ${actualWaitTime} seconds`)\n\t\t\tawait waitFor(actualWaitTime)\n\t\t\treturn `✅ Waited for ${input.seconds} seconds.`\n\t\t},\n\t})\n)\n\ntools.set(\n\t'ask_user',\n\ttool({\n\t\tdescription:\n\t\t\t'Ask the user a question and wait for their answer. Use this if you need more information or clarification.',\n\t\tinputSchema: zod.object({\n\t\t\tquestion: zod.string(),\n\t\t}),\n\t\texecute: async function (this: PageAgent, input) {\n\t\t\tconst answer = await this.panel.askUser(input.question)\n\t\t\treturn `✅ Received user answer: ${answer}`\n\t\t},\n\t})\n)\n\ntools.set(\n\t'click_element_by_index',\n\ttool({\n\t\tdescription: 'Click element by index',\n\t\tinputSchema: zod.object({\n\t\t\tindex: zod.int().min(0),\n\t\t}),\n\t\texecute: async function (this: PageAgent, input) {\n\t\t\tconst result = await this.pageController.clickElement(input.index)\n\t\t\treturn result.message\n\t\t},\n\t})\n)\n\ntools.set(\n\t'input_text',\n\ttool({\n\t\tdescription: 'Click and input text into a input interactive element',\n\t\tinputSchema: zod.object({\n\t\t\tindex: zod.int().min(0),\n\t\t\ttext: zod.string(),\n\t\t}),\n\t\texecute: async function (this: PageAgent, input) {\n\t\t\tconst result = await this.pageController.inputText(input.index, input.text)\n\t\t\treturn result.message\n\t\t},\n\t})\n)\n\ntools.set(\n\t'select_dropdown_option',\n\ttool({\n\t\tdescription:\n\t\t\t'Select dropdown option for interactive element index by the text of the option you want to select',\n\t\tinputSchema: zod.object({\n\t\t\tindex: zod.int().min(0),\n\t\t\ttext: zod.string(),\n\t\t}),\n\t\texecute: async function (this: PageAgent, input) {\n\t\t\tconst result = await this.pageController.selectOption(input.index, input.text)\n\t\t\treturn result.message\n\t\t},\n\t})\n)\n\n/**\n * @note Reference from browser-use\n */\ntools.set(\n\t'scroll',\n\ttool({\n\t\tdescription:\n\t\t\t'Scroll the page by specified number of pages (set down=True to scroll down, down=False to scroll up, num_pages=number of pages to scroll like 0.5 for half page, 1.0 for one page, etc.). Optional index parameter to scroll within a specific element or its scroll container (works well for dropdowns and custom UI components). Optional pixels parameter to scroll by a specific number of pixels instead of pages.',\n\t\tinputSchema: zod.object({\n\t\t\tdown: zod.boolean().default(true),\n\t\t\tnum_pages: zod.number().min(0).max(10).optional().default(0.1),\n\t\t\tpixels: zod.number().int().min(0).optional(),\n\t\t\tindex: zod.number().int().min(0).optional(),\n\t\t}),\n\t\texecute: async function (this: PageAgent, input) {\n\t\t\tconst result = await this.pageController.scroll({\n\t\t\t\t...input,\n\t\t\t\tnumPages: input.num_pages,\n\t\t\t})\n\t\t\treturn result.message\n\t\t},\n\t})\n)\n\ntools.set(\n\t'scroll_horizontally',\n\ttool({\n\t\tdescription:\n\t\t\t'Scroll the page or element horizontally (set right=True to scroll right, right=False to scroll left, pixels=number of pixels to scroll). Optional index parameter to scroll within a specific element or its scroll container (works well for wide tables).',\n\t\tinputSchema: zod.object({\n\t\t\tright: zod.boolean().default(true),\n\t\t\tpixels: zod.number().int().min(0),\n\t\t\tindex: zod.number().int().min(0).optional(),\n\t\t}),\n\t\texecute: async function (this: PageAgent, input) {\n\t\t\tconst result = await this.pageController.scrollHorizontally(input)\n\t\t\treturn result.message\n\t\t},\n\t})\n)\n\ntools.set(\n\t'execute_javascript',\n\ttool({\n\t\tdescription:\n\t\t\t'Execute JavaScript code on the current page. Supports async/await syntax. Use with caution!',\n\t\tinputSchema: zod.object({\n\t\t\tscript: zod.string(),\n\t\t}),\n\t\texecute: async function (this: PageAgent, input) {\n\t\t\tconst result = await this.pageController.executeJavascript(input.script)\n\t\t\treturn result.message\n\t\t},\n\t})\n)\n\n// @todo get_dropdown_options\n// @todo select_dropdown_option\n// @todo send_keys\n// @todo upload_file\n// @todo go_back\n// @todo extract_structured_data\n","/**\n * Agent execution state management\n */\n\nexport interface Step {\n\tid: string\n\tstepNumber: number\n\ttimestamp: Date\n\ttype: 'thinking' | 'tool_executing' | 'completed' | 'error' | 'output' | 'input' | 'retry'\n\n\t// Tool execution related\n\ttoolName?: string\n\ttoolArgs?: any\n\ttoolResult?: any\n\n\t// Display data\n\tdisplayText: string\n\tduration?: number\n}\n\nexport type AgentStatus = 'idle' | 'running' | 'paused' | 'completed' | 'error'\n\nexport class UIState {\n\tprivate steps: Step[] = []\n\tprivate currentStep: Step | null = null\n\tprivate status: AgentStatus = 'idle'\n\tprivate stepCounter = 0\n\n\taddStep(stepData: Omit<Step, 'id' | 'stepNumber' | 'timestamp'>): Step {\n\t\tconst step: Step = {\n\t\t\tid: this.generateId(),\n\t\t\tstepNumber: ++this.stepCounter,\n\t\t\ttimestamp: new Date(),\n\t\t\t...stepData,\n\t\t}\n\n\t\tthis.steps.push(step)\n\t\tthis.currentStep = step\n\n\t\t// Update overall status\n\t\tthis.updateStatus(step.type)\n\n\t\treturn step\n\t}\n\n\tupdateCurrentStep(updates: Partial<Step>): Step | null {\n\t\tif (!this.currentStep) return null\n\n\t\tObject.assign(this.currentStep, updates)\n\t\treturn this.currentStep\n\t}\n\n\tgetCurrentStep(): Step | null {\n\t\treturn this.currentStep\n\t}\n\n\tgetAllSteps(): Step[] {\n\t\treturn [...this.steps]\n\t}\n\n\tgetStatus(): AgentStatus {\n\t\treturn this.status\n\t}\n\n\treset(): void {\n\t\tthis.steps = []\n\t\tthis.currentStep = null\n\t\tthis.status = 'idle'\n\t\tthis.stepCounter = 0\n\t}\n\n\tprivate updateStatus(stepType: Step['type']): void {\n\t\tswitch (stepType) {\n\t\t\tcase 'thinking':\n\t\t\tcase 'tool_executing':\n\t\t\tcase 'output':\n\t\t\tcase 'input':\n\t\t\tcase 'retry':\n\t\t\t\tthis.status = 'running'\n\t\t\t\tbreak\n\t\t\tcase 'completed':\n\t\t\t\tthis.status = 'completed'\n\t\t\t\tbreak\n\t\t\tcase 'error':\n\t\t\t\tthis.status = 'error'\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tprivate generateId(): string {\n\t\treturn `step_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`\n\t}\n}\n","import type { PageAgent } from '../PageAgent'\nimport type { I18n } from '../i18n'\nimport { truncate } from '../utils'\nimport type { EventBus } from '../utils/bus'\nimport { type Step, UIState } from './UIState'\n\nimport styles from './Panel.module.css'\n\n/**\n * Agent control panel\n */\nexport class Panel {\n\t#wrapper: HTMLElement\n\t#indicator: HTMLElement\n\t#statusText: HTMLElement\n\t#historySection: HTMLElement\n\t#expandButton: HTMLElement\n\t#pauseButton: HTMLElement\n\t#stopButton: HTMLElement\n\t#inputSection: HTMLElement\n\t#taskInput: HTMLInputElement\n\t#bus: EventBus\n\n\t#state = new UIState()\n\t#isExpanded = false\n\t#pageAgent: PageAgent\n\t#userAnswerResolver: ((input: string) => void) | null = null\n\t#isWaitingForUserAnswer: boolean = false\n\t#headerUpdateTimer: ReturnType<typeof setInterval> | null = null\n\t#pendingHeaderText: string | null = null\n\t#isAnimating = false\n\n\tget wrapper(): HTMLElement {\n\t\treturn this.#wrapper\n\t}\n\n\tconstructor(pageAgent: PageAgent) {\n\t\tthis.#pageAgent = pageAgent\n\t\tthis.#bus = pageAgent.bus\n\t\tthis.#wrapper = this.#createWrapper()\n\t\tthis.#indicator = this.#wrapper.querySelector(`.${styles.indicator}`)!\n\t\tthis.#statusText = this.#wrapper.querySelector(`.${styles.statusText}`)!\n\t\tthis.#historySection = this.#wrapper.querySelector(`.${styles.historySection}`)!\n\t\tthis.#expandButton = this.#wrapper.querySelector(`.${styles.expandButton}`)!\n\t\tthis.#pauseButton = this.#wrapper.querySelector(`.${styles.pauseButton}`)!\n\t\tthis.#stopButton = this.#wrapper.querySelector(`.${styles.stopButton}`)!\n\t\tthis.#inputSection = this.#wrapper.querySelector(`.${styles.inputSectionWrapper}`)!\n\t\tthis.#taskInput = this.#wrapper.querySelector(`.${styles.taskInput}`)!\n\n\t\tthis.#setupEventListeners()\n\t\tthis.#startHeaderUpdateLoop()\n\t\t// this.#expand() // debug\n\n\t\tthis.#showInputArea()\n\n\t\tthis.#bus.on('panel:show', () => this.#show())\n\t\tthis.#bus.on('panel:hide', () => this.#hide())\n\t\tthis.#bus.on('panel:reset', () => this.#reset())\n\t\tthis.#bus.on('panel:update', (stepData) => this.#update(stepData))\n\t\tthis.#bus.on('panel:expand', () => this.#expand())\n\t\tthis.#bus.on('panel:collapse', () => this.#collapse())\n\t}\n\n\t/**\n\t * Ask for user input\n\t */\n\tasync askUser(question: string): Promise<string> {\n\t\treturn new Promise((resolve) => {\n\t\t\t// Set `waiting for user answer` state\n\t\t\tthis.#isWaitingForUserAnswer = true\n\t\t\tthis.#userAnswerResolver = resolve\n\n\t\t\t// Update state to `running`\n\t\t\tthis.#update({\n\t\t\t\ttype: 'output',\n\t\t\t\tdisplayText: this.#pageAgent.i18n.t('ui.panel.question', { question }),\n\t\t\t}) // Expand history panel\n\t\t\tif (!this.#isExpanded) {\n\t\t\t\tthis.#expand()\n\t\t\t}\n\n\t\t\tthis.#showInputArea(this.#pageAgent.i18n.t('ui.panel.userAnswerPrompt'))\n\t\t})\n\t}\n\n\t/**\n\t * Dispose panel\n\t */\n\tdispose(): void {\n\t\tthis.#isWaitingForUserAnswer = false\n\t\tthis.#stopHeaderUpdateLoop()\n\t\tthis.wrapper.remove()\n\t}\n\n\t/**\n\t * Update status\n\t */\n\t#update(stepData: Omit<Step, 'id' | 'stepNumber' | 'timestamp'>): void {\n\t\tconst step = this.#state.addStep(stepData)\n\n\t\t// Queue header text update (will be processed by periodic check)\n\t\tconst headerText = truncate(step.displayText, 20)\n\t\tthis.#pendingHeaderText = headerText\n\n\t\tthis.#updateStatusIndicator(step.type)\n\t\tthis.#updateHistory()\n\n\t\t// Auto-expand history after task completion\n\t\tif (step.type === 'completed' || step.type === 'error') {\n\t\t\tif (!this.#isExpanded) {\n\t\t\t\tthis.#expand()\n\t\t\t}\n\t\t}\n\n\t\t// Control input area display based on status\n\t\tif (this.#shouldShowInputArea()) {\n\t\t\tthis.#showInputArea()\n\t\t} else {\n\t\t\tthis.#hideInputArea()\n\t\t}\n\t}\n\n\t/**\n\t * Show panel\n\t */\n\t#show(): void {\n\t\tthis.wrapper.style.display = 'block'\n\t\t// Force reflow to trigger animation\n\t\tvoid this.wrapper.offsetHeight\n\t\tthis.wrapper.style.opacity = '1'\n\t\tthis.wrapper.style.transform = 'translateX(-50%) translateY(0)'\n\t}\n\n\t/**\n\t * Hide panel\n\t */\n\t#hide(): void {\n\t\tthis.wrapper.style.opacity = '0'\n\t\tthis.wrapper.style.transform = 'translateX(-50%) translateY(20px)'\n\t\tthis.wrapper.style.display = 'none'\n\t}\n\n\t/**\n\t * Reset state\n\t */\n\t#reset(): void {\n\t\tthis.#state.reset()\n\t\tthis.#statusText.textContent = this.#pageAgent.i18n.t('ui.panel.ready')\n\t\tthis.#updateStatusIndicator('thinking')\n\t\tthis.#updateHistory()\n\t\tthis.#collapse()\n\t\t// Reset pause state\n\t\tthis.#pageAgent.paused = false\n\t\tthis.#updatePauseButton()\n\t\t// Reset user input state\n\t\tthis.#isWaitingForUserAnswer = false\n\t\tthis.#userAnswerResolver = null\n\t\t// Show input area\n\t\tthis.#showInputArea()\n\t}\n\n\t/**\n\t * Toggle pause state\n\t */\n\t#togglePause(): void {\n\t\tthis.#pageAgent.paused = !this.#pageAgent.paused\n\t\tthis.#updatePauseButton()\n\n\t\t// Update status display\n\t\tif (this.#pageAgent.paused) {\n\t\t\tthis.#statusText.textContent = this.#pageAgent.i18n.t('ui.panel.paused')\n\t\t\tthis.#updateStatusIndicator('thinking') // Use existing thinking state\n\t\t} else {\n\t\t\tthis.#statusText.textContent = this.#pageAgent.i18n.t('ui.panel.continueExecution')\n\t\t\tthis.#updateStatusIndicator('tool_executing') // Restore to execution state\n\t\t}\n\t}\n\n\t/**\n\t * Update pause button state\n\t */\n\t#updatePauseButton(): void {\n\t\tif (this.#pageAgent.paused) {\n\t\t\tthis.#pauseButton.textContent = '▶'\n\t\t\tthis.#pauseButton.title = this.#pageAgent.i18n.t('ui.panel.continue')\n\t\t\tthis.#pauseButton.classList.add(styles.paused)\n\t\t} else {\n\t\t\tthis.#pauseButton.textContent = '⏸︎'\n\t\t\tthis.#pauseButton.title = this.#pageAgent.i18n.t('ui.panel.pause')\n\t\t\tthis.#pauseButton.classList.remove(styles.paused)\n\t\t}\n\t}\n\n\t/**\n\t * Stop Agent\n\t */\n\t#stopAgent(): void {\n\t\t// Update status display\n\t\tthis.#update({\n\t\t\ttype: 'error',\n\t\t\tdisplayText: this.#pageAgent.i18n.t('ui.panel.taskTerminated'),\n\t\t})\n\n\t\tthis.#pageAgent.dispose()\n\t}\n\n\t/**\n\t * Submit task\n\t */\n\t#submitTask() {\n\t\tconst input = this.#taskInput.value.trim()\n\t\tif (!input) return\n\n\t\t// Hide input area\n\t\tthis.#hideInputArea()\n\n\t\tif (this.#isWaitingForUserAnswer) {\n\t\t\t// Handle user input mode\n\t\t\tthis.#handleUserAnswer(input)\n\t\t} else {\n\t\t\tthis.#pageAgent.execute(input)\n\t\t}\n\t}\n\n\t/**\n\t * Handle user answer\n\t */\n\t#handleUserAnswer(input: string): void {\n\t\t// Add user input to history\n\t\tthis.#update({\n\t\t\ttype: 'input',\n\t\t\tdisplayText: this.#pageAgent.i18n.t('ui.panel.userAnswer', { input }),\n\t\t})\n\n\t\t// Reset state\n\t\tthis.#isWaitingForUserAnswer = false\n\n\t\t// Call resolver to return user input\n\t\tif (this.#userAnswerResolver) {\n\t\t\tthis.#userAnswerResolver(input)\n\t\t\tthis.#userAnswerResolver = null\n\t\t}\n\t}\n\n\t/**\n\t * Show input area\n\t */\n\t#showInputArea(placeholder?: string): void {\n\t\t// Clear input field\n\t\tthis.#taskInput.value = ''\n\t\tthis.#taskInput.placeholder = placeholder || this.#pageAgent.i18n.t('ui.panel.taskInput')\n\t\tthis.#inputSection.classList.remove(styles.hidden)\n\t\t// Focus on input field\n\t\tsetTimeout(() => {\n\t\t\tthis.#taskInput.focus()\n\t\t}, 100)\n\t}\n\n\t/**\n\t * Hide input area\n\t */\n\t#hideInputArea(): void {\n\t\tthis.#inputSection.classList.add(styles.hidden)\n\t}\n\n\t/**\n\t * Check if input area should be shown\n\t */\n\t#shouldShowInputArea(): boolean {\n\t\t// Always show input area if waiting for user input\n\t\tif (this.#isWaitingForUserAnswer) return true\n\n\t\tconst steps = this.#state.getAllSteps()\n\t\tif (steps.length === 0) {\n\t\t\treturn true // Initial state\n\t\t}\n\n\t\tconst lastStep = steps[steps.length - 1]\n\t\treturn lastStep.type === 'completed' || lastStep.type === 'error'\n\t}\n\n\t#createWrapper(): HTMLElement {\n\t\tconst wrapper = document.createElement('div')\n\t\twrapper.id = 'page-agent-runtime_agent-panel'\n\t\twrapper.className = `${styles.wrapper} ${styles.collapsed}`\n\t\twrapper.setAttribute('data-browser-use-ignore', 'true')\n\n\t\twrapper.innerHTML = `\n\t\t\t<div class=\"${styles.background}\"></div>\n\t\t\t<div class=\"${styles.historySectionWrapper}\">\n\t\t\t\t<div class=\"${styles.historySection}\">\n\t\t\t\t\t${this.#createHistoryItem({\n\t\t\t\t\t\tid: 'placeholder',\n\t\t\t\t\t\tstepNumber: 0,\n\t\t\t\t\t\ttimestamp: new Date(),\n\t\t\t\t\t\ttype: 'thinking',\n\t\t\t\t\t\tdisplayText: this.#pageAgent.i18n.t('ui.panel.waitingPlaceholder'),\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"${styles.header}\">\n\t\t\t\t<div class=\"${styles.statusSection}\">\n\t\t\t\t\t<div class=\"${styles.indicator} ${styles.thinking}\"></div>\n\t\t\t\t\t<div class=\"${styles.statusText}\">${this.#pageAgent.i18n.t('ui.panel.ready')}</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"${styles.controls}\">\n\t\t\t\t\t<button class=\"${styles.controlButton} ${styles.expandButton}\" title=\"${this.#pageAgent.i18n.t('ui.panel.expand')}\">\n\t\t\t\t\t\t▼\n\t\t\t\t\t</button>\n\t\t\t\t\t<button class=\"${styles.controlButton} ${styles.pauseButton}\" title=\"${this.#pageAgent.i18n.t('ui.panel.pause')}\">\n\t\t\t\t\t\t⏸︎\n\t\t\t\t\t</button>\n\t\t\t\t\t<button class=\"${styles.controlButton} ${styles.stopButton}\" title=\"${this.#pageAgent.i18n.t('ui.panel.stop')}\">\n\t\t\t\t\t\tX\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"${styles.inputSectionWrapper} ${styles.hidden}\">\n\t\t\t\t<div class=\"${styles.inputSection}\">\n\t\t\t\t\t<input \n\t\t\t\t\t\ttype=\"text\" \n\t\t\t\t\t\tclass=\"${styles.taskInput}\" \n\t\t\t\t\t\tmaxlength=\"200\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`\n\n\t\tdocument.body.appendChild(wrapper)\n\t\treturn wrapper\n\t}\n\n\t#setupEventListeners(): void {\n\t\t// Click header area to expand/collapse\n\t\tconst header = this.wrapper.querySelector(`.${styles.header}`)!\n\t\theader.addEventListener('click', (e) => {\n\t\t\t// Don't trigger expand/collapse if clicking on buttons\n\t\t\tif ((e.target as HTMLElement).closest(`.${styles.controlButton}`)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#toggle()\n\t\t})\n\n\t\t// Expand button\n\t\tthis.#expandButton.addEventListener('click', (e) => {\n\t\t\te.stopPropagation()\n\t\t\tthis.#toggle()\n\t\t})\n\n\t\t// Pause/continue button\n\t\tthis.#pauseButton.addEventListener('click', (e) => {\n\t\t\te.stopPropagation()\n\t\t\tthis.#togglePause()\n\t\t})\n\n\t\t// Stop button\n\t\tthis.#stopButton.addEventListener('click', (e) => {\n\t\t\te.stopPropagation()\n\t\t\tthis.#stopAgent()\n\t\t})\n\n\t\t// Submit on Enter key in input field\n\t\tthis.#taskInput.addEventListener('keydown', (e) => {\n\t\t\tif (e.isComposing) return // Ignore IME composition keys\n\t\t\tif (e.key === 'Enter') {\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.#submitTask()\n\t\t\t}\n\t\t})\n\n\t\t// Prevent input area click event bubbling\n\t\tthis.#inputSection.addEventListener('click', (e) => {\n\t\t\te.stopPropagation()\n\t\t})\n\t}\n\n\t#toggle(): void {\n\t\tif (this.#isExpanded) {\n\t\t\tthis.#collapse()\n\t\t} else {\n\t\t\tthis.#expand()\n\t\t}\n\t}\n\n\t#expand(): void {\n\t\tthis.#isExpanded = true\n\t\tthis.wrapper.classList.remove(styles.collapsed)\n\t\tthis.wrapper.classList.add(styles.expanded)\n\t\tthis.#expandButton.textContent = '▲'\n\t}\n\n\t#collapse(): void {\n\t\tthis.#isExpanded = false\n\t\tthis.wrapper.classList.remove(styles.expanded)\n\t\tthis.wrapper.classList.add(styles.collapsed)\n\t\tthis.#expandButton.textContent = '▼'\n\t}\n\n\t/**\n\t * Start periodic header update loop\n\t */\n\t#startHeaderUpdateLoop(): void {\n\t\t// Check every 450ms (same as total animation duration)\n\t\tthis.#headerUpdateTimer = setInterval(() => {\n\t\t\tthis.#checkAndUpdateHeader()\n\t\t}, 450)\n\t}\n\n\t/**\n\t * Stop periodic header update loop\n\t */\n\t#stopHeaderUpdateLoop(): void {\n\t\tif (this.#headerUpdateTimer) {\n\t\t\tclearInterval(this.#headerUpdateTimer)\n\t\t\tthis.#headerUpdateTimer = null\n\t\t}\n\t}\n\n\t/**\n\t * Check if header needs update and trigger animation if not currently animating\n\t */\n\t#checkAndUpdateHeader(): void {\n\t\t// If no pending text or currently animating, skip\n\t\tif (!this.#pendingHeaderText || this.#isAnimating) {\n\t\t\treturn\n\t\t}\n\n\t\t// If text is already displayed, clear pending and skip\n\t\tif (this.#statusText.textContent === this.#pendingHeaderText) {\n\t\t\tthis.#pendingHeaderText = null\n\t\t\treturn\n\t\t}\n\n\t\t// Start animation\n\t\tconst textToShow = this.#pendingHeaderText\n\t\tthis.#pendingHeaderText = null\n\t\tthis.#animateTextChange(textToShow)\n\t}\n\n\t/**\n\t * Animate text change with fade out/in effect\n\t */\n\t#animateTextChange(newText: string): void {\n\t\tthis.#isAnimating = true\n\n\t\t// Fade out current text\n\t\tthis.#statusText.classList.add(styles.fadeOut)\n\n\t\tsetTimeout(() => {\n\t\t\t// Update text content\n\t\t\tthis.#statusText.textContent = newText\n\n\t\t\t// Fade in new text\n\t\t\tthis.#statusText.classList.remove(styles.fadeOut)\n\t\t\tthis.#statusText.classList.add(styles.fadeIn)\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.#statusText.classList.remove(styles.fadeIn)\n\t\t\t\tthis.#isAnimating = false\n\t\t\t}, 300)\n\t\t}, 150) // Half the duration of fade out animation\n\t}\n\n\t#updateStatusIndicator(type: Step['type']): void {\n\t\t// Clear all status classes\n\t\tthis.#indicator.className = styles.indicator\n\n\t\t// Add corresponding status class\n\t\tthis.#indicator.classList.add(styles[type])\n\t}\n\n\t#updateHistory(): void {\n\t\tconst steps = this.#state.getAllSteps()\n\n\t\tthis.#historySection.innerHTML = steps.map((step) => this.#createHistoryItem(step)).join('')\n\n\t\t// Scroll to bottom to show latest records\n\t\tthis.#scrollToBottom()\n\t}\n\n\t#scrollToBottom(): void {\n\t\t// Execute in next event loop to ensure DOM update completion\n\t\tsetTimeout(() => {\n\t\t\tthis.#historySection.scrollTop = this.#historySection.scrollHeight\n\t\t}, 0)\n\t}\n\n\t#createHistoryItem(step: Step): string {\n\t\tconst time = step.timestamp.toLocaleTimeString('zh-CN', {\n\t\t\thour12: false,\n\t\t\thour: '2-digit',\n\t\t\tminute: '2-digit',\n\t\t\tsecond: '2-digit',\n\t\t})\n\n\t\tlet typeClass = ''\n\t\tlet statusIcon = ''\n\n\t\t// Set styles and icons based on step type\n\t\tif (step.type === 'completed') {\n\t\t\t// Check if this is a result from done tool\n\t\t\tif (step.toolName === 'done') {\n\t\t\t\t// Judge success or failure based on result\n\t\t\t\tconst failureKeyword = this.#pageAgent.i18n.t('ui.tools.resultFailure')\n\t\t\t\tconst errorKeyword = this.#pageAgent.i18n.t('ui.tools.resultError')\n\t\t\t\tconst isSuccess =\n\t\t\t\t\t!step.toolResult ||\n\t\t\t\t\t(!step.toolResult.includes(failureKeyword) && !step.toolResult.includes(errorKeyword))\n\t\t\t\ttypeClass = isSuccess ? styles.doneSuccess : styles.doneError\n\t\t\t\tstatusIcon = isSuccess ? '🎉' : '❌'\n\t\t\t} else {\n\t\t\t\ttypeClass = styles.completed\n\t\t\t\tstatusIcon = '✅'\n\t\t\t}\n\t\t} else if (step.type === 'error') {\n\t\t\ttypeClass = styles.error\n\t\t\tstatusIcon = '❌'\n\t\t} else if (step.type === 'tool_executing') {\n\t\t\tstatusIcon = '⚙️'\n\t\t} else if (step.type === 'output') {\n\t\t\ttypeClass = styles.output\n\t\t\tstatusIcon = '🤖'\n\t\t} else if (step.type === 'input') {\n\t\t\ttypeClass = styles.input\n\t\t\tstatusIcon = '🎯'\n\t\t} else if (step.type === 'retry') {\n\t\t\ttypeClass = styles.retry\n\t\t\tstatusIcon = '🔄'\n\t\t} else {\n\t\t\tstatusIcon = '🧠'\n\t\t}\n\n\t\tconst durationText = step.duration ? ` · ${step.duration}ms` : ''\n\t\tconst stepLabel = this.#pageAgent.i18n.t('ui.panel.step', {\n\t\t\tnumber: step.stepNumber.toString(),\n\t\t\ttime,\n\t\t\tduration: durationText || '', // Explicitly pass empty string to replace template\n\t\t})\n\n\t\treturn `\n\t\t\t<div class=\"${styles.historyItem} ${typeClass}\">\n\t\t\t\t<div class=\"${styles.historyContent}\">\n\t\t\t\t\t<span class=\"${styles.statusIcon}\">${statusIcon}</span>\n\t\t\t\t\t<span>${step.displayText}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"${styles.historyMeta}\">\n\t\t\t\t\t${stepLabel}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\n/**\n * Get display text for tool execution\n */\nexport function getToolExecutingText(toolName: string, args: any, i18n: I18n): string {\n\tswitch (toolName) {\n\t\tcase 'click_element_by_index':\n\t\t\treturn i18n.t('ui.tools.clicking', { index: args.index })\n\t\tcase 'input_text':\n\t\t\treturn i18n.t('ui.tools.inputting', { index: args.index })\n\t\tcase 'select_dropdown_option':\n\t\t\treturn i18n.t('ui.tools.selecting', { text: args.text })\n\t\tcase 'scroll':\n\t\t\treturn i18n.t('ui.tools.scrolling')\n\t\tcase 'wait':\n\t\t\treturn i18n.t('ui.tools.waiting', { seconds: args.seconds })\n\t\tcase 'done':\n\t\t\treturn i18n.t('ui.tools.done')\n\t\tdefault:\n\t\t\treturn i18n.t('ui.tools.executing', { toolName })\n\t}\n}\n\n/**\n * Get display text for tool completion\n */\nexport function getToolCompletedText(toolName: string, args: any, i18n: I18n): string | null {\n\tswitch (toolName) {\n\t\tcase 'click_element_by_index':\n\t\t\treturn i18n.t('ui.tools.clicked', { index: args.index })\n\t\tcase 'input_text':\n\t\t\treturn i18n.t('ui.tools.inputted', { text: args.text })\n\t\tcase 'select_dropdown_option':\n\t\t\treturn i18n.t('ui.tools.selected', { text: args.text })\n\t\tcase 'scroll':\n\t\t\treturn i18n.t('ui.tools.scrolled')\n\t\tcase 'wait':\n\t\t\treturn i18n.t('ui.tools.waited')\n\t\tcase 'done':\n\t\t\treturn null\n\t\tdefault:\n\t\t\treturn null\n\t}\n}\n","/**\n * Checks for common dark mode CSS classes on the html or body elements.\n * @returns {boolean} - True if a common dark mode class is found.\n */\nfunction hasDarkModeClass() {\n\tconst DFEAULT_DARK_MODE_CLASSES = ['dark', 'dark-mode', 'theme-dark', 'night', 'night-mode']\n\n\tconst htmlElement = document.documentElement\n\tconst bodyElement = document.body\n\n\t// Check class names on <html> and <body>\n\tfor (const className of DFEAULT_DARK_MODE_CLASSES) {\n\t\tif (htmlElement.classList.contains(className) || bodyElement.classList.contains(className)) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\t// Some sites use data attributes\n\tconst darkThemeAttribute = htmlElement.getAttribute('data-theme')\n\tif (darkThemeAttribute?.toLowerCase().includes('dark')) {\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n/**\n * Parses an RGB or RGBA color string and returns an object with r, g, b properties.\n * @param {string} colorString - e.g., \"rgb(34, 34, 34)\" or \"rgba(0, 0, 0, 0.5)\"\n * @returns {{r: number, g: number, b: number}|null}\n */\nfunction parseRgbColor(colorString: string) {\n\tconst rgbMatch = /rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/.exec(colorString)\n\tif (!rgbMatch) {\n\t\treturn null // Not a valid rgb/rgba string\n\t}\n\treturn {\n\t\tr: parseInt(rgbMatch[1]),\n\t\tg: parseInt(rgbMatch[2]),\n\t\tb: parseInt(rgbMatch[3]),\n\t}\n}\n\n/**\n * Determines if a color is \"dark\" based on its calculated luminance.\n * @param {string} colorString - The CSS color string (e.g., \"rgb(50, 50, 50)\").\n * @param {number} threshold - A value between 0 and 255. Colors with luminance below this will be considered dark. Default is 128.\n * @returns {boolean} - True if the color is considered dark.\n */\nfunction isColorDark(colorString: string, threshold = 128) {\n\tif (!colorString || colorString === 'transparent' || colorString.startsWith('rgba(0, 0, 0, 0)')) {\n\t\treturn false // Transparent is not dark\n\t}\n\n\tconst rgb = parseRgbColor(colorString)\n\tif (!rgb) {\n\t\treturn false // Could not parse color\n\t}\n\n\t// Calculate perceived luminance using the standard formula\n\tconst luminance = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b\n\n\treturn luminance < threshold\n}\n\n/**\n * Checks the background color of the body element to determine if the page is dark.\n * @returns {boolean}\n */\nfunction isBackgroundDark() {\n\t// We check both <html> and <body> because some pages set the color on <html>\n\tconst htmlStyle = window.getComputedStyle(document.documentElement)\n\tconst bodyStyle = window.getComputedStyle(document.body)\n\n\t// Get background colors\n\tconst htmlBgColor = htmlStyle.backgroundColor\n\tconst bodyBgColor = bodyStyle.backgroundColor\n\n\t// The body's background might be transparent, in which case we should\n\t// fall back to the html element's background.\n\tif (isColorDark(bodyBgColor)) {\n\t\treturn true\n\t} else if (bodyBgColor === 'transparent' || bodyBgColor.startsWith('rgba(0, 0, 0, 0)')) {\n\t\treturn isColorDark(htmlBgColor)\n\t}\n\n\treturn false\n}\n\n/**\n * A comprehensive function to determine if the page is currently in a dark theme.\n * It combines class checking and background color analysis.\n * @returns {boolean} - True if the page is likely dark.\n */\nexport function isPageDark() {\n\t// Strategy 1: Check for common dark mode classes\n\tif (hasDarkModeClass()) {\n\t\treturn true\n\t}\n\n\t// Strategy 2: Analyze the computed background color\n\tif (isBackgroundDark()) {\n\t\treturn true\n\t}\n\n\t// @TODO add more checks here, e.g., analyzing text color,\n\t// or checking the background of major layout elements like <main> or #app.\n\n\treturn false\n}\n","import { Motion } from 'ai-motion'\n\nimport { isPageDark } from '../utils/checkDarkMode'\n\nimport styles from './SimulatorMask.module.css'\nimport cursorStyles from './cursor.module.css'\n\nexport class SimulatorMask {\n\twrapper = document.createElement('div')\n\tmotion = new Motion({\n\t\tmode: isPageDark() ? 'dark' : 'light',\n\t\tstyles: {\n\t\t\tposition: 'absolute',\n\t\t\tinset: '0',\n\t\t},\n\t})\n\n\t#cursor = document.createElement('div')\n\n\t#currentCursorX = 0\n\t#currentCursorY = 0\n\n\t#targetCursorX = 0\n\t#targetCursorY = 0\n\n\tconstructor() {\n\t\tthis.wrapper.id = 'page-agent-runtime_simulator-mask'\n\t\tthis.wrapper.className = styles.wrapper\n\t\tthis.wrapper.setAttribute('data-browser-use-ignore', 'true')\n\n\t\tthis.wrapper.appendChild(this.motion.element)\n\t\tthis.motion.autoResize(this.wrapper)\n\n\t\t// Capture all mouse, keyboard, and wheel events\n\t\tthis.wrapper.addEventListener('click', (e) => {\n\t\t\te.stopPropagation()\n\t\t\te.preventDefault()\n\t\t})\n\t\tthis.wrapper.addEventListener('mousedown', (e) => {\n\t\t\te.stopPropagation()\n\t\t\te.preventDefault()\n\t\t})\n\t\tthis.wrapper.addEventListener('mouseup', (e) => {\n\t\t\te.stopPropagation()\n\t\t\te.preventDefault()\n\t\t})\n\t\tthis.wrapper.addEventListener('mousemove', (e) => {\n\t\t\te.stopPropagation()\n\t\t\te.preventDefault()\n\t\t})\n\t\tthis.wrapper.addEventListener('wheel', (e) => {\n\t\t\te.stopPropagation()\n\t\t\te.preventDefault()\n\t\t})\n\t\tthis.wrapper.addEventListener('keydown', (e) => {\n\t\t\te.stopPropagation()\n\t\t\te.preventDefault()\n\t\t})\n\t\tthis.wrapper.addEventListener('keyup', (e) => {\n\t\t\te.stopPropagation()\n\t\t\te.preventDefault()\n\t\t})\n\n\t\t// Create AI cursor\n\t\tthis.#createCursor()\n\t\t// this.show()\n\n\t\tdocument.body.appendChild(this.wrapper)\n\n\t\tthis.#moveCursorToTarget()\n\n\t\twindow.addEventListener('PageAgent::MovePointerTo', (event: Event) => {\n\t\t\tconst { x, y } = (event as CustomEvent).detail\n\t\t\tthis.setCursorPosition(x, y)\n\t\t})\n\n\t\twindow.addEventListener('PageAgent::ClickPointer', (event: Event) => {\n\t\t\tthis.triggerClickAnimation()\n\t\t})\n\t}\n\n\t#createCursor() {\n\t\tthis.#cursor.className = cursorStyles.cursor\n\n\t\t// Create ripple effect container\n\t\tconst rippleContainer = document.createElement('div')\n\t\trippleContainer.className = cursorStyles.cursorRipple\n\t\tthis.#cursor.appendChild(rippleContainer)\n\n\t\t// Create filling layer\n\t\tconst fillingLayer = document.createElement('div')\n\t\tfillingLayer.className = cursorStyles.cursorFilling\n\t\tthis.#cursor.appendChild(fillingLayer)\n\n\t\t// Create border layer\n\t\tconst borderLayer = document.createElement('div')\n\t\tborderLayer.className = cursorStyles.cursorBorder\n\t\tthis.#cursor.appendChild(borderLayer)\n\n\t\tthis.wrapper.appendChild(this.#cursor)\n\t}\n\n\t#moveCursorToTarget() {\n\t\tconst newX = this.#currentCursorX + (this.#targetCursorX - this.#currentCursorX) * 0.2\n\t\tconst newY = this.#currentCursorY + (this.#targetCursorY - this.#currentCursorY) * 0.2\n\n\t\tconst xDistance = Math.abs(newX - this.#targetCursorX)\n\t\tif (xDistance > 0) {\n\t\t\tif (xDistance < 2) {\n\t\t\t\tthis.#currentCursorX = this.#targetCursorX\n\t\t\t} else {\n\t\t\t\tthis.#currentCursorX = newX\n\t\t\t}\n\t\t\tthis.#cursor.style.left = `${this.#currentCursorX}px`\n\t\t}\n\n\t\tconst yDistance = Math.abs(newY - this.#targetCursorY)\n\t\tif (yDistance > 0) {\n\t\t\tif (yDistance < 2) {\n\t\t\t\tthis.#currentCursorY = this.#targetCursorY\n\t\t\t} else {\n\t\t\t\tthis.#currentCursorY = newY\n\t\t\t}\n\t\t\tthis.#cursor.style.top = `${this.#currentCursorY}px`\n\t\t}\n\n\t\trequestAnimationFrame(() => this.#moveCursorToTarget())\n\t}\n\n\tsetCursorPosition(x: number, y: number) {\n\t\tthis.#targetCursorX = x\n\t\tthis.#targetCursorY = y\n\t}\n\n\ttriggerClickAnimation() {\n\t\tthis.#cursor.classList.remove(cursorStyles.clicking)\n\t\t// Force reflow to restart animation\n\t\tvoid this.#cursor.offsetHeight\n\t\tthis.#cursor.classList.add(cursorStyles.clicking)\n\t}\n\n\tshow() {\n\t\tthis.motion.start()\n\t\tthis.motion.fadeIn()\n\n\t\tthis.wrapper.style.display = 'block'\n\n\t\t// Initialize cursor position\n\t\tthis.#currentCursorX = window.innerWidth / 2\n\t\tthis.#currentCursorY = window.innerHeight / 2\n\t\tthis.#targetCursorX = this.#currentCursorX\n\t\tthis.#targetCursorY = this.#currentCursorY\n\t\tthis.#cursor.style.left = `${this.#currentCursorX}px`\n\t\tthis.#cursor.style.top = `${this.#currentCursorY}px`\n\t}\n\n\thide() {\n\t\tthis.motion.fadeOut()\n\t\tthis.motion.pause()\n\n\t\tthis.#cursor.classList.remove(cursorStyles.clicking)\n\n\t\tsetTimeout(() => {\n\t\t\tthis.wrapper.style.display = 'none'\n\t\t}, 800) // Match the animation duration\n\t}\n\n\tdispose() {\n\t\tthis.motion.dispose()\n\t\tthis.wrapper.remove()\n\t}\n}\n","import chalk from 'chalk'\n\n/**\n * Simple assertion function that throws an error if the condition is falsy\n * @param condition - The condition to assert\n * @param message - Optional error message\n * @throws Error if condition is falsy\n */\nexport function assert(condition: unknown, message?: string, silent?: boolean): asserts condition {\n\tif (!condition) {\n\t\tconst errorMessage = message ?? 'Assertion failed'\n\n\t\tif (!silent) console.error(chalk.red(`❌ assert: ${errorMessage}`))\n\n\t\tthrow new Error(errorMessage)\n\t}\n}\n","/**\n * Copyright (C) 2025 Alibaba Group Holding Limited\n * All rights reserved.\n */\nimport { PageController } from '@page-agent/page-controller'\nimport chalk from 'chalk'\nimport zod from 'zod'\n\nimport type { PageAgentConfig } from './config'\nimport { MAX_STEPS } from './config/constants'\nimport { I18n } from './i18n'\nimport { LLM, type Tool } from './llms'\nimport SYSTEM_PROMPT from './prompts/system_prompt.md?raw'\nimport { tools } from './tools'\nimport { Panel, getToolCompletedText, getToolExecutingText } from './ui/Panel'\nimport { SimulatorMask } from './ui/SimulatorMask'\nimport { trimLines, uid, waitUntil } from './utils'\nimport { assert } from './utils/assert'\nimport { getEventBus } from './utils/bus'\n\nexport type { PageAgentConfig }\nexport { tool, type PageAgentTool } from './tools'\n\nexport interface AgentBrain {\n\t// thinking?: string\n\tevaluation_previous_goal: string\n\tmemory: string\n\tnext_goal: string\n}\n\n/**\n * MacroTool input structure\n */\nexport interface MacroToolInput {\n\tevaluation_previous_goal?: string\n\tmemory?: string\n\tnext_goal?: string\n\taction: Record<string, any>\n}\n\n/**\n * MacroTool output structure\n */\nexport interface MacroToolResult {\n\tinput: MacroToolInput\n\toutput: string\n}\n\nexport interface AgentHistory {\n\tbrain: AgentBrain\n\taction: {\n\t\tname: string\n\t\tinput: any\n\t\toutput: string\n\t}\n\tusage: {\n\t\tpromptTokens: number\n\t\tcompletionTokens: number\n\t\ttotalTokens: number\n\t\tcachedTokens?: number\n\t\treasoningTokens?: number\n\t}\n}\n\nexport interface ExecutionResult {\n\tsuccess: boolean\n\tdata: string\n\thistory: AgentHistory[]\n}\n\nexport class PageAgent extends EventTarget {\n\tconfig: PageAgentConfig\n\tid = uid()\n\tbus = getEventBus(this.id)\n\ti18n: I18n\n\tpanel: Panel\n\ttools: typeof tools\n\tpaused = false\n\tdisposed = false\n\ttask = ''\n\ttaskId = ''\n\n\t#llm: LLM\n\t#totalWaitTime = 0\n\t#abortController = new AbortController()\n\n\t/** PageController for DOM operations */\n\tpageController: PageController\n\n\t/** Fullscreen mask */\n\tmask = new SimulatorMask()\n\t/** History records */\n\thistory: AgentHistory[] = []\n\n\tconstructor(config: PageAgentConfig = {}) {\n\t\tsuper()\n\n\t\tthis.config = config\n\t\tthis.#llm = new LLM(this.config, this.id)\n\t\tthis.i18n = new I18n(this.config.language)\n\t\tthis.panel = new Panel(this)\n\t\tthis.tools = new Map(tools)\n\n\t\t// Initialize PageController with config\n\t\tthis.pageController = new PageController(this.config)\n\n\t\tif (this.config.customTools) {\n\t\t\tfor (const [name, tool] of Object.entries(this.config.customTools)) {\n\t\t\t\tif (tool === null) {\n\t\t\t\t\tthis.tools.delete(name)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tthis.tools.set(name, tool)\n\t\t\t}\n\t\t}\n\n\t\tif (!this.config.experimentalScriptExecutionTool) {\n\t\t\tthis.tools.delete('execute_javascript')\n\t\t}\n\n\t\twindow.addEventListener('beforeunload', (e) => {\n\t\t\tif (!this.disposed) this.dispose('PAGE_UNLOADING')\n\t\t})\n\t}\n\n\t/**\n\t * @todo maybe return something?\n\t */\n\tasync execute(task: string): Promise<ExecutionResult> {\n\t\tif (!task) throw new Error('Task is required')\n\t\tthis.task = task\n\t\tthis.taskId = uid()\n\n\t\tconst onBeforeStep = this.config.onBeforeStep || (() => void 0)\n\t\tconst onAfterStep = this.config.onAfterStep || (() => void 0)\n\t\tconst onBeforeTask = this.config.onBeforeTask || (() => void 0)\n\t\tconst onAfterTask = this.config.onAfterTask || (() => void 0)\n\n\t\tawait onBeforeTask.call(this)\n\n\t\t// Show mask and panel\n\t\tthis.mask.show()\n\n\t\tthis.bus.emit('panel:show')\n\t\tthis.bus.emit('panel:reset')\n\n\t\tthis.bus.emit('panel:update', {\n\t\t\ttype: 'input',\n\t\t\tdisplayText: this.task,\n\t\t})\n\n\t\tif (this.#abortController) {\n\t\t\tthis.#abortController.abort()\n\t\t\tthis.#abortController = new AbortController()\n\t\t}\n\n\t\tthis.history = []\n\n\t\ttry {\n\t\t\tlet step = 0\n\n\t\t\twhile (true) {\n\t\t\t\tawait onBeforeStep.call(this, step)\n\n\t\t\t\tconsole.group(`step: ${step}`)\n\n\t\t\t\t// abort\n\t\t\t\tif (this.#abortController.signal.aborted) throw new Error('AbortError')\n\t\t\t\t// pause\n\t\t\t\tawait waitUntil(() => !this.paused)\n\n\t\t\t\t// Update status to thinking\n\t\t\t\tconsole.log(chalk.blue('Thinking...'))\n\t\t\t\tthis.bus.emit('panel:update', {\n\t\t\t\t\ttype: 'thinking',\n\t\t\t\t\tdisplayText: this.i18n.t('ui.panel.thinking'),\n\t\t\t\t})\n\n\t\t\t\tconst result = await this.#llm.invoke(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trole: 'system',\n\t\t\t\t\t\t\tcontent: this.#getSystemPrompt(),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trole: 'user',\n\t\t\t\t\t\t\tcontent: await this.#assembleUserPrompt(),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t{ AgentOutput: this.#packMacroTool() },\n\t\t\t\t\tthis.#abortController.signal\n\t\t\t\t)\n\n\t\t\t\tconst macroResult = result.toolResult as MacroToolResult\n\t\t\t\tconst input = macroResult.input\n\t\t\t\tconst output = macroResult.output\n\t\t\t\tconst brain = {\n\t\t\t\t\tevaluation_previous_goal: input.evaluation_previous_goal || '',\n\t\t\t\t\tmemory: input.memory || '',\n\t\t\t\t\tnext_goal: input.next_goal || '',\n\t\t\t\t}\n\t\t\t\tconst actionName = Object.keys(input.action)[0]\n\t\t\t\tconst action = {\n\t\t\t\t\tname: actionName,\n\t\t\t\t\tinput: input.action[actionName],\n\t\t\t\t\toutput: output,\n\t\t\t\t}\n\n\t\t\t\tthis.history.push({\n\t\t\t\t\tbrain,\n\t\t\t\t\taction,\n\t\t\t\t\tusage: result.usage,\n\t\t\t\t})\n\n\t\t\t\tconsole.log(chalk.green('Step finished:'), actionName)\n\t\t\t\tconsole.groupEnd()\n\n\t\t\t\tawait onAfterStep.call(this, step, this.history)\n\n\t\t\t\tstep++\n\t\t\t\tif (step > MAX_STEPS) {\n\t\t\t\t\tthis.#onDone('Step count exceeded maximum limit', false)\n\t\t\t\t\tconst result: ExecutionResult = {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tdata: 'Step count exceeded maximum limit',\n\t\t\t\t\t\thistory: this.history,\n\t\t\t\t\t}\n\t\t\t\t\tawait onAfterTask.call(this, result)\n\t\t\t\t\treturn result\n\t\t\t\t}\n\t\t\t\tif (actionName === 'done') {\n\t\t\t\t\tconst success = action.input?.success ?? false\n\t\t\t\t\tconst text = action.input?.text || 'no text provided'\n\t\t\t\t\tconsole.log(chalk.green.bold('Task completed'), success, text)\n\t\t\t\t\tthis.#onDone(text, success)\n\t\t\t\t\tconst result: ExecutionResult = {\n\t\t\t\t\t\tsuccess,\n\t\t\t\t\t\tdata: text,\n\t\t\t\t\t\thistory: this.history,\n\t\t\t\t\t}\n\t\t\t\t\tawait onAfterTask.call(this, result)\n\t\t\t\t\treturn result\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error: unknown) {\n\t\t\tconsole.error('Task failed', error)\n\t\t\tthis.#onDone(String(error), false)\n\t\t\tconst result: ExecutionResult = {\n\t\t\t\tsuccess: false,\n\t\t\t\tdata: String(error),\n\t\t\t\thistory: this.history,\n\t\t\t}\n\t\t\tawait onAfterTask.call(this, result)\n\t\t\treturn result\n\t\t}\n\t}\n\n\t/**\n\t * Merge all tools into a single MacroTool with the following input:\n\t * - thinking: string\n\t * - evaluation_previous_goal: string\n\t * - memory: string\n\t * - next_goal: string\n\t * - action: { toolName: toolInput }\n\t * where action must be selected from tools defined in this.tools\n\t */\n\t#packMacroTool(): Tool<MacroToolInput, MacroToolResult> {\n\t\tconst tools = this.tools\n\n\t\tconst actionSchemas = Array.from(tools.entries()).map(([toolName, tool]) => {\n\t\t\treturn zod.object({\n\t\t\t\t[toolName]: tool.inputSchema,\n\t\t\t})\n\t\t})\n\n\t\tconst actionSchema = zod.union(\n\t\t\tactionSchemas as unknown as [zod.ZodType, zod.ZodType, ...zod.ZodType[]]\n\t\t)\n\n\t\tconst macroToolSchema = zod.object({\n\t\t\t// thinking: zod.string().optional(),\n\t\t\tevaluation_previous_goal: zod.string().optional(),\n\t\t\tmemory: zod.string().optional(),\n\t\t\tnext_goal: zod.string().optional(),\n\t\t\taction: actionSchema,\n\t\t})\n\n\t\treturn {\n\t\t\tinputSchema: macroToolSchema as zod.ZodType<MacroToolInput>,\n\t\t\texecute: async (input: MacroToolInput): Promise<MacroToolResult> => {\n\t\t\t\t// abort\n\t\t\t\tif (this.#abortController.signal.aborted) throw new Error('AbortError')\n\t\t\t\t// pause\n\t\t\t\tawait waitUntil(() => !this.paused)\n\n\t\t\t\tconsole.log(chalk.blue.bold('MacroTool execute'), input)\n\t\t\t\tconst action = input.action\n\n\t\t\t\tconst toolName = Object.keys(action)[0]\n\t\t\t\tconst toolInput = action[toolName]\n\t\t\t\tconst brain = trimLines(`✅: ${input.evaluation_previous_goal}\n\t\t\t\t\t\t💾: ${input.memory}\n\t\t\t\t\t\t🎯: ${input.next_goal}\n\t\t\t\t\t`)\n\n\t\t\t\tconsole.log(brain)\n\t\t\t\tthis.bus.emit('panel:update', {\n\t\t\t\t\ttype: 'thinking',\n\t\t\t\t\tdisplayText: brain,\n\t\t\t\t})\n\n\t\t\t\t// Find the corresponding tool\n\t\t\t\tconst tool = tools.get(toolName)\n\t\t\t\tassert(tool, `Tool ${toolName} not found. (@note should have been caught before this!!!)`)\n\n\t\t\t\tconsole.log(chalk.blue.bold(`Executing tool: ${toolName}`), toolInput)\n\t\t\t\tthis.bus.emit('panel:update', {\n\t\t\t\t\ttype: 'tool_executing',\n\t\t\t\t\ttoolName,\n\t\t\t\t\ttoolArgs: toolInput,\n\t\t\t\t\tdisplayText: getToolExecutingText(toolName, toolInput, this.i18n),\n\t\t\t\t})\n\n\t\t\t\tconst startTime = Date.now()\n\n\t\t\t\t// Execute tool, bind `this` to PageAgent\n\t\t\t\tlet result = await tool.execute.bind(this)(toolInput)\n\n\t\t\t\tconst duration = Date.now() - startTime\n\t\t\t\tconsole.log(chalk.green.bold(`Tool (${toolName}) executed for ${duration}ms`), result)\n\n\t\t\t\tif (toolName === 'wait') {\n\t\t\t\t\tthis.#totalWaitTime += Math.round(toolInput.seconds + duration / 1000)\n\t\t\t\t\tresult += `\\n<sys> You have waited ${this.#totalWaitTime} seconds accumulatively.`\n\t\t\t\t\tif (this.#totalWaitTime >= 3)\n\t\t\t\t\t\tresult += '\\nDo NOT wait any longer unless you have a good reason.\\n'\n\t\t\t\t\tresult += '</sys>'\n\t\t\t\t} else {\n\t\t\t\t\t// For other tools, reset wait time\n\t\t\t\t\tthis.#totalWaitTime = 0\n\t\t\t\t}\n\n\t\t\t\t// Briefly display execution result\n\t\t\t\tconst displayResult = getToolCompletedText(toolName, toolInput, this.i18n)\n\t\t\t\tif (displayResult)\n\t\t\t\t\tthis.bus.emit('panel:update', {\n\t\t\t\t\t\ttype: 'tool_executing',\n\t\t\t\t\t\ttoolName,\n\t\t\t\t\t\ttoolArgs: toolInput,\n\t\t\t\t\t\ttoolResult: result,\n\t\t\t\t\t\tdisplayText: displayResult,\n\t\t\t\t\t\tduration,\n\t\t\t\t\t})\n\n\t\t\t\t// Wait a moment to let user see the result\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 100))\n\n\t\t\t\t// Return structured result\n\t\t\t\treturn {\n\t\t\t\t\tinput,\n\t\t\t\t\toutput: result,\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t}\n\n\t/**\n\t * Get system prompt, dynamically replace language settings based on configured language\n\t */\n\t#getSystemPrompt(): string {\n\t\tlet systemPrompt = SYSTEM_PROMPT\n\n\t\tconst targetLanguage = this.config.language === 'zh-CN' ? '中文' : 'English'\n\t\tsystemPrompt = systemPrompt.replace(\n\t\t\t/Default working language: \\*\\*.*?\\*\\*/,\n\t\t\t`Default working language: **${targetLanguage}**`\n\t\t)\n\n\t\treturn systemPrompt\n\t}\n\n\tasync #assembleUserPrompt(): Promise<string> {\n\t\tlet prompt = ''\n\n\t\t// <agent_history>\n\t\t// - <step_>\n\n\t\tprompt += '<agent_history>\\n'\n\n\t\tthis.history.forEach((history, index) => {\n\t\t\tprompt += `<step_${index + 1}>\n\t\t\t\tEvaluation of Previous Step: ${history.brain.evaluation_previous_goal}\n\t\t\t\tMemory: ${history.brain.memory}\n\t\t\t\tNext Goal: ${history.brain.next_goal}\n\t\t\t\tAction Results: ${history.action.output}\n\t\t\t\t</step_${index + 1}>\n\t\t\t`\n\t\t})\n\n\t\tprompt += '</agent_history>\\n\\n'\n\n\t\t// <agent_state>\n\t\t// - <user_request>\n\t\t// - <step_info>\n\t\t// <agent_state>\n\n\t\tprompt += `<agent_state>\n\t\t\t<user_request>\n\t\t\t${this.task}\n\t\t\t</user_request>\n\t\t\t<step_info>\n\t\t\tStep ${this.history.length + 1} of ${MAX_STEPS} max possible steps\n\t\t\tCurrent date and time: ${new Date().toISOString()}\n\t\t\t</step_info>\n\t\t\t</agent_state>\n\t\t`\n\n\t\t// <browser_state>\n\n\t\tprompt += await this.#getBrowserState()\n\n\t\treturn trimLines(prompt)\n\t}\n\n\t#onDone(text: string, success = true) {\n\t\tthis.pageController.cleanUpHighlights()\n\n\t\t// Update panel status\n\t\tthis.bus.emit('panel:update', {\n\t\t\ttype: success ? 'output' : 'error',\n\t\t\tdisplayText: text,\n\t\t})\n\n\t\t// Task completed\n\t\tthis.bus.emit('panel:update', {\n\t\t\ttype: 'completed',\n\t\t\tdisplayText: this.i18n.t('ui.panel.taskCompleted'),\n\t\t})\n\n\t\tthis.mask.hide()\n\n\t\tthis.#abortController.abort()\n\t}\n\n\tasync #getBrowserState(): Promise<string> {\n\t\tconst pageUrl = await this.pageController.getCurrentUrl()\n\t\tconst pageTitle = await this.pageController.getPageTitle()\n\t\tconst pi = await this.pageController.getPageInfo()\n\t\tconst viewportExpansion = await this.pageController.getViewportExpansion()\n\n\t\tthis.mask.wrapper.style.pointerEvents = 'none'\n\t\tawait this.pageController.updateTree()\n\t\tthis.mask.wrapper.style.pointerEvents = 'auto'\n\n\t\tconst simplifiedHTML = await this.pageController.getSimplifiedHTML()\n\n\t\tlet prompt = trimLines(`<browser_state>\n\t\t\tCurrent Page: [${pageTitle}](${pageUrl})\n\n\t\t\tPage info: ${pi.viewport_width}x${pi.viewport_height}px viewport, ${pi.page_width}x${pi.page_height}px total page size, ${pi.pages_above.toFixed(1)} pages above, ${pi.pages_below.toFixed(1)} pages below, ${pi.total_pages.toFixed(1)} total pages, at ${(pi.current_page_position * 100).toFixed(0)}% of page\n\n\t\t\t${viewportExpansion === -1 ? 'Interactive elements from top layer of the current page (full page):' : 'Interactive elements from top layer of the current page inside the viewport:'}\n\n\t\t`)\n\n\t\t// Page header info\n\t\tconst has_content_above = pi.pixels_above > 4\n\t\tif (has_content_above && viewportExpansion !== -1) {\n\t\t\tprompt += `... ${pi.pixels_above} pixels above (${pi.pages_above.toFixed(1)} pages) - scroll to see more ...\\n`\n\t\t} else {\n\t\t\tprompt += `[Start of page]\\n`\n\t\t}\n\n\t\t// Current viewport info\n\t\tprompt += simplifiedHTML\n\t\tprompt += `\\n`\n\n\t\t// Page footer info\n\t\tconst has_content_below = pi.pixels_below > 4\n\t\tif (has_content_below && viewportExpansion !== -1) {\n\t\t\tprompt += `... ${pi.pixels_below} pixels below (${pi.pages_below.toFixed(1)} pages) - scroll to see more ...\\n`\n\t\t} else {\n\t\t\tprompt += `[End of page]\\n`\n\t\t}\n\n\t\tprompt += `</browser_state>\\n`\n\n\t\treturn prompt\n\t}\n\n\tdispose(reason?: string) {\n\t\tconsole.log('Disposing PageAgent...')\n\t\tthis.disposed = true\n\t\tthis.pageController.dispose()\n\t\tthis.panel.dispose()\n\t\tthis.mask.dispose()\n\t\tthis.history = []\n\t\tthis.#abortController.abort(reason ?? 'PageAgent disposed')\n\n\t\tthis.config.onDispose?.call(this, reason)\n\t}\n}\n"],"names":["__name","waitFor","error","tool","tools","result","withRetry","input","_bus","styles","wrapper","header","statusIcon","output"],"mappings":"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"}
1
+ {"version":3,"file":"page-agent.js","sources":["../../../page-controller/dist/lib/page-controller.js","../../../ui/dist/lib/page-agent-ui.js","../../src/config/constants.ts","../../src/config/index.ts","../../src/llms/errors.ts","../../src/llms/utils.ts","../../src/llms/OpenAILenientClient.ts","../../src/llms/index.ts","../../src/prompts/system_prompt.md?raw","../../src/utils/index.ts","../../src/tools/index.ts","../../src/utils/assert.ts","../../src/PageAgent.ts"],"sourcesContent":["var __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\nasync function waitFor(seconds) {\n await new Promise((resolve) => setTimeout(resolve, seconds * 1e3));\n}\n__name(waitFor, \"waitFor\");\nasync function movePointerToElement(element) {\n const rect = element.getBoundingClientRect();\n const x = rect.left + rect.width / 2;\n const y = rect.top + rect.height / 2;\n window.dispatchEvent(new CustomEvent(\"PageAgent::MovePointerTo\", { detail: { x, y } }));\n await waitFor(0.3);\n}\n__name(movePointerToElement, \"movePointerToElement\");\nfunction getElementByIndex(selectorMap, index) {\n const interactiveNode = selectorMap.get(index);\n if (!interactiveNode) {\n throw new Error(`No interactive element found at index ${index}`);\n }\n const element = interactiveNode.ref;\n if (!element) {\n throw new Error(`Element at index ${index} does not have a reference`);\n }\n if (!(element instanceof HTMLElement)) {\n throw new Error(`Element at index ${index} is not an HTMLElement`);\n }\n return element;\n}\n__name(getElementByIndex, \"getElementByIndex\");\nlet lastClickedElement = null;\nfunction blurLastClickedElement() {\n if (lastClickedElement) {\n lastClickedElement.blur();\n lastClickedElement.dispatchEvent(\n new MouseEvent(\"mouseout\", { bubbles: true, cancelable: true })\n );\n lastClickedElement = null;\n }\n}\n__name(blurLastClickedElement, \"blurLastClickedElement\");\nasync function clickElement(element) {\n blurLastClickedElement();\n lastClickedElement = element;\n await scrollIntoViewIfNeeded(element);\n await movePointerToElement(element);\n window.dispatchEvent(new CustomEvent(\"PageAgent::ClickPointer\"));\n await waitFor(0.1);\n element.dispatchEvent(new MouseEvent(\"mouseenter\", { bubbles: true, cancelable: true }));\n element.dispatchEvent(new MouseEvent(\"mouseover\", { bubbles: true, cancelable: true }));\n element.dispatchEvent(new MouseEvent(\"mousedown\", { bubbles: true, cancelable: true }));\n element.focus();\n element.dispatchEvent(new MouseEvent(\"mouseup\", { bubbles: true, cancelable: true }));\n element.dispatchEvent(new MouseEvent(\"click\", { bubbles: true, cancelable: true }));\n await waitFor(0.1);\n}\n__name(clickElement, \"clickElement\");\nconst nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n window.HTMLInputElement.prototype,\n \"value\"\n).set;\nconst nativeTextAreaValueSetter = Object.getOwnPropertyDescriptor(\n window.HTMLTextAreaElement.prototype,\n \"value\"\n).set;\nasync function inputTextElement(element, text) {\n if (!(element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement)) {\n throw new Error(\"Element is not an input or textarea\");\n }\n await clickElement(element);\n if (element instanceof HTMLTextAreaElement) {\n nativeTextAreaValueSetter.call(element, text);\n } else {\n nativeInputValueSetter.call(element, text);\n }\n const inputEvent = new Event(\"input\", { bubbles: true });\n element.dispatchEvent(inputEvent);\n await waitFor(0.1);\n blurLastClickedElement();\n}\n__name(inputTextElement, \"inputTextElement\");\nasync function selectOptionElement(selectElement, optionText) {\n if (!(selectElement instanceof HTMLSelectElement)) {\n throw new Error(\"Element is not a select element\");\n }\n const options = Array.from(selectElement.options);\n const option = options.find((opt) => opt.textContent?.trim() === optionText.trim());\n if (!option) {\n throw new Error(`Option with text \"${optionText}\" not found in select element`);\n }\n selectElement.value = option.value;\n selectElement.dispatchEvent(new Event(\"change\", { bubbles: true }));\n await waitFor(0.1);\n}\n__name(selectOptionElement, \"selectOptionElement\");\nasync function scrollIntoViewIfNeeded(element) {\n const el = element;\n if (el.scrollIntoViewIfNeeded) {\n el.scrollIntoViewIfNeeded();\n } else {\n el.scrollIntoView({ behavior: \"auto\", block: \"center\", inline: \"nearest\" });\n }\n}\n__name(scrollIntoViewIfNeeded, \"scrollIntoViewIfNeeded\");\nasync function scrollVertically(down, scroll_amount, element) {\n if (element) {\n const targetElement = element;\n console.log(\n \"[SCROLL DEBUG] Starting direct container scroll for element:\",\n targetElement.tagName\n );\n let currentElement = targetElement;\n let scrollSuccess = false;\n let scrolledElement = null;\n let scrollDelta = 0;\n let attempts = 0;\n const dy2 = scroll_amount;\n while (currentElement && attempts < 10) {\n const computedStyle = window.getComputedStyle(currentElement);\n const hasScrollableY = /(auto|scroll|overlay)/.test(computedStyle.overflowY);\n const canScrollVertically = currentElement.scrollHeight > currentElement.clientHeight;\n console.log(\n \"[SCROLL DEBUG] Checking element:\",\n currentElement.tagName,\n \"hasScrollableY:\",\n hasScrollableY,\n \"canScrollVertically:\",\n canScrollVertically,\n \"scrollHeight:\",\n currentElement.scrollHeight,\n \"clientHeight:\",\n currentElement.clientHeight\n );\n if (hasScrollableY && canScrollVertically) {\n const beforeScroll = currentElement.scrollTop;\n const maxScroll = currentElement.scrollHeight - currentElement.clientHeight;\n let scrollAmount = dy2 / 3;\n if (scrollAmount > 0) {\n scrollAmount = Math.min(scrollAmount, maxScroll - beforeScroll);\n } else {\n scrollAmount = Math.max(scrollAmount, -beforeScroll);\n }\n currentElement.scrollTop = beforeScroll + scrollAmount;\n const afterScroll = currentElement.scrollTop;\n const actualScrollDelta = afterScroll - beforeScroll;\n console.log(\n \"[SCROLL DEBUG] Scroll attempt:\",\n currentElement.tagName,\n \"before:\",\n beforeScroll,\n \"after:\",\n afterScroll,\n \"delta:\",\n actualScrollDelta\n );\n if (Math.abs(actualScrollDelta) > 0.5) {\n scrollSuccess = true;\n scrolledElement = currentElement;\n scrollDelta = actualScrollDelta;\n console.log(\n \"[SCROLL DEBUG] Successfully scrolled container:\",\n currentElement.tagName,\n \"delta:\",\n actualScrollDelta\n );\n break;\n }\n }\n if (currentElement === document.body || currentElement === document.documentElement) {\n break;\n }\n currentElement = currentElement.parentElement;\n attempts++;\n }\n if (scrollSuccess) {\n return `Scrolled container (${scrolledElement?.tagName}) by ${scrollDelta}px`;\n } else {\n return `No scrollable container found for element (${targetElement.tagName})`;\n }\n }\n const dy = scroll_amount;\n const bigEnough = /* @__PURE__ */ __name((el2) => el2.clientHeight >= window.innerHeight * 0.5, \"bigEnough\");\n const canScroll = /* @__PURE__ */ __name((el2) => el2 && /(auto|scroll|overlay)/.test(getComputedStyle(el2).overflowY) && el2.scrollHeight > el2.clientHeight && bigEnough(el2), \"canScroll\");\n let el = document.activeElement;\n while (el && !canScroll(el) && el !== document.body) el = el.parentElement;\n el = canScroll(el) ? el : Array.from(document.querySelectorAll(\"*\")).find(canScroll) || document.scrollingElement || document.documentElement;\n if (el === document.scrollingElement || el === document.documentElement || el === document.body) {\n window.scrollBy(0, dy);\n return `✅ Scrolled page by ${dy}px.`;\n } else {\n el.scrollBy({ top: dy, behavior: \"smooth\" });\n await waitFor(0.1);\n return `✅ Scrolled container (${el.tagName}) by ${dy}px.`;\n }\n}\n__name(scrollVertically, \"scrollVertically\");\nasync function scrollHorizontally(right, scroll_amount, element) {\n if (element) {\n const targetElement = element;\n console.log(\n \"[SCROLL DEBUG] Starting direct container scroll for element:\",\n targetElement.tagName\n );\n let currentElement = targetElement;\n let scrollSuccess = false;\n let scrolledElement = null;\n let scrollDelta = 0;\n let attempts = 0;\n const dx2 = right ? scroll_amount : -scroll_amount;\n while (currentElement && attempts < 10) {\n const computedStyle = window.getComputedStyle(currentElement);\n const hasScrollableX = /(auto|scroll|overlay)/.test(computedStyle.overflowX);\n const canScrollHorizontally = currentElement.scrollWidth > currentElement.clientWidth;\n console.log(\n \"[SCROLL DEBUG] Checking element:\",\n currentElement.tagName,\n \"hasScrollableX:\",\n hasScrollableX,\n \"canScrollHorizontally:\",\n canScrollHorizontally,\n \"scrollWidth:\",\n currentElement.scrollWidth,\n \"clientWidth:\",\n currentElement.clientWidth\n );\n if (hasScrollableX && canScrollHorizontally) {\n const beforeScroll = currentElement.scrollLeft;\n const maxScroll = currentElement.scrollWidth - currentElement.clientWidth;\n let scrollAmount = dx2 / 3;\n if (scrollAmount > 0) {\n scrollAmount = Math.min(scrollAmount, maxScroll - beforeScroll);\n } else {\n scrollAmount = Math.max(scrollAmount, -beforeScroll);\n }\n currentElement.scrollLeft = beforeScroll + scrollAmount;\n const afterScroll = currentElement.scrollLeft;\n const actualScrollDelta = afterScroll - beforeScroll;\n console.log(\n \"[SCROLL DEBUG] Scroll attempt:\",\n currentElement.tagName,\n \"before:\",\n beforeScroll,\n \"after:\",\n afterScroll,\n \"delta:\",\n actualScrollDelta\n );\n if (Math.abs(actualScrollDelta) > 0.5) {\n scrollSuccess = true;\n scrolledElement = currentElement;\n scrollDelta = actualScrollDelta;\n console.log(\n \"[SCROLL DEBUG] Successfully scrolled container:\",\n currentElement.tagName,\n \"delta:\",\n actualScrollDelta\n );\n break;\n }\n }\n if (currentElement === document.body || currentElement === document.documentElement) {\n break;\n }\n currentElement = currentElement.parentElement;\n attempts++;\n }\n if (scrollSuccess) {\n return `Scrolled container (${scrolledElement?.tagName}) horizontally by ${scrollDelta}px`;\n } else {\n return `No horizontally scrollable container found for element (${targetElement.tagName})`;\n }\n }\n const dx = right ? scroll_amount : -scroll_amount;\n const bigEnough = /* @__PURE__ */ __name((el2) => el2.clientWidth >= window.innerWidth * 0.5, \"bigEnough\");\n const canScroll = /* @__PURE__ */ __name((el2) => el2 && /(auto|scroll|overlay)/.test(getComputedStyle(el2).overflowX) && el2.scrollWidth > el2.clientWidth && bigEnough(el2), \"canScroll\");\n let el = document.activeElement;\n while (el && !canScroll(el) && el !== document.body) el = el.parentElement;\n el = canScroll(el) ? el : Array.from(document.querySelectorAll(\"*\")).find(canScroll) || document.scrollingElement || document.documentElement;\n if (el === document.scrollingElement || el === document.documentElement || el === document.body) {\n window.scrollBy(dx, 0);\n return `✅ Scrolled page horizontally by ${dx}px`;\n } else {\n el.scrollBy({ left: dx, behavior: \"smooth\" });\n await waitFor(0.1);\n return `✅ Scrolled container (${el.tagName}) horizontally by ${dx}px`;\n }\n}\n__name(scrollHorizontally, \"scrollHorizontally\");\nconst VIEWPORT_EXPANSION = -1;\nconst domTree = /* @__PURE__ */ __name((args = {\n doHighlightElements: true,\n focusHighlightIndex: -1,\n viewportExpansion: 0,\n debugMode: false,\n /**\n * @edit\n */\n /** @type {Element[]} */\n interactiveBlacklist: [],\n /** @type {Element[]} */\n interactiveWhitelist: [],\n highlightOpacity: 0.1,\n highlightLabelOpacity: 0.5\n}) => {\n const { interactiveBlacklist, interactiveWhitelist, highlightOpacity, highlightLabelOpacity } = args;\n const { doHighlightElements, focusHighlightIndex, viewportExpansion, debugMode } = args;\n let highlightIndex = 0;\n const extraData = /* @__PURE__ */ new WeakMap();\n function addExtraData(element, data) {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) return;\n extraData.set(element, { ...extraData.get(element), ...data });\n }\n __name(addExtraData, \"addExtraData\");\n const DOM_CACHE = {\n boundingRects: /* @__PURE__ */ new WeakMap(),\n clientRects: /* @__PURE__ */ new WeakMap(),\n computedStyles: /* @__PURE__ */ new WeakMap(),\n clearCache: /* @__PURE__ */ __name(() => {\n DOM_CACHE.boundingRects = /* @__PURE__ */ new WeakMap();\n DOM_CACHE.clientRects = /* @__PURE__ */ new WeakMap();\n DOM_CACHE.computedStyles = /* @__PURE__ */ new WeakMap();\n }, \"clearCache\")\n };\n function getCachedBoundingRect(element) {\n if (!element) return null;\n if (DOM_CACHE.boundingRects.has(element)) {\n return DOM_CACHE.boundingRects.get(element);\n }\n const rect = element.getBoundingClientRect();\n if (rect) {\n DOM_CACHE.boundingRects.set(element, rect);\n }\n return rect;\n }\n __name(getCachedBoundingRect, \"getCachedBoundingRect\");\n function getCachedComputedStyle(element) {\n if (!element) return null;\n if (DOM_CACHE.computedStyles.has(element)) {\n return DOM_CACHE.computedStyles.get(element);\n }\n const style = window.getComputedStyle(element);\n if (style) {\n DOM_CACHE.computedStyles.set(element, style);\n }\n return style;\n }\n __name(getCachedComputedStyle, \"getCachedComputedStyle\");\n function getCachedClientRects(element) {\n if (!element) return null;\n if (DOM_CACHE.clientRects.has(element)) {\n return DOM_CACHE.clientRects.get(element);\n }\n const rects = element.getClientRects();\n if (rects) {\n DOM_CACHE.clientRects.set(element, rects);\n }\n return rects;\n }\n __name(getCachedClientRects, \"getCachedClientRects\");\n const DOM_HASH_MAP = {};\n const ID = { current: 0 };\n const HIGHLIGHT_CONTAINER_ID = \"playwright-highlight-container\";\n function highlightElement(element, index, parentIframe = null) {\n if (!element) return index;\n const overlays = [];\n let label = null;\n let labelWidth = 20;\n let labelHeight = 16;\n let cleanupFn = null;\n try {\n let container = document.getElementById(HIGHLIGHT_CONTAINER_ID);\n if (!container) {\n container = document.createElement(\"div\");\n container.id = HIGHLIGHT_CONTAINER_ID;\n container.style.position = \"fixed\";\n container.style.pointerEvents = \"none\";\n container.style.top = \"0\";\n container.style.left = \"0\";\n container.style.width = \"100%\";\n container.style.height = \"100%\";\n container.style.zIndex = \"2147483640\";\n container.style.backgroundColor = \"transparent\";\n document.body.appendChild(container);\n }\n const rects = element.getClientRects();\n if (!rects || rects.length === 0) return index;\n const colors = [\n \"#FF0000\",\n \"#00FF00\",\n \"#0000FF\",\n \"#FFA500\",\n \"#800080\",\n \"#008080\",\n \"#FF69B4\",\n \"#4B0082\",\n \"#FF4500\",\n \"#2E8B57\",\n \"#DC143C\",\n \"#4682B4\"\n ];\n const colorIndex = index % colors.length;\n let baseColor = colors[colorIndex];\n const backgroundColor = baseColor + Math.floor(highlightOpacity * 255).toString(16).padStart(2, \"0\");\n baseColor = baseColor + Math.floor(highlightLabelOpacity * 255).toString(16).padStart(2, \"0\");\n let iframeOffset = { x: 0, y: 0 };\n if (parentIframe) {\n const iframeRect = parentIframe.getBoundingClientRect();\n iframeOffset.x = iframeRect.left;\n iframeOffset.y = iframeRect.top;\n }\n const fragment = document.createDocumentFragment();\n for (const rect of rects) {\n if (rect.width === 0 || rect.height === 0) continue;\n const overlay = document.createElement(\"div\");\n overlay.style.position = \"fixed\";\n overlay.style.border = `2px solid ${baseColor}`;\n overlay.style.backgroundColor = backgroundColor;\n overlay.style.pointerEvents = \"none\";\n overlay.style.boxSizing = \"border-box\";\n const top = rect.top + iframeOffset.y;\n const left = rect.left + iframeOffset.x;\n overlay.style.top = `${top}px`;\n overlay.style.left = `${left}px`;\n overlay.style.width = `${rect.width}px`;\n overlay.style.height = `${rect.height}px`;\n fragment.appendChild(overlay);\n overlays.push({ element: overlay, initialRect: rect });\n }\n const firstRect = rects[0];\n label = document.createElement(\"div\");\n label.className = \"playwright-highlight-label\";\n label.style.position = \"fixed\";\n label.style.background = baseColor;\n label.style.color = \"white\";\n label.style.padding = \"1px 4px\";\n label.style.borderRadius = \"4px\";\n label.style.fontSize = `${Math.min(12, Math.max(8, firstRect.height / 2))}px`;\n label.textContent = index.toString();\n labelWidth = label.offsetWidth > 0 ? label.offsetWidth : labelWidth;\n labelHeight = label.offsetHeight > 0 ? label.offsetHeight : labelHeight;\n const firstRectTop = firstRect.top + iframeOffset.y;\n const firstRectLeft = firstRect.left + iframeOffset.x;\n let labelTop = firstRectTop + 2;\n let labelLeft = firstRectLeft + firstRect.width - labelWidth - 2;\n if (firstRect.width < labelWidth + 4 || firstRect.height < labelHeight + 4) {\n labelTop = firstRectTop - labelHeight - 2;\n labelLeft = firstRectLeft + firstRect.width - labelWidth;\n if (labelLeft < iframeOffset.x) labelLeft = firstRectLeft;\n }\n labelTop = Math.max(0, Math.min(labelTop, window.innerHeight - labelHeight));\n labelLeft = Math.max(0, Math.min(labelLeft, window.innerWidth - labelWidth));\n label.style.top = `${labelTop}px`;\n label.style.left = `${labelLeft}px`;\n fragment.appendChild(label);\n const updatePositions = /* @__PURE__ */ __name(() => {\n const newRects = element.getClientRects();\n let newIframeOffset = { x: 0, y: 0 };\n if (parentIframe) {\n const iframeRect = parentIframe.getBoundingClientRect();\n newIframeOffset.x = iframeRect.left;\n newIframeOffset.y = iframeRect.top;\n }\n overlays.forEach((overlayData, i) => {\n if (i < newRects.length) {\n const newRect = newRects[i];\n const newTop = newRect.top + newIframeOffset.y;\n const newLeft = newRect.left + newIframeOffset.x;\n overlayData.element.style.top = `${newTop}px`;\n overlayData.element.style.left = `${newLeft}px`;\n overlayData.element.style.width = `${newRect.width}px`;\n overlayData.element.style.height = `${newRect.height}px`;\n overlayData.element.style.display = newRect.width === 0 || newRect.height === 0 ? \"none\" : \"block\";\n } else {\n overlayData.element.style.display = \"none\";\n }\n });\n if (newRects.length < overlays.length) {\n for (let i = newRects.length; i < overlays.length; i++) {\n overlays[i].element.style.display = \"none\";\n }\n }\n if (label && newRects.length > 0) {\n const firstNewRect = newRects[0];\n const firstNewRectTop = firstNewRect.top + newIframeOffset.y;\n const firstNewRectLeft = firstNewRect.left + newIframeOffset.x;\n let newLabelTop = firstNewRectTop + 2;\n let newLabelLeft = firstNewRectLeft + firstNewRect.width - labelWidth - 2;\n if (firstNewRect.width < labelWidth + 4 || firstNewRect.height < labelHeight + 4) {\n newLabelTop = firstNewRectTop - labelHeight - 2;\n newLabelLeft = firstNewRectLeft + firstNewRect.width - labelWidth;\n if (newLabelLeft < newIframeOffset.x) newLabelLeft = firstNewRectLeft;\n }\n newLabelTop = Math.max(0, Math.min(newLabelTop, window.innerHeight - labelHeight));\n newLabelLeft = Math.max(0, Math.min(newLabelLeft, window.innerWidth - labelWidth));\n label.style.top = `${newLabelTop}px`;\n label.style.left = `${newLabelLeft}px`;\n label.style.display = \"block\";\n } else if (label) {\n label.style.display = \"none\";\n }\n }, \"updatePositions\");\n const throttleFunction = /* @__PURE__ */ __name((func, delay) => {\n let lastCall = 0;\n return (...args2) => {\n const now = performance.now();\n if (now - lastCall < delay) return;\n lastCall = now;\n return func(...args2);\n };\n }, \"throttleFunction\");\n const throttledUpdatePositions = throttleFunction(updatePositions, 16);\n window.addEventListener(\"scroll\", throttledUpdatePositions, true);\n window.addEventListener(\"resize\", throttledUpdatePositions);\n cleanupFn = /* @__PURE__ */ __name(() => {\n window.removeEventListener(\"scroll\", throttledUpdatePositions, true);\n window.removeEventListener(\"resize\", throttledUpdatePositions);\n overlays.forEach((overlay) => overlay.element.remove());\n if (label) label.remove();\n }, \"cleanupFn\");\n container.appendChild(fragment);\n return index + 1;\n } finally {\n if (cleanupFn) {\n (window._highlightCleanupFunctions = window._highlightCleanupFunctions || []).push(\n cleanupFn\n );\n }\n }\n }\n __name(highlightElement, \"highlightElement\");\n function isScrollableElement(element) {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return null;\n }\n const style = getCachedComputedStyle(element);\n if (!style) return null;\n const display = style.display;\n if (display === \"inline\" || display === \"inline-block\") {\n return null;\n }\n const overflowX = style.overflowX;\n const overflowY = style.overflowY;\n const scrollableX = overflowX === \"auto\" || overflowX === \"scroll\";\n const scrollableY = overflowY === \"auto\" || overflowY === \"scroll\";\n if (!scrollableX && !scrollableY) {\n return null;\n }\n const scrollWidth = element.scrollWidth - element.clientWidth;\n const scrollHeight = element.scrollHeight - element.clientHeight;\n const threshold = 4;\n if (scrollWidth < threshold && scrollHeight < threshold) {\n return null;\n }\n if (!scrollableY && scrollWidth < threshold) {\n return null;\n }\n if (!scrollableX && scrollHeight < threshold) {\n return null;\n }\n const distanceToTop = element.scrollTop;\n const distanceToLeft = element.scrollLeft;\n const distanceToRight = element.scrollWidth - element.clientWidth - element.scrollLeft;\n const distanceToBottom = element.scrollHeight - element.clientHeight - element.scrollTop;\n const scrollData = {\n top: distanceToTop,\n right: distanceToRight,\n bottom: distanceToBottom,\n left: distanceToLeft\n };\n addExtraData(element, {\n scrollable: true,\n scrollData\n });\n return scrollData;\n }\n __name(isScrollableElement, \"isScrollableElement\");\n function isTextNodeVisible(textNode) {\n try {\n if (viewportExpansion === -1) {\n const parentElement2 = textNode.parentElement;\n if (!parentElement2) return false;\n try {\n return parentElement2.checkVisibility({\n checkOpacity: true,\n checkVisibilityCSS: true\n });\n } catch (e) {\n const style = window.getComputedStyle(parentElement2);\n return style.display !== \"none\" && style.visibility !== \"hidden\" && style.opacity !== \"0\";\n }\n }\n const range = document.createRange();\n range.selectNodeContents(textNode);\n const rects = range.getClientRects();\n if (!rects || rects.length === 0) {\n return false;\n }\n let isAnyRectVisible = false;\n let isAnyRectInViewport = false;\n for (const rect of rects) {\n if (rect.width > 0 && rect.height > 0) {\n isAnyRectVisible = true;\n if (!(rect.bottom < -viewportExpansion || rect.top > window.innerHeight + viewportExpansion || rect.right < -viewportExpansion || rect.left > window.innerWidth + viewportExpansion)) {\n isAnyRectInViewport = true;\n break;\n }\n }\n }\n if (!isAnyRectVisible || !isAnyRectInViewport) {\n return false;\n }\n const parentElement = textNode.parentElement;\n if (!parentElement) return false;\n try {\n return parentElement.checkVisibility({\n checkOpacity: true,\n checkVisibilityCSS: true\n });\n } catch (e) {\n const style = window.getComputedStyle(parentElement);\n return style.display !== \"none\" && style.visibility !== \"hidden\" && style.opacity !== \"0\";\n }\n } catch (e) {\n console.warn(\"Error checking text node visibility:\", e);\n return false;\n }\n }\n __name(isTextNodeVisible, \"isTextNodeVisible\");\n function isElementAccepted(element) {\n if (!element || !element.tagName) return false;\n const alwaysAccept = /* @__PURE__ */ new Set([\n \"body\",\n \"div\",\n \"main\",\n \"article\",\n \"section\",\n \"nav\",\n \"header\",\n \"footer\"\n ]);\n const tagName = element.tagName.toLowerCase();\n if (alwaysAccept.has(tagName)) return true;\n const leafElementDenyList = /* @__PURE__ */ new Set([\n \"svg\",\n \"script\",\n \"style\",\n \"link\",\n \"meta\",\n \"noscript\",\n \"template\"\n ]);\n return !leafElementDenyList.has(tagName);\n }\n __name(isElementAccepted, \"isElementAccepted\");\n function isElementVisible(element) {\n const style = getCachedComputedStyle(element);\n return element.offsetWidth > 0 && element.offsetHeight > 0 && style?.visibility !== \"hidden\" && style?.display !== \"none\";\n }\n __name(isElementVisible, \"isElementVisible\");\n function isInteractiveElement(element) {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return false;\n }\n if (interactiveBlacklist.includes(element)) {\n return false;\n }\n if (interactiveWhitelist.includes(element)) {\n return true;\n }\n const tagName = element.tagName.toLowerCase();\n const style = getCachedComputedStyle(element);\n const interactiveCursors = /* @__PURE__ */ new Set([\n \"pointer\",\n // Link/clickable elements\n \"move\",\n // Movable elements\n \"text\",\n // Text selection\n \"grab\",\n // Grabbable elements\n \"grabbing\",\n // Currently grabbing\n \"cell\",\n // Table cell selection\n \"copy\",\n // Copy operation\n \"alias\",\n // Alias creation\n \"all-scroll\",\n // Scrollable content\n \"col-resize\",\n // Column resize\n \"context-menu\",\n // Context menu available\n \"crosshair\",\n // Precise selection\n \"e-resize\",\n // East resize\n \"ew-resize\",\n // East-west resize\n \"help\",\n // Help available\n \"n-resize\",\n // North resize\n \"ne-resize\",\n // Northeast resize\n \"nesw-resize\",\n // Northeast-southwest resize\n \"ns-resize\",\n // North-south resize\n \"nw-resize\",\n // Northwest resize\n \"nwse-resize\",\n // Northwest-southeast resize\n \"row-resize\",\n // Row resize\n \"s-resize\",\n // South resize\n \"se-resize\",\n // Southeast resize\n \"sw-resize\",\n // Southwest resize\n \"vertical-text\",\n // Vertical text selection\n \"w-resize\",\n // West resize\n \"zoom-in\",\n // Zoom in\n \"zoom-out\"\n // Zoom out\n ]);\n const nonInteractiveCursors = /* @__PURE__ */ new Set([\n \"not-allowed\",\n // Action not allowed\n \"no-drop\",\n // Drop not allowed\n \"wait\",\n // Processing\n \"progress\",\n // In progress\n \"initial\",\n // Initial value\n \"inherit\"\n // Inherited value\n //? Let's just include all potentially clickable elements that are not specifically blocked\n // 'none', // No cursor\n // 'default', // Default cursor\n // 'auto', // Browser default\n ]);\n function doesElementHaveInteractivePointer(element2) {\n if (element2.tagName.toLowerCase() === \"html\") return false;\n if (style?.cursor && interactiveCursors.has(style.cursor)) return true;\n return false;\n }\n __name(doesElementHaveInteractivePointer, \"doesElementHaveInteractivePointer\");\n let isInteractiveCursor = doesElementHaveInteractivePointer(element);\n if (isInteractiveCursor) {\n return true;\n }\n const interactiveElements = /* @__PURE__ */ new Set([\n \"a\",\n // Links\n \"button\",\n // Buttons\n \"input\",\n // All input types (text, checkbox, radio, etc.)\n \"select\",\n // Dropdown menus\n \"textarea\",\n // Text areas\n \"details\",\n // Expandable details\n \"summary\",\n // Summary element (clickable part of details)\n \"label\",\n // Form labels (often clickable)\n \"option\",\n // Select options\n \"optgroup\",\n // Option groups\n \"fieldset\",\n // Form fieldsets (can be interactive with legend)\n \"legend\"\n // Fieldset legends\n ]);\n const explicitDisableTags = /* @__PURE__ */ new Set([\n \"disabled\",\n // Standard disabled attribute\n // 'aria-disabled', // ARIA disabled state\n \"readonly\"\n // Read-only state\n // 'aria-readonly', // ARIA read-only state\n // 'aria-hidden', // Hidden from accessibility\n // 'hidden', // Hidden attribute\n // 'inert', // Inert attribute\n // 'aria-inert', // ARIA inert state\n // 'tabindex=\"-1\"', // Removed from tab order\n // 'aria-hidden=\"true\"' // Hidden from screen readers\n ]);\n if (interactiveElements.has(tagName)) {\n if (style?.cursor && nonInteractiveCursors.has(style.cursor)) {\n return false;\n }\n for (const disableTag of explicitDisableTags) {\n if (element.hasAttribute(disableTag) || element.getAttribute(disableTag) === \"true\" || element.getAttribute(disableTag) === \"\") {\n return false;\n }\n }\n if (element.disabled) {\n return false;\n }\n if (element.readOnly) {\n return false;\n }\n if (element.inert) {\n return false;\n }\n return true;\n }\n const role = element.getAttribute(\"role\");\n const ariaRole = element.getAttribute(\"aria-role\");\n if (element.getAttribute(\"contenteditable\") === \"true\" || element.isContentEditable) {\n return true;\n }\n if (element.classList && (element.classList.contains(\"button\") || element.classList.contains(\"dropdown-toggle\") || element.getAttribute(\"data-index\") || element.getAttribute(\"data-toggle\") === \"dropdown\" || element.getAttribute(\"aria-haspopup\") === \"true\")) {\n return true;\n }\n const interactiveRoles = /* @__PURE__ */ new Set([\n \"button\",\n // Directly clickable element\n // 'link', // Clickable link\n \"menu\",\n // Menu container (ARIA menus)\n \"menubar\",\n // Menu bar container\n \"menuitem\",\n // Clickable menu item\n \"menuitemradio\",\n // Radio-style menu item (selectable)\n \"menuitemcheckbox\",\n // Checkbox-style menu item (toggleable)\n \"radio\",\n // Radio button (selectable)\n \"checkbox\",\n // Checkbox (toggleable)\n \"tab\",\n // Tab (clickable to switch content)\n \"switch\",\n // Toggle switch (clickable to change state)\n \"slider\",\n // Slider control (draggable)\n \"spinbutton\",\n // Number input with up/down controls\n \"combobox\",\n // Dropdown with text input\n \"searchbox\",\n // Search input field\n \"textbox\",\n // Text input field\n \"listbox\",\n // Selectable list\n \"option\",\n // Selectable option in a list\n \"scrollbar\"\n // Scrollable control\n ]);\n const hasInteractiveRole = interactiveElements.has(tagName) || role && interactiveRoles.has(role) || ariaRole && interactiveRoles.has(ariaRole);\n if (hasInteractiveRole) return true;\n try {\n if (typeof getEventListeners === \"function\") {\n const listeners = getEventListeners(element);\n const mouseEvents = [\"click\", \"mousedown\", \"mouseup\", \"dblclick\"];\n for (const eventType of mouseEvents) {\n if (listeners[eventType] && listeners[eventType].length > 0) {\n return true;\n }\n }\n }\n const getEventListenersForNode = element?.ownerDocument?.defaultView?.getEventListenersForNode || window.getEventListenersForNode;\n if (typeof getEventListenersForNode === \"function\") {\n const listeners = getEventListenersForNode(element);\n const interactionEvents = [\n \"click\",\n \"mousedown\",\n \"mouseup\",\n \"keydown\",\n \"keyup\",\n \"submit\",\n \"change\",\n \"input\",\n \"focus\",\n \"blur\"\n ];\n for (const eventType of interactionEvents) {\n for (const listener of listeners) {\n if (listener.type === eventType) {\n return true;\n }\n }\n }\n }\n const commonMouseAttrs = [\"onclick\", \"onmousedown\", \"onmouseup\", \"ondblclick\"];\n for (const attr of commonMouseAttrs) {\n if (element.hasAttribute(attr) || typeof element[attr] === \"function\") {\n return true;\n }\n }\n } catch (e) {\n }\n if (isScrollableElement(element)) {\n return true;\n }\n return false;\n }\n __name(isInteractiveElement, \"isInteractiveElement\");\n function isTopElement(element) {\n if (viewportExpansion === -1) {\n return true;\n }\n const rects = getCachedClientRects(element);\n if (!rects || rects.length === 0) {\n return false;\n }\n let isAnyRectInViewport = false;\n for (const rect2 of rects) {\n if (rect2.width > 0 && rect2.height > 0 && !// Only check non-empty rects\n (rect2.bottom < -viewportExpansion || rect2.top > window.innerHeight + viewportExpansion || rect2.right < -viewportExpansion || rect2.left > window.innerWidth + viewportExpansion)) {\n isAnyRectInViewport = true;\n break;\n }\n }\n if (!isAnyRectInViewport) {\n return false;\n }\n let doc = element.ownerDocument;\n if (doc !== window.document) {\n return true;\n }\n let rect = Array.from(rects).find((r) => r.width > 0 && r.height > 0);\n if (!rect) {\n return false;\n }\n const shadowRoot = element.getRootNode();\n if (shadowRoot instanceof ShadowRoot) {\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n try {\n const topEl = shadowRoot.elementFromPoint(centerX, centerY);\n if (!topEl) return false;\n let current = topEl;\n while (current && current !== shadowRoot) {\n if (current === element) return true;\n current = current.parentElement;\n }\n return false;\n } catch (e) {\n return true;\n }\n }\n const margin = 5;\n const checkPoints = [\n // Initially only this was used, but it was not enough\n { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 },\n { x: rect.left + margin, y: rect.top + margin },\n // top left\n // { x: rect.right - margin, y: rect.top + margin }, // top right\n // { x: rect.left + margin, y: rect.bottom - margin }, // bottom left\n { x: rect.right - margin, y: rect.bottom - margin }\n // bottom right\n ];\n return checkPoints.some(({ x, y }) => {\n try {\n const topEl = document.elementFromPoint(x, y);\n if (!topEl) return false;\n let current = topEl;\n while (current && current !== document.documentElement) {\n if (current === element) return true;\n current = current.parentElement;\n }\n return false;\n } catch (e) {\n return true;\n }\n });\n }\n __name(isTopElement, \"isTopElement\");\n function isInExpandedViewport(element, viewportExpansion2) {\n if (viewportExpansion2 === -1) {\n return true;\n }\n const rects = element.getClientRects();\n if (!rects || rects.length === 0) {\n const boundingRect = getCachedBoundingRect(element);\n if (!boundingRect || boundingRect.width === 0 || boundingRect.height === 0) {\n return false;\n }\n return !(boundingRect.bottom < -viewportExpansion2 || boundingRect.top > window.innerHeight + viewportExpansion2 || boundingRect.right < -viewportExpansion2 || boundingRect.left > window.innerWidth + viewportExpansion2);\n }\n for (const rect of rects) {\n if (rect.width === 0 || rect.height === 0) continue;\n if (!(rect.bottom < -viewportExpansion2 || rect.top > window.innerHeight + viewportExpansion2 || rect.right < -viewportExpansion2 || rect.left > window.innerWidth + viewportExpansion2)) {\n return true;\n }\n }\n return false;\n }\n __name(isInExpandedViewport, \"isInExpandedViewport\");\n function isInteractiveCandidate(element) {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) return false;\n const tagName = element.tagName.toLowerCase();\n const interactiveElements = /* @__PURE__ */ new Set([\n \"a\",\n \"button\",\n \"input\",\n \"select\",\n \"textarea\",\n \"details\",\n \"summary\",\n \"label\"\n ]);\n if (interactiveElements.has(tagName)) return true;\n const hasQuickInteractiveAttr = element.hasAttribute(\"onclick\") || element.hasAttribute(\"role\") || element.hasAttribute(\"tabindex\") || element.hasAttribute(\"aria-\") || element.hasAttribute(\"data-action\") || element.getAttribute(\"contenteditable\") === \"true\";\n return hasQuickInteractiveAttr;\n }\n __name(isInteractiveCandidate, \"isInteractiveCandidate\");\n const DISTINCT_INTERACTIVE_TAGS = /* @__PURE__ */ new Set([\n \"a\",\n \"button\",\n \"input\",\n \"select\",\n \"textarea\",\n \"summary\",\n \"details\",\n \"label\",\n \"option\"\n ]);\n const INTERACTIVE_ROLES = /* @__PURE__ */ new Set([\n \"button\",\n \"link\",\n \"menuitem\",\n \"menuitemradio\",\n \"menuitemcheckbox\",\n \"radio\",\n \"checkbox\",\n \"tab\",\n \"switch\",\n \"slider\",\n \"spinbutton\",\n \"combobox\",\n \"searchbox\",\n \"textbox\",\n \"listbox\",\n \"option\",\n \"scrollbar\"\n ]);\n function isHeuristicallyInteractive(element) {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) return false;\n if (!isElementVisible(element)) return false;\n const hasInteractiveAttributes = element.hasAttribute(\"role\") || element.hasAttribute(\"tabindex\") || element.hasAttribute(\"onclick\") || typeof element.onclick === \"function\";\n const hasInteractiveClass = /\\b(btn|clickable|menu|item|entry|link)\\b/i.test(\n element.className || \"\"\n );\n const isInKnownContainer = Boolean(\n element.closest('button,a,[role=\"button\"],.menu,.dropdown,.list,.toolbar')\n );\n const hasVisibleChildren = [...element.children].some(isElementVisible);\n const isParentBody = element.parentElement && element.parentElement.isSameNode(document.body);\n return (isInteractiveElement(element) || hasInteractiveAttributes || hasInteractiveClass) && hasVisibleChildren && isInKnownContainer && !isParentBody;\n }\n __name(isHeuristicallyInteractive, \"isHeuristicallyInteractive\");\n function isElementDistinctInteraction(element) {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return false;\n }\n const tagName = element.tagName.toLowerCase();\n const role = element.getAttribute(\"role\");\n if (tagName === \"iframe\") {\n return true;\n }\n if (DISTINCT_INTERACTIVE_TAGS.has(tagName)) {\n return true;\n }\n if (role && INTERACTIVE_ROLES.has(role)) {\n return true;\n }\n if (element.isContentEditable || element.getAttribute(\"contenteditable\") === \"true\") {\n return true;\n }\n if (element.hasAttribute(\"data-testid\") || element.hasAttribute(\"data-cy\") || element.hasAttribute(\"data-test\")) {\n return true;\n }\n if (element.hasAttribute(\"onclick\") || typeof element.onclick === \"function\") {\n return true;\n }\n try {\n const getEventListenersForNode = element?.ownerDocument?.defaultView?.getEventListenersForNode || window.getEventListenersForNode;\n if (typeof getEventListenersForNode === \"function\") {\n const listeners = getEventListenersForNode(element);\n const interactionEvents = [\n \"click\",\n \"mousedown\",\n \"mouseup\",\n \"keydown\",\n \"keyup\",\n \"submit\",\n \"change\",\n \"input\",\n \"focus\",\n \"blur\"\n ];\n for (const eventType of interactionEvents) {\n for (const listener of listeners) {\n if (listener.type === eventType) {\n return true;\n }\n }\n }\n }\n const commonEventAttrs = [\n \"onmousedown\",\n \"onmouseup\",\n \"onkeydown\",\n \"onkeyup\",\n \"onsubmit\",\n \"onchange\",\n \"oninput\",\n \"onfocus\",\n \"onblur\"\n ];\n if (commonEventAttrs.some((attr) => element.hasAttribute(attr))) {\n return true;\n }\n } catch (e) {\n }\n if (isHeuristicallyInteractive(element)) {\n return true;\n }\n return false;\n }\n __name(isElementDistinctInteraction, \"isElementDistinctInteraction\");\n function handleHighlighting(nodeData, node, parentIframe, isParentHighlighted) {\n if (!nodeData.isInteractive) return false;\n let shouldHighlight = false;\n if (!isParentHighlighted) {\n shouldHighlight = true;\n } else {\n if (isElementDistinctInteraction(node)) {\n shouldHighlight = true;\n } else {\n shouldHighlight = false;\n }\n }\n if (shouldHighlight) {\n nodeData.isInViewport = isInExpandedViewport(node, viewportExpansion);\n if (nodeData.isInViewport || viewportExpansion === -1) {\n nodeData.highlightIndex = highlightIndex++;\n if (doHighlightElements) {\n if (focusHighlightIndex >= 0) {\n if (focusHighlightIndex === nodeData.highlightIndex) {\n highlightElement(node, nodeData.highlightIndex, parentIframe);\n }\n } else {\n highlightElement(node, nodeData.highlightIndex, parentIframe);\n }\n return true;\n }\n }\n }\n return false;\n }\n __name(handleHighlighting, \"handleHighlighting\");\n function buildDomTree(node, parentIframe = null, isParentHighlighted = false) {\n if (!node || node.id === HIGHLIGHT_CONTAINER_ID || node.nodeType !== Node.ELEMENT_NODE && node.nodeType !== Node.TEXT_NODE) {\n return null;\n }\n if (!node || node.id === HIGHLIGHT_CONTAINER_ID) {\n return null;\n }\n if (node.dataset?.browserUseIgnore === \"true\") {\n return true;\n }\n if (node === document.body) {\n const nodeData2 = {\n tagName: \"body\",\n attributes: {},\n xpath: \"/body\",\n children: []\n };\n for (const child of node.childNodes) {\n const domElement = buildDomTree(child, parentIframe, false);\n if (domElement) nodeData2.children.push(domElement);\n }\n const id2 = `${ID.current++}`;\n DOM_HASH_MAP[id2] = nodeData2;\n return id2;\n }\n if (node.nodeType !== Node.ELEMENT_NODE && node.nodeType !== Node.TEXT_NODE) {\n return null;\n }\n if (node.nodeType === Node.TEXT_NODE) {\n const textContent = node.textContent?.trim();\n if (!textContent) {\n return null;\n }\n const parentElement = node.parentElement;\n if (!parentElement || parentElement.tagName.toLowerCase() === \"script\") {\n return null;\n }\n const id2 = `${ID.current++}`;\n DOM_HASH_MAP[id2] = {\n type: \"TEXT_NODE\",\n text: textContent,\n isVisible: isTextNodeVisible(node)\n };\n return id2;\n }\n if (node.nodeType === Node.ELEMENT_NODE && !isElementAccepted(node)) {\n return null;\n }\n if (viewportExpansion !== -1 && !node.shadowRoot) {\n const rect = getCachedBoundingRect(node);\n const style = getCachedComputedStyle(node);\n const isFixedOrSticky = style && (style.position === \"fixed\" || style.position === \"sticky\");\n const hasSize = node.offsetWidth > 0 || node.offsetHeight > 0;\n if (!rect || !isFixedOrSticky && !hasSize && (rect.bottom < -viewportExpansion || rect.top > window.innerHeight + viewportExpansion || rect.right < -viewportExpansion || rect.left > window.innerWidth + viewportExpansion)) {\n return null;\n }\n }\n const nodeData = {\n tagName: node.tagName.toLowerCase(),\n attributes: {},\n /**\n * @edit no need for xpath\n */\n // xpath: getXPathTree(node, true),\n children: []\n };\n if (isInteractiveCandidate(node) || node.tagName.toLowerCase() === \"iframe\" || node.tagName.toLowerCase() === \"body\") {\n const attributeNames = node.getAttributeNames?.() || [];\n for (const name of attributeNames) {\n const value = node.getAttribute(name);\n nodeData.attributes[name] = value;\n }\n if (node.tagName.toLowerCase() === \"input\" && (node.type === \"checkbox\" || node.type === \"radio\")) {\n nodeData.attributes.checked = node.checked ? \"true\" : \"false\";\n }\n }\n let nodeWasHighlighted = false;\n if (node.nodeType === Node.ELEMENT_NODE) {\n nodeData.isVisible = isElementVisible(node);\n if (nodeData.isVisible) {\n nodeData.isTopElement = isTopElement(node);\n const role = node.getAttribute(\"role\");\n const isMenuContainer = role === \"menu\" || role === \"menubar\" || role === \"listbox\";\n if (nodeData.isTopElement || isMenuContainer) {\n nodeData.isInteractive = isInteractiveElement(node);\n nodeWasHighlighted = handleHighlighting(nodeData, node, parentIframe, isParentHighlighted);\n nodeData.ref = node;\n }\n }\n }\n if (node.tagName) {\n const tagName = node.tagName.toLowerCase();\n if (tagName === \"iframe\") {\n try {\n const iframeDoc = node.contentDocument || node.contentWindow?.document;\n if (iframeDoc) {\n for (const child of iframeDoc.childNodes) {\n const domElement = buildDomTree(child, node, false);\n if (domElement) nodeData.children.push(domElement);\n }\n }\n } catch (e) {\n console.warn(\"Unable to access iframe:\", e);\n }\n } else if (node.isContentEditable || node.getAttribute(\"contenteditable\") === \"true\" || node.id === \"tinymce\" || node.classList.contains(\"mce-content-body\") || tagName === \"body\" && node.getAttribute(\"data-id\")?.startsWith(\"mce_\")) {\n for (const child of node.childNodes) {\n const domElement = buildDomTree(child, parentIframe, nodeWasHighlighted);\n if (domElement) nodeData.children.push(domElement);\n }\n } else {\n if (node.shadowRoot) {\n nodeData.shadowRoot = true;\n for (const child of node.shadowRoot.childNodes) {\n const domElement = buildDomTree(child, parentIframe, nodeWasHighlighted);\n if (domElement) nodeData.children.push(domElement);\n }\n }\n for (const child of node.childNodes) {\n const passHighlightStatusToChild = nodeWasHighlighted || isParentHighlighted;\n const domElement = buildDomTree(child, parentIframe, passHighlightStatusToChild);\n if (domElement) nodeData.children.push(domElement);\n }\n }\n }\n if (nodeData.tagName === \"a\" && nodeData.children.length === 0 && !nodeData.attributes.href) {\n const rect = getCachedBoundingRect(node);\n const hasSize = rect && rect.width > 0 && rect.height > 0 || node.offsetWidth > 0 || node.offsetHeight > 0;\n if (!hasSize) {\n return null;\n }\n }\n nodeData.extra = extraData.get(node) || null;\n const id = `${ID.current++}`;\n DOM_HASH_MAP[id] = nodeData;\n return id;\n }\n __name(buildDomTree, \"buildDomTree\");\n const rootId = buildDomTree(document.body);\n DOM_CACHE.clearCache();\n return { rootId, map: DOM_HASH_MAP };\n}, \"domTree\");\nconst newElementsCache = /* @__PURE__ */ new WeakMap();\nfunction getFlatTree(config) {\n const interactiveBlacklist = [];\n for (const item of config.interactiveBlacklist || []) {\n if (typeof item === \"function\") {\n interactiveBlacklist.push(item());\n } else {\n interactiveBlacklist.push(item);\n }\n }\n const interactiveWhitelist = [];\n for (const item of config.interactiveWhitelist || []) {\n if (typeof item === \"function\") {\n interactiveWhitelist.push(item());\n } else {\n interactiveWhitelist.push(item);\n }\n }\n const elements = domTree({\n doHighlightElements: true,\n debugMode: true,\n focusHighlightIndex: -1,\n viewportExpansion: VIEWPORT_EXPANSION,\n interactiveBlacklist,\n interactiveWhitelist,\n highlightOpacity: config.highlightOpacity ?? 0,\n highlightLabelOpacity: config.highlightLabelOpacity ?? 0.1\n });\n const currentUrl = window.location.href;\n for (const nodeId in elements.map) {\n const node = elements.map[nodeId];\n if (node.isInteractive && node.ref) {\n const ref = node.ref;\n if (!newElementsCache.has(ref)) {\n newElementsCache.set(ref, currentUrl);\n node.isNew = true;\n }\n }\n }\n return elements;\n}\n__name(getFlatTree, \"getFlatTree\");\nfunction flatTreeToString(flatTree, include_attributes) {\n const DEFAULT_INCLUDE_ATTRIBUTES = [\n \"title\",\n \"type\",\n \"checked\",\n \"name\",\n \"role\",\n \"value\",\n \"placeholder\",\n \"data-date-format\",\n \"alt\",\n \"aria-label\",\n \"aria-expanded\",\n \"data-state\",\n \"aria-checked\",\n // @edit added for better form handling\n \"id\",\n \"for\",\n // for jump check\n \"target\",\n // absolute 定位的下拉菜单\n \"aria-haspopup\",\n \"aria-controls\",\n \"aria-owns\"\n ];\n const includeAttrs = [...include_attributes || [], ...DEFAULT_INCLUDE_ATTRIBUTES];\n const capTextLength = /* @__PURE__ */ __name((text, maxLength) => {\n if (text.length > maxLength) {\n return text.substring(0, maxLength) + \"...\";\n }\n return text;\n }, \"capTextLength\");\n const buildTreeNode = /* @__PURE__ */ __name((nodeId) => {\n const node = flatTree.map[nodeId];\n if (!node) return null;\n if (node.type === \"TEXT_NODE\") {\n const textNode = node;\n return {\n type: \"text\",\n text: textNode.text,\n isVisible: textNode.isVisible,\n parent: null,\n children: []\n };\n } else {\n const elementNode = node;\n const children = [];\n if (elementNode.children) {\n for (const childId of elementNode.children) {\n const child = buildTreeNode(childId);\n if (child) {\n child.parent = null;\n children.push(child);\n }\n }\n }\n return {\n type: \"element\",\n tagName: elementNode.tagName,\n attributes: elementNode.attributes ?? {},\n isVisible: elementNode.isVisible ?? false,\n isInteractive: elementNode.isInteractive ?? false,\n isTopElement: elementNode.isTopElement ?? false,\n isNew: elementNode.isNew ?? false,\n highlightIndex: elementNode.highlightIndex,\n parent: null,\n children,\n extra: elementNode.extra ?? {}\n };\n }\n }, \"buildTreeNode\");\n const setParentReferences = /* @__PURE__ */ __name((node, parent = null) => {\n node.parent = parent;\n for (const child of node.children) {\n setParentReferences(child, node);\n }\n }, \"setParentReferences\");\n const rootNode = buildTreeNode(flatTree.rootId);\n if (!rootNode) return \"\";\n setParentReferences(rootNode);\n const hasParentWithHighlightIndex = /* @__PURE__ */ __name((node) => {\n let current = node.parent;\n while (current) {\n if (current.type === \"element\" && current.highlightIndex !== void 0) {\n return true;\n }\n current = current.parent;\n }\n return false;\n }, \"hasParentWithHighlightIndex\");\n const processNode = /* @__PURE__ */ __name((node, depth, result22) => {\n let nextDepth = depth;\n const depthStr = \"\t\".repeat(depth);\n if (node.type === \"element\") {\n if (node.highlightIndex !== void 0) {\n nextDepth += 1;\n const text = getAllTextTillNextClickableElement(node);\n let attributesHtmlStr = \"\";\n if (includeAttrs.length > 0 && node.attributes) {\n const attributesToInclude = {};\n for (const key of includeAttrs) {\n const value = node.attributes[key];\n if (value && value.trim() !== \"\") {\n attributesToInclude[key] = value.trim();\n }\n }\n const orderedKeys = includeAttrs.filter((key) => key in attributesToInclude);\n if (orderedKeys.length > 1) {\n const keysToRemove = /* @__PURE__ */ new Set();\n const seenValues = {};\n for (const key of orderedKeys) {\n const value = attributesToInclude[key];\n if (value.length > 5) {\n if (value in seenValues) {\n keysToRemove.add(key);\n } else {\n seenValues[value] = key;\n }\n }\n }\n for (const key of keysToRemove) {\n delete attributesToInclude[key];\n }\n }\n if (attributesToInclude.role === node.tagName) {\n delete attributesToInclude.role;\n }\n const attrsToRemoveIfTextMatches = [\"aria-label\", \"placeholder\", \"title\"];\n for (const attr of attrsToRemoveIfTextMatches) {\n if (attributesToInclude[attr] && attributesToInclude[attr].toLowerCase().trim() === text.toLowerCase().trim()) {\n delete attributesToInclude[attr];\n }\n }\n if (Object.keys(attributesToInclude).length > 0) {\n attributesHtmlStr = Object.entries(attributesToInclude).map(([key, value]) => `${key}=${capTextLength(value, 20)}`).join(\" \");\n }\n }\n const highlightIndicator = node.isNew ? `*[${node.highlightIndex}]` : `[${node.highlightIndex}]`;\n let line = `${depthStr}${highlightIndicator}<${node.tagName ?? \"\"}`;\n if (attributesHtmlStr) {\n line += ` ${attributesHtmlStr}`;\n }\n if (node.extra) {\n if (node.extra.scrollable) {\n let scrollDataText = \"\";\n if (node.extra.scrollData?.left)\n scrollDataText += `left=${node.extra.scrollData.left}, `;\n if (node.extra.scrollData?.top) scrollDataText += `top=${node.extra.scrollData.top}, `;\n if (node.extra.scrollData?.right)\n scrollDataText += `right=${node.extra.scrollData.right}, `;\n if (node.extra.scrollData?.bottom)\n scrollDataText += `bottom=${node.extra.scrollData.bottom}`;\n line += ` data-scrollable=\"${scrollDataText}\"`;\n }\n }\n if (text) {\n const trimmedText = text.trim();\n if (!attributesHtmlStr) {\n line += \" \";\n }\n line += `>${trimmedText}`;\n } else if (!attributesHtmlStr) {\n line += \" \";\n }\n line += \" />\";\n result22.push(line);\n }\n for (const child of node.children) {\n processNode(child, nextDepth, result22);\n }\n } else if (node.type === \"text\") {\n if (hasParentWithHighlightIndex(node)) {\n return;\n }\n if (node.parent && node.parent.type === \"element\" && node.parent.isVisible && node.parent.isTopElement) {\n result22.push(`${depthStr}${node.text ?? \"\"}`);\n }\n }\n }, \"processNode\");\n const result2 = [];\n processNode(rootNode, 0, result2);\n return result2.join(\"\\n\");\n}\n__name(flatTreeToString, \"flatTreeToString\");\nconst getAllTextTillNextClickableElement = /* @__PURE__ */ __name((node, maxDepth = -1) => {\n const textParts = [];\n const collectText = /* @__PURE__ */ __name((currentNode, currentDepth) => {\n if (maxDepth !== -1 && currentDepth > maxDepth) {\n return;\n }\n if (currentNode.type === \"element\" && currentNode !== node && currentNode.highlightIndex !== void 0) {\n return;\n }\n if (currentNode.type === \"text\" && currentNode.text) {\n textParts.push(currentNode.text);\n } else if (currentNode.type === \"element\") {\n for (const child of currentNode.children) {\n collectText(child, currentDepth + 1);\n }\n }\n }, \"collectText\");\n collectText(node, 0);\n return textParts.join(\"\\n\").trim();\n}, \"getAllTextTillNextClickableElement\");\nfunction getSelectorMap(flatTree) {\n const selectorMap = /* @__PURE__ */ new Map();\n const keys = Object.keys(flatTree.map);\n for (const key of keys) {\n const node = flatTree.map[key];\n if (node.isInteractive && typeof node.highlightIndex === \"number\") {\n selectorMap.set(node.highlightIndex, node);\n }\n }\n return selectorMap;\n}\n__name(getSelectorMap, \"getSelectorMap\");\nfunction getElementTextMap(simplifiedHTML) {\n const lines = simplifiedHTML.split(\"\\n\").map((line) => line.trim()).filter((line) => line.length > 0);\n const elementTextMap = /* @__PURE__ */ new Map();\n for (const line of lines) {\n const regex = /^\\[(\\d+)\\]<[^>]+>([^<]*)/;\n const match = regex.exec(line);\n if (match) {\n const index = parseInt(match[1], 10);\n elementTextMap.set(index, line);\n }\n }\n return elementTextMap;\n}\n__name(getElementTextMap, \"getElementTextMap\");\nfunction cleanUpHighlights() {\n const cleanupFunctions = window._highlightCleanupFunctions || [];\n for (const cleanup of cleanupFunctions) {\n if (typeof cleanup === \"function\") {\n cleanup();\n }\n }\n window._highlightCleanupFunctions = [];\n}\n__name(cleanUpHighlights, \"cleanUpHighlights\");\nwindow.addEventListener(\"popstate\", () => {\n cleanUpHighlights();\n});\nwindow.addEventListener(\"hashchange\", () => {\n cleanUpHighlights();\n});\nwindow.addEventListener(\"beforeunload\", () => {\n cleanUpHighlights();\n});\nconst navigation = window.navigation;\nif (navigation && typeof navigation.addEventListener === \"function\") {\n navigation.addEventListener(\"navigate\", () => {\n cleanUpHighlights();\n });\n} else {\n let currentUrl = window.location.href;\n setInterval(() => {\n if (window.location.href !== currentUrl) {\n currentUrl = window.location.href;\n cleanUpHighlights();\n }\n }, 500);\n}\nfunction getPageInfo() {\n const viewport_width = window.innerWidth;\n const viewport_height = window.innerHeight;\n const page_width = Math.max(document.documentElement.scrollWidth, document.body.scrollWidth || 0);\n const page_height = Math.max(\n document.documentElement.scrollHeight,\n document.body.scrollHeight || 0\n );\n const scroll_x = window.scrollX || window.pageXOffset || document.documentElement.scrollLeft || 0;\n const scroll_y = window.scrollY || window.pageYOffset || document.documentElement.scrollTop || 0;\n const pixels_below = Math.max(0, page_height - (window.innerHeight + scroll_y));\n const pixels_right = Math.max(0, page_width - (window.innerWidth + scroll_x));\n return {\n // Current viewport dimensions\n viewport_width,\n viewport_height,\n // Total page dimensions\n page_width,\n page_height,\n // Current scroll position\n scroll_x,\n scroll_y,\n pixels_above: scroll_y,\n pixels_below,\n pages_above: viewport_height > 0 ? scroll_y / viewport_height : 0,\n pages_below: viewport_height > 0 ? pixels_below / viewport_height : 0,\n total_pages: viewport_height > 0 ? page_height / viewport_height : 0,\n current_page_position: scroll_y / Math.max(1, page_height - viewport_height),\n pixels_left: scroll_x,\n pixels_right\n };\n}\n__name(getPageInfo, \"getPageInfo\");\nfunction patchReact(pageController) {\n const reactRootElements = document.querySelectorAll(\n '[data-reactroot], [data-reactid], [data-react-checksum], #root, #app, [id^=\"root-\"], [id^=\"app-\"], #adex-wrapper, #adex-root'\n );\n for (const element of reactRootElements) {\n element.setAttribute(\"data-page-agent-not-interactive\", \"true\");\n }\n}\n__name(patchReact, \"patchReact\");\nconst _PageController = class _PageController extends EventTarget {\n config;\n /** Corresponds to eval_page in browser-use */\n flatTree = null;\n /**\n * All highlighted index-mapped interactive elements\n * Corresponds to DOMState.selector_map in browser-use\n */\n selectorMap = /* @__PURE__ */ new Map();\n /** Index -> element text description mapping */\n elementTextMap = /* @__PURE__ */ new Map();\n /**\n * Simplified HTML for LLM consumption.\n * Corresponds to clickable_elements_to_string in browser-use\n */\n simplifiedHTML = \"<EMPTY>\";\n /** last time the tree was updated */\n lastTimeUpdate = 0;\n constructor(config = {}) {\n super();\n this.config = config;\n patchReact();\n }\n // ======= State Queries =======\n /**\n * Get current page URL\n */\n async getCurrentUrl() {\n return window.location.href;\n }\n /**\n * Get current page title\n */\n async getPageTitle() {\n return document.title;\n }\n /**\n * Get page scroll and size info\n */\n async getPageInfo() {\n return getPageInfo();\n }\n /**\n * Get the simplified HTML representation of the page.\n * This is used by LLM to understand the page structure.\n */\n async getSimplifiedHTML() {\n return this.simplifiedHTML;\n }\n /**\n * Get text description for an element by index\n */\n async getElementText(index) {\n return this.elementTextMap.get(index);\n }\n /**\n * Get total number of indexed interactive elements\n */\n async getElementCount() {\n return this.selectorMap.size;\n }\n /**\n * Get last tree update timestamp\n */\n async getLastUpdateTime() {\n return this.lastTimeUpdate;\n }\n /**\n * Get the viewport expansion setting\n */\n async getViewportExpansion() {\n return this.config.viewportExpansion ?? VIEWPORT_EXPANSION;\n }\n // ======= DOM Tree Operations =======\n /**\n * Update DOM tree, returns simplified HTML for LLM.\n * This is the main method to refresh the page state.\n */\n async updateTree() {\n this.dispatchEvent(new Event(\"beforeUpdate\"));\n this.lastTimeUpdate = Date.now();\n cleanUpHighlights();\n const blacklist = [\n ...this.config.interactiveBlacklist || [],\n ...document.querySelectorAll(\"[data-page-agent-not-interactive]\").values()\n ];\n this.flatTree = getFlatTree({\n ...this.config,\n interactiveBlacklist: blacklist\n });\n this.simplifiedHTML = flatTreeToString(this.flatTree, this.config.include_attributes);\n this.selectorMap.clear();\n this.selectorMap = getSelectorMap(this.flatTree);\n this.elementTextMap.clear();\n this.elementTextMap = getElementTextMap(this.simplifiedHTML);\n this.dispatchEvent(new Event(\"afterUpdate\"));\n return this.simplifiedHTML;\n }\n /**\n * Clean up all element highlights\n */\n async cleanUpHighlights() {\n cleanUpHighlights();\n }\n // ======= Element Actions =======\n /**\n * Click element by index\n */\n async clickElement(index) {\n try {\n const element = getElementByIndex(this.selectorMap, index);\n const elemText = this.elementTextMap.get(index);\n await clickElement(element);\n if (element instanceof HTMLAnchorElement && element.target === \"_blank\") {\n return {\n success: true,\n message: `✅ Clicked element (${elemText ?? index}). ⚠️ Link opens in a new tab. You are not capable of reading new tabs.`\n };\n }\n return {\n success: true,\n message: `✅ Clicked element (${elemText ?? index}).`\n };\n } catch (error) {\n return {\n success: false,\n message: `❌ Failed to click element: ${error}`\n };\n }\n }\n /**\n * Input text into element by index\n */\n async inputText(index, text) {\n try {\n const element = getElementByIndex(this.selectorMap, index);\n const elemText = this.elementTextMap.get(index);\n await inputTextElement(element, text);\n return {\n success: true,\n message: `✅ Input text (${text}) into element (${elemText ?? index}).`\n };\n } catch (error) {\n return {\n success: false,\n message: `❌ Failed to input text: ${error}`\n };\n }\n }\n /**\n * Select dropdown option by index and option text\n */\n async selectOption(index, optionText) {\n try {\n const element = getElementByIndex(this.selectorMap, index);\n const elemText = this.elementTextMap.get(index);\n await selectOptionElement(element, optionText);\n return {\n success: true,\n message: `✅ Selected option (${optionText}) in element (${elemText ?? index}).`\n };\n } catch (error) {\n return {\n success: false,\n message: `❌ Failed to select option: ${error}`\n };\n }\n }\n /**\n * Scroll vertically\n */\n async scroll(options) {\n try {\n const { down, numPages, pixels, index } = options;\n const scrollAmount = pixels ?? numPages * (down ? 1 : -1) * window.innerHeight;\n const element = index !== void 0 ? getElementByIndex(this.selectorMap, index) : null;\n const message = await scrollVertically(down, scrollAmount, element);\n return {\n success: true,\n message\n };\n } catch (error) {\n return {\n success: false,\n message: `❌ Failed to scroll: ${error}`\n };\n }\n }\n /**\n * Scroll horizontally\n */\n async scrollHorizontally(options) {\n try {\n const { right, pixels, index } = options;\n const scrollAmount = pixels * (right ? 1 : -1);\n const element = index !== void 0 ? getElementByIndex(this.selectorMap, index) : null;\n const message = await scrollHorizontally(right, scrollAmount, element);\n return {\n success: true,\n message\n };\n } catch (error) {\n return {\n success: false,\n message: `❌ Failed to scroll horizontally: ${error}`\n };\n }\n }\n /**\n * Execute arbitrary JavaScript on the page\n */\n async executeJavascript(script) {\n try {\n const asyncFunction = eval(`(async () => { ${script} })`);\n const result = await asyncFunction();\n return {\n success: true,\n message: `✅ Executed JavaScript. Result: ${result}`\n };\n } catch (error) {\n return {\n success: false,\n message: `❌ Error executing JavaScript: ${error}`\n };\n }\n }\n /**\n * Dispose and clean up resources\n */\n dispose() {\n cleanUpHighlights();\n this.flatTree = null;\n this.selectorMap.clear();\n this.elementTextMap.clear();\n this.simplifiedHTML = \"<EMPTY>\";\n }\n};\n__name(_PageController, \"PageController\");\nlet PageController = _PageController;\nexport {\n PageController\n};\n//# sourceMappingURL=page-controller.js.map\n","(function() {\n \"use strict\";\n try {\n if (typeof document != \"undefined\") {\n var elementStyle = document.createElement(\"style\");\n elementStyle.appendChild(document.createTextNode(\"._wrapper_1j0ct_1 {\\n\tposition: fixed;\\n\tbottom: 100px;\\n\tleft: 50%;\\n\ttransform: translateX(-50%) translateY(20px);\\n\topacity: 0;\\n\tz-index: 2147483642; /* 比 SimulatorMask 高一层 */\\n\tbox-sizing: border-box;\\n\\n\toverflow: visible;\\n\\n\t* {\\n\t\tbox-sizing: border-box;\\n\t}\\n\\n\t--width: 360px;\\n\t--height: 40px;\\n\t--border-radius: 12px;\\n\\n\t--side-space: 12px; /* 控制栏两侧的间距 */\\n\t--history-width: calc(var(--width) - var(--side-space) * 2);\\n\\n\t--color-1: rgb(57, 182, 255);\\n\t--color-2: rgb(189, 69, 251);\\n\t--color-3: rgb(255, 87, 51);\\n\t--color-4: rgb(255, 214, 0);\\n\\n\twidth: var(--width);\\n\theight: var(--height);\\n\\n\ttransition: all 0.3s ease-in-out;\\n\\n\t/* 响应式设计 */\\n\t@media (max-width: 480px) {\\n\t\twidth: calc(100vw - 40px);\\n\t\t--width: calc(100vw - 40px);\\n\t}\\n\\n\t._background_1j0ct_39 {\\n\t\tposition: absolute;\\n\t\tinset: -2px -8px;\\n\t\tborder-radius: calc(var(--border-radius) + 4px);\\n\t\tfilter: blur(16px);\\n\t\toverflow: hidden;\\n\t\t/* mix-blend-mode: lighten; */\\n\t\t/* display: none; */\\n\\n\t\t&::before {\\n\t\t\tcontent: '';\\n\t\t\tz-index: -1;\\n\t\t\tpointer-events: none;\\n\t\t\tposition: absolute;\\n\t\t\twidth: 100%;\\n\t\t\theight: 100%;\\n\t\t\t/* left: -100%; */\\n\t\t\tleft: 0;\\n\t\t\ttop: 0;\\n\\n\t\t\tbackground-image: linear-gradient(\\n\t\t\t\tto bottom left,\\n\t\t\t\tvar(--color-1),\\n\t\t\t\tvar(--color-2),\\n\t\t\t\tvar(--color-1)\\n\t\t\t);\\n\t\t\tanimation: _mask-running_1j0ct_1 2s linear infinite;\\n\t\t}\\n\t\t&::after {\\n\t\t\tcontent: '';\\n\t\t\tz-index: -1;\\n\t\t\tpointer-events: none;\\n\t\t\tposition: absolute;\\n\t\t\twidth: 100%;\\n\t\t\theight: 100%;\\n\t\t\tleft: 0;\\n\t\t\ttop: 0;\\n\\n\t\t\tbackground-image: linear-gradient(\\n\t\t\t\tto bottom left,\\n\t\t\t\tvar(--color-2),\\n\t\t\t\tvar(--color-1),\\n\t\t\t\tvar(--color-2)\\n\t\t\t);\\n\t\t\tanimation: _mask-running_1j0ct_1 2s linear infinite;\\n\t\t\tanimation-delay: 1s;\\n\t\t}\\n\t}\\n}\\n\\n@keyframes _mask-running_1j0ct_1 {\\n\tfrom {\\n\t\ttransform: translateX(-100%);\\n\t}\\n\tto {\\n\t\ttransform: translateX(100%);\\n\t}\\n}\\n\\n/* 控制栏 */\\n._header_1j0ct_99 {\\n\tdisplay: flex;\\n\talign-items: center;\\n\tjustify-content: space-between;\\n\tpadding: 8px 12px;\\n\tuser-select: none;\\n\\n\tposition: absolute;\\n\tinset: 0;\\n\\n\tcursor: pointer;\\n\tflex-shrink: 0; /* 防止 header 被压缩 */\\n\\n\tbackground: rgba(0, 0, 0, 0.5);\\n\tbackdrop-filter: blur(10px);\\n\tborder-radius: var(--border-radius);\\n\tbackground-clip: padding-box;\\n\\n\tbox-shadow:\\n\t\t0 0 0px 2px rgba(255, 255, 255, 0.4),\\n\t\t0 0 5px 1px rgba(255, 255, 255, 0.3);\\n\\n\t._statusSection_1j0ct_121 {\\n\t\tdisplay: flex;\\n\t\talign-items: center;\\n\t\tgap: 8px;\\n\t\tflex: 1;\\n\t\tmin-height: 24px; /* 确保垂直居中 */\\n\\n\t\t._indicator_1j0ct_128 {\\n\t\t\twidth: 6px;\\n\t\t\theight: 6px;\\n\t\t\tborder-radius: 50%;\\n\t\t\tbackground: rgba(255, 255, 255, 0.5);\\n\t\t\tflex-shrink: 0;\\n\t\t\tanimation: none; /* 默认无动画 */\\n\\n\t\t\t/* 运行状态 - 有动画 */\\n\t\t\t&._thinking_1j0ct_137 {\\n\t\t\t\tbackground: rgb(57, 182, 255);\\n\t\t\t\tanimation: _pulse_1j0ct_1 0.8s ease-in-out infinite;\\n\t\t\t}\\n\\n\t\t\t&._tool_executing_1j0ct_142 {\\n\t\t\t\tbackground: rgb(189, 69, 251);\\n\t\t\t\tanimation: _pulse_1j0ct_1 0.6s ease-in-out infinite;\\n\t\t\t}\\n\\n\t\t\t&._retry_1j0ct_147 {\\n\t\t\t\tbackground: rgb(255, 214, 0);\\n\t\t\t\tanimation: _retryPulse_1j0ct_1 1s ease-in-out infinite;\\n\t\t\t}\\n\\n\t\t\t/* 静止状态 - 无动画 */\\n\t\t\t&._completed_1j0ct_153,\\n\t\t\t&._input_1j0ct_154,\\n\t\t\t&._output_1j0ct_155 {\\n\t\t\t\tbackground: rgb(34, 197, 94);\\n\t\t\t\tanimation: none;\\n\t\t\t}\\n\\n\t\t\t&._error_1j0ct_160 {\\n\t\t\t\tbackground: rgb(239, 68, 68);\\n\t\t\t\tanimation: none;\\n\t\t\t}\\n\t\t}\\n\\n\t\t._statusText_1j0ct_166 {\\n\t\t\tcolor: white;\\n\t\t\tfont-size: 12px;\\n\t\t\tline-height: 1;\\n\t\t\tfont-weight: 500;\\n\t\t\ttransition: all 0.3s ease-in-out;\\n\t\t\tposition: relative;\\n\t\t\toverflow: hidden;\\n\t\t\tdisplay: flex;\\n\t\t\talign-items: center;\\n\t\t\tmin-height: 24px; /* 确保垂直居中 */\\n\\n\t\t\t&._fadeOut_1j0ct_178 {\\n\t\t\t\tanimation: _statusTextFadeOut_1j0ct_1 0.3s ease forwards;\\n\t\t\t}\\n\\n\t\t\t&._fadeIn_1j0ct_182 {\\n\t\t\t\tanimation: _statusTextFadeIn_1j0ct_1 0.3s ease forwards;\\n\t\t\t}\\n\t\t}\\n\t}\\n\\n\t._controls_1j0ct_188 {\\n\t\tdisplay: flex;\\n\t\talign-items: center;\\n\t\tgap: 4px;\\n\\n\t\t._controlButton_1j0ct_193 {\\n\t\t\twidth: 24px;\\n\t\t\theight: 24px;\\n\t\t\tborder: none;\\n\t\t\tborder-radius: 4px;\\n\t\t\tbackground: rgba(255, 255, 255, 0.1);\\n\t\t\tcolor: white;\\n\t\t\tcursor: pointer;\\n\t\t\tdisplay: flex;\\n\t\t\talign-items: center;\\n\t\t\tjustify-content: center;\\n\t\t\tfont-size: 12px;\\n\t\t\tline-height: 1;\\n\\n\t\t\t&:hover {\\n\t\t\t\tbackground: rgba(255, 255, 255, 0.2);\\n\t\t\t}\\n\t\t}\\n\\n\t\t._pauseButton_1j0ct_212 {\\n\t\t\tfont-weight: 600;\\n\t\t\t&._paused_1j0ct_214 {\\n\t\t\t\tbackground: rgba(34, 197, 94, 0.2); /* 绿色背景表示可以继续 */\\n\t\t\t\tcolor: rgb(34, 197, 94);\\n\\n\t\t\t\t&:hover {\\n\t\t\t\t\tbackground: rgba(34, 197, 94, 0.3);\\n\t\t\t\t}\\n\t\t\t}\\n\t\t}\\n\\n\t\t._stopButton_1j0ct_224 {\\n\t\t\tbackground: rgba(239, 68, 68, 0.2);\\n\t\t\tcolor: rgb(255, 41, 41);\\n\t\t\tfont-weight: 600;\\n\\n\t\t\t&:hover {\\n\t\t\t\tbackground: rgba(239, 68, 68, 0.3);\\n\t\t\t}\\n\t\t}\\n\t}\\n}\\n\\n@keyframes _statusTextFadeIn_1j0ct_1 {\\n\t0% {\\n\t\topacity: 0;\\n\t\ttransform: translateY(5px);\\n\t}\\n\t100% {\\n\t\topacity: 1;\\n\t\ttransform: translateY(0);\\n\t}\\n}\\n\\n@keyframes _statusTextFadeOut_1j0ct_1 {\\n\t0% {\\n\t\topacity: 1;\\n\t\ttransform: translateY(0);\\n\t}\\n\t100% {\\n\t\topacity: 0;\\n\t\ttransform: translateY(-5px);\\n\t}\\n}\\n\\n._historySectionWrapper_1j0ct_258 {\\n\tposition: absolute;\\n\twidth: var(--history-width);\\n\tbottom: var(--height);\\n\tleft: var(--side-space);\\n\tz-index: -2;\\n\\n\tpadding-top: 0px;\\n\tvisibility: collapse;\\n\toverflow: hidden;\\n\\n\ttransition: all 0.2s;\\n\\n\tbackground: rgba(2, 0, 20, 0.5);\\n\t/* background: rgba(186, 186, 186, 0.2); */\\n\tbackdrop-filter: blur(10px);\\n\\n\ttext-shadow: 0 0 1px rgba(0, 0, 0, 0.2);\\n\\n\tborder-top-left-radius: calc(var(--border-radius) + 4px);\\n\tborder-top-right-radius: calc(var(--border-radius) + 4px);\\n\\n\t/* border: 2px solid rgba(255, 255, 255, 0.8); */\\n\tborder: 2px solid rgba(255, 255, 255, 0.4);\\n\tbox-shadow: 0 4px 16px rgba(0, 0, 0, 0.6);\\n\\n\t/* @media (prefers-color-scheme: dark) {\\n\t\tbox-shadow:\\n\t\t\t0 8px 32px 0 rgba(0, 0, 0, 0.85),\\n\t\t\t0 2px 12px 0 rgba(57, 182, 255, 0.1);\\n\t} */\\n\\n\t._expanded_1j0ct_290 & {\\n\t\tpadding-top: 8px;\\n\t\tvisibility: visible;\\n\t}\\n\\n\t._historySection_1j0ct_258 {\\n\t\tposition: relative;\\n\t\toverflow-y: auto;\\n\t\toverscroll-behavior: contain;\\n\t\tscrollbar-width: none;\\n\t\tmax-height: 0;\\n\t\tpadding-inline: 8px;\\n\\n\t\ttransition: max-height 0.2s;\\n\\n\t\t._expanded_1j0ct_290 & {\\n\t\t\tmax-height: 400px;\\n\t\t}\\n\\n\t\t._historyItem_1j0ct_309 {\\n\t\t\t/* backdrop-filter: blur(10px); */\\n\t\t\tpadding: 8px 10px;\\n\t\t\tmargin-bottom: 6px;\\n\t\t\tbackground: linear-gradient(135deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.03));\\n\t\t\tborder-radius: 8px;\\n\t\t\tborder-left: 2px solid rgba(57, 182, 255, 0.5);\\n\t\t\tfont-size: 12px;\\n\t\t\tcolor: white;\\n\t\t\t/* color: black; */\\n\t\t\tline-height: 1.3;\\n\t\t\tposition: relative;\\n\t\t\toverflow: hidden;\\n\\n\t\t\t/* 微妙的内阴影 */\\n\t\t\tbox-shadow:\\n\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.1),\\n\t\t\t\t0 1px 3px rgba(0, 0, 0, 0.1);\\n\\n\t\t\t&::before {\\n\t\t\t\tcontent: '';\\n\t\t\t\tposition: absolute;\\n\t\t\t\ttop: 0;\\n\t\t\t\tleft: 0;\\n\t\t\t\tright: 0;\\n\t\t\t\theight: 1px;\\n\t\t\t\tbackground: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);\\n\t\t\t}\\n\\n\t\t\t&:hover {\\n\t\t\t\tbackground: linear-gradient(135deg, rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.06));\\n\t\t\t\t/* transform: translateY(-1px); */\\n\t\t\t\tbox-shadow:\\n\t\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.15),\\n\t\t\t\t\t0 2px 4px rgba(0, 0, 0, 0.15);\\n\t\t\t}\\n\\n\t\t\t&:last-child {\\n\t\t\t\tmargin-bottom: 10px;\\n\t\t\t}\\n\\n\t\t\t&._completed_1j0ct_153,\\n\t\t\t&._input_1j0ct_154,\\n\t\t\t&._output_1j0ct_155 {\\n\t\t\t\tborder-left-color: rgb(34, 197, 94);\\n\t\t\t\tbackground: linear-gradient(135deg, rgba(34, 197, 94, 0.1), rgba(34, 197, 94, 0.05));\\n\t\t\t}\\n\\n\t\t\t&._error_1j0ct_160 {\\n\t\t\t\tborder-left-color: rgb(239, 68, 68);\\n\t\t\t\tbackground: linear-gradient(135deg, rgba(239, 68, 68, 0.1), rgba(239, 68, 68, 0.05));\\n\t\t\t}\\n\\n\t\t\t&._retry_1j0ct_147 {\\n\t\t\t\tborder-left-color: rgb(255, 214, 0);\\n\t\t\t\tbackground: linear-gradient(135deg, rgba(255, 214, 0, 0.1), rgba(255, 214, 0, 0.05));\\n\t\t\t}\\n\\n\t\t\t/* 突出显示 done 成功结果 */\\n\t\t\t&._doneSuccess_1j0ct_368 {\\n\t\t\t\tbackground: linear-gradient(\\n\t\t\t\t\t135deg,\\n\t\t\t\t\trgba(34, 197, 94, 0.25),\\n\t\t\t\t\trgba(34, 197, 94, 0.15),\\n\t\t\t\t\trgba(34, 197, 94, 0.08)\\n\t\t\t\t);\\n\t\t\t\tborder: none;\\n\t\t\t\tborder-left: 4px solid rgb(34, 197, 94);\\n\t\t\t\tbox-shadow:\\n\t\t\t\t\t0 4px 12px rgba(34, 197, 94, 0.3),\\n\t\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.2),\\n\t\t\t\t\t0 0 20px rgba(34, 197, 94, 0.1);\\n\t\t\t\tfont-weight: 600;\\n\t\t\t\tcolor: rgb(220, 252, 231);\\n\t\t\t\tpadding: 10px 12px;\\n\t\t\t\tmargin-bottom: 8px;\\n\t\t\t\tborder-radius: 8px;\\n\t\t\t\tposition: relative;\\n\t\t\t\toverflow: hidden;\\n\\n\t\t\t\t&::before {\\n\t\t\t\t\tbackground: linear-gradient(90deg, transparent, rgba(34, 197, 94, 0.4), transparent);\\n\t\t\t\t}\\n\\n\t\t\t\t&::after {\\n\t\t\t\t\tcontent: '';\\n\t\t\t\t\tposition: absolute;\\n\t\t\t\t\ttop: 0;\\n\t\t\t\t\tleft: -100%;\\n\t\t\t\t\twidth: 100%;\\n\t\t\t\t\theight: 100%;\\n\t\t\t\t\tbackground: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent);\\n\t\t\t\t\tanimation: _shimmer_1j0ct_1 2s ease-in-out infinite;\\n\t\t\t\t}\\n\\n\t\t\t\t._historyContent_1j0ct_404 {\\n\t\t\t\t\t._statusIcon_1j0ct_405 {\\n\t\t\t\t\t\tfont-size: 16px;\\n\t\t\t\t\t\tanimation: _celebrate_1j0ct_1 0.8s ease-in-out;\\n\t\t\t\t\t\tfilter: drop-shadow(0 2px 4px rgba(34, 197, 94, 0.5));\\n\t\t\t\t\t}\\n\t\t\t\t}\\n\t\t\t}\\n\\n\t\t\t/* 突出显示 done 失败结果 */\\n\t\t\t&._doneError_1j0ct_414 {\\n\t\t\t\tbackground: linear-gradient(\\n\t\t\t\t\t135deg,\\n\t\t\t\t\trgba(239, 68, 68, 0.25),\\n\t\t\t\t\trgba(239, 68, 68, 0.15),\\n\t\t\t\t\trgba(239, 68, 68, 0.08)\\n\t\t\t\t);\\n\t\t\t\tborder: none;\\n\t\t\t\tborder-left: 4px solid rgb(239, 68, 68);\\n\t\t\t\tbox-shadow:\\n\t\t\t\t\t0 4px 12px rgba(239, 68, 68, 0.3),\\n\t\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.2),\\n\t\t\t\t\t0 0 20px rgba(239, 68, 68, 0.1);\\n\t\t\t\tfont-weight: 600;\\n\t\t\t\tcolor: rgb(254, 226, 226);\\n\t\t\t\tpadding: 10px 12px;\\n\t\t\t\tmargin-bottom: 8px;\\n\t\t\t\tborder-radius: 8px;\\n\t\t\t\tposition: relative;\\n\t\t\t\toverflow: hidden;\\n\\n\t\t\t\t&::before {\\n\t\t\t\t\tbackground: linear-gradient(90deg, transparent, rgba(239, 68, 68, 0.4), transparent);\\n\t\t\t\t}\\n\\n\t\t\t\t._historyContent_1j0ct_404 {\\n\t\t\t\t\t._statusIcon_1j0ct_405 {\\n\t\t\t\t\t\tfont-size: 16px;\\n\t\t\t\t\t\tfilter: drop-shadow(0 2px 4px rgba(239, 68, 68, 0.5));\\n\t\t\t\t\t}\\n\t\t\t\t}\\n\t\t\t}\\n\\n\t\t\t._historyContent_1j0ct_404 {\\n\t\t\t\tdisplay: flex;\\n\t\t\t\talign-items: center;\\n\t\t\t\tgap: 8px;\\n\\n\t\t\t\tword-break: break-all;\\n\t\t\t\twhite-space: pre-wrap;\\n\\n\t\t\t\t/* overflow-x: auto; */\\n\\n\t\t\t\t._statusIcon_1j0ct_405 {\\n\t\t\t\t\tfont-size: 12px;\\n\t\t\t\t\tflex-shrink: 0;\\n\t\t\t\t\tline-height: 1;\\n\t\t\t\t\ttransition: all 0.3s ease;\\n\t\t\t\t}\\n\t\t\t}\\n\\n\t\t\t._historyMeta_1j0ct_465 {\\n\t\t\t\tfont-size: 10px;\\n\t\t\t\tcolor: rgba(255, 255, 255, 0.6);\\n\t\t\t\t/* color: rgb(61, 61, 61); */\\n\t\t\t\tmargin-top: 8px;\\n\t\t\t\tline-height: 1;\\n\t\t\t}\\n\t\t}\\n\t}\\n}\\n\\n/* 动画关键帧 - 更快的闪烁 */\\n@keyframes _pulse_1j0ct_1 {\\n\t0%,\\n\t100% {\\n\t\topacity: 1;\\n\t\ttransform: scale(1);\\n\t}\\n\t50% {\\n\t\topacity: 0.4;\\n\t\ttransform: scale(1.3);\\n\t}\\n}\\n\\n/* 重试动画 - 旋转脉冲 */\\n@keyframes _retryPulse_1j0ct_1 {\\n\t0%,\\n\t100% {\\n\t\topacity: 1;\\n\t\ttransform: scale(1) rotate(0deg);\\n\t}\\n\t25% {\\n\t\topacity: 0.6;\\n\t\ttransform: scale(1.2) rotate(90deg);\\n\t}\\n\t50% {\\n\t\topacity: 0.8;\\n\t\ttransform: scale(1.1) rotate(180deg);\\n\t}\\n\t75% {\\n\t\topacity: 0.6;\\n\t\ttransform: scale(1.2) rotate(270deg);\\n\t}\\n}\\n\\n/* 庆祝动画 */\\n@keyframes _celebrate_1j0ct_1 {\\n\t0%,\\n\t100% {\\n\t\ttransform: scale(1);\\n\t}\\n\t25% {\\n\t\ttransform: scale(1.2) rotate(-5deg);\\n\t}\\n\t75% {\\n\t\ttransform: scale(1.2) rotate(5deg);\\n\t}\\n}\\n\\n/* done 卡片的光泽效果 */\\n@keyframes _shimmer_1j0ct_1 {\\n\t0% {\\n\t\tleft: -100%;\\n\t}\\n\t100% {\\n\t\tleft: 100%;\\n\t}\\n}\\n\\n/* 输入区域样式 */\\n._inputSectionWrapper_1j0ct_535 {\\n\tposition: absolute;\\n\twidth: var(--history-width);\\n\ttop: var(--height);\\n\tleft: var(--side-space);\\n\tz-index: -1;\\n\\n\tvisibility: visible;\\n\toverflow: hidden;\\n\\n\theight: 48px;\\n\\n\ttransition: all 0.2s;\\n\\n\tbackground: rgba(186, 186, 186, 0.2);\\n\tbackdrop-filter: blur(10px);\\n\\n\tborder-bottom-left-radius: calc(var(--border-radius) + 4px);\\n\tborder-bottom-right-radius: calc(var(--border-radius) + 4px);\\n\\n\tborder: 2px solid rgba(255, 255, 255, 0.3);\\n\tbox-shadow: 0 1px 16px rgba(0, 0, 0, 0.4);\\n\\n\t&._hidden_1j0ct_558 {\\n\t\tvisibility: collapse;\\n\t\theight: 0;\\n\t}\\n\\n\t._inputSection_1j0ct_535 {\\n\t\tdisplay: flex;\\n\t\talign-items: center;\\n\t\tgap: 4px;\\n\t\tpadding: 8px 8px;\\n\\n\t\t._taskInput_1j0ct_569 {\\n\t\t\tflex: 1;\\n\t\t\tbackground: rgba(255, 255, 255, 0.4);\\n\t\t\tborder: 1px solid rgba(255, 255, 255, 0.3);\\n\t\t\tborder-radius: 10px;\\n\t\t\tpadding-inline: 10px;\\n\t\t\tcolor: rgb(20, 20, 20);\\n\t\t\tfont-size: 12px;\\n\t\t\theight: 28px;\\n\t\t\tline-height: 1;\\n\t\t\toutline: none;\\n\t\t\ttransition: all 0.2s ease;\\n\\n\t\t\t/* text-shadow: 0 0 2px rgba(255, 255, 255, 0.8); */\\n\\n\t\t\t/* border-color: rgba(57, 182, 255, 0.3); */\\n\\n\t\t\t&::placeholder {\\n\t\t\t\tcolor: rgb(53, 53, 53);\\n\t\t\t}\\n\\n\t\t\t&:focus {\\n\t\t\t\tbackground: rgba(255, 255, 255, 0.8);\\n\t\t\t\tborder-color: rgba(57, 182, 255, 0.6);\\n\t\t\t\tbox-shadow: 0 0 0 2px rgba(57, 182, 255, 0.2);\\n\t\t\t}\\n\t\t}\\n\t}\\n}\\n._wrapper_1oy2s_1 {\\n\tposition: fixed;\\n\tinset: 0;\\n\tz-index: 2147483641; /* 确保在所有元素之上,除了 panel */\\n\t/* pointer-events: none; */\\n\tcursor: not-allowed;\\n\toverflow: hidden;\\n\\n\tdisplay: none;\\n}\\n/* AI 光标样式 */\\n._cursor_1vrf3_2 {\\n\tposition: absolute;\\n\twidth: var(--cursor-size, 75px);\\n\theight: var(--cursor-size, 75px);\\n\tpointer-events: none;\\n\tz-index: 10000;\\n\ttransform: translate(-30%, -30%);\\n\\n\tanimation: _cursor-enter_1vrf3_1 300ms ease-out forwards;\\n}\\n\\n._cursorBorder_1vrf3_13 {\\n\tposition: absolute;\\n\tinset: 0;\\n\tbackground: linear-gradient(45deg, rgb(57, 182, 255), rgb(189, 69, 251));\\n\tmask-image: url(https://img.alicdn.com/imgextra/i1/O1CN01YHLVYR1LvqWIyo5kH_!!6000000001362-2-tps-202-202.png);\\n\tmask-size: 100% 100%;\\n\tmask-repeat: no-repeat;\\n\tanimation: _cursor-breathe_1vrf3_1 2s ease-in-out infinite;\\n}\\n\\n._cursorFilling_1vrf3_23 {\\n\tposition: absolute;\\n\tinset: 0;\\n\tbackground: url(https://img.alicdn.com/imgextra/i3/O1CN01JZOqOS1Tu1sIKbPLW_!!6000000002441-2-tps-202-202.png);\\n\tbackground-size: 100% 100%;\\n\tbackground-repeat: no-repeat;\\n}\\n\\n._cursorRipple_1vrf3_31 {\\n\tposition: absolute;\\n\tinset: 0;\\n\tpointer-events: none;\\n}\\n\\n._cursor_1vrf3_2._clicking_1vrf3_37 ._cursorRipple_1vrf3_31::after {\\n\tcontent: '';\\n\tposition: absolute;\\n\twidth: 100%;\\n\theight: 100%;\\n\tleft: -30%;\\n\ttop: -30%;\\n\tborder: 4px solid rgba(57, 182, 255, 1);\\n\tborder-radius: 50%;\\n\tanimation: _cursor-ripple_1vrf3_1 300ms ease-out forwards;\\n}\\n\\n/* 光标动画关键帧 */\\n@keyframes _cursor-breathe_1vrf3_1 {\\n\t0%,\\n\t100% {\\n\t\ttransform: scale(1);\\n\t\topacity: 0.9;\\n\t}\\n\t50% {\\n\t\ttransform: scale(1.05);\\n\t\topacity: 1;\\n\t}\\n}\\n\\n@keyframes _cursor-rotate_1vrf3_1 {\\n\t0% {\\n\t\ttransform: rotate(0deg);\\n\t}\\n\t100% {\\n\t\ttransform: rotate(360deg);\\n\t}\\n}\\n\\n@keyframes _cursor-enter_1vrf3_1 {\\n\t0% {\\n\t\ttransform: translate(-30%, -30%) scale(0.5);\\n\t\topacity: 0;\\n\t}\\n\t100% {\\n\t\ttransform: translate(-30%, -30%) scale(1);\\n\t\topacity: 1;\\n\t}\\n}\\n\\n@keyframes _cursor-ripple_1vrf3_1 {\\n\t0% {\\n\t\ttransform: scale(0);\\n\t\topacity: 1;\\n\t}\\n\t100% {\\n\t\ttransform: scale(2);\\n\t\topacity: 0;\\n\t}\\n}\"));\n document.head.appendChild(elementStyle);\n }\n } catch (e) {\n console.error(\"vite-plugin-css-injected-by-js\", e);\n }\n})();\nvar __defProp = Object.defineProperty;\nvar __typeError = (msg) => {\n throw TypeError(msg);\n};\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nvar __accessCheck = (obj, member, msg) => member.has(obj) || __typeError(\"Cannot \" + msg);\nvar __privateGet = (obj, member, getter) => (__accessCheck(obj, member, \"read from private field\"), getter ? getter.call(obj) : member.get(obj));\nvar __privateAdd = (obj, member, value) => member.has(obj) ? __typeError(\"Cannot add the same private member more than once\") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\nvar __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, \"write to private field\"), setter ? setter.call(obj, value) : member.set(obj, value), value);\nvar __privateMethod = (obj, member, method) => (__accessCheck(obj, member, \"access private method\"), method);\nvar _wrapper, _indicator, _statusText, _historySection, _expandButton, _pauseButton, _stopButton, _inputSection, _taskInput, _state, _isExpanded, _config, _i18n, _userAnswerResolver, _isWaitingForUserAnswer, _headerUpdateTimer, _pendingHeaderText, _isAnimating, _Panel_instances, toStepData_fn, getToolExecutingText_fn, getToolCompletedText_fn, updateInternal_fn, togglePause_fn, updatePauseButton_fn, stopAgent_fn, submitTask_fn, handleUserAnswer_fn, showInputArea_fn, hideInputArea_fn, shouldShowInputArea_fn, createWrapper_fn, setupEventListeners_fn, toggle_fn, expand_fn, collapse_fn, startHeaderUpdateLoop_fn, stopHeaderUpdateLoop_fn, checkAndUpdateHeader_fn, animateTextChange_fn, updateStatusIndicator_fn, updateHistory_fn, scrollToBottom_fn, createHistoryItem_fn, _cursor, _currentCursorX, _currentCursorY, _targetCursorX, _targetCursorY, _SimulatorMask_instances, createCursor_fn, moveCursorToTarget_fn;\nimport { Motion } from \"ai-motion\";\nconst _UIState = class _UIState {\n steps = [];\n currentStep = null;\n status = \"idle\";\n stepCounter = 0;\n addStep(stepData) {\n const step = {\n id: this.generateId(),\n stepNumber: ++this.stepCounter,\n timestamp: /* @__PURE__ */ new Date(),\n ...stepData\n };\n this.steps.push(step);\n this.currentStep = step;\n this.updateStatus(step.type);\n return step;\n }\n updateCurrentStep(updates) {\n if (!this.currentStep) return null;\n Object.assign(this.currentStep, updates);\n return this.currentStep;\n }\n getCurrentStep() {\n return this.currentStep;\n }\n getAllSteps() {\n return [...this.steps];\n }\n getStatus() {\n return this.status;\n }\n reset() {\n this.steps = [];\n this.currentStep = null;\n this.status = \"idle\";\n this.stepCounter = 0;\n }\n updateStatus(stepType) {\n switch (stepType) {\n case \"thinking\":\n case \"tool_executing\":\n case \"output\":\n case \"input\":\n case \"retry\":\n this.status = \"running\";\n break;\n case \"completed\":\n this.status = \"completed\";\n break;\n case \"error\":\n this.status = \"error\";\n break;\n }\n }\n generateId() {\n return `step_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n }\n};\n__name(_UIState, \"UIState\");\nlet UIState = _UIState;\nconst enUS = {\n ui: {\n panel: {\n ready: \"Ready\",\n thinking: \"Thinking...\",\n paused: \"Paused\",\n taskInput: \"Enter new task, describe steps in detail, press Enter to submit\",\n userAnswerPrompt: \"Please answer the question above, press Enter to submit\",\n taskTerminated: \"Task terminated\",\n taskCompleted: \"Task completed\",\n continueExecution: \"Continue execution\",\n userAnswer: \"User answer: {{input}}\",\n question: \"Question: {{question}}\",\n waitingPlaceholder: \"Waiting for task to start...\",\n pause: \"Pause\",\n continue: \"Continue\",\n stop: \"Stop\",\n expand: \"Expand history\",\n collapse: \"Collapse history\",\n step: \"Step {{number}} · {{time}}{{duration}}\"\n },\n tools: {\n clicking: \"Clicking element [{{index}}]...\",\n inputting: \"Inputting text to element [{{index}}]...\",\n selecting: 'Selecting option \"{{text}}\"...',\n scrolling: \"Scrolling page...\",\n waiting: \"Waiting {{seconds}} seconds...\",\n done: \"Task done\",\n clicked: \"🖱️ Clicked element [{{index}}]\",\n inputted: '⌨️ Inputted text \"{{text}}\"',\n selected: '☑️ Selected option \"{{text}}\"',\n scrolled: \"🛞 Page scrolled\",\n waited: \"⌛️ Wait completed\",\n executing: \"Executing {{toolName}}...\",\n resultSuccess: \"success\",\n resultFailure: \"failed\",\n resultError: \"error\"\n },\n errors: {\n elementNotFound: \"No interactive element found at index {{index}}\",\n taskRequired: \"Task description is required\",\n executionFailed: \"Task execution failed\",\n notInputElement: \"Element is not an input or textarea\",\n notSelectElement: \"Element is not a select element\",\n optionNotFound: 'Option \"{{text}}\" not found'\n }\n }\n};\nconst zhCN = {\n ui: {\n panel: {\n ready: \"准备就绪\",\n thinking: \"正在思考...\",\n paused: \"暂停中,稍后\",\n taskInput: \"输入新任务,详细描述步骤,回车提交\",\n userAnswerPrompt: \"请回答上面问题,回车提交\",\n taskTerminated: \"任务已终止\",\n taskCompleted: \"任务结束\",\n continueExecution: \"继续执行\",\n userAnswer: \"用户回答: {{input}}\",\n question: \"询问: {{question}}\",\n waitingPlaceholder: \"等待任务开始...\",\n pause: \"暂停\",\n continue: \"继续\",\n stop: \"终止\",\n expand: \"展开历史\",\n collapse: \"收起历史\",\n step: \"步骤 {{number}} · {{time}}{{duration}}\"\n },\n tools: {\n clicking: \"正在点击元素 [{{index}}]...\",\n inputting: \"正在输入文本到元素 [{{index}}]...\",\n selecting: '正在选择选项 \"{{text}}\"...',\n scrolling: \"正在滚动页面...\",\n waiting: \"等待 {{seconds}} 秒...\",\n done: \"结束任务\",\n clicked: \"🖱️ 已点击元素 [{{index}}]\",\n inputted: '⌨️ 已输入文本 \"{{text}}\"',\n selected: '☑️ 已选择选项 \"{{text}}\"',\n scrolled: \"🛞 页面滚动完成\",\n waited: \"⌛️ 等待完成\",\n executing: \"正在执行 {{toolName}}...\",\n resultSuccess: \"成功\",\n resultFailure: \"失败\",\n resultError: \"错误\"\n },\n errors: {\n elementNotFound: \"未找到索引为 {{index}} 的交互元素\",\n taskRequired: \"任务描述不能为空\",\n executionFailed: \"任务执行失败\",\n notInputElement: \"元素不是输入框或文本域\",\n notSelectElement: \"元素不是选择框\",\n optionNotFound: '未找到选项 \"{{text}}\"'\n }\n }\n};\nconst locales = {\n \"en-US\": enUS,\n \"zh-CN\": zhCN\n};\nconst _I18n = class _I18n {\n language;\n translations;\n constructor(language = \"en-US\") {\n this.language = language in locales ? language : \"en-US\";\n this.translations = locales[language];\n }\n // 类型安全的翻译方法\n t(key, params) {\n const value = this.getNestedValue(this.translations, key);\n if (!value) {\n console.warn(`Translation key \"${key}\" not found for language \"${this.language}\"`);\n return key;\n }\n if (params) {\n return this.interpolate(value, params);\n }\n return value;\n }\n getNestedValue(obj, path) {\n return path.split(\".\").reduce((current, key) => current?.[key], obj);\n }\n interpolate(template, params) {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key) => {\n return params[key] != null ? params[key].toString() : match;\n });\n }\n getLanguage() {\n return this.language;\n }\n};\n__name(_I18n, \"I18n\");\nlet I18n = _I18n;\nfunction truncate(text, maxLength) {\n if (text.length > maxLength) {\n return text.substring(0, maxLength) + \"...\";\n }\n return text;\n}\n__name(truncate, \"truncate\");\nconst wrapper$1 = \"_wrapper_1j0ct_1\";\nconst background = \"_background_1j0ct_39\";\nconst header = \"_header_1j0ct_99\";\nconst pulse = \"_pulse_1j0ct_1\";\nconst retryPulse = \"_retryPulse_1j0ct_1\";\nconst statusTextFadeOut = \"_statusTextFadeOut_1j0ct_1\";\nconst statusTextFadeIn = \"_statusTextFadeIn_1j0ct_1\";\nconst statusSection = \"_statusSection_1j0ct_121\";\nconst indicator = \"_indicator_1j0ct_128\";\nconst thinking = \"_thinking_1j0ct_137\";\nconst tool_executing = \"_tool_executing_1j0ct_142\";\nconst retry = \"_retry_1j0ct_147\";\nconst completed = \"_completed_1j0ct_153\";\nconst input = \"_input_1j0ct_154\";\nconst output = \"_output_1j0ct_155\";\nconst error = \"_error_1j0ct_160\";\nconst statusText = \"_statusText_1j0ct_166\";\nconst fadeOut = \"_fadeOut_1j0ct_178\";\nconst fadeIn = \"_fadeIn_1j0ct_182\";\nconst controls = \"_controls_1j0ct_188\";\nconst controlButton = \"_controlButton_1j0ct_193\";\nconst pauseButton = \"_pauseButton_1j0ct_212\";\nconst paused = \"_paused_1j0ct_214\";\nconst stopButton = \"_stopButton_1j0ct_224\";\nconst historySectionWrapper = \"_historySectionWrapper_1j0ct_258\";\nconst shimmer = \"_shimmer_1j0ct_1\";\nconst celebrate = \"_celebrate_1j0ct_1\";\nconst expanded = \"_expanded_1j0ct_290\";\nconst historySection = \"_historySection_1j0ct_258\";\nconst historyItem = \"_historyItem_1j0ct_309\";\nconst doneSuccess = \"_doneSuccess_1j0ct_368\";\nconst historyContent = \"_historyContent_1j0ct_404\";\nconst statusIcon = \"_statusIcon_1j0ct_405\";\nconst doneError = \"_doneError_1j0ct_414\";\nconst historyMeta = \"_historyMeta_1j0ct_465\";\nconst inputSectionWrapper = \"_inputSectionWrapper_1j0ct_535\";\nconst hidden = \"_hidden_1j0ct_558\";\nconst inputSection = \"_inputSection_1j0ct_535\";\nconst taskInput = \"_taskInput_1j0ct_569\";\nconst styles$1 = {\n wrapper: wrapper$1,\n \"mask-running\": \"_mask-running_1j0ct_1\",\n background,\n header,\n pulse,\n retryPulse,\n statusTextFadeOut,\n statusTextFadeIn,\n statusSection,\n indicator,\n thinking,\n tool_executing,\n retry,\n completed,\n input,\n output,\n error,\n statusText,\n fadeOut,\n fadeIn,\n controls,\n controlButton,\n pauseButton,\n paused,\n stopButton,\n historySectionWrapper,\n shimmer,\n celebrate,\n expanded,\n historySection,\n historyItem,\n doneSuccess,\n historyContent,\n statusIcon,\n doneError,\n historyMeta,\n inputSectionWrapper,\n hidden,\n inputSection,\n taskInput\n};\nconst _Panel = class _Panel {\n constructor(config) {\n __privateAdd(this, _Panel_instances);\n __privateAdd(this, _wrapper);\n __privateAdd(this, _indicator);\n __privateAdd(this, _statusText);\n __privateAdd(this, _historySection);\n __privateAdd(this, _expandButton);\n __privateAdd(this, _pauseButton);\n __privateAdd(this, _stopButton);\n __privateAdd(this, _inputSection);\n __privateAdd(this, _taskInput);\n __privateAdd(this, _state, new UIState());\n __privateAdd(this, _isExpanded, false);\n __privateAdd(this, _config);\n __privateAdd(this, _i18n);\n __privateAdd(this, _userAnswerResolver, null);\n __privateAdd(this, _isWaitingForUserAnswer, false);\n __privateAdd(this, _headerUpdateTimer, null);\n __privateAdd(this, _pendingHeaderText, null);\n __privateAdd(this, _isAnimating, false);\n __privateSet(this, _config, config);\n __privateSet(this, _i18n, new I18n(config.language ?? \"en-US\"));\n __privateSet(this, _wrapper, __privateMethod(this, _Panel_instances, createWrapper_fn).call(this));\n __privateSet(this, _indicator, __privateGet(this, _wrapper).querySelector(`.${styles$1.indicator}`));\n __privateSet(this, _statusText, __privateGet(this, _wrapper).querySelector(`.${styles$1.statusText}`));\n __privateSet(this, _historySection, __privateGet(this, _wrapper).querySelector(`.${styles$1.historySection}`));\n __privateSet(this, _expandButton, __privateGet(this, _wrapper).querySelector(`.${styles$1.expandButton}`));\n __privateSet(this, _pauseButton, __privateGet(this, _wrapper).querySelector(`.${styles$1.pauseButton}`));\n __privateSet(this, _stopButton, __privateGet(this, _wrapper).querySelector(`.${styles$1.stopButton}`));\n __privateSet(this, _inputSection, __privateGet(this, _wrapper).querySelector(`.${styles$1.inputSectionWrapper}`));\n __privateSet(this, _taskInput, __privateGet(this, _wrapper).querySelector(`.${styles$1.taskInput}`));\n __privateMethod(this, _Panel_instances, setupEventListeners_fn).call(this);\n __privateMethod(this, _Panel_instances, startHeaderUpdateLoop_fn).call(this);\n __privateMethod(this, _Panel_instances, showInputArea_fn).call(this);\n }\n get wrapper() {\n return __privateGet(this, _wrapper);\n }\n /**\n * Ask for user input\n */\n async askUser(question) {\n return new Promise((resolve) => {\n __privateSet(this, _isWaitingForUserAnswer, true);\n __privateSet(this, _userAnswerResolver, resolve);\n __privateMethod(this, _Panel_instances, updateInternal_fn).call(this, {\n type: \"output\",\n displayText: __privateGet(this, _i18n).t(\"ui.panel.question\", { question })\n });\n if (!__privateGet(this, _isExpanded)) {\n __privateMethod(this, _Panel_instances, expand_fn).call(this);\n }\n __privateMethod(this, _Panel_instances, showInputArea_fn).call(this, __privateGet(this, _i18n).t(\"ui.panel.userAnswerPrompt\"));\n });\n }\n // ========== Public control methods ==========\n show() {\n this.wrapper.style.display = \"block\";\n void this.wrapper.offsetHeight;\n this.wrapper.style.opacity = \"1\";\n this.wrapper.style.transform = \"translateX(-50%) translateY(0)\";\n }\n hide() {\n this.wrapper.style.opacity = \"0\";\n this.wrapper.style.transform = \"translateX(-50%) translateY(20px)\";\n this.wrapper.style.display = \"none\";\n }\n reset() {\n __privateGet(this, _state).reset();\n __privateGet(this, _statusText).textContent = __privateGet(this, _i18n).t(\"ui.panel.ready\");\n __privateMethod(this, _Panel_instances, updateStatusIndicator_fn).call(this, \"thinking\");\n __privateMethod(this, _Panel_instances, updateHistory_fn).call(this);\n __privateMethod(this, _Panel_instances, collapse_fn).call(this);\n if (__privateGet(this, _config).getPaused()) {\n __privateGet(this, _config).onPauseToggle();\n }\n __privateMethod(this, _Panel_instances, updatePauseButton_fn).call(this);\n __privateSet(this, _isWaitingForUserAnswer, false);\n __privateSet(this, _userAnswerResolver, null);\n __privateMethod(this, _Panel_instances, showInputArea_fn).call(this);\n }\n expand() {\n __privateMethod(this, _Panel_instances, expand_fn).call(this);\n }\n collapse() {\n __privateMethod(this, _Panel_instances, collapse_fn).call(this);\n }\n /**\n * Update panel with semantic data - i18n handled internally\n */\n update(data) {\n const stepData = __privateMethod(this, _Panel_instances, toStepData_fn).call(this, data);\n __privateMethod(this, _Panel_instances, updateInternal_fn).call(this, stepData);\n }\n /**\n * Dispose panel\n */\n dispose() {\n __privateSet(this, _isWaitingForUserAnswer, false);\n __privateMethod(this, _Panel_instances, stopHeaderUpdateLoop_fn).call(this);\n this.wrapper.remove();\n }\n};\n_wrapper = new WeakMap();\n_indicator = new WeakMap();\n_statusText = new WeakMap();\n_historySection = new WeakMap();\n_expandButton = new WeakMap();\n_pauseButton = new WeakMap();\n_stopButton = new WeakMap();\n_inputSection = new WeakMap();\n_taskInput = new WeakMap();\n_state = new WeakMap();\n_isExpanded = new WeakMap();\n_config = new WeakMap();\n_i18n = new WeakMap();\n_userAnswerResolver = new WeakMap();\n_isWaitingForUserAnswer = new WeakMap();\n_headerUpdateTimer = new WeakMap();\n_pendingHeaderText = new WeakMap();\n_isAnimating = new WeakMap();\n_Panel_instances = new WeakSet();\n// ========== Private methods ==========\n/**\n * Convert semantic update to step data with i18n\n */\ntoStepData_fn = /* @__PURE__ */ __name(function(data) {\n switch (data.type) {\n case \"thinking\":\n return { type: \"thinking\", displayText: data.text ?? __privateGet(this, _i18n).t(\"ui.panel.thinking\") };\n case \"input\":\n return { type: \"input\", displayText: data.task };\n case \"question\":\n return {\n type: \"output\",\n displayText: __privateGet(this, _i18n).t(\"ui.panel.question\", { question: data.question })\n };\n case \"userAnswer\":\n return {\n type: \"input\",\n displayText: __privateGet(this, _i18n).t(\"ui.panel.userAnswer\", { input: data.input })\n };\n case \"retry\":\n return { type: \"retry\", displayText: `retry-ing (${data.current} / ${data.max})` };\n case \"error\":\n return { type: \"error\", displayText: data.message };\n case \"output\":\n return { type: \"output\", displayText: data.text };\n case \"completed\":\n return { type: \"completed\", displayText: __privateGet(this, _i18n).t(\"ui.panel.taskCompleted\") };\n case \"toolExecuting\":\n return {\n type: \"tool_executing\",\n toolName: data.toolName,\n toolArgs: data.args,\n displayText: __privateMethod(this, _Panel_instances, getToolExecutingText_fn).call(this, data.toolName, data.args)\n };\n case \"toolCompleted\": {\n const displayText = __privateMethod(this, _Panel_instances, getToolCompletedText_fn).call(this, data.toolName, data.args);\n if (!displayText) return { type: \"tool_executing\", displayText: \"\" };\n return {\n type: \"tool_executing\",\n toolName: data.toolName,\n toolArgs: data.args,\n toolResult: data.result,\n displayText,\n duration: data.duration\n };\n }\n }\n}, \"#toStepData\");\ngetToolExecutingText_fn = /* @__PURE__ */ __name(function(toolName, args) {\n switch (toolName) {\n case \"click_element_by_index\":\n return __privateGet(this, _i18n).t(\"ui.tools.clicking\", { index: args.index });\n case \"input_text\":\n return __privateGet(this, _i18n).t(\"ui.tools.inputting\", { index: args.index });\n case \"select_dropdown_option\":\n return __privateGet(this, _i18n).t(\"ui.tools.selecting\", { text: args.text });\n case \"scroll\":\n return __privateGet(this, _i18n).t(\"ui.tools.scrolling\");\n case \"wait\":\n return __privateGet(this, _i18n).t(\"ui.tools.waiting\", { seconds: args.seconds });\n case \"done\":\n return __privateGet(this, _i18n).t(\"ui.tools.done\");\n default:\n return __privateGet(this, _i18n).t(\"ui.tools.executing\", { toolName });\n }\n}, \"#getToolExecutingText\");\ngetToolCompletedText_fn = /* @__PURE__ */ __name(function(toolName, args) {\n switch (toolName) {\n case \"click_element_by_index\":\n return __privateGet(this, _i18n).t(\"ui.tools.clicked\", { index: args.index });\n case \"input_text\":\n return __privateGet(this, _i18n).t(\"ui.tools.inputted\", { text: args.text });\n case \"select_dropdown_option\":\n return __privateGet(this, _i18n).t(\"ui.tools.selected\", { text: args.text });\n case \"scroll\":\n return __privateGet(this, _i18n).t(\"ui.tools.scrolled\");\n case \"wait\":\n return __privateGet(this, _i18n).t(\"ui.tools.waited\");\n case \"done\":\n return null;\n default:\n return null;\n }\n}, \"#getToolCompletedText\");\n/**\n * Update status (internal)\n */\nupdateInternal_fn = /* @__PURE__ */ __name(function(stepData) {\n if (!stepData.displayText) return;\n const step = __privateGet(this, _state).addStep(stepData);\n const headerText = truncate(step.displayText, 20);\n __privateSet(this, _pendingHeaderText, headerText);\n __privateMethod(this, _Panel_instances, updateStatusIndicator_fn).call(this, step.type);\n __privateMethod(this, _Panel_instances, updateHistory_fn).call(this);\n if (step.type === \"completed\" || step.type === \"error\") {\n if (!__privateGet(this, _isExpanded)) {\n __privateMethod(this, _Panel_instances, expand_fn).call(this);\n }\n }\n if (__privateMethod(this, _Panel_instances, shouldShowInputArea_fn).call(this)) {\n __privateMethod(this, _Panel_instances, showInputArea_fn).call(this);\n } else {\n __privateMethod(this, _Panel_instances, hideInputArea_fn).call(this);\n }\n}, \"#updateInternal\");\n/**\n * Toggle pause state\n */\ntogglePause_fn = /* @__PURE__ */ __name(function() {\n const paused2 = __privateGet(this, _config).onPauseToggle();\n __privateMethod(this, _Panel_instances, updatePauseButton_fn).call(this);\n if (paused2) {\n __privateGet(this, _statusText).textContent = __privateGet(this, _i18n).t(\"ui.panel.paused\");\n __privateMethod(this, _Panel_instances, updateStatusIndicator_fn).call(this, \"thinking\");\n } else {\n __privateGet(this, _statusText).textContent = __privateGet(this, _i18n).t(\"ui.panel.continueExecution\");\n __privateMethod(this, _Panel_instances, updateStatusIndicator_fn).call(this, \"tool_executing\");\n }\n}, \"#togglePause\");\n/**\n * Update pause button state\n */\nupdatePauseButton_fn = /* @__PURE__ */ __name(function() {\n const paused2 = __privateGet(this, _config).getPaused();\n if (paused2) {\n __privateGet(this, _pauseButton).textContent = \"▶\";\n __privateGet(this, _pauseButton).title = __privateGet(this, _i18n).t(\"ui.panel.continue\");\n __privateGet(this, _pauseButton).classList.add(styles$1.paused);\n } else {\n __privateGet(this, _pauseButton).textContent = \"⏸︎\";\n __privateGet(this, _pauseButton).title = __privateGet(this, _i18n).t(\"ui.panel.pause\");\n __privateGet(this, _pauseButton).classList.remove(styles$1.paused);\n }\n}, \"#updatePauseButton\");\n/**\n * Stop Agent\n */\nstopAgent_fn = /* @__PURE__ */ __name(function() {\n __privateMethod(this, _Panel_instances, updateInternal_fn).call(this, {\n type: \"error\",\n displayText: __privateGet(this, _i18n).t(\"ui.panel.taskTerminated\")\n });\n __privateGet(this, _config).onStop();\n}, \"#stopAgent\");\n/**\n * Submit task\n */\nsubmitTask_fn = /* @__PURE__ */ __name(function() {\n const input2 = __privateGet(this, _taskInput).value.trim();\n if (!input2) return;\n __privateMethod(this, _Panel_instances, hideInputArea_fn).call(this);\n if (__privateGet(this, _isWaitingForUserAnswer)) {\n __privateMethod(this, _Panel_instances, handleUserAnswer_fn).call(this, input2);\n } else {\n __privateGet(this, _config).onExecuteTask(input2);\n }\n}, \"#submitTask\");\n/**\n * Handle user answer\n */\nhandleUserAnswer_fn = /* @__PURE__ */ __name(function(input2) {\n __privateMethod(this, _Panel_instances, updateInternal_fn).call(this, {\n type: \"input\",\n displayText: __privateGet(this, _i18n).t(\"ui.panel.userAnswer\", { input: input2 })\n });\n __privateSet(this, _isWaitingForUserAnswer, false);\n if (__privateGet(this, _userAnswerResolver)) {\n __privateGet(this, _userAnswerResolver).call(this, input2);\n __privateSet(this, _userAnswerResolver, null);\n }\n}, \"#handleUserAnswer\");\n/**\n * Show input area\n */\nshowInputArea_fn = /* @__PURE__ */ __name(function(placeholder) {\n __privateGet(this, _taskInput).value = \"\";\n __privateGet(this, _taskInput).placeholder = placeholder || __privateGet(this, _i18n).t(\"ui.panel.taskInput\");\n __privateGet(this, _inputSection).classList.remove(styles$1.hidden);\n setTimeout(() => {\n __privateGet(this, _taskInput).focus();\n }, 100);\n}, \"#showInputArea\");\n/**\n * Hide input area\n */\nhideInputArea_fn = /* @__PURE__ */ __name(function() {\n __privateGet(this, _inputSection).classList.add(styles$1.hidden);\n}, \"#hideInputArea\");\n/**\n * Check if input area should be shown\n */\nshouldShowInputArea_fn = /* @__PURE__ */ __name(function() {\n if (__privateGet(this, _isWaitingForUserAnswer)) return true;\n const steps = __privateGet(this, _state).getAllSteps();\n if (steps.length === 0) {\n return true;\n }\n const lastStep = steps[steps.length - 1];\n return lastStep.type === \"completed\" || lastStep.type === \"error\";\n}, \"#shouldShowInputArea\");\ncreateWrapper_fn = /* @__PURE__ */ __name(function() {\n const wrapper2 = document.createElement(\"div\");\n wrapper2.id = \"page-agent-runtime_agent-panel\";\n wrapper2.className = `${styles$1.wrapper} ${styles$1.collapsed}`;\n wrapper2.setAttribute(\"data-browser-use-ignore\", \"true\");\n wrapper2.innerHTML = `\n\t\t\t<div class=\"${styles$1.background}\"></div>\n\t\t\t<div class=\"${styles$1.historySectionWrapper}\">\n\t\t\t\t<div class=\"${styles$1.historySection}\">\n\t\t\t\t\t${__privateMethod(this, _Panel_instances, createHistoryItem_fn).call(this, {\n id: \"placeholder\",\n stepNumber: 0,\n timestamp: /* @__PURE__ */ new Date(),\n type: \"thinking\",\n displayText: __privateGet(this, _i18n).t(\"ui.panel.waitingPlaceholder\")\n })}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"${styles$1.header}\">\n\t\t\t\t<div class=\"${styles$1.statusSection}\">\n\t\t\t\t\t<div class=\"${styles$1.indicator} ${styles$1.thinking}\"></div>\n\t\t\t\t\t<div class=\"${styles$1.statusText}\">${__privateGet(this, _i18n).t(\"ui.panel.ready\")}</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"${styles$1.controls}\">\n\t\t\t\t\t<button class=\"${styles$1.controlButton} ${styles$1.expandButton}\" title=\"${__privateGet(this, _i18n).t(\"ui.panel.expand\")}\">\n\t\t\t\t\t\t▼\n\t\t\t\t\t</button>\n\t\t\t\t\t<button class=\"${styles$1.controlButton} ${styles$1.pauseButton}\" title=\"${__privateGet(this, _i18n).t(\"ui.panel.pause\")}\">\n\t\t\t\t\t\t⏸︎\n\t\t\t\t\t</button>\n\t\t\t\t\t<button class=\"${styles$1.controlButton} ${styles$1.stopButton}\" title=\"${__privateGet(this, _i18n).t(\"ui.panel.stop\")}\">\n\t\t\t\t\t\tX\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"${styles$1.inputSectionWrapper} ${styles$1.hidden}\">\n\t\t\t\t<div class=\"${styles$1.inputSection}\">\n\t\t\t\t\t<input \n\t\t\t\t\t\ttype=\"text\" \n\t\t\t\t\t\tclass=\"${styles$1.taskInput}\" \n\t\t\t\t\t\tmaxlength=\"200\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n document.body.appendChild(wrapper2);\n return wrapper2;\n}, \"#createWrapper\");\nsetupEventListeners_fn = /* @__PURE__ */ __name(function() {\n const header2 = this.wrapper.querySelector(`.${styles$1.header}`);\n header2.addEventListener(\"click\", (e) => {\n if (e.target.closest(`.${styles$1.controlButton}`)) {\n return;\n }\n __privateMethod(this, _Panel_instances, toggle_fn).call(this);\n });\n __privateGet(this, _expandButton).addEventListener(\"click\", (e) => {\n e.stopPropagation();\n __privateMethod(this, _Panel_instances, toggle_fn).call(this);\n });\n __privateGet(this, _pauseButton).addEventListener(\"click\", (e) => {\n e.stopPropagation();\n __privateMethod(this, _Panel_instances, togglePause_fn).call(this);\n });\n __privateGet(this, _stopButton).addEventListener(\"click\", (e) => {\n e.stopPropagation();\n __privateMethod(this, _Panel_instances, stopAgent_fn).call(this);\n });\n __privateGet(this, _taskInput).addEventListener(\"keydown\", (e) => {\n if (e.isComposing) return;\n if (e.key === \"Enter\") {\n e.preventDefault();\n __privateMethod(this, _Panel_instances, submitTask_fn).call(this);\n }\n });\n __privateGet(this, _inputSection).addEventListener(\"click\", (e) => {\n e.stopPropagation();\n });\n}, \"#setupEventListeners\");\ntoggle_fn = /* @__PURE__ */ __name(function() {\n if (__privateGet(this, _isExpanded)) {\n __privateMethod(this, _Panel_instances, collapse_fn).call(this);\n } else {\n __privateMethod(this, _Panel_instances, expand_fn).call(this);\n }\n}, \"#toggle\");\nexpand_fn = /* @__PURE__ */ __name(function() {\n __privateSet(this, _isExpanded, true);\n this.wrapper.classList.remove(styles$1.collapsed);\n this.wrapper.classList.add(styles$1.expanded);\n __privateGet(this, _expandButton).textContent = \"▲\";\n}, \"#expand\");\ncollapse_fn = /* @__PURE__ */ __name(function() {\n __privateSet(this, _isExpanded, false);\n this.wrapper.classList.remove(styles$1.expanded);\n this.wrapper.classList.add(styles$1.collapsed);\n __privateGet(this, _expandButton).textContent = \"▼\";\n}, \"#collapse\");\n/**\n * Start periodic header update loop\n */\nstartHeaderUpdateLoop_fn = /* @__PURE__ */ __name(function() {\n __privateSet(this, _headerUpdateTimer, setInterval(() => {\n __privateMethod(this, _Panel_instances, checkAndUpdateHeader_fn).call(this);\n }, 450));\n}, \"#startHeaderUpdateLoop\");\n/**\n * Stop periodic header update loop\n */\nstopHeaderUpdateLoop_fn = /* @__PURE__ */ __name(function() {\n if (__privateGet(this, _headerUpdateTimer)) {\n clearInterval(__privateGet(this, _headerUpdateTimer));\n __privateSet(this, _headerUpdateTimer, null);\n }\n}, \"#stopHeaderUpdateLoop\");\n/**\n * Check if header needs update and trigger animation if not currently animating\n */\ncheckAndUpdateHeader_fn = /* @__PURE__ */ __name(function() {\n if (!__privateGet(this, _pendingHeaderText) || __privateGet(this, _isAnimating)) {\n return;\n }\n if (__privateGet(this, _statusText).textContent === __privateGet(this, _pendingHeaderText)) {\n __privateSet(this, _pendingHeaderText, null);\n return;\n }\n const textToShow = __privateGet(this, _pendingHeaderText);\n __privateSet(this, _pendingHeaderText, null);\n __privateMethod(this, _Panel_instances, animateTextChange_fn).call(this, textToShow);\n}, \"#checkAndUpdateHeader\");\n/**\n * Animate text change with fade out/in effect\n */\nanimateTextChange_fn = /* @__PURE__ */ __name(function(newText) {\n __privateSet(this, _isAnimating, true);\n __privateGet(this, _statusText).classList.add(styles$1.fadeOut);\n setTimeout(() => {\n __privateGet(this, _statusText).textContent = newText;\n __privateGet(this, _statusText).classList.remove(styles$1.fadeOut);\n __privateGet(this, _statusText).classList.add(styles$1.fadeIn);\n setTimeout(() => {\n __privateGet(this, _statusText).classList.remove(styles$1.fadeIn);\n __privateSet(this, _isAnimating, false);\n }, 300);\n }, 150);\n}, \"#animateTextChange\");\nupdateStatusIndicator_fn = /* @__PURE__ */ __name(function(type) {\n __privateGet(this, _indicator).className = styles$1.indicator;\n __privateGet(this, _indicator).classList.add(styles$1[type]);\n}, \"#updateStatusIndicator\");\nupdateHistory_fn = /* @__PURE__ */ __name(function() {\n const steps = __privateGet(this, _state).getAllSteps();\n __privateGet(this, _historySection).innerHTML = steps.map((step) => __privateMethod(this, _Panel_instances, createHistoryItem_fn).call(this, step)).join(\"\");\n __privateMethod(this, _Panel_instances, scrollToBottom_fn).call(this);\n}, \"#updateHistory\");\nscrollToBottom_fn = /* @__PURE__ */ __name(function() {\n setTimeout(() => {\n __privateGet(this, _historySection).scrollTop = __privateGet(this, _historySection).scrollHeight;\n }, 0);\n}, \"#scrollToBottom\");\ncreateHistoryItem_fn = /* @__PURE__ */ __name(function(step) {\n const time = step.timestamp.toLocaleTimeString(\"zh-CN\", {\n hour12: false,\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\"\n });\n let typeClass = \"\";\n let statusIcon2 = \"\";\n if (step.type === \"completed\") {\n if (step.toolName === \"done\") {\n const failureKeyword = __privateGet(this, _i18n).t(\"ui.tools.resultFailure\");\n const errorKeyword = __privateGet(this, _i18n).t(\"ui.tools.resultError\");\n const isSuccess = !step.toolResult || !step.toolResult.includes(failureKeyword) && !step.toolResult.includes(errorKeyword);\n typeClass = isSuccess ? styles$1.doneSuccess : styles$1.doneError;\n statusIcon2 = isSuccess ? \"🎉\" : \"❌\";\n } else {\n typeClass = styles$1.completed;\n statusIcon2 = \"✅\";\n }\n } else if (step.type === \"error\") {\n typeClass = styles$1.error;\n statusIcon2 = \"❌\";\n } else if (step.type === \"tool_executing\") {\n statusIcon2 = \"⚙️\";\n } else if (step.type === \"output\") {\n typeClass = styles$1.output;\n statusIcon2 = \"🤖\";\n } else if (step.type === \"input\") {\n typeClass = styles$1.input;\n statusIcon2 = \"🎯\";\n } else if (step.type === \"retry\") {\n typeClass = styles$1.retry;\n statusIcon2 = \"🔄\";\n } else {\n statusIcon2 = \"🧠\";\n }\n const durationText = step.duration ? ` · ${step.duration}ms` : \"\";\n const stepLabel = __privateGet(this, _i18n).t(\"ui.panel.step\", {\n number: step.stepNumber.toString(),\n time,\n duration: durationText || \"\"\n // Explicitly pass empty string to replace template\n });\n return `\n\t\t\t<div class=\"${styles$1.historyItem} ${typeClass}\">\n\t\t\t\t<div class=\"${styles$1.historyContent}\">\n\t\t\t\t\t<span class=\"${styles$1.statusIcon}\">${statusIcon2}</span>\n\t\t\t\t\t<span>${step.displayText}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"${styles$1.historyMeta}\">\n\t\t\t\t\t${stepLabel}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n}, \"#createHistoryItem\");\n__name(_Panel, \"Panel\");\nlet Panel = _Panel;\nfunction hasDarkModeClass() {\n const DFEAULT_DARK_MODE_CLASSES = [\"dark\", \"dark-mode\", \"theme-dark\", \"night\", \"night-mode\"];\n const htmlElement = document.documentElement;\n const bodyElement = document.body;\n for (const className of DFEAULT_DARK_MODE_CLASSES) {\n if (htmlElement.classList.contains(className) || bodyElement.classList.contains(className)) {\n return true;\n }\n }\n const darkThemeAttribute = htmlElement.getAttribute(\"data-theme\");\n if (darkThemeAttribute?.toLowerCase().includes(\"dark\")) {\n return true;\n }\n return false;\n}\n__name(hasDarkModeClass, \"hasDarkModeClass\");\nfunction parseRgbColor(colorString) {\n const rgbMatch = /rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/.exec(colorString);\n if (!rgbMatch) {\n return null;\n }\n return {\n r: parseInt(rgbMatch[1]),\n g: parseInt(rgbMatch[2]),\n b: parseInt(rgbMatch[3])\n };\n}\n__name(parseRgbColor, \"parseRgbColor\");\nfunction isColorDark(colorString, threshold = 128) {\n if (!colorString || colorString === \"transparent\" || colorString.startsWith(\"rgba(0, 0, 0, 0)\")) {\n return false;\n }\n const rgb = parseRgbColor(colorString);\n if (!rgb) {\n return false;\n }\n const luminance = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b;\n return luminance < threshold;\n}\n__name(isColorDark, \"isColorDark\");\nfunction isBackgroundDark() {\n const htmlStyle = window.getComputedStyle(document.documentElement);\n const bodyStyle = window.getComputedStyle(document.body);\n const htmlBgColor = htmlStyle.backgroundColor;\n const bodyBgColor = bodyStyle.backgroundColor;\n if (isColorDark(bodyBgColor)) {\n return true;\n } else if (bodyBgColor === \"transparent\" || bodyBgColor.startsWith(\"rgba(0, 0, 0, 0)\")) {\n return isColorDark(htmlBgColor);\n }\n return false;\n}\n__name(isBackgroundDark, \"isBackgroundDark\");\nfunction isPageDark() {\n if (hasDarkModeClass()) {\n return true;\n }\n if (isBackgroundDark()) {\n return true;\n }\n return false;\n}\n__name(isPageDark, \"isPageDark\");\nconst wrapper = \"_wrapper_1oy2s_1\";\nconst styles = {\n wrapper\n};\nconst cursor = \"_cursor_1vrf3_2\";\nconst cursorBorder = \"_cursorBorder_1vrf3_13\";\nconst cursorFilling = \"_cursorFilling_1vrf3_23\";\nconst cursorRipple = \"_cursorRipple_1vrf3_31\";\nconst clicking = \"_clicking_1vrf3_37\";\nconst cursorStyles = {\n cursor,\n cursorBorder,\n cursorFilling,\n cursorRipple,\n clicking\n};\nconst _SimulatorMask = class _SimulatorMask {\n constructor() {\n __privateAdd(this, _SimulatorMask_instances);\n __publicField(this, \"wrapper\", document.createElement(\"div\"));\n __publicField(this, \"motion\", new Motion({\n mode: isPageDark() ? \"dark\" : \"light\",\n styles: {\n position: \"absolute\",\n inset: \"0\"\n }\n }));\n __privateAdd(this, _cursor, document.createElement(\"div\"));\n __privateAdd(this, _currentCursorX, 0);\n __privateAdd(this, _currentCursorY, 0);\n __privateAdd(this, _targetCursorX, 0);\n __privateAdd(this, _targetCursorY, 0);\n this.wrapper.id = \"page-agent-runtime_simulator-mask\";\n this.wrapper.className = styles.wrapper;\n this.wrapper.setAttribute(\"data-browser-use-ignore\", \"true\");\n this.wrapper.appendChild(this.motion.element);\n this.motion.autoResize(this.wrapper);\n this.wrapper.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n e.preventDefault();\n });\n this.wrapper.addEventListener(\"mousedown\", (e) => {\n e.stopPropagation();\n e.preventDefault();\n });\n this.wrapper.addEventListener(\"mouseup\", (e) => {\n e.stopPropagation();\n e.preventDefault();\n });\n this.wrapper.addEventListener(\"mousemove\", (e) => {\n e.stopPropagation();\n e.preventDefault();\n });\n this.wrapper.addEventListener(\"wheel\", (e) => {\n e.stopPropagation();\n e.preventDefault();\n });\n this.wrapper.addEventListener(\"keydown\", (e) => {\n e.stopPropagation();\n e.preventDefault();\n });\n this.wrapper.addEventListener(\"keyup\", (e) => {\n e.stopPropagation();\n e.preventDefault();\n });\n __privateMethod(this, _SimulatorMask_instances, createCursor_fn).call(this);\n document.body.appendChild(this.wrapper);\n __privateMethod(this, _SimulatorMask_instances, moveCursorToTarget_fn).call(this);\n window.addEventListener(\"PageAgent::MovePointerTo\", (event) => {\n const { x, y } = event.detail;\n this.setCursorPosition(x, y);\n });\n window.addEventListener(\"PageAgent::ClickPointer\", (event) => {\n this.triggerClickAnimation();\n });\n }\n setCursorPosition(x, y) {\n __privateSet(this, _targetCursorX, x);\n __privateSet(this, _targetCursorY, y);\n }\n triggerClickAnimation() {\n __privateGet(this, _cursor).classList.remove(cursorStyles.clicking);\n void __privateGet(this, _cursor).offsetHeight;\n __privateGet(this, _cursor).classList.add(cursorStyles.clicking);\n }\n show() {\n this.motion.start();\n this.motion.fadeIn();\n this.wrapper.style.display = \"block\";\n __privateSet(this, _currentCursorX, window.innerWidth / 2);\n __privateSet(this, _currentCursorY, window.innerHeight / 2);\n __privateSet(this, _targetCursorX, __privateGet(this, _currentCursorX));\n __privateSet(this, _targetCursorY, __privateGet(this, _currentCursorY));\n __privateGet(this, _cursor).style.left = `${__privateGet(this, _currentCursorX)}px`;\n __privateGet(this, _cursor).style.top = `${__privateGet(this, _currentCursorY)}px`;\n }\n hide() {\n this.motion.fadeOut();\n this.motion.pause();\n __privateGet(this, _cursor).classList.remove(cursorStyles.clicking);\n setTimeout(() => {\n this.wrapper.style.display = \"none\";\n }, 800);\n }\n dispose() {\n this.motion.dispose();\n this.wrapper.remove();\n }\n};\n_cursor = new WeakMap();\n_currentCursorX = new WeakMap();\n_currentCursorY = new WeakMap();\n_targetCursorX = new WeakMap();\n_targetCursorY = new WeakMap();\n_SimulatorMask_instances = new WeakSet();\ncreateCursor_fn = /* @__PURE__ */ __name(function() {\n __privateGet(this, _cursor).className = cursorStyles.cursor;\n const rippleContainer = document.createElement(\"div\");\n rippleContainer.className = cursorStyles.cursorRipple;\n __privateGet(this, _cursor).appendChild(rippleContainer);\n const fillingLayer = document.createElement(\"div\");\n fillingLayer.className = cursorStyles.cursorFilling;\n __privateGet(this, _cursor).appendChild(fillingLayer);\n const borderLayer = document.createElement(\"div\");\n borderLayer.className = cursorStyles.cursorBorder;\n __privateGet(this, _cursor).appendChild(borderLayer);\n this.wrapper.appendChild(__privateGet(this, _cursor));\n}, \"#createCursor\");\nmoveCursorToTarget_fn = /* @__PURE__ */ __name(function() {\n const newX = __privateGet(this, _currentCursorX) + (__privateGet(this, _targetCursorX) - __privateGet(this, _currentCursorX)) * 0.2;\n const newY = __privateGet(this, _currentCursorY) + (__privateGet(this, _targetCursorY) - __privateGet(this, _currentCursorY)) * 0.2;\n const xDistance = Math.abs(newX - __privateGet(this, _targetCursorX));\n if (xDistance > 0) {\n if (xDistance < 2) {\n __privateSet(this, _currentCursorX, __privateGet(this, _targetCursorX));\n } else {\n __privateSet(this, _currentCursorX, newX);\n }\n __privateGet(this, _cursor).style.left = `${__privateGet(this, _currentCursorX)}px`;\n }\n const yDistance = Math.abs(newY - __privateGet(this, _targetCursorY));\n if (yDistance > 0) {\n if (yDistance < 2) {\n __privateSet(this, _currentCursorY, __privateGet(this, _targetCursorY));\n } else {\n __privateSet(this, _currentCursorY, newY);\n }\n __privateGet(this, _cursor).style.top = `${__privateGet(this, _currentCursorY)}px`;\n }\n requestAnimationFrame(() => __privateMethod(this, _SimulatorMask_instances, moveCursorToTarget_fn).call(this));\n}, \"#moveCursorToTarget\");\n__name(_SimulatorMask, \"SimulatorMask\");\nlet SimulatorMask = _SimulatorMask;\nexport {\n I18n,\n Panel,\n SimulatorMask,\n UIState\n};\n//# sourceMappingURL=page-agent-ui.js.map\n","// Dev environment: use .env config if available, otherwise fallback to testing api\nexport const DEFAULT_MODEL_NAME: string =\n\timport.meta.env.DEV && import.meta.env.LLM_MODEL_NAME\n\t\t? import.meta.env.LLM_MODEL_NAME\n\t\t: 'PAGE-AGENT-FREE-TESTING-RANDOM'\n\nexport const DEFAULT_API_KEY: string =\n\timport.meta.env.DEV && import.meta.env.LLM_API_KEY\n\t\t? import.meta.env.LLM_API_KEY\n\t\t: 'PAGE-AGENT-FREE-TESTING-RANDOM'\n\nexport const DEFAULT_BASE_URL: string =\n\timport.meta.env.DEV && import.meta.env.LLM_BASE_URL\n\t\t? import.meta.env.LLM_BASE_URL\n\t\t: 'https://hwcxiuzfylggtcktqgij.supabase.co/functions/v1/llm-testing-proxy'\n\n// internal\n\nexport const LLM_MAX_RETRIES = 2\nexport const MAX_STEPS = 20\nexport const DEFAULT_TEMPERATURE = 0.7 // higher randomness helps auto-recovery\nexport const DEFAULT_MAX_TOKENS = 4096\n","import type { PageControllerConfig } from '@page-agent/page-controller'\nimport type { SupportedLanguage } from '@page-agent/ui'\n\nimport type { AgentHistory, ExecutionResult, PageAgent } from '../PageAgent'\nimport type { PageAgentTool } from '../tools'\nimport {\n\tDEFAULT_API_KEY,\n\tDEFAULT_BASE_URL,\n\tDEFAULT_MAX_TOKENS,\n\tDEFAULT_MODEL_NAME,\n\tDEFAULT_TEMPERATURE,\n\tLLM_MAX_RETRIES,\n} from './constants'\n\nexport interface LLMConfig {\n\tbaseURL?: string\n\tapiKey?: string\n\tmodel?: string\n\ttemperature?: number\n\tmaxTokens?: number\n\tmaxRetries?: number\n}\n\nexport interface AgentConfig {\n\t// theme?: 'light' | 'dark'\n\tlanguage?: SupportedLanguage\n\n\t/**\n\t * Custom tools to extend PageAgent capabilities\n\t * @experimental\n\t * @note You can also override or remove internal tools by using the same name.\n\t * @see [tools](../tools/index.ts)\n\t *\n\t * @example\n\t * // override internal tool\n\t * import { tool } from 'page-agent'\n\t * const customTools = {\n\t * ask_user: tool({\n\t * \tdescription:\n\t * \t\t'Ask the user or parent model a question and wait for their answer. Use this if you need more information or clarification.',\n\t * \tinputSchema: zod.object({\n\t * \t\tquestion: zod.string(),\n\t * \t}),\n\t * \texecute: async function (this: PageAgent, input) {\n\t * \t\tconst answer = await do_some_thing(input.question)\n\t * \t\treturn \"✅ Received user answer: \" + answer\n\t * \t},\n\t * })\n\t * }\n\t *\n\t * @example\n\t * // remove internal tool\n\t * const customTools = {\n\t * \task_user: null // never ask user questions\n\t * }\n\t */\n\tcustomTools?: Record<string, PageAgentTool | null>\n\n\t// lifecycle hooks\n\t// @todo: use event instead of hooks\n\n\tonBeforeStep?: (this: PageAgent, stepCnt: number) => Promise<void> | void\n\tonAfterStep?: (this: PageAgent, stepCnt: number, history: AgentHistory[]) => Promise<void> | void\n\tonBeforeTask?: (this: PageAgent) => Promise<void> | void\n\tonAfterTask?: (this: PageAgent, result: ExecutionResult) => Promise<void> | void\n\n\t/**\n\t * @note this hook can block the disposal process\n\t * @note when dispose caused by page unload, reason will be 'PAGE_UNLOADING'. this method CANNOT block unloading. async operations may be cut.\n\t */\n\tonDispose?: (this: PageAgent, reason?: string) => void\n\n\t// page behavior hooks\n\n\t/**\n\t * @experimental\n\t * Enable the experimental script execution tool that allows executing generated JavaScript code on the page.\n\t * @note Can cause unpredictable side effects.\n\t * @note May bypass some safe guards and data-masking mechanisms.\n\t */\n\texperimentalScriptExecutionTool?: boolean\n\n\t/**\n\t * TODO: @unimplemented\n\t * hook when action causes a new page to be opened\n\t * @note PageAgent will try to detect new pages and decide if it's caused by an action. But not very reliable.\n\t */\n\tonNewPageOpen?: (this: PageAgent, url: string) => Promise<void> | void\n\n\t/**\n\t * TODO: @unimplemented\n\t * try to navigate to a new page instead of opening a new tab/window.\n\t * @note will unload the current page when a action tries to open a new page. so that things keep in the same tab/window.\n\t */\n\texperimentalPreventNewPage?: boolean\n}\n\nexport type PageAgentConfig = LLMConfig & AgentConfig & PageControllerConfig\n\nexport function parseLLMConfig(config: LLMConfig): Required<LLMConfig> {\n\treturn {\n\t\tbaseURL: config.baseURL ?? DEFAULT_BASE_URL,\n\t\tapiKey: config.apiKey ?? DEFAULT_API_KEY,\n\t\tmodel: config.model ?? DEFAULT_MODEL_NAME,\n\t\ttemperature: config.temperature ?? DEFAULT_TEMPERATURE,\n\t\tmaxTokens: config.maxTokens ?? DEFAULT_MAX_TOKENS,\n\t\tmaxRetries: config.maxRetries ?? LLM_MAX_RETRIES,\n\t}\n}\n","/**\n * Error types and error handling for LLM invocations\n */\n\nexport const InvokeErrorType = {\n\t// Retryable\n\tNETWORK_ERROR: 'network_error', // Network error, retry\n\tRATE_LIMIT: 'rate_limit', // Rate limit, retry\n\tSERVER_ERROR: 'server_error', // 5xx, retry\n\tNO_TOOL_CALL: 'no_tool_call', // Model did not call tool\n\tINVALID_TOOL_ARGS: 'invalid_tool_args', // Tool args don't match schema\n\tTOOL_EXECUTION_ERROR: 'tool_execution_error', // Tool execution error\n\n\tUNKNOWN: 'unknown',\n\n\t// Non-retryable\n\tAUTH_ERROR: 'auth_error', // Authentication failed\n\tCONTEXT_LENGTH: 'context_length', // Prompt too long\n\tCONTENT_FILTER: 'content_filter', // Content filtered\n} as const\n\nexport type InvokeErrorType = (typeof InvokeErrorType)[keyof typeof InvokeErrorType]\n\nexport class InvokeError extends Error {\n\ttype: InvokeErrorType\n\tretryable: boolean\n\tstatusCode?: number\n\trawError?: unknown\n\n\tconstructor(type: InvokeErrorType, message: string, rawError?: unknown) {\n\t\tsuper(message)\n\t\tthis.name = 'InvokeError'\n\t\tthis.type = type\n\t\tthis.retryable = this.isRetryable(type)\n\t\tthis.rawError = rawError\n\t}\n\n\tprivate isRetryable(type: InvokeErrorType): boolean {\n\t\tconst retryableTypes: InvokeErrorType[] = [\n\t\t\tInvokeErrorType.NETWORK_ERROR,\n\t\t\tInvokeErrorType.RATE_LIMIT,\n\t\t\tInvokeErrorType.SERVER_ERROR,\n\t\t\tInvokeErrorType.NO_TOOL_CALL,\n\t\t\tInvokeErrorType.INVALID_TOOL_ARGS,\n\t\t\tInvokeErrorType.TOOL_EXECUTION_ERROR,\n\t\t\tInvokeErrorType.UNKNOWN,\n\t\t]\n\t\treturn retryableTypes.includes(type)\n\t}\n}\n","/**\n * Utility functions for LLM integration\n */\nimport chalk from 'chalk'\nimport { z } from 'zod'\n\nimport type { MacroToolInput } from '../PageAgent'\nimport { InvokeError, InvokeErrorType } from './errors'\nimport type { Tool } from './types'\n\n/**\n * Convert Zod schema to OpenAI tool format\n * Uses Zod 4 native z.toJSONSchema()\n */\nexport function zodToOpenAITool(name: string, tool: Tool) {\n\treturn {\n\t\ttype: 'function' as const,\n\t\tfunction: {\n\t\t\tname,\n\t\t\tdescription: tool.description,\n\t\t\tparameters: z.toJSONSchema(tool.inputSchema, { target: 'openapi-3.0' }),\n\t\t},\n\t}\n}\n\n/**\n * Although some models cannot guarantee correct response. Common issues are fixable:\n * - Instead of returning a proper tool call. Return the tool call parameters in the message content.\n * - Returned tool calls or messages don't follow the nested MacroToolInput format.\n */\nexport function lenientParseMacroToolCall(\n\tresponseData: any,\n\tinputSchema: z.ZodObject<MacroToolInput & Record<string, any>>\n): MacroToolInput {\n\t// check\n\tconst choice = responseData.choices?.[0]\n\tif (!choice) {\n\t\tthrow new InvokeError(InvokeErrorType.UNKNOWN, 'No choices in response', responseData)\n\t}\n\n\t// check\n\tswitch (choice.finish_reason) {\n\t\tcase 'tool_calls':\n\t\tcase 'function_call': // gemini\n\t\tcase 'stop': // will try a robust parse\n\t\t\t// ✅ Normal\n\t\t\tbreak\n\t\tcase 'length':\n\t\t\t// ⚠️ Token limit reached\n\t\t\tthrow new InvokeError(\n\t\t\t\tInvokeErrorType.CONTEXT_LENGTH,\n\t\t\t\t'Response truncated: max tokens reached'\n\t\t\t)\n\t\tcase 'content_filter':\n\t\t\t// ❌ Content filtered\n\t\t\tthrow new InvokeError(InvokeErrorType.CONTENT_FILTER, 'Content filtered by safety system')\n\t\tdefault:\n\t\t\tthrow new InvokeError(\n\t\t\t\tInvokeErrorType.UNKNOWN,\n\t\t\t\t`Unexpected finish_reason: ${choice.finish_reason}`\n\t\t\t)\n\t}\n\n\t// Extract action schema from MacroToolInput schema\n\tconst actionSchema = inputSchema.shape.action\n\tif (!actionSchema) {\n\t\tthrow new Error('inputSchema must have an \"action\" field')\n\t}\n\n\t// patch stopReason mis-format\n\n\tlet arg: string | null = null\n\n\t// try to use tool call\n\tconst toolCall = choice.message?.tool_calls?.[0]?.function\n\targ = toolCall?.arguments ?? null\n\n\tif (arg && toolCall.name !== 'AgentOutput') {\n\t\t// TODO: check if toolCall.name is a valid action name\n\t\t// case: instead of AgentOutput, the model returned a action name as tool call\n\t\tconsole.log(chalk.yellow('lenientParseMacroToolCall: #1 fixing incorrect tool call'))\n\t\tlet tmpArg\n\t\ttry {\n\t\t\ttmpArg = JSON.parse(arg)\n\t\t} catch (error) {\n\t\t\tthrow new InvokeError(\n\t\t\t\tInvokeErrorType.INVALID_TOOL_ARGS,\n\t\t\t\t'Failed to parse tool arguments as JSON',\n\t\t\t\terror\n\t\t\t)\n\t\t}\n\t\targ = JSON.stringify({ action: { [toolCall.name]: tmpArg } })\n\t}\n\n\tif (!arg) {\n\t\t// try to use message content as JSON\n\t\targ = choice.message?.content.trim() || null\n\t}\n\n\tif (!arg) {\n\t\tthrow new InvokeError(\n\t\t\tInvokeErrorType.NO_TOOL_CALL,\n\t\t\t'No tool call or content found in response',\n\t\t\tresponseData\n\t\t)\n\t}\n\n\t// make sure is valid JSON\n\n\tlet parsedArgs: any\n\ttry {\n\t\tparsedArgs = JSON.parse(arg)\n\t} catch (error) {\n\t\tthrow new InvokeError(\n\t\t\tInvokeErrorType.INVALID_TOOL_ARGS,\n\t\t\t'Failed to parse tool arguments as JSON',\n\t\t\terror\n\t\t)\n\t}\n\n\t// patch incomplete formats\n\n\tif (parsedArgs.action || parsedArgs.evaluation_previous_goal || parsedArgs.next_goal) {\n\t\t// case: nested MacroToolInput format (correct format)\n\n\t\t// some models may give a empty action (they may think reasoning and action should be separate)\n\t\tif (!parsedArgs.action) {\n\t\t\tconsole.log(chalk.yellow('lenientParseMacroToolCall: #2 fixing incorrect tool call'))\n\t\t\tparsedArgs.action = {\n\t\t\t\twait: { seconds: 1 },\n\t\t\t}\n\t\t}\n\t} else if (parsedArgs.type && parsedArgs.function) {\n\t\t// case: upper level function call format provided. only keep its arguments\n\t\t// TODO: check if function name is a valid action name\n\t\tif (parsedArgs.function.name !== 'AgentOutput')\n\t\t\tthrow new InvokeError(\n\t\t\t\tInvokeErrorType.INVALID_TOOL_ARGS,\n\t\t\t\t`Expected function name \"AgentOutput\", got \"${parsedArgs.function.name}\"`,\n\t\t\t\tnull\n\t\t\t)\n\n\t\tconsole.log(chalk.yellow('lenientParseMacroToolCall: #3 fixing incorrect tool call'))\n\t\tparsedArgs = parsedArgs.function.arguments\n\t} else if (parsedArgs.name && parsedArgs.arguments) {\n\t\t// case: upper level function call format provided. only keep its arguments\n\t\t// TODO: check if function name is a valid action name\n\t\tif (parsedArgs.name !== 'AgentOutput')\n\t\t\tthrow new InvokeError(\n\t\t\t\tInvokeErrorType.INVALID_TOOL_ARGS,\n\t\t\t\t`Expected function name \"AgentOutput\", got \"${parsedArgs.name}\"`,\n\t\t\t\tnull\n\t\t\t)\n\n\t\tconsole.log(chalk.yellow('lenientParseMacroToolCall: #4 fixing incorrect tool call'))\n\t\tparsedArgs = parsedArgs.arguments\n\t} else {\n\t\t// case: only action parameters provided, wrap into MacroToolInput\n\t\t// TODO: check if action name is valid\n\t\tconsole.log(chalk.yellow('lenientParseMacroToolCall: #5 fixing incorrect tool call'))\n\t\tparsedArgs = { action: parsedArgs } as MacroToolInput\n\t}\n\n\t// make sure it's not wrapped as string\n\tif (typeof parsedArgs === 'string') {\n\t\tconsole.log(chalk.yellow('lenientParseMacroToolCall: #6 fixing incorrect tool call'))\n\t\ttry {\n\t\t\tparsedArgs = JSON.parse(parsedArgs)\n\t\t} catch (error) {\n\t\t\tthrow new InvokeError(\n\t\t\t\tInvokeErrorType.INVALID_TOOL_ARGS,\n\t\t\t\t'Failed to parse nested tool arguments as JSON',\n\t\t\t\terror\n\t\t\t)\n\t\t}\n\t}\n\n\tconst validation = inputSchema.safeParse(parsedArgs)\n\tif (validation.success) {\n\t\treturn validation.data as unknown as MacroToolInput\n\t} else {\n\t\tconst action = parsedArgs.action ?? {}\n\t\tconst actionName = Object.keys(action)[0] || 'unknown'\n\t\tconst actionArgs = JSON.stringify(action[actionName] || 'unknown')\n\n\t\t// TODO: check if action name is valid. give a readable error message\n\n\t\tthrow new InvokeError(\n\t\t\tInvokeErrorType.INVALID_TOOL_ARGS,\n\t\t\t`Tool arguments validation failed: action \"${actionName}\" with args ${actionArgs}`,\n\t\t\tvalidation.error\n\t\t)\n\t}\n}\n\nexport function modelPatch(body: Record<string, any>) {\n\tconst model: string = body.model || ''\n\n\tif (model.toLowerCase().startsWith('claude')) {\n\t\tbody.tool_choice = { type: 'tool', name: 'AgentOutput' }\n\t\tbody.thinking = { type: 'disabled' }\n\t\t// body.reasoning = { enabled: 'disabled' }\n\t}\n\n\tif (model.toLowerCase().includes('grok')) {\n\t\tconsole.log('Applying Grok patch: removing tool_choice')\n\t\tdelete body.tool_choice\n\t\tconsole.log('Applying Grok patch: disable reasoning and thinking')\n\t\tbody.thinking = { type: 'disabled', effort: 'minimal' }\n\t\tbody.reasoning = { enabled: false, effort: 'low' }\n\t}\n\n\treturn body\n}\n","/**\n * OpenAI Client implementation\n */\nimport type { MacroToolInput } from '../PageAgent'\nimport { InvokeError, InvokeErrorType } from './errors'\nimport type { InvokeResult, LLMClient, Message, OpenAIClientConfig, Tool } from './types'\nimport { lenientParseMacroToolCall, modelPatch, zodToOpenAITool } from './utils'\n\nexport class OpenAIClient implements LLMClient {\n\tconfig: OpenAIClientConfig\n\n\tconstructor(config: OpenAIClientConfig) {\n\t\tthis.config = config\n\t}\n\n\tasync invoke(\n\t\tmessages: Message[],\n\t\ttools: { AgentOutput: Tool<MacroToolInput> },\n\t\tabortSignal?: AbortSignal\n\t): Promise<InvokeResult> {\n\t\t// 1. Convert tools to OpenAI format\n\t\tconst openaiTools = Object.entries(tools).map(([name, tool]) => zodToOpenAITool(name, tool))\n\n\t\t// 2. Call API\n\t\tlet response: Response\n\t\ttry {\n\t\t\tresponse = await fetch(`${this.config.baseURL}/chat/completions`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.config.apiKey}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(\n\t\t\t\t\tmodelPatch({\n\t\t\t\t\t\tmodel: this.config.model,\n\t\t\t\t\t\ttemperature: this.config.temperature,\n\t\t\t\t\t\tmax_tokens: this.config.maxTokens,\n\t\t\t\t\t\tmessages,\n\n\t\t\t\t\t\ttools: openaiTools,\n\t\t\t\t\t\t// tool_choice: 'required',\n\t\t\t\t\t\ttool_choice: { type: 'function', function: { name: 'AgentOutput' } },\n\n\t\t\t\t\t\t// model specific params\n\n\t\t\t\t\t\t// reasoning_effort: 'minimal',\n\t\t\t\t\t\t// verbosity: 'low',\n\t\t\t\t\t\tparallel_tool_calls: false,\n\t\t\t\t\t})\n\t\t\t\t),\n\t\t\t\tsignal: abortSignal,\n\t\t\t})\n\t\t} catch (error: unknown) {\n\t\t\t// Network error\n\t\t\tthrow new InvokeError(InvokeErrorType.NETWORK_ERROR, 'Network request failed', error)\n\t\t}\n\n\t\t// 3. Handle HTTP errors\n\t\tif (!response.ok) {\n\t\t\tconst errorData = await response.json().catch()\n\t\t\tconst errorMessage =\n\t\t\t\t(errorData as { error?: { message?: string } }).error?.message || response.statusText\n\n\t\t\tif (response.status === 401 || response.status === 403) {\n\t\t\t\tthrow new InvokeError(\n\t\t\t\t\tInvokeErrorType.AUTH_ERROR,\n\t\t\t\t\t`Authentication failed: ${errorMessage}`,\n\t\t\t\t\terrorData\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (response.status === 429) {\n\t\t\t\tthrow new InvokeError(\n\t\t\t\t\tInvokeErrorType.RATE_LIMIT,\n\t\t\t\t\t`Rate limit exceeded: ${errorMessage}`,\n\t\t\t\t\terrorData\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (response.status >= 500) {\n\t\t\t\tthrow new InvokeError(\n\t\t\t\t\tInvokeErrorType.SERVER_ERROR,\n\t\t\t\t\t`Server error: ${errorMessage}`,\n\t\t\t\t\terrorData\n\t\t\t\t)\n\t\t\t}\n\t\t\tthrow new InvokeError(\n\t\t\t\tInvokeErrorType.UNKNOWN,\n\t\t\t\t`HTTP ${response.status}: ${errorMessage}`,\n\t\t\t\terrorData\n\t\t\t)\n\t\t}\n\n\t\t// parse response\n\n\t\tconst data = await response.json()\n\t\tconst tool = tools.AgentOutput\n\t\tconst macroToolInput = lenientParseMacroToolCall(data, tool.inputSchema as any)\n\n\t\t// Execute tool\n\t\tlet toolResult: unknown\n\t\ttry {\n\t\t\ttoolResult = await tool.execute(macroToolInput)\n\t\t} catch (e) {\n\t\t\tthrow new InvokeError(\n\t\t\t\tInvokeErrorType.TOOL_EXECUTION_ERROR,\n\t\t\t\t`Tool execution failed: ${(e as Error).message}`,\n\t\t\t\te\n\t\t\t)\n\t\t}\n\n\t\t// Return result (including cache tokens)\n\t\treturn {\n\t\t\ttoolCall: {\n\t\t\t\t// id: toolCall.id,\n\t\t\t\tname: 'AgentOutput',\n\t\t\t\targs: macroToolInput,\n\t\t\t},\n\t\t\ttoolResult,\n\t\t\tusage: {\n\t\t\t\tpromptTokens: data.usage?.prompt_tokens ?? 0,\n\t\t\t\tcompletionTokens: data.usage?.completion_tokens ?? 0,\n\t\t\t\ttotalTokens: data.usage?.total_tokens ?? 0,\n\t\t\t\tcachedTokens: data.usage?.prompt_tokens_details?.cached_tokens,\n\t\t\t\treasoningTokens: data.usage?.completion_tokens_details?.reasoning_tokens,\n\t\t\t},\n\t\t\trawResponse: data,\n\t\t}\n\t}\n}\n","/**\n * @topic LLM 与主流程的隔离\n * @reasoning\n * 将 llm 的调用和主流程分开是复杂的,\n * 因为 agent 的 tool call 通常集成在 llm 模块中,而而先得到 llm 返回,然后处理工具调用\n * tools 和 llm 调用的逻辑不可避免地耦合在一起,tool 的执行又和主流程耦合在一起\n * 而 history 的维护和更新逻辑,又必须嵌入多轮 tool call 中\n * @reasoning\n * - 放弃框架提供的自动的多轮调用,每轮调用都由主流程发起\n * - 理想情况下,llm 调用应该获得 structured output,然后由额外的模块触发 tool call,目前模型和框架都无法实现\n * - 当前只能将 llm api 和 本地 tool call 耦合在一起,不关心其中的衔接方式\n * @conclusion\n * - @llm responsibility boundary:\n * - call llm api with given messages and tools\n * - invoke tool call and get the result of the tool\n * - return the result to main loop\n * - @main_loop responsibility boundary:\n * - maintain all behaviors of an **agent**\n * @conclusion\n * - 这里的 llm 模块不是 agent,只负责一轮 llm 调用和工具调用,无状态\n */\n/**\n * @topic 结构化输出\n * @facts\n * - 几乎所有模型都支持 tool call schema\n * - 几乎所有模型都支持返回 json\n * - 只有 openAI/grok/gemini 支持 schema 并保证格式\n * - 主流模型都支持 tool_choice: required\n * - 除了 qwen 必须指定一个函数名 (9月上新后支持)\n * @conclusion\n * - 永远使用 tool call 来返回结构化数据,禁止模型直接返回(视为出错)\n * - 不能假设 tool 参数合法,必须有修复机制,而且修复也应该使用 tool call 返回\n */\nimport type { LLMConfig } from '../config'\nimport { parseLLMConfig } from '../config'\nimport { OpenAIClient } from './OpenAILenientClient'\nimport { InvokeError } from './errors'\nimport type { InvokeResult, LLMClient, Message, Tool } from './types'\n\nexport type { Message, Tool, InvokeResult, LLMClient }\n\nexport class LLM extends EventTarget {\n\tconfig: Required<LLMConfig>\n\tclient: LLMClient\n\n\tconstructor(config: LLMConfig) {\n\t\tsuper()\n\t\tthis.config = parseLLMConfig(config)\n\n\t\t// Default to OpenAI client\n\t\tthis.client = new OpenAIClient({\n\t\t\tmodel: this.config.model,\n\t\t\tapiKey: this.config.apiKey,\n\t\t\tbaseURL: this.config.baseURL,\n\t\t\ttemperature: this.config.temperature,\n\t\t\tmaxTokens: this.config.maxTokens,\n\t\t})\n\t}\n\n\t/**\n\t * - call llm api *once*\n\t * - invoke tool call *once*\n\t * - return the result of the tool\n\t */\n\tasync invoke(\n\t\tmessages: Message[],\n\t\ttools: Record<string, Tool>,\n\t\tabortSignal: AbortSignal\n\t): Promise<InvokeResult> {\n\t\treturn await withRetry(\n\t\t\tasync () => {\n\t\t\t\tconst result = await this.client.invoke(messages, tools, abortSignal)\n\n\t\t\t\treturn result\n\t\t\t},\n\t\t\t// retry settings\n\t\t\t{\n\t\t\t\tmaxRetries: this.config.maxRetries,\n\t\t\t\tonRetry: (current: number) => {\n\t\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\t\tnew CustomEvent('retry', { detail: { current, max: this.config.maxRetries } })\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\tonError: (error: Error) => {\n\t\t\t\t\tthis.dispatchEvent(new CustomEvent('error', { detail: { error } }))\n\t\t\t\t},\n\t\t\t}\n\t\t)\n\t}\n}\n\nasync function withRetry<T>(\n\tfn: () => Promise<T>,\n\tsettings: {\n\t\tmaxRetries: number\n\t\tonRetry: (retries: number) => void\n\t\tonError: (error: Error) => void\n\t}\n): Promise<T> {\n\tlet retries = 0\n\tlet lastError: Error | null = null\n\twhile (retries <= settings.maxRetries) {\n\t\tif (retries > 0) {\n\t\t\tsettings.onRetry(retries)\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 100))\n\t\t}\n\n\t\ttry {\n\t\t\treturn await fn()\n\t\t} catch (error: unknown) {\n\t\t\tconsole.error(error)\n\t\t\tsettings.onError(error as Error)\n\n\t\t\t// do not retry if aborted by user\n\t\t\tif ((error as { name?: string })?.name === 'AbortError') throw error\n\n\t\t\t// do not retry if error is not retryable (InvokeError)\n\t\t\tif (error instanceof InvokeError && !error.retryable) throw error\n\n\t\t\tlastError = error as Error\n\t\t\tretries++\n\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 100))\n\t\t}\n\t}\n\n\tthrow lastError!\n}\n","export default \"You are an AI agent designed to operate in an iterative loop to automate browser tasks. Your ultimate goal is accomplishing the task provided in <user_request>.\\n\\n<intro>\\nYou excel at following tasks:\\n1. Navigating complex websites and extracting precise information\\n2. Automating form submissions and interactive web actions\\n3. Gathering and saving information \\n4. Operate effectively in an agent loop\\n5. Efficiently performing diverse web tasks\\n</intro>\\n\\n<language_settings>\\n- Default working language: **中文**\\n- Use the language that user is using. Return in user's language.\\n</language_settings>\\n\\n<input>\\nAt every step, your input will consist of: \\n1. <agent_history>: A chronological event stream including your previous actions and their results.\\n2. <agent_state>: Current <user_request> and <step_info>.\\n3. <browser_state>: Current URL, interactive elements indexed for actions, and visible page content.\\n</input>\\n\\n<agent_history>\\nAgent history will be given as a list of step information as follows:\\n\\n<step_{step_number}>:\\nEvaluation of Previous Step: Assessment of last action\\nMemory: Your memory of this step\\nNext Goal: Your goal for this step\\nAction Results: Your actions and their results\\n</step_{step_number}>\\n\\nand system messages wrapped in <sys> tag.\\n</agent_history>\\n\\n<user_request>\\nUSER REQUEST: This is your ultimate objective and always remains visible.\\n- This has the highest priority. Make the user happy.\\n- If the user request is very specific - then carefully follow each step and dont skip or hallucinate steps.\\n- If the task is open ended you can plan yourself how to get it done.\\n</user_request>\\n\\n<browser_state>\\n1. Browser State will be given as:\\n\\nCurrent URL: URL of the page you are currently viewing.\\nInteractive Elements: All interactive elements will be provided in format as [index]<type>text</type> where\\n- index: Numeric identifier for interaction\\n- type: HTML element type (button, input, etc.)\\n- text: Element description\\n\\nExamples:\\n[33]<div>User form</div>\\n\\\\t*[35]<button aria-label='Submit form'>Submit</button>\\n\\nNote that:\\n- Only elements with numeric indexes in [] are interactive\\n- (stacked) indentation (with \\\\t) is important and means that the element is a (html) child of the element above (with a lower index)\\n- Elements tagged with `*[` are the new clickable elements that appeared on the website since the last step - if url has not changed.\\n- Pure text elements without [] are not interactive.\\n</browser_state>\\n\\n<browser_rules>\\nStrictly follow these rules while using the browser and navigating the web:\\n- Only interact with elements that have a numeric [index] assigned.\\n- Only use indexes that are explicitly provided.\\n- If the page changes after, for example, an input text action, analyze if you need to interact with new elements, e.g. selecting the right option from the list.\\n- By default, only elements in the visible viewport are listed. Use scrolling actions if you suspect relevant content is offscreen which you need to interact with. Scroll ONLY if there are more pixels below or above the page.\\n- You can scroll by a specific number of pages using the num_pages parameter (e.g., 0.5 for half page, 2.0 for two pages).\\n- All the elements that are scrollable are marked with `data-scrollable` attribute. Including the scrollable distance in every directions. You can scroll *the element* in case some area are overflowed.\\n- If a captcha appears, tell user you can not solve captcha. finished the task and ask user to solve it.\\n- If expected elements are missing, try scrolling, or navigating back.\\n- If the page is not fully loaded, use the `wait` action.\\n- Do not repeat one action for more than 3 times unless some conditions changed.\\n- If you fill an input field and your action sequence is interrupted, most often something changed e.g. suggestions popped up under the field.\\n- If the <user_request> includes specific page information such as product type, rating, price, location, etc., try to apply filters to be more efficient.\\n- The <user_request> is the ultimate goal. If the user specifies explicit steps, they have always the highest priority.\\n- If you input_text into a field, you might need to press enter, click the search button, or select from dropdown for completion.\\n- Don't login into a page if you don't have to. Don't login if you don't have the credentials. \\n- There are 2 types of tasks always first think which type of request you are dealing with:\\n1. Very specific step by step instructions:\\n- Follow them as very precise and don't skip steps. Try to complete everything as requested.\\n2. Open ended tasks. Plan yourself, be creative in achieving them.\\n- If you get stuck e.g. with logins or captcha in open-ended tasks you can re-evaluate the task and try alternative ways, e.g. sometimes accidentally login pops up, even though there some part of the page is accessible or you get some information via web search.\\n</browser_rules>\\n\\n<capability>\\n- You can only handle single page app. Do not jump out of current page.\\n- Do not click on link if it will open in a new page (etc. <a target=\\\"_blank\\\">)\\n- It is ok to fail the task.\\n\\t- User can be wrong. If the request of user is not achievable, inappropriate or you do not have enough information or tools to achieve it. Tell user to make a better request.\\n\\t- Webpage can be broken. All webpages or apps have bugs. Some bug will make it hard for your job. It's encouraged to tell user the problem of current page. Your feedbacks (including failing) are valuable for user.\\n\\t- Trying to hard can be harmful. Repeating some action back and forth or pushing for a complex procedure with little knowledge can cause unwanted result and harmful side-effects. User would rather you to complete the task with a fail.\\n- If you are not clear about the request or steps. `ask_user` to clarify it.\\n- If you do not have knowledge for the current webpage or task. You must require user to give specific instructions and detailed steps.\\n</capability>\\n\\n<task_completion_rules>\\nYou must call the `done` action in one of three cases:\\n- When you have fully completed the USER REQUEST.\\n- When you reach the final allowed step (`max_steps`), even if the task is incomplete.\\n- When you feel stuck or unable to solve user request. Or user request is not clear or contains inappropriate content.\\n- If it is ABSOLUTELY IMPOSSIBLE to continue.\\n\\nThe `done` action is your opportunity to terminate and share your findings with the user.\\n- Set `success` to `true` only if the full USER REQUEST has been completed with no missing components.\\n- If any part of the request is missing, incomplete, or uncertain, set `success` to `false`.\\n- You can use the `text` field of the `done` action to communicate your findings and to provide a coherent reply to the user and fulfill the USER REQUEST.\\n- You are ONLY ALLOWED to call `done` as a single action. Don't call it together with other actions.\\n- If the user asks for specified format, such as \\\"return JSON with following structure\\\", \\\"return a list of format...\\\", MAKE sure to use the right format in your answer.\\n- If the user asks for a structured output, your `done` action's schema may be modified. Take this schema into account when solving the task!\\n</task_completion_rules>\\n\\n<reasoning_rules>\\nExhibit the following reasoning patterns to successfully achieve the <user_request>:\\n\\n- Reason about <agent_history> to track progress and context toward <user_request>.\\n- Analyze the most recent \\\"Next Goal\\\" and \\\"Action Result\\\" in <agent_history> and clearly state what you previously tried to achieve.\\n- Analyze all relevant items in <agent_history> and <browser_state> to understand your state.\\n- Explicitly judge success/failure/uncertainty of the last action. Never assume an action succeeded just because it appears to be executed in your last step in <agent_history>. If the expected change is missing, mark the last action as failed (or uncertain) and plan a recovery.\\n- Analyze whether you are stuck, e.g. when you repeat the same actions multiple times without any progress. Then consider alternative approaches e.g. scrolling for more context or ask user for help.\\n- `ask_user` for help if you have any difficulty. Users want to be kept in the loop.\\n- If you see information relevant to <user_request>, plan saving the information to memory.\\n- Always reason about the <user_request>. Make sure to carefully analyze the specific steps and information required. E.g. specific filters, specific form fields, specific information to search. Make sure to always compare the current trajectory with the user request and think carefully if thats how the user requested it.\\n</reasoning_rules>\\n\\n<examples>\\nHere are examples of good output patterns. Use them as reference but never copy them directly.\\n\\n<evaluation_examples>\\n- Positive Examples:\\n\\\"evaluation_previous_goal\\\": \\\"Successfully navigated to the product page and found the target information. Verdict: Success\\\"\\n\\\"evaluation_previous_goal\\\": \\\"Clicked the login button and user authentication form appeared. Verdict: Success\\\"\\n</evaluation_examples>\\n\\n<memory_examples>\\n\\\"memory\\\": \\\"Found many pending reports that need to be analyzed in the main page. Successfully processed the first 2 reports on quarterly sales data and moving on to inventory analysis and customer feedback reports.\\\"\\n</memory_examples>\\n\\n<next_goal_examples>\\n\\\"next_goal\\\": \\\"Click on the 'Add to Cart' button to proceed with the purchase flow.\\\"\\n\\\"next_goal\\\": \\\"Extract details from the first item on the page.\\\"\\n</next_goal_examples>\\n</examples>\\n\\n<output>\\nYou must ALWAYS respond with a valid JSON in this exact format:\\n\\n{\\n \\\"evaluation_previous_goal\\\": \\\"Concise one-sentence analysis of your last action. Clearly state success, failure, or uncertain.\\\",\\n \\\"memory\\\": \\\"1-3 concise sentences of specific memory of this step and overall progress. You should put here everything that will help you track progress in future steps. Like counting pages visited, items found, etc.\\\",\\n \\\"next_goal\\\": \\\"State the next immediate goal and action to achieve it, in one clear sentence.\\\"\\n \\\"action\\\":{\\\"one_action_name\\\": {// action-specific parameter}}\\n}\\n</output>\\n\"","/**\n * Wait until condition becomes true\n * @returns Returns when condition becomes true, throws otherwise\n * @param timeout Timeout in milliseconds, default 0 means no timeout, throws error on timeout\n */\nexport async function waitUntil(check: () => boolean, timeout = 60 * 60_1000): Promise<boolean> {\n\tif (check()) return true\n\n\treturn new Promise((resolve, reject) => {\n\t\tconst start = Date.now()\n\t\tconst interval = setInterval(() => {\n\t\t\tif (check()) {\n\t\t\t\tclearInterval(interval)\n\t\t\t\tresolve(true)\n\t\t\t} else if (Date.now() - start > timeout) {\n\t\t\t\tclearInterval(interval)\n\t\t\t\treject(new Error('Timeout waiting for condition to become true'))\n\t\t\t}\n\t\t}, 100)\n\t})\n}\n\nexport async function waitFor(seconds: number): Promise<void> {\n\tawait new Promise((resolve) => setTimeout(resolve, seconds * 1000))\n}\n\n//\n\nexport function truncate(text: string, maxLength: number): string {\n\tif (text.length > maxLength) {\n\t\treturn text.substring(0, maxLength) + '...'\n\t}\n\treturn text\n}\n\n//\n\nexport function trimLines(text: string): string {\n\treturn text\n\t\t.split('\\n')\n\t\t.map((line) => line.trim())\n\t\t.join('\\n')\n}\n\n//\n\nexport function randomID(existingIDs?: string[]): string {\n\tlet id = Math.random().toString(36).substring(2, 11)\n\n\tif (!existingIDs) {\n\t\treturn id\n\t}\n\n\tconst MAX_TRY = 1000\n\tlet tryCount = 0\n\n\twhile (existingIDs.includes(id)) {\n\t\tid = Math.random().toString(36).substring(2, 11)\n\t\ttryCount++\n\t\tif (tryCount > MAX_TRY) {\n\t\t\tthrow new Error('randomID: too many try')\n\t\t}\n\t}\n\n\treturn id\n}\n\n//\n\nif (!window.__PAGE_AGENT_IDS__) {\n\twindow.__PAGE_AGENT_IDS__ = []\n}\n\nconst ids = window.__PAGE_AGENT_IDS__\n\n/**\n * Generate a random ID.\n * @note Unique within this window.\n */\nexport function uid() {\n\tconst id = randomID(ids)\n\tids.push(id)\n\treturn id\n}\n","/**\n * Internal tools for PageAgent.\n * @note Adapted from browser-use\n */\nimport zod, { type z } from 'zod'\n\nimport type { PageAgent } from '../PageAgent'\nimport { waitFor } from '../utils'\n\n/**\n * Internal tool definition that has access to PageAgent `this` context\n */\nexport interface PageAgentTool<TParams = any> {\n\t// name: string\n\tdescription: string\n\tinputSchema: z.ZodType<TParams>\n\texecute: (this: PageAgent, args: TParams) => Promise<string>\n}\n\nexport function tool<TParams>(options: PageAgentTool<TParams>): PageAgentTool<TParams> {\n\treturn options\n}\n\n/**\n * Internal tools for PageAgent.\n * Note: Using any to allow different parameter types for each tool\n */\nexport const tools = new Map<string, PageAgentTool>()\n\ntools.set(\n\t'done',\n\ttool({\n\t\tdescription:\n\t\t\t'Complete task - provide a summary of results for the user. Set success=True if task completed successfully, false otherwise. Text should be your response to the user summarizing results.',\n\t\tinputSchema: zod.object({\n\t\t\ttext: zod.string(),\n\t\t\tsuccess: zod.boolean().default(true),\n\t\t}),\n\t\texecute: async function (this: PageAgent, input) {\n\t\t\t// @note main loop will handle this one\n\t\t\t// this.onDone(input.text, input.success)\n\t\t\treturn Promise.resolve('Task completed')\n\t\t},\n\t})\n)\n\ntools.set(\n\t'wait',\n\ttool({\n\t\tdescription:\n\t\t\t'Wait for x seconds. default 1s (max 10 seconds, min 1 second). This can be used to wait until the page or data is fully loaded.',\n\t\tinputSchema: zod.object({\n\t\t\tseconds: zod.number().min(1).max(10).default(1),\n\t\t}),\n\t\texecute: async function (this: PageAgent, input) {\n\t\t\tconst lastTimeUpdate = await this.pageController.getLastUpdateTime()\n\t\t\tconst actualWaitTime = Math.max(0, input.seconds - (Date.now() - lastTimeUpdate) / 1000)\n\t\t\tconsole.log(`actualWaitTime: ${actualWaitTime} seconds`)\n\t\t\tawait waitFor(actualWaitTime)\n\t\t\treturn `✅ Waited for ${input.seconds} seconds.`\n\t\t},\n\t})\n)\n\ntools.set(\n\t'ask_user',\n\ttool({\n\t\tdescription:\n\t\t\t'Ask the user a question and wait for their answer. Use this if you need more information or clarification.',\n\t\tinputSchema: zod.object({\n\t\t\tquestion: zod.string(),\n\t\t}),\n\t\texecute: async function (this: PageAgent, input) {\n\t\t\tconst answer = await this.panel.askUser(input.question)\n\t\t\treturn `✅ Received user answer: ${answer}`\n\t\t},\n\t})\n)\n\ntools.set(\n\t'click_element_by_index',\n\ttool({\n\t\tdescription: 'Click element by index',\n\t\tinputSchema: zod.object({\n\t\t\tindex: zod.int().min(0),\n\t\t}),\n\t\texecute: async function (this: PageAgent, input) {\n\t\t\tconst result = await this.pageController.clickElement(input.index)\n\t\t\treturn result.message\n\t\t},\n\t})\n)\n\ntools.set(\n\t'input_text',\n\ttool({\n\t\tdescription: 'Click and input text into a input interactive element',\n\t\tinputSchema: zod.object({\n\t\t\tindex: zod.int().min(0),\n\t\t\ttext: zod.string(),\n\t\t}),\n\t\texecute: async function (this: PageAgent, input) {\n\t\t\tconst result = await this.pageController.inputText(input.index, input.text)\n\t\t\treturn result.message\n\t\t},\n\t})\n)\n\ntools.set(\n\t'select_dropdown_option',\n\ttool({\n\t\tdescription:\n\t\t\t'Select dropdown option for interactive element index by the text of the option you want to select',\n\t\tinputSchema: zod.object({\n\t\t\tindex: zod.int().min(0),\n\t\t\ttext: zod.string(),\n\t\t}),\n\t\texecute: async function (this: PageAgent, input) {\n\t\t\tconst result = await this.pageController.selectOption(input.index, input.text)\n\t\t\treturn result.message\n\t\t},\n\t})\n)\n\n/**\n * @note Reference from browser-use\n */\ntools.set(\n\t'scroll',\n\ttool({\n\t\tdescription:\n\t\t\t'Scroll the page by specified number of pages (set down=True to scroll down, down=False to scroll up, num_pages=number of pages to scroll like 0.5 for half page, 1.0 for one page, etc.). Optional index parameter to scroll within a specific element or its scroll container (works well for dropdowns and custom UI components). Optional pixels parameter to scroll by a specific number of pixels instead of pages.',\n\t\tinputSchema: zod.object({\n\t\t\tdown: zod.boolean().default(true),\n\t\t\tnum_pages: zod.number().min(0).max(10).optional().default(0.1),\n\t\t\tpixels: zod.number().int().min(0).optional(),\n\t\t\tindex: zod.number().int().min(0).optional(),\n\t\t}),\n\t\texecute: async function (this: PageAgent, input) {\n\t\t\tconst result = await this.pageController.scroll({\n\t\t\t\t...input,\n\t\t\t\tnumPages: input.num_pages,\n\t\t\t})\n\t\t\treturn result.message\n\t\t},\n\t})\n)\n\ntools.set(\n\t'scroll_horizontally',\n\ttool({\n\t\tdescription:\n\t\t\t'Scroll the page or element horizontally (set right=True to scroll right, right=False to scroll left, pixels=number of pixels to scroll). Optional index parameter to scroll within a specific element or its scroll container (works well for wide tables).',\n\t\tinputSchema: zod.object({\n\t\t\tright: zod.boolean().default(true),\n\t\t\tpixels: zod.number().int().min(0),\n\t\t\tindex: zod.number().int().min(0).optional(),\n\t\t}),\n\t\texecute: async function (this: PageAgent, input) {\n\t\t\tconst result = await this.pageController.scrollHorizontally(input)\n\t\t\treturn result.message\n\t\t},\n\t})\n)\n\ntools.set(\n\t'execute_javascript',\n\ttool({\n\t\tdescription:\n\t\t\t'Execute JavaScript code on the current page. Supports async/await syntax. Use with caution!',\n\t\tinputSchema: zod.object({\n\t\t\tscript: zod.string(),\n\t\t}),\n\t\texecute: async function (this: PageAgent, input) {\n\t\t\tconst result = await this.pageController.executeJavascript(input.script)\n\t\t\treturn result.message\n\t\t},\n\t})\n)\n\n// @todo get_dropdown_options\n// @todo select_dropdown_option\n// @todo send_keys\n// @todo upload_file\n// @todo go_back\n// @todo extract_structured_data\n","import chalk from 'chalk'\n\n/**\n * Simple assertion function that throws an error if the condition is falsy\n * @param condition - The condition to assert\n * @param message - Optional error message\n * @throws Error if condition is falsy\n */\nexport function assert(condition: unknown, message?: string, silent?: boolean): asserts condition {\n\tif (!condition) {\n\t\tconst errorMessage = message ?? 'Assertion failed'\n\n\t\tif (!silent) console.error(chalk.red(`❌ assert: ${errorMessage}`))\n\n\t\tthrow new Error(errorMessage)\n\t}\n}\n","/**\n * Copyright (C) 2025 Alibaba Group Holding Limited\n * All rights reserved.\n */\nimport { PageController } from '@page-agent/page-controller'\nimport { Panel, SimulatorMask } from '@page-agent/ui'\nimport chalk from 'chalk'\nimport zod from 'zod'\n\nimport type { PageAgentConfig } from './config'\nimport { MAX_STEPS } from './config/constants'\nimport { LLM, type Tool } from './llms'\nimport SYSTEM_PROMPT from './prompts/system_prompt.md?raw'\nimport { tools } from './tools'\nimport { trimLines, uid, waitUntil } from './utils'\nimport { assert } from './utils/assert'\n\nexport type { PageAgentConfig }\nexport { tool, type PageAgentTool } from './tools'\n\nexport interface AgentBrain {\n\t// thinking?: string\n\tevaluation_previous_goal: string\n\tmemory: string\n\tnext_goal: string\n}\n\n/**\n * MacroTool input structure\n */\nexport interface MacroToolInput {\n\tevaluation_previous_goal?: string\n\tmemory?: string\n\tnext_goal?: string\n\taction: Record<string, any>\n}\n\n/**\n * MacroTool output structure\n */\nexport interface MacroToolResult {\n\tinput: MacroToolInput\n\toutput: string\n}\n\nexport interface AgentHistory {\n\tbrain: AgentBrain\n\taction: {\n\t\tname: string\n\t\tinput: any\n\t\toutput: string\n\t}\n\tusage: {\n\t\tpromptTokens: number\n\t\tcompletionTokens: number\n\t\ttotalTokens: number\n\t\tcachedTokens?: number\n\t\treasoningTokens?: number\n\t}\n}\n\nexport interface ExecutionResult {\n\tsuccess: boolean\n\tdata: string\n\thistory: AgentHistory[]\n}\n\nexport class PageAgent extends EventTarget {\n\tconfig: PageAgentConfig\n\tid = uid()\n\tpanel: Panel\n\ttools: typeof tools\n\tpaused = false\n\tdisposed = false\n\ttask = ''\n\ttaskId = ''\n\n\t#llm: LLM\n\t#totalWaitTime = 0\n\t#abortController = new AbortController()\n\t#llmRetryListener: ((e: Event) => void) | null = null\n\t#llmErrorListener: ((e: Event) => void) | null = null\n\t#beforeUnloadListener: ((e: Event) => void) | null = null\n\n\t/** PageController for DOM operations */\n\tpageController: PageController\n\n\t/** Fullscreen mask */\n\tmask = new SimulatorMask()\n\t/** History records */\n\thistory: AgentHistory[] = []\n\n\tconstructor(config: PageAgentConfig = {}) {\n\t\tsuper()\n\n\t\tthis.config = config\n\t\tthis.#llm = new LLM(this.config)\n\t\tthis.panel = new Panel({\n\t\t\tlanguage: this.config.language,\n\t\t\tonExecuteTask: (task) => this.execute(task),\n\t\t\tonStop: () => this.dispose(),\n\t\t\tonPauseToggle: () => {\n\t\t\t\tthis.paused = !this.paused\n\t\t\t\treturn this.paused\n\t\t\t},\n\t\t\tgetPaused: () => this.paused,\n\t\t})\n\t\tthis.tools = new Map(tools)\n\n\t\t// Initialize PageController with config\n\t\tthis.pageController = new PageController(this.config)\n\n\t\t// Listen to LLM events\n\t\tthis.#llmRetryListener = (e) => {\n\t\t\tconst { current, max } = (e as CustomEvent).detail\n\t\t\tthis.panel.update({ type: 'retry', current, max })\n\t\t}\n\t\tthis.#llmErrorListener = (e) => {\n\t\t\tconst { error } = (e as CustomEvent).detail\n\t\t\tthis.panel.update({ type: 'error', message: `step failed: ${error.message}` })\n\t\t}\n\t\tthis.#llm.addEventListener('retry', this.#llmRetryListener)\n\t\tthis.#llm.addEventListener('error', this.#llmErrorListener)\n\n\t\tif (this.config.customTools) {\n\t\t\tfor (const [name, tool] of Object.entries(this.config.customTools)) {\n\t\t\t\tif (tool === null) {\n\t\t\t\t\tthis.tools.delete(name)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tthis.tools.set(name, tool)\n\t\t\t}\n\t\t}\n\n\t\tif (!this.config.experimentalScriptExecutionTool) {\n\t\t\tthis.tools.delete('execute_javascript')\n\t\t}\n\n\t\tthis.#beforeUnloadListener = (e) => {\n\t\t\tif (!this.disposed) this.dispose('PAGE_UNLOADING')\n\t\t}\n\t\twindow.addEventListener('beforeunload', this.#beforeUnloadListener)\n\t}\n\n\t/**\n\t * @todo maybe return something?\n\t */\n\tasync execute(task: string): Promise<ExecutionResult> {\n\t\tif (!task) throw new Error('Task is required')\n\t\tthis.task = task\n\t\tthis.taskId = uid()\n\n\t\tconst onBeforeStep = this.config.onBeforeStep || (() => void 0)\n\t\tconst onAfterStep = this.config.onAfterStep || (() => void 0)\n\t\tconst onBeforeTask = this.config.onBeforeTask || (() => void 0)\n\t\tconst onAfterTask = this.config.onAfterTask || (() => void 0)\n\n\t\tawait onBeforeTask.call(this)\n\n\t\t// Show mask and panel\n\t\tthis.mask.show()\n\n\t\tthis.panel.show()\n\t\tthis.panel.reset()\n\n\t\tthis.panel.update({ type: 'input', task: this.task })\n\n\t\tif (this.#abortController) {\n\t\t\tthis.#abortController.abort()\n\t\t\tthis.#abortController = new AbortController()\n\t\t}\n\n\t\tthis.history = []\n\n\t\ttry {\n\t\t\tlet step = 0\n\n\t\t\twhile (true) {\n\t\t\t\tawait onBeforeStep.call(this, step)\n\n\t\t\t\tconsole.group(`step: ${step}`)\n\n\t\t\t\t// abort\n\t\t\t\tif (this.#abortController.signal.aborted) throw new Error('AbortError')\n\t\t\t\t// pause\n\t\t\t\tawait waitUntil(() => !this.paused)\n\n\t\t\t\t// Update status to thinking\n\t\t\t\tconsole.log(chalk.blue('Thinking...'))\n\t\t\t\tthis.panel.update({ type: 'thinking' })\n\n\t\t\t\tconst result = await this.#llm.invoke(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trole: 'system',\n\t\t\t\t\t\t\tcontent: this.#getSystemPrompt(),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trole: 'user',\n\t\t\t\t\t\t\tcontent: await this.#assembleUserPrompt(),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t{ AgentOutput: this.#packMacroTool() },\n\t\t\t\t\tthis.#abortController.signal\n\t\t\t\t)\n\n\t\t\t\tconst macroResult = result.toolResult as MacroToolResult\n\t\t\t\tconst input = macroResult.input\n\t\t\t\tconst output = macroResult.output\n\t\t\t\tconst brain = {\n\t\t\t\t\tevaluation_previous_goal: input.evaluation_previous_goal || '',\n\t\t\t\t\tmemory: input.memory || '',\n\t\t\t\t\tnext_goal: input.next_goal || '',\n\t\t\t\t}\n\t\t\t\tconst actionName = Object.keys(input.action)[0]\n\t\t\t\tconst action = {\n\t\t\t\t\tname: actionName,\n\t\t\t\t\tinput: input.action[actionName],\n\t\t\t\t\toutput: output,\n\t\t\t\t}\n\n\t\t\t\tthis.history.push({\n\t\t\t\t\tbrain,\n\t\t\t\t\taction,\n\t\t\t\t\tusage: result.usage,\n\t\t\t\t})\n\n\t\t\t\tconsole.log(chalk.green('Step finished:'), actionName)\n\t\t\t\tconsole.groupEnd()\n\n\t\t\t\tawait onAfterStep.call(this, step, this.history)\n\n\t\t\t\tstep++\n\t\t\t\tif (step > MAX_STEPS) {\n\t\t\t\t\tthis.#onDone('Step count exceeded maximum limit', false)\n\t\t\t\t\tconst result: ExecutionResult = {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tdata: 'Step count exceeded maximum limit',\n\t\t\t\t\t\thistory: this.history,\n\t\t\t\t\t}\n\t\t\t\t\tawait onAfterTask.call(this, result)\n\t\t\t\t\treturn result\n\t\t\t\t}\n\t\t\t\tif (actionName === 'done') {\n\t\t\t\t\tconst success = action.input?.success ?? false\n\t\t\t\t\tconst text = action.input?.text || 'no text provided'\n\t\t\t\t\tconsole.log(chalk.green.bold('Task completed'), success, text)\n\t\t\t\t\tthis.#onDone(text, success)\n\t\t\t\t\tconst result: ExecutionResult = {\n\t\t\t\t\t\tsuccess,\n\t\t\t\t\t\tdata: text,\n\t\t\t\t\t\thistory: this.history,\n\t\t\t\t\t}\n\t\t\t\t\tawait onAfterTask.call(this, result)\n\t\t\t\t\treturn result\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error: unknown) {\n\t\t\tconsole.error('Task failed', error)\n\t\t\tthis.#onDone(String(error), false)\n\t\t\tconst result: ExecutionResult = {\n\t\t\t\tsuccess: false,\n\t\t\t\tdata: String(error),\n\t\t\t\thistory: this.history,\n\t\t\t}\n\t\t\tawait onAfterTask.call(this, result)\n\t\t\treturn result\n\t\t}\n\t}\n\n\t/**\n\t * Merge all tools into a single MacroTool with the following input:\n\t * - thinking: string\n\t * - evaluation_previous_goal: string\n\t * - memory: string\n\t * - next_goal: string\n\t * - action: { toolName: toolInput }\n\t * where action must be selected from tools defined in this.tools\n\t */\n\t#packMacroTool(): Tool<MacroToolInput, MacroToolResult> {\n\t\tconst tools = this.tools\n\n\t\tconst actionSchemas = Array.from(tools.entries()).map(([toolName, tool]) => {\n\t\t\treturn zod.object({\n\t\t\t\t[toolName]: tool.inputSchema,\n\t\t\t})\n\t\t})\n\n\t\tconst actionSchema = zod.union(\n\t\t\tactionSchemas as unknown as [zod.ZodType, zod.ZodType, ...zod.ZodType[]]\n\t\t)\n\n\t\tconst macroToolSchema = zod.object({\n\t\t\t// thinking: zod.string().optional(),\n\t\t\tevaluation_previous_goal: zod.string().optional(),\n\t\t\tmemory: zod.string().optional(),\n\t\t\tnext_goal: zod.string().optional(),\n\t\t\taction: actionSchema,\n\t\t})\n\n\t\treturn {\n\t\t\tinputSchema: macroToolSchema as zod.ZodType<MacroToolInput>,\n\t\t\texecute: async (input: MacroToolInput): Promise<MacroToolResult> => {\n\t\t\t\t// abort\n\t\t\t\tif (this.#abortController.signal.aborted) throw new Error('AbortError')\n\t\t\t\t// pause\n\t\t\t\tawait waitUntil(() => !this.paused)\n\n\t\t\t\tconsole.log(chalk.blue.bold('MacroTool execute'), input)\n\t\t\t\tconst action = input.action\n\n\t\t\t\tconst toolName = Object.keys(action)[0]\n\t\t\t\tconst toolInput = action[toolName]\n\t\t\t\tconst brain = trimLines(`✅: ${input.evaluation_previous_goal}\n\t\t\t\t\t\t💾: ${input.memory}\n\t\t\t\t\t\t🎯: ${input.next_goal}\n\t\t\t\t\t`)\n\n\t\t\t\tconsole.log(brain)\n\t\t\t\tthis.panel.update({ type: 'thinking', text: brain })\n\n\t\t\t\t// Find the corresponding tool\n\t\t\t\tconst tool = tools.get(toolName)\n\t\t\t\tassert(tool, `Tool ${toolName} not found. (@note should have been caught before this!!!)`)\n\n\t\t\t\tconsole.log(chalk.blue.bold(`Executing tool: ${toolName}`), toolInput)\n\t\t\t\tthis.panel.update({ type: 'toolExecuting', toolName, args: toolInput })\n\n\t\t\t\tconst startTime = Date.now()\n\n\t\t\t\t// Execute tool, bind `this` to PageAgent\n\t\t\t\tlet result = await tool.execute.bind(this)(toolInput)\n\n\t\t\t\tconst duration = Date.now() - startTime\n\t\t\t\tconsole.log(chalk.green.bold(`Tool (${toolName}) executed for ${duration}ms`), result)\n\n\t\t\t\tif (toolName === 'wait') {\n\t\t\t\t\tthis.#totalWaitTime += Math.round(toolInput.seconds + duration / 1000)\n\t\t\t\t\tresult += `\\n<sys> You have waited ${this.#totalWaitTime} seconds accumulatively.`\n\t\t\t\t\tif (this.#totalWaitTime >= 3)\n\t\t\t\t\t\tresult += '\\nDo NOT wait any longer unless you have a good reason.\\n'\n\t\t\t\t\tresult += '</sys>'\n\t\t\t\t} else {\n\t\t\t\t\t// For other tools, reset wait time\n\t\t\t\t\tthis.#totalWaitTime = 0\n\t\t\t\t}\n\n\t\t\t\t// Briefly display execution result\n\t\t\t\tthis.panel.update({\n\t\t\t\t\ttype: 'toolCompleted',\n\t\t\t\t\ttoolName,\n\t\t\t\t\targs: toolInput,\n\t\t\t\t\tresult,\n\t\t\t\t\tduration,\n\t\t\t\t})\n\n\t\t\t\t// Wait a moment to let user see the result\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 100))\n\n\t\t\t\t// Return structured result\n\t\t\t\treturn {\n\t\t\t\t\tinput,\n\t\t\t\t\toutput: result,\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t}\n\n\t/**\n\t * Get system prompt, dynamically replace language settings based on configured language\n\t */\n\t#getSystemPrompt(): string {\n\t\tlet systemPrompt = SYSTEM_PROMPT\n\n\t\tconst targetLanguage = this.config.language === 'zh-CN' ? '中文' : 'English'\n\t\tsystemPrompt = systemPrompt.replace(\n\t\t\t/Default working language: \\*\\*.*?\\*\\*/,\n\t\t\t`Default working language: **${targetLanguage}**`\n\t\t)\n\n\t\treturn systemPrompt\n\t}\n\n\tasync #assembleUserPrompt(): Promise<string> {\n\t\tlet prompt = ''\n\n\t\t// <agent_history>\n\t\t// - <step_>\n\n\t\tprompt += '<agent_history>\\n'\n\n\t\tthis.history.forEach((history, index) => {\n\t\t\tprompt += `<step_${index + 1}>\n\t\t\t\tEvaluation of Previous Step: ${history.brain.evaluation_previous_goal}\n\t\t\t\tMemory: ${history.brain.memory}\n\t\t\t\tNext Goal: ${history.brain.next_goal}\n\t\t\t\tAction Results: ${history.action.output}\n\t\t\t\t</step_${index + 1}>\n\t\t\t`\n\t\t})\n\n\t\tprompt += '</agent_history>\\n\\n'\n\n\t\t// <agent_state>\n\t\t// - <user_request>\n\t\t// - <step_info>\n\t\t// <agent_state>\n\n\t\tprompt += `<agent_state>\n\t\t\t<user_request>\n\t\t\t${this.task}\n\t\t\t</user_request>\n\t\t\t<step_info>\n\t\t\tStep ${this.history.length + 1} of ${MAX_STEPS} max possible steps\n\t\t\tCurrent date and time: ${new Date().toISOString()}\n\t\t\t</step_info>\n\t\t\t</agent_state>\n\t\t`\n\n\t\t// <browser_state>\n\n\t\tprompt += await this.#getBrowserState()\n\n\t\treturn trimLines(prompt)\n\t}\n\n\t#onDone(text: string, success = true) {\n\t\tthis.pageController.cleanUpHighlights()\n\n\t\t// Update panel status\n\t\tif (success) {\n\t\t\tthis.panel.update({ type: 'output', text })\n\t\t} else {\n\t\t\tthis.panel.update({ type: 'error', message: text })\n\t\t}\n\n\t\t// Task completed\n\t\tthis.panel.update({ type: 'completed' })\n\n\t\tthis.mask.hide()\n\n\t\tthis.#abortController.abort()\n\t}\n\n\tasync #getBrowserState(): Promise<string> {\n\t\tconst pageUrl = await this.pageController.getCurrentUrl()\n\t\tconst pageTitle = await this.pageController.getPageTitle()\n\t\tconst pi = await this.pageController.getPageInfo()\n\t\tconst viewportExpansion = await this.pageController.getViewportExpansion()\n\n\t\tthis.mask.wrapper.style.pointerEvents = 'none'\n\t\tawait this.pageController.updateTree()\n\t\tthis.mask.wrapper.style.pointerEvents = 'auto'\n\n\t\tconst simplifiedHTML = await this.pageController.getSimplifiedHTML()\n\n\t\tlet prompt = trimLines(`<browser_state>\n\t\t\tCurrent Page: [${pageTitle}](${pageUrl})\n\n\t\t\tPage info: ${pi.viewport_width}x${pi.viewport_height}px viewport, ${pi.page_width}x${pi.page_height}px total page size, ${pi.pages_above.toFixed(1)} pages above, ${pi.pages_below.toFixed(1)} pages below, ${pi.total_pages.toFixed(1)} total pages, at ${(pi.current_page_position * 100).toFixed(0)}% of page\n\n\t\t\t${viewportExpansion === -1 ? 'Interactive elements from top layer of the current page (full page):' : 'Interactive elements from top layer of the current page inside the viewport:'}\n\n\t\t`)\n\n\t\t// Page header info\n\t\tconst has_content_above = pi.pixels_above > 4\n\t\tif (has_content_above && viewportExpansion !== -1) {\n\t\t\tprompt += `... ${pi.pixels_above} pixels above (${pi.pages_above.toFixed(1)} pages) - scroll to see more ...\\n`\n\t\t} else {\n\t\t\tprompt += `[Start of page]\\n`\n\t\t}\n\n\t\t// Current viewport info\n\t\tprompt += simplifiedHTML\n\t\tprompt += `\\n`\n\n\t\t// Page footer info\n\t\tconst has_content_below = pi.pixels_below > 4\n\t\tif (has_content_below && viewportExpansion !== -1) {\n\t\t\tprompt += `... ${pi.pixels_below} pixels below (${pi.pages_below.toFixed(1)} pages) - scroll to see more ...\\n`\n\t\t} else {\n\t\t\tprompt += `[End of page]\\n`\n\t\t}\n\n\t\tprompt += `</browser_state>\\n`\n\n\t\treturn prompt\n\t}\n\n\tdispose(reason?: string) {\n\t\tconsole.log('Disposing PageAgent...')\n\t\tthis.disposed = true\n\t\tthis.pageController.dispose()\n\t\tthis.panel.dispose()\n\t\tthis.mask.dispose()\n\t\tthis.history = []\n\t\tthis.#abortController.abort(reason ?? 'PageAgent disposed')\n\n\t\t// Clean up LLM event listeners\n\t\tif (this.#llmRetryListener) {\n\t\t\tthis.#llm.removeEventListener('retry', this.#llmRetryListener)\n\t\t\tthis.#llmRetryListener = null\n\t\t}\n\t\tif (this.#llmErrorListener) {\n\t\t\tthis.#llm.removeEventListener('error', this.#llmErrorListener)\n\t\t\tthis.#llmErrorListener = null\n\t\t}\n\n\t\t// Clean up window event listeners\n\t\tif (this.#beforeUnloadListener) {\n\t\t\twindow.removeEventListener('beforeunload', this.#beforeUnloadListener)\n\t\t\tthis.#beforeUnloadListener = null\n\t\t}\n\n\t\tthis.config.onDispose?.call(this, reason)\n\t}\n}\n"],"names":["__defProp","__name","waitFor","error","tool","tools","result","input","__privateAdd","__publicField","__privateSet","__privateGet","__privateMethod","output"],"mappings":"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"}