@btraut/browser-bridge 0.7.3 → 0.8.1
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 +25 -1
- package/README.md +49 -4
- package/dist/api.js +3922 -3239
- package/dist/api.js.map +4 -4
- package/dist/index.js +1027 -142
- package/dist/index.js.map +4 -4
- package/extension/dist/background.js +853 -23
- package/extension/dist/background.js.map +3 -3
- package/extension/dist/content.js +84 -2
- package/extension/dist/content.js.map +2 -2
- package/extension/dist/options-ui.js +59 -1
- package/extension/dist/options-ui.js.map +2 -2
- package/extension/manifest.json +17 -5
- package/package.json +1 -1
- package/skills/browser-bridge/skill.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/error-sanitizer.ts", "../src/site-permissions.ts", "../src/permission-prompt.ts", "../src/background.ts"],
|
|
4
|
-
"sourcesContent": ["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';\n\nexport type SitePermissionsMode = 'granular' | 'bypass';\nexport const DEFAULT_SITE_PERMISSIONS_MODE: SitePermissionsMode = 'granular';\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 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 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 { sanitizeDriveErrorInfo } from './error-sanitizer.js';\nimport { PermissionPromptController } from './permission-prompt.js';\nimport {\n allowSiteAlways,\n isSiteAllowed,\n readSitePermissionsMode,\n siteKeyFromUrl,\n touchSiteLastUsed,\n} from './site-permissions.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\nconst DEFAULT_CORE_PORT = 3210;\nconst CORE_PORT_KEY = 'corePort';\nconst CORE_WS_PATH = '/drive';\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;\n\nconst AGENT_TAB_ID_KEY = 'agentTabId';\nconst AGENT_TAB_GROUP_TITLE = '\uD83C\uDF09 Browser Bridge';\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 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 readCorePort = async (): Promise<number> => {\n return await new Promise<number>((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(raw);\n return;\n }\n if (typeof raw === 'string') {\n const parsed = Number(raw);\n if (Number.isFinite(parsed)) {\n resolve(parsed);\n return;\n }\n }\n resolve(DEFAULT_CORE_PORT);\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 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 } catch (error) {\n console.debug('Failed to create/update agent tab group.', error);\n }\n};\n\nconst createAgentWindow = async (): Promise<number> => {\n const created = await wrapChromeCallback<Record<string, unknown>>(\n (callback) =>\n chrome.windows.create({ url: 'about:blank', focused: true }, callback)\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 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 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): Promise<ContentResult> => {\n const attemptSend = async (): Promise<ContentResult> => {\n return await new Promise<ContentResult>((resolve) => {\n const message: ContentRequest = { action, params };\n chrome.tabs.sendMessage(tabId, message, (response: ContentResult) => {\n const error = chrome.runtime.lastError;\n if (error) {\n resolve({\n ok: false,\n error: {\n code: 'EVALUATION_FAILED',\n message: error.message,\n retryable: false,\n },\n });\n return;\n }\n if (!response || typeof response !== 'object') {\n resolve({\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 resolve(response);\n });\n });\n };\n\n // After navigation, MV3 content scripts can lag slightly behind the tab's URL\n // update. Retrying avoids flaky \"Receiving end does not exist\" failures.\n const MAX_ATTEMPTS = 5;\n for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt += 1) {\n const result = await attemptSend();\n if (result.ok) {\n return result;\n }\n const message = result.error?.message;\n const isNoReceiver =\n typeof message === 'string' &&\n message.toLowerCase().includes('receiving end does not exist');\n if (!isNoReceiver || attempt === MAX_ATTEMPTS) {\n return result;\n }\n await delayMs(200);\n }\n\n // Unreachable (loop always returns), but keeps TS happy if this code moves.\n return {\n ok: false,\n error: {\n code: 'INTERNAL',\n message: 'Failed to send message to content script.',\n retryable: false,\n },\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 getWsUrl = async (): Promise<string> => {\n const port = await readCorePort();\n return `ws://127.0.0.1:${port}${CORE_WS_PATH}`;\n};\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\n start(): void {\n void this.connect().catch((error) => {\n console.error('DriveSocket connect failed:', 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 }\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.reconnectTimer = self.setTimeout(() => {\n this.reconnectTimer = null;\n void this.connect().catch((error) => {\n console.error('DriveSocket reconnect failed:', 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 url = await getWsUrl();\n try {\n const socket = new WebSocket(url);\n this.socket = socket;\n\n socket.addEventListener('open', () => {\n this.reconnectDelayMs = 1000;\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.socket = null;\n this.stopKeepAlive();\n this.scheduleReconnect();\n });\n\n socket.addEventListener('error', () => {\n this.socket = null;\n this.stopKeepAlive();\n this.scheduleReconnect();\n });\n } catch (error) {\n console.debug('DriveSocket connect failed, scheduling reconnect.', error);\n this.scheduleReconnect();\n }\n }\n\n private async sendHello(): Promise<void> {\n const manifest = chrome.runtime.getManifest();\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 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 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 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.back',\n 'drive.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 await wrapChromeVoid((callback) =>\n chrome.tabs.update(tabId as number, { url }, () => callback())\n );\n markTabActive(tabId as number);\n if (waitMode === 'domcontentloaded') {\n try {\n await waitForDomContentLoaded(tabId as number, 30000);\n } catch (error) {\n respondError({\n code: 'TIMEOUT',\n message:\n error instanceof Error ? error.message : 'Timed out waiting.',\n retryable: true,\n });\n return;\n }\n }\n respondOk({ ok: true });\n return;\n }\n case 'drive.go_back':\n case 'drive.back':\n case 'drive.go_forward':\n case 'drive.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 result = await sendToTab(tabId as number, message.action);\n if (!result.ok) {\n respondError(result.error);\n return;\n }\n markTabActive(tabId as number);\n try {\n await waitForDomContentLoaded(tabId as number, 30000);\n } catch (error) {\n respondError({\n code: 'TIMEOUT',\n message:\n error instanceof Error ? error.message : 'Timed out waiting.',\n retryable: true,\n });\n return;\n }\n respondOk({ ok: true });\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 case 'drive.hover':\n case 'drive.select':\n case 'drive.type':\n case 'drive.fill_form':\n case 'drive.drag':\n case 'drive.key':\n case 'drive.key_press':\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 result = await sendToTab(\n tabId as number,\n message.action,\n params\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 wrapChromeCallback<string>((callback) =>\n chrome.tabs.captureVisibleTab(\n windowId,\n { format: 'png' },\n callback\n )\n );\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 code: 'ARTIFACT_IO_ERROR',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to capture screenshot.',\n retryable: false,\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 code: 'ARTIFACT_IO_ERROR',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to capture element screenshot.',\n retryable: false,\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 code: 'ARTIFACT_IO_ERROR',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to capture full page screenshot.',\n retryable: false,\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 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 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 {\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 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\nsocket.start();\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["nowIso", "delay", "socket", "message", "error", "cropX", "cropY", "srcW", "srcH", "cropCanvas", "ctx"]
|
|
4
|
+
"sourcesContent": ["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';\n\nexport type SitePermissionsMode = 'granular' | 'bypass';\nexport const DEFAULT_SITE_PERMISSIONS_MODE: SitePermissionsMode = 'granular';\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 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 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 { sanitizeDriveErrorInfo } from './error-sanitizer.js';\nimport { PermissionPromptController } from './permission-prompt.js';\nimport {\n allowSiteAlways,\n isSiteAllowed,\n readSitePermissionsMode,\n siteKeyFromUrl,\n touchSiteLastUsed,\n} from './site-permissions.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\nconst DEFAULT_CORE_PORT = 3210;\nconst CORE_PORT_KEY = 'corePort';\nconst CORE_WS_PATH = '/drive';\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 = '\uD83C\uDF09 Browser Bridge';\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 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 readCorePort = async (): Promise<number> => {\n return await new Promise<number>((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(raw);\n return;\n }\n if (typeof raw === 'string') {\n const parsed = Number(raw);\n if (Number.isFinite(parsed)) {\n resolve(parsed);\n return;\n }\n }\n resolve(DEFAULT_CORE_PORT);\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 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 } catch (error) {\n console.debug('Failed to create/update agent tab group.', error);\n }\n};\n\nconst createAgentWindow = async (): Promise<number> => {\n const created = await wrapChromeCallback<Record<string, unknown>>(\n (callback) =>\n chrome.windows.create({ url: 'about:blank', focused: true }, callback)\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 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 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 finish({\n ok: false,\n error: {\n code: 'EVALUATION_FAILED',\n message: error.message,\n retryable: false,\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 content scripts can lag slightly behind the tab's URL\n // update. Retrying avoids flaky \"Receiving end does not exist\" failures.\n const MAX_ATTEMPTS = 5;\n for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt += 1) {\n const result = await attemptSend();\n if (result.ok) {\n return result;\n }\n const message = result.error?.message;\n const isNoReceiver =\n typeof message === 'string' &&\n message.toLowerCase().includes('receiving end does not exist');\n if (!isNoReceiver || attempt === MAX_ATTEMPTS) {\n return result;\n }\n await delayMs(200);\n }\n\n // Unreachable (loop always returns), but keeps TS happy if this code moves.\n return {\n ok: false,\n error: {\n code: 'INTERNAL',\n message: 'Failed to send message to content script.',\n retryable: false,\n },\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 getWsUrl = async (): Promise<string> => {\n const port = await readCorePort();\n return `ws://127.0.0.1:${port}${CORE_WS_PATH}`;\n};\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\n start(): void {\n void this.connect().catch((error) => {\n console.error('DriveSocket connect failed:', 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 }\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.reconnectTimer = self.setTimeout(() => {\n this.reconnectTimer = null;\n void this.connect().catch((error) => {\n console.error('DriveSocket reconnect failed:', 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 url = await getWsUrl();\n try {\n const socket = new WebSocket(url);\n this.socket = socket;\n\n socket.addEventListener('open', () => {\n this.reconnectDelayMs = 1000;\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.socket = null;\n this.stopKeepAlive();\n this.scheduleReconnect();\n });\n\n socket.addEventListener('error', () => {\n this.socket = null;\n this.stopKeepAlive();\n this.scheduleReconnect();\n });\n } catch (error) {\n console.debug('DriveSocket connect failed, scheduling reconnect.', error);\n this.scheduleReconnect();\n }\n }\n\n private async sendHello(): Promise<void> {\n const manifest = chrome.runtime.getManifest();\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 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 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 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.back',\n 'drive.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 await wrapChromeVoid((callback) =>\n chrome.tabs.update(tabId as number, { url }, () => callback())\n );\n markTabActive(tabId as number);\n if (waitMode === 'domcontentloaded') {\n try {\n await waitForDomContentLoaded(tabId as number, 30000);\n } catch (error) {\n respondError({\n code: 'TIMEOUT',\n message:\n error instanceof Error ? error.message : 'Timed out waiting.',\n retryable: true,\n });\n return;\n }\n }\n respondOk({ ok: true });\n return;\n }\n case 'drive.go_back':\n case 'drive.back':\n case 'drive.go_forward':\n case 'drive.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(result.error);\n return;\n }\n }\n respondOk({ ok: true });\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 wrapChromeCallback<string>((callback) =>\n chrome.tabs.captureVisibleTab(\n windowId,\n { format: 'png' },\n callback\n )\n );\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 code: 'ARTIFACT_IO_ERROR',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to capture screenshot.',\n retryable: false,\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 code: 'ARTIFACT_IO_ERROR',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to capture element screenshot.',\n retryable: false,\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 code: 'ARTIFACT_IO_ERROR',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to capture full page screenshot.',\n retryable: false,\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 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 {\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 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\nsocket.start();\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["nowIso", "delay", "socket", "message", "error", "payload", "cropX", "cropY", "srcW", "srcH", "cropCanvas", "ctx"]
|
|
7
7
|
}
|