browsertrack 0.2.1 → 0.2.2

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.
Files changed (52) hide show
  1. package/AGENTS.md +9 -6
  2. package/README.md +2 -0
  3. package/dist/{chunk-INXDWPJW.js → chunk-4HRLW6YF.js} +161 -106
  4. package/dist/chunk-4HRLW6YF.js.map +1 -0
  5. package/dist/{chunk-3HOXPTM2.js → chunk-AYSVE6NG.js} +808 -53
  6. package/dist/chunk-AYSVE6NG.js.map +1 -0
  7. package/dist/{chunk-6VA7GBAO.js → chunk-QRZ57ME3.js} +70 -2
  8. package/dist/chunk-QRZ57ME3.js.map +1 -0
  9. package/dist/{chunk-464D4U2U.js → chunk-TWEYRBDU.js} +279 -43
  10. package/dist/chunk-TWEYRBDU.js.map +1 -0
  11. package/dist/cli/index.js +1038 -545
  12. package/dist/cli/index.js.map +1 -1
  13. package/dist/client/index.cjs +184 -104
  14. package/dist/client/index.js +2 -2
  15. package/dist/client.iife.js +9 -9
  16. package/dist/core/index.d.ts +24 -1
  17. package/dist/core/index.js +9 -1
  18. package/dist/daemon/index.d.ts +2 -2
  19. package/dist/daemon/index.js +6 -8
  20. package/dist/index.d.ts +2 -2
  21. package/dist/index.js +14 -7
  22. package/dist/mcp/index.d.ts +1 -1
  23. package/dist/mcp/index.js +7 -4
  24. package/dist/{server-DiVmTrIR.d.ts → server-DjV7RWQM.d.ts} +9 -1
  25. package/docs/cli.md +4 -1
  26. package/docs/getting-started.md +60 -6
  27. package/docs/mcp-reference.md +42 -0
  28. package/package.json +1 -1
  29. package/packages/cli/src/index.ts +247 -151
  30. package/packages/client/src/interceptors/navigation.ts +38 -26
  31. package/packages/client/src/interceptors/network.ts +22 -17
  32. package/packages/client/src/notes/inspector.ts +81 -48
  33. package/packages/client/src/source/resolver.ts +9 -3
  34. package/packages/client/src/transport/websocket.ts +23 -18
  35. package/packages/core/src/index.ts +1 -0
  36. package/packages/core/src/safety.ts +86 -0
  37. package/packages/daemon/src/server/daemon.ts +7 -1
  38. package/packages/daemon/src/server/http.ts +125 -5
  39. package/packages/daemon/src/server/ws.ts +33 -29
  40. package/packages/daemon/src/storage/db.ts +57 -35
  41. package/packages/mcp/src/handlers.ts +114 -45
  42. package/packages/mcp/src/server.ts +202 -2
  43. package/test/core/safety.test.ts +106 -0
  44. package/test/daemon/storage.test.ts +36 -0
  45. package/test/e2e/daemon-mcp-e2e.test.ts +10 -0
  46. package/test/mcp/auto-start.test.ts +87 -0
  47. package/dist/chunk-3HOXPTM2.js.map +0 -1
  48. package/dist/chunk-464D4U2U.js.map +0 -1
  49. package/dist/chunk-6VA7GBAO.js.map +0 -1
  50. package/dist/chunk-7OCOQGDN.js +0 -635
  51. package/dist/chunk-7OCOQGDN.js.map +0 -1
  52. package/dist/chunk-INXDWPJW.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/client/src/breadcrumbs.ts","../packages/client/src/source/resolver.ts","../packages/client/src/interceptors/interaction.ts","../packages/client/src/commands/handler.ts","../packages/client/src/config.ts","../packages/client/src/interceptors/console.ts","../packages/client/src/interceptors/navigation.ts","../packages/client/src/interceptors/network.ts","../packages/client/src/interceptors/runtime.ts","../packages/client/src/screenshot/browser-script-driver.ts","../packages/client/src/transport/websocket.ts","../packages/client/src/notes/inspector.ts","../packages/client/src/client.ts","../packages/client/src/index.ts"],"sourcesContent":["import type { Breadcrumb } from '@browserdiag/core';\n\nexport class BreadcrumbBuffer {\n private capacity: number;\n private buffer: Breadcrumb[] = [];\n\n constructor(capacity = 50) {\n this.capacity = capacity;\n }\n\n public add(breadcrumb: Omit<Breadcrumb, 'timestamp'> & { timestamp?: number }): void {\n const item: Breadcrumb = {\n ...breadcrumb,\n timestamp: breadcrumb.timestamp || Date.now(),\n };\n\n this.buffer.push(item);\n if (this.buffer.length > this.capacity) {\n this.buffer.shift();\n }\n }\n\n public getRecent(): Breadcrumb[] {\n return [...this.buffer];\n }\n\n public clear(): void {\n this.buffer = [];\n }\n}\n","import type { ComponentSourceInfo } from '../../../core/src/index.js';\n\n/**\n * Resolves framework component metadata, source file paths, line numbers,\n * and component hierarchy directly from a live DOM element.\n * Supports React (Fiber), Vue 2 & 3, Svelte, Custom Elements, and standard data attributes.\n */\nexport function resolveComponentSource(el: HTMLElement): ComponentSourceInfo | undefined {\n if (!el || typeof el !== 'object') return undefined;\n\n // 1. Try React Fiber Resolution\n const reactInfo = resolveReactComponent(el);\n if (reactInfo) return reactInfo;\n\n // 2. Try Vue (Vue 3 / Vue 2) Resolution\n const vueInfo = resolveVueComponent(el);\n if (vueInfo) return vueInfo;\n\n // 3. Try Svelte Resolution\n const svelteInfo = resolveSvelteComponent(el);\n if (svelteInfo) return svelteInfo;\n\n // 4. Try Web Component / Custom Element\n if (el.tagName && el.tagName.includes('-')) {\n return {\n framework: 'web-component',\n componentName: el.tagName.toLowerCase(),\n hierarchy: [el.tagName.toLowerCase()],\n };\n }\n\n // 5. Try Data Attribute Annotations (e.g. data-component, data-source-file)\n const attrInfo = resolveDataAttributeComponent(el);\n if (attrInfo) return attrInfo;\n\n return undefined;\n}\n\n/**\n * Extracts React Fiber debug source, owner, and hierarchy\n */\nfunction resolveReactComponent(el: HTMLElement): ComponentSourceInfo | undefined {\n try {\n const fiberKey = Object.keys(el).find(\n (key) => key.startsWith('__reactFiber$') || key.startsWith('__reactInternalInstance$')\n );\n if (!fiberKey) return undefined;\n\n const hostFiber = (el as any)[fiberKey];\n if (!hostFiber) return undefined;\n\n let sourceFile: string | undefined;\n let sourceLine: number | undefined;\n let sourceColumn: number | undefined;\n let componentName: string | undefined;\n const hierarchy: string[] = [];\n let props: Record<string, any> | undefined;\n\n // Check host fiber debugSource first (often populated by JSX transform)\n if (hostFiber._debugSource) {\n sourceFile = hostFiber._debugSource.fileName;\n sourceLine = hostFiber._debugSource.lineNumber;\n sourceColumn = hostFiber._debugSource.columnNumber;\n }\n\n // Check _debugOwner if available\n if (hostFiber._debugOwner) {\n const ownerType = hostFiber._debugOwner.type;\n componentName = getReactComponentName(ownerType);\n if (!sourceFile && hostFiber._debugOwner._debugSource) {\n sourceFile = hostFiber._debugOwner._debugSource.fileName;\n sourceLine = hostFiber._debugOwner._debugSource.lineNumber;\n sourceColumn = hostFiber._debugOwner._debugSource.columnNumber;\n }\n }\n\n // Walk up fiber return tree to discover composite components and hierarchy\n let curr = hostFiber;\n let depth = 0;\n while (curr && depth < 50) {\n depth++;\n const type = curr.type;\n const name = getReactComponentName(type);\n\n if (name && !name.startsWith('html:') && name !== 'Fragment') {\n if (!componentName) {\n componentName = name;\n }\n if (!hierarchy.includes(name)) {\n hierarchy.unshift(name);\n }\n\n // Check if composite component has debug source\n if (!sourceFile && curr._debugSource) {\n sourceFile = curr._debugSource.fileName;\n sourceLine = curr._debugSource.lineNumber;\n sourceColumn = curr._debugSource.columnNumber;\n }\n\n // Capture safe props from the nearest custom component\n if (!props && curr.memoizedProps && typeof curr.memoizedProps === 'object') {\n props = sanitizeProps(curr.memoizedProps);\n }\n }\n\n curr = curr.return;\n }\n\n if (!componentName && !sourceFile) {\n return undefined;\n }\n\n return {\n framework: 'react',\n componentName,\n sourceFile: normalizeFilePath(sourceFile),\n sourceLine,\n sourceColumn,\n hierarchy: hierarchy.length > 0 ? hierarchy : componentName ? [componentName] : undefined,\n props,\n };\n } catch {\n return undefined;\n }\n}\n\nfunction getReactComponentName(type: any): string | undefined {\n if (!type) return undefined;\n if (typeof type === 'string') return undefined; // Host DOM tag (div, span, button)\n if (type.displayName) return type.displayName;\n if (type.name) return type.name;\n if (type.render?.displayName) return type.render.displayName;\n if (type.render?.name) return type.render.name;\n return undefined;\n}\n\n/**\n * Extracts Vue 3 and Vue 2 component instances and file paths\n */\nfunction resolveVueComponent(el: HTMLElement): ComponentSourceInfo | undefined {\n try {\n // Vue 3\n const vueParent = (el as any).__vueParentComponent || (el as any).__vnode?.ctx;\n if (vueParent) {\n const type = vueParent.type || {};\n const componentName = type.name || type.__name || type.displayName || 'AnonymousComponent';\n const sourceFile = type.__file;\n const hierarchy: string[] = [];\n\n let curr = vueParent;\n let depth = 0;\n while (curr && depth < 50) {\n depth++;\n const cType = curr.type || {};\n const cName = cType.name || cType.__name || cType.displayName;\n if (cName && !hierarchy.includes(cName)) {\n hierarchy.unshift(cName);\n }\n curr = curr.parent;\n }\n\n return {\n framework: 'vue',\n componentName,\n sourceFile: normalizeFilePath(sourceFile),\n hierarchy: hierarchy.length > 0 ? hierarchy : [componentName],\n props: vueParent.props ? sanitizeProps(vueParent.props) : undefined,\n };\n }\n\n // Vue 2\n const vue2Instance = (el as any).__vue__;\n if (vue2Instance) {\n const options = vue2Instance.$options || {};\n const componentName = options.name || options._componentTag || 'VueComponent';\n const sourceFile = options.__file;\n\n return {\n framework: 'vue',\n componentName,\n sourceFile: normalizeFilePath(sourceFile),\n hierarchy: [componentName],\n props: vue2Instance.$props ? sanitizeProps(vue2Instance.$props) : undefined,\n };\n }\n\n return undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Extracts Svelte __svelte_meta debug locations\n */\nfunction resolveSvelteComponent(el: HTMLElement): ComponentSourceInfo | undefined {\n try {\n let curr: HTMLElement | null = el;\n let depth = 0;\n while (curr && depth < 50) {\n depth++;\n const meta = (curr as any).__svelte_meta;\n if (meta && meta.loc) {\n return {\n framework: 'svelte',\n sourceFile: normalizeFilePath(meta.loc.file),\n sourceLine: meta.loc.line,\n sourceColumn: meta.loc.column,\n componentName: meta.loc.file ? getBaseNameWithoutExt(meta.loc.file) : undefined,\n hierarchy: meta.loc.file ? [getBaseNameWithoutExt(meta.loc.file)] : undefined,\n };\n }\n curr = curr.parentElement;\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolves components from standard data attributes (e.g. data-component=\"UserCard\")\n */\nfunction resolveDataAttributeComponent(el: HTMLElement): ComponentSourceInfo | undefined {\n try {\n const compEl = el.closest('[data-component], [data-component-name], [data-source-file]');\n if (!compEl) return undefined;\n\n const componentName =\n compEl.getAttribute('data-component') || compEl.getAttribute('data-component-name') || undefined;\n const sourceFile = compEl.getAttribute('data-source-file') || undefined;\n const lineAttr = compEl.getAttribute('data-source-line');\n const sourceLine = lineAttr ? parseInt(lineAttr, 10) : undefined;\n\n if (!componentName && !sourceFile) return undefined;\n\n return {\n framework: 'vanilla',\n componentName,\n sourceFile: normalizeFilePath(sourceFile),\n sourceLine: isNaN(sourceLine as number) ? undefined : sourceLine,\n hierarchy: componentName ? [componentName] : undefined,\n };\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeFilePath(filePath?: string): string | undefined {\n if (!filePath) return undefined;\n // Strip query strings or vite bundle hashes (e.g. /App.tsx?t=123)\n const cleaned = filePath.split('?')[0];\n return cleaned;\n}\n\nfunction getBaseNameWithoutExt(filePath: string): string {\n const parts = filePath.split('/');\n const last = parts[parts.length - 1] || filePath;\n return last.split('.')[0] || last;\n}\n\nfunction sanitizeProps(props: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(props)) {\n if (key.startsWith('__') || typeof value === 'function') continue;\n\n if (value === null || value === undefined) {\n result[key] = value;\n } else if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n result[key] = value;\n } else if (Array.isArray(value)) {\n result[key] = `Array(${value.length})`;\n } else if (typeof value === 'object') {\n result[key] = '[Object]';\n }\n }\n return result;\n}\n","import type { Breadcrumb, ElementSummary } from '../../../core/src/index.js';\nimport { getSemanticSelector, truncate } from '../../../core/src/index.js';\nimport { resolveComponentSource } from '../source/resolver.js';\n\nexport type InteractionCallback = (breadcrumb: Breadcrumb, elementSummary?: ElementSummary) => void;\n\n/**\n * Extracts a concise ElementSummary from a DOM element.\n * Never collects sensitive user input values.\n */\nexport function extractElementSummary(el: HTMLElement | Element): ElementSummary {\n const selector = getSemanticSelector(el);\n const tag = el.tagName.toLowerCase();\n const id = el.id || undefined;\n const classes = Array.from(el.classList || []);\n const componentSource = resolveComponentSource(el as HTMLElement);\n\n let boundingRect: ElementSummary['boundingRect'] = undefined;\n let visible = true;\n\n try {\n const rect = el.getBoundingClientRect();\n boundingRect = {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n top: Math.round(rect.top),\n left: Math.round(rect.left),\n bottom: Math.round(rect.bottom),\n right: Math.round(rect.right),\n };\n\n const style = window.getComputedStyle(el);\n visible = style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0' && rect.width > 0 && rect.height > 0;\n } catch {\n // Defensive\n }\n\n // Safe innerText (truncate to 80 chars, ignore password/sensitive elements)\n let innerText: string | undefined;\n if (tag !== 'input' && tag !== 'textarea' && tag !== 'select') {\n innerText = truncate(el.textContent?.trim(), 80);\n }\n\n // Safe outerHTML (truncate to 200 chars)\n const outerHTML = truncate(el.outerHTML?.trim(), 200);\n\n return {\n selector,\n tag,\n id,\n classes,\n boundingRect,\n visible,\n innerText,\n outerHTML,\n componentSource,\n };\n}\n\n/**\n * Sets up global click and submit event tracking.\n */\nexport function setupInteractionInterceptors(onInteraction: InteractionCallback): () => void {\n if (typeof document === 'undefined') return () => {};\n\n const onClick = (event: MouseEvent) => {\n try {\n const target = event.target as HTMLElement | null;\n if (!target || !(target instanceof Element)) return;\n\n const summary = extractElementSummary(target);\n const message = `click ${summary.selector}${summary.innerText ? ` (\"${summary.innerText}\")` : ''}`;\n\n onInteraction(\n {\n type: 'click',\n category: 'ui',\n message,\n timestamp: Date.now(),\n element: summary,\n },\n summary\n );\n } catch {\n // Defensive\n }\n };\n\n const onSubmit = (event: SubmitEvent) => {\n try {\n const target = event.target as HTMLFormElement | null;\n if (!target || !(target instanceof Element)) return;\n\n const summary = extractElementSummary(target);\n const formAction = target.getAttribute('action') || '';\n const message = `submit form ${summary.selector}${formAction ? ` (action: ${formAction})` : ''}`;\n\n onInteraction(\n {\n type: 'submit',\n category: 'ui',\n message,\n timestamp: Date.now(),\n element: summary,\n },\n summary\n );\n } catch {\n // Defensive\n }\n };\n\n document.addEventListener('click', onClick, { capture: true, passive: true });\n document.addEventListener('submit', onSubmit, { capture: true, passive: true });\n\n return () => {\n document.removeEventListener('click', onClick, { capture: true });\n document.removeEventListener('submit', onSubmit, { capture: true });\n };\n}\n","import type {\n ClientCommand,\n CommandResponse,\n PageStateResult,\n QueryElementResult,\n CaptureElementResult,\n} from '../../../core/src/index.js';\nimport { truncate } from '../../../core/src/index.js';\nimport { extractElementSummary } from '../interceptors/interaction.js';\nimport type { ScreenshotDriver } from '../screenshot/driver.js';\n\nexport class ClientCommandHandler {\n private screenshotDriver: ScreenshotDriver;\n\n constructor(screenshotDriver: ScreenshotDriver) {\n this.screenshotDriver = screenshotDriver;\n }\n\n public async executeCommand(command: ClientCommand): Promise<CommandResponse> {\n try {\n switch (command.type) {\n case 'reload':\n return this.handleReload(command);\n\n case 'navigate':\n return this.handleNavigate(command);\n\n case 'get_page_state':\n return this.handleGetPageState(command);\n\n case 'query_element':\n return this.handleQueryElement(command);\n\n case 'capture_element':\n return await this.handleCaptureElement(command);\n\n case 'check_overflow':\n return this.handleCheckOverflow(command);\n\n case 'get_element_rect':\n return this.handleGetElementRect(command);\n\n case 'get_element_style':\n return this.handleGetElementStyle(command);\n\n default:\n return {\n id: command.id,\n ok: false,\n error: `Unsupported command type: ${(command as any).type}`,\n };\n }\n } catch (err: any) {\n return {\n id: command.id,\n ok: false,\n error: err?.message || 'Command execution failed',\n };\n }\n }\n\n private handleReload(command: ClientCommand): CommandResponse {\n if (typeof window !== 'undefined' && window.location) {\n setTimeout(() => {\n window.location.reload();\n }, 50);\n return { id: command.id, ok: true, result: { message: 'Reload initiated' } };\n }\n return { id: command.id, ok: false, error: 'No browser window available' };\n }\n\n private handleNavigate(command: ClientCommand<{ url: string }>): CommandResponse {\n const targetUrl = command.params?.url;\n if (!targetUrl) {\n return { id: command.id, ok: false, error: 'Missing target url parameter' };\n }\n\n if (typeof window !== 'undefined' && window.location) {\n setTimeout(() => {\n window.location.href = targetUrl;\n }, 50);\n return { id: command.id, ok: true, result: { message: `Navigating to ${targetUrl}` } };\n }\n return { id: command.id, ok: false, error: 'No browser window available' };\n }\n\n private handleGetPageState(command: ClientCommand): CommandResponse<PageStateResult> {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return { id: command.id, ok: false, error: 'No browser document available' };\n }\n\n const activeEl = document.activeElement && document.activeElement !== document.body ? extractElementSummary(document.activeElement) : undefined;\n\n return {\n id: command.id,\n ok: true,\n result: {\n url: window.location.href,\n route: window.location.pathname + window.location.search + window.location.hash,\n title: document.title,\n readyState: document.readyState,\n activeElement: activeEl,\n },\n };\n }\n\n private handleQueryElement(command: ClientCommand<{ selector: string }>): CommandResponse<QueryElementResult> {\n if (typeof document === 'undefined') {\n return { id: command.id, ok: false, error: 'No browser document available' };\n }\n\n const selector = command.params?.selector;\n if (!selector) {\n return { id: command.id, ok: false, error: 'Missing selector parameter' };\n }\n\n const element = document.querySelector(selector);\n if (!element) {\n return {\n id: command.id,\n ok: true,\n result: { exists: false },\n };\n }\n\n const summary = extractElementSummary(element);\n\n return {\n id: command.id,\n ok: true,\n result: {\n exists: true,\n visible: summary.visible,\n tag: summary.tag,\n id: summary.id,\n classes: summary.classes,\n boundingRect: summary.boundingRect,\n innerText: summary.innerText,\n outerHTML: summary.outerHTML,\n },\n };\n }\n\n private async handleCaptureElement(command: ClientCommand<{ selector?: string }>): Promise<CommandResponse<CaptureElementResult>> {\n const selector = command.params?.selector;\n let targetEl: Element | null = null;\n\n if (selector) {\n targetEl = document.querySelector(selector);\n if (!targetEl) {\n return {\n id: command.id,\n ok: false,\n reason: `ELEMENT_NOT_FOUND: ${selector}`,\n error: `Element not found for selector: ${selector}`,\n };\n }\n } else {\n targetEl = document.body || document.documentElement;\n }\n\n const captureRes = await this.screenshotDriver.captureElement(targetEl);\n if (!captureRes.ok) {\n return {\n id: command.id,\n ok: false,\n reason: captureRes.reason || 'CAPTURE_FAILED',\n error: captureRes.reason || 'Failed to capture element screenshot',\n };\n }\n\n return {\n id: command.id,\n ok: true,\n result: {\n dataUrl: captureRes.dataUrl,\n format: captureRes.format,\n width: captureRes.width,\n height: captureRes.height,\n },\n };\n }\n\n private handleCheckOverflow(command: ClientCommand<{ selector: string }>): CommandResponse {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return { id: command.id, ok: false, error: 'No browser window available' };\n }\n\n const selector = command.params?.selector;\n if (!selector) {\n return { id: command.id, ok: false, error: 'Missing selector parameter' };\n }\n\n const el = document.querySelector(selector);\n if (!el) {\n return { id: command.id, ok: false, error: `Element not found: ${selector}` };\n }\n\n const rect = el.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n const overflowRightPx = Math.max(0, Math.round(rect.right - vw));\n const overflowBottomPx = Math.max(0, Math.round(rect.bottom - vh));\n const isViewportOverflow = overflowRightPx > 0 || rect.left < 0;\n\n let parentOverflow = false;\n if (el.parentElement) {\n parentOverflow = el.parentElement.scrollWidth > el.parentElement.clientWidth;\n }\n\n return {\n id: command.id,\n ok: true,\n result: {\n selector,\n overflow: isViewportOverflow || parentOverflow,\n viewportWidth: vw,\n viewportHeight: vh,\n rect: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n top: Math.round(rect.top),\n left: Math.round(rect.left),\n bottom: Math.round(rect.bottom),\n right: Math.round(rect.right),\n },\n overflowRightPx,\n overflowBottomPx,\n parentOverflow,\n },\n };\n }\n\n private handleGetElementRect(command: ClientCommand<{ selector: string }>): CommandResponse {\n if (typeof document === 'undefined') {\n return { id: command.id, ok: false, error: 'No browser document available' };\n }\n\n const selector = command.params?.selector;\n if (!selector) {\n return { id: command.id, ok: false, error: 'Missing selector parameter' };\n }\n\n const el = document.querySelector(selector);\n if (!el) {\n return { id: command.id, ok: false, error: `Element not found: ${selector}` };\n }\n\n const rect = el.getBoundingClientRect();\n return {\n id: command.id,\n ok: true,\n result: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n top: Math.round(rect.top),\n left: Math.round(rect.left),\n bottom: Math.round(rect.bottom),\n right: Math.round(rect.right),\n },\n };\n }\n\n private handleGetElementStyle(command: ClientCommand<{ selector: string; properties?: string[] }>): CommandResponse {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return { id: command.id, ok: false, error: 'No browser window available' };\n }\n\n const selector = command.params?.selector;\n if (!selector) {\n return { id: command.id, ok: false, error: 'Missing selector parameter' };\n }\n\n const el = document.querySelector(selector);\n if (!el) {\n return { id: command.id, ok: false, error: `Element not found: ${selector}` };\n }\n\n const computed = window.getComputedStyle(el);\n const properties = command.params?.properties || ['overflow', 'overflowX', 'overflowY', 'width', 'maxWidth', 'display', 'position'];\n const styles: Record<string, string> = {};\n\n for (const prop of properties) {\n styles[prop] = computed.getPropertyValue(prop) || (computed as any)[prop] || '';\n }\n\n return {\n id: command.id,\n ok: true,\n result: {\n selector,\n styles,\n },\n };\n }\n}\n","export interface BrowserDiagClientOptions {\n daemonUrl?: string;\n projectId?: string;\n maxBreadcrumbs?: number;\n captureErrors?: boolean;\n captureConsole?: boolean;\n captureNetwork?: boolean;\n captureNavigation?: boolean;\n captureInteractions?: boolean;\n onErrorScreenshot?: boolean;\n notes?: {\n enabled?: boolean;\n shortcut?: string;\n showBadges?: boolean;\n showToolbar?: boolean;\n maskSelectors?: string[];\n };\n /**\n * Hide visible BrowserTrack UI (toolbar dock, pins, hover overlay) by default.\n */\n hidden?: boolean;\n /**\n * Custom query parameter(s) used to hide the UI (e.g. 'e2e', 'no_ui', 'clean').\n * Built-in query params like ?bt=0, ?bt=false, ?bt=hidden, ?browsertrack=false, ?no_bt are supported automatically.\n */\n hideQueryParam?: string | string[];\n debug?: boolean;\n}\n\nexport const DEFAULT_OPTIONS: Required<Omit<BrowserDiagClientOptions, 'notes' | 'hideQueryParam'>> & {\n hideQueryParam?: string | string[];\n notes: Required<NonNullable<BrowserDiagClientOptions['notes']>>;\n} = {\n daemonUrl: 'ws://127.0.0.1:7331',\n projectId: '',\n maxBreadcrumbs: 50,\n captureErrors: true,\n captureConsole: true,\n captureNetwork: true,\n captureNavigation: true,\n captureInteractions: true,\n onErrorScreenshot: true,\n notes: {\n enabled: true,\n shortcut: 'Alt+Click',\n showBadges: true,\n showToolbar: true,\n maskSelectors: ['input[type=\"password\"]', '[data-sensitive]'],\n },\n hidden: false,\n hideQueryParam: undefined,\n debug: false,\n};\n\nconst HIDE_VALUES = new Set(['0', 'false', 'hidden', 'hide', 'off', 'none', 'disabled', 'ui_off', 'silent']);\n\n/**\n * Checks if the tool's visible UI should be hidden based on URL search query parameters.\n */\nexport function shouldHideUIFromUrl(customParam?: string | string[], searchString?: string): boolean {\n let search = searchString;\n if (search === undefined) {\n if (typeof window === 'undefined' || !window.location) return false;\n search = window.location.search;\n }\n\n if (!search) return false;\n\n try {\n const params = new URLSearchParams(search);\n\n // 1. Check custom parameters if configured\n if (customParam) {\n const customKeys = Array.isArray(customParam) ? customParam : [customParam];\n for (const key of customKeys) {\n if (params.has(key)) {\n const val = (params.get(key) || '').toLowerCase().trim();\n if (val === '' || val === '1' || val === 'true' || HIDE_VALUES.has(val)) {\n return true;\n }\n }\n }\n }\n\n // 2. Boolean flags without values or with 1/true: ?no_bt, ?no_browsertrack, ?hide_bt, ?hide_browsertrack\n for (const flag of ['no_bt', 'no_browsertrack', 'hide_bt', 'hide_browsertrack']) {\n if (params.has(flag)) {\n const val = (params.get(flag) || '').toLowerCase().trim();\n if (val === '' || val === '1' || val === 'true' || val === 'yes') {\n return true;\n }\n }\n }\n\n // 3. Value-based parameters: ?bt=false, ?bt=0, ?bt=hidden, ?bt=off\n if (params.has('bt')) {\n const val = (params.get('bt') || '').toLowerCase().trim();\n if (HIDE_VALUES.has(val)) return true;\n }\n\n if (params.has('browsertrack')) {\n const val = (params.get('browsertrack') || '').toLowerCase().trim();\n if (HIDE_VALUES.has(val)) return true;\n }\n\n if (params.has('bt_ui')) {\n const val = (params.get('bt_ui') || '').toLowerCase().trim();\n if (HIDE_VALUES.has(val) || val === '0' || val === 'false') return true;\n }\n\n if (params.has('bt_hide')) {\n const val = (params.get('bt_hide') || '').toLowerCase().trim();\n if (val === '' || val === '1' || val === 'true') return true;\n }\n } catch {\n // Defensive in non-standard environments\n }\n\n return false;\n}\n","import type { ConsoleEvent, ConsoleLevel } from '../../../core/src/index.js';\n\nexport type ConsoleCallback = (event: ConsoleEvent) => void;\n\n/**\n * Patches console methods without modifying original behavior.\n */\nexport function setupConsoleInterceptors(onConsole: ConsoleCallback): () => void {\n if (typeof console === 'undefined') return () => {};\n\n const originalError = console.error;\n const originalWarn = console.warn;\n\n function formatArgs(args: any[]): string {\n return args\n .map((arg) => {\n if (arg instanceof Error) {\n return arg.stack || `${arg.name}: ${arg.message}`;\n }\n if (typeof arg === 'object' && arg !== null) {\n try {\n return JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n }\n return String(arg);\n })\n .join(' ');\n }\n\n console.error = function (...args: any[]) {\n try {\n const message = formatArgs(args);\n const stack = new Error().stack;\n onConsole({\n level: 'error',\n message,\n stack,\n timestamp: Date.now(),\n });\n } catch {\n // Defensive\n }\n return originalError.apply(console, args);\n };\n\n console.warn = function (...args: any[]) {\n try {\n const message = formatArgs(args);\n const stack = new Error().stack;\n onConsole({\n level: 'warn',\n message,\n stack,\n timestamp: Date.now(),\n });\n } catch {\n // Defensive\n }\n return originalWarn.apply(console, args);\n };\n\n return () => {\n console.error = originalError;\n console.warn = originalWarn;\n };\n}\n","import type { NavigationEvent } from '../../../core/src/index.js';\nimport { redactUrl } from '../../../core/src/index.js';\n\nexport type NavigationCallback = (event: NavigationEvent) => void;\n\n/**\n * Tracks browser SPA routing and history navigation.\n */\nexport function setupNavigationInterceptors(onNavigation: NavigationCallback): () => void {\n if (typeof window === 'undefined' || typeof history === 'undefined') return () => {};\n\n let currentUrl = '';\n try {\n currentUrl = redactUrl(window.location.href);\n // Initial navigation\n onNavigation({\n to: currentUrl,\n type: 'initial',\n timestamp: Date.now(),\n });\n } catch {\n // Defensive\n }\n\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = function (data: any, unused: string, url?: string | URL | null) {\n const from = currentUrl;\n const result = originalPushState.apply(history, [data, unused, url]);\n try {\n const to = redactUrl(window.location.href);\n currentUrl = to;\n onNavigation({\n from,\n to,\n type: 'pushState',\n timestamp: Date.now(),\n });\n } catch {\n // Defensive\n }\n return result;\n };\n\n history.replaceState = function (data: any, unused: string, url?: string | URL | null) {\n const from = currentUrl;\n const result = originalReplaceState.apply(history, [data, unused, url]);\n try {\n const to = redactUrl(window.location.href);\n currentUrl = to;\n onNavigation({\n from,\n to,\n type: 'replaceState',\n timestamp: Date.now(),\n });\n } catch {\n // Defensive\n }\n return result;\n };\n\n const onPopState = () => {\n try {\n const from = currentUrl;\n const to = redactUrl(window.location.href);\n currentUrl = to;\n onNavigation({\n from,\n to,\n type: 'popstate',\n timestamp: Date.now(),\n });\n } catch {\n // Defensive\n }\n };\n\n const onHashChange = () => {\n try {\n const from = currentUrl;\n const to = redactUrl(window.location.href);\n currentUrl = to;\n onNavigation({\n from,\n to,\n type: 'hashchange',\n timestamp: Date.now(),\n });\n } catch {\n // Defensive\n }\n };\n\n window.addEventListener('popstate', onPopState);\n window.addEventListener('hashchange', onHashChange);\n\n return () => {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n window.removeEventListener('popstate', onPopState);\n window.removeEventListener('hashchange', onHashChange);\n };\n}\n","import type { NetworkEvent } from '../../../core/src/index.js';\nimport { redactUrl } from '../../../core/src/index.js';\n\nexport type NetworkCallback = (event: NetworkEvent) => void;\n\n/**\n * Patches window.fetch and XMLHttpRequest to track network requests and failures.\n */\nexport function setupNetworkInterceptors(onNetwork: NetworkCallback): () => void {\n const cleanups: (() => void)[] = [];\n\n // 1. Patch window.fetch\n if (typeof window !== 'undefined' && typeof window.fetch === 'function') {\n const originalFetch = window.fetch;\n\n window.fetch = async function (input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n const startTime = Date.now();\n let urlStr = '';\n let method = 'GET';\n\n try {\n if (typeof input === 'string') {\n urlStr = input;\n } else if (input instanceof URL) {\n urlStr = input.toString();\n } else if (input && typeof input === 'object' && 'url' in input) {\n urlStr = input.url;\n method = input.method || 'GET';\n }\n\n if (init && init.method) {\n method = init.method.toUpperCase();\n }\n } catch {\n urlStr = 'unknown_url';\n }\n\n const safeUrl = redactUrl(urlStr);\n\n let response: Response;\n try {\n response = await originalFetch.apply(window, [input as any, init]);\n } catch (err: any) {\n const durationMs = Date.now() - startTime;\n const isAbort = err?.name === 'AbortError';\n\n try {\n onNetwork({\n url: safeUrl,\n method,\n durationMs,\n error: err?.message || 'Network request failed',\n aborted: isAbort,\n timestamp: startTime,\n });\n } catch {}\n\n throw err;\n }\n\n const durationMs = Date.now() - startTime;\n try {\n onNetwork({\n url: safeUrl,\n method,\n status: response.status,\n statusText: response.statusText,\n durationMs,\n timestamp: startTime,\n });\n } catch {}\n\n return response;\n };\n\n cleanups.push(() => {\n window.fetch = originalFetch;\n });\n }\n\n // 2. Patch XMLHttpRequest\n if (typeof window !== 'undefined' && typeof window.XMLHttpRequest === 'function') {\n const originalOpen = XMLHttpRequest.prototype.open;\n const originalSend = XMLHttpRequest.prototype.send;\n const originalAbort = XMLHttpRequest.prototype.abort;\n\n const xhrMap = new WeakMap<XMLHttpRequest, { url: string; method: string; startTime: number; aborted?: boolean }>();\n\n XMLHttpRequest.prototype.open = function (this: XMLHttpRequest, ...args: any[]) {\n try {\n const method = String(args[0] || 'GET').toUpperCase();\n const rawUrl = String(args[1] || '');\n xhrMap.set(this, {\n url: redactUrl(rawUrl),\n method,\n startTime: Date.now(),\n });\n } catch {\n // Defensive\n }\n return originalOpen.apply(this, args as any);\n };\n\n XMLHttpRequest.prototype.abort = function (this: XMLHttpRequest) {\n const meta = xhrMap.get(this);\n if (meta) {\n meta.aborted = true;\n }\n return originalAbort.apply(this);\n };\n\n XMLHttpRequest.prototype.send = function (this: XMLHttpRequest, body?: any) {\n const meta = xhrMap.get(this) || { url: 'unknown_url', method: 'GET', startTime: Date.now() };\n\n const onComplete = () => {\n try {\n const durationMs = Date.now() - meta.startTime;\n onNetwork({\n url: meta.url,\n method: meta.method,\n status: this.status,\n statusText: this.statusText,\n durationMs,\n aborted: meta.aborted,\n timestamp: meta.startTime,\n });\n } catch {\n // Defensive\n }\n };\n\n const onError = () => {\n try {\n const durationMs = Date.now() - meta.startTime;\n onNetwork({\n url: meta.url,\n method: meta.method,\n status: this.status || 0,\n durationMs,\n error: 'XHR Network Error',\n aborted: meta.aborted,\n timestamp: meta.startTime,\n });\n } catch {\n // Defensive\n }\n };\n\n this.addEventListener('load', onComplete, { once: true });\n this.addEventListener('error', onError, { once: true });\n this.addEventListener('timeout', onError, { once: true });\n\n return originalSend.apply(this, [body]);\n };\n\n cleanups.push(() => {\n XMLHttpRequest.prototype.open = originalOpen;\n XMLHttpRequest.prototype.send = originalSend;\n XMLHttpRequest.prototype.abort = originalAbort;\n });\n }\n\n return () => {\n for (const cleanup of cleanups) {\n try {\n cleanup();\n } catch {}\n }\n };\n}\n","import type { RuntimeErrorEvent } from '@browserdiag/core';\n\nexport type RuntimeErrorCallback = (event: RuntimeErrorEvent, error?: any) => void;\n\nexport function setupRuntimeInterceptors(onRuntimeError: RuntimeErrorCallback): () => void {\n if (typeof window === 'undefined') return () => {};\n\n const errorHandler = (event: ErrorEvent) => {\n try {\n const errorEvent: RuntimeErrorEvent = {\n message: event.message || (event.error && event.error.message) || 'Script error',\n stack: (event.error && event.error.stack) || undefined,\n filename: event.filename || undefined,\n lineno: event.lineno || undefined,\n colno: event.colno || undefined,\n errorType: (event.error && event.error.name) || 'Error',\n timestamp: Date.now(),\n };\n onRuntimeError(errorEvent, event.error);\n } catch {\n // Defensive: never let diagnostic handler crash host app\n }\n };\n\n const unhandledRejectionHandler = (event: PromiseRejectionEvent) => {\n try {\n const reason = event.reason;\n let message = 'Unhandled Promise Rejection';\n let stack: string | undefined;\n let errorType = 'UnhandledRejection';\n\n if (reason instanceof Error) {\n message = reason.message;\n stack = reason.stack;\n errorType = reason.name || 'UnhandledRejection';\n } else if (typeof reason === 'string') {\n message = reason;\n } else if (reason && typeof reason === 'object') {\n try {\n message = JSON.stringify(reason);\n } catch {\n message = String(reason);\n }\n }\n\n const errorEvent: RuntimeErrorEvent = {\n message,\n stack,\n errorType,\n timestamp: Date.now(),\n };\n onRuntimeError(errorEvent, reason);\n } catch {\n // Defensive\n }\n };\n\n window.addEventListener('error', errorHandler);\n window.addEventListener('unhandledrejection', unhandledRejectionHandler);\n\n return () => {\n window.removeEventListener('error', errorHandler);\n window.removeEventListener('unhandledrejection', unhandledRejectionHandler);\n };\n}\n","import { snapdom } from '@zumer/snapdom';\nimport type { ScreenshotDriver, ScreenshotResult } from './driver.js';\n\n/**\n * Modern DOM snapshot driver using @zumer/snapdom with graceful fallbacks.\n * Converts DOM subtrees and elements into WebP / PNG data URLs.\n */\nexport class BrowserScriptScreenshotDriver implements ScreenshotDriver {\n public name = 'BrowserScriptScreenshotDriver';\n\n public async captureSelector(selector: string): Promise<ScreenshotResult> {\n try {\n if (typeof document === 'undefined') {\n return { ok: false, reason: 'NO_DOCUMENT_ENVIRONMENT' };\n }\n\n const el = document.querySelector(selector);\n if (!el) {\n return { ok: false, reason: `ELEMENT_NOT_FOUND: ${selector}` };\n }\n\n return await this.captureElement(el);\n } catch (err: any) {\n return { ok: false, reason: err?.message || 'UNKNOWN_CAPTURE_ERROR' };\n }\n }\n\n public async captureElement(element: HTMLElement | Element): Promise<ScreenshotResult> {\n try {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return { ok: false, reason: 'NO_BROWSER_ENVIRONMENT' };\n }\n\n const rect = element.getBoundingClientRect();\n const width = Math.max(Math.round(rect.width), 10);\n const height = Math.max(Math.round(rect.height), 10);\n\n // Attempt capture with snapdom\n const capturePromise = (async () => {\n try {\n // Prefer WebP export if supported, otherwise fallback to PNG\n let imgElement: HTMLImageElement | undefined = undefined;\n let format: 'webp' | 'png' = 'webp';\n\n try {\n if (typeof snapdom === 'function') {\n const captureRes = await snapdom(element as any, { scale: 1, embedFonts: false });\n if (captureRes && typeof captureRes.toWebp === 'function') {\n imgElement = await captureRes.toWebp();\n } else if (captureRes && typeof captureRes.toPng === 'function') {\n imgElement = await captureRes.toPng();\n format = 'png';\n } else if (captureRes?.url) {\n return {\n ok: true,\n dataUrl: captureRes.url,\n format: 'webp' as const,\n width,\n height,\n };\n }\n } else if ((snapdom as any)?.toWebp) {\n imgElement = await (snapdom as any).toWebp(element, {\n scale: 1,\n embedFonts: false,\n });\n } else if ((snapdom as any)?.toPng) {\n imgElement = await (snapdom as any).toPng(element, {\n scale: 1,\n embedFonts: false,\n });\n format = 'png';\n }\n } catch {\n // Fall through to fallback\n }\n\n if (imgElement && imgElement.src) {\n return {\n ok: true,\n dataUrl: imgElement.src,\n format: imgElement.src.startsWith('data:image/webp') ? ('webp' as const) : format,\n width: imgElement.naturalWidth || width,\n height: imgElement.naturalHeight || height,\n };\n }\n } catch (snapErr: any) {\n const errMsg = String(snapErr?.message || snapErr);\n if (errMsg.includes('CORS') || errMsg.includes('SecurityError') || errMsg.includes('tainted')) {\n return { ok: false, reason: 'CROSS_ORIGIN_RESOURCE' };\n }\n // Fallback to minimal canvas capture below\n }\n\n // Fallback: minimal inline SVG ForeignObject capture\n return await this.captureWithSvgFallback(element, width, height);\n })();\n\n // 3 second timeout protection\n const timeoutPromise = new Promise<ScreenshotResult>((resolve) => {\n setTimeout(() => resolve({ ok: false, reason: 'CAPTURE_TIMEOUT' }), 3000);\n });\n\n return await Promise.race([capturePromise, timeoutPromise]);\n } catch (err: any) {\n return { ok: false, reason: err?.message || 'CAPTURE_EXCEPTION' };\n }\n }\n\n private async captureWithSvgFallback(\n element: HTMLElement | Element,\n width: number,\n height: number\n ): Promise<ScreenshotResult> {\n try {\n const clone = element.cloneNode(true) as HTMLElement;\n const computed = window.getComputedStyle(element);\n let cssText = '';\n for (let i = 0; i < computed.length; i++) {\n const prop = computed[i];\n cssText += `${prop}:${computed.getPropertyValue(prop)};`;\n }\n clone.style.cssText = cssText;\n clone.style.margin = '0';\n clone.style.position = 'static';\n\n const svg = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\">\n <foreignObject width=\"100%\" height=\"100%\">\n <div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"width:${width}px;height:${height}px;\">\n ${clone.outerHTML}\n </div>\n </foreignObject>\n </svg>\n `.trim();\n\n const svgBlob = new Blob([svg], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(svgBlob);\n\n return await new Promise<ScreenshotResult>((resolve) => {\n const img = new Image();\n img.onload = () => {\n try {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n URL.revokeObjectURL(url);\n resolve({ ok: false, reason: 'CANVAS_CONTEXT_UNAVAILABLE' });\n return;\n }\n\n ctx.drawImage(img, 0, 0);\n URL.revokeObjectURL(url);\n\n let dataUrl: string;\n try {\n dataUrl = canvas.toDataURL('image/webp', 0.85);\n } catch {\n dataUrl = canvas.toDataURL('image/png');\n }\n\n resolve({\n ok: true,\n dataUrl,\n format: dataUrl.startsWith('data:image/webp') ? 'webp' : 'png',\n width,\n height,\n });\n } catch (e: any) {\n URL.revokeObjectURL(url);\n if (e?.name === 'SecurityError' || String(e).includes('tainted')) {\n resolve({ ok: false, reason: 'CROSS_ORIGIN_RESOURCE' });\n } else {\n resolve({ ok: false, reason: e?.message || 'CANVAS_EXPORT_FAILED' });\n }\n }\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(url);\n resolve({ ok: false, reason: 'IMAGE_LOAD_FAILED' });\n };\n\n img.src = url;\n });\n } catch (e: any) {\n return { ok: false, reason: e?.message || 'FALLBACK_CAPTURE_FAILED' };\n }\n }\n}\n","import type { HelloMessage, ClientCommand, CommandResponse } from '../../../core/src/index.js';\nimport { safeJsonStringify } from '../../../core/src/index.js';\nimport type { ClientCommandHandler } from '../commands/handler.js';\n\nexport interface TransportOptions {\n url: string;\n projectId?: string;\n debug?: boolean;\n}\n\nexport class WebSocketTransport {\n private wsUrl: string;\n private projectId?: string;\n private debug: boolean;\n private ws: WebSocket | null = null;\n private sessionId: string | null = null;\n private queue: string[] = [];\n private maxQueueSize = 50;\n private reconnectAttempts = 0;\n private maxReconnectDelay = 10000;\n private reconnectTimer: any = null;\n private commandHandler?: ClientCommandHandler;\n private messageListeners: ((msg: any) => void)[] = [];\n private isDestroyed = false;\n\n constructor(options: TransportOptions) {\n this.wsUrl = options.url || 'ws://127.0.0.1:7331';\n this.projectId = options.projectId;\n this.debug = !!options.debug;\n }\n\n public setCommandHandler(handler: ClientCommandHandler): void {\n this.commandHandler = handler;\n }\n\n public onMessage(listener: (msg: any) => void): () => void {\n this.messageListeners.push(listener);\n return () => {\n this.messageListeners = this.messageListeners.filter((l) => l !== listener);\n };\n }\n\n public getSessionId(): string | null {\n return this.sessionId;\n }\n\n public isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === (typeof WebSocket !== 'undefined' ? WebSocket.OPEN : 1);\n }\n\n public connect(): void {\n if (this.isDestroyed || typeof WebSocket === 'undefined') return;\n if (this.ws && (this.ws.readyState === WebSocket.CONNECTING || this.ws.readyState === WebSocket.OPEN)) {\n return;\n }\n\n try {\n this.ws = new WebSocket(this.wsUrl);\n\n this.ws.onopen = () => {\n this.reconnectAttempts = 0;\n this.sendHello();\n this.flushQueue();\n };\n\n this.ws.onmessage = async (event: MessageEvent) => {\n try {\n const raw = typeof event.data === 'string' ? event.data : '';\n if (!raw) return;\n const msg = JSON.parse(raw);\n\n // Dispatch to subscribers (e.g. NoteInspector for notes_sync)\n for (const listener of this.messageListeners) {\n try {\n listener(msg);\n } catch {}\n }\n\n if (msg.type === 'hello_ack') {\n this.sessionId = msg.sessionId;\n if (this.debug) {\n console.log('[BrowserTrack] Connected, session ID:', this.sessionId);\n }\n return;\n }\n\n if (msg.type === 'command' && this.commandHandler) {\n const command: ClientCommand = msg.command;\n const res: CommandResponse = await this.commandHandler.executeCommand(command);\n this.send({\n type: 'command_response',\n sessionId: this.sessionId,\n response: res,\n });\n }\n } catch {\n // Defensive\n }\n };\n\n this.ws.onerror = () => {\n // Silent fail if daemon is offline\n };\n\n this.ws.onclose = () => {\n this.ws = null;\n this.scheduleReconnect();\n };\n } catch {\n this.scheduleReconnect();\n }\n }\n\n public send(payload: any): void {\n try {\n const raw = safeJsonStringify(payload);\n if (this.isConnected()) {\n try {\n this.ws!.send(raw);\n } catch {\n this.enqueue(raw);\n }\n } else {\n this.enqueue(raw);\n }\n } catch {\n // Defensive: never let payload serialization crash caller\n }\n }\n\n private enqueue(raw: string): void {\n if (this.queue.length >= this.maxQueueSize) {\n this.queue.shift();\n }\n this.queue.push(raw);\n }\n\n private flushQueue(): void {\n if (!this.isConnected()) return;\n while (this.queue.length > 0) {\n const item = this.queue.shift();\n if (item) {\n try {\n this.ws!.send(item);\n } catch {\n this.queue.unshift(item);\n break;\n }\n }\n }\n }\n\n private sendHello(): void {\n if (typeof window === 'undefined') return;\n\n try {\n const hello: HelloMessage = {\n type: 'hello',\n origin: window.location.origin,\n url: window.location.href,\n title: document.title,\n userAgent: navigator.userAgent,\n timestamp: Date.now(),\n projectId: this.projectId,\n };\n\n this.ws!.send(safeJsonStringify(hello));\n } catch {\n // Defensive\n }\n }\n\n private scheduleReconnect(): void {\n if (this.isDestroyed || this.reconnectTimer) return;\n\n this.reconnectAttempts++;\n const delay = Math.min(1000 * Math.pow(1.5, this.reconnectAttempts), this.maxReconnectDelay);\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.connect();\n }, delay);\n }\n\n public destroy(): void {\n this.isDestroyed = true;\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n if (this.ws) {\n try {\n this.ws.close();\n } catch {}\n this.ws = null;\n }\n this.queue = [];\n }\n}\n","import type { ElementContext, NoteTarget, RegionContext, VisualNote } from '../../../core/src/index.js';\nimport { getSemanticSelector, truncate } from '../../../core/src/index.js';\nimport type { ScreenshotDriver } from '../screenshot/driver.js';\nimport type { WebSocketTransport } from '../transport/websocket.js';\nimport { shouldHideUIFromUrl } from '../config.js';\nimport { resolveComponentSource } from '../source/resolver.js';\n\nexport type NoteInspectMode = 'element' | 'region' | 'page' | 'idle';\n\nexport interface InspectorOptions {\n shortcut?: string; // e.g. \"Alt+Click\"\n maskSelectors?: string[];\n showToolbar?: boolean;\n showBadges?: boolean;\n hidden?: boolean;\n hideQueryParam?: string | string[];\n onNoteCreated?: (note: Partial<VisualNote>) => void;\n}\n\nexport interface ActiveScenarioState {\n id: string;\n title: string;\n stepNumber: number;\n}\n\n/**\n * Isolated Visual Note & Multi-Step Scenario Inspector rendering in Shadow DOM.\n * Supports:\n * 1. Element selection (hover highlight & click)\n * 2. Region / Area selection (drag-and-drop rectangle on screen with cancel banner)\n * 3. Whole page note\n * 4. Multi-Step Flow / Scenario Recording (sequential 'Save & Next Step' continuous capture)\n * 5. Real-time Saved Note & Step Markers (pins with step sequencing numbers)\n * 6. Interactive Note & Step Detail Card (with previous/next step walk-through navigation)\n * 7. Floating quick dock / toolbar in bottom-right corner with Notes count and Flow controls\n * 8. Automatic invisibility via query parameter (?bt=0, ?bt=false, ?bt=hidden, ?no_bt, custom query params)\n */\nexport class NoteInspector {\n private transport: WebSocketTransport;\n private screenshotDriver: ScreenshotDriver;\n private options: InspectorOptions;\n\n private container: HTMLDivElement | null = null;\n private shadowRoot: ShadowRoot | null = null;\n private highlightOverlay: HTMLDivElement | null = null;\n private regionOverlay: HTMLDivElement | null = null;\n private regionBox: HTMLDivElement | null = null;\n private regionBanner: HTMLDivElement | null = null;\n private markersContainer: HTMLDivElement | null = null;\n private toolbarElement: HTMLDivElement | null = null;\n private modalOverlay: HTMLDivElement | null = null;\n private cardOverlay: HTMLDivElement | null = null;\n private toastContainer: HTMLDivElement | null = null;\n\n private activeMode: NoteInspectMode = 'idle';\n private activeScenario: ActiveScenarioState | null = null;\n private hoveredElement: HTMLElement | null = null;\n private selectedElement: HTMLElement | null = null;\n private selectedRegion: RegionContext | null = null;\n\n private isDraggingRegion = false;\n private dragStartX = 0;\n private dragStartY = 0;\n\n private savedNotes: VisualNote[] = [];\n private showMarkers = true;\n private isHidden = false;\n private cleanups: (() => void)[] = [];\n\n constructor(transport: WebSocketTransport, screenshotDriver: ScreenshotDriver, options: InspectorOptions = {}) {\n this.transport = transport;\n this.screenshotDriver = screenshotDriver;\n const hiddenByQuery = shouldHideUIFromUrl(options.hideQueryParam);\n this.isHidden = options.hidden === true || hiddenByQuery;\n this.showMarkers = options.showBadges !== false && !this.isHidden;\n this.options = {\n shortcut: 'Alt+Click',\n maskSelectors: ['input[type=\"password\"]', '[data-sensitive]'],\n showToolbar: true,\n showBadges: true,\n ...options,\n };\n }\n\n public init(): void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return;\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n this.ensureContainer();\n });\n } else {\n this.ensureContainer();\n }\n\n // Subscribe to incoming notes synchronization from daemon\n const unsubscribe = this.transport.onMessage((msg) => {\n if (msg && msg.type === 'notes_sync' && Array.isArray(msg.notes)) {\n this.syncNotes(msg.notes);\n }\n });\n this.cleanups.push(unsubscribe);\n\n this.setupListeners();\n }\n\n public syncNotes(notes: VisualNote[]): void {\n this.savedNotes = notes;\n this.updateToolbarCount();\n this.renderMarkers();\n }\n\n public showToast(message: string, icon = '✨', durationMs = 2500): void {\n if (typeof document === 'undefined') return;\n const root = this.ensureContainer();\n if (!root || !this.toastContainer) return;\n\n const toast = document.createElement('div');\n toast.className = 'bt-toast';\n toast.innerHTML = `<span>${icon}</span> <span>${message}</span>`;\n this.toastContainer.appendChild(toast);\n\n setTimeout(() => {\n toast.classList.add('bt-toast-fadeout');\n setTimeout(() => {\n if (toast.parentElement) {\n toast.parentElement.removeChild(toast);\n }\n }, 250);\n }, durationMs);\n }\n\n public startScenario(title?: string): void {\n const defaultTitle = title || `Scenario ${new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`;\n this.activeScenario = {\n id: `scen_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`,\n title: defaultTitle,\n stepNumber: 1,\n };\n this.updateToolbarState();\n this.setMode('element');\n this.showToast(`Started flow: \"${defaultTitle}\"`, '🎬');\n }\n\n public finishScenario(): void {\n const title = this.activeScenario?.title;\n this.activeScenario = null;\n this.updateToolbarState();\n this.setMode('idle');\n this.showToast(title ? `Finished flow: \"${title}\"` : 'Flow recording finished', '✓');\n }\n\n public setMode(mode: NoteInspectMode): void {\n this.activeMode = mode;\n this.updateToolbarState();\n\n if (mode === 'element') {\n this.hideRegionOverlay();\n } else if (mode === 'region') {\n this.hideHighlight();\n this.showRegionOverlay();\n } else if (mode === 'page') {\n this.hideRegionOverlay();\n this.hideHighlight();\n this.openNoteEditor(document.body, 'page');\n } else {\n this.hideRegionOverlay();\n this.hideHighlight();\n }\n }\n\n public isVisible(): boolean {\n return !this.isHidden;\n }\n\n public setVisible(visible: boolean): void {\n this.isHidden = !visible;\n this.showMarkers = this.options.showBadges !== false && !this.isHidden;\n\n if (this.container) {\n this.container.style.display = this.isHidden ? 'none' : 'block';\n }\n\n if (this.toolbarElement) {\n this.toolbarElement.style.display = this.isHidden ? 'none' : 'flex';\n } else if (!this.isHidden && this.options.showToolbar !== false) {\n this.createToolbar();\n }\n\n if (this.isHidden) {\n this.hideHighlight();\n this.hideRegionOverlay();\n if (this.modalOverlay && this.shadowRoot) {\n this.shadowRoot.removeChild(this.modalOverlay);\n this.modalOverlay = null;\n }\n if (this.cardOverlay && this.shadowRoot) {\n this.shadowRoot.removeChild(this.cardOverlay);\n this.cardOverlay = null;\n }\n if (this.markersContainer) {\n this.markersContainer.innerHTML = '';\n }\n } else {\n this.renderMarkers();\n this.updateToolbarCount();\n }\n }\n\n private ensureContainer(): ShadowRoot | null {\n if (typeof document === 'undefined') return null;\n\n if (!this.container) {\n this.container = document.createElement('div');\n this.container.id = 'browsertrack-inspector-host';\n this.container.style.cssText =\n 'all: initial; position: fixed; top: 0; left: 0; width: 0; height: 0; z-index: 2147483647; pointer-events: none;';\n if (this.isHidden) {\n this.container.style.display = 'none';\n }\n\n this.shadowRoot = this.container.attachShadow({ mode: 'open' });\n\n // Styles for highlight overlay, region drag box, markers, floating toolbar and modals\n const style = document.createElement('style');\n style.textContent = `\n :host {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n color-scheme: dark;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n \n /* 1. Element Highlight Overlay */\n .bt-highlight {\n position: fixed;\n border: 2px solid #3b82f6;\n background: rgba(59, 130, 246, 0.16);\n border-radius: 4px;\n pointer-events: none;\n transition: all 0.05s ease-out;\n z-index: 2147483640;\n box-sizing: border-box;\n }\n\n .bt-badge {\n position: absolute;\n top: -26px;\n left: 0;\n background: #0f172a;\n color: #38bdf8;\n border: 1px solid #3b82f6;\n font-size: 11px;\n font-weight: 600;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n padding: 2px 7px;\n border-radius: 4px;\n white-space: nowrap;\n pointer-events: none;\n box-shadow: 0 4px 6px -1px rgba(0,0,0,0.5);\n }\n\n /* 2. Region Selection Overlay */\n .bt-region-overlay {\n position: fixed;\n inset: 0;\n width: 100vw;\n height: 100vh;\n cursor: crosshair;\n z-index: 2147483642;\n pointer-events: auto;\n background: rgba(15, 23, 42, 0.25);\n user-select: none;\n }\n\n .bt-region-box {\n position: fixed;\n border: 2px dashed #38bdf8;\n background: rgba(56, 189, 248, 0.2);\n box-sizing: border-box;\n pointer-events: none;\n z-index: 2147483643;\n }\n\n .bt-region-badge {\n position: absolute;\n top: -26px;\n left: 0;\n background: #0f172a;\n color: #38bdf8;\n border: 1px solid #0284c7;\n font-size: 11px;\n font-weight: 600;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n padding: 2px 7px;\n border-radius: 4px;\n white-space: nowrap;\n pointer-events: none;\n box-shadow: 0 4px 6px -1px rgba(0,0,0,0.5);\n }\n\n .bt-region-banner {\n position: fixed;\n top: 20px;\n left: 50%;\n transform: translateX(-50%);\n background: #0f172a;\n color: #f8fafc;\n border: 1px solid #0284c7;\n border-radius: 30px;\n padding: 8px 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n box-shadow: 0 10px 25px -5px rgba(0,0,0,0.6);\n font-size: 12.5px;\n font-weight: 500;\n pointer-events: auto;\n z-index: 2147483645;\n user-select: none;\n }\n\n .bt-region-cancel-btn {\n background: rgba(239, 68, 68, 0.15);\n color: #fca5a5;\n border: 1px solid rgba(239, 68, 68, 0.4);\n padding: 3px 10px;\n border-radius: 20px;\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s ease;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-family: inherit;\n }\n\n .bt-region-cancel-btn:hover {\n background: rgba(239, 68, 68, 0.3);\n color: #ffffff;\n }\n\n /* 3. Note Markers on Page */\n .bt-markers-layer {\n position: fixed;\n top: 0;\n left: 0;\n width: 0;\n height: 0;\n pointer-events: none;\n z-index: 2147483638;\n }\n\n .bt-note-marker {\n position: fixed;\n pointer-events: auto;\n background: linear-gradient(135deg, #2563eb, #1d4ed8);\n color: #ffffff;\n border: 2px solid #ffffff;\n box-shadow: 0 4px 12px rgba(0,0,0,0.5), 0 0 0 1px rgba(37,99,235,0.4);\n border-radius: 999px;\n height: 26px;\n min-width: 26px;\n padding: 0 7px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n cursor: pointer;\n font-size: 11px;\n font-weight: 700;\n user-select: none;\n transition: transform 0.15s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.15s ease;\n animation: bt-pop-in 0.2s ease-out;\n box-sizing: border-box;\n z-index: 2147483641;\n }\n\n .bt-note-marker-step {\n background: linear-gradient(135deg, #f59e0b, #d97706);\n border-color: #fef3c7;\n box-shadow: 0 4px 14px rgba(245, 158, 11, 0.4), 0 0 0 1px rgba(217, 119, 6, 0.5);\n }\n\n @keyframes bt-pop-in {\n 0% { transform: scale(0.6); opacity: 0; }\n 100% { transform: scale(1); opacity: 1; }\n }\n\n .bt-note-marker:hover {\n transform: scale(1.15) translateY(-2px);\n box-shadow: 0 8px 20px rgba(37,99,235,0.6), 0 0 0 2px #60a5fa;\n }\n\n .bt-note-marker-step:hover {\n box-shadow: 0 8px 20px rgba(245, 158, 11, 0.7), 0 0 0 2px #fde68a;\n }\n\n .bt-marker-resolved {\n background: linear-gradient(135deg, #475569, #334155);\n border-color: #94a3b8;\n opacity: 0.75;\n }\n\n .bt-region-marker-box {\n position: fixed;\n border: 2px dashed #0284c7;\n background: rgba(14, 165, 233, 0.08);\n pointer-events: none;\n box-sizing: border-box;\n border-radius: 6px;\n z-index: 2147483639;\n }\n\n .bt-page-notes-dock {\n position: fixed;\n top: 16px;\n right: 16px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n pointer-events: none;\n z-index: 2147483641;\n }\n\n .bt-page-note-pill {\n background: #0f172a;\n color: #c084fc;\n border: 1px solid #7e22ce;\n border-radius: 20px;\n padding: 5px 12px;\n font-size: 11.5px;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.5);\n cursor: pointer;\n pointer-events: auto;\n transition: all 0.15s ease;\n }\n\n .bt-page-note-pill:hover {\n background: #1e1b4b;\n transform: translateY(-1px);\n }\n\n /* 4. Floating Quick Toolbar */\n .bt-toolbar {\n position: fixed;\n bottom: 20px;\n right: 20px;\n background: #0f172a;\n border: 1px solid #334155;\n border-radius: 30px;\n padding: 4px 6px;\n display: flex;\n align-items: center;\n gap: 4px;\n box-shadow: 0 10px 25px -3px rgba(0,0,0,0.6), 0 4px 6px -4px rgba(0,0,0,0.4);\n pointer-events: auto;\n z-index: 2147483646;\n user-select: none;\n transition: all 0.2s ease;\n }\n\n .bt-toolbar-btn {\n background: transparent;\n border: none;\n color: #94a3b8;\n font-size: 12px;\n font-weight: 500;\n padding: 6px 12px;\n border-radius: 20px;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.15s ease;\n font-family: inherit;\n }\n\n .bt-toolbar-btn:hover {\n background: #1e293b;\n color: #f8fafc;\n }\n\n .bt-toolbar-btn.active {\n background: #2563eb;\n color: #ffffff;\n font-weight: 600;\n box-shadow: 0 2px 6px rgba(37, 99, 235, 0.35);\n }\n\n .bt-toolbar-btn.active-scenario {\n background: linear-gradient(135deg, #f59e0b, #d97706);\n color: #ffffff;\n font-weight: 700;\n box-shadow: 0 2px 8px rgba(245, 158, 11, 0.4);\n animation: bt-pulse 2s infinite;\n }\n\n @keyframes bt-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.85; }\n }\n\n .bt-count-pill {\n background: rgba(255, 255, 255, 0.2);\n color: #ffffff;\n font-size: 10px;\n font-weight: 700;\n padding: 1px 6px;\n border-radius: 10px;\n line-height: 1.2;\n }\n\n .bt-toolbar-divider {\n width: 1px;\n height: 16px;\n background: #334155;\n margin: 0 2px;\n }\n\n /* 5. Modals & Popover Card */\n .bt-modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(15, 23, 42, 0.75);\n backdrop-filter: blur(6px);\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: auto;\n z-index: 2147483647;\n opacity: 1;\n box-sizing: border-box;\n animation: bt-fade-in 0.15s ease-out;\n }\n\n @keyframes bt-fade-in {\n from { opacity: 0; transform: scale(0.98); }\n to { opacity: 1; transform: scale(1); }\n }\n\n .bt-modal {\n background: #0f172a;\n color: #f8fafc;\n border: 1px solid #334155;\n border-radius: 14px;\n padding: 20px;\n width: 470px;\n max-width: 92vw;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.8), 0 0 0 1px rgba(255, 255, 255, 0.05);\n display: flex;\n flex-direction: column;\n gap: 14px;\n box-sizing: border-box;\n }\n\n .bt-modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .bt-modal-title {\n font-size: 14.5px;\n font-weight: 600;\n letter-spacing: -0.01em;\n display: flex;\n align-items: center;\n gap: 8px;\n color: #f8fafc;\n flex-wrap: wrap;\n }\n\n .bt-mode-badge {\n font-size: 10px;\n font-weight: 700;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n padding: 2px 7px;\n border-radius: 6px;\n }\n\n .bt-badge-element {\n background: rgba(59, 130, 246, 0.15);\n color: #60a5fa;\n border: 1px solid rgba(59, 130, 246, 0.4);\n }\n\n .bt-badge-region {\n background: rgba(14, 165, 233, 0.15);\n color: #38bdf8;\n border: 1px solid rgba(14, 165, 233, 0.4);\n }\n\n .bt-badge-page {\n background: rgba(168, 85, 247, 0.15);\n color: #c084fc;\n border: 1px solid rgba(168, 85, 247, 0.4);\n }\n\n .bt-badge-step {\n background: rgba(245, 158, 11, 0.15);\n color: #fbbf24;\n border: 1px solid rgba(245, 158, 11, 0.4);\n }\n\n .bt-badge-status-open {\n background: rgba(16, 185, 129, 0.15);\n color: #34d399;\n border: 1px solid rgba(16, 185, 129, 0.4);\n }\n\n .bt-badge-status-resolved {\n background: rgba(100, 116, 139, 0.2);\n color: #94a3b8;\n border: 1px solid rgba(100, 116, 139, 0.4);\n }\n\n .bt-close-btn {\n background: transparent;\n border: none;\n color: #94a3b8;\n font-size: 15px;\n cursor: pointer;\n padding: 3px 7px;\n border-radius: 6px;\n transition: all 0.12s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .bt-close-btn:hover {\n background: #1e293b;\n color: #ffffff;\n }\n\n .bt-target-pill {\n background: #090d16;\n color: #94a3b8;\n border: 1px solid #1e293b;\n border-radius: 8px;\n padding: 8px 12px;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 11.5px;\n display: flex;\n align-items: center;\n gap: 8px;\n overflow: hidden;\n }\n\n .bt-pill-content {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: #cbd5e1;\n }\n\n .bt-component-pill {\n display: flex;\n align-items: center;\n gap: 6px;\n background: rgba(15, 23, 42, 0.95);\n border: 1px solid rgba(99, 102, 241, 0.35);\n border-radius: 6px;\n padding: 6px 10px;\n font-size: 11.5px;\n color: #c7d2fe;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .bt-scenario-stepper {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: #090d16;\n border: 1px solid #1e293b;\n border-radius: 8px;\n padding: 6px 10px;\n font-size: 12px;\n font-weight: 600;\n color: #f59e0b;\n }\n\n .bt-step-nav-btn {\n background: #1e293b;\n color: #f8fafc;\n border: 1px solid #334155;\n padding: 4px 10px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 11px;\n font-weight: 600;\n transition: all 0.12s ease;\n font-family: inherit;\n }\n\n .bt-step-nav-btn:hover:not(:disabled) {\n background: #2563eb;\n border-color: #3b82f6;\n color: #ffffff;\n }\n\n .bt-step-nav-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n }\n\n .bt-note-message-box {\n background: #090d16;\n border: 1px solid #1e293b;\n border-radius: 8px;\n padding: 12px 14px;\n font-size: 13.5px;\n line-height: 1.5;\n color: #f1f5f9;\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 180px;\n overflow-y: auto;\n }\n\n .bt-textarea {\n background: #090d16;\n color: #f8fafc;\n border: 1px solid #334155;\n border-radius: 8px;\n padding: 12px;\n font-size: 13.5px;\n line-height: 1.5;\n resize: vertical;\n min-height: 95px;\n outline: none;\n box-sizing: border-box;\n width: 100%;\n font-family: inherit;\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n }\n\n .bt-textarea::placeholder {\n color: #64748b;\n }\n\n .bt-textarea:focus {\n border-color: #3b82f6;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.25);\n }\n\n .bt-modal-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 10px;\n margin-top: 2px;\n flex-wrap: wrap;\n }\n\n .bt-kbd-hint {\n font-size: 11px;\n color: #64748b;\n display: flex;\n align-items: center;\n gap: 4px;\n user-select: none;\n }\n\n .bt-kbd-hint kbd {\n background: #1e293b;\n color: #94a3b8;\n border: 1px solid #334155;\n border-radius: 4px;\n padding: 1px 5px;\n font-family: inherit;\n font-size: 10px;\n font-weight: 600;\n }\n\n .bt-modal-actions {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n }\n\n .bt-btn {\n padding: 7px 14px;\n border-radius: 7px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n border: 1px solid transparent;\n transition: all 0.15s ease;\n font-family: inherit;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 5px;\n }\n\n .bt-btn-cancel {\n background: transparent;\n color: #94a3b8;\n }\n .bt-btn-cancel:hover {\n background: #1e293b;\n color: #f8fafc;\n }\n\n .bt-btn-save {\n background: #2563eb;\n color: #ffffff;\n box-shadow: 0 2px 6px rgba(37, 99, 235, 0.35);\n }\n .bt-btn-save:hover {\n background: #1d4ed8;\n box-shadow: 0 4px 10px rgba(37, 99, 235, 0.45);\n }\n\n .bt-btn-next-step {\n background: linear-gradient(135deg, #6366f1, #4f46e5);\n color: #ffffff;\n box-shadow: 0 2px 8px rgba(99, 102, 241, 0.4);\n }\n .bt-btn-next-step:hover {\n background: linear-gradient(135deg, #4f46e5, #4338ca);\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.55);\n }\n\n .bt-btn-finish-flow {\n background: linear-gradient(135deg, #10b981, #059669);\n color: #ffffff;\n box-shadow: 0 2px 8px rgba(16, 185, 129, 0.35);\n }\n .bt-btn-finish-flow:hover {\n background: linear-gradient(135deg, #059669, #047857);\n }\n\n .bt-btn-resolve {\n background: rgba(16, 185, 129, 0.15);\n color: #6ee7b7;\n border: 1px solid rgba(16, 185, 129, 0.35);\n }\n .bt-btn-resolve:hover {\n background: rgba(16, 185, 129, 0.3);\n color: #ffffff;\n }\n\n .bt-btn-delete {\n background: rgba(239, 68, 68, 0.15);\n color: #fca5a5;\n border: 1px solid rgba(239, 68, 68, 0.35);\n }\n .bt-btn-delete:hover {\n background: rgba(239, 68, 68, 0.3);\n color: #ffffff;\n }\n\n /* 6. Toast Notifications */\n .bt-toast-container {\n position: fixed;\n bottom: 74px;\n right: 24px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n pointer-events: none;\n z-index: 2147483647;\n align-items: flex-end;\n }\n\n .bt-toast {\n background: #0f172a;\n color: #f8fafc;\n border: 1px solid #334155;\n border-radius: 30px;\n padding: 8px 16px;\n font-size: 12.5px;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n box-shadow: 0 10px 25px -3px rgba(0, 0, 0, 0.6), 0 4px 6px -4px rgba(0, 0, 0, 0.4);\n pointer-events: auto;\n animation: bt-toast-in 0.2s cubic-bezier(0.16, 1, 0.3, 1);\n transition: opacity 0.25s ease, transform 0.25s ease;\n user-select: none;\n }\n\n .bt-toast-fadeout {\n opacity: 0;\n transform: translateY(6px);\n }\n\n @keyframes bt-toast-in {\n from { opacity: 0; transform: translateY(8px) scale(0.95); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n }\n `;\n\n this.shadowRoot.appendChild(style);\n\n // Element Highlight Overlay\n this.highlightOverlay = document.createElement('div');\n this.highlightOverlay.className = 'bt-highlight';\n this.highlightOverlay.style.display = 'none';\n this.shadowRoot.appendChild(this.highlightOverlay);\n\n // Markers container layer\n this.markersContainer = document.createElement('div');\n this.markersContainer.className = 'bt-markers-layer';\n this.shadowRoot.appendChild(this.markersContainer);\n\n // Toast container layer\n this.toastContainer = document.createElement('div');\n this.toastContainer.className = 'bt-toast-container';\n this.shadowRoot.appendChild(this.toastContainer);\n\n // Floating Toolbar\n if (this.options.showToolbar && !this.isHidden) {\n this.createToolbar();\n }\n }\n\n if (this.container && !this.container.isConnected) {\n const mountParent = document.body || document.documentElement;\n if (mountParent) {\n mountParent.appendChild(this.container);\n }\n }\n\n return this.shadowRoot;\n }\n\n private createToolbar(): void {\n if (!this.shadowRoot || this.toolbarElement) return;\n\n this.toolbarElement = document.createElement('div');\n this.toolbarElement.className = 'bt-toolbar';\n this.toolbarElement.innerHTML = `\n <button class=\"bt-toolbar-btn\" id=\"bt-mode-element\" title=\"Inspect element (or hold Alt+Click)\">\n <span>🎯</span> Element\n </button>\n <button class=\"bt-toolbar-btn\" id=\"bt-mode-region\" title=\"Drag to select screen region\">\n <span>📐</span> Region\n </button>\n <button class=\"bt-toolbar-btn\" id=\"bt-mode-page\" title=\"Leave full-page note\">\n <span>📄</span> Page\n </button>\n <div class=\"bt-toolbar-divider\"></div>\n <button class=\"bt-toolbar-btn\" id=\"bt-mode-flow\" title=\"Record multi-step reproduction flow\">\n <span>🎬</span> Flow\n </button>\n <div class=\"bt-toolbar-divider\"></div>\n <button class=\"bt-toolbar-btn active\" id=\"bt-toggle-notes\" title=\"Toggle visible note markers on screen\">\n <span>📌</span> Notes <span class=\"bt-count-pill\" id=\"bt-notes-count\">0</span>\n </button>\n `;\n\n const btnElement = this.toolbarElement.querySelector('#bt-mode-element') as HTMLButtonElement;\n const btnRegion = this.toolbarElement.querySelector('#bt-mode-region') as HTMLButtonElement;\n const btnPage = this.toolbarElement.querySelector('#bt-mode-page') as HTMLButtonElement;\n const btnFlow = this.toolbarElement.querySelector('#bt-mode-flow') as HTMLButtonElement;\n const btnToggleNotes = this.toolbarElement.querySelector('#bt-toggle-notes') as HTMLButtonElement;\n\n btnElement.onclick = (e: MouseEvent) => {\n e.stopPropagation();\n this.setMode(this.activeMode === 'element' ? 'idle' : 'element');\n };\n\n btnRegion.onclick = (e: MouseEvent) => {\n e.stopPropagation();\n this.setMode(this.activeMode === 'region' ? 'idle' : 'region');\n };\n\n btnPage.onclick = (e: MouseEvent) => {\n e.stopPropagation();\n this.setMode('page');\n };\n\n btnFlow.onclick = (e: MouseEvent) => {\n e.stopPropagation();\n if (this.activeScenario) {\n this.finishScenario();\n } else {\n this.startScenario();\n }\n };\n\n btnToggleNotes.onclick = (e: MouseEvent) => {\n e.stopPropagation();\n this.showMarkers = !this.showMarkers;\n btnToggleNotes.classList.toggle('active', this.showMarkers);\n this.renderMarkers();\n };\n\n this.shadowRoot.appendChild(this.toolbarElement);\n }\n\n private updateToolbarState(): void {\n if (!this.toolbarElement) return;\n\n const btnElement = this.toolbarElement.querySelector('#bt-mode-element');\n const btnRegion = this.toolbarElement.querySelector('#bt-mode-region');\n const btnPage = this.toolbarElement.querySelector('#bt-mode-page');\n const btnFlow = this.toolbarElement.querySelector('#bt-mode-flow');\n\n btnElement?.classList.toggle('active', this.activeMode === 'element');\n btnRegion?.classList.toggle('active', this.activeMode === 'region');\n btnPage?.classList.toggle('active', this.activeMode === 'page');\n\n if (btnFlow) {\n if (this.activeScenario) {\n btnFlow.className = 'bt-toolbar-btn active-scenario';\n btnFlow.innerHTML = `<span>🎬</span> Step ${this.activeScenario.stepNumber} (Finish)`;\n btnFlow.setAttribute('title', `Click to finish recording \"${this.activeScenario.title}\"`);\n } else {\n btnFlow.className = 'bt-toolbar-btn';\n btnFlow.innerHTML = `<span>🎬</span> Flow`;\n btnFlow.setAttribute('title', 'Record multi-step reproduction flow');\n }\n }\n }\n\n private updateToolbarCount(): void {\n if (!this.toolbarElement) return;\n const countEl = this.toolbarElement.querySelector('#bt-notes-count');\n if (countEl) {\n const openCount = this.savedNotes.filter((n) => n.status === 'OPEN').length;\n countEl.textContent = String(openCount);\n }\n }\n\n public renderMarkers(): void {\n const root = this.ensureContainer();\n if (!root || !this.markersContainer) return;\n\n this.markersContainer.innerHTML = '';\n if (!this.showMarkers || this.isHidden) return;\n\n const currentPath = window.location.pathname;\n // Filter open notes on this route or global\n const activeNotes = this.savedNotes.filter((n) => {\n if (n.status !== 'OPEN') return false;\n if (!n.route) return true;\n if (n.route === currentPath) return true;\n // Support hash or query routes (e.g. /#modal or /?tab=settings)\n if (n.route.includes('#') || n.route.includes('?')) {\n return window.location.href.includes(n.route);\n }\n return false;\n });\n\n const pageNotes: VisualNote[] = [];\n\n activeNotes.forEach((note, index) => {\n if (note.type === 'page') {\n pageNotes.push(note);\n return;\n }\n\n const isStep = !!note.scenarioId && note.stepNumber != null;\n const stepLabel = isStep ? `🎬 Step ${note.stepNumber}` : `#${index + 1}`;\n const markerClass = `bt-note-marker ${isStep ? 'bt-note-marker-step' : ''}`;\n\n if (note.type === 'region' && note.region) {\n // Region box\n const regBox = document.createElement('div');\n regBox.className = 'bt-region-marker-box';\n regBox.style.left = `${note.region.x}px`;\n regBox.style.top = `${note.region.y}px`;\n regBox.style.width = `${note.region.width}px`;\n regBox.style.height = `${note.region.height}px`;\n this.markersContainer!.appendChild(regBox);\n\n // Pin on top-left of region\n const pin = document.createElement('div');\n pin.className = markerClass;\n pin.style.left = `${Math.max(4, note.region.x - 12)}px`;\n pin.style.top = `${Math.max(4, note.region.y - 12)}px`;\n pin.title = isStep ? `[${note.scenarioTitle || 'Scenario'}] Step ${note.stepNumber}: ${note.message}` : note.message;\n pin.innerHTML = `<span>${isStep ? '🎬' : '📐'}</span> <span>${stepLabel}</span>`;\n pin.onclick = (e) => {\n e.stopPropagation();\n this.openNoteCard(note);\n };\n this.markersContainer!.appendChild(pin);\n return;\n }\n\n // Element note\n let targetEl: HTMLElement | null = null;\n if (note.target?.selector) {\n try {\n targetEl = document.querySelector(note.target.selector) as HTMLElement | null;\n } catch {}\n }\n\n const rect = targetEl ? targetEl.getBoundingClientRect() : note.target?.boundingRect;\n if (rect) {\n const pin = document.createElement('div');\n pin.className = markerClass;\n pin.setAttribute('data-note-id', note.id);\n pin.title = isStep ? `[${note.scenarioTitle || 'Scenario'}] Step ${note.stepNumber}: ${note.message}` : note.message;\n pin.style.left = `${Math.max(4, rect.left - 10)}px`;\n pin.style.top = `${Math.max(4, rect.top - 12)}px`;\n pin.innerHTML = `<span>${isStep ? '🎬' : '📝'}</span> <span>${stepLabel}</span>`;\n\n pin.onclick = (e) => {\n e.stopPropagation();\n this.openNoteCard(note);\n };\n\n if (targetEl) {\n pin.onmouseenter = () => this.updateHighlight(targetEl!);\n pin.onmouseleave = () => this.hideHighlight();\n }\n\n this.markersContainer!.appendChild(pin);\n }\n });\n\n // Page notes docked in top-right\n if (pageNotes.length > 0) {\n const pageDock = document.createElement('div');\n pageDock.className = 'bt-page-notes-dock';\n pageNotes.forEach((pNote) => {\n const pill = document.createElement('div');\n pill.className = 'bt-page-note-pill';\n const label = pNote.scenarioId && pNote.stepNumber ? `Step ${pNote.stepNumber}: ` : '';\n pill.innerHTML = `<span>📄</span> <span>${label}${truncate(pNote.message, 25)}</span>`;\n pill.onclick = (e) => {\n e.stopPropagation();\n this.openNoteCard(pNote);\n };\n pageDock.appendChild(pill);\n });\n this.markersContainer.appendChild(pageDock);\n }\n }\n\n private updateMarkerPositions(): void {\n if (!this.showMarkers || !this.markersContainer) return;\n this.renderMarkers();\n }\n\n public openNoteCard(note: VisualNote): void {\n const root = this.ensureContainer();\n if (!root) return;\n\n if (this.cardOverlay && this.cardOverlay.parentElement) {\n this.cardOverlay.parentElement.removeChild(this.cardOverlay);\n this.cardOverlay = null;\n }\n\n const backdrop = document.createElement('div');\n backdrop.className = 'bt-modal-backdrop';\n this.cardOverlay = backdrop;\n\n const badgeClass = `bt-badge-${note.type.toLowerCase()}`;\n const statusClass = note.status === 'OPEN' ? 'bt-badge-status-open' : 'bt-badge-status-resolved';\n const icon = note.type === 'region' ? '📐' : note.type === 'page' ? '📄' : '🎯';\n const contextText =\n note.type === 'region' && note.region\n ? `Region: ${note.region.width} × ${note.region.height} px · Route: ${note.route}`\n : note.type === 'page'\n ? `Page Note · Route: ${note.route}`\n : `${note.target?.selector || 'Element'} (${note.target?.boundingRect?.width || 0}×${note.target?.boundingRect?.height || 0}px) · ${note.route}`;\n\n const formattedDate = new Date(note.createdAt).toLocaleString();\n\n // Scenario flow steps navigation\n let scenarioStepsHtml = '';\n let scenarioSteps: VisualNote[] = [];\n if (note.scenarioId) {\n scenarioSteps = this.savedNotes\n .filter((n) => n.scenarioId === note.scenarioId)\n .sort((a, b) => (a.stepNumber || 0) - (b.stepNumber || 0));\n\n const currentIndex = scenarioSteps.findIndex((s) => s.id === note.id);\n const prevStep = currentIndex > 0 ? scenarioSteps[currentIndex - 1] : null;\n const nextStep = currentIndex >= 0 && currentIndex < scenarioSteps.length - 1 ? scenarioSteps[currentIndex + 1] : null;\n\n scenarioStepsHtml = `\n <div class=\"bt-scenario-stepper\">\n <button class=\"bt-step-nav-btn\" id=\"btn-prev-step\" ${!prevStep ? 'disabled' : ''}>\n ◀ Step ${prevStep ? prevStep.stepNumber : ''}\n </button>\n <span>🎬 Step ${note.stepNumber || 1} of ${scenarioSteps.length}</span>\n <button class=\"bt-step-nav-btn\" id=\"btn-next-step-card\" ${!nextStep ? 'disabled' : ''}>\n Step ${nextStep ? nextStep.stepNumber : ''} ▶\n </button>\n </div>\n `;\n }\n\n backdrop.innerHTML = `\n <div class=\"bt-modal\">\n <div class=\"bt-modal-header\">\n <div class=\"bt-modal-title\">\n <span>${note.scenarioId ? '🎬 ' + (note.scenarioTitle || 'Scenario Flow') : icon + ' Visual Note Details'}</span>\n <span class=\"bt-mode-badge ${badgeClass}\">${note.type.toUpperCase()}</span>\n ${note.scenarioId && note.stepNumber ? `<span class=\"bt-mode-badge bt-badge-step\">STEP ${note.stepNumber}</span>` : ''}\n <span class=\"bt-mode-badge ${statusClass}\">${note.status}</span>\n </div>\n <button class=\"bt-close-btn\" id=\"btn-card-close\" title=\"Close (Esc)\">✕</button>\n </div>\n\n ${scenarioStepsHtml}\n\n ${\n note.elementContext?.componentSource?.componentName\n ? `<div class=\"bt-component-pill\" title=\"${\n note.elementContext.componentSource.sourceFile\n ? note.elementContext.componentSource.sourceFile +\n (note.elementContext.componentSource.sourceLine ? ':' + note.elementContext.componentSource.sourceLine : '')\n : note.elementContext.componentSource.componentName\n }\">\n <span>🧬</span>\n <span style=\"font-weight: 600; color: #a5b4fc;\">&lt;${note.elementContext.componentSource.componentName}&gt;</span>\n ${\n note.elementContext.componentSource.sourceFile\n ? `<span style=\"color: #64748b; font-size: 11px; margin-left: 4px;\">${note.elementContext.componentSource.sourceFile}${\n note.elementContext.componentSource.sourceLine ? ':' + note.elementContext.componentSource.sourceLine : ''\n }</span>`\n : ''\n }\n ${\n note.elementContext.componentSource.framework\n ? `<span class=\"bt-mode-badge\" style=\"background: rgba(99, 102, 241, 0.15); color: #818cf8; margin-left: auto; font-size: 10px;\">${note.elementContext.componentSource.framework.toUpperCase()}</span>`\n : ''\n }\n </div>`\n : ''\n }\n\n <div class=\"bt-target-pill\" title=\"${contextText}\">\n <span>🏷️</span>\n <span class=\"bt-pill-content\">${contextText}</span>\n </div>\n\n <div class=\"bt-note-message-box\">${note.message}</div>\n\n <div style=\"font-size: 11px; color: #64748b; display: flex; justify-content: space-between; padding: 0 2px;\">\n <span>Created: ${formattedDate}</span>\n <span>ID: <code style=\"font-family: monospace; color: #94a3b8;\">${note.id}</code></span>\n </div>\n\n <div class=\"bt-modal-footer\">\n <div style=\"display: flex; gap: 6px;\">\n <button class=\"bt-btn bt-btn-delete\" id=\"btn-card-delete\" title=\"Delete this note\">\n <span>🗑️</span> Delete\n </button>\n ${\n note.scenarioId\n ? `<button class=\"bt-btn bt-btn-delete\" id=\"btn-card-delete-flow\" title=\"Delete entire scenario flow\">\n <span>🗑️</span> Delete Flow\n </button>`\n : ''\n }\n </div>\n <div class=\"bt-modal-actions\">\n <button class=\"bt-btn bt-btn-cancel\" id=\"btn-card-dismiss\">Close</button>\n <button class=\"bt-btn ${note.status === 'OPEN' ? 'bt-btn-resolve' : 'bt-btn-save'}\" id=\"btn-card-resolve\">\n ${note.status === 'OPEN' ? '<span>✅</span> Resolve Note' : '<span>↺</span> Reopen'}\n </button>\n </div>\n </div>\n </div>\n `;\n\n const btnClose = backdrop.querySelector('#btn-card-close') as HTMLButtonElement;\n const btnDismiss = backdrop.querySelector('#btn-card-dismiss') as HTMLButtonElement;\n const btnResolve = backdrop.querySelector('#btn-card-resolve') as HTMLButtonElement;\n const btnDelete = backdrop.querySelector('#btn-card-delete') as HTMLButtonElement;\n const btnDeleteFlow = backdrop.querySelector('#btn-card-delete-flow') as HTMLButtonElement | null;\n const btnPrevStep = backdrop.querySelector('#btn-prev-step') as HTMLButtonElement | null;\n const btnNextStepCard = backdrop.querySelector('#btn-next-step-card') as HTMLButtonElement | null;\n\n const closeCard = () => {\n if (this.cardOverlay) {\n root.removeChild(this.cardOverlay);\n this.cardOverlay = null;\n this.hideHighlight();\n }\n };\n\n btnClose.onclick = closeCard;\n btnDismiss.onclick = closeCard;\n backdrop.onclick = (e) => {\n if (e.target === backdrop) closeCard();\n };\n\n if (btnPrevStep && scenarioSteps.length > 0) {\n const currentIndex = scenarioSteps.findIndex((s) => s.id === note.id);\n if (currentIndex > 0) {\n btnPrevStep.onclick = () => {\n this.openNoteCard(scenarioSteps[currentIndex - 1]);\n };\n }\n }\n\n if (btnNextStepCard && scenarioSteps.length > 0) {\n const currentIndex = scenarioSteps.findIndex((s) => s.id === note.id);\n if (currentIndex >= 0 && currentIndex < scenarioSteps.length - 1) {\n btnNextStepCard.onclick = () => {\n this.openNoteCard(scenarioSteps[currentIndex + 1]);\n };\n }\n }\n\n btnResolve.onclick = () => {\n if (note.status === 'OPEN') {\n this.transport.send({ type: 'resolve_note', noteId: note.id });\n this.showToast('Note marked as resolved', '✅');\n } else {\n this.transport.send({ type: 'reopen_note', noteId: note.id });\n this.showToast('Note reopened', '↺');\n }\n closeCard();\n };\n\n btnDelete.onclick = () => {\n this.transport.send({ type: 'delete_note', noteId: note.id });\n this.showToast('Note deleted', '🗑️');\n closeCard();\n };\n\n if (btnDeleteFlow && note.scenarioId) {\n btnDeleteFlow.onclick = () => {\n this.transport.send({ type: 'delete_scenario', scenarioId: note.scenarioId });\n this.showToast('Scenario flow deleted', '🗑️');\n closeCard();\n };\n }\n\n root.appendChild(backdrop);\n }\n\n private setupListeners(): void {\n // 1. Mouse move: hover highlight in element mode or with Alt key\n const onMouseMove = (e: MouseEvent) => {\n try {\n if (this.isHidden || this.modalOverlay || this.cardOverlay || this.isDraggingRegion || this.activeMode === 'region') return;\n\n // Don't highlight elements if mouse is over our own inspector UI\n const path = e.composedPath ? e.composedPath() : [];\n if (this.container && path.includes(this.container)) {\n this.hideHighlight();\n return;\n }\n\n if (e.altKey || this.activeMode === 'element') {\n const target = document.elementFromPoint(e.clientX, e.clientY) as HTMLElement | null;\n if (target && target !== this.container && !this.container?.contains(target)) {\n this.hoveredElement = target;\n this.updateHighlight(target);\n return;\n }\n }\n\n if (!e.altKey && this.activeMode !== 'element') {\n this.hideHighlight();\n }\n } catch {\n // Defensive: never let inspector hover crash host app\n }\n };\n\n // 2. Click: Alt+Click or Element mode click selects element and opens editor\n const onClick = (e: MouseEvent) => {\n try {\n if (this.isHidden || this.modalOverlay || this.cardOverlay) return;\n\n // If clicking inside inspector toolbar or container, do NOT intercept\n const path = e.composedPath ? e.composedPath() : [];\n if (this.container && path.includes(this.container)) {\n return;\n }\n\n if (this.activeMode === 'region') return;\n\n if (e.altKey || this.activeMode === 'element') {\n e.preventDefault();\n e.stopPropagation();\n\n const target = (this.hoveredElement || document.elementFromPoint(e.clientX, e.clientY)) as HTMLElement | null;\n if (target && target !== this.container && !this.container?.contains(target)) {\n this.selectedElement = target;\n this.openNoteEditor(target, 'element');\n if (this.activeMode === 'element' && !this.activeScenario) {\n this.setMode('idle');\n }\n }\n }\n } catch {\n // Defensive\n }\n };\n\n // 3. Key handling: Escape cancels active modes, Alt release hides highlight\n const onKeyDown = (e: KeyboardEvent) => {\n try {\n if (e.key === 'Escape') {\n if (this.cardOverlay && this.cardOverlay.parentElement && this.shadowRoot) {\n this.shadowRoot.removeChild(this.cardOverlay);\n this.cardOverlay = null;\n } else if (this.activeMode === 'region' || this.activeMode === 'element') {\n if (!this.activeScenario) {\n this.setMode('idle');\n }\n }\n }\n } catch {\n // Defensive\n }\n };\n\n const onKeyUp = (e: KeyboardEvent) => {\n try {\n if (e.key === 'Alt' && !this.modalOverlay && !this.cardOverlay && this.activeMode !== 'element') {\n this.hideHighlight();\n }\n } catch {\n // Defensive\n }\n };\n\n // 4. Scroll & resize: reposition markers accurately\n const onScrollOrResize = () => {\n try {\n requestAnimationFrame(() => {\n try {\n this.updateMarkerPositions();\n } catch {}\n });\n } catch {\n // Defensive\n }\n };\n\n window.addEventListener('mousemove', onMouseMove, { capture: true, passive: true });\n window.addEventListener('click', onClick, { capture: true });\n window.addEventListener('keydown', onKeyDown, { capture: true });\n window.addEventListener('keyup', onKeyUp, { capture: true });\n window.addEventListener('scroll', onScrollOrResize, { capture: true, passive: true });\n window.addEventListener('resize', onScrollOrResize, { passive: true });\n\n this.cleanups.push(() => {\n window.removeEventListener('mousemove', onMouseMove, { capture: true });\n window.removeEventListener('click', onClick, { capture: true });\n window.removeEventListener('keydown', onKeyDown, { capture: true });\n window.removeEventListener('keyup', onKeyUp, { capture: true });\n window.removeEventListener('scroll', onScrollOrResize, { capture: true });\n window.removeEventListener('resize', onScrollOrResize);\n });\n }\n\n private showRegionOverlay(): void {\n const root = this.ensureContainer();\n if (!root) return;\n\n if (!this.regionOverlay) {\n this.regionOverlay = document.createElement('div');\n this.regionOverlay.className = 'bt-region-overlay';\n\n this.regionBox = document.createElement('div');\n this.regionBox.className = 'bt-region-box';\n this.regionBox.style.display = 'none';\n this.regionOverlay.appendChild(this.regionBox);\n\n // Top helper & cancel banner\n this.regionBanner = document.createElement('div');\n this.regionBanner.className = 'bt-region-banner';\n this.regionBanner.innerHTML = `\n <span>📐 Drag rectangle on screen to select region</span>\n <button class=\"bt-region-cancel-btn\" id=\"bt-region-cancel\">✕ Cancel (Esc)</button>\n `;\n\n const btnCancel = this.regionBanner.querySelector('#bt-region-cancel') as HTMLButtonElement;\n btnCancel.onclick = (e: MouseEvent) => {\n e.stopPropagation();\n this.setMode('idle');\n };\n\n this.regionOverlay.appendChild(this.regionBanner);\n\n // Right-click cancels region mode\n this.regionOverlay.oncontextmenu = (e: MouseEvent) => {\n e.preventDefault();\n this.setMode('idle');\n };\n\n // Drag events\n this.regionOverlay.onmousedown = (e: MouseEvent) => {\n const path = e.composedPath ? e.composedPath() : [];\n if (this.regionBanner && path.includes(this.regionBanner)) return;\n if (this.toolbarElement && path.includes(this.toolbarElement)) return;\n\n this.isDraggingRegion = true;\n this.dragStartX = e.clientX;\n this.dragStartY = e.clientY;\n if (this.regionBox) {\n this.regionBox.style.display = 'block';\n this.regionBox.style.left = `${e.clientX}px`;\n this.regionBox.style.top = `${e.clientY}px`;\n this.regionBox.style.width = '0px';\n this.regionBox.style.height = '0px';\n }\n };\n\n this.regionOverlay.onmousemove = (e: MouseEvent) => {\n if (!this.isDraggingRegion || !this.regionBox) return;\n\n const currentX = e.clientX;\n const currentY = e.clientY;\n\n const left = Math.min(this.dragStartX, currentX);\n const top = Math.min(this.dragStartY, currentY);\n const width = Math.abs(currentX - this.dragStartX);\n const height = Math.abs(currentY - this.dragStartY);\n\n this.regionBox.style.left = `${left}px`;\n this.regionBox.style.top = `${top}px`;\n this.regionBox.style.width = `${width}px`;\n this.regionBox.style.height = `${height}px`;\n\n let badge = this.regionBox.querySelector('.bt-region-badge') as HTMLDivElement | null;\n if (!badge) {\n badge = document.createElement('div');\n badge.className = 'bt-region-badge';\n this.regionBox.appendChild(badge);\n }\n badge.textContent = `Region: ${Math.round(width)} × ${Math.round(height)} px`;\n };\n\n this.regionOverlay.onmouseup = (e: MouseEvent) => {\n if (!this.isDraggingRegion) return;\n this.isDraggingRegion = false;\n\n const currentX = e.clientX;\n const currentY = e.clientY;\n const left = Math.min(this.dragStartX, currentX);\n const top = Math.min(this.dragStartY, currentY);\n const width = Math.abs(currentX - this.dragStartX);\n const height = Math.abs(currentY - this.dragStartY);\n\n if (width > 15 && height > 15) {\n this.selectedRegion = {\n x: Math.round(left),\n y: Math.round(top),\n width: Math.round(width),\n height: Math.round(height),\n };\n this.openRegionNoteEditor(this.selectedRegion);\n }\n\n if (this.regionBox) {\n this.regionBox.style.display = 'none';\n }\n if (!this.activeScenario) {\n this.setMode('idle');\n }\n };\n\n root.appendChild(this.regionOverlay);\n } else {\n this.regionOverlay.style.display = 'block';\n }\n }\n\n private hideRegionOverlay(): void {\n if (this.regionOverlay) {\n this.regionOverlay.style.display = 'none';\n this.isDraggingRegion = false;\n if (this.regionBox) {\n this.regionBox.style.display = 'none';\n }\n }\n }\n\n private updateHighlight(el: HTMLElement): void {\n const root = this.ensureContainer();\n if (!root || !this.highlightOverlay) return;\n\n const rect = el.getBoundingClientRect();\n this.highlightOverlay.style.display = 'block';\n this.highlightOverlay.style.left = `${rect.left}px`;\n this.highlightOverlay.style.top = `${rect.top}px`;\n this.highlightOverlay.style.width = `${rect.width}px`;\n this.highlightOverlay.style.height = `${rect.height}px`;\n\n let badge = this.highlightOverlay.querySelector('.bt-badge') as HTMLDivElement | null;\n if (!badge) {\n badge = document.createElement('div');\n badge.className = 'bt-badge';\n this.highlightOverlay.appendChild(badge);\n }\n\n const selector = getSemanticSelector(el);\n const label = this.activeScenario ? `🎬 Step ${this.activeScenario.stepNumber} · ${selector}` : selector;\n badge.textContent = `${label} (${Math.round(rect.width)} × ${Math.round(rect.height)} px)`;\n }\n\n private hideHighlight(): void {\n if (this.highlightOverlay) {\n this.highlightOverlay.style.display = 'none';\n }\n }\n\n public openNoteEditor(el?: HTMLElement, noteType: 'element' | 'page' = 'element'): void {\n const root = this.ensureContainer();\n if (!root) return;\n\n const targetEl = el || document.body;\n this.selectedElement = targetEl;\n if (noteType === 'element') {\n this.updateHighlight(targetEl);\n }\n\n const comp = noteType === 'element' ? resolveComponentSource(targetEl) : undefined;\n const compPrefix = comp?.componentName\n ? `🧬 <${comp.componentName}>${comp.sourceFile ? ' (' + comp.sourceFile + (comp.sourceLine ? ':' + comp.sourceLine : '') + ')' : ''} · `\n : '';\n\n this.renderNoteModal({\n title: this.activeScenario\n ? `Step ${this.activeScenario.stepNumber}: ${this.activeScenario.title}`\n : 'Add Visual Note',\n modeBadge: this.activeScenario ? `STEP ${this.activeScenario.stepNumber}` : noteType.toUpperCase(),\n pillText:\n noteType === 'page'\n ? `Page Viewport: ${window.innerWidth} × ${window.innerHeight} px`\n : `${compPrefix}${getSemanticSelector(targetEl)} (${Math.round(targetEl.getBoundingClientRect().width)}×${Math.round(targetEl.getBoundingClientRect().height)}) · Viewport: ${window.innerWidth}×${window.innerHeight}`,\n onSave: async (message, action) => {\n let scenarioParam: { scenarioId?: string; stepNumber?: number; scenarioTitle?: string } | undefined;\n\n if (action === 'next_step' && !this.activeScenario) {\n this.startScenario();\n }\n\n if (this.activeScenario) {\n scenarioParam = {\n scenarioId: this.activeScenario.id,\n stepNumber: this.activeScenario.stepNumber,\n scenarioTitle: this.activeScenario.title,\n };\n }\n\n await this.saveVisualNote(targetEl, message, noteType, scenarioParam);\n\n if (action === 'next_step' && this.activeScenario) {\n this.activeScenario.stepNumber++;\n this.updateToolbarState();\n this.setMode('element');\n } else if (action === 'finish_flow' && this.activeScenario) {\n this.finishScenario();\n }\n },\n });\n }\n\n public openRegionNoteEditor(region: RegionContext): void {\n this.renderNoteModal({\n title: this.activeScenario\n ? `Step ${this.activeScenario.stepNumber}: ${this.activeScenario.title}`\n : 'Add Region Note',\n modeBadge: this.activeScenario ? `STEP ${this.activeScenario.stepNumber}` : 'REGION',\n pillText: `Selected Area: x:${region.x}, y:${region.y} (${region.width} × ${region.height} px)`,\n onSave: async (message, action) => {\n let scenarioParam: { scenarioId?: string; stepNumber?: number; scenarioTitle?: string } | undefined;\n\n if (action === 'next_step' && !this.activeScenario) {\n this.startScenario();\n }\n\n if (this.activeScenario) {\n scenarioParam = {\n scenarioId: this.activeScenario.id,\n stepNumber: this.activeScenario.stepNumber,\n scenarioTitle: this.activeScenario.title,\n };\n }\n\n await this.saveRegionVisualNote(region, message, scenarioParam);\n\n if (action === 'next_step' && this.activeScenario) {\n this.activeScenario.stepNumber++;\n this.updateToolbarState();\n this.setMode('element');\n } else if (action === 'finish_flow' && this.activeScenario) {\n this.finishScenario();\n }\n },\n });\n }\n\n private renderNoteModal(options: {\n title: string;\n modeBadge: string;\n pillText: string;\n onSave: (message: string, action: 'save' | 'next_step' | 'finish_flow') => Promise<void>;\n }): void {\n const root = this.ensureContainer();\n if (!root) return;\n\n // Remove existing modal if any\n if (this.modalOverlay && this.modalOverlay.parentElement) {\n this.modalOverlay.parentElement.removeChild(this.modalOverlay);\n this.modalOverlay = null;\n }\n\n const backdrop = document.createElement('div');\n backdrop.className = 'bt-modal-backdrop';\n this.modalOverlay = backdrop;\n\n const isStep = options.modeBadge.startsWith('STEP');\n const badgeClass = isStep ? 'bt-badge-step' : `bt-badge-${options.modeBadge.toLowerCase()}`;\n const icon = isStep ? '🎬' : options.modeBadge === 'REGION' ? '📐' : options.modeBadge === 'PAGE' ? '📄' : '🎯';\n const isMac = typeof navigator !== 'undefined' && /Mac|iPod|iPhone|iPad/.test(navigator.platform);\n\n backdrop.innerHTML = `\n <div class=\"bt-modal\">\n <div class=\"bt-modal-header\">\n <div class=\"bt-modal-title\">\n <span>${icon} ${options.title}</span>\n <span class=\"bt-mode-badge ${badgeClass}\">${options.modeBadge}</span>\n </div>\n <button class=\"bt-close-btn\" id=\"btn-close\" title=\"Close (Esc)\">✕</button>\n </div>\n <div class=\"bt-target-pill\" title=\"${options.pillText}\">\n <span>${icon}</span>\n <span class=\"bt-pill-content\">${options.pillText}</span>\n </div>\n <textarea class=\"bt-textarea\" placeholder=\"Describe the layout issue, user action, or note for AI agent...\" autofocus></textarea>\n <div class=\"bt-modal-footer\">\n <div class=\"bt-kbd-hint\">\n <kbd>${isMac ? '⌘' : 'Ctrl'}+Enter</kbd> save · <kbd>Esc</kbd> cancel\n </div>\n <div class=\"bt-modal-actions\">\n <button class=\"bt-btn bt-btn-cancel\" id=\"btn-cancel\">Cancel</button>\n <button class=\"bt-btn bt-btn-next-step\" id=\"btn-next-step\" title=\"Save this step and immediately select the next element\">\n <span>➡️</span> ${this.activeScenario ? 'Save & Next Step' : 'Save as Step 1 (Flow)'}\n </button>\n ${\n this.activeScenario\n ? `<button class=\"bt-btn bt-btn-finish-flow\" id=\"btn-finish-flow\" title=\"Save final step and complete scenario\">\n <span>✓</span> Save & Finish Flow\n </button>`\n : `<button class=\"bt-btn bt-btn-save\" id=\"btn-save\">Save Note</button>`\n }\n </div>\n </div>\n </div>\n `;\n\n const textarea = backdrop.querySelector('textarea') as HTMLTextAreaElement;\n const btnClose = backdrop.querySelector('#btn-close') as HTMLButtonElement;\n const btnCancel = backdrop.querySelector('#btn-cancel') as HTMLButtonElement;\n const btnSave = backdrop.querySelector('#btn-save') as HTMLButtonElement | null;\n const btnNextStep = backdrop.querySelector('#btn-next-step') as HTMLButtonElement;\n const btnFinishFlow = backdrop.querySelector('#btn-finish-flow') as HTMLButtonElement | null;\n\n const closeModal = () => {\n if (this.modalOverlay) {\n root.removeChild(this.modalOverlay);\n this.modalOverlay = null;\n this.hideHighlight();\n this.hideRegionOverlay();\n }\n };\n\n btnClose.onclick = closeModal;\n btnCancel.onclick = closeModal;\n\n backdrop.onclick = (e: MouseEvent) => {\n if (e.target === backdrop) {\n closeModal();\n }\n };\n\n const handleAction = async (action: 'save' | 'next_step' | 'finish_flow') => {\n const message = textarea.value.trim();\n if (!message) return;\n\n btnNextStep.disabled = true;\n if (btnSave) btnSave.disabled = true;\n if (btnFinishFlow) btnFinishFlow.disabled = true;\n\n try {\n await options.onSave(message, action);\n } finally {\n closeModal();\n }\n };\n\n if (btnSave) {\n btnSave.onclick = () => handleAction('save');\n }\n btnNextStep.onclick = () => handleAction('next_step');\n if (btnFinishFlow) {\n btnFinishFlow.onclick = () => handleAction('finish_flow');\n }\n\n textarea.onkeydown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleAction(this.activeScenario ? 'next_step' : 'save');\n }\n if (e.key === 'Escape') {\n closeModal();\n }\n };\n\n root.appendChild(backdrop);\n setTimeout(() => textarea?.focus(), 50);\n }\n\n public async saveVisualNote(\n targetEl: HTMLElement,\n message: string,\n noteType: 'element' | 'page' = 'element',\n scenario?: { scenarioId?: string; stepNumber?: number; scenarioTitle?: string }\n ): Promise<void> {\n const rect = targetEl.getBoundingClientRect();\n const selector = noteType === 'page' ? 'body' : getSemanticSelector(targetEl);\n\n // 1. Capture screenshot via screenshotDriver\n let screenshotDataUrl: string | undefined;\n try {\n const snap = await this.screenshotDriver.captureElement(targetEl);\n if (snap.ok) {\n screenshotDataUrl = snap.dataUrl;\n }\n } catch {\n // Defensive\n }\n\n // 2. Extract DOM Context\n const elementContext = this.extractElementContext(targetEl);\n\n // 3. Extract Target\n const target: NoteTarget = {\n selector,\n boundingRect: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n top: Math.round(rect.top),\n left: Math.round(rect.left),\n bottom: Math.round(rect.bottom),\n right: Math.round(rect.right),\n },\n visible: rect.width > 0 && rect.height > 0,\n confidence: selector.startsWith('[data-test') ? 'high' : selector.startsWith('#') ? 'medium' : 'low',\n };\n\n const route = typeof window !== 'undefined' ? window.location.pathname + window.location.search : '/';\n const url = typeof window !== 'undefined' ? window.location.href : 'http://localhost/';\n const viewport = typeof window !== 'undefined'\n ? { width: window.innerWidth, height: window.innerHeight, devicePixelRatio: window.devicePixelRatio || 1 }\n : { width: 1280, height: 800, devicePixelRatio: 1 };\n const scroll = typeof window !== 'undefined'\n ? { scrollX: window.scrollX, scrollY: window.scrollY }\n : { scrollX: 0, scrollY: 0 };\n\n const notePayload = {\n type: 'create_note',\n sessionId: this.transport.getSessionId() || '',\n noteType,\n message,\n route,\n url,\n viewport,\n scroll,\n target,\n elementContext,\n screenshot: screenshotDataUrl,\n scenarioId: scenario?.scenarioId,\n stepNumber: scenario?.stepNumber,\n scenarioTitle: scenario?.scenarioTitle,\n timestamp: Date.now(),\n };\n\n this.transport.send(notePayload);\n if (this.options.onNoteCreated) {\n this.options.onNoteCreated(notePayload as any);\n }\n\n if (scenario?.scenarioId) {\n this.showToast(`Step ${scenario.stepNumber || 1} recorded`, '🎬');\n } else {\n this.showToast('Visual note saved', '✨');\n }\n }\n\n public async saveRegionVisualNote(\n region: RegionContext,\n message: string,\n scenario?: { scenarioId?: string; stepNumber?: number; scenarioTitle?: string }\n ): Promise<void> {\n // 1. Capture full page screenshot and crop to region\n let screenshotDataUrl: string | undefined;\n try {\n const snap = await this.screenshotDriver.captureElement(document.body || document.documentElement);\n if (snap.ok && snap.dataUrl) {\n screenshotDataUrl = await this.cropDataUrl(snap.dataUrl, region);\n }\n } catch {\n // Defensive\n }\n\n const route = typeof window !== 'undefined' ? window.location.pathname + window.location.search : '/';\n const url = typeof window !== 'undefined' ? window.location.href : 'http://localhost/';\n const viewport = typeof window !== 'undefined'\n ? { width: window.innerWidth, height: window.innerHeight, devicePixelRatio: window.devicePixelRatio || 1 }\n : { width: 1280, height: 800, devicePixelRatio: 1 };\n const scroll = typeof window !== 'undefined'\n ? { scrollX: window.scrollX, scrollY: window.scrollY }\n : { scrollX: 0, scrollY: 0 };\n\n const notePayload = {\n type: 'create_note',\n sessionId: this.transport.getSessionId() || '',\n noteType: 'region',\n message,\n route,\n url,\n viewport,\n scroll,\n region,\n screenshot: screenshotDataUrl,\n scenarioId: scenario?.scenarioId,\n stepNumber: scenario?.stepNumber,\n scenarioTitle: scenario?.scenarioTitle,\n timestamp: Date.now(),\n };\n\n this.transport.send(notePayload);\n if (this.options.onNoteCreated) {\n this.options.onNoteCreated(notePayload as any);\n }\n\n if (scenario?.scenarioId) {\n this.showToast(`Step ${scenario.stepNumber || 1} region recorded`, '🎬');\n } else {\n this.showToast('Region note saved', '📐');\n }\n }\n\n private extractElementContext(el: HTMLElement): ElementContext {\n const selector = getSemanticSelector(el);\n const attributes: Record<string, string> = {};\n\n for (let i = 0; i < el.attributes.length; i++) {\n const attr = el.attributes[i];\n if (\n this.options.maskSelectors?.some((mask) => {\n try {\n return el.matches(mask);\n } catch {\n return false;\n }\n }) &&\n (attr.name === 'value' || attr.name === 'data-secret')\n ) {\n attributes[attr.name] = '[REDACTED]';\n } else {\n attributes[attr.name] = attr.value;\n }\n }\n\n let outerHTML = el.outerHTML;\n if (outerHTML && outerHTML.length > 1000) {\n outerHTML = truncate(outerHTML, 1000);\n }\n\n let innerText = el.innerText || el.textContent || '';\n if (innerText && innerText.length > 200) {\n innerText = truncate(innerText, 200);\n }\n\n const componentSource = resolveComponentSource(el);\n\n return {\n selector,\n tag: el.tagName.toLowerCase(),\n attributes,\n outerHTML,\n innerText,\n componentSource,\n parent: el.parentElement\n ? {\n selector: getSemanticSelector(el.parentElement),\n tag: el.parentElement.tagName.toLowerCase(),\n }\n : undefined,\n };\n }\n\n private async cropDataUrl(dataUrl: string, region: RegionContext): Promise<string> {\n return new Promise((resolve) => {\n const img = new Image();\n img.onload = () => {\n const canvas = document.createElement('canvas');\n canvas.width = region.width;\n canvas.height = region.height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n resolve(dataUrl);\n return;\n }\n\n const dpr = window.devicePixelRatio || 1;\n ctx.drawImage(\n img,\n region.x * dpr,\n region.y * dpr,\n region.width * dpr,\n region.height * dpr,\n 0,\n 0,\n region.width,\n region.height\n );\n try {\n resolve(canvas.toDataURL('image/png'));\n } catch {\n resolve(dataUrl);\n }\n };\n img.onerror = () => resolve(dataUrl);\n img.src = dataUrl;\n });\n }\n\n public destroy(): void {\n for (const cleanup of this.cleanups) {\n cleanup();\n }\n this.cleanups = [];\n\n if (this.container && this.container.parentNode) {\n this.container.parentNode.removeChild(this.container);\n this.container = null;\n this.shadowRoot = null;\n }\n }\n}\n","import type {\n Breadcrumb,\n ClientEventMessage,\n ConsoleEvent,\n ElementSummary,\n NavigationEvent,\n NetworkEvent,\n RuntimeErrorEvent,\n} from '../../core/src/index.js';\nimport { BreadcrumbBuffer } from './breadcrumbs.js';\nimport { ClientCommandHandler } from './commands/handler.js';\nimport type { BrowserDiagClientOptions } from './config.js';\nimport { DEFAULT_OPTIONS } from './config.js';\nimport { setupConsoleInterceptors } from './interceptors/console.js';\nimport { setupInteractionInterceptors } from './interceptors/interaction.js';\nimport { setupNavigationInterceptors } from './interceptors/navigation.js';\nimport { setupNetworkInterceptors } from './interceptors/network.js';\nimport { setupRuntimeInterceptors } from './interceptors/runtime.js';\nimport { BrowserScriptScreenshotDriver } from './screenshot/browser-script-driver.js';\nimport type { ScreenshotDriver } from './screenshot/driver.js';\nimport { WebSocketTransport } from './transport/websocket.js';\nimport { NoteInspector } from './notes/inspector.js';\n\nexport class BrowserTrackClient {\n public options: Required<Omit<BrowserDiagClientOptions, 'notes' | 'hideQueryParam'>> & {\n hideQueryParam?: string | string[];\n notes: Required<NonNullable<BrowserDiagClientOptions['notes']>>;\n };\n private breadcrumbs: BreadcrumbBuffer;\n private transport: WebSocketTransport;\n private screenshotDriver: ScreenshotDriver;\n private commandHandler: ClientCommandHandler;\n private inspector?: NoteInspector;\n private lastElement: ElementSummary | undefined;\n private currentRoute = '/';\n private cleanups: (() => void)[] = [];\n private isInitialized = false;\n\n constructor(options: BrowserDiagClientOptions = {}) {\n this.options = {\n ...DEFAULT_OPTIONS,\n ...options,\n notes: {\n ...DEFAULT_OPTIONS.notes,\n ...(options.notes || {}),\n },\n };\n this.breadcrumbs = new BreadcrumbBuffer(this.options.maxBreadcrumbs);\n this.transport = new WebSocketTransport({\n url: this.options.daemonUrl,\n projectId: this.options.projectId,\n debug: this.options.debug,\n });\n this.screenshotDriver = new BrowserScriptScreenshotDriver();\n this.commandHandler = new ClientCommandHandler(this.screenshotDriver);\n this.transport.setCommandHandler(this.commandHandler);\n\n if (this.options.notes.enabled) {\n this.inspector = new NoteInspector(this.transport, this.screenshotDriver, {\n shortcut: this.options.notes.shortcut,\n maskSelectors: this.options.notes.maskSelectors,\n showToolbar: this.options.notes.showToolbar,\n showBadges: this.options.notes.showBadges,\n hidden: this.options.hidden,\n hideQueryParam: this.options.hideQueryParam,\n });\n }\n }\n\n public init(): this {\n if (this.isInitialized || typeof window === 'undefined') return this;\n this.isInitialized = true;\n\n try {\n this.currentRoute = window.location.pathname + window.location.search;\n } catch {\n this.currentRoute = '/';\n }\n\n // 1. Connect WebSocket\n this.transport.connect();\n\n // 2. Setup Runtime error interceptor\n if (this.options.captureErrors) {\n const cleanupRuntime = setupRuntimeInterceptors(async (errEvent) => {\n await this.handleRuntimeError(errEvent);\n });\n this.cleanups.push(cleanupRuntime);\n }\n\n // 3. Setup Console interceptor\n if (this.options.captureConsole) {\n const cleanupConsole = setupConsoleInterceptors(async (consoleEvent) => {\n await this.handleConsole(consoleEvent);\n });\n this.cleanups.push(cleanupConsole);\n }\n\n // 4. Setup Network interceptor\n if (this.options.captureNetwork) {\n const cleanupNetwork = setupNetworkInterceptors((netEvent) => {\n this.handleNetwork(netEvent);\n });\n this.cleanups.push(cleanupNetwork);\n }\n\n // 5. Setup Navigation interceptor\n if (this.options.captureNavigation) {\n const cleanupNav = setupNavigationInterceptors((navEvent) => {\n this.handleNavigation(navEvent);\n });\n this.cleanups.push(cleanupNav);\n }\n\n // 6. Setup Interaction interceptor\n if (this.options.captureInteractions) {\n const cleanupInteraction = setupInteractionInterceptors((breadcrumb, elSummary) => {\n if (elSummary) {\n this.lastElement = elSummary;\n }\n this.breadcrumbs.add(breadcrumb);\n });\n this.cleanups.push(cleanupInteraction);\n }\n\n // 7. Setup Visual Note Inspector\n if (this.inspector) {\n this.inspector.init();\n }\n\n return this;\n }\n\n public openNoteEditor(el?: HTMLElement, noteType: 'element' | 'page' = 'element'): void {\n if (this.inspector) {\n this.inspector.openNoteEditor(el, noteType);\n }\n }\n\n public startRegionSelection(): void {\n if (this.inspector) {\n this.inspector.setMode('region');\n }\n }\n\n public startElementSelection(): void {\n if (this.inspector) {\n this.inspector.setMode('element');\n }\n }\n\n public isUIVisible(): boolean {\n return this.inspector ? this.inspector.isVisible() : false;\n }\n\n public setUIVisible(visible: boolean): void {\n if (this.inspector) {\n this.inspector.setVisible(visible);\n }\n }\n\n public setInspectMode(mode: 'element' | 'region' | 'page' | 'idle'): void {\n if (this.inspector) {\n this.inspector.setMode(mode);\n }\n }\n\n public async createNote(targetEl: HTMLElement, message: string, noteType: 'element' | 'page' = 'element'): Promise<void> {\n if (this.inspector) {\n await this.inspector.saveVisualNote(targetEl, message, noteType);\n }\n }\n\n private async handleRuntimeError(errorEvent: RuntimeErrorEvent): Promise<void> {\n // Add to breadcrumbs\n this.breadcrumbs.add({\n type: 'error',\n category: 'runtime',\n message: `${errorEvent.errorType}: ${errorEvent.message}`,\n timestamp: errorEvent.timestamp,\n level: 'error',\n data: {\n filename: errorEvent.filename,\n lineno: errorEvent.lineno,\n colno: errorEvent.colno,\n },\n });\n\n let screenshotDataUrl: string | undefined;\n if (this.options.onErrorScreenshot && this.lastElement?.selector) {\n try {\n const snap = await this.screenshotDriver.captureSelector(this.lastElement.selector);\n if (snap.ok) {\n screenshotDataUrl = snap.dataUrl;\n }\n } catch {\n // Defensive\n }\n }\n\n this.sendEvent('runtime_error', errorEvent, screenshotDataUrl);\n }\n\n private async handleConsole(consoleEvent: ConsoleEvent): Promise<void> {\n this.breadcrumbs.add({\n type: 'console',\n category: 'console',\n message: `console.${consoleEvent.level}: ${consoleEvent.message}`,\n timestamp: consoleEvent.timestamp,\n level: consoleEvent.level === 'error' ? 'error' : consoleEvent.level === 'warn' ? 'warn' : 'info',\n });\n\n if (consoleEvent.level === 'error' || consoleEvent.level === 'warn') {\n this.sendEvent('console', consoleEvent);\n }\n }\n\n private handleNetwork(netEvent: NetworkEvent): void {\n const isError = (netEvent.status && netEvent.status >= 400) || !!netEvent.error;\n const msg = `${netEvent.method} ${netEvent.url} -> ${netEvent.status || 'ERR'} (${netEvent.durationMs}ms)`;\n\n this.breadcrumbs.add({\n type: netEvent.id?.startsWith('xhr') ? 'xhr' : 'fetch',\n category: 'network',\n message: msg,\n timestamp: netEvent.timestamp,\n level: isError ? 'error' : 'info',\n data: {\n status: netEvent.status,\n durationMs: netEvent.durationMs,\n error: netEvent.error,\n aborted: netEvent.aborted,\n },\n });\n\n this.sendEvent('fetch', netEvent);\n }\n\n private handleNavigation(navEvent: NavigationEvent): void {\n this.currentRoute = navEvent.to;\n this.breadcrumbs.add({\n type: 'navigation',\n category: 'navigation',\n message: `navigate ${navEvent.to} (${navEvent.type})`,\n timestamp: navEvent.timestamp,\n level: 'info',\n data: { from: navEvent.from, to: navEvent.to, type: navEvent.type },\n });\n\n this.sendEvent('navigation', navEvent);\n }\n\n private sendEvent(eventType: any, payload: any, screenshotDataUrl?: string): void {\n if (typeof window === 'undefined') return;\n\n const message: ClientEventMessage & { screenshot?: string } = {\n type: 'event',\n sessionId: this.transport.getSessionId() || '',\n eventType,\n payload,\n breadcrumbs: this.breadcrumbs.getRecent(),\n lastElement: this.lastElement,\n route: this.currentRoute,\n url: window.location.href,\n title: document.title,\n timestamp: Date.now(),\n screenshot: screenshotDataUrl,\n };\n\n this.transport.send(message);\n }\n\n public getBreadcrumbs(): Breadcrumb[] {\n return this.breadcrumbs.getRecent();\n }\n\n public getLastElement(): ElementSummary | undefined {\n return this.lastElement;\n }\n\n public destroy(): void {\n for (const cleanup of this.cleanups) {\n try {\n cleanup();\n } catch {}\n }\n this.cleanups = [];\n this.transport.destroy();\n if (this.inspector) {\n this.inspector.destroy();\n }\n this.breadcrumbs.clear();\n this.isInitialized = false;\n }\n}\n","import { BrowserTrackClient } from './client.js';\nimport type { BrowserDiagClientOptions } from './config.js';\n\nexport * from './client.js';\nexport * from './config.js';\nexport * from './breadcrumbs.js';\nexport * from './screenshot/driver.js';\nexport * from './screenshot/browser-script-driver.js';\nexport * from './notes/inspector.js';\nexport * from './source/resolver.js';\n\nlet defaultClient: BrowserTrackClient | null = null;\n\n/**\n * Initializes the BrowserTrack client.\n */\nexport function init(options: BrowserDiagClientOptions = {}): BrowserTrackClient {\n if (defaultClient) {\n return defaultClient;\n }\n\n defaultClient = new BrowserTrackClient(options);\n defaultClient.init();\n return defaultClient;\n}\n\nexport function getClient(): BrowserTrackClient | null {\n return defaultClient;\n}\n\n// Auto-initialize when injected via <script src=\"...\">\nif (typeof window !== 'undefined') {\n (window as any).__BROWSERTRACK__ = {\n init,\n getClient,\n };\n\n // Auto-start by default in browser if not explicitly disabled\n try {\n const currentScript = document.currentScript;\n const autoInit = currentScript?.getAttribute('data-auto-init') !== 'false';\n const daemonUrl = currentScript?.getAttribute('data-daemon-url') || undefined;\n const projectId = currentScript?.getAttribute('data-project-id') || undefined;\n const hidden = currentScript?.getAttribute('data-hidden') === 'true';\n const hideQueryParam = currentScript?.getAttribute('data-hide-query-param') || undefined;\n\n if (autoInit) {\n init({ daemonUrl, projectId, hidden, hideQueryParam });\n }\n } catch {\n // If auto-start fails, don't crash\n }\n}\n"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","names":["init","durationMs"]}