@btraut/browser-bridge 0.13.2 → 0.15.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/CHANGELOG.md +51 -0
- package/README.md +53 -37
- package/dist/api.js +1792 -678
- package/dist/api.js.map +4 -4
- package/dist/index.js +666 -417
- package/dist/index.js.map +4 -4
- package/extension/dist/background.js +1484 -693
- package/extension/dist/background.js.map +4 -4
- package/extension/dist/content.js +534 -77
- package/extension/dist/content.js.map +4 -4
- package/extension/dist/options-ui.js +2 -113
- package/extension/dist/options-ui.js.map +2 -2
- package/extension/dist/permissions-request-ui.js +111 -0
- package/extension/dist/permissions-request-ui.js.map +7 -0
- package/extension/manifest.json +3 -3
- package/package.json +1 -1
- package/skills/browser-bridge/SKILL.md +18 -0
- package/skills/browser-bridge/skill.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../shared/src/contract-version.ts", "../src/error-sanitizer.ts", "../src/site-permissions.ts", "../src/permission-prompt.ts", "../src/drive-reliability.ts", "../src/connection-state.ts", "../src/background.ts"],
|
|
4
|
-
"sourcesContent": ["export const HTTP_CONTRACT_VERSION_HEADER = 'x-browser-bridge-contract-version';\n\nexport const HTTP_CONTRACT_VERSION = '2026-02-17.1';\n\nexport const DRIVE_WS_PROTOCOL_VERSION = '2026-02-17.1';\n\nexport const resolveContractVersionMismatch = (\n receivedVersion: string | undefined\n):\n | {\n expected: string;\n received: string;\n }\n | undefined => {\n if (!receivedVersion || receivedVersion.trim().length === 0) {\n return undefined;\n }\n\n if (receivedVersion === HTTP_CONTRACT_VERSION) {\n return undefined;\n }\n\n return {\n expected: HTTP_CONTRACT_VERSION,\n received: receivedVersion,\n };\n};\n", "import type { DriveErrorInfo } from './protocol.js';\n\nconst TRAILING_PUNCTUATION_RE = /[.,;:!?]+$/;\n\nconst stripTrailingPunctuation = (\n value: string\n): {\n core: string;\n trailing: string;\n} => {\n const match = value.match(TRAILING_PUNCTUATION_RE);\n if (!match) {\n return { core: value, trailing: '' };\n }\n const trailing = match[0] ?? '';\n return { core: value.slice(0, -trailing.length), trailing };\n};\n\nconst sanitizeUrlToken = (token: string): string => {\n const { core, trailing } = stripTrailingPunctuation(token);\n try {\n const parsed = new URL(core);\n if (parsed.protocol === 'file:') {\n return `file://[redacted]${trailing}`;\n }\n\n if (parsed.origin && parsed.origin !== 'null') {\n return `${parsed.origin}${trailing}`;\n }\n\n // Non-standard schemes can have a \"null\" origin (chrome://, devtools://, etc).\n // Keep scheme + host and drop everything else.\n if (parsed.protocol && parsed.host) {\n return `${parsed.protocol}//${parsed.host}${trailing}`;\n }\n if (parsed.protocol) {\n return `${parsed.protocol}${trailing}`;\n }\n } catch {\n // Ignore and fall back to a simpler heuristic.\n }\n\n const fallback = core.match(/^([a-zA-Z][a-zA-Z0-9+.-]*):\\/\\/([^/\\s]+)/);\n if (fallback?.[1] && fallback?.[2]) {\n return `${fallback[1]}://${fallback[2]}${trailing}`;\n }\n return `[redacted url]${trailing}`;\n};\n\nconst URL_TOKEN_RE =\n /\\b(?:https?|wss?|chrome-extension|chrome|chrome-devtools|devtools|edge|brave|file):\\/\\/[^\\s\"'<>)}\\]]+/gi;\n\nconst VIEW_SOURCE_RE = /\\bview-source:(https?:\\/\\/[^\\s\"'<>)}\\]]+)/gi;\n\nconst sanitizeUrls = (message: string): string => {\n // Special-case view-source: since it nests another URL.\n let next = message.replace(VIEW_SOURCE_RE, (_match, inner: string) => {\n return `view-source:${sanitizeUrlToken(inner)}`;\n });\n next = next.replace(URL_TOKEN_RE, (match) => sanitizeUrlToken(match));\n return next;\n};\n\nconst extractBasename = (value: string): string => {\n const trimmed = value.trim();\n const lastSlash = Math.max(\n trimmed.lastIndexOf('/'),\n trimmed.lastIndexOf('\\\\')\n );\n if (lastSlash < 0) {\n return trimmed;\n }\n return trimmed.slice(lastSlash + 1);\n};\n\nconst sanitizeWindowsPaths = (message: string): string => {\n // Example: C:\\Users\\me\\project\\file.ts:12:34 -> file.ts:12:34\n const windowsPathRe =\n /\\b[A-Za-z]:\\\\(?:[^\\s\"')\\]}]+\\\\)+[^\\s\"')\\]}]+(?::\\d+(?::\\d+)?)?/g;\n return message.replace(windowsPathRe, (match) => extractBasename(match));\n};\n\nconst sanitizeUnixPaths = (message: string): string => {\n // Only redact paths rooted in common system locations to avoid clobbering\n // generic \"/api/v1\" style strings that might appear in error messages.\n const unixPathRe =\n /\\/(?:Users|home|var|private|tmp|opt|etc|Library|Applications|Volumes|System)(?:\\/[^\\s\"')\\]}]+)+(?::\\d+(?::\\d+)?)?/g;\n return message.replace(unixPathRe, (match) => extractBasename(match));\n};\n\nexport const sanitizeChromeErrorMessage = (message: string): string => {\n let next = message;\n next = sanitizeUrls(next);\n next = sanitizeWindowsPaths(next);\n next = sanitizeUnixPaths(next);\n return next;\n};\n\nconst sanitizeUnknown = (value: unknown): unknown => {\n if (typeof value === 'string') {\n return sanitizeChromeErrorMessage(value);\n }\n if (Array.isArray(value)) {\n return value.map((entry) => sanitizeUnknown(entry));\n }\n if (!value || typeof value !== 'object') {\n return value;\n }\n const record = value as Record<string, unknown>;\n const next: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(record)) {\n next[key] = sanitizeUnknown(entry);\n }\n return next;\n};\n\nexport const sanitizeDriveErrorInfo = (\n error: DriveErrorInfo\n): DriveErrorInfo => {\n return {\n ...error,\n message: sanitizeChromeErrorMessage(error.message),\n ...(error.details\n ? { details: sanitizeUnknown(error.details) as Record<string, unknown> }\n : {}),\n };\n};\n", "export const SITE_ALLOWLIST_KEY = 'siteAllowlist';\nexport const PERMISSION_PROMPT_WAIT_MS_KEY = 'permissionPromptWaitMs';\nexport const DEFAULT_PERMISSION_PROMPT_WAIT_MS = 30_000;\nexport const SITE_PERMISSIONS_MODE_KEY = 'sitePermissionsMode';\nexport const DEBUGGER_CAPABILITY_ENABLED_KEY = 'debuggerCapabilityEnabled';\n\nexport type SitePermissionsMode = 'granular' | 'bypass';\nexport const DEFAULT_SITE_PERMISSIONS_MODE: SitePermissionsMode = 'granular';\nexport const DEFAULT_DEBUGGER_CAPABILITY_ENABLED = false;\n\nexport type SiteAllowlistEntry = {\n createdAt: string; // ISO\n lastUsedAt: string; // ISO\n};\n\nexport type SiteAllowlist = Record<string, SiteAllowlistEntry>;\n\nexport const siteKeyFromUrl = (rawUrl: string): string | null => {\n if (!rawUrl || typeof rawUrl !== 'string') {\n return null;\n }\n\n try {\n const parsed = new URL(rawUrl);\n // Only gate \"real web\" pages for now.\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n return null;\n }\n\n // URL.hostname is lowercased by the platform.\n if (!parsed.hostname) {\n return null;\n }\n\n return parsed.port ? `${parsed.hostname}:${parsed.port}` : parsed.hostname;\n } catch {\n return null;\n }\n};\n\nconst isAllowlistEntry = (value: unknown): value is SiteAllowlistEntry => {\n if (!value || typeof value !== 'object') {\n return false;\n }\n const v = value as Record<string, unknown>;\n return typeof v.createdAt === 'string' && typeof v.lastUsedAt === 'string';\n};\n\nconst normalizeSiteKey = (siteKey: string): string => siteKey.toLowerCase();\n\nconst readAllowlistRaw = async (): Promise<SiteAllowlist> => {\n return await new Promise<SiteAllowlist>((resolve) => {\n chrome.storage.local.get(\n [SITE_ALLOWLIST_KEY],\n (result: Record<string, unknown>) => {\n const raw = result?.[SITE_ALLOWLIST_KEY];\n if (!raw || typeof raw !== 'object') {\n resolve({});\n return;\n }\n\n const out: SiteAllowlist = {};\n for (const [k, v] of Object.entries(raw as Record<string, unknown>)) {\n if (typeof k !== 'string') {\n continue;\n }\n if (!isAllowlistEntry(v)) {\n continue;\n }\n out[normalizeSiteKey(k)] = v;\n }\n\n resolve(out);\n }\n );\n });\n};\n\nconst writeAllowlistRaw = async (allowlist: SiteAllowlist): Promise<void> => {\n return await new Promise<void>((resolve) => {\n chrome.storage.local.set({ [SITE_ALLOWLIST_KEY]: allowlist }, () =>\n resolve()\n );\n });\n};\n\nexport const readSitePermissionsMode =\n async (): Promise<SitePermissionsMode> => {\n return await new Promise<SitePermissionsMode>((resolve) => {\n chrome.storage.local.get(\n [SITE_PERMISSIONS_MODE_KEY],\n (result: Record<string, unknown>) => {\n const raw = result?.[SITE_PERMISSIONS_MODE_KEY];\n if (raw === 'granular' || raw === 'bypass') {\n resolve(raw);\n return;\n }\n\n // Self-heal legacy/invalid storage to a safe default, so UIs never\n // render with \"no mode selected\" and other callers don't have to\n // special-case missing values.\n try {\n chrome.storage.local.set({\n [SITE_PERMISSIONS_MODE_KEY]: DEFAULT_SITE_PERMISSIONS_MODE,\n });\n } catch {\n // ignore\n }\n resolve(DEFAULT_SITE_PERMISSIONS_MODE);\n }\n );\n });\n };\n\nexport const writeSitePermissionsMode = async (\n mode: SitePermissionsMode\n): Promise<void> => {\n return await new Promise<void>((resolve) => {\n chrome.storage.local.set({ [SITE_PERMISSIONS_MODE_KEY]: mode }, () =>\n resolve()\n );\n });\n};\n\nexport const readPermissionPromptWaitMs = async (): Promise<number> => {\n return await new Promise<number>((resolve) => {\n chrome.storage.local.get(\n [PERMISSION_PROMPT_WAIT_MS_KEY],\n (result: Record<string, unknown>) => {\n const raw = result?.[PERMISSION_PROMPT_WAIT_MS_KEY];\n if (typeof raw === 'number' && Number.isFinite(raw) && raw > 0) {\n resolve(raw);\n return;\n }\n if (typeof raw === 'string') {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed > 0) {\n resolve(parsed);\n return;\n }\n }\n\n resolve(DEFAULT_PERMISSION_PROMPT_WAIT_MS);\n }\n );\n });\n};\n\nexport const readDebuggerCapabilityEnabled = async (): Promise<boolean> => {\n return await new Promise<boolean>((resolve) => {\n chrome.storage.local.get(\n [DEBUGGER_CAPABILITY_ENABLED_KEY],\n (result: Record<string, unknown>) => {\n const raw = result?.[DEBUGGER_CAPABILITY_ENABLED_KEY];\n if (typeof raw === 'boolean') {\n resolve(raw);\n return;\n }\n\n // Keep storage canonical so UI/background can rely on deterministic\n // booleans after first read.\n try {\n chrome.storage.local.set({\n [DEBUGGER_CAPABILITY_ENABLED_KEY]:\n DEFAULT_DEBUGGER_CAPABILITY_ENABLED,\n });\n } catch {\n // ignore\n }\n resolve(DEFAULT_DEBUGGER_CAPABILITY_ENABLED);\n }\n );\n });\n};\n\nexport const writeDebuggerCapabilityEnabled = async (\n enabled: boolean\n): Promise<void> => {\n return await new Promise<void>((resolve) => {\n chrome.storage.local.set(\n { [DEBUGGER_CAPABILITY_ENABLED_KEY]: Boolean(enabled) },\n () => resolve()\n );\n });\n};\n\nexport const getAllowlistedSites = async (): Promise<SiteAllowlist> => {\n return await readAllowlistRaw();\n};\n\nexport const isSiteAllowed = async (siteKey: string): Promise<boolean> => {\n const key = normalizeSiteKey(siteKey);\n const allowlist = await readAllowlistRaw();\n return Boolean(allowlist[key]);\n};\n\nexport const allowSiteAlways = async (\n siteKey: string,\n now: Date = new Date()\n): Promise<void> => {\n const key = normalizeSiteKey(siteKey);\n const allowlist = await readAllowlistRaw();\n const nowIso = now.toISOString();\n\n const existing = allowlist[key];\n allowlist[key] = {\n createdAt: existing?.createdAt ?? nowIso,\n lastUsedAt: nowIso,\n };\n\n await writeAllowlistRaw(allowlist);\n};\n\nexport const upsertAllowlistedSites = async (\n entries: SiteAllowlist\n): Promise<void> => {\n const allowlist = await readAllowlistRaw();\n let changed = false;\n\n for (const [k, v] of Object.entries(entries ?? {})) {\n if (typeof k !== 'string') {\n continue;\n }\n if (!isAllowlistEntry(v)) {\n continue;\n }\n allowlist[normalizeSiteKey(k)] = v;\n changed = true;\n }\n\n if (!changed) {\n return;\n }\n\n await writeAllowlistRaw(allowlist);\n};\n\nexport const touchSiteLastUsed = async (\n siteKey: string,\n now: Date = new Date()\n): Promise<void> => {\n const key = normalizeSiteKey(siteKey);\n const allowlist = await readAllowlistRaw();\n const existing = allowlist[key];\n if (!existing) {\n return;\n }\n\n allowlist[key] = { ...existing, lastUsedAt: now.toISOString() };\n await writeAllowlistRaw(allowlist);\n};\n\nexport const revokeSite = async (siteKey: string): Promise<void> => {\n const key = normalizeSiteKey(siteKey);\n const allowlist = await readAllowlistRaw();\n if (!allowlist[key]) {\n return;\n }\n delete allowlist[key];\n await writeAllowlistRaw(allowlist);\n};\n", "import {\n allowSiteAlways,\n readPermissionPromptWaitMs,\n} from './site-permissions.js';\n\nexport const PERMISSION_PROMPT_PORT_NAME = 'permission_prompt';\n\nexport type PermissionPromptDecision = 'allow_once' | 'allow_always' | 'deny';\n\nexport type PermissionPromptResult =\n | { kind: PermissionPromptDecision }\n | { kind: 'timed_out'; waitMs: number };\n\nexport type PermissionPromptRequest = {\n siteKey: string;\n action: string;\n};\n\ntype PromptState = {\n siteKey: string;\n action: string;\n requestId: string;\n windowId: number | null;\n decided: PermissionPromptDecision | null;\n waiters: Set<(decision: PermissionPromptDecision) => void>;\n};\n\nexport type PermissionPromptControllerDeps = {\n openWindow: (url: string) => Promise<number>;\n closeWindow: (windowId: number) => Promise<void>;\n getWaitMs: () => Promise<number>;\n persistAlwaysAllow: (siteKey: string) => Promise<void>;\n makeRequestId: () => string;\n};\n\nconst defaultMakeRequestId = (): string => {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID();\n }\n return `perm-${Date.now()}-${Math.random().toString(16).slice(2)}`;\n};\n\nconst defaultOpenWindow = async (url: string): Promise<number> => {\n return await new Promise<number>((resolve, reject) => {\n chrome.windows.create(\n {\n type: 'popup',\n url,\n focused: true,\n width: 460,\n height: 420,\n },\n (win: Record<string, unknown> | undefined) => {\n const err = chrome.runtime.lastError;\n if (err) {\n reject(new Error(err.message));\n return;\n }\n const windowId = win?.id;\n if (typeof windowId !== 'number') {\n reject(new Error('Prompt window id missing.'));\n return;\n }\n resolve(windowId);\n }\n );\n });\n};\n\nconst defaultCloseWindow = async (windowId: number): Promise<void> => {\n return await new Promise<void>((resolve) => {\n chrome.windows.remove(windowId, () => resolve());\n });\n};\n\nconst delay = async (ms: number): Promise<void> => {\n return await new Promise<void>((resolve) => {\n setTimeout(resolve, ms);\n });\n};\n\nexport class PermissionPromptController {\n private deps: PermissionPromptControllerDeps;\n private stateBySite = new Map<string, PromptState>();\n private stateByRequestId = new Map<string, PromptState>();\n private stateByWindowId = new Map<number, PromptState>();\n\n constructor(deps?: Partial<PermissionPromptControllerDeps>) {\n this.deps = {\n openWindow: deps?.openWindow ?? defaultOpenWindow,\n closeWindow: deps?.closeWindow ?? defaultCloseWindow,\n getWaitMs: deps?.getWaitMs ?? readPermissionPromptWaitMs,\n persistAlwaysAllow: deps?.persistAlwaysAllow ?? allowSiteAlways,\n makeRequestId: deps?.makeRequestId ?? defaultMakeRequestId,\n };\n }\n\n async requestPermission(\n request: PermissionPromptRequest\n ): Promise<PermissionPromptResult> {\n const siteKey = request.siteKey.toLowerCase();\n\n let state = this.stateBySite.get(siteKey);\n if (!state) {\n const requestId = this.deps.makeRequestId();\n state = {\n siteKey,\n action: request.action,\n requestId,\n windowId: null,\n decided: null,\n waiters: new Set(),\n };\n this.stateBySite.set(siteKey, state);\n this.stateByRequestId.set(requestId, state);\n\n const url = this.buildPromptUrl(state);\n const windowId = await this.deps.openWindow(url);\n state.windowId = windowId;\n this.stateByWindowId.set(windowId, state);\n\n // In tests (or in rare races), a decision could be processed before the\n // window id is set. If so, close and clean up now.\n if (state.decided) {\n await this.deps.closeWindow(windowId);\n this.cleanupState(state);\n }\n }\n\n const waitMs = await this.deps.getWaitMs();\n const decision = await this.waitForDecisionOrTimeout(state, waitMs);\n if (!decision) {\n return { kind: 'timed_out', waitMs };\n }\n return { kind: decision };\n }\n\n handleConnect(port: unknown): void {\n if (!port || typeof port !== 'object') {\n return;\n }\n\n // We keep this loosely typed; MV3 provides the real shape at runtime.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const p = port as any;\n if (p.name !== PERMISSION_PROMPT_PORT_NAME) {\n return;\n }\n\n const onMessage = p.onMessage;\n if (!onMessage || typeof onMessage.addListener !== 'function') {\n return;\n }\n\n onMessage.addListener((message: unknown) => {\n void this.handlePortMessage(message).catch((error) => {\n console.error(\n 'PermissionPromptController handlePortMessage failed:',\n error\n );\n });\n });\n }\n\n handleWindowRemoved(windowId: number): void {\n const state = this.stateByWindowId.get(windowId);\n if (!state) {\n return;\n }\n this.cleanupState(state);\n }\n\n private buildPromptUrl(state: PromptState): string {\n const base = chrome.runtime.getURL('permission.html');\n const u = new URL(base);\n u.searchParams.set('requestId', state.requestId);\n u.searchParams.set('site', state.siteKey);\n u.searchParams.set('action', state.action);\n return u.toString();\n }\n\n private async waitForDecisionOrTimeout(\n state: PromptState,\n waitMs: number\n ): Promise<PermissionPromptDecision | null> {\n if (state.decided) {\n return state.decided;\n }\n\n let waiter: ((decision: PermissionPromptDecision) => void) | null = null;\n const decisionPromise = new Promise<PermissionPromptDecision>((resolve) => {\n waiter = resolve;\n state.waiters.add(resolve);\n });\n\n const winner = await Promise.race([\n decisionPromise,\n delay(waitMs).then(() => null as PermissionPromptDecision | null),\n ]);\n\n if (winner === null && waiter) {\n state.waiters.delete(waiter);\n }\n\n return winner;\n }\n\n private async handlePortMessage(message: unknown): Promise<void> {\n if (!message || typeof message !== 'object') {\n return;\n }\n const m = message as Record<string, unknown>;\n if (m.type !== 'decision') {\n return;\n }\n\n const requestId = m.requestId;\n const decision = m.decision;\n if (typeof requestId !== 'string' || requestId.length === 0) {\n return;\n }\n if (\n decision !== 'allow_once' &&\n decision !== 'allow_always' &&\n decision !== 'deny'\n ) {\n return;\n }\n\n const state = this.stateByRequestId.get(requestId);\n if (!state) {\n return;\n }\n\n state.decided = decision;\n if (decision === 'allow_always') {\n await this.deps.persistAlwaysAllow(state.siteKey);\n }\n\n for (const waiter of state.waiters) {\n waiter(decision);\n }\n state.waiters.clear();\n\n if (typeof state.windowId === 'number') {\n await this.deps.closeWindow(state.windowId);\n this.cleanupState(state);\n }\n }\n\n private cleanupState(state: PromptState): void {\n this.stateBySite.delete(state.siteKey);\n this.stateByRequestId.delete(state.requestId);\n if (typeof state.windowId === 'number') {\n this.stateByWindowId.delete(state.windowId);\n }\n }\n}\n", "const TRANSIENT_TAB_CHANNEL_ERROR_PATTERNS = [\n 'receiving end does not exist',\n 'message channel closed before a response was received',\n 'the message port closed before a response was received',\n 'extension port is moved into back/forward cache',\n] as const;\n\nconst TAB_CHANNEL_RETRY_DELAYS_MS = [120, 200, 320, 500, 750, 1000, 1200];\n\nconst normalizePathname = (pathname: string): string => {\n if (pathname.length === 0) {\n return '/';\n }\n if (pathname.length > 1 && pathname.endsWith('/')) {\n return pathname.slice(0, -1);\n }\n return pathname;\n};\n\nexport const isTransientTabChannelError = (message: unknown): boolean => {\n if (typeof message !== 'string') {\n return false;\n }\n const normalized = message.toLowerCase();\n return TRANSIENT_TAB_CHANNEL_ERROR_PATTERNS.some((pattern) =>\n normalized.includes(pattern)\n );\n};\n\nexport const getTabChannelRetryDelayMs = (\n attempt: number\n): number | undefined => {\n if (!Number.isInteger(attempt) || attempt < 1) {\n return undefined;\n }\n return TAB_CHANNEL_RETRY_DELAYS_MS[attempt - 1];\n};\n\nexport const isLikelyNavigationCommitted = (\n requestedUrl: unknown,\n tabUrl: unknown\n): boolean => {\n if (typeof requestedUrl !== 'string' || typeof tabUrl !== 'string') {\n return false;\n }\n if (requestedUrl === tabUrl) {\n return true;\n }\n try {\n const requested = new URL(requestedUrl);\n const actual = new URL(tabUrl);\n return (\n requested.origin === actual.origin &&\n normalizePathname(requested.pathname) ===\n normalizePathname(actual.pathname) &&\n requested.search === actual.search\n );\n } catch {\n return requestedUrl === tabUrl;\n }\n};\n", "export type DriveConnectionState =\n | 'connecting'\n | 'connected'\n | 'disconnected'\n | 'backoff';\n\nexport type DriveConnectionEndpoint = {\n host: string;\n port: number;\n portSource: 'default' | 'storage';\n};\n\nexport type DriveConnectionStatus = {\n state: DriveConnectionState;\n endpoint?: DriveConnectionEndpoint;\n ws_url?: string;\n reconnect_delay_ms?: number;\n retry_at?: string;\n last_connected_at?: string;\n last_disconnected_at?: string;\n last_error_at?: string;\n last_error_message?: string;\n consecutive_failures: number;\n};\n\nconst toIso = (ms: number): string => new Date(ms).toISOString();\n\nexport class ConnectionStateTracker {\n private state: DriveConnectionState = 'disconnected';\n private endpoint?: DriveConnectionEndpoint;\n private reconnectDelayMs?: number;\n private retryAt?: string;\n private lastConnectedAt?: string;\n private lastDisconnectedAt?: string;\n private lastErrorAt?: string;\n private lastErrorMessage?: string;\n private consecutiveFailures = 0;\n private lastFailureLogAt = 0;\n private suppressedFailureLogs = 0;\n\n constructor(\n private readonly now: () => number = Date.now,\n private readonly failureLogThrottleMs = 15000\n ) {}\n\n setEndpoint(endpoint: DriveConnectionEndpoint): void {\n this.endpoint = endpoint;\n }\n\n markConnecting(): void {\n this.state = 'connecting';\n this.reconnectDelayMs = undefined;\n this.retryAt = undefined;\n }\n\n markConnected(): void {\n this.state = 'connected';\n this.lastConnectedAt = toIso(this.now());\n this.reconnectDelayMs = undefined;\n this.retryAt = undefined;\n this.consecutiveFailures = 0;\n }\n\n markDisconnected(): void {\n this.state = 'disconnected';\n this.reconnectDelayMs = undefined;\n this.retryAt = undefined;\n this.lastDisconnectedAt = toIso(this.now());\n }\n\n markBackoff(delayMs: number): void {\n this.state = 'backoff';\n this.reconnectDelayMs = delayMs;\n this.retryAt = toIso(this.now() + Math.max(0, delayMs));\n }\n\n recordFailure(message: string): void {\n this.lastErrorAt = toIso(this.now());\n this.lastErrorMessage = message;\n this.consecutiveFailures += 1;\n }\n\n consumeFailureLogBudget(): {\n shouldLog: boolean;\n suppressedCount: number;\n } {\n const now = this.now();\n if (\n this.lastFailureLogAt === 0 ||\n now - this.lastFailureLogAt >= this.failureLogThrottleMs\n ) {\n const suppressedCount = this.suppressedFailureLogs;\n this.suppressedFailureLogs = 0;\n this.lastFailureLogAt = now;\n return { shouldLog: true, suppressedCount };\n }\n\n this.suppressedFailureLogs += 1;\n return { shouldLog: false, suppressedCount: this.suppressedFailureLogs };\n }\n\n flushSuppressedFailureLogs(): number {\n const count = this.suppressedFailureLogs;\n this.suppressedFailureLogs = 0;\n return count;\n }\n\n getStatus(): DriveConnectionStatus {\n return {\n state: this.state,\n endpoint: this.endpoint,\n ws_url: this.endpoint\n ? `ws://${this.endpoint.host}:${this.endpoint.port}/drive`\n : undefined,\n reconnect_delay_ms: this.reconnectDelayMs,\n retry_at: this.retryAt,\n last_connected_at: this.lastConnectedAt,\n last_disconnected_at: this.lastDisconnectedAt,\n last_error_at: this.lastErrorAt,\n last_error_message: this.lastErrorMessage,\n consecutive_failures: this.consecutiveFailures,\n };\n }\n}\n", "import type {\n DebuggerCommandParams,\n DebuggerEvent,\n DebuggerRequest,\n DriveRequest,\n DriveErrorInfo,\n DriveEvent,\n DriveHelloParams,\n DriveResponse,\n DriveTabInfo,\n DriveTabListResult,\n ExtensionMessage,\n ExtensionRequest,\n} from './protocol.js';\nimport { DRIVE_WS_PROTOCOL_VERSION } from '@btraut/browser-bridge-shared/dist/contract-version';\nimport { sanitizeDriveErrorInfo } from './error-sanitizer.js';\nimport { PermissionPromptController } from './permission-prompt.js';\nimport {\n getTabChannelRetryDelayMs,\n isLikelyNavigationCommitted,\n isTransientTabChannelError,\n} from './drive-reliability.js';\nimport {\n DEBUGGER_CAPABILITY_ENABLED_KEY,\n allowSiteAlways,\n isSiteAllowed,\n readDebuggerCapabilityEnabled,\n readSitePermissionsMode,\n siteKeyFromUrl,\n touchSiteLastUsed,\n} from './site-permissions.js';\nimport { ConnectionStateTracker } from './connection-state.js';\n\ntype ContentResult =\n | { ok: true; result?: unknown }\n | { ok: false; error: DriveErrorInfo };\n\ntype ContentRequest = {\n action: string;\n params?: Record<string, unknown>;\n};\n\ntype DebuggerTarget = {\n tabId?: number;\n};\n\ntype DebuggerSession = {\n attached: boolean;\n attachPromise?: Promise<void>;\n idleTimer?: number;\n lastActivityAt: string;\n initialized?: boolean;\n};\n\ntype ScreenPoint = {\n x: number;\n y: number;\n};\n\ntype CoreEndpointConfig = {\n host: string;\n port: number;\n portSource: 'default' | 'storage';\n};\n\ntype StorageChange = {\n newValue?: unknown;\n oldValue?: unknown;\n};\n\nconst DEFAULT_CORE_PORT = 3210;\nconst CORE_PORT_KEY = 'corePort';\nconst CORE_WS_PATH = '/drive';\nconst CORE_HEALTH_PATH = '/health';\nconst CORE_HEALTH_TIMEOUT_MS = 1200;\n\nconst DEBUGGER_PROTOCOL_VERSION = '1.3';\nconst DEBUGGER_IDLE_TIMEOUT_KEY = 'debuggerIdleTimeoutMs';\nconst DEFAULT_DEBUGGER_IDLE_TIMEOUT_MS = 15000;\nconst DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS = 10000;\nconst DEFAULT_SEND_TO_TAB_TIMEOUT_MS = 10000;\nconst HISTORY_DISPATCH_TIMEOUT_MS = 2000;\nconst HISTORY_NAVIGATION_SIGNAL_TIMEOUT_MS = 8000;\nconst HISTORY_POST_NAV_DOM_GRACE_TIMEOUT_MS = 2000;\n\nconst AGENT_TAB_ID_KEY = 'agentTabId';\nconst AGENT_TAB_GROUP_TITLE = 'Browser Bridge';\nconst AGENT_TAB_BOOTSTRAP_PATH = 'agent-tab.html';\nconst AGENT_TAB_FAVICON_ASSET_PATH = 'assets/icons/icon-32.png';\nconst AGENT_TAB_BRANDING_ACTION = 'drive.agent_tab_branding';\nconst AGENT_TAB_GROUP_RETRY_DELAYS_MS = [0, 120, 300] as const;\nconst AGENT_TAB_BRANDING_TIMEOUT_MS = 1500;\n\nconst BASE_NEGOTIATED_CAPABILITIES: Record<string, boolean> = Object.freeze({\n 'drive.navigate': true,\n 'drive.go_back': true,\n 'drive.go_forward': true,\n 'drive.click': true,\n 'drive.hover': true,\n 'drive.select': true,\n 'drive.type': true,\n 'drive.fill_form': true,\n 'drive.drag': true,\n 'drive.handle_dialog': true,\n 'drive.key': true,\n 'drive.key_press': true,\n 'drive.scroll': true,\n 'drive.screenshot': true,\n 'drive.wait_for': true,\n 'drive.tab_list': true,\n 'drive.tab_activate': true,\n 'drive.tab_close': true,\n 'drive.ping': true,\n});\n\nconst DEBUGGER_CAPABILITY_ACTIONS = [\n 'debugger.attach',\n 'debugger.detach',\n 'debugger.command',\n] as const;\n\nconst buildNegotiatedCapabilities = (\n debuggerCapabilityEnabled: boolean\n): Record<string, boolean> => {\n const capabilities: Record<string, boolean> = {\n ...BASE_NEGOTIATED_CAPABILITIES,\n };\n for (const action of DEBUGGER_CAPABILITY_ACTIONS) {\n capabilities[action] = debuggerCapabilityEnabled;\n }\n return capabilities;\n};\n\nconst debuggerCapabilityDisabledError = (): DriveErrorInfo => {\n return {\n code: 'ATTACH_DENIED',\n message:\n 'Debugger capability is disabled. Enable debugger-based inspect in extension options and retry.',\n retryable: false,\n details: {\n reason: 'debugger_capability_disabled',\n next_step:\n 'Open Browser Bridge extension options, enable debugger-based inspect, then retry.',\n },\n };\n};\n\nconst getAgentTabBootstrapUrl = (): string => {\n return typeof chrome.runtime?.getURL === 'function'\n ? chrome.runtime.getURL(AGENT_TAB_BOOTSTRAP_PATH)\n : AGENT_TAB_BOOTSTRAP_PATH;\n};\n\nconst getAgentTabFaviconUrl = (): string => {\n return typeof chrome.runtime?.getURL === 'function'\n ? chrome.runtime.getURL(AGENT_TAB_FAVICON_ASSET_PATH)\n : AGENT_TAB_FAVICON_ASSET_PATH;\n};\n\nconst nowIso = (): string => new Date().toISOString();\n\nconst makeEventId = (() => {\n let counter = 0;\n return () => `evt-${Date.now()}-${(counter += 1)}`;\n})();\n\nconst lastActiveAtByTab = new Map<number, string>();\n\n// When callers omit tab_id, we avoid taking over the user's active tab by\n// creating (and reusing) a dedicated \"agent\" window/tab.\nlet agentTabId: number | null = null;\n\nconst ensureLastActiveAt = (tabId: number): string => {\n const existing = lastActiveAtByTab.get(tabId);\n if (existing) {\n return existing;\n }\n const timestamp = nowIso();\n lastActiveAtByTab.set(tabId, timestamp);\n return timestamp;\n};\n\nconst markTabActive = (tabId: number): string => {\n const timestamp = nowIso();\n lastActiveAtByTab.set(tabId, timestamp);\n return timestamp;\n};\n\nconst wrapChromeCallback = <T>(\n invoker: (callback: (value: T) => void) => void\n): Promise<T> =>\n new Promise<T>((resolve, reject) => {\n invoker((value: T) => {\n const error = chrome.runtime.lastError;\n if (error) {\n reject(new Error(error.message));\n return;\n }\n resolve(value);\n });\n });\n\nconst wrapChromeVoid = (\n invoker: (callback: () => void) => void\n): Promise<void> => {\n return new Promise<void>((resolve, reject) => {\n invoker(() => {\n const error = chrome.runtime.lastError;\n if (error) {\n reject(new Error(error.message));\n return;\n }\n resolve();\n });\n });\n};\n\nconst delayMs = async (ms: number): Promise<void> => {\n if (!Number.isFinite(ms) || ms <= 0) {\n return;\n }\n await new Promise<void>((resolve) => {\n self.setTimeout(resolve, ms);\n });\n};\n\nconst CAPTURE_VISIBLE_TAB_MIN_INTERVAL_MS = 400;\nconst CAPTURE_VISIBLE_TAB_MAX_RETRIES = 3;\nconst CAPTURE_VISIBLE_TAB_RETRY_BASE_DELAY_MS = 500;\n\nlet captureVisibleTabQueue: Promise<void> = Promise.resolve();\nlet captureVisibleTabLastCallAt = 0;\n\nconst isCaptureVisibleTabRateLimitedMessage = (message: string): boolean => {\n const normalized = message.toLowerCase();\n const hasCaptureSignal =\n normalized.includes('capturevisibletab') ||\n normalized.includes('max_capture_visible_tab_calls_per_second');\n const hasRateSignal =\n normalized.includes('too often') ||\n normalized.includes('rate limit') ||\n normalized.includes('rate-limit');\n return hasCaptureSignal && hasRateSignal;\n};\n\nconst isCaptureVisibleTabRateLimitedError = (error: unknown): boolean => {\n return (\n error instanceof Error &&\n isCaptureVisibleTabRateLimitedMessage(error.message)\n );\n};\n\nconst randomJitterMs = (maxMs: number): number => {\n return Math.floor(Math.random() * Math.max(1, maxMs));\n};\n\nconst runCaptureVisibleTabOperation = async <T>(\n operation: () => Promise<T>\n): Promise<T> => {\n const previous = captureVisibleTabQueue;\n let releaseQueue: (() => void) | undefined;\n captureVisibleTabQueue = new Promise<void>((resolve) => {\n releaseQueue = resolve;\n });\n\n await previous.catch(() => undefined);\n try {\n return await operation();\n } finally {\n releaseQueue?.();\n }\n};\n\nconst captureVisibleTabWithThrottle = async (\n windowId: number\n): Promise<string> => {\n return await runCaptureVisibleTabOperation(async () => {\n for (\n let attempt = 0;\n attempt <= CAPTURE_VISIBLE_TAB_MAX_RETRIES;\n attempt += 1\n ) {\n const waitMs =\n captureVisibleTabLastCallAt +\n CAPTURE_VISIBLE_TAB_MIN_INTERVAL_MS -\n Date.now();\n if (waitMs > 0) {\n await delayMs(waitMs);\n }\n\n try {\n const dataUrl = await wrapChromeCallback<string>((callback) =>\n chrome.tabs.captureVisibleTab(windowId, { format: 'png' }, callback)\n );\n captureVisibleTabLastCallAt = Date.now();\n return dataUrl;\n } catch (error) {\n captureVisibleTabLastCallAt = Date.now();\n if (\n !isCaptureVisibleTabRateLimitedError(error) ||\n attempt >= CAPTURE_VISIBLE_TAB_MAX_RETRIES\n ) {\n throw error;\n }\n\n const backoffMs =\n CAPTURE_VISIBLE_TAB_RETRY_BASE_DELAY_MS * (attempt + 1) +\n randomJitterMs(120);\n await delayMs(backoffMs);\n }\n }\n throw new Error('captureVisibleTab failed unexpectedly.');\n });\n};\n\nconst mapScreenshotCaptureError = (\n error: unknown,\n fallbackMessage: string\n): DriveErrorInfo => {\n const message =\n error instanceof Error && error.message ? error.message : fallbackMessage;\n\n if (isCaptureVisibleTabRateLimitedError(error)) {\n return {\n code: 'RATE_LIMITED',\n message:\n 'Screenshot capture hit Chrome capture rate limits. Please retry shortly.',\n retryable: true,\n details: {\n reason: 'capture_visible_tab_rate_limited',\n original_message: message,\n },\n };\n }\n\n return {\n code: 'ARTIFACT_IO_ERROR',\n message,\n retryable: false,\n };\n};\n\nconst parseDataUrl = (\n dataUrl: string\n): { mime: string; base64: string } | null => {\n const match = /^data:([^;]+);base64,(.*)$/s.exec(dataUrl);\n if (!match) {\n return null;\n }\n return { mime: match[1] ?? 'application/octet-stream', base64: match[2] };\n};\n\nconst arrayBufferToBase64 = (buffer: ArrayBuffer): string => {\n const bytes = new Uint8Array(buffer);\n const chunkSize = 0x8000;\n let binary = '';\n for (let i = 0; i < bytes.length; i += chunkSize) {\n const chunk = bytes.subarray(i, i + chunkSize);\n binary += String.fromCharCode(...chunk);\n }\n return btoa(binary);\n};\n\nconst renderDataUrlToFormat = async (\n dataUrl: string,\n format: 'png' | 'jpeg' | 'webp',\n quality?: number\n): Promise<{\n mime: string;\n data_base64: string;\n width_px: number;\n height_px: number;\n}> => {\n const parsed = parseDataUrl(dataUrl);\n if (!parsed) {\n throw new Error('Invalid screenshot data URL.');\n }\n\n const blob = await (await fetch(dataUrl)).blob();\n const bitmap = await createImageBitmap(blob);\n try {\n const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Canvas context unavailable.');\n }\n ctx.drawImage(bitmap, 0, 0);\n\n const mime =\n format === 'jpeg'\n ? 'image/jpeg'\n : format === 'webp'\n ? 'image/webp'\n : 'image/png';\n const q =\n typeof quality === 'number' && Number.isFinite(quality)\n ? Math.max(0, Math.min(1, quality / 100))\n : undefined;\n const out =\n format === 'png'\n ? await canvas.convertToBlob({ type: mime })\n : await canvas.convertToBlob({ type: mime, quality: q });\n const base64 = arrayBufferToBase64(await out.arrayBuffer());\n\n return {\n mime,\n data_base64: base64,\n width_px: bitmap.width,\n height_px: bitmap.height,\n };\n } finally {\n bitmap.close();\n }\n};\n\nconst readCoreEndpointConfig = async (): Promise<CoreEndpointConfig> => {\n return await new Promise<CoreEndpointConfig>((resolve) => {\n chrome.storage.local.get(\n [CORE_PORT_KEY],\n (result: Record<string, unknown>) => {\n const raw = result?.[CORE_PORT_KEY];\n if (typeof raw === 'number' && Number.isFinite(raw)) {\n resolve({\n host: '127.0.0.1',\n port: raw,\n portSource: 'storage',\n });\n return;\n }\n if (typeof raw === 'string') {\n const parsed = Number(raw);\n if (Number.isFinite(parsed)) {\n resolve({\n host: '127.0.0.1',\n port: parsed,\n portSource: 'storage',\n });\n return;\n }\n }\n resolve({\n host: '127.0.0.1',\n port: DEFAULT_CORE_PORT,\n portSource: 'default',\n });\n }\n );\n });\n};\n\nconst readDebuggerIdleTimeoutMs = async (): Promise<number> => {\n return await new Promise<number>((resolve) => {\n chrome.storage.local.get(\n [DEBUGGER_IDLE_TIMEOUT_KEY],\n (result: Record<string, unknown>) => {\n const raw = result?.[DEBUGGER_IDLE_TIMEOUT_KEY];\n if (typeof raw === 'number' && Number.isFinite(raw) && raw > 0) {\n resolve(raw);\n return;\n }\n if (typeof raw === 'string') {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed > 0) {\n resolve(parsed);\n return;\n }\n }\n resolve(DEFAULT_DEBUGGER_IDLE_TIMEOUT_MS);\n }\n );\n });\n};\n\nconst RESTRICTED_URL_PREFIXES = [\n 'chrome://',\n 'chrome-extension://',\n 'chrome-devtools://',\n 'devtools://',\n 'edge://',\n 'brave://',\n 'view-source:',\n];\n\nconst isRestrictedUrl = (url?: string): boolean => {\n if (!url || typeof url !== 'string') {\n return false;\n }\n const lowered = url.toLowerCase();\n if (RESTRICTED_URL_PREFIXES.some((prefix) => lowered.startsWith(prefix))) {\n return true;\n }\n try {\n const parsed = new URL(url);\n if (parsed.hostname === 'chromewebstore.google.com') {\n return true;\n }\n if (parsed.hostname === 'chrome.google.com') {\n return parsed.pathname.startsWith('/webstore');\n }\n } catch (error) {\n console.debug('Ignoring invalid URL in restriction check.', error);\n }\n return false;\n};\n\nconst mapDebuggerErrorMessage = (\n message: string,\n fallbackCode = 'INSPECT_UNAVAILABLE'\n): DriveErrorInfo => {\n const normalized = message.toLowerCase();\n if (\n normalized.includes('already attached') ||\n normalized.includes('another debugger') ||\n normalized.includes('attached to this target')\n ) {\n return {\n code: 'DEBUGGER_IN_USE',\n message:\n 'Debugger already attached. Close DevTools on the target tab and retry.',\n retryable: true,\n details: {\n reason: 'debugger_in_use',\n hint: 'Close DevTools on the target tab and retry.',\n original_message: message,\n },\n };\n }\n if (\n normalized.includes('no tab') ||\n normalized.includes('no target') ||\n normalized.includes('tab id')\n ) {\n return {\n code: 'TAB_NOT_FOUND',\n message,\n retryable: false,\n };\n }\n if (\n normalized.includes('not allowed') ||\n normalized.includes('permission') ||\n normalized.includes('denied')\n ) {\n return {\n code: 'ATTACH_DENIED',\n message,\n retryable: false,\n };\n }\n if (\n normalized.includes('cannot access') ||\n normalized.includes('not supported') ||\n normalized.includes('disallowed')\n ) {\n return {\n code: 'NOT_SUPPORTED',\n message,\n retryable: false,\n };\n }\n return {\n code: fallbackCode,\n message,\n retryable: false,\n };\n};\n\nconst buildTabInfo = (tab: Record<string, unknown>): DriveTabInfo | null => {\n const tabId = tab.id;\n const windowId = tab.windowId;\n if (typeof tabId !== 'number' || typeof windowId !== 'number') {\n return null;\n }\n return {\n tab_id: tabId,\n window_id: windowId,\n url: typeof tab.url === 'string' ? tab.url : undefined,\n title: typeof tab.title === 'string' ? tab.title : undefined,\n active: typeof tab.active === 'boolean' ? tab.active : undefined,\n last_active_at: ensureLastActiveAt(tabId),\n };\n};\n\nconst queryTabs = async (): Promise<DriveTabInfo[]> => {\n const tabs = await wrapChromeCallback<Record<string, unknown>[]>((callback) =>\n chrome.tabs.query({}, callback)\n );\n const result: DriveTabInfo[] = [];\n for (const tab of tabs) {\n const info = buildTabInfo(tab);\n if (info) {\n result.push(info);\n }\n }\n return result;\n};\n\nconst getTab = async (tabId: number): Promise<Record<string, unknown>> => {\n return await wrapChromeCallback<Record<string, unknown>>((callback) =>\n chrome.tabs.get(tabId, callback)\n );\n};\n\nconst getActiveTabId = async (): Promise<number> => {\n const tabs = await wrapChromeCallback<Record<string, unknown>[]>((callback) =>\n chrome.tabs.query({ active: true, lastFocusedWindow: true }, callback)\n );\n const first = tabs[0];\n if (first && typeof first.id === 'number') {\n return first.id;\n }\n throw new Error('No active tab found.');\n};\n\nconst clearAgentTarget = (): void => {\n agentTabId = null;\n // Best-effort; the service worker may be shutting down.\n void writeAgentTabId(null);\n};\n\nconst queryActiveTabIdInWindow = async (windowId: number): Promise<number> => {\n const tabs = await wrapChromeCallback<Record<string, unknown>[]>((callback) =>\n chrome.tabs.query({ active: true, windowId }, callback)\n );\n const first = tabs[0];\n if (first && typeof first.id === 'number') {\n return first.id;\n }\n\n const anyTabs = await wrapChromeCallback<Record<string, unknown>[]>(\n (callback) => chrome.tabs.query({ windowId }, callback)\n );\n const fallback = anyTabs[0];\n if (fallback && typeof fallback.id === 'number') {\n return fallback.id;\n }\n\n throw new Error('No tab found for window.');\n};\n\nconst ensureAgentTabGroup = async (\n tabId: number,\n windowId: number\n): Promise<void> => {\n if (typeof chrome.tabs?.group !== 'function') {\n return;\n }\n if (!chrome.tabGroups || typeof chrome.tabGroups.update !== 'function') {\n return;\n }\n\n let lastError: unknown;\n for (const retryDelayMs of AGENT_TAB_GROUP_RETRY_DELAYS_MS) {\n if (retryDelayMs > 0) {\n await delayMs(retryDelayMs);\n }\n try {\n const groupId = await wrapChromeCallback<number>((callback) =>\n chrome.tabs.group(\n { tabIds: tabId, createProperties: { windowId } },\n callback\n )\n );\n await wrapChromeVoid((callback) =>\n chrome.tabGroups.update(groupId, { title: AGENT_TAB_GROUP_TITLE }, () =>\n callback()\n )\n );\n return;\n } catch (error) {\n lastError = error;\n }\n }\n console.debug('Failed to create/update agent tab group.', lastError);\n};\n\nconst ensureAgentTabGroupForTab = async (\n tabId: number,\n tab: Record<string, unknown>\n): Promise<void> => {\n const windowId = tab.windowId;\n if (typeof windowId !== 'number') {\n return;\n }\n await ensureAgentTabGroup(tabId, windowId);\n};\n\nconst createAgentWindow = async (): Promise<number> => {\n const created = await wrapChromeCallback<Record<string, unknown>>(\n (callback) =>\n chrome.windows.create(\n { url: getAgentTabBootstrapUrl(), focused: true },\n callback\n )\n );\n const windowId = created.id;\n if (typeof windowId !== 'number') {\n throw new Error('Failed to create agent window.');\n }\n const tabId = await queryActiveTabIdInWindow(windowId);\n await ensureAgentTabGroup(tabId, windowId);\n return tabId;\n};\n\nconst readAgentTabId = async (): Promise<number | null> => {\n return await new Promise<number | null>((resolve) => {\n chrome.storage.local.get(\n [AGENT_TAB_ID_KEY],\n (result: Record<string, unknown>) => {\n const raw = result?.[AGENT_TAB_ID_KEY];\n resolve(typeof raw === 'number' && Number.isFinite(raw) ? raw : null);\n }\n );\n });\n};\n\nconst writeAgentTabId = async (tabId: number | null): Promise<void> => {\n await new Promise<void>((resolve, reject) => {\n const done = () => {\n const error = chrome.runtime.lastError;\n if (error) {\n reject(new Error(error.message));\n return;\n }\n resolve();\n };\n\n if (tabId === null) {\n chrome.storage.local.remove([AGENT_TAB_ID_KEY], done);\n return;\n }\n\n chrome.storage.local.set({ [AGENT_TAB_ID_KEY]: tabId }, done);\n }).catch((error) => {\n console.debug('Failed to persist agentTabId.', error);\n });\n};\n\nconst getOrCreateAgentTabId = async (): Promise<number> => {\n if (agentTabId !== null) {\n try {\n const tab = await getTab(agentTabId);\n const url = tab.url;\n if (typeof url === 'string' && isRestrictedUrl(url)) {\n throw new Error(`Agent tab points at restricted URL: ${url}`);\n }\n await ensureAgentTabGroupForTab(agentTabId, tab);\n void refreshAgentTabBranding(agentTabId);\n return agentTabId;\n } catch {\n clearAgentTarget();\n }\n }\n\n const stored = await readAgentTabId();\n if (stored !== null) {\n try {\n const tab = await getTab(stored);\n const url = tab.url;\n if (typeof url === 'string' && isRestrictedUrl(url)) {\n throw new Error(`Stored agent tab points at restricted URL: ${url}`);\n }\n agentTabId = stored;\n ensureLastActiveAt(stored);\n markTabActive(stored);\n await ensureAgentTabGroupForTab(stored, tab);\n void refreshAgentTabBranding(stored);\n return stored;\n } catch {\n await writeAgentTabId(null);\n }\n }\n\n const tabId = await createAgentWindow();\n agentTabId = tabId;\n ensureLastActiveAt(tabId);\n markTabActive(tabId);\n await writeAgentTabId(tabId);\n return tabId;\n};\n\nconst getDefaultTabId = async (): Promise<number> => {\n try {\n return await getOrCreateAgentTabId();\n } catch (error) {\n console.warn(\n 'Failed to create agent window/tab; falling back to active tab.',\n error\n );\n return await getActiveTabId();\n }\n};\n\nconst sendToTab = async (\n tabId: number,\n action: string,\n params?: Record<string, unknown>,\n options?: { timeoutMs?: number }\n): Promise<ContentResult> => {\n const timeoutMs =\n typeof options?.timeoutMs === 'number' && Number.isFinite(options.timeoutMs)\n ? Math.max(1, Math.floor(options.timeoutMs))\n : DEFAULT_SEND_TO_TAB_TIMEOUT_MS;\n\n const attemptSend = async (): Promise<ContentResult> => {\n return await new Promise<ContentResult>((resolve) => {\n const message: ContentRequest = { action, params };\n let settled = false;\n const finish = (result: ContentResult) => {\n if (settled) {\n return;\n }\n settled = true;\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n resolve(result);\n };\n let timeout: number | undefined;\n timeout = self.setTimeout(() => {\n finish({\n ok: false,\n error: {\n code: 'TIMEOUT',\n message: `Timed out waiting for content response after ${timeoutMs}ms.`,\n retryable: true,\n details: {\n action,\n tab_id: tabId,\n timeout_ms: timeoutMs,\n },\n },\n });\n }, timeoutMs);\n chrome.tabs.sendMessage(tabId, message, (response: ContentResult) => {\n const error = chrome.runtime.lastError;\n if (error) {\n const retryable = isTransientTabChannelError(error.message);\n finish({\n ok: false,\n error: {\n code: 'EVALUATION_FAILED',\n message: error.message,\n retryable,\n ...(retryable\n ? {\n details: {\n reason: 'transient_tab_channel_error',\n },\n }\n : {}),\n },\n });\n return;\n }\n if (!response || typeof response !== 'object') {\n finish({\n ok: false,\n error: {\n code: 'EVALUATION_FAILED',\n message: 'Empty response from content script.',\n retryable: false,\n },\n });\n return;\n }\n finish(response);\n });\n });\n };\n\n // After navigation, MV3 message channels can close briefly while the content\n // script reattaches (for example, BFCache/page lifecycle transitions).\n for (let attempt = 1; ; attempt += 1) {\n const result = await attemptSend();\n if (result.ok) {\n return result;\n }\n if (!isTransientTabChannelError(result.error?.message)) {\n return result;\n }\n const retryDelayMs = getTabChannelRetryDelayMs(attempt);\n if (retryDelayMs === undefined) {\n return result;\n }\n await delayMs(retryDelayMs);\n }\n};\n\nconst refreshAgentTabBranding = async (tabId: number): Promise<void> => {\n const result = await sendToTab(\n tabId,\n AGENT_TAB_BRANDING_ACTION,\n { favicon_url: getAgentTabFaviconUrl() },\n { timeoutMs: AGENT_TAB_BRANDING_TIMEOUT_MS }\n );\n if (!result.ok) {\n return;\n }\n};\n\nconst waitForHistoryNavigationSignal = async (\n tabId: number,\n timeoutMs: number\n): Promise<void> => {\n return await new Promise<void>((resolve, reject) => {\n let timeout: number | undefined;\n const cleanup = () => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n chrome.webNavigation.onCommitted.removeListener(onCommitted);\n chrome.webNavigation.onHistoryStateUpdated.removeListener(\n onHistoryStateUpdated\n );\n chrome.webNavigation.onReferenceFragmentUpdated.removeListener(\n onReferenceFragmentUpdated\n );\n chrome.tabs.onUpdated.removeListener(onTabUpdated);\n };\n\n const resolveSignal = () => {\n cleanup();\n resolve();\n };\n\n const onCommitted = (details: { tabId: number; frameId: number }) => {\n if (details.tabId !== tabId || details.frameId !== 0) {\n return;\n }\n resolveSignal();\n };\n\n const onHistoryStateUpdated = (details: {\n tabId: number;\n frameId: number;\n }) => {\n if (details.tabId !== tabId || details.frameId !== 0) {\n return;\n }\n resolveSignal();\n };\n\n const onReferenceFragmentUpdated = (details: {\n tabId: number;\n frameId: number;\n }) => {\n if (details.tabId !== tabId || details.frameId !== 0) {\n return;\n }\n resolveSignal();\n };\n\n const onTabUpdated = (\n updatedTabId: number,\n changeInfo: Record<string, unknown>\n ) => {\n if (updatedTabId !== tabId) {\n return;\n }\n if (typeof changeInfo.url !== 'string' || changeInfo.url.length === 0) {\n return;\n }\n resolveSignal();\n };\n\n chrome.webNavigation.onCommitted.addListener(onCommitted);\n chrome.webNavigation.onHistoryStateUpdated.addListener(\n onHistoryStateUpdated\n );\n chrome.webNavigation.onReferenceFragmentUpdated.addListener(\n onReferenceFragmentUpdated\n );\n chrome.tabs.onUpdated.addListener(onTabUpdated);\n timeout = self.setTimeout(() => {\n cleanup();\n reject(new Error('Timed out waiting for history navigation signal.'));\n }, timeoutMs);\n });\n};\n\nconst waitForDomContentLoaded = async (\n tabId: number,\n timeoutMs: number\n): Promise<void> => {\n return await new Promise<void>((resolve, reject) => {\n let timeout: number | undefined;\n const cleanup = () => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n chrome.webNavigation.onDOMContentLoaded.removeListener(listener);\n };\n\n const listener = (details: { tabId: number; frameId: number }) => {\n if (details.tabId !== tabId || details.frameId !== 0) {\n return;\n }\n cleanup();\n resolve();\n };\n\n chrome.webNavigation.onDOMContentLoaded.addListener(listener);\n timeout = self.setTimeout(() => {\n cleanup();\n reject(new Error('Timed out waiting for domcontentloaded.'));\n }, timeoutMs);\n });\n};\n\nconst getWsEndpoint = async (): Promise<{\n endpoint: CoreEndpointConfig;\n url: string;\n}> => {\n const endpoint = await readCoreEndpointConfig();\n return {\n endpoint,\n url: `ws://${endpoint.host}:${endpoint.port}${CORE_WS_PATH}`,\n };\n};\n\nconst getHealthEndpoint = (endpoint: CoreEndpointConfig): string =>\n `http://${endpoint.host}:${endpoint.port}${CORE_HEALTH_PATH}`;\n\nclass DriveSocket {\n private socket: WebSocket | null = null;\n private reconnectTimer: number | null = null;\n private reconnectDelayMs = 1000;\n private readonly maxReconnectDelayMs = 10000;\n private keepAliveTimer: number | null = null;\n private readonly keepAliveIntervalMs = 30000;\n private readonly debuggerSessions = new Map<number, DebuggerSession>();\n private debuggerIdleTimeoutMs: number | null = null;\n private readonly connection = new ConnectionStateTracker();\n\n start(): void {\n this.connection.markConnecting();\n void this.connect().catch((error) => {\n this.recordConnectionFailure('initial connect', error);\n });\n }\n\n stop(): void {\n if (this.reconnectTimer !== null) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.stopKeepAlive();\n if (this.socket) {\n this.socket.close();\n this.socket = null;\n }\n this.connection.markDisconnected();\n }\n\n sendTabReport(): void {\n void this.emitTabReport().catch((error) => {\n console.error('DriveSocket emitTabReport failed:', error);\n });\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer !== null) {\n return;\n }\n const delay = this.reconnectDelayMs;\n this.connection.markBackoff(delay);\n this.reconnectTimer = self.setTimeout(() => {\n this.reconnectTimer = null;\n this.connection.markConnecting();\n void this.connect().catch((error) => {\n this.recordConnectionFailure('reconnect', error);\n });\n }, delay);\n this.reconnectDelayMs = Math.min(\n this.maxReconnectDelayMs,\n this.reconnectDelayMs * 2\n );\n }\n\n private async connect(): Promise<void> {\n const { endpoint, url } = await getWsEndpoint();\n this.connection.setEndpoint(endpoint);\n const health = await this.checkCoreHealth(endpoint);\n if (!health.ok) {\n this.connection.markDisconnected();\n this.recordConnectionFailure(\n 'core unavailable',\n new Error(health.detail)\n );\n this.scheduleReconnect();\n return;\n }\n try {\n const socket = new WebSocket(url);\n this.socket = socket;\n\n socket.addEventListener('open', () => {\n this.reconnectDelayMs = 1000;\n this.connection.markConnected();\n const suppressed = this.connection.flushSuppressedFailureLogs();\n if (suppressed > 0) {\n console.info(\n `DriveSocket reconnected after suppressing ${suppressed} repeated connection failures.`\n );\n }\n this.startKeepAlive();\n void this.sendHello().catch((error) => {\n console.error('DriveSocket hello failed:', error);\n });\n });\n\n socket.addEventListener('message', (event) => {\n this.handleMessage(event.data);\n });\n\n socket.addEventListener('close', () => {\n this.handleSocketUnavailable(socket, 'socket closed');\n });\n\n socket.addEventListener('error', () => {\n this.handleSocketUnavailable(socket, 'socket error');\n });\n } catch (error) {\n this.recordConnectionFailure('connect', error);\n this.connection.markDisconnected();\n this.scheduleReconnect();\n }\n }\n\n private async checkCoreHealth(endpoint: CoreEndpointConfig): Promise<{\n ok: boolean;\n detail: string;\n }> {\n const controller = new AbortController();\n const timeoutId = self.setTimeout(() => {\n controller.abort();\n }, CORE_HEALTH_TIMEOUT_MS);\n try {\n const response = await fetch(getHealthEndpoint(endpoint), {\n method: 'GET',\n cache: 'no-store',\n signal: controller.signal,\n });\n if (!response.ok) {\n return {\n ok: false,\n detail: `health returned HTTP ${response.status}`,\n };\n }\n return { ok: true, detail: 'ok' };\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n return {\n ok: false,\n detail: `health timed out after ${CORE_HEALTH_TIMEOUT_MS}ms`,\n };\n }\n return {\n ok: false,\n detail:\n error instanceof Error && error.message.length > 0\n ? error.message\n : 'health check failed',\n };\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n getConnectionStatus(): ReturnType<ConnectionStateTracker['getStatus']> {\n return this.connection.getStatus();\n }\n\n refreshCapabilities(): void {\n void this.sendHello().catch((error) => {\n console.error('DriveSocket refreshCapabilities failed:', error);\n });\n }\n\n private handleSocketUnavailable(socket: WebSocket, reason: string): void {\n if (this.socket !== socket) {\n return;\n }\n this.socket = null;\n this.stopKeepAlive();\n this.connection.markDisconnected();\n this.recordConnectionFailure(reason, new Error(reason));\n this.scheduleReconnect();\n }\n\n private recordConnectionFailure(context: string, error: unknown): void {\n const detail =\n error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : 'Unknown error';\n this.connection.recordFailure(`${context}: ${detail}`);\n const budget = this.connection.consumeFailureLogBudget();\n if (!budget.shouldLog) {\n return;\n }\n if (budget.suppressedCount > 0) {\n console.warn(\n `DriveSocket ${context} failed (${budget.suppressedCount} repeated failures suppressed).`,\n error\n );\n return;\n }\n console.warn(`DriveSocket ${context} failed.`, error);\n }\n\n private async sendHello(): Promise<void> {\n const manifest = chrome.runtime.getManifest();\n const endpoint = await readCoreEndpointConfig();\n const debuggerCapabilityEnabled = await readDebuggerCapabilityEnabled();\n let tabs: DriveTabInfo[] = [];\n try {\n tabs = await queryTabs();\n } catch (error) {\n console.debug('DriveSocket sendHello failed to read tabs.', error);\n tabs = [];\n }\n const params: DriveHelloParams = {\n version: manifest.version,\n protocol_version: DRIVE_WS_PROTOCOL_VERSION,\n capabilities: buildNegotiatedCapabilities(debuggerCapabilityEnabled),\n core_host: endpoint.host,\n core_port: endpoint.port,\n core_port_source: endpoint.portSource,\n tabs,\n };\n this.sendEvent('drive.hello', params);\n }\n\n private async emitTabReport(): Promise<void> {\n try {\n const tabs = await queryTabs();\n this.sendEvent('drive.tab_report', { tabs });\n } catch (error) {\n console.debug('DriveSocket emitTabReport failed.', error);\n }\n }\n\n private sendEvent(\n action: DriveEvent['action'],\n params: DriveEvent['params']\n ): void {\n const message: DriveEvent = {\n id: makeEventId(),\n action,\n status: 'event',\n params,\n };\n this.sendMessage(message);\n }\n\n private startKeepAlive(): void {\n this.stopKeepAlive();\n this.keepAliveTimer = self.setInterval(() => {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n return;\n }\n this.sendEvent('drive.keepalive', {});\n }, this.keepAliveIntervalMs);\n }\n\n private stopKeepAlive(): void {\n if (this.keepAliveTimer !== null) {\n clearInterval(this.keepAliveTimer);\n this.keepAliveTimer = null;\n }\n }\n\n private sendDebuggerEvent(params: DebuggerEvent['params']): void {\n const message: DebuggerEvent = {\n id: makeEventId(),\n action: 'debugger.event',\n status: 'event',\n params,\n };\n this.sendMessage(message);\n }\n\n private sendMessage(message: ExtensionMessage): void {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n return;\n }\n this.socket.send(JSON.stringify(message));\n }\n\n private handleMessage(raw: unknown): void {\n if (typeof raw !== 'string') {\n return;\n }\n let message: ExtensionMessage | null = null;\n try {\n message = JSON.parse(raw) as ExtensionMessage;\n } catch (error) {\n console.debug('DriveSocket received invalid JSON message.', error);\n return;\n }\n if (!message || typeof message !== 'object') {\n return;\n }\n if (message.status === 'request') {\n void this.handleRequest(message as ExtensionRequest).catch((error) => {\n console.error('DriveSocket handleRequest failed:', error);\n });\n }\n }\n\n async refreshDebuggerCapabilityState(): Promise<void> {\n const enabled = await readDebuggerCapabilityEnabled();\n if (!enabled) {\n await this.detachAllDebuggerSessions();\n }\n this.refreshCapabilities();\n }\n\n async handleDebuggerCapabilityChange(enabled: boolean): Promise<void> {\n if (!enabled) {\n await this.detachAllDebuggerSessions();\n }\n this.refreshCapabilities();\n }\n\n private async handleRequest(message: ExtensionRequest): Promise<void> {\n let driveMessage: DriveRequest | null = null;\n let gatedSiteKey: string | null = null;\n let touchGatedSiteOnSuccess = false;\n const respondOk = (result?: unknown): void => {\n if (!driveMessage) {\n return;\n }\n if (touchGatedSiteOnSuccess && gatedSiteKey) {\n void touchSiteLastUsed(gatedSiteKey).catch((error) => {\n console.error('Failed to touch site allowlist entry:', error);\n });\n }\n const response: DriveResponse = {\n id: driveMessage.id,\n action: driveMessage.action,\n status: 'ok',\n result,\n };\n this.sendMessage(response);\n };\n\n const respondError = (error: DriveErrorInfo): void => {\n if (!driveMessage) {\n return;\n }\n const response: DriveResponse = {\n id: driveMessage.id,\n action: driveMessage.action,\n status: 'error',\n error: sanitizeDriveErrorInfo(error),\n };\n this.sendMessage(response);\n };\n\n try {\n if (\n !message ||\n typeof message !== 'object' ||\n typeof message.id !== 'string' ||\n typeof message.action !== 'string'\n ) {\n return;\n }\n if (message.action.startsWith('debugger.')) {\n if (!(await readDebuggerCapabilityEnabled())) {\n this.sendMessage({\n id: message.id,\n action: message.action,\n status: 'error',\n error: sanitizeDriveErrorInfo(debuggerCapabilityDisabledError()),\n });\n return;\n }\n await this.handleDebuggerRequest(message as DebuggerRequest);\n return;\n }\n\n if (!message.action.startsWith('drive.')) {\n return;\n }\n\n driveMessage = message as DriveRequest;\n\n const gatedActions = new Set<string>([\n 'drive.navigate',\n 'drive.go_back',\n 'drive.go_forward',\n 'drive.click',\n 'drive.hover',\n 'drive.select',\n 'drive.type',\n 'drive.fill_form',\n 'drive.drag',\n 'drive.handle_dialog',\n 'drive.key',\n 'drive.key_press',\n 'drive.scroll',\n 'drive.screenshot',\n 'drive.wait_for',\n ]);\n\n const gateDriveAction = async (): Promise<\n | { ok: true; siteKey: string | null; touchOnSuccess: boolean }\n | { ok: false; error: DriveErrorInfo }\n > => {\n const action = message.action;\n if (!gatedActions.has(action)) {\n return { ok: true, siteKey: null, touchOnSuccess: false };\n }\n\n const params = (message.params ?? {}) as Record<string, unknown>;\n let siteKey: string | null = null;\n\n if (action === 'drive.navigate') {\n const url = params.url;\n if (typeof url !== 'string' || url.length === 0) {\n // Let the switch handle INVALID_ARGUMENT for missing url.\n return { ok: true, siteKey: null, touchOnSuccess: false };\n }\n if (isRestrictedUrl(url)) {\n return {\n ok: false,\n error: {\n code: 'NOT_SUPPORTED',\n message: 'Navigation is not supported for this URL.',\n retryable: false,\n details: { url },\n },\n };\n }\n siteKey = siteKeyFromUrl(url);\n if (!siteKey) {\n return {\n ok: false,\n error: {\n code: 'INVALID_ARGUMENT',\n message: 'Unable to resolve site permission key for url.',\n retryable: false,\n details: { url },\n },\n };\n }\n } else {\n const tabId = params.tab_id;\n if (tabId !== undefined && typeof tabId !== 'number') {\n // Let the switch handle INVALID_ARGUMENT for tab_id shape.\n return { ok: true, siteKey: null, touchOnSuccess: false };\n }\n // IMPORTANT: Drive actions default to operating on the dedicated\n // agent tab (getDefaultTabId) when tab_id is omitted. Permission\n // gating must resolve the same tab, otherwise we might gate/prompt\n // for the wrong site.\n const resolvedTabId =\n typeof tabId === 'number' ? tabId : await getDefaultTabId();\n const tab = await getTab(resolvedTabId);\n const url = tab.url;\n if (typeof url !== 'string' || url.length === 0) {\n return {\n ok: false,\n error: {\n code: 'FAILED_PRECONDITION',\n message: 'Active tab URL is unavailable for permission gating.',\n retryable: false,\n details: { tab_id: resolvedTabId },\n },\n };\n }\n if (isRestrictedUrl(url)) {\n const message =\n action === 'drive.screenshot'\n ? 'Screenshots are not supported for this URL.'\n : 'This action is not supported for this URL.';\n return {\n ok: false,\n error: {\n code: 'NOT_SUPPORTED',\n message,\n retryable: false,\n details: { url },\n },\n };\n }\n siteKey = siteKeyFromUrl(url);\n if (!siteKey) {\n return {\n ok: false,\n error: {\n code: 'FAILED_PRECONDITION',\n message:\n 'Unable to resolve site permission key for active tab.',\n retryable: false,\n details: { url, tab_id: resolvedTabId },\n },\n };\n }\n }\n\n if ((await readSitePermissionsMode()) === 'bypass') {\n // Bypass mode skips the per-site allowlist and permission prompt.\n // We still enforce restricted URL checks above.\n return { ok: true, siteKey, touchOnSuccess: false };\n }\n\n if (await isSiteAllowed(siteKey)) {\n return { ok: true, siteKey, touchOnSuccess: true };\n }\n\n const decision = await permissionPrompts.requestPermission({\n siteKey,\n action,\n });\n\n if (decision.kind === 'timed_out') {\n return {\n ok: false,\n error: {\n code: 'PERMISSION_PROMPT_TIMEOUT',\n message: `Permission prompt timed out for ${siteKey}.`,\n retryable: true,\n details: {\n reason: 'prompt_timed_out',\n site: siteKey,\n action,\n wait_ms: decision.waitMs,\n },\n },\n };\n }\n\n if (decision.kind === 'deny') {\n return {\n ok: false,\n error: {\n code: 'PERMISSION_DENIED',\n message: `User denied Browser Bridge permission for ${siteKey}.`,\n retryable: false,\n details: {\n reason: 'user_denied',\n site: siteKey,\n action,\n next_step:\n 'Ask the user to approve the permission prompt (Allow/Always allow) or allow the site in the extension options page, then retry the command.',\n },\n },\n };\n }\n\n if (decision.kind === 'allow_always') {\n // Ensure the allowlist is persisted even if the controller didn't (or couldn't).\n await allowSiteAlways(siteKey);\n return { ok: true, siteKey, touchOnSuccess: true };\n }\n\n // allow_once\n return { ok: true, siteKey, touchOnSuccess: false };\n };\n\n const gated = await gateDriveAction();\n if (!gated.ok) {\n respondError(gated.error);\n return;\n }\n gatedSiteKey = gated.siteKey;\n touchGatedSiteOnSuccess = gated.touchOnSuccess;\n\n switch (message.action) {\n case 'drive.ping': {\n respondOk({ ok: true });\n return;\n }\n case 'drive.navigate': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const url = params.url;\n if (typeof url !== 'string' || url.length === 0) {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'url must be a non-empty string.',\n retryable: false,\n });\n return;\n }\n let tabId = params.tab_id;\n if (tabId !== undefined && typeof tabId !== 'number') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'tab_id must be a number when provided.',\n retryable: false,\n });\n return;\n }\n if (tabId === undefined) {\n tabId = await getDefaultTabId();\n }\n const waitMode =\n params.wait === 'none' || params.wait === 'domcontentloaded'\n ? params.wait\n : 'domcontentloaded';\n const domContentLoadedSignal =\n waitMode === 'domcontentloaded'\n ? waitForDomContentLoaded(tabId as number, 30000)\n : null;\n const warnings: string[] = [];\n await wrapChromeVoid((callback) =>\n chrome.tabs.update(tabId as number, { url }, () => callback())\n );\n markTabActive(tabId as number);\n if (domContentLoadedSignal) {\n try {\n await domContentLoadedSignal;\n } catch (error) {\n const tab = await getTab(tabId as number).catch(() => undefined);\n if (\n tab &&\n isLikelyNavigationCommitted(url, tab.url ?? undefined)\n ) {\n warnings.push(\n 'Timed out waiting for DOMContentLoaded, but the tab URL already updated to the requested target.'\n );\n } else {\n respondError({\n code: 'TIMEOUT',\n message:\n error instanceof Error\n ? error.message\n : 'Timed out waiting.',\n retryable: true,\n });\n return;\n }\n }\n }\n if (tabId === agentTabId) {\n void refreshAgentTabBranding(tabId as number);\n }\n respondOk({\n ok: true,\n ...(warnings.length > 0 ? { warnings } : {}),\n });\n return;\n }\n case 'drive.go_back':\n case 'drive.go_forward': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n let tabId = params.tab_id;\n if (tabId !== undefined && typeof tabId !== 'number') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'tab_id must be a number when provided.',\n retryable: false,\n });\n return;\n }\n if (tabId === undefined) {\n tabId = await getDefaultTabId();\n }\n const navigationSignal = waitForHistoryNavigationSignal(\n tabId as number,\n HISTORY_NAVIGATION_SIGNAL_TIMEOUT_MS\n );\n const result = await sendToTab(\n tabId as number,\n message.action,\n undefined,\n {\n timeoutMs: HISTORY_DISPATCH_TIMEOUT_MS,\n }\n );\n if (!result.ok && result.error.code !== 'TIMEOUT') {\n respondError(result.error);\n return;\n }\n markTabActive(tabId as number);\n try {\n await navigationSignal;\n try {\n await waitForDomContentLoaded(\n tabId as number,\n HISTORY_POST_NAV_DOM_GRACE_TIMEOUT_MS\n );\n } catch {\n // BFCache/history restores can skip DOMContentLoaded; proceed once\n // we have a confirmed top-level navigation signal.\n }\n } catch {\n if (!result.ok) {\n respondError({\n ...result.error,\n });\n return;\n }\n }\n if (tabId === agentTabId) {\n void refreshAgentTabBranding(tabId as number);\n }\n respondOk({\n ok: true,\n });\n return;\n }\n case 'drive.tab_list': {\n const tabs = await queryTabs();\n const result: DriveTabListResult = { tabs };\n respondOk(result);\n return;\n }\n case 'drive.tab_activate': {\n const tabId = (message.params as Record<string, unknown> | undefined)\n ?.tab_id;\n if (typeof tabId !== 'number') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'tab_id must be a number.',\n retryable: false,\n });\n return;\n }\n const tab = await getTab(tabId);\n await wrapChromeVoid((callback) =>\n chrome.tabs.update(tabId, { active: true }, () => callback())\n );\n const windowId = tab.windowId;\n if (typeof windowId === 'number') {\n await wrapChromeVoid((callback) =>\n chrome.windows.update(windowId, { focused: true }, () =>\n callback()\n )\n );\n }\n markTabActive(tabId);\n respondOk({ ok: true });\n this.sendTabReport();\n return;\n }\n case 'drive.tab_close': {\n const tabId = (message.params as Record<string, unknown> | undefined)\n ?.tab_id;\n if (typeof tabId !== 'number') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'tab_id must be a number.',\n retryable: false,\n });\n return;\n }\n await wrapChromeVoid((callback) =>\n chrome.tabs.remove(tabId, () => callback())\n );\n if (agentTabId === tabId) {\n clearAgentTarget();\n }\n lastActiveAtByTab.delete(tabId);\n respondOk({ ok: true });\n this.sendTabReport();\n return;\n }\n case 'drive.handle_dialog': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const action = params.action;\n if (action !== 'accept' && action !== 'dismiss') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'action must be accept or dismiss.',\n retryable: false,\n });\n return;\n }\n const promptText = params.promptText;\n if (promptText !== undefined && typeof promptText !== 'string') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'promptText must be a string when provided.',\n retryable: false,\n });\n return;\n }\n let tabId = params.tab_id;\n if (tabId !== undefined && typeof tabId !== 'number') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'tab_id must be a number when provided.',\n retryable: false,\n });\n return;\n }\n if (tabId === undefined) {\n tabId = await getDefaultTabId();\n }\n\n const error = await this.ensureDebuggerAttached(tabId as number);\n if (error) {\n respondError(error);\n return;\n }\n\n try {\n await this.sendDebuggerCommand(\n tabId as number,\n 'Page.handleJavaScriptDialog',\n {\n accept: action === 'accept',\n ...(promptText ? { promptText } : {}),\n },\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n this.touchDebuggerSession(tabId as number);\n respondOk({ ok: true });\n } catch (error) {\n const info = mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Dialog handling failed.'\n );\n respondError(info);\n }\n return;\n }\n case 'drive.click': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n let tabId = params.tab_id;\n if (tabId !== undefined && typeof tabId !== 'number') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'tab_id must be a number when provided.',\n retryable: false,\n });\n return;\n }\n if (tabId === undefined) {\n tabId = await getDefaultTabId();\n }\n\n const clickCount = params.click_count;\n const count =\n typeof clickCount === 'number' && Number.isFinite(clickCount)\n ? Math.max(1, Math.floor(clickCount))\n : 1;\n\n const error = await this.ensureDebuggerAttached(tabId as number);\n if (error) {\n respondError(error);\n return;\n }\n\n const pointResult = await this.resolveLocatorPoint(\n tabId as number,\n params.locator\n );\n if (!pointResult.ok) {\n respondError(pointResult.error);\n return;\n }\n const { x, y } = pointResult.point;\n\n // JS dialogs can block the tab event loop; dispatch click events on\n // the next tick so we can acknowledge the command immediately.\n self.setTimeout(() => {\n void this.dispatchCdpClick(tabId as number, x, y, count).catch(\n (error) => {\n console.debug('Deferred CDP click failed.', error);\n }\n );\n }, 0);\n respondOk({ ok: true });\n return;\n }\n case 'drive.hover': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n let tabId = params.tab_id;\n if (tabId !== undefined && typeof tabId !== 'number') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'tab_id must be a number when provided.',\n retryable: false,\n });\n return;\n }\n if (tabId === undefined) {\n tabId = await getDefaultTabId();\n }\n\n const error = await this.ensureDebuggerAttached(tabId as number);\n if (error) {\n respondError(error);\n return;\n }\n const pointResult = await this.resolveLocatorPoint(\n tabId as number,\n params.locator\n );\n if (!pointResult.ok) {\n respondError(pointResult.error);\n return;\n }\n const { x, y } = pointResult.point;\n\n const waitMs =\n typeof params.delay_ms === 'number' &&\n Number.isFinite(params.delay_ms)\n ? Math.min(Math.max(params.delay_ms, 0), 10000)\n : 0;\n try {\n await this.dispatchCdpMouseMove(tabId as number, x, y, 0);\n if (waitMs > 0) {\n await delayMs(waitMs);\n }\n const snapshot = await sendToTab(\n tabId as number,\n 'drive.snapshot_html'\n );\n if (!snapshot.ok) {\n respondError(snapshot.error);\n return;\n }\n respondOk(snapshot.result ?? { format: 'html', snapshot: '' });\n } catch (error) {\n const info = mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Hover dispatch failed.'\n );\n respondError(info);\n }\n return;\n }\n case 'drive.drag': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n let tabId = params.tab_id;\n if (tabId !== undefined && typeof tabId !== 'number') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'tab_id must be a number when provided.',\n retryable: false,\n });\n return;\n }\n if (tabId === undefined) {\n tabId = await getDefaultTabId();\n }\n\n const error = await this.ensureDebuggerAttached(tabId as number);\n if (error) {\n respondError(error);\n return;\n }\n const fromResult = await this.resolveLocatorPoint(\n tabId as number,\n params.from\n );\n if (!fromResult.ok) {\n respondError(fromResult.error);\n return;\n }\n const toResult = await this.resolveLocatorPoint(\n tabId as number,\n params.to\n );\n if (!toResult.ok) {\n respondError(toResult.error);\n return;\n }\n const steps =\n typeof params.steps === 'number' && Number.isFinite(params.steps)\n ? Math.max(1, Math.min(50, Math.floor(params.steps)))\n : 12;\n try {\n await this.dispatchCdpDrag(\n tabId as number,\n fromResult.point,\n toResult.point,\n steps\n );\n respondOk({ ok: true });\n } catch (error) {\n const info = mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Drag dispatch failed.'\n );\n respondError(info);\n }\n return;\n }\n case 'drive.key_press': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const key = params.key;\n if (typeof key !== 'string' || key.length === 0) {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'key must be a non-empty string.',\n retryable: false,\n });\n return;\n }\n let tabId = params.tab_id;\n if (tabId !== undefined && typeof tabId !== 'number') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'tab_id must be a number when provided.',\n retryable: false,\n });\n return;\n }\n if (tabId === undefined) {\n tabId = await getDefaultTabId();\n }\n\n const error = await this.ensureDebuggerAttached(tabId as number);\n if (error) {\n respondError(error);\n return;\n }\n try {\n await this.dispatchCdpKeyPress(\n tabId as number,\n key,\n params.modifiers\n );\n respondOk({ ok: true });\n } catch (error) {\n const info = mapDebuggerErrorMessage(\n error instanceof Error\n ? error.message\n : 'Keyboard dispatch failed.'\n );\n respondError(info);\n }\n return;\n }\n case 'drive.key': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const key = params.key;\n if (typeof key !== 'string' || key.length === 0) {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'key must be a non-empty string.',\n retryable: false,\n });\n return;\n }\n let tabId = params.tab_id;\n if (tabId !== undefined && typeof tabId !== 'number') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'tab_id must be a number when provided.',\n retryable: false,\n });\n return;\n }\n if (tabId === undefined) {\n tabId = await getDefaultTabId();\n }\n const count =\n typeof params.repeat === 'number' && Number.isFinite(params.repeat)\n ? Math.max(1, Math.min(50, Math.floor(params.repeat)))\n : 1;\n const error = await this.ensureDebuggerAttached(tabId as number);\n if (error) {\n respondError(error);\n return;\n }\n try {\n for (let i = 0; i < count; i += 1) {\n await this.dispatchCdpKeyPress(\n tabId as number,\n key,\n params.modifiers\n );\n }\n respondOk({ ok: true });\n } catch (error) {\n const info = mapDebuggerErrorMessage(\n error instanceof Error\n ? error.message\n : 'Keyboard dispatch failed.'\n );\n respondError(info);\n }\n return;\n }\n case 'drive.type': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const text = params.text;\n if (typeof text !== 'string') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'text must be a string.',\n retryable: false,\n });\n return;\n }\n let tabId = params.tab_id;\n if (tabId !== undefined && typeof tabId !== 'number') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'tab_id must be a number when provided.',\n retryable: false,\n });\n return;\n }\n if (tabId === undefined) {\n tabId = await getDefaultTabId();\n }\n const error = await this.ensureDebuggerAttached(tabId as number);\n if (error) {\n respondError(error);\n return;\n }\n const result = await this.performCdpType(tabId as number, {\n locator: params.locator,\n text,\n clear: Boolean(params.clear),\n submit: Boolean(params.submit),\n });\n if (!result.ok) {\n respondError(result.error);\n return;\n }\n respondOk({ ok: true });\n return;\n }\n case 'drive.select': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n let tabId = params.tab_id;\n if (tabId !== undefined && typeof tabId !== 'number') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'tab_id must be a number when provided.',\n retryable: false,\n });\n return;\n }\n if (tabId === undefined) {\n tabId = await getDefaultTabId();\n }\n const error = await this.ensureDebuggerAttached(tabId as number);\n if (error) {\n respondError(error);\n return;\n }\n const pointResult = await this.resolveLocatorPoint(\n tabId as number,\n params.locator\n );\n if (!pointResult.ok) {\n respondError(pointResult.error);\n return;\n }\n try {\n await this.dispatchCdpClick(\n tabId as number,\n pointResult.point.x,\n pointResult.point.y,\n 1\n );\n } catch (error) {\n const info = mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Select click failed.'\n );\n respondError(info);\n return;\n }\n // CDP has no direct \"select option by value/text/index\" primitive.\n // Fall back explicitly to the existing select helper after CDP focus.\n const selectResult = await sendToTab(\n tabId as number,\n 'drive.select',\n params\n );\n if (!selectResult.ok) {\n respondError(selectResult.error);\n return;\n }\n respondOk(selectResult.result ?? { ok: true });\n return;\n }\n case 'drive.fill_form': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const fields = params.fields;\n if (!Array.isArray(fields) || fields.length === 0) {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'fields must be a non-empty array.',\n retryable: false,\n });\n return;\n }\n let tabId = params.tab_id;\n if (tabId !== undefined && typeof tabId !== 'number') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'tab_id must be a number when provided.',\n retryable: false,\n });\n return;\n }\n if (tabId === undefined) {\n tabId = await getDefaultTabId();\n }\n const error = await this.ensureDebuggerAttached(tabId as number);\n if (error) {\n respondError(error);\n return;\n }\n let filled = 0;\n const errors: string[] = [];\n for (let index = 0; index < fields.length; index += 1) {\n const field = fields[index];\n if (!field || typeof field !== 'object') {\n errors.push(`Field ${index} is not an object.`);\n continue;\n }\n const record = field as Record<string, unknown>;\n const value = record.value;\n if (typeof value !== 'string' && typeof value !== 'boolean') {\n errors.push(`Field ${index} has invalid value.`);\n continue;\n }\n const selector =\n typeof record.selector === 'string' ? record.selector : undefined;\n const locator =\n record.locator && typeof record.locator === 'object'\n ? (record.locator as Record<string, unknown>)\n : selector\n ? ({ css: selector } as Record<string, unknown>)\n : undefined;\n let resolvedType =\n typeof record.type === 'string' && record.type.length > 0\n ? record.type\n : 'auto';\n if (resolvedType === 'auto') {\n const detected = await sendToTab(\n tabId as number,\n 'drive.detect_field_type',\n { locator: record.locator, selector }\n );\n if (!detected.ok) {\n errors.push(`Field ${index} could not be resolved.`);\n continue;\n }\n const payload = detected.result;\n if (!payload || typeof payload !== 'object') {\n errors.push(`Field ${index} returned invalid type payload.`);\n continue;\n }\n const detectedType = (payload as Record<string, unknown>)\n .fieldType;\n if (\n typeof detectedType !== 'string' ||\n detectedType.length === 0\n ) {\n errors.push(`Field ${index} returned invalid field type.`);\n continue;\n }\n resolvedType = detectedType;\n }\n\n if (\n (resolvedType === 'text' || resolvedType === 'contentEditable') &&\n locator\n ) {\n const typed = await this.performCdpType(tabId as number, {\n locator,\n text: String(value),\n clear: true,\n submit: Boolean(record.submit),\n });\n if (!typed.ok) {\n errors.push(\n `Field ${index} could not be filled: ${typed.error.message}`\n );\n continue;\n }\n filled += 1;\n continue;\n }\n\n // Explicit fallback for controls not yet modeled via CDP-first helper.\n const fallback = await sendToTab(\n tabId as number,\n 'drive.fill_form',\n {\n fields: [field],\n }\n );\n if (!fallback.ok) {\n errors.push(\n `Field ${index} could not be filled: ${fallback.error.message}`\n );\n continue;\n }\n const payload = fallback.result;\n if (!payload || typeof payload !== 'object') {\n errors.push(`Field ${index} returned invalid fallback payload.`);\n continue;\n }\n const fallbackFilled = (payload as Record<string, unknown>).filled;\n if (\n typeof fallbackFilled === 'number' &&\n Number.isFinite(fallbackFilled) &&\n fallbackFilled > 0\n ) {\n filled += 1;\n continue;\n }\n errors.push(`Field ${index} could not be filled.`);\n }\n respondOk({\n filled,\n attempted: fields.length,\n errors: errors.length > 0 ? errors : [],\n });\n return;\n }\n case 'drive.scroll':\n case 'drive.wait_for': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n let tabId = params.tab_id;\n if (tabId !== undefined && typeof tabId !== 'number') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'tab_id must be a number when provided.',\n retryable: false,\n });\n return;\n }\n if (tabId === undefined) {\n tabId = await getDefaultTabId();\n }\n const timeoutMs =\n message.action === 'drive.wait_for' &&\n typeof params.timeout_ms === 'number' &&\n Number.isFinite(params.timeout_ms)\n ? Math.max(1, Math.floor(params.timeout_ms) + 1000)\n : undefined;\n const result = await sendToTab(\n tabId as number,\n message.action,\n params,\n {\n timeoutMs,\n }\n );\n if (result.ok) {\n respondOk(result.result ?? { ok: true });\n } else {\n respondError(result.error);\n }\n return;\n }\n case 'drive.screenshot': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n let tabId = params.tab_id;\n if (tabId !== undefined && typeof tabId !== 'number') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'tab_id must be a number when provided.',\n retryable: false,\n });\n return;\n }\n if (tabId === undefined) {\n tabId = await getDefaultTabId();\n }\n\n const mode =\n params.mode === 'full_page' ||\n params.mode === 'viewport' ||\n params.mode === 'element'\n ? params.mode\n : 'viewport';\n const format =\n params.format === 'jpeg' || params.format === 'webp'\n ? params.format\n : 'png';\n const quality =\n typeof params.quality === 'number' &&\n Number.isFinite(params.quality)\n ? Math.max(0, Math.min(100, Math.floor(params.quality)))\n : undefined;\n\n const tab = await getTab(tabId as number);\n const url = tab.url;\n if (typeof url === 'string' && isRestrictedUrl(url)) {\n respondError({\n code: 'NOT_SUPPORTED',\n message: 'Screenshots are not supported for this URL.',\n retryable: false,\n details: { url },\n });\n return;\n }\n const windowId = tab.windowId;\n if (typeof windowId !== 'number') {\n respondError({\n code: 'TAB_NOT_FOUND',\n message: 'window_id missing for tab.',\n retryable: false,\n });\n return;\n }\n\n if (typeof OffscreenCanvas === 'undefined') {\n respondError({\n code: 'NOT_SUPPORTED',\n message: 'OffscreenCanvas is unavailable in this extension host.',\n retryable: false,\n });\n return;\n }\n\n const captureVisible = async (): Promise<string> => {\n return await captureVisibleTabWithThrottle(windowId);\n };\n\n const scrollTo = async (top: number, left: number): Promise<void> => {\n const result = await sendToTab(tabId as number, 'drive.scroll', {\n top,\n left,\n behavior: 'auto',\n tab_id: tabId,\n });\n if (!result.ok) {\n throw new Error(result.error.message);\n }\n };\n\n const getMetaInfo = async (): Promise<{\n viewportHeight: number;\n scrollHeight: number;\n scrollY: number;\n scrollX: number;\n devicePixelRatio: number;\n fullHeightPx: number;\n positions: number[];\n }> => {\n const meta = await sendToTab(\n tabId as number,\n 'drive.screenshot_meta'\n );\n if (!meta.ok) {\n throw new Error(meta.error.message);\n }\n const payload = meta.result;\n if (!payload || typeof payload !== 'object') {\n throw new Error('Invalid screenshot metadata response.');\n }\n\n const record = payload as Record<string, unknown>;\n const viewportHeight = record.viewportHeight;\n const scrollHeight = record.scrollHeight;\n const scrollY = record.scrollY;\n const scrollX = record.scrollX;\n const dpr = record.devicePixelRatio;\n\n if (\n typeof viewportHeight !== 'number' ||\n !Number.isFinite(viewportHeight) ||\n viewportHeight <= 0\n ) {\n throw new Error(\n 'viewportHeight missing from screenshot metadata.'\n );\n }\n if (\n typeof scrollHeight !== 'number' ||\n !Number.isFinite(scrollHeight) ||\n scrollHeight <= 0\n ) {\n throw new Error('scrollHeight missing from screenshot metadata.');\n }\n\n const devicePixelRatio =\n typeof dpr === 'number' && Number.isFinite(dpr) && dpr > 0\n ? dpr\n : 1;\n\n const fullHeightPx = Math.round(scrollHeight * devicePixelRatio);\n const maxHeightPx = 50000;\n if (fullHeightPx > maxHeightPx) {\n throw new Error(\n `Page is too tall to capture (max ${maxHeightPx}px).`\n );\n }\n\n const maxScrollY = Math.max(0, scrollHeight - viewportHeight);\n const step = viewportHeight;\n const positions: number[] = [];\n for (let y = 0; y < maxScrollY; y += step) {\n positions.push(y);\n }\n positions.push(maxScrollY);\n\n const maxTiles = 200;\n if (positions.length > maxTiles) {\n throw new Error(\n `Page requires too many tiles to capture (${positions.length}).`\n );\n }\n\n return {\n viewportHeight,\n scrollHeight,\n scrollY:\n typeof scrollY === 'number' && Number.isFinite(scrollY)\n ? scrollY\n : 0,\n scrollX:\n typeof scrollX === 'number' && Number.isFinite(scrollX)\n ? scrollX\n : 0,\n devicePixelRatio,\n fullHeightPx,\n positions,\n };\n };\n\n const canvasToResult = async (\n canvas: OffscreenCanvas\n ): Promise<{\n mime: string;\n data_base64: string;\n width_px: number;\n height_px: number;\n }> => {\n const mime =\n format === 'jpeg'\n ? 'image/jpeg'\n : format === 'webp'\n ? 'image/webp'\n : 'image/png';\n const q =\n typeof quality === 'number' && Number.isFinite(quality)\n ? Math.max(0, Math.min(1, quality / 100))\n : undefined;\n const blob =\n format === 'png'\n ? await canvas.convertToBlob({ type: mime })\n : await canvas.convertToBlob({ type: mime, quality: q });\n const base64 = arrayBufferToBase64(await blob.arrayBuffer());\n return {\n mime,\n data_base64: base64,\n width_px: canvas.width,\n height_px: canvas.height,\n };\n };\n\n const captureFullPageCanvas = async (\n metaInfo: Awaited<ReturnType<typeof getMetaInfo>>\n ): Promise<OffscreenCanvas> => {\n try {\n await scrollTo(0, 0);\n await delayMs(100);\n\n const firstDataUrl = await captureVisible();\n const firstBlob = await (await fetch(firstDataUrl)).blob();\n const firstBitmap = await createImageBitmap(firstBlob);\n\n const canvas = new OffscreenCanvas(\n firstBitmap.width,\n metaInfo.fullHeightPx\n );\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n firstBitmap.close();\n throw new Error('Canvas context unavailable.');\n }\n\n const drawTile = (bitmap: ImageBitmap, yCss: number): void => {\n const destY = Math.round(yCss * metaInfo.devicePixelRatio);\n const remaining = metaInfo.fullHeightPx - destY;\n if (remaining <= 0) {\n return;\n }\n const drawHeight = Math.min(bitmap.height, remaining);\n ctx.drawImage(\n bitmap,\n 0,\n 0,\n bitmap.width,\n drawHeight,\n 0,\n destY,\n bitmap.width,\n drawHeight\n );\n };\n\n drawTile(firstBitmap, 0);\n firstBitmap.close();\n\n for (const y of metaInfo.positions.slice(1)) {\n await scrollTo(y, 0);\n await delayMs(100);\n const dataUrl = await captureVisible();\n const blob = await (await fetch(dataUrl)).blob();\n const bitmap = await createImageBitmap(blob);\n drawTile(bitmap, y);\n bitmap.close();\n }\n\n return canvas;\n } finally {\n try {\n await scrollTo(metaInfo.scrollY, metaInfo.scrollX);\n } catch {\n // Ignore restoration errors.\n }\n }\n };\n\n if (mode === 'viewport') {\n try {\n const dataUrl = await captureVisible();\n const rendered = await renderDataUrlToFormat(\n dataUrl,\n format,\n quality\n );\n respondOk(rendered);\n } catch (error) {\n respondError(\n mapScreenshotCaptureError(\n error,\n 'Failed to capture screenshot.'\n )\n );\n }\n return;\n }\n\n if (mode === 'element') {\n const selector = params.selector;\n if (typeof selector !== 'string' || selector.trim().length === 0) {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'selector must be a non-empty string.',\n retryable: false,\n });\n return;\n }\n\n let metaInfo: Awaited<ReturnType<typeof getMetaInfo>>;\n try {\n metaInfo = await getMetaInfo();\n } catch (error) {\n respondError({\n code: 'EVALUATION_FAILED',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to read screenshot metadata.',\n retryable: false,\n });\n return;\n }\n\n const element = await sendToTab(\n tabId as number,\n 'drive.screenshot_element',\n { selector }\n );\n if (!element.ok) {\n respondError(element.error);\n return;\n }\n\n const payload = element.result;\n if (!payload || typeof payload !== 'object') {\n respondError({\n code: 'EVALUATION_FAILED',\n message: 'Invalid element metadata response.',\n retryable: false,\n });\n return;\n }\n\n const record = payload as Record<string, unknown>;\n const viewportLeft = record.viewportLeft;\n const viewportTop = record.viewportTop;\n const viewportWidth = record.viewportWidth;\n const viewportHeight = record.viewportHeight;\n const width = record.width;\n const height = record.height;\n const pageX = record.pageX;\n const pageY = record.pageY;\n const dpr = record.devicePixelRatio;\n const devicePixelRatio =\n typeof dpr === 'number' && Number.isFinite(dpr) && dpr > 0\n ? dpr\n : metaInfo.devicePixelRatio;\n\n if (\n typeof viewportLeft !== 'number' ||\n typeof viewportTop !== 'number' ||\n typeof viewportWidth !== 'number' ||\n typeof viewportHeight !== 'number' ||\n typeof width !== 'number' ||\n typeof height !== 'number' ||\n typeof pageX !== 'number' ||\n typeof pageY !== 'number' ||\n !Number.isFinite(viewportLeft) ||\n !Number.isFinite(viewportTop) ||\n !Number.isFinite(viewportWidth) ||\n !Number.isFinite(viewportHeight) ||\n !Number.isFinite(width) ||\n !Number.isFinite(height) ||\n !Number.isFinite(pageX) ||\n !Number.isFinite(pageY)\n ) {\n respondError({\n code: 'EVALUATION_FAILED',\n message: 'Invalid element bounding box metadata.',\n retryable: false,\n });\n return;\n }\n\n const fitsInViewport =\n viewportLeft >= 0 &&\n viewportTop >= 0 &&\n viewportLeft + width <= viewportWidth &&\n viewportTop + height <= viewportHeight;\n\n const cropW = Math.max(1, Math.round(width * devicePixelRatio));\n const cropH = Math.max(1, Math.round(height * devicePixelRatio));\n\n try {\n if (fitsInViewport) {\n const dataUrl = await captureVisible();\n const blob = await (await fetch(dataUrl)).blob();\n const bitmap = await createImageBitmap(blob);\n try {\n const cropX = Math.max(\n 0,\n Math.round(viewportLeft * devicePixelRatio)\n );\n const cropY = Math.max(\n 0,\n Math.round(viewportTop * devicePixelRatio)\n );\n const srcW = Math.min(cropW, bitmap.width - cropX);\n const srcH = Math.min(cropH, bitmap.height - cropY);\n if (srcW <= 0 || srcH <= 0) {\n throw new Error('Element is outside screenshot bounds.');\n }\n const cropCanvas = new OffscreenCanvas(srcW, srcH);\n const ctx = cropCanvas.getContext('2d');\n if (!ctx) {\n throw new Error('Canvas context unavailable.');\n }\n ctx.drawImage(\n bitmap,\n cropX,\n cropY,\n srcW,\n srcH,\n 0,\n 0,\n srcW,\n srcH\n );\n respondOk(await canvasToResult(cropCanvas));\n } finally {\n bitmap.close();\n }\n return;\n }\n\n const fullCanvas = await captureFullPageCanvas(metaInfo);\n const cropX = Math.max(0, Math.round(pageX * devicePixelRatio));\n const cropY = Math.max(0, Math.round(pageY * devicePixelRatio));\n const srcW = Math.min(cropW, fullCanvas.width - cropX);\n const srcH = Math.min(cropH, fullCanvas.height - cropY);\n if (srcW <= 0 || srcH <= 0) {\n throw new Error('Element is outside screenshot bounds.');\n }\n const cropCanvas = new OffscreenCanvas(srcW, srcH);\n const ctx = cropCanvas.getContext('2d');\n if (!ctx) {\n throw new Error('Canvas context unavailable.');\n }\n ctx.drawImage(\n fullCanvas,\n cropX,\n cropY,\n srcW,\n srcH,\n 0,\n 0,\n srcW,\n srcH\n );\n respondOk(await canvasToResult(cropCanvas));\n } catch (error) {\n respondError(\n mapScreenshotCaptureError(\n error,\n 'Failed to capture element screenshot.'\n )\n );\n } finally {\n try {\n await scrollTo(metaInfo.scrollY, metaInfo.scrollX);\n } catch {\n // Ignore.\n }\n }\n return;\n }\n\n try {\n const metaInfo = await getMetaInfo();\n const canvas = await captureFullPageCanvas(metaInfo);\n respondOk(await canvasToResult(canvas));\n } catch (error) {\n respondError(\n mapScreenshotCaptureError(\n error,\n 'Failed to capture full page screenshot.'\n )\n );\n }\n return;\n }\n default:\n respondError({\n code: 'NOT_IMPLEMENTED',\n message: `${message.action} not implemented in extension yet.`,\n retryable: false,\n });\n }\n } catch (error) {\n const messageText =\n error instanceof Error ? error.message : 'Unknown error';\n respondError({\n code: 'EVALUATION_FAILED',\n message: messageText,\n retryable: false,\n });\n }\n }\n\n private async dispatchCdpClick(\n tabId: number,\n x: number,\n y: number,\n clickCount: number\n ): Promise<void> {\n await this.dispatchCdpMouseMove(tabId, x, y, 0);\n\n for (let i = 0; i < clickCount; i += 1) {\n const normalizedClickCount = i + 1;\n await this.sendDebuggerCommand(\n tabId,\n 'Input.dispatchMouseEvent',\n {\n type: 'mousePressed',\n x,\n y,\n button: 'left',\n clickCount: normalizedClickCount,\n },\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n await this.sendDebuggerCommand(\n tabId,\n 'Input.dispatchMouseEvent',\n {\n type: 'mouseReleased',\n x,\n y,\n button: 'left',\n clickCount: normalizedClickCount,\n },\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n }\n this.touchDebuggerSession(tabId);\n }\n\n private async dispatchCdpMouseMove(\n tabId: number,\n x: number,\n y: number,\n buttons: number\n ): Promise<void> {\n await this.sendDebuggerCommand(\n tabId,\n 'Input.dispatchMouseEvent',\n {\n type: 'mouseMoved',\n x,\n y,\n button: 'none',\n buttons,\n },\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n }\n\n private async dispatchCdpDrag(\n tabId: number,\n from: ScreenPoint,\n to: ScreenPoint,\n steps: number\n ): Promise<void> {\n await this.dispatchCdpMouseMove(tabId, from.x, from.y, 0);\n await this.sendDebuggerCommand(\n tabId,\n 'Input.dispatchMouseEvent',\n {\n type: 'mousePressed',\n x: from.x,\n y: from.y,\n button: 'left',\n clickCount: 1,\n },\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n\n for (let i = 1; i <= steps; i += 1) {\n const progress = i / steps;\n const x = from.x + (to.x - from.x) * progress;\n const y = from.y + (to.y - from.y) * progress;\n await this.dispatchCdpMouseMove(tabId, x, y, 1);\n await delayMs(10);\n }\n\n await this.sendDebuggerCommand(\n tabId,\n 'Input.dispatchMouseEvent',\n {\n type: 'mouseReleased',\n x: to.x,\n y: to.y,\n button: 'left',\n clickCount: 1,\n },\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n this.touchDebuggerSession(tabId);\n }\n\n private async resolveLocatorPoint(\n tabId: number,\n locator: unknown\n ): Promise<\n { ok: true; point: ScreenPoint } | { ok: false; error: DriveErrorInfo }\n > {\n const point = await sendToTab(tabId, 'drive.locator_point', {\n locator,\n });\n if (!point.ok) {\n return point;\n }\n const payload = point.result;\n if (!payload || typeof payload !== 'object') {\n return {\n ok: false,\n error: {\n code: 'EVALUATION_FAILED',\n message: 'Invalid locator point payload.',\n retryable: false,\n },\n };\n }\n const record = payload as Record<string, unknown>;\n const x = record.x;\n const y = record.y;\n if (\n typeof x !== 'number' ||\n !Number.isFinite(x) ||\n typeof y !== 'number' ||\n !Number.isFinite(y)\n ) {\n return {\n ok: false,\n error: {\n code: 'EVALUATION_FAILED',\n message: 'Invalid locator point coordinates.',\n retryable: false,\n },\n };\n }\n return { ok: true, point: { x, y } };\n }\n\n private async performCdpType(\n tabId: number,\n options: {\n locator: unknown;\n text: string;\n clear: boolean;\n submit: boolean;\n }\n ): Promise<{ ok: true } | { ok: false; error: DriveErrorInfo }> {\n const targetPoint = await sendToTab(tabId, 'drive.type_target_point', {\n locator: options.locator,\n });\n if (!targetPoint.ok) {\n return targetPoint;\n }\n const payload = targetPoint.result;\n if (!payload || typeof payload !== 'object') {\n return {\n ok: false,\n error: {\n code: 'EVALUATION_FAILED',\n message: 'Invalid type target payload.',\n retryable: false,\n },\n };\n }\n const record = payload as Record<string, unknown>;\n const x = record.x;\n const y = record.y;\n if (\n typeof x !== 'number' ||\n !Number.isFinite(x) ||\n typeof y !== 'number' ||\n !Number.isFinite(y)\n ) {\n return {\n ok: false,\n error: {\n code: 'EVALUATION_FAILED',\n message: 'Invalid type target coordinates.',\n retryable: false,\n },\n };\n }\n try {\n await this.dispatchCdpClick(tabId, x, y, 1);\n if (options.clear) {\n const clearResult = await sendToTab(\n tabId,\n 'drive.clear_active_editable'\n );\n if (!clearResult.ok) {\n return clearResult;\n }\n }\n if (options.text.length > 0) {\n await this.sendDebuggerCommand(\n tabId,\n 'Input.insertText',\n { text: options.text },\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n }\n if (options.submit) {\n await this.dispatchCdpKeyPress(tabId, 'Enter', undefined);\n }\n this.touchDebuggerSession(tabId);\n return { ok: true };\n } catch (error) {\n return {\n ok: false,\n error: mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Type dispatch failed.'\n ),\n };\n }\n }\n\n private normalizeModifierMask(modifiers: unknown): number {\n const MOD_ALT = 1;\n const MOD_CTRL = 2;\n const MOD_META = 4;\n const MOD_SHIFT = 8;\n let mask = 0;\n if (Array.isArray(modifiers)) {\n for (const modifier of modifiers) {\n if (typeof modifier !== 'string') {\n continue;\n }\n const normalized = modifier.toLowerCase();\n if (normalized === 'alt') {\n mask |= MOD_ALT;\n } else if (normalized === 'ctrl') {\n mask |= MOD_CTRL;\n } else if (normalized === 'meta') {\n mask |= MOD_META;\n } else if (normalized === 'shift') {\n mask |= MOD_SHIFT;\n }\n }\n return mask;\n }\n if (!modifiers || typeof modifiers !== 'object') {\n return mask;\n }\n const record = modifiers as Record<string, unknown>;\n if (record.alt) {\n mask |= MOD_ALT;\n }\n if (record.ctrl) {\n mask |= MOD_CTRL;\n }\n if (record.meta) {\n mask |= MOD_META;\n }\n if (record.shift) {\n mask |= MOD_SHIFT;\n }\n return mask;\n }\n\n private keyToCode(key: string): string {\n const map: Record<string, string> = {\n Enter: 'Enter',\n Tab: 'Tab',\n Escape: 'Escape',\n Esc: 'Escape',\n Backspace: 'Backspace',\n Delete: 'Delete',\n ArrowUp: 'ArrowUp',\n ArrowDown: 'ArrowDown',\n ArrowLeft: 'ArrowLeft',\n ArrowRight: 'ArrowRight',\n Home: 'Home',\n End: 'End',\n PageUp: 'PageUp',\n PageDown: 'PageDown',\n ' ': 'Space',\n Space: 'Space',\n };\n if (map[key]) {\n return map[key];\n }\n if (key.length === 1) {\n if (/[a-zA-Z]/.test(key)) {\n return `Key${key.toUpperCase()}`;\n }\n if (/[0-9]/.test(key)) {\n return `Digit${key}`;\n }\n }\n return key;\n }\n\n private async dispatchCdpKeyPress(\n tabId: number,\n key: string,\n modifiers: unknown\n ): Promise<void> {\n const code = this.keyToCode(key);\n const modifierMask = this.normalizeModifierMask(modifiers);\n const isTextInput = key.length === 1 && (modifierMask & (1 | 2 | 4)) === 0;\n const keyDownParams: Record<string, unknown> = {\n type: 'keyDown',\n key,\n code,\n modifiers: modifierMask,\n };\n if (isTextInput) {\n keyDownParams.text = key;\n keyDownParams.unmodifiedText = key;\n }\n\n await this.sendDebuggerCommand(\n tabId,\n 'Input.dispatchKeyEvent',\n keyDownParams,\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n await this.sendDebuggerCommand(\n tabId,\n 'Input.dispatchKeyEvent',\n {\n type: 'keyUp',\n key,\n code,\n modifiers: modifierMask,\n },\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n this.touchDebuggerSession(tabId);\n }\n\n private async handleDebuggerRequest(message: DebuggerRequest): Promise<void> {\n const respondAck = (result?: unknown): void => {\n this.sendMessage({\n id: message.id,\n action: message.action,\n status: 'ack',\n result,\n });\n };\n\n const respondError = (error: DriveErrorInfo): void => {\n this.sendMessage({\n id: message.id,\n action: message.action,\n status: 'error',\n error: sanitizeDriveErrorInfo(error),\n });\n };\n\n try {\n switch (message.action) {\n case 'debugger.attach': {\n const params = (message.params ?? {}) as { tab_id?: unknown };\n const tabId = params.tab_id;\n if (typeof tabId !== 'number') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'tab_id must be a number.',\n retryable: false,\n });\n return;\n }\n\n const error = await this.ensureDebuggerAttached(tabId);\n if (error) {\n respondError(error);\n return;\n }\n respondAck({ ok: true });\n return;\n }\n case 'debugger.detach': {\n const params = (message.params ?? {}) as { tab_id?: unknown };\n const tabId = params.tab_id;\n if (typeof tabId !== 'number') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'tab_id must be a number.',\n retryable: false,\n });\n return;\n }\n const error = await this.detachDebugger(tabId);\n if (error) {\n respondError(error);\n return;\n }\n respondAck({ ok: true });\n return;\n }\n case 'debugger.command': {\n const params = (message.params ?? {}) as DebuggerCommandParams;\n const tabId = params.tab_id;\n if (typeof tabId !== 'number') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'tab_id must be a number.',\n retryable: false,\n });\n return;\n }\n if (typeof params.method !== 'string' || params.method.length === 0) {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'method must be a non-empty string.',\n retryable: false,\n });\n return;\n }\n\n const session = this.debuggerSessions.get(tabId);\n if (session?.attachPromise) {\n try {\n await session.attachPromise;\n } catch (error) {\n const info = mapDebuggerErrorMessage(\n error instanceof Error\n ? error.message\n : 'Debugger attach failed.'\n );\n this.clearDebuggerSession(tabId);\n respondError(info);\n return;\n }\n }\n\n const attachedSession = this.debuggerSessions.get(tabId);\n if (!attachedSession?.attached) {\n respondError({\n code: 'FAILED_PRECONDITION',\n message: 'Debugger is not attached to the requested tab.',\n retryable: false,\n });\n return;\n }\n\n try {\n const result = await this.sendDebuggerCommand(\n tabId,\n params.method,\n params.params,\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n this.touchDebuggerSession(tabId);\n respondAck(result);\n } catch (error) {\n if (error instanceof DebuggerTimeoutError) {\n respondError({\n code: 'TIMEOUT',\n message: error.message,\n retryable: true,\n });\n return;\n }\n const info = mapDebuggerErrorMessage(\n error instanceof Error\n ? error.message\n : 'Debugger command failed.'\n );\n respondError(info);\n }\n return;\n }\n default:\n respondError({\n code: 'NOT_IMPLEMENTED',\n message: `${message.action} not implemented in extension yet.`,\n retryable: false,\n });\n }\n } catch (error) {\n const messageText =\n error instanceof Error ? error.message : 'Unexpected debugger error.';\n respondError({\n code: 'INSPECT_UNAVAILABLE',\n message: messageText,\n retryable: false,\n });\n }\n }\n\n async handleDebuggerEvent(\n source: DebuggerTarget,\n method: string,\n params?: Record<string, unknown>\n ): Promise<void> {\n if (!(await readDebuggerCapabilityEnabled())) {\n return;\n }\n const tabId = source.tabId;\n if (typeof tabId !== 'number') {\n return;\n }\n this.touchDebuggerSession(tabId);\n this.sendDebuggerEvent({\n tab_id: tabId,\n method,\n params,\n timestamp: nowIso(),\n });\n }\n\n async handleDebuggerDetach(\n source: DebuggerTarget,\n reason?: string\n ): Promise<void> {\n const tabId = source.tabId;\n if (typeof tabId !== 'number') {\n return;\n }\n this.clearDebuggerSession(tabId);\n if (!(await readDebuggerCapabilityEnabled())) {\n return;\n }\n this.sendDebuggerEvent({\n tab_id: tabId,\n method: 'Debugger.detached',\n params: { reason: reason ?? 'unknown' },\n timestamp: nowIso(),\n });\n }\n\n private async ensureDebuggerAttached(\n tabId: number\n ): Promise<DriveErrorInfo | null> {\n const existing = this.debuggerSessions.get(tabId);\n if (existing?.attached) {\n this.touchDebuggerSession(tabId);\n return null;\n }\n\n if (existing?.attachPromise) {\n try {\n await existing.attachPromise;\n } catch (error) {\n const info = mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Debugger attach failed.'\n );\n this.clearDebuggerSession(tabId);\n return info;\n }\n if (existing.attached) {\n this.touchDebuggerSession(tabId);\n return null;\n }\n }\n\n const preflightError = await this.checkDebuggerTarget(tabId);\n if (preflightError) {\n return preflightError;\n }\n\n const session: DebuggerSession = {\n attached: false,\n lastActivityAt: nowIso(),\n };\n this.debuggerSessions.set(tabId, session);\n\n session.attachPromise = wrapChromeVoid((callback) =>\n chrome.debugger.attach({ tabId }, DEBUGGER_PROTOCOL_VERSION, () =>\n callback()\n )\n );\n\n try {\n await session.attachPromise;\n session.attached = true;\n session.attachPromise = undefined;\n const initError = await this.initializeDebuggerDomains(tabId);\n if (initError) {\n await this.detachDebugger(tabId);\n return initError;\n }\n session.initialized = true;\n this.touchDebuggerSession(tabId);\n return null;\n } catch (error) {\n const info = mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Debugger attach failed.'\n );\n this.clearDebuggerSession(tabId);\n return info;\n }\n }\n\n private async initializeDebuggerDomains(\n tabId: number\n ): Promise<DriveErrorInfo | null> {\n // Some CDP features (notably JS dialog handling + console/network events)\n // require domains to be enabled first. This must happen before a dialog\n // opens, otherwise Page.handleJavaScriptDialog can return \"No dialog is showing\".\n const methods: Array<[string, Record<string, unknown> | undefined]> = [\n ['Page.enable', undefined],\n ['Runtime.enable', undefined],\n ['Log.enable', undefined],\n ['Network.enable', undefined],\n ];\n\n try {\n for (const [method, params] of methods) {\n await this.sendDebuggerCommand(\n tabId,\n method,\n params,\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n }\n return null;\n } catch (error) {\n return mapDebuggerErrorMessage(\n error instanceof Error\n ? error.message\n : 'Debugger initialization failed.'\n );\n }\n }\n\n private async checkDebuggerTarget(\n tabId: number\n ): Promise<DriveErrorInfo | null> {\n try {\n const tab = await getTab(tabId);\n const url = typeof tab.url === 'string' ? tab.url : undefined;\n if (isRestrictedUrl(url)) {\n return {\n code: 'NOT_SUPPORTED',\n message: 'Debugger cannot attach to restricted pages.',\n retryable: false,\n details: { url },\n };\n }\n } catch (error) {\n return mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Failed to locate tab.',\n 'TAB_NOT_FOUND'\n );\n }\n return null;\n }\n\n private async detachDebugger(tabId: number): Promise<DriveErrorInfo | null> {\n const session = this.debuggerSessions.get(tabId);\n if (!session) {\n return null;\n }\n if (session.attachPromise) {\n try {\n await session.attachPromise;\n } catch (error) {\n console.debug('Debugger attach promise failed before detach.', error);\n this.clearDebuggerSession(tabId);\n return null;\n }\n }\n if (!session.attached) {\n this.clearDebuggerSession(tabId);\n return null;\n }\n try {\n await wrapChromeVoid((callback) =>\n chrome.debugger.detach({ tabId }, () => callback())\n );\n } catch (error) {\n return mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Debugger detach failed.'\n );\n } finally {\n this.clearDebuggerSession(tabId);\n }\n return null;\n }\n\n private async detachAllDebuggerSessions(): Promise<void> {\n const tabIds = Array.from(this.debuggerSessions.keys());\n for (const tabId of tabIds) {\n const error = await this.detachDebugger(tabId);\n if (error) {\n console.warn('DriveSocket detachDebugger failed:', tabId, error);\n }\n }\n }\n\n private async sendDebuggerCommand(\n tabId: number,\n method: string,\n params: Record<string, unknown> | undefined,\n timeoutMs: number\n ): Promise<unknown> {\n return await new Promise((resolve, reject) => {\n let finished = false;\n const timeout = self.setTimeout(() => {\n finished = true;\n reject(new DebuggerTimeoutError(timeoutMs));\n }, timeoutMs);\n\n chrome.debugger.sendCommand(\n { tabId },\n method,\n params ?? {},\n (result: unknown) => {\n if (finished) {\n return;\n }\n finished = true;\n clearTimeout(timeout);\n const error = chrome.runtime.lastError;\n if (error) {\n reject(new Error(error.message));\n return;\n }\n resolve(result);\n }\n );\n });\n }\n\n private touchDebuggerSession(tabId: number): void {\n const session = this.debuggerSessions.get(tabId);\n if (!session) {\n return;\n }\n session.lastActivityAt = nowIso();\n void this.refreshDebuggerIdleTimer(tabId).catch((error) => {\n console.error('DriveSocket refreshDebuggerIdleTimer failed:', error);\n });\n }\n\n private async refreshDebuggerIdleTimer(tabId: number): Promise<void> {\n const session = this.debuggerSessions.get(tabId);\n if (!session) {\n return;\n }\n if (session.idleTimer) {\n clearTimeout(session.idleTimer);\n }\n const timeoutMs = await this.getDebuggerIdleTimeoutMs();\n session.idleTimer = self.setTimeout(() => {\n void this.detachDebugger(tabId).catch((error) => {\n console.error('DriveSocket detachDebugger failed:', error);\n });\n }, timeoutMs);\n }\n\n private clearDebuggerSession(tabId: number): void {\n const session = this.debuggerSessions.get(tabId);\n if (!session) {\n return;\n }\n if (session.idleTimer) {\n clearTimeout(session.idleTimer);\n }\n this.debuggerSessions.delete(tabId);\n }\n\n private async getDebuggerIdleTimeoutMs(): Promise<number> {\n if (this.debuggerIdleTimeoutMs !== null) {\n return this.debuggerIdleTimeoutMs;\n }\n const timeout = await readDebuggerIdleTimeoutMs();\n this.debuggerIdleTimeoutMs = timeout;\n return timeout;\n }\n}\n\nclass DebuggerTimeoutError extends Error {\n constructor(timeoutMs: number) {\n super(`Debugger command timed out after ${timeoutMs}ms.`);\n this.name = 'DebuggerTimeoutError';\n }\n}\n\nconst socket = new DriveSocket();\nconst permissionPrompts = new PermissionPromptController();\n\nchrome.runtime.onConnect.addListener((port: unknown) => {\n permissionPrompts.handleConnect(port as Record<string, unknown>);\n});\n\nchrome.windows.onRemoved.addListener((windowId: number) => {\n permissionPrompts.handleWindowRemoved(windowId);\n});\n\nchrome.tabs.onActivated.addListener((activeInfo: { tabId: number }) => {\n markTabActive(activeInfo.tabId);\n socket.sendTabReport();\n});\n\nchrome.tabs.onCreated.addListener((tab: Record<string, unknown>) => {\n if (typeof tab.id === 'number') {\n ensureLastActiveAt(tab.id);\n }\n socket.sendTabReport();\n});\n\nchrome.tabs.onUpdated.addListener(\n (\n tabId: number,\n changeInfo: Record<string, unknown>,\n tab: Record<string, unknown>\n ) => {\n const shouldReport =\n Boolean(changeInfo.url) ||\n Boolean(changeInfo.title) ||\n changeInfo.status === 'complete';\n if (!shouldReport) {\n return;\n }\n if (tab && tab.active) {\n markTabActive(tabId);\n }\n socket.sendTabReport();\n }\n);\n\nchrome.tabs.onRemoved.addListener((tabId: number) => {\n if (agentTabId === tabId) {\n clearAgentTarget();\n }\n lastActiveAtByTab.delete(tabId);\n socket.sendTabReport();\n});\n\nchrome.debugger.onEvent.addListener(\n (source: DebuggerTarget, method: string, params: Record<string, unknown>) => {\n void socket.handleDebuggerEvent(source, method, params).catch((error) => {\n console.error('DriveSocket handleDebuggerEvent failed:', error);\n });\n }\n);\n\nchrome.debugger.onDetach.addListener(\n (source: DebuggerTarget, reason?: string) => {\n void socket.handleDebuggerDetach(source, reason).catch((error) => {\n console.error('DriveSocket handleDebuggerDetach failed:', error);\n });\n }\n);\n\nchrome.runtime.onMessage.addListener(\n (\n message: unknown,\n _sender: unknown,\n sendResponse: (response: unknown) => void\n ) => {\n if (!message || typeof message !== 'object') {\n return undefined;\n }\n const action = (message as { action?: unknown }).action;\n if (action === 'drive.connection_status') {\n sendResponse({\n ok: true,\n result: socket.getConnectionStatus(),\n });\n return true;\n }\n if (action === 'drive.refresh_capabilities') {\n void socket\n .refreshDebuggerCapabilityState()\n .then(() => {\n sendResponse({ ok: true, result: { refreshed: true } });\n })\n .catch((error) => {\n const message =\n error instanceof Error\n ? error.message\n : 'Failed to refresh capabilities.';\n sendResponse({ ok: false, error: { message } });\n });\n return true;\n }\n return undefined;\n }\n);\n\nchrome.storage.onChanged.addListener(\n (changes: Record<string, StorageChange>, areaName: string) => {\n if (areaName !== 'local') {\n return;\n }\n const debuggerChange = changes[DEBUGGER_CAPABILITY_ENABLED_KEY];\n if (!debuggerChange) {\n return;\n }\n if (typeof debuggerChange.newValue === 'boolean') {\n void socket\n .handleDebuggerCapabilityChange(debuggerChange.newValue)\n .catch((error) => {\n console.error(\n 'DriveSocket handleDebuggerCapabilityChange failed:',\n error\n );\n });\n return;\n }\n void socket.refreshDebuggerCapabilityState().catch((error) => {\n console.error(\n 'DriveSocket refreshDebuggerCapabilityState failed:',\n error\n );\n });\n }\n);\n\nsocket.start();\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["nowIso", "delayMs", "delay", "socket", "
|
|
3
|
+
"sources": ["../../shared/src/contract-version.ts", "../src/error-sanitizer.ts", "../src/site-permissions.ts", "../src/permission-prompt.ts", "../src/permissions-request.ts", "../src/restricted-url.ts", "../src/tab-resolution.ts", "../src/action-permissions.ts", "../src/popup-trigger-state.ts", "../src/popup-click-verification.ts", "../src/drive-reliability.ts", "../src/connection-state.ts", "../src/debugger-dispatch.ts", "../src/screenshot-errors.ts", "../src/core-endpoint-config.ts", "../src/tab-activation.ts", "../src/background.ts"],
|
|
4
|
+
"sourcesContent": ["export const HTTP_CONTRACT_VERSION_HEADER = 'x-browser-bridge-contract-version';\n\nexport const HTTP_CONTRACT_VERSION = '2026-02-17.1';\n\nexport const DRIVE_WS_PROTOCOL_VERSION = '2026-02-17.1';\n\nexport const resolveContractVersionMismatch = (\n receivedVersion: string | undefined\n):\n | {\n expected: string;\n received: string;\n }\n | undefined => {\n if (!receivedVersion || receivedVersion.trim().length === 0) {\n return undefined;\n }\n\n if (receivedVersion === HTTP_CONTRACT_VERSION) {\n return undefined;\n }\n\n return {\n expected: HTTP_CONTRACT_VERSION,\n received: receivedVersion,\n };\n};\n", "import type { DriveErrorInfo } from './protocol.js';\n\nconst TRAILING_PUNCTUATION_RE = /[.,;:!?]+$/;\n\nconst stripTrailingPunctuation = (\n value: string\n): {\n core: string;\n trailing: string;\n} => {\n const match = value.match(TRAILING_PUNCTUATION_RE);\n if (!match) {\n return { core: value, trailing: '' };\n }\n const trailing = match[0] ?? '';\n return { core: value.slice(0, -trailing.length), trailing };\n};\n\nconst sanitizeUrlToken = (token: string): string => {\n const { core, trailing } = stripTrailingPunctuation(token);\n try {\n const parsed = new URL(core);\n if (parsed.protocol === 'file:') {\n return `file://[redacted]${trailing}`;\n }\n\n if (parsed.origin && parsed.origin !== 'null') {\n return `${parsed.origin}${trailing}`;\n }\n\n // Non-standard schemes can have a \"null\" origin (chrome://, devtools://, etc).\n // Keep scheme + host and drop everything else.\n if (parsed.protocol && parsed.host) {\n return `${parsed.protocol}//${parsed.host}${trailing}`;\n }\n if (parsed.protocol) {\n return `${parsed.protocol}${trailing}`;\n }\n } catch {\n // Ignore and fall back to a simpler heuristic.\n }\n\n const fallback = core.match(/^([a-zA-Z][a-zA-Z0-9+.-]*):\\/\\/([^/\\s]+)/);\n if (fallback?.[1] && fallback?.[2]) {\n return `${fallback[1]}://${fallback[2]}${trailing}`;\n }\n return `[redacted url]${trailing}`;\n};\n\nconst URL_TOKEN_RE =\n /\\b(?:https?|wss?|chrome-extension|chrome|chrome-devtools|devtools|edge|brave|file):\\/\\/[^\\s\"'<>)}\\]]+/gi;\n\nconst VIEW_SOURCE_RE = /\\bview-source:(https?:\\/\\/[^\\s\"'<>)}\\]]+)/gi;\n\nconst sanitizeUrls = (message: string): string => {\n // Special-case view-source: since it nests another URL.\n let next = message.replace(VIEW_SOURCE_RE, (_match, inner: string) => {\n return `view-source:${sanitizeUrlToken(inner)}`;\n });\n next = next.replace(URL_TOKEN_RE, (match) => sanitizeUrlToken(match));\n return next;\n};\n\nconst extractBasename = (value: string): string => {\n const trimmed = value.trim();\n const lastSlash = Math.max(\n trimmed.lastIndexOf('/'),\n trimmed.lastIndexOf('\\\\')\n );\n if (lastSlash < 0) {\n return trimmed;\n }\n return trimmed.slice(lastSlash + 1);\n};\n\nconst sanitizeWindowsPaths = (message: string): string => {\n // Example: C:\\Users\\me\\project\\file.ts:12:34 -> file.ts:12:34\n const windowsPathRe =\n /\\b[A-Za-z]:\\\\(?:[^\\s\"')\\]}]+\\\\)+[^\\s\"')\\]}]+(?::\\d+(?::\\d+)?)?/g;\n return message.replace(windowsPathRe, (match) => extractBasename(match));\n};\n\nconst sanitizeUnixPaths = (message: string): string => {\n // Only redact paths rooted in common system locations to avoid clobbering\n // generic \"/api/v1\" style strings that might appear in error messages.\n const unixPathRe =\n /\\/(?:Users|home|var|private|tmp|opt|etc|Library|Applications|Volumes|System)(?:\\/[^\\s\"')\\]}]+)+(?::\\d+(?::\\d+)?)?/g;\n return message.replace(unixPathRe, (match) => extractBasename(match));\n};\n\nexport const sanitizeChromeErrorMessage = (message: string): string => {\n let next = message;\n next = sanitizeUrls(next);\n next = sanitizeWindowsPaths(next);\n next = sanitizeUnixPaths(next);\n return next;\n};\n\nconst sanitizeUnknown = (value: unknown): unknown => {\n if (typeof value === 'string') {\n return sanitizeChromeErrorMessage(value);\n }\n if (Array.isArray(value)) {\n return value.map((entry) => sanitizeUnknown(entry));\n }\n if (!value || typeof value !== 'object') {\n return value;\n }\n const record = value as Record<string, unknown>;\n const next: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(record)) {\n next[key] = sanitizeUnknown(entry);\n }\n return next;\n};\n\nexport const sanitizeDriveErrorInfo = (\n error: DriveErrorInfo\n): DriveErrorInfo => {\n return {\n ...error,\n message: sanitizeChromeErrorMessage(error.message),\n ...(error.details\n ? { details: sanitizeUnknown(error.details) as Record<string, unknown> }\n : {}),\n };\n};\n", "export const SITE_ALLOWLIST_KEY = 'siteAllowlist';\nexport const PERMISSION_PROMPT_WAIT_MS_KEY = 'permissionPromptWaitMs';\nexport const DEFAULT_PERMISSION_PROMPT_WAIT_MS = 30_000;\nexport const SITE_PERMISSIONS_MODE_KEY = 'sitePermissionsMode';\nexport const DEBUGGER_CAPABILITY_ENABLED_KEY = 'debuggerCapabilityEnabled';\n\nexport type SitePermissionsMode = 'granular' | 'bypass';\nexport const DEFAULT_SITE_PERMISSIONS_MODE: SitePermissionsMode = 'granular';\nexport const DEFAULT_DEBUGGER_CAPABILITY_ENABLED = true;\n\nexport type SiteAllowlistEntry = {\n createdAt: string; // ISO\n lastUsedAt: string; // ISO\n};\n\nexport type SiteAllowlist = Record<string, SiteAllowlistEntry>;\n\nexport const siteKeyFromUrl = (rawUrl: string): string | null => {\n if (!rawUrl || typeof rawUrl !== 'string') {\n return null;\n }\n\n try {\n const parsed = new URL(rawUrl);\n // Only gate \"real web\" pages for now.\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n return null;\n }\n\n // URL.hostname is lowercased by the platform.\n if (!parsed.hostname) {\n return null;\n }\n\n return parsed.port ? `${parsed.hostname}:${parsed.port}` : parsed.hostname;\n } catch {\n return null;\n }\n};\n\nconst isAllowlistEntry = (value: unknown): value is SiteAllowlistEntry => {\n if (!value || typeof value !== 'object') {\n return false;\n }\n const v = value as Record<string, unknown>;\n return typeof v.createdAt === 'string' && typeof v.lastUsedAt === 'string';\n};\n\nconst normalizeSiteKey = (siteKey: string): string => siteKey.toLowerCase();\n\nconst readAllowlistRaw = async (): Promise<SiteAllowlist> => {\n return await new Promise<SiteAllowlist>((resolve) => {\n chrome.storage.local.get(\n [SITE_ALLOWLIST_KEY],\n (result: Record<string, unknown>) => {\n const raw = result?.[SITE_ALLOWLIST_KEY];\n if (!raw || typeof raw !== 'object') {\n resolve({});\n return;\n }\n\n const out: SiteAllowlist = {};\n for (const [k, v] of Object.entries(raw as Record<string, unknown>)) {\n if (typeof k !== 'string') {\n continue;\n }\n if (!isAllowlistEntry(v)) {\n continue;\n }\n out[normalizeSiteKey(k)] = v;\n }\n\n resolve(out);\n }\n );\n });\n};\n\nconst writeAllowlistRaw = async (allowlist: SiteAllowlist): Promise<void> => {\n return await new Promise<void>((resolve) => {\n chrome.storage.local.set({ [SITE_ALLOWLIST_KEY]: allowlist }, () =>\n resolve()\n );\n });\n};\n\nexport const readSitePermissionsMode =\n async (): Promise<SitePermissionsMode> => {\n return await new Promise<SitePermissionsMode>((resolve) => {\n chrome.storage.local.get(\n [SITE_PERMISSIONS_MODE_KEY],\n (result: Record<string, unknown>) => {\n const raw = result?.[SITE_PERMISSIONS_MODE_KEY];\n if (raw === 'granular' || raw === 'bypass') {\n resolve(raw);\n return;\n }\n\n // Self-heal legacy/invalid storage to a safe default, so UIs never\n // render with \"no mode selected\" and other callers don't have to\n // special-case missing values.\n try {\n chrome.storage.local.set({\n [SITE_PERMISSIONS_MODE_KEY]: DEFAULT_SITE_PERMISSIONS_MODE,\n });\n } catch {\n // ignore\n }\n resolve(DEFAULT_SITE_PERMISSIONS_MODE);\n }\n );\n });\n };\n\nexport const writeSitePermissionsMode = async (\n mode: SitePermissionsMode\n): Promise<void> => {\n return await new Promise<void>((resolve) => {\n chrome.storage.local.set({ [SITE_PERMISSIONS_MODE_KEY]: mode }, () =>\n resolve()\n );\n });\n};\n\nexport const readPermissionPromptWaitMs = async (): Promise<number> => {\n return await new Promise<number>((resolve) => {\n chrome.storage.local.get(\n [PERMISSION_PROMPT_WAIT_MS_KEY],\n (result: Record<string, unknown>) => {\n const raw = result?.[PERMISSION_PROMPT_WAIT_MS_KEY];\n if (typeof raw === 'number' && Number.isFinite(raw) && raw > 0) {\n resolve(raw);\n return;\n }\n if (typeof raw === 'string') {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed > 0) {\n resolve(parsed);\n return;\n }\n }\n\n resolve(DEFAULT_PERMISSION_PROMPT_WAIT_MS);\n }\n );\n });\n};\n\nexport const readDebuggerCapabilityEnabled = async (): Promise<boolean> => {\n return await new Promise<boolean>((resolve) => {\n chrome.storage.local.get(\n [DEBUGGER_CAPABILITY_ENABLED_KEY],\n (result: Record<string, unknown>) => {\n const raw = result?.[DEBUGGER_CAPABILITY_ENABLED_KEY];\n if (raw === true) {\n resolve(true);\n return;\n }\n\n // Inspect is always enabled now; self-heal any legacy false/missing\n // values so older installs stop carrying the dead toggle around.\n try {\n chrome.storage.local.set({\n [DEBUGGER_CAPABILITY_ENABLED_KEY]:\n DEFAULT_DEBUGGER_CAPABILITY_ENABLED,\n });\n } catch {\n // ignore\n }\n resolve(DEFAULT_DEBUGGER_CAPABILITY_ENABLED);\n }\n );\n });\n};\n\nexport const writeDebuggerCapabilityEnabled = async (\n enabled: boolean\n): Promise<void> => {\n void enabled;\n return await new Promise<void>((resolve) => {\n chrome.storage.local.set({ [DEBUGGER_CAPABILITY_ENABLED_KEY]: true }, () =>\n resolve()\n );\n });\n};\n\nexport const getAllowlistedSites = async (): Promise<SiteAllowlist> => {\n return await readAllowlistRaw();\n};\n\nexport const isSiteAllowed = async (siteKey: string): Promise<boolean> => {\n const key = normalizeSiteKey(siteKey);\n const allowlist = await readAllowlistRaw();\n return Boolean(allowlist[key]);\n};\n\nexport const allowSiteAlways = async (\n siteKey: string,\n now: Date = new Date()\n): Promise<void> => {\n const key = normalizeSiteKey(siteKey);\n const allowlist = await readAllowlistRaw();\n const nowIso = now.toISOString();\n\n const existing = allowlist[key];\n allowlist[key] = {\n createdAt: existing?.createdAt ?? nowIso,\n lastUsedAt: nowIso,\n };\n\n await writeAllowlistRaw(allowlist);\n};\n\nexport const upsertAllowlistedSites = async (\n entries: SiteAllowlist\n): Promise<void> => {\n const allowlist = await readAllowlistRaw();\n let changed = false;\n\n for (const [k, v] of Object.entries(entries ?? {})) {\n if (typeof k !== 'string') {\n continue;\n }\n if (!isAllowlistEntry(v)) {\n continue;\n }\n allowlist[normalizeSiteKey(k)] = v;\n changed = true;\n }\n\n if (!changed) {\n return;\n }\n\n await writeAllowlistRaw(allowlist);\n};\n\nexport const touchSiteLastUsed = async (\n siteKey: string,\n now: Date = new Date()\n): Promise<void> => {\n const key = normalizeSiteKey(siteKey);\n const allowlist = await readAllowlistRaw();\n const existing = allowlist[key];\n if (!existing) {\n return;\n }\n\n allowlist[key] = { ...existing, lastUsedAt: now.toISOString() };\n await writeAllowlistRaw(allowlist);\n};\n\nexport const revokeSite = async (siteKey: string): Promise<void> => {\n const key = normalizeSiteKey(siteKey);\n const allowlist = await readAllowlistRaw();\n if (!allowlist[key]) {\n return;\n }\n delete allowlist[key];\n await writeAllowlistRaw(allowlist);\n};\n", "import {\n allowSiteAlways,\n readPermissionPromptWaitMs,\n} from './site-permissions.js';\n\nexport const PERMISSION_PROMPT_PORT_NAME = 'permission_prompt';\n\nexport type PermissionPromptDecision = 'allow_once' | 'allow_always' | 'deny';\n\nexport type PermissionPromptResult =\n | { kind: PermissionPromptDecision }\n | { kind: 'timed_out'; waitMs: number };\n\nexport type PermissionPromptRequest = {\n siteKey: string;\n action: string;\n};\n\ntype PromptState = {\n siteKey: string;\n action: string;\n requestId: string;\n windowId: number | null;\n decided: PermissionPromptDecision | null;\n waiters: Set<(decision: PermissionPromptDecision) => void>;\n};\n\nexport type PermissionPromptControllerDeps = {\n openWindow: (url: string) => Promise<number>;\n closeWindow: (windowId: number) => Promise<void>;\n getWaitMs: () => Promise<number>;\n persistAlwaysAllow: (siteKey: string) => Promise<void>;\n makeRequestId: () => string;\n};\n\nconst defaultMakeRequestId = (): string => {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID();\n }\n return `perm-${Date.now()}-${Math.random().toString(16).slice(2)}`;\n};\n\nconst defaultOpenWindow = async (url: string): Promise<number> => {\n return await new Promise<number>((resolve, reject) => {\n chrome.windows.create(\n {\n type: 'popup',\n url,\n focused: true,\n width: 460,\n height: 420,\n },\n (win: Record<string, unknown> | undefined) => {\n const err = chrome.runtime.lastError;\n if (err) {\n reject(new Error(err.message));\n return;\n }\n const windowId = win?.id;\n if (typeof windowId !== 'number') {\n reject(new Error('Prompt window id missing.'));\n return;\n }\n resolve(windowId);\n }\n );\n });\n};\n\nconst defaultCloseWindow = async (windowId: number): Promise<void> => {\n return await new Promise<void>((resolve) => {\n chrome.windows.remove(windowId, () => resolve());\n });\n};\n\nconst delay = async (ms: number): Promise<void> => {\n return await new Promise<void>((resolve) => {\n setTimeout(resolve, ms);\n });\n};\n\nexport class PermissionPromptController {\n private deps: PermissionPromptControllerDeps;\n private stateBySite = new Map<string, PromptState>();\n private stateByRequestId = new Map<string, PromptState>();\n private stateByWindowId = new Map<number, PromptState>();\n\n constructor(deps?: Partial<PermissionPromptControllerDeps>) {\n this.deps = {\n openWindow: deps?.openWindow ?? defaultOpenWindow,\n closeWindow: deps?.closeWindow ?? defaultCloseWindow,\n getWaitMs: deps?.getWaitMs ?? readPermissionPromptWaitMs,\n persistAlwaysAllow: deps?.persistAlwaysAllow ?? allowSiteAlways,\n makeRequestId: deps?.makeRequestId ?? defaultMakeRequestId,\n };\n }\n\n async requestPermission(\n request: PermissionPromptRequest\n ): Promise<PermissionPromptResult> {\n const siteKey = request.siteKey.toLowerCase();\n\n let state = this.stateBySite.get(siteKey);\n if (!state) {\n const requestId = this.deps.makeRequestId();\n state = {\n siteKey,\n action: request.action,\n requestId,\n windowId: null,\n decided: null,\n waiters: new Set(),\n };\n this.stateBySite.set(siteKey, state);\n this.stateByRequestId.set(requestId, state);\n\n const url = this.buildPromptUrl(state);\n const windowId = await this.deps.openWindow(url);\n state.windowId = windowId;\n this.stateByWindowId.set(windowId, state);\n\n // In tests (or in rare races), a decision could be processed before the\n // window id is set. If so, close and clean up now.\n if (state.decided) {\n await this.deps.closeWindow(windowId);\n this.cleanupState(state);\n }\n }\n\n const waitMs = await this.deps.getWaitMs();\n const decision = await this.waitForDecisionOrTimeout(state, waitMs);\n if (!decision) {\n return { kind: 'timed_out', waitMs };\n }\n return { kind: decision };\n }\n\n handleConnect(port: unknown): void {\n if (!port || typeof port !== 'object') {\n return;\n }\n\n // We keep this loosely typed; MV3 provides the real shape at runtime.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const p = port as any;\n if (p.name !== PERMISSION_PROMPT_PORT_NAME) {\n return;\n }\n\n const onMessage = p.onMessage;\n if (!onMessage || typeof onMessage.addListener !== 'function') {\n return;\n }\n\n onMessage.addListener((message: unknown) => {\n void this.handlePortMessage(message).catch((error) => {\n console.error(\n 'PermissionPromptController handlePortMessage failed:',\n error\n );\n });\n });\n }\n\n handleWindowRemoved(windowId: number): void {\n const state = this.stateByWindowId.get(windowId);\n if (!state) {\n return;\n }\n this.cleanupState(state);\n }\n\n private buildPromptUrl(state: PromptState): string {\n const base = chrome.runtime.getURL('permission.html');\n const u = new URL(base);\n u.searchParams.set('requestId', state.requestId);\n u.searchParams.set('site', state.siteKey);\n u.searchParams.set('action', state.action);\n return u.toString();\n }\n\n private async waitForDecisionOrTimeout(\n state: PromptState,\n waitMs: number\n ): Promise<PermissionPromptDecision | null> {\n if (state.decided) {\n return state.decided;\n }\n\n let waiter: ((decision: PermissionPromptDecision) => void) | null = null;\n const decisionPromise = new Promise<PermissionPromptDecision>((resolve) => {\n waiter = resolve;\n state.waiters.add(resolve);\n });\n\n const winner = await Promise.race([\n decisionPromise,\n delay(waitMs).then(() => null as PermissionPromptDecision | null),\n ]);\n\n if (winner === null && waiter) {\n state.waiters.delete(waiter);\n }\n\n return winner;\n }\n\n private async handlePortMessage(message: unknown): Promise<void> {\n if (!message || typeof message !== 'object') {\n return;\n }\n const m = message as Record<string, unknown>;\n if (m.type !== 'decision') {\n return;\n }\n\n const requestId = m.requestId;\n const decision = m.decision;\n if (typeof requestId !== 'string' || requestId.length === 0) {\n return;\n }\n if (\n decision !== 'allow_once' &&\n decision !== 'allow_always' &&\n decision !== 'deny'\n ) {\n return;\n }\n\n const state = this.stateByRequestId.get(requestId);\n if (!state) {\n return;\n }\n\n state.decided = decision;\n if (decision === 'allow_always') {\n await this.deps.persistAlwaysAllow(state.siteKey);\n }\n\n for (const waiter of state.waiters) {\n waiter(decision);\n }\n state.waiters.clear();\n\n if (typeof state.windowId === 'number') {\n await this.deps.closeWindow(state.windowId);\n this.cleanupState(state);\n }\n }\n\n private cleanupState(state: PromptState): void {\n this.stateBySite.delete(state.siteKey);\n this.stateByRequestId.delete(state.requestId);\n if (typeof state.windowId === 'number') {\n this.stateByWindowId.delete(state.windowId);\n }\n }\n}\n", "import {\n allowSiteAlways,\n readPermissionPromptWaitMs,\n revokeSite,\n type SitePermissionsMode,\n writeSitePermissionsMode,\n} from './site-permissions.js';\n\nexport const PERMISSIONS_REQUEST_PORT_NAME = 'permissions_request_prompt';\n\nexport type PermissionsRequestSource = 'cli' | 'mcp' | 'api';\nexport type PermissionsRequestKind = 'allow_site' | 'revoke_site' | 'set_mode';\nexport type PermissionsRequestStatus =\n | 'pending'\n | 'approved'\n | 'denied'\n | 'timed_out';\n\nexport type PermissionsChangeRequest = {\n kind: PermissionsRequestKind;\n site?: string;\n mode?: SitePermissionsMode;\n timeoutMs?: number;\n source?: PermissionsRequestSource;\n};\n\nexport type PermissionsRequestResult = {\n request_id: string;\n kind: PermissionsRequestKind;\n status: Exclude<PermissionsRequestStatus, 'pending'>;\n requested_at: string;\n site?: string;\n mode?: SitePermissionsMode;\n source?: PermissionsRequestSource;\n warning?: string;\n message?: string;\n};\n\nexport type PendingPermissionsRequest = {\n request_id: string;\n kind: PermissionsRequestKind;\n status: 'pending';\n requested_at: string;\n site?: string;\n mode?: SitePermissionsMode;\n source?: PermissionsRequestSource;\n warning?: string;\n};\n\ntype ApprovalDecision = 'approve' | 'deny';\n\ntype RequestState = {\n requestId: string;\n kind: PermissionsRequestKind;\n requestedAt: string;\n site?: string;\n mode?: SitePermissionsMode;\n source?: PermissionsRequestSource;\n warning?: string;\n windowId: number | null;\n decided: ApprovalDecision | null;\n waiters: Set<(decision: ApprovalDecision) => void>;\n};\n\nexport type PermissionsRequestControllerDeps = {\n openWindow: (url: string) => Promise<number>;\n closeWindow: (windowId: number) => Promise<void>;\n getDefaultWaitMs: () => Promise<number>;\n makeRequestId: () => string;\n now: () => string;\n allowSite: (siteKey: string) => Promise<void>;\n revokeSite: (siteKey: string) => Promise<void>;\n setMode: (mode: SitePermissionsMode) => Promise<void>;\n};\n\nconst defaultMakeRequestId = (): string => {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID();\n }\n return `perm-change-${Date.now()}-${Math.random().toString(16).slice(2)}`;\n};\n\nconst defaultOpenWindow = async (url: string): Promise<number> => {\n return await new Promise<number>((resolve, reject) => {\n chrome.windows.create(\n {\n type: 'popup',\n url,\n focused: true,\n width: 500,\n height: 470,\n },\n (win: Record<string, unknown> | undefined) => {\n const err = chrome.runtime.lastError;\n if (err) {\n reject(new Error(err.message));\n return;\n }\n const windowId = win?.id;\n if (typeof windowId !== 'number') {\n reject(new Error('Prompt window id missing.'));\n return;\n }\n resolve(windowId);\n }\n );\n });\n};\n\nconst defaultCloseWindow = async (windowId: number): Promise<void> => {\n return await new Promise<void>((resolve) => {\n chrome.windows.remove(windowId, () => resolve());\n });\n};\n\nconst delay = async (ms: number): Promise<void> => {\n return await new Promise<void>((resolve) => {\n setTimeout(resolve, ms);\n });\n};\n\nconst normalizeSite = (site: string): string => site.trim().toLowerCase();\n\nconst describeChange = (\n state: Pick<RequestState, 'kind' | 'site' | 'mode'>\n) => {\n switch (state.kind) {\n case 'allow_site':\n return `Allow Browser Bridge actions on ${state.site ?? 'this site'}.`;\n case 'revoke_site':\n return `Revoke Browser Bridge actions on ${state.site ?? 'this site'}.`;\n case 'set_mode':\n return state.mode === 'bypass'\n ? 'Switch Browser Bridge to bypass mode.'\n : 'Switch Browser Bridge to granular mode.';\n }\n};\n\nconst buildWarning = (\n kind: PermissionsRequestKind,\n mode?: SitePermissionsMode\n): string | undefined => {\n if (kind === 'set_mode' && mode === 'bypass') {\n return 'Bypass mode lets the agent act on any website without asking first.';\n }\n return undefined;\n};\n\nexport class PermissionsRequestController {\n private readonly deps: PermissionsRequestControllerDeps;\n private readonly stateByRequestId = new Map<string, RequestState>();\n private readonly stateByWindowId = new Map<number, RequestState>();\n\n constructor(deps?: Partial<PermissionsRequestControllerDeps>) {\n this.deps = {\n openWindow: deps?.openWindow ?? defaultOpenWindow,\n closeWindow: deps?.closeWindow ?? defaultCloseWindow,\n getDefaultWaitMs: deps?.getDefaultWaitMs ?? readPermissionPromptWaitMs,\n makeRequestId: deps?.makeRequestId ?? defaultMakeRequestId,\n now: deps?.now ?? (() => new Date().toISOString()),\n allowSite: deps?.allowSite ?? allowSiteAlways,\n revokeSite: deps?.revokeSite ?? revokeSite,\n setMode: deps?.setMode ?? writeSitePermissionsMode,\n };\n }\n\n async requestChange(\n request: PermissionsChangeRequest\n ): Promise<PermissionsRequestResult> {\n const state = await this.createState(request);\n const waitMs =\n typeof request.timeoutMs === 'number' && request.timeoutMs > 0\n ? request.timeoutMs\n : await this.deps.getDefaultWaitMs();\n const decision = await this.waitForDecisionOrTimeout(state, waitMs);\n\n if (!decision) {\n return {\n request_id: state.requestId,\n kind: state.kind,\n status: 'timed_out',\n requested_at: state.requestedAt,\n ...(state.site ? { site: state.site } : {}),\n ...(state.mode ? { mode: state.mode } : {}),\n ...(state.source ? { source: state.source } : {}),\n ...(state.warning ? { warning: state.warning } : {}),\n message: 'Permission change request timed out waiting for approval.',\n };\n }\n\n return {\n request_id: state.requestId,\n kind: state.kind,\n status: decision === 'approve' ? 'approved' : 'denied',\n requested_at: state.requestedAt,\n ...(state.site ? { site: state.site } : {}),\n ...(state.mode ? { mode: state.mode } : {}),\n ...(state.source ? { source: state.source } : {}),\n ...(state.warning ? { warning: state.warning } : {}),\n message:\n decision === 'approve'\n ? describeChange(state)\n : 'Permission change request was denied.',\n };\n }\n\n listPendingRequests(): PendingPermissionsRequest[] {\n return [...this.stateByRequestId.values()]\n .filter((state) => state.decided === null)\n .map((state) => ({\n request_id: state.requestId,\n kind: state.kind,\n status: 'pending' as const,\n requested_at: state.requestedAt,\n ...(state.site ? { site: state.site } : {}),\n ...(state.mode ? { mode: state.mode } : {}),\n ...(state.source ? { source: state.source } : {}),\n ...(state.warning ? { warning: state.warning } : {}),\n }))\n .sort((a, b) => a.requested_at.localeCompare(b.requested_at));\n }\n\n handleConnect(port: unknown): void {\n if (!port || typeof port !== 'object') {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const p = port as any;\n if (p.name !== PERMISSIONS_REQUEST_PORT_NAME) {\n return;\n }\n\n const onMessage = p.onMessage;\n if (!onMessage || typeof onMessage.addListener !== 'function') {\n return;\n }\n\n onMessage.addListener((message: unknown) => {\n void this.handlePortMessage(message).catch((error) => {\n console.error(\n 'PermissionsRequestController handlePortMessage failed:',\n error\n );\n });\n });\n }\n\n handleWindowRemoved(windowId: number): void {\n const state = this.stateByWindowId.get(windowId);\n if (!state) {\n return;\n }\n this.cleanupState(state);\n }\n\n private async createState(\n request: PermissionsChangeRequest\n ): Promise<RequestState> {\n const requestId = this.deps.makeRequestId();\n const requestedAt = this.deps.now();\n const kind = request.kind;\n const warning = buildWarning(kind, request.mode);\n const state: RequestState = {\n requestId,\n kind,\n requestedAt,\n site: request.site ? normalizeSite(request.site) : undefined,\n mode: request.mode,\n source: request.source,\n warning,\n windowId: null,\n decided: null,\n waiters: new Set(),\n };\n\n this.stateByRequestId.set(requestId, state);\n const url = this.buildPromptUrl(state);\n const windowId = await this.deps.openWindow(url);\n state.windowId = windowId;\n this.stateByWindowId.set(windowId, state);\n\n if (state.decided) {\n await this.deps.closeWindow(windowId);\n this.cleanupState(state);\n }\n\n return state;\n }\n\n private buildPromptUrl(state: RequestState): string {\n const base = chrome.runtime.getURL('permissions-request.html');\n const url = new URL(base);\n url.searchParams.set('requestId', state.requestId);\n url.searchParams.set('kind', state.kind);\n url.searchParams.set('requestedAt', state.requestedAt);\n if (state.site) {\n url.searchParams.set('site', state.site);\n }\n if (state.mode) {\n url.searchParams.set('mode', state.mode);\n }\n if (state.source) {\n url.searchParams.set('source', state.source);\n }\n if (state.warning) {\n url.searchParams.set('warning', state.warning);\n }\n if (state.kind === 'set_mode' && state.mode === 'bypass') {\n url.searchParams.set('requireAcknowledge', '1');\n }\n return url.toString();\n }\n\n private async waitForDecisionOrTimeout(\n state: RequestState,\n waitMs: number\n ): Promise<ApprovalDecision | null> {\n if (state.decided) {\n return state.decided;\n }\n\n let waiter: ((decision: ApprovalDecision) => void) | null = null;\n const decisionPromise = new Promise<ApprovalDecision>((resolve) => {\n waiter = resolve;\n state.waiters.add(resolve);\n });\n\n const winner = await Promise.race([\n decisionPromise,\n delay(waitMs).then(() => null as ApprovalDecision | null),\n ]);\n\n if (winner === null && waiter) {\n state.waiters.delete(waiter);\n }\n\n return winner;\n }\n\n private async handlePortMessage(message: unknown): Promise<void> {\n if (!message || typeof message !== 'object') {\n return;\n }\n const m = message as Record<string, unknown>;\n if (m.type !== 'decision') {\n return;\n }\n\n const requestId = m.requestId;\n const decision = m.decision;\n if (typeof requestId !== 'string' || requestId.length === 0) {\n return;\n }\n if (decision !== 'approve' && decision !== 'deny') {\n return;\n }\n\n const state = this.stateByRequestId.get(requestId);\n if (!state) {\n return;\n }\n\n state.decided = decision;\n if (decision === 'approve') {\n await this.applyApprovedChange(state);\n }\n\n for (const waiter of state.waiters) {\n waiter(decision);\n }\n state.waiters.clear();\n\n if (typeof state.windowId === 'number') {\n await this.deps.closeWindow(state.windowId);\n this.cleanupState(state);\n }\n }\n\n private async applyApprovedChange(state: RequestState): Promise<void> {\n if (state.kind === 'allow_site') {\n if (!state.site) {\n throw new Error('allow_site request is missing site.');\n }\n await this.deps.allowSite(state.site);\n return;\n }\n\n if (state.kind === 'revoke_site') {\n if (!state.site) {\n throw new Error('revoke_site request is missing site.');\n }\n await this.deps.revokeSite(state.site);\n return;\n }\n\n if (!state.mode) {\n throw new Error('set_mode request is missing mode.');\n }\n await this.deps.setMode(state.mode);\n }\n\n private cleanupState(state: RequestState): void {\n this.stateByRequestId.delete(state.requestId);\n if (typeof state.windowId === 'number') {\n this.stateByWindowId.delete(state.windowId);\n }\n }\n}\n", "import type { DriveErrorInfo } from './protocol.js';\n\nexport const RESTRICTED_URL_PREFIXES = [\n 'chrome://',\n 'chrome-extension://',\n 'chrome-devtools://',\n 'devtools://',\n 'edge://',\n 'brave://',\n 'view-source:',\n];\n\nexport const isRestrictedUrl = (url?: string): boolean => {\n if (!url || typeof url !== 'string') {\n return false;\n }\n const lowered = url.toLowerCase();\n if (RESTRICTED_URL_PREFIXES.some((prefix) => lowered.startsWith(prefix))) {\n return true;\n }\n try {\n const parsed = new URL(url);\n if (parsed.hostname === 'chromewebstore.google.com') {\n return true;\n }\n if (parsed.hostname === 'chrome.google.com') {\n return parsed.pathname.startsWith('/webstore');\n }\n } catch (error) {\n console.debug('Ignoring invalid URL in restriction check.', error);\n }\n return false;\n};\n\ntype RestrictedOperation = 'navigate' | 'screenshot' | 'debugger' | 'action';\n\nconst getRestrictedUrlKind = (url: string): string => {\n const lowered = url.toLowerCase();\n if (lowered.startsWith('chrome-extension://')) {\n return 'extension_internal';\n }\n if (\n lowered.startsWith('chrome://') ||\n lowered.startsWith('edge://') ||\n lowered.startsWith('brave://')\n ) {\n return 'browser_internal';\n }\n if (\n lowered.includes('chromewebstore.google.com') ||\n lowered.includes('chrome.google.com/webstore')\n ) {\n return 'webstore';\n }\n return 'restricted_url';\n};\n\nconst getAlternativeCommands = (url: string): string[] => {\n const lowered = url.toLowerCase();\n if (\n lowered.startsWith('chrome-extension://') ||\n lowered.startsWith('chrome://extensions')\n ) {\n return ['browser-bridge diagnostics doctor', 'browser-bridge dev info'];\n }\n return ['browser-bridge dev info', 'browser-bridge diagnostics doctor'];\n};\n\nexport const buildRestrictedUrlError = (options: {\n url: string;\n operation: RestrictedOperation;\n action?: string;\n}): DriveErrorInfo => {\n const alternatives = getAlternativeCommands(options.url);\n const operationLabel =\n options.operation === 'navigate'\n ? 'Navigation'\n : options.operation === 'screenshot'\n ? 'Screenshots'\n : options.operation === 'debugger'\n ? 'Debugger attach'\n : 'This action';\n\n return {\n code: 'NOT_SUPPORTED',\n message: `${operationLabel} is not supported for browser internal URLs.`,\n retryable: false,\n details: {\n reason: 'restricted_internal_url',\n url: options.url,\n url_kind: getRestrictedUrlKind(options.url),\n rationale:\n 'Chrome restricts extension automation on internal browser surfaces (for example chrome:// and chrome-extension://).',\n action: options.action,\n next_step: alternatives[0],\n alternatives,\n },\n };\n};\n", "import type { DriveErrorInfo } from './protocol.js';\n\ntype TabParams = Record<string, unknown>;\n\ntype GetDefaultTabId = () => Promise<number>;\n\ntype GetTab = (tabId: number) => Promise<Record<string, unknown>>;\n\ntype TabIdParseResult =\n | { ok: true; tabId: number | undefined }\n | { ok: false; error: DriveErrorInfo };\n\ntype TabIdResult =\n | { ok: true; tabId: number }\n | { ok: false; error: DriveErrorInfo };\n\ntype TabLookupResult =\n | { ok: true; tab: Record<string, unknown> }\n | { ok: false; error: DriveErrorInfo };\n\nconst invalidTabIdError = (message: string): DriveErrorInfo => ({\n code: 'INVALID_ARGUMENT',\n message,\n retryable: false,\n});\n\nexport const readOptionalTabId = (\n params: TabParams,\n message = 'tab_id must be a number when provided.'\n): TabIdParseResult => {\n const tabId = params.tab_id;\n if (tabId !== undefined && typeof tabId !== 'number') {\n return {\n ok: false,\n error: invalidTabIdError(message),\n };\n }\n return {\n ok: true,\n tabId: typeof tabId === 'number' ? tabId : undefined,\n };\n};\n\nexport const readRequiredTabId = (\n params: TabParams,\n message = 'tab_id must be a number.'\n): TabIdResult => {\n const tabId = params.tab_id;\n if (typeof tabId !== 'number') {\n return {\n ok: false,\n error: invalidTabIdError(message),\n };\n }\n return {\n ok: true,\n tabId,\n };\n};\n\nexport const resolveOptionalTabId = async (\n params: TabParams,\n deps: { getDefaultTabId: GetDefaultTabId },\n message = 'tab_id must be a number when provided.'\n): Promise<TabIdResult> => {\n const parsed = readOptionalTabId(params, message);\n if (!parsed.ok) {\n return parsed;\n }\n return {\n ok: true,\n tabId: parsed.tabId ?? (await deps.getDefaultTabId()),\n };\n};\n\nexport const requireTab = async (\n tabId: number,\n getTab: GetTab\n): Promise<TabLookupResult> => {\n try {\n return {\n ok: true,\n tab: await getTab(tabId),\n };\n } catch {\n return {\n ok: false,\n error: {\n code: 'TAB_NOT_FOUND',\n message: `tab_id ${tabId} was not found.`,\n retryable: false,\n details: { tab_id: tabId },\n },\n };\n }\n};\n", "import type { PermissionPromptResult } from './permission-prompt.js';\nimport type { DriveErrorInfo } from './protocol.js';\nimport { buildRestrictedUrlError, isRestrictedUrl } from './restricted-url.js';\nimport {\n allowSiteAlways,\n isSiteAllowed,\n readSitePermissionsMode,\n siteKeyFromUrl,\n} from './site-permissions.js';\nimport { readOptionalTabId } from './tab-resolution.js';\n\ntype PermissionPromptControllerLike = {\n requestPermission: (request: {\n siteKey: string;\n action: string;\n }) => Promise<PermissionPromptResult>;\n};\n\ntype GateDriveActionResult =\n | { ok: true; siteKey: string | null; touchOnSuccess: boolean }\n | { ok: false; error: DriveErrorInfo };\n\nconst GATED_ACTIONS = new Set<string>([\n 'drive.navigate',\n 'drive.go_back',\n 'drive.go_forward',\n 'drive.click',\n 'drive.hover',\n 'drive.select',\n 'drive.type',\n 'drive.fill_form',\n 'drive.drag',\n 'drive.handle_dialog',\n 'drive.key',\n 'drive.key_press',\n 'drive.scroll',\n 'drive.screenshot',\n 'drive.wait_for',\n]);\n\nexport const gateDriveAction = async (options: {\n action: string;\n params: Record<string, unknown>;\n getDefaultTabId: () => Promise<number>;\n getTab: (tabId: number) => Promise<Record<string, unknown>>;\n permissionPrompts: PermissionPromptControllerLike;\n}): Promise<GateDriveActionResult> => {\n const { action, params, getDefaultTabId, getTab, permissionPrompts } =\n options;\n if (!GATED_ACTIONS.has(action)) {\n return { ok: true, siteKey: null, touchOnSuccess: false };\n }\n\n let siteKey: string | null = null;\n\n if (action === 'drive.navigate') {\n const url = params.url;\n if (typeof url !== 'string' || url.length === 0) {\n // Let the caller surface INVALID_ARGUMENT for missing url.\n return { ok: true, siteKey: null, touchOnSuccess: false };\n }\n if (isRestrictedUrl(url)) {\n return {\n ok: false,\n error: buildRestrictedUrlError({\n url,\n operation: 'navigate',\n action,\n }),\n };\n }\n siteKey = siteKeyFromUrl(url);\n if (!siteKey) {\n return {\n ok: false,\n error: {\n code: 'INVALID_ARGUMENT',\n message: 'Unable to resolve site permission key for url.',\n retryable: false,\n details: { url },\n },\n };\n }\n } else {\n const parsedTabId = readOptionalTabId(params);\n if (!parsedTabId.ok) {\n // Let the caller surface INVALID_ARGUMENT for tab_id shape.\n return { ok: true, siteKey: null, touchOnSuccess: false };\n }\n const resolvedTabId = parsedTabId.tabId ?? (await getDefaultTabId());\n const tab = await getTab(resolvedTabId);\n const url = tab.url;\n if (typeof url !== 'string' || url.length === 0) {\n return {\n ok: false,\n error: {\n code: 'FAILED_PRECONDITION',\n message: 'Active tab URL is unavailable for permission gating.',\n retryable: false,\n details: { tab_id: resolvedTabId },\n },\n };\n }\n if (isRestrictedUrl(url)) {\n return {\n ok: false,\n error: buildRestrictedUrlError({\n url,\n operation: action === 'drive.screenshot' ? 'screenshot' : 'action',\n action,\n }),\n };\n }\n siteKey = siteKeyFromUrl(url);\n if (!siteKey) {\n return {\n ok: false,\n error: {\n code: 'FAILED_PRECONDITION',\n message: 'Unable to resolve site permission key for active tab.',\n retryable: false,\n details: { url, tab_id: resolvedTabId },\n },\n };\n }\n }\n\n if ((await readSitePermissionsMode()) === 'bypass') {\n return { ok: true, siteKey, touchOnSuccess: false };\n }\n\n if (await isSiteAllowed(siteKey)) {\n return { ok: true, siteKey, touchOnSuccess: true };\n }\n\n const decision = await permissionPrompts.requestPermission({\n siteKey,\n action,\n });\n\n if (decision.kind === 'timed_out') {\n return {\n ok: false,\n error: {\n code: 'PERMISSION_PROMPT_TIMEOUT',\n message: `Permission prompt timed out for ${siteKey}.`,\n retryable: true,\n details: {\n reason: 'prompt_timed_out',\n site: siteKey,\n action,\n wait_ms: decision.waitMs,\n },\n },\n };\n }\n\n if (decision.kind === 'deny') {\n return {\n ok: false,\n error: {\n code: 'PERMISSION_DENIED',\n message: `User denied Browser Bridge permission for ${siteKey}.`,\n retryable: false,\n details: {\n reason: 'user_denied',\n site: siteKey,\n action,\n next_step:\n 'Ask the user to approve the permission prompt (Allow/Always allow) or allow the site in the extension options page, then retry the command.',\n },\n },\n };\n }\n\n if (decision.kind === 'allow_always') {\n await allowSiteAlways(siteKey);\n return { ok: true, siteKey, touchOnSuccess: true };\n }\n\n return { ok: true, siteKey, touchOnSuccess: false };\n};\n", "export type PopupTriggerState = {\n kind: 'popup_trigger';\n ariaHasPopup?: string;\n ariaExpanded?: string;\n dataState?: string;\n open?: boolean;\n};\n\nconst normalizeAttr = (value: string | null): string | undefined => {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n};\n\nexport const readPopupTriggerState = (\n target: Element\n): PopupTriggerState | null => {\n if (!(target instanceof HTMLElement)) {\n return null;\n }\n const ariaHasPopup = normalizeAttr(target.getAttribute('aria-haspopup'));\n const ariaExpanded = normalizeAttr(target.getAttribute('aria-expanded'));\n const dataState = normalizeAttr(target.getAttribute('data-state'));\n const open =\n 'open' in target && typeof (target as { open?: unknown }).open === 'boolean'\n ? ((target as { open: boolean }).open ?? false)\n : undefined;\n const qualifiesAsPopupTrigger =\n Boolean(ariaHasPopup) || ariaExpanded !== undefined || open !== undefined;\n if (!qualifiesAsPopupTrigger && dataState === undefined) {\n return null;\n }\n if (!qualifiesAsPopupTrigger) {\n return null;\n }\n return {\n kind: 'popup_trigger',\n ariaHasPopup,\n ariaExpanded,\n dataState,\n open,\n };\n};\n\nexport const popupTriggerStateChanged = (\n before: PopupTriggerState | null,\n after: PopupTriggerState | null\n): boolean => {\n if (!before || !after) {\n return before !== after;\n }\n return (\n before.ariaExpanded !== after.ariaExpanded ||\n before.dataState !== after.dataState ||\n before.open !== after.open\n );\n};\n\nexport const coercePopupTriggerState = (\n value: unknown\n): PopupTriggerState | undefined => {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n const record = value as Record<string, unknown>;\n if (record.kind !== 'popup_trigger') {\n return undefined;\n }\n const ariaHasPopup =\n typeof record.ariaHasPopup === 'string' ? record.ariaHasPopup : undefined;\n const ariaExpanded =\n typeof record.ariaExpanded === 'string' ? record.ariaExpanded : undefined;\n const dataState =\n typeof record.dataState === 'string' ? record.dataState : undefined;\n const open = typeof record.open === 'boolean' ? record.open : undefined;\n return {\n kind: 'popup_trigger',\n ...(ariaHasPopup ? { ariaHasPopup } : {}),\n ...(ariaExpanded !== undefined ? { ariaExpanded } : {}),\n ...(dataState !== undefined ? { dataState } : {}),\n ...(open !== undefined ? { open } : {}),\n };\n};\n", "import type { DriveErrorInfo } from './protocol.js';\nimport {\n popupTriggerStateChanged,\n type PopupTriggerState,\n} from './popup-trigger-state.js';\n\nexport type LocatorPoint = {\n x: number;\n y: number;\n targetState?: PopupTriggerState;\n};\n\ntype PointResult =\n | { ok: true; point: LocatorPoint }\n | { ok: false; error: DriveErrorInfo };\n\nexport const POPUP_TRIGGER_CLICK_SETTLE_MS = 50;\nexport const POPUP_TRIGGER_RECHECK_MS = 125;\n\nconst readPopupTriggerAfterClick = async (options: {\n locator: unknown;\n resolveLocatorPoint: (locator: unknown) => Promise<PointResult>;\n}): Promise<\n { ok: true; point: LocatorPoint } | { ok: false; error: DriveErrorInfo }\n> => {\n const after = await options.resolveLocatorPoint(options.locator);\n if (!after.ok) {\n if (shouldTreatPostClickReadErrorAsSuccess(after.error)) {\n return {\n ok: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Popup trigger disappeared after click.',\n retryable: false,\n details: { reason: 'popup_trigger_disappeared' },\n },\n };\n }\n return after;\n }\n return after;\n};\n\nexport const shouldTreatPostClickReadErrorAsSuccess = (\n error: DriveErrorInfo\n): boolean => {\n return (\n error.code === 'LOCATOR_NOT_FOUND' ||\n error.code === 'NOT_FOUND' ||\n (error.retryable === true &&\n (error.code === 'TIMEOUT' ||\n error.details?.reason === 'transient_tab_channel_error'))\n );\n};\n\nexport const verifyPopupTriggerClick = async (options: {\n clickCount: number;\n locator: unknown;\n point: LocatorPoint;\n prepareTarget?: () => Promise<void>;\n resolveLocatorPoint: (locator: unknown) => Promise<PointResult>;\n dispatchCdpClick: (x: number, y: number, clickCount: number) => Promise<void>;\n mapDispatchError: (error: unknown) => DriveErrorInfo;\n delayMs: (ms: number) => Promise<void>;\n settleMs?: number;\n}): Promise<{ ok: true } | { ok: false; error: DriveErrorInfo }> => {\n if (options.prepareTarget) {\n await options.prepareTarget();\n }\n\n try {\n await options.dispatchCdpClick(\n options.point.x,\n options.point.y,\n options.clickCount\n );\n } catch (error) {\n return { ok: false, error: options.mapDispatchError(error) };\n }\n\n await options.delayMs(options.settleMs ?? POPUP_TRIGGER_CLICK_SETTLE_MS);\n\n const after = await readPopupTriggerAfterClick(options);\n if (!after.ok) {\n if (after.error.details?.reason === 'popup_trigger_disappeared') {\n return { ok: true };\n }\n return after;\n }\n\n if (\n popupTriggerStateChanged(\n options.point.targetState ?? null,\n after.point.targetState ?? null\n )\n ) {\n return { ok: true };\n }\n\n if (options.clickCount === 1) {\n await options.delayMs(POPUP_TRIGGER_RECHECK_MS);\n\n const lateAfter = await readPopupTriggerAfterClick(options);\n if (!lateAfter.ok) {\n if (lateAfter.error.details?.reason === 'popup_trigger_disappeared') {\n return { ok: true };\n }\n return lateAfter;\n }\n\n if (\n popupTriggerStateChanged(\n options.point.targetState ?? null,\n lateAfter.point.targetState ?? null\n )\n ) {\n return { ok: true };\n }\n\n try {\n await options.dispatchCdpClick(\n options.point.x,\n options.point.y,\n options.clickCount\n );\n } catch (error) {\n return { ok: false, error: options.mapDispatchError(error) };\n }\n\n await options.delayMs(options.settleMs ?? POPUP_TRIGGER_CLICK_SETTLE_MS);\n\n const retryAfter = await readPopupTriggerAfterClick(options);\n if (!retryAfter.ok) {\n if (retryAfter.error.details?.reason === 'popup_trigger_disappeared') {\n return { ok: true };\n }\n return retryAfter;\n }\n\n if (\n popupTriggerStateChanged(\n options.point.targetState ?? null,\n retryAfter.point.targetState ?? null\n )\n ) {\n return { ok: true };\n }\n }\n\n return {\n ok: false,\n error: {\n code: 'FAILED_PRECONDITION',\n message:\n 'Click focused the popup trigger but did not change its open state.',\n retryable: false,\n details: {\n reason: 'click_state_unchanged',\n control: 'popup_trigger',\n aria_haspopup: options.point.targetState?.ariaHasPopup,\n aria_expanded_before: options.point.targetState?.ariaExpanded,\n aria_expanded_after: after.point.targetState?.ariaExpanded,\n data_state_before: options.point.targetState?.dataState,\n data_state_after: after.point.targetState?.dataState,\n },\n },\n };\n};\n", "const TRANSIENT_TAB_CHANNEL_ERROR_PATTERNS = [\n 'receiving end does not exist',\n 'message channel closed before a response was received',\n 'the message port closed before a response was received',\n 'extension port is moved into back/forward cache',\n] as const;\nconst CONTENT_SCRIPT_RECOVERY_ERROR_PATTERNS = [\n 'receiving end does not exist',\n] as const;\n\nconst TAB_CHANNEL_RETRY_DELAYS_MS = [120, 200, 320, 500, 750, 1000, 1200];\n\nconst normalizePathname = (pathname: string): string => {\n if (pathname.length === 0) {\n return '/';\n }\n if (pathname.length > 1 && pathname.endsWith('/')) {\n return pathname.slice(0, -1);\n }\n return pathname;\n};\n\nexport const isTransientTabChannelError = (message: unknown): boolean => {\n if (typeof message !== 'string') {\n return false;\n }\n const normalized = message.toLowerCase();\n return TRANSIENT_TAB_CHANNEL_ERROR_PATTERNS.some((pattern) =>\n normalized.includes(pattern)\n );\n};\n\nexport const canInjectContentScriptForUrl = (url: unknown): boolean => {\n if (typeof url !== 'string' || url.trim().length === 0) {\n return false;\n }\n const normalized = url.toLowerCase();\n if (\n normalized.startsWith('chrome://') ||\n normalized.startsWith('chrome-extension://') ||\n normalized.startsWith('devtools://') ||\n normalized.startsWith('edge://') ||\n normalized.startsWith('about:') ||\n normalized.startsWith('file://')\n ) {\n return false;\n }\n return normalized.startsWith('http://') || normalized.startsWith('https://');\n};\n\nexport const shouldReinjectContentScript = (\n message: unknown,\n tabUrl?: unknown\n): boolean => {\n if (typeof message !== 'string') {\n return false;\n }\n const normalized = message.toLowerCase();\n return (\n CONTENT_SCRIPT_RECOVERY_ERROR_PATTERNS.some((pattern) =>\n normalized.includes(pattern)\n ) && canInjectContentScriptForUrl(tabUrl)\n );\n};\n\ntype TabChannelError = {\n code?: unknown;\n message?: unknown;\n retryable?: unknown;\n};\n\nexport const shouldRetryTabChannelFailure = (\n action: string,\n error: TabChannelError | null | undefined\n): boolean => {\n if (!error || typeof error !== 'object') {\n return false;\n }\n if (isTransientTabChannelError(error.message)) {\n return true;\n }\n return (\n action === 'drive.wait_for' &&\n error.code === 'TIMEOUT' &&\n error.retryable === true &&\n typeof error.message === 'string' &&\n error.message.includes('Timed out waiting for content response')\n );\n};\n\nexport const getTabChannelRetryDelayMs = (\n attempt: number\n): number | undefined => {\n if (!Number.isInteger(attempt) || attempt < 1) {\n return undefined;\n }\n return TAB_CHANNEL_RETRY_DELAYS_MS[attempt - 1];\n};\n\nexport const isLikelyNavigationCommitted = (\n requestedUrl: unknown,\n tabUrl: unknown\n): boolean => {\n if (typeof requestedUrl !== 'string' || typeof tabUrl !== 'string') {\n return false;\n }\n if (requestedUrl === tabUrl) {\n return true;\n }\n try {\n const requested = new URL(requestedUrl);\n const actual = new URL(tabUrl);\n return (\n requested.origin === actual.origin &&\n normalizePathname(requested.pathname) ===\n normalizePathname(actual.pathname) &&\n requested.search === actual.search\n );\n } catch {\n return requestedUrl === tabUrl;\n }\n};\n", "export type DriveConnectionState =\n | 'connecting'\n | 'connected'\n | 'disconnected'\n | 'backoff';\n\nexport type DriveConnectionEndpoint = {\n host: string;\n port: number;\n portSource: 'default';\n};\n\nexport type DriveConnectionStatus = {\n state: DriveConnectionState;\n endpoint?: DriveConnectionEndpoint;\n ws_url?: string;\n reconnect_delay_ms?: number;\n retry_at?: string;\n last_connected_at?: string;\n last_disconnected_at?: string;\n last_error_at?: string;\n last_error_message?: string;\n consecutive_failures: number;\n};\n\nconst toIso = (ms: number): string => new Date(ms).toISOString();\n\nexport class ConnectionStateTracker {\n private state: DriveConnectionState = 'disconnected';\n private endpoint?: DriveConnectionEndpoint;\n private reconnectDelayMs?: number;\n private retryAt?: string;\n private lastConnectedAt?: string;\n private lastDisconnectedAt?: string;\n private lastErrorAt?: string;\n private lastErrorMessage?: string;\n private consecutiveFailures = 0;\n private lastFailureLogAt = 0;\n private suppressedFailureLogs = 0;\n\n constructor(\n private readonly now: () => number = Date.now,\n private readonly failureLogThrottleMs = 15000\n ) {}\n\n setEndpoint(endpoint: DriveConnectionEndpoint): void {\n this.endpoint = endpoint;\n }\n\n markConnecting(): void {\n this.state = 'connecting';\n this.reconnectDelayMs = undefined;\n this.retryAt = undefined;\n }\n\n markConnected(): void {\n this.state = 'connected';\n this.lastConnectedAt = toIso(this.now());\n this.reconnectDelayMs = undefined;\n this.retryAt = undefined;\n this.consecutiveFailures = 0;\n }\n\n markDisconnected(): void {\n this.state = 'disconnected';\n this.reconnectDelayMs = undefined;\n this.retryAt = undefined;\n this.lastDisconnectedAt = toIso(this.now());\n }\n\n markBackoff(delayMs: number): void {\n this.state = 'backoff';\n this.reconnectDelayMs = delayMs;\n this.retryAt = toIso(this.now() + Math.max(0, delayMs));\n }\n\n recordFailure(message: string): void {\n this.lastErrorAt = toIso(this.now());\n this.lastErrorMessage = message;\n this.consecutiveFailures += 1;\n }\n\n consumeFailureLogBudget(): {\n shouldLog: boolean;\n suppressedCount: number;\n } {\n const now = this.now();\n if (\n this.lastFailureLogAt === 0 ||\n now - this.lastFailureLogAt >= this.failureLogThrottleMs\n ) {\n const suppressedCount = this.suppressedFailureLogs;\n this.suppressedFailureLogs = 0;\n this.lastFailureLogAt = now;\n return { shouldLog: true, suppressedCount };\n }\n\n this.suppressedFailureLogs += 1;\n return { shouldLog: false, suppressedCount: this.suppressedFailureLogs };\n }\n\n flushSuppressedFailureLogs(): number {\n const count = this.suppressedFailureLogs;\n this.suppressedFailureLogs = 0;\n return count;\n }\n\n getStatus(): DriveConnectionStatus {\n return {\n state: this.state,\n endpoint: this.endpoint,\n ws_url: this.endpoint\n ? `ws://${this.endpoint.host}:${this.endpoint.port}/drive`\n : undefined,\n reconnect_delay_ms: this.reconnectDelayMs,\n retry_at: this.retryAt,\n last_connected_at: this.lastConnectedAt,\n last_disconnected_at: this.lastDisconnectedAt,\n last_error_at: this.lastErrorAt,\n last_error_message: this.lastErrorMessage,\n consecutive_failures: this.consecutiveFailures,\n };\n }\n}\n", "import type {\n DebuggerCommandParams,\n DebuggerRequest,\n DriveErrorInfo,\n} from './protocol.js';\nimport { readRequiredTabId } from './tab-resolution.js';\n\ntype DebuggerSessionLike = {\n attached?: boolean;\n attachPromise?: Promise<void>;\n};\n\ntype Responders = {\n respondAck: (result?: unknown) => void;\n respondError: (error: DriveErrorInfo) => void;\n};\n\ntype DebuggerDispatchDeps = {\n getSession: (tabId: number) => DebuggerSessionLike | undefined;\n ensureDebuggerAttached: (tabId: number) => Promise<DriveErrorInfo | null>;\n detachDebugger: (tabId: number) => Promise<DriveErrorInfo | null>;\n sendDebuggerCommand: (\n tabId: number,\n method: string,\n params: Record<string, unknown> | undefined,\n timeoutMs: number\n ) => Promise<unknown>;\n touchDebuggerSession: (tabId: number) => void;\n clearDebuggerSession: (tabId: number) => void;\n mapDebuggerErrorMessage: (message: string) => DriveErrorInfo;\n debuggerCommandTimeoutMs: number;\n};\n\nexport const dispatchDebuggerRequest = async (\n message: DebuggerRequest,\n deps: DebuggerDispatchDeps,\n responders: Responders\n): Promise<void> => {\n const { respondAck, respondError } = responders;\n\n try {\n switch (message.action) {\n case 'debugger.attach': {\n const parsedTabId = readRequiredTabId(\n (message.params ?? {}) as Record<string, unknown>\n );\n if (!parsedTabId.ok) {\n respondError(parsedTabId.error);\n return;\n }\n const error = await deps.ensureDebuggerAttached(parsedTabId.tabId);\n if (error) {\n respondError(error);\n return;\n }\n respondAck({ ok: true });\n return;\n }\n case 'debugger.detach': {\n const parsedTabId = readRequiredTabId(\n (message.params ?? {}) as Record<string, unknown>\n );\n if (!parsedTabId.ok) {\n respondError(parsedTabId.error);\n return;\n }\n const error = await deps.detachDebugger(parsedTabId.tabId);\n if (error) {\n respondError(error);\n return;\n }\n respondAck({ ok: true });\n return;\n }\n case 'debugger.command': {\n const params = (message.params ?? {}) as DebuggerCommandParams;\n const parsedTabId = readRequiredTabId(\n params as Record<string, unknown>\n );\n if (!parsedTabId.ok) {\n respondError(parsedTabId.error);\n return;\n }\n if (typeof params.method !== 'string' || params.method.length === 0) {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'method must be a non-empty string.',\n retryable: false,\n });\n return;\n }\n\n const session = deps.getSession(parsedTabId.tabId);\n if (session?.attachPromise) {\n try {\n await session.attachPromise;\n } catch (error) {\n const info = deps.mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Debugger attach failed.'\n );\n deps.clearDebuggerSession(parsedTabId.tabId);\n respondError(info);\n return;\n }\n }\n\n const attachedSession = deps.getSession(parsedTabId.tabId);\n if (!attachedSession?.attached) {\n respondError({\n code: 'FAILED_PRECONDITION',\n message: 'Debugger is not attached to the requested tab.',\n retryable: false,\n });\n return;\n }\n\n try {\n const result = await deps.sendDebuggerCommand(\n parsedTabId.tabId,\n params.method,\n params.params,\n deps.debuggerCommandTimeoutMs\n );\n deps.touchDebuggerSession(parsedTabId.tabId);\n respondAck(result);\n } catch (error) {\n const info = deps.mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Debugger command failed.'\n );\n respondError(info);\n }\n return;\n }\n default:\n respondError({\n code: 'NOT_IMPLEMENTED',\n message: `${message.action} not implemented in extension yet.`,\n retryable: false,\n });\n }\n } catch (error) {\n const messageText =\n error instanceof Error ? error.message : 'Unexpected debugger error.';\n respondError({\n code: 'INSPECT_UNAVAILABLE',\n message: messageText,\n retryable: false,\n });\n }\n};\n", "import type { DriveErrorInfo } from './protocol.js';\n\nexport const isCaptureVisibleTabRateLimitedMessage = (\n message: string\n): boolean => {\n const normalized = message.toLowerCase();\n const hasCaptureSignal = normalized.includes('capturevisibletab');\n const hasRateSignal =\n normalized.includes('max_capture_visible_tab_calls_per_second') ||\n normalized.includes('too often') ||\n normalized.includes('rate limit') ||\n normalized.includes('rate-limit');\n return hasCaptureSignal && hasRateSignal;\n};\n\nexport const isCaptureVisibleTabPermissionMessage = (\n message: string\n): boolean => {\n const normalized = message.toLowerCase();\n const hasCaptureSignal = normalized.includes('capturevisibletab');\n const hasPermissionSignal =\n normalized.includes('permission is required') ||\n normalized.includes('requires permission') ||\n normalized.includes('requires either');\n const hasPermissionTarget =\n normalized.includes('all_urls') || normalized.includes('activetab');\n return hasCaptureSignal && hasPermissionSignal && hasPermissionTarget;\n};\n\nexport const isCaptureVisibleTabRateLimitedError = (error: unknown): boolean =>\n error instanceof Error &&\n isCaptureVisibleTabRateLimitedMessage(error.message);\n\nexport const isCaptureVisibleTabPermissionError = (error: unknown): boolean =>\n error instanceof Error && isCaptureVisibleTabPermissionMessage(error.message);\n\nexport const mapScreenshotCaptureError = (\n error: unknown,\n fallbackMessage: string\n): DriveErrorInfo => {\n const message =\n error instanceof Error && error.message ? error.message : fallbackMessage;\n\n if (isCaptureVisibleTabRateLimitedError(error)) {\n return {\n code: 'RATE_LIMITED',\n message:\n 'Screenshot capture hit Chrome capture rate limits. Please retry shortly.',\n retryable: true,\n details: {\n reason: 'capture_visible_tab_rate_limited',\n original_message: message,\n },\n };\n }\n\n if (isCaptureVisibleTabPermissionError(error)) {\n return {\n code: 'PERMISSION_REQUIRED',\n message:\n 'Screenshot capture requires captureVisibleTab permission (<all_urls> or activeTab).',\n retryable: false,\n details: {\n reason: 'capture_visible_tab_permission_required',\n required_any_of: ['<all_urls>', 'activeTab'],\n next_step:\n 'Reload the Browser Bridge extension in chrome://extensions and retry screenshot capture.',\n original_message: message,\n },\n };\n }\n\n return {\n code: 'ARTIFACT_IO_ERROR',\n message,\n retryable: false,\n };\n};\n", "export type CoreEndpointConfig = {\n host: string;\n port: number;\n portSource: 'default';\n};\n\ntype LocalStorageArea = {\n get(keys: string[], callback: (items: Record<string, unknown>) => void): void;\n remove(keys: string[], callback?: () => void): void;\n};\n\nexport const DEFAULT_CORE_HOST = '127.0.0.1';\nexport const DEFAULT_CORE_PORT = 3210;\nexport const LEGACY_CORE_PORT_KEY = 'corePort';\n\nconst hasOwn = (value: Record<string, unknown>, key: string): boolean =>\n Object.prototype.hasOwnProperty.call(value, key);\n\nexport const readCoreEndpointConfig =\n async (): Promise<CoreEndpointConfig> => ({\n host: DEFAULT_CORE_HOST,\n port: DEFAULT_CORE_PORT,\n portSource: 'default',\n });\n\nexport const clearLegacyCorePort = async (\n storage: LocalStorageArea\n): Promise<boolean> => {\n return await new Promise<boolean>((resolve) => {\n storage.get([LEGACY_CORE_PORT_KEY], (items) => {\n if (!hasOwn(items, LEGACY_CORE_PORT_KEY)) {\n resolve(false);\n return;\n }\n storage.remove([LEGACY_CORE_PORT_KEY], () => resolve(true));\n });\n });\n};\n", "import type { DriveErrorInfo, DriveOpResult } from './protocol.js';\n\ntype ResolveTabActivationOutcomeInput = {\n tabId: number;\n windowId?: number;\n activated: boolean;\n focusErrorMessage?: string;\n windowFocused?: boolean;\n};\n\nexport type TabActivationOutcome =\n | { ok: true; result: DriveOpResult }\n | { ok: false; error: DriveErrorInfo };\n\nexport const resolveTabActivationOutcome = ({\n tabId,\n windowId,\n activated,\n focusErrorMessage,\n windowFocused,\n}: ResolveTabActivationOutcomeInput): TabActivationOutcome => {\n if (!activated) {\n return {\n ok: false,\n error: {\n code: 'FAILED_PRECONDITION',\n message: `Failed to activate tab_id ${tabId}.`,\n retryable: true,\n details: { tab_id: tabId },\n },\n };\n }\n\n const warnings: string[] = [];\n if (typeof windowId === 'number') {\n if (focusErrorMessage) {\n warnings.push(\n `Activated tab_id ${tabId}, but failed to focus window_id ${windowId}: ${focusErrorMessage}`\n );\n } else if (windowFocused === false) {\n warnings.push(\n `Activated tab_id ${tabId}, but window_id ${windowId} did not report focused state.`\n );\n }\n }\n\n return {\n ok: true,\n result: {\n ok: true,\n ...(warnings.length > 0 ? { warnings } : {}),\n },\n };\n};\n", "import type {\n DebuggerEvent,\n DebuggerRequest,\n DriveRequest,\n DriveErrorInfo,\n DriveEvent,\n DriveHelloParams,\n DriveTabInfo,\n DriveTabListResult,\n ExtensionMessage,\n ExtensionRequest,\n PermissionsRequest,\n} from './protocol.js';\nimport { DRIVE_WS_PROTOCOL_VERSION } from '@btraut/browser-bridge-shared/dist/contract-version';\nimport { sanitizeDriveErrorInfo } from './error-sanitizer.js';\nimport { PermissionPromptController } from './permission-prompt.js';\nimport { PermissionsRequestController } from './permissions-request.js';\nimport { gateDriveAction } from './action-permissions.js';\nimport {\n verifyPopupTriggerClick,\n type LocatorPoint,\n} from './popup-click-verification.js';\nimport { coercePopupTriggerState } from './popup-trigger-state.js';\nimport {\n canInjectContentScriptForUrl,\n getTabChannelRetryDelayMs,\n isLikelyNavigationCommitted,\n isTransientTabChannelError,\n shouldReinjectContentScript,\n shouldRetryTabChannelFailure,\n} from './drive-reliability.js';\nimport {\n getAllowlistedSites,\n readSitePermissionsMode,\n touchSiteLastUsed,\n writeDebuggerCapabilityEnabled,\n} from './site-permissions.js';\nimport { ConnectionStateTracker } from './connection-state.js';\nimport { dispatchDebuggerRequest } from './debugger-dispatch.js';\nimport {\n isCaptureVisibleTabRateLimitedError,\n mapScreenshotCaptureError,\n} from './screenshot-errors.js';\nimport { buildRestrictedUrlError, isRestrictedUrl } from './restricted-url.js';\nimport {\n clearLegacyCorePort,\n LEGACY_CORE_PORT_KEY,\n readCoreEndpointConfig,\n type CoreEndpointConfig,\n} from './core-endpoint-config.js';\nimport { resolveTabActivationOutcome } from './tab-activation.js';\nimport {\n readRequiredTabId,\n requireTab,\n resolveOptionalTabId,\n} from './tab-resolution.js';\n\ntype ContentResult =\n | { ok: true; result?: unknown }\n | { ok: false; error: DriveErrorInfo };\n\ntype ContentRequest = {\n action: string;\n params?: Record<string, unknown>;\n};\n\ntype DebuggerTarget = {\n tabId?: number;\n};\n\ntype DebuggerSession = {\n attached: boolean;\n attachPromise?: Promise<void>;\n idleTimer?: number;\n lastActivityAt: string;\n initialized?: boolean;\n};\n\ntype ScreenPoint = {\n x: number;\n y: number;\n};\n\ntype LocatorPointResult = ScreenPoint & {\n targetState?: LocatorPoint['targetState'];\n};\n\ntype StorageChange = {\n newValue?: unknown;\n oldValue?: unknown;\n};\n\nconst CORE_WS_PATH = '/drive';\nconst CORE_HEALTH_PATH = '/health';\nconst CORE_HEALTH_TIMEOUT_MS = 1200;\n\nconst DEBUGGER_PROTOCOL_VERSION = '1.3';\nconst DEBUGGER_IDLE_TIMEOUT_KEY = 'debuggerIdleTimeoutMs';\nconst DEFAULT_DEBUGGER_IDLE_TIMEOUT_MS = 15000;\nconst DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS = 10000;\nconst DEFAULT_SEND_TO_TAB_TIMEOUT_MS = 10000;\nconst HISTORY_DISPATCH_TIMEOUT_MS = 2000;\nconst HISTORY_NAVIGATION_SIGNAL_TIMEOUT_MS = 8000;\nconst HISTORY_POST_NAV_DOM_GRACE_TIMEOUT_MS = 2000;\n\nconst AGENT_TAB_ID_KEY = 'agentTabId';\nconst AGENT_TAB_GROUP_TITLE = 'Browser Bridge';\nconst AGENT_TAB_BOOTSTRAP_PATH = 'agent-tab.html';\nconst AGENT_TAB_FAVICON_ASSET_PATH = 'assets/icons/icon-32.png';\nconst AGENT_TAB_BRANDING_ACTION = 'drive.agent_tab_branding';\nconst AGENT_TAB_GROUP_RETRY_DELAYS_MS = [0, 120, 300] as const;\nconst AGENT_TAB_BRANDING_TIMEOUT_MS = 1500;\n\nconst BASE_NEGOTIATED_CAPABILITIES: Record<string, boolean> = Object.freeze({\n 'drive.navigate': true,\n 'drive.go_back': true,\n 'drive.go_forward': true,\n 'drive.click': true,\n 'drive.hover': true,\n 'drive.select': true,\n 'drive.type': true,\n 'drive.fill_form': true,\n 'drive.drag': true,\n 'drive.handle_dialog': true,\n 'drive.key': true,\n 'drive.key_press': true,\n 'drive.scroll': true,\n 'drive.screenshot': true,\n 'drive.wait_for': true,\n 'drive.tab_list': true,\n 'drive.tab_activate': true,\n 'drive.tab_close': true,\n 'drive.set_debugger_capability': true,\n 'drive.ping': true,\n 'permissions.list': true,\n 'permissions.get_mode': true,\n 'permissions.list_pending_requests': true,\n 'permissions.request_allow_site': true,\n 'permissions.request_revoke_site': true,\n 'permissions.request_set_mode': true,\n});\n\nconst DEBUGGER_CAPABILITY_ACTIONS = [\n 'debugger.attach',\n 'debugger.detach',\n 'debugger.command',\n] as const;\n\nconst buildNegotiatedCapabilities = (): Record<string, boolean> => {\n const capabilities: Record<string, boolean> = {\n ...BASE_NEGOTIATED_CAPABILITIES,\n };\n for (const action of DEBUGGER_CAPABILITY_ACTIONS) {\n capabilities[action] = true;\n }\n return capabilities;\n};\n\nconst getAgentTabBootstrapUrl = (): string => {\n return typeof chrome.runtime?.getURL === 'function'\n ? chrome.runtime.getURL(AGENT_TAB_BOOTSTRAP_PATH)\n : AGENT_TAB_BOOTSTRAP_PATH;\n};\n\nconst getAgentTabFaviconUrl = (): string => {\n return typeof chrome.runtime?.getURL === 'function'\n ? chrome.runtime.getURL(AGENT_TAB_FAVICON_ASSET_PATH)\n : AGENT_TAB_FAVICON_ASSET_PATH;\n};\n\nconst nowIso = (): string => new Date().toISOString();\n\nconst makeEventId = (() => {\n let counter = 0;\n return () => `evt-${Date.now()}-${(counter += 1)}`;\n})();\n\nconst lastActiveAtByTab = new Map<number, string>();\n\n// When callers omit tab_id, we avoid taking over the user's active tab by\n// creating (and reusing) a dedicated \"agent\" window/tab.\nlet agentTabId: number | null = null;\n\nconst ensureLastActiveAt = (tabId: number): string => {\n const existing = lastActiveAtByTab.get(tabId);\n if (existing) {\n return existing;\n }\n const timestamp = nowIso();\n lastActiveAtByTab.set(tabId, timestamp);\n return timestamp;\n};\n\nconst markTabActive = (tabId: number): string => {\n const timestamp = nowIso();\n lastActiveAtByTab.set(tabId, timestamp);\n return timestamp;\n};\n\nconst wrapChromeCallback = <T>(\n invoker: (callback: (value: T) => void) => void\n): Promise<T> =>\n new Promise<T>((resolve, reject) => {\n invoker((value: T) => {\n const error = chrome.runtime.lastError;\n if (error) {\n reject(new Error(error.message));\n return;\n }\n resolve(value);\n });\n });\n\nconst wrapChromeVoid = (\n invoker: (callback: () => void) => void\n): Promise<void> => {\n return new Promise<void>((resolve, reject) => {\n invoker(() => {\n const error = chrome.runtime.lastError;\n if (error) {\n reject(new Error(error.message));\n return;\n }\n resolve();\n });\n });\n};\n\nconst delayMs = async (ms: number): Promise<void> => {\n if (!Number.isFinite(ms) || ms <= 0) {\n return;\n }\n await new Promise<void>((resolve) => {\n self.setTimeout(resolve, ms);\n });\n};\n\nconst ensureTabContentScript = async (tabId: number): Promise<boolean> => {\n try {\n const tab = await getTab(tabId);\n const url = typeof tab.url === 'string' ? tab.url : undefined;\n if (!canInjectContentScriptForUrl(url)) {\n return false;\n }\n await wrapChromeVoid((callback) =>\n chrome.scripting.executeScript(\n {\n target: { tabId },\n files: ['dist/content.js'],\n },\n () => callback()\n )\n );\n return true;\n } catch (error) {\n console.debug('Failed to re-inject content script.', { tabId, error });\n return false;\n }\n};\n\nconst CAPTURE_VISIBLE_TAB_MIN_INTERVAL_MS = 400;\nconst CAPTURE_VISIBLE_TAB_MAX_RETRIES = 3;\nconst CAPTURE_VISIBLE_TAB_RETRY_BASE_DELAY_MS = 500;\n\nlet captureVisibleTabQueue: Promise<void> = Promise.resolve();\nlet captureVisibleTabLastCallAt = 0;\n\nconst randomJitterMs = (maxMs: number): number => {\n return Math.floor(Math.random() * Math.max(1, maxMs));\n};\n\nconst runCaptureVisibleTabOperation = async <T>(\n operation: () => Promise<T>\n): Promise<T> => {\n const previous = captureVisibleTabQueue;\n let releaseQueue: (() => void) | undefined;\n captureVisibleTabQueue = new Promise<void>((resolve) => {\n releaseQueue = resolve;\n });\n\n await previous.catch(() => undefined);\n try {\n return await operation();\n } finally {\n releaseQueue?.();\n }\n};\n\nconst captureVisibleTabWithThrottle = async (\n windowId: number\n): Promise<string> => {\n return await runCaptureVisibleTabOperation(async () => {\n for (\n let attempt = 0;\n attempt <= CAPTURE_VISIBLE_TAB_MAX_RETRIES;\n attempt += 1\n ) {\n const waitMs =\n captureVisibleTabLastCallAt +\n CAPTURE_VISIBLE_TAB_MIN_INTERVAL_MS -\n Date.now();\n if (waitMs > 0) {\n await delayMs(waitMs);\n }\n\n try {\n const dataUrl = await wrapChromeCallback<string>((callback) =>\n chrome.tabs.captureVisibleTab(windowId, { format: 'png' }, callback)\n );\n captureVisibleTabLastCallAt = Date.now();\n return dataUrl;\n } catch (error) {\n captureVisibleTabLastCallAt = Date.now();\n if (\n !isCaptureVisibleTabRateLimitedError(error) ||\n attempt >= CAPTURE_VISIBLE_TAB_MAX_RETRIES\n ) {\n throw error;\n }\n\n const backoffMs =\n CAPTURE_VISIBLE_TAB_RETRY_BASE_DELAY_MS * (attempt + 1) +\n randomJitterMs(120);\n await delayMs(backoffMs);\n }\n }\n throw new Error('captureVisibleTab failed unexpectedly.');\n });\n};\n\nconst parseDataUrl = (\n dataUrl: string\n): { mime: string; base64: string } | null => {\n const match = /^data:([^;]+);base64,(.*)$/s.exec(dataUrl);\n if (!match) {\n return null;\n }\n return { mime: match[1] ?? 'application/octet-stream', base64: match[2] };\n};\n\nconst arrayBufferToBase64 = (buffer: ArrayBuffer): string => {\n const bytes = new Uint8Array(buffer);\n const chunkSize = 0x8000;\n let binary = '';\n for (let i = 0; i < bytes.length; i += chunkSize) {\n const chunk = bytes.subarray(i, i + chunkSize);\n binary += String.fromCharCode(...chunk);\n }\n return btoa(binary);\n};\n\nconst renderDataUrlToFormat = async (\n dataUrl: string,\n format: 'png' | 'jpeg' | 'webp',\n quality?: number\n): Promise<{\n mime: string;\n data_base64: string;\n width_px: number;\n height_px: number;\n}> => {\n const parsed = parseDataUrl(dataUrl);\n if (!parsed) {\n throw new Error('Invalid screenshot data URL.');\n }\n\n const blob = await (await fetch(dataUrl)).blob();\n const bitmap = await createImageBitmap(blob);\n try {\n const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Canvas context unavailable.');\n }\n ctx.drawImage(bitmap, 0, 0);\n\n const mime =\n format === 'jpeg'\n ? 'image/jpeg'\n : format === 'webp'\n ? 'image/webp'\n : 'image/png';\n const q =\n typeof quality === 'number' && Number.isFinite(quality)\n ? Math.max(0, Math.min(1, quality / 100))\n : undefined;\n const out =\n format === 'png'\n ? await canvas.convertToBlob({ type: mime })\n : await canvas.convertToBlob({ type: mime, quality: q });\n const base64 = arrayBufferToBase64(await out.arrayBuffer());\n\n return {\n mime,\n data_base64: base64,\n width_px: bitmap.width,\n height_px: bitmap.height,\n };\n } finally {\n bitmap.close();\n }\n};\n\nconst readDebuggerIdleTimeoutMs = async (): Promise<number> => {\n return await new Promise<number>((resolve) => {\n chrome.storage.local.get(\n [DEBUGGER_IDLE_TIMEOUT_KEY],\n (result: Record<string, unknown>) => {\n const raw = result?.[DEBUGGER_IDLE_TIMEOUT_KEY];\n if (typeof raw === 'number' && Number.isFinite(raw) && raw > 0) {\n resolve(raw);\n return;\n }\n if (typeof raw === 'string') {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed > 0) {\n resolve(parsed);\n return;\n }\n }\n resolve(DEFAULT_DEBUGGER_IDLE_TIMEOUT_MS);\n }\n );\n });\n};\n\nconst mapDebuggerErrorMessage = (\n message: string,\n fallbackCode = 'INSPECT_UNAVAILABLE'\n): DriveErrorInfo => {\n const normalized = message.toLowerCase();\n if (\n normalized.includes('already attached') ||\n normalized.includes('another debugger') ||\n normalized.includes('attached to this target')\n ) {\n return {\n code: 'DEBUGGER_IN_USE',\n message:\n 'Debugger already attached. Close DevTools on the target tab and retry.',\n retryable: true,\n details: {\n reason: 'debugger_in_use',\n hint: 'Close DevTools on the target tab and retry.',\n original_message: message,\n },\n };\n }\n if (\n normalized.includes('no tab') ||\n normalized.includes('no target') ||\n normalized.includes('tab id')\n ) {\n return {\n code: 'TAB_NOT_FOUND',\n message,\n retryable: false,\n };\n }\n if (\n normalized.includes('not allowed') ||\n normalized.includes('permission') ||\n normalized.includes('denied')\n ) {\n return {\n code: 'ATTACH_DENIED',\n message,\n retryable: false,\n };\n }\n if (\n normalized.includes('cannot access') ||\n normalized.includes('not supported') ||\n normalized.includes('disallowed')\n ) {\n return {\n code: 'NOT_SUPPORTED',\n message,\n retryable: false,\n };\n }\n return {\n code: fallbackCode,\n message,\n retryable: false,\n };\n};\n\nconst buildTabInfo = (tab: Record<string, unknown>): DriveTabInfo | null => {\n const tabId = tab.id;\n const windowId = tab.windowId;\n if (typeof tabId !== 'number' || typeof windowId !== 'number') {\n return null;\n }\n return {\n tab_id: tabId,\n window_id: windowId,\n url: typeof tab.url === 'string' ? tab.url : undefined,\n title: typeof tab.title === 'string' ? tab.title : undefined,\n active: typeof tab.active === 'boolean' ? tab.active : undefined,\n last_active_at: ensureLastActiveAt(tabId),\n };\n};\n\nconst tabRecencyScore = (tab: DriveTabInfo): number => {\n const parsed = Date.parse(tab.last_active_at);\n return Number.isFinite(parsed) ? parsed : -Infinity;\n};\n\nconst compareTabsForReport = (a: DriveTabInfo, b: DriveTabInfo): number => {\n const aActive = a.active === true ? 1 : 0;\n const bActive = b.active === true ? 1 : 0;\n if (aActive !== bActive) {\n return bActive - aActive;\n }\n const recencyDelta = tabRecencyScore(b) - tabRecencyScore(a);\n if (recencyDelta !== 0) {\n return recencyDelta;\n }\n if (a.window_id !== b.window_id) {\n return a.window_id - b.window_id;\n }\n return a.tab_id - b.tab_id;\n};\n\nconst queryTabs = async (): Promise<DriveTabInfo[]> => {\n const tabs = await wrapChromeCallback<Record<string, unknown>[]>((callback) =>\n chrome.tabs.query({}, callback)\n );\n const result: DriveTabInfo[] = [];\n for (const tab of tabs) {\n const info = buildTabInfo(tab);\n if (info) {\n result.push(info);\n }\n }\n result.sort(compareTabsForReport);\n return result;\n};\n\nconst getTab = async (tabId: number): Promise<Record<string, unknown>> => {\n return await wrapChromeCallback<Record<string, unknown>>((callback) =>\n chrome.tabs.get(tabId, callback)\n );\n};\n\nconst getWindow = async (\n windowId: number\n): Promise<Record<string, unknown>> => {\n return await wrapChromeCallback<Record<string, unknown>>((callback) =>\n chrome.windows.get(windowId, callback)\n );\n};\n\nconst withResolvedTabTarget = async (\n tabId: number,\n result: unknown\n): Promise<Record<string, unknown>> => {\n const payload =\n result && typeof result === 'object' && !Array.isArray(result)\n ? { ...(result as Record<string, unknown>) }\n : {};\n const tab = await getTab(tabId).catch(() => undefined);\n const windowId =\n tab && typeof tab.windowId === 'number' ? tab.windowId : undefined;\n return {\n ...payload,\n tab_id: tabId,\n ...(typeof windowId === 'number' ? { window_id: windowId } : {}),\n };\n};\n\nconst getActiveTabId = async (): Promise<number> => {\n const tabs = await wrapChromeCallback<Record<string, unknown>[]>((callback) =>\n chrome.tabs.query({ active: true, lastFocusedWindow: true }, callback)\n );\n const first = tabs[0];\n if (first && typeof first.id === 'number') {\n return first.id;\n }\n throw new Error('No active tab found.');\n};\n\nconst clearAgentTarget = (): void => {\n agentTabId = null;\n // Best-effort; the service worker may be shutting down.\n void writeAgentTabId(null);\n};\n\nconst queryActiveTabIdInWindow = async (windowId: number): Promise<number> => {\n const tabs = await wrapChromeCallback<Record<string, unknown>[]>((callback) =>\n chrome.tabs.query({ active: true, windowId }, callback)\n );\n const first = tabs[0];\n if (first && typeof first.id === 'number') {\n return first.id;\n }\n\n const anyTabs = await wrapChromeCallback<Record<string, unknown>[]>(\n (callback) => chrome.tabs.query({ windowId }, callback)\n );\n const fallback = anyTabs[0];\n if (fallback && typeof fallback.id === 'number') {\n return fallback.id;\n }\n\n throw new Error('No tab found for window.');\n};\n\nconst ensureAgentTabGroup = async (\n tabId: number,\n windowId: number\n): Promise<void> => {\n if (typeof chrome.tabs?.group !== 'function') {\n return;\n }\n if (!chrome.tabGroups || typeof chrome.tabGroups.update !== 'function') {\n return;\n }\n\n let lastError: unknown;\n for (const retryDelayMs of AGENT_TAB_GROUP_RETRY_DELAYS_MS) {\n if (retryDelayMs > 0) {\n await delayMs(retryDelayMs);\n }\n try {\n const groupId = await wrapChromeCallback<number>((callback) =>\n chrome.tabs.group(\n { tabIds: tabId, createProperties: { windowId } },\n callback\n )\n );\n await wrapChromeVoid((callback) =>\n chrome.tabGroups.update(groupId, { title: AGENT_TAB_GROUP_TITLE }, () =>\n callback()\n )\n );\n return;\n } catch (error) {\n lastError = error;\n }\n }\n console.debug('Failed to create/update agent tab group.', lastError);\n};\n\nconst ensureAgentTabGroupForTab = async (\n tabId: number,\n tab: Record<string, unknown>\n): Promise<void> => {\n const windowId = tab.windowId;\n if (typeof windowId !== 'number') {\n return;\n }\n await ensureAgentTabGroup(tabId, windowId);\n};\n\nconst createAgentWindow = async (): Promise<number> => {\n const created = await wrapChromeCallback<Record<string, unknown>>(\n (callback) =>\n chrome.windows.create(\n { url: getAgentTabBootstrapUrl(), focused: true },\n callback\n )\n );\n const windowId = created.id;\n if (typeof windowId !== 'number') {\n throw new Error('Failed to create agent window.');\n }\n const tabId = await queryActiveTabIdInWindow(windowId);\n await ensureAgentTabGroup(tabId, windowId);\n return tabId;\n};\n\nconst readAgentTabId = async (): Promise<number | null> => {\n return await new Promise<number | null>((resolve) => {\n chrome.storage.local.get(\n [AGENT_TAB_ID_KEY],\n (result: Record<string, unknown>) => {\n const raw = result?.[AGENT_TAB_ID_KEY];\n resolve(typeof raw === 'number' && Number.isFinite(raw) ? raw : null);\n }\n );\n });\n};\n\nconst writeAgentTabId = async (tabId: number | null): Promise<void> => {\n await new Promise<void>((resolve, reject) => {\n const done = () => {\n const error = chrome.runtime.lastError;\n if (error) {\n reject(new Error(error.message));\n return;\n }\n resolve();\n };\n\n if (tabId === null) {\n chrome.storage.local.remove([AGENT_TAB_ID_KEY], done);\n return;\n }\n\n chrome.storage.local.set({ [AGENT_TAB_ID_KEY]: tabId }, done);\n }).catch((error) => {\n console.debug('Failed to persist agentTabId.', error);\n });\n};\n\nconst getOrCreateAgentTabId = async (): Promise<number> => {\n if (agentTabId !== null) {\n try {\n const tab = await getTab(agentTabId);\n const url = tab.url;\n if (typeof url === 'string' && isRestrictedUrl(url)) {\n throw new Error(`Agent tab points at restricted URL: ${url}`);\n }\n await ensureAgentTabGroupForTab(agentTabId, tab);\n void refreshAgentTabBranding(agentTabId);\n return agentTabId;\n } catch {\n clearAgentTarget();\n }\n }\n\n const stored = await readAgentTabId();\n if (stored !== null) {\n try {\n const tab = await getTab(stored);\n const url = tab.url;\n if (typeof url === 'string' && isRestrictedUrl(url)) {\n throw new Error(`Stored agent tab points at restricted URL: ${url}`);\n }\n agentTabId = stored;\n ensureLastActiveAt(stored);\n markTabActive(stored);\n await ensureAgentTabGroupForTab(stored, tab);\n void refreshAgentTabBranding(stored);\n return stored;\n } catch {\n await writeAgentTabId(null);\n }\n }\n\n const tabId = await createAgentWindow();\n agentTabId = tabId;\n ensureLastActiveAt(tabId);\n markTabActive(tabId);\n await writeAgentTabId(tabId);\n return tabId;\n};\n\nconst getDefaultTabId = async (): Promise<number> => {\n try {\n return await getOrCreateAgentTabId();\n } catch (error) {\n console.warn(\n 'Failed to create agent window/tab; falling back to active tab.',\n error\n );\n return await getActiveTabId();\n }\n};\n\nconst sendToTab = async (\n tabId: number,\n action: string,\n params?: Record<string, unknown>,\n options?: { timeoutMs?: number }\n): Promise<ContentResult> => {\n const timeoutMs =\n typeof options?.timeoutMs === 'number' && Number.isFinite(options.timeoutMs)\n ? Math.max(1, Math.floor(options.timeoutMs))\n : DEFAULT_SEND_TO_TAB_TIMEOUT_MS;\n\n const attemptSend = async (): Promise<ContentResult> => {\n return await new Promise<ContentResult>((resolve) => {\n const message: ContentRequest = { action, params };\n let settled = false;\n const finish = (result: ContentResult) => {\n if (settled) {\n return;\n }\n settled = true;\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n resolve(result);\n };\n let timeout: number | undefined;\n timeout = self.setTimeout(() => {\n finish({\n ok: false,\n error: {\n code: 'TIMEOUT',\n message: `Timed out waiting for content response after ${timeoutMs}ms.`,\n retryable: true,\n details: {\n action,\n tab_id: tabId,\n timeout_ms: timeoutMs,\n },\n },\n });\n }, timeoutMs);\n chrome.tabs.sendMessage(tabId, message, (response: ContentResult) => {\n const error = chrome.runtime.lastError;\n if (error) {\n const retryable = isTransientTabChannelError(error.message);\n finish({\n ok: false,\n error: {\n code: 'EVALUATION_FAILED',\n message: error.message,\n retryable,\n ...(retryable\n ? {\n details: {\n reason: 'transient_tab_channel_error',\n },\n }\n : {}),\n },\n });\n return;\n }\n if (!response || typeof response !== 'object') {\n finish({\n ok: false,\n error: {\n code: 'EVALUATION_FAILED',\n message: 'Empty response from content script.',\n retryable: false,\n },\n });\n return;\n }\n finish(response);\n });\n });\n };\n\n // After navigation, MV3 message channels can close briefly while the content\n // script reattaches (for example, BFCache/page lifecycle transitions).\n let attemptedContentRecovery = false;\n for (let attempt = 1; ; attempt += 1) {\n const result = await attemptSend();\n if (result.ok) {\n return result;\n }\n if (\n !attemptedContentRecovery &&\n shouldReinjectContentScript(\n result.error.message,\n (await getTab(tabId).catch(() => undefined))?.url\n )\n ) {\n attemptedContentRecovery = await ensureTabContentScript(tabId);\n }\n if (!shouldRetryTabChannelFailure(action, result.error)) {\n return result;\n }\n const retryDelayMs = getTabChannelRetryDelayMs(attempt);\n if (retryDelayMs === undefined) {\n return result;\n }\n await delayMs(retryDelayMs);\n }\n};\n\nconst refreshAgentTabBranding = async (tabId: number): Promise<void> => {\n const result = await sendToTab(\n tabId,\n AGENT_TAB_BRANDING_ACTION,\n { favicon_url: getAgentTabFaviconUrl() },\n { timeoutMs: AGENT_TAB_BRANDING_TIMEOUT_MS }\n );\n if (!result.ok) {\n return;\n }\n};\n\nconst waitForHistoryNavigationSignal = async (\n tabId: number,\n timeoutMs: number\n): Promise<void> => {\n return await new Promise<void>((resolve, reject) => {\n let timeout: number | undefined;\n const cleanup = () => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n chrome.webNavigation.onCommitted.removeListener(onCommitted);\n chrome.webNavigation.onHistoryStateUpdated.removeListener(\n onHistoryStateUpdated\n );\n chrome.webNavigation.onReferenceFragmentUpdated.removeListener(\n onReferenceFragmentUpdated\n );\n chrome.tabs.onUpdated.removeListener(onTabUpdated);\n };\n\n const resolveSignal = () => {\n cleanup();\n resolve();\n };\n\n const onCommitted = (details: { tabId: number; frameId: number }) => {\n if (details.tabId !== tabId || details.frameId !== 0) {\n return;\n }\n resolveSignal();\n };\n\n const onHistoryStateUpdated = (details: {\n tabId: number;\n frameId: number;\n }) => {\n if (details.tabId !== tabId || details.frameId !== 0) {\n return;\n }\n resolveSignal();\n };\n\n const onReferenceFragmentUpdated = (details: {\n tabId: number;\n frameId: number;\n }) => {\n if (details.tabId !== tabId || details.frameId !== 0) {\n return;\n }\n resolveSignal();\n };\n\n const onTabUpdated = (\n updatedTabId: number,\n changeInfo: Record<string, unknown>\n ) => {\n if (updatedTabId !== tabId) {\n return;\n }\n if (typeof changeInfo.url !== 'string' || changeInfo.url.length === 0) {\n return;\n }\n resolveSignal();\n };\n\n chrome.webNavigation.onCommitted.addListener(onCommitted);\n chrome.webNavigation.onHistoryStateUpdated.addListener(\n onHistoryStateUpdated\n );\n chrome.webNavigation.onReferenceFragmentUpdated.addListener(\n onReferenceFragmentUpdated\n );\n chrome.tabs.onUpdated.addListener(onTabUpdated);\n timeout = self.setTimeout(() => {\n cleanup();\n reject(new Error('Timed out waiting for history navigation signal.'));\n }, timeoutMs);\n });\n};\n\nconst waitForDomContentLoaded = async (\n tabId: number,\n timeoutMs: number\n): Promise<void> => {\n return await new Promise<void>((resolve, reject) => {\n let timeout: number | undefined;\n const cleanup = () => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n chrome.webNavigation.onDOMContentLoaded.removeListener(listener);\n };\n\n const listener = (details: { tabId: number; frameId: number }) => {\n if (details.tabId !== tabId || details.frameId !== 0) {\n return;\n }\n cleanup();\n resolve();\n };\n\n chrome.webNavigation.onDOMContentLoaded.addListener(listener);\n timeout = self.setTimeout(() => {\n cleanup();\n reject(new Error('Timed out waiting for domcontentloaded.'));\n }, timeoutMs);\n });\n};\n\nconst getWsEndpoint = async (): Promise<{\n endpoint: CoreEndpointConfig;\n url: string;\n}> => {\n const endpoint = await readCoreEndpointConfig();\n return {\n endpoint,\n url: `ws://${endpoint.host}:${endpoint.port}${CORE_WS_PATH}`,\n };\n};\n\nconst getHealthEndpoint = (endpoint: CoreEndpointConfig): string =>\n `http://${endpoint.host}:${endpoint.port}${CORE_HEALTH_PATH}`;\n\nclass DriveSocket {\n private socket: WebSocket | null = null;\n private reconnectTimer: number | null = null;\n private reconnectDelayMs = 1000;\n private readonly maxReconnectDelayMs = 10000;\n private keepAliveTimer: number | null = null;\n private readonly keepAliveIntervalMs = 30000;\n private readonly debuggerSessions = new Map<number, DebuggerSession>();\n private debuggerIdleTimeoutMs: number | null = null;\n private readonly connection = new ConnectionStateTracker();\n\n start(): void {\n this.connection.markConnecting();\n void this.connect().catch((error) => {\n this.recordConnectionFailure('initial connect', error);\n });\n }\n\n stop(): void {\n if (this.reconnectTimer !== null) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.stopKeepAlive();\n if (this.socket) {\n this.socket.close();\n this.socket = null;\n }\n this.connection.markDisconnected();\n }\n\n sendTabReport(): void {\n void this.emitTabReport().catch((error) => {\n console.error('DriveSocket emitTabReport failed:', error);\n });\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer !== null) {\n return;\n }\n const delay = this.reconnectDelayMs;\n this.connection.markBackoff(delay);\n this.reconnectTimer = self.setTimeout(() => {\n this.reconnectTimer = null;\n this.connection.markConnecting();\n void this.connect().catch((error) => {\n this.recordConnectionFailure('reconnect', error);\n });\n }, delay);\n this.reconnectDelayMs = Math.min(\n this.maxReconnectDelayMs,\n this.reconnectDelayMs * 2\n );\n }\n\n private async connect(): Promise<void> {\n const { endpoint, url } = await getWsEndpoint();\n this.connection.setEndpoint(endpoint);\n const health = await this.checkCoreHealth(endpoint);\n if (!health.ok) {\n this.connection.markDisconnected();\n this.recordConnectionFailure(\n 'core unavailable',\n new Error(health.detail)\n );\n this.scheduleReconnect();\n return;\n }\n try {\n const socket = new WebSocket(url);\n this.socket = socket;\n\n socket.addEventListener('open', () => {\n this.reconnectDelayMs = 1000;\n this.connection.markConnected();\n const suppressed = this.connection.flushSuppressedFailureLogs();\n if (suppressed > 0) {\n console.info(\n `DriveSocket reconnected after suppressing ${suppressed} repeated connection failures.`\n );\n }\n this.startKeepAlive();\n void this.sendHello().catch((error) => {\n console.error('DriveSocket hello failed:', error);\n });\n });\n\n socket.addEventListener('message', (event) => {\n this.handleMessage(event.data);\n });\n\n socket.addEventListener('close', () => {\n this.handleSocketUnavailable(socket, 'socket closed');\n });\n\n socket.addEventListener('error', () => {\n this.handleSocketUnavailable(socket, 'socket error');\n });\n } catch (error) {\n this.recordConnectionFailure('connect', error);\n this.connection.markDisconnected();\n this.scheduleReconnect();\n }\n }\n\n private async checkCoreHealth(endpoint: CoreEndpointConfig): Promise<{\n ok: boolean;\n detail: string;\n }> {\n const controller = new AbortController();\n const timeoutId = self.setTimeout(() => {\n controller.abort();\n }, CORE_HEALTH_TIMEOUT_MS);\n try {\n const response = await fetch(getHealthEndpoint(endpoint), {\n method: 'GET',\n cache: 'no-store',\n signal: controller.signal,\n });\n if (!response.ok) {\n return {\n ok: false,\n detail: `health returned HTTP ${response.status}`,\n };\n }\n return { ok: true, detail: 'ok' };\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n return {\n ok: false,\n detail: `health timed out after ${CORE_HEALTH_TIMEOUT_MS}ms`,\n };\n }\n return {\n ok: false,\n detail:\n error instanceof Error && error.message.length > 0\n ? error.message\n : 'health check failed',\n };\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n getConnectionStatus(): ReturnType<ConnectionStateTracker['getStatus']> {\n return this.connection.getStatus();\n }\n\n refreshCapabilities(): void {\n void this.sendHello().catch((error) => {\n console.error('DriveSocket refreshCapabilities failed:', error);\n });\n }\n\n private handleSocketUnavailable(socket: WebSocket, reason: string): void {\n if (this.socket !== socket) {\n return;\n }\n this.socket = null;\n this.stopKeepAlive();\n this.connection.markDisconnected();\n this.recordConnectionFailure(reason, new Error(reason));\n this.scheduleReconnect();\n }\n\n private recordConnectionFailure(context: string, error: unknown): void {\n const detail =\n error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : 'Unknown error';\n this.connection.recordFailure(`${context}: ${detail}`);\n const budget = this.connection.consumeFailureLogBudget();\n if (!budget.shouldLog) {\n return;\n }\n if (budget.suppressedCount > 0) {\n console.warn(\n `DriveSocket ${context} failed (${budget.suppressedCount} repeated failures suppressed).`,\n error\n );\n return;\n }\n console.warn(`DriveSocket ${context} failed.`, error);\n }\n\n private async sendHello(): Promise<void> {\n const manifest = chrome.runtime.getManifest();\n const endpoint = await readCoreEndpointConfig();\n let tabs: DriveTabInfo[] = [];\n try {\n tabs = await queryTabs();\n } catch (error) {\n console.debug('DriveSocket sendHello failed to read tabs.', error);\n tabs = [];\n }\n const params: DriveHelloParams = {\n extension_id: chrome.runtime.id,\n version: manifest.version,\n protocol_version: DRIVE_WS_PROTOCOL_VERSION,\n capabilities: buildNegotiatedCapabilities(),\n core_host: endpoint.host,\n core_port: endpoint.port,\n core_port_source: endpoint.portSource,\n tabs,\n };\n this.sendEvent('drive.hello', params);\n }\n\n private async emitTabReport(): Promise<void> {\n try {\n const tabs = await queryTabs();\n this.sendEvent('drive.tab_report', { tabs });\n } catch (error) {\n console.debug('DriveSocket emitTabReport failed.', error);\n }\n }\n\n private sendEvent(\n action: DriveEvent['action'],\n params: DriveEvent['params']\n ): void {\n const message: DriveEvent = {\n id: makeEventId(),\n action,\n status: 'event',\n params,\n };\n this.sendMessage(message);\n }\n\n private startKeepAlive(): void {\n this.stopKeepAlive();\n this.keepAliveTimer = self.setInterval(() => {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n return;\n }\n this.sendEvent('drive.keepalive', {});\n }, this.keepAliveIntervalMs);\n }\n\n private stopKeepAlive(): void {\n if (this.keepAliveTimer !== null) {\n clearInterval(this.keepAliveTimer);\n this.keepAliveTimer = null;\n }\n }\n\n private sendDebuggerEvent(params: DebuggerEvent['params']): void {\n const message: DebuggerEvent = {\n id: makeEventId(),\n action: 'debugger.event',\n status: 'event',\n params,\n };\n this.sendMessage(message);\n }\n\n private sendMessage(message: ExtensionMessage): void {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n return;\n }\n this.socket.send(JSON.stringify(message));\n }\n\n private handleMessage(raw: unknown): void {\n if (typeof raw !== 'string') {\n return;\n }\n let message: ExtensionMessage | null = null;\n try {\n message = JSON.parse(raw) as ExtensionMessage;\n } catch (error) {\n console.debug('DriveSocket received invalid JSON message.', error);\n return;\n }\n if (!message || typeof message !== 'object') {\n return;\n }\n if (message.status === 'request') {\n void this.handleRequest(message as ExtensionRequest).catch((error) => {\n console.error('DriveSocket handleRequest failed:', error);\n });\n }\n }\n\n async refreshDebuggerCapabilityState(): Promise<void> {\n this.refreshCapabilities();\n }\n\n async handleDebuggerCapabilityChange(enabled: boolean): Promise<void> {\n void enabled;\n this.refreshCapabilities();\n }\n\n private async handleRequest(message: ExtensionRequest): Promise<void> {\n let requestMessage: DriveRequest | PermissionsRequest | null = null;\n let gatedSiteKey: string | null = null;\n let touchGatedSiteOnSuccess = false;\n const respondOk = (result?: unknown): void => {\n if (!requestMessage) {\n return;\n }\n if (touchGatedSiteOnSuccess && gatedSiteKey) {\n void touchSiteLastUsed(gatedSiteKey).catch((error) => {\n console.error('Failed to touch site allowlist entry:', error);\n });\n }\n const response = {\n id: requestMessage.id,\n action: requestMessage.action,\n status: 'ok' as const,\n result,\n };\n this.sendMessage(response);\n };\n\n const respondError = (error: DriveErrorInfo): void => {\n if (!requestMessage) {\n return;\n }\n const response = {\n id: requestMessage.id,\n action: requestMessage.action,\n status: 'error' as const,\n error: sanitizeDriveErrorInfo(error),\n };\n this.sendMessage(response);\n };\n\n try {\n if (\n !message ||\n typeof message !== 'object' ||\n typeof message.id !== 'string' ||\n typeof message.action !== 'string'\n ) {\n return;\n }\n const action = message.action as string;\n\n if (action.startsWith('debugger.')) {\n await this.handleDebuggerRequest(message as DebuggerRequest);\n return;\n }\n\n requestMessage = message as DriveRequest | PermissionsRequest;\n\n if (action.startsWith('permissions.')) {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const rawTimeoutMs = params.timeout_ms;\n const timeoutMs =\n typeof rawTimeoutMs === 'number' &&\n Number.isFinite(rawTimeoutMs) &&\n rawTimeoutMs > 0\n ? Math.floor(rawTimeoutMs)\n : undefined;\n const rawSource = params.source;\n const source =\n rawSource === 'cli' || rawSource === 'mcp' || rawSource === 'api'\n ? rawSource\n : undefined;\n\n switch (action) {\n case 'permissions.list': {\n const allowlist = await getAllowlistedSites();\n const sites = Object.entries(allowlist)\n .map(([site, entry]) => ({\n site,\n created_at: entry.createdAt,\n last_used_at: entry.lastUsedAt,\n }))\n .sort((a, b) => a.site.localeCompare(b.site));\n respondOk({ sites });\n return;\n }\n case 'permissions.get_mode': {\n respondOk({\n mode: await readSitePermissionsMode(),\n });\n return;\n }\n case 'permissions.list_pending_requests': {\n respondOk({\n requests: permissionsRequests.listPendingRequests(),\n });\n return;\n }\n case 'permissions.request_allow_site': {\n const site = params.site;\n if (typeof site !== 'string' || site.trim().length === 0) {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'site must be a non-empty string.',\n retryable: false,\n details: { field: 'site' },\n });\n return;\n }\n respondOk(\n await permissionsRequests.requestChange({\n kind: 'allow_site',\n site,\n timeoutMs,\n source,\n })\n );\n return;\n }\n case 'permissions.request_revoke_site': {\n const site = params.site;\n if (typeof site !== 'string' || site.trim().length === 0) {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'site must be a non-empty string.',\n retryable: false,\n details: { field: 'site' },\n });\n return;\n }\n respondOk(\n await permissionsRequests.requestChange({\n kind: 'revoke_site',\n site,\n timeoutMs,\n source,\n })\n );\n return;\n }\n case 'permissions.request_set_mode': {\n const mode = params.mode;\n if (mode !== 'granular' && mode !== 'bypass') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'mode must be granular or bypass.',\n retryable: false,\n details: { field: 'mode' },\n });\n return;\n }\n respondOk(\n await permissionsRequests.requestChange({\n kind: 'set_mode',\n mode,\n timeoutMs,\n source,\n })\n );\n return;\n }\n }\n }\n\n if (!action.startsWith('drive.')) {\n return;\n }\n\n const gated = await gateDriveAction({\n action,\n params: (message.params ?? {}) as Record<string, unknown>,\n getDefaultTabId,\n getTab,\n permissionPrompts,\n });\n if (!gated.ok) {\n respondError(gated.error);\n return;\n }\n gatedSiteKey = gated.siteKey;\n touchGatedSiteOnSuccess = gated.touchOnSuccess;\n\n const resolveActionTabId = async (\n params: Record<string, unknown>\n ): Promise<\n { ok: true; tabId: number } | { ok: false; error: DriveErrorInfo }\n > => await resolveOptionalTabId(params, { getDefaultTabId });\n\n switch (message.action) {\n case 'drive.ping': {\n respondOk({ ok: true });\n return;\n }\n case 'drive.set_debugger_capability': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const enabled =\n typeof params.enabled === 'boolean' ? params.enabled : true;\n const expectedExtensionId = params.extension_id;\n if (\n expectedExtensionId !== undefined &&\n typeof expectedExtensionId !== 'string'\n ) {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'extension_id must be a string when provided.',\n retryable: false,\n });\n return;\n }\n if (\n typeof expectedExtensionId === 'string' &&\n expectedExtensionId.length > 0 &&\n expectedExtensionId !== chrome.runtime.id\n ) {\n respondError({\n code: 'FAILED_PRECONDITION',\n message:\n 'Connected extension id does not match the requested extension.',\n retryable: false,\n details: {\n expected_extension_id: expectedExtensionId,\n connected_extension_id: chrome.runtime.id,\n },\n });\n return;\n }\n await writeDebuggerCapabilityEnabled(enabled);\n await this.refreshDebuggerCapabilityState();\n respondOk({\n ok: true,\n enabled,\n extension_id: chrome.runtime.id,\n });\n return;\n }\n case 'drive.navigate': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const url = params.url;\n if (typeof url !== 'string' || url.length === 0) {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'url must be a non-empty string.',\n retryable: false,\n });\n return;\n }\n const tabTarget = await resolveActionTabId(params);\n if (!tabTarget.ok) {\n respondError(tabTarget.error);\n return;\n }\n const tabId = tabTarget.tabId;\n const requestedWaitMode = params.wait;\n if (\n requestedWaitMode !== undefined &&\n requestedWaitMode !== 'none' &&\n requestedWaitMode !== 'domcontentloaded' &&\n requestedWaitMode !== 'networkidle'\n ) {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: `Unsupported wait mode: ${String(requestedWaitMode)}.`,\n retryable: false,\n details: {\n field: 'wait',\n supported_wait_modes: [\n 'none',\n 'domcontentloaded',\n 'networkidle',\n ],\n mapped_wait_mode: 'domcontentloaded',\n },\n });\n return;\n }\n const waitMode =\n requestedWaitMode === 'none' ? 'none' : 'domcontentloaded';\n const domContentLoadedSignal =\n waitMode === 'domcontentloaded'\n ? waitForDomContentLoaded(tabId, 30000)\n : null;\n const warnings: string[] = [];\n if (requestedWaitMode === 'networkidle') {\n warnings.push(\n 'wait=networkidle is mapped to domcontentloaded in this runtime.'\n );\n }\n await wrapChromeVoid((callback) =>\n chrome.tabs.update(tabId, { url }, () => callback())\n );\n markTabActive(tabId);\n if (domContentLoadedSignal) {\n try {\n await domContentLoadedSignal;\n } catch (error) {\n const tab = await getTab(tabId).catch(() => undefined);\n if (\n tab &&\n isLikelyNavigationCommitted(url, tab.url ?? undefined)\n ) {\n warnings.push(\n 'Timed out waiting for DOMContentLoaded, but the tab URL already updated to the requested target.'\n );\n } else {\n respondError({\n code: 'TIMEOUT',\n message:\n error instanceof Error\n ? error.message\n : 'Timed out waiting.',\n retryable: true,\n });\n return;\n }\n }\n }\n if (tabId === agentTabId) {\n void refreshAgentTabBranding(tabId);\n }\n respondOk(\n await withResolvedTabTarget(tabId, {\n ok: true,\n ...(warnings.length > 0 ? { warnings } : {}),\n })\n );\n return;\n }\n case 'drive.go_back':\n case 'drive.go_forward': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const tabTarget = await resolveActionTabId(params);\n if (!tabTarget.ok) {\n respondError(tabTarget.error);\n return;\n }\n const tabId = tabTarget.tabId;\n const navigationSignal = waitForHistoryNavigationSignal(\n tabId,\n HISTORY_NAVIGATION_SIGNAL_TIMEOUT_MS\n );\n const result = await sendToTab(tabId, message.action, undefined, {\n timeoutMs: HISTORY_DISPATCH_TIMEOUT_MS,\n });\n if (!result.ok && result.error.code !== 'TIMEOUT') {\n respondError(result.error);\n return;\n }\n markTabActive(tabId);\n try {\n await navigationSignal;\n try {\n await waitForDomContentLoaded(\n tabId,\n HISTORY_POST_NAV_DOM_GRACE_TIMEOUT_MS\n );\n } catch {\n // BFCache/history restores can skip DOMContentLoaded; proceed once\n // we have a confirmed top-level navigation signal.\n }\n } catch {\n if (!result.ok) {\n respondError({\n ...result.error,\n });\n return;\n }\n }\n if (tabId === agentTabId) {\n void refreshAgentTabBranding(tabId);\n }\n respondOk(\n await withResolvedTabTarget(tabId, {\n ok: true,\n })\n );\n return;\n }\n case 'drive.tab_list': {\n const tabs = await queryTabs();\n const result: DriveTabListResult = { tabs };\n respondOk(result);\n return;\n }\n case 'drive.tab_activate': {\n const parsedTabId = readRequiredTabId(\n ((message.params as Record<string, unknown> | undefined) ??\n {}) as Record<string, unknown>\n );\n if (!parsedTabId.ok) {\n respondError(parsedTabId.error);\n return;\n }\n const tabId = parsedTabId.tabId;\n const tabLookup = await requireTab(tabId, getTab);\n if (!tabLookup.ok) {\n respondError(tabLookup.error);\n return;\n }\n const tab = tabLookup.tab;\n await wrapChromeVoid((callback) =>\n chrome.tabs.update(tabId, { active: true }, () => callback())\n );\n const windowId = tab.windowId;\n let focusErrorMessage: string | undefined;\n if (typeof windowId === 'number') {\n try {\n await wrapChromeVoid((callback) =>\n chrome.windows.update(windowId, { focused: true }, () =>\n callback()\n )\n );\n } catch (error) {\n focusErrorMessage =\n error instanceof Error ? error.message : 'Unknown focus error.';\n }\n }\n const activatedTab = await getTab(tabId).catch(() => undefined);\n const focusedWindow =\n typeof windowId === 'number'\n ? await getWindow(windowId).catch(() => undefined)\n : undefined;\n const windowFocused =\n focusedWindow && typeof focusedWindow.focused === 'boolean'\n ? focusedWindow.focused\n : undefined;\n const outcome = resolveTabActivationOutcome({\n tabId,\n windowId: typeof windowId === 'number' ? windowId : undefined,\n activated: Boolean(activatedTab?.active === true),\n focusErrorMessage,\n windowFocused,\n });\n if (!outcome.ok) {\n respondError(outcome.error);\n return;\n }\n markTabActive(tabId);\n respondOk(outcome.result);\n this.sendTabReport();\n return;\n }\n case 'drive.tab_close': {\n const parsedTabId = readRequiredTabId(\n ((message.params as Record<string, unknown> | undefined) ??\n {}) as Record<string, unknown>\n );\n if (!parsedTabId.ok) {\n respondError(parsedTabId.error);\n return;\n }\n const tabId = parsedTabId.tabId;\n await wrapChromeVoid((callback) =>\n chrome.tabs.remove(tabId, () => callback())\n );\n if (agentTabId === tabId) {\n clearAgentTarget();\n }\n lastActiveAtByTab.delete(tabId);\n respondOk({ ok: true });\n this.sendTabReport();\n return;\n }\n case 'drive.handle_dialog': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const action = params.action;\n if (action !== 'accept' && action !== 'dismiss') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'action must be accept or dismiss.',\n retryable: false,\n });\n return;\n }\n const promptText = params.promptText;\n if (promptText !== undefined && typeof promptText !== 'string') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'promptText must be a string when provided.',\n retryable: false,\n });\n return;\n }\n const tabTarget = await resolveActionTabId(params);\n if (!tabTarget.ok) {\n respondError(tabTarget.error);\n return;\n }\n const tabId = tabTarget.tabId;\n\n const error = await this.ensureDebuggerAttached(tabId);\n if (error) {\n respondError(error);\n return;\n }\n\n try {\n await this.sendDebuggerCommand(\n tabId,\n 'Page.handleJavaScriptDialog',\n {\n accept: action === 'accept',\n ...(promptText ? { promptText } : {}),\n },\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n this.touchDebuggerSession(tabId);\n respondOk(await withResolvedTabTarget(tabId, { ok: true }));\n } catch (error) {\n const info = mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Dialog handling failed.'\n );\n respondError(info);\n }\n return;\n }\n case 'drive.click': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const tabTarget = await resolveActionTabId(params);\n if (!tabTarget.ok) {\n respondError(tabTarget.error);\n return;\n }\n const tabId = tabTarget.tabId;\n\n const clickCount = params.click_count;\n const count =\n typeof clickCount === 'number' && Number.isFinite(clickCount)\n ? Math.max(1, Math.floor(clickCount))\n : 1;\n\n const error = await this.ensureDebuggerAttached(tabId);\n if (error) {\n respondError(error);\n return;\n }\n\n const pointResult = await this.resolveLocatorPoint(\n tabId,\n params.locator\n );\n if (!pointResult.ok) {\n respondError(pointResult.error);\n return;\n }\n const { x, y, targetState } = pointResult.point;\n\n if (targetState) {\n const verified = await verifyPopupTriggerClick({\n clickCount: count,\n locator: params.locator,\n point: pointResult.point,\n prepareTarget: async () =>\n await this.focusLocator(tabId, params.locator),\n resolveLocatorPoint: async (locator) =>\n await this.resolveLocatorPoint(tabId, locator),\n dispatchCdpClick: async (clickX, clickY, clickCount) =>\n await this.dispatchCdpClick(tabId, clickX, clickY, clickCount),\n mapDispatchError: (error) =>\n mapDebuggerErrorMessage(\n error instanceof Error\n ? error.message\n : 'Click dispatch failed.'\n ),\n delayMs,\n });\n if (!verified.ok) {\n respondError(verified.error);\n return;\n }\n respondOk(await withResolvedTabTarget(tabId, { ok: true }));\n return;\n }\n\n try {\n await this.dispatchCdpClick(tabId, x, y, count);\n } catch (error) {\n respondError(\n mapDebuggerErrorMessage(\n error instanceof Error\n ? error.message\n : 'Click dispatch failed.'\n )\n );\n return;\n }\n respondOk(await withResolvedTabTarget(tabId, { ok: true }));\n return;\n }\n case 'drive.hover': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const tabTarget = await resolveActionTabId(params);\n if (!tabTarget.ok) {\n respondError(tabTarget.error);\n return;\n }\n const tabId = tabTarget.tabId;\n\n const error = await this.ensureDebuggerAttached(tabId);\n if (error) {\n respondError(error);\n return;\n }\n const pointResult = await this.resolveLocatorPoint(\n tabId,\n params.locator\n );\n if (!pointResult.ok) {\n respondError(pointResult.error);\n return;\n }\n const { x, y } = pointResult.point;\n\n const waitMs =\n typeof params.delay_ms === 'number' &&\n Number.isFinite(params.delay_ms)\n ? Math.min(Math.max(params.delay_ms, 0), 10000)\n : 0;\n try {\n await this.dispatchCdpMouseMove(tabId, x, y, 0);\n if (waitMs > 0) {\n await delayMs(waitMs);\n }\n const snapshot = await sendToTab(tabId, 'drive.snapshot_html');\n if (!snapshot.ok) {\n respondError(snapshot.error);\n return;\n }\n respondOk(\n await withResolvedTabTarget(\n tabId,\n snapshot.result ?? { format: 'html', snapshot: '' }\n )\n );\n } catch (error) {\n const info = mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Hover dispatch failed.'\n );\n respondError(info);\n }\n return;\n }\n case 'drive.drag': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const tabTarget = await resolveActionTabId(params);\n if (!tabTarget.ok) {\n respondError(tabTarget.error);\n return;\n }\n const tabId = tabTarget.tabId;\n\n const error = await this.ensureDebuggerAttached(tabId);\n if (error) {\n respondError(error);\n return;\n }\n const fromResult = await this.resolveLocatorPoint(tabId, params.from);\n if (!fromResult.ok) {\n respondError(fromResult.error);\n return;\n }\n const toResult = await this.resolveLocatorPoint(tabId, params.to);\n if (!toResult.ok) {\n respondError(toResult.error);\n return;\n }\n const steps =\n typeof params.steps === 'number' && Number.isFinite(params.steps)\n ? Math.max(1, Math.min(50, Math.floor(params.steps)))\n : 12;\n try {\n await this.dispatchCdpDrag(\n tabId,\n fromResult.point,\n toResult.point,\n steps\n );\n respondOk(await withResolvedTabTarget(tabId, { ok: true }));\n } catch (error) {\n const info = mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Drag dispatch failed.'\n );\n respondError(info);\n }\n return;\n }\n case 'drive.key_press': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const key = params.key;\n if (typeof key !== 'string' || key.length === 0) {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'key must be a non-empty string.',\n retryable: false,\n });\n return;\n }\n const tabTarget = await resolveActionTabId(params);\n if (!tabTarget.ok) {\n respondError(tabTarget.error);\n return;\n }\n const tabId = tabTarget.tabId;\n\n const error = await this.ensureDebuggerAttached(tabId);\n if (error) {\n respondError(error);\n return;\n }\n try {\n await this.dispatchCdpKeyPress(tabId, key, params.modifiers);\n respondOk(await withResolvedTabTarget(tabId, { ok: true }));\n } catch (error) {\n const info = mapDebuggerErrorMessage(\n error instanceof Error\n ? error.message\n : 'Keyboard dispatch failed.'\n );\n respondError(info);\n }\n return;\n }\n case 'drive.key': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const key = params.key;\n if (typeof key !== 'string' || key.length === 0) {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'key must be a non-empty string.',\n retryable: false,\n });\n return;\n }\n const tabTarget = await resolveActionTabId(params);\n if (!tabTarget.ok) {\n respondError(tabTarget.error);\n return;\n }\n const tabId = tabTarget.tabId;\n const count =\n typeof params.repeat === 'number' && Number.isFinite(params.repeat)\n ? Math.max(1, Math.min(50, Math.floor(params.repeat)))\n : 1;\n const error = await this.ensureDebuggerAttached(tabId);\n if (error) {\n respondError(error);\n return;\n }\n try {\n for (let i = 0; i < count; i += 1) {\n await this.dispatchCdpKeyPress(tabId, key, params.modifiers);\n }\n respondOk(await withResolvedTabTarget(tabId, { ok: true }));\n } catch (error) {\n const info = mapDebuggerErrorMessage(\n error instanceof Error\n ? error.message\n : 'Keyboard dispatch failed.'\n );\n respondError(info);\n }\n return;\n }\n case 'drive.type': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const text = params.text;\n if (typeof text !== 'string') {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'text must be a string.',\n retryable: false,\n });\n return;\n }\n const tabTarget = await resolveActionTabId(params);\n if (!tabTarget.ok) {\n respondError(tabTarget.error);\n return;\n }\n const tabId = tabTarget.tabId;\n const error = await this.ensureDebuggerAttached(tabId);\n if (error) {\n respondError(error);\n return;\n }\n const result = await this.performCdpType(tabId, {\n locator: params.locator,\n text,\n clear: Boolean(params.clear),\n submit: Boolean(params.submit),\n });\n if (!result.ok) {\n respondError(result.error);\n return;\n }\n respondOk(await withResolvedTabTarget(tabId, { ok: true }));\n return;\n }\n case 'drive.select': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const tabTarget = await resolveActionTabId(params);\n if (!tabTarget.ok) {\n respondError(tabTarget.error);\n return;\n }\n const tabId = tabTarget.tabId;\n const error = await this.ensureDebuggerAttached(tabId);\n if (error) {\n respondError(error);\n return;\n }\n const pointResult = await this.resolveLocatorPoint(\n tabId,\n params.locator\n );\n if (!pointResult.ok) {\n respondError(pointResult.error);\n return;\n }\n try {\n await this.dispatchCdpClick(\n tabId,\n pointResult.point.x,\n pointResult.point.y,\n 1\n );\n } catch (error) {\n const info = mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Select click failed.'\n );\n respondError(info);\n return;\n }\n // CDP has no direct \"select option by value/text/index\" primitive.\n // Fall back explicitly to the existing select helper after CDP focus.\n const selectResult = await sendToTab(tabId, 'drive.select', params);\n if (!selectResult.ok) {\n respondError(selectResult.error);\n return;\n }\n respondOk(\n await withResolvedTabTarget(\n tabId,\n selectResult.result ?? { ok: true }\n )\n );\n return;\n }\n case 'drive.fill_form': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const fields = params.fields;\n if (!Array.isArray(fields) || fields.length === 0) {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'fields must be a non-empty array.',\n retryable: false,\n });\n return;\n }\n const tabTarget = await resolveActionTabId(params);\n if (!tabTarget.ok) {\n respondError(tabTarget.error);\n return;\n }\n const tabId = tabTarget.tabId;\n const error = await this.ensureDebuggerAttached(tabId);\n if (error) {\n respondError(error);\n return;\n }\n let filled = 0;\n const errors: string[] = [];\n for (let index = 0; index < fields.length; index += 1) {\n const field = fields[index];\n if (!field || typeof field !== 'object') {\n errors.push(`Field ${index} is not an object.`);\n continue;\n }\n const record = field as Record<string, unknown>;\n const value = record.value;\n if (typeof value !== 'string' && typeof value !== 'boolean') {\n errors.push(`Field ${index} has invalid value.`);\n continue;\n }\n const selector =\n typeof record.selector === 'string' ? record.selector : undefined;\n const locator =\n record.locator && typeof record.locator === 'object'\n ? (record.locator as Record<string, unknown>)\n : selector\n ? ({ css: selector } as Record<string, unknown>)\n : undefined;\n let resolvedType =\n typeof record.type === 'string' && record.type.length > 0\n ? record.type\n : 'auto';\n if (resolvedType === 'auto') {\n const detected = await sendToTab(\n tabId as number,\n 'drive.detect_field_type',\n { locator: record.locator, selector }\n );\n if (!detected.ok) {\n errors.push(`Field ${index} could not be resolved.`);\n continue;\n }\n const payload = detected.result;\n if (!payload || typeof payload !== 'object') {\n errors.push(`Field ${index} returned invalid type payload.`);\n continue;\n }\n const detectedType = (payload as Record<string, unknown>)\n .fieldType;\n if (\n typeof detectedType !== 'string' ||\n detectedType.length === 0\n ) {\n errors.push(`Field ${index} returned invalid field type.`);\n continue;\n }\n resolvedType = detectedType;\n }\n\n if (\n (resolvedType === 'text' || resolvedType === 'contentEditable') &&\n locator\n ) {\n const typed = await this.performCdpType(tabId, {\n locator,\n text: String(value),\n clear: true,\n submit: Boolean(record.submit),\n });\n if (!typed.ok) {\n errors.push(\n `Field ${index} could not be filled: ${typed.error.message}`\n );\n continue;\n }\n filled += 1;\n continue;\n }\n\n // Explicit fallback for controls not yet modeled via CDP-first helper.\n const fallback = await sendToTab(tabId, 'drive.fill_form', {\n fields: [field],\n });\n if (!fallback.ok) {\n errors.push(\n `Field ${index} could not be filled: ${fallback.error.message}`\n );\n continue;\n }\n const payload = fallback.result;\n if (!payload || typeof payload !== 'object') {\n errors.push(`Field ${index} returned invalid fallback payload.`);\n continue;\n }\n const fallbackFilled = (payload as Record<string, unknown>).filled;\n if (\n typeof fallbackFilled === 'number' &&\n Number.isFinite(fallbackFilled) &&\n fallbackFilled > 0\n ) {\n filled += 1;\n continue;\n }\n errors.push(`Field ${index} could not be filled.`);\n }\n respondOk(\n await withResolvedTabTarget(tabId, {\n filled,\n attempted: fields.length,\n errors: errors.length > 0 ? errors : [],\n })\n );\n return;\n }\n case 'drive.scroll':\n case 'drive.wait_for': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const tabTarget = await resolveActionTabId(params);\n if (!tabTarget.ok) {\n respondError(tabTarget.error);\n return;\n }\n const tabId = tabTarget.tabId;\n const timeoutMs =\n message.action === 'drive.wait_for' &&\n typeof params.timeout_ms === 'number' &&\n Number.isFinite(params.timeout_ms)\n ? Math.max(1, Math.floor(params.timeout_ms) + 1000)\n : undefined;\n const result = await sendToTab(tabId, message.action, params, {\n timeoutMs,\n });\n if (result.ok) {\n respondOk(\n await withResolvedTabTarget(tabId, result.result ?? { ok: true })\n );\n } else {\n respondError(result.error);\n }\n return;\n }\n case 'drive.screenshot': {\n const params = (message.params ?? {}) as Record<string, unknown>;\n const tabTarget = await resolveActionTabId(params);\n if (!tabTarget.ok) {\n respondError(tabTarget.error);\n return;\n }\n const tabId = tabTarget.tabId;\n\n const mode =\n params.mode === 'full_page' ||\n params.mode === 'viewport' ||\n params.mode === 'element'\n ? params.mode\n : 'viewport';\n const format =\n params.format === 'jpeg' || params.format === 'webp'\n ? params.format\n : 'png';\n const quality =\n typeof params.quality === 'number' &&\n Number.isFinite(params.quality)\n ? Math.max(0, Math.min(100, Math.floor(params.quality)))\n : undefined;\n\n const tab = await getTab(tabId as number);\n const url = tab.url;\n if (typeof url === 'string' && isRestrictedUrl(url)) {\n respondError(\n buildRestrictedUrlError({\n url,\n operation: 'screenshot',\n action: 'drive.screenshot',\n })\n );\n return;\n }\n const windowId = tab.windowId;\n if (typeof windowId !== 'number') {\n respondError({\n code: 'TAB_NOT_FOUND',\n message: 'window_id missing for tab.',\n retryable: false,\n });\n return;\n }\n\n if (typeof OffscreenCanvas === 'undefined') {\n respondError({\n code: 'NOT_SUPPORTED',\n message: 'OffscreenCanvas is unavailable in this extension host.',\n retryable: false,\n });\n return;\n }\n\n const captureVisible = async (): Promise<string> => {\n return await captureVisibleTabWithThrottle(windowId);\n };\n\n const scrollTo = async (top: number, left: number): Promise<void> => {\n const result = await sendToTab(tabId as number, 'drive.scroll', {\n top,\n left,\n behavior: 'auto',\n tab_id: tabId,\n });\n if (!result.ok) {\n throw new Error(result.error.message);\n }\n };\n\n const getMetaInfo = async (): Promise<{\n viewportHeight: number;\n scrollHeight: number;\n scrollY: number;\n scrollX: number;\n devicePixelRatio: number;\n fullHeightPx: number;\n positions: number[];\n }> => {\n const meta = await sendToTab(\n tabId as number,\n 'drive.screenshot_meta'\n );\n if (!meta.ok) {\n throw new Error(meta.error.message);\n }\n const payload = meta.result;\n if (!payload || typeof payload !== 'object') {\n throw new Error('Invalid screenshot metadata response.');\n }\n\n const record = payload as Record<string, unknown>;\n const viewportHeight = record.viewportHeight;\n const scrollHeight = record.scrollHeight;\n const scrollY = record.scrollY;\n const scrollX = record.scrollX;\n const dpr = record.devicePixelRatio;\n\n if (\n typeof viewportHeight !== 'number' ||\n !Number.isFinite(viewportHeight) ||\n viewportHeight <= 0\n ) {\n throw new Error(\n 'viewportHeight missing from screenshot metadata.'\n );\n }\n if (\n typeof scrollHeight !== 'number' ||\n !Number.isFinite(scrollHeight) ||\n scrollHeight <= 0\n ) {\n throw new Error('scrollHeight missing from screenshot metadata.');\n }\n\n const devicePixelRatio =\n typeof dpr === 'number' && Number.isFinite(dpr) && dpr > 0\n ? dpr\n : 1;\n\n const fullHeightPx = Math.round(scrollHeight * devicePixelRatio);\n const maxHeightPx = 50000;\n if (fullHeightPx > maxHeightPx) {\n throw new Error(\n `Page is too tall to capture (max ${maxHeightPx}px).`\n );\n }\n\n const maxScrollY = Math.max(0, scrollHeight - viewportHeight);\n const step = viewportHeight;\n const positions: number[] = [];\n for (let y = 0; y < maxScrollY; y += step) {\n positions.push(y);\n }\n positions.push(maxScrollY);\n\n const maxTiles = 200;\n if (positions.length > maxTiles) {\n throw new Error(\n `Page requires too many tiles to capture (${positions.length}).`\n );\n }\n\n return {\n viewportHeight,\n scrollHeight,\n scrollY:\n typeof scrollY === 'number' && Number.isFinite(scrollY)\n ? scrollY\n : 0,\n scrollX:\n typeof scrollX === 'number' && Number.isFinite(scrollX)\n ? scrollX\n : 0,\n devicePixelRatio,\n fullHeightPx,\n positions,\n };\n };\n\n const canvasToResult = async (\n canvas: OffscreenCanvas\n ): Promise<{\n mime: string;\n data_base64: string;\n width_px: number;\n height_px: number;\n }> => {\n const mime =\n format === 'jpeg'\n ? 'image/jpeg'\n : format === 'webp'\n ? 'image/webp'\n : 'image/png';\n const q =\n typeof quality === 'number' && Number.isFinite(quality)\n ? Math.max(0, Math.min(1, quality / 100))\n : undefined;\n const blob =\n format === 'png'\n ? await canvas.convertToBlob({ type: mime })\n : await canvas.convertToBlob({ type: mime, quality: q });\n const base64 = arrayBufferToBase64(await blob.arrayBuffer());\n return {\n mime,\n data_base64: base64,\n width_px: canvas.width,\n height_px: canvas.height,\n };\n };\n\n const captureFullPageCanvas = async (\n metaInfo: Awaited<ReturnType<typeof getMetaInfo>>\n ): Promise<OffscreenCanvas> => {\n try {\n await scrollTo(0, 0);\n await delayMs(100);\n\n const firstDataUrl = await captureVisible();\n const firstBlob = await (await fetch(firstDataUrl)).blob();\n const firstBitmap = await createImageBitmap(firstBlob);\n\n const canvas = new OffscreenCanvas(\n firstBitmap.width,\n metaInfo.fullHeightPx\n );\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n firstBitmap.close();\n throw new Error('Canvas context unavailable.');\n }\n\n const drawTile = (bitmap: ImageBitmap, yCss: number): void => {\n const destY = Math.round(yCss * metaInfo.devicePixelRatio);\n const remaining = metaInfo.fullHeightPx - destY;\n if (remaining <= 0) {\n return;\n }\n const drawHeight = Math.min(bitmap.height, remaining);\n ctx.drawImage(\n bitmap,\n 0,\n 0,\n bitmap.width,\n drawHeight,\n 0,\n destY,\n bitmap.width,\n drawHeight\n );\n };\n\n drawTile(firstBitmap, 0);\n firstBitmap.close();\n\n for (const y of metaInfo.positions.slice(1)) {\n await scrollTo(y, 0);\n await delayMs(100);\n const dataUrl = await captureVisible();\n const blob = await (await fetch(dataUrl)).blob();\n const bitmap = await createImageBitmap(blob);\n drawTile(bitmap, y);\n bitmap.close();\n }\n\n return canvas;\n } finally {\n try {\n await scrollTo(metaInfo.scrollY, metaInfo.scrollX);\n } catch {\n // Ignore restoration errors.\n }\n }\n };\n\n if (mode === 'viewport') {\n try {\n const dataUrl = await captureVisible();\n const rendered = await renderDataUrlToFormat(\n dataUrl,\n format,\n quality\n );\n respondOk(await withResolvedTabTarget(tabId as number, rendered));\n } catch (error) {\n respondError(\n mapScreenshotCaptureError(\n error,\n 'Failed to capture screenshot.'\n )\n );\n }\n return;\n }\n\n if (mode === 'element') {\n const selector = params.selector;\n if (typeof selector !== 'string' || selector.trim().length === 0) {\n respondError({\n code: 'INVALID_ARGUMENT',\n message: 'selector must be a non-empty string.',\n retryable: false,\n });\n return;\n }\n\n let metaInfo: Awaited<ReturnType<typeof getMetaInfo>>;\n try {\n metaInfo = await getMetaInfo();\n } catch (error) {\n respondError({\n code: 'EVALUATION_FAILED',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to read screenshot metadata.',\n retryable: false,\n });\n return;\n }\n\n const element = await sendToTab(\n tabId as number,\n 'drive.screenshot_element',\n { selector }\n );\n if (!element.ok) {\n respondError(element.error);\n return;\n }\n\n const payload = element.result;\n if (!payload || typeof payload !== 'object') {\n respondError({\n code: 'EVALUATION_FAILED',\n message: 'Invalid element metadata response.',\n retryable: false,\n });\n return;\n }\n\n const record = payload as Record<string, unknown>;\n const viewportLeft = record.viewportLeft;\n const viewportTop = record.viewportTop;\n const viewportWidth = record.viewportWidth;\n const viewportHeight = record.viewportHeight;\n const width = record.width;\n const height = record.height;\n const pageX = record.pageX;\n const pageY = record.pageY;\n const dpr = record.devicePixelRatio;\n const devicePixelRatio =\n typeof dpr === 'number' && Number.isFinite(dpr) && dpr > 0\n ? dpr\n : metaInfo.devicePixelRatio;\n\n if (\n typeof viewportLeft !== 'number' ||\n typeof viewportTop !== 'number' ||\n typeof viewportWidth !== 'number' ||\n typeof viewportHeight !== 'number' ||\n typeof width !== 'number' ||\n typeof height !== 'number' ||\n typeof pageX !== 'number' ||\n typeof pageY !== 'number' ||\n !Number.isFinite(viewportLeft) ||\n !Number.isFinite(viewportTop) ||\n !Number.isFinite(viewportWidth) ||\n !Number.isFinite(viewportHeight) ||\n !Number.isFinite(width) ||\n !Number.isFinite(height) ||\n !Number.isFinite(pageX) ||\n !Number.isFinite(pageY)\n ) {\n respondError({\n code: 'EVALUATION_FAILED',\n message: 'Invalid element bounding box metadata.',\n retryable: false,\n });\n return;\n }\n\n const fitsInViewport =\n viewportLeft >= 0 &&\n viewportTop >= 0 &&\n viewportLeft + width <= viewportWidth &&\n viewportTop + height <= viewportHeight;\n\n const cropW = Math.max(1, Math.round(width * devicePixelRatio));\n const cropH = Math.max(1, Math.round(height * devicePixelRatio));\n\n try {\n if (fitsInViewport) {\n const dataUrl = await captureVisible();\n const blob = await (await fetch(dataUrl)).blob();\n const bitmap = await createImageBitmap(blob);\n try {\n const cropX = Math.max(\n 0,\n Math.round(viewportLeft * devicePixelRatio)\n );\n const cropY = Math.max(\n 0,\n Math.round(viewportTop * devicePixelRatio)\n );\n const srcW = Math.min(cropW, bitmap.width - cropX);\n const srcH = Math.min(cropH, bitmap.height - cropY);\n if (srcW <= 0 || srcH <= 0) {\n throw new Error('Element is outside screenshot bounds.');\n }\n const cropCanvas = new OffscreenCanvas(srcW, srcH);\n const ctx = cropCanvas.getContext('2d');\n if (!ctx) {\n throw new Error('Canvas context unavailable.');\n }\n ctx.drawImage(\n bitmap,\n cropX,\n cropY,\n srcW,\n srcH,\n 0,\n 0,\n srcW,\n srcH\n );\n respondOk(\n await withResolvedTabTarget(\n tabId as number,\n await canvasToResult(cropCanvas)\n )\n );\n } finally {\n bitmap.close();\n }\n return;\n }\n\n const fullCanvas = await captureFullPageCanvas(metaInfo);\n const cropX = Math.max(0, Math.round(pageX * devicePixelRatio));\n const cropY = Math.max(0, Math.round(pageY * devicePixelRatio));\n const srcW = Math.min(cropW, fullCanvas.width - cropX);\n const srcH = Math.min(cropH, fullCanvas.height - cropY);\n if (srcW <= 0 || srcH <= 0) {\n throw new Error('Element is outside screenshot bounds.');\n }\n const cropCanvas = new OffscreenCanvas(srcW, srcH);\n const ctx = cropCanvas.getContext('2d');\n if (!ctx) {\n throw new Error('Canvas context unavailable.');\n }\n ctx.drawImage(\n fullCanvas,\n cropX,\n cropY,\n srcW,\n srcH,\n 0,\n 0,\n srcW,\n srcH\n );\n respondOk(\n await withResolvedTabTarget(\n tabId as number,\n await canvasToResult(cropCanvas)\n )\n );\n } catch (error) {\n respondError(\n mapScreenshotCaptureError(\n error,\n 'Failed to capture element screenshot.'\n )\n );\n } finally {\n try {\n await scrollTo(metaInfo.scrollY, metaInfo.scrollX);\n } catch {\n // Ignore.\n }\n }\n return;\n }\n\n try {\n const metaInfo = await getMetaInfo();\n const canvas = await captureFullPageCanvas(metaInfo);\n respondOk(\n await withResolvedTabTarget(\n tabId as number,\n await canvasToResult(canvas)\n )\n );\n } catch (error) {\n respondError(\n mapScreenshotCaptureError(\n error,\n 'Failed to capture full page screenshot.'\n )\n );\n }\n return;\n }\n default:\n respondError({\n code: 'NOT_IMPLEMENTED',\n message: `${message.action} not implemented in extension yet.`,\n retryable: false,\n });\n }\n } catch (error) {\n const messageText =\n error instanceof Error ? error.message : 'Unknown error';\n respondError({\n code: 'EVALUATION_FAILED',\n message: messageText,\n retryable: false,\n });\n }\n }\n\n private async dispatchCdpClick(\n tabId: number,\n x: number,\n y: number,\n clickCount: number\n ): Promise<void> {\n await this.dispatchCdpMouseMove(tabId, x, y, 0);\n\n for (let i = 0; i < clickCount; i += 1) {\n const normalizedClickCount = i + 1;\n await this.sendDebuggerCommand(\n tabId,\n 'Input.dispatchMouseEvent',\n {\n type: 'mousePressed',\n x,\n y,\n button: 'left',\n clickCount: normalizedClickCount,\n },\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n await this.sendDebuggerCommand(\n tabId,\n 'Input.dispatchMouseEvent',\n {\n type: 'mouseReleased',\n x,\n y,\n button: 'left',\n clickCount: normalizedClickCount,\n },\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n }\n this.touchDebuggerSession(tabId);\n }\n\n private async dispatchCdpMouseMove(\n tabId: number,\n x: number,\n y: number,\n buttons: number\n ): Promise<void> {\n await this.sendDebuggerCommand(\n tabId,\n 'Input.dispatchMouseEvent',\n {\n type: 'mouseMoved',\n x,\n y,\n button: 'none',\n buttons,\n },\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n }\n\n private async dispatchCdpDrag(\n tabId: number,\n from: ScreenPoint,\n to: ScreenPoint,\n steps: number\n ): Promise<void> {\n await this.dispatchCdpMouseMove(tabId, from.x, from.y, 0);\n await this.sendDebuggerCommand(\n tabId,\n 'Input.dispatchMouseEvent',\n {\n type: 'mousePressed',\n x: from.x,\n y: from.y,\n button: 'left',\n clickCount: 1,\n },\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n\n for (let i = 1; i <= steps; i += 1) {\n const progress = i / steps;\n const x = from.x + (to.x - from.x) * progress;\n const y = from.y + (to.y - from.y) * progress;\n await this.dispatchCdpMouseMove(tabId, x, y, 1);\n await delayMs(10);\n }\n\n await this.sendDebuggerCommand(\n tabId,\n 'Input.dispatchMouseEvent',\n {\n type: 'mouseReleased',\n x: to.x,\n y: to.y,\n button: 'left',\n clickCount: 1,\n },\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n this.touchDebuggerSession(tabId);\n }\n\n private async resolveLocatorPoint(\n tabId: number,\n locator: unknown\n ): Promise<\n | { ok: true; point: LocatorPointResult }\n | { ok: false; error: DriveErrorInfo }\n > {\n const point = await sendToTab(tabId, 'drive.locator_point', {\n locator,\n });\n if (!point.ok) {\n return point;\n }\n const payload = point.result;\n if (!payload || typeof payload !== 'object') {\n return {\n ok: false,\n error: {\n code: 'EVALUATION_FAILED',\n message: 'Invalid locator point payload.',\n retryable: false,\n },\n };\n }\n const record = payload as Record<string, unknown>;\n const x = record.x;\n const y = record.y;\n if (\n typeof x !== 'number' ||\n !Number.isFinite(x) ||\n typeof y !== 'number' ||\n !Number.isFinite(y)\n ) {\n return {\n ok: false,\n error: {\n code: 'EVALUATION_FAILED',\n message: 'Invalid locator point coordinates.',\n retryable: false,\n },\n };\n }\n const targetState = coercePopupTriggerState(record.target_state);\n return {\n ok: true,\n point: {\n x,\n y,\n ...(targetState ? { targetState } : {}),\n },\n };\n }\n\n private async focusLocator(tabId: number, locator: unknown): Promise<void> {\n const focused = await sendToTab(tabId, 'drive.focus_locator', {\n locator,\n });\n if (!focused.ok) {\n throw new Error(focused.error.message);\n }\n }\n\n private async performCdpType(\n tabId: number,\n options: {\n locator: unknown;\n text: string;\n clear: boolean;\n submit: boolean;\n }\n ): Promise<{ ok: true } | { ok: false; error: DriveErrorInfo }> {\n const targetPoint = await sendToTab(tabId, 'drive.type_target_point', {\n locator: options.locator,\n });\n if (!targetPoint.ok) {\n return targetPoint;\n }\n const payload = targetPoint.result;\n if (!payload || typeof payload !== 'object') {\n return {\n ok: false,\n error: {\n code: 'EVALUATION_FAILED',\n message: 'Invalid type target payload.',\n retryable: false,\n },\n };\n }\n const record = payload as Record<string, unknown>;\n const x = record.x;\n const y = record.y;\n if (\n typeof x !== 'number' ||\n !Number.isFinite(x) ||\n typeof y !== 'number' ||\n !Number.isFinite(y)\n ) {\n return {\n ok: false,\n error: {\n code: 'EVALUATION_FAILED',\n message: 'Invalid type target coordinates.',\n retryable: false,\n },\n };\n }\n try {\n await this.dispatchCdpClick(tabId, x, y, 1);\n if (options.clear) {\n const clearResult = await sendToTab(\n tabId,\n 'drive.clear_active_editable'\n );\n if (!clearResult.ok) {\n return clearResult;\n }\n }\n if (options.text.length > 0) {\n await this.sendDebuggerCommand(\n tabId,\n 'Input.insertText',\n { text: options.text },\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n }\n if (options.submit) {\n await this.dispatchCdpKeyPress(tabId, 'Enter', undefined);\n }\n this.touchDebuggerSession(tabId);\n return { ok: true };\n } catch (error) {\n return {\n ok: false,\n error: mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Type dispatch failed.'\n ),\n };\n }\n }\n\n private normalizeModifierMask(modifiers: unknown): number {\n const MOD_ALT = 1;\n const MOD_CTRL = 2;\n const MOD_META = 4;\n const MOD_SHIFT = 8;\n let mask = 0;\n if (Array.isArray(modifiers)) {\n for (const modifier of modifiers) {\n if (typeof modifier !== 'string') {\n continue;\n }\n const normalized = modifier.toLowerCase();\n if (normalized === 'alt') {\n mask |= MOD_ALT;\n } else if (normalized === 'ctrl') {\n mask |= MOD_CTRL;\n } else if (normalized === 'meta') {\n mask |= MOD_META;\n } else if (normalized === 'shift') {\n mask |= MOD_SHIFT;\n }\n }\n return mask;\n }\n if (!modifiers || typeof modifiers !== 'object') {\n return mask;\n }\n const record = modifiers as Record<string, unknown>;\n if (record.alt) {\n mask |= MOD_ALT;\n }\n if (record.ctrl) {\n mask |= MOD_CTRL;\n }\n if (record.meta) {\n mask |= MOD_META;\n }\n if (record.shift) {\n mask |= MOD_SHIFT;\n }\n return mask;\n }\n\n private keyToCode(key: string): string {\n const map: Record<string, string> = {\n Enter: 'Enter',\n Tab: 'Tab',\n Escape: 'Escape',\n Esc: 'Escape',\n Backspace: 'Backspace',\n Delete: 'Delete',\n ArrowUp: 'ArrowUp',\n ArrowDown: 'ArrowDown',\n ArrowLeft: 'ArrowLeft',\n ArrowRight: 'ArrowRight',\n Home: 'Home',\n End: 'End',\n PageUp: 'PageUp',\n PageDown: 'PageDown',\n ' ': 'Space',\n Space: 'Space',\n };\n if (map[key]) {\n return map[key];\n }\n if (key.length === 1) {\n if (/[a-zA-Z]/.test(key)) {\n return `Key${key.toUpperCase()}`;\n }\n if (/[0-9]/.test(key)) {\n return `Digit${key}`;\n }\n }\n return key;\n }\n\n private async dispatchCdpKeyPress(\n tabId: number,\n key: string,\n modifiers: unknown\n ): Promise<void> {\n const code = this.keyToCode(key);\n const modifierMask = this.normalizeModifierMask(modifiers);\n const isTextInput = key.length === 1 && (modifierMask & (1 | 2 | 4)) === 0;\n const keyDownParams: Record<string, unknown> = {\n type: 'keyDown',\n key,\n code,\n modifiers: modifierMask,\n };\n if (isTextInput) {\n keyDownParams.text = key;\n keyDownParams.unmodifiedText = key;\n }\n\n await this.sendDebuggerCommand(\n tabId,\n 'Input.dispatchKeyEvent',\n keyDownParams,\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n await this.sendDebuggerCommand(\n tabId,\n 'Input.dispatchKeyEvent',\n {\n type: 'keyUp',\n key,\n code,\n modifiers: modifierMask,\n },\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n this.touchDebuggerSession(tabId);\n }\n\n private async handleDebuggerRequest(message: DebuggerRequest): Promise<void> {\n const respondAck = (result?: unknown): void => {\n this.sendMessage({\n id: message.id,\n action: message.action,\n status: 'ack',\n result,\n });\n };\n\n const respondError = (error: DriveErrorInfo): void => {\n this.sendMessage({\n id: message.id,\n action: message.action,\n status: 'error',\n error: sanitizeDriveErrorInfo(error),\n });\n };\n\n await dispatchDebuggerRequest(\n message,\n {\n getSession: (tabId) => this.debuggerSessions.get(tabId),\n ensureDebuggerAttached: async (tabId) =>\n await this.ensureDebuggerAttached(tabId),\n detachDebugger: async (tabId) => await this.detachDebugger(tabId),\n sendDebuggerCommand: async (tabId, method, params, timeoutMs) =>\n await this.sendDebuggerCommand(tabId, method, params, timeoutMs),\n touchDebuggerSession: (tabId) => this.touchDebuggerSession(tabId),\n clearDebuggerSession: (tabId) => this.clearDebuggerSession(tabId),\n mapDebuggerErrorMessage,\n debuggerCommandTimeoutMs: DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS,\n },\n {\n respondAck,\n respondError,\n }\n );\n }\n\n async handleDebuggerEvent(\n source: DebuggerTarget,\n method: string,\n params?: Record<string, unknown>\n ): Promise<void> {\n const tabId = source.tabId;\n if (typeof tabId !== 'number') {\n return;\n }\n this.touchDebuggerSession(tabId);\n this.sendDebuggerEvent({\n tab_id: tabId,\n method,\n params,\n timestamp: nowIso(),\n });\n }\n\n async handleDebuggerDetach(\n source: DebuggerTarget,\n reason?: string\n ): Promise<void> {\n const tabId = source.tabId;\n if (typeof tabId !== 'number') {\n return;\n }\n this.clearDebuggerSession(tabId);\n this.sendDebuggerEvent({\n tab_id: tabId,\n method: 'Debugger.detached',\n params: { reason: reason ?? 'unknown' },\n timestamp: nowIso(),\n });\n }\n\n private async ensureDebuggerAttached(\n tabId: number\n ): Promise<DriveErrorInfo | null> {\n const existing = this.debuggerSessions.get(tabId);\n if (existing?.attached) {\n this.touchDebuggerSession(tabId);\n return null;\n }\n\n if (existing?.attachPromise) {\n try {\n await existing.attachPromise;\n } catch (error) {\n const info = mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Debugger attach failed.'\n );\n this.clearDebuggerSession(tabId);\n return info;\n }\n if (existing.attached) {\n this.touchDebuggerSession(tabId);\n return null;\n }\n }\n\n const preflightError = await this.checkDebuggerTarget(tabId);\n if (preflightError) {\n return preflightError;\n }\n\n const session: DebuggerSession = {\n attached: false,\n lastActivityAt: nowIso(),\n };\n this.debuggerSessions.set(tabId, session);\n\n session.attachPromise = wrapChromeVoid((callback) =>\n chrome.debugger.attach({ tabId }, DEBUGGER_PROTOCOL_VERSION, () =>\n callback()\n )\n );\n\n try {\n await session.attachPromise;\n session.attached = true;\n session.attachPromise = undefined;\n const initError = await this.initializeDebuggerDomains(tabId);\n if (initError) {\n await this.detachDebugger(tabId);\n return initError;\n }\n session.initialized = true;\n this.touchDebuggerSession(tabId);\n return null;\n } catch (error) {\n const info = mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Debugger attach failed.'\n );\n this.clearDebuggerSession(tabId);\n return info;\n }\n }\n\n private async initializeDebuggerDomains(\n tabId: number\n ): Promise<DriveErrorInfo | null> {\n // Some CDP features (notably JS dialog handling + console/network events)\n // require domains to be enabled first. This must happen before a dialog\n // opens, otherwise Page.handleJavaScriptDialog can return \"No dialog is showing\".\n const methods: Array<[string, Record<string, unknown> | undefined]> = [\n ['Page.enable', undefined],\n ['Runtime.enable', undefined],\n ['Log.enable', undefined],\n ['Network.enable', undefined],\n ];\n\n try {\n for (const [method, params] of methods) {\n await this.sendDebuggerCommand(\n tabId,\n method,\n params,\n DEFAULT_DEBUGGER_COMMAND_TIMEOUT_MS\n );\n }\n return null;\n } catch (error) {\n return mapDebuggerErrorMessage(\n error instanceof Error\n ? error.message\n : 'Debugger initialization failed.'\n );\n }\n }\n\n private async checkDebuggerTarget(\n tabId: number\n ): Promise<DriveErrorInfo | null> {\n try {\n const tab = await getTab(tabId);\n const url = typeof tab.url === 'string' ? tab.url : undefined;\n if (isRestrictedUrl(url)) {\n return buildRestrictedUrlError({\n url: url ?? 'about:blank',\n operation: 'debugger',\n action: 'debugger.attach',\n });\n }\n } catch (error) {\n return mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Failed to locate tab.',\n 'TAB_NOT_FOUND'\n );\n }\n return null;\n }\n\n private async detachDebugger(tabId: number): Promise<DriveErrorInfo | null> {\n const session = this.debuggerSessions.get(tabId);\n if (!session) {\n return null;\n }\n if (session.attachPromise) {\n try {\n await session.attachPromise;\n } catch (error) {\n console.debug('Debugger attach promise failed before detach.', error);\n this.clearDebuggerSession(tabId);\n return null;\n }\n }\n if (!session.attached) {\n this.clearDebuggerSession(tabId);\n return null;\n }\n try {\n await wrapChromeVoid((callback) =>\n chrome.debugger.detach({ tabId }, () => callback())\n );\n } catch (error) {\n return mapDebuggerErrorMessage(\n error instanceof Error ? error.message : 'Debugger detach failed.'\n );\n } finally {\n this.clearDebuggerSession(tabId);\n }\n return null;\n }\n\n private async detachAllDebuggerSessions(): Promise<void> {\n const tabIds = Array.from(this.debuggerSessions.keys());\n for (const tabId of tabIds) {\n const error = await this.detachDebugger(tabId);\n if (error) {\n console.warn('DriveSocket detachDebugger failed:', tabId, error);\n }\n }\n }\n\n private async sendDebuggerCommand(\n tabId: number,\n method: string,\n params: Record<string, unknown> | undefined,\n timeoutMs: number\n ): Promise<unknown> {\n return await new Promise((resolve, reject) => {\n let finished = false;\n const timeout = self.setTimeout(() => {\n finished = true;\n reject(new DebuggerTimeoutError(timeoutMs));\n }, timeoutMs);\n\n chrome.debugger.sendCommand(\n { tabId },\n method,\n params ?? {},\n (result: unknown) => {\n if (finished) {\n return;\n }\n finished = true;\n clearTimeout(timeout);\n const error = chrome.runtime.lastError;\n if (error) {\n reject(new Error(error.message));\n return;\n }\n resolve(result);\n }\n );\n });\n }\n\n private touchDebuggerSession(tabId: number): void {\n const session = this.debuggerSessions.get(tabId);\n if (!session) {\n return;\n }\n session.lastActivityAt = nowIso();\n void this.refreshDebuggerIdleTimer(tabId).catch((error) => {\n console.error('DriveSocket refreshDebuggerIdleTimer failed:', error);\n });\n }\n\n private async refreshDebuggerIdleTimer(tabId: number): Promise<void> {\n const session = this.debuggerSessions.get(tabId);\n if (!session) {\n return;\n }\n if (session.idleTimer) {\n clearTimeout(session.idleTimer);\n }\n const timeoutMs = await this.getDebuggerIdleTimeoutMs();\n session.idleTimer = self.setTimeout(() => {\n void this.detachDebugger(tabId).catch((error) => {\n console.error('DriveSocket detachDebugger failed:', error);\n });\n }, timeoutMs);\n }\n\n private clearDebuggerSession(tabId: number): void {\n const session = this.debuggerSessions.get(tabId);\n if (!session) {\n return;\n }\n if (session.idleTimer) {\n clearTimeout(session.idleTimer);\n }\n this.debuggerSessions.delete(tabId);\n }\n\n private async getDebuggerIdleTimeoutMs(): Promise<number> {\n if (this.debuggerIdleTimeoutMs !== null) {\n return this.debuggerIdleTimeoutMs;\n }\n const timeout = await readDebuggerIdleTimeoutMs();\n this.debuggerIdleTimeoutMs = timeout;\n return timeout;\n }\n}\n\nclass DebuggerTimeoutError extends Error {\n constructor(timeoutMs: number) {\n super(`Debugger command timed out after ${timeoutMs}ms.`);\n this.name = 'DebuggerTimeoutError';\n }\n}\n\nconst socket = new DriveSocket();\nconst permissionPrompts = new PermissionPromptController();\nconst permissionsRequests = new PermissionsRequestController();\n\nchrome.runtime.onConnect.addListener((port: unknown) => {\n permissionPrompts.handleConnect(port as Record<string, unknown>);\n permissionsRequests.handleConnect(port as Record<string, unknown>);\n});\n\nchrome.windows.onRemoved.addListener((windowId: number) => {\n permissionPrompts.handleWindowRemoved(windowId);\n permissionsRequests.handleWindowRemoved(windowId);\n});\n\nchrome.windows.onFocusChanged.addListener((windowId: number) => {\n if (windowId === chrome.windows.WINDOW_ID_NONE) {\n return;\n }\n void queryActiveTabIdInWindow(windowId)\n .then((tabId) => {\n markTabActive(tabId);\n socket.sendTabReport();\n })\n .catch(() => {\n socket.sendTabReport();\n });\n});\n\nchrome.tabs.onActivated.addListener((activeInfo: { tabId: number }) => {\n markTabActive(activeInfo.tabId);\n socket.sendTabReport();\n});\n\nchrome.tabs.onCreated.addListener((tab: Record<string, unknown>) => {\n if (typeof tab.id === 'number') {\n ensureLastActiveAt(tab.id);\n }\n socket.sendTabReport();\n});\n\nchrome.tabs.onUpdated.addListener(\n (\n tabId: number,\n changeInfo: Record<string, unknown>,\n tab: Record<string, unknown>\n ) => {\n const shouldReport =\n Boolean(changeInfo.url) ||\n Boolean(changeInfo.title) ||\n changeInfo.status === 'complete';\n if (!shouldReport) {\n return;\n }\n if (tab && tab.active) {\n markTabActive(tabId);\n }\n socket.sendTabReport();\n }\n);\n\nchrome.tabs.onRemoved.addListener((tabId: number) => {\n if (agentTabId === tabId) {\n clearAgentTarget();\n }\n lastActiveAtByTab.delete(tabId);\n socket.sendTabReport();\n});\n\nchrome.debugger.onEvent.addListener(\n (source: DebuggerTarget, method: string, params: Record<string, unknown>) => {\n void socket.handleDebuggerEvent(source, method, params).catch((error) => {\n console.error('DriveSocket handleDebuggerEvent failed:', error);\n });\n }\n);\n\nchrome.debugger.onDetach.addListener(\n (source: DebuggerTarget, reason?: string) => {\n void socket.handleDebuggerDetach(source, reason).catch((error) => {\n console.error('DriveSocket handleDebuggerDetach failed:', error);\n });\n }\n);\n\nchrome.runtime.onMessage.addListener(\n (\n message: unknown,\n _sender: unknown,\n sendResponse: (response: unknown) => void\n ) => {\n if (!message || typeof message !== 'object') {\n return undefined;\n }\n const action = (message as { action?: unknown }).action;\n if (action === 'drive.connection_status') {\n sendResponse({\n ok: true,\n result: socket.getConnectionStatus(),\n });\n return true;\n }\n if (action === 'drive.refresh_capabilities') {\n void socket\n .refreshDebuggerCapabilityState()\n .then(() => {\n sendResponse({ ok: true, result: { refreshed: true } });\n })\n .catch((error) => {\n const message =\n error instanceof Error\n ? error.message\n : 'Failed to refresh capabilities.';\n sendResponse({ ok: false, error: { message } });\n });\n return true;\n }\n return undefined;\n }\n);\n\nchrome.storage.onChanged.addListener(\n (changes: Record<string, StorageChange>, areaName: string) => {\n if (areaName !== 'local') {\n return;\n }\n const corePortChange = changes[LEGACY_CORE_PORT_KEY];\n if (!corePortChange) {\n return;\n }\n\n let work = Promise.resolve();\n if (corePortChange) {\n work = work.then(async () => {\n await clearLegacyCorePort(chrome.storage.local);\n });\n }\n\n void work.catch((error) => {\n console.error('DriveSocket storage change handling failed:', error);\n });\n }\n);\n\nvoid clearLegacyCorePort(chrome.storage.local).catch((error) => {\n console.warn('Failed to clear legacy corePort storage.', error);\n});\n\nsocket.start();\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["nowIso", "defaultMakeRequestId", "defaultOpenWindow", "defaultCloseWindow", "delay", "getTab", "getDefaultTabId", "getTab", "permissionPrompts", "delayMs", "delay", "socket", "action", "error", "clickCount", "payload", "cropX", "cropY", "srcW", "srcH", "cropCanvas", "ctx", "message"]
|
|
7
7
|
}
|