@btraut/browser-bridge 0.4.3 → 0.5.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/api.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/api.ts", "../../core/src/server.ts", "../../core/src/routes/session.ts", "../../core/src/state.ts", "../../core/src/session.ts", "../../core/src/routes/shared.ts", "../../core/src/inspect/errors.ts", "../../core/src/inspect/service.ts", "../../core/src/artifacts.ts", "../../core/src/extension-bridge.ts", "../../core/src/drive.ts", "../../core/src/inspect/ax-snapshot.ts", "../../core/src/inspect/console.ts", "../../core/src/inspect/har.ts", "../../core/src/inspect/html-snapshot.ts", "../../core/src/inspect/snapshot-history.ts", "../../core/src/inspect/snapshot-refs.ts", "../../core/src/page-state-script.ts", "../../core/src/target-matching.ts", "../../shared/src/errors.ts", "../../shared/src/schemas.ts", "../../core/src/routes/artifacts.ts", "../../core/src/diagnostics.ts", "../../core/src/routes/diagnostics.ts", "../../core/src/routes/drive.ts", "../../core/src/routes/inspect.ts", "../../core/src/recovery.ts", "../../core/src/debugger-bridge.ts", "../../mcp-adapter/src/core-client.ts", "../../mcp-adapter/src/tools.ts", "../../mcp-adapter/src/server.ts"],
4
- "sourcesContent": ["export { startCoreServer } from '@btraut/browser-bridge-core';\nexport { startMcpServer } from '@btraut/browser-bridge-mcp-adapter';\n", "import { createServer } from 'http';\nimport express, { Express } from 'express';\nimport { createSessionRouter } from './routes/session';\nimport { registerArtifactsRoutes } from './routes/artifacts';\nimport { registerDiagnosticsRoutes } from './routes/diagnostics';\nimport { registerDriveRoutes, registerInspectRoutes } from './routes';\nimport { SessionRegistry } from './session';\nimport { ExtensionBridge } from './extension-bridge';\nimport { DriveController } from './drive';\nimport { InspectService, createInspectService } from './inspect';\nimport { RecoveryTracker } from './recovery';\nimport { DebuggerBridge } from './debugger-bridge';\n\nexport type CoreServer = {\n app: Express;\n registry: SessionRegistry;\n extensionBridge: ExtensionBridge;\n debuggerBridge: DebuggerBridge;\n drive: DriveController;\n inspect: InspectService;\n recoveryTracker: RecoveryTracker;\n};\n\nexport type CoreServerOptions = {\n registry?: SessionRegistry;\n};\n\nexport const createCoreServer = (\n options: CoreServerOptions = {}\n): CoreServer => {\n const app = express();\n const registry = options.registry ?? new SessionRegistry();\n const extensionBridge = new ExtensionBridge({ registry });\n const debuggerBridge = new DebuggerBridge({ extensionBridge });\n const drive = new DriveController(extensionBridge, registry);\n const inspect = createInspectService({\n registry,\n debuggerBridge,\n extensionBridge,\n });\n const recoveryTracker = new RecoveryTracker();\n\n app.use(express.json({ limit: '1mb' }));\n\n app.get('/health', (_req, res) => {\n res.status(200).json({ ok: true });\n });\n\n app.use(\n '/session',\n createSessionRouter(registry, {\n driveConnected: () => extensionBridge.isConnected(),\n inspectRecover: (sessionId) => inspect.reconnect(sessionId),\n recordRecovery: (attempt) => recoveryTracker.record(attempt),\n })\n );\n\n registerDriveRoutes(app, { drive });\n registerInspectRoutes(app, {\n registry,\n extensionBridge,\n inspectService: inspect,\n });\n registerArtifactsRoutes(app, {\n registry,\n extensionBridge,\n inspectService: inspect,\n });\n registerDiagnosticsRoutes(app, {\n registry,\n extensionBridge,\n debuggerBridge,\n drive,\n inspectService: inspect,\n recoveryTracker,\n });\n\n return {\n app,\n registry,\n extensionBridge,\n debuggerBridge,\n drive,\n inspect,\n recoveryTracker,\n };\n};\n\nexport type CoreServerStartOptions = {\n host?: string;\n port?: number;\n registry?: SessionRegistry;\n};\n\nexport type CoreServerHandle = {\n app: Express;\n registry: SessionRegistry;\n server: ReturnType<typeof createServer>;\n host: string;\n port: number;\n};\n\nconst resolveCorePort = (portOverride?: number): number => {\n if (portOverride !== undefined) {\n return portOverride;\n }\n const env =\n process.env.BROWSER_BRIDGE_CORE_PORT ||\n process.env.BROWSER_VISION_CORE_PORT;\n if (env) {\n const parsed = Number(env);\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed;\n }\n }\n return 3210;\n};\n\nconst resolveSessionTtlMs = (): number => {\n const env =\n process.env.BROWSER_BRIDGE_SESSION_TTL_MS ||\n process.env.BROWSER_VISION_SESSION_TTL_MS;\n if (env) {\n const parsed = Number(env);\n if (Number.isFinite(parsed) && parsed >= 0) {\n return parsed;\n }\n }\n return 60 * 60 * 1000;\n};\n\nconst resolveSessionCleanupIntervalMs = (ttlMs: number): number => {\n const env =\n process.env.BROWSER_BRIDGE_SESSION_CLEANUP_INTERVAL_MS ||\n process.env.BROWSER_VISION_SESSION_CLEANUP_INTERVAL_MS;\n if (env) {\n const parsed = Number(env);\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed;\n }\n }\n if (!Number.isFinite(ttlMs) || ttlMs <= 0) {\n return 60 * 1000;\n }\n return Math.min(60 * 1000, Math.max(1000, Math.floor(ttlMs / 2)));\n};\n\nexport const startCoreServer = (\n options: CoreServerStartOptions = {}\n): Promise<CoreServerHandle> => {\n const host = options.host ?? '127.0.0.1';\n const port = resolveCorePort(options.port);\n const { app, registry, extensionBridge } = createCoreServer({\n registry: options.registry,\n });\n\n return new Promise((resolve, reject) => {\n const server = createServer(app);\n extensionBridge.attach(server);\n server.listen(port, host, () => {\n const address = server.address();\n const resolvedPort =\n typeof address === 'object' && address !== null ? address.port : port;\n\n const ttlMs = resolveSessionTtlMs();\n if (ttlMs > 0) {\n const intervalMs = resolveSessionCleanupIntervalMs(ttlMs);\n const timer = setInterval(() => {\n try {\n registry.cleanupIdleSessions(ttlMs);\n } catch (error) {\n console.warn('Session cleanup failed:', error);\n }\n }, intervalMs);\n timer.unref();\n server.on('close', () => clearInterval(timer));\n }\n\n resolve({ app, registry, server, host, port: resolvedPort });\n });\n\n server.on('error', (error) => {\n reject(error);\n });\n });\n};\n", "import { Router } from 'express';\nimport { InvalidSessionTransition, SessionState } from '../state';\nimport { SessionError, SessionRegistry } from '../session';\nimport { isRecord, sendError, sendResult } from './shared';\n\nconst readSessionId = (body: unknown): string | undefined => {\n if (!isRecord(body)) {\n return undefined;\n }\n\n const sessionId = body.session_id;\n if (typeof sessionId !== 'string' || sessionId.length === 0) {\n return undefined;\n }\n\n return sessionId;\n};\n\ntype SessionRouterOptions = {\n driveConnected?: () => boolean;\n inspectRecover?: (sessionId: string) => Promise<boolean>;\n recordRecovery?: (attempt: {\n sessionId: string;\n recovered: boolean;\n state: SessionState;\n message?: string;\n at: string;\n }) => void;\n};\n\nexport const createSessionRouter = (\n registry: SessionRegistry,\n options: SessionRouterOptions = {}\n): Router => {\n const router = Router();\n\n router.post('/create', (req, res) => {\n const body = req.body;\n if (body !== undefined) {\n if (!isRecord(body)) {\n return sendError(res, 400, {\n code: 'INVALID_ARGUMENT',\n message: 'Request body must be an object.',\n retryable: false,\n });\n }\n if (Object.keys(body).length > 0) {\n return sendError(res, 400, {\n code: 'INVALID_ARGUMENT',\n message: 'session.create does not accept any input fields.',\n retryable: false,\n });\n }\n }\n\n const session = registry.create();\n if (options.driveConnected?.()) {\n try {\n registry.apply(session.id, 'DRIVE_CONNECTED');\n } catch {\n // Ignore invalid transitions.\n }\n }\n return sendResult(res, {\n session_id: session.id,\n state: session.state,\n created_at: session.createdAt.toISOString(),\n });\n });\n\n router.post('/status', (req, res) => {\n const sessionId = readSessionId(req.body);\n if (!sessionId) {\n return sendError(res, 400, {\n code: 'INVALID_ARGUMENT',\n message: 'session_id is required',\n retryable: false,\n });\n }\n\n try {\n const session = registry.require(sessionId);\n return sendResult(res, {\n session_id: session.id,\n state: session.state,\n updated_at: session.updatedAt.toISOString(),\n });\n } catch (error) {\n if (error instanceof SessionError) {\n return sendError(res, 404, {\n code: error.code,\n message: error.message,\n retryable: false,\n });\n }\n\n return sendError(res, 500, {\n code: 'INTERNAL',\n message: 'Unexpected error while fetching status.',\n retryable: false,\n });\n }\n });\n\n router.post('/recover', async (req, res) => {\n const sessionId = readSessionId(req.body);\n if (!sessionId) {\n return sendError(res, 400, {\n code: 'INVALID_ARGUMENT',\n message: 'session_id is required',\n retryable: false,\n });\n }\n\n try {\n const session = registry.require(sessionId);\n let outcome:\n | {\n recovered: boolean;\n message?: string;\n }\n | undefined;\n\n if (session.state === SessionState.DEGRADED_DRIVE) {\n const connected = options.driveConnected?.() ?? false;\n outcome = {\n recovered: connected,\n message: connected\n ? 'Drive recovery succeeded.'\n : 'Drive recovery failed.',\n };\n } else if (session.state === SessionState.DEGRADED_INSPECT) {\n const recovered = options.inspectRecover\n ? await options.inspectRecover(sessionId)\n : false;\n outcome = {\n recovered,\n message: recovered\n ? 'Inspect recovery succeeded.'\n : 'Inspect recovery failed.',\n };\n }\n\n const result = registry.recover(sessionId, outcome);\n if (outcome) {\n const attempt = {\n sessionId,\n recovered: result.recovered,\n state: result.state,\n message: result.message,\n at: new Date().toISOString(),\n };\n options.recordRecovery?.(attempt);\n const status = result.recovered ? 'succeeded' : 'failed';\n console.info(\n `[recovery] session ${sessionId} ${status}: ${result.message ?? ''}`\n );\n }\n return sendResult(res, {\n session_id: result.sessionId,\n recovered: result.recovered,\n state: result.state,\n message: result.message,\n });\n } catch (error) {\n if (error instanceof SessionError) {\n const status = error.code === 'SESSION_CLOSED' ? 409 : 404;\n return sendError(res, status, {\n code: error.code,\n message: error.message,\n retryable: false,\n });\n }\n\n if (error instanceof InvalidSessionTransition) {\n return sendError(res, 409, {\n code: 'FAILED_PRECONDITION',\n message: error.message,\n retryable: false,\n });\n }\n\n return sendError(res, 500, {\n code: 'INTERNAL',\n message: 'Unexpected error while recovering session.',\n retryable: false,\n });\n }\n });\n\n router.post('/close', (req, res) => {\n const sessionId = readSessionId(req.body);\n if (!sessionId) {\n return sendError(res, 400, {\n code: 'INVALID_ARGUMENT',\n message: 'session_id is required',\n retryable: false,\n });\n }\n\n try {\n registry.close(sessionId);\n return sendResult(res, { ok: true });\n } catch (error) {\n if (error instanceof SessionError) {\n return sendError(res, 404, {\n code: error.code,\n message: error.message,\n retryable: false,\n });\n }\n\n if (error instanceof InvalidSessionTransition) {\n return sendError(res, 409, {\n code: 'FAILED_PRECONDITION',\n message: error.message,\n retryable: false,\n });\n }\n\n return sendError(res, 500, {\n code: 'INTERNAL',\n message: 'Unexpected error while closing session.',\n retryable: false,\n });\n }\n });\n\n return router;\n};\n", "export enum SessionState {\n INIT = 'INIT',\n DRIVE_READY = 'DRIVE_READY',\n INSPECT_READY = 'INSPECT_READY',\n READY = 'READY',\n DEGRADED_DRIVE = 'DEGRADED_DRIVE',\n DEGRADED_INSPECT = 'DEGRADED_INSPECT',\n BROKEN = 'BROKEN',\n CLOSED = 'CLOSED',\n}\n\nexport type SessionEvent =\n | 'DRIVE_CONNECTED'\n | 'INSPECT_CONNECTED'\n | 'DRIVE_DISCONNECTED'\n | 'INSPECT_DISCONNECTED'\n | 'RECOVER_SUCCEEDED'\n | 'RECOVER_FAILED'\n | 'CLOSE';\n\nexport class InvalidSessionTransition extends Error {\n public readonly from: SessionState;\n public readonly event: SessionEvent;\n\n constructor(from: SessionState, event: SessionEvent) {\n super(`Invalid session transition from ${from} via ${event}.`);\n this.name = 'InvalidSessionTransition';\n this.from = from;\n this.event = event;\n }\n}\n\nexport const transitionSession = (\n state: SessionState,\n event: SessionEvent\n): SessionState => {\n if (event === 'CLOSE') {\n return SessionState.CLOSED;\n }\n\n if (event === 'RECOVER_FAILED') {\n if (state === SessionState.CLOSED) {\n throw new InvalidSessionTransition(state, event);\n }\n\n return SessionState.BROKEN;\n }\n\n switch (state) {\n case SessionState.INIT: {\n if (event === 'DRIVE_CONNECTED') {\n return SessionState.DRIVE_READY;\n }\n if (event === 'INSPECT_CONNECTED') {\n return SessionState.INSPECT_READY;\n }\n break;\n }\n case SessionState.DRIVE_READY: {\n if (event === 'INSPECT_CONNECTED') {\n return SessionState.READY;\n }\n if (event === 'DRIVE_DISCONNECTED') {\n return SessionState.INIT;\n }\n break;\n }\n case SessionState.INSPECT_READY: {\n if (event === 'DRIVE_CONNECTED') {\n return SessionState.READY;\n }\n break;\n }\n case SessionState.READY: {\n if (event === 'DRIVE_DISCONNECTED') {\n return SessionState.DEGRADED_DRIVE;\n }\n if (event === 'INSPECT_DISCONNECTED') {\n return SessionState.DEGRADED_INSPECT;\n }\n break;\n }\n case SessionState.DEGRADED_DRIVE: {\n if (event === 'RECOVER_SUCCEEDED') {\n return SessionState.READY;\n }\n break;\n }\n case SessionState.DEGRADED_INSPECT: {\n if (event === 'RECOVER_SUCCEEDED') {\n return SessionState.READY;\n }\n break;\n }\n case SessionState.BROKEN:\n case SessionState.CLOSED:\n default:\n break;\n }\n\n throw new InvalidSessionTransition(state, event);\n};\n\nexport const shouldRetryDriveOp = (options: {\n attempt: number;\n retryable: boolean;\n}): boolean => {\n return options.retryable && options.attempt === 0;\n};\n\nexport const shouldRetryInspectOp = (options: {\n attempt: number;\n reconnectSucceeded: boolean;\n}): boolean => {\n return options.reconnectSucceeded && options.attempt === 0;\n};\n", "import { randomUUID } from 'crypto';\nimport {\n InvalidSessionTransition,\n SessionEvent,\n SessionState,\n transitionSession,\n} from './state';\n\nexport type SessionRecord = {\n id: string;\n state: SessionState;\n createdAt: Date;\n updatedAt: Date;\n lastAccessedAt: Date;\n};\n\nexport type RecoverResult = {\n sessionId: string;\n recovered: boolean;\n state: SessionState;\n message?: string;\n};\n\nexport type SessionErrorCode = 'SESSION_NOT_FOUND' | 'SESSION_CLOSED';\n\nexport class SessionError extends Error {\n public readonly code: SessionErrorCode;\n\n constructor(code: SessionErrorCode, message: string) {\n super(message);\n this.name = 'SessionError';\n this.code = code;\n }\n}\n\nexport class SessionRegistry {\n private sessions = new Map<string, SessionRecord>();\n\n create(): SessionRecord {\n const now = new Date();\n const id = `session-${randomUUID()}`;\n const session: SessionRecord = {\n id,\n state: SessionState.INIT,\n createdAt: now,\n updatedAt: now,\n lastAccessedAt: now,\n };\n\n this.sessions.set(id, session);\n return session;\n }\n\n get(sessionId: string): SessionRecord | undefined {\n return this.sessions.get(sessionId);\n }\n\n list(): SessionRecord[] {\n return Array.from(this.sessions.values());\n }\n\n require(sessionId: string): SessionRecord {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new SessionError(\n 'SESSION_NOT_FOUND',\n `Session ${sessionId} does not exist.`\n );\n }\n\n session.lastAccessedAt = new Date();\n return session;\n }\n\n cleanupIdleSessions(ttlMs: number, now = new Date()): number {\n if (!Number.isFinite(ttlMs) || ttlMs <= 0) {\n return 0;\n }\n\n let removed = 0;\n for (const [id, session] of this.sessions.entries()) {\n const idleMs = now.getTime() - session.lastAccessedAt.getTime();\n if (idleMs > ttlMs) {\n this.sessions.delete(id);\n removed += 1;\n }\n }\n return removed;\n }\n\n apply(sessionId: string, event: SessionEvent): SessionRecord {\n const session = this.require(sessionId);\n if (session.state === SessionState.CLOSED && event !== 'CLOSE') {\n throw new SessionError(\n 'SESSION_CLOSED',\n `Session ${sessionId} is closed.`\n );\n }\n\n try {\n session.state = transitionSession(session.state, event);\n } catch (error) {\n if (error instanceof InvalidSessionTransition) {\n throw error;\n }\n throw error;\n }\n\n session.updatedAt = new Date();\n return session;\n }\n\n recover(\n sessionId: string,\n outcome?: { recovered: boolean; message?: string }\n ): RecoverResult {\n const session = this.require(sessionId);\n if (session.state === SessionState.CLOSED) {\n throw new SessionError(\n 'SESSION_CLOSED',\n `Session ${sessionId} is closed.`\n );\n }\n\n let recovered = false;\n let message: string | undefined;\n\n if (\n session.state === SessionState.DEGRADED_DRIVE ||\n session.state === SessionState.DEGRADED_INSPECT\n ) {\n if (outcome?.recovered) {\n session.state = transitionSession(session.state, 'RECOVER_SUCCEEDED');\n recovered = true;\n message = outcome.message ?? 'Recovery succeeded.';\n } else if (outcome) {\n session.state = transitionSession(session.state, 'RECOVER_FAILED');\n recovered = false;\n message = outcome.message ?? 'Recovery failed.';\n } else {\n recovered = false;\n message = 'Recovery not attempted.';\n }\n } else if (session.state === SessionState.BROKEN) {\n recovered = false;\n message = 'Session is broken.';\n } else {\n recovered = false;\n message = 'No recovery needed.';\n }\n\n session.updatedAt = new Date();\n\n return {\n sessionId: session.id,\n recovered,\n state: session.state,\n message,\n };\n }\n\n close(sessionId: string): SessionRecord {\n const session = this.require(sessionId);\n session.state = transitionSession(session.state, 'CLOSE');\n session.updatedAt = new Date();\n return session;\n }\n}\n", "import type { DriveTabInfo } from '../drive-protocol';\nimport type { TargetHint } from '../target-matching';\n\nexport type ResponseLike = {\n status: (code: number) => ResponseLike;\n json: (body: unknown) => void;\n};\n\nexport type ErrorInfo = {\n code: string;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n};\n\nexport const sendError = (\n res: ResponseLike,\n status: number,\n error: ErrorInfo\n): void => {\n res.status(status).json({ ok: false, error });\n};\n\nexport const sendResult = <T>(res: ResponseLike, result: T): void => {\n res.status(200).json({ ok: true, result });\n};\n\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport const errorStatus = (code: string): number => {\n switch (code) {\n case 'INVALID_ARGUMENT':\n return 400;\n case 'SESSION_NOT_FOUND':\n case 'TAB_NOT_FOUND':\n case 'LOCATOR_NOT_FOUND':\n return 404;\n case 'SESSION_CLOSED':\n case 'FAILED_PRECONDITION':\n case 'DEBUGGER_IN_USE':\n return 409;\n case 'ATTACH_DENIED':\n return 403;\n case 'NOT_SUPPORTED':\n case 'NOT_IMPLEMENTED':\n return 501;\n case 'EXTENSION_DISCONNECTED':\n case 'INSPECT_UNAVAILABLE':\n return 503;\n case 'TIMEOUT':\n return 504;\n default:\n return 500;\n }\n};\n\nexport const deriveHintFromTabs = (\n tabs: DriveTabInfo[]\n): TargetHint | undefined => {\n if (!Array.isArray(tabs) || tabs.length === 0) {\n return undefined;\n }\n let best: DriveTabInfo | undefined;\n let bestTime = -Infinity;\n for (const tab of tabs) {\n const raw = tab.last_active_at;\n const time = raw ? Date.parse(raw) : NaN;\n const score = Number.isFinite(time) ? time : -Infinity;\n if (!best || score > bestTime) {\n best = tab;\n bestTime = score;\n }\n }\n if (!best) {\n return undefined;\n }\n if (!best.url && !best.title && !best.last_active_at) {\n return undefined;\n }\n return {\n url: best.url,\n title: best.title,\n lastActiveAt: best.last_active_at,\n };\n};\n", "import type { InspectErrorCode } from './types';\n\nexport class InspectError extends Error {\n public readonly code: InspectErrorCode;\n public readonly retryable: boolean;\n public readonly details?: Record<string, unknown>;\n\n constructor(\n code: InspectErrorCode,\n message: string,\n options: { retryable?: boolean; details?: Record<string, unknown> } = {}\n ) {\n super(message);\n this.name = 'InspectError';\n this.code = code;\n this.retryable = options.retryable ?? false;\n this.details = options.details;\n }\n}\n", "import { randomUUID } from 'crypto';\nimport { writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { Readability } from '@mozilla/readability';\nimport { JSDOM } from 'jsdom';\nimport TurndownService from 'turndown';\nimport { ensureArtifactRootDir } from '../artifacts';\nimport { driveMutex } from '../drive';\nimport type { DebuggerBridge } from '../debugger-bridge';\nimport type {\n DriveAction,\n DriveErrorInfo,\n DriveResponse,\n DriveScreenshotResult,\n DriveTabInfo,\n} from '../drive-protocol';\nimport {\n applyAxSnapshotFilters,\n getAxName,\n getAxNodes,\n getAxRole,\n LABEL_AX_ROLES,\n matchesAxText,\n matchesTextValue,\n normalizeQuery,\n truncateAxSnapshot,\n} from './ax-snapshot';\nimport { toConsoleEntry } from './console';\nimport { buildHar } from './har';\nimport { captureHtml } from './html-snapshot';\nimport { SnapshotHistory } from './snapshot-history';\nimport {\n applySnapshotRefs,\n assignRefsToAxSnapshot,\n resolveNodeIdForSelector,\n} from './snapshot-refs';\nimport { InspectError } from './errors';\nimport type {\n ArtifactInfo,\n ConsoleEntry,\n ConsoleListResult,\n DomSnapshotResult,\n EvaluateResult,\n ExtractContentResult,\n FormInfo,\n InspectErrorCode,\n InspectServiceOptions,\n PageStateResult,\n PerformanceMetricsResult,\n StorageEntry,\n} from './types';\nimport { PAGE_STATE_SCRIPT } from '../page-state-script';\nimport { SessionError, SessionRegistry, SessionRecord } from '../session';\nimport { SessionState } from '../state';\nimport { pickBestTarget } from '../target-matching';\nimport type { TargetHint } from '../target-matching';\n\nconst DEFAULT_MAX_SNAPSHOTS_PER_SESSION = 20;\nconst DEFAULT_MAX_SNAPSHOT_HISTORY = 100;\n\nexport class InspectService {\n private readonly registry: SessionRegistry;\n private readonly debugger?: DebuggerBridge;\n private readonly extensionBridge?: {\n isConnected: () => boolean;\n getStatus: () => { tabs: DriveTabInfo[] };\n request?: <T = unknown>(\n action: DriveAction,\n params?: Record<string, unknown>,\n timeoutMs?: number\n ) => Promise<DriveResponse<T>>;\n };\n private lastError?: InspectError;\n private lastErrorAt?: string;\n private readonly snapshots: SnapshotHistory;\n\n constructor(options: InspectServiceOptions) {\n this.registry = options.registry;\n this.debugger = options.debuggerBridge;\n this.extensionBridge = options.extensionBridge;\n const maxSnapshotsPerSession =\n options.maxSnapshotsPerSession ?? DEFAULT_MAX_SNAPSHOTS_PER_SESSION;\n const maxSnapshotHistory =\n options.maxSnapshotHistory ?? DEFAULT_MAX_SNAPSHOT_HISTORY;\n this.snapshots = new SnapshotHistory({\n maxSnapshotsPerSession,\n maxSnapshotHistory,\n });\n }\n\n isConnected(): boolean {\n return this.debugger?.hasAttachments() ?? false;\n }\n\n getLastError(): { error: InspectError; at: string } | undefined {\n if (!this.lastError || !this.lastErrorAt) {\n const debuggerError = this.debugger?.getLastError();\n if (!debuggerError) {\n return undefined;\n }\n return {\n error: new InspectError(\n 'INSPECT_UNAVAILABLE',\n debuggerError.error.message,\n {\n retryable: debuggerError.error.retryable,\n details: {\n code: debuggerError.error.code,\n ...(debuggerError.error.details\n ? debuggerError.error.details\n : {}),\n },\n }\n ),\n at: debuggerError.at,\n };\n }\n return { error: this.lastError, at: this.lastErrorAt };\n }\n\n async reconnect(sessionId: string): Promise<boolean> {\n try {\n this.requireSession(sessionId);\n const selection = await this.resolveTab();\n const debuggerBridge = this.ensureDebugger();\n const result = await debuggerBridge.attach(selection.tabId);\n if (result.ok) {\n this.markInspectConnected(sessionId);\n return true;\n }\n const error = this.mapDebuggerError(result.error);\n this.recordError(error);\n return false;\n } catch (error) {\n if (error instanceof InspectError) {\n this.recordError(error);\n }\n return false;\n }\n }\n\n async domSnapshot(input: {\n sessionId: string;\n format: 'ax' | 'html';\n consistency: 'best_effort' | 'quiesce';\n interactive?: boolean;\n compact?: boolean;\n maxNodes?: number;\n selector?: string;\n targetHint?: TargetHint;\n }): Promise<DomSnapshotResult> {\n this.requireSession(input.sessionId);\n const selection = await this.resolveTab(input.targetHint);\n const debuggerCommand = this.debuggerCommand.bind(this);\n\n const work = async (): Promise<DomSnapshotResult> => {\n if (input.format === 'html') {\n const html = await captureHtml(selection.tabId, {\n selector: input.selector,\n debuggerCommand,\n onEvaluationFailed: () => {\n const error = new InspectError(\n 'EVALUATION_FAILED',\n 'Failed to evaluate HTML snapshot.',\n { retryable: false }\n );\n this.recordError(error);\n throw error;\n },\n });\n const warnings = [...(selection.warnings ?? [])];\n if (input.interactive) {\n warnings.push(\n 'Interactive filter is only supported for AX snapshots.'\n );\n }\n if (input.compact) {\n warnings.push('Compact filter is only supported for AX snapshots.');\n }\n if (input.maxNodes !== undefined) {\n warnings.push('max_nodes is only supported for AX snapshots.');\n }\n if (input.selector && html === '') {\n warnings.push(`Selector not found: ${input.selector}`);\n }\n return {\n format: 'html',\n snapshot: html,\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n }\n\n try {\n await this.enableAccessibility(selection.tabId);\n const selectorWarnings: string[] = [];\n let result: unknown;\n if (input.selector) {\n const resolved = await resolveNodeIdForSelector(\n selection.tabId,\n input.selector,\n debuggerCommand\n );\n selectorWarnings.push(...(resolved.warnings ?? []));\n if (!resolved.nodeId) {\n let refWarnings: string[] = [];\n try {\n refWarnings = await applySnapshotRefs(\n selection.tabId,\n new Map(),\n debuggerCommand\n );\n } catch {\n refWarnings = ['Failed to clear prior snapshot refs.'];\n }\n const warnings = [\n ...(selection.warnings ?? []),\n ...selectorWarnings,\n ...refWarnings,\n ];\n return {\n format: 'ax',\n snapshot: { nodes: [] },\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n }\n result = await this.debuggerCommand(\n selection.tabId,\n 'Accessibility.getPartialAXTree',\n { nodeId: resolved.nodeId }\n );\n } else {\n result = await this.debuggerCommand(\n selection.tabId,\n 'Accessibility.getFullAXTree',\n {}\n );\n }\n let snapshot =\n input.interactive || input.compact\n ? applyAxSnapshotFilters(result, {\n interactiveOnly: input.interactive,\n compact: input.compact,\n })\n : result;\n let truncated = false;\n const truncationWarnings: string[] = [];\n if (input.maxNodes !== undefined) {\n const truncatedResult = truncateAxSnapshot(snapshot, input.maxNodes);\n snapshot = truncatedResult.snapshot;\n truncated = truncatedResult.truncated;\n if (truncated) {\n truncationWarnings.push(\n `AX snapshot truncated to ${input.maxNodes} nodes.`\n );\n }\n }\n const refMap = assignRefsToAxSnapshot(snapshot);\n const refWarnings = await applySnapshotRefs(\n selection.tabId,\n refMap,\n debuggerCommand\n );\n const warnings = [\n ...(selection.warnings ?? []),\n ...selectorWarnings,\n ...truncationWarnings,\n ...(refWarnings ?? []),\n ];\n return {\n format: 'ax',\n snapshot,\n ...(truncated ? { truncated: true } : {}),\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n } catch (error) {\n if (error instanceof InspectError) {\n const fallbackCodes: InspectErrorCode[] = [\n 'NOT_SUPPORTED',\n 'INSPECT_UNAVAILABLE',\n 'EVALUATION_FAILED',\n ];\n if (!fallbackCodes.includes(error.code)) {\n throw error;\n }\n const html = await captureHtml(selection.tabId, {\n selector: input.selector,\n debuggerCommand,\n onEvaluationFailed: () => {\n const error = new InspectError(\n 'EVALUATION_FAILED',\n 'Failed to evaluate HTML snapshot.',\n { retryable: false }\n );\n this.recordError(error);\n throw error;\n },\n });\n const warnings = [\n ...(selection.warnings ?? []),\n 'AX snapshot failed; returned HTML instead.',\n ...(input.maxNodes !== undefined\n ? ['max_nodes is only supported for AX snapshots.']\n : []),\n ...(input.interactive\n ? ['Interactive filter is only supported for AX snapshots.']\n : []),\n ...(input.compact\n ? ['Compact filter is only supported for AX snapshots.']\n : []),\n ...(input.selector && html === ''\n ? [`Selector not found: ${input.selector}`]\n : []),\n ];\n return {\n format: 'html',\n snapshot: html,\n warnings,\n };\n }\n throw error;\n }\n };\n\n if (input.consistency === 'quiesce') {\n const result = await driveMutex.runExclusive(work);\n this.snapshots.record(input.sessionId, result);\n this.markInspectConnected(input.sessionId);\n return result;\n }\n const result = await work();\n this.snapshots.record(input.sessionId, result);\n this.markInspectConnected(input.sessionId);\n return result;\n }\n\n domDiff(input: { sessionId: string }): {\n added: string[];\n removed: string[];\n changed: string[];\n summary: string;\n } {\n this.requireSession(input.sessionId);\n this.markInspectConnected(input.sessionId);\n return this.snapshots.diff(input.sessionId);\n }\n\n async find(input: {\n sessionId: string;\n kind: 'role' | 'text' | 'label';\n role?: string;\n name?: string;\n text?: string;\n label?: string;\n targetHint?: TargetHint;\n }): Promise<{\n matches: Array<{ ref: string; role?: string; name?: string }>;\n warnings?: string[];\n }> {\n const snapshot = await this.domSnapshot({\n sessionId: input.sessionId,\n format: 'ax',\n consistency: 'best_effort',\n targetHint: input.targetHint,\n });\n const warnings = [...(snapshot.warnings ?? [])];\n if (snapshot.format !== 'ax') {\n warnings.push('AX snapshot unavailable; cannot resolve refs.');\n return {\n matches: [],\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n }\n\n const nodes = getAxNodes(snapshot.snapshot);\n const matches: Array<{ ref: string; role?: string; name?: string }> = [];\n\n const nameQuery =\n typeof input.name === 'string' ? normalizeQuery(input.name) : '';\n const textQuery =\n typeof input.text === 'string' ? normalizeQuery(input.text) : '';\n const labelQuery =\n typeof input.label === 'string' ? normalizeQuery(input.label) : '';\n const roleQuery =\n typeof input.role === 'string' ? normalizeQuery(input.role) : '';\n\n for (const node of nodes) {\n if (!node || typeof node !== 'object') {\n continue;\n }\n if (typeof node.ref !== 'string' || node.ref.length === 0) {\n continue;\n }\n const role = getAxRole(node);\n const name = getAxName(node);\n\n if (input.kind === 'role') {\n if (!role || role !== roleQuery) {\n continue;\n }\n if (nameQuery && !matchesTextValue(name, nameQuery)) {\n continue;\n }\n } else if (input.kind === 'text') {\n if (!textQuery || !matchesAxText(node, textQuery)) {\n continue;\n }\n } else if (input.kind === 'label') {\n if (!labelQuery || !LABEL_AX_ROLES.has(role)) {\n continue;\n }\n if (!matchesTextValue(name, labelQuery)) {\n continue;\n }\n }\n\n matches.push({\n ref: node.ref,\n ...(role ? { role } : {}),\n ...(name ? { name } : {}),\n });\n }\n\n return {\n matches,\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n }\n\n async consoleList(input: {\n sessionId: string;\n targetHint?: TargetHint;\n }): Promise<ConsoleListResult> {\n this.requireSession(input.sessionId);\n const selection = await this.resolveTab(input.targetHint);\n await this.enableConsole(selection.tabId);\n\n const events = this.ensureDebugger().getConsoleEvents(selection.tabId);\n const entries = events\n .map((event) => toConsoleEntry(event))\n .filter((entry): entry is ConsoleEntry => entry !== null);\n\n const result = {\n entries,\n warnings: selection.warnings,\n };\n this.markInspectConnected(input.sessionId);\n return result;\n }\n\n async networkHar(input: {\n sessionId: string;\n targetHint?: TargetHint;\n }): Promise<ArtifactInfo> {\n this.requireSession(input.sessionId);\n const selection = await this.resolveTab(input.targetHint);\n await this.enableNetwork(selection.tabId);\n\n const events = this.ensureDebugger().getNetworkEvents(selection.tabId);\n const har = buildHar(events, selection.tab.title);\n\n try {\n const rootDir = await ensureArtifactRootDir(input.sessionId);\n const artifactId = randomUUID();\n const filePath = path.join(rootDir, `har-${artifactId}.json`);\n await writeFile(filePath, JSON.stringify(har, null, 2), 'utf-8');\n const result = {\n artifact_id: artifactId,\n path: filePath,\n mime: 'application/json',\n };\n this.markInspectConnected(input.sessionId);\n return result;\n } catch {\n const error = new InspectError(\n 'ARTIFACT_IO_ERROR',\n 'Failed to write HAR file.'\n );\n this.recordError(error);\n throw error;\n }\n }\n\n async evaluate(input: {\n sessionId: string;\n expression?: string;\n targetHint?: TargetHint;\n }): Promise<EvaluateResult> {\n this.requireSession(input.sessionId);\n const selection = await this.resolveTab(input.targetHint);\n const expression = input.expression ?? 'undefined';\n\n await this.debuggerCommand(selection.tabId, 'Runtime.enable', {});\n const result = await this.debuggerCommand(\n selection.tabId,\n 'Runtime.evaluate',\n {\n expression,\n returnByValue: true,\n awaitPromise: true,\n }\n );\n\n if (result && typeof result === 'object' && 'exceptionDetails' in result) {\n const output = {\n exception: (result as { exceptionDetails?: unknown }).exceptionDetails,\n warnings: selection.warnings,\n };\n this.markInspectConnected(input.sessionId);\n return output;\n }\n\n const output = {\n value: (result as { result?: { value?: unknown } })?.result?.value,\n warnings: selection.warnings,\n };\n this.markInspectConnected(input.sessionId);\n return output;\n }\n\n async extractContent(input: {\n sessionId: string;\n format: 'markdown' | 'text' | 'article_json';\n includeMetadata?: boolean;\n targetHint?: TargetHint;\n }): Promise<ExtractContentResult> {\n this.requireSession(input.sessionId);\n const selection = await this.resolveTab(input.targetHint);\n\n const debuggerCommand = this.debuggerCommand.bind(this);\n const html = await captureHtml(selection.tabId, {\n debuggerCommand,\n onEvaluationFailed: () => {\n const error = new InspectError(\n 'EVALUATION_FAILED',\n 'Failed to evaluate HTML snapshot.',\n { retryable: false }\n );\n this.recordError(error);\n throw error;\n },\n });\n const url = selection.tab.url ?? 'about:blank';\n let article: ReturnType<Readability['parse']> | null = null;\n try {\n const dom = new JSDOM(html, { url });\n const reader = new Readability(dom.window.document);\n article = reader.parse();\n } catch {\n const err = new InspectError(\n 'EVALUATION_FAILED',\n 'Failed to parse page content.',\n { retryable: false }\n );\n this.recordError(err);\n throw err;\n }\n\n if (!article) {\n const err = new InspectError(\n 'NOT_SUPPORTED',\n 'Readability could not extract content.',\n { retryable: false }\n );\n this.recordError(err);\n throw err;\n }\n\n let content = '';\n if (input.format === 'article_json') {\n content = JSON.stringify(article, null, 2);\n } else if (input.format === 'text') {\n content = article.textContent ?? '';\n } else {\n const turndown = new TurndownService();\n content = turndown.turndown(article.content ?? '');\n }\n\n const warnings = selection.warnings ?? [];\n const includeMetadata = input.includeMetadata ?? true;\n const output: ExtractContentResult = {\n content,\n ...(includeMetadata\n ? {\n title: article.title ?? undefined,\n byline: article.byline ?? undefined,\n excerpt: article.excerpt ?? undefined,\n siteName: (article as { siteName?: string }).siteName ?? undefined,\n }\n : {}),\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n\n this.markInspectConnected(input.sessionId);\n return output;\n }\n\n async pageState(input: {\n sessionId: string;\n targetHint?: TargetHint;\n }): Promise<PageStateResult> {\n this.requireSession(input.sessionId);\n const selection = await this.resolveTab(input.targetHint);\n\n await this.debuggerCommand(selection.tabId, 'Runtime.enable', {});\n const expression = PAGE_STATE_SCRIPT;\n\n const result = await this.debuggerCommand(\n selection.tabId,\n 'Runtime.evaluate',\n {\n expression,\n returnByValue: true,\n awaitPromise: true,\n }\n );\n\n if (result && typeof result === 'object' && 'exceptionDetails' in result) {\n const error = new InspectError(\n 'EVALUATION_FAILED',\n 'Failed to capture page state.',\n { retryable: false }\n );\n this.recordError(error);\n throw error;\n }\n\n const value = (result as { result?: { value?: unknown } })?.result?.value;\n const raw =\n value && typeof value === 'object'\n ? (value as Partial<PageStateResult>)\n : {};\n const warnings = [\n ...(Array.isArray(raw.warnings) ? raw.warnings : []),\n ...(selection.warnings ?? []),\n ];\n const output: PageStateResult = {\n forms: Array.isArray(raw.forms) ? (raw.forms as FormInfo[]) : [],\n localStorage: Array.isArray(raw.localStorage)\n ? (raw.localStorage as StorageEntry[])\n : [],\n sessionStorage: Array.isArray(raw.sessionStorage)\n ? (raw.sessionStorage as StorageEntry[])\n : [],\n cookies: Array.isArray(raw.cookies)\n ? (raw.cookies as StorageEntry[])\n : [],\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n\n this.markInspectConnected(input.sessionId);\n return output;\n }\n\n async performanceMetrics(input: {\n sessionId: string;\n targetHint?: TargetHint;\n }): Promise<PerformanceMetricsResult> {\n this.requireSession(input.sessionId);\n const selection = await this.resolveTab(input.targetHint);\n\n await this.debuggerCommand(selection.tabId, 'Performance.enable', {});\n const result = await this.debuggerCommand(\n selection.tabId,\n 'Performance.getMetrics',\n {}\n );\n const metrics = Array.isArray((result as { metrics?: unknown[] })?.metrics)\n ? (\n result as { metrics: Array<{ name: string; value: number }> }\n ).metrics.map((metric) => ({\n name: metric.name,\n value: metric.value,\n }))\n : [];\n\n const output = { metrics, warnings: selection.warnings };\n this.markInspectConnected(input.sessionId);\n return output;\n }\n\n async screenshot(input: {\n sessionId: string;\n target: 'viewport' | 'full';\n selector?: string;\n format?: 'png' | 'jpeg' | 'webp';\n quality?: number;\n targetHint?: TargetHint;\n }): Promise<ArtifactInfo> {\n this.requireSession(input.sessionId);\n const selection = await this.resolveTab(input.targetHint);\n\n const format = input.format ?? 'png';\n const writeArtifact = async (data: string): Promise<ArtifactInfo> => {\n try {\n const rootDir = await ensureArtifactRootDir(input.sessionId);\n const artifactId = randomUUID();\n const extension = format === 'jpeg' ? 'jpg' : format;\n const filePath = path.join(\n rootDir,\n `screenshot-${artifactId}.${extension}`\n );\n await writeFile(filePath, Buffer.from(data, 'base64'));\n const mime = format === 'jpeg' ? 'image/jpeg' : `image/${format}`;\n const output = {\n artifact_id: artifactId,\n path: filePath,\n mime,\n };\n this.markInspectConnected(input.sessionId);\n return output;\n } catch {\n const error = new InspectError(\n 'ARTIFACT_IO_ERROR',\n 'Failed to write screenshot file.'\n );\n this.recordError(error);\n throw error;\n }\n };\n\n if (input.selector) {\n if (!this.extensionBridge?.request) {\n const error = new InspectError(\n 'NOT_SUPPORTED',\n 'Element screenshots require an extension that supports drive.screenshot.'\n );\n this.recordError(error);\n throw error;\n }\n\n const response =\n await this.extensionBridge.request<DriveScreenshotResult>(\n 'drive.screenshot',\n {\n tab_id: selection.tabId,\n mode: 'element',\n selector: input.selector,\n format,\n ...(typeof input.quality === 'number'\n ? { quality: input.quality }\n : {}),\n },\n 120000\n );\n\n if (response.status === 'error') {\n const error = new InspectError(\n (response.error?.code as InspectErrorCode) ?? 'INSPECT_UNAVAILABLE',\n response.error?.message ?? 'Failed to capture element screenshot.',\n {\n retryable: response.error?.retryable ?? false,\n ...(response.error?.details\n ? { details: response.error.details }\n : {}),\n }\n );\n this.recordError(error);\n throw error;\n }\n\n const result = response.result;\n if (!result?.data_base64 || typeof result.data_base64 !== 'string') {\n const error = new InspectError(\n 'INSPECT_UNAVAILABLE',\n 'Failed to capture element screenshot.'\n );\n this.recordError(error);\n throw error;\n }\n\n return await writeArtifact(result.data_base64);\n }\n\n if (input.target === 'full' && this.extensionBridge?.request) {\n try {\n const response =\n await this.extensionBridge.request<DriveScreenshotResult>(\n 'drive.screenshot',\n {\n tab_id: selection.tabId,\n mode: 'full_page',\n format,\n ...(typeof input.quality === 'number'\n ? { quality: input.quality }\n : {}),\n },\n 120000\n );\n\n if (response.status === 'error') {\n const error = new InspectError(\n (response.error?.code as InspectErrorCode) ?? 'INSPECT_UNAVAILABLE',\n response.error?.message ??\n 'Failed to capture full page screenshot.',\n {\n retryable: response.error?.retryable ?? false,\n ...(response.error?.details\n ? { details: response.error.details }\n : {}),\n }\n );\n this.recordError(error);\n throw error;\n }\n\n const result = response.result;\n if (!result?.data_base64 || typeof result.data_base64 !== 'string') {\n const error = new InspectError(\n 'INSPECT_UNAVAILABLE',\n 'Failed to capture full page screenshot.'\n );\n this.recordError(error);\n throw error;\n }\n\n return await writeArtifact(result.data_base64);\n } catch (error) {\n // Fall back to CDP screenshots for environments that don't yet support\n // extension-driven full page capture.\n if (error instanceof InspectError) {\n const code = String(error.code);\n if (\n ![\n 'NOT_SUPPORTED',\n 'NOT_IMPLEMENTED',\n 'INSPECT_UNAVAILABLE',\n ].includes(code)\n ) {\n throw error;\n }\n }\n }\n }\n\n await this.debuggerCommand(selection.tabId, 'Page.enable', {});\n\n let captureParams: Record<string, unknown> = {\n format,\n fromSurface: true,\n };\n if (format !== 'png' && typeof input.quality === 'number') {\n captureParams = { ...captureParams, quality: input.quality };\n }\n\n if (input.target === 'full') {\n const layout = await this.debuggerCommand(\n selection.tabId,\n 'Page.getLayoutMetrics',\n {}\n );\n const contentSize = (\n layout as { contentSize?: { width: number; height: number } }\n )?.contentSize;\n if (contentSize) {\n captureParams = {\n ...captureParams,\n clip: {\n x: 0,\n y: 0,\n width: contentSize.width,\n height: contentSize.height,\n scale: 1,\n },\n };\n } else {\n captureParams = { ...captureParams, captureBeyondViewport: true };\n }\n }\n\n const result = await this.debuggerCommand(\n selection.tabId,\n 'Page.captureScreenshot',\n captureParams\n );\n const data = (result as { data?: string }).data;\n if (!data) {\n const error = new InspectError(\n 'INSPECT_UNAVAILABLE',\n 'Failed to capture screenshot.',\n { retryable: false }\n );\n this.recordError(error);\n throw error;\n }\n\n return await writeArtifact(data);\n }\n\n private ensureDebugger(): DebuggerBridge {\n if (!this.debugger) {\n const error = this.buildUnavailableError();\n this.recordError(error);\n throw error;\n }\n return this.debugger;\n }\n\n private async resolveTab(\n hint?: TargetHint\n ): Promise<{ tabId: number; tab: DriveTabInfo; warnings?: string[] }> {\n if (!this.extensionBridge || !this.extensionBridge.isConnected()) {\n const error = new InspectError(\n 'EXTENSION_DISCONNECTED',\n 'Extension is not connected.',\n { retryable: true }\n );\n this.recordError(error);\n throw error;\n }\n\n const tabs = this.extensionBridge.getStatus().tabs ?? [];\n if (!Array.isArray(tabs) || tabs.length === 0) {\n const error = new InspectError(\n 'TAB_NOT_FOUND',\n 'No tabs available to inspect.'\n );\n this.recordError(error);\n throw error;\n }\n\n const candidates = tabs.map((tab) => ({\n id: String(tab.tab_id),\n url: tab.url ?? '',\n title: tab.title,\n lastSeenAt: tab.last_active_at\n ? Date.parse(tab.last_active_at)\n : undefined,\n }));\n\n const ranked = pickBestTarget(candidates, hint);\n if (!ranked) {\n const error = new InspectError('TAB_NOT_FOUND', 'No matching tab found.');\n this.recordError(error);\n throw error;\n }\n\n const tabId = Number(ranked.candidate.id);\n if (!Number.isFinite(tabId)) {\n const error = new InspectError(\n 'TAB_NOT_FOUND',\n 'Resolved tab id is invalid.'\n );\n this.recordError(error);\n throw error;\n }\n\n const tab = tabs.find((entry) => entry.tab_id === tabId) ?? tabs[0];\n const warnings: string[] = [];\n if (!hint) {\n warnings.push('No target hint provided; using the most recent tab.');\n } else if (ranked.score < 20) {\n warnings.push('Weak target match; using best available tab.');\n }\n\n return {\n tabId,\n tab,\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n }\n\n private async enableConsole(tabId: number): Promise<void> {\n await this.debuggerCommand(tabId, 'Runtime.enable', {});\n await this.debuggerCommand(tabId, 'Log.enable', {});\n }\n\n private async enableNetwork(tabId: number): Promise<void> {\n await this.debuggerCommand(tabId, 'Network.enable', {});\n }\n\n private async enableAccessibility(tabId: number): Promise<void> {\n await this.debuggerCommand(tabId, 'Accessibility.enable', {});\n }\n\n private async debuggerCommand(\n tabId: number,\n method: string,\n params?: Record<string, unknown>,\n timeoutMs?: number\n ): Promise<unknown> {\n const debuggerBridge = this.ensureDebugger();\n const result = await debuggerBridge.command(\n tabId,\n method,\n params,\n timeoutMs\n );\n if (!result.ok) {\n const error = this.mapDebuggerError(result.error);\n this.recordError(error);\n throw error;\n }\n return result.result;\n }\n\n private mapDebuggerError(error: DriveErrorInfo): InspectError {\n const allowed: InspectErrorCode[] = [\n 'INSPECT_UNAVAILABLE',\n 'EXTENSION_DISCONNECTED',\n 'DEBUGGER_IN_USE',\n 'ATTACH_DENIED',\n 'TAB_NOT_FOUND',\n 'NOT_SUPPORTED',\n 'TIMEOUT',\n 'EVALUATION_FAILED',\n 'ARTIFACT_IO_ERROR',\n 'INVALID_ARGUMENT',\n 'INTERNAL',\n ];\n\n const code = allowed.includes(error.code as InspectErrorCode)\n ? (error.code as InspectErrorCode)\n : 'INSPECT_UNAVAILABLE';\n return new InspectError(code, error.message, {\n retryable: error.retryable,\n details: error.details,\n });\n }\n\n private markInspectConnected(sessionId: string): void {\n try {\n const session = this.registry.require(sessionId);\n if (\n session.state === SessionState.INIT ||\n session.state === SessionState.DRIVE_READY\n ) {\n this.registry.apply(sessionId, 'INSPECT_CONNECTED');\n } else if (session.state === SessionState.DEGRADED_INSPECT) {\n this.registry.apply(sessionId, 'RECOVER_SUCCEEDED');\n }\n } catch {\n // Ignore invalid transitions.\n }\n }\n\n private recordError(error: InspectError): void {\n this.lastError = error;\n this.lastErrorAt = new Date().toISOString();\n }\n\n private buildUnavailableError(): InspectError {\n return new InspectError(\n 'INSPECT_UNAVAILABLE',\n 'Inspect is not available until the debugger bridge is configured.',\n { retryable: false }\n );\n }\n\n private requireSession(sessionId: string): SessionRecord {\n try {\n return this.registry.require(sessionId);\n } catch (error) {\n if (error instanceof SessionError) {\n const code =\n error.code === 'SESSION_CLOSED'\n ? 'SESSION_CLOSED'\n : 'SESSION_NOT_FOUND';\n const wrapped = new InspectError(code, error.message);\n this.recordError(wrapped);\n throw wrapped;\n }\n const wrapped = new InspectError('INTERNAL', 'Failed to load session.');\n this.recordError(wrapped);\n throw wrapped;\n }\n }\n}\n\nexport const createInspectService = (\n options: InspectServiceOptions\n): InspectService => new InspectService(options);\n", "import { mkdir } from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nconst ARTIFACTS_DIR_NAME = 'browser-agent';\n\nconst resolveTempRoot = (): string =>\n process.env.TMPDIR || process.env.TEMP || process.env.TMP || os.tmpdir();\n\nexport const getArtifactRootDir = (sessionId: string): string =>\n path.join(resolveTempRoot(), ARTIFACTS_DIR_NAME, sessionId);\n\nexport const ensureArtifactRootDir = async (\n sessionId: string\n): Promise<string> => {\n const rootDir = getArtifactRootDir(sessionId);\n await mkdir(rootDir, { recursive: true });\n return rootDir;\n};\n", "import { randomUUID } from 'crypto';\nimport type { Server } from 'http';\nimport type { RawData } from 'ws';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport type {\n DebuggerEvent,\n DebuggerRequestAction,\n DebuggerResponse,\n DriveAction,\n DriveErrorInfo,\n DriveResponse,\n DriveTabInfo,\n ExtensionEvent,\n ExtensionMessage,\n ExtensionRequest,\n ExtensionRequestAction,\n ExtensionResponse,\n} from './drive-protocol';\nimport { SessionRegistry } from './session';\nimport { SessionState } from './state';\n\nexport type ExtensionBridgeStatus = {\n connected: boolean;\n lastSeenAt?: string;\n tabs: DriveTabInfo[];\n};\n\ntype PendingRequest = {\n resolve: (response: ExtensionResponse) => void;\n reject: (error: ExtensionBridgeError) => void;\n timeout: ReturnType<typeof setTimeout>;\n};\n\ntype DebuggerEventListener = (event: DebuggerEvent) => void;\n\nexport class ExtensionBridgeError extends Error {\n public readonly code: string;\n public readonly retryable: boolean;\n public readonly details?: Record<string, unknown>;\n\n constructor(\n code: string,\n message: string,\n retryable = false,\n details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'ExtensionBridgeError';\n this.code = code;\n this.retryable = retryable;\n this.details = details;\n }\n}\n\nexport type ExtensionBridgeOptions = {\n path?: string;\n registry?: SessionRegistry;\n heartbeatIntervalMs?: number;\n heartbeatTimeoutMs?: number;\n};\n\nexport class ExtensionBridge {\n private readonly wss: WebSocketServer;\n private socket: WebSocket | null = null;\n private pending = new Map<string, PendingRequest>();\n private connected = false;\n private lastSeenAt?: string;\n private tabs: DriveTabInfo[] = [];\n private badMessageLogsRemaining = 3;\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n private awaitingHeartbeat = false;\n private readonly heartbeatIntervalMs: number;\n private readonly heartbeatTimeoutMs: number;\n private readonly path: string;\n private readonly registry?: SessionRegistry;\n private readonly debuggerListeners = new Set<DebuggerEventListener>();\n\n constructor(options: ExtensionBridgeOptions = {}) {\n this.wss = new WebSocketServer({ noServer: true });\n this.path = options.path ?? '/drive';\n this.registry = options.registry;\n this.heartbeatIntervalMs = options.heartbeatIntervalMs ?? 15000;\n this.heartbeatTimeoutMs = options.heartbeatTimeoutMs ?? 5000;\n\n this.wss.on('connection', (socket) => {\n this.handleConnection(socket);\n });\n }\n\n attach(server: Server): void {\n server.on('upgrade', (request, socket, head) => {\n const url = new URL(request.url ?? '', 'ws://127.0.0.1');\n if (url.pathname !== this.path) {\n socket.destroy();\n return;\n }\n\n this.wss.handleUpgrade(request, socket, head, (ws) => {\n this.wss.emit('connection', ws, request);\n });\n });\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n getStatus(): ExtensionBridgeStatus {\n return {\n connected: this.connected,\n lastSeenAt: this.lastSeenAt,\n tabs: this.tabs,\n };\n }\n\n async request<T = unknown>(\n action: DriveAction,\n params?: Record<string, unknown>,\n timeoutMs = 30000\n ): Promise<DriveResponse<T>> {\n const response = await this.requestInternal(action, params, timeoutMs);\n return response as DriveResponse<T>;\n }\n\n async requestDebugger<T = unknown>(\n action: DebuggerRequestAction,\n params?: Record<string, unknown>,\n timeoutMs = 30000\n ): Promise<DebuggerResponse<T>> {\n const response = await this.requestInternal(action, params, timeoutMs);\n return response as DebuggerResponse<T>;\n }\n\n onDebuggerEvent(listener: DebuggerEventListener): () => void {\n this.debuggerListeners.add(listener);\n return () => {\n this.debuggerListeners.delete(listener);\n };\n }\n\n private async requestInternal(\n action: ExtensionRequestAction,\n params?: Record<string, unknown>,\n timeoutMs = 30000\n ): Promise<ExtensionResponse> {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n throw new ExtensionBridgeError(\n 'EXTENSION_DISCONNECTED',\n 'Extension is not connected.',\n true\n );\n }\n\n const id = randomUUID();\n const request: ExtensionRequest =\n typeof action === 'string' && action.startsWith('debugger.')\n ? {\n id,\n action: action as DebuggerRequestAction,\n status: 'request',\n params,\n }\n : {\n id,\n action: action as DriveAction,\n status: 'request',\n params,\n };\n\n const response = await new Promise<ExtensionResponse>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pending.delete(id);\n reject(\n new ExtensionBridgeError(\n 'TIMEOUT',\n `Extension request timed out after ${timeoutMs}ms.`,\n true,\n { action }\n )\n );\n }, timeoutMs);\n\n this.pending.set(id, {\n resolve,\n reject,\n timeout,\n });\n\n this.socket?.send(JSON.stringify(request));\n });\n\n return response;\n }\n\n private startHeartbeat(): void {\n if (this.heartbeatInterval) {\n return;\n }\n this.heartbeatInterval = setInterval(() => {\n void this.sendHeartbeat();\n }, this.heartbeatIntervalMs);\n void this.sendHeartbeat();\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n this.awaitingHeartbeat = false;\n }\n\n private async sendHeartbeat(): Promise<void> {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n return;\n }\n if (this.awaitingHeartbeat) {\n return;\n }\n this.awaitingHeartbeat = true;\n try {\n await this.requestInternal(\n 'drive.ping',\n undefined,\n this.heartbeatTimeoutMs\n );\n } catch (error) {\n console.warn('Extension heartbeat failed:', error);\n this.forceDisconnect();\n } finally {\n this.awaitingHeartbeat = false;\n }\n }\n\n private forceDisconnect(): void {\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n try {\n this.socket.terminate();\n } catch (error) {\n console.debug(\n 'Extension socket terminate failed; falling back to close().',\n error\n );\n this.socket.close();\n }\n }\n this.handleDisconnect();\n }\n\n private handleConnection(socket: WebSocket): void {\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n this.socket.close();\n }\n\n this.socket = socket;\n this.connected = true;\n this.lastSeenAt = new Date().toISOString();\n\n this.applyDriveConnected();\n this.startHeartbeat();\n\n socket.on('message', (data) => {\n this.handleMessage(data);\n });\n\n socket.on('close', () => {\n this.handleDisconnect();\n });\n\n socket.on('error', () => {\n this.handleDisconnect();\n });\n }\n\n private handleDisconnect(): void {\n if (!this.connected) {\n return;\n }\n\n this.stopHeartbeat();\n this.connected = false;\n this.socket = null;\n this.lastSeenAt = new Date().toISOString();\n this.applyDriveDisconnected();\n\n for (const [id, pending] of this.pending.entries()) {\n clearTimeout(pending.timeout);\n pending.reject(\n new ExtensionBridgeError(\n 'EXTENSION_DISCONNECTED',\n 'Extension disconnected before responding.',\n true,\n { request_id: id }\n )\n );\n this.pending.delete(id);\n }\n }\n\n private handleMessage(data: RawData): void {\n const text = typeof data === 'string' ? data : data.toString();\n\n let message: ExtensionMessage | null = null;\n try {\n message = JSON.parse(text) as ExtensionMessage;\n } catch (error) {\n if (this.badMessageLogsRemaining > 0) {\n this.badMessageLogsRemaining -= 1;\n console.debug('Failed to parse extension message.', error);\n }\n return;\n }\n\n if (!message || typeof message !== 'object') {\n return;\n }\n\n this.lastSeenAt = new Date().toISOString();\n\n if (message.status === 'event') {\n this.handleEvent(message as ExtensionEvent);\n return;\n }\n\n if (\n message.status === 'ok' ||\n message.status === 'error' ||\n message.status === 'ack'\n ) {\n const pending = this.pending.get(message.id);\n if (!pending) {\n return;\n }\n clearTimeout(pending.timeout);\n this.pending.delete(message.id);\n pending.resolve(message as ExtensionResponse);\n }\n }\n\n private handleEvent(message: ExtensionEvent): void {\n if (\n message.action === 'drive.hello' ||\n message.action === 'drive.tab_report'\n ) {\n const tabs = (message.params as { tabs?: DriveTabInfo[] } | undefined)\n ?.tabs;\n if (Array.isArray(tabs)) {\n this.tabs = tabs;\n }\n }\n\n if (\n typeof message.action === 'string' &&\n message.action.startsWith('debugger.')\n ) {\n this.emitDebuggerEvent(message as DebuggerEvent);\n }\n }\n\n private emitDebuggerEvent(event: DebuggerEvent): void {\n for (const listener of this.debuggerListeners) {\n try {\n listener(event);\n } catch (error) {\n console.debug('Debugger event listener failed.', error);\n }\n }\n }\n\n private applyDriveConnected(): void {\n if (!this.registry) {\n return;\n }\n\n for (const session of this.registry.list()) {\n try {\n if (session.state === SessionState.INIT) {\n this.registry.apply(session.id, 'DRIVE_CONNECTED');\n } else if (session.state === SessionState.INSPECT_READY) {\n this.registry.apply(session.id, 'DRIVE_CONNECTED');\n } else if (session.state === SessionState.DEGRADED_DRIVE) {\n this.registry.apply(session.id, 'RECOVER_SUCCEEDED');\n }\n } catch (error) {\n console.debug(\n `Drive connect transition ignored for session ${session.id} (${session.state}).`,\n error\n );\n }\n }\n }\n\n private applyDriveDisconnected(): void {\n if (!this.registry) {\n return;\n }\n\n for (const session of this.registry.list()) {\n try {\n if (session.state === SessionState.READY) {\n this.registry.apply(session.id, 'DRIVE_DISCONNECTED');\n }\n } catch (error) {\n console.debug(\n `Drive disconnect transition ignored for session ${session.id} (${session.state}).`,\n error\n );\n }\n }\n }\n}\n\nexport const toDriveError = (error: ExtensionBridgeError): DriveErrorInfo => ({\n code: error.code,\n message: error.message,\n retryable: error.retryable,\n ...(error.details ? { details: error.details } : {}),\n});\n", "import type { DriveAction, DriveErrorInfo } from './drive-protocol';\nimport {\n ExtensionBridge,\n ExtensionBridgeError,\n toDriveError,\n} from './extension-bridge';\nimport { SessionError, SessionRegistry } from './session';\nimport { SessionState, shouldRetryDriveOp } from './state';\n\nexport type DriveResult<T> =\n | { ok: true; result: T }\n | { ok: false; error: DriveErrorInfo };\n\nclass DriveMutex {\n private tail = Promise.resolve();\n\n async runExclusive<T>(work: () => T | Promise<T>): Promise<T> {\n const result = this.tail.then(work, work);\n this.tail = result.then(\n () => undefined,\n () => undefined\n );\n return await result;\n }\n}\n\nexport const driveMutex = new DriveMutex();\n\nexport class DriveController {\n private readonly bridge: ExtensionBridge;\n private readonly registry: SessionRegistry;\n private lastError?: DriveErrorInfo;\n private lastErrorAt?: string;\n\n constructor(bridge: ExtensionBridge, registry: SessionRegistry) {\n this.bridge = bridge;\n this.registry = registry;\n }\n\n getLastError(): { error: DriveErrorInfo; at: string } | undefined {\n if (!this.lastError || !this.lastErrorAt) {\n return undefined;\n }\n return { error: this.lastError, at: this.lastErrorAt };\n }\n\n private recordError(error: DriveErrorInfo): void {\n this.lastError = error;\n this.lastErrorAt = new Date().toISOString();\n }\n\n async execute<T>(\n sessionId: string,\n action: DriveAction,\n params?: Record<string, unknown>,\n timeoutMs?: number\n ): Promise<DriveResult<T>> {\n return await driveMutex.runExclusive(async () => {\n try {\n this.registry.require(sessionId);\n } catch (error) {\n if (error instanceof SessionError) {\n const errorInfo: DriveErrorInfo = {\n code: error.code,\n message: error.message,\n retryable: false,\n };\n this.recordError(errorInfo);\n return {\n ok: false,\n error: errorInfo,\n };\n }\n const errorInfo: DriveErrorInfo = {\n code: 'INTERNAL',\n message: 'Unexpected error while validating session.',\n retryable: false,\n };\n this.recordError(errorInfo);\n return {\n ok: false,\n error: errorInfo,\n };\n }\n\n if (this.bridge.isConnected()) {\n this.ensureDriveReady(sessionId);\n }\n\n let attempt = 0;\n while (true) {\n try {\n const response = await this.bridge.request<T>(\n action,\n params,\n timeoutMs\n );\n if (response.status === 'ok') {\n return {\n ok: true,\n result: response.result as T,\n };\n }\n\n const errorInfo: DriveErrorInfo = response.error ?? {\n code: 'UNKNOWN',\n message: 'Drive operation failed.',\n retryable: false,\n };\n\n if (shouldRetryDriveOp({ attempt, retryable: errorInfo.retryable })) {\n attempt += 1;\n continue;\n }\n\n this.recordError(errorInfo);\n return { ok: false, error: errorInfo };\n } catch (error) {\n if (error instanceof ExtensionBridgeError) {\n if (error.code === 'EXTENSION_DISCONNECTED') {\n this.applyDriveDisconnected(sessionId);\n }\n const errorInfo = toDriveError(error);\n if (\n shouldRetryDriveOp({ attempt, retryable: errorInfo.retryable })\n ) {\n attempt += 1;\n continue;\n }\n this.recordError(errorInfo);\n return { ok: false, error: errorInfo };\n }\n\n const errorInfo: DriveErrorInfo = {\n code: 'INTERNAL',\n message: 'Unexpected error while executing drive action.',\n retryable: false,\n };\n this.recordError(errorInfo);\n return {\n ok: false,\n error: errorInfo,\n };\n }\n }\n });\n }\n\n private ensureDriveReady(sessionId: string): void {\n try {\n const session = this.registry.require(sessionId);\n if (session.state === SessionState.INIT) {\n this.registry.apply(sessionId, 'DRIVE_CONNECTED');\n } else if (session.state === SessionState.INSPECT_READY) {\n this.registry.apply(sessionId, 'DRIVE_CONNECTED');\n } else if (session.state === SessionState.DEGRADED_DRIVE) {\n this.registry.apply(sessionId, 'RECOVER_SUCCEEDED');\n }\n } catch (error) {\n console.debug(\n `Drive ready transition ignored for session ${sessionId}.`,\n error\n );\n }\n }\n\n private applyDriveDisconnected(sessionId: string): void {\n try {\n const session = this.registry.require(sessionId);\n if (session.state === SessionState.READY) {\n this.registry.apply(sessionId, 'DRIVE_DISCONNECTED');\n }\n } catch (error) {\n console.debug(\n `Drive disconnect transition ignored for session ${sessionId}.`,\n error\n );\n }\n }\n}\n", "export type AxNodeRecord = {\n nodeId?: string;\n backendDOMNodeId?: number;\n role?: { value?: string } | string;\n name?: { value?: string } | string;\n ignored?: boolean;\n childIds?: string[];\n properties?: unknown[];\n ref?: string;\n};\n\nconst INTERACTIVE_AX_ROLES = new Set([\n 'button',\n 'link',\n 'textbox',\n 'combobox',\n 'listbox',\n 'checkbox',\n 'radio',\n 'switch',\n 'searchbox',\n 'spinbutton',\n 'slider',\n 'option',\n]);\n\nconst DECORATIVE_AX_ROLES = new Set(['generic', 'none', 'presentation']);\n\nexport const LABEL_AX_ROLES = new Set([\n 'textbox',\n 'combobox',\n 'listbox',\n 'checkbox',\n 'radio',\n 'switch',\n 'searchbox',\n 'spinbutton',\n 'slider',\n]);\n\nexport const getAxNodes = (snapshot: unknown): AxNodeRecord[] => {\n const nodes = Array.isArray(snapshot)\n ? snapshot\n : (snapshot as { nodes?: unknown[] })?.nodes;\n return Array.isArray(nodes) ? (nodes as AxNodeRecord[]) : [];\n};\n\nconst replaceAxNodes = (snapshot: unknown, nodes: AxNodeRecord[]): unknown => {\n if (Array.isArray(snapshot)) {\n return nodes;\n }\n if (snapshot && typeof snapshot === 'object') {\n (snapshot as { nodes?: unknown[] }).nodes = nodes;\n }\n return snapshot;\n};\n\nexport const getAxRole = (node: AxNodeRecord): string => {\n const role =\n typeof node.role === 'string' ? node.role : (node.role?.value ?? '');\n return typeof role === 'string' ? role.toLowerCase() : '';\n};\n\nexport const getAxName = (node: AxNodeRecord): string => {\n const name =\n typeof node.name === 'string' ? node.name : (node.name?.value ?? '');\n return typeof name === 'string' ? name : '';\n};\n\nconst hasAxValue = (node: AxNodeRecord): boolean => {\n if (!Array.isArray(node.properties)) {\n return false;\n }\n for (const prop of node.properties) {\n if (!prop || typeof prop !== 'object') {\n continue;\n }\n const value = (prop as { value?: { value?: unknown } }).value?.value;\n if (value === undefined || value === null) {\n continue;\n }\n if (typeof value === 'string' && value.trim().length === 0) {\n continue;\n }\n return true;\n }\n return false;\n};\n\nexport const normalizeQuery = (value: string): string =>\n value.trim().toLowerCase();\n\nexport const matchesTextValue = (value: string, query: string): boolean => {\n if (!query) {\n return false;\n }\n return value.toLowerCase().includes(query);\n};\n\nexport const matchesAxText = (node: AxNodeRecord, query: string): boolean => {\n if (!query) {\n return false;\n }\n const candidates = [getAxName(node)];\n if (Array.isArray(node.properties)) {\n for (const prop of node.properties) {\n if (!prop || typeof prop !== 'object') {\n continue;\n }\n const value = (prop as { value?: { value?: unknown } }).value?.value;\n if (value === undefined || value === null) {\n continue;\n }\n if (typeof value === 'string') {\n candidates.push(value);\n } else if (typeof value === 'number' || typeof value === 'boolean') {\n candidates.push(String(value));\n }\n }\n }\n return candidates.some((text) => matchesTextValue(text, query));\n};\n\nconst isInteractiveAxNode = (node: AxNodeRecord): boolean => {\n const role = getAxRole(node);\n return Boolean(role && INTERACTIVE_AX_ROLES.has(role));\n};\n\nconst filterAxSnapshot = (\n snapshot: unknown,\n predicate: (node: AxNodeRecord) => boolean\n): unknown => {\n const nodes = getAxNodes(snapshot);\n if (nodes.length === 0) {\n return snapshot;\n }\n const keepIds = new Set<string>();\n const filtered = nodes.filter((node) => {\n if (!node || typeof node !== 'object') {\n return false;\n }\n const keep = predicate(node);\n if (keep && typeof node.nodeId === 'string') {\n keepIds.add(node.nodeId);\n }\n return keep;\n });\n for (const node of filtered) {\n if (Array.isArray(node.childIds)) {\n node.childIds = node.childIds.filter((id) => keepIds.has(id));\n }\n }\n return replaceAxNodes(snapshot, filtered);\n};\n\nconst collectKeptDescendants = (\n nodeId: string,\n nodeById: Map<string, AxNodeRecord>,\n keepIds: Set<string>,\n visited: Set<string> = new Set()\n): string[] => {\n if (visited.has(nodeId)) {\n return [];\n }\n visited.add(nodeId);\n if (keepIds.has(nodeId)) {\n return [nodeId];\n }\n const node = nodeById.get(nodeId);\n if (!node || !Array.isArray(node.childIds)) {\n return [];\n }\n const output: string[] = [];\n for (const childId of node.childIds) {\n output.push(...collectKeptDescendants(childId, nodeById, keepIds, visited));\n }\n return output;\n};\n\nconst shouldKeepCompactNode = (node: AxNodeRecord): boolean => {\n if (node.ignored) {\n return false;\n }\n const role = getAxRole(node);\n if (role && INTERACTIVE_AX_ROLES.has(role)) {\n return true;\n }\n const name = getAxName(node);\n const hasName = name.trim().length > 0;\n const hasValue = hasAxValue(node);\n if (hasName || hasValue) {\n return true;\n }\n const hasChildren = Array.isArray(node.childIds) && node.childIds.length > 0;\n if (!role || DECORATIVE_AX_ROLES.has(role)) {\n return false;\n }\n return hasChildren;\n};\n\nconst compactAxSnapshot = (snapshot: unknown): unknown => {\n const nodes = getAxNodes(snapshot);\n if (nodes.length === 0) {\n return snapshot;\n }\n const nodeById = new Map<string, AxNodeRecord>();\n nodes.forEach((node) => {\n if (node && typeof node.nodeId === 'string') {\n nodeById.set(node.nodeId, node);\n }\n });\n\n const keepIds = new Set<string>();\n for (const node of nodes) {\n if (!node || typeof node !== 'object' || typeof node.nodeId !== 'string') {\n continue;\n }\n if (shouldKeepCompactNode(node)) {\n keepIds.add(node.nodeId);\n }\n }\n\n const filtered = nodes.filter(\n (node) =>\n node && typeof node.nodeId === 'string' && keepIds.has(node.nodeId)\n );\n\n for (const node of filtered) {\n if (!Array.isArray(node.childIds) || typeof node.nodeId !== 'string') {\n continue;\n }\n const nextChildIds: string[] = [];\n for (const childId of node.childIds) {\n nextChildIds.push(...collectKeptDescendants(childId, nodeById, keepIds));\n }\n node.childIds = Array.from(new Set(nextChildIds));\n }\n\n return replaceAxNodes(snapshot, filtered);\n};\n\nexport const applyAxSnapshotFilters = (\n snapshot: unknown,\n options: { interactiveOnly?: boolean; compact?: boolean }\n): unknown => {\n let filtered = snapshot;\n if (options.compact) {\n filtered = compactAxSnapshot(filtered);\n }\n if (options.interactiveOnly) {\n filtered = filterAxSnapshot(filtered, (node) => isInteractiveAxNode(node));\n }\n return filtered;\n};\n\nexport const truncateAxSnapshot = (\n snapshot: unknown,\n maxNodes: number\n): { snapshot: unknown; truncated: boolean } => {\n const nodes = getAxNodes(snapshot);\n if (!Number.isFinite(maxNodes) || maxNodes <= 0) {\n return { snapshot, truncated: false };\n }\n if (nodes.length === 0 || nodes.length <= maxNodes) {\n return { snapshot, truncated: false };\n }\n\n const nodeById = new Map<string, AxNodeRecord>();\n const parentCount = new Map<string, number>();\n for (const node of nodes) {\n if (!node || typeof node !== 'object' || typeof node.nodeId !== 'string') {\n continue;\n }\n nodeById.set(node.nodeId, node);\n parentCount.set(node.nodeId, parentCount.get(node.nodeId) ?? 0);\n }\n\n // If the snapshot doesn't have stable node ids, fall back to a hard slice.\n if (nodeById.size === 0) {\n const sliced = nodes.slice(0, maxNodes);\n for (const node of sliced) {\n if (node && typeof node === 'object' && Array.isArray(node.childIds)) {\n node.childIds = [];\n }\n }\n return {\n snapshot: replaceAxNodes(snapshot, sliced),\n truncated: true,\n };\n }\n\n for (const node of nodes) {\n if (!node || typeof node !== 'object' || !Array.isArray(node.childIds)) {\n continue;\n }\n for (const childId of node.childIds) {\n if (typeof childId !== 'string') {\n continue;\n }\n parentCount.set(childId, (parentCount.get(childId) ?? 0) + 1);\n }\n }\n\n let roots = Array.from(nodeById.keys()).filter(\n (id) => (parentCount.get(id) ?? 0) === 0\n );\n if (roots.length === 0) {\n const first = nodes.find(\n (node) => node && typeof node.nodeId === 'string'\n )?.nodeId;\n if (first) {\n roots = [first];\n }\n }\n\n const kept = new Set<string>();\n const visited = new Set<string>();\n const queue: string[] = [...roots];\n while (queue.length > 0 && kept.size < maxNodes) {\n const id = queue.shift();\n if (!id || visited.has(id)) {\n continue;\n }\n visited.add(id);\n const node = nodeById.get(id);\n if (!node) {\n continue;\n }\n kept.add(id);\n if (Array.isArray(node.childIds)) {\n for (const childId of node.childIds) {\n if (typeof childId === 'string' && !visited.has(childId)) {\n queue.push(childId);\n }\n }\n }\n }\n\n // As a last resort, keep the first n nodes that have ids.\n if (kept.size === 0) {\n const fallback: string[] = [];\n for (const node of nodes) {\n if (fallback.length >= maxNodes) {\n break;\n }\n if (node && typeof node.nodeId === 'string') {\n fallback.push(node.nodeId);\n }\n }\n fallback.forEach((id) => kept.add(id));\n }\n\n const filtered = nodes.filter(\n (node) => node && typeof node.nodeId === 'string' && kept.has(node.nodeId)\n );\n for (const node of filtered) {\n if (Array.isArray(node.childIds)) {\n node.childIds = node.childIds.filter(\n (id) => typeof id === 'string' && kept.has(id)\n );\n }\n }\n\n return {\n snapshot: replaceAxNodes(snapshot, filtered),\n truncated: true,\n };\n};\n", "import type { DebuggerEventRecord } from '../debugger-bridge';\nimport type { ConsoleEntry } from '../inspect';\n\ntype SourceLocation = { url?: string; line?: number; column?: number };\n\nconst toSourceLocation = (input: {\n url?: unknown;\n lineNumber?: unknown;\n columnNumber?: unknown;\n}): SourceLocation | undefined => {\n const url =\n typeof input.url === 'string' && input.url.length > 0\n ? input.url\n : undefined;\n const line =\n typeof input.lineNumber === 'number' && Number.isFinite(input.lineNumber)\n ? Math.max(1, Math.floor(input.lineNumber) + 1)\n : undefined;\n const column =\n typeof input.columnNumber === 'number' &&\n Number.isFinite(input.columnNumber)\n ? Math.max(1, Math.floor(input.columnNumber) + 1)\n : undefined;\n if (!url && !line && !column) {\n return undefined;\n }\n return {\n ...(url ? { url } : {}),\n ...(line ? { line } : {}),\n ...(column ? { column } : {}),\n };\n};\n\nconst toStackFrames = (\n stackTrace: unknown\n):\n | Array<{\n functionName?: string;\n url?: string;\n line?: number;\n column?: number;\n }>\n | undefined => {\n const frames: Array<{\n functionName?: string;\n url?: string;\n line?: number;\n column?: number;\n }> = [];\n\n const collect = (trace: unknown): void => {\n if (!trace || typeof trace !== 'object') {\n return;\n }\n const callFrames = (trace as { callFrames?: unknown }).callFrames;\n if (Array.isArray(callFrames)) {\n for (const frame of callFrames) {\n if (!frame || typeof frame !== 'object') {\n continue;\n }\n const functionName =\n typeof (frame as { functionName?: unknown }).functionName === 'string'\n ? String((frame as { functionName?: unknown }).functionName)\n : undefined;\n const url =\n typeof (frame as { url?: unknown }).url === 'string'\n ? String((frame as { url?: unknown }).url)\n : undefined;\n const lineNumber = (frame as { lineNumber?: unknown }).lineNumber;\n const columnNumber = (frame as { columnNumber?: unknown }).columnNumber;\n\n const loc = toSourceLocation({ url, lineNumber, columnNumber });\n frames.push({\n ...(functionName ? { functionName } : {}),\n ...(loc?.url ? { url: loc.url } : {}),\n ...(loc?.line ? { line: loc.line } : {}),\n ...(loc?.column ? { column: loc.column } : {}),\n });\n\n if (frames.length >= 50) {\n return;\n }\n }\n }\n const parent = (trace as { parent?: unknown }).parent;\n if (frames.length < 50 && parent) {\n collect(parent);\n }\n };\n\n collect(stackTrace);\n return frames.length > 0 ? frames : undefined;\n};\n\nconst toRemoteObjectSummary = (\n obj: unknown\n):\n | {\n type?: string;\n subtype?: string;\n description?: string;\n value?: unknown;\n unserializableValue?: string;\n }\n | undefined => {\n if (!obj || typeof obj !== 'object') {\n return undefined;\n }\n const raw = obj as {\n type?: unknown;\n subtype?: unknown;\n description?: unknown;\n value?: unknown;\n unserializableValue?: unknown;\n };\n const type = typeof raw.type === 'string' ? raw.type : undefined;\n const subtype = typeof raw.subtype === 'string' ? raw.subtype : undefined;\n const description =\n typeof raw.description === 'string' ? raw.description : undefined;\n const unserializableValue =\n typeof raw.unserializableValue === 'string'\n ? raw.unserializableValue\n : undefined;\n\n const out: {\n type?: string;\n subtype?: string;\n description?: string;\n value?: unknown;\n unserializableValue?: string;\n } = {};\n\n if (type) out.type = type;\n if (subtype) out.subtype = subtype;\n if (description) out.description = description;\n if (raw.value !== undefined) out.value = raw.value;\n if (unserializableValue) out.unserializableValue = unserializableValue;\n\n return Object.keys(out).length > 0 ? out : undefined;\n};\n\nconst stringifyRemoteObject = (value: unknown): string => {\n if (!value || typeof value !== 'object') {\n return String(value ?? '');\n }\n const obj = value as {\n value?: unknown;\n description?: string;\n unserializableValue?: string;\n type?: string;\n };\n if (obj.unserializableValue) {\n return obj.unserializableValue;\n }\n if (obj.value !== undefined) {\n try {\n return typeof obj.value === 'string'\n ? obj.value\n : JSON.stringify(obj.value);\n } catch {\n return String(obj.value);\n }\n }\n if (obj.description) {\n return obj.description;\n }\n return obj.type ?? '';\n};\n\nexport const toConsoleEntry = (\n event: DebuggerEventRecord\n): ConsoleEntry | null => {\n const params = event.params ?? {};\n switch (event.method) {\n case 'Runtime.consoleAPICalled': {\n const rawArgs = Array.isArray((params as { args?: unknown[] }).args)\n ? (params as { args: unknown[] }).args\n : [];\n const text = rawArgs.map((arg) => stringifyRemoteObject(arg)).join(' ');\n const level = String((params as { type?: string }).type ?? 'log');\n const stack = toStackFrames(\n (params as { stackTrace?: unknown }).stackTrace\n );\n const args = rawArgs\n .map((arg) => toRemoteObjectSummary(arg))\n .filter((entry): entry is NonNullable<typeof entry> => Boolean(entry));\n return {\n level,\n text,\n timestamp: event.timestamp,\n ...(stack && stack.length > 0 ? { stack } : {}),\n ...(args.length > 0 ? { args } : {}),\n };\n }\n case 'Runtime.exceptionThrown': {\n const details = (\n params as {\n exceptionDetails?: {\n text?: string;\n url?: string;\n lineNumber?: number;\n columnNumber?: number;\n stackTrace?: unknown;\n exception?: unknown;\n };\n }\n ).exceptionDetails;\n\n const exception = toRemoteObjectSummary(details?.exception);\n const stack = toStackFrames(details?.stackTrace);\n const source =\n toSourceLocation({\n url: details?.url,\n lineNumber: details?.lineNumber,\n columnNumber: details?.columnNumber,\n }) ??\n // If the top frame exists, treat it as the source.\n (stack && stack.length > 0\n ? {\n url: stack[0].url,\n line: stack[0].line,\n column: stack[0].column,\n }\n : undefined);\n\n const baseText =\n typeof details?.text === 'string' && details.text.trim().length > 0\n ? details.text\n : 'Uncaught exception';\n const exceptionDesc =\n typeof exception?.description === 'string' &&\n exception.description.trim().length > 0\n ? exception.description\n : undefined;\n\n // CDP often reports `exceptionDetails.text` as just \"Uncaught\".\n // Enrich the message with the exception description when available.\n const text =\n baseText === 'Uncaught' && exceptionDesc\n ? `Uncaught: ${exceptionDesc}`\n : baseText;\n\n return {\n level: 'error',\n text,\n timestamp: event.timestamp,\n ...(source ? { source } : {}),\n ...(stack && stack.length > 0 ? { stack } : {}),\n ...(exception ? { exception } : {}),\n };\n }\n case 'Log.entryAdded': {\n const entry = (\n params as {\n entry?: {\n level?: string;\n text?: string;\n url?: string;\n lineNumber?: number;\n stackTrace?: unknown;\n timestamp?: number;\n };\n }\n ).entry;\n if (!entry) {\n return null;\n }\n const stack = toStackFrames(entry.stackTrace);\n const source = toSourceLocation({\n url: entry.url,\n lineNumber: entry.lineNumber,\n columnNumber: undefined,\n });\n return {\n level: entry.level ?? 'log',\n text: entry.text ?? '',\n timestamp: event.timestamp,\n ...(source ? { source } : {}),\n ...(stack && stack.length > 0 ? { stack } : {}),\n };\n }\n default:\n return null;\n }\n};\n", "import type { DebuggerEventRecord } from '../debugger-bridge';\n\ntype HarLog = {\n log: {\n version: string;\n creator: { name: string; version: string };\n pages: Array<{\n id: string;\n title: string;\n startedDateTime: string;\n pageTimings: { onContentLoad: number; onLoad: number };\n }>;\n entries: unknown[];\n };\n};\n\nexport const buildHar = (\n events: DebuggerEventRecord[],\n title?: string\n): HarLog => {\n type RequestRecord = {\n id: string;\n url?: string;\n method?: string;\n startTime?: number;\n endTime?: number;\n requestHeaders?: Record<string, string>;\n responseHeaders?: Record<string, string>;\n status?: number;\n statusText?: string;\n mimeType?: string;\n encodedDataLength?: number;\n protocol?: string;\n };\n\n const requests = new Map<string, RequestRecord>();\n\n const toTimestamp = (\n event: DebuggerEventRecord,\n fallback?: number\n ): number => {\n const raw = (event.params as { timestamp?: number; wallTime?: number })\n ?.wallTime;\n if (typeof raw === 'number') {\n return raw * 1000;\n }\n const ts = (event.params as { timestamp?: number })?.timestamp;\n if (typeof ts === 'number') {\n return ts * 1000;\n }\n const parsed = Date.parse(event.timestamp);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n return fallback ?? Date.now();\n };\n\n for (const event of events) {\n const params = event.params ?? {};\n switch (event.method) {\n case 'Network.requestWillBeSent': {\n const requestId = String((params as { requestId?: unknown }).requestId);\n if (!requestId) {\n break;\n }\n const request = (\n params as {\n request?: {\n url?: string;\n method?: string;\n headers?: Record<string, string>;\n };\n }\n ).request;\n const record: RequestRecord = {\n id: requestId,\n url: request?.url,\n method: request?.method,\n requestHeaders: request?.headers ?? {},\n startTime: toTimestamp(event),\n };\n requests.set(requestId, record);\n break;\n }\n case 'Network.responseReceived': {\n const requestId = String((params as { requestId?: unknown }).requestId);\n if (!requestId) {\n break;\n }\n const response = (\n params as {\n response?: {\n status?: number;\n statusText?: string;\n mimeType?: string;\n headers?: Record<string, string>;\n protocol?: string;\n };\n }\n ).response;\n const record = requests.get(requestId) ?? { id: requestId };\n record.status = response?.status;\n record.statusText = response?.statusText;\n record.mimeType = response?.mimeType;\n record.responseHeaders = response?.headers ?? {};\n record.protocol = response?.protocol;\n record.startTime = record.startTime ?? toTimestamp(event);\n requests.set(requestId, record);\n break;\n }\n case 'Network.loadingFinished': {\n const requestId = String((params as { requestId?: unknown }).requestId);\n if (!requestId) {\n break;\n }\n const record = requests.get(requestId) ?? { id: requestId };\n record.encodedDataLength = (\n params as { encodedDataLength?: number }\n ).encodedDataLength;\n record.endTime = toTimestamp(event, record.startTime);\n requests.set(requestId, record);\n break;\n }\n case 'Network.loadingFailed': {\n const requestId = String((params as { requestId?: unknown }).requestId);\n if (!requestId) {\n break;\n }\n const record = requests.get(requestId) ?? { id: requestId };\n record.endTime = toTimestamp(event, record.startTime);\n requests.set(requestId, record);\n break;\n }\n default:\n break;\n }\n }\n\n const entries = Array.from(requests.values()).map((record) => {\n const started = record.startTime ?? Date.now();\n const ended = record.endTime ?? started;\n const time = Math.max(0, ended - started);\n const url = record.url ?? '';\n const queryString: Array<{ name: string; value: string }> = [];\n try {\n const parsed = new URL(url);\n parsed.searchParams.forEach((value, name) => {\n queryString.push({ name, value });\n });\n } catch {\n // Ignore URL parse failures.\n }\n\n return {\n pageref: 'page_0',\n startedDateTime: new Date(started).toISOString(),\n time,\n request: {\n method: record.method ?? 'GET',\n url,\n httpVersion: record.protocol ?? 'HTTP/1.1',\n cookies: [],\n headers: [],\n queryString,\n headersSize: -1,\n bodySize: -1,\n },\n response: {\n status: record.status ?? 0,\n statusText: record.statusText ?? '',\n httpVersion: record.protocol ?? 'HTTP/1.1',\n cookies: [],\n headers: [],\n redirectURL: '',\n headersSize: -1,\n bodySize: record.encodedDataLength ?? 0,\n content: {\n size: record.encodedDataLength ?? 0,\n mimeType: record.mimeType ?? '',\n },\n },\n cache: {},\n timings: {\n send: 0,\n wait: time,\n receive: 0,\n },\n };\n });\n\n const startedDateTime = entries.length\n ? ((entries[0] as { startedDateTime?: string }).startedDateTime ??\n new Date().toISOString())\n : new Date().toISOString();\n\n return {\n log: {\n version: '1.2',\n creator: {\n name: 'browser-bridge',\n version: '0.0.0',\n },\n pages: [\n {\n id: 'page_0',\n title: title ?? 'page',\n startedDateTime,\n pageTimings: {\n onContentLoad: -1,\n onLoad: -1,\n },\n },\n ],\n entries,\n },\n };\n};\n", "import type { DebuggerCommand } from './snapshot-refs';\n\nexport const captureHtml = async (\n tabId: number,\n options: {\n selector?: string;\n debuggerCommand: DebuggerCommand;\n onEvaluationFailed: () => never;\n }\n): Promise<string> => {\n await options.debuggerCommand(tabId, 'Runtime.enable', {});\n const expression = options.selector\n ? `(() => { try { const el = document.querySelector(${JSON.stringify(\n options.selector\n )}); return el ? el.outerHTML : \"\"; } catch { return \"\"; } })()`\n : \"document.documentElement ? document.documentElement.outerHTML : ''\";\n const result = await options.debuggerCommand(tabId, 'Runtime.evaluate', {\n expression,\n returnByValue: true,\n awaitPromise: true,\n });\n\n if (result && typeof result === 'object' && 'exceptionDetails' in result) {\n return options.onEvaluationFailed();\n }\n\n return String(\n (result as { result?: { value?: unknown } })?.result?.value ?? ''\n );\n};\n\nexport const collectHtmlEntries = (html: string): Map<string, string> => {\n const entries = new Map<string, string>();\n const tagPattern = /<([a-zA-Z0-9-]+)([^>]*)>/g;\n let match: RegExpExecArray | null;\n let index = 0;\n while ((match = tagPattern.exec(html)) && entries.size < 1000) {\n const tag = match[1].toLowerCase();\n const attrs = match[2] ?? '';\n const idMatch = /\\bid=[\"']([^\"']+)[\"']/.exec(attrs);\n const classMatch = /\\bclass=[\"']([^\"']+)[\"']/.exec(attrs);\n const id = idMatch?.[1];\n const className = classMatch?.[1]?.split(/\\s+/)[0];\n let key = tag;\n if (id) {\n key = `${tag}#${id}`;\n } else if (className) {\n key = `${tag}.${className}`;\n } else {\n key = `${tag}:nth-${index}`;\n }\n entries.set(key, attrs.trim());\n index += 1;\n }\n return entries;\n};\n", "import { getAxNodes } from './ax-snapshot';\nimport { collectHtmlEntries } from './html-snapshot';\nimport type { DomSnapshotResult } from './types';\n\ntype SnapshotRecord = {\n sessionId: string;\n format: 'ax' | 'html';\n entries: Map<string, string>;\n capturedAt: string;\n};\n\nexport type DomDiffResult = {\n added: string[];\n removed: string[];\n changed: string[];\n summary: string;\n};\n\nexport class SnapshotHistory {\n private readonly history: SnapshotRecord[] = [];\n private readonly maxSnapshotsPerSession: number;\n private readonly maxSnapshotHistory: number;\n\n constructor(options: {\n maxSnapshotsPerSession: number;\n maxSnapshotHistory: number;\n }) {\n this.maxSnapshotsPerSession = Math.max(0, options.maxSnapshotsPerSession);\n this.maxSnapshotHistory = Math.max(0, options.maxSnapshotHistory);\n }\n\n record(sessionId: string, snapshot: DomSnapshotResult): void {\n const entries = this.collectSnapshotEntries(snapshot);\n if (!entries) {\n return;\n }\n this.history.push({\n sessionId,\n format: snapshot.format,\n entries,\n capturedAt: new Date().toISOString(),\n });\n\n let count = 0;\n for (const record of this.history) {\n if (record.sessionId === sessionId) {\n count += 1;\n }\n }\n while (count > this.maxSnapshotsPerSession) {\n const index = this.history.findIndex(\n (record) => record.sessionId === sessionId\n );\n if (index === -1) {\n break;\n }\n this.history.splice(index, 1);\n count -= 1;\n }\n while (this.history.length > this.maxSnapshotHistory) {\n this.history.shift();\n }\n }\n\n diff(sessionId: string): DomDiffResult {\n const snapshots = this.history.filter(\n (record) => record.sessionId === sessionId\n );\n if (snapshots.length < 2) {\n return {\n added: [],\n removed: [],\n changed: [],\n summary: 'Not enough snapshots to diff.',\n };\n }\n const previous = snapshots[snapshots.length - 2];\n const current = snapshots[snapshots.length - 1];\n\n const added: string[] = [];\n const removed: string[] = [];\n const changed: string[] = [];\n\n for (const [key, value] of current.entries.entries()) {\n if (!previous.entries.has(key)) {\n added.push(key);\n } else if (previous.entries.get(key) !== value) {\n changed.push(key);\n }\n }\n for (const key of previous.entries.keys()) {\n if (!current.entries.has(key)) {\n removed.push(key);\n }\n }\n\n return {\n added,\n removed,\n changed,\n summary: `Added ${added.length}, removed ${removed.length}, changed ${changed.length}.`,\n };\n }\n\n private collectSnapshotEntries(\n snapshot: DomSnapshotResult\n ): Map<string, string> | null {\n if (snapshot.format === 'html' && typeof snapshot.snapshot === 'string') {\n return collectHtmlEntries(snapshot.snapshot);\n }\n if (snapshot.format === 'ax') {\n return this.collectAxEntries(snapshot.snapshot);\n }\n return null;\n }\n\n private collectAxEntries(snapshot: unknown): Map<string, string> {\n const entries = new Map<string, string>();\n const nodes = getAxNodes(snapshot);\n if (nodes.length === 0) {\n return entries;\n }\n nodes.forEach((node, index) => {\n if (!node || typeof node !== 'object') {\n return;\n }\n const record = node as {\n nodeId?: string;\n backendDOMNodeId?: number;\n role?: { value?: string } | string;\n name?: { value?: string } | string;\n };\n const role =\n typeof record.role === 'string'\n ? record.role\n : (record.role?.value ?? 'node');\n const name =\n typeof record.name === 'string'\n ? record.name\n : (record.name?.value ?? '');\n const nodeId =\n record.nodeId ??\n (record.backendDOMNodeId !== undefined\n ? String(record.backendDOMNodeId)\n : undefined);\n const key = nodeId ? `node-${nodeId}` : `${role}:${name}:${index}`;\n entries.set(key, `${role}:${name}`);\n });\n return entries;\n }\n}\n", "import { getAxNodes } from './ax-snapshot';\n\nexport type DebuggerCommand = (\n tabId: number,\n method: string,\n params?: Record<string, unknown>,\n timeoutMs?: number\n) => Promise<unknown>;\n\nexport const SNAPSHOT_REF_ATTRIBUTE = 'data-bv-ref';\n\nconst MAX_REF_ASSIGNMENTS = 500;\nconst MAX_REF_WARNINGS = 5;\n\nconst isInspectError = (\n error: unknown\n): error is { name: string; message: string } =>\n Boolean(\n error &&\n typeof error === 'object' &&\n 'name' in error &&\n (error as { name?: unknown }).name === 'InspectError' &&\n 'message' in error &&\n typeof (error as { message?: unknown }).message === 'string'\n );\n\nexport const assignRefsToAxSnapshot = (\n snapshot: unknown\n): Map<number, string> => {\n const nodes = getAxNodes(snapshot);\n const refs = new Map<number, string>();\n let index = 1;\n for (const node of nodes) {\n if (!node || typeof node !== 'object') {\n continue;\n }\n if (node.ignored) {\n continue;\n }\n const backendId = node.backendDOMNodeId;\n if (typeof backendId !== 'number') {\n continue;\n }\n const ref = `@e${index}`;\n index += 1;\n node.ref = ref;\n refs.set(backendId, ref);\n }\n return refs;\n};\n\nexport const clearSnapshotRefs = async (\n tabId: number,\n debuggerCommand: DebuggerCommand\n): Promise<void> => {\n await debuggerCommand(tabId, 'Runtime.evaluate', {\n expression: `document.querySelectorAll('[${SNAPSHOT_REF_ATTRIBUTE}]').forEach((el) => el.removeAttribute('${SNAPSHOT_REF_ATTRIBUTE}'))`,\n returnByValue: true,\n awaitPromise: true,\n });\n};\n\nexport const applySnapshotRefs = async (\n tabId: number,\n refs: Map<number, string>,\n debuggerCommand: DebuggerCommand\n): Promise<string[]> => {\n const warnings: string[] = [];\n await debuggerCommand(tabId, 'DOM.enable', {});\n await debuggerCommand(tabId, 'Runtime.enable', {});\n\n try {\n await clearSnapshotRefs(tabId, debuggerCommand);\n } catch {\n warnings.push('Failed to clear prior snapshot refs.');\n }\n\n if (refs.size === 0) {\n return warnings;\n }\n\n let applied = 0;\n for (const [backendNodeId, ref] of refs) {\n if (applied >= MAX_REF_ASSIGNMENTS) {\n warnings.push(\n `Snapshot refs truncated at ${MAX_REF_ASSIGNMENTS} elements.`\n );\n break;\n }\n try {\n const described = await debuggerCommand(tabId, 'DOM.describeNode', {\n backendNodeId,\n });\n const node = (\n described as { node?: { nodeId?: number; nodeType?: number } }\n ).node;\n if (!node || node.nodeType !== 1 || typeof node.nodeId !== 'number') {\n if (warnings.length < MAX_REF_WARNINGS) {\n warnings.push(`Ref ${ref} could not be applied to a DOM element.`);\n }\n continue;\n }\n await debuggerCommand(tabId, 'DOM.setAttributeValue', {\n nodeId: node.nodeId,\n name: SNAPSHOT_REF_ATTRIBUTE,\n value: ref,\n });\n applied += 1;\n } catch {\n if (warnings.length < MAX_REF_WARNINGS) {\n warnings.push(`Ref ${ref} could not be applied.`);\n }\n }\n }\n return warnings;\n};\n\nexport const resolveNodeIdForSelector = async (\n tabId: number,\n selector: string,\n debuggerCommand: DebuggerCommand\n): Promise<{ nodeId?: number; warnings?: string[] }> => {\n await debuggerCommand(tabId, 'DOM.enable', {});\n const document = await debuggerCommand(tabId, 'DOM.getDocument', {\n depth: 1,\n });\n const rootNodeId = (document as { root?: { nodeId?: number } }).root?.nodeId;\n if (typeof rootNodeId !== 'number') {\n return { warnings: ['Failed to resolve DOM root for selector.'] };\n }\n try {\n const result = await debuggerCommand(tabId, 'DOM.querySelector', {\n nodeId: rootNodeId,\n selector,\n });\n const nodeId = (result as { nodeId?: number }).nodeId;\n if (!nodeId) {\n return { warnings: [`Selector not found: ${selector}`] };\n }\n return { nodeId };\n } catch (error) {\n if (isInspectError(error)) {\n return { warnings: [error.message] };\n }\n return { warnings: ['Selector query failed.'] };\n }\n};\n", "export const PAGE_STATE_SCRIPT = [\n '(() => {',\n ' const escape = (value) => {',\n \" if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\",\n ' return CSS.escape(value);',\n ' }',\n \" return String(value).replace(/[\\\"'\\\\\\\\]/g, '\\\\\\\\$&');\",\n ' };',\n ' const truncate = (value, max) => {',\n \" const text = String(value ?? '');\",\n ' return text.length > max ? text.slice(0, max) : text;',\n ' };',\n ' const selectorFor = (element) => {',\n ' if (element.id) {',\n ' return `#${escape(element.id)}`;',\n ' }',\n \" const name = element.getAttribute('name');\",\n ' if (name) {',\n ' return `${element.tagName.toLowerCase()}[name=\"${escape(name)}\"]`;',\n ' }',\n ' const parts = [];',\n ' let node = element;',\n ' while (node && node.nodeType === 1 && parts.length < 4) {',\n ' let part = node.tagName.toLowerCase();',\n ' const parent = node.parentElement;',\n ' if (parent) {',\n ' const siblings = Array.from(parent.children).filter(',\n ' (child) => child.tagName === node.tagName',\n ' );',\n ' if (siblings.length > 1) {',\n ' part += `:nth-of-type(${siblings.indexOf(node) + 1})`;',\n ' }',\n ' }',\n ' parts.unshift(part);',\n ' node = parent;',\n ' }',\n \" return parts.join('>');\",\n ' };',\n ' const readStorage = (storage, limit) => {',\n ' try {',\n ' return Object.keys(storage)',\n ' .slice(0, limit)',\n ' .map((key) => ({',\n ' key,',\n ' value: truncate(storage.getItem(key), 500),',\n ' }));',\n ' } catch {',\n ' return [];',\n ' }',\n ' };',\n \" const forms = Array.from(document.querySelectorAll('form')).map((form) => {\",\n ' const fields = Array.from(form.elements)',\n ' .filter((element) => element && element.tagName)',\n ' .map((element) => {',\n ' const tag = element.tagName.toLowerCase();',\n \" const type = 'type' in element && element.type ? element.type : tag;\",\n \" const name = element.name || element.getAttribute('name') || element.id || '';\",\n \" let value = '';\",\n ' let options;',\n \" if (tag === 'select') {\",\n ' const select = element;',\n \" value = select.value ?? '';\",\n ' options = Array.from(select.options).map((option) => option.text);',\n \" } else if (tag === 'input' && element.type === 'password') {\",\n \" value = '[redacted]';\",\n \" } else if (tag === 'input' || tag === 'textarea') {\",\n \" value = element.value ?? '';\",\n ' } else if (element.isContentEditable) {',\n \" value = element.textContent ?? '';\",\n \" } else if ('value' in element) {\",\n \" value = element.value ?? '';\",\n ' }',\n ' return {',\n ' name,',\n ' type,',\n ' value: truncate(value, 500),',\n ' ...(options ? { options } : {}),',\n ' };',\n ' });',\n ' return {',\n ' selector: selectorFor(form),',\n \" action: form.getAttribute('action') || undefined,\",\n \" method: form.getAttribute('method') || undefined,\",\n ' fields,',\n ' };',\n ' });',\n ' const localStorage = readStorage(window.localStorage, 100);',\n ' const sessionStorage = readStorage(window.sessionStorage, 100);',\n \" const cookies = (document.cookie ? document.cookie.split(';') : [])\",\n ' .map((entry) => entry.trim())',\n ' .filter((entry) => entry.length > 0)',\n ' .slice(0, 50)',\n ' .map((entry) => {',\n \" const [key, ...rest] = entry.split('=');\",\n \" return { key, value: truncate(rest.join('='), 500) };\",\n ' });',\n ' return { forms, localStorage, sessionStorage, cookies };',\n '})()',\n].join('\\n');\n", "export type TargetHint = {\n url?: string;\n title?: string;\n lastActiveAt?: string;\n};\n\nexport type TargetCandidate = {\n id: string;\n url: string;\n title?: string;\n lastSeenAt?: number;\n};\n\nexport type RankedTarget = {\n candidate: TargetCandidate;\n score: number;\n reasons: string[];\n};\n\nconst normalizeText = (value?: string): string =>\n (value ?? '').trim().toLowerCase();\n\nconst normalizeUrl = (value?: string): string => {\n const normalized = normalizeText(value);\n if (!normalized) {\n return '';\n }\n const hashIndex = normalized.indexOf('#');\n const withoutHash =\n hashIndex >= 0 ? normalized.slice(0, hashIndex) : normalized;\n return withoutHash.endsWith('/') && withoutHash.length > 1\n ? withoutHash.slice(0, -1)\n : withoutHash;\n};\n\nconst scoreUrlMatch = (candidateUrl: string, hintUrl: string): number => {\n if (!candidateUrl || !hintUrl) {\n return 0;\n }\n if (candidateUrl === hintUrl) {\n return 100;\n }\n if (candidateUrl.includes(hintUrl) || hintUrl.includes(candidateUrl)) {\n return 60;\n }\n return 0;\n};\n\nconst scoreTitleMatch = (candidateTitle: string, hintTitle: string): number => {\n if (!candidateTitle || !hintTitle) {\n return 0;\n }\n if (candidateTitle === hintTitle) {\n return 80;\n }\n if (\n candidateTitle.includes(hintTitle) ||\n hintTitle.includes(candidateTitle)\n ) {\n return 40;\n }\n return 0;\n};\n\nconst scoreRecency = (lastSeenAt: number | undefined, now: number): number => {\n if (!lastSeenAt) {\n return 0;\n }\n const ageMinutes = Math.max(0, (now - lastSeenAt) / 60000);\n return Math.max(0, 30 - ageMinutes);\n};\n\nconst scoreHintRecency = (\n lastSeenAt: number | undefined,\n hintLastActiveAt: number | undefined\n): number => {\n if (!lastSeenAt || !hintLastActiveAt) {\n return 0;\n }\n const deltaMinutes = Math.abs(lastSeenAt - hintLastActiveAt) / 60000;\n return Math.max(0, 20 - deltaMinutes);\n};\n\nconst isBlankUrl = (url: string): boolean =>\n url.length === 0 || url === 'about:blank';\n\nexport const rankTargetCandidates = (\n candidates: TargetCandidate[],\n hint?: TargetHint,\n now: number = Date.now()\n): RankedTarget[] => {\n const normalizedHintUrl = normalizeUrl(hint?.url);\n const normalizedHintTitle = normalizeText(hint?.title);\n const hintLastActiveAt = hint?.lastActiveAt\n ? Date.parse(hint.lastActiveAt)\n : undefined;\n\n const ranked = candidates.map((candidate) => {\n const reasons: string[] = [];\n const normalizedUrl = normalizeUrl(candidate.url);\n const normalizedTitle = normalizeText(candidate.title);\n\n let score = 0;\n const urlScore = scoreUrlMatch(normalizedUrl, normalizedHintUrl);\n if (urlScore > 0) {\n score += urlScore;\n reasons.push(urlScore >= 100 ? 'url:exact' : 'url:partial');\n }\n\n const titleScore = scoreTitleMatch(normalizedTitle, normalizedHintTitle);\n if (titleScore > 0) {\n score += titleScore;\n reasons.push(titleScore >= 80 ? 'title:exact' : 'title:partial');\n }\n\n const recencyScore = scoreRecency(candidate.lastSeenAt, now);\n if (recencyScore > 0) {\n score += recencyScore;\n reasons.push('recency');\n }\n\n const hintRecencyScore = scoreHintRecency(\n candidate.lastSeenAt,\n Number.isFinite(hintLastActiveAt) ? hintLastActiveAt : undefined\n );\n if (hintRecencyScore > 0) {\n score += hintRecencyScore;\n reasons.push('hint-recency');\n }\n\n if (isBlankUrl(normalizedUrl)) {\n score -= 50;\n reasons.push('blank-url');\n }\n\n return { candidate, score, reasons };\n });\n\n return ranked.sort((a, b) => {\n if (a.score !== b.score) {\n return b.score - a.score;\n }\n const aSeen = a.candidate.lastSeenAt ?? 0;\n const bSeen = b.candidate.lastSeenAt ?? 0;\n if (aSeen !== bSeen) {\n return bSeen - aSeen;\n }\n return a.candidate.url.localeCompare(b.candidate.url);\n });\n};\n\nexport const pickBestTarget = (\n candidates: TargetCandidate[],\n hint?: TargetHint,\n now: number = Date.now()\n): RankedTarget | null => {\n const ranked = rankTargetCandidates(candidates, hint, now);\n return ranked.length > 0 ? ranked[0] : null;\n};\n", "import { z } from 'zod';\n\n// Keep error codes stable; add new codes without renaming existing ones.\nexport const ErrorCodeSchema = z.enum([\n 'UNKNOWN',\n 'INVALID_ARGUMENT',\n 'NOT_FOUND',\n 'ALREADY_EXISTS',\n 'FAILED_PRECONDITION',\n 'UNAUTHORIZED',\n 'FORBIDDEN',\n 'CONFLICT',\n 'TIMEOUT',\n 'CANCELLED',\n 'UNAVAILABLE',\n 'RATE_LIMITED',\n 'NOT_IMPLEMENTED',\n 'INTERNAL',\n 'SESSION_NOT_FOUND',\n 'SESSION_CLOSED',\n 'SESSION_BROKEN',\n 'DRIVE_UNAVAILABLE',\n 'INSPECT_UNAVAILABLE',\n 'EXTENSION_DISCONNECTED',\n 'DEBUGGER_IN_USE',\n 'ATTACH_DENIED',\n 'TAB_NOT_FOUND',\n 'NOT_SUPPORTED',\n 'LOCATOR_NOT_FOUND',\n 'NAVIGATION_FAILED',\n 'EVALUATION_FAILED',\n 'ARTIFACT_IO_ERROR',\n]);\n\nexport type ErrorCode = z.infer<typeof ErrorCodeSchema>;\n\nexport const ErrorInfoSchema = z.object({\n code: ErrorCodeSchema,\n message: z.string(),\n retryable: z.boolean(),\n details: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type ErrorInfo = z.infer<typeof ErrorInfoSchema>;\n\nexport const ErrorEnvelopeSchema = z.object({\n ok: z.literal(false),\n error: ErrorInfoSchema,\n});\n\nexport type ErrorEnvelope = z.infer<typeof ErrorEnvelopeSchema>;\n\nexport const successEnvelopeSchema = <T extends z.ZodTypeAny>(result: T) =>\n z.object({\n ok: z.literal(true),\n result,\n });\n\nexport const apiEnvelopeSchema = <T extends z.ZodTypeAny>(result: T) =>\n z.union([successEnvelopeSchema(result), ErrorEnvelopeSchema]);\n\nexport type SuccessEnvelope<T> = {\n ok: true;\n result: T;\n};\n\nexport type ApiEnvelope<T> = SuccessEnvelope<T> | ErrorEnvelope;\n", "import { z } from 'zod';\nimport { ErrorInfoSchema } from './errors';\n\nexport const LocatorRoleSchema = z.object({\n name: z.string(),\n value: z.string().optional(),\n});\n\nexport const LocatorSchema = z\n .object({\n ref: z.string().min(1).optional(),\n testid: z.string().min(1).optional(),\n css: z.string().min(1).optional(),\n text: z.string().min(1).optional(),\n role: LocatorRoleSchema.optional(),\n })\n .refine(\n (value) =>\n Boolean(\n value.ref || value.testid || value.css || value.text || value.role\n ),\n {\n message: 'Locator must include at least one selector.',\n }\n );\n\nexport const OpResultSchema = z.object({\n ok: z.literal(true),\n message: z.string().optional(),\n warnings: z.array(z.string()).optional(),\n});\n\nexport const SessionStateSchema = z.enum([\n 'INIT',\n 'DRIVE_READY',\n 'INSPECT_READY',\n 'READY',\n 'DEGRADED_DRIVE',\n 'DEGRADED_INSPECT',\n 'BROKEN',\n 'CLOSED',\n]);\n\nexport const SessionInfoSchema = z.object({\n session_id: z.string(),\n state: SessionStateSchema,\n created_at: z.string().datetime().optional(),\n});\n\nexport const SessionPlaneStatusSchema = z.object({\n connected: z.boolean(),\n last_seen_at: z.string().datetime().optional(),\n error: ErrorInfoSchema.optional(),\n});\n\nexport const SessionStatusSchema = z.object({\n session_id: z.string(),\n state: SessionStateSchema,\n drive: SessionPlaneStatusSchema.optional(),\n inspect: SessionPlaneStatusSchema.optional(),\n updated_at: z.string().datetime().optional(),\n});\n\nexport const RecoverResultSchema = z.object({\n session_id: z.string(),\n recovered: z.boolean(),\n state: SessionStateSchema,\n message: z.string().optional(),\n});\n\nexport const DiagnosticCheckSchema = z.object({\n name: z.string(),\n ok: z.boolean(),\n message: z.string().optional(),\n details: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const DiagnosticReportSchema = z.object({\n ok: z.boolean(),\n session_id: z.string().optional(),\n checks: z.array(DiagnosticCheckSchema).optional(),\n sessions: z\n .object({\n count: z.number().finite().optional(),\n max_age_ms: z.number().finite().optional(),\n max_idle_ms: z.number().finite().optional(),\n })\n .optional(),\n extension: z\n .object({\n connected: z.boolean().optional(),\n version: z.string().optional(),\n last_seen_at: z.string().datetime().optional(),\n })\n .optional(),\n debugger: z\n .object({\n attached: z.boolean().optional(),\n idle_timeout_ms: z.number().finite().optional(),\n console_buffer_size: z.number().finite().optional(),\n network_buffer_size: z.number().finite().optional(),\n last_error: ErrorInfoSchema.optional(),\n })\n .optional(),\n artifacts: z\n .object({\n root_dir: z.string().optional(),\n })\n .optional(),\n recovery: z\n .object({\n last_attempt: z\n .object({\n session_id: z.string(),\n recovered: z.boolean(),\n state: SessionStateSchema,\n message: z.string().optional(),\n at: z.string(),\n })\n .optional(),\n attempts: z\n .array(\n z.object({\n session_id: z.string(),\n recovered: z.boolean(),\n state: SessionStateSchema,\n message: z.string().optional(),\n at: z.string(),\n })\n )\n .optional(),\n success_count: z.number().finite().optional(),\n failure_count: z.number().finite().optional(),\n success_rate: z.number().finite().optional(),\n recent_failure_count: z.number().finite().optional(),\n loop_detected: z.boolean().optional(),\n })\n .optional(),\n warnings: z.array(z.string()).optional(),\n notes: z.array(z.string()).optional(),\n});\n\nexport const SessionIdSchema = z.object({\n session_id: z.string().min(1),\n});\n\nexport const SessionCreateInputSchema = z.object({}).strict().default({});\nexport const SessionCreateOutputSchema = SessionInfoSchema;\n\nexport const SessionStatusInputSchema = SessionIdSchema;\nexport const SessionStatusOutputSchema = SessionStatusSchema;\n\nexport const SessionRecoverInputSchema = SessionIdSchema;\nexport const SessionRecoverOutputSchema = RecoverResultSchema;\n\nexport const SessionCloseInputSchema = SessionIdSchema;\nexport const SessionCloseOutputSchema = z.object({\n ok: z.boolean(),\n});\n\nexport const DriveWaitConditionSchema = z.object({\n kind: z.enum(['locator_visible', 'text_present', 'url_matches']),\n value: z.string().min(1),\n});\n\nexport const DriveNavigateInputSchema = z.object({\n session_id: z.string().min(1),\n url: z.string().min(1),\n tab_id: z.number().finite().optional(),\n wait: z.enum(['none', 'domcontentloaded']).default('domcontentloaded'),\n});\nexport const DriveNavigateOutputSchema = OpResultSchema;\n\nexport const DriveGoBackInputSchema = z.object({\n session_id: z.string().min(1),\n tab_id: z.number().finite().optional(),\n});\nexport const DriveGoBackOutputSchema = OpResultSchema;\n\nexport const DriveGoForwardInputSchema = z.object({\n session_id: z.string().min(1),\n tab_id: z.number().finite().optional(),\n});\nexport const DriveGoForwardOutputSchema = OpResultSchema;\n\nexport const DriveBackInputSchema = DriveGoBackInputSchema;\nexport const DriveBackOutputSchema = OpResultSchema;\n\nexport const DriveForwardInputSchema = DriveGoForwardInputSchema;\nexport const DriveForwardOutputSchema = OpResultSchema;\n\nexport const DriveClickInputSchema = z.object({\n session_id: z.string().min(1),\n locator: LocatorSchema,\n tab_id: z.number().finite().optional(),\n click_count: z.number().finite().optional(),\n});\nexport const DriveClickOutputSchema = OpResultSchema;\n\nexport const DriveHoverInputSchema = z.object({\n session_id: z.string().min(1),\n locator: LocatorSchema,\n delay_ms: z.number().min(0).max(10000).optional(),\n tab_id: z.number().finite().optional(),\n});\nexport const DriveHoverOutputSchema = z.object({\n format: z.literal('html'),\n snapshot: z.string(),\n});\n\nexport const DriveSelectInputSchema = z\n .object({\n session_id: z.string().min(1),\n locator: LocatorSchema,\n value: z.string().min(1).optional(),\n text: z.string().min(1).optional(),\n index: z.number().int().min(0).optional(),\n tab_id: z.number().finite().optional(),\n })\n .refine((value) => value.value || value.text || value.index !== undefined, {\n message: 'Either value, text, or index must be provided.',\n path: ['select'],\n });\nexport const DriveSelectOutputSchema = OpResultSchema;\n\nexport const DriveTypeInputSchema = z.object({\n session_id: z.string().min(1),\n locator: LocatorSchema.optional(),\n text: z.string().min(1),\n tab_id: z.number().finite().optional(),\n clear: z.boolean().default(false),\n submit: z.boolean().default(false),\n});\nexport const DriveTypeOutputSchema = OpResultSchema;\n\nexport const DriveFillFormFieldSchema = z\n .object({\n selector: z.string().min(1).optional(),\n locator: LocatorSchema.optional(),\n value: z.union([z.string(), z.boolean()]),\n type: z\n .enum(['auto', 'text', 'select', 'checkbox', 'radio', 'contentEditable'])\n .default('auto'),\n submit: z.boolean().default(false),\n })\n .refine((value) => Boolean(value.selector || value.locator), {\n message: 'fill_form field requires selector or locator.',\n path: ['selector'],\n });\n\nexport const DriveFillFormInputSchema = z.object({\n session_id: z.string().min(1),\n fields: z.array(DriveFillFormFieldSchema).min(1),\n tab_id: z.number().finite().optional(),\n});\nexport const DriveFillFormOutputSchema = z.object({\n filled: z.number().finite(),\n attempted: z.number().finite(),\n errors: z.array(z.string()).optional(),\n});\n\nexport const DriveDragInputSchema = z.object({\n session_id: z.string().min(1),\n from: LocatorSchema,\n to: LocatorSchema,\n steps: z.number().min(1).max(50).default(12),\n tab_id: z.number().finite().optional(),\n});\nexport const DriveDragOutputSchema = OpResultSchema;\n\nexport const DriveHandleDialogInputSchema = z.object({\n session_id: z.string().min(1),\n action: z.enum(['accept', 'dismiss']),\n promptText: z.string().optional(),\n tab_id: z.number().finite().optional(),\n});\nexport const DriveHandleDialogOutputSchema = OpResultSchema;\n\nexport const DialogAcceptInputSchema = SessionIdSchema.extend({\n promptText: z.string().optional(),\n tab_id: z.number().finite().optional(),\n});\nexport const DialogAcceptOutputSchema = OpResultSchema;\n\nexport const DialogDismissInputSchema = SessionIdSchema.extend({\n tab_id: z.number().finite().optional(),\n});\nexport const DialogDismissOutputSchema = OpResultSchema;\n\nexport const DriveKeyModifiersSchema = z.object({\n ctrl: z.boolean().optional(),\n alt: z.boolean().optional(),\n shift: z.boolean().optional(),\n meta: z.boolean().optional(),\n});\n\nexport const DriveKeyPressInputSchema = z.object({\n session_id: z.string().min(1),\n key: z.string().min(1),\n modifiers: DriveKeyModifiersSchema.optional(),\n tab_id: z.number().finite().optional(),\n});\nexport const DriveKeyPressOutputSchema = OpResultSchema;\n\nexport const DriveKeyModifierSchema = z.enum(['ctrl', 'alt', 'shift', 'meta']);\n\nexport const DriveKeyInputSchema = z.object({\n session_id: z.string().min(1),\n key: z.string().min(1),\n modifiers: z.array(DriveKeyModifierSchema).optional(),\n repeat: z.number().int().min(1).max(50).optional(),\n tab_id: z.number().finite().optional(),\n});\nexport const DriveKeyOutputSchema = OpResultSchema;\n\nexport const DriveScrollInputSchema = z\n .object({\n session_id: z.string().min(1),\n delta_x: z.number().finite().optional(),\n delta_y: z.number().finite().optional(),\n top: z.number().finite().optional(),\n left: z.number().finite().optional(),\n behavior: z.enum(['auto', 'smooth']).optional(),\n tab_id: z.number().finite().optional(),\n })\n .refine(\n (value) =>\n value.delta_x !== undefined ||\n value.delta_y !== undefined ||\n value.top !== undefined ||\n value.left !== undefined,\n {\n message: 'scroll requires delta_x/delta_y or top/left.',\n path: ['scroll'],\n }\n );\nexport const DriveScrollOutputSchema = OpResultSchema;\n\nexport const DriveWaitForInputSchema = z.object({\n session_id: z.string().min(1),\n condition: DriveWaitConditionSchema,\n timeout_ms: z.number().finite().optional(),\n tab_id: z.number().finite().optional(),\n});\nexport const DriveWaitForOutputSchema = OpResultSchema;\n\nexport const DriveTabInfoSchema = z.object({\n tab_id: z.number().finite(),\n window_id: z.number().finite(),\n url: z.string().min(1),\n title: z.string(),\n active: z.boolean().optional(),\n last_active_at: z.string().datetime().optional(),\n});\n\nexport const DriveTabListInputSchema = SessionIdSchema;\nexport const DriveTabListOutputSchema = z.object({\n tabs: z.array(DriveTabInfoSchema),\n});\n\nexport const DriveTabActivateInputSchema = z.object({\n session_id: z.string().min(1),\n tab_id: z.number().finite(),\n});\nexport const DriveTabActivateOutputSchema = OpResultSchema;\n\nexport const DriveTabCloseInputSchema = z.object({\n session_id: z.string().min(1),\n tab_id: z.number().finite(),\n});\nexport const DriveTabCloseOutputSchema = OpResultSchema;\n\nexport const InspectDomFormatSchema = z.enum(['ax', 'html']);\nexport const InspectConsistencySchema = z.enum(['best_effort', 'quiesce']);\n\nexport const TargetHintSchema = z.object({\n url: z.string().min(1).optional(),\n title: z.string().min(1).optional(),\n last_active_at: z.string().optional(),\n lastActiveAt: z.string().optional(),\n});\n\nexport const FormFieldInfoSchema = z.object({\n name: z.string(),\n type: z.string(),\n value: z.string(),\n options: z.array(z.string()).optional(),\n});\n\nexport const FormInfoSchema = z.object({\n selector: z.string(),\n action: z.string().optional(),\n method: z.string().optional(),\n fields: z.array(FormFieldInfoSchema),\n});\n\nexport const StorageEntrySchema = z.object({\n key: z.string(),\n value: z.string(),\n});\n\nexport const PageStateSchema = z.object({\n forms: z.array(FormInfoSchema),\n localStorage: z.array(StorageEntrySchema),\n sessionStorage: z.array(StorageEntrySchema),\n cookies: z.array(StorageEntrySchema),\n warnings: z.array(z.string()).optional(),\n});\n\nexport const DomSnapshotSchema = z\n .object({\n format: InspectDomFormatSchema,\n snapshot: z.unknown(),\n })\n .passthrough();\n\nexport const InspectDomSnapshotInputSchema = z.object({\n session_id: z.string().min(1),\n format: InspectDomFormatSchema.default('ax'),\n consistency: InspectConsistencySchema.default('best_effort'),\n interactive: z.boolean().default(false),\n compact: z.boolean().default(false),\n // Used primarily to bound large AX trees for LLM/agent consumption.\n // CLI passes this as a string, so coerce for convenience.\n max_nodes: z.coerce.number().int().positive().max(50000).optional(),\n selector: z.string().min(1).optional(),\n target: TargetHintSchema.optional(),\n});\nexport const InspectDomSnapshotOutputSchema = DomSnapshotSchema;\n\nexport const DomDiffResultSchema = z.object({\n added: z.array(z.string()),\n removed: z.array(z.string()),\n changed: z.array(z.string()),\n summary: z.string(),\n});\n\nexport const InspectDomDiffInputSchema = SessionIdSchema;\nexport const InspectDomDiffOutputSchema = DomDiffResultSchema;\n\nexport const InspectFindRoleInputSchema = SessionIdSchema.extend({\n kind: z.literal('role'),\n role: z.string().min(1),\n name: z.string().min(1).optional(),\n target: TargetHintSchema.optional(),\n});\n\nexport const InspectFindTextInputSchema = SessionIdSchema.extend({\n kind: z.literal('text'),\n text: z.string().min(1),\n target: TargetHintSchema.optional(),\n});\n\nexport const InspectFindLabelInputSchema = SessionIdSchema.extend({\n kind: z.literal('label'),\n label: z.string().min(1),\n target: TargetHintSchema.optional(),\n});\n\nexport const InspectFindInputSchema = z.discriminatedUnion('kind', [\n InspectFindRoleInputSchema,\n InspectFindTextInputSchema,\n InspectFindLabelInputSchema,\n]);\n\nexport const InspectFindMatchSchema = z.object({\n ref: z.string(),\n role: z.string().optional(),\n name: z.string().optional(),\n});\n\nexport const InspectFindOutputSchema = z.object({\n matches: z.array(InspectFindMatchSchema),\n warnings: z.array(z.string()).optional(),\n});\n\nexport const InspectPageStateInputSchema = SessionIdSchema.extend({\n target: TargetHintSchema.optional(),\n});\nexport const InspectPageStateOutputSchema = PageStateSchema;\n\nexport const InspectExtractContentFormatSchema = z.enum([\n 'markdown',\n 'text',\n 'article_json',\n]);\n\nexport const InspectExtractContentInputSchema = SessionIdSchema.extend({\n format: InspectExtractContentFormatSchema.default('markdown'),\n include_metadata: z.boolean().default(true),\n target: TargetHintSchema.optional(),\n});\n\nexport const InspectExtractContentOutputSchema = z.object({\n content: z.string(),\n title: z.string().optional(),\n byline: z.string().optional(),\n excerpt: z.string().optional(),\n siteName: z.string().optional(),\n warnings: z.array(z.string()).optional(),\n});\n\nexport const InspectConsoleListInputSchema = SessionIdSchema.extend({\n target: TargetHintSchema.optional(),\n});\n// Console output may expand over time; include a stable core + allow passthrough.\nexport const ConsoleSourceLocationSchema = z\n .object({\n url: z.string().optional(),\n // 1-based line/column for human readability.\n line: z.number().int().positive().optional(),\n column: z.number().int().positive().optional(),\n })\n .passthrough();\n\nexport const ConsoleStackFrameSchema = z\n .object({\n functionName: z.string().optional(),\n url: z.string().optional(),\n // 1-based line/column for human readability.\n line: z.number().int().positive().optional(),\n column: z.number().int().positive().optional(),\n })\n .passthrough();\n\nexport const ConsoleRemoteObjectSchema = z\n .object({\n type: z.string().optional(),\n subtype: z.string().optional(),\n description: z.string().optional(),\n value: z.unknown().optional(),\n unserializableValue: z.string().optional(),\n })\n .passthrough();\n\nexport const ConsoleEntrySchema = z\n .object({\n level: z.string().optional(),\n text: z.string().optional(),\n timestamp: z.string().datetime().optional(),\n source: ConsoleSourceLocationSchema.optional(),\n stack: z.array(ConsoleStackFrameSchema).optional(),\n exception: ConsoleRemoteObjectSchema.optional(),\n args: z.array(ConsoleRemoteObjectSchema).optional(),\n })\n .passthrough();\nexport const ConsoleListSchema = z\n .object({\n entries: z.array(ConsoleEntrySchema),\n })\n .passthrough();\nexport const InspectConsoleListOutputSchema = ConsoleListSchema;\n\nexport const ArtifactInfoSchema = z.object({\n artifact_id: z.string(),\n path: z.string(),\n mime: z.string(),\n});\n\nexport const InspectNetworkHarInputSchema = SessionIdSchema.extend({\n target: TargetHintSchema.optional(),\n});\nexport const InspectNetworkHarOutputSchema = ArtifactInfoSchema;\n\nexport const InspectEvaluateInputSchema = z.object({\n session_id: z.string().min(1),\n expression: z.string().min(1).optional(),\n target: TargetHintSchema.optional(),\n});\n// Evaluate output is implementation-defined; allow passthrough fields.\nexport const EvaluateResultSchema = z\n .object({\n value: z.unknown().optional(),\n exception: z.unknown().optional(),\n })\n .passthrough();\nexport const InspectEvaluateOutputSchema = EvaluateResultSchema;\n\nexport const InspectPerformanceMetricsInputSchema = SessionIdSchema.extend({\n target: TargetHintSchema.optional(),\n});\n// Performance metrics output shape may expand; allow passthrough metadata.\nexport const PerformanceMetricSchema = z\n .object({\n name: z.string(),\n value: z.number().finite(),\n })\n .passthrough();\nexport const PerformanceMetricsSchema = z\n .object({\n metrics: z.array(PerformanceMetricSchema),\n })\n .passthrough();\nexport const InspectPerformanceMetricsOutputSchema = PerformanceMetricsSchema;\n\nexport const ArtifactsScreenshotInputSchema = z.object({\n session_id: z.string().min(1),\n target: z.enum(['viewport', 'full']).default('viewport'),\n fullPage: z.boolean().default(false),\n selector: z.string().min(1).optional(),\n format: z.enum(['png', 'jpeg', 'webp']).default('png'),\n quality: z.number().min(0).max(100).optional(),\n});\nexport const ArtifactsScreenshotOutputSchema = ArtifactInfoSchema;\n\nexport const HealthCheckInputSchema = z.object({});\nexport const HealthCheckOutputSchema = z\n .object({\n started_at: z.string().min(1),\n uptime_ms: z.number().finite().nonnegative(),\n memory: z\n .object({\n rss: z.number().finite().nonnegative(),\n heapTotal: z.number().finite().nonnegative(),\n heapUsed: z.number().finite().nonnegative(),\n external: z.number().finite().nonnegative(),\n arrayBuffers: z.number().finite().nonnegative().optional(),\n })\n .passthrough(),\n sessions: z\n .object({\n active: z.number().finite().nonnegative(),\n })\n .passthrough(),\n extension: z\n .object({\n connected: z.boolean(),\n last_seen_at: z.string().min(1).optional(),\n })\n .passthrough(),\n })\n .passthrough();\n\nexport const DiagnosticsDoctorInputSchema = z.object({\n session_id: z.string().min(1).optional(),\n});\nexport const DiagnosticsDoctorOutputSchema = DiagnosticReportSchema;\n", "import { InspectError, InspectService, createInspectService } from '../inspect';\nimport type { ExtensionBridge } from '../extension-bridge';\nimport type { SessionRegistry } from '../session';\nimport { ArtifactsScreenshotInputSchema } from '@btraut/browser-bridge-shared';\nimport {\n ResponseLike,\n deriveHintFromTabs,\n errorStatus,\n isRecord,\n sendError,\n sendResult,\n} from './shared';\n\ntype RequestLike = {\n body?: unknown;\n};\n\ntype RouteRegistry = {\n post: (\n path: string,\n handler: (req: RequestLike, res: ResponseLike) => void\n ) => void;\n};\n\ntype ErrorEnvelope = {\n ok: false;\n error: {\n code:\n | 'INVALID_ARGUMENT'\n | 'NOT_IMPLEMENTED'\n | 'ARTIFACT_IO_ERROR'\n | 'SESSION_NOT_FOUND'\n | 'SESSION_CLOSED'\n | 'INSPECT_UNAVAILABLE'\n | 'EXTENSION_DISCONNECTED'\n | 'DEBUGGER_IN_USE'\n | 'ATTACH_DENIED'\n | 'TAB_NOT_FOUND'\n | 'NOT_SUPPORTED'\n | 'TIMEOUT';\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n };\n};\n\ntype ArtifactsRoutesOptions = {\n registry?: SessionRegistry;\n inspectService?: InspectService;\n extensionBridge?: ExtensionBridge;\n};\n\nconst sendArtifactsError = (\n res: ResponseLike,\n code: ErrorEnvelope['error']['code'],\n message: string,\n details?: Record<string, unknown>,\n retryable = false\n): void => {\n sendError(res, errorStatus(code), {\n code,\n message,\n retryable,\n ...(details ? { details } : {}),\n });\n};\n\nexport const registerArtifactsRoutes = (\n router: RouteRegistry,\n options: ArtifactsRoutesOptions = {}\n): void => {\n const inspect =\n options.inspectService ??\n (options.registry\n ? createInspectService({ registry: options.registry })\n : undefined);\n\n router.post('/artifacts/screenshot', async (req, res) => {\n if (!isRecord(req.body)) {\n sendArtifactsError(\n res,\n 'INVALID_ARGUMENT',\n 'Request body must be an object.'\n );\n return;\n }\n\n const parsed = ArtifactsScreenshotInputSchema.safeParse(req.body);\n if (!parsed.success) {\n const issue = parsed.error.issues[0];\n sendArtifactsError(\n res,\n 'INVALID_ARGUMENT',\n issue?.message ?? 'Invalid screenshot request.',\n issue?.path.length\n ? {\n field: issue.path.map((part) => String(part)).join('.'),\n }\n : undefined\n );\n return;\n }\n\n const input = parsed.data;\n const target = input.fullPage ? 'full' : input.target;\n\n try {\n if (!inspect) {\n sendArtifactsError(\n res,\n 'NOT_IMPLEMENTED',\n 'artifacts.screenshot is not implemented yet.'\n );\n return;\n }\n\n const hint = deriveHintFromTabs(\n options.extensionBridge?.getStatus().tabs ?? []\n );\n const result = await inspect.screenshot({\n sessionId: input.session_id,\n target,\n selector: input.selector,\n format: input.format,\n quality: input.quality,\n targetHint: hint,\n });\n sendResult(res, result);\n } catch (error) {\n if (error instanceof InspectError) {\n sendArtifactsError(\n res,\n error.code as ErrorEnvelope['error']['code'],\n error.message,\n error.details,\n error.retryable\n );\n return;\n }\n sendArtifactsError(\n res,\n 'ARTIFACT_IO_ERROR',\n 'Failed to capture screenshot.'\n );\n }\n });\n};\n", "import { getArtifactRootDir } from './artifacts';\nimport type { RecoveryAttempt, RecoveryMetrics } from './recovery';\n\nexport type DiagnosticCheck = {\n name: string;\n ok: boolean;\n message?: string;\n details?: Record<string, unknown>;\n};\n\nexport type DiagnosticReport = {\n ok: boolean;\n session_id?: string;\n checks?: DiagnosticCheck[];\n sessions?: {\n count?: number;\n max_age_ms?: number;\n max_idle_ms?: number;\n };\n extension?: {\n connected?: boolean;\n version?: string;\n last_seen_at?: string;\n };\n debugger?: {\n attached?: boolean;\n idle_timeout_ms?: number;\n console_buffer_size?: number;\n network_buffer_size?: number;\n last_error?: {\n code: string;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n };\n };\n artifacts?: {\n root_dir?: string;\n };\n recovery?: {\n last_attempt?: {\n session_id: string;\n recovered: boolean;\n state: string;\n message?: string;\n at: string;\n };\n attempts?: {\n session_id: string;\n recovered: boolean;\n state: string;\n message?: string;\n at: string;\n }[];\n success_count?: number;\n failure_count?: number;\n success_rate?: number;\n recent_failure_count?: number;\n loop_detected?: boolean;\n };\n warnings?: string[];\n notes?: string[];\n};\n\nexport type DiagnosticsContext = {\n sessionState?: string;\n sessions?: {\n count: number;\n maxAgeMs?: number;\n maxIdleMs?: number;\n };\n extension?: {\n connected: boolean;\n lastSeenAt?: string;\n };\n debugger?: {\n attached: boolean;\n idle_timeout_ms: number;\n console_buffer_size: number;\n network_buffer_size: number;\n last_error?: {\n code: string;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n };\n };\n driveLastError?: {\n code: string;\n message: string;\n retryable: boolean;\n at: string;\n };\n inspectLastError?: {\n code: string;\n message: string;\n retryable: boolean;\n at: string;\n };\n recoveryAttempt?: RecoveryAttempt;\n recoveryMetrics?: RecoveryMetrics;\n};\n\nexport const buildDiagnosticReport = (\n sessionId?: string,\n context: DiagnosticsContext = {}\n): DiagnosticReport => {\n const extensionConnected = context.extension?.connected ?? false;\n const debuggerAttached = context.debugger?.attached ?? false;\n const sessionState = context.sessionState;\n\n const checks: DiagnosticCheck[] = [\n {\n name: 'extension.connected',\n ok: extensionConnected,\n message: extensionConnected\n ? 'Extension is connected.'\n : 'Extension is not connected.',\n },\n {\n name: 'debugger.attached',\n ok: debuggerAttached,\n message: debuggerAttached\n ? 'Debugger is attached.'\n : 'Debugger is not attached.',\n },\n {\n name: 'session.state',\n ok: Boolean(sessionState),\n message: sessionState\n ? `Session state is ${sessionState}.`\n : sessionId\n ? 'Session state unavailable.'\n : 'Session id not provided.',\n details: {\n session_id: sessionId || null,\n state: sessionState ?? 'UNKNOWN',\n },\n },\n ];\n\n if (context.driveLastError) {\n checks.push({\n name: 'drive.last_error',\n ok: false,\n message: context.driveLastError.message,\n details: {\n code: context.driveLastError.code,\n retryable: context.driveLastError.retryable,\n at: context.driveLastError.at,\n },\n });\n }\n\n if (context.inspectLastError) {\n checks.push({\n name: 'inspect.last_error',\n ok: false,\n message: context.inspectLastError.message,\n details: {\n code: context.inspectLastError.code,\n retryable: context.inspectLastError.retryable,\n at: context.inspectLastError.at,\n },\n });\n }\n\n if (context.recoveryAttempt) {\n checks.push({\n name: 'recovery.last_attempt',\n ok: context.recoveryAttempt.recovered,\n message: context.recoveryAttempt.message ?? 'Recovery attempt recorded.',\n details: {\n session_id: context.recoveryAttempt.sessionId,\n state: context.recoveryAttempt.state,\n at: context.recoveryAttempt.at,\n },\n });\n }\n\n const formatRecoveryAttempt = (attempt: RecoveryAttempt) => ({\n session_id: attempt.sessionId,\n recovered: attempt.recovered,\n state: attempt.state,\n message: attempt.message,\n at: attempt.at,\n });\n const recoveryAttempts = context.recoveryMetrics?.attempts;\n const lastRecoveryAttempt =\n context.recoveryAttempt ??\n (recoveryAttempts && recoveryAttempts[recoveryAttempts.length - 1]);\n\n const report: DiagnosticReport = {\n ok: checks.every((check) => check.ok),\n session_id: sessionId,\n checks,\n sessions: context.sessions\n ? {\n count: context.sessions.count,\n max_age_ms: context.sessions.maxAgeMs,\n max_idle_ms: context.sessions.maxIdleMs,\n }\n : undefined,\n extension: {\n connected: extensionConnected,\n last_seen_at: context.extension?.lastSeenAt,\n },\n debugger: context.debugger\n ? {\n attached: debuggerAttached,\n idle_timeout_ms: context.debugger.idle_timeout_ms,\n console_buffer_size: context.debugger.console_buffer_size,\n network_buffer_size: context.debugger.network_buffer_size,\n last_error: context.debugger.last_error,\n }\n : undefined,\n artifacts: sessionId\n ? {\n root_dir: getArtifactRootDir(sessionId),\n }\n : undefined,\n recovery:\n context.recoveryMetrics || lastRecoveryAttempt\n ? {\n ...(lastRecoveryAttempt\n ? { last_attempt: formatRecoveryAttempt(lastRecoveryAttempt) }\n : {}),\n ...(recoveryAttempts\n ? { attempts: recoveryAttempts.map(formatRecoveryAttempt) }\n : {}),\n ...(context.recoveryMetrics\n ? {\n success_count: context.recoveryMetrics.successCount,\n failure_count: context.recoveryMetrics.failureCount,\n success_rate: context.recoveryMetrics.successRate,\n recent_failure_count:\n context.recoveryMetrics.recentFailureCount,\n loop_detected: context.recoveryMetrics.loopDetected,\n }\n : {}),\n }\n : undefined,\n notes: ['Diagnostics include runtime status; some checks may be stubbed.'],\n };\n\n return report;\n};\n", "import { DiagnosticsContext, buildDiagnosticReport } from '../diagnostics';\nimport type { SessionRegistry } from '../session';\nimport type { ExtensionBridge } from '../extension-bridge';\nimport type { DriveController } from '../drive';\nimport type { InspectService } from '../inspect';\nimport type { DebuggerBridge } from '../debugger-bridge';\nimport type { RecoveryTracker } from '../recovery';\nimport { HealthCheckInputSchema } from '@btraut/browser-bridge-shared';\nimport { ResponseLike, isRecord, sendError, sendResult } from './shared';\n\ntype RequestLike = {\n body?: unknown;\n};\n\ntype RouteRegistry = {\n post: (\n path: string,\n handler: (req: RequestLike, res: ResponseLike) => void\n ) => void;\n};\n\ntype DiagnosticsRoutesOptions = {\n registry?: SessionRegistry;\n extensionBridge?: ExtensionBridge;\n debuggerBridge?: DebuggerBridge;\n drive?: DriveController;\n inspectService?: InspectService;\n recoveryTracker?: RecoveryTracker;\n};\n\nconst PROCESS_STARTED_AT = new Date(\n Date.now() - Math.floor(process.uptime() * 1000)\n).toISOString();\n\nexport const registerDiagnosticsRoutes = (\n router: RouteRegistry,\n options: DiagnosticsRoutesOptions = {}\n): void => {\n router.post('/health_check', (req, res) => {\n const body = req.body ?? {};\n if (!isRecord(body)) {\n sendError(res, 400, {\n code: 'INVALID_ARGUMENT',\n message: 'Request body must be an object.',\n retryable: false,\n });\n return;\n }\n\n const parsed = HealthCheckInputSchema.safeParse(body);\n if (!parsed.success) {\n const issue = parsed.error.issues[0];\n sendError(res, 400, {\n code: 'INVALID_ARGUMENT',\n message: issue?.message ?? 'Invalid health check request.',\n retryable: false,\n details: issue?.path.length\n ? { field: issue.path.map((part) => String(part)).join('.') }\n : undefined,\n });\n return;\n }\n\n const sessionsActive = options.registry\n ? options.registry.list().length\n : 0;\n const extensionStatus = options.extensionBridge?.getStatus();\n\n sendResult(res, {\n started_at: PROCESS_STARTED_AT,\n uptime_ms: Math.floor(process.uptime() * 1000),\n memory: process.memoryUsage(),\n sessions: { active: sessionsActive },\n extension: {\n connected: extensionStatus?.connected ?? false,\n ...(extensionStatus?.lastSeenAt\n ? { last_seen_at: extensionStatus.lastSeenAt }\n : {}),\n },\n });\n });\n\n router.post('/diagnostics/doctor', (req, res) => {\n let sessionId: string | undefined;\n if (req.body !== undefined) {\n if (!isRecord(req.body)) {\n sendError(res, 400, {\n code: 'INVALID_ARGUMENT',\n message: 'Request body must be an object.',\n retryable: false,\n });\n return;\n }\n const raw = req.body.session_id;\n if (raw !== undefined && (typeof raw !== 'string' || raw.length === 0)) {\n sendError(res, 400, {\n code: 'INVALID_ARGUMENT',\n message: 'session_id must be a non-empty string.',\n retryable: false,\n details: { field: 'session_id' },\n });\n return;\n }\n sessionId = raw as string | undefined;\n }\n\n try {\n const context: DiagnosticsContext = {};\n if (options.registry && sessionId) {\n try {\n const session = options.registry.require(sessionId);\n context.sessionState = session.state;\n } catch {\n // Ignore missing session for diagnostics.\n }\n }\n\n if (options.registry) {\n const now = Date.now();\n const sessions = options.registry.list();\n let maxAgeMs = 0;\n let maxIdleMs = 0;\n for (const session of sessions) {\n const ageMs = now - session.createdAt.getTime();\n const idleMs = now - session.lastAccessedAt.getTime();\n if (ageMs > maxAgeMs) {\n maxAgeMs = ageMs;\n }\n if (idleMs > maxIdleMs) {\n maxIdleMs = idleMs;\n }\n }\n context.sessions = {\n count: sessions.length,\n ...(sessions.length > 0 ? { maxAgeMs, maxIdleMs } : {}),\n };\n }\n\n if (options.extensionBridge) {\n const status = options.extensionBridge.getStatus();\n context.extension = {\n connected: status.connected,\n lastSeenAt: status.lastSeenAt,\n };\n }\n\n if (options.debuggerBridge) {\n const settings = options.debuggerBridge.getSettings();\n const lastError = options.debuggerBridge.getLastError();\n context.debugger = {\n attached: options.debuggerBridge.hasAttachments(),\n idle_timeout_ms: settings.idleTimeoutMs,\n console_buffer_size: settings.consoleBufferSize,\n network_buffer_size: settings.networkBufferSize,\n last_error: lastError\n ? {\n code: lastError.error.code,\n message: lastError.error.message,\n retryable: lastError.error.retryable,\n details: lastError.error.details,\n }\n : undefined,\n };\n }\n\n if (options.drive) {\n const lastError = options.drive.getLastError();\n if (lastError) {\n context.driveLastError = {\n code: lastError.error.code,\n message: lastError.error.message,\n retryable: lastError.error.retryable,\n at: lastError.at,\n };\n }\n }\n\n if (options.inspectService) {\n const lastError = options.inspectService.getLastError();\n if (lastError) {\n context.inspectLastError = {\n code: lastError.error.code,\n message: lastError.error.message,\n retryable: lastError.error.retryable,\n at: lastError.at,\n };\n }\n }\n\n if (options.recoveryTracker) {\n const attempt = options.recoveryTracker.getLastAttempt();\n if (attempt) {\n context.recoveryAttempt = {\n sessionId: attempt.sessionId,\n recovered: attempt.recovered,\n state: attempt.state,\n message: attempt.message,\n at: attempt.at,\n };\n }\n context.recoveryMetrics = options.recoveryTracker.getMetrics();\n }\n\n const report = buildDiagnosticReport(sessionId, context);\n sendResult(res, report);\n } catch {\n sendError(res, 500, {\n code: 'INTERNAL',\n message: 'Failed to build diagnostics report.',\n retryable: false,\n });\n }\n });\n};\n", "import { DriveController } from '../drive';\nimport type { DriveAction } from '../drive-protocol';\nimport {\n DriveClickInputSchema,\n DriveBackInputSchema,\n DriveForwardInputSchema,\n DriveGoBackInputSchema,\n DriveGoForwardInputSchema,\n DriveHoverInputSchema,\n DriveDragInputSchema,\n DialogAcceptInputSchema,\n DialogDismissInputSchema,\n DriveFillFormInputSchema,\n DriveHandleDialogInputSchema,\n DriveKeyInputSchema,\n DriveKeyPressInputSchema,\n DriveNavigateInputSchema,\n DriveScrollInputSchema,\n DriveSelectInputSchema,\n DriveTabActivateInputSchema,\n DriveTabCloseInputSchema,\n DriveTabListInputSchema,\n DriveTypeInputSchema,\n DriveWaitForInputSchema,\n} from '@btraut/browser-bridge-shared';\nimport { ResponseLike, errorStatus, sendError, sendResult } from './shared';\n\ntype RequestLike = {\n body?: unknown;\n};\n\ntype RouteRegistry = {\n post: (\n path: string,\n handler: (req: RequestLike, res: ResponseLike) => void\n ) => void;\n};\n\ntype ValidationError = {\n message: string;\n details?: Record<string, unknown>;\n};\n\ntype SchemaLike<T> = {\n safeParse: (body: unknown) =>\n | { success: true; data: T }\n | {\n success: false;\n error: { issues: { message: string; path: PropertyKey[] }[] };\n };\n};\n\ntype DriveRouteOptions = {\n drive: DriveController;\n};\n\ntype HandlerOptions = {\n defaultResult?: unknown;\n timeoutFromParams?: (params: Record<string, unknown>) => number | undefined;\n};\n\nconst parseBody = <T>(\n schema: SchemaLike<T>,\n body: unknown\n): { data?: T; error?: ValidationError } => {\n const result = schema.safeParse(body);\n if (result.success) {\n return { data: result.data };\n }\n const issue = result.error.issues[0];\n const details =\n issue && issue.path.length > 0\n ? { field: issue.path.map((part) => part.toString()).join('.') }\n : undefined;\n return {\n error: {\n message: issue?.message ?? 'Request body is invalid.',\n ...(details ? { details } : {}),\n },\n };\n};\n\nconst makeHandler = <T extends { session_id: string }>(\n action: DriveAction,\n schema: SchemaLike<T>,\n drive: DriveController,\n options: HandlerOptions = {}\n) => {\n return (req: RequestLike, res: ResponseLike): void => {\n const parsed = parseBody(schema, req.body ?? {});\n if (parsed.error) {\n sendError(res, errorStatus('INVALID_ARGUMENT'), {\n code: 'INVALID_ARGUMENT',\n message: parsed.error.message,\n retryable: false,\n ...(parsed.error.details ? { details: parsed.error.details } : {}),\n });\n return;\n }\n\n const body = parsed.data as Record<string, unknown>;\n const sessionId = body.session_id as string;\n const params = { ...body };\n delete params.session_id;\n\n const timeoutMs = options.timeoutFromParams\n ? options.timeoutFromParams(params)\n : undefined;\n\n void drive\n .execute(sessionId, action, params, timeoutMs)\n .then((result) => {\n if (result.ok) {\n const payload =\n result.result === undefined\n ? (options.defaultResult ?? { ok: true })\n : result.result;\n sendResult(res, payload);\n return;\n }\n sendError(res, errorStatus(result.error.code), result.error);\n })\n .catch((error) => {\n console.error('Drive execute failed:', error);\n sendError(res, errorStatus('INTERNAL'), {\n code: 'INTERNAL',\n message: 'Unexpected error while executing drive action.',\n retryable: false,\n details: {\n hint: error instanceof Error ? error.message : 'Unknown error.',\n },\n });\n });\n };\n};\n\nconst makeDialogHandler = <T extends { session_id: string }>(\n action: 'accept' | 'dismiss',\n schema: SchemaLike<T>,\n drive: DriveController\n) => {\n return (req: RequestLike, res: ResponseLike): void => {\n const parsed = parseBody(schema, req.body ?? {});\n if (parsed.error) {\n sendError(res, errorStatus('INVALID_ARGUMENT'), {\n code: 'INVALID_ARGUMENT',\n message: parsed.error.message,\n retryable: false,\n ...(parsed.error.details ? { details: parsed.error.details } : {}),\n });\n return;\n }\n\n const body = parsed.data as T;\n const { session_id: sessionId, ...rest } = body;\n const params = { ...rest, action };\n\n void drive\n .execute(sessionId, 'drive.handle_dialog', params)\n .then((result) => {\n if (result.ok) {\n const payload =\n result.result === undefined ? { ok: true } : result.result;\n sendResult(res, payload);\n return;\n }\n sendError(res, errorStatus(result.error.code), result.error);\n })\n .catch((error) => {\n console.error('Drive execute failed:', error);\n sendError(res, errorStatus('INTERNAL'), {\n code: 'INTERNAL',\n message: 'Unexpected error while executing drive action.',\n retryable: false,\n details: {\n hint: error instanceof Error ? error.message : 'Unknown error.',\n },\n });\n });\n };\n};\n\nexport const registerDriveRoutes = (\n router: RouteRegistry,\n options: DriveRouteOptions\n): void => {\n const { drive } = options;\n\n router.post(\n '/drive/navigate',\n makeHandler('drive.navigate', DriveNavigateInputSchema, drive)\n );\n router.post(\n '/drive/go_back',\n makeHandler('drive.go_back', DriveGoBackInputSchema, drive)\n );\n router.post(\n '/drive/go_forward',\n makeHandler('drive.go_forward', DriveGoForwardInputSchema, drive)\n );\n router.post(\n '/drive/back',\n makeHandler('drive.back', DriveBackInputSchema, drive)\n );\n router.post(\n '/drive/forward',\n makeHandler('drive.forward', DriveForwardInputSchema, drive)\n );\n router.post(\n '/drive/click',\n makeHandler('drive.click', DriveClickInputSchema, drive)\n );\n router.post(\n '/drive/hover',\n makeHandler('drive.hover', DriveHoverInputSchema, drive)\n );\n router.post(\n '/drive/select',\n makeHandler('drive.select', DriveSelectInputSchema, drive)\n );\n router.post(\n '/drive/type',\n makeHandler('drive.type', DriveTypeInputSchema, drive)\n );\n router.post(\n '/drive/fill_form',\n makeHandler('drive.fill_form', DriveFillFormInputSchema, drive)\n );\n router.post(\n '/drive/drag',\n makeHandler('drive.drag', DriveDragInputSchema, drive)\n );\n router.post(\n '/drive/handle_dialog',\n makeHandler('drive.handle_dialog', DriveHandleDialogInputSchema, drive)\n );\n router.post(\n '/dialog/accept',\n makeDialogHandler('accept', DialogAcceptInputSchema, drive)\n );\n router.post(\n '/dialog/dismiss',\n makeDialogHandler('dismiss', DialogDismissInputSchema, drive)\n );\n router.post(\n '/drive/key',\n makeHandler('drive.key', DriveKeyInputSchema, drive)\n );\n router.post(\n '/drive/key_press',\n makeHandler('drive.key_press', DriveKeyPressInputSchema, drive)\n );\n router.post(\n '/drive/scroll',\n makeHandler('drive.scroll', DriveScrollInputSchema, drive)\n );\n router.post(\n '/drive/wait_for',\n makeHandler('drive.wait_for', DriveWaitForInputSchema, drive, {\n timeoutFromParams: (params) => {\n const timeout = params.timeout_ms;\n if (typeof timeout === 'number' && Number.isFinite(timeout)) {\n return Math.max(0, timeout + 1000);\n }\n return undefined;\n },\n })\n );\n router.post(\n '/drive/tab_list',\n makeHandler('drive.tab_list', DriveTabListInputSchema, drive)\n );\n router.post(\n '/drive/tab_activate',\n makeHandler('drive.tab_activate', DriveTabActivateInputSchema, drive)\n );\n router.post(\n '/drive/tab_close',\n makeHandler('drive.tab_close', DriveTabCloseInputSchema, drive)\n );\n};\n", "import { InspectError, InspectService, createInspectService } from '../inspect';\nimport { TargetHint } from '../target-matching';\nimport { SessionRegistry } from '../session';\nimport type { ExtensionBridge } from '../extension-bridge';\nimport {\n InspectConsoleListInputSchema,\n InspectDomDiffInputSchema,\n InspectDomSnapshotInputSchema,\n InspectEvaluateInputSchema,\n InspectFindInputSchema,\n InspectExtractContentInputSchema,\n InspectNetworkHarInputSchema,\n InspectPageStateInputSchema,\n InspectPerformanceMetricsInputSchema,\n} from '@btraut/browser-bridge-shared';\nimport {\n ResponseLike,\n deriveHintFromTabs,\n errorStatus,\n sendError,\n sendResult,\n} from './shared';\n\ntype RequestLike = {\n body?: unknown;\n};\n\ntype RouteRegistry = {\n post: (\n path: string,\n handler: (req: RequestLike, res: ResponseLike) => void\n ) => void;\n};\n\ntype ErrorCode =\n | 'INVALID_ARGUMENT'\n | 'NOT_IMPLEMENTED'\n | 'SESSION_NOT_FOUND'\n | 'SESSION_CLOSED'\n | 'INSPECT_UNAVAILABLE'\n | 'EXTENSION_DISCONNECTED'\n | 'DEBUGGER_IN_USE'\n | 'ATTACH_DENIED'\n | 'TAB_NOT_FOUND'\n | 'NOT_SUPPORTED'\n | 'TIMEOUT'\n | 'EVALUATION_FAILED'\n | 'ARTIFACT_IO_ERROR'\n | 'INTERNAL';\n\ntype ValidationError = {\n message: string;\n details?: Record<string, unknown>;\n};\n\ntype SchemaLike<T> = {\n safeParse: (body: unknown) =>\n | { success: true; data: T }\n | {\n success: false;\n error: { issues: { message: string; path: PropertyKey[] }[] };\n };\n};\n\ntype InspectRoutesOptions = {\n registry: SessionRegistry;\n inspectService?: InspectService;\n extensionBridge?: ExtensionBridge;\n};\n\nconst sendInspectError = (\n res: ResponseLike,\n code: ErrorCode,\n message: string,\n retryable: boolean,\n details?: Record<string, unknown>\n): void => {\n sendError(res, errorStatus(code), {\n code,\n message,\n retryable,\n ...(details ? { details } : {}),\n });\n};\n\ntype TargetHintInput = {\n url?: string;\n title?: string;\n last_active_at?: string;\n lastActiveAt?: string;\n};\n\nconst parseBody = <T>(\n schema: SchemaLike<T>,\n body: unknown\n): { data?: T; error?: ValidationError } => {\n const result = schema.safeParse(body);\n if (result.success) {\n return { data: result.data };\n }\n const issue = result.error.issues[0];\n const details =\n issue && issue.path.length > 0\n ? { field: issue.path.map((part) => part.toString()).join('.') }\n : undefined;\n return {\n error: {\n message: issue?.message ?? 'Request body is invalid.',\n ...(details ? { details } : {}),\n },\n };\n};\n\nconst readTargetHint = (target?: TargetHintInput): TargetHint | undefined => {\n if (!target) {\n return undefined;\n }\n const url = typeof target.url === 'string' ? target.url : undefined;\n const title = typeof target.title === 'string' ? target.title : undefined;\n const lastActiveAtRaw = target.last_active_at ?? target.lastActiveAt;\n const lastActiveAt =\n typeof lastActiveAtRaw === 'string' ? lastActiveAtRaw : undefined;\n if (!url && !title && !lastActiveAt) {\n return undefined;\n }\n return { url, title, lastActiveAt };\n};\n\nconst resolveTargetHint = (\n target: TargetHintInput | undefined,\n options: InspectRoutesOptions\n): TargetHint | undefined => {\n const explicit = readTargetHint(target);\n if (explicit) {\n return explicit;\n }\n const tabs = options.extensionBridge?.getStatus().tabs ?? [];\n return deriveHintFromTabs(tabs);\n};\n\nconst makeHandler =\n <TBody extends { session_id: string }, TResult>(\n schema: SchemaLike<TBody>,\n handler: (body: TBody) => Promise<TResult>\n ) =>\n async (req: RequestLike, res: ResponseLike): Promise<void> => {\n const parsed = parseBody(schema, req.body ?? {});\n if (parsed.error) {\n sendInspectError(\n res,\n 'INVALID_ARGUMENT',\n parsed.error.message,\n false,\n parsed.error.details\n );\n return;\n }\n\n try {\n const result = await handler(parsed.data as TBody);\n sendResult(res, result);\n } catch (err) {\n if (err instanceof InspectError) {\n sendInspectError(\n res,\n err.code,\n err.message,\n err.retryable,\n err.details\n );\n return;\n }\n sendInspectError(res, 'INTERNAL', 'Unexpected inspect error.', false);\n }\n };\n\nexport const registerInspectRoutes = (\n router: RouteRegistry,\n options: InspectRoutesOptions\n): void => {\n const inspect =\n options.inspectService ??\n createInspectService({\n registry: options.registry,\n extensionBridge: options.extensionBridge,\n });\n\n router.post(\n '/inspect/dom_snapshot',\n makeHandler(InspectDomSnapshotInputSchema, async (body) => {\n return await inspect.domSnapshot({\n sessionId: body.session_id,\n format: body.format,\n consistency: body.consistency,\n interactive: body.interactive,\n compact: body.compact,\n maxNodes: body.max_nodes,\n selector: body.selector,\n targetHint: resolveTargetHint(body.target, options),\n });\n })\n );\n router.post(\n '/inspect/dom_diff',\n makeHandler(InspectDomDiffInputSchema, async (body) => {\n return inspect.domDiff({ sessionId: body.session_id });\n })\n );\n router.post(\n '/inspect/find',\n makeHandler(InspectFindInputSchema, async (body) => {\n const targetHint = resolveTargetHint(body.target, options);\n if (body.kind === 'role') {\n return await inspect.find({\n sessionId: body.session_id,\n kind: 'role',\n role: body.role,\n name: body.name,\n targetHint,\n });\n }\n if (body.kind === 'text') {\n return await inspect.find({\n sessionId: body.session_id,\n kind: 'text',\n text: body.text,\n targetHint,\n });\n }\n return await inspect.find({\n sessionId: body.session_id,\n kind: 'label',\n label: body.label,\n targetHint,\n });\n })\n );\n router.post(\n '/inspect/extract_content',\n makeHandler(InspectExtractContentInputSchema, async (body) => {\n return await inspect.extractContent({\n sessionId: body.session_id,\n format: body.format,\n includeMetadata: body.include_metadata,\n targetHint: resolveTargetHint(body.target, options),\n });\n })\n );\n router.post(\n '/inspect/page_state',\n makeHandler(InspectPageStateInputSchema, async (body) => {\n return await inspect.pageState({\n sessionId: body.session_id,\n targetHint: resolveTargetHint(body.target, options),\n });\n })\n );\n router.post(\n '/inspect/console_list',\n makeHandler(InspectConsoleListInputSchema, async (body) => {\n return await inspect.consoleList({\n sessionId: body.session_id,\n targetHint: resolveTargetHint(body.target, options),\n });\n })\n );\n router.post(\n '/inspect/network_har',\n makeHandler(InspectNetworkHarInputSchema, async (body) => {\n return await inspect.networkHar({\n sessionId: body.session_id,\n targetHint: resolveTargetHint(body.target, options),\n });\n })\n );\n router.post(\n '/inspect/evaluate',\n makeHandler(InspectEvaluateInputSchema, async (body) => {\n return await inspect.evaluate({\n sessionId: body.session_id,\n expression: body.expression,\n targetHint: resolveTargetHint(body.target, options),\n });\n })\n );\n router.post(\n '/inspect/performance_metrics',\n makeHandler(InspectPerformanceMetricsInputSchema, async (body) => {\n return await inspect.performanceMetrics({\n sessionId: body.session_id,\n targetHint: resolveTargetHint(body.target, options),\n });\n })\n );\n};\n", "import { SessionState } from './state';\n\nexport type RecoveryAttempt = {\n sessionId: string;\n recovered: boolean;\n state: SessionState;\n message?: string;\n at: string;\n};\n\nexport type RecoveryMetrics = {\n attempts: RecoveryAttempt[];\n successCount: number;\n failureCount: number;\n successRate: number;\n recentFailureCount: number;\n loopDetected: boolean;\n};\n\nexport class RecoveryTracker {\n private readonly attempts: RecoveryAttempt[] = [];\n private successCount = 0;\n private failureCount = 0;\n private readonly maxAttempts = 10;\n private readonly loopWindowMs = 60_000;\n private readonly loopFailureThreshold = 3;\n\n record(attempt: RecoveryAttempt): void {\n this.attempts.push(attempt);\n if (attempt.recovered) {\n this.successCount += 1;\n } else {\n this.failureCount += 1;\n }\n if (this.attempts.length > this.maxAttempts) {\n this.attempts.shift();\n }\n }\n\n getLastAttempt(): RecoveryAttempt | undefined {\n return this.attempts[this.attempts.length - 1];\n }\n\n getAttempts(): RecoveryAttempt[] {\n return [...this.attempts];\n }\n\n getMetrics(now: number = Date.now()): RecoveryMetrics {\n const recentFailureCount = this.attempts.reduce((count, attempt) => {\n if (attempt.recovered) {\n return count;\n }\n const timestamp = Date.parse(attempt.at);\n if (!Number.isFinite(timestamp)) {\n return count;\n }\n return now - timestamp <= this.loopWindowMs ? count + 1 : count;\n }, 0);\n const total = this.successCount + this.failureCount;\n const successRate = total > 0 ? this.successCount / total : 0;\n return {\n attempts: this.getAttempts(),\n successCount: this.successCount,\n failureCount: this.failureCount,\n successRate,\n recentFailureCount,\n loopDetected: recentFailureCount > this.loopFailureThreshold,\n };\n }\n}\n", "import type {\n DebuggerEvent,\n DebuggerEventParams,\n DebuggerResponse,\n DriveErrorInfo,\n} from './drive-protocol';\nimport {\n ExtensionBridge,\n ExtensionBridgeError,\n toDriveError,\n} from './extension-bridge';\n\nexport type DebuggerEventRecord = {\n tab_id: number;\n method: string;\n params?: Record<string, unknown>;\n timestamp: string;\n};\n\nexport type DebuggerResult<T> =\n | { ok: true; result: T }\n | { ok: false; error: DriveErrorInfo };\n\nexport type DebuggerBridgeOptions = {\n extensionBridge: ExtensionBridge;\n consoleBufferSize?: number;\n networkBufferSize?: number;\n idleTimeoutMs?: number;\n};\n\nconst DEFAULT_CONSOLE_BUFFER_SIZE = 200;\nconst DEFAULT_NETWORK_BUFFER_SIZE = 500;\nconst DEFAULT_IDLE_TIMEOUT_MS = 15000;\n\nconst CONSOLE_METHODS = new Set([\n 'Runtime.consoleAPICalled',\n 'Runtime.exceptionThrown',\n 'Log.entryAdded',\n]);\n\nconst isConsoleEvent = (method: string): boolean => {\n if (CONSOLE_METHODS.has(method)) {\n return true;\n }\n return method.startsWith('Runtime.') && method.includes('console');\n};\n\nconst isNetworkEvent = (method: string): boolean =>\n method.startsWith('Network.');\n\nclass RingBuffer<T> {\n private readonly capacity: number;\n private readonly entries: T[] = [];\n\n constructor(capacity: number) {\n this.capacity = Math.max(0, capacity);\n }\n\n push(entry: T): void {\n if (this.capacity <= 0) {\n return;\n }\n if (this.entries.length >= this.capacity) {\n this.entries.shift();\n }\n this.entries.push(entry);\n }\n\n toArray(): T[] {\n return [...this.entries];\n }\n\n clear(): void {\n this.entries.length = 0;\n }\n}\n\ntype DebuggerTabState = {\n attached: boolean;\n lastActivityAt: string;\n idleTimer?: ReturnType<typeof setTimeout>;\n console: RingBuffer<DebuggerEventRecord>;\n network: RingBuffer<DebuggerEventRecord>;\n};\n\nexport class DebuggerBridge {\n private readonly bridge: ExtensionBridge;\n private readonly consoleBufferSize: number;\n private readonly networkBufferSize: number;\n private readonly idleTimeoutMs: number;\n private readonly tabs = new Map<number, DebuggerTabState>();\n private lastError?: DriveErrorInfo;\n private lastErrorAt?: string;\n private readonly unsubscribe: () => void;\n\n constructor(options: DebuggerBridgeOptions) {\n this.bridge = options.extensionBridge;\n this.consoleBufferSize =\n options.consoleBufferSize ?? DEFAULT_CONSOLE_BUFFER_SIZE;\n this.networkBufferSize =\n options.networkBufferSize ?? DEFAULT_NETWORK_BUFFER_SIZE;\n this.idleTimeoutMs = options.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS;\n\n this.unsubscribe = this.bridge.onDebuggerEvent((event) => {\n this.handleDebuggerEvent(event);\n });\n }\n\n getLastError(): { error: DriveErrorInfo; at: string } | undefined {\n if (!this.lastError || !this.lastErrorAt) {\n return undefined;\n }\n return { error: this.lastError, at: this.lastErrorAt };\n }\n\n getSettings(): {\n idleTimeoutMs: number;\n consoleBufferSize: number;\n networkBufferSize: number;\n } {\n return {\n idleTimeoutMs: this.idleTimeoutMs,\n consoleBufferSize: this.consoleBufferSize,\n networkBufferSize: this.networkBufferSize,\n };\n }\n\n hasAttachments(): boolean {\n for (const state of this.tabs.values()) {\n if (state.attached) {\n return true;\n }\n }\n return false;\n }\n\n getConsoleEvents(tabId: number): DebuggerEventRecord[] {\n return this.ensureTab(tabId).console.toArray();\n }\n\n getNetworkEvents(tabId: number): DebuggerEventRecord[] {\n return this.ensureTab(tabId).network.toArray();\n }\n\n clearBuffers(tabId: number): void {\n const state = this.tabs.get(tabId);\n if (!state) {\n return;\n }\n state.console.clear();\n state.network.clear();\n }\n\n async attach(tabId: number): Promise<DebuggerResult<{ attached: boolean }>> {\n const state = this.ensureTab(tabId);\n if (state.attached) {\n this.touch(tabId, state);\n return { ok: true, result: { attached: true } };\n }\n\n try {\n const response = await this.bridge.requestDebugger(\n 'debugger.attach',\n { tab_id: tabId },\n this.idleTimeoutMs\n );\n\n if (response.status === 'error') {\n const error =\n response.error ??\n ({\n code: 'INSPECT_UNAVAILABLE',\n message: 'Debugger attach failed.',\n retryable: false,\n } as DriveErrorInfo);\n this.recordError(error);\n return { ok: false, error };\n }\n\n state.attached = true;\n this.touch(tabId, state);\n return { ok: true, result: { attached: true } };\n } catch (error) {\n const info = this.handleBridgeError(error);\n return { ok: false, error: info };\n }\n }\n\n async detach(tabId: number): Promise<DebuggerResult<{ attached: boolean }>> {\n const state = this.tabs.get(tabId);\n if (!state || !state.attached) {\n return { ok: true, result: { attached: false } };\n }\n\n try {\n const response = await this.bridge.requestDebugger(\n 'debugger.detach',\n { tab_id: tabId },\n this.idleTimeoutMs\n );\n\n if (response.status === 'error') {\n const error =\n response.error ??\n ({\n code: 'INSPECT_UNAVAILABLE',\n message: 'Debugger detach failed.',\n retryable: false,\n } as DriveErrorInfo);\n this.recordError(error);\n return { ok: false, error };\n }\n\n this.markDetached(tabId);\n return { ok: true, result: { attached: false } };\n } catch (error) {\n const info = this.handleBridgeError(error);\n this.markDetached(tabId);\n return { ok: false, error: info };\n }\n }\n\n async command<T = unknown>(\n tabId: number,\n method: string,\n params?: Record<string, unknown>,\n timeoutMs = 10000\n ): Promise<DebuggerResult<T>> {\n const attachResult = await this.attach(tabId);\n if (!attachResult.ok) {\n return attachResult as DebuggerResult<T>;\n }\n\n try {\n const response: DebuggerResponse<T> = await this.bridge.requestDebugger(\n 'debugger.command',\n {\n tab_id: tabId,\n method,\n params,\n },\n timeoutMs\n );\n\n if (response.status === 'error') {\n const error =\n response.error ??\n ({\n code: 'INSPECT_UNAVAILABLE',\n message: 'Debugger command failed.',\n retryable: false,\n } as DriveErrorInfo);\n this.recordError(error);\n return { ok: false, error };\n }\n\n this.touch(tabId, this.ensureTab(tabId));\n return { ok: true, result: response.result as T };\n } catch (error) {\n const info = this.handleBridgeError(error);\n return { ok: false, error: info };\n }\n }\n\n shutdown(): void {\n this.unsubscribe();\n for (const [tabId, state] of this.tabs) {\n if (state.idleTimer) {\n clearTimeout(state.idleTimer);\n }\n this.tabs.delete(tabId);\n }\n }\n\n private handleDebuggerEvent(event: DebuggerEvent): void {\n if (event.action !== 'debugger.event') {\n return;\n }\n\n const params = event.params as DebuggerEventParams | undefined;\n if (!params || typeof params.tab_id !== 'number') {\n return;\n }\n\n const record: DebuggerEventRecord = {\n tab_id: params.tab_id,\n method: params.method,\n params: params.params as Record<string, unknown> | undefined,\n timestamp: params.timestamp ?? new Date().toISOString(),\n };\n\n const state = this.ensureTab(params.tab_id);\n\n if (record.method === 'Debugger.detached') {\n this.markDetached(params.tab_id);\n return;\n }\n\n if (isConsoleEvent(record.method)) {\n state.console.push(record);\n } else if (isNetworkEvent(record.method)) {\n state.network.push(record);\n }\n\n this.touch(params.tab_id, state);\n }\n\n private ensureTab(tabId: number): DebuggerTabState {\n const existing = this.tabs.get(tabId);\n if (existing) {\n return existing;\n }\n const now = new Date().toISOString();\n const state: DebuggerTabState = {\n attached: false,\n lastActivityAt: now,\n console: new RingBuffer<DebuggerEventRecord>(this.consoleBufferSize),\n network: new RingBuffer<DebuggerEventRecord>(this.networkBufferSize),\n };\n this.tabs.set(tabId, state);\n return state;\n }\n\n private touch(tabId: number, state: DebuggerTabState): void {\n state.lastActivityAt = new Date().toISOString();\n this.scheduleIdleDetach(tabId, state);\n }\n\n private scheduleIdleDetach(tabId: number, state: DebuggerTabState): void {\n if (state.idleTimer) {\n clearTimeout(state.idleTimer);\n }\n state.idleTimer = setTimeout(() => {\n void this.detach(tabId).catch((error) => {\n console.error('DebuggerBridge idle detach failed:', error);\n });\n }, this.idleTimeoutMs);\n }\n\n private markDetached(tabId: number): void {\n const state = this.tabs.get(tabId);\n if (!state) {\n return;\n }\n state.attached = false;\n if (state.idleTimer) {\n clearTimeout(state.idleTimer);\n state.idleTimer = undefined;\n }\n }\n\n private recordError(error: DriveErrorInfo): void {\n this.lastError = error;\n this.lastErrorAt = new Date().toISOString();\n }\n\n private handleBridgeError(error: unknown): DriveErrorInfo {\n if (error instanceof ExtensionBridgeError) {\n const info = toDriveError(error);\n this.recordError(info);\n return info;\n }\n\n const info: DriveErrorInfo = {\n code: 'INSPECT_UNAVAILABLE',\n message:\n error instanceof Error ? error.message : 'Debugger request failed.',\n retryable: false,\n };\n this.recordError(info);\n return info;\n }\n}\n", "import { ApiEnvelope } from '@btraut/browser-bridge-shared';\n\ntype FetchLike = typeof fetch;\n\nexport type CoreClientOptions = {\n host?: string;\n port?: number | string;\n timeoutMs?: number;\n fetchImpl?: FetchLike;\n};\n\nexport type CoreClient = {\n baseUrl: string;\n post: <T>(path: string, body?: unknown) => Promise<ApiEnvelope<T>>;\n};\n\nconst DEFAULT_HOST = '127.0.0.1';\nconst DEFAULT_PORT = 3210;\nconst DEFAULT_TIMEOUT_MS = 4000;\n\nconst resolveHost = (host?: string): string => {\n const candidate =\n host?.trim() ||\n process.env.BROWSER_BRIDGE_CORE_HOST ||\n process.env.BROWSER_VISION_CORE_HOST;\n if (candidate && candidate.length > 0) {\n return candidate;\n }\n return DEFAULT_HOST;\n};\n\nconst resolvePort = (port?: number | string): number => {\n const candidate =\n port ??\n (process.env.BROWSER_BRIDGE_CORE_PORT\n ? Number.parseInt(process.env.BROWSER_BRIDGE_CORE_PORT, 10)\n : process.env.BROWSER_VISION_CORE_PORT\n ? Number.parseInt(process.env.BROWSER_VISION_CORE_PORT, 10)\n : undefined);\n\n if (candidate === undefined || candidate === null) {\n return DEFAULT_PORT;\n }\n\n const parsed =\n typeof candidate === 'number' ? candidate : Number.parseInt(candidate, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`Invalid port: ${String(candidate)}`);\n }\n\n return parsed;\n};\n\nconst normalizePath = (path: string): string =>\n path.startsWith('/') ? path : `/${path}`;\n\nexport const createCoreClient = (\n options: CoreClientOptions = {}\n): CoreClient => {\n const host = resolveHost(options.host);\n const port = resolvePort(options.port);\n const baseUrl = `http://${host}:${port}`;\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const fetchImpl = options.fetchImpl ?? fetch;\n\n const requestJson = async <T>(path: string, body?: unknown): Promise<T> => {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const response = await fetchImpl(`${baseUrl}${normalizePath(path)}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n },\n body: body === undefined ? undefined : JSON.stringify(body),\n signal: controller.signal,\n });\n\n const raw = await response.text();\n if (!raw) {\n throw new Error(`Empty response from Core (${response.status}).`);\n }\n\n try {\n return JSON.parse(raw) as T;\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown JSON parse error';\n throw new Error(`Failed to parse Core response: ${message}`);\n }\n } finally {\n clearTimeout(timeout);\n }\n };\n\n const post = async <T>(\n path: string,\n body?: unknown\n ): Promise<ApiEnvelope<T>> => {\n return requestJson<ApiEnvelope<T>>(path, body);\n };\n\n return { baseUrl, post };\n};\n", "import {\n apiEnvelopeSchema,\n ArtifactsScreenshotInputSchema,\n ArtifactsScreenshotOutputSchema,\n DiagnosticsDoctorInputSchema,\n DiagnosticsDoctorOutputSchema,\n DialogAcceptInputSchema,\n DialogAcceptOutputSchema,\n DialogDismissInputSchema,\n DialogDismissOutputSchema,\n HealthCheckInputSchema,\n HealthCheckOutputSchema,\n ErrorEnvelopeSchema,\n DriveClickInputSchema,\n DriveClickOutputSchema,\n DriveDragInputSchema,\n DriveDragOutputSchema,\n DriveFillFormInputSchema,\n DriveFillFormOutputSchema,\n DriveBackInputSchema,\n DriveBackOutputSchema,\n DriveForwardInputSchema,\n DriveForwardOutputSchema,\n DriveGoBackInputSchema,\n DriveGoBackOutputSchema,\n DriveGoForwardInputSchema,\n DriveGoForwardOutputSchema,\n DriveHandleDialogInputSchema,\n DriveHandleDialogOutputSchema,\n DriveHoverInputSchema,\n DriveHoverOutputSchema,\n DriveSelectInputSchema,\n DriveSelectOutputSchema,\n DriveKeyInputSchema,\n DriveKeyOutputSchema,\n DriveKeyPressInputSchema,\n DriveKeyPressOutputSchema,\n DriveNavigateInputSchema,\n DriveNavigateOutputSchema,\n DriveScrollInputSchema,\n DriveScrollOutputSchema,\n DriveTabActivateInputSchema,\n DriveTabActivateOutputSchema,\n DriveTabCloseInputSchema,\n DriveTabCloseOutputSchema,\n DriveTabListInputSchema,\n DriveTabListOutputSchema,\n DriveTypeInputSchema,\n DriveTypeOutputSchema,\n DriveWaitForInputSchema,\n DriveWaitForOutputSchema,\n InspectConsoleListInputSchema,\n InspectConsoleListOutputSchema,\n InspectDomDiffInputSchema,\n InspectDomDiffOutputSchema,\n InspectExtractContentInputSchema,\n InspectExtractContentOutputSchema,\n InspectDomSnapshotInputSchema,\n InspectDomSnapshotOutputSchema,\n InspectEvaluateInputSchema,\n InspectEvaluateOutputSchema,\n InspectFindInputSchema,\n InspectFindOutputSchema,\n InspectPageStateInputSchema,\n InspectPageStateOutputSchema,\n InspectNetworkHarInputSchema,\n InspectNetworkHarOutputSchema,\n InspectPerformanceMetricsInputSchema,\n InspectPerformanceMetricsOutputSchema,\n SessionCloseInputSchema,\n SessionCloseOutputSchema,\n SessionCreateInputSchema,\n SessionCreateOutputSchema,\n SessionRecoverInputSchema,\n SessionRecoverOutputSchema,\n SessionStatusInputSchema,\n SessionStatusOutputSchema,\n} from '@btraut/browser-bridge-shared';\nimport type {\n AnySchema,\n ZodRawShapeCompat,\n} from '@modelcontextprotocol/sdk/server/zod-compat';\nimport type {\n McpServer,\n ToolCallback,\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types';\nimport { CoreClient } from './core-client';\n\ntype ToolResult = CallToolResult;\n\ntype ToolConfig = {\n title: string;\n description: string;\n inputSchema: AnySchema | ZodRawShapeCompat;\n outputSchema: AnySchema | ZodRawShapeCompat;\n corePath: string;\n};\n\ntype ToolRegistrar = Pick<McpServer, 'registerTool'>;\n\ntype EnvelopeInput = Parameters<typeof apiEnvelopeSchema>[0];\n\nconst toToolResult = (payload: unknown): ToolResult => {\n const content = [{ type: 'text' as const, text: JSON.stringify(payload) }];\n if (payload && typeof payload === 'object') {\n return {\n content,\n structuredContent: payload as Record<string, unknown>,\n };\n }\n return { content };\n};\n\nconst toInternalErrorEnvelope = (error: unknown) => ({\n ok: false as const,\n error: {\n code: 'INTERNAL' as const,\n message: error instanceof Error ? error.message : 'Unknown error.',\n retryable: false,\n },\n});\n\nconst envelope = (schema: EnvelopeInput) => apiEnvelopeSchema(schema);\n\nexport const TOOL_DEFINITIONS: Array<{ name: string; config: ToolConfig }> = [\n {\n name: 'session.create',\n config: {\n title: 'Session Create',\n description: 'Create a new browser session.',\n inputSchema: SessionCreateInputSchema,\n outputSchema: envelope(SessionCreateOutputSchema),\n corePath: '/session/create',\n },\n },\n {\n name: 'session.status',\n config: {\n title: 'Session Status',\n description: 'Fetch session status.',\n inputSchema: SessionStatusInputSchema,\n outputSchema: envelope(SessionStatusOutputSchema),\n corePath: '/session/status',\n },\n },\n {\n name: 'session.recover',\n config: {\n title: 'Session Recover',\n description: 'Recover a session after errors.',\n inputSchema: SessionRecoverInputSchema,\n outputSchema: envelope(SessionRecoverOutputSchema),\n corePath: '/session/recover',\n },\n },\n {\n name: 'session.close',\n config: {\n title: 'Session Close',\n description: 'Close a session.',\n inputSchema: SessionCloseInputSchema,\n outputSchema: envelope(SessionCloseOutputSchema),\n corePath: '/session/close',\n },\n },\n {\n name: 'drive.navigate',\n config: {\n title: 'Drive Navigate',\n description: 'Navigate to a URL.',\n inputSchema: DriveNavigateInputSchema,\n outputSchema: envelope(DriveNavigateOutputSchema),\n corePath: '/drive/navigate',\n },\n },\n {\n name: 'drive.go_back',\n config: {\n title: 'Drive Go Back',\n description: 'Go back in browser history.',\n inputSchema: DriveGoBackInputSchema,\n outputSchema: envelope(DriveGoBackOutputSchema),\n corePath: '/drive/go_back',\n },\n },\n {\n name: 'drive.go_forward',\n config: {\n title: 'Drive Go Forward',\n description: 'Go forward in browser history.',\n inputSchema: DriveGoForwardInputSchema,\n outputSchema: envelope(DriveGoForwardOutputSchema),\n corePath: '/drive/go_forward',\n },\n },\n {\n name: 'drive.back',\n config: {\n title: 'Drive Back',\n description: 'Go back in browser history.',\n inputSchema: DriveBackInputSchema,\n outputSchema: envelope(DriveBackOutputSchema),\n corePath: '/drive/back',\n },\n },\n {\n name: 'drive.forward',\n config: {\n title: 'Drive Forward',\n description: 'Go forward in browser history.',\n inputSchema: DriveForwardInputSchema,\n outputSchema: envelope(DriveForwardOutputSchema),\n corePath: '/drive/forward',\n },\n },\n {\n name: 'drive.click',\n config: {\n title: 'Drive Click',\n description: 'Click an element.',\n inputSchema: DriveClickInputSchema,\n outputSchema: envelope(DriveClickOutputSchema),\n corePath: '/drive/click',\n },\n },\n {\n name: 'drive.hover',\n config: {\n title: 'Drive Hover',\n description: 'Hover over an element.',\n inputSchema: DriveHoverInputSchema,\n outputSchema: envelope(DriveHoverOutputSchema),\n corePath: '/drive/hover',\n },\n },\n {\n name: 'drive.select',\n config: {\n title: 'Drive Select',\n description: 'Select an option in a dropdown.',\n inputSchema: DriveSelectInputSchema,\n outputSchema: envelope(DriveSelectOutputSchema),\n corePath: '/drive/select',\n },\n },\n {\n name: 'drive.type',\n config: {\n title: 'Drive Type',\n description: 'Type into an element.',\n inputSchema: DriveTypeInputSchema,\n outputSchema: envelope(DriveTypeOutputSchema),\n corePath: '/drive/type',\n },\n },\n {\n name: 'drive.fill_form',\n config: {\n title: 'Drive Fill Form',\n description: 'Fill multiple form fields.',\n inputSchema: DriveFillFormInputSchema,\n outputSchema: envelope(DriveFillFormOutputSchema),\n corePath: '/drive/fill_form',\n },\n },\n {\n name: 'drive.drag',\n config: {\n title: 'Drive Drag',\n description: 'Drag an element to a target.',\n inputSchema: DriveDragInputSchema,\n outputSchema: envelope(DriveDragOutputSchema),\n corePath: '/drive/drag',\n },\n },\n {\n name: 'drive.handle_dialog',\n config: {\n title: 'Drive Handle Dialog',\n description: 'Handle a JavaScript dialog.',\n inputSchema: DriveHandleDialogInputSchema,\n outputSchema: envelope(DriveHandleDialogOutputSchema),\n corePath: '/drive/handle_dialog',\n },\n },\n {\n name: 'dialog.accept',\n config: {\n title: 'Dialog Accept',\n description: 'Accept a JavaScript dialog.',\n inputSchema: DialogAcceptInputSchema,\n outputSchema: envelope(DialogAcceptOutputSchema),\n corePath: '/dialog/accept',\n },\n },\n {\n name: 'dialog.dismiss',\n config: {\n title: 'Dialog Dismiss',\n description: 'Dismiss a JavaScript dialog.',\n inputSchema: DialogDismissInputSchema,\n outputSchema: envelope(DialogDismissOutputSchema),\n corePath: '/dialog/dismiss',\n },\n },\n {\n name: 'drive.key',\n config: {\n title: 'Drive Key',\n description: 'Press a keyboard key.',\n inputSchema: DriveKeyInputSchema,\n outputSchema: envelope(DriveKeyOutputSchema),\n corePath: '/drive/key',\n },\n },\n {\n name: 'drive.key_press',\n config: {\n title: 'Drive Key Press',\n description: 'Press a key on the active element.',\n inputSchema: DriveKeyPressInputSchema,\n outputSchema: envelope(DriveKeyPressOutputSchema),\n corePath: '/drive/key_press',\n },\n },\n {\n name: 'drive.scroll',\n config: {\n title: 'Drive Scroll',\n description: 'Scroll the active tab.',\n inputSchema: DriveScrollInputSchema,\n outputSchema: envelope(DriveScrollOutputSchema),\n corePath: '/drive/scroll',\n },\n },\n {\n name: 'drive.wait_for',\n config: {\n title: 'Drive Wait For',\n description: 'Wait for a drive condition.',\n inputSchema: DriveWaitForInputSchema,\n outputSchema: envelope(DriveWaitForOutputSchema),\n corePath: '/drive/wait_for',\n },\n },\n {\n name: 'drive.tab_list',\n config: {\n title: 'Drive Tab List',\n description: 'List browser tabs.',\n inputSchema: DriveTabListInputSchema,\n outputSchema: envelope(DriveTabListOutputSchema),\n corePath: '/drive/tab_list',\n },\n },\n {\n name: 'drive.tab_activate',\n config: {\n title: 'Drive Tab Activate',\n description: 'Activate a browser tab.',\n inputSchema: DriveTabActivateInputSchema,\n outputSchema: envelope(DriveTabActivateOutputSchema),\n corePath: '/drive/tab_activate',\n },\n },\n {\n name: 'drive.tab_close',\n config: {\n title: 'Drive Tab Close',\n description: 'Close a browser tab.',\n inputSchema: DriveTabCloseInputSchema,\n outputSchema: envelope(DriveTabCloseOutputSchema),\n corePath: '/drive/tab_close',\n },\n },\n {\n name: 'inspect.dom_snapshot',\n config: {\n title: 'Inspect DOM Snapshot',\n description: 'Capture a DOM snapshot.',\n inputSchema: InspectDomSnapshotInputSchema,\n outputSchema: envelope(InspectDomSnapshotOutputSchema),\n corePath: '/inspect/dom_snapshot',\n },\n },\n {\n name: 'inspect.dom_diff',\n config: {\n title: 'Inspect DOM Diff',\n description: 'Compare recent DOM snapshots.',\n inputSchema: InspectDomDiffInputSchema,\n outputSchema: envelope(InspectDomDiffOutputSchema),\n corePath: '/inspect/dom_diff',\n },\n },\n {\n name: 'inspect.find',\n config: {\n title: 'Inspect Find',\n description: 'Find elements in the accessibility tree and return refs.',\n inputSchema: InspectFindInputSchema,\n outputSchema: envelope(InspectFindOutputSchema),\n corePath: '/inspect/find',\n },\n },\n {\n name: 'inspect.extract_content',\n config: {\n title: 'Inspect Extract Content',\n description: 'Extract main content as markdown or text.',\n inputSchema: InspectExtractContentInputSchema,\n outputSchema: envelope(InspectExtractContentOutputSchema),\n corePath: '/inspect/extract_content',\n },\n },\n {\n name: 'inspect.page_state',\n config: {\n title: 'Inspect Page State',\n description: 'Capture form, storage, and cookie state.',\n inputSchema: InspectPageStateInputSchema,\n outputSchema: envelope(InspectPageStateOutputSchema),\n corePath: '/inspect/page_state',\n },\n },\n {\n name: 'inspect.console_list',\n config: {\n title: 'Inspect Console List',\n description: 'List console entries.',\n inputSchema: InspectConsoleListInputSchema,\n outputSchema: envelope(InspectConsoleListOutputSchema),\n corePath: '/inspect/console_list',\n },\n },\n {\n name: 'inspect.network_har',\n config: {\n title: 'Inspect Network HAR',\n description: 'Capture network HAR data.',\n inputSchema: InspectNetworkHarInputSchema,\n outputSchema: envelope(InspectNetworkHarOutputSchema),\n corePath: '/inspect/network_har',\n },\n },\n {\n name: 'inspect.evaluate',\n config: {\n title: 'Inspect Evaluate',\n description: 'Evaluate an expression in the target.',\n inputSchema: InspectEvaluateInputSchema,\n outputSchema: envelope(InspectEvaluateOutputSchema),\n corePath: '/inspect/evaluate',\n },\n },\n {\n name: 'inspect.performance_metrics',\n config: {\n title: 'Inspect Performance Metrics',\n description: 'Collect performance metrics.',\n inputSchema: InspectPerformanceMetricsInputSchema,\n outputSchema: envelope(InspectPerformanceMetricsOutputSchema),\n corePath: '/inspect/performance_metrics',\n },\n },\n {\n name: 'artifacts.screenshot',\n config: {\n title: 'Artifacts Screenshot',\n description: 'Capture a screenshot artifact.',\n inputSchema: ArtifactsScreenshotInputSchema,\n outputSchema: envelope(ArtifactsScreenshotOutputSchema),\n corePath: '/artifacts/screenshot',\n },\n },\n {\n name: 'health_check',\n config: {\n title: 'Health Check',\n description:\n 'Check server health including uptime, memory usage, active session count, and extension connection status.',\n inputSchema: HealthCheckInputSchema,\n outputSchema: envelope(HealthCheckOutputSchema),\n corePath: '/health_check',\n },\n },\n {\n name: 'diagnostics.doctor',\n config: {\n title: 'Diagnostics Doctor',\n description: 'Run diagnostics checks.',\n inputSchema: DiagnosticsDoctorInputSchema,\n outputSchema: envelope(DiagnosticsDoctorOutputSchema),\n corePath: '/diagnostics/doctor',\n },\n },\n];\n\nexport const createToolHandler = (\n client: CoreClient,\n corePath: string\n): ToolCallback<AnySchema> => {\n return (async (args: unknown, _extra: unknown): Promise<ToolResult> => {\n void _extra;\n try {\n const envelopeResult = await client.post(corePath, args);\n return toToolResult(envelopeResult);\n } catch (error) {\n const parsed = ErrorEnvelopeSchema.safeParse(error);\n if (parsed.success) {\n return toToolResult(parsed.data);\n }\n return toToolResult(toInternalErrorEnvelope(error));\n }\n }) as ToolCallback<AnySchema>;\n};\n\nexport const registerBrowserBridgeTools = (\n server: ToolRegistrar,\n client: CoreClient\n): void => {\n for (const tool of TOOL_DEFINITIONS) {\n server.registerTool(\n tool.name,\n {\n title: tool.config.title,\n description: tool.config.description,\n inputSchema: tool.config.inputSchema,\n outputSchema: tool.config.outputSchema,\n },\n createToolHandler(client, tool.config.corePath)\n );\n }\n};\n", "import { createServer } from 'node:http';\nimport type { IncomingMessage } from 'node:http';\nimport { randomUUID } from 'node:crypto';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';\nimport { CoreClient, CoreClientOptions, createCoreClient } from './core-client';\nimport { registerBrowserBridgeTools } from './tools';\n\nexport type McpAdapterOptions = CoreClientOptions & {\n name?: string;\n version?: string;\n coreClient?: CoreClient;\n};\n\nexport type McpAdapterHandle = {\n server: McpServer;\n client: CoreClient;\n};\n\nexport type McpAdapterStartHandle = McpAdapterHandle & {\n transport: StdioServerTransport;\n};\n\nexport type McpAdapterHttpOptions = {\n host?: string;\n port?: number;\n path?: string;\n};\n\nexport type McpAdapterHttpStartHandle = {\n client: CoreClient;\n host: string;\n port: number;\n path: string;\n close: () => Promise<void>;\n};\n\nconst DEFAULT_SERVER_NAME = 'browser-bridge';\nconst DEFAULT_SERVER_VERSION = '0.0.0';\nconst DEFAULT_HTTP_HOST = '127.0.0.1';\nconst DEFAULT_HTTP_PATH = '/mcp';\n\nexport const createMcpServer = (\n options: McpAdapterOptions = {}\n): McpAdapterHandle => {\n const server = new McpServer({\n name: options.name ?? DEFAULT_SERVER_NAME,\n version: options.version ?? DEFAULT_SERVER_VERSION,\n });\n const client = options.coreClient ?? createCoreClient(options);\n\n registerBrowserBridgeTools(server, client);\n\n return { server, client };\n};\n\nexport const startMcpServer = async (\n options: McpAdapterOptions = {}\n): Promise<McpAdapterStartHandle> => {\n const handle = createMcpServer(options);\n const transport = new StdioServerTransport();\n await handle.server.connect(transport);\n return { ...handle, transport };\n};\n\nconst readJsonBody = async (\n req: IncomingMessage,\n maxBytes = 5 * 1024 * 1024\n): Promise<unknown> => {\n const chunks: Buffer[] = [];\n let total = 0;\n await new Promise<void>((resolve, reject) => {\n req.on('data', (chunk: Buffer) => {\n total += chunk.length;\n if (total > maxBytes) {\n reject(new Error('Request body too large.'));\n req.destroy();\n return;\n }\n chunks.push(chunk);\n });\n req.on('end', () => resolve());\n req.on('error', (err: unknown) => reject(err));\n });\n const raw = Buffer.concat(chunks).toString('utf8');\n if (!raw) {\n return undefined;\n }\n return JSON.parse(raw) as unknown;\n};\n\nconst getHeaderValue = (\n value: string | string[] | undefined\n): string | undefined => {\n if (typeof value === 'string') {\n return value;\n }\n if (Array.isArray(value)) {\n return value[0];\n }\n return undefined;\n};\n\nexport const startMcpHttpServer = async (\n options: McpAdapterOptions & McpAdapterHttpOptions = {}\n): Promise<McpAdapterHttpStartHandle> => {\n const host = options.host ?? DEFAULT_HTTP_HOST;\n const port = typeof options.port === 'number' ? options.port : 0;\n const path = options.path ?? DEFAULT_HTTP_PATH;\n\n const client = options.coreClient ?? createCoreClient(options);\n\n const sessions = new Map<\n string,\n {\n transport: StreamableHTTPServerTransport;\n server: McpServer;\n }\n >();\n\n const closeAllSessions = async (): Promise<void> => {\n const entries = Array.from(sessions.values());\n sessions.clear();\n await Promise.all(\n entries.map(async (entry) => {\n try {\n await entry.transport.close();\n } catch {\n // Ignore.\n }\n try {\n await entry.server.close();\n } catch {\n // Ignore.\n }\n })\n );\n };\n\n const httpServer = createServer(async (req, res) => {\n try {\n const url = new URL(req.url ?? '', `http://${host}`);\n if (url.pathname !== path) {\n res.writeHead(404, { 'content-type': 'application/json' });\n res.end(JSON.stringify({ error: 'Not Found' }));\n return;\n }\n\n const sessionId = getHeaderValue(req.headers['mcp-session-id']);\n\n const parsedBody =\n req.method === 'POST' ? await readJsonBody(req) : undefined;\n\n if (sessionId) {\n const entry = sessions.get(sessionId);\n if (!entry) {\n res.writeHead(404, { 'content-type': 'application/json' });\n res.end(JSON.stringify({ error: 'Unknown session.' }));\n return;\n }\n await entry.transport.handleRequest(req, res, parsedBody);\n return;\n }\n\n if (req.method !== 'POST' || !isInitializeRequest(parsedBody)) {\n res.writeHead(400, { 'content-type': 'application/json' });\n res.end(\n JSON.stringify({\n error:\n 'Missing mcp-session-id header. First request must be initialize.',\n })\n );\n return;\n }\n\n let sessionEntry:\n | {\n transport: StreamableHTTPServerTransport;\n server: McpServer;\n }\n | undefined;\n\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (sid) => {\n if (sessionEntry) {\n sessions.set(sid, sessionEntry);\n }\n },\n onsessionclosed: async (sid) => {\n const entry = sessions.get(sid);\n sessions.delete(sid);\n if (!entry) {\n return;\n }\n await Promise.allSettled([\n entry.transport.close(),\n entry.server.close(),\n ]);\n },\n });\n\n const sessionServer = new McpServer({\n name: options.name ?? DEFAULT_SERVER_NAME,\n version: options.version ?? DEFAULT_SERVER_VERSION,\n });\n registerBrowserBridgeTools(sessionServer, client);\n await sessionServer.connect(transport);\n sessionEntry = { transport, server: sessionServer };\n\n await transport.handleRequest(req, res, parsedBody);\n } catch (error) {\n res.writeHead(500, { 'content-type': 'application/json' });\n res.end(\n JSON.stringify({\n error: error instanceof Error ? error.message : 'Internal error.',\n })\n );\n }\n });\n\n const resolvedPort = await new Promise<number>((resolve, reject) => {\n httpServer.listen(port, host, () => {\n const address = httpServer.address();\n resolve(typeof address === 'object' && address ? address.port : port);\n });\n httpServer.on('error', reject);\n });\n\n return {\n client,\n host,\n port: resolvedPort,\n path,\n close: async () => {\n await new Promise<void>((resolve, reject) => {\n httpServer.close((err) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n await closeAllSessions();\n },\n };\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["export { startCoreServer } from '@btraut/browser-bridge-core';\nexport { startMcpServer } from '@btraut/browser-bridge-mcp-adapter';\n", "import { createServer } from 'http';\nimport express, { Express } from 'express';\nimport { createSessionRouter } from './routes/session';\nimport { registerArtifactsRoutes } from './routes/artifacts';\nimport { registerDiagnosticsRoutes } from './routes/diagnostics';\nimport { registerDriveRoutes, registerInspectRoutes } from './routes';\nimport { SessionRegistry } from './session';\nimport { ExtensionBridge } from './extension-bridge';\nimport { DriveController } from './drive';\nimport { InspectService, createInspectService } from './inspect';\nimport { RecoveryTracker } from './recovery';\nimport { DebuggerBridge } from './debugger-bridge';\n\nexport type CoreServer = {\n app: Express;\n registry: SessionRegistry;\n extensionBridge: ExtensionBridge;\n debuggerBridge: DebuggerBridge;\n drive: DriveController;\n inspect: InspectService;\n recoveryTracker: RecoveryTracker;\n};\n\nexport type CoreServerOptions = {\n registry?: SessionRegistry;\n};\n\nexport const createCoreServer = (\n options: CoreServerOptions = {}\n): CoreServer => {\n const app = express();\n const registry = options.registry ?? new SessionRegistry();\n const extensionBridge = new ExtensionBridge({ registry });\n const debuggerBridge = new DebuggerBridge({ extensionBridge });\n const drive = new DriveController(extensionBridge, registry);\n const inspect = createInspectService({\n registry,\n debuggerBridge,\n extensionBridge,\n });\n const recoveryTracker = new RecoveryTracker();\n\n app.use(express.json({ limit: '1mb' }));\n\n app.get('/health', (_req, res) => {\n res.status(200).json({ ok: true });\n });\n\n app.use(\n '/session',\n createSessionRouter(registry, {\n driveConnected: () => extensionBridge.isConnected(),\n inspectRecover: (sessionId) => inspect.reconnect(sessionId),\n recordRecovery: (attempt) => recoveryTracker.record(attempt),\n })\n );\n\n registerDriveRoutes(app, { drive });\n registerInspectRoutes(app, {\n registry,\n extensionBridge,\n inspectService: inspect,\n });\n registerArtifactsRoutes(app, {\n registry,\n extensionBridge,\n inspectService: inspect,\n });\n registerDiagnosticsRoutes(app, {\n registry,\n extensionBridge,\n debuggerBridge,\n drive,\n inspectService: inspect,\n recoveryTracker,\n });\n\n return {\n app,\n registry,\n extensionBridge,\n debuggerBridge,\n drive,\n inspect,\n recoveryTracker,\n };\n};\n\nexport type CoreServerStartOptions = {\n host?: string;\n port?: number;\n registry?: SessionRegistry;\n};\n\nexport type CoreServerHandle = {\n app: Express;\n registry: SessionRegistry;\n server: ReturnType<typeof createServer>;\n host: string;\n port: number;\n};\n\nconst resolveCorePort = (portOverride?: number): number => {\n if (portOverride !== undefined) {\n return portOverride;\n }\n const env =\n process.env.BROWSER_BRIDGE_CORE_PORT ||\n process.env.BROWSER_VISION_CORE_PORT;\n if (env) {\n const parsed = Number(env);\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed;\n }\n }\n return 3210;\n};\n\nconst resolveSessionTtlMs = (): number => {\n const env =\n process.env.BROWSER_BRIDGE_SESSION_TTL_MS ||\n process.env.BROWSER_VISION_SESSION_TTL_MS;\n if (env) {\n const parsed = Number(env);\n if (Number.isFinite(parsed) && parsed >= 0) {\n return parsed;\n }\n }\n return 60 * 60 * 1000;\n};\n\nconst resolveSessionCleanupIntervalMs = (ttlMs: number): number => {\n const env =\n process.env.BROWSER_BRIDGE_SESSION_CLEANUP_INTERVAL_MS ||\n process.env.BROWSER_VISION_SESSION_CLEANUP_INTERVAL_MS;\n if (env) {\n const parsed = Number(env);\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed;\n }\n }\n if (!Number.isFinite(ttlMs) || ttlMs <= 0) {\n return 60 * 1000;\n }\n return Math.min(60 * 1000, Math.max(1000, Math.floor(ttlMs / 2)));\n};\n\nexport const startCoreServer = (\n options: CoreServerStartOptions = {}\n): Promise<CoreServerHandle> => {\n const host = options.host ?? '127.0.0.1';\n const port = resolveCorePort(options.port);\n const { app, registry, extensionBridge } = createCoreServer({\n registry: options.registry,\n });\n\n return new Promise((resolve, reject) => {\n const server = createServer(app);\n extensionBridge.attach(server);\n server.listen(port, host, () => {\n const address = server.address();\n const resolvedPort =\n typeof address === 'object' && address !== null ? address.port : port;\n\n const ttlMs = resolveSessionTtlMs();\n if (ttlMs > 0) {\n const intervalMs = resolveSessionCleanupIntervalMs(ttlMs);\n const timer = setInterval(() => {\n try {\n registry.cleanupIdleSessions(ttlMs);\n } catch (error) {\n console.warn('Session cleanup failed:', error);\n }\n }, intervalMs);\n timer.unref();\n server.on('close', () => clearInterval(timer));\n }\n\n resolve({ app, registry, server, host, port: resolvedPort });\n });\n\n server.on('error', (error) => {\n reject(error);\n });\n });\n};\n", "import { Router } from 'express';\nimport { InvalidSessionTransition, SessionState } from '../state';\nimport { SessionError, SessionRegistry } from '../session';\nimport { isRecord, sendError, sendResult } from './shared';\n\nconst readSessionId = (body: unknown): string | undefined => {\n if (!isRecord(body)) {\n return undefined;\n }\n\n const sessionId = body.session_id;\n if (typeof sessionId !== 'string' || sessionId.length === 0) {\n return undefined;\n }\n\n return sessionId;\n};\n\ntype SessionRouterOptions = {\n driveConnected?: () => boolean;\n inspectRecover?: (sessionId: string) => Promise<boolean>;\n recordRecovery?: (attempt: {\n sessionId: string;\n recovered: boolean;\n state: SessionState;\n message?: string;\n at: string;\n }) => void;\n};\n\nexport const createSessionRouter = (\n registry: SessionRegistry,\n options: SessionRouterOptions = {}\n): Router => {\n const router = Router();\n\n router.post('/create', (req, res) => {\n const body = req.body;\n if (body !== undefined) {\n if (!isRecord(body)) {\n return sendError(res, 400, {\n code: 'INVALID_ARGUMENT',\n message: 'Request body must be an object.',\n retryable: false,\n });\n }\n if (Object.keys(body).length > 0) {\n return sendError(res, 400, {\n code: 'INVALID_ARGUMENT',\n message: 'session.create does not accept any input fields.',\n retryable: false,\n });\n }\n }\n\n const session = registry.create();\n if (options.driveConnected?.()) {\n try {\n registry.apply(session.id, 'DRIVE_CONNECTED');\n } catch {\n // Ignore invalid transitions.\n }\n }\n return sendResult(res, {\n session_id: session.id,\n state: session.state,\n created_at: session.createdAt.toISOString(),\n });\n });\n\n router.post('/status', (req, res) => {\n const sessionId = readSessionId(req.body);\n if (!sessionId) {\n return sendError(res, 400, {\n code: 'INVALID_ARGUMENT',\n message: 'session_id is required',\n retryable: false,\n });\n }\n\n try {\n const session = registry.require(sessionId);\n return sendResult(res, {\n session_id: session.id,\n state: session.state,\n updated_at: session.updatedAt.toISOString(),\n });\n } catch (error) {\n if (error instanceof SessionError) {\n return sendError(res, 404, {\n code: error.code,\n message: error.message,\n retryable: false,\n });\n }\n\n return sendError(res, 500, {\n code: 'INTERNAL',\n message: 'Unexpected error while fetching status.',\n retryable: false,\n });\n }\n });\n\n router.post('/recover', async (req, res) => {\n const sessionId = readSessionId(req.body);\n if (!sessionId) {\n return sendError(res, 400, {\n code: 'INVALID_ARGUMENT',\n message: 'session_id is required',\n retryable: false,\n });\n }\n\n try {\n const session = registry.require(sessionId);\n let outcome:\n | {\n recovered: boolean;\n message?: string;\n }\n | undefined;\n\n if (session.state === SessionState.DEGRADED_DRIVE) {\n const connected = options.driveConnected?.() ?? false;\n outcome = {\n recovered: connected,\n message: connected\n ? 'Drive recovery succeeded.'\n : 'Drive recovery failed.',\n };\n } else if (session.state === SessionState.DEGRADED_INSPECT) {\n const recovered = options.inspectRecover\n ? await options.inspectRecover(sessionId)\n : false;\n outcome = {\n recovered,\n message: recovered\n ? 'Inspect recovery succeeded.'\n : 'Inspect recovery failed.',\n };\n }\n\n const result = registry.recover(sessionId, outcome);\n if (outcome) {\n const attempt = {\n sessionId,\n recovered: result.recovered,\n state: result.state,\n message: result.message,\n at: new Date().toISOString(),\n };\n options.recordRecovery?.(attempt);\n const status = result.recovered ? 'succeeded' : 'failed';\n console.info(\n `[recovery] session ${sessionId} ${status}: ${result.message ?? ''}`\n );\n }\n return sendResult(res, {\n session_id: result.sessionId,\n recovered: result.recovered,\n state: result.state,\n message: result.message,\n });\n } catch (error) {\n if (error instanceof SessionError) {\n const status = error.code === 'SESSION_CLOSED' ? 409 : 404;\n return sendError(res, status, {\n code: error.code,\n message: error.message,\n retryable: false,\n });\n }\n\n if (error instanceof InvalidSessionTransition) {\n return sendError(res, 409, {\n code: 'FAILED_PRECONDITION',\n message: error.message,\n retryable: false,\n });\n }\n\n return sendError(res, 500, {\n code: 'INTERNAL',\n message: 'Unexpected error while recovering session.',\n retryable: false,\n });\n }\n });\n\n router.post('/close', (req, res) => {\n const sessionId = readSessionId(req.body);\n if (!sessionId) {\n return sendError(res, 400, {\n code: 'INVALID_ARGUMENT',\n message: 'session_id is required',\n retryable: false,\n });\n }\n\n try {\n registry.close(sessionId);\n return sendResult(res, { ok: true });\n } catch (error) {\n if (error instanceof SessionError) {\n return sendError(res, 404, {\n code: error.code,\n message: error.message,\n retryable: false,\n });\n }\n\n if (error instanceof InvalidSessionTransition) {\n return sendError(res, 409, {\n code: 'FAILED_PRECONDITION',\n message: error.message,\n retryable: false,\n });\n }\n\n return sendError(res, 500, {\n code: 'INTERNAL',\n message: 'Unexpected error while closing session.',\n retryable: false,\n });\n }\n });\n\n return router;\n};\n", "export enum SessionState {\n INIT = 'INIT',\n DRIVE_READY = 'DRIVE_READY',\n INSPECT_READY = 'INSPECT_READY',\n READY = 'READY',\n DEGRADED_DRIVE = 'DEGRADED_DRIVE',\n DEGRADED_INSPECT = 'DEGRADED_INSPECT',\n BROKEN = 'BROKEN',\n CLOSED = 'CLOSED',\n}\n\nexport type SessionEvent =\n | 'DRIVE_CONNECTED'\n | 'INSPECT_CONNECTED'\n | 'DRIVE_DISCONNECTED'\n | 'INSPECT_DISCONNECTED'\n | 'RECOVER_SUCCEEDED'\n | 'RECOVER_FAILED'\n | 'CLOSE';\n\nexport class InvalidSessionTransition extends Error {\n public readonly from: SessionState;\n public readonly event: SessionEvent;\n\n constructor(from: SessionState, event: SessionEvent) {\n super(`Invalid session transition from ${from} via ${event}.`);\n this.name = 'InvalidSessionTransition';\n this.from = from;\n this.event = event;\n }\n}\n\nexport const transitionSession = (\n state: SessionState,\n event: SessionEvent\n): SessionState => {\n if (event === 'CLOSE') {\n return SessionState.CLOSED;\n }\n\n if (event === 'RECOVER_FAILED') {\n if (state === SessionState.CLOSED) {\n throw new InvalidSessionTransition(state, event);\n }\n\n return SessionState.BROKEN;\n }\n\n switch (state) {\n case SessionState.INIT: {\n if (event === 'DRIVE_CONNECTED') {\n return SessionState.DRIVE_READY;\n }\n if (event === 'INSPECT_CONNECTED') {\n return SessionState.INSPECT_READY;\n }\n break;\n }\n case SessionState.DRIVE_READY: {\n if (event === 'INSPECT_CONNECTED') {\n return SessionState.READY;\n }\n if (event === 'DRIVE_DISCONNECTED') {\n return SessionState.INIT;\n }\n break;\n }\n case SessionState.INSPECT_READY: {\n if (event === 'DRIVE_CONNECTED') {\n return SessionState.READY;\n }\n break;\n }\n case SessionState.READY: {\n if (event === 'DRIVE_DISCONNECTED') {\n return SessionState.DEGRADED_DRIVE;\n }\n if (event === 'INSPECT_DISCONNECTED') {\n return SessionState.DEGRADED_INSPECT;\n }\n break;\n }\n case SessionState.DEGRADED_DRIVE: {\n if (event === 'RECOVER_SUCCEEDED') {\n return SessionState.READY;\n }\n break;\n }\n case SessionState.DEGRADED_INSPECT: {\n if (event === 'RECOVER_SUCCEEDED') {\n return SessionState.READY;\n }\n break;\n }\n case SessionState.BROKEN:\n case SessionState.CLOSED:\n default:\n break;\n }\n\n throw new InvalidSessionTransition(state, event);\n};\n\nexport const shouldRetryDriveOp = (options: {\n attempt: number;\n retryable: boolean;\n}): boolean => {\n return options.retryable && options.attempt === 0;\n};\n\nexport const shouldRetryInspectOp = (options: {\n attempt: number;\n reconnectSucceeded: boolean;\n}): boolean => {\n return options.reconnectSucceeded && options.attempt === 0;\n};\n", "import { randomUUID } from 'crypto';\nimport {\n InvalidSessionTransition,\n SessionEvent,\n SessionState,\n transitionSession,\n} from './state';\n\nexport type SessionRecord = {\n id: string;\n state: SessionState;\n createdAt: Date;\n updatedAt: Date;\n lastAccessedAt: Date;\n};\n\nexport type RecoverResult = {\n sessionId: string;\n recovered: boolean;\n state: SessionState;\n message?: string;\n};\n\nexport type SessionErrorCode = 'SESSION_NOT_FOUND' | 'SESSION_CLOSED';\n\nexport class SessionError extends Error {\n public readonly code: SessionErrorCode;\n\n constructor(code: SessionErrorCode, message: string) {\n super(message);\n this.name = 'SessionError';\n this.code = code;\n }\n}\n\nexport class SessionRegistry {\n private sessions = new Map<string, SessionRecord>();\n\n create(): SessionRecord {\n const now = new Date();\n const id = `session-${randomUUID()}`;\n const session: SessionRecord = {\n id,\n state: SessionState.INIT,\n createdAt: now,\n updatedAt: now,\n lastAccessedAt: now,\n };\n\n this.sessions.set(id, session);\n return session;\n }\n\n get(sessionId: string): SessionRecord | undefined {\n return this.sessions.get(sessionId);\n }\n\n list(): SessionRecord[] {\n return Array.from(this.sessions.values());\n }\n\n require(sessionId: string): SessionRecord {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new SessionError(\n 'SESSION_NOT_FOUND',\n `Session ${sessionId} does not exist.`\n );\n }\n\n session.lastAccessedAt = new Date();\n return session;\n }\n\n cleanupIdleSessions(ttlMs: number, now = new Date()): number {\n if (!Number.isFinite(ttlMs) || ttlMs <= 0) {\n return 0;\n }\n\n let removed = 0;\n for (const [id, session] of this.sessions.entries()) {\n const idleMs = now.getTime() - session.lastAccessedAt.getTime();\n if (idleMs > ttlMs) {\n this.sessions.delete(id);\n removed += 1;\n }\n }\n return removed;\n }\n\n apply(sessionId: string, event: SessionEvent): SessionRecord {\n const session = this.require(sessionId);\n if (session.state === SessionState.CLOSED && event !== 'CLOSE') {\n throw new SessionError(\n 'SESSION_CLOSED',\n `Session ${sessionId} is closed.`\n );\n }\n\n try {\n session.state = transitionSession(session.state, event);\n } catch (error) {\n if (error instanceof InvalidSessionTransition) {\n throw error;\n }\n throw error;\n }\n\n session.updatedAt = new Date();\n return session;\n }\n\n recover(\n sessionId: string,\n outcome?: { recovered: boolean; message?: string }\n ): RecoverResult {\n const session = this.require(sessionId);\n if (session.state === SessionState.CLOSED) {\n throw new SessionError(\n 'SESSION_CLOSED',\n `Session ${sessionId} is closed.`\n );\n }\n\n let recovered = false;\n let message: string | undefined;\n\n if (\n session.state === SessionState.DEGRADED_DRIVE ||\n session.state === SessionState.DEGRADED_INSPECT\n ) {\n if (outcome?.recovered) {\n session.state = transitionSession(session.state, 'RECOVER_SUCCEEDED');\n recovered = true;\n message = outcome.message ?? 'Recovery succeeded.';\n } else if (outcome) {\n session.state = transitionSession(session.state, 'RECOVER_FAILED');\n recovered = false;\n message = outcome.message ?? 'Recovery failed.';\n } else {\n recovered = false;\n message = 'Recovery not attempted.';\n }\n } else if (session.state === SessionState.BROKEN) {\n recovered = false;\n message = 'Session is broken.';\n } else {\n recovered = false;\n message = 'No recovery needed.';\n }\n\n session.updatedAt = new Date();\n\n return {\n sessionId: session.id,\n recovered,\n state: session.state,\n message,\n };\n }\n\n close(sessionId: string): SessionRecord {\n const session = this.require(sessionId);\n session.state = transitionSession(session.state, 'CLOSE');\n session.updatedAt = new Date();\n return session;\n }\n}\n", "import type { DriveTabInfo } from '../drive-protocol';\nimport type { TargetHint } from '../target-matching';\n\nexport type ResponseLike = {\n status: (code: number) => ResponseLike;\n json: (body: unknown) => void;\n};\n\nexport type ErrorInfo = {\n code: string;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n};\n\nexport const sendError = (\n res: ResponseLike,\n status: number,\n error: ErrorInfo\n): void => {\n res.status(status).json({ ok: false, error });\n};\n\nexport const sendResult = <T>(res: ResponseLike, result: T): void => {\n res.status(200).json({ ok: true, result });\n};\n\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport const errorStatus = (code: string): number => {\n switch (code) {\n case 'INVALID_ARGUMENT':\n return 400;\n case 'UNAUTHORIZED':\n return 401;\n case 'FORBIDDEN':\n case 'PERMISSION_REQUIRED':\n case 'PERMISSION_PROMPT_TIMEOUT':\n case 'PERMISSION_DENIED':\n return 403;\n case 'SESSION_NOT_FOUND':\n case 'TAB_NOT_FOUND':\n case 'LOCATOR_NOT_FOUND':\n return 404;\n case 'SESSION_CLOSED':\n case 'FAILED_PRECONDITION':\n case 'DEBUGGER_IN_USE':\n return 409;\n case 'ATTACH_DENIED':\n return 403;\n case 'NOT_SUPPORTED':\n case 'NOT_IMPLEMENTED':\n return 501;\n case 'EXTENSION_DISCONNECTED':\n case 'INSPECT_UNAVAILABLE':\n return 503;\n case 'TIMEOUT':\n return 504;\n default:\n return 500;\n }\n};\n\nexport const deriveHintFromTabs = (\n tabs: DriveTabInfo[]\n): TargetHint | undefined => {\n if (!Array.isArray(tabs) || tabs.length === 0) {\n return undefined;\n }\n let best: DriveTabInfo | undefined;\n let bestTime = -Infinity;\n for (const tab of tabs) {\n const raw = tab.last_active_at;\n const time = raw ? Date.parse(raw) : NaN;\n const score = Number.isFinite(time) ? time : -Infinity;\n if (!best || score > bestTime) {\n best = tab;\n bestTime = score;\n }\n }\n if (!best) {\n return undefined;\n }\n if (!best.url && !best.title && !best.last_active_at) {\n return undefined;\n }\n return {\n url: best.url,\n title: best.title,\n lastActiveAt: best.last_active_at,\n };\n};\n", "import type { InspectErrorCode } from './types';\n\nexport class InspectError extends Error {\n public readonly code: InspectErrorCode;\n public readonly retryable: boolean;\n public readonly details?: Record<string, unknown>;\n\n constructor(\n code: InspectErrorCode,\n message: string,\n options: { retryable?: boolean; details?: Record<string, unknown> } = {}\n ) {\n super(message);\n this.name = 'InspectError';\n this.code = code;\n this.retryable = options.retryable ?? false;\n this.details = options.details;\n }\n}\n", "import { randomUUID } from 'crypto';\nimport { writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { Readability } from '@mozilla/readability';\nimport { JSDOM } from 'jsdom';\nimport TurndownService from 'turndown';\nimport { ensureArtifactRootDir } from '../artifacts';\nimport { driveMutex } from '../drive';\nimport type { DebuggerBridge } from '../debugger-bridge';\nimport type {\n DriveAction,\n DriveErrorInfo,\n DriveResponse,\n DriveScreenshotResult,\n DriveTabInfo,\n} from '../drive-protocol';\nimport {\n applyAxSnapshotFilters,\n getAxName,\n getAxNodes,\n getAxRole,\n LABEL_AX_ROLES,\n matchesAxText,\n matchesTextValue,\n normalizeQuery,\n truncateAxSnapshot,\n} from './ax-snapshot';\nimport { toConsoleEntry } from './console';\nimport { buildHar } from './har';\nimport { captureHtml } from './html-snapshot';\nimport { SnapshotHistory } from './snapshot-history';\nimport {\n applySnapshotRefs,\n assignRefsToAxSnapshot,\n resolveNodeIdForSelector,\n} from './snapshot-refs';\nimport { InspectError } from './errors';\nimport type {\n ArtifactInfo,\n ConsoleEntry,\n ConsoleListResult,\n DomSnapshotResult,\n EvaluateResult,\n ExtractContentResult,\n FormInfo,\n InspectErrorCode,\n InspectServiceOptions,\n PageStateResult,\n PerformanceMetricsResult,\n StorageEntry,\n} from './types';\nimport { PAGE_STATE_SCRIPT } from '../page-state-script';\nimport { SessionError, SessionRegistry, SessionRecord } from '../session';\nimport { SessionState } from '../state';\nimport { pickBestTarget } from '../target-matching';\nimport type { TargetHint } from '../target-matching';\n\nconst DEFAULT_MAX_SNAPSHOTS_PER_SESSION = 20;\nconst DEFAULT_MAX_SNAPSHOT_HISTORY = 100;\n\nexport class InspectService {\n private readonly registry: SessionRegistry;\n private readonly debugger?: DebuggerBridge;\n private readonly extensionBridge?: {\n isConnected: () => boolean;\n getStatus: () => { tabs: DriveTabInfo[] };\n request?: <T = unknown>(\n action: DriveAction,\n params?: Record<string, unknown>,\n timeoutMs?: number\n ) => Promise<DriveResponse<T>>;\n };\n private lastError?: InspectError;\n private lastErrorAt?: string;\n private readonly snapshots: SnapshotHistory;\n\n constructor(options: InspectServiceOptions) {\n this.registry = options.registry;\n this.debugger = options.debuggerBridge;\n this.extensionBridge = options.extensionBridge;\n const maxSnapshotsPerSession =\n options.maxSnapshotsPerSession ?? DEFAULT_MAX_SNAPSHOTS_PER_SESSION;\n const maxSnapshotHistory =\n options.maxSnapshotHistory ?? DEFAULT_MAX_SNAPSHOT_HISTORY;\n this.snapshots = new SnapshotHistory({\n maxSnapshotsPerSession,\n maxSnapshotHistory,\n });\n }\n\n isConnected(): boolean {\n return this.debugger?.hasAttachments() ?? false;\n }\n\n getLastError(): { error: InspectError; at: string } | undefined {\n if (!this.lastError || !this.lastErrorAt) {\n const debuggerError = this.debugger?.getLastError();\n if (!debuggerError) {\n return undefined;\n }\n return {\n error: new InspectError(\n 'INSPECT_UNAVAILABLE',\n debuggerError.error.message,\n {\n retryable: debuggerError.error.retryable,\n details: {\n code: debuggerError.error.code,\n ...(debuggerError.error.details\n ? debuggerError.error.details\n : {}),\n },\n }\n ),\n at: debuggerError.at,\n };\n }\n return { error: this.lastError, at: this.lastErrorAt };\n }\n\n async reconnect(sessionId: string): Promise<boolean> {\n try {\n this.requireSession(sessionId);\n const selection = await this.resolveTab();\n const debuggerBridge = this.ensureDebugger();\n const result = await debuggerBridge.attach(selection.tabId);\n if (result.ok) {\n this.markInspectConnected(sessionId);\n return true;\n }\n const error = this.mapDebuggerError(result.error);\n this.recordError(error);\n return false;\n } catch (error) {\n if (error instanceof InspectError) {\n this.recordError(error);\n }\n return false;\n }\n }\n\n async domSnapshot(input: {\n sessionId: string;\n format: 'ax' | 'html';\n consistency: 'best_effort' | 'quiesce';\n interactive?: boolean;\n compact?: boolean;\n maxNodes?: number;\n selector?: string;\n targetHint?: TargetHint;\n }): Promise<DomSnapshotResult> {\n this.requireSession(input.sessionId);\n const selection = await this.resolveTab(input.targetHint);\n const debuggerCommand = this.debuggerCommand.bind(this);\n\n const work = async (): Promise<DomSnapshotResult> => {\n if (input.format === 'html') {\n const html = await captureHtml(selection.tabId, {\n selector: input.selector,\n debuggerCommand,\n onEvaluationFailed: () => {\n const error = new InspectError(\n 'EVALUATION_FAILED',\n 'Failed to evaluate HTML snapshot.',\n { retryable: false }\n );\n this.recordError(error);\n throw error;\n },\n });\n const warnings = [...(selection.warnings ?? [])];\n if (input.interactive) {\n warnings.push(\n 'Interactive filter is only supported for AX snapshots.'\n );\n }\n if (input.compact) {\n warnings.push('Compact filter is only supported for AX snapshots.');\n }\n if (input.maxNodes !== undefined) {\n warnings.push('max_nodes is only supported for AX snapshots.');\n }\n if (input.selector && html === '') {\n warnings.push(`Selector not found: ${input.selector}`);\n }\n return {\n format: 'html',\n snapshot: html,\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n }\n\n try {\n await this.enableAccessibility(selection.tabId);\n const selectorWarnings: string[] = [];\n let result: unknown;\n if (input.selector) {\n const resolved = await resolveNodeIdForSelector(\n selection.tabId,\n input.selector,\n debuggerCommand\n );\n selectorWarnings.push(...(resolved.warnings ?? []));\n if (!resolved.nodeId) {\n let refWarnings: string[] = [];\n try {\n refWarnings = await applySnapshotRefs(\n selection.tabId,\n new Map(),\n debuggerCommand\n );\n } catch {\n refWarnings = ['Failed to clear prior snapshot refs.'];\n }\n const warnings = [\n ...(selection.warnings ?? []),\n ...selectorWarnings,\n ...refWarnings,\n ];\n return {\n format: 'ax',\n snapshot: { nodes: [] },\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n }\n result = await this.debuggerCommand(\n selection.tabId,\n 'Accessibility.getPartialAXTree',\n { nodeId: resolved.nodeId }\n );\n } else {\n result = await this.debuggerCommand(\n selection.tabId,\n 'Accessibility.getFullAXTree',\n {}\n );\n }\n let snapshot =\n input.interactive || input.compact\n ? applyAxSnapshotFilters(result, {\n interactiveOnly: input.interactive,\n compact: input.compact,\n })\n : result;\n let truncated = false;\n const truncationWarnings: string[] = [];\n if (input.maxNodes !== undefined) {\n const truncatedResult = truncateAxSnapshot(snapshot, input.maxNodes);\n snapshot = truncatedResult.snapshot;\n truncated = truncatedResult.truncated;\n if (truncated) {\n truncationWarnings.push(\n `AX snapshot truncated to ${input.maxNodes} nodes.`\n );\n }\n }\n const refMap = assignRefsToAxSnapshot(snapshot);\n const refWarnings = await applySnapshotRefs(\n selection.tabId,\n refMap,\n debuggerCommand\n );\n const warnings = [\n ...(selection.warnings ?? []),\n ...selectorWarnings,\n ...truncationWarnings,\n ...(refWarnings ?? []),\n ];\n return {\n format: 'ax',\n snapshot,\n ...(truncated ? { truncated: true } : {}),\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n } catch (error) {\n if (error instanceof InspectError) {\n const fallbackCodes: InspectErrorCode[] = [\n 'NOT_SUPPORTED',\n 'INSPECT_UNAVAILABLE',\n 'EVALUATION_FAILED',\n ];\n if (!fallbackCodes.includes(error.code)) {\n throw error;\n }\n const html = await captureHtml(selection.tabId, {\n selector: input.selector,\n debuggerCommand,\n onEvaluationFailed: () => {\n const error = new InspectError(\n 'EVALUATION_FAILED',\n 'Failed to evaluate HTML snapshot.',\n { retryable: false }\n );\n this.recordError(error);\n throw error;\n },\n });\n const warnings = [\n ...(selection.warnings ?? []),\n 'AX snapshot failed; returned HTML instead.',\n ...(input.maxNodes !== undefined\n ? ['max_nodes is only supported for AX snapshots.']\n : []),\n ...(input.interactive\n ? ['Interactive filter is only supported for AX snapshots.']\n : []),\n ...(input.compact\n ? ['Compact filter is only supported for AX snapshots.']\n : []),\n ...(input.selector && html === ''\n ? [`Selector not found: ${input.selector}`]\n : []),\n ];\n return {\n format: 'html',\n snapshot: html,\n warnings,\n };\n }\n throw error;\n }\n };\n\n if (input.consistency === 'quiesce') {\n const result = await driveMutex.runExclusive(work);\n this.snapshots.record(input.sessionId, result);\n this.markInspectConnected(input.sessionId);\n return result;\n }\n const result = await work();\n this.snapshots.record(input.sessionId, result);\n this.markInspectConnected(input.sessionId);\n return result;\n }\n\n domDiff(input: { sessionId: string }): {\n added: string[];\n removed: string[];\n changed: string[];\n summary: string;\n } {\n this.requireSession(input.sessionId);\n this.markInspectConnected(input.sessionId);\n return this.snapshots.diff(input.sessionId);\n }\n\n async find(input: {\n sessionId: string;\n kind: 'role' | 'text' | 'label';\n role?: string;\n name?: string;\n text?: string;\n label?: string;\n targetHint?: TargetHint;\n }): Promise<{\n matches: Array<{ ref: string; role?: string; name?: string }>;\n warnings?: string[];\n }> {\n const snapshot = await this.domSnapshot({\n sessionId: input.sessionId,\n format: 'ax',\n consistency: 'best_effort',\n targetHint: input.targetHint,\n });\n const warnings = [...(snapshot.warnings ?? [])];\n if (snapshot.format !== 'ax') {\n warnings.push('AX snapshot unavailable; cannot resolve refs.');\n return {\n matches: [],\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n }\n\n const nodes = getAxNodes(snapshot.snapshot);\n const matches: Array<{ ref: string; role?: string; name?: string }> = [];\n\n const nameQuery =\n typeof input.name === 'string' ? normalizeQuery(input.name) : '';\n const textQuery =\n typeof input.text === 'string' ? normalizeQuery(input.text) : '';\n const labelQuery =\n typeof input.label === 'string' ? normalizeQuery(input.label) : '';\n const roleQuery =\n typeof input.role === 'string' ? normalizeQuery(input.role) : '';\n\n for (const node of nodes) {\n if (!node || typeof node !== 'object') {\n continue;\n }\n if (typeof node.ref !== 'string' || node.ref.length === 0) {\n continue;\n }\n const role = getAxRole(node);\n const name = getAxName(node);\n\n if (input.kind === 'role') {\n if (!role || role !== roleQuery) {\n continue;\n }\n if (nameQuery && !matchesTextValue(name, nameQuery)) {\n continue;\n }\n } else if (input.kind === 'text') {\n if (!textQuery || !matchesAxText(node, textQuery)) {\n continue;\n }\n } else if (input.kind === 'label') {\n if (!labelQuery || !LABEL_AX_ROLES.has(role)) {\n continue;\n }\n if (!matchesTextValue(name, labelQuery)) {\n continue;\n }\n }\n\n matches.push({\n ref: node.ref,\n ...(role ? { role } : {}),\n ...(name ? { name } : {}),\n });\n }\n\n return {\n matches,\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n }\n\n async consoleList(input: {\n sessionId: string;\n targetHint?: TargetHint;\n }): Promise<ConsoleListResult> {\n this.requireSession(input.sessionId);\n const selection = await this.resolveTab(input.targetHint);\n await this.enableConsole(selection.tabId);\n\n const events = this.ensureDebugger().getConsoleEvents(selection.tabId);\n const entries = events\n .map((event) => toConsoleEntry(event))\n .filter((entry): entry is ConsoleEntry => entry !== null);\n\n const result = {\n entries,\n warnings: selection.warnings,\n };\n this.markInspectConnected(input.sessionId);\n return result;\n }\n\n async networkHar(input: {\n sessionId: string;\n targetHint?: TargetHint;\n }): Promise<ArtifactInfo> {\n this.requireSession(input.sessionId);\n const selection = await this.resolveTab(input.targetHint);\n await this.enableNetwork(selection.tabId);\n\n const events = this.ensureDebugger().getNetworkEvents(selection.tabId);\n const har = buildHar(events, selection.tab.title);\n\n try {\n const rootDir = await ensureArtifactRootDir(input.sessionId);\n const artifactId = randomUUID();\n const filePath = path.join(rootDir, `har-${artifactId}.json`);\n await writeFile(filePath, JSON.stringify(har, null, 2), 'utf-8');\n const result = {\n artifact_id: artifactId,\n path: filePath,\n mime: 'application/json',\n };\n this.markInspectConnected(input.sessionId);\n return result;\n } catch {\n const error = new InspectError(\n 'ARTIFACT_IO_ERROR',\n 'Failed to write HAR file.'\n );\n this.recordError(error);\n throw error;\n }\n }\n\n async evaluate(input: {\n sessionId: string;\n expression?: string;\n targetHint?: TargetHint;\n }): Promise<EvaluateResult> {\n this.requireSession(input.sessionId);\n const selection = await this.resolveTab(input.targetHint);\n const expression = input.expression ?? 'undefined';\n\n await this.debuggerCommand(selection.tabId, 'Runtime.enable', {});\n const result = await this.debuggerCommand(\n selection.tabId,\n 'Runtime.evaluate',\n {\n expression,\n returnByValue: true,\n awaitPromise: true,\n }\n );\n\n if (result && typeof result === 'object' && 'exceptionDetails' in result) {\n const output = {\n exception: (result as { exceptionDetails?: unknown }).exceptionDetails,\n warnings: selection.warnings,\n };\n this.markInspectConnected(input.sessionId);\n return output;\n }\n\n const output = {\n value: (result as { result?: { value?: unknown } })?.result?.value,\n warnings: selection.warnings,\n };\n this.markInspectConnected(input.sessionId);\n return output;\n }\n\n async extractContent(input: {\n sessionId: string;\n format: 'markdown' | 'text' | 'article_json';\n includeMetadata?: boolean;\n targetHint?: TargetHint;\n }): Promise<ExtractContentResult> {\n this.requireSession(input.sessionId);\n const selection = await this.resolveTab(input.targetHint);\n\n const debuggerCommand = this.debuggerCommand.bind(this);\n const html = await captureHtml(selection.tabId, {\n debuggerCommand,\n onEvaluationFailed: () => {\n const error = new InspectError(\n 'EVALUATION_FAILED',\n 'Failed to evaluate HTML snapshot.',\n { retryable: false }\n );\n this.recordError(error);\n throw error;\n },\n });\n const url = selection.tab.url ?? 'about:blank';\n let article: ReturnType<Readability['parse']> | null = null;\n try {\n const dom = new JSDOM(html, { url });\n const reader = new Readability(dom.window.document);\n article = reader.parse();\n } catch {\n const err = new InspectError(\n 'EVALUATION_FAILED',\n 'Failed to parse page content.',\n { retryable: false }\n );\n this.recordError(err);\n throw err;\n }\n\n if (!article) {\n const err = new InspectError(\n 'NOT_SUPPORTED',\n 'Readability could not extract content.',\n { retryable: false }\n );\n this.recordError(err);\n throw err;\n }\n\n let content = '';\n if (input.format === 'article_json') {\n content = JSON.stringify(article, null, 2);\n } else if (input.format === 'text') {\n content = article.textContent ?? '';\n } else {\n const turndown = new TurndownService();\n content = turndown.turndown(article.content ?? '');\n }\n\n const warnings = selection.warnings ?? [];\n const includeMetadata = input.includeMetadata ?? true;\n const output: ExtractContentResult = {\n content,\n ...(includeMetadata\n ? {\n title: article.title ?? undefined,\n byline: article.byline ?? undefined,\n excerpt: article.excerpt ?? undefined,\n siteName: (article as { siteName?: string }).siteName ?? undefined,\n }\n : {}),\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n\n this.markInspectConnected(input.sessionId);\n return output;\n }\n\n async pageState(input: {\n sessionId: string;\n targetHint?: TargetHint;\n }): Promise<PageStateResult> {\n this.requireSession(input.sessionId);\n const selection = await this.resolveTab(input.targetHint);\n\n await this.debuggerCommand(selection.tabId, 'Runtime.enable', {});\n const expression = PAGE_STATE_SCRIPT;\n\n const result = await this.debuggerCommand(\n selection.tabId,\n 'Runtime.evaluate',\n {\n expression,\n returnByValue: true,\n awaitPromise: true,\n }\n );\n\n if (result && typeof result === 'object' && 'exceptionDetails' in result) {\n const error = new InspectError(\n 'EVALUATION_FAILED',\n 'Failed to capture page state.',\n { retryable: false }\n );\n this.recordError(error);\n throw error;\n }\n\n const value = (result as { result?: { value?: unknown } })?.result?.value;\n const raw =\n value && typeof value === 'object'\n ? (value as Partial<PageStateResult>)\n : {};\n const warnings = [\n ...(Array.isArray(raw.warnings) ? raw.warnings : []),\n ...(selection.warnings ?? []),\n ];\n const output: PageStateResult = {\n forms: Array.isArray(raw.forms) ? (raw.forms as FormInfo[]) : [],\n localStorage: Array.isArray(raw.localStorage)\n ? (raw.localStorage as StorageEntry[])\n : [],\n sessionStorage: Array.isArray(raw.sessionStorage)\n ? (raw.sessionStorage as StorageEntry[])\n : [],\n cookies: Array.isArray(raw.cookies)\n ? (raw.cookies as StorageEntry[])\n : [],\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n\n this.markInspectConnected(input.sessionId);\n return output;\n }\n\n async performanceMetrics(input: {\n sessionId: string;\n targetHint?: TargetHint;\n }): Promise<PerformanceMetricsResult> {\n this.requireSession(input.sessionId);\n const selection = await this.resolveTab(input.targetHint);\n\n await this.debuggerCommand(selection.tabId, 'Performance.enable', {});\n const result = await this.debuggerCommand(\n selection.tabId,\n 'Performance.getMetrics',\n {}\n );\n const metrics = Array.isArray((result as { metrics?: unknown[] })?.metrics)\n ? (\n result as { metrics: Array<{ name: string; value: number }> }\n ).metrics.map((metric) => ({\n name: metric.name,\n value: metric.value,\n }))\n : [];\n\n const output = { metrics, warnings: selection.warnings };\n this.markInspectConnected(input.sessionId);\n return output;\n }\n\n async screenshot(input: {\n sessionId: string;\n target: 'viewport' | 'full';\n selector?: string;\n format?: 'png' | 'jpeg' | 'webp';\n quality?: number;\n targetHint?: TargetHint;\n }): Promise<ArtifactInfo> {\n this.requireSession(input.sessionId);\n const selection = await this.resolveTab(input.targetHint);\n\n const format = input.format ?? 'png';\n const writeArtifact = async (data: string): Promise<ArtifactInfo> => {\n try {\n const rootDir = await ensureArtifactRootDir(input.sessionId);\n const artifactId = randomUUID();\n const extension = format === 'jpeg' ? 'jpg' : format;\n const filePath = path.join(\n rootDir,\n `screenshot-${artifactId}.${extension}`\n );\n await writeFile(filePath, Buffer.from(data, 'base64'));\n const mime = format === 'jpeg' ? 'image/jpeg' : `image/${format}`;\n const output = {\n artifact_id: artifactId,\n path: filePath,\n mime,\n };\n this.markInspectConnected(input.sessionId);\n return output;\n } catch {\n const error = new InspectError(\n 'ARTIFACT_IO_ERROR',\n 'Failed to write screenshot file.'\n );\n this.recordError(error);\n throw error;\n }\n };\n\n if (input.selector) {\n if (!this.extensionBridge?.request) {\n const error = new InspectError(\n 'NOT_SUPPORTED',\n 'Element screenshots require an extension that supports drive.screenshot.'\n );\n this.recordError(error);\n throw error;\n }\n\n const response =\n await this.extensionBridge.request<DriveScreenshotResult>(\n 'drive.screenshot',\n {\n tab_id: selection.tabId,\n mode: 'element',\n selector: input.selector,\n format,\n ...(typeof input.quality === 'number'\n ? { quality: input.quality }\n : {}),\n },\n 120000\n );\n\n if (response.status === 'error') {\n const error = new InspectError(\n (response.error?.code as InspectErrorCode) ?? 'INSPECT_UNAVAILABLE',\n response.error?.message ?? 'Failed to capture element screenshot.',\n {\n retryable: response.error?.retryable ?? false,\n ...(response.error?.details\n ? { details: response.error.details }\n : {}),\n }\n );\n this.recordError(error);\n throw error;\n }\n\n const result = response.result;\n if (!result?.data_base64 || typeof result.data_base64 !== 'string') {\n const error = new InspectError(\n 'INSPECT_UNAVAILABLE',\n 'Failed to capture element screenshot.'\n );\n this.recordError(error);\n throw error;\n }\n\n return await writeArtifact(result.data_base64);\n }\n\n if (input.target === 'full' && this.extensionBridge?.request) {\n try {\n const response =\n await this.extensionBridge.request<DriveScreenshotResult>(\n 'drive.screenshot',\n {\n tab_id: selection.tabId,\n mode: 'full_page',\n format,\n ...(typeof input.quality === 'number'\n ? { quality: input.quality }\n : {}),\n },\n 120000\n );\n\n if (response.status === 'error') {\n const error = new InspectError(\n (response.error?.code as InspectErrorCode) ?? 'INSPECT_UNAVAILABLE',\n response.error?.message ??\n 'Failed to capture full page screenshot.',\n {\n retryable: response.error?.retryable ?? false,\n ...(response.error?.details\n ? { details: response.error.details }\n : {}),\n }\n );\n this.recordError(error);\n throw error;\n }\n\n const result = response.result;\n if (!result?.data_base64 || typeof result.data_base64 !== 'string') {\n const error = new InspectError(\n 'INSPECT_UNAVAILABLE',\n 'Failed to capture full page screenshot.'\n );\n this.recordError(error);\n throw error;\n }\n\n return await writeArtifact(result.data_base64);\n } catch (error) {\n // Fall back to CDP screenshots for environments that don't yet support\n // extension-driven full page capture.\n if (error instanceof InspectError) {\n const code = String(error.code);\n if (\n ![\n 'NOT_SUPPORTED',\n 'NOT_IMPLEMENTED',\n 'INSPECT_UNAVAILABLE',\n ].includes(code)\n ) {\n throw error;\n }\n }\n }\n }\n\n await this.debuggerCommand(selection.tabId, 'Page.enable', {});\n\n let captureParams: Record<string, unknown> = {\n format,\n fromSurface: true,\n };\n if (format !== 'png' && typeof input.quality === 'number') {\n captureParams = { ...captureParams, quality: input.quality };\n }\n\n if (input.target === 'full') {\n const layout = await this.debuggerCommand(\n selection.tabId,\n 'Page.getLayoutMetrics',\n {}\n );\n const contentSize = (\n layout as { contentSize?: { width: number; height: number } }\n )?.contentSize;\n if (contentSize) {\n captureParams = {\n ...captureParams,\n clip: {\n x: 0,\n y: 0,\n width: contentSize.width,\n height: contentSize.height,\n scale: 1,\n },\n };\n } else {\n captureParams = { ...captureParams, captureBeyondViewport: true };\n }\n }\n\n const result = await this.debuggerCommand(\n selection.tabId,\n 'Page.captureScreenshot',\n captureParams\n );\n const data = (result as { data?: string }).data;\n if (!data) {\n const error = new InspectError(\n 'INSPECT_UNAVAILABLE',\n 'Failed to capture screenshot.',\n { retryable: false }\n );\n this.recordError(error);\n throw error;\n }\n\n return await writeArtifact(data);\n }\n\n private ensureDebugger(): DebuggerBridge {\n if (!this.debugger) {\n const error = this.buildUnavailableError();\n this.recordError(error);\n throw error;\n }\n return this.debugger;\n }\n\n private async resolveTab(\n hint?: TargetHint\n ): Promise<{ tabId: number; tab: DriveTabInfo; warnings?: string[] }> {\n if (!this.extensionBridge || !this.extensionBridge.isConnected()) {\n const error = new InspectError(\n 'EXTENSION_DISCONNECTED',\n 'Extension is not connected.',\n { retryable: true }\n );\n this.recordError(error);\n throw error;\n }\n\n const tabs = this.extensionBridge.getStatus().tabs ?? [];\n if (!Array.isArray(tabs) || tabs.length === 0) {\n const error = new InspectError(\n 'TAB_NOT_FOUND',\n 'No tabs available to inspect.'\n );\n this.recordError(error);\n throw error;\n }\n\n const candidates = tabs.map((tab) => ({\n id: String(tab.tab_id),\n url: tab.url ?? '',\n title: tab.title,\n lastSeenAt: tab.last_active_at\n ? Date.parse(tab.last_active_at)\n : undefined,\n }));\n\n const ranked = pickBestTarget(candidates, hint);\n if (!ranked) {\n const error = new InspectError('TAB_NOT_FOUND', 'No matching tab found.');\n this.recordError(error);\n throw error;\n }\n\n const tabId = Number(ranked.candidate.id);\n if (!Number.isFinite(tabId)) {\n const error = new InspectError(\n 'TAB_NOT_FOUND',\n 'Resolved tab id is invalid.'\n );\n this.recordError(error);\n throw error;\n }\n\n const tab = tabs.find((entry) => entry.tab_id === tabId) ?? tabs[0];\n const warnings: string[] = [];\n if (!hint) {\n warnings.push('No target hint provided; using the most recent tab.');\n } else if (ranked.score < 20) {\n warnings.push('Weak target match; using best available tab.');\n }\n\n return {\n tabId,\n tab,\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n }\n\n private async enableConsole(tabId: number): Promise<void> {\n await this.debuggerCommand(tabId, 'Runtime.enable', {});\n await this.debuggerCommand(tabId, 'Log.enable', {});\n }\n\n private async enableNetwork(tabId: number): Promise<void> {\n await this.debuggerCommand(tabId, 'Network.enable', {});\n }\n\n private async enableAccessibility(tabId: number): Promise<void> {\n await this.debuggerCommand(tabId, 'Accessibility.enable', {});\n }\n\n private async debuggerCommand(\n tabId: number,\n method: string,\n params?: Record<string, unknown>,\n timeoutMs?: number\n ): Promise<unknown> {\n const debuggerBridge = this.ensureDebugger();\n const result = await debuggerBridge.command(\n tabId,\n method,\n params,\n timeoutMs\n );\n if (!result.ok) {\n const error = this.mapDebuggerError(result.error);\n this.recordError(error);\n throw error;\n }\n return result.result;\n }\n\n private mapDebuggerError(error: DriveErrorInfo): InspectError {\n const allowed: InspectErrorCode[] = [\n 'INSPECT_UNAVAILABLE',\n 'EXTENSION_DISCONNECTED',\n 'DEBUGGER_IN_USE',\n 'ATTACH_DENIED',\n 'TAB_NOT_FOUND',\n 'NOT_SUPPORTED',\n 'TIMEOUT',\n 'EVALUATION_FAILED',\n 'ARTIFACT_IO_ERROR',\n 'INVALID_ARGUMENT',\n 'INTERNAL',\n ];\n\n const code = allowed.includes(error.code as InspectErrorCode)\n ? (error.code as InspectErrorCode)\n : 'INSPECT_UNAVAILABLE';\n return new InspectError(code, error.message, {\n retryable: error.retryable,\n details: error.details,\n });\n }\n\n private markInspectConnected(sessionId: string): void {\n try {\n const session = this.registry.require(sessionId);\n if (\n session.state === SessionState.INIT ||\n session.state === SessionState.DRIVE_READY\n ) {\n this.registry.apply(sessionId, 'INSPECT_CONNECTED');\n } else if (session.state === SessionState.DEGRADED_INSPECT) {\n this.registry.apply(sessionId, 'RECOVER_SUCCEEDED');\n }\n } catch {\n // Ignore invalid transitions.\n }\n }\n\n private recordError(error: InspectError): void {\n this.lastError = error;\n this.lastErrorAt = new Date().toISOString();\n }\n\n private buildUnavailableError(): InspectError {\n return new InspectError(\n 'INSPECT_UNAVAILABLE',\n 'Inspect is not available until the debugger bridge is configured.',\n { retryable: false }\n );\n }\n\n private requireSession(sessionId: string): SessionRecord {\n try {\n return this.registry.require(sessionId);\n } catch (error) {\n if (error instanceof SessionError) {\n const code =\n error.code === 'SESSION_CLOSED'\n ? 'SESSION_CLOSED'\n : 'SESSION_NOT_FOUND';\n const wrapped = new InspectError(code, error.message);\n this.recordError(wrapped);\n throw wrapped;\n }\n const wrapped = new InspectError('INTERNAL', 'Failed to load session.');\n this.recordError(wrapped);\n throw wrapped;\n }\n }\n}\n\nexport const createInspectService = (\n options: InspectServiceOptions\n): InspectService => new InspectService(options);\n", "import { mkdir } from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nconst ARTIFACTS_DIR_NAME = 'browser-agent';\n\nconst resolveTempRoot = (): string =>\n process.env.TMPDIR || process.env.TEMP || process.env.TMP || os.tmpdir();\n\nexport const getArtifactRootDir = (sessionId: string): string =>\n path.join(resolveTempRoot(), ARTIFACTS_DIR_NAME, sessionId);\n\nexport const ensureArtifactRootDir = async (\n sessionId: string\n): Promise<string> => {\n const rootDir = getArtifactRootDir(sessionId);\n await mkdir(rootDir, { recursive: true });\n return rootDir;\n};\n", "import { randomUUID } from 'crypto';\nimport type { Server } from 'http';\nimport type { RawData } from 'ws';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport type {\n DebuggerEvent,\n DebuggerRequestAction,\n DebuggerResponse,\n DriveAction,\n DriveErrorInfo,\n DriveResponse,\n DriveTabInfo,\n ExtensionEvent,\n ExtensionMessage,\n ExtensionRequest,\n ExtensionRequestAction,\n ExtensionResponse,\n} from './drive-protocol';\nimport { SessionRegistry } from './session';\nimport { SessionState } from './state';\n\nexport type ExtensionBridgeStatus = {\n connected: boolean;\n lastSeenAt?: string;\n tabs: DriveTabInfo[];\n};\n\ntype PendingRequest = {\n resolve: (response: ExtensionResponse) => void;\n reject: (error: ExtensionBridgeError) => void;\n timeout: ReturnType<typeof setTimeout>;\n};\n\ntype DebuggerEventListener = (event: DebuggerEvent) => void;\n\nexport class ExtensionBridgeError extends Error {\n public readonly code: string;\n public readonly retryable: boolean;\n public readonly details?: Record<string, unknown>;\n\n constructor(\n code: string,\n message: string,\n retryable = false,\n details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'ExtensionBridgeError';\n this.code = code;\n this.retryable = retryable;\n this.details = details;\n }\n}\n\nexport type ExtensionBridgeOptions = {\n path?: string;\n registry?: SessionRegistry;\n heartbeatIntervalMs?: number;\n heartbeatTimeoutMs?: number;\n};\n\nexport class ExtensionBridge {\n private readonly wss: WebSocketServer;\n private socket: WebSocket | null = null;\n private pending = new Map<string, PendingRequest>();\n private connected = false;\n private lastSeenAt?: string;\n private tabs: DriveTabInfo[] = [];\n private badMessageLogsRemaining = 3;\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n private awaitingHeartbeat = false;\n private readonly heartbeatIntervalMs: number;\n private readonly heartbeatTimeoutMs: number;\n private readonly path: string;\n private readonly registry?: SessionRegistry;\n private readonly debuggerListeners = new Set<DebuggerEventListener>();\n\n constructor(options: ExtensionBridgeOptions = {}) {\n this.wss = new WebSocketServer({ noServer: true });\n this.path = options.path ?? '/drive';\n this.registry = options.registry;\n this.heartbeatIntervalMs = options.heartbeatIntervalMs ?? 15000;\n this.heartbeatTimeoutMs = options.heartbeatTimeoutMs ?? 5000;\n\n this.wss.on('connection', (socket) => {\n this.handleConnection(socket);\n });\n }\n\n attach(server: Server): void {\n server.on('upgrade', (request, socket, head) => {\n const url = new URL(request.url ?? '', 'ws://127.0.0.1');\n if (url.pathname !== this.path) {\n socket.destroy();\n return;\n }\n\n this.wss.handleUpgrade(request, socket, head, (ws) => {\n this.wss.emit('connection', ws, request);\n });\n });\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n getStatus(): ExtensionBridgeStatus {\n return {\n connected: this.connected,\n lastSeenAt: this.lastSeenAt,\n tabs: this.tabs,\n };\n }\n\n async request<T = unknown>(\n action: DriveAction,\n params?: Record<string, unknown>,\n timeoutMs = 30000\n ): Promise<DriveResponse<T>> {\n const response = await this.requestInternal(action, params, timeoutMs);\n return response as DriveResponse<T>;\n }\n\n async requestDebugger<T = unknown>(\n action: DebuggerRequestAction,\n params?: Record<string, unknown>,\n timeoutMs = 30000\n ): Promise<DebuggerResponse<T>> {\n const response = await this.requestInternal(action, params, timeoutMs);\n return response as DebuggerResponse<T>;\n }\n\n onDebuggerEvent(listener: DebuggerEventListener): () => void {\n this.debuggerListeners.add(listener);\n return () => {\n this.debuggerListeners.delete(listener);\n };\n }\n\n private async requestInternal(\n action: ExtensionRequestAction,\n params?: Record<string, unknown>,\n timeoutMs = 30000\n ): Promise<ExtensionResponse> {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n throw new ExtensionBridgeError(\n 'EXTENSION_DISCONNECTED',\n 'Extension is not connected.',\n true\n );\n }\n\n const id = randomUUID();\n const request: ExtensionRequest =\n typeof action === 'string' && action.startsWith('debugger.')\n ? {\n id,\n action: action as DebuggerRequestAction,\n status: 'request',\n params,\n }\n : {\n id,\n action: action as DriveAction,\n status: 'request',\n params,\n };\n\n const response = await new Promise<ExtensionResponse>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pending.delete(id);\n reject(\n new ExtensionBridgeError(\n 'TIMEOUT',\n `Extension request timed out after ${timeoutMs}ms.`,\n true,\n { action }\n )\n );\n }, timeoutMs);\n\n this.pending.set(id, {\n resolve,\n reject,\n timeout,\n });\n\n this.socket?.send(JSON.stringify(request));\n });\n\n return response;\n }\n\n private startHeartbeat(): void {\n if (this.heartbeatInterval) {\n return;\n }\n this.heartbeatInterval = setInterval(() => {\n void this.sendHeartbeat();\n }, this.heartbeatIntervalMs);\n void this.sendHeartbeat();\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n this.awaitingHeartbeat = false;\n }\n\n private async sendHeartbeat(): Promise<void> {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n return;\n }\n if (this.awaitingHeartbeat) {\n return;\n }\n this.awaitingHeartbeat = true;\n try {\n await this.requestInternal(\n 'drive.ping',\n undefined,\n this.heartbeatTimeoutMs\n );\n } catch (error) {\n console.warn('Extension heartbeat failed:', error);\n this.forceDisconnect();\n } finally {\n this.awaitingHeartbeat = false;\n }\n }\n\n private forceDisconnect(): void {\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n try {\n this.socket.terminate();\n } catch (error) {\n console.debug(\n 'Extension socket terminate failed; falling back to close().',\n error\n );\n this.socket.close();\n }\n }\n this.handleDisconnect();\n }\n\n private handleConnection(socket: WebSocket): void {\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n this.socket.close();\n }\n\n this.socket = socket;\n this.connected = true;\n this.lastSeenAt = new Date().toISOString();\n\n this.applyDriveConnected();\n this.startHeartbeat();\n\n socket.on('message', (data) => {\n this.handleMessage(data);\n });\n\n socket.on('close', () => {\n this.handleDisconnect();\n });\n\n socket.on('error', () => {\n this.handleDisconnect();\n });\n }\n\n private handleDisconnect(): void {\n if (!this.connected) {\n return;\n }\n\n this.stopHeartbeat();\n this.connected = false;\n this.socket = null;\n this.lastSeenAt = new Date().toISOString();\n this.applyDriveDisconnected();\n\n for (const [id, pending] of this.pending.entries()) {\n clearTimeout(pending.timeout);\n pending.reject(\n new ExtensionBridgeError(\n 'EXTENSION_DISCONNECTED',\n 'Extension disconnected before responding.',\n true,\n { request_id: id }\n )\n );\n this.pending.delete(id);\n }\n }\n\n private handleMessage(data: RawData): void {\n const text = typeof data === 'string' ? data : data.toString();\n\n let message: ExtensionMessage | null = null;\n try {\n message = JSON.parse(text) as ExtensionMessage;\n } catch (error) {\n if (this.badMessageLogsRemaining > 0) {\n this.badMessageLogsRemaining -= 1;\n console.debug('Failed to parse extension message.', error);\n }\n return;\n }\n\n if (!message || typeof message !== 'object') {\n return;\n }\n\n this.lastSeenAt = new Date().toISOString();\n\n if (message.status === 'event') {\n this.handleEvent(message as ExtensionEvent);\n return;\n }\n\n if (\n message.status === 'ok' ||\n message.status === 'error' ||\n message.status === 'ack'\n ) {\n const pending = this.pending.get(message.id);\n if (!pending) {\n return;\n }\n clearTimeout(pending.timeout);\n this.pending.delete(message.id);\n pending.resolve(message as ExtensionResponse);\n }\n }\n\n private handleEvent(message: ExtensionEvent): void {\n if (\n message.action === 'drive.hello' ||\n message.action === 'drive.tab_report'\n ) {\n const tabs = (message.params as { tabs?: DriveTabInfo[] } | undefined)\n ?.tabs;\n if (Array.isArray(tabs)) {\n this.tabs = tabs;\n }\n }\n\n if (\n typeof message.action === 'string' &&\n message.action.startsWith('debugger.')\n ) {\n this.emitDebuggerEvent(message as DebuggerEvent);\n }\n }\n\n private emitDebuggerEvent(event: DebuggerEvent): void {\n for (const listener of this.debuggerListeners) {\n try {\n listener(event);\n } catch (error) {\n console.debug('Debugger event listener failed.', error);\n }\n }\n }\n\n private applyDriveConnected(): void {\n if (!this.registry) {\n return;\n }\n\n for (const session of this.registry.list()) {\n try {\n if (session.state === SessionState.INIT) {\n this.registry.apply(session.id, 'DRIVE_CONNECTED');\n } else if (session.state === SessionState.INSPECT_READY) {\n this.registry.apply(session.id, 'DRIVE_CONNECTED');\n } else if (session.state === SessionState.DEGRADED_DRIVE) {\n this.registry.apply(session.id, 'RECOVER_SUCCEEDED');\n }\n } catch (error) {\n console.debug(\n `Drive connect transition ignored for session ${session.id} (${session.state}).`,\n error\n );\n }\n }\n }\n\n private applyDriveDisconnected(): void {\n if (!this.registry) {\n return;\n }\n\n for (const session of this.registry.list()) {\n try {\n if (session.state === SessionState.READY) {\n this.registry.apply(session.id, 'DRIVE_DISCONNECTED');\n }\n } catch (error) {\n console.debug(\n `Drive disconnect transition ignored for session ${session.id} (${session.state}).`,\n error\n );\n }\n }\n }\n}\n\nexport const toDriveError = (error: ExtensionBridgeError): DriveErrorInfo => ({\n code: error.code,\n message: error.message,\n retryable: error.retryable,\n ...(error.details ? { details: error.details } : {}),\n});\n", "import type { DriveAction, DriveErrorInfo } from './drive-protocol';\nimport {\n ExtensionBridge,\n ExtensionBridgeError,\n toDriveError,\n} from './extension-bridge';\nimport { SessionError, SessionRegistry } from './session';\nimport { SessionState, shouldRetryDriveOp } from './state';\n\nexport type DriveResult<T> =\n | { ok: true; result: T }\n | { ok: false; error: DriveErrorInfo };\n\nclass DriveMutex {\n private tail = Promise.resolve();\n\n async runExclusive<T>(work: () => T | Promise<T>): Promise<T> {\n const result = this.tail.then(work, work);\n this.tail = result.then(\n () => undefined,\n () => undefined\n );\n return await result;\n }\n}\n\nexport const driveMutex = new DriveMutex();\n\nexport class DriveController {\n private readonly bridge: ExtensionBridge;\n private readonly registry: SessionRegistry;\n private lastError?: DriveErrorInfo;\n private lastErrorAt?: string;\n\n constructor(bridge: ExtensionBridge, registry: SessionRegistry) {\n this.bridge = bridge;\n this.registry = registry;\n }\n\n getLastError(): { error: DriveErrorInfo; at: string } | undefined {\n if (!this.lastError || !this.lastErrorAt) {\n return undefined;\n }\n return { error: this.lastError, at: this.lastErrorAt };\n }\n\n private recordError(error: DriveErrorInfo): void {\n this.lastError = error;\n this.lastErrorAt = new Date().toISOString();\n }\n\n async execute<T>(\n sessionId: string,\n action: DriveAction,\n params?: Record<string, unknown>,\n timeoutMs?: number\n ): Promise<DriveResult<T>> {\n return await driveMutex.runExclusive(async () => {\n try {\n this.registry.require(sessionId);\n } catch (error) {\n if (error instanceof SessionError) {\n const errorInfo: DriveErrorInfo = {\n code: error.code,\n message: error.message,\n retryable: false,\n };\n this.recordError(errorInfo);\n return {\n ok: false,\n error: errorInfo,\n };\n }\n const errorInfo: DriveErrorInfo = {\n code: 'INTERNAL',\n message: 'Unexpected error while validating session.',\n retryable: false,\n };\n this.recordError(errorInfo);\n return {\n ok: false,\n error: errorInfo,\n };\n }\n\n if (this.bridge.isConnected()) {\n this.ensureDriveReady(sessionId);\n }\n\n let attempt = 0;\n while (true) {\n try {\n const response = await this.bridge.request<T>(\n action,\n params,\n timeoutMs\n );\n if (response.status === 'ok') {\n return {\n ok: true,\n result: response.result as T,\n };\n }\n\n const errorInfo: DriveErrorInfo = response.error ?? {\n code: 'UNKNOWN',\n message: 'Drive operation failed.',\n retryable: false,\n };\n\n if (shouldRetryDriveOp({ attempt, retryable: errorInfo.retryable })) {\n attempt += 1;\n continue;\n }\n\n this.recordError(errorInfo);\n return { ok: false, error: errorInfo };\n } catch (error) {\n if (error instanceof ExtensionBridgeError) {\n if (error.code === 'EXTENSION_DISCONNECTED') {\n this.applyDriveDisconnected(sessionId);\n }\n const errorInfo = toDriveError(error);\n if (\n shouldRetryDriveOp({ attempt, retryable: errorInfo.retryable })\n ) {\n attempt += 1;\n continue;\n }\n this.recordError(errorInfo);\n return { ok: false, error: errorInfo };\n }\n\n const errorInfo: DriveErrorInfo = {\n code: 'INTERNAL',\n message: 'Unexpected error while executing drive action.',\n retryable: false,\n };\n this.recordError(errorInfo);\n return {\n ok: false,\n error: errorInfo,\n };\n }\n }\n });\n }\n\n private ensureDriveReady(sessionId: string): void {\n try {\n const session = this.registry.require(sessionId);\n if (session.state === SessionState.INIT) {\n this.registry.apply(sessionId, 'DRIVE_CONNECTED');\n } else if (session.state === SessionState.INSPECT_READY) {\n this.registry.apply(sessionId, 'DRIVE_CONNECTED');\n } else if (session.state === SessionState.DEGRADED_DRIVE) {\n this.registry.apply(sessionId, 'RECOVER_SUCCEEDED');\n }\n } catch (error) {\n console.debug(\n `Drive ready transition ignored for session ${sessionId}.`,\n error\n );\n }\n }\n\n private applyDriveDisconnected(sessionId: string): void {\n try {\n const session = this.registry.require(sessionId);\n if (session.state === SessionState.READY) {\n this.registry.apply(sessionId, 'DRIVE_DISCONNECTED');\n }\n } catch (error) {\n console.debug(\n `Drive disconnect transition ignored for session ${sessionId}.`,\n error\n );\n }\n }\n}\n", "export type AxNodeRecord = {\n nodeId?: string;\n backendDOMNodeId?: number;\n role?: { value?: string } | string;\n name?: { value?: string } | string;\n ignored?: boolean;\n childIds?: string[];\n properties?: unknown[];\n ref?: string;\n};\n\nconst INTERACTIVE_AX_ROLES = new Set([\n 'button',\n 'link',\n 'textbox',\n 'combobox',\n 'listbox',\n 'checkbox',\n 'radio',\n 'switch',\n 'searchbox',\n 'spinbutton',\n 'slider',\n 'option',\n]);\n\nconst DECORATIVE_AX_ROLES = new Set(['generic', 'none', 'presentation']);\n\nexport const LABEL_AX_ROLES = new Set([\n 'textbox',\n 'combobox',\n 'listbox',\n 'checkbox',\n 'radio',\n 'switch',\n 'searchbox',\n 'spinbutton',\n 'slider',\n]);\n\nexport const getAxNodes = (snapshot: unknown): AxNodeRecord[] => {\n const nodes = Array.isArray(snapshot)\n ? snapshot\n : (snapshot as { nodes?: unknown[] })?.nodes;\n return Array.isArray(nodes) ? (nodes as AxNodeRecord[]) : [];\n};\n\nconst replaceAxNodes = (snapshot: unknown, nodes: AxNodeRecord[]): unknown => {\n if (Array.isArray(snapshot)) {\n return nodes;\n }\n if (snapshot && typeof snapshot === 'object') {\n (snapshot as { nodes?: unknown[] }).nodes = nodes;\n }\n return snapshot;\n};\n\nexport const getAxRole = (node: AxNodeRecord): string => {\n const role =\n typeof node.role === 'string' ? node.role : (node.role?.value ?? '');\n return typeof role === 'string' ? role.toLowerCase() : '';\n};\n\nexport const getAxName = (node: AxNodeRecord): string => {\n const name =\n typeof node.name === 'string' ? node.name : (node.name?.value ?? '');\n return typeof name === 'string' ? name : '';\n};\n\nconst hasAxValue = (node: AxNodeRecord): boolean => {\n if (!Array.isArray(node.properties)) {\n return false;\n }\n for (const prop of node.properties) {\n if (!prop || typeof prop !== 'object') {\n continue;\n }\n const value = (prop as { value?: { value?: unknown } }).value?.value;\n if (value === undefined || value === null) {\n continue;\n }\n if (typeof value === 'string' && value.trim().length === 0) {\n continue;\n }\n return true;\n }\n return false;\n};\n\nexport const normalizeQuery = (value: string): string =>\n value.trim().toLowerCase();\n\nexport const matchesTextValue = (value: string, query: string): boolean => {\n if (!query) {\n return false;\n }\n return value.toLowerCase().includes(query);\n};\n\nexport const matchesAxText = (node: AxNodeRecord, query: string): boolean => {\n if (!query) {\n return false;\n }\n const candidates = [getAxName(node)];\n if (Array.isArray(node.properties)) {\n for (const prop of node.properties) {\n if (!prop || typeof prop !== 'object') {\n continue;\n }\n const value = (prop as { value?: { value?: unknown } }).value?.value;\n if (value === undefined || value === null) {\n continue;\n }\n if (typeof value === 'string') {\n candidates.push(value);\n } else if (typeof value === 'number' || typeof value === 'boolean') {\n candidates.push(String(value));\n }\n }\n }\n return candidates.some((text) => matchesTextValue(text, query));\n};\n\nconst isInteractiveAxNode = (node: AxNodeRecord): boolean => {\n const role = getAxRole(node);\n return Boolean(role && INTERACTIVE_AX_ROLES.has(role));\n};\n\nconst filterAxSnapshot = (\n snapshot: unknown,\n predicate: (node: AxNodeRecord) => boolean\n): unknown => {\n const nodes = getAxNodes(snapshot);\n if (nodes.length === 0) {\n return snapshot;\n }\n const keepIds = new Set<string>();\n const filtered = nodes.filter((node) => {\n if (!node || typeof node !== 'object') {\n return false;\n }\n const keep = predicate(node);\n if (keep && typeof node.nodeId === 'string') {\n keepIds.add(node.nodeId);\n }\n return keep;\n });\n for (const node of filtered) {\n if (Array.isArray(node.childIds)) {\n node.childIds = node.childIds.filter((id) => keepIds.has(id));\n }\n }\n return replaceAxNodes(snapshot, filtered);\n};\n\nconst collectKeptDescendants = (\n nodeId: string,\n nodeById: Map<string, AxNodeRecord>,\n keepIds: Set<string>,\n visited: Set<string> = new Set()\n): string[] => {\n if (visited.has(nodeId)) {\n return [];\n }\n visited.add(nodeId);\n if (keepIds.has(nodeId)) {\n return [nodeId];\n }\n const node = nodeById.get(nodeId);\n if (!node || !Array.isArray(node.childIds)) {\n return [];\n }\n const output: string[] = [];\n for (const childId of node.childIds) {\n output.push(...collectKeptDescendants(childId, nodeById, keepIds, visited));\n }\n return output;\n};\n\nconst shouldKeepCompactNode = (node: AxNodeRecord): boolean => {\n if (node.ignored) {\n return false;\n }\n const role = getAxRole(node);\n if (role && INTERACTIVE_AX_ROLES.has(role)) {\n return true;\n }\n const name = getAxName(node);\n const hasName = name.trim().length > 0;\n const hasValue = hasAxValue(node);\n if (hasName || hasValue) {\n return true;\n }\n const hasChildren = Array.isArray(node.childIds) && node.childIds.length > 0;\n if (!role || DECORATIVE_AX_ROLES.has(role)) {\n return false;\n }\n return hasChildren;\n};\n\nconst compactAxSnapshot = (snapshot: unknown): unknown => {\n const nodes = getAxNodes(snapshot);\n if (nodes.length === 0) {\n return snapshot;\n }\n const nodeById = new Map<string, AxNodeRecord>();\n nodes.forEach((node) => {\n if (node && typeof node.nodeId === 'string') {\n nodeById.set(node.nodeId, node);\n }\n });\n\n const keepIds = new Set<string>();\n for (const node of nodes) {\n if (!node || typeof node !== 'object' || typeof node.nodeId !== 'string') {\n continue;\n }\n if (shouldKeepCompactNode(node)) {\n keepIds.add(node.nodeId);\n }\n }\n\n const filtered = nodes.filter(\n (node) =>\n node && typeof node.nodeId === 'string' && keepIds.has(node.nodeId)\n );\n\n for (const node of filtered) {\n if (!Array.isArray(node.childIds) || typeof node.nodeId !== 'string') {\n continue;\n }\n const nextChildIds: string[] = [];\n for (const childId of node.childIds) {\n nextChildIds.push(...collectKeptDescendants(childId, nodeById, keepIds));\n }\n node.childIds = Array.from(new Set(nextChildIds));\n }\n\n return replaceAxNodes(snapshot, filtered);\n};\n\nexport const applyAxSnapshotFilters = (\n snapshot: unknown,\n options: { interactiveOnly?: boolean; compact?: boolean }\n): unknown => {\n let filtered = snapshot;\n if (options.compact) {\n filtered = compactAxSnapshot(filtered);\n }\n if (options.interactiveOnly) {\n filtered = filterAxSnapshot(filtered, (node) => isInteractiveAxNode(node));\n }\n return filtered;\n};\n\nexport const truncateAxSnapshot = (\n snapshot: unknown,\n maxNodes: number\n): { snapshot: unknown; truncated: boolean } => {\n const nodes = getAxNodes(snapshot);\n if (!Number.isFinite(maxNodes) || maxNodes <= 0) {\n return { snapshot, truncated: false };\n }\n if (nodes.length === 0 || nodes.length <= maxNodes) {\n return { snapshot, truncated: false };\n }\n\n const nodeById = new Map<string, AxNodeRecord>();\n const parentCount = new Map<string, number>();\n for (const node of nodes) {\n if (!node || typeof node !== 'object' || typeof node.nodeId !== 'string') {\n continue;\n }\n nodeById.set(node.nodeId, node);\n parentCount.set(node.nodeId, parentCount.get(node.nodeId) ?? 0);\n }\n\n // If the snapshot doesn't have stable node ids, fall back to a hard slice.\n if (nodeById.size === 0) {\n const sliced = nodes.slice(0, maxNodes);\n for (const node of sliced) {\n if (node && typeof node === 'object' && Array.isArray(node.childIds)) {\n node.childIds = [];\n }\n }\n return {\n snapshot: replaceAxNodes(snapshot, sliced),\n truncated: true,\n };\n }\n\n for (const node of nodes) {\n if (!node || typeof node !== 'object' || !Array.isArray(node.childIds)) {\n continue;\n }\n for (const childId of node.childIds) {\n if (typeof childId !== 'string') {\n continue;\n }\n parentCount.set(childId, (parentCount.get(childId) ?? 0) + 1);\n }\n }\n\n let roots = Array.from(nodeById.keys()).filter(\n (id) => (parentCount.get(id) ?? 0) === 0\n );\n if (roots.length === 0) {\n const first = nodes.find(\n (node) => node && typeof node.nodeId === 'string'\n )?.nodeId;\n if (first) {\n roots = [first];\n }\n }\n\n const kept = new Set<string>();\n const visited = new Set<string>();\n const queue: string[] = [...roots];\n while (queue.length > 0 && kept.size < maxNodes) {\n const id = queue.shift();\n if (!id || visited.has(id)) {\n continue;\n }\n visited.add(id);\n const node = nodeById.get(id);\n if (!node) {\n continue;\n }\n kept.add(id);\n if (Array.isArray(node.childIds)) {\n for (const childId of node.childIds) {\n if (typeof childId === 'string' && !visited.has(childId)) {\n queue.push(childId);\n }\n }\n }\n }\n\n // As a last resort, keep the first n nodes that have ids.\n if (kept.size === 0) {\n const fallback: string[] = [];\n for (const node of nodes) {\n if (fallback.length >= maxNodes) {\n break;\n }\n if (node && typeof node.nodeId === 'string') {\n fallback.push(node.nodeId);\n }\n }\n fallback.forEach((id) => kept.add(id));\n }\n\n const filtered = nodes.filter(\n (node) => node && typeof node.nodeId === 'string' && kept.has(node.nodeId)\n );\n for (const node of filtered) {\n if (Array.isArray(node.childIds)) {\n node.childIds = node.childIds.filter(\n (id) => typeof id === 'string' && kept.has(id)\n );\n }\n }\n\n return {\n snapshot: replaceAxNodes(snapshot, filtered),\n truncated: true,\n };\n};\n", "import type { DebuggerEventRecord } from '../debugger-bridge';\nimport type { ConsoleEntry } from '../inspect';\n\ntype SourceLocation = { url?: string; line?: number; column?: number };\n\nconst toSourceLocation = (input: {\n url?: unknown;\n lineNumber?: unknown;\n columnNumber?: unknown;\n}): SourceLocation | undefined => {\n const url =\n typeof input.url === 'string' && input.url.length > 0\n ? input.url\n : undefined;\n const line =\n typeof input.lineNumber === 'number' && Number.isFinite(input.lineNumber)\n ? Math.max(1, Math.floor(input.lineNumber) + 1)\n : undefined;\n const column =\n typeof input.columnNumber === 'number' &&\n Number.isFinite(input.columnNumber)\n ? Math.max(1, Math.floor(input.columnNumber) + 1)\n : undefined;\n if (!url && !line && !column) {\n return undefined;\n }\n return {\n ...(url ? { url } : {}),\n ...(line ? { line } : {}),\n ...(column ? { column } : {}),\n };\n};\n\nconst toStackFrames = (\n stackTrace: unknown\n):\n | Array<{\n functionName?: string;\n url?: string;\n line?: number;\n column?: number;\n }>\n | undefined => {\n const frames: Array<{\n functionName?: string;\n url?: string;\n line?: number;\n column?: number;\n }> = [];\n\n const collect = (trace: unknown): void => {\n if (!trace || typeof trace !== 'object') {\n return;\n }\n const callFrames = (trace as { callFrames?: unknown }).callFrames;\n if (Array.isArray(callFrames)) {\n for (const frame of callFrames) {\n if (!frame || typeof frame !== 'object') {\n continue;\n }\n const functionName =\n typeof (frame as { functionName?: unknown }).functionName === 'string'\n ? String((frame as { functionName?: unknown }).functionName)\n : undefined;\n const url =\n typeof (frame as { url?: unknown }).url === 'string'\n ? String((frame as { url?: unknown }).url)\n : undefined;\n const lineNumber = (frame as { lineNumber?: unknown }).lineNumber;\n const columnNumber = (frame as { columnNumber?: unknown }).columnNumber;\n\n const loc = toSourceLocation({ url, lineNumber, columnNumber });\n frames.push({\n ...(functionName ? { functionName } : {}),\n ...(loc?.url ? { url: loc.url } : {}),\n ...(loc?.line ? { line: loc.line } : {}),\n ...(loc?.column ? { column: loc.column } : {}),\n });\n\n if (frames.length >= 50) {\n return;\n }\n }\n }\n const parent = (trace as { parent?: unknown }).parent;\n if (frames.length < 50 && parent) {\n collect(parent);\n }\n };\n\n collect(stackTrace);\n return frames.length > 0 ? frames : undefined;\n};\n\nconst toRemoteObjectSummary = (\n obj: unknown\n):\n | {\n type?: string;\n subtype?: string;\n description?: string;\n value?: unknown;\n unserializableValue?: string;\n }\n | undefined => {\n if (!obj || typeof obj !== 'object') {\n return undefined;\n }\n const raw = obj as {\n type?: unknown;\n subtype?: unknown;\n description?: unknown;\n value?: unknown;\n unserializableValue?: unknown;\n };\n const type = typeof raw.type === 'string' ? raw.type : undefined;\n const subtype = typeof raw.subtype === 'string' ? raw.subtype : undefined;\n const description =\n typeof raw.description === 'string' ? raw.description : undefined;\n const unserializableValue =\n typeof raw.unserializableValue === 'string'\n ? raw.unserializableValue\n : undefined;\n\n const out: {\n type?: string;\n subtype?: string;\n description?: string;\n value?: unknown;\n unserializableValue?: string;\n } = {};\n\n if (type) out.type = type;\n if (subtype) out.subtype = subtype;\n if (description) out.description = description;\n if (raw.value !== undefined) out.value = raw.value;\n if (unserializableValue) out.unserializableValue = unserializableValue;\n\n return Object.keys(out).length > 0 ? out : undefined;\n};\n\nconst stringifyRemoteObject = (value: unknown): string => {\n if (!value || typeof value !== 'object') {\n return String(value ?? '');\n }\n const obj = value as {\n value?: unknown;\n description?: string;\n unserializableValue?: string;\n type?: string;\n };\n if (obj.unserializableValue) {\n return obj.unserializableValue;\n }\n if (obj.value !== undefined) {\n try {\n return typeof obj.value === 'string'\n ? obj.value\n : JSON.stringify(obj.value);\n } catch {\n return String(obj.value);\n }\n }\n if (obj.description) {\n return obj.description;\n }\n return obj.type ?? '';\n};\n\nexport const toConsoleEntry = (\n event: DebuggerEventRecord\n): ConsoleEntry | null => {\n const params = event.params ?? {};\n switch (event.method) {\n case 'Runtime.consoleAPICalled': {\n const rawArgs = Array.isArray((params as { args?: unknown[] }).args)\n ? (params as { args: unknown[] }).args\n : [];\n const text = rawArgs.map((arg) => stringifyRemoteObject(arg)).join(' ');\n const level = String((params as { type?: string }).type ?? 'log');\n const stack = toStackFrames(\n (params as { stackTrace?: unknown }).stackTrace\n );\n const args = rawArgs\n .map((arg) => toRemoteObjectSummary(arg))\n .filter((entry): entry is NonNullable<typeof entry> => Boolean(entry));\n return {\n level,\n text,\n timestamp: event.timestamp,\n ...(stack && stack.length > 0 ? { stack } : {}),\n ...(args.length > 0 ? { args } : {}),\n };\n }\n case 'Runtime.exceptionThrown': {\n const details = (\n params as {\n exceptionDetails?: {\n text?: string;\n url?: string;\n lineNumber?: number;\n columnNumber?: number;\n stackTrace?: unknown;\n exception?: unknown;\n };\n }\n ).exceptionDetails;\n\n const exception = toRemoteObjectSummary(details?.exception);\n const stack = toStackFrames(details?.stackTrace);\n const source =\n toSourceLocation({\n url: details?.url,\n lineNumber: details?.lineNumber,\n columnNumber: details?.columnNumber,\n }) ??\n // If the top frame exists, treat it as the source.\n (stack && stack.length > 0\n ? {\n url: stack[0].url,\n line: stack[0].line,\n column: stack[0].column,\n }\n : undefined);\n\n const baseText =\n typeof details?.text === 'string' && details.text.trim().length > 0\n ? details.text\n : 'Uncaught exception';\n const exceptionDesc =\n typeof exception?.description === 'string' &&\n exception.description.trim().length > 0\n ? exception.description\n : undefined;\n\n // CDP often reports `exceptionDetails.text` as just \"Uncaught\".\n // Enrich the message with the exception description when available.\n const text =\n baseText === 'Uncaught' && exceptionDesc\n ? `Uncaught: ${exceptionDesc}`\n : baseText;\n\n return {\n level: 'error',\n text,\n timestamp: event.timestamp,\n ...(source ? { source } : {}),\n ...(stack && stack.length > 0 ? { stack } : {}),\n ...(exception ? { exception } : {}),\n };\n }\n case 'Log.entryAdded': {\n const entry = (\n params as {\n entry?: {\n level?: string;\n text?: string;\n url?: string;\n lineNumber?: number;\n stackTrace?: unknown;\n timestamp?: number;\n };\n }\n ).entry;\n if (!entry) {\n return null;\n }\n const stack = toStackFrames(entry.stackTrace);\n const source = toSourceLocation({\n url: entry.url,\n lineNumber: entry.lineNumber,\n columnNumber: undefined,\n });\n return {\n level: entry.level ?? 'log',\n text: entry.text ?? '',\n timestamp: event.timestamp,\n ...(source ? { source } : {}),\n ...(stack && stack.length > 0 ? { stack } : {}),\n };\n }\n default:\n return null;\n }\n};\n", "import type { DebuggerEventRecord } from '../debugger-bridge';\n\ntype HarLog = {\n log: {\n version: string;\n creator: { name: string; version: string };\n pages: Array<{\n id: string;\n title: string;\n startedDateTime: string;\n pageTimings: { onContentLoad: number; onLoad: number };\n }>;\n entries: unknown[];\n };\n};\n\nexport const buildHar = (\n events: DebuggerEventRecord[],\n title?: string\n): HarLog => {\n type RequestRecord = {\n id: string;\n url?: string;\n method?: string;\n startTime?: number;\n endTime?: number;\n requestHeaders?: Record<string, string>;\n responseHeaders?: Record<string, string>;\n status?: number;\n statusText?: string;\n mimeType?: string;\n encodedDataLength?: number;\n protocol?: string;\n };\n\n const requests = new Map<string, RequestRecord>();\n\n const toTimestamp = (\n event: DebuggerEventRecord,\n fallback?: number\n ): number => {\n const raw = (event.params as { timestamp?: number; wallTime?: number })\n ?.wallTime;\n if (typeof raw === 'number') {\n return raw * 1000;\n }\n const ts = (event.params as { timestamp?: number })?.timestamp;\n if (typeof ts === 'number') {\n return ts * 1000;\n }\n const parsed = Date.parse(event.timestamp);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n return fallback ?? Date.now();\n };\n\n for (const event of events) {\n const params = event.params ?? {};\n switch (event.method) {\n case 'Network.requestWillBeSent': {\n const requestId = String((params as { requestId?: unknown }).requestId);\n if (!requestId) {\n break;\n }\n const request = (\n params as {\n request?: {\n url?: string;\n method?: string;\n headers?: Record<string, string>;\n };\n }\n ).request;\n const record: RequestRecord = {\n id: requestId,\n url: request?.url,\n method: request?.method,\n requestHeaders: request?.headers ?? {},\n startTime: toTimestamp(event),\n };\n requests.set(requestId, record);\n break;\n }\n case 'Network.responseReceived': {\n const requestId = String((params as { requestId?: unknown }).requestId);\n if (!requestId) {\n break;\n }\n const response = (\n params as {\n response?: {\n status?: number;\n statusText?: string;\n mimeType?: string;\n headers?: Record<string, string>;\n protocol?: string;\n };\n }\n ).response;\n const record = requests.get(requestId) ?? { id: requestId };\n record.status = response?.status;\n record.statusText = response?.statusText;\n record.mimeType = response?.mimeType;\n record.responseHeaders = response?.headers ?? {};\n record.protocol = response?.protocol;\n record.startTime = record.startTime ?? toTimestamp(event);\n requests.set(requestId, record);\n break;\n }\n case 'Network.loadingFinished': {\n const requestId = String((params as { requestId?: unknown }).requestId);\n if (!requestId) {\n break;\n }\n const record = requests.get(requestId) ?? { id: requestId };\n record.encodedDataLength = (\n params as { encodedDataLength?: number }\n ).encodedDataLength;\n record.endTime = toTimestamp(event, record.startTime);\n requests.set(requestId, record);\n break;\n }\n case 'Network.loadingFailed': {\n const requestId = String((params as { requestId?: unknown }).requestId);\n if (!requestId) {\n break;\n }\n const record = requests.get(requestId) ?? { id: requestId };\n record.endTime = toTimestamp(event, record.startTime);\n requests.set(requestId, record);\n break;\n }\n default:\n break;\n }\n }\n\n const entries = Array.from(requests.values()).map((record) => {\n const started = record.startTime ?? Date.now();\n const ended = record.endTime ?? started;\n const time = Math.max(0, ended - started);\n const url = record.url ?? '';\n const queryString: Array<{ name: string; value: string }> = [];\n try {\n const parsed = new URL(url);\n parsed.searchParams.forEach((value, name) => {\n queryString.push({ name, value });\n });\n } catch {\n // Ignore URL parse failures.\n }\n\n return {\n pageref: 'page_0',\n startedDateTime: new Date(started).toISOString(),\n time,\n request: {\n method: record.method ?? 'GET',\n url,\n httpVersion: record.protocol ?? 'HTTP/1.1',\n cookies: [],\n headers: [],\n queryString,\n headersSize: -1,\n bodySize: -1,\n },\n response: {\n status: record.status ?? 0,\n statusText: record.statusText ?? '',\n httpVersion: record.protocol ?? 'HTTP/1.1',\n cookies: [],\n headers: [],\n redirectURL: '',\n headersSize: -1,\n bodySize: record.encodedDataLength ?? 0,\n content: {\n size: record.encodedDataLength ?? 0,\n mimeType: record.mimeType ?? '',\n },\n },\n cache: {},\n timings: {\n send: 0,\n wait: time,\n receive: 0,\n },\n };\n });\n\n const startedDateTime = entries.length\n ? ((entries[0] as { startedDateTime?: string }).startedDateTime ??\n new Date().toISOString())\n : new Date().toISOString();\n\n return {\n log: {\n version: '1.2',\n creator: {\n name: 'browser-bridge',\n version: '0.0.0',\n },\n pages: [\n {\n id: 'page_0',\n title: title ?? 'page',\n startedDateTime,\n pageTimings: {\n onContentLoad: -1,\n onLoad: -1,\n },\n },\n ],\n entries,\n },\n };\n};\n", "import type { DebuggerCommand } from './snapshot-refs';\n\nexport const captureHtml = async (\n tabId: number,\n options: {\n selector?: string;\n debuggerCommand: DebuggerCommand;\n onEvaluationFailed: () => never;\n }\n): Promise<string> => {\n await options.debuggerCommand(tabId, 'Runtime.enable', {});\n const expression = options.selector\n ? `(() => { try { const el = document.querySelector(${JSON.stringify(\n options.selector\n )}); return el ? el.outerHTML : \"\"; } catch { return \"\"; } })()`\n : \"document.documentElement ? document.documentElement.outerHTML : ''\";\n const result = await options.debuggerCommand(tabId, 'Runtime.evaluate', {\n expression,\n returnByValue: true,\n awaitPromise: true,\n });\n\n if (result && typeof result === 'object' && 'exceptionDetails' in result) {\n return options.onEvaluationFailed();\n }\n\n return String(\n (result as { result?: { value?: unknown } })?.result?.value ?? ''\n );\n};\n\nexport const collectHtmlEntries = (html: string): Map<string, string> => {\n const entries = new Map<string, string>();\n const tagPattern = /<([a-zA-Z0-9-]+)([^>]*)>/g;\n let match: RegExpExecArray | null;\n let index = 0;\n while ((match = tagPattern.exec(html)) && entries.size < 1000) {\n const tag = match[1].toLowerCase();\n const attrs = match[2] ?? '';\n const idMatch = /\\bid=[\"']([^\"']+)[\"']/.exec(attrs);\n const classMatch = /\\bclass=[\"']([^\"']+)[\"']/.exec(attrs);\n const id = idMatch?.[1];\n const className = classMatch?.[1]?.split(/\\s+/)[0];\n let key = tag;\n if (id) {\n key = `${tag}#${id}`;\n } else if (className) {\n key = `${tag}.${className}`;\n } else {\n key = `${tag}:nth-${index}`;\n }\n entries.set(key, attrs.trim());\n index += 1;\n }\n return entries;\n};\n", "import { getAxNodes } from './ax-snapshot';\nimport { collectHtmlEntries } from './html-snapshot';\nimport type { DomSnapshotResult } from './types';\n\ntype SnapshotRecord = {\n sessionId: string;\n format: 'ax' | 'html';\n entries: Map<string, string>;\n capturedAt: string;\n};\n\nexport type DomDiffResult = {\n added: string[];\n removed: string[];\n changed: string[];\n summary: string;\n};\n\nexport class SnapshotHistory {\n private readonly history: SnapshotRecord[] = [];\n private readonly maxSnapshotsPerSession: number;\n private readonly maxSnapshotHistory: number;\n\n constructor(options: {\n maxSnapshotsPerSession: number;\n maxSnapshotHistory: number;\n }) {\n this.maxSnapshotsPerSession = Math.max(0, options.maxSnapshotsPerSession);\n this.maxSnapshotHistory = Math.max(0, options.maxSnapshotHistory);\n }\n\n record(sessionId: string, snapshot: DomSnapshotResult): void {\n const entries = this.collectSnapshotEntries(snapshot);\n if (!entries) {\n return;\n }\n this.history.push({\n sessionId,\n format: snapshot.format,\n entries,\n capturedAt: new Date().toISOString(),\n });\n\n let count = 0;\n for (const record of this.history) {\n if (record.sessionId === sessionId) {\n count += 1;\n }\n }\n while (count > this.maxSnapshotsPerSession) {\n const index = this.history.findIndex(\n (record) => record.sessionId === sessionId\n );\n if (index === -1) {\n break;\n }\n this.history.splice(index, 1);\n count -= 1;\n }\n while (this.history.length > this.maxSnapshotHistory) {\n this.history.shift();\n }\n }\n\n diff(sessionId: string): DomDiffResult {\n const snapshots = this.history.filter(\n (record) => record.sessionId === sessionId\n );\n if (snapshots.length < 2) {\n return {\n added: [],\n removed: [],\n changed: [],\n summary: 'Not enough snapshots to diff.',\n };\n }\n const previous = snapshots[snapshots.length - 2];\n const current = snapshots[snapshots.length - 1];\n\n const added: string[] = [];\n const removed: string[] = [];\n const changed: string[] = [];\n\n for (const [key, value] of current.entries.entries()) {\n if (!previous.entries.has(key)) {\n added.push(key);\n } else if (previous.entries.get(key) !== value) {\n changed.push(key);\n }\n }\n for (const key of previous.entries.keys()) {\n if (!current.entries.has(key)) {\n removed.push(key);\n }\n }\n\n return {\n added,\n removed,\n changed,\n summary: `Added ${added.length}, removed ${removed.length}, changed ${changed.length}.`,\n };\n }\n\n private collectSnapshotEntries(\n snapshot: DomSnapshotResult\n ): Map<string, string> | null {\n if (snapshot.format === 'html' && typeof snapshot.snapshot === 'string') {\n return collectHtmlEntries(snapshot.snapshot);\n }\n if (snapshot.format === 'ax') {\n return this.collectAxEntries(snapshot.snapshot);\n }\n return null;\n }\n\n private collectAxEntries(snapshot: unknown): Map<string, string> {\n const entries = new Map<string, string>();\n const nodes = getAxNodes(snapshot);\n if (nodes.length === 0) {\n return entries;\n }\n nodes.forEach((node, index) => {\n if (!node || typeof node !== 'object') {\n return;\n }\n const record = node as {\n nodeId?: string;\n backendDOMNodeId?: number;\n role?: { value?: string } | string;\n name?: { value?: string } | string;\n };\n const role =\n typeof record.role === 'string'\n ? record.role\n : (record.role?.value ?? 'node');\n const name =\n typeof record.name === 'string'\n ? record.name\n : (record.name?.value ?? '');\n const nodeId =\n record.nodeId ??\n (record.backendDOMNodeId !== undefined\n ? String(record.backendDOMNodeId)\n : undefined);\n const key = nodeId ? `node-${nodeId}` : `${role}:${name}:${index}`;\n entries.set(key, `${role}:${name}`);\n });\n return entries;\n }\n}\n", "import { getAxNodes } from './ax-snapshot';\n\nexport type DebuggerCommand = (\n tabId: number,\n method: string,\n params?: Record<string, unknown>,\n timeoutMs?: number\n) => Promise<unknown>;\n\nexport const SNAPSHOT_REF_ATTRIBUTE = 'data-bv-ref';\n\nconst MAX_REF_ASSIGNMENTS = 500;\nconst MAX_REF_WARNINGS = 5;\n\nconst isInspectError = (\n error: unknown\n): error is { name: string; message: string } =>\n Boolean(\n error &&\n typeof error === 'object' &&\n 'name' in error &&\n (error as { name?: unknown }).name === 'InspectError' &&\n 'message' in error &&\n typeof (error as { message?: unknown }).message === 'string'\n );\n\nexport const assignRefsToAxSnapshot = (\n snapshot: unknown\n): Map<number, string> => {\n const nodes = getAxNodes(snapshot);\n const refs = new Map<number, string>();\n let index = 1;\n for (const node of nodes) {\n if (!node || typeof node !== 'object') {\n continue;\n }\n if (node.ignored) {\n continue;\n }\n const backendId = node.backendDOMNodeId;\n if (typeof backendId !== 'number') {\n continue;\n }\n const ref = `@e${index}`;\n index += 1;\n node.ref = ref;\n refs.set(backendId, ref);\n }\n return refs;\n};\n\nexport const clearSnapshotRefs = async (\n tabId: number,\n debuggerCommand: DebuggerCommand\n): Promise<void> => {\n await debuggerCommand(tabId, 'Runtime.evaluate', {\n expression: `document.querySelectorAll('[${SNAPSHOT_REF_ATTRIBUTE}]').forEach((el) => el.removeAttribute('${SNAPSHOT_REF_ATTRIBUTE}'))`,\n returnByValue: true,\n awaitPromise: true,\n });\n};\n\nexport const applySnapshotRefs = async (\n tabId: number,\n refs: Map<number, string>,\n debuggerCommand: DebuggerCommand\n): Promise<string[]> => {\n const warnings: string[] = [];\n await debuggerCommand(tabId, 'DOM.enable', {});\n await debuggerCommand(tabId, 'Runtime.enable', {});\n\n try {\n await clearSnapshotRefs(tabId, debuggerCommand);\n } catch {\n warnings.push('Failed to clear prior snapshot refs.');\n }\n\n if (refs.size === 0) {\n return warnings;\n }\n\n let applied = 0;\n for (const [backendNodeId, ref] of refs) {\n if (applied >= MAX_REF_ASSIGNMENTS) {\n warnings.push(\n `Snapshot refs truncated at ${MAX_REF_ASSIGNMENTS} elements.`\n );\n break;\n }\n try {\n const described = await debuggerCommand(tabId, 'DOM.describeNode', {\n backendNodeId,\n });\n const node = (\n described as { node?: { nodeId?: number; nodeType?: number } }\n ).node;\n if (!node || node.nodeType !== 1 || typeof node.nodeId !== 'number') {\n if (warnings.length < MAX_REF_WARNINGS) {\n warnings.push(`Ref ${ref} could not be applied to a DOM element.`);\n }\n continue;\n }\n await debuggerCommand(tabId, 'DOM.setAttributeValue', {\n nodeId: node.nodeId,\n name: SNAPSHOT_REF_ATTRIBUTE,\n value: ref,\n });\n applied += 1;\n } catch {\n if (warnings.length < MAX_REF_WARNINGS) {\n warnings.push(`Ref ${ref} could not be applied.`);\n }\n }\n }\n return warnings;\n};\n\nexport const resolveNodeIdForSelector = async (\n tabId: number,\n selector: string,\n debuggerCommand: DebuggerCommand\n): Promise<{ nodeId?: number; warnings?: string[] }> => {\n await debuggerCommand(tabId, 'DOM.enable', {});\n const document = await debuggerCommand(tabId, 'DOM.getDocument', {\n depth: 1,\n });\n const rootNodeId = (document as { root?: { nodeId?: number } }).root?.nodeId;\n if (typeof rootNodeId !== 'number') {\n return { warnings: ['Failed to resolve DOM root for selector.'] };\n }\n try {\n const result = await debuggerCommand(tabId, 'DOM.querySelector', {\n nodeId: rootNodeId,\n selector,\n });\n const nodeId = (result as { nodeId?: number }).nodeId;\n if (!nodeId) {\n return { warnings: [`Selector not found: ${selector}`] };\n }\n return { nodeId };\n } catch (error) {\n if (isInspectError(error)) {\n return { warnings: [error.message] };\n }\n return { warnings: ['Selector query failed.'] };\n }\n};\n", "export const PAGE_STATE_SCRIPT = [\n '(() => {',\n ' const escape = (value) => {',\n \" if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\",\n ' return CSS.escape(value);',\n ' }',\n \" return String(value).replace(/[\\\"'\\\\\\\\]/g, '\\\\\\\\$&');\",\n ' };',\n ' const truncate = (value, max) => {',\n \" const text = String(value ?? '');\",\n ' return text.length > max ? text.slice(0, max) : text;',\n ' };',\n ' const selectorFor = (element) => {',\n ' if (element.id) {',\n ' return `#${escape(element.id)}`;',\n ' }',\n \" const name = element.getAttribute('name');\",\n ' if (name) {',\n ' return `${element.tagName.toLowerCase()}[name=\"${escape(name)}\"]`;',\n ' }',\n ' const parts = [];',\n ' let node = element;',\n ' while (node && node.nodeType === 1 && parts.length < 4) {',\n ' let part = node.tagName.toLowerCase();',\n ' const parent = node.parentElement;',\n ' if (parent) {',\n ' const siblings = Array.from(parent.children).filter(',\n ' (child) => child.tagName === node.tagName',\n ' );',\n ' if (siblings.length > 1) {',\n ' part += `:nth-of-type(${siblings.indexOf(node) + 1})`;',\n ' }',\n ' }',\n ' parts.unshift(part);',\n ' node = parent;',\n ' }',\n \" return parts.join('>');\",\n ' };',\n ' const readStorage = (storage, limit) => {',\n ' try {',\n ' return Object.keys(storage)',\n ' .slice(0, limit)',\n ' .map((key) => ({',\n ' key,',\n ' value: truncate(storage.getItem(key), 500),',\n ' }));',\n ' } catch {',\n ' return [];',\n ' }',\n ' };',\n \" const forms = Array.from(document.querySelectorAll('form')).map((form) => {\",\n ' const fields = Array.from(form.elements)',\n ' .filter((element) => element && element.tagName)',\n ' .map((element) => {',\n ' const tag = element.tagName.toLowerCase();',\n \" const type = 'type' in element && element.type ? element.type : tag;\",\n \" const name = element.name || element.getAttribute('name') || element.id || '';\",\n \" let value = '';\",\n ' let options;',\n \" if (tag === 'select') {\",\n ' const select = element;',\n \" value = select.value ?? '';\",\n ' options = Array.from(select.options).map((option) => option.text);',\n \" } else if (tag === 'input' && element.type === 'password') {\",\n \" value = '[redacted]';\",\n \" } else if (tag === 'input' || tag === 'textarea') {\",\n \" value = element.value ?? '';\",\n ' } else if (element.isContentEditable) {',\n \" value = element.textContent ?? '';\",\n \" } else if ('value' in element) {\",\n \" value = element.value ?? '';\",\n ' }',\n ' return {',\n ' name,',\n ' type,',\n ' value: truncate(value, 500),',\n ' ...(options ? { options } : {}),',\n ' };',\n ' });',\n ' return {',\n ' selector: selectorFor(form),',\n \" action: form.getAttribute('action') || undefined,\",\n \" method: form.getAttribute('method') || undefined,\",\n ' fields,',\n ' };',\n ' });',\n ' const localStorage = readStorage(window.localStorage, 100);',\n ' const sessionStorage = readStorage(window.sessionStorage, 100);',\n \" const cookies = (document.cookie ? document.cookie.split(';') : [])\",\n ' .map((entry) => entry.trim())',\n ' .filter((entry) => entry.length > 0)',\n ' .slice(0, 50)',\n ' .map((entry) => {',\n \" const [key, ...rest] = entry.split('=');\",\n \" return { key, value: truncate(rest.join('='), 500) };\",\n ' });',\n ' return { forms, localStorage, sessionStorage, cookies };',\n '})()',\n].join('\\n');\n", "export type TargetHint = {\n url?: string;\n title?: string;\n lastActiveAt?: string;\n};\n\nexport type TargetCandidate = {\n id: string;\n url: string;\n title?: string;\n lastSeenAt?: number;\n};\n\nexport type RankedTarget = {\n candidate: TargetCandidate;\n score: number;\n reasons: string[];\n};\n\nconst normalizeText = (value?: string): string =>\n (value ?? '').trim().toLowerCase();\n\nconst normalizeUrl = (value?: string): string => {\n const normalized = normalizeText(value);\n if (!normalized) {\n return '';\n }\n const hashIndex = normalized.indexOf('#');\n const withoutHash =\n hashIndex >= 0 ? normalized.slice(0, hashIndex) : normalized;\n return withoutHash.endsWith('/') && withoutHash.length > 1\n ? withoutHash.slice(0, -1)\n : withoutHash;\n};\n\nconst scoreUrlMatch = (candidateUrl: string, hintUrl: string): number => {\n if (!candidateUrl || !hintUrl) {\n return 0;\n }\n if (candidateUrl === hintUrl) {\n return 100;\n }\n if (candidateUrl.includes(hintUrl) || hintUrl.includes(candidateUrl)) {\n return 60;\n }\n return 0;\n};\n\nconst scoreTitleMatch = (candidateTitle: string, hintTitle: string): number => {\n if (!candidateTitle || !hintTitle) {\n return 0;\n }\n if (candidateTitle === hintTitle) {\n return 80;\n }\n if (\n candidateTitle.includes(hintTitle) ||\n hintTitle.includes(candidateTitle)\n ) {\n return 40;\n }\n return 0;\n};\n\nconst scoreRecency = (lastSeenAt: number | undefined, now: number): number => {\n if (!lastSeenAt) {\n return 0;\n }\n const ageMinutes = Math.max(0, (now - lastSeenAt) / 60000);\n return Math.max(0, 30 - ageMinutes);\n};\n\nconst scoreHintRecency = (\n lastSeenAt: number | undefined,\n hintLastActiveAt: number | undefined\n): number => {\n if (!lastSeenAt || !hintLastActiveAt) {\n return 0;\n }\n const deltaMinutes = Math.abs(lastSeenAt - hintLastActiveAt) / 60000;\n return Math.max(0, 20 - deltaMinutes);\n};\n\nconst isBlankUrl = (url: string): boolean =>\n url.length === 0 || url === 'about:blank';\n\nexport const rankTargetCandidates = (\n candidates: TargetCandidate[],\n hint?: TargetHint,\n now: number = Date.now()\n): RankedTarget[] => {\n const normalizedHintUrl = normalizeUrl(hint?.url);\n const normalizedHintTitle = normalizeText(hint?.title);\n const hintLastActiveAt = hint?.lastActiveAt\n ? Date.parse(hint.lastActiveAt)\n : undefined;\n\n const ranked = candidates.map((candidate) => {\n const reasons: string[] = [];\n const normalizedUrl = normalizeUrl(candidate.url);\n const normalizedTitle = normalizeText(candidate.title);\n\n let score = 0;\n const urlScore = scoreUrlMatch(normalizedUrl, normalizedHintUrl);\n if (urlScore > 0) {\n score += urlScore;\n reasons.push(urlScore >= 100 ? 'url:exact' : 'url:partial');\n }\n\n const titleScore = scoreTitleMatch(normalizedTitle, normalizedHintTitle);\n if (titleScore > 0) {\n score += titleScore;\n reasons.push(titleScore >= 80 ? 'title:exact' : 'title:partial');\n }\n\n const recencyScore = scoreRecency(candidate.lastSeenAt, now);\n if (recencyScore > 0) {\n score += recencyScore;\n reasons.push('recency');\n }\n\n const hintRecencyScore = scoreHintRecency(\n candidate.lastSeenAt,\n Number.isFinite(hintLastActiveAt) ? hintLastActiveAt : undefined\n );\n if (hintRecencyScore > 0) {\n score += hintRecencyScore;\n reasons.push('hint-recency');\n }\n\n if (isBlankUrl(normalizedUrl)) {\n score -= 50;\n reasons.push('blank-url');\n }\n\n return { candidate, score, reasons };\n });\n\n return ranked.sort((a, b) => {\n if (a.score !== b.score) {\n return b.score - a.score;\n }\n const aSeen = a.candidate.lastSeenAt ?? 0;\n const bSeen = b.candidate.lastSeenAt ?? 0;\n if (aSeen !== bSeen) {\n return bSeen - aSeen;\n }\n return a.candidate.url.localeCompare(b.candidate.url);\n });\n};\n\nexport const pickBestTarget = (\n candidates: TargetCandidate[],\n hint?: TargetHint,\n now: number = Date.now()\n): RankedTarget | null => {\n const ranked = rankTargetCandidates(candidates, hint, now);\n return ranked.length > 0 ? ranked[0] : null;\n};\n", "import { z } from 'zod';\n\n// Keep error codes stable; add new codes without renaming existing ones.\nexport const ErrorCodeSchema = z.enum([\n 'UNKNOWN',\n 'INVALID_ARGUMENT',\n 'NOT_FOUND',\n 'ALREADY_EXISTS',\n 'FAILED_PRECONDITION',\n 'UNAUTHORIZED',\n 'FORBIDDEN',\n 'PERMISSION_REQUIRED',\n 'PERMISSION_DENIED',\n 'PERMISSION_PROMPT_TIMEOUT',\n 'CONFLICT',\n 'TIMEOUT',\n 'CANCELLED',\n 'UNAVAILABLE',\n 'RATE_LIMITED',\n 'NOT_IMPLEMENTED',\n 'INTERNAL',\n 'SESSION_NOT_FOUND',\n 'SESSION_CLOSED',\n 'SESSION_BROKEN',\n 'DRIVE_UNAVAILABLE',\n 'INSPECT_UNAVAILABLE',\n 'EXTENSION_DISCONNECTED',\n 'DEBUGGER_IN_USE',\n 'ATTACH_DENIED',\n 'TAB_NOT_FOUND',\n 'NOT_SUPPORTED',\n 'LOCATOR_NOT_FOUND',\n 'NAVIGATION_FAILED',\n 'EVALUATION_FAILED',\n 'ARTIFACT_IO_ERROR',\n]);\n\nexport type ErrorCode = z.infer<typeof ErrorCodeSchema>;\n\nexport const ErrorInfoSchema = z.object({\n code: ErrorCodeSchema,\n message: z.string(),\n retryable: z.boolean(),\n details: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type ErrorInfo = z.infer<typeof ErrorInfoSchema>;\n\nexport const ErrorEnvelopeSchema = z.object({\n ok: z.literal(false),\n error: ErrorInfoSchema,\n});\n\nexport type ErrorEnvelope = z.infer<typeof ErrorEnvelopeSchema>;\n\nexport const successEnvelopeSchema = <T extends z.ZodTypeAny>(result: T) =>\n z.object({\n ok: z.literal(true),\n result,\n });\n\nexport const apiEnvelopeSchema = <T extends z.ZodTypeAny>(result: T) =>\n z.union([successEnvelopeSchema(result), ErrorEnvelopeSchema]);\n\nexport type SuccessEnvelope<T> = {\n ok: true;\n result: T;\n};\n\nexport type ApiEnvelope<T> = SuccessEnvelope<T> | ErrorEnvelope;\n", "import { z } from 'zod';\nimport { ErrorInfoSchema } from './errors';\n\nexport const LocatorRoleSchema = z.object({\n name: z.string(),\n value: z.string().optional(),\n});\n\nexport const LocatorSchema = z\n .object({\n ref: z.string().min(1).optional(),\n testid: z.string().min(1).optional(),\n css: z.string().min(1).optional(),\n text: z.string().min(1).optional(),\n role: LocatorRoleSchema.optional(),\n })\n .refine(\n (value) =>\n Boolean(\n value.ref || value.testid || value.css || value.text || value.role\n ),\n {\n message: 'Locator must include at least one selector.',\n }\n );\n\nexport const OpResultSchema = z.object({\n ok: z.literal(true),\n message: z.string().optional(),\n warnings: z.array(z.string()).optional(),\n});\n\nexport const SessionStateSchema = z.enum([\n 'INIT',\n 'DRIVE_READY',\n 'INSPECT_READY',\n 'READY',\n 'DEGRADED_DRIVE',\n 'DEGRADED_INSPECT',\n 'BROKEN',\n 'CLOSED',\n]);\n\nexport const SessionInfoSchema = z.object({\n session_id: z.string(),\n state: SessionStateSchema,\n created_at: z.string().datetime().optional(),\n});\n\nexport const SessionPlaneStatusSchema = z.object({\n connected: z.boolean(),\n last_seen_at: z.string().datetime().optional(),\n error: ErrorInfoSchema.optional(),\n});\n\nexport const SessionStatusSchema = z.object({\n session_id: z.string(),\n state: SessionStateSchema,\n drive: SessionPlaneStatusSchema.optional(),\n inspect: SessionPlaneStatusSchema.optional(),\n updated_at: z.string().datetime().optional(),\n});\n\nexport const RecoverResultSchema = z.object({\n session_id: z.string(),\n recovered: z.boolean(),\n state: SessionStateSchema,\n message: z.string().optional(),\n});\n\nexport const DiagnosticCheckSchema = z.object({\n name: z.string(),\n ok: z.boolean(),\n message: z.string().optional(),\n details: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const DiagnosticReportSchema = z.object({\n ok: z.boolean(),\n session_id: z.string().optional(),\n checks: z.array(DiagnosticCheckSchema).optional(),\n sessions: z\n .object({\n count: z.number().finite().optional(),\n max_age_ms: z.number().finite().optional(),\n max_idle_ms: z.number().finite().optional(),\n })\n .optional(),\n extension: z\n .object({\n connected: z.boolean().optional(),\n version: z.string().optional(),\n last_seen_at: z.string().datetime().optional(),\n })\n .optional(),\n debugger: z\n .object({\n attached: z.boolean().optional(),\n idle_timeout_ms: z.number().finite().optional(),\n console_buffer_size: z.number().finite().optional(),\n network_buffer_size: z.number().finite().optional(),\n last_error: ErrorInfoSchema.optional(),\n })\n .optional(),\n artifacts: z\n .object({\n root_dir: z.string().optional(),\n })\n .optional(),\n recovery: z\n .object({\n last_attempt: z\n .object({\n session_id: z.string(),\n recovered: z.boolean(),\n state: SessionStateSchema,\n message: z.string().optional(),\n at: z.string(),\n })\n .optional(),\n attempts: z\n .array(\n z.object({\n session_id: z.string(),\n recovered: z.boolean(),\n state: SessionStateSchema,\n message: z.string().optional(),\n at: z.string(),\n })\n )\n .optional(),\n success_count: z.number().finite().optional(),\n failure_count: z.number().finite().optional(),\n success_rate: z.number().finite().optional(),\n recent_failure_count: z.number().finite().optional(),\n loop_detected: z.boolean().optional(),\n })\n .optional(),\n warnings: z.array(z.string()).optional(),\n notes: z.array(z.string()).optional(),\n});\n\nexport const SessionIdSchema = z.object({\n session_id: z.string().min(1),\n});\n\nexport const SessionCreateInputSchema = z.object({}).strict().default({});\nexport const SessionCreateOutputSchema = SessionInfoSchema;\n\nexport const SessionStatusInputSchema = SessionIdSchema;\nexport const SessionStatusOutputSchema = SessionStatusSchema;\n\nexport const SessionRecoverInputSchema = SessionIdSchema;\nexport const SessionRecoverOutputSchema = RecoverResultSchema;\n\nexport const SessionCloseInputSchema = SessionIdSchema;\nexport const SessionCloseOutputSchema = z.object({\n ok: z.boolean(),\n});\n\nexport const DriveWaitConditionSchema = z.object({\n kind: z.enum(['locator_visible', 'text_present', 'url_matches']),\n value: z.string().min(1),\n});\n\nexport const DriveNavigateInputSchema = z.object({\n session_id: z.string().min(1),\n url: z.string().min(1),\n tab_id: z.number().finite().optional(),\n wait: z.enum(['none', 'domcontentloaded']).default('domcontentloaded'),\n});\nexport const DriveNavigateOutputSchema = OpResultSchema;\n\nexport const DriveGoBackInputSchema = z.object({\n session_id: z.string().min(1),\n tab_id: z.number().finite().optional(),\n});\nexport const DriveGoBackOutputSchema = OpResultSchema;\n\nexport const DriveGoForwardInputSchema = z.object({\n session_id: z.string().min(1),\n tab_id: z.number().finite().optional(),\n});\nexport const DriveGoForwardOutputSchema = OpResultSchema;\n\nexport const DriveBackInputSchema = DriveGoBackInputSchema;\nexport const DriveBackOutputSchema = OpResultSchema;\n\nexport const DriveForwardInputSchema = DriveGoForwardInputSchema;\nexport const DriveForwardOutputSchema = OpResultSchema;\n\nexport const DriveClickInputSchema = z.object({\n session_id: z.string().min(1),\n locator: LocatorSchema,\n tab_id: z.number().finite().optional(),\n click_count: z.number().finite().optional(),\n});\nexport const DriveClickOutputSchema = OpResultSchema;\n\nexport const DriveHoverInputSchema = z.object({\n session_id: z.string().min(1),\n locator: LocatorSchema,\n delay_ms: z.number().min(0).max(10000).optional(),\n tab_id: z.number().finite().optional(),\n});\nexport const DriveHoverOutputSchema = z.object({\n format: z.literal('html'),\n snapshot: z.string(),\n});\n\nexport const DriveSelectInputSchema = z\n .object({\n session_id: z.string().min(1),\n locator: LocatorSchema,\n value: z.string().min(1).optional(),\n text: z.string().min(1).optional(),\n index: z.number().int().min(0).optional(),\n tab_id: z.number().finite().optional(),\n })\n .refine((value) => value.value || value.text || value.index !== undefined, {\n message: 'Either value, text, or index must be provided.',\n path: ['select'],\n });\nexport const DriveSelectOutputSchema = OpResultSchema;\n\nexport const DriveTypeInputSchema = z.object({\n session_id: z.string().min(1),\n locator: LocatorSchema.optional(),\n text: z.string().min(1),\n tab_id: z.number().finite().optional(),\n clear: z.boolean().default(false),\n submit: z.boolean().default(false),\n});\nexport const DriveTypeOutputSchema = OpResultSchema;\n\nexport const DriveFillFormFieldSchema = z\n .object({\n selector: z.string().min(1).optional(),\n locator: LocatorSchema.optional(),\n value: z.union([z.string(), z.boolean()]),\n type: z\n .enum(['auto', 'text', 'select', 'checkbox', 'radio', 'contentEditable'])\n .default('auto'),\n submit: z.boolean().default(false),\n })\n .refine((value) => Boolean(value.selector || value.locator), {\n message: 'fill_form field requires selector or locator.',\n path: ['selector'],\n });\n\nexport const DriveFillFormInputSchema = z.object({\n session_id: z.string().min(1),\n fields: z.array(DriveFillFormFieldSchema).min(1),\n tab_id: z.number().finite().optional(),\n});\nexport const DriveFillFormOutputSchema = z.object({\n filled: z.number().finite(),\n attempted: z.number().finite(),\n errors: z.array(z.string()).optional(),\n});\n\nexport const DriveDragInputSchema = z.object({\n session_id: z.string().min(1),\n from: LocatorSchema,\n to: LocatorSchema,\n steps: z.number().min(1).max(50).default(12),\n tab_id: z.number().finite().optional(),\n});\nexport const DriveDragOutputSchema = OpResultSchema;\n\nexport const DriveHandleDialogInputSchema = z.object({\n session_id: z.string().min(1),\n action: z.enum(['accept', 'dismiss']),\n promptText: z.string().optional(),\n tab_id: z.number().finite().optional(),\n});\nexport const DriveHandleDialogOutputSchema = OpResultSchema;\n\nexport const DialogAcceptInputSchema = SessionIdSchema.extend({\n promptText: z.string().optional(),\n tab_id: z.number().finite().optional(),\n});\nexport const DialogAcceptOutputSchema = OpResultSchema;\n\nexport const DialogDismissInputSchema = SessionIdSchema.extend({\n tab_id: z.number().finite().optional(),\n});\nexport const DialogDismissOutputSchema = OpResultSchema;\n\nexport const DriveKeyModifiersSchema = z.object({\n ctrl: z.boolean().optional(),\n alt: z.boolean().optional(),\n shift: z.boolean().optional(),\n meta: z.boolean().optional(),\n});\n\nexport const DriveKeyPressInputSchema = z.object({\n session_id: z.string().min(1),\n key: z.string().min(1),\n modifiers: DriveKeyModifiersSchema.optional(),\n tab_id: z.number().finite().optional(),\n});\nexport const DriveKeyPressOutputSchema = OpResultSchema;\n\nexport const DriveKeyModifierSchema = z.enum(['ctrl', 'alt', 'shift', 'meta']);\n\nexport const DriveKeyInputSchema = z.object({\n session_id: z.string().min(1),\n key: z.string().min(1),\n modifiers: z.array(DriveKeyModifierSchema).optional(),\n repeat: z.number().int().min(1).max(50).optional(),\n tab_id: z.number().finite().optional(),\n});\nexport const DriveKeyOutputSchema = OpResultSchema;\n\nexport const DriveScrollInputSchema = z\n .object({\n session_id: z.string().min(1),\n delta_x: z.number().finite().optional(),\n delta_y: z.number().finite().optional(),\n top: z.number().finite().optional(),\n left: z.number().finite().optional(),\n behavior: z.enum(['auto', 'smooth']).optional(),\n tab_id: z.number().finite().optional(),\n })\n .refine(\n (value) =>\n value.delta_x !== undefined ||\n value.delta_y !== undefined ||\n value.top !== undefined ||\n value.left !== undefined,\n {\n message: 'scroll requires delta_x/delta_y or top/left.',\n path: ['scroll'],\n }\n );\nexport const DriveScrollOutputSchema = OpResultSchema;\n\nexport const DriveWaitForInputSchema = z.object({\n session_id: z.string().min(1),\n condition: DriveWaitConditionSchema,\n timeout_ms: z.number().finite().optional(),\n tab_id: z.number().finite().optional(),\n});\nexport const DriveWaitForOutputSchema = OpResultSchema;\n\nexport const DriveTabInfoSchema = z.object({\n tab_id: z.number().finite(),\n window_id: z.number().finite(),\n url: z.string().min(1),\n title: z.string(),\n active: z.boolean().optional(),\n last_active_at: z.string().datetime().optional(),\n});\n\nexport const DriveTabListInputSchema = SessionIdSchema;\nexport const DriveTabListOutputSchema = z.object({\n tabs: z.array(DriveTabInfoSchema),\n});\n\nexport const DriveTabActivateInputSchema = z.object({\n session_id: z.string().min(1),\n tab_id: z.number().finite(),\n});\nexport const DriveTabActivateOutputSchema = OpResultSchema;\n\nexport const DriveTabCloseInputSchema = z.object({\n session_id: z.string().min(1),\n tab_id: z.number().finite(),\n});\nexport const DriveTabCloseOutputSchema = OpResultSchema;\n\nexport const InspectDomFormatSchema = z.enum(['ax', 'html']);\nexport const InspectConsistencySchema = z.enum(['best_effort', 'quiesce']);\n\nexport const TargetHintSchema = z.object({\n url: z.string().min(1).optional(),\n title: z.string().min(1).optional(),\n last_active_at: z.string().optional(),\n lastActiveAt: z.string().optional(),\n});\n\nexport const FormFieldInfoSchema = z.object({\n name: z.string(),\n type: z.string(),\n value: z.string(),\n options: z.array(z.string()).optional(),\n});\n\nexport const FormInfoSchema = z.object({\n selector: z.string(),\n action: z.string().optional(),\n method: z.string().optional(),\n fields: z.array(FormFieldInfoSchema),\n});\n\nexport const StorageEntrySchema = z.object({\n key: z.string(),\n value: z.string(),\n});\n\nexport const PageStateSchema = z.object({\n forms: z.array(FormInfoSchema),\n localStorage: z.array(StorageEntrySchema),\n sessionStorage: z.array(StorageEntrySchema),\n cookies: z.array(StorageEntrySchema),\n warnings: z.array(z.string()).optional(),\n});\n\nexport const DomSnapshotSchema = z\n .object({\n format: InspectDomFormatSchema,\n snapshot: z.unknown(),\n })\n .passthrough();\n\nexport const InspectDomSnapshotInputSchema = z.object({\n session_id: z.string().min(1),\n format: InspectDomFormatSchema.default('ax'),\n consistency: InspectConsistencySchema.default('best_effort'),\n interactive: z.boolean().default(false),\n compact: z.boolean().default(false),\n // Used primarily to bound large AX trees for LLM/agent consumption.\n // CLI passes this as a string, so coerce for convenience.\n max_nodes: z.coerce.number().int().positive().max(50000).optional(),\n selector: z.string().min(1).optional(),\n target: TargetHintSchema.optional(),\n});\nexport const InspectDomSnapshotOutputSchema = DomSnapshotSchema;\n\nexport const DomDiffResultSchema = z.object({\n added: z.array(z.string()),\n removed: z.array(z.string()),\n changed: z.array(z.string()),\n summary: z.string(),\n});\n\nexport const InspectDomDiffInputSchema = SessionIdSchema;\nexport const InspectDomDiffOutputSchema = DomDiffResultSchema;\n\nexport const InspectFindRoleInputSchema = SessionIdSchema.extend({\n kind: z.literal('role'),\n role: z.string().min(1),\n name: z.string().min(1).optional(),\n target: TargetHintSchema.optional(),\n});\n\nexport const InspectFindTextInputSchema = SessionIdSchema.extend({\n kind: z.literal('text'),\n text: z.string().min(1),\n target: TargetHintSchema.optional(),\n});\n\nexport const InspectFindLabelInputSchema = SessionIdSchema.extend({\n kind: z.literal('label'),\n label: z.string().min(1),\n target: TargetHintSchema.optional(),\n});\n\nexport const InspectFindInputSchema = z.discriminatedUnion('kind', [\n InspectFindRoleInputSchema,\n InspectFindTextInputSchema,\n InspectFindLabelInputSchema,\n]);\n\nexport const InspectFindMatchSchema = z.object({\n ref: z.string(),\n role: z.string().optional(),\n name: z.string().optional(),\n});\n\nexport const InspectFindOutputSchema = z.object({\n matches: z.array(InspectFindMatchSchema),\n warnings: z.array(z.string()).optional(),\n});\n\nexport const InspectPageStateInputSchema = SessionIdSchema.extend({\n target: TargetHintSchema.optional(),\n});\nexport const InspectPageStateOutputSchema = PageStateSchema;\n\nexport const InspectExtractContentFormatSchema = z.enum([\n 'markdown',\n 'text',\n 'article_json',\n]);\n\nexport const InspectExtractContentInputSchema = SessionIdSchema.extend({\n format: InspectExtractContentFormatSchema.default('markdown'),\n include_metadata: z.boolean().default(true),\n target: TargetHintSchema.optional(),\n});\n\nexport const InspectExtractContentOutputSchema = z.object({\n content: z.string(),\n title: z.string().optional(),\n byline: z.string().optional(),\n excerpt: z.string().optional(),\n siteName: z.string().optional(),\n warnings: z.array(z.string()).optional(),\n});\n\nexport const InspectConsoleListInputSchema = SessionIdSchema.extend({\n target: TargetHintSchema.optional(),\n});\n// Console output may expand over time; include a stable core + allow passthrough.\nexport const ConsoleSourceLocationSchema = z\n .object({\n url: z.string().optional(),\n // 1-based line/column for human readability.\n line: z.number().int().positive().optional(),\n column: z.number().int().positive().optional(),\n })\n .passthrough();\n\nexport const ConsoleStackFrameSchema = z\n .object({\n functionName: z.string().optional(),\n url: z.string().optional(),\n // 1-based line/column for human readability.\n line: z.number().int().positive().optional(),\n column: z.number().int().positive().optional(),\n })\n .passthrough();\n\nexport const ConsoleRemoteObjectSchema = z\n .object({\n type: z.string().optional(),\n subtype: z.string().optional(),\n description: z.string().optional(),\n value: z.unknown().optional(),\n unserializableValue: z.string().optional(),\n })\n .passthrough();\n\nexport const ConsoleEntrySchema = z\n .object({\n level: z.string().optional(),\n text: z.string().optional(),\n timestamp: z.string().datetime().optional(),\n source: ConsoleSourceLocationSchema.optional(),\n stack: z.array(ConsoleStackFrameSchema).optional(),\n exception: ConsoleRemoteObjectSchema.optional(),\n args: z.array(ConsoleRemoteObjectSchema).optional(),\n })\n .passthrough();\nexport const ConsoleListSchema = z\n .object({\n entries: z.array(ConsoleEntrySchema),\n })\n .passthrough();\nexport const InspectConsoleListOutputSchema = ConsoleListSchema;\n\nexport const ArtifactInfoSchema = z.object({\n artifact_id: z.string(),\n path: z.string(),\n mime: z.string(),\n});\n\nexport const InspectNetworkHarInputSchema = SessionIdSchema.extend({\n target: TargetHintSchema.optional(),\n});\nexport const InspectNetworkHarOutputSchema = ArtifactInfoSchema;\n\nexport const InspectEvaluateInputSchema = z.object({\n session_id: z.string().min(1),\n expression: z.string().min(1).optional(),\n target: TargetHintSchema.optional(),\n});\n// Evaluate output is implementation-defined; allow passthrough fields.\nexport const EvaluateResultSchema = z\n .object({\n value: z.unknown().optional(),\n exception: z.unknown().optional(),\n })\n .passthrough();\nexport const InspectEvaluateOutputSchema = EvaluateResultSchema;\n\nexport const InspectPerformanceMetricsInputSchema = SessionIdSchema.extend({\n target: TargetHintSchema.optional(),\n});\n// Performance metrics output shape may expand; allow passthrough metadata.\nexport const PerformanceMetricSchema = z\n .object({\n name: z.string(),\n value: z.number().finite(),\n })\n .passthrough();\nexport const PerformanceMetricsSchema = z\n .object({\n metrics: z.array(PerformanceMetricSchema),\n })\n .passthrough();\nexport const InspectPerformanceMetricsOutputSchema = PerformanceMetricsSchema;\n\nexport const ArtifactsScreenshotInputSchema = z.object({\n session_id: z.string().min(1),\n target: z.enum(['viewport', 'full']).default('viewport'),\n fullPage: z.boolean().default(false),\n selector: z.string().min(1).optional(),\n format: z.enum(['png', 'jpeg', 'webp']).default('png'),\n quality: z.number().min(0).max(100).optional(),\n});\nexport const ArtifactsScreenshotOutputSchema = ArtifactInfoSchema;\n\nexport const HealthCheckInputSchema = z.object({});\nexport const HealthCheckOutputSchema = z\n .object({\n started_at: z.string().min(1),\n uptime_ms: z.number().finite().nonnegative(),\n memory: z\n .object({\n rss: z.number().finite().nonnegative(),\n heapTotal: z.number().finite().nonnegative(),\n heapUsed: z.number().finite().nonnegative(),\n external: z.number().finite().nonnegative(),\n arrayBuffers: z.number().finite().nonnegative().optional(),\n })\n .passthrough(),\n sessions: z\n .object({\n active: z.number().finite().nonnegative(),\n })\n .passthrough(),\n extension: z\n .object({\n connected: z.boolean(),\n last_seen_at: z.string().min(1).optional(),\n })\n .passthrough(),\n })\n .passthrough();\n\nexport const DiagnosticsDoctorInputSchema = z.object({\n session_id: z.string().min(1).optional(),\n});\nexport const DiagnosticsDoctorOutputSchema = DiagnosticReportSchema;\n", "import { InspectError, InspectService, createInspectService } from '../inspect';\nimport type { ExtensionBridge } from '../extension-bridge';\nimport type { SessionRegistry } from '../session';\nimport { ArtifactsScreenshotInputSchema } from '@btraut/browser-bridge-shared';\nimport {\n ResponseLike,\n deriveHintFromTabs,\n errorStatus,\n isRecord,\n sendError,\n sendResult,\n} from './shared';\n\ntype RequestLike = {\n body?: unknown;\n};\n\ntype RouteRegistry = {\n post: (\n path: string,\n handler: (req: RequestLike, res: ResponseLike) => void\n ) => void;\n};\n\ntype ErrorEnvelope = {\n ok: false;\n error: {\n code:\n | 'INVALID_ARGUMENT'\n | 'NOT_IMPLEMENTED'\n | 'ARTIFACT_IO_ERROR'\n | 'SESSION_NOT_FOUND'\n | 'SESSION_CLOSED'\n | 'INSPECT_UNAVAILABLE'\n | 'EXTENSION_DISCONNECTED'\n | 'DEBUGGER_IN_USE'\n | 'ATTACH_DENIED'\n | 'TAB_NOT_FOUND'\n | 'NOT_SUPPORTED'\n | 'TIMEOUT';\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n };\n};\n\ntype ArtifactsRoutesOptions = {\n registry?: SessionRegistry;\n inspectService?: InspectService;\n extensionBridge?: ExtensionBridge;\n};\n\nconst sendArtifactsError = (\n res: ResponseLike,\n code: ErrorEnvelope['error']['code'],\n message: string,\n details?: Record<string, unknown>,\n retryable = false\n): void => {\n sendError(res, errorStatus(code), {\n code,\n message,\n retryable,\n ...(details ? { details } : {}),\n });\n};\n\nexport const registerArtifactsRoutes = (\n router: RouteRegistry,\n options: ArtifactsRoutesOptions = {}\n): void => {\n const inspect =\n options.inspectService ??\n (options.registry\n ? createInspectService({ registry: options.registry })\n : undefined);\n\n router.post('/artifacts/screenshot', async (req, res) => {\n if (!isRecord(req.body)) {\n sendArtifactsError(\n res,\n 'INVALID_ARGUMENT',\n 'Request body must be an object.'\n );\n return;\n }\n\n const parsed = ArtifactsScreenshotInputSchema.safeParse(req.body);\n if (!parsed.success) {\n const issue = parsed.error.issues[0];\n sendArtifactsError(\n res,\n 'INVALID_ARGUMENT',\n issue?.message ?? 'Invalid screenshot request.',\n issue?.path.length\n ? {\n field: issue.path.map((part) => String(part)).join('.'),\n }\n : undefined\n );\n return;\n }\n\n const input = parsed.data;\n const target = input.fullPage ? 'full' : input.target;\n\n try {\n if (!inspect) {\n sendArtifactsError(\n res,\n 'NOT_IMPLEMENTED',\n 'artifacts.screenshot is not implemented yet.'\n );\n return;\n }\n\n const hint = deriveHintFromTabs(\n options.extensionBridge?.getStatus().tabs ?? []\n );\n const result = await inspect.screenshot({\n sessionId: input.session_id,\n target,\n selector: input.selector,\n format: input.format,\n quality: input.quality,\n targetHint: hint,\n });\n sendResult(res, result);\n } catch (error) {\n if (error instanceof InspectError) {\n sendArtifactsError(\n res,\n error.code as ErrorEnvelope['error']['code'],\n error.message,\n error.details,\n error.retryable\n );\n return;\n }\n sendArtifactsError(\n res,\n 'ARTIFACT_IO_ERROR',\n 'Failed to capture screenshot.'\n );\n }\n });\n};\n", "import { getArtifactRootDir } from './artifacts';\nimport type { RecoveryAttempt, RecoveryMetrics } from './recovery';\n\nexport type DiagnosticCheck = {\n name: string;\n ok: boolean;\n message?: string;\n details?: Record<string, unknown>;\n};\n\nexport type DiagnosticReport = {\n ok: boolean;\n session_id?: string;\n checks?: DiagnosticCheck[];\n sessions?: {\n count?: number;\n max_age_ms?: number;\n max_idle_ms?: number;\n };\n extension?: {\n connected?: boolean;\n version?: string;\n last_seen_at?: string;\n };\n debugger?: {\n attached?: boolean;\n idle_timeout_ms?: number;\n console_buffer_size?: number;\n network_buffer_size?: number;\n last_error?: {\n code: string;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n };\n };\n artifacts?: {\n root_dir?: string;\n };\n recovery?: {\n last_attempt?: {\n session_id: string;\n recovered: boolean;\n state: string;\n message?: string;\n at: string;\n };\n attempts?: {\n session_id: string;\n recovered: boolean;\n state: string;\n message?: string;\n at: string;\n }[];\n success_count?: number;\n failure_count?: number;\n success_rate?: number;\n recent_failure_count?: number;\n loop_detected?: boolean;\n };\n warnings?: string[];\n notes?: string[];\n};\n\nexport type DiagnosticsContext = {\n sessionState?: string;\n sessions?: {\n count: number;\n maxAgeMs?: number;\n maxIdleMs?: number;\n };\n extension?: {\n connected: boolean;\n lastSeenAt?: string;\n };\n debugger?: {\n attached: boolean;\n idle_timeout_ms: number;\n console_buffer_size: number;\n network_buffer_size: number;\n last_error?: {\n code: string;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n };\n };\n driveLastError?: {\n code: string;\n message: string;\n retryable: boolean;\n at: string;\n };\n inspectLastError?: {\n code: string;\n message: string;\n retryable: boolean;\n at: string;\n };\n recoveryAttempt?: RecoveryAttempt;\n recoveryMetrics?: RecoveryMetrics;\n};\n\nexport const buildDiagnosticReport = (\n sessionId?: string,\n context: DiagnosticsContext = {}\n): DiagnosticReport => {\n const extensionConnected = context.extension?.connected ?? false;\n const debuggerAttached = context.debugger?.attached ?? false;\n const sessionState = context.sessionState;\n\n const checks: DiagnosticCheck[] = [\n {\n name: 'extension.connected',\n ok: extensionConnected,\n message: extensionConnected\n ? 'Extension is connected.'\n : 'Extension is not connected.',\n },\n {\n name: 'debugger.attached',\n ok: debuggerAttached,\n message: debuggerAttached\n ? 'Debugger is attached.'\n : 'Debugger is not attached.',\n },\n {\n name: 'session.state',\n ok: Boolean(sessionState),\n message: sessionState\n ? `Session state is ${sessionState}.`\n : sessionId\n ? 'Session state unavailable.'\n : 'Session id not provided.',\n details: {\n session_id: sessionId || null,\n state: sessionState ?? 'UNKNOWN',\n },\n },\n ];\n\n if (context.driveLastError) {\n checks.push({\n name: 'drive.last_error',\n ok: false,\n message: context.driveLastError.message,\n details: {\n code: context.driveLastError.code,\n retryable: context.driveLastError.retryable,\n at: context.driveLastError.at,\n },\n });\n }\n\n if (context.inspectLastError) {\n checks.push({\n name: 'inspect.last_error',\n ok: false,\n message: context.inspectLastError.message,\n details: {\n code: context.inspectLastError.code,\n retryable: context.inspectLastError.retryable,\n at: context.inspectLastError.at,\n },\n });\n }\n\n if (context.recoveryAttempt) {\n checks.push({\n name: 'recovery.last_attempt',\n ok: context.recoveryAttempt.recovered,\n message: context.recoveryAttempt.message ?? 'Recovery attempt recorded.',\n details: {\n session_id: context.recoveryAttempt.sessionId,\n state: context.recoveryAttempt.state,\n at: context.recoveryAttempt.at,\n },\n });\n }\n\n const formatRecoveryAttempt = (attempt: RecoveryAttempt) => ({\n session_id: attempt.sessionId,\n recovered: attempt.recovered,\n state: attempt.state,\n message: attempt.message,\n at: attempt.at,\n });\n const recoveryAttempts = context.recoveryMetrics?.attempts;\n const lastRecoveryAttempt =\n context.recoveryAttempt ??\n (recoveryAttempts && recoveryAttempts[recoveryAttempts.length - 1]);\n\n const report: DiagnosticReport = {\n ok: checks.every((check) => check.ok),\n session_id: sessionId,\n checks,\n sessions: context.sessions\n ? {\n count: context.sessions.count,\n max_age_ms: context.sessions.maxAgeMs,\n max_idle_ms: context.sessions.maxIdleMs,\n }\n : undefined,\n extension: {\n connected: extensionConnected,\n last_seen_at: context.extension?.lastSeenAt,\n },\n debugger: context.debugger\n ? {\n attached: debuggerAttached,\n idle_timeout_ms: context.debugger.idle_timeout_ms,\n console_buffer_size: context.debugger.console_buffer_size,\n network_buffer_size: context.debugger.network_buffer_size,\n last_error: context.debugger.last_error,\n }\n : undefined,\n artifacts: sessionId\n ? {\n root_dir: getArtifactRootDir(sessionId),\n }\n : undefined,\n recovery:\n context.recoveryMetrics || lastRecoveryAttempt\n ? {\n ...(lastRecoveryAttempt\n ? { last_attempt: formatRecoveryAttempt(lastRecoveryAttempt) }\n : {}),\n ...(recoveryAttempts\n ? { attempts: recoveryAttempts.map(formatRecoveryAttempt) }\n : {}),\n ...(context.recoveryMetrics\n ? {\n success_count: context.recoveryMetrics.successCount,\n failure_count: context.recoveryMetrics.failureCount,\n success_rate: context.recoveryMetrics.successRate,\n recent_failure_count:\n context.recoveryMetrics.recentFailureCount,\n loop_detected: context.recoveryMetrics.loopDetected,\n }\n : {}),\n }\n : undefined,\n notes: ['Diagnostics include runtime status; some checks may be stubbed.'],\n };\n\n return report;\n};\n", "import { DiagnosticsContext, buildDiagnosticReport } from '../diagnostics';\nimport type { SessionRegistry } from '../session';\nimport type { ExtensionBridge } from '../extension-bridge';\nimport type { DriveController } from '../drive';\nimport type { InspectService } from '../inspect';\nimport type { DebuggerBridge } from '../debugger-bridge';\nimport type { RecoveryTracker } from '../recovery';\nimport { HealthCheckInputSchema } from '@btraut/browser-bridge-shared';\nimport { ResponseLike, isRecord, sendError, sendResult } from './shared';\n\ntype RequestLike = {\n body?: unknown;\n};\n\ntype RouteRegistry = {\n post: (\n path: string,\n handler: (req: RequestLike, res: ResponseLike) => void\n ) => void;\n};\n\ntype DiagnosticsRoutesOptions = {\n registry?: SessionRegistry;\n extensionBridge?: ExtensionBridge;\n debuggerBridge?: DebuggerBridge;\n drive?: DriveController;\n inspectService?: InspectService;\n recoveryTracker?: RecoveryTracker;\n};\n\nconst PROCESS_STARTED_AT = new Date(\n Date.now() - Math.floor(process.uptime() * 1000)\n).toISOString();\n\nexport const registerDiagnosticsRoutes = (\n router: RouteRegistry,\n options: DiagnosticsRoutesOptions = {}\n): void => {\n router.post('/health_check', (req, res) => {\n const body = req.body ?? {};\n if (!isRecord(body)) {\n sendError(res, 400, {\n code: 'INVALID_ARGUMENT',\n message: 'Request body must be an object.',\n retryable: false,\n });\n return;\n }\n\n const parsed = HealthCheckInputSchema.safeParse(body);\n if (!parsed.success) {\n const issue = parsed.error.issues[0];\n sendError(res, 400, {\n code: 'INVALID_ARGUMENT',\n message: issue?.message ?? 'Invalid health check request.',\n retryable: false,\n details: issue?.path.length\n ? { field: issue.path.map((part) => String(part)).join('.') }\n : undefined,\n });\n return;\n }\n\n const sessionsActive = options.registry\n ? options.registry.list().length\n : 0;\n const extensionStatus = options.extensionBridge?.getStatus();\n\n sendResult(res, {\n started_at: PROCESS_STARTED_AT,\n uptime_ms: Math.floor(process.uptime() * 1000),\n memory: process.memoryUsage(),\n sessions: { active: sessionsActive },\n extension: {\n connected: extensionStatus?.connected ?? false,\n ...(extensionStatus?.lastSeenAt\n ? { last_seen_at: extensionStatus.lastSeenAt }\n : {}),\n },\n });\n });\n\n router.post('/diagnostics/doctor', (req, res) => {\n let sessionId: string | undefined;\n if (req.body !== undefined) {\n if (!isRecord(req.body)) {\n sendError(res, 400, {\n code: 'INVALID_ARGUMENT',\n message: 'Request body must be an object.',\n retryable: false,\n });\n return;\n }\n const raw = req.body.session_id;\n if (raw !== undefined && (typeof raw !== 'string' || raw.length === 0)) {\n sendError(res, 400, {\n code: 'INVALID_ARGUMENT',\n message: 'session_id must be a non-empty string.',\n retryable: false,\n details: { field: 'session_id' },\n });\n return;\n }\n sessionId = raw as string | undefined;\n }\n\n try {\n const context: DiagnosticsContext = {};\n if (options.registry && sessionId) {\n try {\n const session = options.registry.require(sessionId);\n context.sessionState = session.state;\n } catch {\n // Ignore missing session for diagnostics.\n }\n }\n\n if (options.registry) {\n const now = Date.now();\n const sessions = options.registry.list();\n let maxAgeMs = 0;\n let maxIdleMs = 0;\n for (const session of sessions) {\n const ageMs = now - session.createdAt.getTime();\n const idleMs = now - session.lastAccessedAt.getTime();\n if (ageMs > maxAgeMs) {\n maxAgeMs = ageMs;\n }\n if (idleMs > maxIdleMs) {\n maxIdleMs = idleMs;\n }\n }\n context.sessions = {\n count: sessions.length,\n ...(sessions.length > 0 ? { maxAgeMs, maxIdleMs } : {}),\n };\n }\n\n if (options.extensionBridge) {\n const status = options.extensionBridge.getStatus();\n context.extension = {\n connected: status.connected,\n lastSeenAt: status.lastSeenAt,\n };\n }\n\n if (options.debuggerBridge) {\n const settings = options.debuggerBridge.getSettings();\n const lastError = options.debuggerBridge.getLastError();\n context.debugger = {\n attached: options.debuggerBridge.hasAttachments(),\n idle_timeout_ms: settings.idleTimeoutMs,\n console_buffer_size: settings.consoleBufferSize,\n network_buffer_size: settings.networkBufferSize,\n last_error: lastError\n ? {\n code: lastError.error.code,\n message: lastError.error.message,\n retryable: lastError.error.retryable,\n details: lastError.error.details,\n }\n : undefined,\n };\n }\n\n if (options.drive) {\n const lastError = options.drive.getLastError();\n if (lastError) {\n context.driveLastError = {\n code: lastError.error.code,\n message: lastError.error.message,\n retryable: lastError.error.retryable,\n at: lastError.at,\n };\n }\n }\n\n if (options.inspectService) {\n const lastError = options.inspectService.getLastError();\n if (lastError) {\n context.inspectLastError = {\n code: lastError.error.code,\n message: lastError.error.message,\n retryable: lastError.error.retryable,\n at: lastError.at,\n };\n }\n }\n\n if (options.recoveryTracker) {\n const attempt = options.recoveryTracker.getLastAttempt();\n if (attempt) {\n context.recoveryAttempt = {\n sessionId: attempt.sessionId,\n recovered: attempt.recovered,\n state: attempt.state,\n message: attempt.message,\n at: attempt.at,\n };\n }\n context.recoveryMetrics = options.recoveryTracker.getMetrics();\n }\n\n const report = buildDiagnosticReport(sessionId, context);\n sendResult(res, report);\n } catch {\n sendError(res, 500, {\n code: 'INTERNAL',\n message: 'Failed to build diagnostics report.',\n retryable: false,\n });\n }\n });\n};\n", "import { DriveController } from '../drive';\nimport type { DriveAction } from '../drive-protocol';\nimport {\n DriveClickInputSchema,\n DriveBackInputSchema,\n DriveForwardInputSchema,\n DriveGoBackInputSchema,\n DriveGoForwardInputSchema,\n DriveHoverInputSchema,\n DriveDragInputSchema,\n DialogAcceptInputSchema,\n DialogDismissInputSchema,\n DriveFillFormInputSchema,\n DriveHandleDialogInputSchema,\n DriveKeyInputSchema,\n DriveKeyPressInputSchema,\n DriveNavigateInputSchema,\n DriveScrollInputSchema,\n DriveSelectInputSchema,\n DriveTabActivateInputSchema,\n DriveTabCloseInputSchema,\n DriveTabListInputSchema,\n DriveTypeInputSchema,\n DriveWaitForInputSchema,\n} from '@btraut/browser-bridge-shared';\nimport { ResponseLike, errorStatus, sendError, sendResult } from './shared';\n\ntype RequestLike = {\n body?: unknown;\n};\n\ntype RouteRegistry = {\n post: (\n path: string,\n handler: (req: RequestLike, res: ResponseLike) => void\n ) => void;\n};\n\ntype ValidationError = {\n message: string;\n details?: Record<string, unknown>;\n};\n\ntype SchemaLike<T> = {\n safeParse: (body: unknown) =>\n | { success: true; data: T }\n | {\n success: false;\n error: { issues: { message: string; path: PropertyKey[] }[] };\n };\n};\n\ntype DriveRouteOptions = {\n drive: DriveController;\n};\n\ntype HandlerOptions = {\n defaultResult?: unknown;\n timeoutFromParams?: (params: Record<string, unknown>) => number | undefined;\n};\n\nconst parseBody = <T>(\n schema: SchemaLike<T>,\n body: unknown\n): { data?: T; error?: ValidationError } => {\n const result = schema.safeParse(body);\n if (result.success) {\n return { data: result.data };\n }\n const issue = result.error.issues[0];\n const details =\n issue && issue.path.length > 0\n ? { field: issue.path.map((part) => part.toString()).join('.') }\n : undefined;\n return {\n error: {\n message: issue?.message ?? 'Request body is invalid.',\n ...(details ? { details } : {}),\n },\n };\n};\n\nconst makeHandler = <T extends { session_id: string }>(\n action: DriveAction,\n schema: SchemaLike<T>,\n drive: DriveController,\n options: HandlerOptions = {}\n) => {\n return (req: RequestLike, res: ResponseLike): void => {\n const parsed = parseBody(schema, req.body ?? {});\n if (parsed.error) {\n sendError(res, errorStatus('INVALID_ARGUMENT'), {\n code: 'INVALID_ARGUMENT',\n message: parsed.error.message,\n retryable: false,\n ...(parsed.error.details ? { details: parsed.error.details } : {}),\n });\n return;\n }\n\n const body = parsed.data as Record<string, unknown>;\n const sessionId = body.session_id as string;\n const params = { ...body };\n delete params.session_id;\n\n const timeoutMs = options.timeoutFromParams\n ? options.timeoutFromParams(params)\n : undefined;\n\n void drive\n .execute(sessionId, action, params, timeoutMs)\n .then((result) => {\n if (result.ok) {\n const payload =\n result.result === undefined\n ? (options.defaultResult ?? { ok: true })\n : result.result;\n sendResult(res, payload);\n return;\n }\n sendError(res, errorStatus(result.error.code), result.error);\n })\n .catch((error) => {\n console.error('Drive execute failed:', error);\n sendError(res, errorStatus('INTERNAL'), {\n code: 'INTERNAL',\n message: 'Unexpected error while executing drive action.',\n retryable: false,\n details: {\n hint: error instanceof Error ? error.message : 'Unknown error.',\n },\n });\n });\n };\n};\n\nconst makeDialogHandler = <T extends { session_id: string }>(\n action: 'accept' | 'dismiss',\n schema: SchemaLike<T>,\n drive: DriveController\n) => {\n return (req: RequestLike, res: ResponseLike): void => {\n const parsed = parseBody(schema, req.body ?? {});\n if (parsed.error) {\n sendError(res, errorStatus('INVALID_ARGUMENT'), {\n code: 'INVALID_ARGUMENT',\n message: parsed.error.message,\n retryable: false,\n ...(parsed.error.details ? { details: parsed.error.details } : {}),\n });\n return;\n }\n\n const body = parsed.data as T;\n const { session_id: sessionId, ...rest } = body;\n const params = { ...rest, action };\n\n void drive\n .execute(sessionId, 'drive.handle_dialog', params)\n .then((result) => {\n if (result.ok) {\n const payload =\n result.result === undefined ? { ok: true } : result.result;\n sendResult(res, payload);\n return;\n }\n sendError(res, errorStatus(result.error.code), result.error);\n })\n .catch((error) => {\n console.error('Drive execute failed:', error);\n sendError(res, errorStatus('INTERNAL'), {\n code: 'INTERNAL',\n message: 'Unexpected error while executing drive action.',\n retryable: false,\n details: {\n hint: error instanceof Error ? error.message : 'Unknown error.',\n },\n });\n });\n };\n};\n\nexport const registerDriveRoutes = (\n router: RouteRegistry,\n options: DriveRouteOptions\n): void => {\n const { drive } = options;\n\n router.post(\n '/drive/navigate',\n makeHandler('drive.navigate', DriveNavigateInputSchema, drive)\n );\n router.post(\n '/drive/go_back',\n makeHandler('drive.go_back', DriveGoBackInputSchema, drive)\n );\n router.post(\n '/drive/go_forward',\n makeHandler('drive.go_forward', DriveGoForwardInputSchema, drive)\n );\n router.post(\n '/drive/back',\n makeHandler('drive.back', DriveBackInputSchema, drive)\n );\n router.post(\n '/drive/forward',\n makeHandler('drive.forward', DriveForwardInputSchema, drive)\n );\n router.post(\n '/drive/click',\n makeHandler('drive.click', DriveClickInputSchema, drive)\n );\n router.post(\n '/drive/hover',\n makeHandler('drive.hover', DriveHoverInputSchema, drive)\n );\n router.post(\n '/drive/select',\n makeHandler('drive.select', DriveSelectInputSchema, drive)\n );\n router.post(\n '/drive/type',\n makeHandler('drive.type', DriveTypeInputSchema, drive)\n );\n router.post(\n '/drive/fill_form',\n makeHandler('drive.fill_form', DriveFillFormInputSchema, drive)\n );\n router.post(\n '/drive/drag',\n makeHandler('drive.drag', DriveDragInputSchema, drive)\n );\n router.post(\n '/drive/handle_dialog',\n makeHandler('drive.handle_dialog', DriveHandleDialogInputSchema, drive)\n );\n router.post(\n '/dialog/accept',\n makeDialogHandler('accept', DialogAcceptInputSchema, drive)\n );\n router.post(\n '/dialog/dismiss',\n makeDialogHandler('dismiss', DialogDismissInputSchema, drive)\n );\n router.post(\n '/drive/key',\n makeHandler('drive.key', DriveKeyInputSchema, drive)\n );\n router.post(\n '/drive/key_press',\n makeHandler('drive.key_press', DriveKeyPressInputSchema, drive)\n );\n router.post(\n '/drive/scroll',\n makeHandler('drive.scroll', DriveScrollInputSchema, drive)\n );\n router.post(\n '/drive/wait_for',\n makeHandler('drive.wait_for', DriveWaitForInputSchema, drive, {\n timeoutFromParams: (params) => {\n const timeout = params.timeout_ms;\n if (typeof timeout === 'number' && Number.isFinite(timeout)) {\n return Math.max(0, timeout + 1000);\n }\n return undefined;\n },\n })\n );\n router.post(\n '/drive/tab_list',\n makeHandler('drive.tab_list', DriveTabListInputSchema, drive)\n );\n router.post(\n '/drive/tab_activate',\n makeHandler('drive.tab_activate', DriveTabActivateInputSchema, drive)\n );\n router.post(\n '/drive/tab_close',\n makeHandler('drive.tab_close', DriveTabCloseInputSchema, drive)\n );\n};\n", "import { InspectError, InspectService, createInspectService } from '../inspect';\nimport { TargetHint } from '../target-matching';\nimport { SessionRegistry } from '../session';\nimport type { ExtensionBridge } from '../extension-bridge';\nimport {\n InspectConsoleListInputSchema,\n InspectDomDiffInputSchema,\n InspectDomSnapshotInputSchema,\n InspectEvaluateInputSchema,\n InspectFindInputSchema,\n InspectExtractContentInputSchema,\n InspectNetworkHarInputSchema,\n InspectPageStateInputSchema,\n InspectPerformanceMetricsInputSchema,\n} from '@btraut/browser-bridge-shared';\nimport {\n ResponseLike,\n deriveHintFromTabs,\n errorStatus,\n sendError,\n sendResult,\n} from './shared';\n\ntype RequestLike = {\n body?: unknown;\n};\n\ntype RouteRegistry = {\n post: (\n path: string,\n handler: (req: RequestLike, res: ResponseLike) => void\n ) => void;\n};\n\ntype ErrorCode =\n | 'INVALID_ARGUMENT'\n | 'NOT_IMPLEMENTED'\n | 'SESSION_NOT_FOUND'\n | 'SESSION_CLOSED'\n | 'INSPECT_UNAVAILABLE'\n | 'EXTENSION_DISCONNECTED'\n | 'DEBUGGER_IN_USE'\n | 'ATTACH_DENIED'\n | 'TAB_NOT_FOUND'\n | 'NOT_SUPPORTED'\n | 'TIMEOUT'\n | 'EVALUATION_FAILED'\n | 'ARTIFACT_IO_ERROR'\n | 'INTERNAL';\n\ntype ValidationError = {\n message: string;\n details?: Record<string, unknown>;\n};\n\ntype SchemaLike<T> = {\n safeParse: (body: unknown) =>\n | { success: true; data: T }\n | {\n success: false;\n error: { issues: { message: string; path: PropertyKey[] }[] };\n };\n};\n\ntype InspectRoutesOptions = {\n registry: SessionRegistry;\n inspectService?: InspectService;\n extensionBridge?: ExtensionBridge;\n};\n\nconst sendInspectError = (\n res: ResponseLike,\n code: ErrorCode,\n message: string,\n retryable: boolean,\n details?: Record<string, unknown>\n): void => {\n sendError(res, errorStatus(code), {\n code,\n message,\n retryable,\n ...(details ? { details } : {}),\n });\n};\n\ntype TargetHintInput = {\n url?: string;\n title?: string;\n last_active_at?: string;\n lastActiveAt?: string;\n};\n\nconst parseBody = <T>(\n schema: SchemaLike<T>,\n body: unknown\n): { data?: T; error?: ValidationError } => {\n const result = schema.safeParse(body);\n if (result.success) {\n return { data: result.data };\n }\n const issue = result.error.issues[0];\n const details =\n issue && issue.path.length > 0\n ? { field: issue.path.map((part) => part.toString()).join('.') }\n : undefined;\n return {\n error: {\n message: issue?.message ?? 'Request body is invalid.',\n ...(details ? { details } : {}),\n },\n };\n};\n\nconst readTargetHint = (target?: TargetHintInput): TargetHint | undefined => {\n if (!target) {\n return undefined;\n }\n const url = typeof target.url === 'string' ? target.url : undefined;\n const title = typeof target.title === 'string' ? target.title : undefined;\n const lastActiveAtRaw = target.last_active_at ?? target.lastActiveAt;\n const lastActiveAt =\n typeof lastActiveAtRaw === 'string' ? lastActiveAtRaw : undefined;\n if (!url && !title && !lastActiveAt) {\n return undefined;\n }\n return { url, title, lastActiveAt };\n};\n\nconst resolveTargetHint = (\n target: TargetHintInput | undefined,\n options: InspectRoutesOptions\n): TargetHint | undefined => {\n const explicit = readTargetHint(target);\n if (explicit) {\n return explicit;\n }\n const tabs = options.extensionBridge?.getStatus().tabs ?? [];\n return deriveHintFromTabs(tabs);\n};\n\nconst makeHandler =\n <TBody extends { session_id: string }, TResult>(\n schema: SchemaLike<TBody>,\n handler: (body: TBody) => Promise<TResult>\n ) =>\n async (req: RequestLike, res: ResponseLike): Promise<void> => {\n const parsed = parseBody(schema, req.body ?? {});\n if (parsed.error) {\n sendInspectError(\n res,\n 'INVALID_ARGUMENT',\n parsed.error.message,\n false,\n parsed.error.details\n );\n return;\n }\n\n try {\n const result = await handler(parsed.data as TBody);\n sendResult(res, result);\n } catch (err) {\n if (err instanceof InspectError) {\n sendInspectError(\n res,\n err.code,\n err.message,\n err.retryable,\n err.details\n );\n return;\n }\n sendInspectError(res, 'INTERNAL', 'Unexpected inspect error.', false);\n }\n };\n\nexport const registerInspectRoutes = (\n router: RouteRegistry,\n options: InspectRoutesOptions\n): void => {\n const inspect =\n options.inspectService ??\n createInspectService({\n registry: options.registry,\n extensionBridge: options.extensionBridge,\n });\n\n router.post(\n '/inspect/dom_snapshot',\n makeHandler(InspectDomSnapshotInputSchema, async (body) => {\n return await inspect.domSnapshot({\n sessionId: body.session_id,\n format: body.format,\n consistency: body.consistency,\n interactive: body.interactive,\n compact: body.compact,\n maxNodes: body.max_nodes,\n selector: body.selector,\n targetHint: resolveTargetHint(body.target, options),\n });\n })\n );\n router.post(\n '/inspect/dom_diff',\n makeHandler(InspectDomDiffInputSchema, async (body) => {\n return inspect.domDiff({ sessionId: body.session_id });\n })\n );\n router.post(\n '/inspect/find',\n makeHandler(InspectFindInputSchema, async (body) => {\n const targetHint = resolveTargetHint(body.target, options);\n if (body.kind === 'role') {\n return await inspect.find({\n sessionId: body.session_id,\n kind: 'role',\n role: body.role,\n name: body.name,\n targetHint,\n });\n }\n if (body.kind === 'text') {\n return await inspect.find({\n sessionId: body.session_id,\n kind: 'text',\n text: body.text,\n targetHint,\n });\n }\n return await inspect.find({\n sessionId: body.session_id,\n kind: 'label',\n label: body.label,\n targetHint,\n });\n })\n );\n router.post(\n '/inspect/extract_content',\n makeHandler(InspectExtractContentInputSchema, async (body) => {\n return await inspect.extractContent({\n sessionId: body.session_id,\n format: body.format,\n includeMetadata: body.include_metadata,\n targetHint: resolveTargetHint(body.target, options),\n });\n })\n );\n router.post(\n '/inspect/page_state',\n makeHandler(InspectPageStateInputSchema, async (body) => {\n return await inspect.pageState({\n sessionId: body.session_id,\n targetHint: resolveTargetHint(body.target, options),\n });\n })\n );\n router.post(\n '/inspect/console_list',\n makeHandler(InspectConsoleListInputSchema, async (body) => {\n return await inspect.consoleList({\n sessionId: body.session_id,\n targetHint: resolveTargetHint(body.target, options),\n });\n })\n );\n router.post(\n '/inspect/network_har',\n makeHandler(InspectNetworkHarInputSchema, async (body) => {\n return await inspect.networkHar({\n sessionId: body.session_id,\n targetHint: resolveTargetHint(body.target, options),\n });\n })\n );\n router.post(\n '/inspect/evaluate',\n makeHandler(InspectEvaluateInputSchema, async (body) => {\n return await inspect.evaluate({\n sessionId: body.session_id,\n expression: body.expression,\n targetHint: resolveTargetHint(body.target, options),\n });\n })\n );\n router.post(\n '/inspect/performance_metrics',\n makeHandler(InspectPerformanceMetricsInputSchema, async (body) => {\n return await inspect.performanceMetrics({\n sessionId: body.session_id,\n targetHint: resolveTargetHint(body.target, options),\n });\n })\n );\n};\n", "import { SessionState } from './state';\n\nexport type RecoveryAttempt = {\n sessionId: string;\n recovered: boolean;\n state: SessionState;\n message?: string;\n at: string;\n};\n\nexport type RecoveryMetrics = {\n attempts: RecoveryAttempt[];\n successCount: number;\n failureCount: number;\n successRate: number;\n recentFailureCount: number;\n loopDetected: boolean;\n};\n\nexport class RecoveryTracker {\n private readonly attempts: RecoveryAttempt[] = [];\n private successCount = 0;\n private failureCount = 0;\n private readonly maxAttempts = 10;\n private readonly loopWindowMs = 60_000;\n private readonly loopFailureThreshold = 3;\n\n record(attempt: RecoveryAttempt): void {\n this.attempts.push(attempt);\n if (attempt.recovered) {\n this.successCount += 1;\n } else {\n this.failureCount += 1;\n }\n if (this.attempts.length > this.maxAttempts) {\n this.attempts.shift();\n }\n }\n\n getLastAttempt(): RecoveryAttempt | undefined {\n return this.attempts[this.attempts.length - 1];\n }\n\n getAttempts(): RecoveryAttempt[] {\n return [...this.attempts];\n }\n\n getMetrics(now: number = Date.now()): RecoveryMetrics {\n const recentFailureCount = this.attempts.reduce((count, attempt) => {\n if (attempt.recovered) {\n return count;\n }\n const timestamp = Date.parse(attempt.at);\n if (!Number.isFinite(timestamp)) {\n return count;\n }\n return now - timestamp <= this.loopWindowMs ? count + 1 : count;\n }, 0);\n const total = this.successCount + this.failureCount;\n const successRate = total > 0 ? this.successCount / total : 0;\n return {\n attempts: this.getAttempts(),\n successCount: this.successCount,\n failureCount: this.failureCount,\n successRate,\n recentFailureCount,\n loopDetected: recentFailureCount > this.loopFailureThreshold,\n };\n }\n}\n", "import type {\n DebuggerEvent,\n DebuggerEventParams,\n DebuggerResponse,\n DriveErrorInfo,\n} from './drive-protocol';\nimport {\n ExtensionBridge,\n ExtensionBridgeError,\n toDriveError,\n} from './extension-bridge';\n\nexport type DebuggerEventRecord = {\n tab_id: number;\n method: string;\n params?: Record<string, unknown>;\n timestamp: string;\n};\n\nexport type DebuggerResult<T> =\n | { ok: true; result: T }\n | { ok: false; error: DriveErrorInfo };\n\nexport type DebuggerBridgeOptions = {\n extensionBridge: ExtensionBridge;\n consoleBufferSize?: number;\n networkBufferSize?: number;\n idleTimeoutMs?: number;\n};\n\nconst DEFAULT_CONSOLE_BUFFER_SIZE = 200;\nconst DEFAULT_NETWORK_BUFFER_SIZE = 500;\nconst DEFAULT_IDLE_TIMEOUT_MS = 15000;\n\nconst CONSOLE_METHODS = new Set([\n 'Runtime.consoleAPICalled',\n 'Runtime.exceptionThrown',\n 'Log.entryAdded',\n]);\n\nconst isConsoleEvent = (method: string): boolean => {\n if (CONSOLE_METHODS.has(method)) {\n return true;\n }\n return method.startsWith('Runtime.') && method.includes('console');\n};\n\nconst isNetworkEvent = (method: string): boolean =>\n method.startsWith('Network.');\n\nclass RingBuffer<T> {\n private readonly capacity: number;\n private readonly entries: T[] = [];\n\n constructor(capacity: number) {\n this.capacity = Math.max(0, capacity);\n }\n\n push(entry: T): void {\n if (this.capacity <= 0) {\n return;\n }\n if (this.entries.length >= this.capacity) {\n this.entries.shift();\n }\n this.entries.push(entry);\n }\n\n toArray(): T[] {\n return [...this.entries];\n }\n\n clear(): void {\n this.entries.length = 0;\n }\n}\n\ntype DebuggerTabState = {\n attached: boolean;\n lastActivityAt: string;\n idleTimer?: ReturnType<typeof setTimeout>;\n console: RingBuffer<DebuggerEventRecord>;\n network: RingBuffer<DebuggerEventRecord>;\n};\n\nexport class DebuggerBridge {\n private readonly bridge: ExtensionBridge;\n private readonly consoleBufferSize: number;\n private readonly networkBufferSize: number;\n private readonly idleTimeoutMs: number;\n private readonly tabs = new Map<number, DebuggerTabState>();\n private lastError?: DriveErrorInfo;\n private lastErrorAt?: string;\n private readonly unsubscribe: () => void;\n\n constructor(options: DebuggerBridgeOptions) {\n this.bridge = options.extensionBridge;\n this.consoleBufferSize =\n options.consoleBufferSize ?? DEFAULT_CONSOLE_BUFFER_SIZE;\n this.networkBufferSize =\n options.networkBufferSize ?? DEFAULT_NETWORK_BUFFER_SIZE;\n this.idleTimeoutMs = options.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS;\n\n this.unsubscribe = this.bridge.onDebuggerEvent((event) => {\n this.handleDebuggerEvent(event);\n });\n }\n\n getLastError(): { error: DriveErrorInfo; at: string } | undefined {\n if (!this.lastError || !this.lastErrorAt) {\n return undefined;\n }\n return { error: this.lastError, at: this.lastErrorAt };\n }\n\n getSettings(): {\n idleTimeoutMs: number;\n consoleBufferSize: number;\n networkBufferSize: number;\n } {\n return {\n idleTimeoutMs: this.idleTimeoutMs,\n consoleBufferSize: this.consoleBufferSize,\n networkBufferSize: this.networkBufferSize,\n };\n }\n\n hasAttachments(): boolean {\n for (const state of this.tabs.values()) {\n if (state.attached) {\n return true;\n }\n }\n return false;\n }\n\n getConsoleEvents(tabId: number): DebuggerEventRecord[] {\n return this.ensureTab(tabId).console.toArray();\n }\n\n getNetworkEvents(tabId: number): DebuggerEventRecord[] {\n return this.ensureTab(tabId).network.toArray();\n }\n\n clearBuffers(tabId: number): void {\n const state = this.tabs.get(tabId);\n if (!state) {\n return;\n }\n state.console.clear();\n state.network.clear();\n }\n\n async attach(tabId: number): Promise<DebuggerResult<{ attached: boolean }>> {\n const state = this.ensureTab(tabId);\n if (state.attached) {\n this.touch(tabId, state);\n return { ok: true, result: { attached: true } };\n }\n\n try {\n const response = await this.bridge.requestDebugger(\n 'debugger.attach',\n { tab_id: tabId },\n this.idleTimeoutMs\n );\n\n if (response.status === 'error') {\n const error =\n response.error ??\n ({\n code: 'INSPECT_UNAVAILABLE',\n message: 'Debugger attach failed.',\n retryable: false,\n } as DriveErrorInfo);\n this.recordError(error);\n return { ok: false, error };\n }\n\n state.attached = true;\n this.touch(tabId, state);\n return { ok: true, result: { attached: true } };\n } catch (error) {\n const info = this.handleBridgeError(error);\n return { ok: false, error: info };\n }\n }\n\n async detach(tabId: number): Promise<DebuggerResult<{ attached: boolean }>> {\n const state = this.tabs.get(tabId);\n if (!state || !state.attached) {\n return { ok: true, result: { attached: false } };\n }\n\n try {\n const response = await this.bridge.requestDebugger(\n 'debugger.detach',\n { tab_id: tabId },\n this.idleTimeoutMs\n );\n\n if (response.status === 'error') {\n const error =\n response.error ??\n ({\n code: 'INSPECT_UNAVAILABLE',\n message: 'Debugger detach failed.',\n retryable: false,\n } as DriveErrorInfo);\n this.recordError(error);\n return { ok: false, error };\n }\n\n this.markDetached(tabId);\n return { ok: true, result: { attached: false } };\n } catch (error) {\n const info = this.handleBridgeError(error);\n this.markDetached(tabId);\n return { ok: false, error: info };\n }\n }\n\n async command<T = unknown>(\n tabId: number,\n method: string,\n params?: Record<string, unknown>,\n timeoutMs = 10000\n ): Promise<DebuggerResult<T>> {\n const attachResult = await this.attach(tabId);\n if (!attachResult.ok) {\n return attachResult as DebuggerResult<T>;\n }\n\n try {\n const response: DebuggerResponse<T> = await this.bridge.requestDebugger(\n 'debugger.command',\n {\n tab_id: tabId,\n method,\n params,\n },\n timeoutMs\n );\n\n if (response.status === 'error') {\n const error =\n response.error ??\n ({\n code: 'INSPECT_UNAVAILABLE',\n message: 'Debugger command failed.',\n retryable: false,\n } as DriveErrorInfo);\n this.recordError(error);\n return { ok: false, error };\n }\n\n this.touch(tabId, this.ensureTab(tabId));\n return { ok: true, result: response.result as T };\n } catch (error) {\n const info = this.handleBridgeError(error);\n return { ok: false, error: info };\n }\n }\n\n shutdown(): void {\n this.unsubscribe();\n for (const [tabId, state] of this.tabs) {\n if (state.idleTimer) {\n clearTimeout(state.idleTimer);\n }\n this.tabs.delete(tabId);\n }\n }\n\n private handleDebuggerEvent(event: DebuggerEvent): void {\n if (event.action !== 'debugger.event') {\n return;\n }\n\n const params = event.params as DebuggerEventParams | undefined;\n if (!params || typeof params.tab_id !== 'number') {\n return;\n }\n\n const record: DebuggerEventRecord = {\n tab_id: params.tab_id,\n method: params.method,\n params: params.params as Record<string, unknown> | undefined,\n timestamp: params.timestamp ?? new Date().toISOString(),\n };\n\n const state = this.ensureTab(params.tab_id);\n\n if (record.method === 'Debugger.detached') {\n this.markDetached(params.tab_id);\n return;\n }\n\n if (isConsoleEvent(record.method)) {\n state.console.push(record);\n } else if (isNetworkEvent(record.method)) {\n state.network.push(record);\n }\n\n this.touch(params.tab_id, state);\n }\n\n private ensureTab(tabId: number): DebuggerTabState {\n const existing = this.tabs.get(tabId);\n if (existing) {\n return existing;\n }\n const now = new Date().toISOString();\n const state: DebuggerTabState = {\n attached: false,\n lastActivityAt: now,\n console: new RingBuffer<DebuggerEventRecord>(this.consoleBufferSize),\n network: new RingBuffer<DebuggerEventRecord>(this.networkBufferSize),\n };\n this.tabs.set(tabId, state);\n return state;\n }\n\n private touch(tabId: number, state: DebuggerTabState): void {\n state.lastActivityAt = new Date().toISOString();\n this.scheduleIdleDetach(tabId, state);\n }\n\n private scheduleIdleDetach(tabId: number, state: DebuggerTabState): void {\n if (state.idleTimer) {\n clearTimeout(state.idleTimer);\n }\n state.idleTimer = setTimeout(() => {\n void this.detach(tabId).catch((error) => {\n console.error('DebuggerBridge idle detach failed:', error);\n });\n }, this.idleTimeoutMs);\n }\n\n private markDetached(tabId: number): void {\n const state = this.tabs.get(tabId);\n if (!state) {\n return;\n }\n state.attached = false;\n if (state.idleTimer) {\n clearTimeout(state.idleTimer);\n state.idleTimer = undefined;\n }\n }\n\n private recordError(error: DriveErrorInfo): void {\n this.lastError = error;\n this.lastErrorAt = new Date().toISOString();\n }\n\n private handleBridgeError(error: unknown): DriveErrorInfo {\n if (error instanceof ExtensionBridgeError) {\n const info = toDriveError(error);\n this.recordError(info);\n return info;\n }\n\n const info: DriveErrorInfo = {\n code: 'INSPECT_UNAVAILABLE',\n message:\n error instanceof Error ? error.message : 'Debugger request failed.',\n retryable: false,\n };\n this.recordError(info);\n return info;\n }\n}\n", "import { ApiEnvelope } from '@btraut/browser-bridge-shared';\n\ntype FetchLike = typeof fetch;\n\nexport type CoreClientOptions = {\n host?: string;\n port?: number | string;\n timeoutMs?: number;\n fetchImpl?: FetchLike;\n};\n\nexport type CoreClient = {\n baseUrl: string;\n post: <T>(path: string, body?: unknown) => Promise<ApiEnvelope<T>>;\n};\n\nconst DEFAULT_HOST = '127.0.0.1';\nconst DEFAULT_PORT = 3210;\n// Must be long enough to accommodate user-approval prompts in the extension.\nconst DEFAULT_TIMEOUT_MS = 30000;\n\nconst resolveHost = (host?: string): string => {\n const candidate =\n host?.trim() ||\n process.env.BROWSER_BRIDGE_CORE_HOST ||\n process.env.BROWSER_VISION_CORE_HOST;\n if (candidate && candidate.length > 0) {\n return candidate;\n }\n return DEFAULT_HOST;\n};\n\nconst resolvePort = (port?: number | string): number => {\n const candidate =\n port ??\n (process.env.BROWSER_BRIDGE_CORE_PORT\n ? Number.parseInt(process.env.BROWSER_BRIDGE_CORE_PORT, 10)\n : process.env.BROWSER_VISION_CORE_PORT\n ? Number.parseInt(process.env.BROWSER_VISION_CORE_PORT, 10)\n : undefined);\n\n if (candidate === undefined || candidate === null) {\n return DEFAULT_PORT;\n }\n\n const parsed =\n typeof candidate === 'number' ? candidate : Number.parseInt(candidate, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`Invalid port: ${String(candidate)}`);\n }\n\n return parsed;\n};\n\nconst normalizePath = (path: string): string =>\n path.startsWith('/') ? path : `/${path}`;\n\nexport const createCoreClient = (\n options: CoreClientOptions = {}\n): CoreClient => {\n const host = resolveHost(options.host);\n const port = resolvePort(options.port);\n const baseUrl = `http://${host}:${port}`;\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const fetchImpl = options.fetchImpl ?? fetch;\n\n const requestJson = async <T>(path: string, body?: unknown): Promise<T> => {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const response = await fetchImpl(`${baseUrl}${normalizePath(path)}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n },\n body: body === undefined ? undefined : JSON.stringify(body),\n signal: controller.signal,\n });\n\n const raw = await response.text();\n if (!raw) {\n throw new Error(`Empty response from Core (${response.status}).`);\n }\n\n try {\n return JSON.parse(raw) as T;\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown JSON parse error';\n throw new Error(`Failed to parse Core response: ${message}`);\n }\n } finally {\n clearTimeout(timeout);\n }\n };\n\n const post = async <T>(\n path: string,\n body?: unknown\n ): Promise<ApiEnvelope<T>> => {\n return requestJson<ApiEnvelope<T>>(path, body);\n };\n\n return { baseUrl, post };\n};\n", "import {\n apiEnvelopeSchema,\n ArtifactsScreenshotInputSchema,\n ArtifactsScreenshotOutputSchema,\n DiagnosticsDoctorInputSchema,\n DiagnosticsDoctorOutputSchema,\n DialogAcceptInputSchema,\n DialogAcceptOutputSchema,\n DialogDismissInputSchema,\n DialogDismissOutputSchema,\n HealthCheckInputSchema,\n HealthCheckOutputSchema,\n ErrorEnvelopeSchema,\n DriveClickInputSchema,\n DriveClickOutputSchema,\n DriveDragInputSchema,\n DriveDragOutputSchema,\n DriveFillFormInputSchema,\n DriveFillFormOutputSchema,\n DriveBackInputSchema,\n DriveBackOutputSchema,\n DriveForwardInputSchema,\n DriveForwardOutputSchema,\n DriveGoBackInputSchema,\n DriveGoBackOutputSchema,\n DriveGoForwardInputSchema,\n DriveGoForwardOutputSchema,\n DriveHandleDialogInputSchema,\n DriveHandleDialogOutputSchema,\n DriveHoverInputSchema,\n DriveHoverOutputSchema,\n DriveSelectInputSchema,\n DriveSelectOutputSchema,\n DriveKeyInputSchema,\n DriveKeyOutputSchema,\n DriveKeyPressInputSchema,\n DriveKeyPressOutputSchema,\n DriveNavigateInputSchema,\n DriveNavigateOutputSchema,\n DriveScrollInputSchema,\n DriveScrollOutputSchema,\n DriveTabActivateInputSchema,\n DriveTabActivateOutputSchema,\n DriveTabCloseInputSchema,\n DriveTabCloseOutputSchema,\n DriveTabListInputSchema,\n DriveTabListOutputSchema,\n DriveTypeInputSchema,\n DriveTypeOutputSchema,\n DriveWaitForInputSchema,\n DriveWaitForOutputSchema,\n InspectConsoleListInputSchema,\n InspectConsoleListOutputSchema,\n InspectDomDiffInputSchema,\n InspectDomDiffOutputSchema,\n InspectExtractContentInputSchema,\n InspectExtractContentOutputSchema,\n InspectDomSnapshotInputSchema,\n InspectDomSnapshotOutputSchema,\n InspectEvaluateInputSchema,\n InspectEvaluateOutputSchema,\n InspectFindInputSchema,\n InspectFindOutputSchema,\n InspectPageStateInputSchema,\n InspectPageStateOutputSchema,\n InspectNetworkHarInputSchema,\n InspectNetworkHarOutputSchema,\n InspectPerformanceMetricsInputSchema,\n InspectPerformanceMetricsOutputSchema,\n SessionCloseInputSchema,\n SessionCloseOutputSchema,\n SessionCreateInputSchema,\n SessionCreateOutputSchema,\n SessionRecoverInputSchema,\n SessionRecoverOutputSchema,\n SessionStatusInputSchema,\n SessionStatusOutputSchema,\n} from '@btraut/browser-bridge-shared';\nimport type {\n AnySchema,\n ZodRawShapeCompat,\n} from '@modelcontextprotocol/sdk/server/zod-compat';\nimport type {\n McpServer,\n ToolCallback,\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types';\nimport { CoreClient } from './core-client';\n\ntype ToolResult = CallToolResult;\n\ntype ToolConfig = {\n title: string;\n description: string;\n inputSchema: AnySchema | ZodRawShapeCompat;\n outputSchema: AnySchema | ZodRawShapeCompat;\n corePath: string;\n};\n\ntype ToolRegistrar = Pick<McpServer, 'registerTool'>;\n\ntype EnvelopeInput = Parameters<typeof apiEnvelopeSchema>[0];\n\nconst toToolResult = (payload: unknown): ToolResult => {\n const content = [{ type: 'text' as const, text: JSON.stringify(payload) }];\n if (payload && typeof payload === 'object') {\n return {\n content,\n structuredContent: payload as Record<string, unknown>,\n };\n }\n return { content };\n};\n\nconst toInternalErrorEnvelope = (error: unknown) => ({\n ok: false as const,\n error: {\n code: 'INTERNAL' as const,\n message: error instanceof Error ? error.message : 'Unknown error.',\n retryable: false,\n },\n});\n\nconst envelope = (schema: EnvelopeInput) => apiEnvelopeSchema(schema);\n\nexport const TOOL_DEFINITIONS: Array<{ name: string; config: ToolConfig }> = [\n {\n name: 'session.create',\n config: {\n title: 'Session Create',\n description: 'Create a new browser session.',\n inputSchema: SessionCreateInputSchema,\n outputSchema: envelope(SessionCreateOutputSchema),\n corePath: '/session/create',\n },\n },\n {\n name: 'session.status',\n config: {\n title: 'Session Status',\n description: 'Fetch session status.',\n inputSchema: SessionStatusInputSchema,\n outputSchema: envelope(SessionStatusOutputSchema),\n corePath: '/session/status',\n },\n },\n {\n name: 'session.recover',\n config: {\n title: 'Session Recover',\n description: 'Recover a session after errors.',\n inputSchema: SessionRecoverInputSchema,\n outputSchema: envelope(SessionRecoverOutputSchema),\n corePath: '/session/recover',\n },\n },\n {\n name: 'session.close',\n config: {\n title: 'Session Close',\n description: 'Close a session.',\n inputSchema: SessionCloseInputSchema,\n outputSchema: envelope(SessionCloseOutputSchema),\n corePath: '/session/close',\n },\n },\n {\n name: 'drive.navigate',\n config: {\n title: 'Drive Navigate',\n description: 'Navigate to a URL.',\n inputSchema: DriveNavigateInputSchema,\n outputSchema: envelope(DriveNavigateOutputSchema),\n corePath: '/drive/navigate',\n },\n },\n {\n name: 'drive.go_back',\n config: {\n title: 'Drive Go Back',\n description: 'Go back in browser history.',\n inputSchema: DriveGoBackInputSchema,\n outputSchema: envelope(DriveGoBackOutputSchema),\n corePath: '/drive/go_back',\n },\n },\n {\n name: 'drive.go_forward',\n config: {\n title: 'Drive Go Forward',\n description: 'Go forward in browser history.',\n inputSchema: DriveGoForwardInputSchema,\n outputSchema: envelope(DriveGoForwardOutputSchema),\n corePath: '/drive/go_forward',\n },\n },\n {\n name: 'drive.back',\n config: {\n title: 'Drive Back',\n description: 'Go back in browser history.',\n inputSchema: DriveBackInputSchema,\n outputSchema: envelope(DriveBackOutputSchema),\n corePath: '/drive/back',\n },\n },\n {\n name: 'drive.forward',\n config: {\n title: 'Drive Forward',\n description: 'Go forward in browser history.',\n inputSchema: DriveForwardInputSchema,\n outputSchema: envelope(DriveForwardOutputSchema),\n corePath: '/drive/forward',\n },\n },\n {\n name: 'drive.click',\n config: {\n title: 'Drive Click',\n description: 'Click an element.',\n inputSchema: DriveClickInputSchema,\n outputSchema: envelope(DriveClickOutputSchema),\n corePath: '/drive/click',\n },\n },\n {\n name: 'drive.hover',\n config: {\n title: 'Drive Hover',\n description: 'Hover over an element.',\n inputSchema: DriveHoverInputSchema,\n outputSchema: envelope(DriveHoverOutputSchema),\n corePath: '/drive/hover',\n },\n },\n {\n name: 'drive.select',\n config: {\n title: 'Drive Select',\n description: 'Select an option in a dropdown.',\n inputSchema: DriveSelectInputSchema,\n outputSchema: envelope(DriveSelectOutputSchema),\n corePath: '/drive/select',\n },\n },\n {\n name: 'drive.type',\n config: {\n title: 'Drive Type',\n description: 'Type into an element.',\n inputSchema: DriveTypeInputSchema,\n outputSchema: envelope(DriveTypeOutputSchema),\n corePath: '/drive/type',\n },\n },\n {\n name: 'drive.fill_form',\n config: {\n title: 'Drive Fill Form',\n description: 'Fill multiple form fields.',\n inputSchema: DriveFillFormInputSchema,\n outputSchema: envelope(DriveFillFormOutputSchema),\n corePath: '/drive/fill_form',\n },\n },\n {\n name: 'drive.drag',\n config: {\n title: 'Drive Drag',\n description: 'Drag an element to a target.',\n inputSchema: DriveDragInputSchema,\n outputSchema: envelope(DriveDragOutputSchema),\n corePath: '/drive/drag',\n },\n },\n {\n name: 'drive.handle_dialog',\n config: {\n title: 'Drive Handle Dialog',\n description: 'Handle a JavaScript dialog.',\n inputSchema: DriveHandleDialogInputSchema,\n outputSchema: envelope(DriveHandleDialogOutputSchema),\n corePath: '/drive/handle_dialog',\n },\n },\n {\n name: 'dialog.accept',\n config: {\n title: 'Dialog Accept',\n description: 'Accept a JavaScript dialog.',\n inputSchema: DialogAcceptInputSchema,\n outputSchema: envelope(DialogAcceptOutputSchema),\n corePath: '/dialog/accept',\n },\n },\n {\n name: 'dialog.dismiss',\n config: {\n title: 'Dialog Dismiss',\n description: 'Dismiss a JavaScript dialog.',\n inputSchema: DialogDismissInputSchema,\n outputSchema: envelope(DialogDismissOutputSchema),\n corePath: '/dialog/dismiss',\n },\n },\n {\n name: 'drive.key',\n config: {\n title: 'Drive Key',\n description: 'Press a keyboard key.',\n inputSchema: DriveKeyInputSchema,\n outputSchema: envelope(DriveKeyOutputSchema),\n corePath: '/drive/key',\n },\n },\n {\n name: 'drive.key_press',\n config: {\n title: 'Drive Key Press',\n description: 'Press a key on the active element.',\n inputSchema: DriveKeyPressInputSchema,\n outputSchema: envelope(DriveKeyPressOutputSchema),\n corePath: '/drive/key_press',\n },\n },\n {\n name: 'drive.scroll',\n config: {\n title: 'Drive Scroll',\n description:\n 'Scroll the default tab (agent window/tab unless tab_id is provided).',\n inputSchema: DriveScrollInputSchema,\n outputSchema: envelope(DriveScrollOutputSchema),\n corePath: '/drive/scroll',\n },\n },\n {\n name: 'drive.wait_for',\n config: {\n title: 'Drive Wait For',\n description: 'Wait for a drive condition.',\n inputSchema: DriveWaitForInputSchema,\n outputSchema: envelope(DriveWaitForOutputSchema),\n corePath: '/drive/wait_for',\n },\n },\n {\n name: 'drive.tab_list',\n config: {\n title: 'Drive Tab List',\n description: 'List browser tabs.',\n inputSchema: DriveTabListInputSchema,\n outputSchema: envelope(DriveTabListOutputSchema),\n corePath: '/drive/tab_list',\n },\n },\n {\n name: 'drive.tab_activate',\n config: {\n title: 'Drive Tab Activate',\n description: 'Activate a browser tab.',\n inputSchema: DriveTabActivateInputSchema,\n outputSchema: envelope(DriveTabActivateOutputSchema),\n corePath: '/drive/tab_activate',\n },\n },\n {\n name: 'drive.tab_close',\n config: {\n title: 'Drive Tab Close',\n description: 'Close a browser tab.',\n inputSchema: DriveTabCloseInputSchema,\n outputSchema: envelope(DriveTabCloseOutputSchema),\n corePath: '/drive/tab_close',\n },\n },\n {\n name: 'inspect.dom_snapshot',\n config: {\n title: 'Inspect DOM Snapshot',\n description: 'Capture a DOM snapshot.',\n inputSchema: InspectDomSnapshotInputSchema,\n outputSchema: envelope(InspectDomSnapshotOutputSchema),\n corePath: '/inspect/dom_snapshot',\n },\n },\n {\n name: 'inspect.dom_diff',\n config: {\n title: 'Inspect DOM Diff',\n description: 'Compare recent DOM snapshots.',\n inputSchema: InspectDomDiffInputSchema,\n outputSchema: envelope(InspectDomDiffOutputSchema),\n corePath: '/inspect/dom_diff',\n },\n },\n {\n name: 'inspect.find',\n config: {\n title: 'Inspect Find',\n description: 'Find elements in the accessibility tree and return refs.',\n inputSchema: InspectFindInputSchema,\n outputSchema: envelope(InspectFindOutputSchema),\n corePath: '/inspect/find',\n },\n },\n {\n name: 'inspect.extract_content',\n config: {\n title: 'Inspect Extract Content',\n description: 'Extract main content as markdown or text.',\n inputSchema: InspectExtractContentInputSchema,\n outputSchema: envelope(InspectExtractContentOutputSchema),\n corePath: '/inspect/extract_content',\n },\n },\n {\n name: 'inspect.page_state',\n config: {\n title: 'Inspect Page State',\n description: 'Capture form, storage, and cookie state.',\n inputSchema: InspectPageStateInputSchema,\n outputSchema: envelope(InspectPageStateOutputSchema),\n corePath: '/inspect/page_state',\n },\n },\n {\n name: 'inspect.console_list',\n config: {\n title: 'Inspect Console List',\n description: 'List console entries.',\n inputSchema: InspectConsoleListInputSchema,\n outputSchema: envelope(InspectConsoleListOutputSchema),\n corePath: '/inspect/console_list',\n },\n },\n {\n name: 'inspect.network_har',\n config: {\n title: 'Inspect Network HAR',\n description: 'Capture network HAR data.',\n inputSchema: InspectNetworkHarInputSchema,\n outputSchema: envelope(InspectNetworkHarOutputSchema),\n corePath: '/inspect/network_har',\n },\n },\n {\n name: 'inspect.evaluate',\n config: {\n title: 'Inspect Evaluate',\n description: 'Evaluate an expression in the target.',\n inputSchema: InspectEvaluateInputSchema,\n outputSchema: envelope(InspectEvaluateOutputSchema),\n corePath: '/inspect/evaluate',\n },\n },\n {\n name: 'inspect.performance_metrics',\n config: {\n title: 'Inspect Performance Metrics',\n description: 'Collect performance metrics.',\n inputSchema: InspectPerformanceMetricsInputSchema,\n outputSchema: envelope(InspectPerformanceMetricsOutputSchema),\n corePath: '/inspect/performance_metrics',\n },\n },\n {\n name: 'artifacts.screenshot',\n config: {\n title: 'Artifacts Screenshot',\n description: 'Capture a screenshot artifact.',\n inputSchema: ArtifactsScreenshotInputSchema,\n outputSchema: envelope(ArtifactsScreenshotOutputSchema),\n corePath: '/artifacts/screenshot',\n },\n },\n {\n name: 'health_check',\n config: {\n title: 'Health Check',\n description:\n 'Check server health including uptime, memory usage, active session count, and extension connection status.',\n inputSchema: HealthCheckInputSchema,\n outputSchema: envelope(HealthCheckOutputSchema),\n corePath: '/health_check',\n },\n },\n {\n name: 'diagnostics.doctor',\n config: {\n title: 'Diagnostics Doctor',\n description: 'Run diagnostics checks.',\n inputSchema: DiagnosticsDoctorInputSchema,\n outputSchema: envelope(DiagnosticsDoctorOutputSchema),\n corePath: '/diagnostics/doctor',\n },\n },\n];\n\nexport const createToolHandler = (\n client: CoreClient,\n corePath: string\n): ToolCallback<AnySchema> => {\n return (async (args: unknown, _extra: unknown): Promise<ToolResult> => {\n void _extra;\n try {\n const envelopeResult = await client.post(corePath, args);\n return toToolResult(envelopeResult);\n } catch (error) {\n const parsed = ErrorEnvelopeSchema.safeParse(error);\n if (parsed.success) {\n return toToolResult(parsed.data);\n }\n return toToolResult(toInternalErrorEnvelope(error));\n }\n }) as ToolCallback<AnySchema>;\n};\n\nexport const registerBrowserBridgeTools = (\n server: ToolRegistrar,\n client: CoreClient\n): void => {\n for (const tool of TOOL_DEFINITIONS) {\n server.registerTool(\n tool.name,\n {\n title: tool.config.title,\n description: tool.config.description,\n inputSchema: tool.config.inputSchema,\n outputSchema: tool.config.outputSchema,\n },\n createToolHandler(client, tool.config.corePath)\n );\n }\n};\n", "import { createServer } from 'node:http';\nimport type { IncomingMessage } from 'node:http';\nimport { randomUUID } from 'node:crypto';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';\nimport { CoreClient, CoreClientOptions, createCoreClient } from './core-client';\nimport { registerBrowserBridgeTools } from './tools';\n\nexport type McpAdapterOptions = CoreClientOptions & {\n name?: string;\n version?: string;\n coreClient?: CoreClient;\n};\n\nexport type McpAdapterHandle = {\n server: McpServer;\n client: CoreClient;\n};\n\nexport type McpAdapterStartHandle = McpAdapterHandle & {\n transport: StdioServerTransport;\n};\n\nexport type McpAdapterHttpOptions = {\n host?: string;\n port?: number;\n path?: string;\n};\n\nexport type McpAdapterHttpStartHandle = {\n client: CoreClient;\n host: string;\n port: number;\n path: string;\n close: () => Promise<void>;\n};\n\nconst DEFAULT_SERVER_NAME = 'browser-bridge';\nconst DEFAULT_SERVER_VERSION = '0.0.0';\nconst DEFAULT_HTTP_HOST = '127.0.0.1';\nconst DEFAULT_HTTP_PATH = '/mcp';\n\nexport const createMcpServer = (\n options: McpAdapterOptions = {}\n): McpAdapterHandle => {\n const server = new McpServer({\n name: options.name ?? DEFAULT_SERVER_NAME,\n version: options.version ?? DEFAULT_SERVER_VERSION,\n });\n const client = options.coreClient ?? createCoreClient(options);\n\n registerBrowserBridgeTools(server, client);\n\n return { server, client };\n};\n\nexport const startMcpServer = async (\n options: McpAdapterOptions = {}\n): Promise<McpAdapterStartHandle> => {\n const handle = createMcpServer(options);\n const transport = new StdioServerTransport();\n await handle.server.connect(transport);\n return { ...handle, transport };\n};\n\nconst readJsonBody = async (\n req: IncomingMessage,\n maxBytes = 5 * 1024 * 1024\n): Promise<unknown> => {\n const chunks: Buffer[] = [];\n let total = 0;\n await new Promise<void>((resolve, reject) => {\n req.on('data', (chunk: Buffer) => {\n total += chunk.length;\n if (total > maxBytes) {\n reject(new Error('Request body too large.'));\n req.destroy();\n return;\n }\n chunks.push(chunk);\n });\n req.on('end', () => resolve());\n req.on('error', (err: unknown) => reject(err));\n });\n const raw = Buffer.concat(chunks).toString('utf8');\n if (!raw) {\n return undefined;\n }\n return JSON.parse(raw) as unknown;\n};\n\nconst getHeaderValue = (\n value: string | string[] | undefined\n): string | undefined => {\n if (typeof value === 'string') {\n return value;\n }\n if (Array.isArray(value)) {\n return value[0];\n }\n return undefined;\n};\n\nexport const startMcpHttpServer = async (\n options: McpAdapterOptions & McpAdapterHttpOptions = {}\n): Promise<McpAdapterHttpStartHandle> => {\n const host = options.host ?? DEFAULT_HTTP_HOST;\n const port = typeof options.port === 'number' ? options.port : 0;\n const path = options.path ?? DEFAULT_HTTP_PATH;\n\n const client = options.coreClient ?? createCoreClient(options);\n\n const sessions = new Map<\n string,\n {\n transport: StreamableHTTPServerTransport;\n server: McpServer;\n }\n >();\n\n const closeAllSessions = async (): Promise<void> => {\n const entries = Array.from(sessions.values());\n sessions.clear();\n await Promise.all(\n entries.map(async (entry) => {\n try {\n await entry.transport.close();\n } catch {\n // Ignore.\n }\n try {\n await entry.server.close();\n } catch {\n // Ignore.\n }\n })\n );\n };\n\n const httpServer = createServer(async (req, res) => {\n try {\n const url = new URL(req.url ?? '', `http://${host}`);\n if (url.pathname !== path) {\n res.writeHead(404, { 'content-type': 'application/json' });\n res.end(JSON.stringify({ error: 'Not Found' }));\n return;\n }\n\n const sessionId = getHeaderValue(req.headers['mcp-session-id']);\n\n const parsedBody =\n req.method === 'POST' ? await readJsonBody(req) : undefined;\n\n if (sessionId) {\n const entry = sessions.get(sessionId);\n if (!entry) {\n res.writeHead(404, { 'content-type': 'application/json' });\n res.end(JSON.stringify({ error: 'Unknown session.' }));\n return;\n }\n await entry.transport.handleRequest(req, res, parsedBody);\n return;\n }\n\n if (req.method !== 'POST' || !isInitializeRequest(parsedBody)) {\n res.writeHead(400, { 'content-type': 'application/json' });\n res.end(\n JSON.stringify({\n error:\n 'Missing mcp-session-id header. First request must be initialize.',\n })\n );\n return;\n }\n\n let sessionEntry:\n | {\n transport: StreamableHTTPServerTransport;\n server: McpServer;\n }\n | undefined;\n\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (sid) => {\n if (sessionEntry) {\n sessions.set(sid, sessionEntry);\n }\n },\n onsessionclosed: async (sid) => {\n const entry = sessions.get(sid);\n sessions.delete(sid);\n if (!entry) {\n return;\n }\n await Promise.allSettled([\n entry.transport.close(),\n entry.server.close(),\n ]);\n },\n });\n\n const sessionServer = new McpServer({\n name: options.name ?? DEFAULT_SERVER_NAME,\n version: options.version ?? DEFAULT_SERVER_VERSION,\n });\n registerBrowserBridgeTools(sessionServer, client);\n await sessionServer.connect(transport);\n sessionEntry = { transport, server: sessionServer };\n\n await transport.handleRequest(req, res, parsedBody);\n } catch (error) {\n res.writeHead(500, { 'content-type': 'application/json' });\n res.end(\n JSON.stringify({\n error: error instanceof Error ? error.message : 'Internal error.',\n })\n );\n }\n });\n\n const resolvedPort = await new Promise<number>((resolve, reject) => {\n httpServer.listen(port, host, () => {\n const address = httpServer.address();\n resolve(typeof address === 'object' && address ? address.port : port);\n });\n httpServer.on('error', reject);\n });\n\n return {\n client,\n host,\n port: resolvedPort,\n path,\n close: async () => {\n await new Promise<void>((resolve, reject) => {\n httpServer.close((err) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n await closeAllSessions();\n },\n };\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_express", "import_crypto", "import_promises", "import_node_path", "os", "path", "import_crypto", "errorInfo", "result", "refWarnings", "warnings", "error", "path", "output", "TurndownService", "data", "tab", "wrapped", "import_zod", "parseBody", "makeHandler", "info", "express", "path"]
7
7
  }