@mastra/agent-browser 0.0.0
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/dist/index.cjs +1736 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +654 -0
- package/dist/index.d.ts +654 -0
- package/dist/index.js +1716 -0
- package/dist/index.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +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/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 isolation 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 { 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 sharedManager: BrowserManager | null = null;\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 /** Map of thread ID to dedicated browser manager (for 'thread' scope) */\n private readonly threadBrowsers = new Map<string, BrowserManager>();\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 * Set the shared browser manager (called after browser launch).\n */\n setSharedManager(manager: BrowserManager): void {\n this.sharedManager = manager;\n }\n\n /**\n * Clear the shared browser manager (called when browser disconnects).\n */\n clearSharedManager(): void {\n this.sharedManager = null;\n }\n\n /**\n * Get the shared browser manager.\n */\n protected getSharedManager(): BrowserManager {\n if (!this.sharedManager) {\n throw new Error('Browser not launched');\n }\n return this.sharedManager;\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 // Full thread isolation - create a new browser manager\n const manager = new BrowserManager();\n\n const launchOptions: BrowserLaunchOptions = {\n headless: this.browserConfig.headless ?? true,\n viewport: this.browserConfig.viewport,\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.threadBrowsers.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.threadBrowsers.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 * Switch to an existing session.\n * For 'thread' scope, no switching needed - each thread has its own manager.\n * For 'shared' scope, nothing to switch.\n */\n protected async switchToSession(_session: AgentBrowserSession): Promise<void> {\n // No-op for both scopes - 'thread' has separate managers, 'shared' shares everything\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 this.threadBrowsers.delete(session.threadId);\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 */\n override async destroyAllSessions(): Promise<void> {\n // Close all dedicated browser managers\n for (const [threadId, manager] of this.threadBrowsers) {\n try {\n await manager.close();\n } catch {\n this.logger?.debug?.(`Failed to close browser for thread: ${threadId}`);\n }\n }\n this.threadBrowsers.clear();\n\n // Clear context sessions (contexts are closed when shared browser closes)\n await super.destroyAllSessions();\n }\n\n /**\n * Check if any thread browsers are still running.\n */\n hasActiveThreadBrowsers(): boolean {\n return this.threadBrowsers.size > 0;\n }\n\n /**\n * Get the browser manager for an existing thread session without creating a new one.\n * Returns null if no session exists for the thread.\n */\n getExistingManagerForThread(threadId: string): BrowserManager | null {\n if (this.scope === 'thread') {\n return this.threadBrowsers.get(threadId) ?? null;\n }\n return this.sharedManager;\n }\n\n /**\n * Clear all session tracking without closing browsers.\n * Used when browsers have been externally closed and we just need to reset state.\n */\n clearAllSessions(): void {\n this.threadBrowsers.clear();\n this.sessions.clear();\n }\n\n /**\n * Clear a specific thread's session without closing the browser.\n * Used when a thread's browser has been externally closed.\n * Preserves the browser state for potential restoration.\n * @param threadId - The thread ID to clear\n */\n clearSession(threadId: string): void {\n // Save the browser state before clearing so it can be restored on relaunch\n const session = this.sessions.get(threadId);\n if (session?.browserState) {\n this.savedBrowserStates.set(threadId, session.browserState);\n }\n this.threadBrowsers.delete(threadId);\n this.sessions.delete(threadId);\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.string().describe('JavaScript code to execute'),\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 { 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';\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 /** Primary browser manager (for 'none' mode, also used as fallback) */\n private browserManager: BrowserManager | null = null;\n private defaultTimeout = 30000;\n\n /** Active screencast streams per thread (for triggering reconnects on tab changes) */\n private activeScreencastStreams = new Map<string, ScreencastStreamImpl>();\n\n /** Default key for shared scope */\n private static readonly SHARED_STREAM_KEY = '__shared__';\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 // Determine browser scope\n // When connecting to an external browser via cdpUrl, 'thread' scope doesn't make sense\n // because we can't spawn new browser instances - we're connecting to an existing one\n let effectiveScope = config.scope ?? 'thread';\n if (config.cdpUrl && effectiveScope === 'thread') {\n this.logger.warn?.(\n 'Browser scope \"thread\" is not supported when connecting via cdpUrl. ' +\n 'Falling back to \"shared\" (shared browser connection).',\n );\n effectiveScope = 'shared';\n }\n\n // Initialize thread manager\n this.threadManager = new AgentBrowserThreadManager({\n scope: effectiveScope,\n browserConfig: config,\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 Isolation (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 'browser' isolation, 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 'browser' isolation, create the thread session first\n // This ensures checkBrowserAlive() has a browser to check\n if (scope === 'thread' && threadId !== DEFAULT_THREAD_ID && !existingSession) {\n await this.getManagerForThread(threadId);\n }\n\n await super.ensureReady();\n\n // For 'browser' isolation with existing session, just verify it's accessible\n if (scope === 'thread' && threadId !== DEFAULT_THREAD_ID && existingSession) {\n await this.getManagerForThread(threadId);\n }\n }\n\n /**\n * Get the browser manager for the current thread.\n * Delegates to ThreadManager for isolation handling.\n */\n async getManagerForThread(threadId?: string): Promise<BrowserManager> {\n const effectiveThreadId = threadId ?? this.getCurrentThread();\n const scope = this.threadManager.getScope();\n\n // In 'browser' isolation, if no specific threadId, use the shared manager\n // (which IS launched, unlike in DEFAULT_THREAD_ID case which would return placeholder)\n if (scope === 'thread' && (!effectiveThreadId || effectiveThreadId === DEFAULT_THREAD_ID)) {\n // Check if we have any active thread sessions\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 * Get the page for a specific thread.\n * For thread-isolated modes, ensures we're on the correct context/page.\n */\n async getPageForThread(threadId?: string): Promise<Page> {\n const manager = await this.getManagerForThread(threadId);\n return manager.getPage();\n }\n\n /**\n * Close a specific thread's browser session.\n * Delegates to ThreadManager and notifies registered callbacks.\n */\n async closeThreadSession(threadId: string): Promise<void> {\n await this.threadManager.destroySession(threadId);\n // Notify callbacks registered for this specific thread\n this.notifyBrowserClosed(threadId);\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n protected override async doLaunch(): Promise<void> {\n const scope = this.threadManager.getScope();\n\n // For 'browser' isolation, 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.browserManager = new BrowserManager();\n this.threadManager.setSharedManager(this.browserManager);\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 'none' isolation, launch the shared browser\n this.browserManager = new BrowserManager();\n\n const localConfig = this.config as BrowserConfig;\n const launchOptions: BrowserLaunchOptions = {\n headless: localConfig.headless ?? true,\n viewport: localConfig.viewport,\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.browserManager.launch(launchOptions);\n\n // Register the shared manager with ThreadManager\n this.threadManager.setSharedManager(this.browserManager);\n\n // Set up close listeners to detect external browser closure\n this.setupCloseListenerForNoneIsolation(this.browserManager);\n }\n\n /**\n * Set up close event listeners for 'none' isolation shared browser.\n * This handles the case where the shared browser is closed externally.\n */\n private setupCloseListenerForNoneIsolation(manager: BrowserManager): void {\n try {\n let disconnectHandled = false;\n const handleDisconnect = () => {\n if (disconnectHandled) return;\n disconnectHandled = true;\n 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 // 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 'none' isolation where it's actually launched)\n const scope = this.threadManager.getScope();\n if (scope === 'shared' && this.browserManager) {\n await this.browserManager.close();\n }\n this.browserManager = 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 'browser' isolation, check if any thread browsers are running\n if (scope === 'thread') {\n return this.threadManager.hasActiveThreadBrowsers();\n }\n\n // For 'none' isolation, check the shared browser\n if (!this.browserManager) {\n return false;\n }\n try {\n const page = this.browserManager.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 getPageForThread even for default thread\n // For shared scope with non-default thread, also use getPageForThread\n if (scope === 'thread' || (scope !== 'shared' && threadId !== DEFAULT_THREAD_ID)) {\n return this.getPageForThread(threadId);\n }\n if (!this.browserManager) throw new Error('Browser not launched');\n return this.browserManager.getPage();\n }\n\n /**\n * Handle browser disconnection by clearing internal state.\n * For 'thread' scope, only notifies the specific thread's callbacks.\n * For 'shared' scope, notifies all callbacks.\n */\n override handleBrowserDisconnected(): void {\n const scope = this.threadManager.getScope();\n const threadId = this.getCurrentThread();\n\n if (scope === 'thread' && threadId !== DEFAULT_THREAD_ID) {\n // Only clear the specific thread's session - other threads have independent browsers\n this.threadManager.clearSession(threadId);\n this.logger.debug?.(`Cleared browser session for thread: ${threadId}`);\n // Notify only this thread's callbacks - do NOT set global status to 'closed'\n // since other threads may still have active browsers\n this.notifyBrowserClosed(threadId);\n } else {\n // For 'shared' scope or default thread, the shared browser is gone\n this.browserManager = null;\n // Also clear the shared manager in the thread manager so getManagerForThread\n // doesn't return the dead manager\n this.threadManager.clearSharedManager();\n // Call base class which notifies all callbacks\n super.handleBrowserDisconnected();\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 let disconnectHandled = false;\n const handleDisconnect = () => {\n if (disconnectHandled) return;\n disconnectHandled = true;\n 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 * Handle browser disconnection for a specific thread.\n * Called when a thread's browser is closed externally.\n */\n private handleThreadBrowserDisconnected(threadId: string): void {\n this.threadManager.clearSession(threadId);\n this.logger.debug?.(`Cleared browser session for thread: ${threadId}`);\n // Notify only the callbacks registered for this specific thread\n this.notifyBrowserClosed(threadId);\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 'browser' isolation, 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 'none' isolation, 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 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 * Update the browser state in the thread session.\n * Called on navigation, tab open/close to keep state fresh.\n */\n private updateSessionBrowserState(threadId?: string): void {\n try {\n const effectiveThreadId = threadId ?? this.getCurrentThread() ?? DEFAULT_THREAD_ID;\n const scope = this.threadManager.getScope();\n\n let manager: BrowserManager | null = null;\n if (scope === 'thread') {\n manager = this.threadManager.getExistingManagerForThread(effectiveThreadId);\n } else {\n manager = this.browserManager;\n }\n\n if (manager) {\n const state = this.getBrowserStateForManager(manager);\n if (state) {\n this.threadManager.updateBrowserState(effectiveThreadId, state);\n }\n }\n } catch {\n // Silently ignore errors during state update\n }\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.reconnectScreencast('tab switch');\n const page = browser.getPage();\n const pageUrl = page.url();\n // Emit URL directly after switch\n const streamKey = this.getStreamKey(this.getCurrentThread());\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.reconnectScreencast('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 // Wrap script in an async function to allow return statements\n const wrappedScript = `(async () => { ${input.script} })()`;\n const result = await page.evaluate(wrappedScript);\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 /**\n * Get the stream key for a thread (or shared key for shared scope).\n */\n private getStreamKey(threadId?: string): string {\n return threadId || AgentBrowser.SHARED_STREAM_KEY;\n }\n\n /**\n * Trigger a screencast reconnect after tab changes.\n * Called internally when tabs are switched or closed.\n */\n private async reconnectScreencast(_reason: string): Promise<void> {\n const threadId = this.getCurrentThread();\n const streamKey = this.getStreamKey(threadId);\n const stream = this.activeScreencastStreams.get(streamKey);\n\n if (stream?.isActive()) {\n // Small delay to let agent-browser update its internal state (activePageIndex, CDP session)\n await new Promise(resolve => setTimeout(resolve, 150));\n if (stream?.isActive()) {\n try {\n await stream.reconnect();\n\n // Emit the URL of the new active page after reconnecting\n // Use thread-specific manager in browser isolation mode\n const manager = this.threadManager.getExistingManagerForThread(threadId) ?? this.browserManager;\n const activePage = manager?.getPage();\n if (activePage) {\n const url = activePage.url();\n if (url) {\n stream.emitUrl(url);\n }\n }\n } catch (err) {\n console.error('[AgentBrowser] Failed to reconnect screencast:', err);\n }\n }\n }\n }\n\n async startScreencast(_options?: ScreencastOptions): Promise<ScreencastStream> {\n const threadId = _options?.threadId;\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' && threadId) {\n browserManager = await this.getManagerForThread(threadId);\n } else {\n if (!this.browserManager) throw new Error('Browser not launched');\n browserManager = this.browserManager;\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(threadId);\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(threadId);\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 isolation mode\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"]}
|