@mastra/agent-browser 0.2.1 → 0.2.2
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.
- package/CHANGELOG.md +34 -0
- package/dist/index.cjs +72 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +51 -23
- package/dist/index.d.ts +51 -23
- package/dist/index.js +72 -2
- package/dist/index.js.map +1 -1
- package/package.json +7 -8
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/thread-manager.ts","../src/schemas.ts","../src/tools/constants.ts","../src/tools/back.ts","../src/tools/click.ts","../src/tools/close.ts","../src/tools/dialog.ts","../src/tools/drag.ts","../src/tools/evaluate.ts","../src/tools/goto.ts","../src/tools/hover.ts","../src/tools/press.ts","../src/tools/scroll.ts","../src/tools/select.ts","../src/tools/snapshot.ts","../src/tools/tabs.ts","../src/tools/type.ts","../src/tools/wait.ts","../src/tools/index.ts","../src/utils.ts","../src/agent-browser.ts"],"names":["ThreadManager","BrowserManager","z","createTool","MastraBrowser","DEFAULT_THREAD_ID","manager","url","ScreencastStreamImpl"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * AgentBrowserThreadManager - Thread scope management for AgentBrowser\n *\n * Manages thread-scoped browser sessions using agent-browser's\n * BrowserManager capabilities (newWindow, switchTo, closeTab).\n */\n\nimport { ThreadManager } from '@mastra/core/browser';\nimport type { BrowserState, ThreadSession, ThreadManagerConfig } from '@mastra/core/browser';\nimport { BrowserManager } from 'agent-browser';\nimport type { BrowserLaunchOptions } from 'agent-browser';\nimport type { Page } from 'playwright-core';\nimport type { BrowserConfig } from './types';\n\n/**\n * Extended session info for AgentBrowser.\n */\ninterface AgentBrowserSession extends ThreadSession {\n /** For 'thread' scope: dedicated browser manager instance */\n manager?: BrowserManager;\n}\n\n/**\n * Configuration for AgentBrowserThreadManager.\n */\nexport interface AgentBrowserThreadManagerConfig extends ThreadManagerConfig {\n /** Browser configuration for launching new instances */\n browserConfig: BrowserConfig;\n /** Function to resolve CDP URL (may be async) */\n resolveCdpUrl?: (cdpUrl: string | (() => string | Promise<string>)) => Promise<string>;\n /** Callback when a new browser manager is created for a thread */\n onBrowserCreated?: (manager: BrowserManager, threadId: string) => void;\n}\n\n/**\n * Thread manager implementation for AgentBrowser.\n *\n * Supports two scope modes:\n * - 'shared': All threads share the shared browser manager\n * - 'thread': Each thread gets a dedicated browser manager instance\n */\nexport class AgentBrowserThreadManager extends ThreadManager<BrowserManager> {\n private readonly browserConfig: BrowserConfig;\n private readonly resolveCdpUrl?: (cdpUrl: string | (() => string | Promise<string>)) => Promise<string>;\n private readonly onBrowserCreated?: (manager: BrowserManager, threadId: string) => void;\n\n constructor(config: AgentBrowserThreadManagerConfig) {\n super(config);\n this.browserConfig = config.browserConfig;\n this.resolveCdpUrl = config.resolveCdpUrl;\n this.onBrowserCreated = config.onBrowserCreated;\n }\n\n /**\n * Get the page for a specific thread, creating session if needed.\n */\n async getPageForThread(threadId?: string): Promise<Page> {\n const manager = await this.getManagerForThread(threadId);\n return manager.getPage();\n }\n\n /**\n * Create a new session for a thread.\n */\n protected async createSession(threadId: string): Promise<AgentBrowserSession> {\n // Check for saved browser state before creating new session (for browser restore)\n const savedState = this.getSavedBrowserState(threadId);\n\n const session: AgentBrowserSession = {\n threadId,\n createdAt: Date.now(),\n browserState: savedState,\n };\n\n if (this.scope === 'thread') {\n // Thread scope - create a new browser manager for this thread\n const manager = new BrowserManager();\n\n const launchOptions: BrowserLaunchOptions = {\n headless: this.browserConfig.headless,\n viewport: this.browserConfig.viewport,\n profile: this.browserConfig.profile,\n executablePath: this.browserConfig.executablePath,\n storageState: this.browserConfig.storageState,\n };\n\n if (this.browserConfig.cdpUrl && this.resolveCdpUrl) {\n launchOptions.cdpUrl = await this.resolveCdpUrl(this.browserConfig.cdpUrl);\n }\n\n try {\n await manager.launch(launchOptions);\n } catch (error) {\n // Clean up manager on launch failure\n try {\n await manager.close();\n } catch {\n // Ignore close errors - launch already failed\n }\n throw error;\n }\n\n session.manager = manager;\n this.threadManagers.set(threadId, manager);\n\n try {\n // Restore browser state if available (before notifying parent to avoid screencast race)\n if (savedState && savedState.tabs.length > 0) {\n this.logger?.debug?.(`Restoring browser state for thread ${threadId}: ${savedState.tabs.length} tabs`);\n await this.restoreBrowserState(manager, savedState);\n }\n\n // Notify parent browser so it can set up close listeners\n // This is done after restoration so the screencast starts on the correct active page\n this.onBrowserCreated?.(manager, threadId);\n } catch (error) {\n // Roll back: remove from tracking and close the manager\n this.threadManagers.delete(threadId);\n session.manager = undefined;\n try {\n await manager.close();\n } catch {\n // Ignore close errors during rollback\n }\n throw error;\n }\n }\n // For 'shared' scope, no session setup needed - all threads share the manager\n\n return session;\n }\n\n /**\n * Restore browser state (multiple tabs) to a browser manager.\n */\n private async restoreBrowserState(manager: BrowserManager, state: BrowserState): Promise<void> {\n try {\n // Navigate first tab to first URL\n const firstTab = state.tabs[0];\n if (firstTab?.url) {\n const page = manager.getPage();\n if (page) {\n await page.goto(firstTab.url, { waitUntil: 'domcontentloaded' });\n }\n }\n\n // Open additional tabs\n for (let i = 1; i < state.tabs.length; i++) {\n const tab = state.tabs[i];\n if (tab?.url) {\n // newTab() creates a blank tab, then we navigate to the URL\n await manager.newTab();\n const page = manager.getPage();\n if (page) {\n await page.goto(tab.url, { waitUntil: 'domcontentloaded' });\n }\n }\n }\n\n // Switch to the active tab (always switch after opening tabs since newTab() changes active)\n if (state.tabs.length > 1 && state.activeTabIndex >= 0 && state.activeTabIndex < state.tabs.length) {\n await manager.switchTo(state.activeTabIndex);\n }\n } catch (error) {\n this.logger?.warn?.(`Failed to restore browser state: ${error}`);\n }\n }\n\n /**\n * Get the browser manager for a specific session.\n */\n protected getManagerForSession(session: AgentBrowserSession): BrowserManager {\n if (this.scope === 'thread' && session.manager) {\n return session.manager;\n }\n return this.getSharedManager();\n }\n\n /**\n * Destroy a session and clean up resources.\n */\n protected async doDestroySession(session: AgentBrowserSession): Promise<void> {\n if (this.scope === 'thread' && session.manager) {\n // Close the dedicated browser manager\n await session.manager.close();\n }\n // For 'shared' scope, nothing to clean up - all threads share the manager\n }\n\n /**\n * Destroy all sessions (called during browser close).\n * doDestroySession handles closing individual browser managers.\n */\n override async destroyAllSessions(): Promise<void> {\n await super.destroyAllSessions();\n }\n}\n","/**\n * AgentBrowser Tool Schemas\n *\n * Flat schemas for browser tools. Each tool has a single-purpose schema\n * without discriminated unions, making them easier for LLMs to understand.\n *\n * Tools:\n * - Core: goto, snapshot, click, type, press, select, scroll, close\n * - Extended: hover, back, dialog, wait, tabs, drag\n * - Escape Hatch: evaluate\n */\n\nimport { z } from 'zod';\n\n// =============================================================================\n// Core Tools (9)\n// =============================================================================\n\n/**\n * browser_goto - Navigate to a URL\n */\nexport const gotoInputSchema = z.object({\n url: z.string().describe('The URL to navigate to'),\n waitUntil: z\n .enum(['load', 'domcontentloaded', 'networkidle'])\n .optional()\n .describe('When to consider navigation complete (default: domcontentloaded)'),\n timeout: z.number().optional().describe('Navigation timeout in milliseconds'),\n});\nexport type GotoInput = z.output<typeof gotoInputSchema>;\n\n/**\n * browser_snapshot - Get accessibility tree snapshot\n */\nexport const snapshotInputSchema = z.object({\n interactiveOnly: z.boolean().optional().describe('Only include interactive elements (default: true)'),\n maxDepth: z.number().optional().describe('Maximum depth of the tree to return'),\n});\nexport type SnapshotInput = z.output<typeof snapshotInputSchema>;\n\n/**\n * browser_click - Click an element\n */\nexport const clickInputSchema = z.object({\n ref: z.string().describe('Element ref from snapshot (e.g., @e5)'),\n button: z.enum(['left', 'right', 'middle']).optional().describe('Mouse button (default: left)'),\n clickCount: z.number().optional().describe('Number of clicks (default: 1, use 2 for double-click)'),\n modifiers: z\n .array(z.enum(['Alt', 'Control', 'Meta', 'Shift']))\n .optional()\n .describe('Modifier keys to hold'),\n});\nexport type ClickInput = z.output<typeof clickInputSchema>;\n\n/**\n * browser_type - Type text into an element\n */\nexport const typeInputSchema = z.object({\n ref: z.string().describe('Element ref from snapshot'),\n text: z.string().describe('Text to type'),\n clear: z.boolean().optional().describe('Clear existing content before typing (default: false)'),\n delay: z.number().optional().describe('Delay between keystrokes in ms'),\n});\nexport type TypeInput = z.output<typeof typeInputSchema>;\n\n/**\n * browser_press - Press a keyboard key\n */\nexport const pressInputSchema = z.object({\n key: z.string().describe('Key to press (e.g., Enter, Tab, Escape, Control+a)'),\n modifiers: z\n .array(z.enum(['Alt', 'Control', 'Meta', 'Shift']))\n .optional()\n .describe('Modifier keys to hold'),\n});\nexport type PressInput = z.output<typeof pressInputSchema>;\n\n/**\n * browser_select - Select option from dropdown\n */\nexport const selectInputSchema = z\n .object({\n ref: z.string().describe('Select element ref from snapshot'),\n value: z.string().optional().describe('Option value to select'),\n label: z.string().optional().describe('Option label to select'),\n index: z.number().int().min(0).optional().describe('Option index to select (0-based)'),\n })\n .superRefine((data, ctx) => {\n if (data.value === undefined && data.label === undefined && data.index === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'At least one of value, label, or index is required',\n });\n }\n });\nexport type SelectInput = z.output<typeof selectInputSchema>;\n\n/**\n * browser_scroll - Scroll the page or element\n */\nexport const scrollInputSchema = z.object({\n direction: z.enum(['up', 'down', 'left', 'right']).describe('Scroll direction'),\n amount: z.number().optional().describe('Scroll amount in pixels (default: 300)'),\n ref: z.string().optional().describe('Element ref to scroll (scrolls page if omitted)'),\n});\nexport type ScrollInput = z.output<typeof scrollInputSchema>;\n\n/**\n * browser_close - Close the browser\n */\nexport const closeInputSchema = z.object({});\nexport type CloseInput = z.output<typeof closeInputSchema>;\n\n// =============================================================================\n// Extended Tools (7)\n// =============================================================================\n\n/**\n * browser_hover - Hover over an element\n */\nexport const hoverInputSchema = z.object({\n ref: z.string().describe('Element ref from snapshot'),\n});\nexport type HoverInput = z.output<typeof hoverInputSchema>;\n\n/**\n * browser_back - Go back in browser history\n */\nexport const backInputSchema = z.object({});\nexport type BackInput = z.output<typeof backInputSchema>;\n\n/**\n * browser_dialog - Click an element that triggers a dialog and handle it\n */\nexport const dialogInputSchema = z.object({\n triggerRef: z.string().describe('Element ref that triggers the dialog (e.g., @e5)'),\n action: z.enum(['accept', 'dismiss']).describe('Accept or dismiss the dialog'),\n text: z.string().optional().describe('Text to enter for prompt dialogs'),\n});\nexport type DialogInput = z.output<typeof dialogInputSchema>;\n\n/**\n * browser_wait - Wait for an element or condition\n */\nexport const waitInputSchema = z.object({\n ref: z.string().optional().describe('Element ref to wait for'),\n state: z\n .enum(['visible', 'hidden', 'attached', 'detached'])\n .optional()\n .describe('State to wait for (default: visible)'),\n timeout: z.number().optional().describe('Maximum wait time in ms (default: 30000)'),\n});\nexport type WaitInput = z.output<typeof waitInputSchema>;\n\n/**\n * browser_tabs - Manage browser tabs\n */\nexport const tabsInputSchema = z\n .object({\n action: z.enum(['list', 'new', 'switch', 'close']).describe('Tab action'),\n index: z.number().int().min(0).optional().describe('Tab index for switch/close'),\n url: z.string().optional().describe('URL to open in new tab'),\n })\n .superRefine((value, ctx) => {\n if (value.action === 'switch' && value.index === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['index'],\n message: 'index is required when action is \"switch\"',\n });\n }\n });\nexport type TabsInput = z.output<typeof tabsInputSchema>;\n\n/**\n * browser_drag - Drag an element to another element\n */\nexport const dragInputSchema = z\n .object({\n sourceRef: z.string().optional().describe('Element ref to drag from (e.g., @e5)'),\n targetRef: z.string().optional().describe('Element ref to drag to (e.g., @e7)'),\n sourceSelector: z.string().optional().describe('CSS selector for source element (use if ref not available)'),\n targetSelector: z.string().optional().describe('CSS selector for target element (use if ref not available)'),\n })\n .superRefine((data, ctx) => {\n if (!data.sourceRef && !data.sourceSelector) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['sourceRef'],\n message: 'Either sourceRef or sourceSelector is required',\n });\n }\n if (!data.targetRef && !data.targetSelector) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['targetRef'],\n message: 'Either targetRef or targetSelector is required',\n });\n }\n });\nexport type DragInput = z.output<typeof dragInputSchema>;\n\n// =============================================================================\n// Escape Hatch (1)\n// =============================================================================\n\n/**\n * browser_evaluate - Execute JavaScript in the browser\n */\nexport const evaluateInputSchema = z.object({\n script: z\n .string()\n .describe(\n 'JavaScript expression to evaluate in the browser and return the result. Do not use `return` — write a bare expression like `document.title` or `1 + 1`. For async code, wrap in an async IIFE: `(async () => { ... })()`.',\n ),\n arg: z.unknown().optional().describe('Argument to pass to the script (JSON-serializable)'),\n});\nexport type EvaluateInput = z.output<typeof evaluateInputSchema>;\n\n// =============================================================================\n// All Schemas\n// =============================================================================\n\nexport const browserSchemas = {\n // Core\n goto: gotoInputSchema,\n snapshot: snapshotInputSchema,\n click: clickInputSchema,\n type: typeInputSchema,\n press: pressInputSchema,\n select: selectInputSchema,\n scroll: scrollInputSchema,\n close: closeInputSchema,\n // Extended\n hover: hoverInputSchema,\n back: backInputSchema,\n dialog: dialogInputSchema,\n wait: waitInputSchema,\n tabs: tabsInputSchema,\n drag: dragInputSchema,\n // Escape hatch\n evaluate: evaluateInputSchema,\n} as const;\n","/**\n * Browser Tool Constants\n */\n\nexport const BROWSER_TOOLS = {\n // Core\n GOTO: 'browser_goto',\n SNAPSHOT: 'browser_snapshot',\n CLICK: 'browser_click',\n TYPE: 'browser_type',\n PRESS: 'browser_press',\n SELECT: 'browser_select',\n SCROLL: 'browser_scroll',\n CLOSE: 'browser_close',\n // Extended\n HOVER: 'browser_hover',\n BACK: 'browser_back',\n DIALOG: 'browser_dialog',\n WAIT: 'browser_wait',\n TABS: 'browser_tabs',\n DRAG: 'browser_drag',\n // Escape hatch\n EVALUATE: 'browser_evaluate',\n} as const;\n\nexport type BrowserToolName = (typeof BROWSER_TOOLS)[keyof typeof BROWSER_TOOLS];\n","/**\n * browser_back - Go back in browser history\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { backInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createBackTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.BACK,\n description: 'Go back to the previous page in browser history.',\n inputSchema: backInputSchema,\n execute: async (_input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.back(threadId);\n },\n });\n}\n","/**\n * browser_click - Click an element\n */\n\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { clickInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\n\nexport function createClickTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.CLICK,\n description: 'Click an element using its ref from a snapshot. Use clickCount: 2 for double-click.',\n inputSchema: clickInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.click(input, threadId);\n },\n });\n}\n","/**\n * browser_close - Close the browser\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { closeInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createCloseTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.CLOSE,\n description: 'Close the browser. Only use when done with all browsing.',\n inputSchema: closeInputSchema,\n execute: async (_input, { agent }) => {\n // For thread scope, close only the thread's session\n const threadId = agent?.threadId;\n if (browser.getScope() !== 'shared') {\n if (!threadId) {\n throw new Error('browser_close requires agent.threadId when browser scope is not shared');\n }\n await browser.closeThreadSession(threadId);\n return { success: true, hint: \"Thread's browser session closed. A new session will be created on next use.\" };\n }\n // For shared scope, close the entire browser\n await browser.close();\n return { success: true, hint: 'Browser closed. It will be re-launched automatically on next use.' };\n },\n });\n}\n","/**\n * browser_dialog - Click element and handle resulting dialog\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { dialogInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createDialogTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.DIALOG,\n description:\n 'Click an element that triggers a browser dialog (alert, confirm, prompt) and handle it. ' +\n 'Use this instead of browser_click when you expect a dialog to appear.',\n inputSchema: dialogInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.dialog(input, threadId);\n },\n });\n}\n","/**\n * browser_drag - Drag an element to another element\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { dragInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createDragTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.DRAG,\n description:\n 'Drag an element to another element. Use refs from snapshot when available, ' +\n 'or CSS selectors for elements not exposed in the accessibility tree.',\n inputSchema: dragInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.drag(input, threadId);\n },\n });\n}\n","/**\n * browser_evaluate - Execute JavaScript in the browser\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { evaluateInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createEvaluateTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.EVALUATE,\n description:\n 'Execute JavaScript in the browser. Use for complex interactions not covered by other tools. Returns the script result.',\n inputSchema: evaluateInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.evaluate(input, threadId);\n },\n });\n}\n","/**\n * browser_goto - Navigate to a URL\n */\n\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { gotoInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\n\nexport function createGotoTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.GOTO,\n description: 'Navigate the browser to a URL.',\n inputSchema: gotoInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.goto(input, threadId);\n },\n });\n}\n","/**\n * browser_hover - Hover over an element\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { hoverInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createHoverTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.HOVER,\n description: 'Hover over an element to trigger hover states (dropdowns, tooltips).',\n inputSchema: hoverInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.hover(input, threadId);\n },\n });\n}\n","/**\n * browser_press - Press a keyboard key\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { pressInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createPressTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.PRESS,\n description: 'Press a keyboard key (e.g., Enter, Tab, Escape, Control+a).',\n inputSchema: pressInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.press(input, threadId);\n },\n });\n}\n","/**\n * browser_scroll - Scroll the page or element\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { scrollInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createScrollTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.SCROLL,\n description: 'Scroll the page or a specific element.',\n inputSchema: scrollInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.scroll(input, threadId);\n },\n });\n}\n","/**\n * browser_select - Select option from dropdown\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { selectInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createSelectTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.SELECT,\n description: 'Select an option from a dropdown by value, label, or index.',\n inputSchema: selectInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.select(input, threadId);\n },\n });\n}\n","/**\n * browser_snapshot - Get accessibility tree snapshot\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { snapshotInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createSnapshotTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.SNAPSHOT,\n description:\n 'Get accessibility tree snapshot of the page. Returns text-based representation with element refs like [ref=e1], [ref=e2] for targeting.',\n inputSchema: snapshotInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.snapshot(input, threadId);\n },\n });\n}\n","/**\n * browser_tabs - Manage browser tabs\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { tabsInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createTabsTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.TABS,\n description: 'Manage browser tabs: list, open new, switch, or close tabs.',\n inputSchema: tabsInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.tabs(input, threadId);\n },\n });\n}\n","/**\n * browser_type - Type text into an element\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { typeInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createTypeTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.TYPE,\n description: 'Type text into an input element. Use clear: true to replace existing content.',\n inputSchema: typeInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.type(input, threadId);\n },\n });\n}\n","/**\n * browser_wait - Wait for an element or condition\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { waitInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createWaitTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.WAIT,\n description: 'Wait for an element to appear, disappear, or reach a state.',\n inputSchema: waitInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.wait(input, threadId);\n },\n });\n}\n","/**\n * AgentBrowser Tools\n *\n * Creates browser tools bound to an AgentBrowser instance.\n * Each tool is defined in its own file for maintainability.\n */\n\nimport type { Tool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { createBackTool } from './back';\nimport { createClickTool } from './click';\nimport { createCloseTool } from './close';\nimport { BROWSER_TOOLS } from './constants';\nimport { createDialogTool } from './dialog';\nimport { createDragTool } from './drag';\nimport { createEvaluateTool } from './evaluate';\nimport { createGotoTool } from './goto';\nimport { createHoverTool } from './hover';\nimport { createPressTool } from './press';\nimport { createScrollTool } from './scroll';\nimport { createSelectTool } from './select';\nimport { createSnapshotTool } from './snapshot';\nimport { createTabsTool } from './tabs';\nimport { createTypeTool } from './type';\nimport { createWaitTool } from './wait';\n\nexport { BROWSER_TOOLS, type BrowserToolName } from './constants';\n\n/**\n * Creates all browser tools bound to an AgentBrowser instance.\n * The browser is lazily initialized on first tool use.\n */\nexport function createAgentBrowserTools(browser: AgentBrowser): Record<string, Tool<any, any>> {\n return {\n // Core (9)\n [BROWSER_TOOLS.GOTO]: createGotoTool(browser),\n [BROWSER_TOOLS.SNAPSHOT]: createSnapshotTool(browser),\n [BROWSER_TOOLS.CLICK]: createClickTool(browser),\n [BROWSER_TOOLS.TYPE]: createTypeTool(browser),\n [BROWSER_TOOLS.PRESS]: createPressTool(browser),\n [BROWSER_TOOLS.SELECT]: createSelectTool(browser),\n [BROWSER_TOOLS.SCROLL]: createScrollTool(browser),\n [BROWSER_TOOLS.CLOSE]: createCloseTool(browser),\n // Extended\n [BROWSER_TOOLS.HOVER]: createHoverTool(browser),\n [BROWSER_TOOLS.BACK]: createBackTool(browser),\n [BROWSER_TOOLS.DIALOG]: createDialogTool(browser),\n [BROWSER_TOOLS.WAIT]: createWaitTool(browser),\n [BROWSER_TOOLS.TABS]: createTabsTool(browser),\n [BROWSER_TOOLS.DRAG]: createDragTool(browser),\n // Escape hatch (1)\n [BROWSER_TOOLS.EVALUATE]: createEvaluateTool(browser),\n };\n}\n","import type { BrowserManager } from 'agent-browser';\n\n/**\n * Get the browser process PID from a BrowserManager instance via CDP.\n *\n * Playwright doesn't expose the browser process PID directly, so we use CDP's\n * SystemInfo.getProcessInfo to get it. This works for both regular browser\n * launches and persistent contexts (profiles).\n *\n * Returns undefined if the PID can't be retrieved (e.g., browser not running).\n */\nexport async function getBrowserPid(manager: BrowserManager): Promise<number | undefined> {\n try {\n // Try getBrowser() first, fall back to context.browser() for persistent contexts\n let browser = manager.getBrowser();\n if (!browser) {\n const ctx = manager.getContext();\n browser = ctx?.browser?.() ?? null;\n }\n if (!browser) return undefined;\n\n const cdp = await browser.newBrowserCDPSession();\n try {\n const info = await cdp.send('SystemInfo.getProcessInfo');\n const browserProcess = info.processInfo?.find((p: { type: string }) => p.type === 'browser');\n return browserProcess?.id;\n } finally {\n await cdp.detach().catch(() => undefined);\n }\n } catch {\n return undefined;\n }\n}\n","import { MastraBrowser, ScreencastStreamImpl, DEFAULT_THREAD_ID } from '@mastra/core/browser';\nimport type {\n BrowserState,\n BrowserTabState,\n BrowserToolError,\n ScreencastOptions,\n ScreencastStream,\n CdpSessionProvider,\n CdpSessionLike,\n MouseEventParams,\n KeyboardEventParams,\n} from '@mastra/core/browser';\nimport type { Tool } from '@mastra/core/tools';\n\nimport { BrowserManager } from 'agent-browser';\nimport type { BrowserLaunchOptions } from 'agent-browser';\nimport type { Page, Locator } from 'playwright-core';\nimport type {\n GotoInput,\n SnapshotInput,\n ClickInput,\n TypeInput,\n PressInput,\n SelectInput,\n ScrollInput,\n HoverInput,\n DialogInput,\n WaitInput,\n TabsInput,\n DragInput,\n EvaluateInput,\n} from './schemas';\nimport { AgentBrowserThreadManager } from './thread-manager';\nimport { createAgentBrowserTools } from './tools';\nimport type { BrowserConfig } from './types';\nimport { getBrowserPid } from './utils';\n\n/**\n * AgentBrowser - Browser automation using agent-browser (vercel-labs/agent-browser)\n *\n * Uses snapshot + refs pattern for LLM-friendly element targeting.\n */\nexport class AgentBrowser extends MastraBrowser {\n override readonly id: string;\n override readonly name = 'AgentBrowser';\n override readonly provider = 'vercel-labs/agent-browser';\n\n /** Shared browser manager instance (for 'shared' scope) - narrowed type from base class */\n declare protected sharedManager: BrowserManager | null;\n private defaultTimeout = 30000;\n /** Pending PID lookups — awaited in disconnect handlers to avoid racing. */\n private pidLookups = new Set<Promise<void>>();\n\n /** Thread manager - narrowed type from base class */\n declare protected threadManager: AgentBrowserThreadManager;\n\n constructor(config: BrowserConfig = {}) {\n super(config);\n this.id = `agent-browser-${Date.now()}`;\n if (config.timeout) {\n this.defaultTimeout = config.timeout;\n }\n\n // Default to 'shared' when cdpUrl is provided (connecting to existing browser)\n // Default to 'thread' otherwise (launching new browsers per thread)\n const effectiveScope = config.cdpUrl ? (config.scope ?? 'shared') : (config.scope ?? 'thread');\n\n // Initialize thread manager\n this.threadManager = new AgentBrowserThreadManager({\n scope: effectiveScope,\n browserConfig: { ...config, headless: this.headless },\n resolveCdpUrl: this.resolveCdpUrl.bind(this),\n logger: this.logger,\n // When a new thread session is created, notify listeners so screencast can start\n onSessionCreated: session => {\n // Trigger onBrowserReady callbacks for this specific thread\n // This allows ViewerRegistry to start screencast for just this thread\n this.notifyBrowserReady(session.threadId);\n },\n // When a new browser is created for a thread, set up close listener\n onBrowserCreated: (manager, threadId) => {\n this.setupCloseListenerForThread(manager, threadId);\n },\n });\n }\n\n // ---------------------------------------------------------------------------\n // Thread Scope (delegated to ThreadManager)\n // ---------------------------------------------------------------------------\n\n /**\n * Ensure browser is ready and thread session exists.\n * Creates a new page/context for the current thread if needed.\n *\n * For 'thread' scope, we need to create the thread session BEFORE\n * calling super.ensureReady() because the base class's ensureReady() will\n * call checkBrowserAlive(), which needs at least one thread browser to exist.\n */\n override async ensureReady(): Promise<void> {\n const scope = this.threadManager.getScope();\n const threadId = this.getCurrentThread();\n const existingSession = this.threadManager.hasSession(threadId);\n\n // For 'thread' scope, create the thread session first\n // This ensures checkBrowserAlive() has a browser to check\n if (scope === 'thread' && !existingSession) {\n await this.getManagerForThread(threadId);\n }\n\n await super.ensureReady();\n\n // For 'thread' scope with existing session, just verify it's accessible\n if (scope === 'thread' && existingSession) {\n await this.getManagerForThread(threadId);\n }\n }\n\n /**\n * Get the browser manager for the current thread.\n * Delegates to ThreadManager for scope handling.\n */\n async getManagerForThread(threadId?: string): Promise<BrowserManager> {\n const effectiveThreadId = threadId ?? this.getCurrentThread();\n const scope = this.threadManager.getScope();\n\n // In 'thread' scope with no specific threadId, check for an existing manager first\n // to avoid creating a new session unnecessarily\n if (scope === 'thread' && (!effectiveThreadId || effectiveThreadId === DEFAULT_THREAD_ID)) {\n const existingManager = this.threadManager.getExistingManagerForThread(effectiveThreadId);\n if (existingManager) {\n return existingManager;\n }\n // Fall through to create a session for DEFAULT_THREAD_ID\n }\n\n return this.threadManager.getManagerForThread(effectiveThreadId);\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n protected override async doLaunch(): Promise<void> {\n const scope = this.threadManager.getScope();\n\n // For 'thread' scope, don't launch a shared browser.\n // Each thread will get its own dedicated browser via createSession().\n if (scope === 'thread') {\n // Create a placeholder manager that's never launched.\n // Thread-specific browsers are created in ThreadManager.createSession().\n this.sharedManager = new BrowserManager();\n this.threadManager.setSharedManager(this.sharedManager);\n // Don't call notifyBrowserReady() here - that happens in onSessionCreated\n // when the first thread creates its dedicated browser.\n return;\n }\n\n // For 'shared' scope, launch the shared browser\n this.sharedManager = new BrowserManager();\n\n const localConfig = this.config as BrowserConfig;\n const launchOptions: BrowserLaunchOptions = {\n headless: this.headless,\n viewport: localConfig.viewport,\n profile: localConfig.profile,\n executablePath: localConfig.executablePath,\n storageState: localConfig.storageState,\n };\n\n // Resolve CDP URL if provided (can be string or function)\n if (localConfig.cdpUrl) {\n launchOptions.cdpUrl = await this.resolveCdpUrl(localConfig.cdpUrl);\n }\n\n await this.sharedManager.launch(launchOptions);\n\n // Register the shared manager with ThreadManager\n this.threadManager.setSharedManager(this.sharedManager);\n\n // Set up close listeners to detect external browser closure\n this.setupCloseListenerForSharedScope(this.sharedManager);\n }\n\n /**\n * Set up close event listeners for 'shared' scope browser.\n * This handles the case where the shared browser is closed externally.\n */\n private setupCloseListenerForSharedScope(manager: BrowserManager): void {\n try {\n // Capture the Chrome process PID via CDP while the browser is alive.\n // The base class uses this to kill orphaned child processes on disconnect.\n // Guard: only store if this manager is still the active shared manager,\n // otherwise a stale lookup could overwrite a newer PID.\n const pidLookup = getBrowserPid(manager)\n .then(pid => {\n if (pid && this.sharedManager === manager) this.sharedBrowserPid = pid;\n })\n .finally(() => this.pidLookups.delete(pidLookup));\n this.pidLookups.add(pidLookup);\n\n let disconnectHandled = false;\n const handleDisconnect = () => {\n if (disconnectHandled) return;\n disconnectHandled = true;\n // Wait for PID lookup to complete before cleanup, so killProcessGroup\n // has the actual PID instead of undefined.\n void pidLookup.catch(() => undefined).then(() => this.handleBrowserDisconnected());\n };\n\n // Listen for context close (fires when browser window is closed)\n const context = manager.getContext();\n if (context) {\n context.on('close', handleDisconnect);\n }\n\n // Listen for last page closing (primary detection method)\n const pages = manager.getPages();\n for (const page of pages) {\n page.on('close', () => {\n const remainingPages = manager.getPages();\n if (remainingPages.length === 0) {\n handleDisconnect();\n }\n });\n }\n } catch {\n // Ignore errors setting up close listener\n }\n }\n\n protected override async doClose(): Promise<void> {\n // Ensure all PID lookups have resolved before closing, so killProcessGroup\n // (called by the base class after doClose) has the correct PID.\n await Promise.allSettled([...this.pidLookups]);\n this.pidLookups.clear();\n\n // Close all thread sessions via ThreadManager\n await this.threadManager.destroyAllSessions();\n this.setCurrentThread(undefined); // Reset to default thread\n\n // Close the main browser manager (only for 'shared' scope where it's actually launched)\n const scope = this.threadManager.getScope();\n if (scope === 'shared' && this.sharedManager) {\n await this.sharedManager.close();\n }\n this.sharedManager = null;\n }\n\n /**\n * Check if the browser is still alive by verifying the page is connected.\n * Called by base class ensureReady() to detect externally closed browsers.\n */\n protected async checkBrowserAlive(): Promise<boolean> {\n const scope = this.threadManager.getScope();\n\n // For 'thread' scope, check if any thread browsers are running\n if (scope === 'thread') {\n return this.threadManager.hasActiveThreadManagers();\n }\n\n // For 'shared' scope, check the shared browser\n if (!this.sharedManager) {\n return false;\n }\n try {\n const page = this.sharedManager.getPage();\n // Will throw if browser is disconnected\n const url = page.url();\n // Save browser state for potential restore on relaunch\n if (url && url !== 'about:blank') {\n const state = await this.getBrowserState();\n if (state) {\n this.lastBrowserState = state;\n }\n }\n return true;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n if (this.isDisconnectionError(msg)) {\n this.logger.debug?.('Browser was externally closed');\n }\n return false;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Tools\n // ---------------------------------------------------------------------------\n\n /**\n * Get the browser tools for this provider.\n * Returns 17 flat tools for browser automation.\n */\n getTools(): Record<string, Tool<any, any>> {\n return createAgentBrowserTools(this);\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Get the page for the current thread.\n * Uses thread scope if enabled, otherwise returns the shared page.\n * @param explicitThreadId - Optional thread ID to use instead of getCurrentThread()\n * Use this to avoid race conditions in concurrent tool calls.\n */\n private async getPage(explicitThreadId?: string): Promise<Page> {\n const scope = this.getScope();\n const threadId = explicitThreadId ?? this.getCurrentThread();\n // For thread scope, always use threadManager.getPageForThread\n if (scope === 'thread') {\n return this.threadManager.getPageForThread(threadId);\n }\n if (!this.sharedManager) throw new Error('Browser not launched');\n return this.sharedManager.getPage();\n }\n\n /**\n * Get the active page for a thread (implements abstract method from base class).\n * Returns null if no page is available, unlike getPage which throws.\n */\n protected async getActivePage(threadId?: string): Promise<Page | null> {\n try {\n return await this.getPage(threadId);\n } catch {\n return null;\n }\n }\n\n /**\n * Set up close event listener for a thread's browser manager.\n * This handles the case where a thread's browser is closed externally.\n */\n private setupCloseListenerForThread(manager: BrowserManager, threadId: string): void {\n try {\n // Capture the Chrome process PID via CDP while the browser is alive.\n // The base class uses this to kill orphaned child processes on disconnect.\n // Guard: only store if this manager is still the active one for the thread,\n // otherwise a stale lookup could overwrite a newer PID.\n const pidLookup = getBrowserPid(manager)\n .then(pid => {\n if (pid && this.threadManager?.getExistingManagerForThread(threadId) === manager) {\n this.threadBrowserPids.set(threadId, pid);\n }\n })\n .finally(() => this.pidLookups.delete(pidLookup));\n this.pidLookups.add(pidLookup);\n\n let disconnectHandled = false;\n const handleDisconnect = () => {\n if (disconnectHandled) return;\n disconnectHandled = true;\n // Wait for PID lookup to complete before cleanup, so killProcessGroup\n // has the actual PID instead of undefined.\n void pidLookup.catch(() => undefined).then(() => this.handleThreadBrowserDisconnected(threadId));\n };\n\n // Listen for context close (fires when browser window is closed)\n const context = manager.getContext();\n if (context) {\n context.on('close', handleDisconnect);\n }\n\n // Listen for last page closing (primary detection method)\n const pages = manager.getPages();\n for (const page of pages) {\n page.on('close', () => {\n const remainingPages = manager.getPages();\n if (remainingPages.length === 0) {\n handleDisconnect();\n }\n });\n }\n } catch {\n // Ignore errors setting up close listener\n }\n }\n\n /**\n * Create an error response from an exception.\n * Extends base class to add agent-browser specific error handling.\n */\n protected override createErrorFromException(error: unknown, context: string): BrowserToolError {\n const msg = error instanceof Error ? error.message : String(error);\n\n // Check for stale refs (agent-browser specific)\n if (msg.includes('stale') || msg.includes('Stale')) {\n return this.createError(\n 'stale_ref',\n 'Element ref is no longer valid.',\n 'Get a fresh snapshot and use updated refs.',\n );\n }\n\n // Check for element not found (agent-browser specific)\n if (msg.includes('not found') || msg.includes('No element')) {\n return this.createError(\n 'element_not_found',\n 'Element not found.',\n 'Check the ref is correct or get a fresh snapshot.',\n );\n }\n\n // Delegate to base class for common errors\n return super.createErrorFromException(error, context);\n }\n\n private async requireLocator(ref: string, threadId?: string): Promise<Locator | null> {\n const manager = await this.getManagerForThread(threadId);\n // Use the built-in getLocatorFromRef method which properly converts refs to locators\n return manager.getLocatorFromRef(ref);\n }\n\n private async getScrollInfo(threadId?: string): Promise<{\n scrollY: number;\n scrollHeight: number;\n viewportHeight: number;\n atTop: boolean;\n atBottom: boolean;\n percentDown: number;\n }> {\n const page = await this.getPage(threadId);\n const info = (await page.evaluate(`({\n scrollY: Math.round(window.scrollY),\n scrollHeight: document.documentElement.scrollHeight,\n viewportHeight: window.innerHeight\n })`)) as { scrollY: number; scrollHeight: number; viewportHeight: number } | undefined;\n\n // Handle cases where evaluate returns undefined (e.g., in tests)\n if (!info || typeof info.scrollHeight !== 'number') {\n return {\n scrollY: 0,\n scrollHeight: 0,\n viewportHeight: 0,\n atTop: true,\n atBottom: true,\n percentDown: 0,\n };\n }\n\n const maxScroll = info.scrollHeight - info.viewportHeight;\n return {\n ...info,\n atTop: info.scrollY < 50,\n atBottom: info.scrollY >= maxScroll - 50,\n percentDown: maxScroll > 0 ? Math.round((info.scrollY / maxScroll) * 100) : 0,\n };\n }\n\n // ---------------------------------------------------------------------------\n // URL Access\n // ---------------------------------------------------------------------------\n\n /**\n * Get the current page URL without launching the browser.\n * @param threadId - Optional thread ID for thread-isolated browsers\n * @returns The current URL string, or null if browser is not running\n */\n override async getCurrentUrl(threadId?: string): Promise<string | null> {\n if (!this.isBrowserRunning()) {\n return null;\n }\n try {\n const effectiveThreadId = threadId ?? this.getCurrentThread();\n const scope = this.threadManager.getScope();\n\n // For 'thread' scope, check if we have an existing session first\n // Don't create a new session just to get the URL\n if (scope === 'thread' && effectiveThreadId) {\n const manager = this.threadManager.getExistingManagerForThread(effectiveThreadId);\n if (!manager) {\n return null; // No session yet, don't create one\n }\n const url = manager.getPage().url();\n // Save browser state for potential restore on relaunch (before external close)\n if (url && url !== 'about:blank') {\n const state = this.getBrowserStateForManager(manager);\n if (state) {\n this.threadManager.updateBrowserState(effectiveThreadId, state);\n }\n }\n return url;\n }\n\n // For 'shared' scope, use the shared manager\n const manager = await this.getManagerForThread(threadId);\n const url = manager.getPage().url();\n // Save browser state for potential restore on relaunch (before external close)\n if (url && url !== 'about:blank') {\n const state = this.getBrowserStateForManager(manager);\n if (state) {\n this.lastBrowserState = state;\n }\n }\n return url;\n } catch {\n return null;\n }\n }\n\n /**\n * Navigate to a URL (simple form). Used internally for restoring state on relaunch.\n */\n override async navigateTo(url: string): Promise<void> {\n if (!this.isBrowserRunning()) {\n return;\n }\n try {\n const page = await this.getPage();\n await page.goto(url, {\n timeout: this.defaultTimeout,\n waitUntil: 'domcontentloaded',\n });\n } catch {\n // Silently ignore navigation errors during restore\n }\n }\n\n /**\n * Get the current browser state (all tabs and active tab index).\n */\n override async getBrowserState(threadId?: string): Promise<BrowserState | null> {\n if (!this.isBrowserRunning()) {\n return null;\n }\n try {\n const manager = await this.getManagerForThread(threadId);\n return this.getBrowserStateForManager(manager);\n } catch {\n return null;\n }\n }\n\n /**\n * Get browser state for a thread (implements abstract method from base class).\n * Sync version that uses existing manager lookup without creating sessions.\n */\n protected getBrowserStateForThread(threadId?: string): BrowserState | null {\n const effectiveThreadId = threadId ?? this.getCurrentThread() ?? DEFAULT_THREAD_ID;\n const manager = this.threadManager.getExistingManagerForThread(effectiveThreadId);\n if (!manager) return null;\n return this.getBrowserStateForManager(manager);\n }\n\n /**\n * Get browser state from a specific manager instance.\n */\n private getBrowserStateForManager(manager: BrowserManager): BrowserState | null {\n try {\n const pages = manager.getPages();\n const activeIndex = manager.getActiveIndex();\n\n const tabs: BrowserTabState[] = pages.map(page => ({\n url: page.url(),\n }));\n\n return {\n tabs,\n activeTabIndex: activeIndex,\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Get all open tabs with their URLs and titles.\n */\n override async getTabState(threadId?: string): Promise<BrowserTabState[]> {\n const state = await this.getBrowserState(threadId);\n return state?.tabs ?? [];\n }\n\n /**\n * Get the active tab index.\n */\n override async getActiveTabIndex(threadId?: string): Promise<number> {\n if (!this.isBrowserRunning()) {\n return 0;\n }\n try {\n const manager = await this.getManagerForThread(threadId);\n return manager.getActiveIndex();\n } catch {\n return 0;\n }\n }\n\n /**\n * Export the current browser session's storage state (cookies, localStorage) to a JSON file.\n * This can later be loaded via the `storageState` config option to restore the session.\n *\n * @param path - File path to save the storage state JSON\n * @param threadId - Optional thread ID (defaults to current thread)\n */\n async exportStorageState(path: string, threadId?: string): Promise<void> {\n const effectiveThreadId = threadId ?? this.getCurrentThread();\n const manager = this.threadManager.getExistingManagerForThread(effectiveThreadId);\n if (!manager) {\n throw new Error('No browser is running. Launch a browser first before exporting storage state.');\n }\n const context = manager.getContext();\n if (!context) {\n throw new Error('Browser context not available');\n }\n await context.storageState({ path });\n }\n\n // ---------------------------------------------------------------------------\n // 1. browser_goto - Navigate to URL\n // ---------------------------------------------------------------------------\n\n async goto(\n input: GotoInput,\n threadId?: string,\n ): Promise<{ success: true; url: string; title: string; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n\n await page.goto(input.url, {\n timeout: input.timeout ?? this.defaultTimeout,\n waitUntil: input.waitUntil ?? 'domcontentloaded',\n });\n\n return {\n success: true,\n url: page.url(),\n title: await page.title(),\n hint: 'Take a snapshot to see interactive elements and get refs.',\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Goto');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 2. browser_snapshot - Capture accessibility tree\n // ---------------------------------------------------------------------------\n\n async snapshot(\n input: SnapshotInput,\n threadId?: string,\n ): Promise<\n | {\n success: true;\n snapshot: string;\n url: string;\n title: string;\n elementCount: number;\n scroll: string;\n hint?: string;\n }\n | BrowserToolError\n > {\n try {\n const manager = await this.getManagerForThread(threadId);\n const page = await this.getPage(threadId);\n const rawSnapshot = await manager.getSnapshot({\n interactive: input.interactiveOnly ?? true,\n compact: true,\n });\n\n // Transform tree refs from [ref=e1] format to @e1 format for consistency\n const snapshot = (rawSnapshot.tree ?? '').replace(/\\[ref=(\\w+)\\]/g, '@$1');\n\n // Get scroll position info\n const scrollInfo = await this.getScrollInfo(threadId);\n let scrollText: string;\n if (scrollInfo.atTop && !scrollInfo.atBottom) {\n scrollText = 'TOP - more content below';\n } else if (scrollInfo.atBottom) {\n scrollText = 'BOTTOM of page';\n } else {\n scrollText = `${scrollInfo.percentDown}% down`;\n }\n\n // Count refs\n const refs = snapshot.match(/@e\\d+/g) || [];\n const elementCount = new Set(refs).size;\n\n return {\n success: true,\n snapshot,\n url: page.url(),\n title: await page.title(),\n elementCount,\n scroll: scrollText,\n hint:\n elementCount === 0\n ? 'No interactive elements found. Try scrolling or setting interactiveOnly:false.'\n : undefined,\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Snapshot');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 3. browser_click - Click on element\n // ---------------------------------------------------------------------------\n\n async click(\n input: ClickInput,\n threadId?: string,\n ): Promise<{ success: true; url: string; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n const locator = await this.requireLocator(input.ref, threadId);\n\n if (!locator) {\n return this.createError(\n 'stale_ref',\n `Ref ${input.ref} not found. The page has changed.`,\n 'Take a new snapshot to see the current page state and get fresh refs.',\n );\n }\n\n await locator.click({\n button: input.button ?? 'left',\n clickCount: input.clickCount ?? 1,\n modifiers: input.modifiers,\n timeout: this.defaultTimeout,\n });\n\n return {\n success: true,\n url: page.url(),\n hint: 'Take a new snapshot to see updated page state and get fresh refs.',\n };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n\n if (errorMsg.includes('intercepts pointer events')) {\n return this.createError(\n 'element_blocked',\n `Element ${input.ref} is blocked by another element.`,\n 'Take a new snapshot to see what is blocking. Dismiss any modals or scroll the element into view.',\n );\n }\n\n return this.createErrorFromException(error, 'Click');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 4. browser_type - Type text into element\n // ---------------------------------------------------------------------------\n\n async type(\n input: TypeInput,\n threadId?: string,\n ): Promise<{ success: true; value: string; url: string; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n const locator = await this.requireLocator(input.ref, threadId);\n\n if (!locator) {\n return this.createError(\n 'stale_ref',\n `Ref ${input.ref} not found. The page has changed.`,\n 'Take a new snapshot to see the current page state and get fresh refs.',\n );\n }\n\n if (input.clear) {\n await locator.fill('', { timeout: this.defaultTimeout });\n }\n\n if (input.delay) {\n await locator.focus();\n for (const char of input.text) {\n await page.keyboard.press(char);\n await new Promise(r => setTimeout(r, input.delay));\n }\n } else {\n await locator.fill(input.text, { timeout: this.defaultTimeout });\n }\n\n // Get the actual value in the field\n const value = await locator.inputValue({ timeout: 1000 }).catch(() => input.text);\n\n return {\n success: true,\n value,\n url: page.url(),\n hint: 'Take a new snapshot if you need to interact with more elements.',\n };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n\n if (\n errorMsg.includes('is not an <input>') ||\n errorMsg.includes('not an input') ||\n errorMsg.includes('Cannot type') ||\n errorMsg.includes('not focusable')\n ) {\n return this.createError(\n 'not_focusable',\n `Element ${input.ref} is not a text input field.`,\n 'Take a new snapshot and look for elements with role \"textbox\" or \"searchbox\".',\n );\n }\n\n return this.createErrorFromException(error, 'Type');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 5. browser_press - Press keyboard key(s)\n // ---------------------------------------------------------------------------\n\n async press(\n input: PressInput,\n threadId?: string,\n ): Promise<{ success: true; url: string; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n await page.keyboard.press(input.key);\n\n return {\n success: true,\n url: page.url(),\n hint: 'Take a new snapshot if the page may have changed.',\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Press');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 6. browser_select - Select dropdown option\n // ---------------------------------------------------------------------------\n\n async select(\n input: SelectInput,\n threadId?: string,\n ): Promise<{ success: true; selected: string[]; url: string; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n const locator = await this.requireLocator(input.ref, threadId);\n\n if (!locator) {\n return this.createError(\n 'stale_ref',\n `Ref ${input.ref} not found. The page has changed.`,\n 'Take a new snapshot to get fresh refs.',\n );\n }\n\n const selectValue: { value?: string; label?: string; index?: number } = {};\n if (input.value) selectValue.value = input.value;\n if (input.label) selectValue.label = input.label;\n if (input.index !== undefined) selectValue.index = input.index;\n\n const selected = await locator.selectOption(selectValue, {\n timeout: this.defaultTimeout,\n });\n\n return {\n success: true,\n selected,\n url: page.url(),\n hint: 'Selection complete. Take a snapshot if you need to continue.',\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Select');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 7. browser_scroll - Scroll page or element\n // ---------------------------------------------------------------------------\n\n async scroll(\n input: ScrollInput,\n threadId?: string,\n ): Promise<{ success: true; position: { x: number; y: number }; scroll: string; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n\n if (input.ref) {\n const locator = await this.requireLocator(input.ref, threadId);\n if (locator) {\n await locator.scrollIntoViewIfNeeded({ timeout: this.defaultTimeout });\n }\n } else {\n const direction = input.direction;\n const amount = input.amount ?? 300;\n\n let deltaX = 0;\n let deltaY = 0;\n\n switch (direction) {\n case 'up':\n deltaY = -amount;\n break;\n case 'down':\n deltaY = amount;\n break;\n case 'left':\n deltaX = -amount;\n break;\n case 'right':\n deltaX = amount;\n break;\n }\n\n await page.evaluate(\n ({ x, y }: { x: number; y: number }) => {\n (globalThis as any).scrollBy(x, y);\n },\n { x: deltaX, y: deltaY },\n );\n }\n\n // Get new scroll position\n const scrollInfo = await this.getScrollInfo(threadId);\n let scrollText: string;\n if (scrollInfo.atTop && !scrollInfo.atBottom) {\n scrollText = 'TOP - more content below';\n } else if (scrollInfo.atBottom) {\n scrollText = 'BOTTOM of page';\n } else {\n scrollText = `${scrollInfo.percentDown}% down`;\n }\n\n return {\n success: true,\n position: { x: 0, y: scrollInfo.scrollY },\n scroll: scrollText,\n hint: 'Take a new snapshot to see elements in the new viewport.',\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Scroll');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 8. browser_hover - Hover over element\n // ---------------------------------------------------------------------------\n\n async hover(\n input: HoverInput,\n threadId?: string,\n ): Promise<{ success: true; url: string; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n const locator = await this.requireLocator(input.ref, threadId);\n\n if (!locator) {\n return this.createError(\n 'stale_ref',\n `Ref ${input.ref} not found. The page has changed.`,\n 'Take a new snapshot to get fresh refs.',\n );\n }\n\n await locator.hover({ timeout: this.defaultTimeout });\n\n return {\n success: true,\n url: page.url(),\n hint: 'Take a new snapshot to see any hover-triggered elements (dropdowns, tooltips).',\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Hover');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 10. browser_back - Navigate back\n // ---------------------------------------------------------------------------\n\n async back(\n threadId?: string,\n ): Promise<{ success: true; url: string; title: string; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n await page.goBack({ timeout: this.defaultTimeout });\n\n return {\n success: true,\n url: page.url(),\n title: await page.title(),\n hint: 'Take a new snapshot to see the previous page.',\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Back');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 11. browser_dialog - Click element that triggers dialog and handle it\n // ---------------------------------------------------------------------------\n\n async dialog(\n input: DialogInput,\n threadId?: string,\n ): Promise<\n | { success: true; action: 'accept' | 'dismiss'; dialogType: string; message: string; hint: string }\n | BrowserToolError\n > {\n try {\n const page = await this.getPage(threadId);\n const locator = await this.requireLocator(input.triggerRef, threadId);\n\n if (!locator) {\n return this.createError(\n 'stale_ref',\n `Trigger ref ${input.triggerRef} not found.`,\n 'Take a new snapshot to get fresh refs.',\n );\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n page.off('dialog', dialogHandler);\n reject(\n new Error(`No dialog appeared after clicking ${input.triggerRef}. The element may not trigger a dialog.`),\n );\n }, this.defaultTimeout);\n\n const dialogHandler = async (dialog: any) => {\n clearTimeout(timeout);\n try {\n const dialogType = dialog.type();\n const message = dialog.message();\n\n if (input.action === 'accept') {\n await dialog.accept(input.text);\n } else {\n await dialog.dismiss();\n }\n resolve({\n success: true,\n action: input.action,\n dialogType,\n message,\n hint: 'Dialog handled. Take a snapshot to continue.',\n });\n } catch (e) {\n reject(e);\n }\n };\n\n // Set up listener first, then click\n page.once('dialog', dialogHandler);\n\n // Click the trigger element (don't await - dialog blocks execution)\n locator.click({ timeout: this.defaultTimeout }).catch((e: Error) => {\n clearTimeout(timeout);\n page.off('dialog', dialogHandler);\n reject(e);\n });\n });\n } catch (error) {\n return this.createErrorFromException(error, 'Dialog');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 13. browser_wait - Wait for element or condition\n // ---------------------------------------------------------------------------\n\n async wait(input: WaitInput, threadId?: string): Promise<{ success: true; hint: string } | BrowserToolError> {\n try {\n const timeout = input.timeout ?? this.defaultTimeout;\n\n if (input.ref) {\n const locator = await this.requireLocator(input.ref, threadId);\n if (!locator) {\n return this.createError('stale_ref', `Ref ${input.ref} not found.`, 'Take a new snapshot to get fresh refs.');\n }\n\n const state = input.state ?? 'visible';\n await locator.waitFor({ state, timeout });\n\n return {\n success: true,\n hint: `Element is now ${state}. Take a snapshot to continue.`,\n };\n } else {\n const page = await this.getPage(threadId);\n await page.waitForTimeout(timeout);\n return {\n success: true,\n hint: 'Wait complete. Take a snapshot to see current state.',\n };\n }\n } catch (error) {\n return this.createErrorFromException(error, 'Wait');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 14. browser_tabs - Manage browser tabs\n // ---------------------------------------------------------------------------\n\n async tabs(\n input: TabsInput,\n threadId?: string,\n ): Promise<\n | {\n success: true;\n tabs?: unknown[];\n index?: number;\n url?: string;\n title?: string;\n remaining?: number;\n hint: string;\n }\n | BrowserToolError\n > {\n try {\n const browser = await this.getManagerForThread(threadId);\n if (!browser) {\n return this.createError(\n 'browser_closed',\n 'Browser not launched',\n 'Call a navigation tool first to launch the browser.',\n );\n }\n\n switch (input.action) {\n case 'list': {\n if (!browser.listTabs) {\n return this.createError(\n 'browser_error',\n 'Tab management not supported',\n 'This browser provider does not support tab management.',\n );\n }\n const tabsList = await browser.listTabs();\n return {\n success: true,\n tabs: tabsList,\n hint: 'Use browser_tabs with action:\"switch\" and index to change tabs.',\n };\n }\n\n case 'new': {\n if (!browser.newTab) {\n return this.createError(\n 'browser_error',\n 'Tab management not supported',\n 'This browser provider does not support tab management.',\n );\n }\n const result = await browser.newTab();\n // If URL provided, navigate to it after creating the tab\n if (input.url) {\n const page = await this.getPage(threadId);\n await page.goto(input.url);\n }\n // Save state after new tab\n this.updateSessionBrowserState(threadId);\n return {\n success: true,\n ...result,\n hint: 'New tab opened. Take a snapshot to see its content.',\n };\n }\n\n case 'switch': {\n if (!browser.switchTo) {\n return this.createError(\n 'browser_error',\n 'Tab management not supported',\n 'This browser provider does not support tab management.',\n );\n }\n await browser.switchTo(input.index!);\n // Reconnect screencast to show the new active tab\n await this.reconnectScreencastForThread(threadId, 'tab switch');\n const page = browser.getPage();\n const pageUrl = page.url();\n // Emit URL directly after switch using the same threadId\n const streamKey = this.getStreamKey(threadId);\n const stream = this.activeScreencastStreams.get(streamKey);\n if (pageUrl && stream?.isActive()) {\n stream.emitUrl(pageUrl);\n }\n // Save state after switch (captures activeIndex change)\n this.updateSessionBrowserState(threadId);\n return {\n success: true,\n index: input.index,\n url: pageUrl,\n title: await page.title(),\n hint: 'Tab switched. Take a snapshot to see its content.',\n };\n }\n\n case 'close': {\n if (!browser.closeTab) {\n return this.createError(\n 'browser_error',\n 'Tab management not supported',\n 'This browser provider does not support tab management.',\n );\n }\n await browser.closeTab(input.index);\n // Reconnect screencast - it may now be pointing to a different tab\n await this.reconnectScreencastForThread(threadId, 'tab close');\n // Save state AFTER close (remaining tabs)\n this.updateSessionBrowserState(threadId);\n const tabsList = (await browser.listTabs?.()) ?? [];\n return {\n success: true,\n remaining: tabsList.length,\n hint: tabsList.length > 0 ? 'Tab closed. Take a snapshot to see current tab.' : 'All tabs closed.',\n };\n }\n\n default:\n return this.createError(\n 'browser_error',\n `Unknown tabs action: ${(input as any).action}`,\n 'Use \"list\", \"new\", \"switch\", or \"close\".',\n );\n }\n } catch (error) {\n return this.createErrorFromException(error, 'Tabs');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 15. browser_drag - Drag element to target\n // ---------------------------------------------------------------------------\n\n async drag(\n input: DragInput,\n threadId?: string,\n ): Promise<{ success: true; url: string; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n\n // Resolve source locator (prefer ref, fallback to selector)\n let sourceLocator: Awaited<ReturnType<typeof this.requireLocator>> | null = null;\n if (input.sourceRef) {\n sourceLocator = await this.requireLocator(input.sourceRef, threadId);\n } else if (input.sourceSelector) {\n sourceLocator = page.locator(input.sourceSelector);\n }\n\n if (!sourceLocator) {\n return this.createError(\n 'stale_ref',\n input.sourceRef\n ? `Source ref ${input.sourceRef} not found.`\n : 'No source element specified. Provide sourceRef or sourceSelector.',\n input.sourceRef\n ? 'Take a new snapshot to get fresh refs, or use sourceSelector for elements not in the accessibility tree.'\n : undefined,\n );\n }\n\n // Resolve target locator (prefer ref, fallback to selector)\n let targetLocator: Awaited<ReturnType<typeof this.requireLocator>> | null = null;\n if (input.targetRef) {\n targetLocator = await this.requireLocator(input.targetRef, threadId);\n } else if (input.targetSelector) {\n targetLocator = page.locator(input.targetSelector);\n }\n\n if (!targetLocator) {\n return this.createError(\n 'stale_ref',\n input.targetRef\n ? `Target ref ${input.targetRef} not found.`\n : 'No target element specified. Provide targetRef or targetSelector.',\n input.targetRef\n ? 'Take a new snapshot to get fresh refs, or use targetSelector for elements not in the accessibility tree.'\n : undefined,\n );\n }\n\n await sourceLocator.dragTo(targetLocator, { timeout: this.defaultTimeout });\n\n return {\n success: true,\n url: page.url(),\n hint: 'Drag complete. Take a snapshot to see the result.',\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Drag');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 16. browser_evaluate - Execute JavaScript\n // ---------------------------------------------------------------------------\n\n async evaluate(\n input: EvaluateInput,\n threadId?: string,\n ): Promise<{ success: true; result: unknown; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n const result = await page.evaluate(input.script);\n\n return {\n success: true,\n result,\n hint: 'JavaScript executed. Take a snapshot if the page may have changed.',\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Evaluate');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 17. browser_close - Close browser\n // ---------------------------------------------------------------------------\n\n async closeBrowser(): Promise<{ success: true; hint: string } | BrowserToolError> {\n try {\n await this.close();\n return {\n success: true,\n hint: 'Browser closed. Call browser_goto to start a new session.',\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Close');\n }\n }\n\n // ---------------------------------------------------------------------------\n // Screencast (for Studio live view)\n // ---------------------------------------------------------------------------\n\n async startScreencast(_options?: ScreencastOptions): Promise<ScreencastStream> {\n const requestedThreadId = _options?.threadId;\n // For 'thread' scope, use the requested threadId or fall back to current thread\n // For 'shared' scope, threadId is only used for stream keying\n const effectiveThreadId =\n this.getScope() === 'thread'\n ? (requestedThreadId ?? this.getCurrentThread() ?? DEFAULT_THREAD_ID)\n : requestedThreadId;\n\n // For 'thread' scope, each thread has its own BrowserManager\n // For 'shared' scope, we use the shared manager\n let browserManager: BrowserManager;\n if (this.getScope() === 'thread') {\n browserManager = await this.getManagerForThread(effectiveThreadId);\n } else {\n if (!this.sharedManager) throw new Error('Browser not launched');\n browserManager = this.sharedManager;\n }\n\n // Create CDP session provider adapter\n // The provider always gets a fresh CDP session for the current active page\n const provider: CdpSessionProvider = {\n getCdpSession: async () => {\n // Always get the current active page and create a fresh CDP session for it\n const currentPage = browserManager.getPage();\n if (!currentPage) {\n throw new Error('No active page available');\n }\n const cdpSession = await currentPage.context().newCDPSession(currentPage);\n return cdpSession as unknown as CdpSessionLike;\n },\n isBrowserRunning: () => browserManager.isLaunched(),\n };\n\n const stream = new ScreencastStreamImpl(provider, _options);\n\n // Store reference so tabs() can trigger reconnects - keyed by thread\n const streamKey = this.getStreamKey(effectiveThreadId);\n this.activeScreencastStreams.set(streamKey, stream);\n\n // Set up tab change listener to reconnect screencast when a new tab opens\n const context = browserManager.getContext();\n if (context) {\n const onNewPage = (_newPage: Page) => {\n // Small delay to let agent-browser update its activePageIndex\n setTimeout(() => {\n if (stream.isActive()) {\n stream.reconnect().catch(() => {});\n }\n }, 100);\n };\n\n context.on('page', onNewPage);\n\n // Track page close handlers so we can clean them up\n const pageCloseHandlers = new Map<Page, () => void>();\n\n // Track framenavigated handlers for URL updates\n const frameNavigatedHandlers = new Map<\n Page,\n (frame: { url: () => string; parentFrame: () => unknown }) => void\n >();\n\n // Add close listener and framenavigated listener to all existing pages\n const setupPageListeners = (page: Page) => {\n // Navigation listener for URL updates\n const onFrameNavigated = (frame: { url: () => string; parentFrame: () => unknown }) => {\n // Only emit URL for main frame navigations\n if (!frame.parentFrame()) {\n stream.emitUrl(frame.url());\n // Update session state on navigation\n this.updateSessionBrowserState(effectiveThreadId);\n }\n };\n page.on('framenavigated', onFrameNavigated);\n frameNavigatedHandlers.set(page, onFrameNavigated);\n\n // Close listener\n const onClose = () => {\n pageCloseHandlers.delete(page);\n // Clean up framenavigated handler\n const navHandler = frameNavigatedHandlers.get(page);\n if (navHandler) {\n page.off('framenavigated', navHandler);\n frameNavigatedHandlers.delete(page);\n }\n // Small delay to let agent-browser update its internal state\n setTimeout(() => {\n const remainingPages = browserManager.getPages();\n if (stream.isActive() && remainingPages.length > 0) {\n stream.reconnect().catch(() => {});\n // Emit the URL of the new active page\n const activePage = remainingPages[browserManager.getActiveIndex()] || remainingPages[0];\n if (activePage) {\n const url = activePage.url();\n if (url && url !== 'about:blank') {\n stream.emitUrl(url);\n }\n }\n // Note: Don't save state here - races with browser shutdown.\n // State is saved via tool handlers instead.\n }\n }, 100);\n };\n page.once('close', onClose);\n pageCloseHandlers.set(page, onClose);\n };\n\n // Alias for backwards compatibility in the code below\n const setupPageCloseListener = setupPageListeners;\n\n // Set up listeners for existing pages\n for (const page of browserManager.getPages()) {\n setupPageCloseListener(page);\n }\n\n // Also set up listener for new pages\n const onNewPageWithCloseListener = (newPage: Page) => {\n setupPageCloseListener(newPage);\n // Emit the new page's current URL immediately (since framenavigated won't fire for the initial load)\n const url = newPage.url();\n if (url && url !== 'about:blank') {\n stream.emitUrl(url);\n }\n // Note: State is saved via tool handlers (new/switch/close), not events\n onNewPage(newPage);\n };\n\n context.off('page', onNewPage); // Remove the one we added above\n context.on('page', onNewPageWithCloseListener);\n\n // Clean up listeners when stream stops\n stream.once('stop', () => {\n context.off('page', onNewPageWithCloseListener);\n // Remove close handlers from all pages\n for (const [page, handler] of pageCloseHandlers) {\n page.off('close', handler);\n }\n pageCloseHandlers.clear();\n // Remove framenavigated handlers from all pages\n for (const [page, handler] of frameNavigatedHandlers) {\n page.off('framenavigated', handler);\n }\n frameNavigatedHandlers.clear();\n // Remove from streams map using captured key\n this.activeScreencastStreams.delete(streamKey);\n });\n }\n\n await stream.start();\n return stream as unknown as ScreencastStream;\n }\n\n // ---------------------------------------------------------------------------\n // Event Injection (for Studio live view interactivity)\n // ---------------------------------------------------------------------------\n\n override async injectMouseEvent(event: MouseEventParams, threadId?: string): Promise<void> {\n const effectiveThreadId = threadId ?? this.getCurrentThread();\n const manager = await this.getManagerForThread(effectiveThreadId);\n await manager.injectMouseEvent(event);\n }\n\n override async injectKeyboardEvent(event: KeyboardEventParams, threadId?: string): Promise<void> {\n // Get the appropriate manager based on scope\n // Use passed threadId (from input handler) or fall back to current thread\n const effectiveThreadId = threadId ?? this.getCurrentThread();\n const manager = await this.getManagerForThread(effectiveThreadId);\n\n // Use CDP directly to include windowsVirtualKeyCode\n // The agent-browser package's injectKeyboardEvent doesn't pass this field,\n // which breaks non-printable keys like Enter, Backspace, and arrows\n const cdp = await manager.getCDPSession();\n await cdp.send('Input.dispatchKeyEvent', {\n type: event.type,\n key: event.key,\n code: event.code,\n text: event.text,\n modifiers: event.modifiers ?? 0,\n windowsVirtualKeyCode: event.windowsVirtualKeyCode,\n });\n }\n}\n\nexport default AgentBrowser;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/thread-manager.ts","../src/schemas.ts","../src/tools/constants.ts","../src/tools/back.ts","../src/tools/click.ts","../src/tools/close.ts","../src/tools/dialog.ts","../src/tools/drag.ts","../src/tools/evaluate.ts","../src/tools/goto.ts","../src/tools/hover.ts","../src/tools/press.ts","../src/tools/screenshot.ts","../src/tools/scroll.ts","../src/tools/select.ts","../src/tools/snapshot.ts","../src/tools/tabs.ts","../src/tools/type.ts","../src/tools/wait.ts","../src/tools/index.ts","../src/utils.ts","../src/agent-browser.ts"],"names":["ThreadManager","BrowserManager","z","createTool","MastraBrowser","DEFAULT_THREAD_ID","manager","url","ScreencastStreamImpl"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * AgentBrowserThreadManager - Thread scope management for AgentBrowser\n *\n * Manages thread-scoped browser sessions using agent-browser's\n * BrowserManager capabilities (newWindow, switchTo, closeTab).\n */\n\nimport { ThreadManager } from '@mastra/core/browser';\nimport type { BrowserState, ThreadSession, ThreadManagerConfig } from '@mastra/core/browser';\nimport { BrowserManager } from 'agent-browser';\nimport type { BrowserLaunchOptions } from 'agent-browser';\nimport type { Page } from 'playwright-core';\nimport type { BrowserConfig } from './types';\n\n/**\n * Extended session info for AgentBrowser.\n */\ninterface AgentBrowserSession extends ThreadSession {\n /** For 'thread' scope: dedicated browser manager instance */\n manager?: BrowserManager;\n}\n\n/**\n * Configuration for AgentBrowserThreadManager.\n */\nexport interface AgentBrowserThreadManagerConfig extends ThreadManagerConfig {\n /** Browser configuration for launching new instances */\n browserConfig: BrowserConfig;\n /** Function to resolve CDP URL (may be async) */\n resolveCdpUrl?: (cdpUrl: string | (() => string | Promise<string>)) => Promise<string>;\n /** Callback when a new browser manager is created for a thread */\n onBrowserCreated?: (manager: BrowserManager, threadId: string) => void;\n}\n\n/**\n * Thread manager implementation for AgentBrowser.\n *\n * Supports two scope modes:\n * - 'shared': All threads share the shared browser manager\n * - 'thread': Each thread gets a dedicated browser manager instance\n */\nexport class AgentBrowserThreadManager extends ThreadManager<BrowserManager> {\n private readonly browserConfig: BrowserConfig;\n private readonly resolveCdpUrl?: (cdpUrl: string | (() => string | Promise<string>)) => Promise<string>;\n private readonly onBrowserCreated?: (manager: BrowserManager, threadId: string) => void;\n\n constructor(config: AgentBrowserThreadManagerConfig) {\n super(config);\n this.browserConfig = config.browserConfig;\n this.resolveCdpUrl = config.resolveCdpUrl;\n this.onBrowserCreated = config.onBrowserCreated;\n }\n\n /**\n * Get the page for a specific thread, creating session if needed.\n */\n async getPageForThread(threadId?: string): Promise<Page> {\n const manager = await this.getManagerForThread(threadId);\n return manager.getPage();\n }\n\n /**\n * Create a new session for a thread.\n */\n protected async createSession(threadId: string): Promise<AgentBrowserSession> {\n // Check for saved browser state before creating new session (for browser restore)\n const savedState = this.getSavedBrowserState(threadId);\n\n const session: AgentBrowserSession = {\n threadId,\n createdAt: Date.now(),\n browserState: savedState,\n };\n\n if (this.scope === 'thread') {\n // Thread scope - create a new browser manager for this thread\n const manager = new BrowserManager();\n\n const launchOptions: BrowserLaunchOptions = {\n headless: this.browserConfig.headless,\n viewport: this.browserConfig.viewport,\n profile: this.browserConfig.profile,\n executablePath: this.browserConfig.executablePath,\n storageState: this.browserConfig.storageState,\n };\n\n if (this.browserConfig.cdpUrl && this.resolveCdpUrl) {\n launchOptions.cdpUrl = await this.resolveCdpUrl(this.browserConfig.cdpUrl);\n }\n\n try {\n await manager.launch(launchOptions);\n } catch (error) {\n // Clean up manager on launch failure\n try {\n await manager.close();\n } catch {\n // Ignore close errors - launch already failed\n }\n throw error;\n }\n\n session.manager = manager;\n this.threadManagers.set(threadId, manager);\n\n try {\n // Restore browser state if available (before notifying parent to avoid screencast race)\n if (savedState && savedState.tabs.length > 0) {\n this.logger?.debug?.(`Restoring browser state for thread ${threadId}: ${savedState.tabs.length} tabs`);\n await this.restoreBrowserState(manager, savedState);\n }\n\n // Notify parent browser so it can set up close listeners\n // This is done after restoration so the screencast starts on the correct active page\n this.onBrowserCreated?.(manager, threadId);\n } catch (error) {\n // Roll back: remove from tracking and close the manager\n this.threadManagers.delete(threadId);\n session.manager = undefined;\n try {\n await manager.close();\n } catch {\n // Ignore close errors during rollback\n }\n throw error;\n }\n }\n // For 'shared' scope, no session setup needed - all threads share the manager\n\n return session;\n }\n\n /**\n * Restore browser state (multiple tabs) to a browser manager.\n */\n private async restoreBrowserState(manager: BrowserManager, state: BrowserState): Promise<void> {\n try {\n // Navigate first tab to first URL\n const firstTab = state.tabs[0];\n if (firstTab?.url) {\n const page = manager.getPage();\n if (page) {\n await page.goto(firstTab.url, { waitUntil: 'domcontentloaded' });\n }\n }\n\n // Open additional tabs\n for (let i = 1; i < state.tabs.length; i++) {\n const tab = state.tabs[i];\n if (tab?.url) {\n // newTab() creates a blank tab, then we navigate to the URL\n await manager.newTab();\n const page = manager.getPage();\n if (page) {\n await page.goto(tab.url, { waitUntil: 'domcontentloaded' });\n }\n }\n }\n\n // Switch to the active tab (always switch after opening tabs since newTab() changes active)\n if (state.tabs.length > 1 && state.activeTabIndex >= 0 && state.activeTabIndex < state.tabs.length) {\n await manager.switchTo(state.activeTabIndex);\n }\n } catch (error) {\n this.logger?.warn?.(`Failed to restore browser state: ${error}`);\n }\n }\n\n /**\n * Get the browser manager for a specific session.\n */\n protected getManagerForSession(session: AgentBrowserSession): BrowserManager {\n if (this.scope === 'thread' && session.manager) {\n return session.manager;\n }\n return this.getSharedManager();\n }\n\n /**\n * Destroy a session and clean up resources.\n */\n protected async doDestroySession(session: AgentBrowserSession): Promise<void> {\n if (this.scope === 'thread' && session.manager) {\n // Close the dedicated browser manager\n await session.manager.close();\n }\n // For 'shared' scope, nothing to clean up - all threads share the manager\n }\n\n /**\n * Destroy all sessions (called during browser close).\n * doDestroySession handles closing individual browser managers.\n */\n override async destroyAllSessions(): Promise<void> {\n await super.destroyAllSessions();\n }\n}\n","/**\n * AgentBrowser Tool Schemas\n *\n * Flat schemas for browser tools. Each tool has a single-purpose schema\n * without discriminated unions, making them easier for LLMs to understand.\n *\n * Tools:\n * - Core: goto, snapshot, click, type, press, select, scroll, close\n * - Extended: hover, back, dialog, wait, tabs, drag\n * - Escape Hatch: evaluate\n */\n\nimport { z } from 'zod';\n\n// =============================================================================\n// Core Tools (9)\n// =============================================================================\n\n/**\n * browser_goto - Navigate to a URL\n */\nexport const gotoInputSchema = z.object({\n url: z.string().describe('The URL to navigate to'),\n waitUntil: z\n .enum(['load', 'domcontentloaded', 'networkidle'])\n .optional()\n .describe('When to consider navigation complete (default: domcontentloaded)'),\n timeout: z.number().optional().describe('Navigation timeout in milliseconds'),\n});\nexport type GotoInput = z.output<typeof gotoInputSchema>;\n\n/**\n * browser_snapshot - Get accessibility tree snapshot\n */\nexport const snapshotInputSchema = z.object({\n interactiveOnly: z.boolean().optional().describe('Only include interactive elements (default: true)'),\n maxDepth: z.number().optional().describe('Maximum depth of the tree to return'),\n});\nexport type SnapshotInput = z.output<typeof snapshotInputSchema>;\n\n/**\n * browser_click - Click an element\n */\nexport const clickInputSchema = z.object({\n ref: z.string().describe('Element ref from snapshot (e.g., @e5)'),\n button: z.enum(['left', 'right', 'middle']).optional().describe('Mouse button (default: left)'),\n clickCount: z.number().optional().describe('Number of clicks (default: 1, use 2 for double-click)'),\n modifiers: z\n .array(z.enum(['Alt', 'Control', 'Meta', 'Shift']))\n .optional()\n .describe('Modifier keys to hold'),\n});\nexport type ClickInput = z.output<typeof clickInputSchema>;\n\n/**\n * browser_type - Type text into an element\n */\nexport const typeInputSchema = z.object({\n ref: z.string().describe('Element ref from snapshot'),\n text: z.string().describe('Text to type'),\n clear: z.boolean().optional().describe('Clear existing content before typing (default: false)'),\n delay: z.number().optional().describe('Delay between keystrokes in ms'),\n});\nexport type TypeInput = z.output<typeof typeInputSchema>;\n\n/**\n * browser_press - Press a keyboard key\n */\nexport const pressInputSchema = z.object({\n key: z.string().describe('Key to press (e.g., Enter, Tab, Escape, Control+a)'),\n modifiers: z\n .array(z.enum(['Alt', 'Control', 'Meta', 'Shift']))\n .optional()\n .describe('Modifier keys to hold'),\n});\nexport type PressInput = z.output<typeof pressInputSchema>;\n\n/**\n * browser_select - Select option from dropdown\n */\nexport const selectInputSchema = z\n .object({\n ref: z.string().describe('Select element ref from snapshot'),\n value: z.string().optional().describe('Option value to select'),\n label: z.string().optional().describe('Option label to select'),\n index: z.number().int().min(0).optional().describe('Option index to select (0-based)'),\n })\n .superRefine((data, ctx) => {\n if (data.value === undefined && data.label === undefined && data.index === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'At least one of value, label, or index is required',\n });\n }\n });\nexport type SelectInput = z.output<typeof selectInputSchema>;\n\n/**\n * browser_scroll - Scroll the page or element\n */\nexport const scrollInputSchema = z.object({\n direction: z.enum(['up', 'down', 'left', 'right']).describe('Scroll direction'),\n amount: z.number().optional().describe('Scroll amount in pixels (default: 300)'),\n ref: z.string().optional().describe('Element ref to scroll (scrolls page if omitted)'),\n});\nexport type ScrollInput = z.output<typeof scrollInputSchema>;\n\n/**\n * browser_close - Close the browser\n */\nexport const closeInputSchema = z.object({});\nexport type CloseInput = z.output<typeof closeInputSchema>;\n\n// =============================================================================\n// Extended Tools (7)\n// =============================================================================\n\n/**\n * browser_hover - Hover over an element\n */\nexport const hoverInputSchema = z.object({\n ref: z.string().describe('Element ref from snapshot'),\n});\nexport type HoverInput = z.output<typeof hoverInputSchema>;\n\n/**\n * browser_back - Go back in browser history\n */\nexport const backInputSchema = z.object({});\nexport type BackInput = z.output<typeof backInputSchema>;\n\n/**\n * browser_dialog - Click an element that triggers a dialog and handle it\n */\nexport const dialogInputSchema = z.object({\n triggerRef: z.string().describe('Element ref that triggers the dialog (e.g., @e5)'),\n action: z.enum(['accept', 'dismiss']).describe('Accept or dismiss the dialog'),\n text: z.string().optional().describe('Text to enter for prompt dialogs'),\n});\nexport type DialogInput = z.output<typeof dialogInputSchema>;\n\n/**\n * browser_wait - Wait for an element or condition\n */\nexport const waitInputSchema = z.object({\n ref: z.string().optional().describe('Element ref to wait for'),\n state: z\n .enum(['visible', 'hidden', 'attached', 'detached'])\n .optional()\n .describe('State to wait for (default: visible)'),\n timeout: z.number().optional().describe('Maximum wait time in ms (default: 30000)'),\n});\nexport type WaitInput = z.output<typeof waitInputSchema>;\n\n/**\n * browser_tabs - Manage browser tabs\n */\nexport const tabsInputSchema = z\n .object({\n action: z.enum(['list', 'new', 'switch', 'close']).describe('Tab action'),\n index: z.number().int().min(0).optional().describe('Tab index for switch/close'),\n url: z.string().optional().describe('URL to open in new tab'),\n })\n .superRefine((value, ctx) => {\n if (value.action === 'switch' && value.index === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['index'],\n message: 'index is required when action is \"switch\"',\n });\n }\n });\nexport type TabsInput = z.output<typeof tabsInputSchema>;\n\n/**\n * browser_drag - Drag an element to another element\n */\nexport const dragInputSchema = z\n .object({\n sourceRef: z.string().optional().describe('Element ref to drag from (e.g., @e5)'),\n targetRef: z.string().optional().describe('Element ref to drag to (e.g., @e7)'),\n sourceSelector: z.string().optional().describe('CSS selector for source element (use if ref not available)'),\n targetSelector: z.string().optional().describe('CSS selector for target element (use if ref not available)'),\n })\n .superRefine((data, ctx) => {\n if (!data.sourceRef && !data.sourceSelector) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['sourceRef'],\n message: 'Either sourceRef or sourceSelector is required',\n });\n }\n if (!data.targetRef && !data.targetSelector) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['targetRef'],\n message: 'Either targetRef or targetSelector is required',\n });\n }\n });\nexport type DragInput = z.output<typeof dragInputSchema>;\n\n// =============================================================================\n// Utility (1)\n// =============================================================================\n\n/**\n * browser_screenshot - Capture a screenshot of the current page\n */\nexport const screenshotInputSchema = z.object({\n fullPage: z\n .boolean()\n .optional()\n .describe('Capture the full scrollable page instead of just the viewport (default: false)'),\n});\nexport type ScreenshotInput = z.output<typeof screenshotInputSchema>;\n\n// =============================================================================\n// Escape Hatch (1)\n// =============================================================================\n\n/**\n * browser_evaluate - Execute JavaScript in the browser\n */\nexport const evaluateInputSchema = z.object({\n script: z\n .string()\n .describe(\n 'JavaScript expression to evaluate in the browser and return the result. Do not use `return` — write a bare expression like `document.title` or `1 + 1`. For async code, wrap in an async IIFE: `(async () => { ... })()`.',\n ),\n arg: z.unknown().optional().describe('Argument to pass to the script (JSON-serializable)'),\n});\nexport type EvaluateInput = z.output<typeof evaluateInputSchema>;\n\n// =============================================================================\n// All Schemas\n// =============================================================================\n\nexport const browserSchemas = {\n // Core\n goto: gotoInputSchema,\n snapshot: snapshotInputSchema,\n click: clickInputSchema,\n type: typeInputSchema,\n press: pressInputSchema,\n select: selectInputSchema,\n scroll: scrollInputSchema,\n close: closeInputSchema,\n // Extended\n hover: hoverInputSchema,\n back: backInputSchema,\n dialog: dialogInputSchema,\n wait: waitInputSchema,\n tabs: tabsInputSchema,\n drag: dragInputSchema,\n // Utility\n screenshot: screenshotInputSchema,\n // Escape hatch\n evaluate: evaluateInputSchema,\n} as const;\n","/**\n * Browser Tool Constants\n */\n\nexport const BROWSER_TOOLS = {\n // Core\n GOTO: 'browser_goto',\n SNAPSHOT: 'browser_snapshot',\n CLICK: 'browser_click',\n TYPE: 'browser_type',\n PRESS: 'browser_press',\n SELECT: 'browser_select',\n SCROLL: 'browser_scroll',\n CLOSE: 'browser_close',\n // Extended\n HOVER: 'browser_hover',\n BACK: 'browser_back',\n DIALOG: 'browser_dialog',\n WAIT: 'browser_wait',\n TABS: 'browser_tabs',\n DRAG: 'browser_drag',\n // Utility\n SCREENSHOT: 'browser_screenshot',\n // Escape hatch\n EVALUATE: 'browser_evaluate',\n} as const;\n\nexport type BrowserToolName = (typeof BROWSER_TOOLS)[keyof typeof BROWSER_TOOLS];\n","/**\n * browser_back - Go back in browser history\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { backInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createBackTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.BACK,\n description: 'Go back to the previous page in browser history.',\n inputSchema: backInputSchema,\n execute: async (_input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.back(threadId);\n },\n });\n}\n","/**\n * browser_click - Click an element\n */\n\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { clickInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\n\nexport function createClickTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.CLICK,\n description: 'Click an element using its ref from a snapshot. Use clickCount: 2 for double-click.',\n inputSchema: clickInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.click(input, threadId);\n },\n });\n}\n","/**\n * browser_close - Close the browser\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { closeInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createCloseTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.CLOSE,\n description: 'Close the browser. Only use when done with all browsing.',\n inputSchema: closeInputSchema,\n execute: async (_input, { agent }) => {\n // For thread scope, close only the thread's session\n const threadId = agent?.threadId;\n if (browser.getScope() !== 'shared') {\n if (!threadId) {\n throw new Error('browser_close requires agent.threadId when browser scope is not shared');\n }\n await browser.closeThreadSession(threadId);\n return { success: true, hint: \"Thread's browser session closed. A new session will be created on next use.\" };\n }\n // For shared scope, close the entire browser\n await browser.close();\n return { success: true, hint: 'Browser closed. It will be re-launched automatically on next use.' };\n },\n });\n}\n","/**\n * browser_dialog - Click element and handle resulting dialog\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { dialogInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createDialogTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.DIALOG,\n description:\n 'Click an element that triggers a browser dialog (alert, confirm, prompt) and handle it. ' +\n 'Use this instead of browser_click when you expect a dialog to appear.',\n inputSchema: dialogInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.dialog(input, threadId);\n },\n });\n}\n","/**\n * browser_drag - Drag an element to another element\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { dragInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createDragTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.DRAG,\n description:\n 'Drag an element to another element. Use refs from snapshot when available, ' +\n 'or CSS selectors for elements not exposed in the accessibility tree.',\n inputSchema: dragInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.drag(input, threadId);\n },\n });\n}\n","/**\n * browser_evaluate - Execute JavaScript in the browser\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { evaluateInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createEvaluateTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.EVALUATE,\n description:\n 'Execute JavaScript in the browser. Use for complex interactions not covered by other tools. Returns the script result.',\n inputSchema: evaluateInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.evaluate(input, threadId);\n },\n });\n}\n","/**\n * browser_goto - Navigate to a URL\n */\n\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { gotoInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\n\nexport function createGotoTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.GOTO,\n description: 'Navigate the browser to a URL.',\n inputSchema: gotoInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.goto(input, threadId);\n },\n });\n}\n","/**\n * browser_hover - Hover over an element\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { hoverInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createHoverTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.HOVER,\n description: 'Hover over an element to trigger hover states (dropdowns, tooltips).',\n inputSchema: hoverInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.hover(input, threadId);\n },\n });\n}\n","/**\n * browser_press - Press a keyboard key\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { pressInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createPressTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.PRESS,\n description: 'Press a keyboard key (e.g., Enter, Tab, Escape, Control+a).',\n inputSchema: pressInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.press(input, threadId);\n },\n });\n}\n","/**\n * browser_screenshot - Capture a screenshot of the current page\n */\n\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { screenshotInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\n\nexport function createScreenshotTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.SCREENSHOT,\n description:\n 'Capture a screenshot of the current viewport as a visible PNG (set fullPage: true for full-page capture). Use snapshot when you only need text or interactive elements — screenshots are expensive. Use this when you need to visually inspect the page, e.g. evaluating images, product photos, layout, design, or colors.',\n inputSchema: screenshotInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return await browser.screenshot(input, threadId);\n },\n toModelOutput(output) {\n const result = output as { base64?: string; title?: string; url?: string; message?: string };\n\n if (typeof result.base64 !== 'string') {\n return {\n type: 'content' as const,\n value: [{ type: 'text' as const, text: result.message ?? 'Failed to capture screenshot.' }],\n };\n }\n\n return {\n type: 'content' as const,\n value: [\n {\n type: 'media' as const,\n mediaType: 'image/png',\n data: result.base64,\n },\n ],\n };\n },\n });\n}\n","/**\n * browser_scroll - Scroll the page or element\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { scrollInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createScrollTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.SCROLL,\n description: 'Scroll the page or a specific element.',\n inputSchema: scrollInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.scroll(input, threadId);\n },\n });\n}\n","/**\n * browser_select - Select option from dropdown\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { selectInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createSelectTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.SELECT,\n description: 'Select an option from a dropdown by value, label, or index.',\n inputSchema: selectInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.select(input, threadId);\n },\n });\n}\n","/**\n * browser_snapshot - Get accessibility tree snapshot\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { snapshotInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createSnapshotTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.SNAPSHOT,\n description:\n 'Get accessibility tree snapshot of the page. Returns text-based representation with element refs like [ref=e1], [ref=e2] for targeting.',\n inputSchema: snapshotInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.snapshot(input, threadId);\n },\n });\n}\n","/**\n * browser_tabs - Manage browser tabs\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { tabsInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createTabsTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.TABS,\n description: 'Manage browser tabs: list, open new, switch, or close tabs.',\n inputSchema: tabsInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.tabs(input, threadId);\n },\n });\n}\n","/**\n * browser_type - Type text into an element\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { typeInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createTypeTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.TYPE,\n description: 'Type text into an input element. Use clear: true to replace existing content.',\n inputSchema: typeInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.type(input, threadId);\n },\n });\n}\n","/**\n * browser_wait - Wait for an element or condition\n */\nimport { createTool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { waitInputSchema } from '../schemas';\nimport { BROWSER_TOOLS } from './constants';\nexport function createWaitTool(browser: AgentBrowser) {\n return createTool({\n id: BROWSER_TOOLS.WAIT,\n description: 'Wait for an element to appear, disappear, or reach a state.',\n inputSchema: waitInputSchema,\n execute: async (input, { agent }) => {\n const threadId = agent?.threadId;\n browser.setCurrentThread(threadId);\n await browser.ensureReady();\n return browser.wait(input, threadId);\n },\n });\n}\n","/**\n * AgentBrowser Tools\n *\n * Creates browser tools bound to an AgentBrowser instance.\n * Each tool is defined in its own file for maintainability.\n */\n\nimport type { Tool } from '@mastra/core/tools';\nimport type { AgentBrowser } from '../agent-browser';\nimport { createBackTool } from './back';\nimport { createClickTool } from './click';\nimport { createCloseTool } from './close';\nimport { BROWSER_TOOLS } from './constants';\nimport { createDialogTool } from './dialog';\nimport { createDragTool } from './drag';\nimport { createEvaluateTool } from './evaluate';\nimport { createGotoTool } from './goto';\nimport { createHoverTool } from './hover';\nimport { createPressTool } from './press';\nimport { createScreenshotTool } from './screenshot';\nimport { createScrollTool } from './scroll';\nimport { createSelectTool } from './select';\nimport { createSnapshotTool } from './snapshot';\nimport { createTabsTool } from './tabs';\nimport { createTypeTool } from './type';\nimport { createWaitTool } from './wait';\n\nexport { BROWSER_TOOLS, type BrowserToolName } from './constants';\n\n/**\n * Creates all browser tools bound to an AgentBrowser instance.\n * The browser is lazily initialized on first tool use.\n */\nexport function createAgentBrowserTools(browser: AgentBrowser): Record<string, Tool<any, any>> {\n return {\n // Core (9)\n [BROWSER_TOOLS.GOTO]: createGotoTool(browser),\n [BROWSER_TOOLS.SNAPSHOT]: createSnapshotTool(browser),\n [BROWSER_TOOLS.CLICK]: createClickTool(browser),\n [BROWSER_TOOLS.TYPE]: createTypeTool(browser),\n [BROWSER_TOOLS.PRESS]: createPressTool(browser),\n [BROWSER_TOOLS.SELECT]: createSelectTool(browser),\n [BROWSER_TOOLS.SCROLL]: createScrollTool(browser),\n [BROWSER_TOOLS.CLOSE]: createCloseTool(browser),\n // Utility\n [BROWSER_TOOLS.SCREENSHOT]: createScreenshotTool(browser),\n // Extended\n [BROWSER_TOOLS.HOVER]: createHoverTool(browser),\n [BROWSER_TOOLS.BACK]: createBackTool(browser),\n [BROWSER_TOOLS.DIALOG]: createDialogTool(browser),\n [BROWSER_TOOLS.WAIT]: createWaitTool(browser),\n [BROWSER_TOOLS.TABS]: createTabsTool(browser),\n [BROWSER_TOOLS.DRAG]: createDragTool(browser),\n // Escape hatch (1)\n [BROWSER_TOOLS.EVALUATE]: createEvaluateTool(browser),\n };\n}\n","import type { BrowserManager } from 'agent-browser';\n\n/**\n * Get the browser process PID from a BrowserManager instance via CDP.\n *\n * Playwright doesn't expose the browser process PID directly, so we use CDP's\n * SystemInfo.getProcessInfo to get it. This works for both regular browser\n * launches and persistent contexts (profiles).\n *\n * Returns undefined if the PID can't be retrieved (e.g., browser not running).\n */\nexport async function getBrowserPid(manager: BrowserManager): Promise<number | undefined> {\n try {\n // Try getBrowser() first, fall back to context.browser() for persistent contexts\n let browser = manager.getBrowser();\n if (!browser) {\n const ctx = manager.getContext();\n browser = ctx?.browser?.() ?? null;\n }\n if (!browser) return undefined;\n\n const cdp = await browser.newBrowserCDPSession();\n try {\n const info = await cdp.send('SystemInfo.getProcessInfo');\n const browserProcess = info.processInfo?.find((p: { type: string }) => p.type === 'browser');\n return browserProcess?.id;\n } finally {\n await cdp.detach().catch(() => undefined);\n }\n } catch {\n return undefined;\n }\n}\n","import { MastraBrowser, ScreencastStreamImpl, DEFAULT_THREAD_ID } from '@mastra/core/browser';\nimport type {\n BrowserState,\n BrowserTabState,\n BrowserToolError,\n ScreencastOptions,\n ScreencastStream,\n CdpSessionProvider,\n CdpSessionLike,\n MouseEventParams,\n KeyboardEventParams,\n} from '@mastra/core/browser';\nimport type { Tool } from '@mastra/core/tools';\n\nimport { BrowserManager } from 'agent-browser';\nimport type { BrowserLaunchOptions } from 'agent-browser';\nimport type { Page, Locator } from 'playwright-core';\nimport type {\n GotoInput,\n SnapshotInput,\n ClickInput,\n TypeInput,\n PressInput,\n SelectInput,\n ScrollInput,\n HoverInput,\n DialogInput,\n WaitInput,\n TabsInput,\n DragInput,\n EvaluateInput,\n ScreenshotInput,\n} from './schemas';\nimport { AgentBrowserThreadManager } from './thread-manager';\nimport { createAgentBrowserTools } from './tools';\nimport type { BrowserConfig } from './types';\nimport { getBrowserPid } from './utils';\n\n/**\n * AgentBrowser - Browser automation using agent-browser (vercel-labs/agent-browser)\n *\n * Uses snapshot + refs pattern for LLM-friendly element targeting.\n */\nexport class AgentBrowser extends MastraBrowser {\n override readonly id: string;\n override readonly name = 'AgentBrowser';\n override readonly provider = 'vercel-labs/agent-browser';\n\n /** Shared browser manager instance (for 'shared' scope) - narrowed type from base class */\n declare protected sharedManager: BrowserManager | null;\n private defaultTimeout = 30000;\n /** Pending PID lookups — awaited in disconnect handlers to avoid racing. */\n private pidLookups = new Set<Promise<void>>();\n\n /** Thread manager - narrowed type from base class */\n declare protected threadManager: AgentBrowserThreadManager;\n private browserConfig: BrowserConfig;\n\n constructor(config: BrowserConfig = {}) {\n super(config);\n this.browserConfig = config;\n this.id = `agent-browser-${Date.now()}`;\n if (config.timeout) {\n this.defaultTimeout = config.timeout;\n }\n\n // Default to 'shared' when cdpUrl is provided (connecting to existing browser)\n // Default to 'thread' otherwise (launching new browsers per thread)\n const effectiveScope = config.cdpUrl ? (config.scope ?? 'shared') : (config.scope ?? 'thread');\n\n // Initialize thread manager\n this.threadManager = new AgentBrowserThreadManager({\n scope: effectiveScope,\n browserConfig: { ...config, headless: this.headless },\n resolveCdpUrl: this.resolveCdpUrl.bind(this),\n logger: this.logger,\n // When a new thread session is created, notify listeners so screencast can start\n onSessionCreated: session => {\n // Trigger onBrowserReady callbacks for this specific thread\n // This allows ViewerRegistry to start screencast for just this thread\n this.notifyBrowserReady(session.threadId);\n },\n // When a new browser is created for a thread, set up close listener\n onBrowserCreated: (manager, threadId) => {\n this.setupCloseListenerForThread(manager, threadId);\n },\n });\n }\n\n // ---------------------------------------------------------------------------\n // Thread Scope (delegated to ThreadManager)\n // ---------------------------------------------------------------------------\n\n /**\n * Ensure browser is ready and thread session exists.\n * Creates a new page/context for the current thread if needed.\n *\n * For 'thread' scope, we need to create the thread session BEFORE\n * calling super.ensureReady() because the base class's ensureReady() will\n * call checkBrowserAlive(), which needs at least one thread browser to exist.\n */\n override async ensureReady(): Promise<void> {\n const scope = this.threadManager.getScope();\n const threadId = this.getCurrentThread();\n const existingSession = this.threadManager.hasSession(threadId);\n\n // For 'thread' scope, create the thread session first\n // This ensures checkBrowserAlive() has a browser to check\n if (scope === 'thread' && !existingSession) {\n await this.getManagerForThread(threadId);\n }\n\n await super.ensureReady();\n\n // For 'thread' scope with existing session, just verify it's accessible\n if (scope === 'thread' && existingSession) {\n await this.getManagerForThread(threadId);\n }\n }\n\n /**\n * Get the browser manager for the current thread.\n * Delegates to ThreadManager for scope handling.\n */\n async getManagerForThread(threadId?: string): Promise<BrowserManager> {\n const effectiveThreadId = threadId ?? this.getCurrentThread();\n const scope = this.threadManager.getScope();\n\n // In 'thread' scope with no specific threadId, check for an existing manager first\n // to avoid creating a new session unnecessarily\n if (scope === 'thread' && (!effectiveThreadId || effectiveThreadId === DEFAULT_THREAD_ID)) {\n const existingManager = this.threadManager.getExistingManagerForThread(effectiveThreadId);\n if (existingManager) {\n return existingManager;\n }\n // Fall through to create a session for DEFAULT_THREAD_ID\n }\n\n return this.threadManager.getManagerForThread(effectiveThreadId);\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n protected override async doLaunch(): Promise<void> {\n const scope = this.threadManager.getScope();\n\n // For 'thread' scope, don't launch a shared browser.\n // Each thread will get its own dedicated browser via createSession().\n if (scope === 'thread') {\n // Create a placeholder manager that's never launched.\n // Thread-specific browsers are created in ThreadManager.createSession().\n this.sharedManager = new BrowserManager();\n this.threadManager.setSharedManager(this.sharedManager);\n // Don't call notifyBrowserReady() here - that happens in onSessionCreated\n // when the first thread creates its dedicated browser.\n return;\n }\n\n // For 'shared' scope, launch the shared browser\n this.sharedManager = new BrowserManager();\n\n const localConfig = this.config as BrowserConfig;\n const launchOptions: BrowserLaunchOptions = {\n headless: this.headless,\n viewport: localConfig.viewport,\n profile: localConfig.profile,\n executablePath: localConfig.executablePath,\n storageState: localConfig.storageState,\n };\n\n // Resolve CDP URL if provided (can be string or function)\n if (localConfig.cdpUrl) {\n launchOptions.cdpUrl = await this.resolveCdpUrl(localConfig.cdpUrl);\n }\n\n await this.sharedManager.launch(launchOptions);\n\n // Register the shared manager with ThreadManager\n this.threadManager.setSharedManager(this.sharedManager);\n\n // Set up close listeners to detect external browser closure\n this.setupCloseListenerForSharedScope(this.sharedManager);\n }\n\n /**\n * Set up close event listeners for 'shared' scope browser.\n * This handles the case where the shared browser is closed externally.\n */\n private setupCloseListenerForSharedScope(manager: BrowserManager): void {\n try {\n // Capture the Chrome process PID via CDP while the browser is alive.\n // The base class uses this to kill orphaned child processes on disconnect.\n // Guard: only store if this manager is still the active shared manager,\n // otherwise a stale lookup could overwrite a newer PID.\n const pidLookup = getBrowserPid(manager)\n .then(pid => {\n if (pid && this.sharedManager === manager) this.sharedBrowserPid = pid;\n })\n .finally(() => this.pidLookups.delete(pidLookup));\n this.pidLookups.add(pidLookup);\n\n let disconnectHandled = false;\n const handleDisconnect = () => {\n if (disconnectHandled) return;\n disconnectHandled = true;\n // Wait for PID lookup to complete before cleanup, so killProcessGroup\n // has the actual PID instead of undefined.\n void pidLookup.catch(() => undefined).then(() => this.handleBrowserDisconnected());\n };\n\n // Listen for context close (fires when browser window is closed)\n const context = manager.getContext();\n if (context) {\n context.on('close', handleDisconnect);\n }\n\n // Listen for last page closing (primary detection method)\n const pages = manager.getPages();\n for (const page of pages) {\n page.on('close', () => {\n const remainingPages = manager.getPages();\n if (remainingPages.length === 0) {\n handleDisconnect();\n }\n });\n }\n } catch {\n // Ignore errors setting up close listener\n }\n }\n\n protected override async doClose(): Promise<void> {\n // Ensure all PID lookups have resolved before closing, so killProcessGroup\n // (called by the base class after doClose) has the correct PID.\n await Promise.allSettled([...this.pidLookups]);\n this.pidLookups.clear();\n\n // Close all thread sessions via ThreadManager\n await this.threadManager.destroyAllSessions();\n this.setCurrentThread(undefined); // Reset to default thread\n\n // Close the main browser manager (only for 'shared' scope where it's actually launched)\n const scope = this.threadManager.getScope();\n if (scope === 'shared' && this.sharedManager) {\n await this.sharedManager.close();\n }\n this.sharedManager = null;\n }\n\n /**\n * Check if the browser is still alive by verifying the page is connected.\n * Called by base class ensureReady() to detect externally closed browsers.\n */\n protected async checkBrowserAlive(): Promise<boolean> {\n const scope = this.threadManager.getScope();\n\n // For 'thread' scope, check if any thread browsers are running\n if (scope === 'thread') {\n return this.threadManager.hasActiveThreadManagers();\n }\n\n // For 'shared' scope, check the shared browser\n if (!this.sharedManager) {\n return false;\n }\n try {\n const page = this.sharedManager.getPage();\n // Will throw if browser is disconnected\n const url = page.url();\n // Save browser state for potential restore on relaunch\n if (url && url !== 'about:blank') {\n const state = await this.getBrowserState();\n if (state) {\n this.lastBrowserState = state;\n }\n }\n return true;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n if (this.isDisconnectionError(msg)) {\n this.logger.debug?.('Browser was externally closed');\n }\n return false;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Tools\n // ---------------------------------------------------------------------------\n\n /**\n * Get the browser tools for this provider.\n * Returns 16 flat tools for browser automation.\n */\n getTools(): Record<string, Tool<any, any>> {\n const tools = createAgentBrowserTools(this);\n const exclude = this.browserConfig.excludeTools;\n if (exclude?.length) {\n for (const name of exclude) {\n delete tools[name];\n }\n }\n return tools;\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Get the page for the current thread.\n * Uses thread scope if enabled, otherwise returns the shared page.\n * @param explicitThreadId - Optional thread ID to use instead of getCurrentThread()\n * Use this to avoid race conditions in concurrent tool calls.\n */\n private async getPage(explicitThreadId?: string): Promise<Page> {\n const scope = this.getScope();\n const threadId = explicitThreadId ?? this.getCurrentThread();\n // For thread scope, always use threadManager.getPageForThread\n if (scope === 'thread') {\n return this.threadManager.getPageForThread(threadId);\n }\n if (!this.sharedManager) throw new Error('Browser not launched');\n return this.sharedManager.getPage();\n }\n\n /**\n * Get the active page for a thread (implements abstract method from base class).\n * Returns null if no page is available, unlike getPage which throws.\n */\n protected async getActivePage(threadId?: string): Promise<Page | null> {\n try {\n return await this.getPage(threadId);\n } catch {\n return null;\n }\n }\n\n /**\n * Set up close event listener for a thread's browser manager.\n * This handles the case where a thread's browser is closed externally.\n */\n private setupCloseListenerForThread(manager: BrowserManager, threadId: string): void {\n try {\n // Capture the Chrome process PID via CDP while the browser is alive.\n // The base class uses this to kill orphaned child processes on disconnect.\n // Guard: only store if this manager is still the active one for the thread,\n // otherwise a stale lookup could overwrite a newer PID.\n const pidLookup = getBrowserPid(manager)\n .then(pid => {\n if (pid && this.threadManager?.getExistingManagerForThread(threadId) === manager) {\n this.threadBrowserPids.set(threadId, pid);\n }\n })\n .finally(() => this.pidLookups.delete(pidLookup));\n this.pidLookups.add(pidLookup);\n\n let disconnectHandled = false;\n const handleDisconnect = () => {\n if (disconnectHandled) return;\n disconnectHandled = true;\n // Wait for PID lookup to complete before cleanup, so killProcessGroup\n // has the actual PID instead of undefined.\n void pidLookup.catch(() => undefined).then(() => this.handleThreadBrowserDisconnected(threadId));\n };\n\n // Listen for context close (fires when browser window is closed)\n const context = manager.getContext();\n if (context) {\n context.on('close', handleDisconnect);\n }\n\n // Listen for last page closing (primary detection method)\n const pages = manager.getPages();\n for (const page of pages) {\n page.on('close', () => {\n const remainingPages = manager.getPages();\n if (remainingPages.length === 0) {\n handleDisconnect();\n }\n });\n }\n } catch {\n // Ignore errors setting up close listener\n }\n }\n\n /**\n * Create an error response from an exception.\n * Extends base class to add agent-browser specific error handling.\n */\n protected override createErrorFromException(error: unknown, context: string): BrowserToolError {\n const msg = error instanceof Error ? error.message : String(error);\n\n // Check for stale refs (agent-browser specific)\n if (msg.includes('stale') || msg.includes('Stale')) {\n return this.createError(\n 'stale_ref',\n 'Element ref is no longer valid.',\n 'Get a fresh snapshot and use updated refs.',\n );\n }\n\n // Check for element not found (agent-browser specific)\n if (msg.includes('not found') || msg.includes('No element')) {\n return this.createError(\n 'element_not_found',\n 'Element not found.',\n 'Check the ref is correct or get a fresh snapshot.',\n );\n }\n\n // Delegate to base class for common errors\n return super.createErrorFromException(error, context);\n }\n\n private async requireLocator(ref: string, threadId?: string): Promise<Locator | null> {\n const manager = await this.getManagerForThread(threadId);\n // Use the built-in getLocatorFromRef method which properly converts refs to locators\n return manager.getLocatorFromRef(ref);\n }\n\n private async getScrollInfo(threadId?: string): Promise<{\n scrollY: number;\n scrollHeight: number;\n viewportHeight: number;\n atTop: boolean;\n atBottom: boolean;\n percentDown: number;\n }> {\n const page = await this.getPage(threadId);\n const info = (await page.evaluate(`({\n scrollY: Math.round(window.scrollY),\n scrollHeight: document.documentElement.scrollHeight,\n viewportHeight: window.innerHeight\n })`)) as { scrollY: number; scrollHeight: number; viewportHeight: number } | undefined;\n\n // Handle cases where evaluate returns undefined (e.g., in tests)\n if (!info || typeof info.scrollHeight !== 'number') {\n return {\n scrollY: 0,\n scrollHeight: 0,\n viewportHeight: 0,\n atTop: true,\n atBottom: true,\n percentDown: 0,\n };\n }\n\n const maxScroll = info.scrollHeight - info.viewportHeight;\n return {\n ...info,\n atTop: info.scrollY < 50,\n atBottom: info.scrollY >= maxScroll - 50,\n percentDown: maxScroll > 0 ? Math.round((info.scrollY / maxScroll) * 100) : 0,\n };\n }\n\n // ---------------------------------------------------------------------------\n // URL Access\n // ---------------------------------------------------------------------------\n\n /**\n * Get the current page URL without launching the browser.\n * @param threadId - Optional thread ID for thread-isolated browsers\n * @returns The current URL string, or null if browser is not running\n */\n override async getCurrentUrl(threadId?: string): Promise<string | null> {\n if (!this.isBrowserRunning()) {\n return null;\n }\n try {\n const effectiveThreadId = threadId ?? this.getCurrentThread();\n const scope = this.threadManager.getScope();\n\n // For 'thread' scope, check if we have an existing session first\n // Don't create a new session just to get the URL\n if (scope === 'thread' && effectiveThreadId) {\n const manager = this.threadManager.getExistingManagerForThread(effectiveThreadId);\n if (!manager) {\n return null; // No session yet, don't create one\n }\n const url = manager.getPage().url();\n // Save browser state for potential restore on relaunch (before external close)\n if (url && url !== 'about:blank') {\n const state = this.getBrowserStateForManager(manager);\n if (state) {\n this.threadManager.updateBrowserState(effectiveThreadId, state);\n }\n }\n return url;\n }\n\n // For 'shared' scope, use the shared manager\n const manager = await this.getManagerForThread(threadId);\n const url = manager.getPage().url();\n // Save browser state for potential restore on relaunch (before external close)\n if (url && url !== 'about:blank') {\n const state = this.getBrowserStateForManager(manager);\n if (state) {\n this.lastBrowserState = state;\n }\n }\n return url;\n } catch {\n return null;\n }\n }\n\n /**\n * Navigate to a URL (simple form). Used internally for restoring state on relaunch.\n */\n override async navigateTo(url: string): Promise<void> {\n if (!this.isBrowserRunning()) {\n return;\n }\n try {\n const page = await this.getPage();\n await page.goto(url, {\n timeout: this.defaultTimeout,\n waitUntil: 'domcontentloaded',\n });\n } catch {\n // Silently ignore navigation errors during restore\n }\n }\n\n /**\n * Get the current browser state (all tabs and active tab index).\n */\n override async getBrowserState(threadId?: string): Promise<BrowserState | null> {\n if (!this.isBrowserRunning()) {\n return null;\n }\n try {\n const manager = await this.getManagerForThread(threadId);\n return this.getBrowserStateForManager(manager);\n } catch {\n return null;\n }\n }\n\n /**\n * Get browser state for a thread (implements abstract method from base class).\n * Sync version that uses existing manager lookup without creating sessions.\n */\n protected getBrowserStateForThread(threadId?: string): BrowserState | null {\n const effectiveThreadId = threadId ?? this.getCurrentThread() ?? DEFAULT_THREAD_ID;\n const manager = this.threadManager.getExistingManagerForThread(effectiveThreadId);\n if (!manager) return null;\n return this.getBrowserStateForManager(manager);\n }\n\n /**\n * Get browser state from a specific manager instance.\n */\n private getBrowserStateForManager(manager: BrowserManager): BrowserState | null {\n try {\n const pages = manager.getPages();\n const activeIndex = manager.getActiveIndex();\n\n const tabs: BrowserTabState[] = pages.map(page => ({\n url: page.url(),\n }));\n\n return {\n tabs,\n activeTabIndex: activeIndex,\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Get all open tabs with their URLs and titles.\n */\n override async getTabState(threadId?: string): Promise<BrowserTabState[]> {\n const state = await this.getBrowserState(threadId);\n return state?.tabs ?? [];\n }\n\n /**\n * Get the active tab index.\n */\n override async getActiveTabIndex(threadId?: string): Promise<number> {\n if (!this.isBrowserRunning()) {\n return 0;\n }\n try {\n const manager = await this.getManagerForThread(threadId);\n return manager.getActiveIndex();\n } catch {\n return 0;\n }\n }\n\n /**\n * Export the current browser session's storage state (cookies, localStorage) to a JSON file.\n * This can later be loaded via the `storageState` config option to restore the session.\n *\n * @param path - File path to save the storage state JSON\n * @param threadId - Optional thread ID (defaults to current thread)\n */\n async exportStorageState(path: string, threadId?: string): Promise<void> {\n const effectiveThreadId = threadId ?? this.getCurrentThread();\n const manager = this.threadManager.getExistingManagerForThread(effectiveThreadId);\n if (!manager) {\n throw new Error('No browser is running. Launch a browser first before exporting storage state.');\n }\n const context = manager.getContext();\n if (!context) {\n throw new Error('Browser context not available');\n }\n await context.storageState({ path });\n }\n\n // ---------------------------------------------------------------------------\n // 1. browser_goto - Navigate to URL\n // ---------------------------------------------------------------------------\n\n async goto(\n input: GotoInput,\n threadId?: string,\n ): Promise<{ success: true; url: string; title: string; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n\n await page.goto(input.url, {\n timeout: input.timeout ?? this.defaultTimeout,\n waitUntil: input.waitUntil ?? 'domcontentloaded',\n });\n\n return {\n success: true,\n url: page.url(),\n title: await page.title(),\n hint: 'Take a snapshot to see interactive elements and get refs.',\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Goto');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 2. browser_snapshot - Capture accessibility tree\n // ---------------------------------------------------------------------------\n\n async snapshot(\n input: SnapshotInput,\n threadId?: string,\n ): Promise<\n | {\n success: true;\n snapshot: string;\n url: string;\n title: string;\n elementCount: number;\n scroll: string;\n hint?: string;\n }\n | BrowserToolError\n > {\n try {\n const manager = await this.getManagerForThread(threadId);\n const page = await this.getPage(threadId);\n const rawSnapshot = await manager.getSnapshot({\n interactive: input.interactiveOnly ?? true,\n compact: true,\n });\n\n // Transform tree refs from [ref=e1] format to @e1 format for consistency\n const snapshot = (rawSnapshot.tree ?? '').replace(/\\[ref=(\\w+)\\]/g, '@$1');\n\n // Get scroll position info\n const scrollInfo = await this.getScrollInfo(threadId);\n let scrollText: string;\n if (scrollInfo.atTop && !scrollInfo.atBottom) {\n scrollText = 'TOP - more content below';\n } else if (scrollInfo.atBottom) {\n scrollText = 'BOTTOM of page';\n } else {\n scrollText = `${scrollInfo.percentDown}% down`;\n }\n\n // Count refs\n const refs = snapshot.match(/@e\\d+/g) || [];\n const elementCount = new Set(refs).size;\n\n return {\n success: true,\n snapshot,\n url: page.url(),\n title: await page.title(),\n elementCount,\n scroll: scrollText,\n hint:\n elementCount === 0\n ? 'No interactive elements found. Try scrolling or setting interactiveOnly:false.'\n : undefined,\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Snapshot');\n }\n }\n\n // ---------------------------------------------------------------------------\n // browser_screenshot - Capture a screenshot of the current page\n // ---------------------------------------------------------------------------\n\n async screenshot(\n input: ScreenshotInput,\n threadId?: string,\n ): Promise<{ base64: string; url: string; title: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n const buffer = await page.screenshot({\n fullPage: input.fullPage ?? false,\n type: 'png',\n });\n const base64 = Buffer.from(buffer).toString('base64');\n\n return {\n base64,\n url: page.url(),\n title: await page.title(),\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Screenshot');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 3. browser_click - Click on element\n // ---------------------------------------------------------------------------\n\n async click(\n input: ClickInput,\n threadId?: string,\n ): Promise<{ success: true; url: string; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n const locator = await this.requireLocator(input.ref, threadId);\n\n if (!locator) {\n return this.createError(\n 'stale_ref',\n `Ref ${input.ref} not found. The page has changed.`,\n 'Take a new snapshot to see the current page state and get fresh refs.',\n );\n }\n\n await locator.click({\n button: input.button ?? 'left',\n clickCount: input.clickCount ?? 1,\n modifiers: input.modifiers,\n timeout: this.defaultTimeout,\n });\n\n return {\n success: true,\n url: page.url(),\n hint: 'Take a new snapshot to see updated page state and get fresh refs.',\n };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n\n if (errorMsg.includes('intercepts pointer events')) {\n return this.createError(\n 'element_blocked',\n `Element ${input.ref} is blocked by another element.`,\n 'Take a new snapshot to see what is blocking. Dismiss any modals or scroll the element into view.',\n );\n }\n\n return this.createErrorFromException(error, 'Click');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 4. browser_type - Type text into element\n // ---------------------------------------------------------------------------\n\n async type(\n input: TypeInput,\n threadId?: string,\n ): Promise<{ success: true; value: string; url: string; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n const locator = await this.requireLocator(input.ref, threadId);\n\n if (!locator) {\n return this.createError(\n 'stale_ref',\n `Ref ${input.ref} not found. The page has changed.`,\n 'Take a new snapshot to see the current page state and get fresh refs.',\n );\n }\n\n if (input.clear) {\n await locator.fill('', { timeout: this.defaultTimeout });\n }\n\n if (input.delay) {\n await locator.focus();\n for (const char of input.text) {\n await page.keyboard.press(char);\n await new Promise(r => setTimeout(r, input.delay));\n }\n } else {\n await locator.fill(input.text, { timeout: this.defaultTimeout });\n }\n\n // Get the actual value in the field\n const value = await locator.inputValue({ timeout: 1000 }).catch(() => input.text);\n\n return {\n success: true,\n value,\n url: page.url(),\n hint: 'Take a new snapshot if you need to interact with more elements.',\n };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n\n if (\n errorMsg.includes('is not an <input>') ||\n errorMsg.includes('not an input') ||\n errorMsg.includes('Cannot type') ||\n errorMsg.includes('not focusable')\n ) {\n return this.createError(\n 'not_focusable',\n `Element ${input.ref} is not a text input field.`,\n 'Take a new snapshot and look for elements with role \"textbox\" or \"searchbox\".',\n );\n }\n\n return this.createErrorFromException(error, 'Type');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 5. browser_press - Press keyboard key(s)\n // ---------------------------------------------------------------------------\n\n async press(\n input: PressInput,\n threadId?: string,\n ): Promise<{ success: true; url: string; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n await page.keyboard.press(input.key);\n\n return {\n success: true,\n url: page.url(),\n hint: 'Take a new snapshot if the page may have changed.',\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Press');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 6. browser_select - Select dropdown option\n // ---------------------------------------------------------------------------\n\n async select(\n input: SelectInput,\n threadId?: string,\n ): Promise<{ success: true; selected: string[]; url: string; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n const locator = await this.requireLocator(input.ref, threadId);\n\n if (!locator) {\n return this.createError(\n 'stale_ref',\n `Ref ${input.ref} not found. The page has changed.`,\n 'Take a new snapshot to get fresh refs.',\n );\n }\n\n const selectValue: { value?: string; label?: string; index?: number } = {};\n if (input.value) selectValue.value = input.value;\n if (input.label) selectValue.label = input.label;\n if (input.index !== undefined) selectValue.index = input.index;\n\n const selected = await locator.selectOption(selectValue, {\n timeout: this.defaultTimeout,\n });\n\n return {\n success: true,\n selected,\n url: page.url(),\n hint: 'Selection complete. Take a snapshot if you need to continue.',\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Select');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 7. browser_scroll - Scroll page or element\n // ---------------------------------------------------------------------------\n\n async scroll(\n input: ScrollInput,\n threadId?: string,\n ): Promise<{ success: true; position: { x: number; y: number }; scroll: string; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n\n if (input.ref) {\n const locator = await this.requireLocator(input.ref, threadId);\n if (locator) {\n await locator.scrollIntoViewIfNeeded({ timeout: this.defaultTimeout });\n }\n } else {\n const direction = input.direction;\n const amount = input.amount ?? 300;\n\n let deltaX = 0;\n let deltaY = 0;\n\n switch (direction) {\n case 'up':\n deltaY = -amount;\n break;\n case 'down':\n deltaY = amount;\n break;\n case 'left':\n deltaX = -amount;\n break;\n case 'right':\n deltaX = amount;\n break;\n }\n\n await page.evaluate(\n ({ x, y }: { x: number; y: number }) => {\n (globalThis as any).scrollBy(x, y);\n },\n { x: deltaX, y: deltaY },\n );\n }\n\n // Get new scroll position\n const scrollInfo = await this.getScrollInfo(threadId);\n let scrollText: string;\n if (scrollInfo.atTop && !scrollInfo.atBottom) {\n scrollText = 'TOP - more content below';\n } else if (scrollInfo.atBottom) {\n scrollText = 'BOTTOM of page';\n } else {\n scrollText = `${scrollInfo.percentDown}% down`;\n }\n\n return {\n success: true,\n position: { x: 0, y: scrollInfo.scrollY },\n scroll: scrollText,\n hint: 'Take a new snapshot to see elements in the new viewport.',\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Scroll');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 8. browser_hover - Hover over element\n // ---------------------------------------------------------------------------\n\n async hover(\n input: HoverInput,\n threadId?: string,\n ): Promise<{ success: true; url: string; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n const locator = await this.requireLocator(input.ref, threadId);\n\n if (!locator) {\n return this.createError(\n 'stale_ref',\n `Ref ${input.ref} not found. The page has changed.`,\n 'Take a new snapshot to get fresh refs.',\n );\n }\n\n await locator.hover({ timeout: this.defaultTimeout });\n\n return {\n success: true,\n url: page.url(),\n hint: 'Take a new snapshot to see any hover-triggered elements (dropdowns, tooltips).',\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Hover');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 10. browser_back - Navigate back\n // ---------------------------------------------------------------------------\n\n async back(\n threadId?: string,\n ): Promise<{ success: true; url: string; title: string; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n await page.goBack({ timeout: this.defaultTimeout });\n\n return {\n success: true,\n url: page.url(),\n title: await page.title(),\n hint: 'Take a new snapshot to see the previous page.',\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Back');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 11. browser_dialog - Click element that triggers dialog and handle it\n // ---------------------------------------------------------------------------\n\n async dialog(\n input: DialogInput,\n threadId?: string,\n ): Promise<\n | { success: true; action: 'accept' | 'dismiss'; dialogType: string; message: string; hint: string }\n | BrowserToolError\n > {\n try {\n const page = await this.getPage(threadId);\n const locator = await this.requireLocator(input.triggerRef, threadId);\n\n if (!locator) {\n return this.createError(\n 'stale_ref',\n `Trigger ref ${input.triggerRef} not found.`,\n 'Take a new snapshot to get fresh refs.',\n );\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n page.off('dialog', dialogHandler);\n reject(\n new Error(`No dialog appeared after clicking ${input.triggerRef}. The element may not trigger a dialog.`),\n );\n }, this.defaultTimeout);\n\n const dialogHandler = async (dialog: any) => {\n clearTimeout(timeout);\n try {\n const dialogType = dialog.type();\n const message = dialog.message();\n\n if (input.action === 'accept') {\n await dialog.accept(input.text);\n } else {\n await dialog.dismiss();\n }\n resolve({\n success: true,\n action: input.action,\n dialogType,\n message,\n hint: 'Dialog handled. Take a snapshot to continue.',\n });\n } catch (e) {\n reject(e);\n }\n };\n\n // Set up listener first, then click\n page.once('dialog', dialogHandler);\n\n // Click the trigger element (don't await - dialog blocks execution)\n locator.click({ timeout: this.defaultTimeout }).catch((e: Error) => {\n clearTimeout(timeout);\n page.off('dialog', dialogHandler);\n reject(e);\n });\n });\n } catch (error) {\n return this.createErrorFromException(error, 'Dialog');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 13. browser_wait - Wait for element or condition\n // ---------------------------------------------------------------------------\n\n async wait(input: WaitInput, threadId?: string): Promise<{ success: true; hint: string } | BrowserToolError> {\n try {\n const timeout = input.timeout ?? this.defaultTimeout;\n\n if (input.ref) {\n const locator = await this.requireLocator(input.ref, threadId);\n if (!locator) {\n return this.createError('stale_ref', `Ref ${input.ref} not found.`, 'Take a new snapshot to get fresh refs.');\n }\n\n const state = input.state ?? 'visible';\n await locator.waitFor({ state, timeout });\n\n return {\n success: true,\n hint: `Element is now ${state}. Take a snapshot to continue.`,\n };\n } else {\n const page = await this.getPage(threadId);\n await page.waitForTimeout(timeout);\n return {\n success: true,\n hint: 'Wait complete. Take a snapshot to see current state.',\n };\n }\n } catch (error) {\n return this.createErrorFromException(error, 'Wait');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 14. browser_tabs - Manage browser tabs\n // ---------------------------------------------------------------------------\n\n async tabs(\n input: TabsInput,\n threadId?: string,\n ): Promise<\n | {\n success: true;\n tabs?: unknown[];\n index?: number;\n url?: string;\n title?: string;\n remaining?: number;\n hint: string;\n }\n | BrowserToolError\n > {\n try {\n const browser = await this.getManagerForThread(threadId);\n if (!browser) {\n return this.createError(\n 'browser_closed',\n 'Browser not launched',\n 'Call a navigation tool first to launch the browser.',\n );\n }\n\n switch (input.action) {\n case 'list': {\n if (!browser.listTabs) {\n return this.createError(\n 'browser_error',\n 'Tab management not supported',\n 'This browser provider does not support tab management.',\n );\n }\n const tabsList = await browser.listTabs();\n return {\n success: true,\n tabs: tabsList,\n hint: 'Use browser_tabs with action:\"switch\" and index to change tabs.',\n };\n }\n\n case 'new': {\n if (!browser.newTab) {\n return this.createError(\n 'browser_error',\n 'Tab management not supported',\n 'This browser provider does not support tab management.',\n );\n }\n const result = await browser.newTab();\n // If URL provided, navigate to it after creating the tab\n if (input.url) {\n const page = await this.getPage(threadId);\n await page.goto(input.url);\n }\n // Save state after new tab\n this.updateSessionBrowserState(threadId);\n return {\n success: true,\n ...result,\n hint: 'New tab opened. Take a snapshot to see its content.',\n };\n }\n\n case 'switch': {\n if (!browser.switchTo) {\n return this.createError(\n 'browser_error',\n 'Tab management not supported',\n 'This browser provider does not support tab management.',\n );\n }\n await browser.switchTo(input.index!);\n // Reconnect screencast to show the new active tab\n await this.reconnectScreencastForThread(threadId, 'tab switch');\n const page = browser.getPage();\n const pageUrl = page.url();\n // Emit URL directly after switch using the same threadId\n const streamKey = this.getStreamKey(threadId);\n const stream = this.activeScreencastStreams.get(streamKey);\n if (pageUrl && stream?.isActive()) {\n stream.emitUrl(pageUrl);\n }\n // Save state after switch (captures activeIndex change)\n this.updateSessionBrowserState(threadId);\n return {\n success: true,\n index: input.index,\n url: pageUrl,\n title: await page.title(),\n hint: 'Tab switched. Take a snapshot to see its content.',\n };\n }\n\n case 'close': {\n if (!browser.closeTab) {\n return this.createError(\n 'browser_error',\n 'Tab management not supported',\n 'This browser provider does not support tab management.',\n );\n }\n await browser.closeTab(input.index);\n // Reconnect screencast - it may now be pointing to a different tab\n await this.reconnectScreencastForThread(threadId, 'tab close');\n // Save state AFTER close (remaining tabs)\n this.updateSessionBrowserState(threadId);\n const tabsList = (await browser.listTabs?.()) ?? [];\n return {\n success: true,\n remaining: tabsList.length,\n hint: tabsList.length > 0 ? 'Tab closed. Take a snapshot to see current tab.' : 'All tabs closed.',\n };\n }\n\n default:\n return this.createError(\n 'browser_error',\n `Unknown tabs action: ${(input as any).action}`,\n 'Use \"list\", \"new\", \"switch\", or \"close\".',\n );\n }\n } catch (error) {\n return this.createErrorFromException(error, 'Tabs');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 15. browser_drag - Drag element to target\n // ---------------------------------------------------------------------------\n\n async drag(\n input: DragInput,\n threadId?: string,\n ): Promise<{ success: true; url: string; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n\n // Resolve source locator (prefer ref, fallback to selector)\n let sourceLocator: Awaited<ReturnType<typeof this.requireLocator>> | null = null;\n if (input.sourceRef) {\n sourceLocator = await this.requireLocator(input.sourceRef, threadId);\n } else if (input.sourceSelector) {\n sourceLocator = page.locator(input.sourceSelector);\n }\n\n if (!sourceLocator) {\n return this.createError(\n 'stale_ref',\n input.sourceRef\n ? `Source ref ${input.sourceRef} not found.`\n : 'No source element specified. Provide sourceRef or sourceSelector.',\n input.sourceRef\n ? 'Take a new snapshot to get fresh refs, or use sourceSelector for elements not in the accessibility tree.'\n : undefined,\n );\n }\n\n // Resolve target locator (prefer ref, fallback to selector)\n let targetLocator: Awaited<ReturnType<typeof this.requireLocator>> | null = null;\n if (input.targetRef) {\n targetLocator = await this.requireLocator(input.targetRef, threadId);\n } else if (input.targetSelector) {\n targetLocator = page.locator(input.targetSelector);\n }\n\n if (!targetLocator) {\n return this.createError(\n 'stale_ref',\n input.targetRef\n ? `Target ref ${input.targetRef} not found.`\n : 'No target element specified. Provide targetRef or targetSelector.',\n input.targetRef\n ? 'Take a new snapshot to get fresh refs, or use targetSelector for elements not in the accessibility tree.'\n : undefined,\n );\n }\n\n await sourceLocator.dragTo(targetLocator, { timeout: this.defaultTimeout });\n\n return {\n success: true,\n url: page.url(),\n hint: 'Drag complete. Take a snapshot to see the result.',\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Drag');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 16. browser_evaluate - Execute JavaScript\n // ---------------------------------------------------------------------------\n\n async evaluate(\n input: EvaluateInput,\n threadId?: string,\n ): Promise<{ success: true; result: unknown; hint: string } | BrowserToolError> {\n try {\n const page = await this.getPage(threadId);\n const result = await page.evaluate(input.script);\n\n return {\n success: true,\n result,\n hint: 'JavaScript executed. Take a snapshot if the page may have changed.',\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Evaluate');\n }\n }\n\n // ---------------------------------------------------------------------------\n // 17. browser_close - Close browser\n // ---------------------------------------------------------------------------\n\n async closeBrowser(): Promise<{ success: true; hint: string } | BrowserToolError> {\n try {\n await this.close();\n return {\n success: true,\n hint: 'Browser closed. Call browser_goto to start a new session.',\n };\n } catch (error) {\n return this.createErrorFromException(error, 'Close');\n }\n }\n\n // ---------------------------------------------------------------------------\n // Screencast (for Studio live view)\n // ---------------------------------------------------------------------------\n\n async startScreencast(_options?: ScreencastOptions): Promise<ScreencastStream> {\n const requestedThreadId = _options?.threadId;\n // For 'thread' scope, use the requested threadId or fall back to current thread\n // For 'shared' scope, threadId is only used for stream keying\n const effectiveThreadId =\n this.getScope() === 'thread'\n ? (requestedThreadId ?? this.getCurrentThread() ?? DEFAULT_THREAD_ID)\n : requestedThreadId;\n\n // For 'thread' scope, each thread has its own BrowserManager\n // For 'shared' scope, we use the shared manager\n let browserManager: BrowserManager;\n if (this.getScope() === 'thread') {\n browserManager = await this.getManagerForThread(effectiveThreadId);\n } else {\n if (!this.sharedManager) throw new Error('Browser not launched');\n browserManager = this.sharedManager;\n }\n\n // Create CDP session provider adapter\n // The provider always gets a fresh CDP session for the current active page\n const provider: CdpSessionProvider = {\n getCdpSession: async () => {\n // Always get the current active page and create a fresh CDP session for it\n const currentPage = browserManager.getPage();\n if (!currentPage) {\n throw new Error('No active page available');\n }\n const cdpSession = await currentPage.context().newCDPSession(currentPage);\n return cdpSession as unknown as CdpSessionLike;\n },\n isBrowserRunning: () => browserManager.isLaunched(),\n };\n\n const stream = new ScreencastStreamImpl(provider, _options);\n\n // Store reference so tabs() can trigger reconnects - keyed by thread\n const streamKey = this.getStreamKey(effectiveThreadId);\n this.activeScreencastStreams.set(streamKey, stream);\n\n // Set up tab change listener to reconnect screencast when a new tab opens\n const context = browserManager.getContext();\n if (context) {\n const onNewPage = (_newPage: Page) => {\n // Small delay to let agent-browser update its activePageIndex\n setTimeout(() => {\n if (stream.isActive()) {\n stream.reconnect().catch(() => {});\n }\n }, 100);\n };\n\n context.on('page', onNewPage);\n\n // Track page close handlers so we can clean them up\n const pageCloseHandlers = new Map<Page, () => void>();\n\n // Track framenavigated handlers for URL updates\n const frameNavigatedHandlers = new Map<\n Page,\n (frame: { url: () => string; parentFrame: () => unknown }) => void\n >();\n\n // Add close listener and framenavigated listener to all existing pages\n const setupPageListeners = (page: Page) => {\n // Navigation listener for URL updates\n const onFrameNavigated = (frame: { url: () => string; parentFrame: () => unknown }) => {\n // Only emit URL for main frame navigations\n if (!frame.parentFrame()) {\n stream.emitUrl(frame.url());\n // Update session state on navigation\n this.updateSessionBrowserState(effectiveThreadId);\n }\n };\n page.on('framenavigated', onFrameNavigated);\n frameNavigatedHandlers.set(page, onFrameNavigated);\n\n // Close listener\n const onClose = () => {\n pageCloseHandlers.delete(page);\n // Clean up framenavigated handler\n const navHandler = frameNavigatedHandlers.get(page);\n if (navHandler) {\n page.off('framenavigated', navHandler);\n frameNavigatedHandlers.delete(page);\n }\n // Small delay to let agent-browser update its internal state\n setTimeout(() => {\n const remainingPages = browserManager.getPages();\n if (stream.isActive() && remainingPages.length > 0) {\n stream.reconnect().catch(() => {});\n // Emit the URL of the new active page\n const activePage = remainingPages[browserManager.getActiveIndex()] || remainingPages[0];\n if (activePage) {\n const url = activePage.url();\n if (url && url !== 'about:blank') {\n stream.emitUrl(url);\n }\n }\n // Note: Don't save state here - races with browser shutdown.\n // State is saved via tool handlers instead.\n }\n }, 100);\n };\n page.once('close', onClose);\n pageCloseHandlers.set(page, onClose);\n };\n\n // Alias for backwards compatibility in the code below\n const setupPageCloseListener = setupPageListeners;\n\n // Set up listeners for existing pages\n for (const page of browserManager.getPages()) {\n setupPageCloseListener(page);\n }\n\n // Also set up listener for new pages\n const onNewPageWithCloseListener = (newPage: Page) => {\n setupPageCloseListener(newPage);\n // Emit the new page's current URL immediately (since framenavigated won't fire for the initial load)\n const url = newPage.url();\n if (url && url !== 'about:blank') {\n stream.emitUrl(url);\n }\n // Note: State is saved via tool handlers (new/switch/close), not events\n onNewPage(newPage);\n };\n\n context.off('page', onNewPage); // Remove the one we added above\n context.on('page', onNewPageWithCloseListener);\n\n // Clean up listeners when stream stops\n stream.once('stop', () => {\n context.off('page', onNewPageWithCloseListener);\n // Remove close handlers from all pages\n for (const [page, handler] of pageCloseHandlers) {\n page.off('close', handler);\n }\n pageCloseHandlers.clear();\n // Remove framenavigated handlers from all pages\n for (const [page, handler] of frameNavigatedHandlers) {\n page.off('framenavigated', handler);\n }\n frameNavigatedHandlers.clear();\n // Remove from streams map using captured key\n this.activeScreencastStreams.delete(streamKey);\n });\n }\n\n await stream.start();\n return stream as unknown as ScreencastStream;\n }\n\n // ---------------------------------------------------------------------------\n // Event Injection (for Studio live view interactivity)\n // ---------------------------------------------------------------------------\n\n override async injectMouseEvent(event: MouseEventParams, threadId?: string): Promise<void> {\n const effectiveThreadId = threadId ?? this.getCurrentThread();\n const manager = await this.getManagerForThread(effectiveThreadId);\n await manager.injectMouseEvent(event);\n }\n\n override async injectKeyboardEvent(event: KeyboardEventParams, threadId?: string): Promise<void> {\n // Get the appropriate manager based on scope\n // Use passed threadId (from input handler) or fall back to current thread\n const effectiveThreadId = threadId ?? this.getCurrentThread();\n const manager = await this.getManagerForThread(effectiveThreadId);\n\n // Use CDP directly to include windowsVirtualKeyCode\n // The agent-browser package's injectKeyboardEvent doesn't pass this field,\n // which breaks non-printable keys like Enter, Backspace, and arrows\n const cdp = await manager.getCDPSession();\n await cdp.send('Input.dispatchKeyEvent', {\n type: event.type,\n key: event.key,\n code: event.code,\n text: event.text,\n modifiers: event.modifiers ?? 0,\n windowsVirtualKeyCode: event.windowsVirtualKeyCode,\n });\n }\n}\n\nexport default AgentBrowser;\n"]}
|