UNPKG

@ui-tars/operator-browser

Version:
1 lines 43.7 kB
{"version":3,"file":"browser-operator.mjs","sources":["webpack://@ui-tars/operator-browser/./src/browser-operator.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { LocalBrowser } from '@agent-infra/browser';\nimport { ConsoleLogger, Logger, defaultLogger } from '@agent-infra/logger';\nimport { Operator, parseBoxToScreenCoords } from '@ui-tars/sdk/core';\nimport {\n Page,\n KeyInput,\n BrowserType,\n BrowserInterface,\n RemoteBrowser,\n} from '@agent-infra/browser';\nimport type {\n ScreenshotOutput,\n ExecuteParams,\n ExecuteOutput,\n} from '@ui-tars/sdk/core';\nimport { BrowserOperatorOptions, SearchEngine } from './types';\nimport { UIHelper } from './ui-helper';\nimport { BrowserFinder } from '@agent-infra/browser';\n\nimport { KEY_MAPPINGS } from './key-map';\nimport { shortcuts } from './shortcuts';\n\n/**\n * BrowserOperator class that extends the base Operator\n * Provides functionality to control a browser instance for UI automation\n */\nexport class BrowserOperator extends Operator {\n private browser: BrowserInterface;\n\n private currentPage: Page | null = null;\n\n private logger: Logger;\n\n private uiHelper: UIHelper;\n\n private highlightClickableElements = true;\n\n private showActionInfo = true;\n\n private showWaterFlowEffect = true;\n\n private deviceScaleFactor?: number;\n\n /**\n * Creates a new BrowserOperator instance\n * @param options Configuration options for the browser operator\n */\n constructor(private options: BrowserOperatorOptions) {\n super();\n this.browser = this.options.browser;\n\n this.logger = (this.options.logger ?? defaultLogger).spawn(\n '[BrowserOperator]',\n );\n\n // Initialize UIHelper with a function that gets the active page\n this.uiHelper = new UIHelper(() => this.getActivePage(), this.logger);\n\n if (options.highlightClickableElements === false) {\n this.highlightClickableElements = false;\n }\n\n if (options.showActionInfo === false) {\n this.showActionInfo = false;\n }\n\n if (options.showWaterFlow === false) {\n this.showWaterFlowEffect = false;\n }\n }\n\n /**\n * Gets the currently active browser page\n * @returns Promise resolving to the active Page object\n * @throws Error if no active page is found\n */\n private async getActivePage(): Promise<Page> {\n const page = await this.browser.getActivePage();\n if (!page) {\n throw new Error('No active page found');\n }\n if (this.currentPage !== page) {\n this.currentPage = page;\n }\n return page;\n }\n\n public setHighlightClickableElements(enable: boolean): void {\n this.highlightClickableElements = enable;\n this.logger.info(\n `Clickable elements highlighting ${enable ? 'enabled' : 'disabled'}`,\n );\n }\n\n /**\n * Sets whether to show the water flow effect during screenshots\n * @param enable Whether to enable the water flow effect\n */\n public setShowWaterFlow(enable: boolean): void {\n this.showWaterFlowEffect = enable;\n this.logger.info(`Water flow effect ${enable ? 'enabled' : 'disabled'}`);\n }\n\n /**\n * Takes a screenshot of the current browser viewport\n * @returns Promise resolving to screenshot data\n */\n public async screenshot(): Promise<ScreenshotOutput> {\n this.logger.info('Starting screenshot...');\n\n if (this.showWaterFlowEffect) {\n this.uiHelper.showWaterFlow();\n }\n\n const page = await this.getActivePage();\n\n try {\n // Get deviceScaleFactor\n const deviceScaleFactor = await this.getDeviceScaleFactor();\n this.logger.info('DeviceScaleFactor:', deviceScaleFactor);\n\n // Highlight clickable elements before taking screenshot if enabled\n if (this.highlightClickableElements) {\n this.logger.info('Highlighting clickable elements...');\n await this.uiHelper.highlightClickableElements();\n // Give the browser a moment to render the highlights\n await this.delay(300);\n }\n\n // Take screenshot of visible area only\n this.logger.info('Taking screenshot...');\n const startTime = Date.now();\n\n // Take screenshot\n await this.uiHelper.cleanupTemporaryVisuals();\n const buffer = await page.screenshot({\n // https://github.com/puppeteer/puppeteer/issues/7043\n captureBeyondViewport: false,\n encoding: 'base64',\n type: 'jpeg',\n quality: 75,\n fullPage: false, // Capture only the visible area\n });\n\n const duration = Date.now() - startTime;\n this.logger.info(`Screenshot taken in ${duration}ms`);\n\n // Remove highlights after taking screenshot\n // if (this.highlightClickableElements) {\n // await this.uiHelper.removeClickableHighlights();\n // }\n\n const output: ScreenshotOutput = {\n base64: buffer.toString(),\n scaleFactor: deviceScaleFactor || 1,\n };\n\n this.logger.info('Screenshot Info', {\n ...output,\n base64: '<base64>',\n });\n\n try {\n await this.options.onScreenshot?.(output, page);\n } catch (error) {\n this.logger.error('Error in onScreenshot callback:', error);\n }\n return output;\n } catch (error) {\n // Ensure highlights are removed even if screenshot fails\n if (this.highlightClickableElements) {\n await this.uiHelper.removeClickableHighlights();\n }\n this.logger.error('Screenshot failed:', error);\n throw error;\n }\n }\n\n /**\n * Executes a specified action based on the parsed prediction\n * @param params Parameters containing action details\n * @returns Promise resolving to execution output\n */\n public async execute(params: ExecuteParams): Promise<ExecuteOutput> {\n this.logger.info('Starting execute with params:', params);\n\n const { parsedPrediction, screenWidth, screenHeight } = params;\n\n // Show action info in UI\n if (this.showActionInfo) {\n await this.uiHelper?.showActionInfo(parsedPrediction);\n }\n\n // Add this line to trigger plugin hook\n await this.options.onOperatorAction?.(parsedPrediction);\n\n const { action_type, action_inputs } = parsedPrediction;\n const startBoxStr = action_inputs?.start_box || '';\n\n const deviceScaleFactor = await this.getDeviceScaleFactor();\n const coords = parseBoxToScreenCoords({\n boxStr: startBoxStr,\n screenWidth,\n screenHeight,\n });\n const startX = coords.x ? coords.x / deviceScaleFactor : null;\n const startY = coords.y ? coords.y / deviceScaleFactor : null;\n\n this.logger.info(`Parsed coordinates: (${startX}, ${startY})`);\n this.logger.info(`Executing action: ${action_type}`);\n\n try {\n await this.getActivePage();\n\n switch (action_type) {\n case 'drag':\n await this.handleDrag(\n action_inputs,\n deviceScaleFactor,\n screenWidth,\n screenHeight,\n );\n break;\n\n case 'navigate':\n if (!action_inputs.content) {\n throw new Error('No target url specified for navigation');\n }\n await this.handleNavigate({ url: action_inputs.content });\n break;\n case 'navigate_back':\n await this.handleNavigateBack();\n break;\n\n case 'click':\n case 'left_click':\n case 'left_single':\n if (startX && startY) await this.handleClick(startX, startY);\n else throw new Error(`Missing startX(${startX}) or startY${startX}.`);\n break;\n\n case 'double_click':\n case 'left_double':\n if (startX && startY) await this.handleDoubleClick(startX, startY);\n else throw new Error(`Missing startX(${startX}) or startY${startX}.`);\n break;\n\n case 'right_click':\n if (startX && startY) await this.handleRightClick(startX, startY);\n else throw new Error(`Missing startX(${startX}) or startY${startX}.`);\n break;\n\n case 'type':\n await this.handleType(action_inputs);\n await this.delay(1000);\n break;\n\n case 'hotkey':\n await this.handleHotkey(action_inputs);\n break;\n\n case 'press':\n await this.handlePress(action_inputs);\n break;\n\n case 'release':\n await this.handleRelease(action_inputs);\n break;\n\n case 'scroll':\n await this.handleScroll(action_inputs);\n break;\n\n case 'wait':\n await this.delay(5000);\n break;\n\n case 'finished':\n if (this.options.onFinalAnswer && parsedPrediction.thought) {\n await this.options.onFinalAnswer(parsedPrediction.thought);\n }\n this.uiHelper.cleanup();\n break;\n\n case 'call_user':\n this.uiHelper.cleanup();\n break;\n\n case 'user_stop':\n this.uiHelper.cleanup();\n break;\n\n default:\n this.logger.warn(\n `[BrowserOperator] Unsupported action: ${action_type}`,\n );\n }\n this.logger.info(`Action ${action_type} completed successfully`);\n } catch (error) {\n this.logger.error(`Failed to execute ${action_type}:`, error);\n await this.cleanup();\n throw error;\n }\n\n return {\n // Hand it over to the upper layer to avoid redundancy\n // @ts-expect-error fix type later\n startX,\n startY,\n action_inputs,\n };\n }\n\n private async handleClick(x: number, y: number) {\n this.logger.info(`Clicking at (${x}, ${y})`);\n const page = await this.getActivePage();\n\n try {\n await this.uiHelper?.showClickIndicator(x, y);\n await this.delay(300);\n\n await page.mouse.move(x, y);\n await this.delay(100);\n await page.mouse.click(x, y);\n\n await this.delay(800);\n this.logger.info('Click completed');\n } catch (error) {\n this.logger.error('Click operation failed:', error);\n throw error;\n }\n }\n\n private async handleDoubleClick(x: number, y: number) {\n this.logger.info(`Double clicking at (${x}, ${y})`);\n const page = await this.getActivePage();\n\n try {\n // Show indicator first\n await this.uiHelper?.showClickIndicator(x, y);\n await this.delay(300); // 增加延时,原来是 100\n\n // Perform double click\n await page.mouse.move(x, y);\n await this.delay(100); // 增加延时,原来是 50\n await page.mouse.click(x, y, { clickCount: 2 });\n\n await this.delay(800); // 增加延时,原来是 500\n this.logger.info('Double click completed');\n } catch (error) {\n this.logger.error('Double click operation failed:', error);\n throw error;\n }\n }\n\n private async handleRightClick(x: number, y: number) {\n const page = await this.getActivePage();\n\n this.logger.info(`Right clicking at (${x}, ${y})`);\n\n try {\n // Show indicator first\n await this.uiHelper?.showClickIndicator(x, y);\n await this.delay(300); // 增加延时,原来是 100\n\n // Perform right click\n await page.mouse.move(x, y);\n await this.delay(100); // 增加延时,原来是 50\n await page.mouse.click(x, y, { button: 'right' });\n\n await this.delay(800); // 增加延时,原来是 500\n this.logger.info('Right click completed');\n } catch (error) {\n this.logger.error('Right click operation failed:', error);\n throw error;\n }\n }\n\n private async handleType(inputs: Record<string, any>) {\n const page = await this.getActivePage();\n\n const content = inputs.content?.trim();\n if (!content) {\n this.logger.warn('No content to type');\n return;\n }\n\n this.logger.info('Typing content:', content);\n const stripContent = content.replace(/\\\\n$/, '').replace(/\\n$/, '');\n\n // Type each character with a faster random delay\n await page.keyboard.type(stripContent, { delay: 20 + Math.random() * 30 });\n\n if (content.endsWith('\\n') || content.endsWith('\\\\n')) {\n // Reduced pause before Enter\n await this.delay(50);\n\n this.logger.info('Pressing Enter after content');\n\n await page.keyboard.press('Enter');\n this.logger.info('Typing completed');\n\n await this.waitForPossibleNavigation(page);\n }\n }\n\n private async handleHotkey(inputs: Record<string, any>) {\n const page = await this.getActivePage();\n\n const keyStr = inputs?.key || inputs?.hotkey;\n if (!keyStr) {\n this.logger.warn('No hotkey specified');\n throw new Error(`No hotkey specified`);\n }\n\n this.logger.info(`Executing hotkey: ${keyStr}`);\n\n const keys = keyStr.split(/[\\s+]/);\n const normalizedKeys: KeyInput[] = keys.map((key: string) => {\n const lowercaseKey = key.toLowerCase();\n const keyInput = KEY_MAPPINGS[lowercaseKey];\n\n if (keyInput) {\n return keyInput;\n }\n\n throw new Error(`Unsupported key: ${key}`);\n });\n\n this.logger.info(`Normalized keys:`, normalizedKeys);\n\n await shortcuts(page, normalizedKeys, this.options.browserType);\n\n // For hotkey combinations that may trigger navigation,\n // wait for navigation to complete\n const navigationKeys = ['Enter', 'F5'];\n if (normalizedKeys.some((key: string) => navigationKeys.includes(key))) {\n this.logger.info('Waiting for possible navigation after hotkey');\n await this.waitForPossibleNavigation(page);\n } else {\n await this.delay(500);\n }\n\n this.logger.info('Hotkey execution completed');\n }\n\n private async handlePress(inputs: Record<string, any>) {\n const page = await this.getActivePage();\n\n const keyStr = inputs?.key;\n if (!keyStr) {\n this.logger.warn('No key specified for press');\n throw new Error(`No key specified for press`);\n }\n\n this.logger.info(`Pressing key: ${keyStr}`);\n\n const keys = keyStr.split(/[\\s+]/);\n const normalizedKeys: KeyInput[] = keys.map((key: string) => {\n const lowercaseKey = key.toLowerCase();\n const keyInput = KEY_MAPPINGS[lowercaseKey];\n\n if (keyInput) {\n return keyInput;\n }\n\n throw new Error(`Unsupported key: ${key}`);\n });\n\n this.logger.info(`Normalized keys for press:`, normalizedKeys);\n\n // Only press the keys\n for (const key of normalizedKeys) {\n await page.keyboard.down(key);\n await this.delay(50); // 添加小延迟确保按键稳定\n }\n\n this.logger.info('Press operation completed');\n }\n\n private async handleRelease(inputs: Record<string, any>) {\n const page = await this.getActivePage();\n\n const keyStr = inputs?.key;\n if (!keyStr) {\n this.logger.warn('No key specified for release');\n throw new Error(`No key specified for release`);\n }\n\n this.logger.info(`Releasing key: ${keyStr}`);\n\n const keys = keyStr.split(/[\\s+]/);\n const normalizedKeys: KeyInput[] = keys.map((key: string) => {\n const lowercaseKey = key.toLowerCase();\n const keyInput = KEY_MAPPINGS[lowercaseKey];\n\n if (keyInput) {\n return keyInput;\n }\n\n throw new Error(`Unsupported key: ${key}`);\n });\n\n this.logger.info(`Normalized keys for release:`, normalizedKeys);\n\n // Release the keys\n for (const key of normalizedKeys) {\n await page.keyboard.up(key);\n await this.delay(50); // 添加小延迟确保按键稳定\n }\n\n // For hotkey combinations that may trigger navigation,\n // wait for navigation to complete\n const navigationKeys = ['Enter', 'F5'];\n if (normalizedKeys.some((key: string) => navigationKeys.includes(key))) {\n this.logger.info('Waiting for possible navigation after key release');\n await this.waitForPossibleNavigation(page);\n } else {\n await this.delay(500);\n }\n\n this.logger.info('Release operation completed');\n }\n\n private async handleScroll(inputs: Record<string, any>) {\n const page = await this.getActivePage();\n\n const { direction } = inputs;\n const scrollAmount = 500;\n\n this.logger.info(`Scrolling ${direction} by ${scrollAmount}px`);\n\n switch (direction?.toLowerCase()) {\n case 'up':\n await page.mouse.wheel({ deltaY: -scrollAmount });\n break;\n case 'down':\n await page.mouse.wheel({ deltaY: scrollAmount });\n break;\n default:\n this.logger.warn(`Unsupported scroll direction: ${direction}`);\n return;\n }\n this.logger.info('Scroll completed');\n }\n\n private async delay(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private async handleNavigate(inputs: Record<string, any>): Promise<void> {\n const page = await this.getActivePage();\n let { url } = inputs;\n // If the url does not start with http:// or If the url does not start with http:// or URL_ADDRESS automatically add https://\n if (!/^https?:\\/\\//i.test(url)) {\n url = 'https://' + url;\n }\n\n this.logger.info(`Navigating to: ${url}`);\n await page.goto(url, {\n waitUntil: [], // Wait for no event\n });\n this.logger.info('Navigation completed');\n }\n\n private async handleDrag(\n inputs: Record<string, any>,\n deviceScaleFactor: number,\n screenWidth: number,\n screenHeight: number,\n ) {\n const page = await this.getActivePage();\n\n // Get start and end points from inputs\n const startBoxStr = inputs.start_box || '';\n const endBoxStr = inputs.end_box || '';\n\n if (!startBoxStr || !endBoxStr) {\n throw new Error('Missing start_point or end_point for drag operation');\n }\n\n // Parse coordinates\n const startCoords = parseBoxToScreenCoords({\n boxStr: startBoxStr,\n screenWidth,\n screenHeight,\n });\n const endCoords = parseBoxToScreenCoords({\n boxStr: endBoxStr,\n screenWidth,\n screenHeight,\n });\n\n // Adjust for device scale factor\n const startX = startCoords.x ? startCoords.x / deviceScaleFactor : null;\n const startY = startCoords.y ? startCoords.y / deviceScaleFactor : null;\n const endX = endCoords.x ? endCoords.x / deviceScaleFactor : null;\n const endY = endCoords.y ? endCoords.y / deviceScaleFactor : null;\n\n if (!startX || !startY || !endX || !endY) {\n throw new Error('Invalid coordinates for drag operation');\n }\n\n this.logger.info(\n `Dragging from (${startX}, ${startY}) to (${endX}, ${endY})`,\n );\n\n try {\n // Show drag indicators\n await this.uiHelper?.showDragIndicator(startX, startY, endX, endY);\n await this.delay(300);\n\n // Perform the drag operation\n await page.mouse.move(startX, startY);\n await this.delay(100);\n await page.mouse.down();\n\n // Perform the drag movement in steps for a more natural drag\n const steps = 10;\n for (let i = 1; i <= steps; i++) {\n const stepX = startX + ((endX - startX) * i) / steps;\n const stepY = startY + ((endY - startY) * i) / steps;\n await page.mouse.move(stepX, stepY);\n await this.delay(30); // Short delay between steps\n }\n\n await this.delay(100);\n await page.mouse.up();\n\n await this.delay(800);\n this.logger.info('Drag completed');\n } catch (error) {\n this.logger.error('Drag operation failed:', error);\n throw error;\n }\n }\n\n private async handleNavigateBack(): Promise<void> {\n const page = await this.getActivePage();\n this.logger.info(`handleNavigateBack`);\n await page.goBack();\n this.logger.info('handleNavigateBack completed');\n }\n\n /**\n * A helper function to wait for possible navigation to complete.\n * @param page\n */\n private async waitForPossibleNavigation(page: Page): Promise<void> {\n const navigationPromise = new Promise<void>((resolve) => {\n const onStarted = () => {\n this.logger.info('Navigation started');\n resolve();\n page.off('framenavigated', onStarted);\n };\n page.on('framenavigated', onStarted);\n\n setTimeout(() => {\n page.off('framenavigated', onStarted);\n resolve();\n }, 5000);\n });\n\n await navigationPromise;\n this.logger.info('Navigation completed or timed out');\n }\n\n private async getDeviceScaleFactor() {\n if (this.deviceScaleFactor) {\n return this.deviceScaleFactor;\n }\n\n this.logger.info('Getting deviceScaleFactor info...');\n const page = await this.getActivePage();\n\n const scaleFactor = page.viewport()?.deviceScaleFactor;\n if (scaleFactor) {\n this.deviceScaleFactor = scaleFactor;\n return scaleFactor;\n }\n\n const devicePixelRatio = await page.evaluate(() => window.devicePixelRatio);\n if (devicePixelRatio) {\n this.deviceScaleFactor = devicePixelRatio;\n return devicePixelRatio;\n }\n\n throw Error('Get deviceScaleFactor failed.');\n }\n\n public async cleanup(): Promise<void> {\n this.logger.info('Starting cleanup...');\n await this.uiHelper.cleanup();\n if (this.currentPage) {\n await this.currentPage.close();\n this.currentPage = null;\n this.logger.info('Page closed successfully');\n }\n this.logger.info('Cleanup completed');\n }\n}\n\nexport class DefaultBrowserOperator extends BrowserOperator {\n private static instance: DefaultBrowserOperator | null = null;\n private static browser: LocalBrowser | null = null;\n private static browserPath: string;\n private static browserType: BrowserType;\n private static logger: Logger | null = null;\n\n private constructor(options: BrowserOperatorOptions) {\n super(options);\n }\n\n /**\n * Check whether the local environment has a browser available\n * @returns {boolean}\n */\n public static hasBrowser(browser?: BrowserType): boolean {\n try {\n if (this.browserPath) {\n return true;\n }\n\n if (!this.logger) {\n this.logger = new ConsoleLogger('[DefaultBrowserOperator]');\n }\n\n const browserFinder = new BrowserFinder(this.logger);\n const browserData = browserFinder.findBrowser(browser);\n this.browserPath = browserData.path;\n this.browserType = browserData.type;\n\n return true;\n } catch (error) {\n if (this.logger) {\n this.logger.error('No available browser found:', error);\n }\n return false;\n }\n }\n\n public static async getInstance(\n highlight = false,\n showActionInfo = false,\n showWaterFlow = false,\n isCallUser = false,\n searchEngine = 'google' as SearchEngine,\n ): Promise<DefaultBrowserOperator> {\n if (!this.logger) {\n this.logger = new ConsoleLogger('[DefaultBrowserOperator]');\n }\n\n if (this.browser) {\n const isAlive = await this.browser.isBrowserAlive();\n if (!isAlive) {\n this.browser = null;\n this.instance = null;\n }\n }\n\n if (!this.browser) {\n this.browser = new LocalBrowser({ logger: this.logger });\n await this.browser.launch({\n executablePath: this.browserPath,\n browserType: this.browserType,\n });\n }\n\n if (!this.instance) {\n this.instance = new DefaultBrowserOperator({\n browser: this.browser,\n browserType: this.browserType,\n logger: this.logger,\n highlightClickableElements: highlight,\n showActionInfo: showActionInfo,\n showWaterFlow: showWaterFlow,\n });\n }\n\n if (!isCallUser) {\n const openingPage = await this.browser?.createPage();\n const searchEngineUrls = {\n [SearchEngine.GOOGLE]: 'https://www.google.com/',\n [SearchEngine.BING]: 'https://www.bing.com/',\n [SearchEngine.BAIDU]: 'https://www.baidu.com/',\n };\n const targetUrl = searchEngineUrls[searchEngine];\n await openingPage?.goto(targetUrl, {\n waitUntil: 'networkidle2',\n });\n }\n\n this.instance.setHighlightClickableElements(highlight);\n\n return this.instance;\n }\n\n public static async destroyInstance(): Promise<void> {\n if (this.instance) {\n await this.instance.cleanup();\n if (this.browser) {\n await this.browser.close();\n this.browser = null;\n }\n this.instance = null;\n }\n }\n}\n\nexport class RemoteBrowserOperator extends BrowserOperator {\n private static instance: RemoteBrowserOperator | null = null;\n private static browser: RemoteBrowser | null = null;\n private static browserType: BrowserType;\n private static logger: Logger | null = null;\n\n private constructor(options: BrowserOperatorOptions) {\n super(options);\n }\n\n public static async getInstance(\n wsEndpoint: string,\n highlight = false,\n showActionInfo = false,\n showWaterFlow = false,\n isCallUser = false,\n // searchEngine = 'baidu' as SearchEngine,\n ): Promise<DefaultBrowserOperator> {\n if (!this.logger) {\n this.logger = new ConsoleLogger('[RemoteBrowserOperator]');\n }\n\n this.browser = new RemoteBrowser({\n wsEndpoint: wsEndpoint,\n logger: this.logger,\n });\n await this.browser.launch();\n\n this.instance = new RemoteBrowserOperator({\n browser: this.browser,\n browserType: this.browserType,\n logger: this.logger,\n highlightClickableElements: highlight,\n showActionInfo: showActionInfo,\n showWaterFlow: showWaterFlow,\n });\n\n this.instance.setHighlightClickableElements(highlight);\n\n return this.instance;\n }\n\n public static async destroyInstance(): Promise<void> {\n if (this.instance) {\n await this.instance.cleanup();\n if (this.browser) {\n await this.browser.close();\n this.browser = null;\n }\n this.instance = null;\n }\n }\n}\n"],"names":["BrowserOperator","Operator","page","Error","enable","deviceScaleFactor","startTime","Date","buffer","duration","output","_this_options","error","params","parsedPrediction","screenWidth","screenHeight","_this_uiHelper","action_type","action_inputs","startBoxStr","coords","parseBoxToScreenCoords","startX","startY","x","y","inputs","_inputs_content","content","stripContent","Math","keyStr","keys","normalizedKeys","key","lowercaseKey","keyInput","KEY_MAPPINGS","shortcuts","navigationKeys","direction","scrollAmount","ms","Promise","resolve","setTimeout","url","endBoxStr","startCoords","endCoords","endX","endY","steps","i","stepX","stepY","navigationPromise","onStarted","_page_viewport","scaleFactor","devicePixelRatio","window","options","defaultLogger","UIHelper","DefaultBrowserOperator","browser","ConsoleLogger","browserFinder","BrowserFinder","browserData","highlight","showActionInfo","showWaterFlow","isCallUser","searchEngine","isAlive","LocalBrowser","_this_browser","openingPage","searchEngineUrls","SearchEngine","targetUrl","RemoteBrowserOperator","wsEndpoint","RemoteBrowser"],"mappings":"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"}