{"version":3,"sources":["../src/index.ts","../src/browser.ts","../src/util.ts","../src/planners/anthropic.ts"],"sourcesContent":["import type { BrowserAction, BrowserAgentOptions, BrowserState, BrowserStep, Coordinate, ScrollBar, BrowserGoalState } from './browser';\nimport { BrowserAgent, ActionPlanner } from './browser';\nimport { AnthropicPlanner } from './planners/anthropic';\nimport { pauseForInput } from './util';\n\nexport { \n    BrowserAction, \n    BrowserState, \n    BrowserStep, \n    Coordinate,\n    ScrollBar,\n    BrowserGoalState,\n    BrowserAgentOptions,\n    BrowserAgent, \n    ActionPlanner, \n    AnthropicPlanner,\n    pauseForInput\n};\n","import { WebDriver, Origin } from \"selenium-webdriver\";\nimport { parseXdotool, pauseForInput } from './util';\n\nexport type BrowserGoalState = 'initial' | 'running' | 'success' | 'failed';\n\nexport interface BrowserState {\n    screenshot: string;\n    height: number;\n    width: number;\n    scrollbar: ScrollBar;\n    tabs: BrowserTab[];\n    active_tab: string;\n    mouse: Coordinate;\n}\n\nexport interface ScrollBar {\n    offset: number;\n    height: number;\n}\n\nexport interface BrowserTab {\n    handle: string;\n    url: string;\n    title: string;\n    active: boolean;\n    new: boolean;\n    id: number;\n}\n\nexport interface BrowserAction {\n    action: \"success\" | \"failure\" | \"key\" | \"type\" | \"mouse_move\" | \"left_click\" | \"left_click_drag\" |\n    \"right_click\" | \"middle_click\" | \"double_click\" | \"screenshot\" | \"cursor_position\" | \"scroll_up\" | \n    \"scroll_down\" | \"switch_tab\";\n    coordinate?: [number, number];\n    text?: string;\n    reasoning: string;\n    id: string;\n}\n\nexport interface BrowserStep {\n    state: BrowserState;\n    action: BrowserAction;\n}\n\nexport interface Coordinate {\n    x: number;\n    y: number;\n}\n\nexport abstract class ActionPlanner {\n    public abstract planAction(goal: string, additionalContext: string, additionalInstructions: string[],\n        currentState: BrowserState, sessionHistory: BrowserStep[]): Promise<BrowserAction>;\n}\n\nexport interface BrowserAgentOptions {\n    additionalContext?: string | Record<string, any>;\n    additionalInstructions?: string[];\n    waitAfterStepMS?: number;\n    pauseAfterEachAction?: boolean;\n    maxSteps?: number;\n}\n\nexport class BrowserAgent {\n    public readonly driver: WebDriver;\n    public readonly planner: ActionPlanner;\n    public readonly goal: string;\n    public additionalContext: string = \"None\";\n    public additionalInstructions: string[] = [];\n    public waitAfterStepMS: number = 500;\n    public pauseAfterEachAction: boolean = false;\n    public maxSteps: number = 50;\n    private _status: BrowserGoalState = 'initial';\n    public readonly history: BrowserStep[] = [];\n    public tabs: Record<string, BrowserTab> = {};\n\n    constructor(driver: WebDriver, actionPlanner: ActionPlanner, goal: string, options?: BrowserAgentOptions) {\n        this.driver = driver;\n        this.planner = actionPlanner;\n        this.goal = goal;\n\n        if (options) {\n            if (options.additionalContext !== undefined) {\n                if (typeof options.additionalContext !== \"string\") {\n                    this.additionalContext = JSON.stringify(options.additionalContext);\n                } else {\n                    this.additionalContext = options.additionalContext;\n                }\n            }\n            if (options.additionalInstructions !== undefined) {\n                this.additionalInstructions = options.additionalInstructions;\n            }\n            if (options.waitAfterStepMS !== undefined) {\n                this.waitAfterStepMS = options.waitAfterStepMS;\n            }\n            if (options.pauseAfterEachAction !== undefined) {\n                this.pauseAfterEachAction = options.pauseAfterEachAction;\n            }\n            if (options.maxSteps !== undefined) {\n                this.maxSteps = options.maxSteps;\n            }\n        }\n    }\n\n    public async getState(): Promise<BrowserState> {\n        const size = await this.driver.executeScript('return { x: window.innerWidth, y: window.innerHeight }') as Coordinate;\n        const screenshot = await this.driver.takeScreenshot();\n        const mousePosition = await this.getMousePosition();\n        const scrollPosition = await this.getScrollPosition();\n\n        const tabs = await this.driver.getAllWindowHandles();\n        const currentTab = await this.driver.getWindowHandle();\n        const browserTabs: BrowserTab[] = [];\n\n        for (const tab of tabs) {\n            await this.driver.switchTo().window(tab);\n            const tabUrl = await this.driver.getCurrentUrl();\n            const tabTitle = await this.driver.getTitle();\n            const isActive = tab === currentTab;\n\n            let tabId: number;\n            let isNew: boolean;\n            if (this.tabs[tab]) {\n                tabId = this.tabs[tab].id;\n                isNew = false;\n            } else {\n                tabId = Object.keys(this.tabs).length;\n                isNew = true;\n            }\n\n            const browserTab: BrowserTab = {\n                handle: tab,\n                url: tabUrl,\n                title: tabTitle,\n                active: isActive,\n                new: isNew,\n                id: tabId,\n            };\n\n            this.tabs[tab] = browserTab;\n            browserTabs.push(browserTab);\n        }\n\n        await this.driver.switchTo().window(currentTab);\n\n        return {\n            screenshot: screenshot,\n            height: size.y,\n            width: size.x,\n            scrollbar: scrollPosition,\n            tabs: browserTabs,\n            active_tab: currentTab,\n            mouse: mousePosition,\n        };\n    }\n\n    public async getAction(currentState: BrowserState): Promise<BrowserAction> {\n        return await this.planner.planAction(this.goal, this.additionalContext, this.additionalInstructions, currentState, this.history);\n    }\n\n    public async getScrollPosition(): Promise<ScrollBar> {\n        const [offset, height] = (await this.driver.executeScript('return [window.pageYOffset/document.documentElement.scrollHeight , window.innerHeight/document.documentElement.scrollHeight]')) as [number, number];\n        \n        return {\n            height,\n            offset,\n        };\n    }\n\n    public async getMousePosition(): Promise<Coordinate> {\n        const listenScript = `\n        window.last_mouse_x = 0;\n        window.last_mouse_y = 0;\n        window.addEventListener('mousemove', function onMouseMove(ev) {\n            window.last_mouse_x = ev.clientX;\n            window.last_mouse_y = ev.clientY;\n            window.removeEventListener('mousemove', onMouseMove);\n        });`;\n\n        await this.driver.executeScript(listenScript);\n\n        await this.driver.actions().move({x: 3, y: 3, origin: Origin.POINTER}).perform();\n        await this.driver.actions().move({x: -3, y: -3, origin: Origin.POINTER}).perform();\n        \n        await new Promise(resolve => setTimeout(resolve, 100));\n\n        const [x, y] = (await this.driver.executeScript('return [window.last_mouse_x, window.last_mouse_y]')) as [number, number];\n\n        if (typeof x === 'number' && typeof y === 'number') {\n            return { x, y };\n        }\n\n        return { x: 0, y: 0 };\n    }\n\n    public async takeAction(action: BrowserAction, lastState: BrowserState): Promise<void> {\n        const actions = this.driver.actions({ async: true });\n\n        switch (action.action) {\n            case 'key':\n                if (!action.text) throw new Error('Text is required for key action');\n\n                const parsedKeyStrokes = parseXdotool(action.text);\n                let keyAction = actions;\n                for (const modifier of parsedKeyStrokes.modifiers) {\n                    keyAction = keyAction.keyDown(modifier);\n                }\n                for (const key of parsedKeyStrokes.keys) {\n                    keyAction = keyAction.sendKeys(key);\n                }\n                for (const modifier of parsedKeyStrokes.modifiers.reverse()) {\n                    keyAction = keyAction.keyUp(modifier);\n                }\n                await keyAction.perform();\n                break;\n            case 'type':\n                if (!action.text) throw new Error('Text is required for type action');\n                await actions.sendKeys(action.text).perform();\n                break;\n            case 'mouse_move':\n                if (!action.coordinate) throw new Error('Coordinate is required for mouse_move action');\n                await actions.move({ x: action.coordinate[0], y: action.coordinate[1] }).perform();\n                break;\n            case 'left_click':\n                await actions.click().perform();\n                break;\n            case 'left_click_drag':\n                if (!action.coordinate) throw new Error('Coordinate is required for left_click_drag action');\n                await actions.press().move({ x: action.coordinate[0], y: action.coordinate[1] }).release().perform();\n                break;\n            case 'right_click':\n                await actions.contextClick().perform();\n                break;\n            case 'middle_click':\n                console.log('Middle mouse click not supported');\n                break;\n            case 'double_click':\n                await actions.doubleClick().perform();\n                break;\n            case 'screenshot':\n            case 'cursor_position':\n                break;\n            case 'scroll_down':\n                await this.driver.executeScript(`window.scrollBy(0, ${lastState.height / 2})`);\n                break;\n            case 'scroll_up':\n                await this.driver.executeScript(`window.scrollBy(0, -${lastState.height / 2})`);\n                break;\n            case 'switch_tab':\n                if (!action.text) throw new Error('Text is required for switch_tab action');\n                const targetId = parseInt(action.text);\n                const tabHandle = Object.keys(this.tabs).find(handle => this.tabs[handle].id === targetId);\n                if (!tabHandle) throw new Error(`No tab found with id: ${action.text}`);\n                await this.driver.switchTo().window(tabHandle);\n                break;\n            default:\n                throw new Error(`Unsupported action: ${action.action}`);\n        }\n    }\n\n    public async step(): Promise<void> {\n        const currentState = await this.getState();\n        const nextAction = await this.getAction(currentState);\n\n        if (nextAction.action === 'success') {\n            this._status = 'success';\n            return;\n        } else if (nextAction.action === 'failure') {\n            this._status = 'failed';\n            return;\n        } else {\n            this._status = 'running';\n            await this.takeAction(nextAction, currentState);\n        }\n\n        this.history.push({\n            state: currentState,\n            action: nextAction,\n        });\n    }\n\n    public async start(): Promise<void> {\n        await this.driver.actions().move({ x: 1, y: 1, origin: Origin.VIEWPORT }).perform();\n\n        while (['initial', 'running'].includes(this._status) && this.history.length <= this.maxSteps) {\n            await this.step();\n            await this.driver.sleep(this.waitAfterStepMS);\n\n            if (this.pauseAfterEachAction) {\n                await pauseForInput();\n            }\n        }\n    }\n\n    public get status(): string {\n        return this._status;\n    }\n}","import { Key } from \"selenium-webdriver\";\n\nexport async function pauseForInput(): Promise<void> {\n    // Pause for keyboard input\n    console.log('Press any key to continue...');\n    await new Promise<void>(resolve => {\n        process.stdin.setRawMode(true);\n        process.stdin.resume();\n        process.stdin.once('data', () => {\n            process.stdin.setRawMode(false);\n            process.stdin.pause();\n            resolve();\n        });\n    });\n}\n\nexport function parseXdotool(xdotoolCommand: string): { modifiers: string[], keys: string[] } {\n    const modifiers: string[] = [];\n    const keys: string[] = [];\n\n    const keyParts = xdotoolCommand.split('+');\n\n    for (const keyPart of keyParts) {\n        switch (keyPart.toLowerCase()) {\n            case 'ctrl':\n                modifiers.push(Key.CONTROL);\n                break;\n            case 'alt':\n                modifiers.push(Key.ALT);\n                break;\n            case 'shift':\n                modifiers.push(Key.SHIFT);\n                break;\n            case 'super':\n            case 'command':\n            case 'meta':\n                modifiers.push(Key.META);\n                break;\n            case 'null':\n                keys.push(Key.NULL);\n                break;\n            case 'cancel':\n                keys.push(Key.CANCEL);\n                break;\n            case 'help':\n                keys.push(Key.HELP);\n                break;\n            case 'backspace':\n            case 'back_space':\n                keys.push(Key.BACK_SPACE);\n                break;\n            case 'tab':\n                keys.push(Key.TAB);\n                break;\n            case 'clear':\n                keys.push(Key.CLEAR);\n                break;\n            case 'return':\n            case 'enter':\n                keys.push(Key.RETURN);\n                break;\n            case 'pause':\n                keys.push(Key.PAUSE);\n                break;\n            case 'escape':\n                keys.push(Key.ESCAPE);\n                break;\n            case 'space':\n                keys.push(Key.SPACE);\n                break;\n            case 'pageup':\n            case 'page_up':\n                keys.push(Key.PAGE_UP);\n                break;\n            case 'pagedown':\n            case 'page_down':\n                keys.push(Key.PAGE_DOWN);\n                break;\n            case 'end':\n                keys.push(Key.END);\n                break;\n            case 'home':\n                keys.push(Key.HOME);\n                break;\n            case 'left':\n            case 'arrowleft':\n            case 'arrow_left':\n                keys.push(Key.ARROW_LEFT);\n                break;\n            case 'up':\n            case 'arrowup':\n            case 'arrow_up':\n                keys.push(Key.ARROW_UP);\n                break;\n            case 'right':\n            case 'arrowright':\n            case 'arrow_right':\n                keys.push(Key.ARROW_RIGHT);\n                break;\n            case 'down':\n            case 'arrowdown':\n            case 'arrow_down':\n                keys.push(Key.ARROW_DOWN);\n                break;\n            case 'insert':\n                keys.push(Key.INSERT);\n                break;\n            case 'delete':\n                keys.push(Key.DELETE);\n                break;\n            case 'semicolon':\n                keys.push(Key.SEMICOLON);\n                break;\n            case 'equals':\n                keys.push(Key.EQUALS);\n                break;\n            case 'kp_0':\n                keys.push(Key.NUMPAD0);\n                break;\n            case 'kp_1':\n                keys.push(Key.NUMPAD1);\n                break;\n            case 'kp_2':\n                keys.push(Key.NUMPAD2);\n                break;\n            case 'kp_3':\n                keys.push(Key.NUMPAD3);\n                break;\n            case 'kp_4':\n                keys.push(Key.NUMPAD4);\n                break;\n            case 'kp_5':\n                keys.push(Key.NUMPAD5);\n                break;\n            case 'kp_6':\n                keys.push(Key.NUMPAD6);\n                break;\n            case 'kp_7':\n                keys.push(Key.NUMPAD7);\n                break;\n            case 'kp_8':\n                keys.push(Key.NUMPAD8);\n                break;\n            case 'kp_9':\n                keys.push(Key.NUMPAD9);\n                break;\n            case 'multiply':\n                keys.push(Key.MULTIPLY);\n                break;\n            case 'add':\n                keys.push(Key.ADD);\n                break;\n            case 'separator':\n                keys.push(Key.SEPARATOR);\n                break;\n            case 'subtract':\n                keys.push(Key.SUBTRACT);\n                break;\n            case 'decimal':\n                keys.push(Key.DECIMAL);\n                break;\n            case 'divide':\n                keys.push(Key.DIVIDE);\n                break;\n            case 'f1':\n                keys.push(Key.F1);\n                break;\n            case 'f2':\n                keys.push(Key.F2);\n                break;\n            case 'f3':\n                keys.push(Key.F3);\n                break;\n            case 'f4':\n                keys.push(Key.F4);\n                break;\n            case 'f5':\n                keys.push(Key.F5);\n                break;\n            case 'f6':\n                keys.push(Key.F6);\n                break;\n            case 'f7':\n                keys.push(Key.F7);\n                break;\n            case 'f8':\n                keys.push(Key.F8);\n                break;\n            case 'f9':\n                keys.push(Key.F9);\n                break;\n            case 'f10':\n                keys.push(Key.F10);\n                break;\n            case 'f11':\n                keys.push(Key.F11);\n                break;\n            case 'f12':\n                keys.push(Key.F12);\n                break;\n            default:\n                keys.push(keyPart);\n        }\n\n    }\n\n    return { modifiers, keys };\n}","import Anthropic from '@anthropic-ai/sdk';\nimport { ActionPlanner, BrowserAction, BrowserState, BrowserStep, Coordinate, ScrollBar } from '../browser';\nimport sharp from 'sharp';\nimport { BetaContentBlockParam, BetaImageBlockParam, BetaMessageParam, BetaTextBlockParam } from '@anthropic-ai/sdk/resources/beta/messages/messages';\n\nimport fs from 'fs';\ninterface ScalingRatio {\n    ratio: Coordinate;\n    oldSize: Coordinate;\n    newSize: Coordinate;\n}\n\ninterface MsgOptions {\n    mousePosition: boolean;\n    screenshot: boolean;\n    tabs: boolean;\n}\n\nconst cursor64 = 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAQCAYAAAAvf+5AAAAAw3pUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjabVBRDsMgCP33FDuC8ijF49i1S3aDHX9YcLFLX+ITeOSJpOPzfqVHBxVOvKwqVSQbuHKlZoFmRzu5ZD55rvX8Uk9Dz2Ql2A1PVaJ/1MvPwK9m0TIZ6TOE7SpUDn/9M4qH0CciC/YwqmEEcqGEQYsvSNV1/sJ25CvUTxqBjzGJU86rbW9f7B0QHSjIxoD6AOiHE1oXjAlqjQVyxmTMkJjEFnK3p4H0BSRiWUv/cuYLAAABhWlDQ1BJQ0MgcHJvZmlsZQAAeJx9kT1Iw0AYht+2SqVUHCwo0iFD1cWCqIijVqEIFUKt0KqDyaV/0KQhSXFxFFwLDv4sVh1cnHV1cBUEwR8QZwcnRRcp8buk0CLGg7t7eO97X+6+A/yNClPNrnFA1SwjnUwI2dyqEHxFCFEM0DoqMVOfE8UUPMfXPXx8v4vzLO+6P0evkjcZ4BOIZ5luWMQbxNObls55nzjCSpJCfE48ZtAFiR+5Lrv8xrnosJ9nRoxMep44QiwUO1juYFYyVOIp4piiapTvz7qscN7irFZqrHVP/sJwXltZ5jrNKJJYxBJECJBRQxkVWIjTrpFiIk3nCQ//kOMXySWTqwxGjgVUoUJy/OB/8Lu3ZmFywk0KJ4DuF9v+GAaCu0Czbtvfx7bdPAECz8CV1vZXG8DMJ+n1thY7Avq2gYvrtibvAZc7wOCTLhmSIwVo+gsF4P2MvikH9N8CoTW3b61znD4AGepV6gY4OARGipS97vHuns6+/VvT6t8Ph1lyr0hzlCAAAA14aVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOjFiYzFkZjE3LWM5YmMtNGYzZi1hMmEzLTlmODkyNWNiZjY4OSIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo4YTUyMWJhMC00YmNlLTQzZWEtYjgyYS04ZGM2MTBjYmZlOTgiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplODQ3ZjUxNC00MWVlLTQ2ZjYtOTllNC1kNjI3MjMxMjhlZTIiCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJMaW51eCIKICAgR0lNUDpUaW1lU3RhbXA9IjE3MzAxNTc3NjY5MTI3ODciCiAgIEdJTVA6VmVyc2lvbj0iMi4xMC4zOCIKICAgdGlmZjpPcmllbnRhdGlvbj0iMSIKICAgeG1wOkNyZWF0b3JUb29sPSJHSU1QIDIuMTAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjQ6MTA6MjhUMTY6MjI6NDYtMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDI0OjEwOjI4VDE2OjIyOjQ2LTA3OjAwIj4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZTVjOTM2ZDYtYjMzYi00NzM4LTlhNWUtYjM3YTA5MzdjZDAxIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHaW1wIDIuMTAgKExpbnV4KSIKICAgICAgc3RFdnQ6d2hlbj0iMjAyNC0xMC0yOFQxNjoyMjo0Ni0wNzowMCIvPgogICAgPC9yZGY6U2VxPgogICA8L3htcE1NOkhpc3Rvcnk+CiAgPC9yZGY6RGVzY3JpcHRpb24+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz5/5aQ8AAAABmJLR0QAcgByAAAtJLTuAAAACXBIWXMAAABZAAAAWQGqnamGAAAAB3RJTUUH6AocFxYuv5vOJAAAAHhJREFUKM+NzzEOQXEMB+DPYDY5iEVMIpzDfRxC3mZyBK7gChZnELGohaR58f7a7dd8bVq4YaVQgTvWFVjCUcXxA28qcBBHFUcVRwWPPuFfXVsbt0PPnLBL+dKHL+wxxhSPhBcZznuDXYKH1uGzBJ+YtPAZRyy/jTd7qEoydWUQ7QAAAABJRU5ErkJggg==';\nconst cursorBuffer = Buffer.from(cursor64, 'base64');\n\nexport interface AnthropicPlannerOptions {\n    screenshotHistory?: number;\n    mouseJitterReduction?: number;\n    apiKey?: string;\n    client?: Anthropic;\n    debugImagePath?: string;\n}\n\nexport class AnthropicPlanner extends ActionPlanner {\n    private client: Anthropic;\n    private screenshotHistory: number = 1;\n    private mouseJitterReduction: number = 5;\n    private inputTokenUsage: number = 0;\n    private outputTokenUsage: number = 0;\n    private debugImagePath: string | undefined;\n    private debug: boolean = false;\n\n    constructor(options?: AnthropicPlannerOptions) {\n        super();\n\n        if (options?.client) {\n            this.client = options.client;\n        } else if (options?.apiKey) {\n            this.client = new Anthropic({ apiKey: options.apiKey });\n        } else {\n            this.client = new Anthropic();\n        }\n\n        this.screenshotHistory = options?.screenshotHistory ?? this.screenshotHistory;\n        this.mouseJitterReduction = options?.screenshotHistory ?? this.mouseJitterReduction;\n        this.debugImagePath = options?.debugImagePath;\n    }\n\n    public formatSystemPrompt(goal: string, additionalContext: string, additionalInstructions: string[]): string {\n        const prompt = `<SYSTEM_CAPABILITY>\n* You are a computer use tool that is controlling a browser in fullscreen mode to complete a goal for the user. The goal is listed below in <USER_TASK>.\n* The browser operates in fullscreen mode, meaning you cannot use standard browser UI elements like STOP, REFRESH, BACK, or the address bar. You must accomplish your task solely by interacting with the website's user interface or calling \"switch_tab\" or \"stop_browsing\"\n* After each action, you will be provided with mouse position, open tabs, and a screenshot of the active browser tab.\n* Use the Page_down or Page_up keys to scroll through the webpage. If the website is scrollable, a gray rectangle-shaped scrollbar will appear on the right edge of the screenshot. Ensure you have scrolled through the entire page before concluding that content is unavailable.\n* The mouse cursor will appear as a black arrow in the screenshot. Use its position to confirm whether your mouse movement actions have been executed successfully. Ensure the cursor is correctly positioned over the intended UI element before executing a click command.\n* After each action, you will receive information about open browser tabs. This information will be in the form of a list of JSON objects, each representing a browser tab with the following fields:\n  - \"tab_id\": An integer that identifies the tab within the browser. Use this ID to switch between tabs.\n  - \"title\": A string representing the title of the webpage loaded in the tab.\n  - \"active_tab\": A boolean indicating whether this tab is currently active. You will receive a screenshot of the active tab.\n  - \"new_tab\": A boolean indicating whether the tab was opened as a result of the last action.\n* Follow all directions from the <IMPORTANT> section below. \n* The current date is ${new Date().toISOString()}.\n</SYSTEM_CAPABILITY>\n\nThe user will ask you to perform a task and you should use their browser to do so. After each step, analyze the screenshot and carefully evaluate if you have achieved the right outcome. Explicitly show your thinking for EACH function call: \"I have evaluated step X...\" If not correct, try again. Only when you confirm a step was executed correctly should you move on to the next one. You should always call a tool! Always return a tool call. Remember call the stop_browsing tool when you have achieved the goal of the task. Use keyboard shortcuts to navigate whenever possible.\n\n<IMPORTANT>\n* After moving the mouse to the desired location, always perform a left-click to ensure the action is completed.\n* You will use information provided in user's <USER DATA> to fill out forms on the way to your goal.\n* Ensure that any UI element is completely visible on the screen before attempting to interact with it.\n${additionalInstructions.map(instruction => `* ${instruction}`).join('\\n')}\n</IMPORTANT>`;\n        \n        return prompt.trim();\n    }\n\n    private createToolUseId(): string {\n        const prefix = 'toolu_01';\n        const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n        const idLength = 22;\n        let result = prefix;\n\n        for (let i = 0; i < idLength; i++) {\n            result += characters.charAt(Math.floor(Math.random() * characters.length));\n        }\n\n        return result;\n    }\n\n    public async getDimensions(screenshot: string): Promise<Coordinate> {\n        const imgBuffer =  Buffer.from(screenshot, 'base64');\n        const sharpImage = sharp(imgBuffer);\n        const originalMeta = await sharpImage.metadata();\n\n        return {\n            x: originalMeta.width!,\n            y: originalMeta.height!\n        }\n    }\n\n    public async markScreenshot(imgBuffer: Buffer, mousePosition: Coordinate, scrollbar: ScrollBar): Promise<Buffer> {\n        const sharpImage = sharp(imgBuffer);\n\n        // Add scrollbar overlay\n        const originalMeta = await sharpImage.metadata();\n        const width = originalMeta.width!;\n        const height = originalMeta.height!;\n\n        // Set minimum size for image marking, otherwise return the original image\n        if(width < 20 || height < 20){\n            return imgBuffer;\n        }\n        \n        // Create scrollbar overlay\n        const scrollbarWidth = Math.min(10, width);\n        const scrollbarHeight = Math.min(Math.floor(height * scrollbar.height), height);\n        const scrollbarTop = Math.floor(height * scrollbar.offset);\n\n        // Create a gray rectangle for the scrollbar\n        const scrollbarBuffer = await sharp({\n            create: {\n                width: scrollbarWidth,\n                height: scrollbarHeight,\n                channels: 4,\n                background: { r: 128, g: 128, b: 128, alpha: 0.7 }\n            }\n        }).png().toBuffer();\n\n        // Overlay the cursor on the screenshot, top left corner is the mouse location\n        // Composite the scrollbar on the right side of the image\n        const markedImage = await sharpImage.composite([{\n            input: scrollbarBuffer,\n            top: scrollbarTop,\n            left: width - scrollbarWidth\n        },\n        {\n            input: cursorBuffer,\n            top: Math.max(0, mousePosition.y),\n            left: Math.max(0, mousePosition.x)\n        }]);\n\n        // Convert the image back to base64\n        const outputBuffer = await markedImage.toBuffer();\n        return outputBuffer;\n    }\n\n    public async resizeScreenshot(screenshotBuffer: Buffer): Promise<Buffer> {\n        const sharpImage = sharp(screenshotBuffer);\n        const resizedImg = await sharpImage.resize(1280, 800, { fit: 'inside' });\n        const imgBuffer = await resizedImg.toBuffer();\n\n        return imgBuffer;\n    }\n\n    public async resizeImageToDimensions(screenshotBuffer: Buffer, newDim: Coordinate): Promise<Buffer> {\n        const sharpImage = sharp(screenshotBuffer);\n        const resizedImg = await sharpImage.resize(newDim.x, newDim.y, { fit: 'fill' });\n        const imgBuffer = await resizedImg.toBuffer();\n\n        return imgBuffer;\n    }\n\n    public getScalingRatio(origSize: Coordinate): ScalingRatio {\n        const aspectRatio = origSize.x / origSize.y;\n\n        let newWidth: number;\n        let newHeight: number;\n\n        if (aspectRatio > 1280 / 800) {\n            newWidth = 1280;\n            newHeight = Math.round(1280 / aspectRatio);\n        } else {\n            newHeight = 800;\n            newWidth = Math.round(800 * aspectRatio);\n        }\n\n        const widthRatio = origSize.x / newWidth;\n        const heightRatio = origSize.y / newHeight;\n\n        return {\n            ratio: { x: widthRatio, y: heightRatio },\n            oldSize: { x: origSize.x, y: origSize.y },\n            newSize: { x: newWidth, y: newHeight }\n        };\n    }\n\n    private browserToLLMCoordinates(inputCoords: Coordinate, scaling: ScalingRatio): Coordinate {\n        return {\n            x: Math.min(Math.max(Math.floor(inputCoords.x / scaling.ratio.x), 1), scaling.newSize.x),\n            y: Math.min(Math.max(Math.floor(inputCoords.y / scaling.ratio.y), 1), scaling.newSize.y),\n        };\n    }\n\n    private llmToBrowserCoordinates(inputCoords: Coordinate, scaling: ScalingRatio): Coordinate {\n        return {\n            x: Math.min(Math.max(Math.floor(inputCoords.x * scaling.ratio.x), 1), scaling.oldSize.x),\n            y: Math.min(Math.max(Math.floor(inputCoords.y * scaling.ratio.y), 1), scaling.oldSize.y),\n        };\n    }\n\n    public async formatStateIntoMsg(toolCallId: string, currentState: BrowserState, options: MsgOptions): Promise<BetaMessageParam> {\n        let resultText: string = '';\n        const contentSubMsg: (BetaTextBlockParam | BetaImageBlockParam)[] = [];\n\n        if (options.mousePosition) {\n            const imgDim = { x: currentState.width, y: currentState.height };\n            const scaling = this.getScalingRatio(imgDim);\n            const scaledCoord = this.browserToLLMCoordinates(currentState.mouse, scaling);\n            resultText += `Mouse location: ${JSON.stringify(scaledCoord)}\\n\\n`;\n        }\n\n        if (options.tabs) {\n            const tabsAsDicts = currentState.tabs.map(tab => ({\n                tab_id: tab.id,\n                title: tab.title,\n                active_tab: tab.active,\n                new_tab: tab.new,\n            }));\n            resultText += `\\n\\nOpen Browser Tabs: ${JSON.stringify(tabsAsDicts)}\\n\\n`;\n        }\n\n        if (options.screenshot) {\n            const imgBuffer = Buffer.from(currentState.screenshot, 'base64');\n            const viewportImage = await this.resizeImageToDimensions(imgBuffer, { x: currentState.width, y: currentState.height });\n            const markedImage = await this.markScreenshot(viewportImage, currentState.mouse, currentState.scrollbar);\n            const resized = await this.resizeScreenshot(markedImage);\n\n            if (this.debugImagePath) {\n                fs.writeFileSync(this.debugImagePath, resized, 'base64');\n            }\n\n            contentSubMsg.push({\n                type: 'image',\n                source: {\n                    type: 'base64',\n                    media_type: 'image/png',\n                    data: resized.toString('base64')\n                }\n            });\n        }\n\n        if (!resultText) { // Put a generic text explanation for no URL or result\n            resultText = 'Action was performed.';\n        }\n\n        contentSubMsg.unshift({\n            type: 'text',\n            text: resultText.trim()\n        });\n\n        return {\n            role: 'user',\n            content: [\n                {\n                    type: 'tool_result',\n                    tool_use_id: toolCallId,\n                    content: contentSubMsg\n                }\n            ]\n        };\n    }\n\n    public flattenBrowserStepToAction(step: BrowserStep): Record<string, any> {\n        if (step.action.action === 'scroll_down') {\n            return {\n                action: 'key',\n                text: 'Page_Down'\n            };\n        }\n\n        if (step.action.action === 'scroll_up') {\n            return {\n                action: 'key',\n                text: 'Page_Up'\n            };\n        }\n\n        const val: Record<string, any> = {\n            action: step.action.action,\n        };\n\n        if (step.action.text) {\n            val.text = step.action.text;\n        }\n\n        if (step.action.coordinate) {\n            const imgDim:  Coordinate = { x: step.state.width, y: step.state.height};\n            const scaling = this.getScalingRatio(imgDim);\n            const llmCoordinates = this.browserToLLMCoordinates(\n                {x: step.action.coordinate[0], y: step.action.coordinate[1]}, scaling);\n            val.coordinate = [llmCoordinates.x, llmCoordinates.y];\n        }\n\n        return val;\n    }\n\n    public async formatIntoMessages(goal: string, additionalContext: string, currentState: BrowserState, sessionHistory: BrowserStep[]): Promise<BetaMessageParam[]> {\n        const messages: BetaMessageParam[] = [];\n\n        let toolId = this.createToolUseId();\n\n        const user_prompt =`Please complete the following task:\n<USER_TASK>\n${goal}\n</USER_TASK>\n\nUsing the supporting contextual data:\n<USER_DATA>\n${additionalContext}\n</USER_DATA>\n`;\n\n        const msg0: BetaMessageParam = { role: 'user', content: [{ type: 'text', text: user_prompt.trim() }] };\n        const msg1: BetaMessageParam = {\n            role: 'assistant', content: [\n                {\n                    type: 'tool_use',\n                    id: toolId,\n                    name: 'computer',\n                    input: {\n                        action: 'screenshot',\n                        reasoning: 'Grab a view of the browser to understand what we are looking at.'\n                    }\n                }\n            ]\n        };\n\n        messages.push(msg0);\n        messages.push(msg1);\n\n        for (let pastStepIdx = 0; pastStepIdx < sessionHistory.length; pastStepIdx++) {\n            const pastStep = sessionHistory[pastStepIdx];\n\n            const options: MsgOptions = {\n                mousePosition: false,\n                screenshot: false,\n                tabs: true,\n            }\n\n            if (pastStepIdx <= (sessionHistory.length - this.screenshotHistory)) {\n                options.tabs = false;\n            }\n\n            const resultMsg: BetaMessageParam = await this.formatStateIntoMsg(toolId, pastStep.state, options)\n\n            messages.push(resultMsg);\n            // Update the tool use id as now we're going to pretend to get the response\n            toolId = pastStep.action.id ?? this.createToolUseId();\n\n            const actionMsg: BetaMessageParam = {\n                role: 'assistant',\n                content: [\n                    {\n                        type: 'tool_use',\n                        id: toolId,\n                        name: 'computer',\n                        input: this.flattenBrowserStepToAction(pastStep)\n                    }\n                ]\n            }\n\n            messages.push(actionMsg);\n        }\n\n        const currentStateMessage: BetaMessageParam = await this.formatStateIntoMsg(toolId, currentState, { mousePosition: true, screenshot: true, tabs: true });\n        messages.push(currentStateMessage);\n\n        return messages;\n    }\n\n    public parseAction(message: Anthropic.Beta.Messages.BetaMessage, scaling: ScalingRatio, currentState: BrowserState): BrowserAction {\n        // Collect all the text output as reasoning.\n        const reasoning = message.content\n            .filter((content) => content.type === 'text')\n            .map((content) => content.text)\n            .join(' ');\n\n        const lastMessage = message.content[message.content.length - 1];\n        if (typeof lastMessage === 'string') {\n            return {\n                action: 'failure',\n                reasoning: lastMessage,\n                id: this.createToolUseId()\n            };\n        }\n\n        if (lastMessage.type !== 'tool_use') {\n            return {\n                action: 'failure',\n                reasoning,\n                id: this.createToolUseId()\n            };\n        }\n        if (lastMessage.name === 'stop_browsing') {\n            const input = lastMessage.input as {\n                success: boolean;\n                error?: string;\n            };\n            if (!input.success) {\n                return {\n                    action: 'failure',\n                    reasoning,\n                    text: input.error ?? 'Unknown error',\n                    id: lastMessage.id\n                };\n            }\n            return {\n                action: 'success',\n                reasoning,\n                text: input.error ?? 'Unknown error',\n                id: lastMessage.id\n            };\n        }\n        if (lastMessage.name !== 'computer') {\n            return {\n                action: 'failure',\n                reasoning,\n                text: 'Wrong message called',\n                id: lastMessage.id\n            };\n        }\n\n        const { action, text } = lastMessage.input as {\n            action: string;            \n            text?: string;\n        };\n\n        let coordinate: [number, number] | undefined;\n        let rawCoord = (lastMessage.input as any).coordinate;\n\n        // If we get coordinates as string\n        if (typeof rawCoord == 'string') {\n            console.log('Coordinate is a string:', rawCoord);\n            rawCoord = JSON.parse(rawCoord);\n        } \n        \n        // Parse the coordinate object\n        if (typeof rawCoord == 'object'){\n            if ('x' in rawCoord && 'y' in rawCoord){\n                console.log('Coordinate object has x and y properties');\n                coordinate = [rawCoord.x, rawCoord.y]\n            } else if (Array.isArray(rawCoord)) {\n                coordinate = [rawCoord[0], rawCoord[1]];\n            }\n        }\n\n        switch (action) {\n            case 'key':\n                // Treat scrolling actions in a special manner\n                if (['page_down', 'pagedown'].includes(text?.toLocaleLowerCase().trim() ?? '')) {\n                    return {\n                        action: 'scroll_down',\n                        reasoning,\n                        id: lastMessage.id\n                    }\n                } else if (['page_up', 'pageup'].includes(text?.toLocaleLowerCase().trim() ?? '')) {\n                    return {\n                        action: 'scroll_up',\n                        reasoning,\n                        id: lastMessage.id\n                    }\n                }\n                // Explicit fallthrough\n            case 'type':\n                if (!text) {\n                    return {\n                        action: 'failure',\n                        reasoning,\n                        text: `No text provided for ${action}`,\n                        id: lastMessage.id\n                    };\n                } else {\n                    return {\n                        action,\n                        reasoning,\n                        text,\n                        id: lastMessage.id\n                    }\n                }\n            case 'mouse_move':\n                if (!coordinate) {\n                    return { \n                        action: 'failure', \n                        reasoning, \n                        text: 'No coordinate provided',\n                        id: lastMessage.id\n                    };\n                } else {\n                    // Scale back coordinates\n                    const browserCoordinates = this.llmToBrowserCoordinates({x: coordinate[0], y: coordinate[1]}, scaling);\n\n                    const xJitter = Math.abs(browserCoordinates.x - currentState.mouse.x);\n                    const yJitter = Math.abs(browserCoordinates.y - currentState.mouse.y);\n                    // Check if the browser coordinates match the current mouse position\n                    if (xJitter <= this.mouseJitterReduction && yJitter <= this.mouseJitterReduction) {\n                        console.log('Mouse jitter detected, overriding with click');\n                        // If coordinates match, dispatch a click event instead of moving the mouse\n                        return { \n                            action: 'left_click', \n                            reasoning,\n                            id: lastMessage.id\n                        };\n                    }\n                }\n            case 'left_click_drag':\n                if (!coordinate) {\n                    return { \n                        action: 'failure', \n                        reasoning, \n                        text: 'No coordinate provided',\n                        id: lastMessage.id\n                    };\n                } else {\n                    // Scale back coordinates\n                    const browserCoordinates = this.llmToBrowserCoordinates({x: coordinate[0], y: coordinate[1]}, scaling);\n                    \n                    return { \n                        action, \n                        reasoning, \n                        coordinate: [browserCoordinates.x, browserCoordinates.y],\n                        id: lastMessage.id\n                    };\n                }\n            case 'switch_tab':\n                const tabId = parseInt(text ?? '', 10);\n                if (isNaN(tabId)) {\n                    return {\n                        action: 'failure',\n                        reasoning,\n                        text: 'Invalid tab ID provided for switch_tab',\n                        id: lastMessage.id\n                    };\n                }\n                return {\n                    action: 'switch_tab',\n                    reasoning,\n                    text,\n                    id: lastMessage.id\n                };\n            case 'left_click':\n            case 'right_click':\n            case 'middle_click':\n            case 'double_click':\n            case 'screenshot':\n            case 'cursor_position':\n                return { \n                    action, \n                    reasoning,\n                    id: lastMessage.id \n                };\n            default:\n                return {\n                    action: 'failure',\n                    reasoning,\n                    text: `Unsupported computer action: ${action}`,\n                    id: lastMessage.id\n                };\n        }\n    }\n\n    public async planAction(goal: string, additionalContext: string, additionalInstructions: string[],\n        currentState: BrowserState, sessionHistory: BrowserStep[]): Promise<BrowserAction> {\n        const systemPrompt = this.formatSystemPrompt(goal, additionalContext, additionalInstructions);\n        const messages = await this.formatIntoMessages(goal, additionalContext, currentState, sessionHistory);\n        const scaling = this.getScalingRatio({ x: currentState.width, y: currentState.height });\n\n        this.printMessagesWithoutScreenshots(messages);\n\n        const response = await this.client.beta.messages.create({\n            model: \"claude-3-5-sonnet-20241022\",\n            system: systemPrompt,\n            max_tokens: 1024,\n            tools: [\n                {\n                    type: \"computer_20241022\",\n                    name: \"computer\",\n                    display_width_px: currentState.width,\n                    display_height_px: currentState.height,\n                    display_number: 1\n                },\n                {\n                    name: 'switch_tab',\n                    description: 'Call this function to switch the active browser tab to a new one',\n                    input_schema: {\n                        type: 'object',\n                        properties: {\n                            tab_id: {\n                                type: 'integer',\n                                description: 'The ID of the tab to switch to',\n                            },\n                        },\n                        required: ['tab_id'],\n                    },\n                },\n                {\n                    name: 'stop_browsing',\n                    description:\n                        'Call this function when you have achieved the goal of the task.',\n                    input_schema: {\n                        type: 'object',\n                        properties: {\n                            success: {\n                                type: 'boolean',\n                                description: 'Whether the task was successful',\n                            },\n                            error: {\n                                type: 'string',\n                                description: 'The error message if the task was not successful',\n                            },\n                        },\n                        required: ['success'],\n                    },\n                },\n            ],\n            messages,\n            betas: [\"computer-use-2024-10-22\"],\n        });\n\n        console.log(`Token usage - Input: ${response.usage.input_tokens}, Output: ${response.usage.output_tokens}`);\n        this.inputTokenUsage += response.usage.input_tokens;\n        this.outputTokenUsage += response.usage.output_tokens;\n        console.log(`Cumulative token usage - Input: ${this.inputTokenUsage}, Output: ${this.outputTokenUsage}, Total: ${this.inputTokenUsage + this.outputTokenUsage}`);\n\n        const action = this.parseAction(response, scaling, currentState);\n        console.log(action);\n\n        return action;\n    }\n\npublic printMessagesWithoutScreenshots(msg: BetaMessageParam[]): void {\n    // Create a deep copy of the messages to avoid modifying the original\n    const msgCopy: BetaMessageParam[] = JSON.parse(JSON.stringify(msg));\n\n    // Iterate over each message in the copy\n    for (const message of msgCopy) {\n        if (message.content) {\n            for (const outerContent of message.content as any) {\n                if (outerContent.content) {\n                    // Filter out any content of type 'image'\n                    outerContent.content = outerContent.content.filter((content: BetaContentBlockParam) => content.type !== 'image');\n                }\n            }\n        }\n    }\n\n    // Print each message in the modified copy\n    for (const message of msgCopy) {\n        console.log(JSON.stringify(message, null, 2));\n    }\n}\n}"],"mappings":"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","names":["import_selenium_webdriver","Anthropic","sharp","fs"]}