@btraut/browser-bridge 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,35 @@
1
1
  "use strict";
2
2
  (() => {
3
3
  // packages/extension/src/content.ts
4
+ var AGENT_TAB_BRANDING_ACTION = "drive.agent_tab_branding";
5
+ var AGENT_TAB_FAVICON_MARKER_ATTR = "data-bb-agent-favicon";
6
+ var applyAgentTabFavicon = (faviconUrl) => {
7
+ if (faviconUrl.length === 0) {
8
+ return;
9
+ }
10
+ const links = Array.from(
11
+ document.querySelectorAll('link[rel~="icon"]')
12
+ ).filter((node) => node instanceof HTMLLinkElement);
13
+ if (links.length > 0) {
14
+ for (const link2 of links) {
15
+ link2.href = faviconUrl;
16
+ if (!link2.type) {
17
+ link2.type = "image/png";
18
+ }
19
+ }
20
+ return;
21
+ }
22
+ const head = document.head ?? document.documentElement;
23
+ if (!head) {
24
+ return;
25
+ }
26
+ const link = document.createElement("link");
27
+ link.rel = "icon";
28
+ link.type = "image/png";
29
+ link.href = faviconUrl;
30
+ link.setAttribute(AGENT_TAB_FAVICON_MARKER_ATTR, "true");
31
+ head.appendChild(link);
32
+ };
4
33
  var runDriveAction = async (action, params) => {
5
34
  const buildError = (code, message, details) => ({
6
35
  ok: false,
@@ -344,6 +373,17 @@
344
373
  const parseParams = () => params ?? {};
345
374
  try {
346
375
  switch (action) {
376
+ case AGENT_TAB_BRANDING_ACTION: {
377
+ const { favicon_url: faviconUrl } = parseParams();
378
+ if (typeof faviconUrl !== "string" || faviconUrl.length === 0) {
379
+ return buildError(
380
+ "INVALID_ARGUMENT",
381
+ "favicon_url must be a non-empty string."
382
+ );
383
+ }
384
+ applyAgentTabFavicon(faviconUrl);
385
+ return ok();
386
+ }
347
387
  case "drive.navigate": {
348
388
  const { url } = parseParams();
349
389
  if (typeof url !== "string" || url.length === 0) {
@@ -891,15 +931,13 @@
891
931
  tick();
892
932
  });
893
933
  }
894
- case "drive.go_back":
895
- case "drive.back": {
934
+ case "drive.go_back": {
896
935
  window.setTimeout(() => {
897
936
  history.back();
898
937
  }, 0);
899
938
  return ok();
900
939
  }
901
- case "drive.go_forward":
902
- case "drive.forward": {
940
+ case "drive.go_forward": {
903
941
  window.setTimeout(() => {
904
942
  history.forward();
905
943
  }, 0);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/content.ts"],
4
- "sourcesContent": ["type DriveErrorInfo = {\n code: string;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n};\n\ntype ContentResult =\n | { ok: true; result?: unknown }\n | { ok: false; error: DriveErrorInfo };\n\nexport const runDriveAction = async (\n action: string,\n params: Record<string, unknown> | undefined\n): Promise<ContentResult> => {\n const buildError = (\n code: string,\n message: string,\n details?: Record<string, unknown>\n ): ContentResult => ({\n ok: false,\n error: {\n code,\n message,\n retryable: false,\n ...(details ? { details } : {}),\n },\n });\n\n const ok = (result?: unknown): ContentResult => ({ ok: true, result });\n\n const escapeSelector = (value: string): string => {\n if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\n return CSS.escape(value);\n }\n return value.replace(/[\\\\\"']/g, '\\\\$&');\n };\n\n const isVisible = (element: Element): boolean => {\n if (!(element instanceof HTMLElement)) {\n return false;\n }\n const style = window.getComputedStyle(element);\n if (style.visibility === 'hidden' || style.display === 'none') {\n return false;\n }\n const rect = element.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0) {\n return false;\n }\n if (\n element.offsetWidth === 0 &&\n element.offsetHeight === 0 &&\n element.getClientRects().length === 0\n ) {\n return false;\n }\n let current: HTMLElement | null = element;\n while (current) {\n const style = window.getComputedStyle(current);\n if (style.display === 'none') {\n return false;\n }\n if (style.visibility === 'hidden' || style.visibility === 'collapse') {\n return false;\n }\n const opacity = Number.parseFloat(style.opacity ?? '1');\n if (Number.isFinite(opacity) && opacity <= 0) {\n return false;\n }\n current = current.parentElement;\n }\n return true;\n };\n\n // Heuristic guard against unsafe regex patterns to avoid ReDoS in url_matches.\n const buildUrlMatcher = (\n pattern: string\n ):\n | { ok: true; matcher: (url: string) => boolean }\n | { ok: false; error: ContentResult } => {\n const maxLength = 256;\n if (pattern.length > maxLength) {\n return {\n ok: false,\n error: buildError(\n 'INVALID_ARGUMENT',\n `url_matches pattern exceeds ${maxLength} characters.`\n ),\n };\n }\n const nestedQuantifiers =\n /\\((?:[^()\\\\]|\\\\.)*[+*{](?:[^()\\\\]|\\\\.)*\\)[+*{]/.test(pattern);\n const repeatedWildcards = /(\\.\\*.*\\.\\*)|(\\.\\+.*\\.\\+)/.test(pattern);\n if (nestedQuantifiers || repeatedWildcards) {\n return {\n ok: false,\n error: buildError(\n 'INVALID_ARGUMENT',\n 'url_matches pattern rejected due to unsafe regex complexity.'\n ),\n };\n }\n try {\n const regex = new RegExp(pattern);\n return { ok: true, matcher: (url: string) => regex.test(url) };\n } catch {\n return { ok: true, matcher: (url: string) => url.includes(pattern) };\n }\n };\n\n const findByText = (text: string): Element | null => {\n const tree = document.createTreeWalker(\n document.body,\n NodeFilter.SHOW_ELEMENT\n );\n let node = tree.nextNode();\n while (node) {\n const element = node as Element;\n if (element.textContent && element.textContent.includes(text)) {\n return element;\n }\n node = tree.nextNode();\n }\n return null;\n };\n\n const findByRole = (locator: Record<string, unknown>): Element | null => {\n const role = locator.role;\n if (!role || typeof role !== 'object') {\n return null;\n }\n const roleName = (role as Record<string, unknown>).name;\n const roleValue = (role as Record<string, unknown>).value;\n if (typeof roleName !== 'string' || roleName.length === 0) {\n return null;\n }\n const candidates = Array.from(\n document.querySelectorAll(`[role=\"${escapeSelector(roleName)}\"]`)\n );\n if (typeof roleValue !== 'string' || roleValue.length === 0) {\n return candidates[0] ?? null;\n }\n return (\n candidates.find((candidate) => {\n const label = candidate.getAttribute('aria-label') ?? '';\n const text = candidate.textContent ?? '';\n return label.includes(roleValue) || text.includes(roleValue);\n }) ?? null\n );\n };\n\n const resolveLocator = (\n locator: Record<string, unknown> | undefined\n ): Element | null => {\n if (!locator) {\n return null;\n }\n const ref = locator.ref;\n if (typeof ref === 'string' && ref.length > 0) {\n const normalized = ref.startsWith('@') ? ref : `@${ref}`;\n const selector = `[data-bv-ref=\"${escapeSelector(normalized)}\"]`;\n const found = document.querySelector(selector);\n if (found) {\n return found;\n }\n }\n const testid = locator.testid;\n if (typeof testid === 'string' && testid.length > 0) {\n const selector = `[data-testid=\"${escapeSelector(testid)}\"]`;\n const found = document.querySelector(selector);\n if (found) {\n return found;\n }\n }\n const css = locator.css;\n if (typeof css === 'string' && css.length > 0) {\n const found = document.querySelector(css);\n if (found) {\n return found;\n }\n }\n const byRole = findByRole(locator);\n if (byRole) {\n return byRole;\n }\n const text = locator.text;\n if (typeof text === 'string' && text.length > 0) {\n return findByText(text);\n }\n return null;\n };\n\n const coerceBoolean = (value: string | boolean): boolean => {\n if (typeof value === 'boolean') {\n return value;\n }\n const normalized = value.trim().toLowerCase();\n return ['true', '1', 'yes', 'y', 'on', 'checked'].includes(normalized);\n };\n\n const dispatchValueEvents = (element: HTMLElement): void => {\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('change', { bubbles: true }));\n };\n\n const selectOption = (select: HTMLSelectElement, value: string): boolean => {\n const option = Array.from(select.options).find(\n (entry) => entry.value === value || entry.text === value\n );\n if (!option) {\n return false;\n }\n select.value = option.value;\n dispatchValueEvents(select);\n return true;\n };\n\n const selectOptionByIndex = (\n select: HTMLSelectElement,\n index: number\n ): boolean => {\n if (!Number.isInteger(index)) {\n return false;\n }\n if (index < 0 || index >= select.options.length) {\n return false;\n }\n select.selectedIndex = index;\n dispatchValueEvents(select);\n return true;\n };\n\n const setTextValue = (\n element: HTMLElement,\n value: string,\n clear: boolean\n ): boolean => {\n const tag = element.tagName.toLowerCase();\n if (tag === 'input' || tag === 'textarea') {\n const input = element as HTMLInputElement | HTMLTextAreaElement;\n if (clear) {\n input.value = '';\n }\n input.value = `${input.value}${value}`;\n dispatchValueEvents(input);\n return true;\n }\n if (element.isContentEditable) {\n if (clear) {\n element.textContent = '';\n }\n element.textContent = `${element.textContent ?? ''}${value}`;\n dispatchValueEvents(element);\n return true;\n }\n return false;\n };\n\n const detectFieldType = (\n element: Element\n ): 'text' | 'select' | 'checkbox' | 'radio' | 'contentEditable' => {\n if (element instanceof HTMLSelectElement) {\n return 'select';\n }\n if (element instanceof HTMLInputElement) {\n const type = element.type.toLowerCase();\n if (type === 'checkbox') {\n return 'checkbox';\n }\n if (type === 'radio') {\n return 'radio';\n }\n return 'text';\n }\n if (element instanceof HTMLTextAreaElement) {\n return 'text';\n }\n if (element instanceof HTMLElement && element.isContentEditable) {\n return 'contentEditable';\n }\n return 'text';\n };\n\n const submitIfRequested = (element: Element): void => {\n const form = element.closest('form');\n if (form && form instanceof HTMLFormElement) {\n form.requestSubmit();\n } else if (element instanceof HTMLElement) {\n element.dispatchEvent(\n new KeyboardEvent('keydown', { key: 'Enter', bubbles: true })\n );\n }\n };\n\n const sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => window.setTimeout(resolve, ms));\n\n const dispatchPointer = (\n element: Element,\n type: string,\n x: number,\n y: number\n ): void => {\n element.dispatchEvent(\n new PointerEvent(type, {\n bubbles: true,\n cancelable: true,\n clientX: x,\n clientY: y,\n button: 0,\n })\n );\n };\n\n const dispatchDrag = (\n element: Element,\n type: string,\n x: number,\n y: number,\n dataTransfer?: DataTransfer\n ): void => {\n try {\n element.dispatchEvent(\n new DragEvent(type, {\n bubbles: true,\n cancelable: true,\n clientX: x,\n clientY: y,\n dataTransfer,\n })\n );\n } catch {\n element.dispatchEvent(\n new Event(type, { bubbles: true, cancelable: true })\n );\n }\n };\n\n const 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 const normalizeModifiers = (\n modifiers: unknown\n ): { ctrl: boolean; alt: boolean; shift: boolean; meta: boolean } => {\n const state = { ctrl: false, alt: false, shift: false, meta: false };\n if (Array.isArray(modifiers)) {\n modifiers.forEach((modifier) => {\n if (typeof modifier !== 'string') {\n return;\n }\n const normalized = modifier.toLowerCase();\n if (normalized === 'ctrl') {\n state.ctrl = true;\n } else if (normalized === 'alt') {\n state.alt = true;\n } else if (normalized === 'shift') {\n state.shift = true;\n } else if (normalized === 'meta') {\n state.meta = true;\n }\n });\n return state;\n }\n if (modifiers && typeof modifiers === 'object') {\n const record = modifiers as Record<string, unknown>;\n state.ctrl = Boolean(record.ctrl);\n state.alt = Boolean(record.alt);\n state.shift = Boolean(record.shift);\n state.meta = Boolean(record.meta);\n }\n return state;\n };\n\n const activeEditableElement = (): HTMLElement | null => {\n const active = document.activeElement;\n if (!active || !(active instanceof HTMLElement)) {\n return null;\n }\n const tag = active.tagName.toLowerCase();\n if (tag === 'input' || tag === 'textarea' || active.isContentEditable) {\n return active;\n }\n return null;\n };\n\n const parseParams = (): Record<string, unknown> => params ?? {};\n\n try {\n switch (action) {\n case 'drive.navigate': {\n const { url } = parseParams();\n if (typeof url !== 'string' || url.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'url must be a non-empty string.'\n );\n }\n window.location.href = url;\n return ok();\n }\n case 'drive.locator_point': {\n const { locator } = parseParams();\n const target = resolveLocator(locator as Record<string, unknown>);\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n const rect = target.getBoundingClientRect();\n return ok({\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n });\n }\n case 'drive.snapshot_html': {\n const html = document.documentElement?.outerHTML ?? '';\n return ok({ format: 'html', snapshot: html });\n }\n case 'drive.type_target_point': {\n const { locator } = parseParams();\n let target = resolveLocator(\n locator as Record<string, unknown> | undefined\n );\n if (!target) {\n target = activeEditableElement();\n }\n if (!target || !(target instanceof HTMLElement)) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n const tag = target.tagName.toLowerCase();\n if (\n tag !== 'input' &&\n tag !== 'textarea' &&\n !target.isContentEditable\n ) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'Target is not editable (input, textarea, or contenteditable).'\n );\n }\n const rect = target.getBoundingClientRect();\n return ok({\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n });\n }\n case 'drive.clear_active_editable': {\n const target = activeEditableElement();\n if (!target) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'No active editable target to clear.'\n );\n }\n const tag = target.tagName.toLowerCase();\n if (tag === 'input' || tag === 'textarea') {\n const input = target as HTMLInputElement | HTMLTextAreaElement;\n input.value = '';\n dispatchValueEvents(input);\n return ok({ ok: true });\n }\n if (target.isContentEditable) {\n target.textContent = '';\n dispatchValueEvents(target);\n return ok({ ok: true });\n }\n return buildError(\n 'INVALID_ARGUMENT',\n 'Active target is not editable (input, textarea, or contenteditable).'\n );\n }\n case 'drive.click': {\n const { locator, click_count } = parseParams();\n const target = resolveLocator(locator as Record<string, unknown>);\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n const count =\n typeof click_count === 'number' && Number.isFinite(click_count)\n ? Math.max(1, Math.floor(click_count))\n : 1;\n // Clicking elements that trigger JS dialogs (alert/confirm/prompt) can\n // block the renderer thread before we can reply to the background script,\n // causing the caller to time out. Defer the click to the next tick so\n // we can respond immediately.\n window.setTimeout(() => {\n try {\n if (target instanceof HTMLElement) {\n try {\n target.focus({ preventScroll: true });\n } catch {\n target.focus();\n }\n }\n for (let i = 0; i < count; i += 1) {\n (target as HTMLElement).click();\n }\n } catch {\n // Best-effort: the element may have disappeared or navigation occurred.\n }\n }, 0);\n return ok();\n }\n case 'drive.hover': {\n const { locator, delay_ms } = parseParams();\n const target = resolveLocator(locator as Record<string, unknown>);\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n const rect = target.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const eventInit = {\n bubbles: true,\n cancelable: true,\n clientX: centerX,\n clientY: centerY,\n };\n target.dispatchEvent(new MouseEvent('mouseover', eventInit));\n target.dispatchEvent(\n new MouseEvent('mouseenter', { ...eventInit, bubbles: false })\n );\n target.dispatchEvent(new MouseEvent('mousemove', eventInit));\n if (typeof delay_ms === 'number' && Number.isFinite(delay_ms)) {\n const waitMs = Math.min(Math.max(delay_ms, 0), 10000);\n if (waitMs > 0) {\n await sleep(waitMs);\n }\n }\n const html = document.documentElement?.outerHTML ?? '';\n return ok({ format: 'html', snapshot: html });\n }\n case 'drive.select': {\n const { locator, value, text, index } = parseParams();\n const target = resolveLocator(locator as Record<string, unknown>);\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n if (!(target instanceof HTMLSelectElement)) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'Target is not a select element.'\n );\n }\n let applied = false;\n if (typeof index === 'number' && Number.isFinite(index)) {\n applied = selectOptionByIndex(target, Math.trunc(index));\n }\n if (!applied && typeof value === 'string') {\n applied = selectOption(target, value);\n }\n if (!applied && typeof text === 'string') {\n applied = selectOption(target, text);\n }\n if (!applied) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'No matching option found for select.'\n );\n }\n return ok();\n }\n case 'drive.type': {\n const { locator, text, clear, submit } = parseParams();\n if (typeof text !== 'string') {\n return buildError('INVALID_ARGUMENT', 'text must be a string.');\n }\n let target = resolveLocator(\n locator as Record<string, unknown> | undefined\n );\n if (!target) {\n const active = activeEditableElement();\n if (active) {\n target = active;\n }\n }\n if (!target || !(target instanceof HTMLElement)) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n target.focus();\n const tag = target.tagName.toLowerCase();\n const shouldClear = Boolean(clear);\n if (tag === 'input' || tag === 'textarea') {\n const input = target as HTMLInputElement | HTMLTextAreaElement;\n if (shouldClear) {\n input.value = '';\n }\n input.value = `${input.value}${text}`;\n input.dispatchEvent(new Event('input', { bubbles: true }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n } else if (target.isContentEditable) {\n if (shouldClear) {\n target.textContent = '';\n }\n target.textContent = `${target.textContent ?? ''}${text}`;\n target.dispatchEvent(new Event('input', { bubbles: true }));\n } else {\n return buildError(\n 'INVALID_ARGUMENT',\n 'Target is not editable (input, textarea, or contenteditable).'\n );\n }\n\n if (submit) {\n const form = target.closest('form');\n if (form && form instanceof HTMLFormElement) {\n form.requestSubmit();\n } else {\n target.dispatchEvent(\n new KeyboardEvent('keydown', {\n key: 'Enter',\n bubbles: true,\n })\n );\n }\n }\n\n return ok();\n }\n case 'drive.detect_field_type': {\n const { locator, selector } = parseParams();\n let target = resolveLocator(\n locator as Record<string, unknown> | undefined\n );\n if (!target && typeof selector === 'string' && selector.length > 0) {\n target = document.querySelector(selector);\n }\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n return ok({ fieldType: detectFieldType(target) });\n }\n case 'drive.fill_form': {\n const { fields } = parseParams();\n if (!Array.isArray(fields) || fields.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'fields must be a non-empty array.'\n );\n }\n let filled = 0;\n const errors: string[] = [];\n fields.forEach((field, index) => {\n if (!field || typeof field !== 'object') {\n errors.push(`Field ${index} is not an object.`);\n return;\n }\n const record = field as Record<string, unknown>;\n const selector = record.selector;\n const locator =\n record.locator && typeof record.locator === 'object'\n ? (record.locator as Record<string, unknown>)\n : undefined;\n let element: Element | null = null;\n if (locator) {\n element = resolveLocator(locator);\n }\n if (!element && typeof selector === 'string' && selector.length > 0) {\n element = document.querySelector(selector);\n }\n if (!element) {\n errors.push(`Field ${index} could not be resolved.`);\n return;\n }\n\n const value = record.value;\n if (typeof value !== 'string' && typeof value !== 'boolean') {\n errors.push(`Field ${index} has invalid value.`);\n return;\n }\n\n const type =\n typeof record.type === 'string' && record.type.length > 0\n ? record.type\n : 'auto';\n const resolvedType =\n type === 'auto' ? detectFieldType(element) : type;\n const submit = Boolean(record.submit);\n\n let applied = false;\n if (resolvedType === 'select') {\n if (element instanceof HTMLSelectElement) {\n applied = selectOption(element, String(value));\n }\n } else if (resolvedType === 'checkbox' || resolvedType === 'radio') {\n if (element instanceof HTMLInputElement) {\n const shouldCheck =\n typeof value === 'boolean' ? value : coerceBoolean(value);\n element.checked = shouldCheck;\n dispatchValueEvents(element);\n applied = true;\n }\n } else {\n if (element instanceof HTMLElement) {\n applied = setTextValue(element, String(value), true);\n }\n }\n\n if (!applied) {\n errors.push(`Field ${index} could not be filled.`);\n return;\n }\n\n if (submit) {\n submitIfRequested(element);\n }\n filled += 1;\n });\n\n return ok({\n filled,\n attempted: fields.length,\n errors: errors.length > 0 ? errors : [],\n });\n }\n case 'drive.drag': {\n const { from, to, steps } = parseParams();\n const fromEl = resolveLocator(from as Record<string, unknown>);\n if (!fromEl) {\n return buildError(\n 'LOCATOR_NOT_FOUND',\n 'Failed to resolve drag source.'\n );\n }\n const toEl = resolveLocator(to as Record<string, unknown>);\n if (!toEl) {\n return buildError(\n 'LOCATOR_NOT_FOUND',\n 'Failed to resolve drag target.'\n );\n }\n\n const fromRect = fromEl.getBoundingClientRect();\n const toRect = toEl.getBoundingClientRect();\n const startX = fromRect.left + fromRect.width / 2;\n const startY = fromRect.top + fromRect.height / 2;\n const endX = toRect.left + toRect.width / 2;\n const endY = toRect.top + toRect.height / 2;\n // Defensive bounds in case content script receives unvalidated inputs.\n const totalSteps =\n typeof steps === 'number' && Number.isFinite(steps)\n ? Math.max(1, Math.min(50, Math.floor(steps)))\n : 12;\n let dataTransfer: DataTransfer | undefined;\n try {\n dataTransfer = new DataTransfer();\n } catch {\n dataTransfer = undefined;\n }\n\n dispatchPointer(fromEl, 'pointerdown', startX, startY);\n dispatchDrag(fromEl, 'dragstart', startX, startY, dataTransfer);\n\n for (let i = 1; i <= totalSteps; i += 1) {\n const progress = i / totalSteps;\n const x = startX + (endX - startX) * progress;\n const y = startY + (endY - startY) * progress;\n const target = document.elementFromPoint(x, y) ?? toEl;\n dispatchPointer(target, 'pointermove', x, y);\n dispatchDrag(target, 'dragover', x, y, dataTransfer);\n await sleep(10);\n }\n\n const dropTarget = document.elementFromPoint(endX, endY) ?? toEl;\n dispatchDrag(dropTarget, 'drop', endX, endY, dataTransfer);\n dispatchPointer(dropTarget, 'pointerup', endX, endY);\n dispatchDrag(fromEl, 'dragend', endX, endY, dataTransfer);\n return ok();\n }\n case 'drive.key_press': {\n const { key, modifiers } = parseParams();\n if (typeof key !== 'string' || key.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'key must be a non-empty string.'\n );\n }\n const target =\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : document.body;\n if (!target) {\n return buildError('INVALID_ARGUMENT', 'No target for key press.');\n }\n const mods = normalizeModifiers(modifiers);\n const eventInit = {\n key,\n code: keyToCode(key),\n bubbles: true,\n cancelable: true,\n ctrlKey: mods.ctrl,\n altKey: mods.alt,\n shiftKey: mods.shift,\n metaKey: mods.meta,\n };\n target.dispatchEvent(new KeyboardEvent('keydown', eventInit));\n target.dispatchEvent(new KeyboardEvent('keyup', eventInit));\n return ok();\n }\n case 'drive.key': {\n const { key, modifiers, repeat } = parseParams();\n if (typeof key !== 'string' || key.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'key must be a non-empty string.'\n );\n }\n const target =\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : document.body;\n if (!target) {\n return buildError('INVALID_ARGUMENT', 'No target for key press.');\n }\n const mods = normalizeModifiers(modifiers);\n const eventInit = {\n key,\n code: keyToCode(key),\n bubbles: true,\n cancelable: true,\n ctrlKey: mods.ctrl,\n altKey: mods.alt,\n shiftKey: mods.shift,\n metaKey: mods.meta,\n };\n const count =\n typeof repeat === 'number' && Number.isFinite(repeat)\n ? Math.max(1, Math.min(50, Math.floor(repeat)))\n : 1;\n for (let i = 0; i < count; i += 1) {\n target.dispatchEvent(new KeyboardEvent('keydown', eventInit));\n target.dispatchEvent(new KeyboardEvent('keyup', eventInit));\n }\n return ok();\n }\n case 'drive.scroll': {\n const { delta_x, delta_y, top, left, behavior } = parseParams();\n const scrollBehavior =\n behavior === 'smooth' || behavior === 'auto' ? behavior : undefined;\n if (typeof top === 'number' || typeof left === 'number') {\n window.scrollTo({\n top: typeof top === 'number' ? top : undefined,\n left: typeof left === 'number' ? left : undefined,\n behavior: scrollBehavior,\n });\n return ok();\n }\n if (typeof delta_x === 'number' || typeof delta_y === 'number') {\n window.scrollBy({\n left: typeof delta_x === 'number' ? delta_x : 0,\n top: typeof delta_y === 'number' ? delta_y : 0,\n behavior: scrollBehavior,\n });\n return ok();\n }\n return buildError(\n 'INVALID_ARGUMENT',\n 'scroll requires delta_x/delta_y or top/left.'\n );\n }\n case 'drive.screenshot_meta': {\n const root = document.documentElement;\n const body = document.body;\n const scrollWidth = Math.max(\n root?.scrollWidth ?? 0,\n root?.clientWidth ?? 0,\n body?.scrollWidth ?? 0,\n body?.clientWidth ?? 0\n );\n const scrollHeight = Math.max(\n root?.scrollHeight ?? 0,\n root?.clientHeight ?? 0,\n body?.scrollHeight ?? 0,\n body?.clientHeight ?? 0\n );\n\n return ok({\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n scrollWidth,\n scrollHeight,\n devicePixelRatio:\n typeof window.devicePixelRatio === 'number' &&\n Number.isFinite(window.devicePixelRatio) &&\n window.devicePixelRatio > 0\n ? window.devicePixelRatio\n : 1,\n });\n }\n case 'drive.screenshot_element': {\n const { selector } = parseParams();\n if (typeof selector !== 'string' || selector.trim().length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'selector must be a non-empty string.'\n );\n }\n\n let element: Element | null = null;\n try {\n element = document.querySelector(selector);\n } catch {\n return buildError(\n 'INVALID_ARGUMENT',\n 'selector must be a valid CSS selector.'\n );\n }\n\n if (!element) {\n return buildError('INVALID_ARGUMENT', 'No element matched selector.');\n }\n\n try {\n (element as HTMLElement).scrollIntoView?.({\n block: 'center',\n inline: 'center',\n });\n } catch {\n // Ignore scroll failures; capture whatever is visible.\n }\n\n const rect = element.getBoundingClientRect();\n const scrollX = window.scrollX;\n const scrollY = window.scrollY;\n const dpr =\n typeof window.devicePixelRatio === 'number' &&\n Number.isFinite(window.devicePixelRatio) &&\n window.devicePixelRatio > 0\n ? window.devicePixelRatio\n : 1;\n\n return ok({\n selector,\n pageX: rect.left + scrollX,\n pageY: rect.top + scrollY,\n width: rect.width,\n height: rect.height,\n viewportLeft: rect.left,\n viewportTop: rect.top,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n scrollX,\n scrollY,\n devicePixelRatio: dpr,\n });\n }\n case 'drive.wait_for': {\n const { condition, timeout_ms } = parseParams();\n if (!condition || typeof condition !== 'object') {\n return buildError('INVALID_ARGUMENT', 'condition must be an object.');\n }\n const kind = (condition as Record<string, unknown>).kind;\n const value = (condition as Record<string, unknown>).value;\n if (\n typeof kind !== 'string' ||\n !['locator_visible', 'text_present', 'url_matches'].includes(kind)\n ) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'condition.kind must be locator_visible, text_present, or url_matches.'\n );\n }\n if (typeof value !== 'string' || value.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'condition.value must be a non-empty string.'\n );\n }\n const timeout =\n typeof timeout_ms === 'number' && Number.isFinite(timeout_ms)\n ? Math.max(0, timeout_ms)\n : 30000;\n const start = Date.now();\n const urlMatcher =\n kind === 'url_matches' ? buildUrlMatcher(value) : null;\n if (urlMatcher && !urlMatcher.ok) {\n return urlMatcher.error;\n }\n\n const checkCondition = (): boolean => {\n if (kind === 'text_present') {\n return (document.body?.innerText ?? '').includes(value);\n }\n if (kind === 'url_matches') {\n return urlMatcher\n ? urlMatcher.matcher(window.location.href)\n : window.location.href.includes(value);\n }\n const selector = value;\n const element = document.querySelector(selector);\n return Boolean(element && isVisible(element));\n };\n\n return await new Promise<ContentResult>((resolve) => {\n const tick = () => {\n if (checkCondition()) {\n resolve(ok());\n return;\n }\n if (Date.now() - start >= timeout) {\n resolve(\n buildError('TIMEOUT', `wait_for timed out after ${timeout}ms.`)\n );\n return;\n }\n window.setTimeout(tick, 100);\n };\n tick();\n });\n }\n case 'drive.go_back':\n case 'drive.back': {\n // Trigger history changes on the next tick so the background script gets\n // our response before this page unloads.\n window.setTimeout(() => {\n history.back();\n }, 0);\n return ok();\n }\n case 'drive.go_forward':\n case 'drive.forward': {\n window.setTimeout(() => {\n history.forward();\n }, 0);\n return ok();\n }\n default:\n return buildError('INVALID_ARGUMENT', `Unsupported action ${action}.`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return buildError('EVALUATION_FAILED', message);\n }\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nif (typeof chrome !== 'undefined' && chrome.runtime?.onMessage) {\n chrome.runtime.onMessage.addListener(\n (\n message: Record<string, unknown>,\n _sender: unknown,\n sendResponse: (response: ContentResult) => void\n ) => {\n if (!isRecord(message) || typeof message.action !== 'string') {\n sendResponse({\n ok: false,\n error: {\n code: 'INVALID_ARGUMENT',\n message: 'Invalid content script request.',\n retryable: false,\n },\n });\n return;\n }\n\n void runDriveAction(\n message.action,\n message.params as Record<string, unknown>\n )\n .then(sendResponse)\n .catch((error) => {\n const messageText =\n error instanceof Error ? error.message : 'Unknown error';\n sendResponse({\n ok: false,\n error: {\n code: 'EVALUATION_FAILED',\n message: messageText,\n retryable: false,\n },\n });\n });\n\n return true;\n }\n );\n}\n"],
5
- "mappings": "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",
6
- "names": ["style"]
4
+ "sourcesContent": ["type DriveErrorInfo = {\n code: string;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n};\n\ntype ContentResult =\n | { ok: true; result?: unknown }\n | { ok: false; error: DriveErrorInfo };\n\nconst AGENT_TAB_BRANDING_ACTION = 'drive.agent_tab_branding';\nconst AGENT_TAB_FAVICON_MARKER_ATTR = 'data-bb-agent-favicon';\n\nconst applyAgentTabFavicon = (faviconUrl: string): void => {\n if (faviconUrl.length === 0) {\n return;\n }\n const links = Array.from(\n document.querySelectorAll('link[rel~=\"icon\"]')\n ).filter((node): node is HTMLLinkElement => node instanceof HTMLLinkElement);\n if (links.length > 0) {\n for (const link of links) {\n link.href = faviconUrl;\n if (!link.type) {\n link.type = 'image/png';\n }\n }\n return;\n }\n\n const head = document.head ?? document.documentElement;\n if (!head) {\n return;\n }\n const link = document.createElement('link');\n link.rel = 'icon';\n link.type = 'image/png';\n link.href = faviconUrl;\n link.setAttribute(AGENT_TAB_FAVICON_MARKER_ATTR, 'true');\n head.appendChild(link);\n};\n\nexport const runDriveAction = async (\n action: string,\n params: Record<string, unknown> | undefined\n): Promise<ContentResult> => {\n const buildError = (\n code: string,\n message: string,\n details?: Record<string, unknown>\n ): ContentResult => ({\n ok: false,\n error: {\n code,\n message,\n retryable: false,\n ...(details ? { details } : {}),\n },\n });\n\n const ok = (result?: unknown): ContentResult => ({ ok: true, result });\n\n const escapeSelector = (value: string): string => {\n if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\n return CSS.escape(value);\n }\n return value.replace(/[\\\\\"']/g, '\\\\$&');\n };\n\n const isVisible = (element: Element): boolean => {\n if (!(element instanceof HTMLElement)) {\n return false;\n }\n const style = window.getComputedStyle(element);\n if (style.visibility === 'hidden' || style.display === 'none') {\n return false;\n }\n const rect = element.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0) {\n return false;\n }\n if (\n element.offsetWidth === 0 &&\n element.offsetHeight === 0 &&\n element.getClientRects().length === 0\n ) {\n return false;\n }\n let current: HTMLElement | null = element;\n while (current) {\n const style = window.getComputedStyle(current);\n if (style.display === 'none') {\n return false;\n }\n if (style.visibility === 'hidden' || style.visibility === 'collapse') {\n return false;\n }\n const opacity = Number.parseFloat(style.opacity ?? '1');\n if (Number.isFinite(opacity) && opacity <= 0) {\n return false;\n }\n current = current.parentElement;\n }\n return true;\n };\n\n // Heuristic guard against unsafe regex patterns to avoid ReDoS in url_matches.\n const buildUrlMatcher = (\n pattern: string\n ):\n | { ok: true; matcher: (url: string) => boolean }\n | { ok: false; error: ContentResult } => {\n const maxLength = 256;\n if (pattern.length > maxLength) {\n return {\n ok: false,\n error: buildError(\n 'INVALID_ARGUMENT',\n `url_matches pattern exceeds ${maxLength} characters.`\n ),\n };\n }\n const nestedQuantifiers =\n /\\((?:[^()\\\\]|\\\\.)*[+*{](?:[^()\\\\]|\\\\.)*\\)[+*{]/.test(pattern);\n const repeatedWildcards = /(\\.\\*.*\\.\\*)|(\\.\\+.*\\.\\+)/.test(pattern);\n if (nestedQuantifiers || repeatedWildcards) {\n return {\n ok: false,\n error: buildError(\n 'INVALID_ARGUMENT',\n 'url_matches pattern rejected due to unsafe regex complexity.'\n ),\n };\n }\n try {\n const regex = new RegExp(pattern);\n return { ok: true, matcher: (url: string) => regex.test(url) };\n } catch {\n return { ok: true, matcher: (url: string) => url.includes(pattern) };\n }\n };\n\n const findByText = (text: string): Element | null => {\n const tree = document.createTreeWalker(\n document.body,\n NodeFilter.SHOW_ELEMENT\n );\n let node = tree.nextNode();\n while (node) {\n const element = node as Element;\n if (element.textContent && element.textContent.includes(text)) {\n return element;\n }\n node = tree.nextNode();\n }\n return null;\n };\n\n const findByRole = (locator: Record<string, unknown>): Element | null => {\n const role = locator.role;\n if (!role || typeof role !== 'object') {\n return null;\n }\n const roleName = (role as Record<string, unknown>).name;\n const roleValue = (role as Record<string, unknown>).value;\n if (typeof roleName !== 'string' || roleName.length === 0) {\n return null;\n }\n const candidates = Array.from(\n document.querySelectorAll(`[role=\"${escapeSelector(roleName)}\"]`)\n );\n if (typeof roleValue !== 'string' || roleValue.length === 0) {\n return candidates[0] ?? null;\n }\n return (\n candidates.find((candidate) => {\n const label = candidate.getAttribute('aria-label') ?? '';\n const text = candidate.textContent ?? '';\n return label.includes(roleValue) || text.includes(roleValue);\n }) ?? null\n );\n };\n\n const resolveLocator = (\n locator: Record<string, unknown> | undefined\n ): Element | null => {\n if (!locator) {\n return null;\n }\n const ref = locator.ref;\n if (typeof ref === 'string' && ref.length > 0) {\n const normalized = ref.startsWith('@') ? ref : `@${ref}`;\n const selector = `[data-bv-ref=\"${escapeSelector(normalized)}\"]`;\n const found = document.querySelector(selector);\n if (found) {\n return found;\n }\n }\n const testid = locator.testid;\n if (typeof testid === 'string' && testid.length > 0) {\n const selector = `[data-testid=\"${escapeSelector(testid)}\"]`;\n const found = document.querySelector(selector);\n if (found) {\n return found;\n }\n }\n const css = locator.css;\n if (typeof css === 'string' && css.length > 0) {\n const found = document.querySelector(css);\n if (found) {\n return found;\n }\n }\n const byRole = findByRole(locator);\n if (byRole) {\n return byRole;\n }\n const text = locator.text;\n if (typeof text === 'string' && text.length > 0) {\n return findByText(text);\n }\n return null;\n };\n\n const coerceBoolean = (value: string | boolean): boolean => {\n if (typeof value === 'boolean') {\n return value;\n }\n const normalized = value.trim().toLowerCase();\n return ['true', '1', 'yes', 'y', 'on', 'checked'].includes(normalized);\n };\n\n const dispatchValueEvents = (element: HTMLElement): void => {\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('change', { bubbles: true }));\n };\n\n const selectOption = (select: HTMLSelectElement, value: string): boolean => {\n const option = Array.from(select.options).find(\n (entry) => entry.value === value || entry.text === value\n );\n if (!option) {\n return false;\n }\n select.value = option.value;\n dispatchValueEvents(select);\n return true;\n };\n\n const selectOptionByIndex = (\n select: HTMLSelectElement,\n index: number\n ): boolean => {\n if (!Number.isInteger(index)) {\n return false;\n }\n if (index < 0 || index >= select.options.length) {\n return false;\n }\n select.selectedIndex = index;\n dispatchValueEvents(select);\n return true;\n };\n\n const setTextValue = (\n element: HTMLElement,\n value: string,\n clear: boolean\n ): boolean => {\n const tag = element.tagName.toLowerCase();\n if (tag === 'input' || tag === 'textarea') {\n const input = element as HTMLInputElement | HTMLTextAreaElement;\n if (clear) {\n input.value = '';\n }\n input.value = `${input.value}${value}`;\n dispatchValueEvents(input);\n return true;\n }\n if (element.isContentEditable) {\n if (clear) {\n element.textContent = '';\n }\n element.textContent = `${element.textContent ?? ''}${value}`;\n dispatchValueEvents(element);\n return true;\n }\n return false;\n };\n\n const detectFieldType = (\n element: Element\n ): 'text' | 'select' | 'checkbox' | 'radio' | 'contentEditable' => {\n if (element instanceof HTMLSelectElement) {\n return 'select';\n }\n if (element instanceof HTMLInputElement) {\n const type = element.type.toLowerCase();\n if (type === 'checkbox') {\n return 'checkbox';\n }\n if (type === 'radio') {\n return 'radio';\n }\n return 'text';\n }\n if (element instanceof HTMLTextAreaElement) {\n return 'text';\n }\n if (element instanceof HTMLElement && element.isContentEditable) {\n return 'contentEditable';\n }\n return 'text';\n };\n\n const submitIfRequested = (element: Element): void => {\n const form = element.closest('form');\n if (form && form instanceof HTMLFormElement) {\n form.requestSubmit();\n } else if (element instanceof HTMLElement) {\n element.dispatchEvent(\n new KeyboardEvent('keydown', { key: 'Enter', bubbles: true })\n );\n }\n };\n\n const sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => window.setTimeout(resolve, ms));\n\n const dispatchPointer = (\n element: Element,\n type: string,\n x: number,\n y: number\n ): void => {\n element.dispatchEvent(\n new PointerEvent(type, {\n bubbles: true,\n cancelable: true,\n clientX: x,\n clientY: y,\n button: 0,\n })\n );\n };\n\n const dispatchDrag = (\n element: Element,\n type: string,\n x: number,\n y: number,\n dataTransfer?: DataTransfer\n ): void => {\n try {\n element.dispatchEvent(\n new DragEvent(type, {\n bubbles: true,\n cancelable: true,\n clientX: x,\n clientY: y,\n dataTransfer,\n })\n );\n } catch {\n element.dispatchEvent(\n new Event(type, { bubbles: true, cancelable: true })\n );\n }\n };\n\n const 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 const normalizeModifiers = (\n modifiers: unknown\n ): { ctrl: boolean; alt: boolean; shift: boolean; meta: boolean } => {\n const state = { ctrl: false, alt: false, shift: false, meta: false };\n if (Array.isArray(modifiers)) {\n modifiers.forEach((modifier) => {\n if (typeof modifier !== 'string') {\n return;\n }\n const normalized = modifier.toLowerCase();\n if (normalized === 'ctrl') {\n state.ctrl = true;\n } else if (normalized === 'alt') {\n state.alt = true;\n } else if (normalized === 'shift') {\n state.shift = true;\n } else if (normalized === 'meta') {\n state.meta = true;\n }\n });\n return state;\n }\n if (modifiers && typeof modifiers === 'object') {\n const record = modifiers as Record<string, unknown>;\n state.ctrl = Boolean(record.ctrl);\n state.alt = Boolean(record.alt);\n state.shift = Boolean(record.shift);\n state.meta = Boolean(record.meta);\n }\n return state;\n };\n\n const activeEditableElement = (): HTMLElement | null => {\n const active = document.activeElement;\n if (!active || !(active instanceof HTMLElement)) {\n return null;\n }\n const tag = active.tagName.toLowerCase();\n if (tag === 'input' || tag === 'textarea' || active.isContentEditable) {\n return active;\n }\n return null;\n };\n\n const parseParams = (): Record<string, unknown> => params ?? {};\n\n try {\n switch (action) {\n case AGENT_TAB_BRANDING_ACTION: {\n const { favicon_url: faviconUrl } = parseParams();\n if (typeof faviconUrl !== 'string' || faviconUrl.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'favicon_url must be a non-empty string.'\n );\n }\n applyAgentTabFavicon(faviconUrl);\n return ok();\n }\n case 'drive.navigate': {\n const { url } = parseParams();\n if (typeof url !== 'string' || url.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'url must be a non-empty string.'\n );\n }\n window.location.href = url;\n return ok();\n }\n case 'drive.locator_point': {\n const { locator } = parseParams();\n const target = resolveLocator(locator as Record<string, unknown>);\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n const rect = target.getBoundingClientRect();\n return ok({\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n });\n }\n case 'drive.snapshot_html': {\n const html = document.documentElement?.outerHTML ?? '';\n return ok({ format: 'html', snapshot: html });\n }\n case 'drive.type_target_point': {\n const { locator } = parseParams();\n let target = resolveLocator(\n locator as Record<string, unknown> | undefined\n );\n if (!target) {\n target = activeEditableElement();\n }\n if (!target || !(target instanceof HTMLElement)) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n const tag = target.tagName.toLowerCase();\n if (\n tag !== 'input' &&\n tag !== 'textarea' &&\n !target.isContentEditable\n ) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'Target is not editable (input, textarea, or contenteditable).'\n );\n }\n const rect = target.getBoundingClientRect();\n return ok({\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n });\n }\n case 'drive.clear_active_editable': {\n const target = activeEditableElement();\n if (!target) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'No active editable target to clear.'\n );\n }\n const tag = target.tagName.toLowerCase();\n if (tag === 'input' || tag === 'textarea') {\n const input = target as HTMLInputElement | HTMLTextAreaElement;\n input.value = '';\n dispatchValueEvents(input);\n return ok({ ok: true });\n }\n if (target.isContentEditable) {\n target.textContent = '';\n dispatchValueEvents(target);\n return ok({ ok: true });\n }\n return buildError(\n 'INVALID_ARGUMENT',\n 'Active target is not editable (input, textarea, or contenteditable).'\n );\n }\n case 'drive.click': {\n const { locator, click_count } = parseParams();\n const target = resolveLocator(locator as Record<string, unknown>);\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n const count =\n typeof click_count === 'number' && Number.isFinite(click_count)\n ? Math.max(1, Math.floor(click_count))\n : 1;\n // Clicking elements that trigger JS dialogs (alert/confirm/prompt) can\n // block the renderer thread before we can reply to the background script,\n // causing the caller to time out. Defer the click to the next tick so\n // we can respond immediately.\n window.setTimeout(() => {\n try {\n if (target instanceof HTMLElement) {\n try {\n target.focus({ preventScroll: true });\n } catch {\n target.focus();\n }\n }\n for (let i = 0; i < count; i += 1) {\n (target as HTMLElement).click();\n }\n } catch {\n // Best-effort: the element may have disappeared or navigation occurred.\n }\n }, 0);\n return ok();\n }\n case 'drive.hover': {\n const { locator, delay_ms } = parseParams();\n const target = resolveLocator(locator as Record<string, unknown>);\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n const rect = target.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const eventInit = {\n bubbles: true,\n cancelable: true,\n clientX: centerX,\n clientY: centerY,\n };\n target.dispatchEvent(new MouseEvent('mouseover', eventInit));\n target.dispatchEvent(\n new MouseEvent('mouseenter', { ...eventInit, bubbles: false })\n );\n target.dispatchEvent(new MouseEvent('mousemove', eventInit));\n if (typeof delay_ms === 'number' && Number.isFinite(delay_ms)) {\n const waitMs = Math.min(Math.max(delay_ms, 0), 10000);\n if (waitMs > 0) {\n await sleep(waitMs);\n }\n }\n const html = document.documentElement?.outerHTML ?? '';\n return ok({ format: 'html', snapshot: html });\n }\n case 'drive.select': {\n const { locator, value, text, index } = parseParams();\n const target = resolveLocator(locator as Record<string, unknown>);\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n if (!(target instanceof HTMLSelectElement)) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'Target is not a select element.'\n );\n }\n let applied = false;\n if (typeof index === 'number' && Number.isFinite(index)) {\n applied = selectOptionByIndex(target, Math.trunc(index));\n }\n if (!applied && typeof value === 'string') {\n applied = selectOption(target, value);\n }\n if (!applied && typeof text === 'string') {\n applied = selectOption(target, text);\n }\n if (!applied) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'No matching option found for select.'\n );\n }\n return ok();\n }\n case 'drive.type': {\n const { locator, text, clear, submit } = parseParams();\n if (typeof text !== 'string') {\n return buildError('INVALID_ARGUMENT', 'text must be a string.');\n }\n let target = resolveLocator(\n locator as Record<string, unknown> | undefined\n );\n if (!target) {\n const active = activeEditableElement();\n if (active) {\n target = active;\n }\n }\n if (!target || !(target instanceof HTMLElement)) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n target.focus();\n const tag = target.tagName.toLowerCase();\n const shouldClear = Boolean(clear);\n if (tag === 'input' || tag === 'textarea') {\n const input = target as HTMLInputElement | HTMLTextAreaElement;\n if (shouldClear) {\n input.value = '';\n }\n input.value = `${input.value}${text}`;\n input.dispatchEvent(new Event('input', { bubbles: true }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n } else if (target.isContentEditable) {\n if (shouldClear) {\n target.textContent = '';\n }\n target.textContent = `${target.textContent ?? ''}${text}`;\n target.dispatchEvent(new Event('input', { bubbles: true }));\n } else {\n return buildError(\n 'INVALID_ARGUMENT',\n 'Target is not editable (input, textarea, or contenteditable).'\n );\n }\n\n if (submit) {\n const form = target.closest('form');\n if (form && form instanceof HTMLFormElement) {\n form.requestSubmit();\n } else {\n target.dispatchEvent(\n new KeyboardEvent('keydown', {\n key: 'Enter',\n bubbles: true,\n })\n );\n }\n }\n\n return ok();\n }\n case 'drive.detect_field_type': {\n const { locator, selector } = parseParams();\n let target = resolveLocator(\n locator as Record<string, unknown> | undefined\n );\n if (!target && typeof selector === 'string' && selector.length > 0) {\n target = document.querySelector(selector);\n }\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n return ok({ fieldType: detectFieldType(target) });\n }\n case 'drive.fill_form': {\n const { fields } = parseParams();\n if (!Array.isArray(fields) || fields.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'fields must be a non-empty array.'\n );\n }\n let filled = 0;\n const errors: string[] = [];\n fields.forEach((field, index) => {\n if (!field || typeof field !== 'object') {\n errors.push(`Field ${index} is not an object.`);\n return;\n }\n const record = field as Record<string, unknown>;\n const selector = record.selector;\n const locator =\n record.locator && typeof record.locator === 'object'\n ? (record.locator as Record<string, unknown>)\n : undefined;\n let element: Element | null = null;\n if (locator) {\n element = resolveLocator(locator);\n }\n if (!element && typeof selector === 'string' && selector.length > 0) {\n element = document.querySelector(selector);\n }\n if (!element) {\n errors.push(`Field ${index} could not be resolved.`);\n return;\n }\n\n const value = record.value;\n if (typeof value !== 'string' && typeof value !== 'boolean') {\n errors.push(`Field ${index} has invalid value.`);\n return;\n }\n\n const type =\n typeof record.type === 'string' && record.type.length > 0\n ? record.type\n : 'auto';\n const resolvedType =\n type === 'auto' ? detectFieldType(element) : type;\n const submit = Boolean(record.submit);\n\n let applied = false;\n if (resolvedType === 'select') {\n if (element instanceof HTMLSelectElement) {\n applied = selectOption(element, String(value));\n }\n } else if (resolvedType === 'checkbox' || resolvedType === 'radio') {\n if (element instanceof HTMLInputElement) {\n const shouldCheck =\n typeof value === 'boolean' ? value : coerceBoolean(value);\n element.checked = shouldCheck;\n dispatchValueEvents(element);\n applied = true;\n }\n } else {\n if (element instanceof HTMLElement) {\n applied = setTextValue(element, String(value), true);\n }\n }\n\n if (!applied) {\n errors.push(`Field ${index} could not be filled.`);\n return;\n }\n\n if (submit) {\n submitIfRequested(element);\n }\n filled += 1;\n });\n\n return ok({\n filled,\n attempted: fields.length,\n errors: errors.length > 0 ? errors : [],\n });\n }\n case 'drive.drag': {\n const { from, to, steps } = parseParams();\n const fromEl = resolveLocator(from as Record<string, unknown>);\n if (!fromEl) {\n return buildError(\n 'LOCATOR_NOT_FOUND',\n 'Failed to resolve drag source.'\n );\n }\n const toEl = resolveLocator(to as Record<string, unknown>);\n if (!toEl) {\n return buildError(\n 'LOCATOR_NOT_FOUND',\n 'Failed to resolve drag target.'\n );\n }\n\n const fromRect = fromEl.getBoundingClientRect();\n const toRect = toEl.getBoundingClientRect();\n const startX = fromRect.left + fromRect.width / 2;\n const startY = fromRect.top + fromRect.height / 2;\n const endX = toRect.left + toRect.width / 2;\n const endY = toRect.top + toRect.height / 2;\n // Defensive bounds in case content script receives unvalidated inputs.\n const totalSteps =\n typeof steps === 'number' && Number.isFinite(steps)\n ? Math.max(1, Math.min(50, Math.floor(steps)))\n : 12;\n let dataTransfer: DataTransfer | undefined;\n try {\n dataTransfer = new DataTransfer();\n } catch {\n dataTransfer = undefined;\n }\n\n dispatchPointer(fromEl, 'pointerdown', startX, startY);\n dispatchDrag(fromEl, 'dragstart', startX, startY, dataTransfer);\n\n for (let i = 1; i <= totalSteps; i += 1) {\n const progress = i / totalSteps;\n const x = startX + (endX - startX) * progress;\n const y = startY + (endY - startY) * progress;\n const target = document.elementFromPoint(x, y) ?? toEl;\n dispatchPointer(target, 'pointermove', x, y);\n dispatchDrag(target, 'dragover', x, y, dataTransfer);\n await sleep(10);\n }\n\n const dropTarget = document.elementFromPoint(endX, endY) ?? toEl;\n dispatchDrag(dropTarget, 'drop', endX, endY, dataTransfer);\n dispatchPointer(dropTarget, 'pointerup', endX, endY);\n dispatchDrag(fromEl, 'dragend', endX, endY, dataTransfer);\n return ok();\n }\n case 'drive.key_press': {\n const { key, modifiers } = parseParams();\n if (typeof key !== 'string' || key.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'key must be a non-empty string.'\n );\n }\n const target =\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : document.body;\n if (!target) {\n return buildError('INVALID_ARGUMENT', 'No target for key press.');\n }\n const mods = normalizeModifiers(modifiers);\n const eventInit = {\n key,\n code: keyToCode(key),\n bubbles: true,\n cancelable: true,\n ctrlKey: mods.ctrl,\n altKey: mods.alt,\n shiftKey: mods.shift,\n metaKey: mods.meta,\n };\n target.dispatchEvent(new KeyboardEvent('keydown', eventInit));\n target.dispatchEvent(new KeyboardEvent('keyup', eventInit));\n return ok();\n }\n case 'drive.key': {\n const { key, modifiers, repeat } = parseParams();\n if (typeof key !== 'string' || key.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'key must be a non-empty string.'\n );\n }\n const target =\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : document.body;\n if (!target) {\n return buildError('INVALID_ARGUMENT', 'No target for key press.');\n }\n const mods = normalizeModifiers(modifiers);\n const eventInit = {\n key,\n code: keyToCode(key),\n bubbles: true,\n cancelable: true,\n ctrlKey: mods.ctrl,\n altKey: mods.alt,\n shiftKey: mods.shift,\n metaKey: mods.meta,\n };\n const count =\n typeof repeat === 'number' && Number.isFinite(repeat)\n ? Math.max(1, Math.min(50, Math.floor(repeat)))\n : 1;\n for (let i = 0; i < count; i += 1) {\n target.dispatchEvent(new KeyboardEvent('keydown', eventInit));\n target.dispatchEvent(new KeyboardEvent('keyup', eventInit));\n }\n return ok();\n }\n case 'drive.scroll': {\n const { delta_x, delta_y, top, left, behavior } = parseParams();\n const scrollBehavior =\n behavior === 'smooth' || behavior === 'auto' ? behavior : undefined;\n if (typeof top === 'number' || typeof left === 'number') {\n window.scrollTo({\n top: typeof top === 'number' ? top : undefined,\n left: typeof left === 'number' ? left : undefined,\n behavior: scrollBehavior,\n });\n return ok();\n }\n if (typeof delta_x === 'number' || typeof delta_y === 'number') {\n window.scrollBy({\n left: typeof delta_x === 'number' ? delta_x : 0,\n top: typeof delta_y === 'number' ? delta_y : 0,\n behavior: scrollBehavior,\n });\n return ok();\n }\n return buildError(\n 'INVALID_ARGUMENT',\n 'scroll requires delta_x/delta_y or top/left.'\n );\n }\n case 'drive.screenshot_meta': {\n const root = document.documentElement;\n const body = document.body;\n const scrollWidth = Math.max(\n root?.scrollWidth ?? 0,\n root?.clientWidth ?? 0,\n body?.scrollWidth ?? 0,\n body?.clientWidth ?? 0\n );\n const scrollHeight = Math.max(\n root?.scrollHeight ?? 0,\n root?.clientHeight ?? 0,\n body?.scrollHeight ?? 0,\n body?.clientHeight ?? 0\n );\n\n return ok({\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n scrollWidth,\n scrollHeight,\n devicePixelRatio:\n typeof window.devicePixelRatio === 'number' &&\n Number.isFinite(window.devicePixelRatio) &&\n window.devicePixelRatio > 0\n ? window.devicePixelRatio\n : 1,\n });\n }\n case 'drive.screenshot_element': {\n const { selector } = parseParams();\n if (typeof selector !== 'string' || selector.trim().length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'selector must be a non-empty string.'\n );\n }\n\n let element: Element | null = null;\n try {\n element = document.querySelector(selector);\n } catch {\n return buildError(\n 'INVALID_ARGUMENT',\n 'selector must be a valid CSS selector.'\n );\n }\n\n if (!element) {\n return buildError('INVALID_ARGUMENT', 'No element matched selector.');\n }\n\n try {\n (element as HTMLElement).scrollIntoView?.({\n block: 'center',\n inline: 'center',\n });\n } catch {\n // Ignore scroll failures; capture whatever is visible.\n }\n\n const rect = element.getBoundingClientRect();\n const scrollX = window.scrollX;\n const scrollY = window.scrollY;\n const dpr =\n typeof window.devicePixelRatio === 'number' &&\n Number.isFinite(window.devicePixelRatio) &&\n window.devicePixelRatio > 0\n ? window.devicePixelRatio\n : 1;\n\n return ok({\n selector,\n pageX: rect.left + scrollX,\n pageY: rect.top + scrollY,\n width: rect.width,\n height: rect.height,\n viewportLeft: rect.left,\n viewportTop: rect.top,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n scrollX,\n scrollY,\n devicePixelRatio: dpr,\n });\n }\n case 'drive.wait_for': {\n const { condition, timeout_ms } = parseParams();\n if (!condition || typeof condition !== 'object') {\n return buildError('INVALID_ARGUMENT', 'condition must be an object.');\n }\n const kind = (condition as Record<string, unknown>).kind;\n const value = (condition as Record<string, unknown>).value;\n if (\n typeof kind !== 'string' ||\n !['locator_visible', 'text_present', 'url_matches'].includes(kind)\n ) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'condition.kind must be locator_visible, text_present, or url_matches.'\n );\n }\n if (typeof value !== 'string' || value.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'condition.value must be a non-empty string.'\n );\n }\n const timeout =\n typeof timeout_ms === 'number' && Number.isFinite(timeout_ms)\n ? Math.max(0, timeout_ms)\n : 30000;\n const start = Date.now();\n const urlMatcher =\n kind === 'url_matches' ? buildUrlMatcher(value) : null;\n if (urlMatcher && !urlMatcher.ok) {\n return urlMatcher.error;\n }\n\n const checkCondition = (): boolean => {\n if (kind === 'text_present') {\n return (document.body?.innerText ?? '').includes(value);\n }\n if (kind === 'url_matches') {\n return urlMatcher\n ? urlMatcher.matcher(window.location.href)\n : window.location.href.includes(value);\n }\n const selector = value;\n const element = document.querySelector(selector);\n return Boolean(element && isVisible(element));\n };\n\n return await new Promise<ContentResult>((resolve) => {\n const tick = () => {\n if (checkCondition()) {\n resolve(ok());\n return;\n }\n if (Date.now() - start >= timeout) {\n resolve(\n buildError('TIMEOUT', `wait_for timed out after ${timeout}ms.`)\n );\n return;\n }\n window.setTimeout(tick, 100);\n };\n tick();\n });\n }\n case 'drive.go_back': {\n // Trigger history changes on the next tick so the background script gets\n // our response before this page unloads.\n window.setTimeout(() => {\n history.back();\n }, 0);\n return ok();\n }\n case 'drive.go_forward': {\n window.setTimeout(() => {\n history.forward();\n }, 0);\n return ok();\n }\n default:\n return buildError('INVALID_ARGUMENT', `Unsupported action ${action}.`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return buildError('EVALUATION_FAILED', message);\n }\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nif (typeof chrome !== 'undefined' && chrome.runtime?.onMessage) {\n chrome.runtime.onMessage.addListener(\n (\n message: Record<string, unknown>,\n _sender: unknown,\n sendResponse: (response: ContentResult) => void\n ) => {\n if (!isRecord(message) || typeof message.action !== 'string') {\n sendResponse({\n ok: false,\n error: {\n code: 'INVALID_ARGUMENT',\n message: 'Invalid content script request.',\n retryable: false,\n },\n });\n return;\n }\n\n void runDriveAction(\n message.action,\n message.params as Record<string, unknown>\n )\n .then(sendResponse)\n .catch((error) => {\n const messageText =\n error instanceof Error ? error.message : 'Unknown error';\n sendResponse({\n ok: false,\n error: {\n code: 'EVALUATION_FAILED',\n message: messageText,\n retryable: false,\n },\n });\n });\n\n return true;\n }\n );\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["link", "style"]
7
7
  }
@@ -3,7 +3,9 @@
3
3
  // packages/extension/src/site-permissions.ts
4
4
  var SITE_ALLOWLIST_KEY = "siteAllowlist";
5
5
  var SITE_PERMISSIONS_MODE_KEY = "sitePermissionsMode";
6
+ var DEBUGGER_CAPABILITY_ENABLED_KEY = "debuggerCapabilityEnabled";
6
7
  var DEFAULT_SITE_PERMISSIONS_MODE = "granular";
8
+ var DEFAULT_DEBUGGER_CAPABILITY_ENABLED = false;
7
9
  var isAllowlistEntry = (value) => {
8
10
  if (!value || typeof value !== "object") {
9
11
  return false;
@@ -74,6 +76,35 @@
74
76
  );
75
77
  });
76
78
  };
79
+ var readDebuggerCapabilityEnabled = async () => {
80
+ return await new Promise((resolve) => {
81
+ chrome.storage.local.get(
82
+ [DEBUGGER_CAPABILITY_ENABLED_KEY],
83
+ (result) => {
84
+ const raw = result?.[DEBUGGER_CAPABILITY_ENABLED_KEY];
85
+ if (typeof raw === "boolean") {
86
+ resolve(raw);
87
+ return;
88
+ }
89
+ try {
90
+ chrome.storage.local.set({
91
+ [DEBUGGER_CAPABILITY_ENABLED_KEY]: DEFAULT_DEBUGGER_CAPABILITY_ENABLED
92
+ });
93
+ } catch {
94
+ }
95
+ resolve(DEFAULT_DEBUGGER_CAPABILITY_ENABLED);
96
+ }
97
+ );
98
+ });
99
+ };
100
+ var writeDebuggerCapabilityEnabled = async (enabled) => {
101
+ return await new Promise((resolve) => {
102
+ chrome.storage.local.set(
103
+ { [DEBUGGER_CAPABILITY_ENABLED_KEY]: Boolean(enabled) },
104
+ () => resolve()
105
+ );
106
+ });
107
+ };
77
108
  var getAllowlistedSites = async () => {
78
109
  return await readAllowlistRaw();
79
110
  };
@@ -266,8 +297,18 @@
266
297
  sitesSummary
267
298
  };
268
299
  };
300
+ var getDebuggerEls = () => {
301
+ const enabled = byId("bb-debugger-enabled");
302
+ const status = byId("bb-debugger-status");
303
+ if (enabled.type !== "checkbox") {
304
+ throw new Error("Expected checkbox input for debugger capability.");
305
+ }
306
+ return { enabled, status };
307
+ };
269
308
  var lastMode = null;
270
309
  var modeWriteInProgress = false;
310
+ var debuggerWriteInProgress = false;
311
+ var pendingDebuggerCapability = null;
271
312
  var applyMode = (mode) => {
272
313
  const els = getModeEls();
273
314
  els.granular.checked = mode === "granular";
@@ -285,6 +326,14 @@
285
326
  var refreshMode = async () => {
286
327
  applyMode(await readSitePermissionsMode());
287
328
  };
329
+ var applyDebuggerCapability = (enabled) => {
330
+ const els = getDebuggerEls();
331
+ els.enabled.checked = enabled;
332
+ els.status.textContent = enabled ? "Enabled. inspect tools can attach through the debugger bridge." : "Disabled by default. Enable only when you need inspect tools.";
333
+ };
334
+ var refreshDebuggerCapability = async () => {
335
+ applyDebuggerCapability(await readDebuggerCapabilityEnabled());
336
+ };
288
337
  var focusSiteRow = (site) => {
289
338
  const container = byId("bb-sites");
290
339
  const rows = Array.from(container.querySelectorAll(".bb-site-row"));
@@ -406,8 +455,35 @@ Last used: ${formatTime(row.lastUsedAt)}`;
406
455
  modeWriteInProgress = false;
407
456
  }
408
457
  };
458
+ var setDebuggerCapability = async (enabled) => {
459
+ pendingDebuggerCapability = enabled;
460
+ applyDebuggerCapability(enabled);
461
+ if (debuggerWriteInProgress) {
462
+ return;
463
+ }
464
+ debuggerWriteInProgress = true;
465
+ try {
466
+ while (pendingDebuggerCapability !== null) {
467
+ const next = pendingDebuggerCapability;
468
+ pendingDebuggerCapability = null;
469
+ await writeDebuggerCapabilityEnabled(next);
470
+ await new Promise((resolve) => {
471
+ chrome.runtime.sendMessage(
472
+ { action: "drive.refresh_capabilities" },
473
+ () => resolve()
474
+ );
475
+ });
476
+ }
477
+ } catch {
478
+ applyDebuggerCapability(DEFAULT_DEBUGGER_CAPABILITY_ENABLED);
479
+ } finally {
480
+ debuggerWriteInProgress = false;
481
+ await refreshDebuggerCapability();
482
+ }
483
+ };
409
484
  var refreshAll = async () => {
410
485
  await refreshMode();
486
+ await refreshDebuggerCapability();
411
487
  await refresh();
412
488
  };
413
489
  var main = () => {
@@ -416,6 +492,7 @@ Last used: ${formatTime(row.lastUsedAt)}`;
416
492
  await refreshAll();
417
493
  })();
418
494
  const { granular, bypass } = getModeEls();
495
+ const { enabled } = getDebuggerEls();
419
496
  granular.addEventListener("change", () => {
420
497
  if (!granular.checked) {
421
498
  return;
@@ -428,6 +505,9 @@ Last used: ${formatTime(row.lastUsedAt)}`;
428
505
  }
429
506
  void setMode("bypass");
430
507
  });
508
+ enabled.addEventListener("change", () => {
509
+ void setDebuggerCapability(enabled.checked);
510
+ });
431
511
  chrome.storage?.onChanged?.addListener?.(() => {
432
512
  void refreshAll();
433
513
  });