{"version":3,"sources":["../src/schemas.ts","../src/devices.ts","../src/engine/cdp/connection.ts","../src/engine/cdp/browser.ts","../src/engine/cdp/target.ts","../src/engine/cdp/page.ts","../src/engine/normalize.ts","../src/engine/cdp/accessibility.ts","../src/engine/cdp/dom.ts","../src/engine/cdp/input.ts","../src/engine/cdp/runtime.ts","../src/engine/cdp/css.ts","../src/engine/cdp/snapshot.ts","../src/engine/cdp/emulation.ts","../src/engine/cdp/network.ts","../src/engine/cdp/console.ts","../src/engine/cdp/wait.ts","../src/engine/serialize.ts","../src/engine/observe.ts","../src/engine/extract.ts","../src/engine/cache.ts","../src/engine/modality.ts","../src/engine/shadow-dom.ts","../src/engine/resolve.ts","../src/engine/driver.ts","../src/engine/compat.ts","../src/semantic/landmarks.ts","../src/semantic/page-intent.ts","../src/semantic/state-detector.ts","../src/semantic/output.ts","../src/semantic/index.ts","../src/flows/types.ts","../src/consistency.ts","../src/performance.ts","../src/interactivity.ts","../src/api-timing.ts","../src/memory.ts","../src/extract.ts","../src/layout-collision.ts","../src/design-system/config.ts","../src/design-system/tokens/schema.ts","../src/tokens.ts","../src/design-system/tokens/validator.ts","../src/design-system/tokens/index.ts","../src/design-system/principles/gestalt.ts","../src/design-system/principles/signal-noise.ts","../src/design-system/principles/fitts.ts","../src/design-system/principles/hick.ts","../src/design-system/principles/content-chrome.ts","../src/design-system/principles/cognitive-load.ts","../src/design-system/principles/calm-precision.ts","../src/design-system/index.ts","../src/sensors/visual-patterns.ts","../src/sensors/component-census.ts","../src/sensors/interaction-map.ts","../src/sensors/contrast-report.ts","../src/sensors/navigation.ts","../src/sensors/typography.ts","../src/sensors/breakpoints.ts","../src/sensors/motion.ts","../src/sensors/hierarchy.ts","../src/sensors/interaction-states.ts","../src/sensors/index.ts","../src/sensors/css-extract.ts","../src/rules/wcag-contrast.ts","../src/rules/touch-targets.ts","../src/rules/text-hierarchy.ts","../src/rules/handler-integrity.ts","../src/rules/spacing-grid.ts","../src/rules/index.ts","../src/summarize.ts","../src/rules/presets/minimal.ts","../src/rules/presets/calm-precision.ts","../src/rules/presets/wcag-contrast.ts","../src/rules/presets/touch-targets.ts","../src/rules/engine.ts","../src/scan.ts","../src/native/simulator.ts","../src/native/viewports.ts","../src/native/capture.ts","../src/native/role-map.ts","../src/native/extract.ts","../src/native/rules.ts","../src/native/macos.ts","../src/native/interactivity.ts","../src/native/semantic.ts","../src/native/layout-fill.ts","../src/native/scan.ts","../src/utils/crop.ts","../src/index.ts","../src/capture.ts","../src/types.ts","../src/auth.ts","../src/compare.ts","../src/session.ts","../src/report.ts","../src/flows/login.ts","../src/flows/search.ts","../src/flows/form.ts","../src/flows/index.ts","../src/flows/search-validation.ts","../src/cleanup.ts","../src/crawl.ts","../src/integration.ts","../src/operation-tracker.ts","../src/responsive.ts","../src/context/types.ts","../src/decision-tracker.ts","../src/context/compact.ts","../src/ask.ts","../src/engine/browser-pool.ts","../src/design-system/principles/index.ts","../src/native/index.ts","../src/native/sim-driver.ts","../src/native/idb.ts","../src/native/annotate.ts","../src/native/fix-guide.ts"],"names":["resolve","wsUrl","elements","jaroWinkler","interactive","allElements","driver","mkdir","linearize","luminance","path","join","existsSync","readFile","writeFile","nanoid","unlink","readdir","rules","homedir","init_extract","z","isInteractive","init_tokens","looksInteractive","parseColor","fingerprintKey","walkRules","allRules","isTextBearing","relativeLuminance","contrastRatio","isLargeText","INTERACTIVE_TAGS","INTERACTIVE_ROLES","register","init_calm_precision","init_wcag_contrast","init_touch_targets","determineVerdict","generateSummary","verdictIcon","dirname","execFileAsync","promisify","execFile","copyFile","chmod","init_rules","window","init_interactivity","init_semantic","init_scan","PNG","patterns","placeholder","pixelmatch","combinedTextOrCssQuery","selector","matchCount","access","sessions","URL","page","stat","isMobile","CONTEXT_DIR","ARCHIVE_DIR","scanNative","finding","readFileSync","elementLabel","dedupKey","tmpdir","createApiTracker"],"mappings":"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","file":"index.mjs","sourcesContent":["import { z } from 'zod';\n\n/**\n * Viewport configuration for screenshot capture and CDP device emulation.\n *\n * Supports predefined names or custom dimensions. Optional fields control\n * full device emulation via Emulation.setDeviceMetricsOverride +\n * setUserAgentOverride + setTouchEmulationEnabled. When the preset has\n * `mobile: true` and no `userAgent`, callers (e.g. devices.ts) should\n * supply a mobile UA — leaving Chrome's desktop UA on a mobile viewport\n * is the documented \"renders at desktop\" bug pre-1.1.0.\n */\nexport const ViewportSchema = z.object({\n  name: z.string().min(1).max(50),\n  width: z.number().min(100).max(3840),\n  height: z.number().min(100).max(2160),\n  deviceScaleFactor: z.number().min(0.5).max(5).optional(),\n  mobile: z.boolean().optional(),\n  userAgent: z.string().optional(),\n  hasTouch: z.boolean().optional(),\n});\n\n/**\n * Predefined viewport configurations.\n *\n * `mobile` and `tablet` baselines were realigned in 1.1.0:\n *   - mobile: 375x667 (iPhone SE) -> 390x844 (iPhone 14) with mobile:true\n *   - tablet: 768x1024 (iPad Mini) -> 820x1180 (iPad Air) with mobile:true\n * Pre-1.1.0 these presets were missing the `mobile` flag entirely so Chrome\n * laid the page out as desktop. See VERSIONING.md.\n */\nexport const VIEWPORTS = {\n  desktop: { name: 'desktop', width: 1920, height: 1080, deviceScaleFactor: 1, mobile: false },\n  'desktop-lg': { name: 'desktop-lg', width: 2560, height: 1440, deviceScaleFactor: 1, mobile: false },\n  'desktop-sm': { name: 'desktop-sm', width: 1440, height: 900, deviceScaleFactor: 1, mobile: false },\n  laptop: { name: 'laptop', width: 1366, height: 768, deviceScaleFactor: 1, mobile: false },\n  tablet: { name: 'tablet', width: 820, height: 1180, deviceScaleFactor: 2, mobile: true },\n  'tablet-landscape': { name: 'tablet-landscape', width: 1180, height: 820, deviceScaleFactor: 2, mobile: true },\n  mobile: { name: 'mobile', width: 390, height: 844, deviceScaleFactor: 3, mobile: true },\n  'mobile-lg': { name: 'mobile-lg', width: 430, height: 932, deviceScaleFactor: 3, mobile: true },\n  'iphone-14': { name: 'iphone-14', width: 390, height: 844, deviceScaleFactor: 3, mobile: true },\n  'iphone-14-pro-max': { name: 'iphone-14-pro-max', width: 430, height: 932, deviceScaleFactor: 3, mobile: true },\n  // Native simulator viewports\n  'iphone-16': { name: 'iphone-16', width: 393, height: 852 },\n  'iphone-16-plus': { name: 'iphone-16-plus', width: 430, height: 932 },\n  'iphone-16-pro': { name: 'iphone-16-pro', width: 402, height: 874 },\n  'iphone-16-pro-max': { name: 'iphone-16-pro-max', width: 440, height: 956 },\n  'watch-series-10-42mm': { name: 'watch-series-10-42mm', width: 176, height: 215 },\n  'watch-series-10-46mm': { name: 'watch-series-10-46mm', width: 198, height: 242 },\n  'watch-ultra-2-49mm': { name: 'watch-ultra-2-49mm', width: 205, height: 251 },\n} as const;\n\n/**\n * Main configuration for InterfaceBuiltRight\n */\nexport const ConfigSchema = z.object({\n  baseUrl: z.string().url('Must be a valid URL'),\n  outputDir: z.string().default('./.ibr'),\n  viewport: ViewportSchema.default(VIEWPORTS.desktop),\n  viewports: z.array(ViewportSchema).optional(), // Multi-viewport support\n  threshold: z.number().min(0).max(100).default(1.0),\n  fullPage: z.boolean().default(true),\n  waitForNetworkIdle: z.boolean().default(true),\n  timeout: z.number().min(1000).max(120000).default(30000),\n  browserMode: z.enum(['local', 'connect']).optional(),\n  cdpUrl: z.string().url().optional(),\n  wsEndpoint: z.string().url().optional(),\n  chromePath: z.string().optional(),\n});\n\n/**\n * Session query options\n */\nexport const SessionQuerySchema = z.object({\n  route: z.string().optional(),\n  url: z.string().optional(),\n  status: z.enum(['baseline', 'compared', 'pending']).optional(),\n  name: z.string().optional(),\n  createdAfter: z.date().optional(),\n  createdBefore: z.date().optional(),\n  viewport: z.string().optional(),\n  limit: z.number().min(1).max(100).default(50),\n});\n\n/**\n * Comparison result from pixelmatch\n */\nexport const ComparisonResultSchema = z.object({\n  match: z.boolean(),\n  diffPercent: z.number(),\n  diffPixels: z.number(),\n  totalPixels: z.number(),\n  threshold: z.number(),\n});\n\n/**\n * Changed region detected in comparison\n */\nexport const ChangedRegionSchema = z.object({\n  location: z.enum(['top', 'bottom', 'left', 'right', 'center', 'full']),\n  bounds: z.object({\n    x: z.number(),\n    y: z.number(),\n    width: z.number(),\n    height: z.number(),\n  }),\n  description: z.string(),\n  severity: z.enum(['expected', 'unexpected', 'critical']),\n});\n\n/**\n * Analysis verdict types\n */\nexport const VerdictSchema = z.enum([\n  'MATCH',\n  'EXPECTED_CHANGE',\n  'UNEXPECTED_CHANGE',\n  'LAYOUT_BROKEN',\n]);\n\n/**\n * Analysis result\n */\nexport const AnalysisSchema = z.object({\n  verdict: VerdictSchema,\n  summary: z.string(),\n  changedRegions: z.array(ChangedRegionSchema),\n  unexpectedChanges: z.array(ChangedRegionSchema),\n  recommendation: z.string().nullable(),\n});\n\n/**\n * Session status\n */\nexport const SessionStatusSchema = z.enum(['baseline', 'compared', 'pending']);\n\n/**\n * Element bounds (moved up for LandmarkElementSchema dependency)\n */\nexport const BoundsSchema = z.object({\n  x: z.number(),\n  y: z.number(),\n  width: z.number(),\n  height: z.number(),\n});\n\n/**\n * Landmark element detected on page\n */\nexport const LandmarkElementSchema = z.object({\n  name: z.string(),           // e.g., 'logo', 'header', 'nav'\n  selector: z.string(),       // CSS selector used to find it\n  found: z.boolean(),\n  bounds: BoundsSchema.optional(),\n});\n\n/**\n * Visual session\n */\nexport const SessionSchema = z.object({\n  id: z.string(),\n  name: z.string(),\n  url: z.string().min(1),\n  viewport: ViewportSchema,\n  status: SessionStatusSchema,\n  platform: z.enum(['web', 'ios', 'watchos']).optional(),\n  createdAt: z.string().datetime(),\n  updatedAt: z.string().datetime(),\n  comparison: ComparisonResultSchema.optional(),\n  analysis: AnalysisSchema.optional(),\n  // Landmark elements detected at baseline capture\n  landmarkElements: z.array(LandmarkElementSchema).optional(),\n  // Page intent detected at baseline\n  pageIntent: z.string().optional(),\n});\n\n/**\n * Full comparison report\n */\nexport const ComparisonReportSchema = z.object({\n  sessionId: z.string(),\n  sessionName: z.string(),\n  url: z.string(),\n  timestamp: z.string().datetime(),\n  viewport: ViewportSchema,\n  comparison: ComparisonResultSchema,\n  analysis: AnalysisSchema,\n  files: z.object({\n    baseline: z.string(),\n    current: z.string(),\n    diff: z.string(),\n  }),\n  webViewUrl: z.string().optional(),\n});\n\n/**\n * Element interactivity detection\n */\nexport const InteractiveStateSchema = z.object({\n  hasOnClick: z.boolean(),\n  hasHref: z.boolean(),\n  isDisabled: z.boolean(),\n  tabIndex: z.number(),\n  cursor: z.string(),\n  // Framework-specific detection\n  hasReactHandler: z.boolean().optional(),\n  hasVueHandler: z.boolean().optional(),\n  hasAngularHandler: z.boolean().optional(),\n});\n\n/**\n * Accessibility attributes\n */\nexport const A11yAttributesSchema = z.object({\n  role: z.string().nullable(),\n  ariaLabel: z.string().nullable(),\n  ariaDescribedBy: z.string().nullable(),\n  ariaHidden: z.boolean().optional(),\n  // WAI-ARIA aria-haspopup signals that activating the element opens a\n  // menu/dialog/listbox/tree/grid. Headless component libraries (Radix,\n  // Headless UI, Reach) wire the click via portal/event delegation rather\n  // than a direct `onClick`, which trips the `no-handler` rule's heuristic.\n  // Captured here so rules can opt out of grading these as orphans.\n  ariaHaspopup: z.string().nullable().optional(),\n});\n\n/**\n * Enhanced element with interactivity and accessibility\n */\nexport const EnhancedElementSchema = z.object({\n  // Identity\n  selector: z.string(),\n  tagName: z.string(),\n  id: z.string().optional(),\n  className: z.string().optional(),\n  text: z.string().optional(),\n\n  // Position\n  bounds: BoundsSchema,\n\n  // Styles (subset)\n  computedStyles: z.record(z.string(), z.string()).optional(),\n\n  // Interactivity\n  interactive: InteractiveStateSchema,\n\n  // True when the element is descendant of a <form>. A `<button>` inside a\n  // form defaults to `type=\"submit\"`, so its click is wired by the form's\n  // submit pipeline rather than a direct onClick prop. Rules that check for\n  // orphan handlers should treat in-form buttons as \"wired by form\" unless\n  // their type is explicitly \"button\".\n  inForm: z.boolean().optional(),\n  buttonType: z.string().nullable().optional(),\n\n  // Accessibility\n  a11y: A11yAttributesSchema,\n\n  // Source hints for debugging\n  sourceHint: z.object({\n    dataTestId: z.string().nullable(),\n  }).optional(),\n});\n\n/**\n * Element issue detected during audit\n */\nexport const ElementIssueSchema = z.object({\n  type: z.enum([\n    'NO_HANDLER',           // Interactive-looking but no handler\n    'PLACEHOLDER_LINK',     // href=\"#\" without handler\n    'TOUCH_TARGET_SMALL',   // < 44px on mobile\n    'MISSING_ARIA_LABEL',   // Interactive without label\n    'DISABLED_NO_VISUAL',   // Disabled but no visual indication\n  ]),\n  severity: z.enum(['error', 'warning', 'info']),\n  message: z.string(),\n});\n\n/**\n * Audit result for a captured page\n */\nexport const AuditResultSchema = z.object({\n  totalElements: z.number(),\n  interactiveCount: z.number(),\n  withHandlers: z.number(),\n  withoutHandlers: z.number(),\n  issues: z.array(ElementIssueSchema),\n});\n\n// Type exports - auto-generated from schemas\nexport type Viewport = z.infer<typeof ViewportSchema>;\nexport type Config = z.infer<typeof ConfigSchema>;\nexport type SessionQuery = z.infer<typeof SessionQuerySchema>;\nexport type ComparisonResult = z.infer<typeof ComparisonResultSchema>;\nexport type ChangedRegion = z.infer<typeof ChangedRegionSchema>;\nexport type Verdict = z.infer<typeof VerdictSchema>;\nexport type Analysis = z.infer<typeof AnalysisSchema>;\nexport type SessionStatus = z.infer<typeof SessionStatusSchema>;\nexport type LandmarkElement = z.infer<typeof LandmarkElementSchema>;\nexport type Session = z.infer<typeof SessionSchema>;\nexport type ComparisonReport = z.infer<typeof ComparisonReportSchema>;\nexport type InteractiveState = z.infer<typeof InteractiveStateSchema>;\nexport type A11yAttributes = z.infer<typeof A11yAttributesSchema>;\nexport type Bounds = z.infer<typeof BoundsSchema>;\nexport type EnhancedElement = z.infer<typeof EnhancedElementSchema>;\nexport type ElementIssue = z.infer<typeof ElementIssueSchema>;\nexport type AuditResult = z.infer<typeof AuditResultSchema>;\n\n/**\n * Rule severity levels\n */\nexport const RuleSeveritySchema = z.enum(['off', 'warn', 'error']);\n\n/**\n * Individual rule setting\n */\nexport const RuleSettingSchema = z.union([\n  RuleSeveritySchema,\n  z.tuple([RuleSeveritySchema, z.record(z.string(), z.unknown())]),\n]);\n\n/**\n * Rules configuration (user's .ibr/rules.json)\n */\nexport const RulesConfigSchema = z.object({\n  extends: z.array(z.string()).optional(),\n  rules: z.record(z.string(), RuleSettingSchema).optional(),\n});\n\n/**\n * Violation detected by a rule\n */\nexport const ViolationSchema = z.object({\n  ruleId: z.string(),\n  ruleName: z.string(),\n  severity: z.enum(['warn', 'error']),\n  message: z.string(),\n  element: z.string().optional(),  // Selector of violating element\n  bounds: BoundsSchema.optional(),\n  fix: z.string().optional(),       // Suggested fix\n});\n\n/**\n * Full audit report with rule violations\n */\nexport const RuleAuditResultSchema = z.object({\n  url: z.string(),\n  timestamp: z.string(),\n  elementsScanned: z.number(),\n  violations: z.array(ViolationSchema),\n  summary: z.object({\n    errors: z.number(),\n    warnings: z.number(),\n    passed: z.number(),\n  }),\n});\n\n// Rule-related type exports\nexport type RuleSeverity = z.infer<typeof RuleSeveritySchema>;\nexport type RuleSetting = z.infer<typeof RuleSettingSchema>;\nexport type RulesConfig = z.infer<typeof RulesConfigSchema>;\nexport type Violation = z.infer<typeof ViolationSchema>;\nexport type RuleAuditResult = z.infer<typeof RuleAuditResultSchema>;\n\n// ============================================================================\n// MEMORY SYSTEM SCHEMAS\n// ============================================================================\n\n/**\n * Source of a UI/UX preference\n */\nexport const MemorySourceSchema = z.enum(['user', 'learned', 'framework']);\n\n/**\n * Preference categories\n */\nexport const PreferenceCategorySchema = z.enum([\n  'color',\n  'layout',\n  'typography',\n  'navigation',\n  'component',\n  'spacing',\n  'interaction',\n  'content',\n]);\n\n/**\n * Expectation operator for comparing values\n */\nexport const ExpectationOperatorSchema = z.enum(['equals', 'contains', 'matches', 'gte', 'lte']);\n\n/**\n * A single UI/UX expectation\n */\nexport const ExpectationSchema = z.object({\n  property: z.string(),\n  operator: ExpectationOperatorSchema,\n  value: z.string(),\n});\n\n/**\n * Full preference with history\n */\nexport const PreferenceSchema = z.object({\n  id: z.string(),\n  description: z.string(),\n  category: PreferenceCategorySchema,\n  source: MemorySourceSchema,\n  route: z.string().optional(),\n  componentType: z.string().optional(),\n  expectation: ExpectationSchema,\n  confidence: z.number().min(0).max(1).default(1.0),\n  createdAt: z.string().datetime(),\n  updatedAt: z.string().datetime(),\n  sessionIds: z.array(z.string()).optional(),\n});\n\n/**\n * Observation extracted from a session\n */\nexport const ObservationSchema = z.object({\n  description: z.string(),\n  category: PreferenceCategorySchema,\n  property: z.string(),\n  value: z.string(),\n});\n\n/**\n * Learned expectation from an approved session\n */\nexport const LearnedExpectationSchema = z.object({\n  id: z.string(),\n  sessionId: z.string(),\n  route: z.string(),\n  observations: z.array(ObservationSchema),\n  approved: z.boolean(),\n  createdAt: z.string().datetime(),\n});\n\n/**\n * Compact preference pointer for summary\n */\nexport const ActivePreferenceSchema = z.object({\n  id: z.string(),\n  description: z.string(),\n  category: PreferenceCategorySchema,\n  route: z.string().optional(),\n  componentType: z.string().optional(),\n  property: z.string(),\n  operator: ExpectationOperatorSchema,\n  value: z.string(),\n  confidence: z.number(),\n});\n\n/**\n * Memory summary - always-loaded compact file\n */\nexport const MemorySummarySchema = z.object({\n  version: z.literal(1),\n  updatedAt: z.string().datetime(),\n  stats: z.object({\n    totalPreferences: z.number(),\n    totalLearned: z.number(),\n    byCategory: z.record(z.string(), z.number()),\n    bySource: z.record(z.string(), z.number()),\n  }),\n  activePreferences: z.array(ActivePreferenceSchema),\n});\n\n// Memory type exports\nexport type MemorySource = z.infer<typeof MemorySourceSchema>;\nexport type PreferenceCategory = z.infer<typeof PreferenceCategorySchema>;\nexport type ExpectationOperator = z.infer<typeof ExpectationOperatorSchema>;\nexport type Expectation = z.infer<typeof ExpectationSchema>;\nexport type Preference = z.infer<typeof PreferenceSchema>;\nexport type Observation = z.infer<typeof ObservationSchema>;\nexport type LearnedExpectation = z.infer<typeof LearnedExpectationSchema>;\nexport type ActivePreference = z.infer<typeof ActivePreferenceSchema>;\nexport type MemorySummary = z.infer<typeof MemorySummarySchema>;\n\n// ============================================================================\n// DESIGN SYSTEM SCHEMAS\n// ============================================================================\n\n/**\n * Design system principle violation\n */\nexport const DesignSystemViolationSchema = z.object({\n  principleId: z.string(),\n  principleName: z.string(),\n  severity: z.enum(['error', 'warn']),\n  message: z.string(),\n  element: z.string().optional(),\n  bounds: BoundsSchema.optional(),\n  fix: z.string().optional(),\n});\n\n/**\n * Design system check result (added to ScanResult)\n */\nexport const DesignSystemResultSchema = z.object({\n  configName: z.string(),\n  principleViolations: z.array(DesignSystemViolationSchema),\n  tokenViolations: z.array(z.object({\n    element: z.string(),\n    property: z.string(),\n    expected: z.union([z.string(), z.number()]),\n    actual: z.union([z.string(), z.number()]),\n    severity: z.enum(['error', 'warning']),\n    message: z.string(),\n  })),\n  customViolations: z.array(DesignSystemViolationSchema),\n  complianceScore: z.number().min(0).max(100),\n});\n\n// Design system type exports\nexport type DesignSystemViolation = z.infer<typeof DesignSystemViolationSchema>;\nexport type DesignSystemResult = z.infer<typeof DesignSystemResultSchema>;\n","/**\n * Canonical device profiles for CDP-direct emulation.\n *\n * IBR has no Playwright dependency, so we keep our own profile table\n * (viewport + DPR + mobile flag + UA + touch). Profiles are applied via\n * Emulation.setDeviceMetricsOverride + setUserAgentOverride +\n * setTouchEmulationEnabled BEFORE Page.navigate.\n *\n * Adding a device: pick a representative real product, copy width/height\n * from its CSS-pixel viewport, DPR from its screen, and UA from a current\n * release of the default browser. Keep the table small — exhaustiveness\n * is not the goal; covering the common breakpoints is.\n */\n\nimport type { ViewportConfig } from './engine/cdp/emulation.js'\nimport type { Viewport } from './schemas.js'\n\n/**\n * Canonical mobile Safari UA (iOS 17). Used when a profile does not\n * specify its own UA.\n */\nexport const MOBILE_SAFARI_UA =\n  'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1'\n\n/**\n * Canonical iPad Safari UA (iOS 17).\n */\nexport const TABLET_SAFARI_UA =\n  'Mozilla/5.0 (iPad; CPU OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1'\n\n/**\n * Canonical Android Chrome UA (Chrome 121 / Android 14).\n */\nexport const ANDROID_CHROME_UA =\n  'Mozilla/5.0 (Linux; Android 14; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36'\n\n/**\n * A device profile — everything the CDP Emulation domain needs to make\n * the page render as if it were that device.\n */\nexport interface DeviceProfile {\n  /** Canonical slug (e.g. \"iphone-14\"). */\n  name: string\n  /** CSS-pixel viewport width. */\n  width: number\n  /** CSS-pixel viewport height. */\n  height: number\n  /** Device pixel ratio (default 1). */\n  deviceScaleFactor: number\n  /** True for phones + tablets (controls layout-viewport behavior). */\n  mobile: boolean\n  /** User-Agent override (omit to keep Chrome's default). */\n  userAgent?: string\n  /** Whether to enable touch emulation (default: derived from `mobile`). */\n  hasTouch?: boolean\n}\n\n/**\n * Canonical device set. Keep small + obvious; favor \"one per common\n * breakpoint\" over completeness. Slugs are stable contract surface — do\n * not rename without a deprecation entry.\n */\nexport const DEVICES = {\n  'iphone-14': {\n    name: 'iphone-14',\n    width: 390,\n    height: 844,\n    deviceScaleFactor: 3,\n    mobile: true,\n    userAgent: MOBILE_SAFARI_UA,\n    hasTouch: true,\n  },\n  'iphone-14-pro-max': {\n    name: 'iphone-14-pro-max',\n    width: 430,\n    height: 932,\n    deviceScaleFactor: 3,\n    mobile: true,\n    userAgent: MOBILE_SAFARI_UA,\n    hasTouch: true,\n  },\n  'pixel-7': {\n    name: 'pixel-7',\n    width: 412,\n    height: 915,\n    deviceScaleFactor: 2.625,\n    mobile: true,\n    userAgent: ANDROID_CHROME_UA,\n    hasTouch: true,\n  },\n  'ipad-air': {\n    name: 'ipad-air',\n    width: 820,\n    height: 1180,\n    deviceScaleFactor: 2,\n    mobile: true,\n    userAgent: TABLET_SAFARI_UA,\n    hasTouch: true,\n  },\n  'ipad-pro-11': {\n    name: 'ipad-pro-11',\n    width: 834,\n    height: 1194,\n    deviceScaleFactor: 2,\n    mobile: true,\n    userAgent: TABLET_SAFARI_UA,\n    hasTouch: true,\n  },\n  'desktop-1440': {\n    name: 'desktop-1440',\n    width: 1440,\n    height: 900,\n    deviceScaleFactor: 1,\n    mobile: false,\n    hasTouch: false,\n  },\n} as const satisfies Record<string, DeviceProfile>\n\nexport type DeviceName = keyof typeof DEVICES\n\n/**\n * Known device slugs, in declaration order. Use this for `--help` and\n * docs to keep them in sync with `DEVICES`.\n */\nexport const DEVICE_NAMES: ReadonlyArray<DeviceName> = Object.freeze(\n  Object.keys(DEVICES) as DeviceName[],\n)\n\n/**\n * Resolve a device by slug. Throws when the slug is unknown so the\n * caller can surface a useful CLI error rather than silently rendering\n * at desktop (the pre-fix behavior of `--viewport mobile`).\n */\nexport function resolveDevice(name: string): DeviceProfile {\n  const profile = (DEVICES as Record<string, DeviceProfile>)[name]\n  if (!profile) {\n    const known = DEVICE_NAMES.join(', ')\n    throw new Error(\n      `Unknown --device \"${name}\". Known devices: ${known}.`,\n    )\n  }\n  return profile\n}\n\n/**\n * Convert a DeviceProfile into the ViewportConfig shape EngineDriver.launch\n * and EmulationDomain.applyDeviceProfile both expect. Keeps the field\n * names consistent across CLI, scan(), and driver.launch().\n */\nexport function deviceToViewport(profile: DeviceProfile): ViewportConfig {\n  return {\n    width: profile.width,\n    height: profile.height,\n    deviceScaleFactor: profile.deviceScaleFactor,\n    mobile: profile.mobile,\n    userAgent: profile.userAgent,\n    hasTouch: profile.hasTouch ?? profile.mobile,\n  }\n}\n\n/**\n * Normalize a Viewport preset (from VIEWPORTS) into the ViewportConfig\n * shape EngineDriver.launch expects. Use this at every driver.launch call\n * site that previously did `{ width: viewport.width, height: viewport.height }`\n * — that pattern silently dropped the mobile/UA/touch metadata and was\n * the proximate cause of the \"--viewport mobile renders desktop\" bug.\n */\nexport function viewportToConfig(viewport: Viewport): ViewportConfig {\n  return {\n    width: viewport.width,\n    height: viewport.height,\n    deviceScaleFactor: viewport.deviceScaleFactor,\n    mobile: viewport.mobile,\n    userAgent: viewport.userAgent,\n    hasTouch: viewport.hasTouch,\n  }\n}\n","/**\n * CDP WebSocket transport layer.\n * Forked from Spectra — adapted for IBR engine.\n * Uses Node.js 22+ built-in WebSocket (no ws package).\n */\n\ntype EventHandler = (params: unknown) => void\n\nconst DEFAULT_TIMEOUT_MS = 30_000\n\nexport class CdpConnection {\n  private ws: WebSocket | null = null\n  private nextId = 0\n  private pending = new Map<number, {\n    resolve: (value: unknown) => void\n    reject: (error: Error) => void\n    timer: ReturnType<typeof setTimeout>\n  }>()\n  private eventHandlers = new Map<string, Set<EventHandler>>()\n  private timeoutMs: number\n\n  constructor(options?: { timeoutMs?: number }) {\n    this.timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS\n  }\n\n  async connect(wsUrl: string): Promise<void> {\n    return new Promise<void>((resolve, reject) => {\n      const ws = new WebSocket(wsUrl)\n      let settled = false\n\n      const onOpen = () => {\n        if (settled) return\n        settled = true\n        this.ws = ws\n        // Register persistent handlers after successful connect\n        ws.addEventListener('message', (event) => this.handleMessage(event))\n        ws.addEventListener('close', () => this.handleClose())\n        ws.addEventListener('error', () => this.handleClose())\n        resolve()\n      }\n\n      const onError = () => {\n        if (settled) return\n        settled = true\n        reject(new Error(`WebSocket connection failed: ${wsUrl}`))\n      }\n\n      ws.addEventListener('open', onOpen)\n      ws.addEventListener('error', onError)\n    })\n  }\n\n  async send<T = unknown>(\n    method: string,\n    params?: Record<string, unknown>,\n    sessionId?: string,\n  ): Promise<T> {\n    if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n      throw new Error('Not connected')\n    }\n    const id = ++this.nextId\n    return new Promise<T>((resolve, reject) => {\n      const timer = setTimeout(() => {\n        if (this.pending.has(id)) {\n          this.pending.delete(id)\n          const secs = (this.timeoutMs / 1000).toFixed(0)\n          reject(new Error(\n            `CDP request '${method}' timed out after ${secs}s. `\n            + 'The browser may be unresponsive or the operation is taking too long.'\n          ))\n        }\n      }, this.timeoutMs)\n      this.pending.set(id, {\n        resolve: resolve as (v: unknown) => void,\n        reject,\n        timer,\n      })\n      const msg: Record<string, unknown> = { id, method }\n      if (params) msg.params = params\n      if (sessionId) msg.sessionId = sessionId\n      this.ws!.send(JSON.stringify(msg))\n    })\n  }\n\n  on(method: string, handler: EventHandler): void {\n    if (!this.eventHandlers.has(method)) {\n      this.eventHandlers.set(method, new Set())\n    }\n    this.eventHandlers.get(method)!.add(handler)\n  }\n\n  off(method: string, handler: EventHandler): void {\n    this.eventHandlers.get(method)?.delete(handler)\n  }\n\n  private handleMessage(event: MessageEvent): void {\n    let data: Record<string, unknown>\n    try {\n      data = JSON.parse(String(event.data))\n    } catch {\n      // Malformed frame — skip instead of crashing\n      return\n    }\n\n    if ('id' in data && this.pending.has(data.id as number)) {\n      const id = data.id as number\n      const { resolve, reject, timer } = this.pending.get(id)!\n      clearTimeout(timer)\n      this.pending.delete(id)\n      if (data.error) {\n        const err = data.error as { code: number; message: string }\n        reject(new Error(`CDP error ${err.code}: ${err.message}`))\n      } else {\n        resolve(data.result)\n      }\n    } else if ('method' in data) {\n      const handlers = this.eventHandlers.get(data.method as string)\n      if (handlers) {\n        for (const handler of handlers) handler(data.params)\n      }\n    }\n  }\n\n  private handleClose(): void {\n    for (const [, { reject, timer }] of this.pending) {\n      clearTimeout(timer)\n      reject(new Error('WebSocket closed'))\n    }\n    this.pending.clear()\n    this.ws = null\n  }\n\n  async close(): Promise<void> {\n    for (const [, { timer }] of this.pending) {\n      clearTimeout(timer)\n    }\n    if (this.ws) {\n      this.ws.close()\n      this.ws = null\n    }\n    this.pending.clear()\n  }\n\n  get connected(): boolean {\n    return this.ws !== null && this.ws.readyState === WebSocket.OPEN\n  }\n}\n","/**\n * Chrome browser process lifecycle management.\n * Forked from Spectra — adapted for IBR engine.\n */\n\nimport { spawn, type ChildProcess } from 'node:child_process'\nimport { existsSync, lstatSync, mkdtempSync } from 'node:fs'\nimport { mkdir } from 'node:fs/promises'\nimport { createServer } from 'node:net'\nimport { homedir, tmpdir } from 'node:os'\nimport { join } from 'node:path'\n\nexport const CHROME_PATHS = [\n  // macOS\n  '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',\n  '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary',\n  '/Applications/Chromium.app/Contents/MacOS/Chromium',\n  // Linux\n  '/usr/bin/google-chrome',\n  '/usr/bin/google-chrome-stable',\n  '/usr/bin/chromium-browser',\n  '/usr/bin/chromium',\n  // Windows (WSL)\n  '/mnt/c/Program Files/Google/Chrome/Application/chrome.exe',\n]\n\nexport function findChrome(): string | null {\n  for (const p of CHROME_PATHS) {\n    if (existsSync(p)) return p\n  }\n  return null\n}\n\nexport type BrowserMode = 'local' | 'connect'\n\nexport interface BrowserConnectionOptions {\n  mode?: BrowserMode\n  cdpUrl?: string\n  wsEndpoint?: string\n  chromePath?: string\n}\n\ninterface ResolvedBrowserConnectionOptions {\n  mode: BrowserMode\n  cdpUrl?: string\n  wsEndpoint?: string\n  chromePath?: string\n}\n\nexport interface BrowserOptions extends BrowserConnectionOptions {\n  headless?: boolean    // default: true\n  port?: number         // default: random ephemeral port\n  userDataDir?: string  // default: ~/.ibr/chromium-profile/\n  /**\n   * Rendering normalization for mockup comparison.\n   * Adds --disable-lcd-text and --force-device-scale-factor=1.\n   * These improve pixel-level consistency but reduce text rendering quality.\n   * Default: false\n   */\n  normalize?: boolean\n}\n\nfunction randomPort(): number {\n  return 49152 + Math.floor(Math.random() * (65535 - 49152))\n}\n\nasync function findFreePort(maxAttempts = 10): Promise<number> {\n  for (let i = 0; i < maxAttempts; i++) {\n    const port = randomPort()\n    const isFree = await checkPortFree(port)\n    if (isFree) return port\n  }\n  // Last resort: let OS assign\n  return new Promise((resolve, reject) => {\n    const srv = createServer()\n    srv.listen(0, () => {\n      const port = (srv.address() as any).port\n      srv.close(() => resolve(port))\n    })\n    srv.on('error', reject)\n  })\n}\n\nfunction checkPortFree(port: number): Promise<boolean> {\n  return new Promise((resolve) => {\n    const srv = createServer()\n    srv.once('error', () => resolve(false))\n    srv.listen(port, () => srv.close(() => resolve(true)))\n  })\n}\n\nasync function resolveWsEndpoint(cdpUrl: string): Promise<string> {\n  const res = await fetch(`${cdpUrl}/json/version`)\n  if (!res.ok) {\n    throw new Error(`CDP endpoint did not respond: ${cdpUrl}`)\n  }\n  const data = await res.json() as { webSocketDebuggerUrl?: string }\n  if (!data.webSocketDebuggerUrl) {\n    throw new Error(`CDP endpoint did not return a WebSocket URL: ${cdpUrl}`)\n  }\n  return data.webSocketDebuggerUrl\n}\n\nexport function resolveBrowserConnectionOptions(\n  options: BrowserConnectionOptions = {},\n  env: NodeJS.ProcessEnv = process.env,\n): ResolvedBrowserConnectionOptions {\n  const wsEndpoint = options.wsEndpoint || env.IBR_WS_ENDPOINT\n  const cdpUrl = options.cdpUrl || env.IBR_CDP_URL\n  const requestedMode = options.mode || env.IBR_BROWSER_MODE\n  const mode: BrowserMode = requestedMode === 'local'\n    ? 'local'\n    : requestedMode === 'connect' || wsEndpoint || cdpUrl\n      ? 'connect'\n      : 'local'\n\n  return {\n    mode,\n    cdpUrl,\n    wsEndpoint,\n    chromePath: options.chromePath || env.IBR_CHROME_PATH,\n  }\n}\n\nexport class BrowserManager {\n  private process: ChildProcess | null = null\n  private _port = 0\n  private _mode: BrowserMode = 'local'\n  private _cdpUrl: string | null = null\n  private _wsEndpoint: string | null = null\n\n  async launch(options: BrowserOptions = {}): Promise<string> {\n    const connection = resolveBrowserConnectionOptions(options)\n    this._mode = connection.mode\n\n    if (connection.mode === 'connect') {\n      this.process = null\n      this._port = 0\n      this._cdpUrl = connection.cdpUrl ?? null\n      if (connection.wsEndpoint) {\n        this._wsEndpoint = connection.wsEndpoint\n        return connection.wsEndpoint\n      }\n      if (connection.cdpUrl) {\n        const wsUrl = await resolveWsEndpoint(connection.cdpUrl)\n        this._wsEndpoint = wsUrl\n        return wsUrl\n      }\n      throw new Error(\n        'Connect mode requires a CDP endpoint.\\n'\n        + 'Provide --cdp-url http://127.0.0.1:9222 or --ws-endpoint ws://...\\n'\n        + 'You can also set IBR_CDP_URL or IBR_WS_ENDPOINT.'\n      )\n    }\n\n    const headless = options.headless ?? true\n    this._port = options.port ?? await findFreePort()\n    let userDataDir = options.userDataDir ?? join(homedir(), '.ibr', 'chromium-profile')\n\n    // Chrome creates `SingletonLock` as a SYMLINK whose target is `<hostname>-<pid>`.\n    // After a crash, the symlink remains but its target host/pid is gone, so\n    // `existsSync` (which follows symlinks) returns false even though the link\n    // is present. Chrome itself sees the link, refuses to acquire the singleton,\n    // and aborts immediately (\"Failed to create a ProcessSingleton... Aborting\").\n    // We must detect the symlink itself via `lstat`, not `stat`.\n    const lockPath = join(userDataDir, 'SingletonLock')\n    const lockStat = lstatSync(lockPath, { throwIfNoEntry: false })\n    if (lockStat) {\n      // Profile is locked (or has a stale crash-leftover lock symlink).\n      // Use a temp profile to avoid conflict.\n      userDataDir = mkdtempSync(join(tmpdir(), 'ibr-chrome-'))\n    }\n\n    const chromePath = connection.chromePath ?? findChrome()\n    if (!chromePath) {\n      throw new Error(\n        'Chrome not found. Install Google Chrome or pass chromePath option.\\n'\n        + `Checked: ${CHROME_PATHS.join(', ')}`\n      )\n    }\n\n    await mkdir(userDataDir, { recursive: true })\n\n    const args = [\n      `--remote-debugging-port=${this._port}`,\n      `--user-data-dir=${userDataDir}`,\n      '--no-first-run',\n      '--no-default-browser-check',\n      '--disable-background-networking',\n      '--disable-sync',\n    ]\n    if (headless) {\n      args.push('--headless=new')\n    }\n    if (options.normalize) {\n      // Reduce rendering inconsistencies for mockup pixel comparison\n      args.push('--disable-lcd-text')          // disable subpixel text rendering\n      args.push('--force-device-scale-factor=1') // prevent HiDPI scaling differences\n    }\n\n    this.process = spawn(chromePath, args, { stdio: 'pipe' })\n\n    this.process.on('error', (err) => {\n      console.error(`Chrome process error: ${err.message}`)\n    })\n\n    const wsUrl = await this.waitForDebugger()\n    this._cdpUrl = `http://127.0.0.1:${this._port}`\n    this._wsEndpoint = wsUrl\n    return wsUrl\n  }\n\n  private async waitForDebugger(): Promise<string> {\n    const maxAttempts = 50 // 5 seconds at 100ms intervals\n    for (let i = 0; i < maxAttempts; i++) {\n      try {\n        const res = await fetch(`http://127.0.0.1:${this._port}/json/version`)\n        const data = (await res.json()) as { webSocketDebuggerUrl: string }\n        return data.webSocketDebuggerUrl\n      } catch {\n        await new Promise((r) => setTimeout(r, 100))\n      }\n    }\n    throw new Error(\n      `Chrome debugger did not respond within 5s on port ${this._port}. `\n      + 'Is another Chrome instance using this port?\\n'\n      + 'If you are running inside a sandbox, retry with connect mode:\\n'\n      + '  --browser-mode connect --cdp-url http://127.0.0.1:9222'\n    )\n  }\n\n  async close(): Promise<void> {\n    if (this._mode !== 'local' || !this.process) return\n\n    const proc = this.process\n    this.process = null\n\n    // Wait for process to exit, with SIGKILL escalation\n    await new Promise<void>((resolve) => {\n      const killTimer = setTimeout(() => {\n        // Escalate to SIGKILL after 3 seconds\n        try { proc.kill('SIGKILL') } catch { /* already dead */ }\n        resolve()\n      }, 3000)\n\n      proc.once('close', () => {\n        clearTimeout(killTimer)\n        resolve()\n      })\n\n      proc.kill('SIGTERM')\n    })\n  }\n\n  get running(): boolean {\n    return this.process !== null && !this.process.killed\n  }\n\n  get port(): number {\n    return this._port\n  }\n\n  get pid(): number | null {\n    return this.process?.pid ?? null\n  }\n\n  get mode(): BrowserMode {\n    return this._mode\n  }\n\n  get cdpUrl(): string | null {\n    return this._cdpUrl\n  }\n\n  get wsEndpoint(): string | null {\n    return this._wsEndpoint\n  }\n}\n","/**\n * CDP Target domain — tab/target lifecycle management.\n * Forked from Spectra.\n */\n\nimport type { CdpConnection } from './connection.js'\n\nexport class TargetDomain {\n  constructor(private conn: CdpConnection) {}\n\n  async createPage(url: string): Promise<string> {\n    const result = await this.conn.send<{ targetId: string }>(\n      'Target.createTarget', { url },\n    )\n    return result.targetId\n  }\n\n  async attach(targetId: string): Promise<string> {\n    const result = await this.conn.send<{ sessionId: string }>(\n      'Target.attachToTarget', { targetId, flatten: true },\n    )\n    return result.sessionId\n  }\n\n  async close(targetId: string): Promise<void> {\n    await this.conn.send('Target.closeTarget', { targetId })\n  }\n\n  async list(): Promise<Array<{ targetId: string; type: string; url: string }>> {\n    const result = await this.conn.send<{\n      targetInfos: Array<{ targetId: string; type: string; url: string }>\n    }>('Target.getTargets')\n    return result.targetInfos\n  }\n}\n","/**\n * CDP Page domain — navigation, screenshots, lifecycle events.\n * Forked from Spectra — extended with getLayoutMetrics, clip screenshots,\n * captureBeyondViewport, and CSS/script injection.\n */\n\nimport type { CdpConnection } from './connection.js'\n\nexport interface ScreenshotOptions {\n  format?: 'png' | 'jpeg'\n  quality?: number           // JPEG quality (0-100)\n  fullPage?: boolean         // Capture entire scrollable page\n  clip?: {                   // Capture specific region\n    x: number\n    y: number\n    width: number\n    height: number\n    scale?: number\n  }\n}\n\nexport interface LayoutMetrics {\n  contentSize: { width: number; height: number }\n  layoutViewport: { pageX: number; pageY: number; clientWidth: number; clientHeight: number }\n  visualViewport: { offsetX: number; offsetY: number; pageX: number; pageY: number; clientWidth: number; clientHeight: number; scale: number }\n}\n\nexport class PageDomain {\n  constructor(\n    private conn: CdpConnection,\n    private sessionId?: string,\n  ) {}\n\n  async navigate(url: string): Promise<string> {\n    const result = await this.conn.send<{ frameId: string }>(\n      'Page.navigate', { url }, this.sessionId,\n    )\n    return result.frameId\n  }\n\n  async screenshot(options: ScreenshotOptions = {}): Promise<Buffer> {\n    const format = options.format ?? 'png'\n\n    if (options.fullPage) {\n      return this.fullPageScreenshot(format, options.quality)\n    }\n\n    const params: Record<string, unknown> = { format }\n    if (options.quality !== undefined) params.quality = options.quality\n    if (options.clip) {\n      params.clip = { ...options.clip, scale: options.clip.scale ?? 1 }\n    }\n\n    const result = await this.conn.send<{ data: string }>(\n      'Page.captureScreenshot', params, this.sessionId,\n    )\n    return Buffer.from(result.data, 'base64')\n  }\n\n  /**\n   * Full-page screenshot via getLayoutMetrics + device metrics override.\n   * Technique: get content size → override viewport to content size →\n   * capture with captureBeyondViewport → restore viewport.\n   */\n  private async fullPageScreenshot(format: 'png' | 'jpeg', quality?: number): Promise<Buffer> {\n    const metrics = await this.getLayoutMetrics()\n    const { width, height } = metrics.contentSize\n\n    // Override viewport to content dimensions\n    await this.conn.send('Emulation.setDeviceMetricsOverride', {\n      width: Math.ceil(width),\n      height: Math.ceil(height),\n      deviceScaleFactor: 1,\n      mobile: false,\n    }, this.sessionId)\n\n    try {\n      const params: Record<string, unknown> = {\n        format,\n        captureBeyondViewport: true,\n        clip: { x: 0, y: 0, width, height, scale: 1 },\n      }\n      if (quality !== undefined) params.quality = quality\n\n      const result = await this.conn.send<{ data: string }>(\n        'Page.captureScreenshot', params, this.sessionId,\n      )\n      return Buffer.from(result.data, 'base64')\n    } finally {\n      // Restore original viewport\n      await this.conn.send('Emulation.clearDeviceMetricsOverride', {}, this.sessionId)\n    }\n  }\n\n  async getLayoutMetrics(): Promise<LayoutMetrics> {\n    return this.conn.send<LayoutMetrics>(\n      'Page.getLayoutMetrics', {}, this.sessionId,\n    )\n  }\n\n  async enableLifecycleEvents(): Promise<void> {\n    await this.conn.send('Page.setLifecycleEventsEnabled', { enabled: true }, this.sessionId)\n    await this.conn.send('Page.enable', {}, this.sessionId)\n  }\n\n  /**\n   * Inject CSS into the page.\n   * Uses callFunctionOn with CSS passed as a proper argument (not interpolated)\n   * to avoid injection issues with special characters in CSS content.\n   */\n  async addStyleTag(css: string): Promise<void> {\n    // Get a reference to document for callFunctionOn\n    const docResult = await this.conn.send<{\n      result: { objectId: string }\n    }>('Runtime.evaluate', {\n      expression: 'document',\n      returnByValue: false,\n    }, this.sessionId)\n\n    await this.conn.send('Runtime.callFunctionOn', {\n      functionDeclaration: '(cssText) => { const style = document.createElement(\"style\"); style.textContent = cssText; document.head.appendChild(style); }',\n      objectId: docResult.result.objectId,\n      arguments: [{ value: css }],\n      returnByValue: true,\n    }, this.sessionId)\n  }\n\n  /**\n   * Inject script that runs on every navigation (including future ones).\n   * Uses Page.addScriptToEvaluateOnNewDocument.\n   */\n  async addScriptOnLoad(source: string): Promise<string> {\n    const result = await this.conn.send<{ identifier: string }>(\n      'Page.addScriptToEvaluateOnNewDocument', { source }, this.sessionId,\n    )\n    return result.identifier\n  }\n}\n","/**\n * Normalize raw accessibility roles to canonical names.\n * Forked from Spectra.\n */\n\nimport type { Platform } from './types.js'\n\nconst WEB_ROLES: Record<string, string> = {\n  button: 'button', textbox: 'textfield', TextField: 'textfield',\n  link: 'link', checkbox: 'checkbox', switch: 'switch', slider: 'slider',\n  tab: 'tab', combobox: 'select', listbox: 'select',\n  heading: 'heading', img: 'image', image: 'image', StaticText: 'text',\n  group: 'group', generic: 'group', navigation: 'group', main: 'group',\n  contentinfo: 'group', banner: 'group', form: 'group', search: 'group',\n  region: 'group', article: 'group', section: 'group', complementary: 'group',\n}\n\nconst MACOS_ROLES: Record<string, string> = {\n  AXButton: 'button', AXTextField: 'textfield', AXTextArea: 'textfield',\n  AXLink: 'link', AXCheckBox: 'checkbox', AXSwitch: 'switch', AXSlider: 'slider',\n  AXTab: 'tab', AXRadioButton: 'tab', AXPopUpButton: 'select', AXComboBox: 'select',\n  AXStaticText: 'text', AXImage: 'image', AXGroup: 'group', AXWindow: 'group',\n  AXScrollArea: 'group', AXToolbar: 'group', AXSplitGroup: 'group',\n  AXList: 'group', AXOutline: 'group', AXTable: 'group',\n  AXRow: 'group', AXColumn: 'group', AXCell: 'group',\n}\n\nexport function normalizeRole(rawRole: string, platform: Platform): string {\n  if (platform === 'web') return WEB_ROLES[rawRole] ?? 'group'\n  // iOS and watchOS share macOS AX role naming conventions\n  return MACOS_ROLES[rawRole] ?? 'group'\n}\n","/**\n * CDP Accessibility domain — AX tree access, queryAXTree, event subscriptions.\n * Forked from Spectra — extended with queryAXTree-first resolution and events.\n */\n\nimport type { CdpConnection } from './connection.js'\nimport type { Element } from '../types.js'\nimport { normalizeRole } from '../normalize.js'\n\nexport interface CdpAXNode {\n  nodeId: string\n  role: { value: string }\n  name?: { value: string }\n  value?: { value: string }\n  properties?: Array<{ name: string; value: { value: unknown } }>\n  childIds?: string[]\n  backendDOMNodeId?: number\n}\n\nconst SKIP_ROLES = new Set(['WebArea', 'RootWebArea', 'GenericContainer', 'none', 'IgnoredRole'])\n\nexport class AccessibilityDomain {\n  private nodeMap = new Map<string, number>() // elementId → backendDOMNodeId\n  private loadCompleteHandlers = new Set<() => void>()\n  private nodesUpdatedHandlers = new Set<(nodes: CdpAXNode[]) => void>()\n  private enabled = false\n\n  // Stored references for cleanup\n  private loadCompleteListener: (() => void) | null = null\n  private nodesUpdatedListener: ((params: unknown) => void) | null = null\n\n  constructor(\n    private conn: CdpConnection,\n    private sessionId?: string,\n  ) {}\n\n  async enable(): Promise<void> {\n    if (this.enabled) return\n    this.enabled = true\n\n    await this.conn.send('Accessibility.enable', {}, this.sessionId)\n\n    // Store listener references so they can be removed in disable()\n    this.loadCompleteListener = () => {\n      for (const handler of this.loadCompleteHandlers) handler()\n    }\n    this.nodesUpdatedListener = (params: unknown) => {\n      const { nodes } = params as { nodes: CdpAXNode[] }\n      for (const handler of this.nodesUpdatedHandlers) handler(nodes)\n    }\n\n    this.conn.on('Accessibility.loadComplete', this.loadCompleteListener)\n    this.conn.on('Accessibility.nodesUpdated', this.nodesUpdatedListener)\n  }\n\n  async disable(): Promise<void> {\n    if (!this.enabled) return\n    this.enabled = false\n\n    if (this.loadCompleteListener) {\n      this.conn.off('Accessibility.loadComplete', this.loadCompleteListener)\n      this.loadCompleteListener = null\n    }\n    if (this.nodesUpdatedListener) {\n      this.conn.off('Accessibility.nodesUpdated', this.nodesUpdatedListener)\n      this.nodesUpdatedListener = null\n    }\n  }\n\n  async getSnapshot(): Promise<Element[]> {\n    const result = await this.conn.send<{ nodes: CdpAXNode[] }>(\n      'Accessibility.getFullAXTree',\n      {},\n      this.sessionId,\n    )\n    return this.convertToElements(result.nodes)\n  }\n\n  /**\n   * queryAXTree — CDP-native search by accessible name and/or role.\n   * Faster than getFullAXTree + filter for targeted element finding.\n   * Note: does NOT clear/repopulate nodeMap — merges into existing map.\n   */\n  async queryAXTree(options: {\n    accessibleName?: string\n    role?: string\n    backendNodeId?: number\n  }): Promise<Element[]> {\n    const params: Record<string, unknown> = {}\n    if (options.accessibleName) params.accessibleName = options.accessibleName\n    if (options.role) params.role = options.role\n\n    // queryAXTree requires an anchor node. Use provided backendNodeId,\n    // or fall back to the document root.\n    if (options.backendNodeId) {\n      params.backendNodeId = options.backendNodeId\n    } else {\n      // Get document root nodeId as anchor\n      const doc = await this.conn.send<{ root: { nodeId: number } }>(\n        'DOM.getDocument', {}, this.sessionId,\n      )\n      params.nodeId = doc.root.nodeId\n    }\n\n    try {\n      const result = await this.conn.send<{ nodes: CdpAXNode[] }>(\n        'Accessibility.queryAXTree',\n        params,\n        this.sessionId,\n      )\n      return this.convertToElements(result.nodes, false)\n    } catch {\n      // queryAXTree may fail on some pages — fall back to empty\n      return []\n    }\n  }\n\n  getBackendNodeId(elementId: string): number | undefined {\n    return this.nodeMap.get(elementId)\n  }\n\n  /** Subscribe to Accessibility.loadComplete events. */\n  onLoadComplete(handler: () => void): void {\n    this.loadCompleteHandlers.add(handler)\n  }\n\n  /** Subscribe to Accessibility.nodesUpdated events. */\n  onNodesUpdated(handler: (nodes: CdpAXNode[]) => void): void {\n    this.nodesUpdatedHandlers.add(handler)\n  }\n\n  offLoadComplete(handler: () => void): void {\n    this.loadCompleteHandlers.delete(handler)\n  }\n\n  offNodesUpdated(handler: (nodes: CdpAXNode[]) => void): void {\n    this.nodesUpdatedHandlers.delete(handler)\n  }\n\n  /**\n   * Convert CDP AX nodes to Elements.\n   * @param clearMap If true (default), clears nodeMap first. Set false for queryAXTree\n   *   to merge results into existing map without invalidating prior IDs.\n   */\n  private convertToElements(nodes: CdpAXNode[], clearMap = true): Element[] {\n    const elements: Element[] = []\n\n    if (clearMap) {\n      this.nodeMap.clear()\n    }\n\n    // Use backendDOMNodeId-based IDs for stability across snapshots\n    for (const node of nodes) {\n      if (SKIP_ROLES.has(node.role.value)) continue\n\n      const role = normalizeRole(node.role.value, 'web')\n      const label = node.name?.value ?? ''\n\n      // Skip unlabeled containers\n      if (role === 'group' && !label) continue\n\n      // Use backendDOMNodeId for stable IDs when available\n      const id = node.backendDOMNodeId ? `e${node.backendDOMNodeId}` : `ex${Math.random().toString(36).slice(2, 8)}`\n\n      const el: Element = {\n        id,\n        role,\n        label,\n        value: node.value?.value ?? null,\n        enabled: this.getProperty(node, 'disabled') !== true,\n        focused: this.getProperty(node, 'focused') === true,\n        actions: this.inferActions(role),\n        bounds: [0, 0, 0, 0],\n        parent: null,\n      }\n\n      if (node.backendDOMNodeId) {\n        this.nodeMap.set(el.id, node.backendDOMNodeId)\n      }\n\n      elements.push(el)\n    }\n\n    return elements\n  }\n\n  private getProperty(node: CdpAXNode, name: string): unknown {\n    return node.properties?.find((p) => p.name === name)?.value?.value\n  }\n\n  private inferActions(role: string): string[] {\n    switch (role) {\n      case 'button':\n      case 'link':\n      case 'checkbox':\n      case 'tab':\n      case 'switch':\n        return ['press']\n      case 'textfield':\n        return ['setValue']\n      case 'slider':\n        return ['increment', 'decrement', 'setValue']\n      case 'select':\n        return ['press', 'showMenu']\n      default:\n        return []\n    }\n  }\n}\n","/**\n * CDP DOM domain — element queries, box model, HTML extraction.\n * Forked from Spectra — extended with querySelector, querySelectorAll, getOuterHTML.\n */\n\nimport type { CdpConnection } from './connection.js'\n\nexport class DomDomain {\n  constructor(\n    private conn: CdpConnection,\n    private sessionId?: string,\n  ) {}\n\n  async getElementCenter(backendNodeId: number): Promise<{ x: number; y: number }> {\n    const result = await this.conn.send<{\n      model: { content: number[] }\n    }>('DOM.getBoxModel', { backendNodeId }, this.sessionId)\n\n    // content quad: [x1,y1, x2,y2, x3,y3, x4,y4] — four corners\n    const q = result.model.content\n    const x = Math.round((q[0] + q[2] + q[4] + q[6]) / 4)\n    const y = Math.round((q[1] + q[3] + q[5] + q[7]) / 4)\n    return { x, y }\n  }\n\n  async getBoxModel(backendNodeId: number): Promise<{\n    content: number[]\n    padding: number[]\n    border: number[]\n    margin: number[]\n    width: number\n    height: number\n  }> {\n    const result = await this.conn.send<{\n      model: {\n        content: number[]\n        padding: number[]\n        border: number[]\n        margin: number[]\n        width: number\n        height: number\n      }\n    }>('DOM.getBoxModel', { backendNodeId }, this.sessionId)\n    return result.model\n  }\n\n  async getDocument(): Promise<{ root: { nodeId: number } }> {\n    return this.conn.send('DOM.getDocument', {}, this.sessionId)\n  }\n\n  /**\n   * Find a single element by CSS selector.\n   * Returns the nodeId, or null if not found.\n   */\n  async querySelector(nodeId: number, selector: string): Promise<number | null> {\n    try {\n      const result = await this.conn.send<{ nodeId: number }>(\n        'DOM.querySelector', { nodeId, selector }, this.sessionId,\n      )\n      return result.nodeId > 0 ? result.nodeId : null\n    } catch {\n      return null\n    }\n  }\n\n  /**\n   * Find all elements matching a CSS selector.\n   * Returns array of nodeIds.\n   */\n  async querySelectorAll(nodeId: number, selector: string): Promise<number[]> {\n    try {\n      const result = await this.conn.send<{ nodeIds: number[] }>(\n        'DOM.querySelectorAll', { nodeId, selector }, this.sessionId,\n      )\n      return result.nodeIds.filter((id) => id > 0)\n    } catch {\n      return []\n    }\n  }\n\n  /**\n   * Get the outer HTML of a node.\n   */\n  async getOuterHTML(nodeId?: number, backendNodeId?: number): Promise<string> {\n    const params: Record<string, unknown> = {}\n    if (nodeId !== undefined) params.nodeId = nodeId\n    if (backendNodeId !== undefined) params.backendNodeId = backendNodeId\n\n    const result = await this.conn.send<{ outerHTML: string }>(\n      'DOM.getOuterHTML', params, this.sessionId,\n    )\n    return result.outerHTML\n  }\n\n  /**\n   * Get attributes of a node as key-value pairs.\n   */\n  async getAttributes(nodeId: number): Promise<Record<string, string>> {\n    const result = await this.conn.send<{ attributes: string[] }>(\n      'DOM.getAttributes', { nodeId }, this.sessionId,\n    )\n    const attrs: Record<string, string> = {}\n    for (let i = 0; i < result.attributes.length; i += 2) {\n      attrs[result.attributes[i]] = result.attributes[i + 1]\n    }\n    return attrs\n  }\n}\n","/**\n * CDP Input domain — mouse, keyboard, and scroll simulation.\n * Forked from Spectra — extended with special key support.\n */\n\nimport type { CdpConnection } from './connection.js'\n\nexport class InputDomain {\n  constructor(\n    private conn: CdpConnection,\n    private sessionId?: string,\n  ) {}\n\n  async click(x: number, y: number): Promise<void> {\n    await this.conn.send('Input.dispatchMouseEvent', {\n      type: 'mousePressed', x, y, button: 'left', clickCount: 1,\n    }, this.sessionId)\n    await this.conn.send('Input.dispatchMouseEvent', {\n      type: 'mouseReleased', x, y, button: 'left', clickCount: 1,\n    }, this.sessionId)\n  }\n\n  async type(text: string): Promise<void> {\n    for (const char of text) {\n      const code = charToCode(char)\n      await this.conn.send('Input.dispatchKeyEvent', {\n        type: 'keyDown', text: char, key: char, code,\n      }, this.sessionId)\n      await this.conn.send('Input.dispatchKeyEvent', {\n        type: 'keyUp', key: char, code,\n      }, this.sessionId)\n    }\n  }\n\n  /**\n   * Press a special key (Enter, Tab, Escape, Backspace, etc.)\n   */\n  async pressKey(key: string): Promise<void> {\n    const keyDef = SPECIAL_KEYS[key]\n    if (!keyDef) {\n      // Treat as single character\n      await this.type(key)\n      return\n    }\n    await this.conn.send('Input.dispatchKeyEvent', {\n      type: 'keyDown',\n      key: keyDef.key,\n      code: keyDef.code,\n      text: keyDef.text,\n    }, this.sessionId)\n    await this.conn.send('Input.dispatchKeyEvent', {\n      type: 'keyUp',\n      key: keyDef.key,\n      code: keyDef.code,\n    }, this.sessionId)\n  }\n\n  async hover(x: number, y: number): Promise<void> {\n    await this.conn.send('Input.dispatchMouseEvent', {\n      type: 'mouseMoved', x, y,\n    }, this.sessionId)\n  }\n\n  async scroll(x: number, y: number, deltaX: number, deltaY: number): Promise<void> {\n    await this.conn.send('Input.dispatchMouseEvent', {\n      type: 'mouseWheel', x, y, deltaX, deltaY,\n    }, this.sessionId)\n  }\n}\n\n// ─── Key mappings ──────────────────────────────────────────\n\ninterface KeyDef {\n  key: string\n  code: string\n  text?: string\n}\n\nconst SPECIAL_KEYS: Record<string, KeyDef> = {\n  Enter: { key: 'Enter', code: 'Enter', text: '\\r' },\n  Tab: { key: 'Tab', code: 'Tab', text: '\\t' },\n  Escape: { key: 'Escape', code: 'Escape' },\n  Backspace: { key: 'Backspace', code: 'Backspace' },\n  Delete: { key: 'Delete', code: 'Delete' },\n  ArrowUp: { key: 'ArrowUp', code: 'ArrowUp' },\n  ArrowDown: { key: 'ArrowDown', code: 'ArrowDown' },\n  ArrowLeft: { key: 'ArrowLeft', code: 'ArrowLeft' },\n  ArrowRight: { key: 'ArrowRight', code: 'ArrowRight' },\n  Home: { key: 'Home', code: 'Home' },\n  End: { key: 'End', code: 'End' },\n  PageUp: { key: 'PageUp', code: 'PageUp' },\n  PageDown: { key: 'PageDown', code: 'PageDown' },\n}\n\nconst SPECIAL_CODES: Record<string, string> = {\n  ' ': 'Space', '0': 'Digit0', '1': 'Digit1', '2': 'Digit2', '3': 'Digit3',\n  '4': 'Digit4', '5': 'Digit5', '6': 'Digit6', '7': 'Digit7', '8': 'Digit8',\n  '9': 'Digit9', '`': 'Backquote', '-': 'Minus', '=': 'Equal', '[': 'BracketLeft',\n  ']': 'BracketRight', '\\\\': 'Backslash', ';': 'Semicolon', \"'\": 'Quote',\n  ',': 'Comma', '.': 'Period', '/': 'Slash', '~': 'Backquote', '!': 'Digit1',\n  '@': 'Digit2', '#': 'Digit3', '$': 'Digit4', '%': 'Digit5', '^': 'Digit6',\n  '&': 'Digit7', '*': 'Digit8', '(': 'Digit9', ')': 'Digit0', '_': 'Minus',\n  '+': 'Equal', '{': 'BracketLeft', '}': 'BracketRight', '|': 'Backslash',\n  ':': 'Semicolon', '\"': 'Quote', '<': 'Comma', '>': 'Period', '?': 'Slash',\n  '\\t': 'Tab', '\\n': 'Enter',\n}\n\nfunction charToCode(char: string): string {\n  if (SPECIAL_CODES[char]) return SPECIAL_CODES[char]\n  const upper = char.toUpperCase()\n  if (upper >= 'A' && upper <= 'Z') return `Key${upper}`\n  return ''\n}\n","/**\n * CDP Runtime domain — JavaScript evaluation in page context.\n * Forked from Spectra — extended with callFunctionOn for function+args evaluation.\n */\n\nimport type { CdpConnection } from './connection.js'\n\nexport class RuntimeDomain {\n  constructor(\n    private conn: CdpConnection,\n    private sessionId?: string,\n  ) {}\n\n  /**\n   * Evaluate a JavaScript expression string in the page context.\n   */\n  async evaluate(expression: string): Promise<unknown> {\n    const result = await this.conn.send<{\n      result: { type: string; value: unknown; objectId?: string }\n      exceptionDetails?: { text: string; exception?: { description: string } }\n    }>('Runtime.evaluate', {\n      expression,\n      returnByValue: true,\n      awaitPromise: true,\n    }, this.sessionId)\n\n    if (result.exceptionDetails) {\n      const msg = result.exceptionDetails.exception?.description\n        ?? result.exceptionDetails.text\n      throw new Error(`Evaluation failed: ${msg}`)\n    }\n\n    return result.result.value\n  }\n\n  /**\n   * Call a function with structured arguments in the page context.\n   * This is the CDP equivalent of Playwright's page.evaluate(fn, ...args).\n   *\n   * The function declaration is serialized as a string, and arguments\n   * are passed as CDP CallArgument objects (primitives by value).\n   *\n   * Usage:\n   *   await runtime.callFunctionOn(\n   *     '(selector, prop) => getComputedStyle(document.querySelector(selector))[prop]',\n   *     ['.header', 'color']\n   *   )\n   */\n  async callFunctionOn(\n    functionDeclaration: string,\n    args?: unknown[],\n  ): Promise<unknown> {\n    // We need an execution context, so evaluate on the document\n    const docResult = await this.conn.send<{\n      result: { objectId: string }\n    }>('Runtime.evaluate', {\n      expression: 'document',\n      returnByValue: false,\n    }, this.sessionId)\n\n    const callArgs = args?.map((arg) => {\n      if (arg === undefined) return { unserializableValue: 'undefined' }\n      return { value: arg }\n    })\n\n    const result = await this.conn.send<{\n      result: { type: string; value: unknown; objectId?: string }\n      exceptionDetails?: { text: string; exception?: { description: string } }\n    }>('Runtime.callFunctionOn', {\n      functionDeclaration,\n      objectId: docResult.result.objectId,\n      arguments: callArgs,\n      returnByValue: true,\n      awaitPromise: true,\n    }, this.sessionId)\n\n    if (result.exceptionDetails) {\n      const msg = result.exceptionDetails.exception?.description\n        ?? result.exceptionDetails.text\n      throw new Error(`callFunctionOn failed: ${msg}`)\n    }\n\n    return result.result.value\n  }\n\n  /**\n   * Enable the Runtime domain to receive events (like consoleAPICalled).\n   */\n  async enable(): Promise<void> {\n    await this.conn.send('Runtime.enable', {}, this.sessionId)\n  }\n}\n","/**\n * CDP CSS domain — computed styles, matched rules.\n * NEW for IBR — direct computed style access without page.evaluate(getComputedStyle).\n */\n\nimport type { CdpConnection } from './connection.js'\n\nexport interface CSSComputedStyleProperty {\n  name: string\n  value: string\n}\n\nexport class CssDomain {\n  constructor(\n    private conn: CdpConnection,\n    private sessionId?: string,\n  ) {}\n\n  async enable(): Promise<void> {\n    await this.conn.send('CSS.enable', {}, this.sessionId)\n  }\n\n  /**\n   * Get computed styles for a DOM node.\n   * Returns all computed CSS properties as key-value pairs.\n   */\n  async getComputedStyle(nodeId: number): Promise<Record<string, string>> {\n    const result = await this.conn.send<{\n      computedStyle: CSSComputedStyleProperty[]\n    }>('CSS.getComputedStyleForNode', { nodeId }, this.sessionId)\n\n    const styles: Record<string, string> = {}\n    for (const { name, value } of result.computedStyle) {\n      styles[name] = value\n    }\n    return styles\n  }\n\n  /**\n   * Get computed styles filtered to specific properties.\n   * More efficient when you only need a few properties.\n   */\n  async getComputedStyleFiltered(\n    nodeId: number,\n    properties: string[],\n  ): Promise<Record<string, string>> {\n    const all = await this.getComputedStyle(nodeId)\n    const filtered: Record<string, string> = {}\n    for (const prop of properties) {\n      if (prop in all) {\n        filtered[prop] = all[prop]\n      }\n    }\n    return filtered\n  }\n\n  /**\n   * Get matched CSS rules for a node — includes inline, attribute,\n   * inherited, pseudo-element, and keyframe styles.\n   */\n  async getMatchedStyles(nodeId: number): Promise<{\n    inlineStyle?: { cssProperties: CSSComputedStyleProperty[] }\n    matchedCSSRules: Array<{\n      rule: {\n        selectorList: { text: string }\n        style: { cssProperties: CSSComputedStyleProperty[] }\n      }\n    }>\n  }> {\n    return this.conn.send('CSS.getMatchedStylesForNode', { nodeId }, this.sessionId)\n  }\n}\n","/**\n * CDP DOMSnapshot domain — one-call full DOM + layout + computed style extraction.\n * NEW for IBR — replaces dozens of individual page.evaluate() calls.\n */\n\nimport type { CdpConnection } from './connection.js'\n\nexport interface DocumentSnapshot {\n  documentURL: number       // index into strings array\n  title: number             // index into strings array\n  baseURL: number           // index into strings array\n  contentLanguage: number   // index into strings array\n  encodingName: number      // index into strings array\n  publicId: number\n  systemId: number\n  frameId: number\n  nodes: NodeTreeSnapshot\n  layout: LayoutTreeSnapshot\n  textBoxes: TextBoxSnapshot\n  scrollOffsetX?: number\n  scrollOffsetY?: number\n  contentWidth?: number\n  contentHeight?: number\n}\n\nexport interface NodeTreeSnapshot {\n  parentIndex?: number[]\n  nodeType?: number[]\n  shadowRootType?: { index: number; value: number }\n  nodeName?: number[]\n  nodeValue?: number[]\n  backendNodeId?: number[]\n  attributes?: Array<number[]>   // pairs: [nameIndex, valueIndex]\n  textValue?: { index: number; value: number }\n  inputValue?: { index: number; value: number }\n  inputChecked?: { index: number }\n  optionSelected?: { index: number }\n  contentDocumentIndex?: { index: number; value: number }\n  pseudoType?: { index: number; value: number }\n  pseudoIdentifier?: { index: number; value: number }\n  isClickable?: { index: number }\n  currentSourceURL?: { index: number; value: number }\n  originURL?: { index: number; value: number }\n}\n\nexport interface LayoutTreeSnapshot {\n  nodeIndex: number[]\n  styles: Array<number[]>       // indices into computedStyles strings\n  bounds: Array<number[]>       // [x, y, width, height] per node\n  text: number[]\n  stackingContexts: { index: number }\n  paintOrders?: number[]\n  offsetRects?: Array<number[]>\n  scrollRects?: Array<number[]>\n  clientRects?: Array<number[]>\n  blendedBackgroundColors?: Array<number>\n  textColorOpacities?: Array<number>\n}\n\nexport interface TextBoxSnapshot {\n  layoutIndex: number[]\n  bounds: Array<number[]>\n  start: number[]\n  length: number[]\n}\n\nexport interface CaptureSnapshotResult {\n  documents: DocumentSnapshot[]\n  strings: string[]\n}\n\nexport interface CaptureSnapshotOptions {\n  /** CSS property names to include in computed styles. */\n  computedStyles: string[]\n  /** Include paint order info. */\n  includePaintOrder?: boolean\n  /** Include DOM rects (offsetRects, clientRects, scrollRects). */\n  includeDOMRects?: boolean\n  /** Include blended background colors. */\n  includeBlendedBackgroundColors?: boolean\n  /** Include text color opacities. */\n  includeTextColorOpacities?: boolean\n}\n\nexport class SnapshotDomain {\n  constructor(\n    private conn: CdpConnection,\n    private sessionId?: string,\n  ) {}\n\n  async enable(): Promise<void> {\n    await this.conn.send('DOMSnapshot.enable', {}, this.sessionId)\n  }\n\n  /**\n   * Capture full DOM snapshot — one call gets everything.\n   * Returns flattened arrays with string deduplication.\n   */\n  async captureSnapshot(options: CaptureSnapshotOptions): Promise<CaptureSnapshotResult> {\n    return this.conn.send<CaptureSnapshotResult>(\n      'DOMSnapshot.captureSnapshot',\n      {\n        computedStyles: options.computedStyles,\n        includePaintOrder: options.includePaintOrder,\n        includeDOMRects: options.includeDOMRects,\n        includeBlendedBackgroundColors: options.includeBlendedBackgroundColors,\n        includeTextColorOpacities: options.includeTextColorOpacities,\n      },\n      this.sessionId,\n    )\n  }\n\n  /**\n   * Helper: resolve a string index from the snapshot's strings array.\n   */\n  resolveString(strings: string[], index: number): string {\n    return strings[index] ?? ''\n  }\n\n  /**\n   * Helper: extract computed style values for a layout node.\n   *\n   * CDP format: `styles[nodeIndex]` is an array of string indices.\n   * Each index maps to the value of the corresponding property in the\n   * `computedStyles` parameter you passed to `captureSnapshot`.\n   * The property names are known — they're the strings you requested.\n   *\n   * @param strings The strings array from CaptureSnapshotResult\n   * @param styleIndices The style indices for one layout node (from LayoutTreeSnapshot.styles[n])\n   * @param requestedProperties The computedStyles array you passed to captureSnapshot\n   */\n  resolveStyles(\n    strings: string[],\n    styleIndices: number[],\n    requestedProperties: string[],\n  ): Record<string, string> {\n    const result: Record<string, string> = {}\n    for (let i = 0; i < styleIndices.length && i < requestedProperties.length; i++) {\n      const name = requestedProperties[i]\n      const value = strings[styleIndices[i]]\n      if (name) result[name] = value ?? ''\n    }\n    return result\n  }\n}\n","/**\n * CDP Emulation domain — viewport, device metrics, UA, touch, media features.\n * Used by EngineDriver to make a page render as if it were a specific device\n * BEFORE the first navigate. See ../driver.ts and ../../devices.ts.\n */\n\nimport type { CdpConnection } from './connection.js'\n\nexport interface ViewportConfig {\n  width: number\n  height: number\n  /** Device pixel ratio. Default: 1. */\n  deviceScaleFactor?: number\n  /** True for mobile/tablet layout viewports. Default: false. */\n  mobile?: boolean\n  /** Override User-Agent string. Omit to keep Chrome's default. */\n  userAgent?: string\n  /** Enable touch emulation. Default: derived from `mobile`. */\n  hasTouch?: boolean\n}\n\nexport class EmulationDomain {\n  constructor(\n    private conn: CdpConnection,\n    private sessionId?: string,\n  ) {}\n\n  /**\n   * Override device metrics (viewport size, scale, mobile layout mode).\n   * Does NOT set UA or touch — for a full device emulation, use\n   * `applyDeviceProfile()` instead.\n   */\n  async setDeviceMetrics(config: ViewportConfig): Promise<void> {\n    await this.conn.send('Emulation.setDeviceMetricsOverride', {\n      width: config.width,\n      height: config.height,\n      deviceScaleFactor: config.deviceScaleFactor ?? 1,\n      mobile: config.mobile ?? false,\n    }, this.sessionId)\n  }\n\n  /**\n   * Clear device metrics override (restore defaults).\n   */\n  async clearDeviceMetrics(): Promise<void> {\n    await this.conn.send('Emulation.clearDeviceMetricsOverride', {}, this.sessionId)\n  }\n\n  /**\n   * Override the User-Agent string for subsequent requests. Pages already\n   * loaded keep their original UA; navigate after calling this.\n   */\n  async setUserAgent(userAgent: string): Promise<void> {\n    await this.conn.send('Emulation.setUserAgentOverride', {\n      userAgent,\n    }, this.sessionId)\n  }\n\n  /**\n   * Enable or disable touch event emulation. When enabled, `maxTouchPoints`\n   * defaults to 5 (matches modern phones).\n   */\n  async setTouchEmulation(enabled: boolean, maxTouchPoints = 5): Promise<void> {\n    await this.conn.send('Emulation.setTouchEmulationEnabled', {\n      enabled,\n      maxTouchPoints: enabled ? maxTouchPoints : 1,\n    }, this.sessionId)\n  }\n\n  /**\n   * Apply a full device profile in one call: metrics + UA + touch. Use this\n   * from `EngineDriver.launch()` BEFORE the first navigate so the page sees\n   * the device emulation on its initial request, not after.\n   *\n   * Order matters: UA override first (some sites branch on UA during the\n   * initial HTML response), then metrics, then touch.\n   */\n  async applyDeviceProfile(config: ViewportConfig): Promise<void> {\n    if (config.userAgent) {\n      await this.setUserAgent(config.userAgent)\n    }\n    await this.setDeviceMetrics(config)\n    const wantsTouch = config.hasTouch ?? config.mobile ?? false\n    await this.setTouchEmulation(wantsTouch)\n  }\n\n  /**\n   * Hide scrollbars (useful for consistent screenshots).\n   */\n  async setScrollbarsHidden(hidden: boolean): Promise<void> {\n    await this.conn.send('Emulation.setScrollbarsHidden', { hidden }, this.sessionId)\n  }\n\n  /**\n   * Emulate reduced motion preference (disable animations for screenshots).\n   */\n  async setReducedMotion(enabled: boolean): Promise<void> {\n    await this.conn.send('Emulation.setEmulatedMedia', {\n      features: [{ name: 'prefers-reduced-motion', value: enabled ? 'reduce' : '' }],\n    }, this.sessionId)\n  }\n}\n","/**\n * CDP Network domain — cookie management for auth state.\n * NEW for IBR — replaces Playwright's storageState for auth persistence.\n */\n\nimport type { CdpConnection } from './connection.js'\n\nexport interface Cookie {\n  name: string\n  value: string\n  domain: string\n  path: string\n  expires: number\n  size: number\n  httpOnly: boolean\n  secure: boolean\n  session: boolean\n  sameSite?: 'Strict' | 'Lax' | 'None'\n}\n\nexport interface SetCookieParams {\n  name: string\n  value: string\n  url?: string\n  domain?: string\n  path?: string\n  secure?: boolean\n  httpOnly?: boolean\n  sameSite?: 'Strict' | 'Lax' | 'None'\n  expires?: number\n}\n\nexport class NetworkDomain {\n  constructor(\n    private conn: CdpConnection,\n    private sessionId?: string,\n  ) {}\n\n  async enable(): Promise<void> {\n    await this.conn.send('Network.enable', {}, this.sessionId)\n  }\n\n  /**\n   * Get all cookies, optionally filtered by URLs.\n   */\n  async getCookies(urls?: string[]): Promise<Cookie[]> {\n    const params: Record<string, unknown> = {}\n    if (urls) params.urls = urls\n\n    const result = await this.conn.send<{ cookies: Cookie[] }>(\n      'Network.getCookies', params, this.sessionId,\n    )\n    return result.cookies\n  }\n\n  /**\n   * Set a cookie.\n   */\n  async setCookie(cookie: SetCookieParams): Promise<boolean> {\n    const result = await this.conn.send<{ success: boolean }>(\n      'Network.setCookie', cookie as unknown as Record<string, unknown>, this.sessionId,\n    )\n    return result.success\n  }\n\n  /**\n   * Set multiple cookies at once.\n   */\n  async setCookies(cookies: SetCookieParams[]): Promise<void> {\n    await this.conn.send('Network.setCookies', {\n      cookies: cookies as unknown as Record<string, unknown>[],\n    }, this.sessionId)\n  }\n\n  /**\n   * Clear all browser cookies.\n   */\n  async clearCookies(): Promise<void> {\n    await this.conn.send('Network.clearBrowserCookies', {}, this.sessionId)\n  }\n\n  /**\n   * Delete specific cookies by name and optional URL/domain.\n   */\n  async deleteCookies(params: {\n    name: string\n    url?: string\n    domain?: string\n    path?: string\n  }): Promise<void> {\n    await this.conn.send('Network.deleteCookies', params, this.sessionId)\n  }\n}\n","/**\n * CDP Console capture — subscribe to Runtime.consoleAPICalled events.\n * NEW for IBR — replaces Playwright's page.on('console') for error detection.\n */\n\nimport type { CdpConnection } from './connection.js'\n\nexport type ConsoleLevel = 'log' | 'debug' | 'info' | 'error' | 'warning' | 'dir'\n  | 'dirxml' | 'table' | 'trace' | 'clear' | 'startGroup' | 'startGroupCollapsed'\n  | 'endGroup' | 'assert' | 'profile' | 'profileEnd' | 'count' | 'timeEnd'\n\nexport interface ConsoleMessage {\n  type: ConsoleLevel\n  text: string\n  url?: string\n  lineNumber?: number\n  timestamp: number\n}\n\ntype ConsoleHandler = (message: ConsoleMessage) => void\n\nexport class ConsoleDomain {\n  private handlers = new Set<ConsoleHandler>()\n  private messages: ConsoleMessage[] = []\n  private enabled = false\n\n  constructor(\n    private conn: CdpConnection,\n    private sessionId?: string,\n  ) {}\n\n  /**\n   * Enable console capture.\n   * Must call Runtime.enable first to receive consoleAPICalled events.\n   */\n  async enable(): Promise<void> {\n    if (this.enabled) return\n    this.enabled = true\n\n    // Runtime.enable must be called to receive consoleAPICalled events\n    await this.conn.send('Runtime.enable', {}, this.sessionId)\n\n    this.conn.on('Runtime.consoleAPICalled', (params: unknown) => {\n      const data = params as {\n        type: ConsoleLevel\n        args: Array<{ type: string; value?: unknown; description?: string }>\n        timestamp: number\n        stackTrace?: { callFrames: Array<{ url: string; lineNumber: number }> }\n      }\n\n      const text = data.args\n        .map((arg) => arg.value !== undefined ? String(arg.value) : (arg.description ?? ''))\n        .join(' ')\n\n      const frame = data.stackTrace?.callFrames[0]\n\n      const message: ConsoleMessage = {\n        type: data.type,\n        text,\n        url: frame?.url,\n        lineNumber: frame?.lineNumber,\n        timestamp: data.timestamp,\n      }\n\n      this.messages.push(message)\n\n      for (const handler of this.handlers) {\n        handler(message)\n      }\n    })\n  }\n\n  /** Subscribe to console messages. */\n  onMessage(handler: ConsoleHandler): void {\n    this.handlers.add(handler)\n  }\n\n  offMessage(handler: ConsoleHandler): void {\n    this.handlers.delete(handler)\n  }\n\n  /** Get all captured messages. */\n  getMessages(): ConsoleMessage[] {\n    return [...this.messages]\n  }\n\n  /** Get only errors and warnings. */\n  getErrors(): ConsoleMessage[] {\n    return this.messages.filter((m) => m.type === 'error' || m.type === 'warning')\n  }\n\n  /** Clear captured messages. */\n  clear(): void {\n    this.messages = []\n  }\n}\n","/**\n * Wait strategies — event-driven + polling hybrid.\n * Forked from Spectra — extended with event-driven waits and MutationObserver.\n */\n\nimport type { Element } from '../types.js'\nimport type { CdpConnection } from './connection.js'\n\ntype EvaluateFn = (expression: string) => Promise<unknown>\n\nexport interface WaitOptions {\n  interval?: number     // Polling interval in ms (default: 100)\n  stableTime?: number   // How long fingerprint must stay unchanged (default: 300)\n  timeout?: number      // Max wait time in ms (default: 10000)\n}\n\ntype SnapshotFn = () => Promise<Element[]>\n\nexport function buildFingerprint(elements: Element[]): string {\n  return elements\n    .filter((e) => e.actions.length > 0)\n    .map((e) => `${e.role}:${e.label}:${e.enabled}`)\n    .sort()\n    .join('|')\n}\n\n/**\n * Poll-based stability detection (from Spectra).\n * Waits until AX tree fingerprint stops changing.\n */\nexport async function waitForStableTree(\n  getSnapshot: SnapshotFn,\n  options?: WaitOptions,\n): Promise<{ elements: Element[]; timedOut: boolean }> {\n  const interval = options?.interval ?? 100\n  const stableTime = options?.stableTime ?? 300\n  const timeout = options?.timeout ?? 10000\n\n  let lastFingerprint = ''\n  let stableSince = Date.now()\n  const deadline = Date.now() + timeout\n\n  while (Date.now() < deadline) {\n    const elements = await getSnapshot()\n    const fingerprint = buildFingerprint(elements)\n\n    if (fingerprint === lastFingerprint) {\n      if (Date.now() - stableSince >= stableTime) {\n        return { elements, timedOut: false }\n      }\n    } else {\n      lastFingerprint = fingerprint\n      stableSince = Date.now()\n    }\n\n    await new Promise((r) => setTimeout(r, interval))\n  }\n\n  const elements = await getSnapshot()\n  return { elements, timedOut: true }\n}\n\n/**\n * Event-driven wait — listens to CDP events and resolves when condition is met.\n * Combines event notification (coarse: something changed) with\n * fingerprint stability check (fine: it stopped changing).\n */\nexport async function waitForEvent(\n  conn: CdpConnection,\n  eventName: string,\n  options?: { timeout?: number },\n): Promise<void> {\n  const timeout = options?.timeout ?? 10000\n\n  return new Promise<void>((resolve, reject) => {\n    const timer = setTimeout(() => {\n      conn.off(eventName, handler)\n      reject(new Error(`Timed out waiting for ${eventName} after ${timeout}ms`))\n    }, timeout)\n\n    const handler = () => {\n      clearTimeout(timer)\n      conn.off(eventName, handler)\n      resolve()\n    }\n\n    conn.on(eventName, handler)\n  })\n}\n\n/**\n * Wait for React/SPA hydration to complete.\n *\n * Strategy: after networkidle, poll the AX tree until the interactive element\n * fingerprint stays stable for a minimum duration. This catches SPAs that\n * mount, hydrate, and then render interactive elements after DOMContentLoaded.\n *\n * Also detects hydration markers when available:\n *  - window.__NEXT_DATA__ presence (Next.js)\n *  - React DevTools hook (__REACT_DEVTOOLS_GLOBAL_HOOK__)\n *  - document.readyState === 'complete'\n *\n * Use after waitForLoadState('networkidle'), before extracting elements.\n *\n * The conn parameter is accepted for interface consistency but is not used\n * in the polling path — callers that cannot provide a CdpConnection may pass\n * null and the function will fall back to pure AX-tree polling.\n */\nexport async function waitForHydration(\n  _conn: CdpConnection | null,\n  getSnapshot: SnapshotFn,\n  evaluate: EvaluateFn,\n  options?: WaitOptions & {\n    /** Minimum interactive elements required before considering the page hydrated (default: 1) */\n    minElements?: number;\n    /** Extra wait after detected stability to absorb async handlers (default: 200ms) */\n    settleTime?: number;\n  },\n): Promise<{ elements: Element[]; timedOut: boolean; hydrationDetected: boolean; reason: string }> {\n  const timeout = options?.timeout ?? 10000\n  const stableTime = options?.stableTime ?? 500\n  const minElements = options?.minElements ?? 1\n  const settleTime = options?.settleTime ?? 200\n  const deadline = Date.now() + timeout\n\n  // Fast path: detect hydration markers via evaluate\n  let hydrationDetected = false\n  let reason = 'timeout'\n  try {\n    const marker = await evaluate(`(function(){\n      if (document.readyState !== 'complete') return null;\n      if (typeof window === 'undefined') return null;\n      var hasNext = typeof window.__NEXT_DATA__ !== 'undefined';\n      var hasReact = typeof window.__REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined';\n      var rootHydrated = false;\n      try {\n        var root = document.querySelector('#__next, #root, [data-reactroot]');\n        rootHydrated = !!root && root.children.length > 0;\n      } catch(e) {}\n      return { hasNext: hasNext, hasReact: hasReact, rootHydrated: rootHydrated };\n    })()`)\n    if (marker && typeof marker === 'object') {\n      const m = marker as { hasNext?: boolean; hasReact?: boolean; rootHydrated?: boolean }\n      if (m.rootHydrated) {\n        hydrationDetected = true\n        reason = m.hasNext ? 'nextjs-marker' : m.hasReact ? 'react-marker' : 'root-populated'\n      }\n    }\n  } catch {\n    // Evaluate failed — fall through to polling\n  }\n\n  // Poll for AX tree stability + minElement threshold\n  let lastFingerprint = ''\n  let stableSince = Date.now()\n  let lastElements: Element[] = []\n\n  while (Date.now() < deadline) {\n    const elements = await getSnapshot()\n    lastElements = elements\n    const fingerprint = buildFingerprint(elements)\n    const hasEnough = elements.filter((e) => e.actions.length > 0).length >= minElements\n\n    if (fingerprint === lastFingerprint && hasEnough) {\n      if (Date.now() - stableSince >= stableTime) {\n        if (settleTime > 0) {\n          await new Promise((r) => setTimeout(r, settleTime))\n        }\n        const finalElements = await getSnapshot()\n        return {\n          elements: finalElements,\n          timedOut: false,\n          hydrationDetected: true,\n          reason: hydrationDetected ? reason : 'ax-tree-stable',\n        }\n      }\n    } else {\n      lastFingerprint = fingerprint\n      stableSince = Date.now()\n    }\n\n    await new Promise((r) => setTimeout(r, 100))\n  }\n\n  return {\n    elements: lastElements,\n    timedOut: true,\n    hydrationDetected: false,\n    reason: 'timeout',\n  }\n}\n\n/**\n * Hybrid wait — subscribe to AX events, then confirm with stability check.\n * Best of both: events for notification, polling for confirmation.\n */\nexport async function waitForStable(\n  conn: CdpConnection,\n  getSnapshot: SnapshotFn,\n  options?: WaitOptions & { eventName?: string },\n): Promise<{ elements: Element[]; timedOut: boolean }> {\n  const eventName = options?.eventName ?? 'Accessibility.nodesUpdated'\n  const timeout = options?.timeout ?? 10000\n  const stableTime = options?.stableTime ?? 300\n  const deadline = Date.now() + timeout\n\n  // Register event listener BEFORE first snapshot to avoid missing events\n  let changed = false\n  const handler = () => { changed = true }\n  conn.on(eventName, handler)\n\n  // Take initial snapshot (events during this await are captured by handler)\n  let elements = await getSnapshot()\n  let lastFingerprint = buildFingerprint(elements)\n  let stableSince = Date.now()\n\n  try {\n    while (Date.now() < deadline) {\n      if (changed) {\n        changed = false\n        elements = await getSnapshot()\n        const fingerprint = buildFingerprint(elements)\n        if (fingerprint !== lastFingerprint) {\n          lastFingerprint = fingerprint\n          stableSince = Date.now()\n        }\n      }\n\n      if (Date.now() - stableSince >= stableTime) {\n        return { elements, timedOut: false }\n      }\n\n      await new Promise((r) => setTimeout(r, 50))\n    }\n\n    elements = await getSnapshot()\n    return { elements, timedOut: true }\n  } finally {\n    conn.off(eventName, handler)\n  }\n}\n","/**\n * Compact serialization of AX tree data for LLM context windows.\n * Forked from Spectra.\n */\n\nimport type { Element, Snapshot } from './types.js'\n\nexport function serializeSnapshot(snapshot: Snapshot): string {\n  const target = snapshot.url ?? snapshot.appName ?? 'unknown'\n  const lines: string[] = [\n    `# Page: ${target}`,\n    `# Platform: ${snapshot.platform} | Elements: ${snapshot.elements.length}`,\n    '',\n  ]\n  for (const el of snapshot.elements) {\n    lines.push(serializeElement(el))\n  }\n  return lines.join('\\n')\n}\n\nexport function serializeElement(el: Element): string {\n  let line = `[${el.id}] ${el.role} \"${el.label}\"`\n  const props: string[] = []\n\n  if (el.role === 'textfield') {\n    if (el.value !== null && el.value !== '') {\n      props.push(`value=\"${el.value}\"`)\n    } else {\n      props.push('empty')\n    }\n  } else if (el.value !== null && el.value !== '') {\n    props.push(`value=\"${el.value}\"`)\n  }\n\n  if (el.focused) props.push('focused')\n\n  if (el.role === 'button') {\n    props.push(el.enabled ? 'enabled' : 'disabled')\n  }\n\n  if (props.length > 0) line += ' ' + props.join(', ')\n  return line\n}\n","/**\n * Observe — preview what actions are possible without executing.\n * Inspired by Stagehand's observe() primitive.\n *\n * Returns serializable action descriptors that can be logged, cached,\n * or passed back to act() for execution.\n */\n\nimport type { Element } from './types.js'\nimport { serializeElement } from './serialize.js'\n\nexport interface ActionDescriptor {\n  /** Element ID for act() */\n  elementId: string\n  /** Human-readable description */\n  description: string\n  /** Available actions */\n  actions: string[]\n  /** Element role */\n  role: string\n  /** Element label */\n  label: string\n  /** Compact serialized form */\n  serialized: string\n}\n\nexport interface ObserveOptions {\n  /** Only include elements matching this intent */\n  intent?: string\n  /** Filter by role */\n  role?: string\n  /** Max results */\n  limit?: number\n}\n\n/**\n * Observe the current page — return what actions are possible.\n * Does NOT execute anything. Returns descriptors for act().\n */\nexport function observe(\n  elements: Element[],\n  options: ObserveOptions = {},\n): ActionDescriptor[] {\n  let filtered = elements.filter((e) => e.actions.length > 0)\n\n  // Filter by role if specified\n  if (options.role) {\n    const role = options.role.toLowerCase()\n    filtered = filtered.filter((e) => e.role === role)\n  }\n\n  // Filter by intent if specified (simple word matching)\n  if (options.intent) {\n    const words = options.intent.toLowerCase().split(/\\s+/).filter((w) => w.length > 2)\n    if (words.length > 0) {\n      filtered = filtered.filter((e) => {\n        const labelLower = e.label.toLowerCase()\n        return words.some((w) => labelLower.includes(w))\n      })\n    }\n  }\n\n  // Map to action descriptors\n  const descriptors = filtered.map((el): ActionDescriptor => ({\n    elementId: el.id,\n    description: describeAction(el),\n    actions: el.actions,\n    role: el.role,\n    label: el.label,\n    serialized: serializeElement(el),\n  }))\n\n  if (options.limit && descriptors.length > options.limit) {\n    return descriptors.slice(0, options.limit)\n  }\n\n  return descriptors\n}\n\nfunction describeAction(el: Element): string {\n  const actionVerb = el.actions[0] === 'press' ? 'Click' :\n    el.actions[0] === 'setValue' ? 'Type into' :\n    el.actions[0] === 'showMenu' ? 'Open' : 'Interact with'\n  const state = el.enabled ? '' : ' (disabled)'\n  return `${actionVerb} ${el.role} \"${el.label}\"${state}`\n}\n","/**\n * Extract — pull structured data from the page using schemas.\n * Inspired by Stagehand's extract() with Zod-like output typing.\n *\n * Unlike Stagehand (which uses an LLM to extract), this uses\n * CDP DOM queries + AX tree to extract data deterministically.\n * Claude interprets the result — we just provide structured data.\n */\n\nimport type { Element } from './types.js'\n\n// ─── Extraction Types ───────────────────────────────────────\n\nexport interface ExtractField {\n  /** CSS selector to find the element */\n  selector?: string\n  /** AX role to match */\n  role?: string\n  /** AX label pattern (substring match) */\n  label?: string\n  /** What to extract: 'text' | 'value' | 'attribute' | 'html' */\n  extract: 'text' | 'value' | 'attribute' | 'html' | 'exists'\n  /** Attribute name (when extract === 'attribute') */\n  attribute?: string\n}\n\nexport interface ExtractSchema {\n  [fieldName: string]: ExtractField\n}\n\nexport interface ExtractResult {\n  [fieldName: string]: string | boolean | null\n}\n\n// ─── AX-based extraction ────────────────────────────────────\n\n/**\n * Extract data from the AX tree based on a schema.\n * No DOM queries needed — works entirely from the accessibility tree.\n */\nexport function extractFromAXTree(\n  elements: Element[],\n  schema: ExtractSchema,\n): ExtractResult {\n  const result: ExtractResult = {}\n\n  for (const [fieldName, field] of Object.entries(schema)) {\n    const match = findMatchingElement(elements, field)\n\n    if (!match) {\n      result[fieldName] = field.extract === 'exists' ? false : null\n      continue\n    }\n\n    switch (field.extract) {\n      case 'text':\n        result[fieldName] = match.label || match.value || null\n        break\n      case 'value':\n        result[fieldName] = match.value || null\n        break\n      case 'exists':\n        result[fieldName] = true\n        break\n      default:\n        // 'attribute' and 'html' require DOM queries — return null from AX\n        result[fieldName] = null\n    }\n  }\n\n  return result\n}\n\n/**\n * Extract a list of items from repeated AX tree patterns.\n * Useful for tables, lists, cards — any repeated structure.\n */\nexport function extractList(\n  elements: Element[],\n  options: {\n    role?: string\n    labelPattern?: RegExp\n    maxItems?: number\n  },\n): Array<{ label: string; value: string | null; id: string }> {\n  let filtered = elements\n\n  if (options.role) {\n    filtered = filtered.filter((e) => e.role === options.role)\n  }\n\n  if (options.labelPattern) {\n    filtered = filtered.filter((e) => options.labelPattern!.test(e.label))\n  }\n\n  const items = filtered.map((e) => ({\n    label: e.label,\n    value: e.value,\n    id: e.id,\n  }))\n\n  if (options.maxItems) {\n    return items.slice(0, options.maxItems)\n  }\n\n  return items\n}\n\n/**\n * Extract page-level metadata from the AX tree.\n */\nexport function extractPageMeta(elements: Element[]): {\n  headings: string[]\n  links: Array<{ label: string; id: string }>\n  inputs: Array<{ label: string; value: string | null; id: string }>\n  buttons: Array<{ label: string; enabled: boolean; id: string }>\n} {\n  return {\n    headings: elements\n      .filter((e) => e.role === 'heading')\n      .map((e) => e.label),\n    links: elements\n      .filter((e) => e.role === 'link')\n      .map((e) => ({ label: e.label, id: e.id })),\n    inputs: elements\n      .filter((e) => e.role === 'textfield')\n      .map((e) => ({ label: e.label, value: e.value, id: e.id })),\n    buttons: elements\n      .filter((e) => e.role === 'button')\n      .map((e) => ({ label: e.label, enabled: e.enabled, id: e.id })),\n  }\n}\n\n// ─── Helpers ────────────────────────────────────────────────\n\nfunction findMatchingElement(elements: Element[], field: ExtractField): Element | null {\n  for (const el of elements) {\n    if (field.role && el.role !== field.role) continue\n    if (field.label) {\n      if (!el.label.toLowerCase().includes(field.label.toLowerCase())) continue\n    }\n    return el\n  }\n  return null\n}\n","/**\n * Resolution cache — auto-caching for intent → element mappings.\n * Inspired by Stagehand's selector auto-caching.\n *\n * When an intent resolves to an element, cache the mapping.\n * Next time the same intent appears, replay the cached resolution\n * without re-querying the AX tree. If replay fails (element gone),\n * re-resolve and update the cache.\n *\n * Stagehand reports 3-5x speed improvement from caching.\n */\n\nexport interface CachedResolution {\n  /** The original intent string */\n  intent: string\n  /** Matched element's backendDOMNodeId-based ID */\n  elementId: string\n  /** Role of the matched element */\n  role: string\n  /** Label of the matched element */\n  label: string\n  /** Confidence of the original resolution */\n  confidence: number\n  /** When this cache entry was created */\n  createdAt: number\n  /** Number of successful cache hits */\n  hits: number\n  /** Last successful hit time */\n  lastHit: number\n}\n\nexport interface CacheOptions {\n  /** Max cache entries (default: 100) */\n  maxEntries?: number\n  /** Cache entry TTL in ms (default: 5 minutes) */\n  ttl?: number\n  /** Minimum confidence to cache (default: 0.7) */\n  minConfidence?: number\n}\n\nexport class ResolutionCache {\n  private cache = new Map<string, CachedResolution>()\n  private maxEntries: number\n  private ttl: number\n  private minConfidence: number\n\n  constructor(options: CacheOptions = {}) {\n    this.maxEntries = options.maxEntries ?? 100\n    this.ttl = options.ttl ?? 5 * 60 * 1000 // 5 minutes\n    this.minConfidence = options.minConfidence ?? 0.7\n  }\n\n  /**\n   * Look up a cached resolution for an intent.\n   * Returns the cached elementId if found and not expired, null otherwise.\n   */\n  get(intent: string): CachedResolution | null {\n    const key = this.normalizeKey(intent)\n    const entry = this.cache.get(key)\n\n    if (!entry) return null\n\n    // Check TTL\n    if (Date.now() - entry.createdAt > this.ttl) {\n      this.cache.delete(key)\n      return null\n    }\n\n    // Record hit\n    entry.hits++\n    entry.lastHit = Date.now()\n    return entry\n  }\n\n  /**\n   * Cache a successful resolution.\n   * Only caches if confidence meets threshold.\n   */\n  set(\n    intent: string,\n    elementId: string,\n    metadata: { role: string; label: string; confidence: number },\n  ): void {\n    if (metadata.confidence < this.minConfidence) return\n\n    const key = this.normalizeKey(intent)\n\n    // Evict oldest entries if at capacity\n    if (this.cache.size >= this.maxEntries && !this.cache.has(key)) {\n      this.evictOldest()\n    }\n\n    this.cache.set(key, {\n      intent,\n      elementId,\n      role: metadata.role,\n      label: metadata.label,\n      confidence: metadata.confidence,\n      createdAt: Date.now(),\n      hits: 0,\n      lastHit: 0,\n    })\n  }\n\n  /**\n   * Invalidate a specific cache entry (e.g., when element is gone).\n   */\n  invalidate(intent: string): void {\n    this.cache.delete(this.normalizeKey(intent))\n  }\n\n  /**\n   * Clear all cache entries (e.g., after navigation).\n   */\n  clear(): void {\n    this.cache.clear()\n  }\n\n  /**\n   * Get cache statistics.\n   */\n  stats(): {\n    entries: number\n    totalHits: number\n    avgConfidence: number\n  } {\n    let totalHits = 0\n    let totalConfidence = 0\n\n    for (const entry of this.cache.values()) {\n      totalHits += entry.hits\n      totalConfidence += entry.confidence\n    }\n\n    return {\n      entries: this.cache.size,\n      totalHits,\n      avgConfidence: this.cache.size > 0 ? totalConfidence / this.cache.size : 0,\n    }\n  }\n\n  private normalizeKey(intent: string): string {\n    return intent.toLowerCase().trim()\n  }\n\n  private evictOldest(): void {\n    let oldest: string | null = null\n    let oldestTime = Infinity\n\n    for (const [key, entry] of this.cache) {\n      const lastUsed = entry.lastHit || entry.createdAt\n      if (lastUsed < oldestTime) {\n        oldestTime = lastUsed\n        oldest = key\n      }\n    }\n\n    if (oldest) this.cache.delete(oldest)\n  }\n}\n","/**\n * Adaptive modality — Understanding Score calculator.\n * Inspired by V-GEMS (arxiv 2603.02626).\n *\n * Scores how well the AX tree captures the page's content.\n * High score → use AX tree only (fast, cheap).\n * Low score → include screenshot (accurate, expensive).\n *\n * Dimensions:\n * 1. Text Quality — do elements have meaningful labels?\n * 2. Semantic Relevance — are interactive elements well-labeled?\n * 3. Structural Clarity — is the AX tree well-organized?\n * 4. Special Case Penalties — known problematic patterns\n */\n\nimport type { Element } from './types.js'\n\nexport interface UnderstandingScore {\n  /** Overall score 0-1. Below threshold → include screenshot. */\n  score: number\n  /** Whether a screenshot is recommended */\n  needsScreenshot: boolean\n  /** Breakdown of individual dimension scores */\n  dimensions: {\n    textQuality: number\n    semanticRelevance: number\n    structuralClarity: number\n    specialCasePenalty: number\n  }\n  /** Human-readable reasoning */\n  reasoning: string\n}\n\nexport interface ModalityOptions {\n  /** Score threshold below which screenshot is recommended (default: 0.6) */\n  threshold?: number\n}\n\n/**\n * Assess how well the AX tree captures the page content.\n * Returns a score and recommendation for whether to include a screenshot.\n */\nexport function assessUnderstanding(\n  elements: Element[],\n  options: ModalityOptions = {},\n): UnderstandingScore {\n  const threshold = options.threshold ?? 0.6\n\n  if (elements.length === 0) {\n    return {\n      score: 0,\n      needsScreenshot: true,\n      dimensions: { textQuality: 0, semanticRelevance: 0, structuralClarity: 0, specialCasePenalty: 0 },\n      reasoning: 'Empty AX tree — screenshot required for any understanding',\n    }\n  }\n\n  const textQuality = scoreTextQuality(elements)\n  const semanticRelevance = scoreSemanticRelevance(elements)\n  const structuralClarity = scoreStructuralClarity(elements)\n  const specialCasePenalty = scoreSpecialCases(elements)\n\n  // Weighted combination\n  const raw = textQuality * 0.35 + semanticRelevance * 0.30 + structuralClarity * 0.20\n  const score = Math.max(0, Math.min(1, raw - specialCasePenalty))\n\n  const needsScreenshot = score < threshold\n  const reasoning = buildReasoning(score, threshold, { textQuality, semanticRelevance, structuralClarity, specialCasePenalty })\n\n  return {\n    score,\n    needsScreenshot,\n    dimensions: { textQuality, semanticRelevance, structuralClarity, specialCasePenalty },\n    reasoning,\n  }\n}\n\n// ─── Dimension Scorers ──────────────────────────────────────\n\n/**\n * Text Quality: What fraction of elements have meaningful labels?\n * Empty labels, single-character labels, and generic labels reduce quality.\n */\nfunction scoreTextQuality(elements: Element[]): number {\n  if (elements.length === 0) return 0\n\n  let labeled = 0\n  let meaningful = 0\n\n  for (const el of elements) {\n    if (el.label) {\n      labeled++\n      // Is the label meaningful? (not just punctuation, not too short)\n      if (el.label.length > 1 && /[a-zA-Z]/.test(el.label)) {\n        meaningful++\n      }\n    }\n  }\n\n  const labelRatio = labeled / elements.length\n  const meaningfulRatio = elements.length > 0 ? meaningful / elements.length : 0\n\n  return labelRatio * 0.4 + meaningfulRatio * 0.6\n}\n\n/**\n * Semantic Relevance: Are interactive elements well-labeled?\n * Interactive elements with good labels = high relevance.\n * Interactive elements without labels = dangerous for automation.\n */\nfunction scoreSemanticRelevance(elements: Element[]): number {\n  const interactive = elements.filter((e) => e.actions.length > 0)\n  if (interactive.length === 0) return 0.5 // No interactable elements — neutral\n\n  let wellLabeled = 0\n  for (const el of interactive) {\n    if (el.label && el.label.length > 1) {\n      wellLabeled++\n    }\n  }\n\n  return wellLabeled / interactive.length\n}\n\n/**\n * Structural Clarity: Is the AX tree well-organized?\n * Good structure: mix of roles, reasonable element count.\n * Bad structure: all same role, too few or too many elements.\n */\nfunction scoreStructuralClarity(elements: Element[]): number {\n  // Role diversity: more unique roles = better structure\n  const roles = new Set(elements.map((e) => e.role))\n  const roleDiversity = Math.min(1, roles.size / 5) // Expect at least 5 distinct roles\n\n  // Element count: too few (< 3) or too many (> 500) are suspicious\n  const count = elements.length\n  let countScore: number\n  if (count < 3) {\n    countScore = count / 3\n  } else if (count > 500) {\n    countScore = Math.max(0.3, 1 - (count - 500) / 2000)\n  } else {\n    countScore = 1.0\n  }\n\n  return roleDiversity * 0.5 + countScore * 0.5\n}\n\n/**\n * Special Case Penalties: known patterns where AX tree is unreliable.\n * Returns a penalty value (0 = no penalty, higher = worse).\n */\nfunction scoreSpecialCases(elements: Element[]): number {\n  let penalty = 0\n\n  // All elements have the same role (probably Canvas or custom rendering)\n  const roles = new Set(elements.map((e) => e.role))\n  if (roles.size === 1 && elements.length > 5) {\n    penalty += 0.3\n  }\n\n  // Very few elements relative to page complexity (probably Canvas/WebGL)\n  if (elements.length < 3) {\n    penalty += 0.2\n  }\n\n  // Many unlabeled interactive elements (bad accessibility)\n  const interactive = elements.filter((e) => e.actions.length > 0)\n  const unlabeled = interactive.filter((e) => !e.label || e.label.length <= 1)\n  if (interactive.length > 0 && unlabeled.length / interactive.length > 0.5) {\n    penalty += 0.2\n  }\n\n  return Math.min(0.8, penalty) // Cap penalty at 0.8\n}\n\n// ─── Reasoning ──────────────────────────────────────────────\n\nfunction buildReasoning(\n  score: number,\n  threshold: number,\n  dims: { textQuality: number; semanticRelevance: number; structuralClarity: number; specialCasePenalty: number },\n): string {\n  const parts: string[] = []\n\n  if (dims.textQuality < 0.4) parts.push('low text quality (many unlabeled elements)')\n  if (dims.semanticRelevance < 0.5) parts.push('poor semantic relevance (interactive elements lack labels)')\n  if (dims.structuralClarity < 0.4) parts.push('weak structure (low role diversity)')\n  if (dims.specialCasePenalty > 0.1) parts.push('special case detected (possible Canvas/custom rendering)')\n\n  if (parts.length === 0) {\n    return score >= threshold\n      ? 'AX tree provides sufficient understanding — screenshot not needed'\n      : 'AX tree quality is borderline — screenshot recommended for accuracy'\n  }\n\n  const action = score >= threshold ? 'AX tree usable despite' : 'Screenshot recommended due to'\n  return `${action}: ${parts.join(', ')}`\n}\n","/**\n * Shadow DOM piercing helpers — extract elements inside open shadow roots\n * that Accessibility.getFullAXTree may miss.\n */\n\nimport type { RuntimeDomain } from './cdp/runtime.js'\n\nexport interface ShadowElement {\n  tagName: string\n  role: string | null\n  label: string | null\n  textContent: string | null\n  bounds: { x: number; y: number; width: number; height: number } | null\n}\n\n/**\n * Find elements inside shadow DOMs that the AX tree may miss.\n * Uses Runtime.evaluate to traverse open shadow roots.\n *\n * Only descends into *open* shadow roots (closed roots are inaccessible by\n * design). Returns a flat list of every element found inside any shadow DOM\n * on the page.\n */\nexport async function extractShadowElements(runtime: RuntimeDomain): Promise<ShadowElement[]> {\n  const result = await runtime.evaluate(`\n    (function() {\n      const found = [];\n\n      function walk(root) {\n        const children = root.querySelectorAll ? Array.from(root.querySelectorAll('*')) : [];\n        for (const el of children) {\n          // Descend into open shadow roots\n          if (el.shadowRoot) {\n            const shadowChildren = Array.from(el.shadowRoot.querySelectorAll('*'));\n            for (const shadowEl of shadowChildren) {\n              const rect = shadowEl.getBoundingClientRect();\n              found.push({\n                tagName: shadowEl.tagName.toLowerCase(),\n                role: shadowEl.getAttribute('role'),\n                label: shadowEl.getAttribute('aria-label') || shadowEl.getAttribute('aria-labelledby'),\n                textContent: (shadowEl.textContent || '').trim().slice(0, 200) || null,\n                bounds: rect.width > 0 || rect.height > 0\n                  ? { x: rect.x, y: rect.y, width: rect.width, height: rect.height }\n                  : null,\n              });\n              // Recurse into nested shadow roots\n              if (shadowEl.shadowRoot) {\n                walk(shadowEl.shadowRoot);\n              }\n            }\n          }\n        }\n      }\n\n      walk(document);\n      return found;\n    })()\n  `)\n\n  if (!Array.isArray(result)) return []\n\n  return (result as Array<Record<string, unknown>>).map((item) => ({\n    tagName: String(item.tagName ?? 'unknown'),\n    role: item.role != null ? String(item.role) : null,\n    label: item.label != null ? String(item.label) : null,\n    textContent: item.textContent != null ? String(item.textContent) : null,\n    bounds: item.bounds != null\n      ? item.bounds as { x: number; y: number; width: number; height: number }\n      : null,\n  }))\n}\n","/**\n * 3-tier element resolution: queryAXTree → Jaro-Winkler → vision fallback.\n * Forked from Spectra — extended with queryAXTree-first tier.\n */\n\nimport type { Element, ResolveOptions, ResolveResult } from './types.js'\n\nexport function resolve(options: ResolveOptions): ResolveResult {\n  if (options.mode === 'algorithmic') {\n    return resolveAlgorithmic(options)\n  }\n\n  const { intent, elements } = options\n\n  if (elements.length === 0) {\n    return { element: null, confidence: 0, candidates: [] }\n  }\n\n  const intentLower = intent.toLowerCase()\n  const scored = scoreElements(elements, intentLower)\n\n  if (scored.length === 0) {\n    return {\n      element: elements[0],\n      confidence: 0,\n      candidates: elements.filter((e) => e.actions.length > 0),\n      visionFallback: options.mode === 'claude',\n    }\n  }\n\n  const best = scored[0]\n\n  if (best.score >= 1.0 || (scored.length === 1 && best.score >= 0.5)) {\n    return {\n      element: best.element,\n      confidence: best.score,\n    }\n  }\n\n  const threshold = best.score * 0.8\n  const candidates = scored.filter((s) => s.score >= threshold).map((s) => s.element)\n\n  const result: ResolveResult = {\n    element: best.element,\n    confidence: best.score,\n    candidates: candidates.length > 1 ? candidates : undefined,\n  }\n\n  if (best.score < 0.3 && options.mode === 'claude') {\n    result.visionFallback = true\n  }\n\n  return result\n}\n\n// ─── Claude Mode Scoring ───────────────────────────────────\n\ninterface ScoredElement {\n  element: Element\n  score: number\n}\n\nfunction scoreElements(elements: Element[], intentLower: string): ScoredElement[] {\n  const scored: ScoredElement[] = []\n\n  for (const el of elements) {\n    const labelLower = el.label.toLowerCase()\n    let score = 0\n\n    if (labelLower.length === 0) continue\n\n    const escapedLabel = escapeRegex(labelLower)\n    const labelRegex = new RegExp(`\\\\b${escapedLabel}\\\\b`, 'i')\n\n    if (labelRegex.test(intentLower)) {\n      const labelWords = labelLower.trim().split(/\\s+/)\n\n      if (labelWords.length > 1) {\n        score = 1.0\n      } else {\n        const intentWords = intentLower.split(/\\s+/)\n        const exactWordMatch = intentWords.includes(labelLower)\n\n        if (exactWordMatch && labelWords[0].length > 1) {\n          score = 0.5\n        }\n      }\n    } else {\n      const intentWords = intentLower.split(/\\s+/)\n      const matchedWords = intentWords.filter(\n        (w) => w.length > 2 && labelLower.includes(w),\n      )\n      if (matchedWords.length > 0) {\n        score = 0.5\n      }\n    }\n\n    if (intentLower.includes(el.role)) {\n      score = Math.min(score + 0.2, 1.0)\n    }\n\n    if (el.actions.length === 0 && score > 0) {\n      score *= 0.5\n    }\n\n    if (score > 0) {\n      scored.push({ element: el, score })\n    }\n  }\n\n  return scored.sort((a, b) => b.score - a.score)\n}\n\nfunction escapeRegex(str: string): string {\n  return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\n// ─── Algorithmic Mode ──────────────────────────────────────\n\nfunction resolveAlgorithmic(options: ResolveOptions): ResolveResult {\n  const { intent, elements } = options\n\n  if (elements.length === 0) {\n    return { element: null, confidence: 0, candidates: [] }\n  }\n\n  const intentLower = intent.toLowerCase()\n  const hints = parseSpatialHints(intentLower)\n  const cleanedIntent = cleanIntent(intentLower)\n\n  const scored: ScoredElement[] = []\n\n  for (let i = 0; i < elements.length; i++) {\n    const el = elements[i]\n    let score = 0\n\n    const roleScore = scoreRole(cleanedIntent, el.role)\n    const intentIsOnlyRole = cleanedIntent.trim() === el.role.toLowerCase()\n        || cleanedIntent.trim().split(/\\s+/).every((w) => scoreRole(w, el.role) > 0)\n    const labelScore = intentIsOnlyRole ? 0 : scoreLabelSimilarity(cleanedIntent, el.label)\n    const spatialScore = scoreSpatial(hints, el, i, elements)\n\n    score = roleScore * 0.3 + labelScore * 0.5 + spatialScore * 0.2\n\n    if (labelScore >= 0.99) {\n      score = Math.max(score, 0.75)\n    }\n\n    if (score > 0) {\n      scored.push({ element: el, score })\n    }\n  }\n\n  scored.sort((a, b) => b.score - a.score)\n\n  if (scored.length === 0) {\n    return { element: elements[0], confidence: 0, candidates: [] }\n  }\n\n  const best = scored[0]\n\n  if (best.score >= 0.7) {\n    return {\n      element: best.element,\n      confidence: best.score,\n    }\n  }\n\n  return {\n    element: best.element,\n    confidence: best.score,\n    candidates: scored.map((s) => s.element),\n  }\n}\n\nfunction scoreRole(intent: string, role: string): number {\n  const roleLower = role.toLowerCase()\n  const intentWords = intent.split(/\\s+/)\n  for (const word of intentWords) {\n    if (word === roleLower) return 1.0\n    if (word === 'btn' && roleLower === 'button') return 0.8\n    if (word === 'input' && roleLower === 'textfield') return 0.8\n    if (word === 'text' && roleLower === 'textfield') return 0.6\n  }\n  return 0\n}\n\nfunction scoreLabelSimilarity(intent: string, label: string): number {\n  if (!label) return 0\n  const labelLower = label.toLowerCase()\n\n  if (intent.includes(labelLower)) return 1.0\n  if (labelLower.includes(intent.trim())) return 0.9\n\n  const jw = jaroWinkler(intent, labelLower)\n\n  const intentWords = intent.split(/\\s+/).filter((w) => w.length > 2)\n  let bestWordJw = 0\n  for (const word of intentWords) {\n    bestWordJw = Math.max(bestWordJw, jaroWinkler(word, labelLower))\n  }\n\n  const labelWords = labelLower.split(/\\s+/).filter((w) => w.length > 2)\n  let bestLabelWordJw = 0\n  for (const lw of labelWords) {\n    for (const iw of intentWords) {\n      bestLabelWordJw = Math.max(bestLabelWordJw, jaroWinkler(iw, lw))\n    }\n  }\n\n  return Math.max(jw, bestWordJw, bestLabelWordJw)\n}\n\nexport interface SpatialHints {\n  position?: 'first' | 'last' | 'top' | 'bottom'\n  near?: string\n}\n\nexport function parseSpatialHints(intent: string): SpatialHints {\n  const hints: SpatialHints = {}\n\n  if (/\\bfirst\\b/.test(intent)) hints.position = 'first'\n  else if (/\\blast\\b/.test(intent)) hints.position = 'last'\n  else if (/\\btop\\b/.test(intent)) hints.position = 'top'\n  else if (/\\bbottom\\b/.test(intent)) hints.position = 'bottom'\n\n  const nearMatch = intent.match(/\\b(?:next to|near|beside|by)\\s+(.+?)(?:\\s*$)/)\n  if (nearMatch) hints.near = nearMatch[1].trim()\n\n  return hints\n}\n\nfunction scoreSpatial(\n  hints: SpatialHints,\n  _el: Element,\n  index: number,\n  allElements: Element[],\n): number {\n  if (!hints.position && !hints.near) return 0\n\n  let score = 0\n\n  if (hints.position) {\n    switch (hints.position) {\n      case 'first':\n      case 'top':\n        score = Math.max(0, 1.0 - index / Math.max(allElements.length - 1, 1))\n        break\n      case 'last':\n      case 'bottom':\n        score = index / Math.max(allElements.length - 1, 1)\n        break\n    }\n  }\n\n  if (hints.near) {\n    const nearLower = hints.near.toLowerCase()\n    for (let i = 0; i < allElements.length; i++) {\n      if (allElements[i].label.toLowerCase().includes(nearLower)) {\n        const distance = Math.abs(index - i)\n        if (distance > 0 && distance <= 3) {\n          score = Math.max(score, 1.0 - (distance - 1) * 0.3)\n        }\n        break\n      }\n    }\n  }\n\n  return score\n}\n\nfunction cleanIntent(intent: string): string {\n  return intent\n    .replace(/\\b(first|last|top|bottom)\\b/g, '')\n    .replace(/\\b(next to|near|beside|by)\\s+\\S+/g, '')\n    .replace(/\\b(click|tap|press|select|choose)\\b/g, '')\n    .replace(/\\s+/g, ' ')\n    .trim()\n}\n\n// ─── Jaro-Winkler ──────────────────────────────────────────\n\nexport function jaroWinkler(s1: string, s2: string): number {\n  if (s1 === s2) return 1.0\n  if (s1.length === 0 || s2.length === 0) return 0.0\n\n  const jaro = jaroDistance(s1, s2)\n  if (jaro === 0) return 0\n\n  let prefixLen = 0\n  const maxPrefix = Math.min(4, Math.min(s1.length, s2.length))\n  for (let i = 0; i < maxPrefix; i++) {\n    if (s1[i] === s2[i]) {\n      prefixLen++\n    } else {\n      break\n    }\n  }\n\n  return jaro + prefixLen * 0.1 * (1 - jaro)\n}\n\nfunction jaroDistance(s1: string, s2: string): number {\n  if (s1 === s2) return 1.0\n\n  const len1 = s1.length\n  const len2 = s2.length\n\n  const matchWindow = Math.max(0, Math.floor(Math.max(len1, len2) / 2) - 1)\n\n  const s1Matches = new Array(len1).fill(false)\n  const s2Matches = new Array(len2).fill(false)\n\n  let matches = 0\n  let transpositions = 0\n\n  for (let i = 0; i < len1; i++) {\n    const start = Math.max(0, i - matchWindow)\n    const end = Math.min(i + matchWindow + 1, len2)\n\n    for (let j = start; j < end; j++) {\n      if (s2Matches[j] || s1[i] !== s2[j]) continue\n      s1Matches[i] = true\n      s2Matches[j] = true\n      matches++\n      break\n    }\n  }\n\n  if (matches === 0) return 0\n\n  let k = 0\n  for (let i = 0; i < len1; i++) {\n    if (!s1Matches[i]) continue\n    while (!s2Matches[k]) k++\n    if (s1[i] !== s2[k]) transpositions++\n    k++\n  }\n\n  return (matches / len1 + matches / len2 + (matches - transpositions / 2) / matches) / 3\n}\n","/**\n * EngineDriver — high-level browser automation for LLM-driven UI validation.\n * Orchestrates CDP domains into a purpose-built API.\n */\n\nimport { CdpConnection } from './cdp/connection.js'\nimport { BrowserManager, type BrowserMode, type BrowserOptions } from './cdp/browser.js'\nimport { TargetDomain } from './cdp/target.js'\nimport { PageDomain, type ScreenshotOptions } from './cdp/page.js'\nimport { AccessibilityDomain } from './cdp/accessibility.js'\nimport { DomDomain } from './cdp/dom.js'\nimport { InputDomain } from './cdp/input.js'\nimport { RuntimeDomain } from './cdp/runtime.js'\nimport { CssDomain } from './cdp/css.js'\nimport { SnapshotDomain, type CaptureSnapshotResult } from './cdp/snapshot.js'\nimport { EmulationDomain, type ViewportConfig } from './cdp/emulation.js'\nimport { NetworkDomain, type Cookie, type SetCookieParams } from './cdp/network.js'\nimport { ConsoleDomain, type ConsoleMessage } from './cdp/console.js'\nimport { waitForStableTree, waitForStable } from './cdp/wait.js'\nimport pixelmatch from 'pixelmatch'\nimport { PNG } from 'pngjs'\nimport type { Element, Snapshot, BrowserDriver } from './types.js'\nimport { serializeSnapshot } from './serialize.js'\nimport { observe, type ActionDescriptor, type ObserveOptions } from './observe.js'\nimport { extractFromAXTree, extractList, extractPageMeta, type ExtractSchema, type ExtractResult } from './extract.js'\nimport { ResolutionCache, type CacheOptions } from './cache.js'\nimport { assessUnderstanding, type UnderstandingScore, type ModalityOptions } from './modality.js'\nimport { extractShadowElements } from './shadow-dom.js'\n\nexport interface CoverageReport {\n  /** Elements captured by the AX tree */\n  axTreeCount: number\n  /** Estimated visible elements in the DOM (not aria-hidden, has dimensions) */\n  estimatedVisible: number\n  /** axTreeCount / estimatedVisible * 100, capped at 100 */\n  coveragePercent: number\n  /** Elements found inside open shadow DOMs (invisible to AX tree) */\n  shadowDomCount: number\n  /** Canvas elements on the page (completely opaque to AX tree) */\n  canvasCount: number\n  /** Iframe elements on the page (separate AX trees) */\n  iframeCount: number\n  /** Elements recovered via shadow DOM piercing */\n  recovered: number\n  /** Human-readable descriptions of coverage gaps */\n  gaps: string[]\n}\n\nexport interface LaunchOptions extends BrowserOptions {\n  viewport?: ViewportConfig\n}\n\nexport type WaitStrategy = 'stable' | 'load' | 'none'\n\nexport interface NavigateOptions {\n  waitFor?: WaitStrategy     // default: 'stable'\n  timeout?: number           // wait timeout in ms\n}\n\nexport interface DiscoverOptions {\n  /** Filter elements: 'interactive' (buttons, links, inputs), 'leaf' (user-facing), 'all' */\n  filter?: 'interactive' | 'leaf' | 'all'\n  /** Enable chunking for context window limits */\n  chunk?: boolean\n  /** Max tokens budget for chunked output (approximate) */\n  maxTokens?: number\n  /** Return compact serialized format instead of raw elements */\n  serialize?: boolean\n}\n\nexport interface FindOptions {\n  role?: string\n}\n\nexport interface FindDiagnostics {\n  elementId: string | null\n  confidence: number           // 0.0–1.0\n  tier: number                 // 1–4: which resolution strategy succeeded\n  tierName: string             // \"cache\" | \"queryAXTree\" | \"jaro-winkler\" | \"vision\" | \"auto-resolve\"\n  alternatives: Array<{        // top 5 fuzzy matches when not found\n    name: string\n    role: string\n    score: number\n  }>\n  totalInteractive: number     // how many interactive elements on page\n  screenshot?: string          // base64 PNG, auto-captured when element not found\n  /**\n   * Set when tier-4 (vision) detected an unambiguous top alternative and\n   * promoted it to an element resolution. Callers can surface this so users\n   * see WHICH alternative was chosen and at what score, instead of a silent\n   * \"did you mean?\". See AUTO_RESOLVE_MIN_SCORE / AUTO_RESOLVE_MIN_MARGIN.\n   */\n  autoResolved?: {\n    label: string              // chosen alternative's label\n    role: string               // chosen alternative's role\n    score: number              // top jaroWinkler score (0–1)\n    margin: number             // score[0] - score[1] (0 when only 1 candidate)\n  }\n}\n\n/**\n * Auto-resolve thresholds for the tier-4 (vision) → element promotion.\n *\n * Rationale: tier-3 (jaroWinkler over the full AX tree) returns nothing below\n * confidence 0.5; tier-4 then computes alternatives over INTERACTIVE elements\n * only. In practice, the top interactive-only score is frequently very high\n * (≥ 0.8) AND the gap to second place is wide (≥ 0.15), i.e. the user's\n * intent is unambiguous and a \"not found + alternatives\" response is just\n * pointless friction. Auto-resolve in that case; preserve the existing\n * alternatives + screenshot path when ambiguous or low-confidence.\n *\n * Driven by transcript-log evidence: 20/185 session_action calls (11%) failed\n * with element-not-found despite the top alternative being unambiguous.\n */\nexport const AUTO_RESOLVE_MIN_SCORE = 0.8\nexport const AUTO_RESOLVE_MIN_MARGIN = 0.15\n\n/**\n * Raised threshold for auto-resolving destructive actions.\n *\n * A typo'd query can score ~0.91 against a \"Delete Account\" label — above the\n * normal 0.8 bar — causing the driver to click a destructive button the user\n * did not intend to confirm. Requiring 0.95 leaves only near-exact matches\n * (one or two transposed characters) while blocking plausible mis-queries\n * (\"delt acct\" → 0.917, blocked; \"delet account\" → 0.986, allowed).\n *\n * Applies whenever the chosen candidate's label matches DESTRUCTIVE_LABEL_PATTERN,\n * regardless of candidate count.\n */\nexport const AUTO_RESOLVE_DESTRUCTIVE_MIN_SCORE = 0.95\n\n/**\n * Detects destructive intent in an element's accessible label.\n *\n * Matches whole words (case-insensitive) for verbs and nouns that indicate an\n * irreversible or high-risk action: data loss (delete, erase, wipe, purge),\n * access revocation (revoke, deactivate, disable), content loss (discard,\n * destroy, reset, clear), or subscription termination (unsubscribe).\n * \"confirm\" is included because standalone \"Confirm\" on a modal is typically\n * a confirmation of a destructive flow already in progress.\n *\n * Intentionally kept as a single expression — do not split across config or\n * runtime lookup. The pattern is a safety guardrail, not a user-configurable\n * blocklist.\n */\nexport const DESTRUCTIVE_LABEL_PATTERN =\n  /\\b(?:delete|remove|erase|wipe|purge|revoke|deactivate|disable|discard|destroy|reset|clear|unsubscribe|confirm)\\b/i\n\nexport interface CaptureStateOptions {\n  computedStyles?: string[]\n  includeAXTree?: boolean\n  includeScreenshot?: boolean\n}\n\nexport interface CapturedState {\n  domSnapshot?: CaptureSnapshotResult\n  axTree?: Element[]\n  screenshot?: Buffer\n  url: string\n  timestamp: number\n}\n\nexport class EngineDriver implements BrowserDriver {\n  private browser = new BrowserManager()\n  private conn = new CdpConnection()\n  // Resolution cache initialized in constructor or with defaults\n  private target!: TargetDomain\n  private _page!: PageDomain\n  private ax!: AccessibilityDomain\n  private dom!: DomDomain\n  private input!: InputDomain\n  private runtime!: RuntimeDomain\n  private css!: CssDomain\n  private snapshot!: SnapshotDomain\n  private emulation!: EmulationDomain\n  private network!: NetworkDomain\n  private console!: ConsoleDomain\n\n  private targetId: string | null = null\n  private sessionId: string | null = null\n  private _currentUrl = ''\n  private launched = false\n  private resolutionCache = new ResolutionCache()\n\n  // ─── Lifecycle ──────────────────────────────────────────\n\n  async launch(options: LaunchOptions = {}): Promise<void> {\n    const wsUrl = await this.browser.launch(options)\n    await this.conn.connect(wsUrl)\n    this.target = new TargetDomain(this.conn)\n    this.launched = true\n\n    // Create initial page\n    this.targetId = await this.target.createPage('about:blank')\n    this.sessionId = await this.target.attach(this.targetId)\n\n    // Initialize domains with session\n    this._page = new PageDomain(this.conn, this.sessionId)\n    this.ax = new AccessibilityDomain(this.conn, this.sessionId)\n    this.dom = new DomDomain(this.conn, this.sessionId)\n    this.input = new InputDomain(this.conn, this.sessionId)\n    this.runtime = new RuntimeDomain(this.conn, this.sessionId)\n    this.css = new CssDomain(this.conn, this.sessionId)\n    this.snapshot = new SnapshotDomain(this.conn, this.sessionId)\n    this.emulation = new EmulationDomain(this.conn, this.sessionId)\n    this.network = new NetworkDomain(this.conn, this.sessionId)\n    this.console = new ConsoleDomain(this.conn, this.sessionId)\n\n    // Enable required domains\n    await this._page.enableLifecycleEvents()\n    await this.ax.enable()\n    await this.console.enable()\n\n    // Apply device emulation (metrics + UA + touch) BEFORE the first\n    // navigate so the initial document request sees the emulated device.\n    if (options.viewport) {\n      await this.emulation.applyDeviceProfile(options.viewport)\n    }\n  }\n\n  async close(): Promise<void> {\n    if (this.targetId) {\n      await this.target.close(this.targetId).catch(() => {})\n      this.targetId = null\n    }\n    await this.conn.close()\n    await this.browser.close()\n    this.launched = false\n  }\n\n  /**\n   * Release the CDP WebSocket for this driver without terminating the browser.\n   * Used by one-shot CLI commands that attach to a shared browser-server via\n   * connectExisting() — they must drop their WebSocket at the end of the\n   * command so the node process can exit, but the browser-server's Chrome\n   * process must keep running for subsequent commands.\n   *\n   * Closes the per-command tab that was spawned in connectExisting(), then\n   * closes the WebSocket. Does NOT call this.browser.close() (which would\n   * terminate the whole browser-server process).\n   */\n  async disconnect(): Promise<void> {\n    if (this.targetId) {\n      await this.target.close(this.targetId).catch(() => {})\n      this.targetId = null\n    }\n    await this.conn.close().catch(() => {})\n    this.launched = false\n  }\n\n  get isLaunched(): boolean {\n    return this.launched\n  }\n\n  // ─── Navigation ─────────────────────────────────────────\n\n  async navigate(url: string, options: NavigateOptions = {}): Promise<void> {\n    const waitFor = options.waitFor ?? 'stable'\n    await this._page.navigate(url)\n\n    if (waitFor === 'stable') {\n      await waitForStable(\n        this.conn,\n        () => this.ax.getSnapshot(),\n        { timeout: options.timeout ?? 10000, eventName: 'Accessibility.nodesUpdated' },\n      )\n    } else if (waitFor === 'load') {\n      await waitForStableTree(\n        () => this.ax.getSnapshot(),\n        { timeout: options.timeout ?? 10000 },\n      )\n    }\n    // 'none' — return immediately\n\n    // Read actual URL after navigation (handles redirects)\n    this._currentUrl = await this.runtime.evaluate('location.href') as string ?? url\n\n    // Clear resolution cache on navigation (element IDs change)\n    this.resolutionCache.clear()\n  }\n\n  get url(): string {\n    return this._currentUrl\n  }\n\n  /** BrowserDriver interface: currentUrl alias */\n  get currentUrl(): string {\n    return this._currentUrl\n  }\n\n\n  // ─── Element Discovery (LLM-native) ────────────────────\n\n  /**\n   * Discover elements on the page with filtering and chunking.\n   * Designed for LLM context windows — returns only actionable elements.\n   */\n  async discover(options: DiscoverOptions = {}): Promise<Element[] | string> {\n    const filter = options.filter ?? 'interactive'\n    const elements = await this.ax.getSnapshot()\n\n    let filtered: Element[]\n    switch (filter) {\n      case 'interactive':\n        filtered = elements.filter((e) => e.actions.length > 0)\n        break\n      case 'leaf':\n        // Leaf elements: have a label (user-facing) and are not groups\n        filtered = elements.filter((e) => e.label && e.role !== 'group')\n        break\n      case 'all':\n      default:\n        filtered = elements\n    }\n\n    if (options.chunk && options.maxTokens) {\n      filtered = chunkElements(filtered, options.maxTokens)\n    }\n\n    if (options.serialize) {\n      const snap: Snapshot = {\n        url: this._currentUrl,\n        platform: 'web',\n        elements: filtered,\n        timestamp: Date.now(),\n      }\n      return serializeSnapshot(snap)\n    }\n\n    return filtered\n  }\n\n  /**\n   * 3-tier element resolution with auto-caching:\n   * Tier 1: Check cache → Tier 2: queryAXTree → Tier 3: Jaro-Winkler → Tier 4: vision fallback.\n   * Delegates to findWithDiagnostics() and returns the matched element or null.\n   */\n  async find(name: string, options: FindOptions = {}): Promise<Element | null> {\n    const diag = await this.findWithDiagnostics(name, options)\n    if (!diag.elementId) return null\n\n    const elements = await this.ax.getSnapshot()\n    return elements.find((e) => e.id === diag.elementId) ?? null\n  }\n\n  /**\n   * Like find(), but returns rich diagnostics for agent error feedback.\n   * Includes confidence, resolution tier, and fuzzy alternatives when not found.\n   */\n  async findWithDiagnostics(name: string, options: FindOptions = {}): Promise<FindDiagnostics> {\n    const { jaroWinkler } = await import('./resolve.js')\n    const cacheKey = options.role ? `${name}:${options.role}` : name\n\n    // Tier 1: Check resolution cache\n    const cached = this.resolutionCache.get(cacheKey)\n    if (cached) {\n      const elements = await this.ax.getSnapshot()\n      const match = elements.find((e) => e.id === cached.elementId)\n      if (match) {\n        const interactive = elements.filter((e) => e.actions.length > 0)\n        return {\n          elementId: cached.elementId,\n          confidence: cached.confidence,\n          tier: 1,\n          tierName: 'cache',\n          alternatives: [],\n          totalInteractive: interactive.length,\n        }\n      }\n      // Element gone — invalidate and fall through\n      this.resolutionCache.invalidate(cacheKey)\n    }\n\n    // Tier 2: CDP-native queryAXTree (exact/prefix match)\n    const queryResult = await this.ax.queryAXTree({\n      accessibleName: name,\n      role: options.role,\n    })\n    if (queryResult.length > 0) {\n      const el = queryResult[0]\n      this.resolutionCache.set(cacheKey, el.id, {\n        role: el.role, label: el.label, confidence: 1.0,\n      })\n      const allElements = await this.ax.getSnapshot()\n      const interactive = allElements.filter((e) => e.actions.length > 0)\n      return {\n        elementId: el.id,\n        confidence: 0.95,\n        tier: 2,\n        tierName: 'queryAXTree',\n        alternatives: [],\n        totalInteractive: interactive.length,\n      }\n    }\n\n    // Tier 3: Fuzzy matching on full AX tree (Jaro-Winkler)\n    const { resolve } = await import('./resolve.js')\n    const allElements = await this.ax.getSnapshot()\n    const interactive = allElements.filter((e) => e.actions.length > 0)\n    const result = resolve({\n      intent: options.role ? `${name} ${options.role}` : name,\n      elements: allElements,\n      mode: 'algorithmic',\n    })\n\n    if (result.confidence >= 0.5 && result.element) {\n      this.resolutionCache.set(cacheKey, result.element.id, {\n        role: result.element.role, label: result.element.label, confidence: result.confidence,\n      })\n      return {\n        elementId: result.element.id,\n        confidence: result.confidence,\n        tier: 3,\n        tierName: 'jaro-winkler',\n        alternatives: [],\n        totalInteractive: interactive.length,\n      }\n    }\n\n    // Tier 4: Not found — compute alternatives from interactive elements.\n    // f1: when options.role is set, pre-filter the scored pool to that role\n    //     so auto-resolve cannot pick an element of the wrong type.\n    const nameLower = name.toLowerCase()\n    const scoringPool = options.role\n      ? interactive.filter((e) => e.role === options.role)\n      : interactive\n    const scored = scoringPool\n      .filter((e) => e.label)\n      .map((e) => ({\n        name: e.label,\n        role: e.role,\n        score: jaroWinkler(nameLower, e.label.toLowerCase()),\n      }))\n      .sort((a, b) => b.score - a.score)\n      .slice(0, 5)\n\n    // Auto-resolve: if the top alternative is high-confidence AND unambiguous\n    // relative to the runner-up, promote it to a resolution instead of\n    // returning \"not found\". This converts the most common transcript-log\n    // failure mode (clear typo / missing trailing-space / \"Submit\" vs\n    // \"Submit Form\") into a successful action with auditable provenance.\n    //\n    // Destructive-label guard: when the winning candidate's label matches\n    // DESTRUCTIVE_LABEL_PATTERN, require a higher confidence bar\n    // (AUTO_RESOLVE_DESTRUCTIVE_MIN_SCORE = 0.95) to prevent a plausible\n    // mis-query (\"delt acct\" → 0.917) from auto-clicking a destructive\n    // action. Non-destructive labels keep the normal 0.8 threshold.\n    if (scored.length > 0) {\n      const top = scored[0]\n      const second = scored[1]\n      const margin = top.score - (second?.score ?? 0)\n      const isDestructive = DESTRUCTIVE_LABEL_PATTERN.test(top.name)\n      const minScore = isDestructive ? AUTO_RESOLVE_DESTRUCTIVE_MIN_SCORE : AUTO_RESOLVE_MIN_SCORE\n      if (top.score >= minScore && margin >= AUTO_RESOLVE_MIN_MARGIN) {\n        // Resolve back to the actual element object (need its id) — pick\n        // the first interactive element matching (label, role).\n        const resolved = interactive.find(\n          (e) => e.label === top.name && e.role === top.role,\n        )\n        if (resolved) {\n          this.resolutionCache.set(cacheKey, resolved.id, {\n            role: resolved.role, label: resolved.label, confidence: top.score,\n          })\n          return {\n            elementId: resolved.id,\n            confidence: top.score,\n            tier: 4,\n            tierName: 'auto-resolve',\n            alternatives: scored,\n            totalInteractive: interactive.length,\n            autoResolved: {\n              label: top.name,\n              role: top.role,\n              score: top.score,\n              margin,\n            },\n          }\n        }\n      }\n    }\n\n    // Auto-capture screenshot when element not found for visual fallback\n    let screenshot: string | undefined\n    try {\n      const buf = await this.screenshot()\n      screenshot = buf.toString('base64')\n    } catch {\n      // Screenshot capture can fail (e.g., page not loaded) — non-critical\n    }\n\n    return {\n      elementId: null,\n      confidence: 0,\n      tier: 4,\n      tierName: 'vision',\n      alternatives: scored,\n      totalInteractive: interactive.length,\n      screenshot,\n    }\n  }\n\n  // ─── Interactions ───────────────────────────────────────\n\n  async click(elementId: string): Promise<void> {\n    const backendNodeId = this.ax.getBackendNodeId(elementId)\n    if (!backendNodeId) throw new Error(`Element ${elementId} not found in AX tree`)\n\n    // Use DOM.resolveNode + callFunctionOn to call .click() on the DOM element.\n    // This triggers ALL click handlers: addEventListener, inline onclick, and href navigation.\n    // CDP Input.dispatchMouseEvent only fires addEventListener handlers, NOT inline onclick.\n    const sid = this.sessionId ?? undefined\n    let domClickWorked = false\n    try {\n      const resolved: any = await this.conn.send('DOM.resolveNode', { backendNodeId }, sid)\n      if (resolved?.object?.objectId) {\n        await this.conn.send('Runtime.callFunctionOn', {\n          objectId: resolved.object.objectId,\n          functionDeclaration: 'function() { this.click(); }',\n        }, sid)\n        domClickWorked = true\n      }\n    } catch {\n      // DOM click failed — fall back to coordinate-based click\n    }\n\n    if (!domClickWorked) {\n      const { x, y } = await this.dom.getElementCenter(backendNodeId)\n      await this.input.click(x, y)\n    }\n  }\n\n  async type(elementId: string, text: string): Promise<void> {\n    const backendNodeId = this.ax.getBackendNodeId(elementId)\n    if (!backendNodeId) throw new Error(`Element ${elementId} not found in AX tree`)\n\n    const { x, y } = await this.dom.getElementCenter(backendNodeId)\n    await this.input.click(x, y)\n    await this.input.type(text)\n  }\n\n  async fill(elementId: string, value: string): Promise<void> {\n    const backendNodeId = this.ax.getBackendNodeId(elementId)\n    if (!backendNodeId) throw new Error(`Element ${elementId} not found in AX tree`)\n\n    const { x, y } = await this.dom.getElementCenter(backendNodeId)\n    await this.input.click(x, y)\n\n    // Clear existing value\n    await this.runtime.callFunctionOn(\n      '() => { if (document.activeElement) { document.activeElement.value = \"\"; document.activeElement.dispatchEvent(new Event(\"input\", { bubbles: true })); } }',\n    )\n\n    await this.input.type(value)\n  }\n\n  async hover(elementId: string): Promise<void> {\n    const backendNodeId = this.ax.getBackendNodeId(elementId)\n    if (!backendNodeId) throw new Error(`Element ${elementId} not found in AX tree`)\n\n    const { x, y } = await this.dom.getElementCenter(backendNodeId)\n    await this.input.hover(x, y)\n  }\n\n  async pressKey(key: string): Promise<void> {\n    await this.input.pressKey(key)\n  }\n\n  async scroll(deltaY: number, x = 0, y = 0): Promise<void> {\n    await this.input.scroll(x, y, 0, deltaY)\n  }\n\n  // ─── Interaction Assertions ─────────────────────────────\n\n  /**\n   * Before/after state capture around an action.\n   * Returns element diff and pixel diff.\n   */\n  async actAndCapture(action: () => Promise<void>): Promise<{\n    before: { elements: Element[]; screenshot: Buffer }\n    after: { elements: Element[]; screenshot: Buffer }\n    diff: { addedElements: Element[]; removedElements: Element[]; pixelDiff: number }\n  }> {\n    // Capture before state\n    const [beforeElements, beforeScreenshot] = await Promise.all([\n      this.ax.getSnapshot(),\n      this._page.screenshot(),\n    ])\n\n    // Execute action\n    await action()\n\n    // Wait for AX tree stability (elements stop changing)\n    await waitForStableTree(() => this.ax.getSnapshot(), { timeout: 5000, stableTime: 300 })\n\n    // Wait for visual rendering to complete — CSS transitions, layout shifts,\n    // and repaint after DOM changes. requestAnimationFrame fires after the next\n    // composite, ensuring visibility changes (display:none → visible) are painted.\n    await this.runtime.evaluate(\n      'new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r)))'\n    ).catch(() => {})\n\n    // Capture after state\n    const [afterElements, afterScreenshot] = await Promise.all([\n      this.ax.getSnapshot(),\n      this._page.screenshot(),\n    ])\n\n    // Compute element diff by id\n    const beforeIds = new Set(beforeElements.map((e) => e.id))\n    const afterIds = new Set(afterElements.map((e) => e.id))\n    const addedElements = afterElements.filter((e) => !beforeIds.has(e.id))\n    const removedElements = beforeElements.filter((e) => !afterIds.has(e.id))\n\n    // Compute pixel diff\n    let pixelDiff = 0\n    try {\n      const beforePng = PNG.sync.read(beforeScreenshot)\n      const afterPng = PNG.sync.read(afterScreenshot)\n      if (beforePng.width === afterPng.width && beforePng.height === afterPng.height) {\n        const { width, height } = beforePng\n        const diffPng = new PNG({ width, height })\n        pixelDiff = pixelmatch(beforePng.data, afterPng.data, diffPng.data, width, height, {\n          threshold: 0.1,\n          includeAA: false,\n        })\n      }\n    } catch {\n      // Pixel diff is best-effort — ignore errors\n    }\n\n    return {\n      before: { elements: beforeElements, screenshot: beforeScreenshot },\n      after: { elements: afterElements, screenshot: afterScreenshot },\n      diff: { addedElements, removedElements, pixelDiff },\n    }\n  }\n\n  /**\n   * Set a <select> element's value and dispatch change event.\n   */\n  async select(elementId: string, value: string): Promise<void> {\n    const backendNodeId = this.ax.getBackendNodeId(elementId)\n    if (!backendNodeId) throw new Error(`Element ${elementId} not found in AX tree`)\n\n    const { x, y } = await this.dom.getElementCenter(backendNodeId)\n    await this.input.click(x, y)\n    await new Promise((r) => setTimeout(r, 100))\n\n    await this.runtime.callFunctionOn(\n      '(val) => { const el = document.activeElement; if (el && el.tagName === \"SELECT\") { el.value = val; el.dispatchEvent(new Event(\"change\", { bubbles: true })); el.dispatchEvent(new Event(\"input\", { bubbles: true })); } }',\n      [value],\n    )\n  }\n\n  /**\n   * Toggle a checkbox element.\n   */\n  async check(elementId: string): Promise<void> {\n    const backendNodeId = this.ax.getBackendNodeId(elementId)\n    if (!backendNodeId) throw new Error(`Element ${elementId} not found in AX tree`)\n\n    const { x, y } = await this.dom.getElementCenter(backendNodeId)\n    await this.input.click(x, y)\n  }\n\n  /**\n   * Double-click an element.\n   */\n  async doubleClick(elementId: string): Promise<void> {\n    const backendNodeId = this.ax.getBackendNodeId(elementId)\n    if (!backendNodeId) throw new Error(`Element ${elementId} not found in AX tree`)\n\n    const { x, y } = await this.dom.getElementCenter(backendNodeId)\n    await this.input.click(x, y)\n    await new Promise((r) => setTimeout(r, 50))\n    await this.input.click(x, y)\n  }\n\n  /**\n   * Right-click an element (opens context menu).\n   */\n  async rightClick(elementId: string): Promise<void> {\n    const backendNodeId = this.ax.getBackendNodeId(elementId)\n    if (!backendNodeId) throw new Error(`Element ${elementId} not found in AX tree`)\n\n    const { x, y } = await this.dom.getElementCenter(backendNodeId)\n    const sid = this.sessionId ?? undefined\n    await this.conn.send('Input.dispatchMouseEvent', {\n      type: 'mousePressed', x, y, button: 'right', buttons: 2, clickCount: 1,\n    }, sid)\n    await this.conn.send('Input.dispatchMouseEvent', {\n      type: 'mouseReleased', x, y, button: 'right', buttons: 0, clickCount: 1,\n    }, sid)\n  }\n\n  /**\n   * Wait until an element with the given name (and optional role) appears in the AX tree.\n   * Polls at 200ms intervals. Throws on timeout.\n   */\n  async waitForElement(\n    name: string,\n    options?: { role?: string; timeout?: number },\n  ): Promise<Element> {\n    const timeout = options?.timeout ?? 10000\n    const deadline = Date.now() + timeout\n    const interval = 200\n\n    while (Date.now() < deadline) {\n      const elements = await this.ax.getSnapshot()\n      const match = elements.find((e) => {\n        const nameMatch = e.label?.toLowerCase().includes(name.toLowerCase()) ||\n          e.value?.toString().toLowerCase().includes(name.toLowerCase())\n        const roleMatch = !options?.role || e.role === options.role\n        return nameMatch && roleMatch\n      })\n      if (match) return match\n      await new Promise((r) => setTimeout(r, interval))\n    }\n\n    throw new Error(\n      `waitForElement: element \"${name}\"${options?.role ? ` (role: ${options.role})` : ''} not found within ${timeout}ms`,\n    )\n  }\n\n  // ─── Screenshots ────────────────────────────────────────\n\n  async screenshot(options: ScreenshotOptions = {}): Promise<Buffer> {\n    return this._page.screenshot(options)\n  }\n\n  async screenshotElement(elementId: string): Promise<Buffer> {\n    const backendNodeId = this.ax.getBackendNodeId(elementId)\n    if (!backendNodeId) throw new Error(`Element ${elementId} not found in AX tree`)\n\n    const model = await this.dom.getBoxModel(backendNodeId)\n    const q = model.content\n    const x = Math.min(q[0], q[2], q[4], q[6])\n    const y = Math.min(q[1], q[3], q[5], q[7])\n\n    return this._page.screenshot({\n      clip: { x, y, width: model.width, height: model.height },\n    })\n  }\n\n  // ─── Page State ─────────────────────────────────────────\n\n  /**\n   * One-call page state capture — combines DOMSnapshot, AX tree, and screenshot.\n   */\n  async captureState(options: CaptureStateOptions = {}): Promise<CapturedState> {\n    const state: CapturedState = {\n      url: this._currentUrl,\n      timestamp: Date.now(),\n    }\n\n    const promises: Promise<void>[] = []\n\n    if (options.computedStyles) {\n      promises.push(\n        this.snapshot.captureSnapshot({\n          computedStyles: options.computedStyles,\n        }).then((result) => { state.domSnapshot = result }),\n      )\n    }\n\n    if (options.includeAXTree !== false) {\n      promises.push(\n        this.ax.getSnapshot().then((elements) => { state.axTree = elements }),\n      )\n    }\n\n    if (options.includeScreenshot) {\n      promises.push(\n        this._page.screenshot().then((buf) => { state.screenshot = buf }),\n      )\n    }\n\n    await Promise.all(promises)\n    return state\n  }\n\n  /** Get AX tree snapshot. */\n  async getSnapshot(): Promise<Element[]> {\n    return this.ax.getSnapshot()\n  }\n\n  // ─── Evaluation ─────────────────────────────────────────\n\n  /**\n   * Evaluate a JavaScript expression in the page context.\n   */\n  async evaluate(expression: string): Promise<unknown>\n  /**\n   * Call a function with arguments in the page context.\n   * Equivalent to Playwright's page.evaluate(fn, ...args).\n   */\n  async evaluate(fn: string, ...args: unknown[]): Promise<unknown>\n  async evaluate(exprOrFn: string, ...args: unknown[]): Promise<unknown> {\n    if (args.length > 0) {\n      return this.runtime.callFunctionOn(exprOrFn, args)\n    }\n    return this.runtime.evaluate(exprOrFn)\n  }\n\n  // ─── DOM Queries ────────────────────────────────────────\n\n  async querySelector(selector: string): Promise<number | null> {\n    const doc = await this.dom.getDocument()\n    return this.dom.querySelector(doc.root.nodeId, selector)\n  }\n\n  async querySelectorAll(selector: string): Promise<number[]> {\n    const doc = await this.dom.getDocument()\n    return this.dom.querySelectorAll(doc.root.nodeId, selector)\n  }\n\n  async getOuterHTML(nodeId: number): Promise<string> {\n    return this.dom.getOuterHTML(nodeId)\n  }\n\n  async getAttributes(nodeId: number): Promise<Record<string, string>> {\n    return this.dom.getAttributes(nodeId)\n  }\n\n  async getComputedStyle(nodeId: number, properties?: string[]): Promise<Record<string, string>> {\n    if (properties) {\n      return this.css.getComputedStyleFiltered(nodeId, properties)\n    }\n    return this.css.getComputedStyle(nodeId)\n  }\n\n  // ─── CSS Injection ──────────────────────────────────────\n\n  async addStyleTag(css: string): Promise<void> {\n    return this._page.addStyleTag(css)\n  }\n\n  // ─── Viewport ───────────────────────────────────────────\n\n  async setViewport(config: ViewportConfig): Promise<void> {\n    await this.emulation.setDeviceMetrics(config)\n  }\n\n  async clearViewport(): Promise<void> {\n    await this.emulation.clearDeviceMetrics()\n  }\n\n  // ─── Cookies / Auth ─────────────────────────────────────\n\n  async getCookies(urls?: string[]): Promise<Cookie[]> {\n    return this.network.getCookies(urls)\n  }\n\n  async setCookies(cookies: SetCookieParams[]): Promise<void> {\n    return this.network.setCookies(cookies)\n  }\n\n  async clearCookies(): Promise<void> {\n    return this.network.clearCookies()\n  }\n\n  // ─── Console ────────────────────────────────────────────\n\n  getConsoleMessages(): ConsoleMessage[] {\n    return this.console.getMessages()\n  }\n\n  getConsoleErrors(): ConsoleMessage[] {\n    return this.console.getErrors()\n  }\n\n  clearConsole(): void {\n    this.console.clear()\n  }\n\n  // ─── Content ────────────────────────────────────────────\n\n  async content(): Promise<string> {\n    return this.runtime.evaluate('document.documentElement.outerHTML') as Promise<string>\n  }\n\n  async title(): Promise<string> {\n    return this.runtime.evaluate('document.title') as Promise<string>\n  }\n\n  async textContent(selector: string): Promise<string | null> {\n    return this.runtime.callFunctionOn(\n      '(sel) => { const el = document.querySelector(sel); return el ? el.textContent : null; }',\n      [selector],\n    ) as Promise<string | null>\n  }\n\n  async getAttribute(selector: string, attribute: string): Promise<string | null> {\n    return this.runtime.callFunctionOn(\n      '(sel, attr) => { const el = document.querySelector(sel); return el ? el.getAttribute(attr) : null; }',\n      [selector, attribute],\n    ) as Promise<string | null>\n  }\n\n  // ─── LLM-Native: Observe ─────────────────────────────────\n\n  /**\n   * Preview what actions are possible without executing.\n   * Returns serializable descriptors for act().\n   */\n  async observe(options?: ObserveOptions): Promise<ActionDescriptor[]> {\n    const elements = await this.ax.getSnapshot()\n    return observe(elements, options)\n  }\n\n  // ─── LLM-Native: Extract ───────────────────────────────\n\n  /**\n   * Extract structured data from AX tree using a schema.\n   */\n  async extract(schema: ExtractSchema): Promise<ExtractResult> {\n    const elements = await this.ax.getSnapshot()\n    return extractFromAXTree(elements, schema)\n  }\n\n  /**\n   * Extract a list of repeated elements.\n   */\n  async extractItems(options: {\n    role?: string\n    labelPattern?: RegExp\n    maxItems?: number\n  }): Promise<Array<{ label: string; value: string | null; id: string }>> {\n    const elements = await this.ax.getSnapshot()\n    return extractList(elements, options)\n  }\n\n  /**\n   * Extract page-level metadata (headings, links, inputs, buttons).\n   */\n  async extractMeta(): Promise<ReturnType<typeof extractPageMeta>> {\n    const elements = await this.ax.getSnapshot()\n    return extractPageMeta(elements)\n  }\n\n  // ─── LLM-Native: Adaptive Modality ─────────────────────\n\n  /**\n   * Assess how well the AX tree captures the page.\n   * Returns a score and whether a screenshot is recommended.\n   */\n  async assessUnderstanding(options?: ModalityOptions): Promise<UnderstandingScore> {\n    const elements = await this.ax.getSnapshot()\n    return assessUnderstanding(elements, options)\n  }\n\n  // ─── Coverage Reporting ────────────────────────────────\n\n  /**\n   * Report AX tree coverage against estimated visible DOM elements.\n   * Surfaces blind spots: shadow DOM, canvas, iframes.\n   */\n  async getCoverage(): Promise<CoverageReport> {\n    const gaps: string[] = []\n\n    // 1. AX tree count\n    const axElements = await this.ax.getSnapshot()\n    const axTreeCount = axElements.length\n\n    // 2. Estimated visible DOM elements (not aria-hidden, has layout dimensions)\n    const estimatedVisible = await this.runtime.evaluate(`\n      (function() {\n        const all = document.querySelectorAll('*');\n        let count = 0;\n        for (const el of all) {\n          if (el.getAttribute('aria-hidden') === 'true') continue;\n          if (el.offsetWidth > 0 || el.offsetHeight > 0) count++;\n        }\n        return count;\n      })()\n    `) as number\n\n    // 3. Canvas elements\n    const canvasCount = await this.runtime.evaluate(\n      `document.querySelectorAll('canvas').length`,\n    ) as number\n\n    // 4. Iframe elements\n    const iframeCount = await this.runtime.evaluate(\n      `document.querySelectorAll('iframe').length`,\n    ) as number\n\n    // 5. Shadow DOM extraction\n    const shadowElements = await extractShadowElements(this.runtime)\n    const shadowDomCount = shadowElements.length\n    const recovered = shadowDomCount\n\n    // 6. Build gap descriptions\n    if (canvasCount > 0) {\n      gaps.push(`${canvasCount} canvas element${canvasCount > 1 ? 's' : ''} (invisible to AX tree)`)\n    }\n    if (iframeCount > 0) {\n      gaps.push(`${iframeCount} iframe${iframeCount > 1 ? 's' : ''} (separate AX tree${iframeCount > 1 ? 's' : ''})`)\n    }\n    if (shadowDomCount > 0) {\n      gaps.push(`${shadowDomCount} shadow DOM element${shadowDomCount > 1 ? 's' : ''} (open shadow root — recovered via piercing)`)\n    }\n\n    const safeVisible = estimatedVisible > 0 ? estimatedVisible : 1\n    const coveragePercent = Math.min(100, Math.round((axTreeCount / safeVisible) * 100))\n\n    if (coveragePercent < 50) {\n      gaps.push(`Low AX coverage: ${coveragePercent}% of visible DOM captured`)\n    }\n\n    return {\n      axTreeCount,\n      estimatedVisible,\n      coveragePercent,\n      shadowDomCount,\n      canvasCount,\n      iframeCount,\n      recovered,\n      gaps,\n    }\n  }\n\n  // ─── LLM-Native: Cache ─────────────────────────────────\n\n  /** Get resolution cache statistics. */\n  get cacheStats(): ReturnType<ResolutionCache['stats']> {\n    return this.resolutionCache.stats()\n  }\n\n  /** Configure the resolution cache. */\n  configureCache(options: CacheOptions): void {\n    this.resolutionCache = new ResolutionCache(options)\n  }\n\n  // ─── Direct domain access (for advanced use) ───────────\n\n  get page(): PageDomain { return this._page }\n  get accessibility(): AccessibilityDomain { return this.ax }\n  get domDomain(): DomDomain { return this.dom }\n  get runtimeDomain(): RuntimeDomain { return this.runtime }\n  get cssDomain(): CssDomain { return this.css }\n  get snapshotDomain(): SnapshotDomain { return this.snapshot }\n  get emulationDomain(): EmulationDomain { return this.emulation }\n  get networkDomain(): NetworkDomain { return this.network }\n  get consoleDomain(): ConsoleDomain { return this.console }\n  get connection(): CdpConnection { return this.conn }\n\n  /** The CDP debug port Chrome is listening on. Only valid after launch(). */\n  get debugPort(): number { return this.browser.port }\n\n  /** The OS PID of the Chrome process. Only valid after launch(). Null when connected to existing. */\n  get chromePid(): number | null { return this.browser.pid }\n\n  /** The browser connection mode used for this driver. */\n  get browserMode(): BrowserMode { return this.browser.mode }\n\n  /** The resolved CDP HTTP endpoint, when available. */\n  get cdpUrl(): string | null { return this.browser.cdpUrl }\n\n  /** The resolved browser WebSocket endpoint, when available. */\n  get wsEndpoint(): string | null { return this.browser.wsEndpoint }\n\n  /**\n   * Connect to an already-running Chrome instance instead of launching a new one.\n   * Used by browser-server reconnection to attach to a persistent Chrome process.\n   */\n  async connectExisting(wsUrl: string): Promise<void> {\n    await this.conn.connect(wsUrl)\n    this.target = new TargetDomain(this.conn)\n    this.launched = true\n\n    // Create a new page in the existing browser\n    this.targetId = await this.target.createPage('about:blank')\n    this.sessionId = await this.target.attach(this.targetId)\n\n    // Initialize domains with session\n    this._page = new PageDomain(this.conn, this.sessionId)\n    this.ax = new AccessibilityDomain(this.conn, this.sessionId)\n    this.dom = new DomDomain(this.conn, this.sessionId)\n    this.input = new InputDomain(this.conn, this.sessionId)\n    this.runtime = new RuntimeDomain(this.conn, this.sessionId)\n    this.css = new CssDomain(this.conn, this.sessionId)\n    this.snapshot = new SnapshotDomain(this.conn, this.sessionId)\n    this.emulation = new EmulationDomain(this.conn, this.sessionId)\n    this.network = new NetworkDomain(this.conn, this.sessionId)\n    this.console = new ConsoleDomain(this.conn, this.sessionId)\n\n    await this._page.enableLifecycleEvents()\n    await this.ax.enable()\n    await this.console.enable()\n  }\n}\n\n// ─── Helpers ──────────────────────────────────────────────\n\n/**\n * Chunk elements to fit within a token budget.\n * Approximate: ~4 chars per token, ~40 chars per serialized element.\n */\nfunction chunkElements(elements: Element[], maxTokens: number): Element[] {\n  const charsPerToken = 4\n  const charsPerElement = 40\n  const maxElements = Math.floor((maxTokens * charsPerToken) / charsPerElement)\n  return elements.slice(0, maxElements)\n}\n","/**\n * Playwright compatibility adapter.\n *\n * Provides a Page-like interface backed by EngineDriver's CDP.\n * This allows incremental migration — existing IBR modules can use\n * this adapter without being rewritten, while new code uses EngineDriver directly.\n *\n * NOT a full Playwright reimplementation. Only covers the subset IBR actually uses:\n * - page.evaluate(fn, args) / page.evaluate(expression)\n * - page.$(selector) / page.$$(selector)\n * - page.goto(url, options)\n * - page.screenshot(options)\n * - page.addStyleTag({ content })\n * - page.waitForSelector(selector, options)\n * - page.waitForTimeout(ms)\n * - page.content() / page.title() / page.textContent(selector)\n * - page.getAttribute(selector, attr)\n * - page.click(selector) / page.fill(selector, value)\n * - page.on('console', handler)\n * - page.keyboard.press(key)\n * - page.locator(selector)\n */\n\nimport { EngineDriver } from './driver.js'\nimport { writeFile, mkdir } from 'fs/promises'\nimport { dirname } from 'path'\n\n/**\n * Element handle returned by $() and $$()\n */\nexport class CompatElementHandle {\n  constructor(\n    private driver: EngineDriver,\n    private nodeId: number,\n  ) {}\n\n  async screenshot(options?: { path?: string; type?: string }): Promise<Buffer> {\n    // Get box model for this nodeId, then clip screenshot\n    const model = await this.driver.domDomain.getBoxModel(this.nodeId)\n    const q = model.content\n    const x = Math.min(q[0], q[2], q[4], q[6])\n    const y = Math.min(q[1], q[3], q[5], q[7])\n\n    const buf = await this.driver.page.screenshot({\n      clip: { x, y, width: model.width, height: model.height },\n    })\n\n    if (options?.path) {\n      await mkdir(dirname(options.path), { recursive: true })\n      await writeFile(options.path, buf)\n    }\n\n    return buf\n  }\n\n  async textContent(): Promise<string | null> {\n    const html = await this.driver.domDomain.getOuterHTML(this.nodeId)\n    // Strip HTML tags for text content\n    return html.replace(/<[^>]*>/g, '').trim() || null\n  }\n\n  async boundingBox(): Promise<{ x: number; y: number; width: number; height: number } | null> {\n    try {\n      const model = await this.driver.domDomain.getBoxModel(this.nodeId)\n      const q = model.content\n      return {\n        x: Math.min(q[0], q[2], q[4], q[6]),\n        y: Math.min(q[1], q[3], q[5], q[7]),\n        width: model.width,\n        height: model.height,\n      }\n    } catch {\n      return null\n    }\n  }\n\n  async getAttribute(name: string): Promise<string | null> {\n    try {\n      const attrs = await this.driver.domDomain.getAttributes(this.nodeId)\n      return attrs[name] ?? null\n    } catch {\n      return null\n    }\n  }\n}\n\n/**\n * Minimal locator compatible with IBR's usage patterns.\n */\nexport class CompatLocator {\n  // Visible filter stored for potential future use in resolveNode\n  public visible = false\n\n  constructor(\n    private driver: EngineDriver,\n    private selector: string,\n  ) {}\n\n  filter(options: { visible?: boolean }): CompatLocator {\n    const loc = new CompatLocator(this.driver, this.selector)\n    loc.visible = options.visible ?? false\n    return loc\n  }\n\n  first(): CompatLocator {\n    return this // querySelector already returns first match\n  }\n\n  async click(_options?: { timeout?: number; force?: boolean }): Promise<void> {\n    const nodeId = await this.resolveNode(_options?.timeout)\n    if (!nodeId) throw new Error(`Element not found: ${this.selector}`)\n    // Use direct DOM click for reliability (matches Playwright behavior)\n    await this.driver.runtimeDomain.callFunctionOn(\n      '(sel) => { const el = document.querySelector(sel); if (el) el.click(); else throw new Error(\"Not found: \" + sel); }',\n      [this.selector],\n    )\n  }\n\n  async fill(text: string, _options?: { timeout?: number }): Promise<void> {\n    await this.driver.runtimeDomain.callFunctionOn(\n      `(sel, val) => {\n        const el = document.querySelector(sel);\n        if (!el) throw new Error('Not found: ' + sel);\n        el.value = val;\n        el.dispatchEvent(new Event('input', { bubbles: true }));\n        el.dispatchEvent(new Event('change', { bubbles: true }));\n      }`,\n      [this.selector, text],\n    )\n  }\n\n  async focus(_options?: { timeout?: number }): Promise<void> {\n    await this.driver.runtimeDomain.callFunctionOn(\n      '(sel) => { const el = document.querySelector(sel); if (el) el.focus(); }',\n      [this.selector],\n    )\n  }\n\n  async press(key: string, _options?: { timeout?: number }): Promise<void> {\n    await this.focus()\n    await this.driver.pressKey(key)\n  }\n\n  async pressSequentially(text: string, _options?: { delay?: number; timeout?: number }): Promise<void> {\n    await this.focus()\n    for (const char of text) {\n      await this.driver.runtimeDomain.callFunctionOn(\n        '(sel, ch) => { const el = document.querySelector(sel); if (el) { el.value += ch; el.dispatchEvent(new Event(\"input\", { bubbles: true })); } }',\n        [this.selector, char],\n      )\n    }\n  }\n\n  async waitFor(options?: { state?: string; timeout?: number }): Promise<void> {\n    const timeout = options?.timeout ?? 30000\n    const deadline = Date.now() + timeout\n    while (Date.now() < deadline) {\n      const nodeId = await this.driver.querySelector(this.selector)\n      if (nodeId) return\n      await new Promise((r) => setTimeout(r, 100))\n    }\n    throw new Error(`Timed out waiting for ${this.selector}`)\n  }\n\n  private async resolveNode(timeout?: number): Promise<number | null> {\n    const deadline = Date.now() + (timeout ?? 5000)\n    while (Date.now() < deadline) {\n      const nodeId = await this.driver.querySelector(this.selector)\n      if (nodeId) return nodeId\n      await new Promise((r) => setTimeout(r, 100))\n    }\n    return null\n  }\n}\n\ntype ConsoleHandler = (msg: { type: () => string; text: () => string }) => void\n\n/**\n * Playwright-compatible Page interface backed by EngineDriver.\n */\nexport class CompatPage {\n  private consoleHandlers: ConsoleHandler[] = []\n  private consoleListening = false\n\n  constructor(private driver: EngineDriver) {}\n\n  async goto(url: string, options?: { waitUntil?: string; timeout?: number }): Promise<void> {\n    await this.driver.navigate(url, {\n      waitFor: options?.waitUntil === 'networkidle' ? 'stable' : 'load',\n      timeout: options?.timeout,\n    })\n  }\n\n  async evaluate<T>(fnOrExpr: string | ((...args: unknown[]) => T), ...args: unknown[]): Promise<T> {\n    if (typeof fnOrExpr === 'function') {\n      const fnStr = fnOrExpr.toString()\n      if (args.length > 0) {\n        return this.driver.evaluate(`(${fnStr})`, ...args) as Promise<T>\n      }\n      return this.driver.evaluate(`(${fnStr})()`) as Promise<T>\n    }\n    if (args.length > 0) {\n      return this.driver.evaluate(fnOrExpr, ...args) as Promise<T>\n    }\n    return this.driver.evaluate(fnOrExpr) as Promise<T>\n  }\n\n  async $(selector: string): Promise<CompatElementHandle | null> {\n    const nodeId = await this.driver.querySelector(selector)\n    if (!nodeId) return null\n    return new CompatElementHandle(this.driver, nodeId)\n  }\n\n  async $$(selector: string): Promise<CompatElementHandle[]> {\n    const nodeIds = await this.driver.querySelectorAll(selector)\n    return nodeIds.map((id) => new CompatElementHandle(this.driver, id))\n  }\n\n  async screenshot(options?: { path?: string; fullPage?: boolean; type?: string }): Promise<Buffer> {\n    const buf = await this.driver.screenshot({\n      fullPage: options?.fullPage,\n    })\n    if (options?.path) {\n      await mkdir(dirname(options.path), { recursive: true })\n      await writeFile(options.path, buf)\n    }\n    return buf\n  }\n\n  async addStyleTag(options: { content: string }): Promise<void> {\n    await this.driver.addStyleTag(options.content)\n  }\n\n  async waitForSelector(selector: string, options?: { timeout?: number }): Promise<CompatElementHandle | null> {\n    const timeout = options?.timeout ?? 30000\n    const deadline = Date.now() + timeout\n    while (Date.now() < deadline) {\n      const nodeId = await this.driver.querySelector(selector)\n      if (nodeId) return new CompatElementHandle(this.driver, nodeId)\n      await new Promise((r) => setTimeout(r, 100))\n    }\n    throw new Error(`Timed out waiting for selector: ${selector}`)\n  }\n\n  async waitForTimeout(ms: number): Promise<void> {\n    await new Promise((r) => setTimeout(r, ms))\n  }\n\n  async waitForLoadState(_state?: string, _options?: { timeout?: number }): Promise<void> {\n    // Best effort: wait for AX tree stability\n    await this.driver.navigate(this.driver.url, { waitFor: 'stable', timeout: _options?.timeout ?? 10000 }).catch(() => {})\n  }\n\n  async waitForNavigation(): Promise<void> {\n    // Wait a bit for navigation to settle\n    await new Promise((r) => setTimeout(r, 500))\n  }\n\n  async content(): Promise<string> {\n    return this.driver.content()\n  }\n\n  async title(): Promise<string> {\n    return this.driver.title()\n  }\n\n  async textContent(selector: string): Promise<string | null> {\n    return this.driver.textContent(selector)\n  }\n\n  async innerText(selector: string): Promise<string> {\n    return this.driver.evaluate(\n      '(sel) => { const el = document.querySelector(sel); return el ? el.innerText : \"\"; }',\n      selector,\n    ) as Promise<string>\n  }\n\n  async getAttribute(selector: string, name: string): Promise<string | null> {\n    return this.driver.getAttribute(selector, name)\n  }\n\n  async click(selector: string, _options?: { timeout?: number }): Promise<void> {\n    await this.driver.runtimeDomain.callFunctionOn(\n      '(sel) => { const el = document.querySelector(sel); if (el) el.click(); else throw new Error(\"Not found: \" + sel); }',\n      [selector],\n    )\n  }\n\n  async fill(selector: string, value: string): Promise<void> {\n    await this.driver.runtimeDomain.callFunctionOn(\n      `(sel, val) => {\n        const el = document.querySelector(sel);\n        if (!el) throw new Error('Not found: ' + sel);\n        el.value = val;\n        el.dispatchEvent(new Event('input', { bubbles: true }));\n        el.dispatchEvent(new Event('change', { bubbles: true }));\n      }`,\n      [selector, value],\n    )\n  }\n\n  async type(selector: string, text: string, _options?: { delay?: number }): Promise<void> {\n    // Focus the element first, then type\n    await this.driver.runtimeDomain.callFunctionOn(\n      '(sel) => { const el = document.querySelector(sel); if (el) el.focus(); }',\n      [selector],\n    )\n    for (const char of text) {\n      await this.driver.runtimeDomain.callFunctionOn(\n        '(sel, ch) => { const el = document.querySelector(sel); if (el) { el.value += ch; el.dispatchEvent(new Event(\"input\", { bubbles: true })); } }',\n        [selector, char],\n      )\n    }\n  }\n\n  async check(selector: string): Promise<void> {\n    await this.driver.runtimeDomain.callFunctionOn(\n      '(sel) => { const el = document.querySelector(sel); if (el && !el.checked) el.click(); }',\n      [selector],\n    )\n  }\n\n  async uncheck(selector: string): Promise<void> {\n    await this.driver.runtimeDomain.callFunctionOn(\n      '(sel) => { const el = document.querySelector(sel); if (el && el.checked) el.click(); }',\n      [selector],\n    )\n  }\n\n  async selectOption(selector: string, value: string): Promise<void> {\n    await this.driver.runtimeDomain.callFunctionOn(\n      `(sel, val) => {\n        const el = document.querySelector(sel);\n        if (!el) throw new Error('Not found: ' + sel);\n        el.value = val;\n        el.dispatchEvent(new Event('change', { bubbles: true }));\n      }`,\n      [selector, value],\n    )\n  }\n\n  async hover(selector: string, _options?: { timeout?: number }): Promise<void> {\n    const nodeId = await this.driver.querySelector(selector)\n    if (!nodeId) throw new Error(`Element not found: ${selector}`)\n    const center = await this.driver.domDomain.getElementCenter(nodeId)\n    await this.driver.runtimeDomain.callFunctionOn(\n      '(x, y) => { const el = document.elementFromPoint(x, y); if (el) el.dispatchEvent(new MouseEvent(\"mouseenter\", { bubbles: true })); }',\n      [center.x, center.y],\n    )\n  }\n\n  locator(selector: string): CompatLocator {\n    return new CompatLocator(this.driver, selector)\n  }\n\n  on(event: string, handler: ConsoleHandler): void {\n    if (event === 'console') {\n      this.consoleHandlers.push(handler)\n      if (!this.consoleListening) {\n        this.consoleListening = true\n        this.driver.consoleDomain.onMessage((msg) => {\n          const compatMsg = {\n            type: () => msg.type,\n            text: () => msg.text,\n          }\n          for (const h of this.consoleHandlers) h(compatMsg)\n        })\n      }\n    }\n  }\n\n  url(): string {\n    return this.driver.url\n  }\n\n  keyboard = {\n    press: async (key: string): Promise<void> => {\n      await this.driver.pressKey(key)\n    },\n  }\n}\n","/**\n * Landmark Element Detection\n *\n * Detects common landmark elements on a page. Used for:\n * 1. Storing detected elements in baseline\n * 2. Comparing current elements against baseline\n * 3. Inferring expected elements from page intent when no baseline exists\n */\n\nimport type { PageLike as Page } from '../engine/page-like.js';\nimport type { LandmarkElement } from '../schemas.js';\nimport type { PageIntent } from './page-intent.js';\n\n/**\n * Standard landmark selectors\n */\nexport const LANDMARK_SELECTORS = {\n  logo: 'img[src*=\"logo\"], img[alt*=\"logo\" i], [class*=\"logo\"], [id*=\"logo\"], svg[class*=\"logo\"]',\n  header: 'header, [role=\"banner\"], [class*=\"header\"]:not([class*=\"subheader\"])',\n  navigation: 'nav, [role=\"navigation\"], [class*=\"nav\"]:not([class*=\"subnav\"])',\n  main: 'main, [role=\"main\"], [class*=\"main-content\"], #main',\n  footer: 'footer, [role=\"contentinfo\"], [class*=\"footer\"]',\n  sidebar: 'aside, [role=\"complementary\"], [class*=\"sidebar\"]',\n  search: 'input[type=\"search\"], [role=\"search\"], [class*=\"search-input\"], input[name*=\"search\"]',\n  heading: 'h1',\n  userMenu: '[class*=\"user-menu\"], [class*=\"avatar\"], [class*=\"profile\"], [class*=\"account\"]',\n  loginForm: 'form:has(input[type=\"password\"])',\n  heroSection: '[class*=\"hero\"], [class*=\"banner\"], [class*=\"jumbotron\"]',\n  ctaButton: '[class*=\"cta\"], a[class*=\"primary\"], button[class*=\"primary\"]',\n} as const;\n\nexport type LandmarkType = keyof typeof LANDMARK_SELECTORS;\n\n/**\n * Detect all landmark elements on a page\n */\nexport async function detectLandmarks(page: Page): Promise<LandmarkElement[]> {\n  const landmarks: LandmarkElement[] = [];\n\n  for (const [name, selector] of Object.entries(LANDMARK_SELECTORS)) {\n    try {\n      const element = await page.$(selector);\n      if (element) {\n        const box = await element.boundingBox();\n        landmarks.push({\n          name,\n          selector,\n          found: true,\n          bounds: box ? {\n            x: Math.round(box.x),\n            y: Math.round(box.y),\n            width: Math.round(box.width),\n            height: Math.round(box.height),\n          } : undefined,\n        });\n      } else {\n        landmarks.push({\n          name,\n          selector,\n          found: false,\n        });\n      }\n    } catch {\n      landmarks.push({\n        name,\n        selector,\n        found: false,\n      });\n    }\n  }\n\n  return landmarks;\n}\n\n/**\n * Get expected landmarks based on page intent\n * Used when no baseline exists\n */\nexport function getExpectedLandmarksForIntent(intent: PageIntent): LandmarkType[] {\n  const common: LandmarkType[] = ['header', 'navigation', 'main', 'footer', 'logo'];\n\n  const intentSpecific: Record<PageIntent, LandmarkType[]> = {\n    auth: ['loginForm', 'logo'],\n    form: ['heading'],\n    listing: ['search', 'heading'],\n    detail: ['heading'],\n    dashboard: ['sidebar', 'userMenu', 'heading'],\n    error: ['heading'],\n    landing: ['heroSection', 'ctaButton', 'heading'],\n    empty: ['heading'],\n    unknown: [],\n  };\n\n  // Combine common + intent-specific, dedupe\n  const expected = [...new Set([...common, ...(intentSpecific[intent] || [])])];\n  return expected;\n}\n\n/**\n * Compare current landmarks against baseline\n * Returns missing and new elements\n */\nexport function compareLandmarks(\n  baseline: LandmarkElement[],\n  current: LandmarkElement[]\n): {\n  missing: LandmarkElement[];  // Were in baseline, not in current\n  added: LandmarkElement[];    // In current, not in baseline\n  unchanged: LandmarkElement[];\n} {\n  const baselineFound = baseline.filter(l => l.found);\n  const currentFound = current.filter(l => l.found);\n\n  const baselineNames = new Set(baselineFound.map(l => l.name));\n  const currentNames = new Set(currentFound.map(l => l.name));\n\n  const missing = baselineFound.filter(l => !currentNames.has(l.name));\n  const added = currentFound.filter(l => !baselineNames.has(l.name));\n  const unchanged = currentFound.filter(l => baselineNames.has(l.name));\n\n  return { missing, added, unchanged };\n}\n\n/**\n * Get expected landmarks based on user context (CLAUDE.md design framework)\n */\nexport function getExpectedLandmarksFromContext(\n  framework: { principles: string[] } | null\n): LandmarkType[] {\n  if (!framework) return [];\n\n  const expected: LandmarkType[] = [];\n\n  // Parse principles for landmark requirements\n  const principlesText = framework.principles.join(' ').toLowerCase();\n\n  if (principlesText.includes('logo') || principlesText.includes('brand')) {\n    expected.push('logo');\n  }\n  if (principlesText.includes('navigation') || principlesText.includes('nav')) {\n    expected.push('navigation');\n  }\n  if (principlesText.includes('header') || principlesText.includes('banner')) {\n    expected.push('header');\n  }\n  if (principlesText.includes('footer')) {\n    expected.push('footer');\n  }\n  if (principlesText.includes('sidebar')) {\n    expected.push('sidebar');\n  }\n  if (principlesText.includes('search')) {\n    expected.push('search');\n  }\n  if (principlesText.includes('cta') || principlesText.includes('call-to-action')) {\n    expected.push('ctaButton');\n  }\n  if (principlesText.includes('hero')) {\n    expected.push('heroSection');\n  }\n\n  return expected;\n}\n\n/**\n * Format landmark comparison for display\n */\nexport function formatLandmarkComparison(\n  comparison: ReturnType<typeof compareLandmarks>\n): string {\n  const lines: string[] = [];\n\n  if (comparison.missing.length > 0) {\n    lines.push('Missing (were in baseline):');\n    for (const el of comparison.missing) {\n      lines.push(`  ! ${el.name}`);\n    }\n  }\n\n  if (comparison.added.length > 0) {\n    lines.push('New (not in baseline):');\n    for (const el of comparison.added) {\n      lines.push(`  + ${el.name}`);\n    }\n  }\n\n  if (comparison.unchanged.length > 0) {\n    lines.push('Unchanged:');\n    for (const el of comparison.unchanged) {\n      lines.push(`  ✓ ${el.name}`);\n    }\n  }\n\n  return lines.join('\\n');\n}\n","/**\n * Page Intent Classification\n *\n * Classifies pages by their semantic purpose based on DOM analysis.\n * This helps AI agents understand what kind of page they're looking at\n * without parsing raw accessibility trees.\n */\n\nimport type { PageLike as Page } from '../engine/page-like.js';\n\nexport type PageIntent =\n  | 'auth'        // Login, register, forgot-password, reset-password\n  | 'form'        // Contact, settings, profile edit, checkout\n  | 'listing'     // Search results, product grid, table, feed\n  | 'detail'      // Product page, article, profile view, single item\n  | 'dashboard'   // Admin panel, user home, analytics\n  | 'error'       // 404, 500, access denied, maintenance\n  | 'landing'     // Marketing page, homepage with CTA\n  | 'empty'       // Empty state, no content\n  | 'unknown';\n\nexport interface PageIntentResult {\n  intent: PageIntent;\n  confidence: number;        // 0-1\n  signals: string[];         // What led to this classification\n  secondaryIntent?: PageIntent; // If page has mixed signals\n}\n\ninterface IntentSignals {\n  auth: number;\n  form: number;\n  listing: number;\n  detail: number;\n  dashboard: number;\n  error: number;\n  landing: number;\n  empty: number;\n}\n\n/**\n * Classify page intent from DOM analysis\n */\nexport async function classifyPageIntent(page: Page): Promise<PageIntentResult> {\n  const signals: string[] = [];\n  const scores: IntentSignals = {\n    auth: 0,\n    form: 0,\n    listing: 0,\n    detail: 0,\n    dashboard: 0,\n    error: 0,\n    landing: 0,\n    empty: 0,\n  };\n\n  // Run all checks in parallel for speed\n  const checks = await page.evaluate(() => {\n    const doc = document;\n    const body = doc.body;\n    const text = body?.innerText?.toLowerCase() || '';\n\n    // Helper to count elements\n    const count = (selector: string) => doc.querySelectorAll(selector).length;\n    const exists = (selector: string) => count(selector) > 0;\n    const textContains = (terms: string[]) => terms.some(t => text.includes(t));\n\n    return {\n      // Auth signals\n      hasPasswordField: exists('input[type=\"password\"]'),\n      hasEmailField: exists('input[type=\"email\"], input[name*=\"email\"], input[name*=\"username\"]'),\n      hasLoginText: textContains(['sign in', 'log in', 'login', 'sign up', 'register', 'forgot password', 'reset password']),\n      hasRememberMe: exists('input[type=\"checkbox\"][name*=\"remember\"]') || Array.from(doc.querySelectorAll('label')).some(l => l.textContent?.toLowerCase().includes('remember')),\n      hasOAuthButtons: exists('[class*=\"google\"], [class*=\"facebook\"], [class*=\"github\"], [class*=\"oauth\"], [class*=\"social\"]'),\n\n      // Form signals\n      formCount: count('form'),\n      inputCount: count('input:not([type=\"hidden\"]):not([type=\"search\"])'),\n      textareaCount: count('textarea'),\n      selectCount: count('select'),\n      hasSubmitButton: exists('button[type=\"submit\"], input[type=\"submit\"]'),\n      hasFormLabels: count('label') > 2,\n\n      // Listing signals\n      listItemCount: count('li, [class*=\"item\"], [class*=\"card\"], [class*=\"row\"]'),\n      hasGrid: exists('[class*=\"grid\"], [class*=\"list\"], [class*=\"feed\"]'),\n      hasTable: exists('table tbody tr'),\n      hasPagination: exists('[class*=\"pagination\"], [class*=\"pager\"], nav[aria-label*=\"page\"]'),\n      hasFilters: exists('[class*=\"filter\"], [class*=\"sort\"], [class*=\"facet\"]'),\n      repeatingSimilarElements: (() => {\n        const cards = doc.querySelectorAll('[class*=\"card\"], [class*=\"item\"]');\n        if (cards.length < 3) return false;\n        const classes = Array.from(cards).map(c => c.className);\n        const unique = new Set(classes);\n        return unique.size <= 3; // Similar classes = listing\n      })(),\n\n      // Detail signals\n      hasMainArticle: exists('article, main > [class*=\"content\"], [class*=\"detail\"]'),\n      hasLongContent: text.length > 2000,\n      hasSingleHeading: count('h1') === 1,\n      hasMetadata: exists('[class*=\"meta\"], [class*=\"author\"], [class*=\"date\"], time'),\n      hasComments: exists('[class*=\"comment\"], [id*=\"comment\"]'),\n      hasSocialShare: exists('[class*=\"share\"], [class*=\"social\"]'),\n\n      // Dashboard signals\n      hasCharts: exists('canvas, svg[class*=\"chart\"], [class*=\"chart\"], [class*=\"graph\"]'),\n      hasStats: exists('[class*=\"stat\"], [class*=\"metric\"], [class*=\"kpi\"]'),\n      hasSidebar: exists('aside, [class*=\"sidebar\"], nav[class*=\"side\"]'),\n      hasWidgets: exists('[class*=\"widget\"], [class*=\"panel\"], [class*=\"tile\"]'),\n      hasUserMenu: exists('[class*=\"user\"], [class*=\"avatar\"], [class*=\"profile\"]'),\n      hasNavTabs: exists('[role=\"tablist\"], [class*=\"tabs\"]'),\n\n      // Error signals\n      hasErrorCode: textContains(['404', '500', '403', '401', 'not found', 'error', 'denied', 'forbidden']),\n      hasErrorClass: exists('[class*=\"error\"], [class*=\"404\"], [class*=\"500\"]'),\n      isMinimalContent: text.length < 200,\n      hasBackLink: textContains(['go back', 'go home', 'return']),\n\n      // Landing signals\n      hasHero: exists('[class*=\"hero\"], [class*=\"banner\"], [class*=\"jumbotron\"]'),\n      hasCTA: exists('[class*=\"cta\"], [class*=\"call-to-action\"], a[class*=\"primary\"]'),\n      hasTestimonials: exists('[class*=\"testimonial\"], [class*=\"review\"], [class*=\"quote\"]'),\n      hasPricing: exists('[class*=\"pricing\"], [class*=\"plan\"]'),\n      hasFeatures: exists('[class*=\"feature\"], [class*=\"benefit\"]'),\n\n      // Empty signals\n      hasEmptyState: exists('[class*=\"empty\"], [class*=\"no-data\"], [class*=\"no-results\"]'),\n      hasEmptyText: textContains(['no results', 'nothing here', 'no items', 'empty']),\n\n      // General metrics\n      totalElements: count('*'),\n      interactiveElements: count('a, button, input, select, textarea'),\n    };\n  });\n\n  // Score auth intent\n  if (checks.hasPasswordField) {\n    scores.auth += 40;\n    signals.push('password field present');\n  }\n  if (checks.hasEmailField && checks.hasPasswordField) {\n    scores.auth += 20;\n    signals.push('email + password combination');\n  }\n  if (checks.hasLoginText) {\n    scores.auth += 15;\n    signals.push('login-related text');\n  }\n  if (checks.hasRememberMe) {\n    scores.auth += 10;\n    signals.push('remember me checkbox');\n  }\n  if (checks.hasOAuthButtons) {\n    scores.auth += 10;\n    signals.push('OAuth buttons');\n  }\n\n  // Score form intent (but not auth)\n  if (checks.formCount > 0 && !checks.hasPasswordField) {\n    scores.form += 20;\n    signals.push('form without password');\n  }\n  if (checks.inputCount > 3 && !checks.hasPasswordField) {\n    scores.form += 15;\n    signals.push('multiple input fields');\n  }\n  if (checks.textareaCount > 0) {\n    scores.form += 15;\n    signals.push('textarea present');\n  }\n  if (checks.hasFormLabels && checks.inputCount > 2) {\n    scores.form += 10;\n    signals.push('labeled form fields');\n  }\n\n  // Score listing intent\n  if (checks.listItemCount > 5) {\n    scores.listing += 25;\n    signals.push(`${checks.listItemCount} list items`);\n  }\n  if (checks.hasGrid) {\n    scores.listing += 15;\n    signals.push('grid/list layout');\n  }\n  if (checks.hasTable) {\n    scores.listing += 20;\n    signals.push('data table');\n  }\n  if (checks.hasPagination) {\n    scores.listing += 20;\n    signals.push('pagination');\n  }\n  if (checks.hasFilters) {\n    scores.listing += 15;\n    signals.push('filters/sorting');\n  }\n  if (checks.repeatingSimilarElements) {\n    scores.listing += 15;\n    signals.push('repeating card elements');\n  }\n\n  // Score detail intent\n  if (checks.hasMainArticle) {\n    scores.detail += 25;\n    signals.push('main article element');\n  }\n  if (checks.hasLongContent) {\n    scores.detail += 20;\n    signals.push('long content');\n  }\n  if (checks.hasSingleHeading && checks.hasMetadata) {\n    scores.detail += 20;\n    signals.push('single heading with metadata');\n  }\n  if (checks.hasComments) {\n    scores.detail += 15;\n    signals.push('comments section');\n  }\n  if (checks.hasSocialShare) {\n    scores.detail += 10;\n    signals.push('social share buttons');\n  }\n\n  // Score dashboard intent\n  if (checks.hasCharts) {\n    scores.dashboard += 30;\n    signals.push('charts/graphs');\n  }\n  if (checks.hasStats) {\n    scores.dashboard += 25;\n    signals.push('stats/metrics');\n  }\n  if (checks.hasSidebar && checks.hasWidgets) {\n    scores.dashboard += 20;\n    signals.push('sidebar with widgets');\n  }\n  if (checks.hasNavTabs) {\n    scores.dashboard += 10;\n    signals.push('navigation tabs');\n  }\n  if (checks.hasUserMenu) {\n    scores.dashboard += 10;\n    signals.push('user menu');\n  }\n\n  // Score error intent\n  if (checks.hasErrorCode && checks.isMinimalContent) {\n    scores.error += 50;\n    signals.push('error code with minimal content');\n  }\n  if (checks.hasErrorClass) {\n    scores.error += 30;\n    signals.push('error CSS class');\n  }\n  if (checks.hasBackLink && checks.isMinimalContent) {\n    scores.error += 20;\n    signals.push('back link on minimal page');\n  }\n\n  // Score landing intent\n  if (checks.hasHero) {\n    scores.landing += 25;\n    signals.push('hero section');\n  }\n  if (checks.hasCTA) {\n    scores.landing += 20;\n    signals.push('call-to-action');\n  }\n  if (checks.hasTestimonials) {\n    scores.landing += 15;\n    signals.push('testimonials');\n  }\n  if (checks.hasPricing) {\n    scores.landing += 20;\n    signals.push('pricing section');\n  }\n  if (checks.hasFeatures) {\n    scores.landing += 15;\n    signals.push('features section');\n  }\n\n  // Score empty intent\n  if (checks.hasEmptyState) {\n    scores.empty += 40;\n    signals.push('empty state element');\n  }\n  if (checks.hasEmptyText && checks.listItemCount === 0) {\n    scores.empty += 30;\n    signals.push('empty text with no items');\n  }\n\n  // Find highest scoring intent\n  const entries = Object.entries(scores) as [PageIntent, number][];\n  entries.sort((a, b) => b[1] - a[1]);\n\n  const [topIntent, topScore] = entries[0];\n  const [secondIntent, secondScore] = entries[1];\n\n  // Calculate confidence (normalize to 0-1)\n  const maxPossible = 100;\n  const confidence = Math.min(topScore / maxPossible, 1);\n\n  // Determine if there's a secondary intent worth mentioning\n  const hasSecondary = secondScore > 30 && secondScore > topScore * 0.5;\n\n  return {\n    intent: topScore > 20 ? topIntent : 'unknown',\n    confidence,\n    signals: signals.slice(0, 5), // Top 5 signals\n    secondaryIntent: hasSecondary ? secondIntent : undefined,\n  };\n}\n\n/**\n * Get human-readable description of page intent\n */\nexport function getIntentDescription(intent: PageIntent): string {\n  const descriptions: Record<PageIntent, string> = {\n    auth: 'Authentication page (login, register, password reset)',\n    form: 'Form page (data entry, settings, contact)',\n    listing: 'Listing page (search results, product grid, table)',\n    detail: 'Detail page (article, product, profile)',\n    dashboard: 'Dashboard (admin panel, analytics, user home)',\n    error: 'Error page (404, 500, access denied)',\n    landing: 'Landing page (marketing, homepage)',\n    empty: 'Empty state (no content)',\n    unknown: 'Unknown page type',\n  };\n  return descriptions[intent];\n}\n","/**\n * Page State Detection\n *\n * Detects authentication state, loading state, and errors on a page.\n * Provides AI agents with actionable state information.\n */\n\nimport type { PageLike as Page } from '../engine/page-like.js';\n\nexport interface AuthState {\n  authenticated: boolean | null; // null = can't determine\n  confidence: number;\n  signals: string[];\n  username?: string; // If we can extract it\n  // Auth page heuristic signals (populated when page intent is auth)\n  socialLoginProviders: string[];   // e.g. ['google', 'github']\n  hasForgotPassword: boolean;\n  hasSignupLink: boolean;            // already partially detected\n  hasPasswordToggle: boolean;\n}\n\nexport interface LoadingState {\n  loading: boolean;\n  type: 'spinner' | 'skeleton' | 'progress' | 'lazy' | 'none';\n  elements: number; // Count of loading indicators\n}\n\nexport interface ErrorState {\n  hasErrors: boolean;\n  errors: ErrorInfo[];\n  severity: 'none' | 'warning' | 'error' | 'critical';\n}\n\nexport interface ErrorInfo {\n  type: 'validation' | 'api' | 'permission' | 'notfound' | 'server' | 'network' | 'unknown';\n  message: string;\n  element?: string; // Selector hint\n}\n\nexport interface PageState {\n  auth: AuthState;\n  loading: LoadingState;\n  errors: ErrorState;\n  ready: boolean; // True if page is ready for interaction\n}\n\n/**\n * Detect authentication state from page signals\n */\nexport async function detectAuthState(page: Page): Promise<AuthState> {\n  const signals: string[] = [];\n  let authenticated: boolean | null = null;\n  let confidence = 0;\n  let username: string | undefined;\n\n  const checks = await page.evaluate(() => {\n    const doc = document;\n    const text = doc.body?.innerText?.toLowerCase() || '';\n\n    // Helper: find element by tag where text content matches (case-insensitive)\n    function findByText(tags: string[], patterns: string[]): Element | null {\n      for (const tag of tags) {\n        for (const el of Array.from(doc.querySelectorAll(tag))) {\n          const t = el.textContent?.trim().toLowerCase() || '';\n          if (patterns.some(p => t === p || t.includes(p))) return el;\n        }\n      }\n      return null;\n    }\n\n    // Authenticated signals\n    const logoutButton = findByText(['button', 'a'], ['logout', 'sign out']) ||\n      doc.querySelector('[class*=\"logout\"], [data-testid*=\"logout\"]');\n    const userMenu = doc.querySelector(\n      '[class*=\"user-menu\"], [class*=\"avatar\"], [class*=\"profile-menu\"], ' +\n      '[class*=\"account-menu\"], [data-testid*=\"user\"]'\n    );\n    const welcomeText = text.match(/welcome,?\\s+(\\w+)/i);\n    const userNameEl = doc.querySelector(\n      '[class*=\"username\"], [class*=\"user-name\"], [class*=\"display-name\"]'\n    );\n\n    // Not authenticated signals\n    const loginLink = findByText(['a', 'button'], ['login', 'sign in']) ||\n      doc.querySelector('[class*=\"login-link\"], [href*=\"/login\"], [href*=\"/signin\"]');\n    const signupLink = findByText(['a'], ['sign up', 'register']) ||\n      doc.querySelector('[href*=\"/signup\"], [href*=\"/register\"]');\n\n    // Check for auth-gated content\n    const authRequired = doc.querySelector(\n      '[class*=\"auth-required\"], [class*=\"login-required\"], ' +\n      '[class*=\"protected\"]'\n    );\n\n    // Check cookies/localStorage hints (careful - limited access)\n    let hasAuthCookie = false;\n    try {\n      hasAuthCookie = document.cookie.includes('auth') ||\n        document.cookie.includes('session') ||\n        document.cookie.includes('token');\n    } catch {\n      // SecurityError: httpOnly or __Secure- cookies can't be read via JS\n    }\n\n    // Social login providers\n    const socialProviderPatterns = ['google', 'github', 'apple', 'microsoft', 'facebook', 'discord'];\n    const socialTriggerPhrases = ['sign in with', 'continue with'];\n    const socialProviders: string[] = [];\n    const socialElements = Array.from(doc.querySelectorAll(\n      'button, a, [class*=\"social\"], [class*=\"oauth\"], [class*=\"provider\"]'\n    ));\n    for (const el of socialElements) {\n      const t = el.textContent?.trim().toLowerCase() || '';\n      const cls = el.className?.toLowerCase() || '';\n      for (const provider of socialProviderPatterns) {\n        if (!socialProviders.includes(provider)) {\n          if (t.includes(provider) || cls.includes(provider)) {\n            // Make sure it looks like a login trigger (not just a footer link mentioning the name)\n            const isTriggered = socialTriggerPhrases.some(ph => t.includes(ph)) ||\n              t === provider ||\n              t === `sign in with ${provider}` ||\n              t === `continue with ${provider}` ||\n              cls.includes('social') || cls.includes('oauth') || cls.includes('provider');\n            if (isTriggered) socialProviders.push(provider);\n          }\n        }\n      }\n    }\n\n    // Forgot password link\n    const forgotPasswordPatterns = ['forgot', 'reset password', \"can't sign in\", 'trouble signing in', 'lost password'];\n    const forgotEl = findByText(['a', 'button'], forgotPasswordPatterns) ||\n      doc.querySelector('[href*=\"forgot\"], [href*=\"reset-password\"], [href*=\"password-reset\"]');\n\n    // Password visibility toggle\n    const toggleEl = doc.querySelector(\n      '[aria-label*=\"show password\" i], [aria-label*=\"hide password\" i], [aria-label*=\"toggle password\" i], ' +\n      '[class*=\"eye\"], [class*=\"visibility\"], [class*=\"toggle-password\"]'\n    );\n    // Also check for a button inside or adjacent to a password input container\n    let hasPasswordToggle = !!toggleEl;\n    if (!hasPasswordToggle) {\n      const passwordInput = doc.querySelector('input[type=\"password\"]');\n      if (passwordInput) {\n        const parent = passwordInput.parentElement;\n        const sibling = passwordInput.nextElementSibling;\n        if (parent?.querySelector('button')) hasPasswordToggle = true;\n        if (sibling?.tagName === 'BUTTON') hasPasswordToggle = true;\n      }\n    }\n\n    return {\n      hasLogoutButton: !!logoutButton,\n      hasUserMenu: !!userMenu,\n      hasWelcomeText: !!welcomeText,\n      welcomeName: welcomeText?.[1],\n      hasUserNameElement: !!userNameEl,\n      userName: userNameEl?.textContent?.trim(),\n      hasLoginLink: !!loginLink,\n      hasSignupLink: !!signupLink,\n      hasAuthRequired: !!authRequired,\n      hasAuthCookie,\n      socialLoginProviders: socialProviders,\n      hasForgotPassword: !!forgotEl,\n      hasPasswordToggle,\n    };\n  });\n\n  // Score authenticated signals\n  if (checks.hasLogoutButton) {\n    authenticated = true;\n    confidence += 40;\n    signals.push('logout button present');\n  }\n  if (checks.hasUserMenu) {\n    authenticated = true;\n    confidence += 30;\n    signals.push('user menu present');\n  }\n  if (checks.hasWelcomeText) {\n    authenticated = true;\n    confidence += 20;\n    signals.push('welcome text');\n    username = checks.welcomeName;\n  }\n  if (checks.hasUserNameElement) {\n    authenticated = true;\n    confidence += 15;\n    signals.push('username displayed');\n    username = username || checks.userName;\n  }\n  if (checks.hasAuthCookie) {\n    confidence += 10;\n    signals.push('auth cookie present');\n  }\n\n  // Score not authenticated signals\n  if (checks.hasLoginLink && !checks.hasLogoutButton) {\n    authenticated = false;\n    confidence += 30;\n    signals.push('login link visible');\n  }\n  if (checks.hasSignupLink && !checks.hasUserMenu) {\n    authenticated = false;\n    confidence += 20;\n    signals.push('signup link visible');\n  }\n  if (checks.hasAuthRequired) {\n    authenticated = false;\n    confidence += 25;\n    signals.push('auth-required message');\n  }\n\n  // Auth page heuristic signals\n  if (checks.socialLoginProviders.length > 0) {\n    signals.push(`social login: ${checks.socialLoginProviders.join(', ')}`);\n  }\n  if (checks.hasForgotPassword) {\n    signals.push('forgot password link present');\n  }\n  if (checks.hasPasswordToggle) {\n    signals.push('password visibility toggle present');\n  }\n\n  // Normalize confidence\n  confidence = Math.min(confidence / 100, 1);\n\n  // If no strong signals, we can't determine\n  if (confidence < 0.3) {\n    authenticated = null;\n  }\n\n  return {\n    authenticated,\n    confidence,\n    signals,\n    username,\n    socialLoginProviders: checks.socialLoginProviders,\n    hasForgotPassword: checks.hasForgotPassword,\n    hasSignupLink: checks.hasSignupLink,\n    hasPasswordToggle: checks.hasPasswordToggle,\n  };\n}\n\n/**\n * Detect loading state from page signals\n */\nexport async function detectLoadingState(page: Page): Promise<LoadingState> {\n  const checks = await page.evaluate(() => {\n    const doc = document;\n\n    // Spinner detection\n    const spinners = doc.querySelectorAll(\n      '[class*=\"spinner\"], [class*=\"loading\"], [class*=\"loader\"], ' +\n      '[role=\"progressbar\"][aria-busy=\"true\"], ' +\n      '.animate-spin, [class*=\"spin\"]'\n    );\n\n    // Skeleton detection\n    const skeletons = doc.querySelectorAll(\n      '[class*=\"skeleton\"], [class*=\"shimmer\"], [class*=\"placeholder\"], ' +\n      '[class*=\"pulse\"], [aria-busy=\"true\"]'\n    );\n\n    // Progress bar detection\n    const progress = doc.querySelectorAll(\n      'progress, [role=\"progressbar\"], [class*=\"progress-bar\"], ' +\n      '[class*=\"loading-bar\"]'\n    );\n\n    // Lazy loading detection\n    const lazyImages = doc.querySelectorAll(\n      'img[loading=\"lazy\"]:not([src]), [class*=\"lazy\"]:not([src])'\n    );\n\n    // Check if body has loading class\n    const bodyLoading = doc.body?.classList.contains('loading') ||\n      doc.body?.getAttribute('aria-busy') === 'true';\n\n    return {\n      spinnerCount: spinners.length,\n      skeletonCount: skeletons.length,\n      progressCount: progress.length,\n      lazyCount: lazyImages.length,\n      bodyLoading,\n    };\n  });\n\n  // Determine loading type\n  let type: LoadingState['type'] = 'none';\n  let elements = 0;\n  let loading = false;\n\n  if (checks.spinnerCount > 0) {\n    type = 'spinner';\n    elements = checks.spinnerCount;\n    loading = true;\n  } else if (checks.skeletonCount > 0) {\n    type = 'skeleton';\n    elements = checks.skeletonCount;\n    loading = true;\n  } else if (checks.progressCount > 0) {\n    type = 'progress';\n    elements = checks.progressCount;\n    loading = true;\n  } else if (checks.lazyCount > 0) {\n    type = 'lazy';\n    elements = checks.lazyCount;\n    loading = true;\n  } else if (checks.bodyLoading) {\n    type = 'spinner';\n    loading = true;\n  }\n\n  return { loading, type, elements };\n}\n\n/**\n * Detect error state from page signals\n */\nexport async function detectErrorState(page: Page): Promise<ErrorState> {\n  const errors: ErrorInfo[] = [];\n\n  const checks = await page.evaluate(() => {\n    const doc = document;\n    const text = doc.body?.innerText || '';\n\n    // Validation errors\n    const validationErrors = doc.querySelectorAll(\n      '[class*=\"error\"]:not([class*=\"error-boundary\"]), ' +\n      '[class*=\"invalid\"], [aria-invalid=\"true\"], ' +\n      '.field-error, .form-error, .validation-error'\n    );\n\n    // API/Server errors\n    const apiErrors = doc.querySelectorAll(\n      '[class*=\"api-error\"], [class*=\"server-error\"], ' +\n      '[class*=\"fetch-error\"], [class*=\"network-error\"]'\n    );\n\n    // Permission errors\n    const permissionText = text.match(/access denied|forbidden|unauthorized|not allowed/i);\n\n    // 404 errors\n    const notFoundText = text.match(/not found|404|page doesn't exist|no longer available/i);\n\n    // Server errors\n    const serverText = text.match(/500|server error|something went wrong|internal error/i);\n\n    // Toast/notification errors\n    const toastErrors = doc.querySelectorAll(\n      '[class*=\"toast\"][class*=\"error\"], [class*=\"notification\"][class*=\"error\"], ' +\n      '[role=\"alert\"][class*=\"error\"], [class*=\"snackbar\"][class*=\"error\"]'\n    );\n\n    // Extract error messages\n    const extractText = (el: Element) => el.textContent?.trim().slice(0, 200) || '';\n\n    return {\n      validationErrors: Array.from(validationErrors).map(extractText).filter(Boolean),\n      apiErrors: Array.from(apiErrors).map(extractText).filter(Boolean),\n      toastErrors: Array.from(toastErrors).map(extractText).filter(Boolean),\n      hasPermissionError: !!permissionText,\n      hasNotFoundError: !!notFoundText,\n      hasServerError: !!serverText,\n    };\n  });\n\n  // Build error list\n  if (checks.hasPermissionError) {\n    errors.push({\n      type: 'permission',\n      message: 'Access denied or unauthorized',\n    });\n  }\n\n  if (checks.hasNotFoundError) {\n    errors.push({\n      type: 'notfound',\n      message: 'Page or resource not found',\n    });\n  }\n\n  if (checks.hasServerError) {\n    errors.push({\n      type: 'server',\n      message: 'Server error occurred',\n    });\n  }\n\n  for (const msg of checks.validationErrors) {\n    errors.push({\n      type: 'validation',\n      message: msg,\n    });\n  }\n\n  for (const msg of checks.apiErrors) {\n    errors.push({\n      type: 'api',\n      message: msg,\n    });\n  }\n\n  for (const msg of checks.toastErrors) {\n    errors.push({\n      type: 'unknown',\n      message: msg,\n    });\n  }\n\n  // Determine severity\n  let severity: ErrorState['severity'] = 'none';\n  if (errors.length > 0) {\n    const hasCritical = errors.some(e =>\n      e.type === 'server' || e.type === 'permission'\n    );\n    const hasError = errors.some(e =>\n      e.type === 'api' || e.type === 'notfound'\n    );\n    const hasWarning = errors.some(e => e.type === 'validation');\n\n    if (hasCritical) severity = 'critical';\n    else if (hasError) severity = 'error';\n    else if (hasWarning) severity = 'warning';\n  }\n\n  return {\n    hasErrors: errors.length > 0,\n    errors,\n    severity,\n  };\n}\n\n/**\n * Detect full page state\n */\nexport async function detectPageState(page: Page): Promise<PageState> {\n  const [auth, loading, errors] = await Promise.all([\n    detectAuthState(page),\n    detectLoadingState(page),\n    detectErrorState(page),\n  ]);\n\n  // Page is ready if not loading and no critical errors\n  const ready = !loading.loading &&\n    errors.severity !== 'critical' &&\n    errors.severity !== 'error';\n\n  return {\n    auth,\n    loading,\n    errors,\n    ready,\n  };\n}\n\n/**\n * Wait for page to be ready (not loading, no errors)\n */\nexport async function waitForPageReady(\n  page: Page,\n  options: { timeout?: number; ignoreErrors?: boolean } = {}\n): Promise<PageState> {\n  const { timeout = 10000, ignoreErrors = false } = options;\n  const startTime = Date.now();\n\n  while (Date.now() - startTime < timeout) {\n    const state = await detectPageState(page);\n\n    if (!state.loading.loading) {\n      if (ignoreErrors || !state.errors.hasErrors) {\n        return state;\n      }\n    }\n\n    // Wait a bit before checking again\n    await page.waitForTimeout(200);\n  }\n\n  // Return final state even if not ready\n  return detectPageState(page);\n}\n","/**\n * Semantic Output Formatter\n *\n * Transforms raw page data into AI-friendly semantic output.\n * Provides verdicts, recommendations, and recovery hints.\n */\n\nimport type { PageLike as Page } from '../engine/page-like.js';\nimport { classifyPageIntent, type PageIntent, type PageIntentResult } from './page-intent.js';\nimport { detectPageState, type PageState } from './state-detector.js';\n\nexport type SemanticVerdict = 'PASS' | 'ISSUES' | 'FAIL' | 'LOADING' | 'ERROR';\n\nexport interface SemanticIssue {\n  severity: 'critical' | 'major' | 'minor';\n  type: string;\n  element?: string;      // Human-readable description or selector\n  problem: string;\n  fix: string;\n}\n\nexport interface AvailableAction {\n  action: string;        // e.g., 'login', 'search', 'submit'\n  selector?: string;     // Best selector to use\n  description: string;   // What this action does\n}\n\nexport interface RecoveryHint {\n  suggestion: string;\n  alternatives?: string[];\n  waitFor?: string;      // Selector to wait for\n}\n\nexport interface SemanticResult {\n  // Primary verdict for decision loops\n  verdict: SemanticVerdict;\n  confidence: number;\n\n  // Page understanding\n  pageIntent: PageIntentResult;\n  state: PageState;\n\n  // What can be done on this page\n  availableActions: AvailableAction[];\n\n  // Issues found (if any)\n  issues: SemanticIssue[];\n\n  // Recovery suggestions (if failed)\n  recovery?: RecoveryHint;\n\n  // Summary for AI reasoning\n  summary: string;\n\n  // Raw data for advanced use\n  url: string;\n  title: string;\n  timestamp: string;\n}\n\n/**\n * Get semantic understanding of a page\n */\nexport async function getSemanticOutput(page: Page): Promise<SemanticResult> {\n  // Get page basics\n  const url = page.url?.() ?? '';\n  const title = await page.title();\n  const timestamp = new Date().toISOString();\n\n  // Run semantic analysis in parallel\n  const [pageIntent, state] = await Promise.all([\n    classifyPageIntent(page),\n    detectPageState(page),\n  ]);\n\n  // Detect available actions based on intent\n  const availableActions = await detectAvailableActions(page, pageIntent.intent);\n\n  // Collect issues\n  const issues = collectIssues(state, pageIntent, url);\n\n  // Determine verdict\n  const verdict = determineVerdict(state, issues);\n\n  // Generate recovery hints if needed\n  const recovery = verdict === 'FAIL' || verdict === 'ERROR'\n    ? generateRecoveryHint(state, pageIntent.intent)\n    : undefined;\n\n  // Generate summary\n  const summary = generateSummary(pageIntent, state, verdict, issues.length);\n\n  return {\n    verdict,\n    confidence: pageIntent.confidence,\n    pageIntent,\n    state,\n    availableActions,\n    issues,\n    recovery,\n    summary,\n    url,\n    title,\n    timestamp,\n  };\n}\n\n/**\n * Detect available actions based on page intent\n */\nasync function detectAvailableActions(\n  page: Page,\n  intent: PageIntent\n): Promise<AvailableAction[]> {\n  const actions: AvailableAction[] = [];\n\n  const checks = await page.evaluate(() => {\n    const doc = document;\n\n    // Helper: find element by tag where text content matches (case-insensitive)\n    function findByText(tags: string[], patterns: string[]): Element | null {\n      for (const tag of tags) {\n        for (const el of Array.from(doc.querySelectorAll(tag))) {\n          const t = el.textContent?.trim().toLowerCase() || '';\n          if (patterns.some(p => t === p || t.includes(p))) return el;\n        }\n      }\n      return null;\n    }\n\n    // Form actions\n    const submitButton = doc.querySelector('button[type=\"submit\"], input[type=\"submit\"]');\n    const searchInput = doc.querySelector('input[type=\"search\"], input[name*=\"search\"], input[placeholder*=\"search\"]');\n    const loginForm = doc.querySelector('form input[type=\"password\"]');\n\n    // Navigation actions\n    const mainNav = doc.querySelector('nav a, header a');\n    const backButton = findByText(['a', 'button'], ['back']);\n\n    // Content actions\n    const addButton = findByText(['button'], ['add', 'create', 'new']);\n    const editButton = findByText(['button', 'a'], ['edit']);\n    const deleteButton = findByText(['button'], ['delete', 'remove']);\n\n    // List actions\n    const filterSelect = doc.querySelector('select[name*=\"filter\"], [class*=\"filter\"] select');\n    const sortSelect = doc.querySelector('select[name*=\"sort\"], [class*=\"sort\"] select');\n    const pagination = doc.querySelector('[class*=\"pagination\"] a, [class*=\"pager\"] button');\n\n    // Social login provider detection (for actions)\n    const socialProviderNames = ['google', 'github', 'apple', 'microsoft', 'facebook', 'discord'];\n    const socialTriggerPhrases = ['sign in with', 'continue with'];\n    const detectedProviders: string[] = [];\n    const socialEls = Array.from(doc.querySelectorAll(\n      'button, a, [class*=\"social\"], [class*=\"oauth\"], [class*=\"provider\"]'\n    ));\n    for (const el of socialEls) {\n      const t = el.textContent?.trim().toLowerCase() || '';\n      const cls = el.className?.toLowerCase() || '';\n      for (const provider of socialProviderNames) {\n        if (!detectedProviders.includes(provider)) {\n          if (t.includes(provider) || cls.includes(provider)) {\n            const triggered = socialTriggerPhrases.some(ph => t.includes(ph)) ||\n              t === provider || cls.includes('social') || cls.includes('oauth') || cls.includes('provider');\n            if (triggered) detectedProviders.push(provider);\n          }\n        }\n      }\n    }\n\n    return {\n      hasSubmit: !!submitButton,\n      submitSelector: submitButton ? getSelector(submitButton) : null,\n      hasSearch: !!searchInput,\n      searchSelector: searchInput ? getSelector(searchInput) : null,\n      hasLogin: !!loginForm,\n      hasNav: !!mainNav,\n      hasBack: !!backButton,\n      hasAdd: !!addButton,\n      addSelector: addButton ? getSelector(addButton) : null,\n      hasEdit: !!editButton,\n      hasDelete: !!deleteButton,\n      hasFilter: !!filterSelect,\n      hasSort: !!sortSelect,\n      hasPagination: !!pagination,\n      hasSocialLogin: detectedProviders.length > 0,\n      socialProviders: detectedProviders,\n    };\n\n    function getSelector(el: Element): string {\n      if (el.id) return `#${el.id}`;\n      if (el.getAttribute('data-testid')) return `[data-testid=\"${el.getAttribute('data-testid')}\"]`;\n      if (el.className) return `.${el.className.split(' ')[0]}`;\n      return el.tagName.toLowerCase();\n    }\n  });\n\n  // Build actions based on intent and available elements\n  if (intent === 'auth' && checks.hasLogin) {\n    actions.push({\n      action: 'login',\n      selector: 'form',\n      description: 'Submit login credentials',\n    });\n  }\n\n  // Social login actions (auth pages only)\n  if (intent === 'auth' && checks.hasSocialLogin) {\n    for (const provider of checks.socialProviders) {\n      actions.push({\n        action: `login-with-${provider}`,\n        // Valid-CSS only — the previous form mixed `:has-text(...)` (a\n        // Playwright pseudo) with valid CSS, which made any consumer that\n        // ran `querySelector` blow up. Callers wanting a text-based fallback\n        // should use the helpers in `flows/types.ts`.\n        selector: `[class*=\"${provider}\"]`,\n        description: `Sign in with ${provider.charAt(0).toUpperCase() + provider.slice(1)}`,\n      });\n    }\n  }\n\n  if (checks.hasSearch) {\n    actions.push({\n      action: 'search',\n      selector: checks.searchSelector || 'input[type=\"search\"]',\n      description: 'Search for content',\n    });\n  }\n\n  if (checks.hasSubmit && intent !== 'auth') {\n    actions.push({\n      action: 'submit',\n      selector: checks.submitSelector || 'button[type=\"submit\"]',\n      description: 'Submit form',\n    });\n  }\n\n  if (checks.hasAdd) {\n    actions.push({\n      action: 'create',\n      selector: checks.addSelector || 'button',\n      description: 'Create new item',\n    });\n  }\n\n  if (intent === 'listing') {\n    if (checks.hasFilter) {\n      actions.push({\n        action: 'filter',\n        description: 'Filter results',\n      });\n    }\n    if (checks.hasSort) {\n      actions.push({\n        action: 'sort',\n        description: 'Sort results',\n      });\n    }\n    if (checks.hasPagination) {\n      actions.push({\n        action: 'paginate',\n        description: 'Navigate to next/previous page',\n      });\n    }\n  }\n\n  if (checks.hasBack) {\n    actions.push({\n      action: 'back',\n      description: 'Go back to previous page',\n    });\n  }\n\n  return actions;\n}\n\n/**\n * Collect issues from page state\n */\nfunction collectIssues(state: PageState, intent: PageIntentResult, url = ''): SemanticIssue[] {\n  const issues: SemanticIssue[] = [];\n\n  // Add error-based issues\n  for (const error of state.errors.errors) {\n    issues.push({\n      severity: error.type === 'server' || error.type === 'permission' ? 'critical' : 'major',\n      type: error.type,\n      problem: error.message,\n      fix: getErrorFix(error.type),\n    });\n  }\n\n  // Add loading issues if taking too long\n  if (state.loading.loading && state.loading.elements > 3) {\n    issues.push({\n      severity: 'minor',\n      type: 'slow-loading',\n      problem: `Page has ${state.loading.elements} loading indicators`,\n      fix: 'Wait for content to load or check network',\n    });\n  }\n\n  // Add auth issues\n  if (state.auth.authenticated === false && intent.intent === 'dashboard') {\n    issues.push({\n      severity: 'major',\n      type: 'auth-required',\n      problem: 'Dashboard requires authentication',\n      fix: 'Login first before accessing this page',\n    });\n  }\n\n  // Auth page heuristic checks\n  if (intent.intent === 'auth') {\n    const socialProviders = state.auth.socialLoginProviders ?? [];\n\n    // No social login options\n    if (socialProviders.length === 0) {\n      issues.push({\n        severity: 'minor',\n        type: 'auth-no-social-login',\n        problem: 'Auth page has no social login options (Google, GitHub, etc.)',\n        fix: 'Add OAuth/social login buttons to reduce friction',\n      });\n    }\n\n    // Determine sign-in vs sign-up: login link present = sign-up page; signup link present = sign-in page\n    // Also check URL path as a fallback\n    const signals = state.auth.signals;\n    const hasSignupLinkSignal = signals.includes('signup link visible') || (state.auth.hasSignupLink ?? false);\n    const hasLoginLinkSignal = signals.includes('login link visible');\n    const urlPath = (() => { try { return new URL(url).pathname.toLowerCase(); } catch { return url.toLowerCase(); } })();\n    const isSignUp = hasLoginLinkSignal ||\n      urlPath.includes('sign-up') ||\n      urlPath.includes('signup') ||\n      urlPath.includes('register');\n    const isSignIn = hasSignupLinkSignal ||\n      urlPath.includes('sign-in') ||\n      urlPath.includes('signin') ||\n      urlPath.includes('login');\n\n    // No forgot password on sign-in pages (not sign-up)\n    if (!state.auth.hasForgotPassword && (isSignIn || (!isSignIn && !isSignUp))) {\n      issues.push({\n        severity: 'minor',\n        type: 'auth-no-forgot-password',\n        problem: 'Sign-in page has no forgot password option',\n        fix: 'Add a \"Forgot your password?\" link',\n      });\n    }\n\n    // No password visibility toggle\n    if (!state.auth.hasPasswordToggle) {\n      issues.push({\n        severity: 'minor',\n        type: 'auth-no-password-toggle',\n        problem: 'Password field has no show/hide toggle',\n        fix: 'Add a visibility toggle for the password field',\n      });\n    }\n  }\n\n  return issues;\n}\n\nfunction getErrorFix(errorType: string): string {\n  const fixes: Record<string, string> = {\n    validation: 'Fix the highlighted form fields',\n    api: 'Retry the request or check API status',\n    permission: 'Login with appropriate permissions',\n    notfound: 'Check the URL or navigate to a valid page',\n    server: 'Wait and retry, or contact support',\n    network: 'Check internet connection',\n    unknown: 'Investigate the error message',\n  };\n  return fixes[errorType] || 'Investigate the issue';\n}\n\n/**\n * Determine overall verdict\n */\nfunction determineVerdict(state: PageState, issues: SemanticIssue[]): SemanticVerdict {\n  // Check for critical issues first\n  const hasCritical = issues.some(i => i.severity === 'critical');\n  if (hasCritical) return 'ERROR';\n\n  // Check for loading state\n  if (state.loading.loading) return 'LOADING';\n\n  // Check for errors\n  if (state.errors.hasErrors) return 'FAIL';\n\n  // Check for major issues\n  const hasMajor = issues.some(i => i.severity === 'major');\n  if (hasMajor) return 'ISSUES';\n\n  // All good\n  return 'PASS';\n}\n\n/**\n * Generate recovery hints for failed states\n */\nfunction generateRecoveryHint(state: PageState, _intent: PageIntent): RecoveryHint {\n  // Auth issues\n  if (state.auth.authenticated === false) {\n    return {\n      suggestion: 'Login to access this page',\n      alternatives: ['Use ibr.flow.login()', 'Navigate to /login first'],\n      waitFor: '[class*=\"user\"], [class*=\"avatar\"]',\n    };\n  }\n\n  // Server errors\n  if (state.errors.errors.some(e => e.type === 'server')) {\n    return {\n      suggestion: 'Server error - wait and retry',\n      alternatives: ['Refresh the page', 'Check server status'],\n    };\n  }\n\n  // Not found errors\n  if (state.errors.errors.some(e => e.type === 'notfound')) {\n    return {\n      suggestion: 'Page not found - check URL',\n      alternatives: ['Navigate to homepage', 'Use search to find content'],\n    };\n  }\n\n  // Loading issues\n  if (state.loading.loading) {\n    return {\n      suggestion: 'Wait for page to finish loading',\n      waitFor: state.loading.type === 'skeleton'\n        ? ':not([class*=\"skeleton\"])'\n        : ':not([class*=\"loading\"])',\n    };\n  }\n\n  // Default\n  return {\n    suggestion: 'Investigate the page state and retry',\n  };\n}\n\n/**\n * Generate human-readable summary\n */\nfunction generateSummary(\n  intent: PageIntentResult,\n  state: PageState,\n  verdict: SemanticVerdict,\n  issueCount: number\n): string {\n  const parts: string[] = [];\n\n  // Intent\n  parts.push(`${intent.intent} page`);\n\n  // Confidence\n  if (intent.confidence < 0.5) {\n    parts.push('(low confidence)');\n  }\n\n  // Auth state\n  if (state.auth.authenticated === true) {\n    parts.push(`authenticated${state.auth.username ? ` as ${state.auth.username}` : ''}`);\n  } else if (state.auth.authenticated === false) {\n    parts.push('not authenticated');\n  }\n\n  // Loading\n  if (state.loading.loading) {\n    parts.push(`loading (${state.loading.type})`);\n  }\n\n  // Verdict\n  if (verdict === 'PASS') {\n    parts.push('ready for interaction');\n  } else if (verdict === 'ISSUES') {\n    parts.push(`${issueCount} issue${issueCount > 1 ? 's' : ''} detected`);\n  } else if (verdict === 'ERROR' || verdict === 'FAIL') {\n    parts.push(`${issueCount} error${issueCount > 1 ? 's' : ''}`);\n  }\n\n  return parts.join(', ');\n}\n\n/**\n * Format semantic result as concise text for AI consumption\n */\nexport function formatSemanticText(result: SemanticResult): string {\n  const lines: string[] = [];\n\n  lines.push(`Verdict: ${result.verdict}`);\n  lines.push(`Page: ${result.pageIntent.intent} (${Math.round(result.confidence * 100)}% confidence)`);\n  lines.push(`Summary: ${result.summary}`);\n\n  if (result.state.auth.authenticated !== null) {\n    lines.push(`Auth: ${result.state.auth.authenticated ? 'logged in' : 'logged out'}`);\n  }\n\n  if (result.availableActions.length > 0) {\n    lines.push(`Actions: ${result.availableActions.map(a => a.action).join(', ')}`);\n  }\n\n  if (result.issues.length > 0) {\n    lines.push(`Issues: ${result.issues.map(i => i.problem).join('; ')}`);\n  }\n\n  if (result.recovery) {\n    lines.push(`Recovery: ${result.recovery.suggestion}`);\n  }\n\n  return lines.join('\\n');\n}\n\n/**\n * Format semantic result as JSON for structured consumption\n */\nexport function formatSemanticJson(result: SemanticResult): string {\n  // Return a cleaned version with just the essential fields\n  return JSON.stringify({\n    verdict: result.verdict,\n    intent: result.pageIntent.intent,\n    confidence: result.confidence,\n    authenticated: result.state.auth.authenticated,\n    loading: result.state.loading.loading,\n    ready: result.state.ready,\n    actions: result.availableActions.map(a => a.action),\n    issues: result.issues.map(i => ({ severity: i.severity, problem: i.problem })),\n    recovery: result.recovery?.suggestion,\n  }, null, 2);\n}\n","/**\n * IBR Semantic Layer\n *\n * Provides AI-friendly page understanding:\n * - Page intent classification (auth, form, listing, dashboard, etc.)\n * - State detection (authenticated, loading, errors)\n * - Semantic output with verdicts and recovery hints\n */\n\nexport {\n  classifyPageIntent,\n  getIntentDescription,\n  type PageIntent,\n  type PageIntentResult,\n} from './page-intent.js';\n\nexport {\n  detectAuthState,\n  detectLoadingState,\n  detectErrorState,\n  detectPageState,\n  waitForPageReady,\n  type AuthState,\n  type LoadingState,\n  type ErrorState,\n  type ErrorInfo,\n  type PageState,\n} from './state-detector.js';\n\nexport {\n  getSemanticOutput,\n  formatSemanticText,\n  formatSemanticJson,\n  type SemanticVerdict,\n  type SemanticIssue,\n  type AvailableAction,\n  type RecoveryHint,\n  type SemanticResult,\n} from './output.js';\n\nexport {\n  LANDMARK_SELECTORS,\n  detectLandmarks,\n  getExpectedLandmarksForIntent,\n  compareLandmarks,\n  getExpectedLandmarksFromContext,\n  formatLandmarkComparison,\n  type LandmarkType,\n} from './landmarks.js';\n","/**\n * Flow Types\n *\n * Common types used across all built-in flows.\n */\n\nimport type { PageLike as Page } from '../engine/page-like.js';\n\nexport interface FlowStep {\n  action: string;\n  success: boolean;\n  duration?: number;\n  error?: string;\n}\n\nexport interface FlowResult {\n  success: boolean;\n  steps: FlowStep[];\n  error?: string;\n  /** Time taken in ms */\n  duration: number;\n}\n\nexport interface FlowOptions {\n  /** Timeout for the entire flow in ms */\n  timeout?: number;\n  /** Whether to take screenshots at each step */\n  debug?: boolean;\n}\n\n// `:has-text(...)` is Playwright pseudo-syntax — it's NOT valid CSS.\n// Native `document.querySelector` rejects the whole selector list when one\n// component is invalid (the entire string fails to parse). Calls coming from\n// the CDP engine therefore crashed with:\n//   Failed to execute 'querySelector': '...:has-text(\"X\")...' is not a valid selector.\n//\n// Helpers below split the work in two:\n//   1. Valid-CSS selectors run through `page.$` directly.\n//   2. Text-based fallback runs in-page via `page.evaluate`, walking\n//      candidate tags and matching `textContent` (or attributes for\n//      `<label>` ↔ `<input>` association). The first hit returns a\n//      handle obtained via a generated, structurally-unique selector.\n//\n// The signatures stay the same so callers don't change.\n\n/**\n * Build a unique CSS path for an element by walking up to <body>.\n * Used inside the in-page evaluator to hand a stable selector back to\n * the page-like layer's `$()` so we still return an ElementHandleLike.\n */\nconst PATH_BUILDER_SOURCE = `\nfunction buildSelectorPath(el) {\n  if (!(el instanceof Element)) return null;\n  const path = [];\n  let cur = el;\n  while (cur && cur.nodeType === 1 && cur !== document.body) {\n    let sel = cur.nodeName.toLowerCase();\n    if (cur.id) {\n      // ID alone is unique enough — short-circuit.\n      const safeId = cur.id.replace(/([\"\\\\\\\\])/g, '\\\\\\\\$1');\n      path.unshift(sel + '[id=\"' + safeId + '\"]');\n      break;\n    }\n    const parent = cur.parentElement;\n    if (parent) {\n      const sibs = Array.from(parent.children).filter(c => c.nodeName === cur.nodeName);\n      if (sibs.length > 1) {\n        sel += ':nth-of-type(' + (sibs.indexOf(cur) + 1) + ')';\n      }\n    }\n    path.unshift(sel);\n    cur = cur.parentElement;\n  }\n  return path.length ? path.join(' > ') : null;\n}\n`;\n\n/**\n * Find a form field by common label patterns.\n *\n * Order:\n *  1. Plain attribute selectors (name/id/placeholder/aria-label).\n *  2. In-page <label>-association walk: find a label whose textContent\n *     contains the term (case-insensitive), then return its associated\n *     input via `for=` lookup or DOM proximity.\n */\nexport async function findFieldByLabel(\n  page: Page,\n  labels: string[]\n): Promise<ReturnType<Page['$']>> {\n  for (const label of labels) {\n    // Plain CSS round\n    const attrSelectors = [\n      `input[name*=\"${label}\" i]`,\n      `input[id*=\"${label}\" i]`,\n      `input[placeholder*=\"${label}\" i]`,\n      `input[aria-label*=\"${label}\" i]`,\n    ];\n    for (const selector of attrSelectors) {\n      const element = await page.$(selector);\n      if (element) return element;\n    }\n\n    // Text-association fallback — does what `label:has-text(\"X\") input`\n    // would have meant in Playwright, but with native DOM walking.\n    const selectorPath = await page.evaluate(\n      `(function() {\n        ${PATH_BUILDER_SOURCE}\n        const needle = ${JSON.stringify(label.toLowerCase())};\n        const labels = document.querySelectorAll('label');\n        for (const l of labels) {\n          const t = (l.textContent || '').trim().toLowerCase();\n          if (!t.includes(needle)) continue;\n          // <label for=\"x\">: find #x.\n          const forId = l.getAttribute('for');\n          if (forId) {\n            const direct = document.getElementById(forId);\n            if (direct && direct.tagName === 'INPUT') {\n              return buildSelectorPath(direct);\n            }\n          }\n          // <label>...<input>...</label>\n          const inside = l.querySelector('input, textarea, select');\n          if (inside) return buildSelectorPath(inside);\n          // <label>...</label><input> sibling\n          const sib = l.nextElementSibling;\n          if (sib && (sib.tagName === 'INPUT' || sib.tagName === 'TEXTAREA' || sib.tagName === 'SELECT')) {\n            return buildSelectorPath(sib);\n          }\n        }\n        return null;\n      })()`\n    );\n    if (typeof selectorPath === 'string' && selectorPath) {\n      const handle = await page.$(selectorPath);\n      if (handle) return handle;\n    }\n  }\n  return null;\n}\n\n/**\n * Find a button by common patterns.\n *\n * Order:\n *  1. Plain attribute selectors (input[type=submit][value], etc.).\n *  2. In-page text walk over button / a / [role=button] candidates.\n */\nexport async function findButton(\n  page: Page,\n  patterns: string[]\n): Promise<ReturnType<Page['$']>> {\n  for (const pattern of patterns) {\n    // CSS-only round (no :has-text).\n    const cssSelectors = [\n      `input[type=\"submit\"][value*=\"${pattern}\" i]`,\n    ];\n    for (const selector of cssSelectors) {\n      const element = await page.$(selector);\n      if (element) return element;\n    }\n\n    // Text-content round — what `:has-text(...)` was trying to express.\n    const selectorPath = await page.evaluate(\n      `(function() {\n        ${PATH_BUILDER_SOURCE}\n        const needle = ${JSON.stringify(pattern.toLowerCase())};\n        const candidates = document.querySelectorAll('button, a, [role=\"button\"]');\n        for (const el of candidates) {\n          const t = (el.textContent || '').trim().toLowerCase();\n          if (t.includes(needle)) return buildSelectorPath(el);\n        }\n        return null;\n      })()`\n    );\n    if (typeof selectorPath === 'string' && selectorPath) {\n      const handle = await page.$(selectorPath);\n      if (handle) return handle;\n    }\n  }\n\n  // Fallback to generic submit button\n  return page.$('button[type=\"submit\"], input[type=\"submit\"]');\n}\n\n/**\n * Combine valid-CSS selectors with a JS textContent search.\n *\n * Use when a Playwright-style pseudo-selector list mixes valid CSS\n * (`[class*=\"logout\"]`) with `:has-text(...)`. The CSS portion runs\n * through `querySelectorAll`; the text portion runs in-page over the\n * supplied tag set; results are deduped and a stable selector path is\n * returned so callers can `page.$(...)` it.\n */\nexport async function combinedTextOrCssQuery(\n  page: Page,\n  options: { cssSelectors: string[]; tags: string[]; textNeedles: string[] }\n): Promise<string | null> {\n  const { cssSelectors, tags, textNeedles } = options;\n  return await page.evaluate(\n    `(function() {\n      ${PATH_BUILDER_SOURCE}\n      const cssList = ${JSON.stringify(cssSelectors)};\n      const tags = ${JSON.stringify(tags)};\n      const needles = ${JSON.stringify(textNeedles.map(n => n.toLowerCase()))};\n      // CSS round first — preserves the historical preference order.\n      for (const sel of cssList) {\n        try {\n          const m = document.querySelector(sel);\n          if (m) return buildSelectorPath(m);\n        } catch (e) {\n          // Skip a selector that the host's CSS engine rejects\n          // (e.g. CSS-4-only pseudo-classes). The text round below\n          // is the safety net.\n        }\n      }\n      // Text round\n      for (const tag of tags) {\n        const els = document.querySelectorAll(tag);\n        for (const el of els) {\n          const t = (el.textContent || '').trim().toLowerCase();\n          if (needles.some(n => t.includes(n))) return buildSelectorPath(el);\n        }\n      }\n      return null;\n    })()`\n  ) as string | null;\n}\n\n/**\n * Wait for navigation or network idle\n */\nexport async function waitForNavigation(\n  page: Page,\n  timeout = 10000\n): Promise<void> {\n  try {\n    await Promise.race([\n      page.waitForNavigation?.(),\n      page.waitForLoadState?.('networkidle', { timeout }),\n    ]);\n  } catch {\n    // Timeout is acceptable - page might not navigate\n  }\n}\n\n// =============================================================================\n// AI Search Testing Types\n// =============================================================================\n\n/**\n * Screenshot captured at a specific step during search flow\n */\nexport interface StepScreenshot {\n  /** Which step this screenshot was taken at */\n  step: 'before' | 'after-query' | 'loading' | 'results';\n  /** Path to the screenshot file */\n  path: string;\n  /** ISO timestamp when captured */\n  timestamp: string;\n  /** Milliseconds since flow start */\n  timing: number;\n}\n\n/**\n * Extracted content from a single search result element\n */\nexport interface ExtractedResult {\n  /** Zero-based index in result list */\n  index: number;\n  /** Title text if identifiable */\n  title?: string;\n  /** Snippet/description text if present */\n  snippet?: string;\n  /** Full text content of the result element */\n  fullText: string;\n  /** CSS selector to locate this element */\n  selector: string;\n  /** Whether the element is visible in viewport */\n  visible: boolean;\n}\n\n/**\n * Timing breakdown for search flow phases\n */\nexport interface SearchTiming {\n  /** Total flow duration in ms */\n  total: number;\n  /** Time spent typing the query */\n  typing: number;\n  /** Time waiting for results to load */\n  waiting: number;\n  /** Time for results to render after load */\n  rendering: number;\n}\n\n/**\n * Extended options for AI search testing\n */\nexport interface AISearchOptions extends FlowOptions {\n  /** Search query to execute */\n  query: string;\n  /** CSS selector for search results container */\n  resultsSelector?: string;\n  /** Whether to submit the form or just type (for autocomplete) */\n  submit?: boolean;\n  /** Capture screenshots at each step (default: true) */\n  captureSteps?: boolean;\n  /** Extract text content from results (default: true) */\n  extractContent?: boolean;\n  /** User's intent for validation (what they expect to find) */\n  userIntent?: string;\n  /** Session directory for storing screenshots */\n  sessionDir?: string;\n}\n\n/**\n * Extended result from AI search flow with full context for validation\n */\nexport interface AISearchResult extends FlowResult {\n  /** The search query that was executed */\n  query: string;\n  /** User's stated intent for validation */\n  userIntent?: string;\n  /** Number of results found */\n  resultCount: number;\n  /** Whether any results were found */\n  hasResults: boolean;\n  /** Timing breakdown for each phase */\n  timing: SearchTiming;\n  /** Screenshots captured at each step */\n  screenshots: StepScreenshot[];\n  /** Extracted content from result elements */\n  extractedResults: ExtractedResult[];\n  /** Directory where search artifacts are stored */\n  artifactDir?: string;\n}\n","import { EngineDriver } from './engine/driver.js';\nimport { CompatPage } from './engine/compat.js';\nimport type { PageLike } from './engine/page-like.js';\n\n// ─── Theme Analysis ──────────────────────────────────────────────────────────\n\nexport interface ThemeAnalysis {\n  pageBackground: { color: string; luminance: number };\n  contentCards: Array<{ selector: string; color: string; luminance: number }>;\n  themeMismatch: boolean;\n  mismatchDetails?: string;\n}\n\n/**\n * Parse a CSS color string to { r, g, b } in 0-255 range.\n * Handles: rgb(r,g,b), rgba(r,g,b,a), #rrggbb, #rgb, named colors (white, black).\n */\nfunction parseColor(color: string): { r: number; g: number; b: number } | null {\n  if (!color || color === 'transparent') return null;\n\n  // rgb / rgba\n  const rgbMatch = color.match(/rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/i);\n  if (rgbMatch) {\n    return { r: Number(rgbMatch[1]), g: Number(rgbMatch[2]), b: Number(rgbMatch[3]) };\n  }\n\n  // hex #rrggbb or #rgb\n  const hexMatch = color.match(/^#([0-9a-f]{3,8})$/i);\n  if (hexMatch) {\n    const hex = hexMatch[1];\n    if (hex.length === 3) {\n      return {\n        r: parseInt(hex[0] + hex[0], 16),\n        g: parseInt(hex[1] + hex[1], 16),\n        b: parseInt(hex[2] + hex[2], 16),\n      };\n    }\n    if (hex.length >= 6) {\n      return {\n        r: parseInt(hex.slice(0, 2), 16),\n        g: parseInt(hex.slice(2, 4), 16),\n        b: parseInt(hex.slice(4, 6), 16),\n      };\n    }\n  }\n\n  // Named colors\n  const named: Record<string, { r: number; g: number; b: number }> = {\n    white: { r: 255, g: 255, b: 255 },\n    black: { r: 0, g: 0, b: 0 },\n    red: { r: 255, g: 0, b: 0 },\n    green: { r: 0, g: 128, b: 0 },\n    blue: { r: 0, g: 0, b: 255 },\n    gray: { r: 128, g: 128, b: 128 },\n    grey: { r: 128, g: 128, b: 128 },\n  };\n  return named[color.toLowerCase()] ?? null;\n}\n\n/**\n * Calculate WCAG relative luminance from an RGB value (0-255 per channel).\n * L = 0.2126 * R + 0.7152 * G + 0.0722 * B, linearized from sRGB.\n */\nfunction relativeLuminance(r: number, g: number, b: number): number {\n  const linearize = (c: number): number => {\n    const s = c / 255;\n    return s <= 0.04045 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n  };\n  return 0.2126 * linearize(r) + 0.7152 * linearize(g) + 0.0722 * linearize(b);\n}\n\n/**\n * Detect light-on-dark or dark-on-light theme mismatch between the page background\n * and primary content containers (cards, forms, modals, panels, dialogs).\n */\nexport async function analyzeThemeConsistency(page: PageLike): Promise<ThemeAnalysis> {\n  const data = await page.evaluate(() => {\n    // Page background\n    const bodyBg = window.getComputedStyle(document.body).backgroundColor;\n    const htmlBg = window.getComputedStyle(document.documentElement).backgroundColor;\n    const pageBg = (bodyBg && bodyBg !== 'rgba(0, 0, 0, 0)' && bodyBg !== 'transparent')\n      ? bodyBg\n      : htmlBg;\n\n    // Content container selectors\n    const containerSelectors = [\n      '[class*=\"card\"]',\n      '[class*=\"form\"]',\n      '[class*=\"dialog\"]',\n      '[class*=\"modal\"]',\n      '[class*=\"panel\"]',\n      'main > *',\n      'form',\n    ];\n\n    const cards: Array<{ selector: string; color: string }> = [];\n    const seen = new Set<Element>();\n\n    for (const sel of containerSelectors) {\n      let elements: Element[];\n      try {\n        elements = Array.from(document.querySelectorAll(sel));\n      } catch {\n        continue;\n      }\n      for (const el of elements) {\n        if (seen.has(el)) continue;\n        seen.add(el);\n        const bg = window.getComputedStyle(el as HTMLElement).backgroundColor;\n        if (!bg || bg === 'rgba(0, 0, 0, 0)' || bg === 'transparent') continue;\n        // Only count elements with meaningful size (> 50x50px)\n        const rect = el.getBoundingClientRect();\n        if (rect.width < 50 || rect.height < 50) continue;\n        cards.push({ selector: sel, color: bg });\n        if (cards.length >= 10) break;\n      }\n      if (cards.length >= 10) break;\n    }\n\n    return { pageBg, cards };\n  });\n\n  // Compute page background luminance\n  const pageParsed = parseColor(data.pageBg);\n  const pageLuminance = pageParsed\n    ? relativeLuminance(pageParsed.r, pageParsed.g, pageParsed.b)\n    : 0.5; // unknown — assume mid\n\n  const pageBackground = { color: data.pageBg, luminance: pageLuminance };\n\n  // Compute content card luminances\n  const contentCards = data.cards.map((c: { selector: string; color: string }) => {\n    const parsed = parseColor(c.color);\n    const luminance = parsed ? relativeLuminance(parsed.r, parsed.g, parsed.b) : 0.5;\n    return { selector: c.selector, color: c.color, luminance };\n  });\n\n  // Detect mismatch\n  let themeMismatch = false;\n  let mismatchDetails: string | undefined;\n\n  const darkPage = pageLuminance < 0.2;\n  const lightPage = pageLuminance > 0.7;\n\n  for (const card of contentCards) {\n    if (darkPage && card.luminance > 0.7) {\n      themeMismatch = true;\n      mismatchDetails =\n        `Page background is dark (luminance ${pageLuminance.toFixed(3)}) but a content container ` +\n        `matched by \"${card.selector}\" has a light background (luminance ${card.luminance.toFixed(3)})`;\n      break;\n    }\n    if (lightPage && card.luminance < 0.2) {\n      themeMismatch = true;\n      mismatchDetails =\n        `Page background is light (luminance ${pageLuminance.toFixed(3)}) but a content container ` +\n        `matched by \"${card.selector}\" has a dark background (luminance ${card.luminance.toFixed(3)})`;\n      break;\n    }\n  }\n\n  return { pageBackground, contentCards, themeMismatch, mismatchDetails };\n}\n\n/**\n * UI metrics extracted from a page for consistency checking\n */\nexport interface PageMetrics {\n  url: string;\n  path: string;\n  title: string;\n\n  // Layout metrics\n  layout: {\n    headerHeight: number | null;\n    navWidth: number | null;\n    contentPadding: { top: number; right: number; bottom: number; left: number } | null;\n    footerHeight: number | null;\n  };\n\n  // Typography metrics\n  typography: {\n    bodyFontFamily: string | null;\n    bodyFontSize: string | null;\n    headingFontFamily: string | null;\n    h1FontSize: string | null;\n    h2FontSize: string | null;\n    lineHeight: string | null;\n  };\n\n  // Color metrics\n  colors: {\n    backgroundColor: string | null;\n    textColor: string | null;\n    linkColor: string | null;\n    primaryButtonBg: string | null;\n    primaryButtonText: string | null;\n  };\n\n  // Spacing metrics (common elements)\n  spacing: {\n    buttonPadding: string | null;\n    cardPadding: string | null;\n    sectionGap: string | null;\n  };\n}\n\n/**\n * Inconsistency found between pages\n */\nexport interface Inconsistency {\n  type: 'layout' | 'typography' | 'color' | 'spacing';\n  property: string;\n  severity: 'info' | 'warning' | 'error';\n  description: string;\n  pages: Array<{\n    path: string;\n    value: string | number | null;\n  }>;\n  suggestion?: string;\n}\n\n/**\n * Consistency check result\n */\nexport interface ConsistencyResult {\n  pages: PageMetrics[];\n  inconsistencies: Inconsistency[];\n  score: number; // 0-100, higher is more consistent\n  summary: string;\n}\n\n/**\n * Consistency check options\n */\nexport interface ConsistencyOptions {\n  /** URLs to check */\n  urls: string[];\n  /** Enable verbose output */\n  verbose?: boolean;\n  /** Timeout per page (ms) */\n  timeout?: number;\n  /** Ignore certain property types */\n  ignore?: Array<'layout' | 'typography' | 'color' | 'spacing'>;\n}\n\n/**\n * Extract UI metrics from a page\n */\nasync function extractMetrics(page: PageLike, url: string): Promise<PageMetrics> {\n  const parsedUrl = new URL(url);\n\n  const metrics = await page.evaluate(() => {\n    const getComputedStyleProp = (selector: string, prop: string): string | null => {\n      const el = document.querySelector(selector);\n      if (!el) return null;\n      return window.getComputedStyle(el).getPropertyValue(prop) || null;\n    };\n\n    const getElementHeight = (selector: string): number | null => {\n      const el = document.querySelector(selector);\n      if (!el) return null;\n      return el.getBoundingClientRect().height;\n    };\n\n    const getElementWidth = (selector: string): number | null => {\n      const el = document.querySelector(selector);\n      if (!el) return null;\n      return el.getBoundingClientRect().width;\n    };\n\n    // Try multiple selectors for common elements\n    const headerSelectors = ['header', '[role=\"banner\"]', '.header', '#header', 'nav'];\n    const navSelectors = ['nav', '[role=\"navigation\"]', '.sidebar', '.nav', '#sidebar'];\n    const mainSelectors = ['main', '[role=\"main\"]', '.content', '#content', '.main'];\n    const footerSelectors = ['footer', '[role=\"contentinfo\"]', '.footer', '#footer'];\n    const buttonSelectors = ['button', '.btn', '[role=\"button\"]', 'a.button'];\n    const cardSelectors = ['.card', '[class*=\"card\"]', '.panel', '.box'];\n\n    const findFirst = (selectors: string[], fn: (s: string) => string | number | null) => {\n      for (const sel of selectors) {\n        const result = fn(sel);\n        if (result !== null) return result;\n      }\n      return null;\n    };\n\n    // Get padding from main content\n    const getContentPadding = (): { top: number; right: number; bottom: number; left: number } | null => {\n      for (const sel of mainSelectors) {\n        const el = document.querySelector(sel);\n        if (el) {\n          const style = window.getComputedStyle(el);\n          return {\n            top: parseFloat(style.paddingTop) || 0,\n            right: parseFloat(style.paddingRight) || 0,\n            bottom: parseFloat(style.paddingBottom) || 0,\n            left: parseFloat(style.paddingLeft) || 0,\n          };\n        }\n      }\n      return null;\n    };\n\n    return {\n      title: document.title,\n      layout: {\n        headerHeight: findFirst(headerSelectors, getElementHeight) as number | null,\n        navWidth: findFirst(navSelectors, getElementWidth) as number | null,\n        contentPadding: getContentPadding(),\n        footerHeight: findFirst(footerSelectors, getElementHeight) as number | null,\n      },\n      typography: {\n        bodyFontFamily: getComputedStyleProp('body', 'font-family'),\n        bodyFontSize: getComputedStyleProp('body', 'font-size'),\n        headingFontFamily: getComputedStyleProp('h1, h2, h3', 'font-family'),\n        h1FontSize: getComputedStyleProp('h1', 'font-size'),\n        h2FontSize: getComputedStyleProp('h2', 'font-size'),\n        lineHeight: getComputedStyleProp('body', 'line-height'),\n      },\n      colors: {\n        backgroundColor: getComputedStyleProp('body', 'background-color'),\n        textColor: getComputedStyleProp('body', 'color'),\n        linkColor: getComputedStyleProp('a', 'color'),\n        primaryButtonBg: findFirst(buttonSelectors, s => getComputedStyleProp(s, 'background-color')) as string | null,\n        primaryButtonText: findFirst(buttonSelectors, s => getComputedStyleProp(s, 'color')) as string | null,\n      },\n      spacing: {\n        buttonPadding: findFirst(buttonSelectors, s => getComputedStyleProp(s, 'padding')) as string | null,\n        cardPadding: findFirst(cardSelectors, s => getComputedStyleProp(s, 'padding')) as string | null,\n        sectionGap: getComputedStyleProp('main > *', 'margin-bottom'),\n      },\n    };\n  });\n\n  return {\n    url,\n    path: parsedUrl.pathname,\n    ...metrics,\n  };\n}\n\n/**\n * Compare metrics across pages and find inconsistencies\n */\nfunction findInconsistencies(pages: PageMetrics[], ignore: string[] = []): Inconsistency[] {\n  const inconsistencies: Inconsistency[] = [];\n\n  // Helper to check if values are consistent\n  const checkProperty = (\n    type: Inconsistency['type'],\n    property: string,\n    getValue: (p: PageMetrics) => string | number | null,\n    description: string,\n    severity: Inconsistency['severity'] = 'warning'\n  ) => {\n    if (ignore.includes(type)) return;\n\n    const values = pages.map(p => ({\n      path: p.path,\n      value: getValue(p),\n    }));\n\n    // Filter out null values\n    const nonNullValues = values.filter(v => v.value !== null);\n    if (nonNullValues.length < 2) return;\n\n    // Check if all values are the same\n    const uniqueValues = new Set(nonNullValues.map(v => String(v.value)));\n    if (uniqueValues.size > 1) {\n      inconsistencies.push({\n        type,\n        property,\n        severity,\n        description,\n        pages: values,\n      });\n    }\n  };\n\n  // Layout checks\n  checkProperty('layout', 'headerHeight', p => p.layout.headerHeight, 'Header height differs across pages');\n  checkProperty('layout', 'navWidth', p => p.layout.navWidth, 'Navigation width differs across pages');\n  checkProperty('layout', 'footerHeight', p => p.layout.footerHeight, 'Footer height differs across pages');\n\n  // Typography checks\n  checkProperty('typography', 'bodyFontFamily', p => p.typography.bodyFontFamily, 'Body font family differs across pages', 'error');\n  checkProperty('typography', 'bodyFontSize', p => p.typography.bodyFontSize, 'Body font size differs across pages');\n  checkProperty('typography', 'headingFontFamily', p => p.typography.headingFontFamily, 'Heading font family differs across pages', 'error');\n  checkProperty('typography', 'h1FontSize', p => p.typography.h1FontSize, 'H1 font size differs across pages');\n  checkProperty('typography', 'lineHeight', p => p.typography.lineHeight, 'Line height differs across pages');\n\n  // Color checks\n  checkProperty('color', 'backgroundColor', p => p.colors.backgroundColor, 'Background color differs across pages');\n  checkProperty('color', 'textColor', p => p.colors.textColor, 'Text color differs across pages', 'error');\n  checkProperty('color', 'linkColor', p => p.colors.linkColor, 'Link color differs across pages');\n  checkProperty('color', 'primaryButtonBg', p => p.colors.primaryButtonBg, 'Primary button background differs across pages');\n\n  // Spacing checks\n  checkProperty('spacing', 'buttonPadding', p => p.spacing.buttonPadding, 'Button padding differs across pages');\n  checkProperty('spacing', 'cardPadding', p => p.spacing.cardPadding, 'Card padding differs across pages');\n\n  return inconsistencies;\n}\n\n/**\n * Calculate consistency score based on inconsistencies\n */\nfunction calculateScore(inconsistencies: Inconsistency[]): number {\n  if (inconsistencies.length === 0) return 100;\n\n  const weights = { error: 10, warning: 5, info: 1 };\n  const totalPenalty = inconsistencies.reduce((sum, i) => sum + weights[i.severity], 0);\n\n  // Score decreases based on penalty, minimum 0\n  return Math.max(0, 100 - totalPenalty);\n}\n\n/**\n * Check UI consistency across multiple pages\n */\nexport async function checkConsistency(options: ConsistencyOptions): Promise<ConsistencyResult> {\n  const { urls, timeout = 15000, ignore = [] } = options;\n\n  let driver: EngineDriver | null = null;\n  const pages: PageMetrics[] = [];\n\n  try {\n    driver = new EngineDriver();\n    await driver.launch({\n      headless: true,\n      viewport: { width: 1920, height: 1080 },\n    });\n    const page = new CompatPage(driver);\n\n    for (const url of urls) {\n      try {\n        await page.goto(url, {\n          waitUntil: 'domcontentloaded',\n          timeout,\n        });\n\n        const metrics = await extractMetrics(page, url);\n        pages.push(metrics);\n      } catch (error) {\n        console.error(`Failed to analyze ${url}:`, error instanceof Error ? error.message : error);\n      }\n    }\n\n    await driver.close();\n  } catch (error) {\n    if (driver) await driver.close();\n    throw error;\n  }\n\n  if (pages.length < 2) {\n    return {\n      pages,\n      inconsistencies: [],\n      score: 100,\n      summary: 'Need at least 2 pages to check consistency',\n    };\n  }\n\n  const inconsistencies = findInconsistencies(pages, ignore);\n  const score = calculateScore(inconsistencies);\n\n  const errorCount = inconsistencies.filter(i => i.severity === 'error').length;\n  const warningCount = inconsistencies.filter(i => i.severity === 'warning').length;\n\n  let summary: string;\n  if (score === 100) {\n    summary = `All ${pages.length} pages are consistent.`;\n  } else if (score >= 80) {\n    summary = `Minor inconsistencies found across ${pages.length} pages. ${warningCount} warning(s).`;\n  } else if (score >= 50) {\n    summary = `Notable inconsistencies found. ${errorCount} error(s), ${warningCount} warning(s).`;\n  } else {\n    summary = `Significant style inconsistencies detected. ${errorCount} error(s), ${warningCount} warning(s). Review recommended.`;\n  }\n\n  return {\n    pages,\n    inconsistencies,\n    score,\n    summary,\n  };\n}\n\n/**\n * Format consistency result for display\n */\nexport function formatConsistencyReport(result: ConsistencyResult): string {\n  const lines: string[] = [];\n\n  lines.push('═══════════════════════════════════════════════════════════');\n  lines.push('  UI CONSISTENCY REPORT');\n  lines.push('═══════════════════════════════════════════════════════════');\n  lines.push('');\n  lines.push(`Score: ${result.score}/100`);\n  lines.push(`Pages analyzed: ${result.pages.length}`);\n  lines.push(`Summary: ${result.summary}`);\n  lines.push('');\n\n  if (result.inconsistencies.length === 0) {\n    lines.push('✓ No inconsistencies found');\n  } else {\n    lines.push('Inconsistencies:');\n    lines.push('');\n\n    for (const issue of result.inconsistencies) {\n      const icon = issue.severity === 'error' ? '✗' : issue.severity === 'warning' ? '!' : 'ℹ';\n      lines.push(`  ${icon} [${issue.type}] ${issue.description}`);\n\n      for (const page of issue.pages) {\n        if (page.value !== null) {\n          lines.push(`      ${page.path}: ${page.value}`);\n        }\n      }\n      lines.push('');\n    }\n  }\n\n  lines.push('───────────────────────────────────────────────────────────');\n  lines.push('Pages analyzed:');\n  for (const page of result.pages) {\n    lines.push(`  • ${page.path} (${page.title})`);\n  }\n\n  return lines.join('\\n');\n}\n","import type { PageLike as Page } from './engine/page-like.js';\n\n/**\n * Web Vitals metrics\n * @see https://web.dev/vitals/\n */\nexport interface WebVitals {\n  /** Largest Contentful Paint (ms) - loading performance */\n  LCP: number | null;\n  /** First Input Delay (ms) - interactivity (requires user interaction) */\n  FID: number | null;\n  /** Cumulative Layout Shift (score) - visual stability */\n  CLS: number | null;\n  /** Time to First Byte (ms) - server response time */\n  TTFB: number | null;\n  /** First Contentful Paint (ms) - initial render */\n  FCP: number | null;\n  /** Time to Interactive (ms) - when page becomes fully interactive */\n  TTI: number | null;\n}\n\n/**\n * Performance thresholds for each metric\n * Based on Core Web Vitals guidelines\n */\nexport const PERFORMANCE_THRESHOLDS = {\n  LCP: { good: 2500, poor: 4000 },\n  FID: { good: 100, poor: 300 },\n  CLS: { good: 0.1, poor: 0.25 },\n  TTFB: { good: 800, poor: 1800 },\n  FCP: { good: 1800, poor: 3000 },\n  TTI: { good: 3800, poor: 7300 },\n};\n\n/**\n * Performance rating\n */\nexport type PerformanceRating = 'good' | 'needs-improvement' | 'poor';\n\n/**\n * Rated metric with value and rating\n */\nexport interface RatedMetric {\n  value: number | null;\n  rating: PerformanceRating | null;\n}\n\n/**\n * Full performance result with ratings\n */\nexport interface PerformanceResult {\n  metrics: WebVitals;\n  ratings: Record<keyof WebVitals, RatedMetric>;\n  summary: {\n    overallRating: PerformanceRating;\n    passedVitals: number;\n    totalVitals: number;\n    issues: string[];\n    recommendations: string[];\n  };\n}\n\n/**\n * Rate a metric value against thresholds\n */\nfunction rateMetric(\n  value: number | null,\n  thresholds: { good: number; poor: number }\n): PerformanceRating | null {\n  if (value === null) return null;\n  if (value <= thresholds.good) return 'good';\n  if (value <= thresholds.poor) return 'needs-improvement';\n  return 'poor';\n}\n\n/**\n * Measure Core Web Vitals from a page\n *\n * Note: FID requires actual user interaction, so it will be null\n * for automated tests. Use TTI as an alternative measure.\n */\nexport async function measureWebVitals(page: Page): Promise<WebVitals> {\n  const metrics = await page.evaluate(() => {\n    return new Promise<WebVitals>((resolve) => {\n      const result: WebVitals = {\n        LCP: null,\n        FID: null,\n        CLS: null,\n        TTFB: null,\n        FCP: null,\n        TTI: null,\n      };\n\n      // Get navigation timing for TTFB\n      const navEntry = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming;\n      if (navEntry) {\n        result.TTFB = navEntry.responseStart - navEntry.requestStart;\n      }\n\n      // Get paint timing for FCP\n      const paintEntries = performance.getEntriesByType('paint');\n      const fcpEntry = paintEntries.find(e => e.name === 'first-contentful-paint');\n      if (fcpEntry) {\n        result.FCP = fcpEntry.startTime;\n      }\n\n      // Use PerformanceObserver for LCP and CLS\n      let lcpValue: number | null = null;\n      let clsValue = 0;\n\n      // LCP observer\n      const lcpObserver = new PerformanceObserver((list) => {\n        const entries = list.getEntries();\n        const lastEntry = entries[entries.length - 1];\n        if (lastEntry) {\n          lcpValue = lastEntry.startTime;\n        }\n      });\n\n      // CLS observer\n      const clsObserver = new PerformanceObserver((list) => {\n        for (const entry of list.getEntries()) {\n          // @ts-ignore - hadRecentInput is a valid property for layout-shift entries\n          if (!entry.hadRecentInput) {\n            // @ts-ignore - value is a valid property for layout-shift entries\n            clsValue += entry.value;\n          }\n        }\n      });\n\n      try {\n        lcpObserver.observe({ type: 'largest-contentful-paint', buffered: true });\n      } catch {\n        // LCP not supported\n      }\n\n      try {\n        clsObserver.observe({ type: 'layout-shift', buffered: true });\n      } catch {\n        // CLS not supported\n      }\n\n      // Wait for metrics to stabilize, then return\n      setTimeout(() => {\n        lcpObserver.disconnect();\n        clsObserver.disconnect();\n\n        result.LCP = lcpValue;\n        result.CLS = clsValue;\n\n        // Estimate TTI from navigation timing\n        if (navEntry) {\n          // TTI approximation: domInteractive + longest task estimate\n          result.TTI = navEntry.domInteractive;\n        }\n\n        resolve(result);\n      }, 3000); // Wait 3s for metrics\n    });\n  });\n\n  return metrics;\n}\n\n/**\n * Measure performance and return rated results\n */\nexport async function measurePerformance(page: Page): Promise<PerformanceResult> {\n  const metrics = await measureWebVitals(page);\n\n  // Rate each metric\n  const ratings: Record<keyof WebVitals, RatedMetric> = {\n    LCP: { value: metrics.LCP, rating: rateMetric(metrics.LCP, PERFORMANCE_THRESHOLDS.LCP) },\n    FID: { value: metrics.FID, rating: rateMetric(metrics.FID, PERFORMANCE_THRESHOLDS.FID) },\n    CLS: { value: metrics.CLS, rating: rateMetric(metrics.CLS, PERFORMANCE_THRESHOLDS.CLS) },\n    TTFB: { value: metrics.TTFB, rating: rateMetric(metrics.TTFB, PERFORMANCE_THRESHOLDS.TTFB) },\n    FCP: { value: metrics.FCP, rating: rateMetric(metrics.FCP, PERFORMANCE_THRESHOLDS.FCP) },\n    TTI: { value: metrics.TTI, rating: rateMetric(metrics.TTI, PERFORMANCE_THRESHOLDS.TTI) },\n  };\n\n  // Generate summary\n  const issues: string[] = [];\n  const recommendations: string[] = [];\n  let passedVitals = 0;\n  let totalVitals = 0;\n\n  // Core Web Vitals: LCP, CLS (FID requires interaction)\n  const coreVitals: (keyof WebVitals)[] = ['LCP', 'CLS', 'TTFB', 'FCP'];\n\n  for (const vital of coreVitals) {\n    const rated = ratings[vital];\n    if (rated.value !== null) {\n      totalVitals++;\n      if (rated.rating === 'good') {\n        passedVitals++;\n      } else if (rated.rating === 'poor') {\n        issues.push(`${vital} is poor (${formatMetric(vital, rated.value)})`);\n        recommendations.push(getRecommendation(vital));\n      } else if (rated.rating === 'needs-improvement') {\n        issues.push(`${vital} needs improvement (${formatMetric(vital, rated.value)})`);\n      }\n    }\n  }\n\n  // Calculate overall rating\n  const poorCount = Object.values(ratings).filter(r => r.rating === 'poor').length;\n  const needsImprovementCount = Object.values(ratings).filter(r => r.rating === 'needs-improvement').length;\n\n  let overallRating: PerformanceRating = 'good';\n  if (poorCount > 0) {\n    overallRating = 'poor';\n  } else if (needsImprovementCount > 0) {\n    overallRating = 'needs-improvement';\n  }\n\n  return {\n    metrics,\n    ratings,\n    summary: {\n      overallRating,\n      passedVitals,\n      totalVitals,\n      issues,\n      recommendations,\n    },\n  };\n}\n\n/**\n * Format a metric value for display\n */\nfunction formatMetric(name: keyof WebVitals, value: number): string {\n  if (name === 'CLS') {\n    return value.toFixed(3);\n  }\n  return `${Math.round(value)}ms`;\n}\n\n/**\n * Get improvement recommendation for a metric\n */\nfunction getRecommendation(metric: keyof WebVitals): string {\n  const recommendations: Record<keyof WebVitals, string> = {\n    LCP: 'Optimize largest image/text block: use lazy loading, preload critical assets, optimize server response',\n    FID: 'Reduce JavaScript execution time: split code, defer non-critical JS, use web workers',\n    CLS: 'Reserve space for dynamic content: set explicit dimensions for images/ads/embeds',\n    TTFB: 'Improve server response: use CDN, optimize database queries, enable caching',\n    FCP: 'Eliminate render-blocking resources: inline critical CSS, defer non-critical JS',\n    TTI: 'Reduce main thread work: minimize/defer JavaScript, reduce DOM size',\n  };\n  return recommendations[metric];\n}\n\n/**\n * Format performance result for console output\n */\nexport function formatPerformanceResult(result: PerformanceResult): string {\n  const lines: string[] = [];\n\n  lines.push('Performance Metrics');\n  lines.push('===================');\n  lines.push('');\n\n  // Overall rating\n  const ratingIcon = result.summary.overallRating === 'good' ? '✓' :\n                     result.summary.overallRating === 'needs-improvement' ? '~' : '✗';\n  const ratingColor = result.summary.overallRating === 'good' ? '\\x1b[32m' :\n                      result.summary.overallRating === 'needs-improvement' ? '\\x1b[33m' : '\\x1b[31m';\n  lines.push(`Overall: ${ratingColor}${ratingIcon} ${result.summary.overallRating.toUpperCase()}\\x1b[0m`);\n  lines.push(`Passed: ${result.summary.passedVitals}/${result.summary.totalVitals} core vitals`);\n  lines.push('');\n\n  // Individual metrics\n  lines.push('Core Web Vitals:');\n  const vitals: (keyof WebVitals)[] = ['LCP', 'FCP', 'TTFB', 'CLS'];\n  for (const vital of vitals) {\n    const rated = result.ratings[vital];\n    if (rated.value !== null) {\n      const icon = rated.rating === 'good' ? '✓' :\n                   rated.rating === 'needs-improvement' ? '~' : '✗';\n      const color = rated.rating === 'good' ? '\\x1b[32m' :\n                    rated.rating === 'needs-improvement' ? '\\x1b[33m' : '\\x1b[31m';\n      lines.push(`  ${color}${icon}\\x1b[0m ${vital}: ${formatMetric(vital, rated.value)}`);\n    }\n  }\n\n  // Issues\n  if (result.summary.issues.length > 0) {\n    lines.push('');\n    lines.push('Issues:');\n    for (const issue of result.summary.issues) {\n      lines.push(`  ! ${issue}`);\n    }\n  }\n\n  // Recommendations\n  if (result.summary.recommendations.length > 0) {\n    lines.push('');\n    lines.push('Recommendations:');\n    for (const rec of result.summary.recommendations) {\n      lines.push(`  -> ${rec}`);\n    }\n  }\n\n  return lines.join('\\n');\n}\n","import type { PageLike as Page } from './engine/page-like.js';\n\n/**\n * Interactive element info\n */\nexport interface InteractiveElement {\n  selector: string;\n  tagName: string;\n  type?: string;\n  text?: string;\n  hasHandler: boolean;\n  isDisabled: boolean;\n  isVisible: boolean;\n  a11y: {\n    role?: string;\n    ariaLabel?: string;\n    tabIndex?: number;\n  };\n}\n\n/**\n * Button analysis result\n */\nexport interface ButtonInfo extends InteractiveElement {\n  buttonType?: 'submit' | 'button' | 'reset';\n  formId?: string;\n}\n\n/**\n * Link analysis result\n */\nexport interface LinkInfo extends InteractiveElement {\n  href: string;\n  isPlaceholder: boolean;\n  opensNewTab: boolean;\n  isExternal: boolean;\n}\n\n/**\n * Form analysis result\n */\nexport interface FormInfo {\n  selector: string;\n  action?: string;\n  method?: string;\n  hasSubmitHandler: boolean;\n  fields: FormFieldInfo[];\n  hasValidation: boolean;\n  submitButton?: ButtonInfo;\n}\n\n/**\n * Form field info\n */\nexport interface FormFieldInfo {\n  selector: string;\n  name?: string;\n  type: string;\n  label?: string;\n  required: boolean;\n  hasValidation: boolean;\n}\n\n/**\n * Interactivity issue\n */\nexport interface InteractivityIssue {\n  type: 'NO_HANDLER' | 'PLACEHOLDER_LINK' | 'MISSING_LABEL' | 'DISABLED_NO_VISUAL' |\n        'SMALL_TOUCH_TARGET' | 'FORM_NO_SUBMIT' | 'ORPHAN_SUBMIT' | 'NO_KEYBOARD_ACCESS';\n  element: string;\n  severity: 'error' | 'warning' | 'info';\n  description: string;\n}\n\n/**\n * Full interactivity test result\n */\nexport interface InteractivityResult {\n  buttons: ButtonInfo[];\n  links: LinkInfo[];\n  forms: FormInfo[];\n  issues: InteractivityIssue[];\n  summary: {\n    totalInteractive: number;\n    withHandlers: number;\n    withoutHandlers: number;\n    issueCount: {\n      error: number;\n      warning: number;\n      info: number;\n    };\n  };\n}\n\n/**\n * Test interactivity of all interactive elements on a page\n */\nexport async function testInteractivity(page: Page): Promise<InteractivityResult> {\n  const data = await page.evaluate(() => {\n    const results: {\n      buttons: ButtonInfo[];\n      links: LinkInfo[];\n      forms: FormInfo[];\n    } = {\n      buttons: [],\n      links: [],\n      forms: [],\n    };\n\n    // Helper to check if element has event handlers\n    function hasEventHandler(el: Element): boolean {\n      // Check for inline handlers\n      const inlineHandlers = ['onclick', 'onmousedown', 'onmouseup', 'ontouchstart', 'ontouchend'];\n      for (const handler of inlineHandlers) {\n        if (el.getAttribute(handler)) return true;\n      }\n\n      // Check for common framework patterns\n      const attrs = Array.from(el.attributes).map(a => a.name);\n      const frameworkPatterns = ['@click', 'v-on:click', 'ng-click', '(click)'];\n      for (const pattern of frameworkPatterns) {\n        if (attrs.some(a => a.includes(pattern) || a.startsWith(pattern))) return true;\n      }\n\n      // Check for data attributes that suggest handlers\n      if (el.getAttribute('data-action') || el.getAttribute('data-onclick')) return true;\n\n      // Can't detect addEventListener from DOM, assume true for semantic elements\n      const tagName = el.tagName.toLowerCase();\n      if (tagName === 'a' && (el as HTMLAnchorElement).href) return true;\n      if (tagName === 'button') return true;\n      if (tagName === 'input' && ['submit', 'button'].includes((el as HTMLInputElement).type)) return true;\n\n      return false;\n    }\n\n    // Helper to get unique selector\n    function getSelector(el: Element): string {\n      if (el.id) return `#${el.id}`;\n      const classes = Array.from(el.classList).slice(0, 2).join('.');\n      const tag = el.tagName.toLowerCase();\n      if (classes) return `${tag}.${classes}`;\n      return tag;\n    }\n\n    // Helper to check visibility\n    function isVisible(el: Element): boolean {\n      const style = window.getComputedStyle(el);\n      const rect = el.getBoundingClientRect();\n      return style.display !== 'none' &&\n             style.visibility !== 'hidden' &&\n             style.opacity !== '0' &&\n             rect.width > 0 &&\n             rect.height > 0;\n    }\n\n    // Analyze buttons\n    const buttons = Array.from(document.querySelectorAll('button, [role=\"button\"], input[type=\"button\"], input[type=\"submit\"]'));\n    for (const btn of buttons) {\n      const el = btn as HTMLButtonElement | HTMLInputElement;\n      results.buttons.push({\n        selector: getSelector(el),\n        tagName: el.tagName.toLowerCase(),\n        type: el.type || undefined,\n        text: el.textContent?.trim() || (el as HTMLInputElement).value || undefined,\n        hasHandler: hasEventHandler(el),\n        isDisabled: el.disabled || el.getAttribute('aria-disabled') === 'true',\n        isVisible: isVisible(el),\n        a11y: {\n          role: el.getAttribute('role') || undefined,\n          ariaLabel: el.getAttribute('aria-label') || undefined,\n          tabIndex: el.tabIndex,\n        },\n        buttonType: (el as HTMLButtonElement).type as 'submit' | 'button' | 'reset' || undefined,\n        formId: el.form?.id || undefined,\n      });\n    }\n\n    // Analyze links\n    const links = Array.from(document.querySelectorAll('a[href]'));\n    for (const link of links) {\n      const el = link as HTMLAnchorElement;\n      const href = el.getAttribute('href') || '';\n      const isPlaceholder = href === '#' || href === '' || href === 'javascript:void(0)';\n\n      results.links.push({\n        selector: getSelector(el),\n        tagName: 'a',\n        text: el.textContent?.trim() || undefined,\n        hasHandler: hasEventHandler(el) || !isPlaceholder,\n        isDisabled: el.getAttribute('aria-disabled') === 'true',\n        isVisible: isVisible(el),\n        a11y: {\n          role: el.getAttribute('role') || undefined,\n          ariaLabel: el.getAttribute('aria-label') || undefined,\n          tabIndex: el.tabIndex,\n        },\n        href,\n        isPlaceholder,\n        opensNewTab: el.target === '_blank',\n        isExternal: el.hostname !== window.location.hostname,\n      });\n    }\n\n    // Analyze forms\n    const forms = Array.from(document.querySelectorAll('form'));\n    for (const form of forms) {\n      const el = form as HTMLFormElement;\n      const fields: FormFieldInfo[] = [];\n\n      // Get form fields\n      const inputs = Array.from(el.querySelectorAll('input, select, textarea'));\n      for (const input of inputs) {\n        const field = input as HTMLInputElement;\n        if (['hidden', 'submit', 'button'].includes(field.type)) continue;\n\n        const labelEl = el.querySelector(`label[for=\"${field.id}\"]`) ||\n                        field.closest('label');\n\n        fields.push({\n          selector: getSelector(field),\n          name: field.name || undefined,\n          type: field.type || field.tagName.toLowerCase(),\n          label: labelEl?.textContent?.trim() || undefined,\n          required: field.required,\n          hasValidation: field.hasAttribute('pattern') ||\n                         field.hasAttribute('min') ||\n                         field.hasAttribute('max') ||\n                         field.hasAttribute('minlength') ||\n                         field.hasAttribute('maxlength'),\n        });\n      }\n\n      // Find submit button\n      const submitBtn = el.querySelector('button[type=\"submit\"], input[type=\"submit\"]');\n      let submitInfo: ButtonInfo | undefined;\n      if (submitBtn) {\n        const btn = submitBtn as HTMLButtonElement;\n        submitInfo = {\n          selector: getSelector(btn),\n          tagName: btn.tagName.toLowerCase(),\n          text: btn.textContent?.trim() || (btn as HTMLInputElement).value || undefined,\n          hasHandler: hasEventHandler(btn),\n          isDisabled: btn.disabled,\n          isVisible: isVisible(btn),\n          a11y: {\n            role: btn.getAttribute('role') || undefined,\n            ariaLabel: btn.getAttribute('aria-label') || undefined,\n          },\n          buttonType: 'submit',\n        };\n      }\n\n      // Check for submit handler on form\n      const hasSubmitHandler = hasEventHandler(el) ||\n                               el.getAttribute('action') !== null ||\n                               submitBtn !== null;\n\n      results.forms.push({\n        selector: getSelector(el),\n        action: el.action || undefined,\n        method: el.method || undefined,\n        hasSubmitHandler,\n        fields,\n        hasValidation: fields.some(f => f.hasValidation || f.required),\n        submitButton: submitInfo,\n      });\n    }\n\n    return results;\n  });\n\n  // Analyze for issues\n  const issues: InteractivityIssue[] = [];\n\n  // Check buttons\n  for (const btn of data.buttons) {\n    if (!btn.hasHandler && !btn.isDisabled) {\n      issues.push({\n        type: 'NO_HANDLER',\n        element: btn.selector,\n        severity: 'warning',\n        description: `Button \"${btn.text || btn.selector}\" has no click handler`,\n      });\n    }\n\n    if (btn.isDisabled && btn.isVisible) {\n      // Check if disabled state is visually indicated\n      // This is a heuristic - we can't fully check CSS from here\n    }\n\n    if (!btn.a11y.ariaLabel && !btn.text) {\n      issues.push({\n        type: 'MISSING_LABEL',\n        element: btn.selector,\n        severity: 'error',\n        description: `Button has no accessible label (no text or aria-label)`,\n      });\n    }\n  }\n\n  // Check links\n  for (const link of data.links) {\n    if (link.isPlaceholder && !link.hasHandler) {\n      issues.push({\n        type: 'PLACEHOLDER_LINK',\n        element: link.selector,\n        severity: 'error',\n        description: `Link \"${link.text || link.selector}\" has placeholder href without handler`,\n      });\n    }\n\n    if (!link.a11y.ariaLabel && !link.text) {\n      issues.push({\n        type: 'MISSING_LABEL',\n        element: link.selector,\n        severity: 'error',\n        description: `Link has no accessible label (no text or aria-label)`,\n      });\n    }\n  }\n\n  // Check forms\n  for (const form of data.forms) {\n    if (!form.hasSubmitHandler) {\n      issues.push({\n        type: 'FORM_NO_SUBMIT',\n        element: form.selector,\n        severity: 'warning',\n        description: `Form has no submit handler or action`,\n      });\n    }\n\n    // Check for labels on fields\n    for (const field of form.fields) {\n      if (!field.label && field.type !== 'hidden') {\n        issues.push({\n          type: 'MISSING_LABEL',\n          element: field.selector,\n          severity: 'warning',\n          description: `Form field \"${field.name || field.selector}\" has no label`,\n        });\n      }\n    }\n  }\n\n  // Calculate summary\n  const allInteractive = [...data.buttons, ...data.links];\n  const withHandlers = allInteractive.filter(e => e.hasHandler).length;\n\n  return {\n    buttons: data.buttons,\n    links: data.links,\n    forms: data.forms,\n    issues,\n    summary: {\n      totalInteractive: allInteractive.length,\n      withHandlers,\n      withoutHandlers: allInteractive.length - withHandlers,\n      issueCount: {\n        error: issues.filter(i => i.severity === 'error').length,\n        warning: issues.filter(i => i.severity === 'warning').length,\n        info: issues.filter(i => i.severity === 'info').length,\n      },\n    },\n  };\n}\n\n/**\n * Format interactivity result for console output\n */\nexport function formatInteractivityResult(result: InteractivityResult): string {\n  const lines: string[] = [];\n\n  lines.push('Interactivity Analysis');\n  lines.push('======================');\n  lines.push('');\n\n  // Summary\n  lines.push(`Total interactive elements: ${result.summary.totalInteractive}`);\n  lines.push(`  With handlers: ${result.summary.withHandlers}`);\n  lines.push(`  Without handlers: ${result.summary.withoutHandlers}`);\n  lines.push('');\n\n  // Breakdown\n  lines.push(`Buttons: ${result.buttons.length}`);\n  lines.push(`Links: ${result.links.length}`);\n  lines.push(`Forms: ${result.forms.length}`);\n  lines.push('');\n\n  // Forms detail\n  if (result.forms.length > 0) {\n    lines.push('Forms:');\n    for (const form of result.forms) {\n      const icon = form.hasSubmitHandler ? '✓' : '!';\n      lines.push(`  ${icon} ${form.selector} (${form.fields.length} fields)`);\n    }\n    lines.push('');\n  }\n\n  // Issues\n  if (result.issues.length > 0) {\n    lines.push('Issues:');\n    for (const issue of result.issues) {\n      const icon = issue.severity === 'error' ? '\\x1b[31m✗\\x1b[0m' :\n                   issue.severity === 'warning' ? '\\x1b[33m!\\x1b[0m' : 'i';\n      lines.push(`  ${icon} [${issue.type}] ${issue.description}`);\n    }\n  } else {\n    lines.push('No issues detected.');\n  }\n\n  return lines.join('\\n');\n}\n","import type { PageLike } from './engine/page-like.js';\n\n// Inline types for network events — replaces Playwright's Request/Response\n// These match the subset of Playwright's API that api-timing actually uses.\n// When CDP Network domain events are added to the engine, these can be replaced.\n/* eslint-disable @typescript-eslint/no-explicit-any */\ntype Page = PageLike & { on(event: string, handler: any): void; off?(event: string, handler: any): void };\ninterface Request { url(): string; resourceType(): string; method(): string; timing(): { startTime: number; [key: string]: number }; }\ninterface Response { url(): string; status(): number; request(): Request; body(): Promise<Buffer>; serverAddr(): Promise<{ ipAddress: string; port: number } | null>; }\n\n/**\n * API request timing info\n */\nexport interface ApiRequestTiming {\n  url: string;\n  method: string;\n  duration: number;\n  status: number;\n  size: number;\n  resourceType: string;\n  timing: {\n    dnsLookup?: number;\n    tcpConnect?: number;\n    tlsHandshake?: number;\n    requestSent?: number;\n    waiting?: number;\n    contentDownload?: number;\n  };\n}\n\n/**\n * API timing measurement result\n */\nexport interface ApiTimingResult {\n  requests: ApiRequestTiming[];\n  summary: {\n    totalRequests: number;\n    totalTime: number;\n    totalSize: number;\n    averageTime: number;\n    slowestRequest: { url: string; duration: number } | null;\n    fastestRequest: { url: string; duration: number } | null;\n    failedRequests: number;\n    byStatus: Record<number, number>;\n  };\n}\n\n/**\n * Options for API timing measurement\n */\nexport interface ApiTimingOptions {\n  /** Filter to only track URLs matching this pattern */\n  filter?: RegExp;\n  /** Include static resources (images, fonts, etc.) */\n  includeStatic?: boolean;\n  /** Timeout to wait for requests to complete (ms) */\n  timeout?: number;\n  /** Minimum duration to report (ms) - filters out fast requests */\n  minDuration?: number;\n}\n\n/**\n * Measure API/network request timing on a page\n *\n * Call this before navigating to the page, then call stopMeasuring after navigation\n */\nexport async function measureApiTiming(\n  page: Page,\n  options: ApiTimingOptions = {}\n): Promise<ApiTimingResult> {\n  const {\n    filter,\n    includeStatic = false,\n    timeout = 10000,\n    minDuration = 0,\n  } = options;\n\n  const requests: Map<Request, { startTime: number }> = new Map();\n  const completedRequests: ApiRequestTiming[] = [];\n\n  // Track request start times\n  const requestHandler = (request: Request) => {\n    const url = request.url();\n    const resourceType = request.resourceType();\n\n    // Skip static resources unless requested\n    if (!includeStatic && ['image', 'font', 'stylesheet', 'media'].includes(resourceType)) {\n      return;\n    }\n\n    // Apply filter\n    if (filter && !filter.test(url)) {\n      return;\n    }\n\n    requests.set(request, { startTime: Date.now() });\n  };\n\n  // Track response completion\n  const responseHandler = async (response: Response) => {\n    const request = response.request();\n    const requestData = requests.get(request);\n\n    if (!requestData) return;\n\n    const duration = Date.now() - requestData.startTime;\n\n    // Skip if below minimum duration\n    if (duration < minDuration) {\n      requests.delete(request);\n      return;\n    }\n\n    try {\n      // Get response size\n      const body = await response.body().catch(() => Buffer.alloc(0));\n      const size = body.length;\n\n      // Get timing info if available\n      let timing: ReturnType<typeof request.timing> | Record<string, never> = {};\n      try {\n        timing = response.request().timing();\n      } catch {\n        // Timing not available\n      }\n\n      completedRequests.push({\n        url: request.url(),\n        method: request.method(),\n        duration,\n        status: response.status(),\n        size,\n        resourceType: request.resourceType(),\n        timing: {\n          dnsLookup: timing.domainLookupEnd !== undefined && timing.domainLookupStart !== undefined\n            ? timing.domainLookupEnd - timing.domainLookupStart\n            : undefined,\n          tcpConnect: timing.connectEnd !== undefined && timing.connectStart !== undefined\n            ? timing.connectEnd - timing.connectStart\n            : undefined,\n          requestSent: timing.requestStart !== undefined && timing.connectEnd !== undefined\n            ? timing.requestStart - timing.connectEnd\n            : undefined,\n          waiting: timing.responseStart !== undefined && timing.requestStart !== undefined\n            ? timing.responseStart - timing.requestStart\n            : undefined,\n          contentDownload: timing.responseEnd !== undefined && timing.responseStart !== undefined\n            ? timing.responseEnd - timing.responseStart\n            : undefined,\n        },\n      });\n    } catch {\n      // Ignore errors in timing collection\n    }\n\n    requests.delete(request);\n  };\n\n  // Track failed requests\n  const requestFailedHandler = (request: Request) => {\n    const requestData = requests.get(request);\n    if (!requestData) return;\n\n    const duration = Date.now() - requestData.startTime;\n\n    completedRequests.push({\n      url: request.url(),\n      method: request.method(),\n      duration,\n      status: 0, // 0 indicates failure\n      size: 0,\n      resourceType: request.resourceType(),\n      timing: {},\n    });\n\n    requests.delete(request);\n  };\n\n  // Attach listeners\n  page.on('request', requestHandler);\n  page.on('response', responseHandler);\n  page.on('requestfailed', requestFailedHandler);\n\n  // Wait for pending requests to complete\n  await new Promise<void>((resolve) => {\n    const startWait = Date.now();\n\n    const check = () => {\n      // All tracked requests completed or timeout\n      if (requests.size === 0 || Date.now() - startWait > timeout) {\n        resolve();\n        return;\n      }\n      setTimeout(check, 100);\n    };\n\n    // Wait for initial load, then check periodically\n    setTimeout(check, 1000);\n  });\n\n  // Clean up listeners\n  page.off?.('request', requestHandler);\n  page.off?.('response', responseHandler);\n  page.off?.('requestfailed', requestFailedHandler);\n\n  // Calculate summary\n  const totalRequests = completedRequests.length;\n  const totalTime = completedRequests.reduce((sum, r) => sum + r.duration, 0);\n  const totalSize = completedRequests.reduce((sum, r) => sum + r.size, 0);\n  const failedRequests = completedRequests.filter(r => r.status === 0 || r.status >= 400).length;\n\n  // Find slowest/fastest\n  let slowestRequest: { url: string; duration: number } | null = null;\n  let fastestRequest: { url: string; duration: number } | null = null;\n\n  if (completedRequests.length > 0) {\n    const sorted = [...completedRequests].sort((a, b) => b.duration - a.duration);\n    slowestRequest = { url: sorted[0].url, duration: sorted[0].duration };\n    fastestRequest = { url: sorted[sorted.length - 1].url, duration: sorted[sorted.length - 1].duration };\n  }\n\n  // Count by status\n  const byStatus: Record<number, number> = {};\n  for (const req of completedRequests) {\n    byStatus[req.status] = (byStatus[req.status] || 0) + 1;\n  }\n\n  return {\n    requests: completedRequests.sort((a, b) => b.duration - a.duration),\n    summary: {\n      totalRequests,\n      totalTime,\n      totalSize,\n      averageTime: totalRequests > 0 ? Math.round(totalTime / totalRequests) : 0,\n      slowestRequest,\n      fastestRequest,\n      failedRequests,\n      byStatus,\n    },\n  };\n}\n\n/**\n * Create an API timing tracker that records during page interactions\n */\nexport function createApiTracker(page: Page, options: ApiTimingOptions = {}) {\n  const {\n    filter,\n    includeStatic = false,\n    minDuration = 0,\n  } = options;\n\n  const requests: Map<Request, { startTime: number }> = new Map();\n  const completedRequests: ApiRequestTiming[] = [];\n  let isTracking = false;\n\n  const requestHandler = (request: Request) => {\n    if (!isTracking) return;\n\n    const url = request.url();\n    const resourceType = request.resourceType();\n\n    if (!includeStatic && ['image', 'font', 'stylesheet', 'media'].includes(resourceType)) {\n      return;\n    }\n\n    if (filter && !filter.test(url)) {\n      return;\n    }\n\n    requests.set(request, { startTime: Date.now() });\n  };\n\n  const responseHandler = async (response: Response) => {\n    const request = response.request();\n    const requestData = requests.get(request);\n\n    if (!requestData) return;\n\n    const duration = Date.now() - requestData.startTime;\n\n    if (duration < minDuration) {\n      requests.delete(request);\n      return;\n    }\n\n    try {\n      const body = await response.body().catch(() => Buffer.alloc(0));\n\n      completedRequests.push({\n        url: request.url(),\n        method: request.method(),\n        duration,\n        status: response.status(),\n        size: body.length,\n        resourceType: request.resourceType(),\n        timing: {},\n      });\n    } catch {\n      // Ignore\n    }\n\n    requests.delete(request);\n  };\n\n  const requestFailedHandler = (request: Request) => {\n    const requestData = requests.get(request);\n    if (!requestData) return;\n\n    completedRequests.push({\n      url: request.url(),\n      method: request.method(),\n      duration: Date.now() - requestData.startTime,\n      status: 0,\n      size: 0,\n      resourceType: request.resourceType(),\n      timing: {},\n    });\n\n    requests.delete(request);\n  };\n\n  return {\n    start() {\n      isTracking = true;\n      page.on('request', requestHandler);\n      page.on('response', responseHandler);\n      page.on('requestfailed', requestFailedHandler);\n    },\n\n    stop(): ApiTimingResult {\n      isTracking = false;\n      page.off?.('request', requestHandler);\n      page.off?.('response', responseHandler);\n      page.off?.('requestfailed', requestFailedHandler);\n\n      const totalRequests = completedRequests.length;\n      const totalTime = completedRequests.reduce((sum, r) => sum + r.duration, 0);\n      const totalSize = completedRequests.reduce((sum, r) => sum + r.size, 0);\n      const failedRequests = completedRequests.filter(r => r.status === 0 || r.status >= 400).length;\n\n      let slowestRequest: { url: string; duration: number } | null = null;\n      let fastestRequest: { url: string; duration: number } | null = null;\n\n      if (completedRequests.length > 0) {\n        const sorted = [...completedRequests].sort((a, b) => b.duration - a.duration);\n        slowestRequest = { url: sorted[0].url, duration: sorted[0].duration };\n        fastestRequest = { url: sorted[sorted.length - 1].url, duration: sorted[sorted.length - 1].duration };\n      }\n\n      const byStatus: Record<number, number> = {};\n      for (const req of completedRequests) {\n        byStatus[req.status] = (byStatus[req.status] || 0) + 1;\n      }\n\n      return {\n        requests: completedRequests.sort((a, b) => b.duration - a.duration),\n        summary: {\n          totalRequests,\n          totalTime,\n          totalSize,\n          averageTime: totalRequests > 0 ? Math.round(totalTime / totalRequests) : 0,\n          slowestRequest,\n          fastestRequest,\n          failedRequests,\n          byStatus,\n        },\n      };\n    },\n\n    getRequests(): ApiRequestTiming[] {\n      return [...completedRequests];\n    },\n  };\n}\n\n/**\n * Format API timing result for console output\n */\nexport function formatApiTimingResult(result: ApiTimingResult): string {\n  const lines: string[] = [];\n\n  lines.push('API Timing Analysis');\n  lines.push('===================');\n  lines.push('');\n\n  // Summary\n  lines.push('Summary:');\n  lines.push(`  Total requests: ${result.summary.totalRequests}`);\n  lines.push(`  Total time: ${result.summary.totalTime}ms`);\n  lines.push(`  Total size: ${formatBytes(result.summary.totalSize)}`);\n  lines.push(`  Average time: ${result.summary.averageTime}ms`);\n  lines.push(`  Failed requests: ${result.summary.failedRequests}`);\n  lines.push('');\n\n  // Slowest/fastest\n  if (result.summary.slowestRequest) {\n    lines.push(`Slowest: ${result.summary.slowestRequest.duration}ms`);\n    lines.push(`  ${truncateUrl(result.summary.slowestRequest.url)}`);\n  }\n  if (result.summary.fastestRequest && result.requests.length > 1) {\n    lines.push(`Fastest: ${result.summary.fastestRequest.duration}ms`);\n    lines.push(`  ${truncateUrl(result.summary.fastestRequest.url)}`);\n  }\n  lines.push('');\n\n  // Top 10 slowest requests\n  if (result.requests.length > 0) {\n    lines.push('Slowest requests:');\n    const top10 = result.requests.slice(0, 10);\n    for (const req of top10) {\n      const statusIcon = req.status === 0 ? '\\x1b[31m✗\\x1b[0m' :\n                         req.status >= 400 ? '\\x1b[31m!\\x1b[0m' : '\\x1b[32m✓\\x1b[0m';\n      lines.push(`  ${statusIcon} ${req.duration}ms ${req.method} ${truncateUrl(req.url)}`);\n    }\n  }\n\n  return lines.join('\\n');\n}\n\n/**\n * Format bytes to human readable string\n */\nfunction formatBytes(bytes: number): string {\n  if (bytes < 1024) return `${bytes}B`;\n  if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n  return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\n/**\n * Truncate URL for display\n */\nfunction truncateUrl(url: string, maxLength = 60): string {\n  try {\n    const parsed = new URL(url);\n    const path = parsed.pathname + parsed.search;\n    if (path.length > maxLength) {\n      return path.substring(0, maxLength - 3) + '...';\n    }\n    return path;\n  } catch {\n    if (url.length > maxLength) {\n      return url.substring(0, maxLength - 3) + '...';\n    }\n    return url;\n  }\n}\n","/**\n * Memory System - Persistent UI/UX preferences with eviction and summarization\n *\n * Follows the \"Deep Agents\" context management pattern:\n * - summary.json: Always-loaded compact file (< 2KB)\n * - preferences/: Full preference detail files\n * - learned/: Expectations extracted from approved sessions\n * - archive/: Previous summary snapshots (eviction)\n */\n\nimport { readFile, writeFile, mkdir, readdir, unlink, copyFile } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { nanoid } from 'nanoid';\nimport type {\n  MemorySummary,\n  Preference,\n  PreferenceCategory,\n  LearnedExpectation,\n  ActivePreference,\n  Observation,\n  ExpectationOperator,\n  MemorySource,\n  Violation,\n  EnhancedElement,\n  Session,\n} from './schemas.js';\nimport type { Rule, RuleContext, RulePreset } from './rules/engine.js';\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst MEMORY_DIR = 'memory';\nconst SUMMARY_FILE = 'summary.json';\nconst PREFERENCES_DIR = 'preferences';\nconst LEARNED_DIR = 'learned';\nconst ARCHIVE_DIR = 'archive';\nconst PREF_PREFIX = 'pref_';\nconst LEARN_PREFIX = 'learn_';\nconst MAX_ACTIVE_PREFERENCES = 50;\n\n// ============================================================================\n// INITIALIZATION\n// ============================================================================\n\n/**\n * Ensure memory directory structure exists\n */\nexport async function initMemory(outputDir: string): Promise<void> {\n  const memoryDir = join(outputDir, MEMORY_DIR);\n  await mkdir(join(memoryDir, PREFERENCES_DIR), { recursive: true });\n  await mkdir(join(memoryDir, LEARNED_DIR), { recursive: true });\n  await mkdir(join(memoryDir, ARCHIVE_DIR), { recursive: true });\n}\n\n// ============================================================================\n// SUMMARY (Always-loaded compact state)\n// ============================================================================\n\nfunction getMemoryPath(outputDir: string, ...segments: string[]): string {\n  return join(outputDir, MEMORY_DIR, ...segments);\n}\n\n/**\n * Load the compact summary - the \"working memory\"\n */\nexport async function loadSummary(outputDir: string): Promise<MemorySummary> {\n  const summaryPath = getMemoryPath(outputDir, SUMMARY_FILE);\n\n  if (!existsSync(summaryPath)) {\n    return createEmptySummary();\n  }\n\n  try {\n    const content = await readFile(summaryPath, 'utf-8');\n    return JSON.parse(content) as MemorySummary;\n  } catch {\n    return createEmptySummary();\n  }\n}\n\n/**\n * Save the compact summary\n */\nexport async function saveSummary(outputDir: string, summary: MemorySummary): Promise<void> {\n  await initMemory(outputDir);\n  const summaryPath = getMemoryPath(outputDir, SUMMARY_FILE);\n  await writeFile(summaryPath, JSON.stringify(summary, null, 2));\n}\n\nfunction createEmptySummary(): MemorySummary {\n  return {\n    version: 1,\n    updatedAt: new Date().toISOString(),\n    stats: {\n      totalPreferences: 0,\n      totalLearned: 0,\n      byCategory: {},\n      bySource: {},\n    },\n    activePreferences: [],\n  };\n}\n\n// ============================================================================\n// PREFERENCE CRUD\n// ============================================================================\n\n/**\n * Add a new UI/UX preference\n */\nexport async function addPreference(\n  outputDir: string,\n  input: {\n    description: string;\n    category: PreferenceCategory;\n    source?: MemorySource;\n    route?: string;\n    componentType?: string;\n    property: string;\n    operator?: ExpectationOperator;\n    value: string;\n    confidence?: number;\n    sessionIds?: string[];\n  }\n): Promise<Preference> {\n  await initMemory(outputDir);\n\n  const now = new Date().toISOString();\n  const pref: Preference = {\n    id: `${PREF_PREFIX}${nanoid(8)}`,\n    description: input.description,\n    category: input.category,\n    source: input.source ?? 'user',\n    route: input.route,\n    componentType: input.componentType,\n    expectation: {\n      property: input.property,\n      operator: input.operator ?? 'equals',\n      value: input.value,\n    },\n    confidence: input.confidence ?? 1.0,\n    createdAt: now,\n    updatedAt: now,\n    sessionIds: input.sessionIds,\n  };\n\n  // Write full preference file\n  const prefPath = getMemoryPath(outputDir, PREFERENCES_DIR, `${pref.id}.json`);\n  await writeFile(prefPath, JSON.stringify(pref, null, 2));\n\n  // Rebuild summary\n  await rebuildSummary(outputDir);\n\n  return pref;\n}\n\n/**\n * Get full preference detail by ID\n */\nexport async function getPreference(outputDir: string, prefId: string): Promise<Preference | null> {\n  const prefPath = getMemoryPath(outputDir, PREFERENCES_DIR, `${prefId}.json`);\n\n  if (!existsSync(prefPath)) return null;\n\n  try {\n    const content = await readFile(prefPath, 'utf-8');\n    return JSON.parse(content) as Preference;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Remove a preference\n */\nexport async function removePreference(outputDir: string, prefId: string): Promise<boolean> {\n  const prefPath = getMemoryPath(outputDir, PREFERENCES_DIR, `${prefId}.json`);\n\n  if (!existsSync(prefPath)) return false;\n\n  await unlink(prefPath);\n  await rebuildSummary(outputDir);\n  return true;\n}\n\n/**\n * List preferences with optional filter\n */\nexport async function listPreferences(\n  outputDir: string,\n  filter?: { category?: PreferenceCategory; route?: string; componentType?: string }\n): Promise<Preference[]> {\n  const prefsDir = getMemoryPath(outputDir, PREFERENCES_DIR);\n\n  if (!existsSync(prefsDir)) return [];\n\n  const files = await readdir(prefsDir);\n  const prefs: Preference[] = [];\n\n  for (const file of files) {\n    if (!file.endsWith('.json')) continue;\n    try {\n      const content = await readFile(join(prefsDir, file), 'utf-8');\n      const pref = JSON.parse(content) as Preference;\n\n      if (filter?.category && pref.category !== filter.category) continue;\n      if (filter?.route && pref.route !== filter.route) continue;\n      if (filter?.componentType && pref.componentType !== filter.componentType) continue;\n\n      prefs.push(pref);\n    } catch {\n      // Skip malformed files\n    }\n  }\n\n  return prefs.sort((a, b) => b.confidence - a.confidence);\n}\n\n// ============================================================================\n// LEARNING FROM SESSIONS\n// ============================================================================\n\n/**\n * Extract and store expectations from an approved session\n */\nexport async function learnFromSession(\n  outputDir: string,\n  session: Session,\n  observations: Observation[]\n): Promise<LearnedExpectation> {\n  await initMemory(outputDir);\n\n  const route = new URL(session.url).pathname;\n  const learned: LearnedExpectation = {\n    id: `${LEARN_PREFIX}${nanoid(8)}`,\n    sessionId: session.id,\n    route,\n    observations,\n    approved: true,\n    createdAt: new Date().toISOString(),\n  };\n\n  const learnPath = getMemoryPath(outputDir, LEARNED_DIR, `${learned.id}.json`);\n  await writeFile(learnPath, JSON.stringify(learned, null, 2));\n\n  return learned;\n}\n\n/**\n * List learned expectations\n */\nexport async function listLearned(outputDir: string): Promise<LearnedExpectation[]> {\n  const learnedDir = getMemoryPath(outputDir, LEARNED_DIR);\n\n  if (!existsSync(learnedDir)) return [];\n\n  const files = await readdir(learnedDir);\n  const items: LearnedExpectation[] = [];\n\n  for (const file of files) {\n    if (!file.endsWith('.json')) continue;\n    try {\n      const content = await readFile(join(learnedDir, file), 'utf-8');\n      items.push(JSON.parse(content) as LearnedExpectation);\n    } catch {\n      // Skip malformed\n    }\n  }\n\n  return items.sort((a, b) => b.createdAt.localeCompare(a.createdAt));\n}\n\n/**\n * Promote a learned expectation to a full preference\n */\nexport async function promoteToPreference(\n  outputDir: string,\n  learnedId: string\n): Promise<Preference | null> {\n  const learnedPath = getMemoryPath(outputDir, LEARNED_DIR, `${learnedId}.json`);\n\n  if (!existsSync(learnedPath)) return null;\n\n  const content = await readFile(learnedPath, 'utf-8');\n  const learned = JSON.parse(content) as LearnedExpectation;\n\n  if (learned.observations.length === 0) return null;\n\n  // Promote first observation as the primary preference\n  const obs = learned.observations[0];\n  const pref = await addPreference(outputDir, {\n    description: obs.description,\n    category: obs.category,\n    source: 'learned',\n    route: learned.route,\n    property: obs.property,\n    value: obs.value,\n    confidence: 0.8,\n    sessionIds: [learned.sessionId],\n  });\n\n  return pref;\n}\n\n// ============================================================================\n// SUMMARIZATION & EVICTION\n// ============================================================================\n\n/**\n * Rebuild summary from all preference files (summarization pattern)\n */\nexport async function rebuildSummary(outputDir: string): Promise<MemorySummary> {\n  // Archive current summary (eviction pattern)\n  await archiveSummary(outputDir);\n\n  const prefs = await listPreferences(outputDir);\n  const learned = await listLearned(outputDir);\n\n  // Compute stats\n  const byCategory: Record<string, number> = {};\n  const bySource: Record<string, number> = {};\n\n  for (const pref of prefs) {\n    byCategory[pref.category] = (byCategory[pref.category] || 0) + 1;\n    bySource[pref.source] = (bySource[pref.source] || 0) + 1;\n  }\n\n  // Build compact active preferences (only top N by confidence)\n  const activePrefs = prefs\n    .slice(0, MAX_ACTIVE_PREFERENCES)\n    .map((pref): ActivePreference => ({\n      id: pref.id,\n      description: pref.description,\n      category: pref.category,\n      route: pref.route,\n      componentType: pref.componentType,\n      property: pref.expectation.property,\n      operator: pref.expectation.operator,\n      value: pref.expectation.value,\n      confidence: pref.confidence,\n    }));\n\n  const summary: MemorySummary = {\n    version: 1,\n    updatedAt: new Date().toISOString(),\n    stats: {\n      totalPreferences: prefs.length,\n      totalLearned: learned.length,\n      byCategory,\n      bySource,\n    },\n    activePreferences: activePrefs,\n  };\n\n  await saveSummary(outputDir, summary);\n  return summary;\n}\n\n/**\n * Archive current summary before rebuilding (eviction pattern)\n */\nexport async function archiveSummary(outputDir: string): Promise<void> {\n  const summaryPath = getMemoryPath(outputDir, SUMMARY_FILE);\n\n  if (!existsSync(summaryPath)) return;\n\n  const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n  const archivePath = getMemoryPath(outputDir, ARCHIVE_DIR, `summary_${timestamp}.json`);\n\n  try {\n    await copyFile(summaryPath, archivePath);\n  } catch {\n    // Non-critical if archive fails\n  }\n}\n\n// ============================================================================\n// QUERY\n// ============================================================================\n\n/**\n * Query memory for preferences matching criteria\n */\nexport async function queryMemory(\n  outputDir: string,\n  query: { route?: string; category?: string; componentType?: string }\n): Promise<ActivePreference[]> {\n  const summary = await loadSummary(outputDir);\n\n  return summary.activePreferences.filter(pref => {\n    if (query.route && pref.route && !query.route.includes(pref.route)) return false;\n    if (query.category && pref.category !== query.category) return false;\n    if (query.componentType && pref.componentType !== query.componentType) return false;\n    return true;\n  });\n}\n\n// ============================================================================\n// RULES BRIDGE\n// ============================================================================\n\n/**\n * Evaluate an operator against actual and expected values\n */\nfunction evaluateOperator(operator: ExpectationOperator, actual: string, expected: string): boolean {\n  switch (operator) {\n    case 'equals':\n      return actual.toLowerCase() === expected.toLowerCase();\n    case 'contains':\n      return actual.toLowerCase().includes(expected.toLowerCase());\n    case 'matches':\n      try {\n        return new RegExp(expected, 'i').test(actual);\n      } catch {\n        return false;\n      }\n    case 'gte':\n      return parseFloat(actual) >= parseFloat(expected);\n    case 'lte':\n      return parseFloat(actual) <= parseFloat(expected);\n    default:\n      return false;\n  }\n}\n\n/**\n * Convert memory preferences into Rule objects for the rules engine\n */\nexport function preferencesToRules(preferences: ActivePreference[]): Rule[] {\n  return preferences.map((pref): Rule => ({\n    id: `memory-${pref.id}`,\n    name: `Memory: ${pref.description}`,\n    description: `User preference: ${pref.description}`,\n    defaultSeverity: pref.confidence >= 0.8 ? 'error' : 'warn',\n    check: (element: EnhancedElement, context: RuleContext): Violation | null => {\n      // Route scoping\n      if (pref.route && !context.url.includes(pref.route)) return null;\n\n      // Component type scoping\n      if (pref.componentType) {\n        const matchesTag = element.tagName.toLowerCase() === pref.componentType.toLowerCase();\n        const matchesRole = element.a11y?.role?.toLowerCase() === pref.componentType.toLowerCase();\n        if (!matchesTag && !matchesRole) return null;\n      }\n\n      // Property check against computed styles\n      const styles = element.computedStyles;\n      if (!styles) return null;\n\n      const actual = styles[pref.property];\n      if (!actual) return null;\n\n      if (evaluateOperator(pref.operator, actual, pref.value)) return null;\n\n      return {\n        ruleId: `memory-${pref.id}`,\n        ruleName: `Memory: ${pref.description}`,\n        severity: pref.confidence >= 0.8 ? 'error' : 'warn',\n        message: `Expected ${pref.property} to ${pref.operator} \"${pref.value}\", got \"${actual}\". (${pref.description})`,\n        element: element.selector,\n        bounds: element.bounds,\n        fix: `Update ${pref.property} to ${pref.value}`,\n      };\n    },\n  }));\n}\n\n/**\n * Create a RulePreset from memory preferences\n */\nexport function createMemoryPreset(preferences: ActivePreference[]): RulePreset {\n  const rules = preferencesToRules(preferences);\n  const defaults: Record<string, 'warn' | 'error'> = {};\n\n  for (const rule of rules) {\n    defaults[rule.id] = rule.defaultSeverity;\n  }\n\n  return {\n    name: 'memory',\n    description: 'UI/UX preferences from IBR memory',\n    rules,\n    defaults,\n  };\n}\n\n// ============================================================================\n// FORMAT\n// ============================================================================\n\n/**\n * Format memory summary for CLI output\n */\nexport function formatMemorySummary(summary: MemorySummary): string {\n  const lines: string[] = [];\n\n  lines.push('IBR Memory');\n  lines.push(`Updated: ${summary.updatedAt}`);\n  lines.push('');\n  lines.push(`Preferences: ${summary.stats.totalPreferences}`);\n  lines.push(`Learned: ${summary.stats.totalLearned}`);\n\n  if (Object.keys(summary.stats.byCategory).length > 0) {\n    lines.push('');\n    lines.push('By category:');\n    for (const [cat, count] of Object.entries(summary.stats.byCategory)) {\n      lines.push(`  ${cat}: ${count}`);\n    }\n  }\n\n  if (summary.activePreferences.length > 0) {\n    lines.push('');\n    lines.push('Active preferences:');\n    for (const pref of summary.activePreferences) {\n      const scope = pref.route ? ` (${pref.route})` : ' (global)';\n      const conf = pref.confidence < 1.0 ? ` [${Math.round(pref.confidence * 100)}%]` : '';\n      lines.push(`  ${pref.id}: ${pref.description}${scope}${conf}`);\n    }\n  }\n\n  return lines.join('\\n');\n}\n\n/**\n * Format a single preference for display\n */\nexport function formatPreference(pref: Preference): string {\n  const lines: string[] = [];\n\n  lines.push(`ID: ${pref.id}`);\n  lines.push(`Description: ${pref.description}`);\n  lines.push(`Category: ${pref.category}`);\n  lines.push(`Source: ${pref.source}`);\n  lines.push(`Confidence: ${Math.round(pref.confidence * 100)}%`);\n  lines.push(`Expectation: ${pref.expectation.property} ${pref.expectation.operator} \"${pref.expectation.value}\"`);\n\n  if (pref.route) lines.push(`Route: ${pref.route}`);\n  if (pref.componentType) lines.push(`Component: ${pref.componentType}`);\n  if (pref.sessionIds?.length) lines.push(`Sessions: ${pref.sessionIds.join(', ')}`);\n\n  lines.push(`Created: ${pref.createdAt}`);\n  lines.push(`Updated: ${pref.updatedAt}`);\n\n  return lines.join('\\n');\n}\n\n// ============================================================================\n// GLOBAL MEMORY — Cross-project preference promotion\n// ============================================================================\n\nconst GLOBAL_DIR = join(homedir(), '.ibr', 'global-memory');\nconst GLOBAL_PREFS_DIR = join(GLOBAL_DIR, 'preferences');\nconst GLOBAL_SUMMARY = join(GLOBAL_DIR, 'summary.json');\n\n/** Confidence threshold for auto-promotion to global */\nconst GLOBAL_PROMOTION_THRESHOLD = 0.9;\n\n\n/**\n * Ensure global memory directory exists\n */\nasync function initGlobalMemory(): Promise<void> {\n  await mkdir(GLOBAL_PREFS_DIR, { recursive: true });\n}\n\n/**\n * Promote high-confidence local preferences to global memory.\n * Call periodically (e.g., after session approval or on explicit command).\n *\n * Only promotes preferences that:\n * - Have confidence >= GLOBAL_PROMOTION_THRESHOLD\n * - Are NOT route-scoped (global = route-agnostic patterns)\n * - Don't already exist globally (deduplicated by property+operator+value)\n */\nexport async function promoteToGlobal(outputDir: string): Promise<{\n  promoted: string[];\n  skipped: number;\n  alreadyGlobal: number;\n}> {\n  await initGlobalMemory();\n\n  const localPrefs = await listPreferences(outputDir);\n  const globalPrefs = await listGlobalPreferences();\n\n  // Index global by property+operator+value for dedup\n  const globalIndex = new Set(\n    globalPrefs.map(p => `${p.expectation.property}|${p.expectation.operator}|${p.expectation.value}`)\n  );\n\n  const promoted: string[] = [];\n  let skipped = 0;\n  let alreadyGlobal = 0;\n\n  for (const pref of localPrefs) {\n    // Skip route-scoped preferences (they're project-specific)\n    if (pref.route) {\n      skipped++;\n      continue;\n    }\n\n    // Skip low-confidence\n    if (pref.confidence < GLOBAL_PROMOTION_THRESHOLD) {\n      skipped++;\n      continue;\n    }\n\n    // Check if already global\n    const key = `${pref.expectation.property}|${pref.expectation.operator}|${pref.expectation.value}`;\n    if (globalIndex.has(key)) {\n      alreadyGlobal++;\n      continue;\n    }\n\n    // Promote: write to global\n    const globalPref: Preference = {\n      ...pref,\n      id: `global_${nanoid(8)}`,\n      source: 'learned',\n      updatedAt: new Date().toISOString(),\n    };\n\n    const globalPath = join(GLOBAL_PREFS_DIR, `${globalPref.id}.json`);\n    await writeFile(globalPath, JSON.stringify(globalPref, null, 2));\n    globalIndex.add(key);\n    promoted.push(`${pref.category}: ${pref.description}`);\n  }\n\n  // Rebuild global summary\n  await rebuildGlobalSummary();\n\n  return { promoted, skipped, alreadyGlobal };\n}\n\n/**\n * List all global preferences\n */\nexport async function listGlobalPreferences(): Promise<Preference[]> {\n  if (!existsSync(GLOBAL_PREFS_DIR)) return [];\n\n  const files = await readdir(GLOBAL_PREFS_DIR);\n  const prefs: Preference[] = [];\n\n  for (const file of files) {\n    if (!file.endsWith('.json')) continue;\n    try {\n      const content = await readFile(join(GLOBAL_PREFS_DIR, file), 'utf-8');\n      prefs.push(JSON.parse(content) as Preference);\n    } catch {\n      // Skip malformed\n    }\n  }\n\n  return prefs.sort((a, b) => b.confidence - a.confidence);\n}\n\n/**\n * Seed a project's local memory from global preferences.\n * Only adds preferences that don't already exist locally (by property+operator+value).\n * Seeded preferences get confidence 0.7 (lower than locally-learned 0.8).\n */\nexport async function seedFromGlobal(outputDir: string): Promise<{\n  seeded: string[];\n  skipped: number;\n}> {\n  await initMemory(outputDir);\n\n  const globalPrefs = await listGlobalPreferences();\n  const localPrefs = await listPreferences(outputDir);\n\n  // Index local by property+operator+value\n  const localIndex = new Set(\n    localPrefs.map(p => `${p.expectation.property}|${p.expectation.operator}|${p.expectation.value}`)\n  );\n\n  const seeded: string[] = [];\n  let skipped = 0;\n\n  for (const pref of globalPrefs) {\n    const key = `${pref.expectation.property}|${pref.expectation.operator}|${pref.expectation.value}`;\n    if (localIndex.has(key)) {\n      skipped++;\n      continue;\n    }\n\n    // Seed locally with reduced confidence\n    await addPreference(outputDir, {\n      description: pref.description,\n      category: pref.category,\n      source: 'learned',\n      componentType: pref.componentType,\n      property: pref.expectation.property,\n      operator: pref.expectation.operator,\n      value: pref.expectation.value,\n      confidence: 0.7, // Lower than locally-learned (0.8)\n    });\n\n    seeded.push(`${pref.category}: ${pref.description}`);\n  }\n\n  return { seeded, skipped };\n}\n\n/**\n * Rebuild global summary\n */\nasync function rebuildGlobalSummary(): Promise<void> {\n  const prefs = await listGlobalPreferences();\n\n  const byCategory: Record<string, number> = {};\n  for (const pref of prefs) {\n    byCategory[pref.category] = (byCategory[pref.category] || 0) + 1;\n  }\n\n  const summary = {\n    version: 1,\n    updatedAt: new Date().toISOString(),\n    totalPreferences: prefs.length,\n    byCategory,\n    preferences: prefs.slice(0, MAX_ACTIVE_PREFERENCES).map(p => ({\n      id: p.id,\n      description: p.description,\n      category: p.category,\n      property: p.expectation.property,\n      operator: p.expectation.operator,\n      value: p.expectation.value,\n      confidence: p.confidence,\n    })),\n  };\n\n  await writeFile(GLOBAL_SUMMARY, JSON.stringify(summary, null, 2));\n}\n\n/**\n * Remove a global preference\n */\nexport async function removeGlobalPreference(prefId: string): Promise<boolean> {\n  const prefPath = join(GLOBAL_PREFS_DIR, `${prefId}.json`);\n  if (!existsSync(prefPath)) return false;\n\n  await unlink(prefPath);\n  await rebuildGlobalSummary();\n  return true;\n}\n\n/**\n * Format global memory status\n */\nexport function formatGlobalMemory(prefs: Preference[]): string {\n  if (prefs.length === 0) return 'No global preferences. Run `memory:promote` to promote local patterns.';\n\n  const lines = [\n    `Global Memory: ${prefs.length} preferences`,\n    `Location: ${GLOBAL_DIR}`,\n    '',\n  ];\n\n  const byCategory = new Map<string, Preference[]>();\n  for (const p of prefs) {\n    const arr = byCategory.get(p.category) || [];\n    arr.push(p);\n    byCategory.set(p.category, arr);\n  }\n\n  for (const [cat, catPrefs] of byCategory) {\n    lines.push(`  ${cat} (${catPrefs.length}):`);\n    for (const p of catPrefs) {\n      lines.push(`    ${p.id}: ${p.description} [${Math.round(p.confidence * 100)}%]`);\n    }\n  }\n\n  return lines.join('\\n');\n}\n","import { EngineDriver } from './engine/driver.js';\nimport { CompatPage } from './engine/compat.js';\nimport type { PageLike } from './engine/page-like.js';\nimport { writeFile, readFile, unlink, mkdir } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport type { Viewport, EnhancedElement, ElementIssue, AuditResult } from './schemas.js';\nimport { VIEWPORTS } from './schemas.js';\nimport { viewportToConfig } from './devices.js';\n\n/**\n * Lock file to prevent concurrent extractions\n */\nconst LOCK_FILE = '.extracting';\nconst LOCK_TIMEOUT_MS = 180000; // 3 minutes (longer than extraction to prevent stale locks)\nconst EXTRACTION_TIMEOUT_MS = 120000; // 2 minutes - allows complex pages to load\n\n/**\n * Extracted element information\n */\nexport interface ExtractedElement {\n  selector: string;\n  tagName: string;\n  id?: string;\n  className?: string;\n  bounds: {\n    x: number;\n    y: number;\n    width: number;\n    height: number;\n  };\n  computedStyles: Record<string, string>;\n}\n\n/**\n * CSS custom properties (variables)\n */\nexport interface CSSVariables {\n  [key: string]: string;\n}\n\n/**\n * Full extraction result\n */\nexport interface ExtractionResult {\n  url: string;\n  timestamp: string;\n  viewport: Viewport;\n  html: string;\n  elements: ExtractedElement[];\n  cssVariables: CSSVariables;\n  screenshotPath: string;\n}\n\n/**\n * Options for HTML extraction\n */\nexport interface ExtractOptions {\n  url: string;\n  outputDir: string;\n  sessionId: string;\n  viewport?: Viewport;\n  timeout?: number;\n  /** CSS selectors to extract (defaults to semantic elements) */\n  selectors?: string[];\n}\n\n/**\n * Default semantic selectors to extract\n */\nconst DEFAULT_SELECTORS = [\n  'header',\n  'nav',\n  'main',\n  'section',\n  'article',\n  'aside',\n  'footer',\n  'h1',\n  'h2',\n  'h3',\n  'button',\n  'a[href]',\n  'form',\n  'input',\n  'img',\n];\n\n/**\n * Key CSS properties to extract\n */\nconst CSS_PROPERTIES_TO_EXTRACT = [\n  'display',\n  'position',\n  'width',\n  'height',\n  'padding',\n  'margin',\n  'backgroundColor',\n  'color',\n  'fontSize',\n  'fontFamily',\n  'fontWeight',\n  'lineHeight',\n  'textAlign',\n  'borderRadius',\n  'border',\n  'boxShadow',\n  'gap',\n  'flexDirection',\n  'alignItems',\n  'justifyContent',\n  'gridTemplateColumns',\n  'gridTemplateRows',\n];\n\n// Singleton driver instance\nlet driver: EngineDriver | null = null;\n\n/**\n * Close the browser instance\n */\nexport async function closeBrowser(): Promise<void> {\n  if (driver) {\n    await driver.close();\n    driver = null;\n  }\n}\n\n/**\n * Check if extraction is already in progress\n */\nasync function checkLock(outputDir: string): Promise<boolean> {\n  const lockPath = join(outputDir, LOCK_FILE);\n  if (!existsSync(lockPath)) {\n    return false;\n  }\n\n  try {\n    const content = await readFile(lockPath, 'utf-8');\n    const timestamp = parseInt(content, 10);\n    const age = Date.now() - timestamp;\n\n    // Lock is stale if older than timeout\n    if (age > LOCK_TIMEOUT_MS) {\n      await unlink(lockPath);\n      return false;\n    }\n\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Create extraction lock\n */\nasync function createLock(outputDir: string): Promise<void> {\n  const lockPath = join(outputDir, LOCK_FILE);\n  await writeFile(lockPath, Date.now().toString());\n}\n\n/**\n * Release extraction lock\n */\nasync function releaseLock(outputDir: string): Promise<void> {\n  const lockPath = join(outputDir, LOCK_FILE);\n  try {\n    await unlink(lockPath);\n  } catch {\n    // Ignore errors\n  }\n}\n\n/**\n * Extract computed styles for an element\n */\nasync function extractElementStyles(\n  page: PageLike,\n  selector: string\n): Promise<ExtractedElement[]> {\n  return page.evaluate(\n    ({ sel, props }: { sel: string; props: string[] }) => {\n      const elements = document.querySelectorAll(sel);\n      const results: ExtractedElement[] = [];\n\n      elements.forEach((el, index) => {\n        const htmlEl = el as HTMLElement;\n        const rect = htmlEl.getBoundingClientRect();\n        const computed = window.getComputedStyle(htmlEl);\n\n        const styles: Record<string, string> = {};\n        props.forEach((prop) => {\n          const value = computed.getPropertyValue(\n            prop.replace(/([A-Z])/g, '-$1').toLowerCase()\n          );\n          if (value && value !== 'none' && value !== 'normal' && value !== '0px') {\n            styles[prop] = value;\n          }\n        });\n\n        results.push({\n          selector: `${sel}:nth-of-type(${index + 1})`,\n          tagName: htmlEl.tagName.toLowerCase(),\n          id: htmlEl.id || undefined,\n          className: htmlEl.className || undefined,\n          bounds: {\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          },\n          computedStyles: styles,\n        });\n      });\n\n      return results;\n    },\n    { sel: selector, props: CSS_PROPERTIES_TO_EXTRACT }\n  );\n}\n\n/**\n * Interactive element selectors for audit\n */\nconst INTERACTIVE_SELECTORS = [\n  'button',\n  'a[href]',\n  'a:not([href])',  // Links without href (potential issues)\n  'input[type=\"submit\"]',\n  'input[type=\"button\"]',\n  'input[type=\"text\"]',\n  'input[type=\"email\"]',\n  'input[type=\"password\"]',\n  'select',\n  'textarea',\n  '[role=\"button\"]',\n  '[role=\"link\"]',\n  '[onclick]',\n  '[tabindex]:not([tabindex=\"-1\"])',\n];\n\n/**\n * Extract enhanced interactive elements with handler detection\n */\nexport async function extractInteractiveElements(page: PageLike): Promise<EnhancedElement[]> {\n  return page.evaluate((selectors: string[]) => {\n    const seen = new Set<Element>();\n    const elements: EnhancedElement[] = [];\n\n    // Helper: Generate unique selector (arrow function to avoid __name bundling issue)\n    const generateSelector = (el: HTMLElement): string => {\n      if (el.id) return `#${el.id}`;\n\n      const path: string[] = [];\n      let current: HTMLElement | null = el;\n\n      while (current && current !== document.body) {\n        let selector = current.tagName.toLowerCase();\n        if (current.id) {\n          selector = `#${current.id}`;\n          path.unshift(selector);\n          break;\n        } else if (current.className && typeof current.className === 'string') {\n          const classes = current.className.split(' ').filter(c => c.trim() && !c.includes(':'));\n          if (classes.length > 0) {\n            selector += `.${classes[0]}`;\n          }\n        }\n\n        const parent = current.parentElement;\n        if (parent) {\n          const siblings = Array.from(parent.children).filter(\n            c => c.tagName === current!.tagName\n          );\n          if (siblings.length > 1) {\n            const index = siblings.indexOf(current) + 1;\n            selector += `:nth-of-type(${index})`;\n          }\n        }\n\n        path.unshift(selector);\n        current = current.parentElement;\n      }\n\n      return path.join(' > ').slice(0, 200);\n    };\n\n    // Helper: Detect click handlers (arrow function to avoid __name bundling issue)\n    const detectHandlers = (el: HTMLElement) => {\n      const keys = Object.keys(el);\n\n      // React 17+ uses __reactProps$\n      const reactPropsKey = keys.find(k => k.startsWith('__reactProps$'));\n      let hasReactHandler = false;\n      if (reactPropsKey) {\n        const props = (el as any)[reactPropsKey];\n        hasReactHandler = !!(props?.onClick || props?.onSubmit || props?.onMouseDown);\n      }\n\n      // Also check React fiber\n      const fiberKey = keys.find(k => k.startsWith('__reactFiber$'));\n      if (!hasReactHandler && fiberKey) {\n        const fiber = (el as any)[fiberKey];\n        hasReactHandler = !!(fiber?.pendingProps?.onClick || fiber?.memoizedProps?.onClick);\n      }\n\n      // Vue uses __vue__ or __vnode\n      const hasVueHandler = !!(\n        (el as any).__vue__?.$listeners?.click ||\n        (el as any).__vnode?.props?.onClick\n      );\n\n      // Angular uses __ngContext__\n      const hasAngularHandler = !!(el as any).__ngContext__ || el.hasAttribute('ng-click');\n\n      // Vanilla DOM\n      const hasVanillaHandler = typeof (el as any).onclick === 'function' ||\n                                 el.hasAttribute('onclick');\n\n      return {\n        hasReactHandler,\n        hasVueHandler,\n        hasAngularHandler,\n        hasVanillaHandler,\n        hasAnyHandler: hasReactHandler || hasVueHandler || hasAngularHandler || hasVanillaHandler,\n      };\n    };\n\n    // Process each selector\n    for (const selector of selectors) {\n      try {\n        document.querySelectorAll(selector).forEach((el) => {\n          if (seen.has(el)) return;\n          seen.add(el);\n\n          const htmlEl = el as HTMLElement;\n          const rect = htmlEl.getBoundingClientRect();\n          const computed = window.getComputedStyle(htmlEl);\n          const handlers = detectHandlers(htmlEl);\n\n          // Check href for links\n          const href = htmlEl.getAttribute('href');\n          const hasValidHref = href !== null && href !== '#' && href !== '' &&\n                               !href.startsWith('javascript:');\n\n          elements.push({\n            selector: generateSelector(htmlEl),\n            tagName: htmlEl.tagName.toLowerCase(),\n            id: htmlEl.id || undefined,\n            className: typeof htmlEl.className === 'string' ? htmlEl.className : undefined,\n            text: (htmlEl.textContent || '').trim().slice(0, 100) || undefined,\n            bounds: {\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            },\n            computedStyles: {\n              cursor: computed.cursor,\n              color: computed.color,\n              backgroundColor: computed.backgroundColor,\n            },\n            interactive: {\n              hasOnClick: handlers.hasAnyHandler,\n              hasHref: hasValidHref,\n              isDisabled: htmlEl.hasAttribute('disabled') ||\n                          htmlEl.getAttribute('aria-disabled') === 'true' ||\n                          computed.pointerEvents === 'none',\n              tabIndex: parseInt(htmlEl.getAttribute('tabindex') || '0', 10),\n              cursor: computed.cursor,\n              hasReactHandler: handlers.hasReactHandler || undefined,\n              hasVueHandler: handlers.hasVueHandler || undefined,\n              hasAngularHandler: handlers.hasAngularHandler || undefined,\n            },\n            a11y: {\n              role: htmlEl.getAttribute('role'),\n              ariaLabel: htmlEl.getAttribute('aria-label'),\n              ariaDescribedBy: htmlEl.getAttribute('aria-describedby'),\n              ariaHidden: htmlEl.getAttribute('aria-hidden') === 'true' || undefined,\n              ariaHaspopup: htmlEl.getAttribute('aria-haspopup'),\n            },\n            sourceHint: {\n              dataTestId: htmlEl.getAttribute('data-testid'),\n            },\n            inForm: htmlEl instanceof HTMLButtonElement\n              ? htmlEl.form !== null\n              : !!htmlEl.closest?.('form'),\n            buttonType: htmlEl instanceof HTMLButtonElement\n              ? (htmlEl.getAttribute('type') ?? 'submit')\n              : null,\n          });\n        });\n      } catch {\n        // Skip invalid selectors\n      }\n    }\n\n    return elements;\n  }, INTERACTIVE_SELECTORS);\n}\n\n/**\n * Analyze elements and detect issues\n */\nexport function analyzeElements(elements: EnhancedElement[], isMobile = false): AuditResult {\n  const issues: ElementIssue[] = [];\n  let withHandlers = 0;\n  let withoutHandlers = 0;\n\n  const interactiveElements = elements.filter(el => {\n    const isButton = el.tagName === 'button' || el.a11y.role === 'button';\n    const isLink = el.tagName === 'a';\n    const isInput = ['input', 'select', 'textarea'].includes(el.tagName);\n    const looksClickable = el.interactive.cursor === 'pointer';\n    return isButton || isLink || isInput || looksClickable;\n  });\n\n  for (const el of interactiveElements) {\n    const isButton = el.tagName === 'button' || el.a11y.role === 'button';\n    const isLink = el.tagName === 'a';\n    const hasHandler = el.interactive.hasOnClick || el.interactive.hasHref;\n\n    if (hasHandler) {\n      withHandlers++;\n    } else {\n      withoutHandlers++;\n    }\n\n    // Check: Button without handler\n    if (isButton && !el.interactive.hasOnClick && !el.interactive.isDisabled) {\n      issues.push({\n        type: 'NO_HANDLER',\n        severity: 'error',\n        message: `Button \"${el.text || el.selector}\" has no click handler`,\n      });\n    }\n\n    // Check: Link with placeholder href\n    if (isLink && !el.interactive.hasHref && !el.interactive.hasOnClick) {\n      issues.push({\n        type: 'PLACEHOLDER_LINK',\n        severity: 'error',\n        message: `Link \"${el.text || el.selector}\" has placeholder href and no handler`,\n      });\n    }\n\n    // Check: Touch target too small (mobile)\n    const minSize = isMobile ? 44 : 24;\n    if (el.bounds.width < minSize || el.bounds.height < minSize) {\n      issues.push({\n        type: 'TOUCH_TARGET_SMALL',\n        severity: isMobile ? 'error' : 'warning',\n        message: `\"${el.text || el.selector}\" touch target is ${el.bounds.width}x${el.bounds.height}px (min: ${minSize}px)`,\n      });\n    }\n\n    // Check: Missing aria-label on interactive element without text\n    if (hasHandler && !el.text && !el.a11y.ariaLabel) {\n      issues.push({\n        type: 'MISSING_ARIA_LABEL',\n        severity: 'warning',\n        message: `\"${el.selector}\" is interactive but has no text or aria-label`,\n      });\n    }\n  }\n\n  return {\n    totalElements: elements.length,\n    interactiveCount: interactiveElements.length,\n    withHandlers,\n    withoutHandlers,\n    issues,\n  };\n}\n\n/**\n * Extract CSS custom properties (variables)\n */\nasync function extractCSSVariables(page: PageLike): Promise<CSSVariables> {\n  return page.evaluate(() => {\n    const root = document.documentElement;\n    const variables: CSSVariables = {};\n\n    // Get all CSS rules from stylesheets\n    const sheets = Array.from(document.styleSheets);\n    sheets.forEach((sheet) => {\n      try {\n        const rules = Array.from(sheet.cssRules || []);\n        rules.forEach((rule) => {\n          if (rule instanceof CSSStyleRule && rule.selectorText === ':root') {\n            const style = rule.style;\n            for (let i = 0; i < style.length; i++) {\n              const prop = style[i];\n              if (prop.startsWith('--')) {\n                variables[prop] = style.getPropertyValue(prop).trim();\n              }\n            }\n          }\n        });\n      } catch {\n        // Cross-origin stylesheets will throw\n      }\n    });\n\n    // Also get computed custom properties from :root\n    const rootStyles = getComputedStyle(root);\n    // Check common variable prefixes\n    ['--primary', '--secondary', '--accent', '--background', '--foreground', '--border', '--radius', '--spacing']\n      .forEach(prefix => {\n        for (let i = 0; i < 20; i++) {\n          const variations = [\n            prefix,\n            `${prefix}-${i}`,\n            `${prefix}-color`,\n            `${prefix}-bg`,\n          ];\n          variations.forEach(varName => {\n            const value = rootStyles.getPropertyValue(varName).trim();\n            if (value && !variables[varName]) {\n              variables[varName] = value;\n            }\n          });\n        }\n      });\n\n    return variables;\n  });\n}\n\n/**\n * Extract HTML, CSS, and screenshot from a live URL\n */\nexport async function extractFromURL(\n  options: ExtractOptions\n): Promise<ExtractionResult> {\n  const {\n    url,\n    outputDir,\n    sessionId,\n    viewport = VIEWPORTS.desktop,\n    timeout = EXTRACTION_TIMEOUT_MS,\n    selectors = DEFAULT_SELECTORS,\n  } = options;\n\n  // Check for concurrent extraction\n  if (await checkLock(outputDir)) {\n    throw new Error('Another extraction is in progress. Please wait.');\n  }\n\n  // Create session directory\n  const sessionDir = join(outputDir, 'sessions', sessionId);\n  await mkdir(sessionDir, { recursive: true });\n\n  // Create lock\n  await createLock(outputDir);\n\n  let timeoutHandle: NodeJS.Timeout | null = null;\n\n  try {\n    // Set up hard timeout\n    const timeoutPromise = new Promise<never>((_, reject) => {\n      timeoutHandle = setTimeout(() => {\n        reject(new Error(`Extraction timed out after ${timeout}ms`));\n      }, timeout);\n    });\n\n    const extractionPromise = async () => {\n      const driverInstance = new EngineDriver();\n      await driverInstance.launch({\n        headless: true,\n        viewport: viewportToConfig(viewport),\n      });\n      const page = new CompatPage(driverInstance);\n\n      try {\n        // Navigate to URL\n        await page.goto(url, {\n          waitUntil: 'networkidle',\n          timeout: timeout,\n        });\n\n        // Wait for animations to settle\n        await page.waitForTimeout(500);\n\n        // Disable animations for screenshot\n        await page.addStyleTag({\n          content: `\n            *, *::before, *::after {\n              animation-duration: 0s !important;\n              animation-delay: 0s !important;\n              transition-duration: 0s !important;\n              transition-delay: 0s !important;\n            }\n          `,\n        });\n\n        // Extract HTML\n        const html = await page.content();\n\n        // Extract elements\n        const elements: ExtractedElement[] = [];\n        for (const selector of selectors) {\n          const extracted = await extractElementStyles(page, selector);\n          elements.push(...extracted);\n        }\n\n        // Extract CSS variables\n        const cssVariables = await extractCSSVariables(page);\n\n        // Take screenshot\n        const screenshotPath = join(sessionDir, 'reference.png');\n        await page.screenshot({\n          path: screenshotPath,\n          fullPage: true,\n          type: 'png',\n        });\n\n        const result: ExtractionResult = {\n          url,\n          timestamp: new Date().toISOString(),\n          viewport,\n          html,\n          elements,\n          cssVariables,\n          screenshotPath,\n        };\n\n        // Save extraction data\n        await writeFile(\n          join(sessionDir, 'reference.json'),\n          JSON.stringify(result, null, 2)\n        );\n\n        // Save HTML separately for easier access\n        await writeFile(join(sessionDir, 'reference.html'), html);\n\n        return result;\n      } finally {\n        await driverInstance.close();\n      }\n    };\n\n    // Race between extraction and timeout\n    const result = await Promise.race([extractionPromise(), timeoutPromise]);\n    return result;\n  } finally {\n    // Clear timeout\n    if (timeoutHandle) {\n      clearTimeout(timeoutHandle);\n    }\n\n    // Release lock\n    await releaseLock(outputDir);\n  }\n}\n\n/**\n * Get paths for a reference session\n */\nexport function getReferenceSessionPaths(outputDir: string, sessionId: string) {\n  const root = join(outputDir, 'sessions', sessionId);\n  return {\n    root,\n    sessionJson: join(root, 'session.json'),\n    reference: join(root, 'reference.png'),\n    referenceHtml: join(root, 'reference.html'),\n    referenceData: join(root, 'reference.json'),\n    current: join(root, 'current.png'),\n    diff: join(root, 'diff.png'),\n  };\n}\n","import type { EnhancedElement } from './schemas.js';\n\nexport interface LayoutCollision {\n  element1: { selector: string; text: string; bounds: { x: number; y: number; width: number; height: number } };\n  element2: { selector: string; text: string; bounds: { x: number; y: number; width: number; height: number } };\n  overlapArea: number;      // pixels squared\n  overlapPercent: number;   // relative to smaller element\n}\n\nexport interface LayoutCollisionResult {\n  collisions: LayoutCollision[];\n  hasCollisions: boolean;\n}\n\n/**\n * Detect overlapping text elements that indicate layout collisions.\n *\n * Filters to visible text elements, checks bounding box intersections,\n * and skips trivial overlaps and intentional parent/child layering.\n */\nexport function detectLayoutCollisions(elements: EnhancedElement[]): LayoutCollisionResult {\n  // 1. Filter to visible text elements\n  const textElements = elements.filter(\n    el => el.text && el.text.trim().length > 0 && el.bounds.width > 0 && el.bounds.height > 0\n  );\n\n  // 2. Sort by vertical position (y), then horizontal (x)\n  textElements.sort((a, b) => a.bounds.y !== b.bounds.y ? a.bounds.y - b.bounds.y : a.bounds.x - b.bounds.x);\n\n  const collisions: LayoutCollision[] = [];\n\n  for (let i = 0; i < textElements.length; i++) {\n    const a = textElements[i];\n    const aBottom = a.bounds.y + a.bounds.height;\n\n    for (let j = i + 1; j < textElements.length; j++) {\n      const b = textElements[j];\n\n      // Early exit: b is too far below a to overlap (sorted by y, so all later elements are even lower)\n      if (b.bounds.y > aBottom + 2) break;\n\n      // 6. Skip parent/child relationships (selector prefix check)\n      if (b.selector.startsWith(a.selector) || a.selector.startsWith(b.selector)) continue;\n\n      // 3. Calculate bounding box intersection\n      const ix = Math.max(a.bounds.x, b.bounds.x);\n      const iy = Math.max(a.bounds.y, b.bounds.y);\n      const ix2 = Math.min(a.bounds.x + a.bounds.width, b.bounds.x + b.bounds.width);\n      const iy2 = Math.min(a.bounds.y + a.bounds.height, b.bounds.y + b.bounds.height);\n\n      const overlapW = ix2 - ix;\n      const overlapH = iy2 - iy;\n\n      if (overlapW <= 0 || overlapH <= 0) continue;\n\n      const overlapArea = overlapW * overlapH;\n\n      // 5. Filter trivial overlaps: skip if < 4px in either dimension\n      if (overlapW < 4 || overlapH < 4) continue;\n\n      // 4. Calculate overlapPercent relative to smaller element\n      const areaA = a.bounds.width * a.bounds.height;\n      const areaB = b.bounds.width * b.bounds.height;\n      const smallerArea = Math.min(areaA, areaB);\n      const overlapPercent = smallerArea > 0 ? (overlapArea / smallerArea) * 100 : 0;\n\n      // 5. Filter trivial overlaps: skip if < 5%\n      if (overlapPercent < 5) continue;\n\n      collisions.push({\n        element1: {\n          selector: a.selector,\n          text: a.text!,\n          bounds: { x: a.bounds.x, y: a.bounds.y, width: a.bounds.width, height: a.bounds.height },\n        },\n        element2: {\n          selector: b.selector,\n          text: b.text!,\n          bounds: { x: b.bounds.x, y: b.bounds.y, width: b.bounds.width, height: b.bounds.height },\n        },\n        overlapArea,\n        overlapPercent,\n      });\n    }\n  }\n\n  return {\n    collisions,\n    hasCollisions: collisions.length > 0,\n  };\n}\n","import { z } from 'zod';\nimport { readFile } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\n\n// Custom principle check schema\nconst CustomCheckSchema = z.object({\n  property: z.string(),\n  operator: z.enum(['equals', 'in-set', 'not-in-set', 'gte', 'lte', 'contains']),\n  values: z.array(z.union([z.string(), z.number()])),\n});\n\n// Custom principle schema\nconst CustomPrincipleSchema = z.object({\n  id: z.string(),\n  name: z.string(),\n  description: z.string(),\n  category: z.string(),\n  severity: z.enum(['error', 'warn', 'off']),\n  checks: z.array(CustomCheckSchema),\n});\n\n// Calm Precision config\nconst CalmPrecisionConfigSchema = z.object({\n  core: z.array(z.string()).default(['gestalt', 'signal-noise', 'content-chrome', 'cognitive-load']),\n  stylistic: z.array(z.string()).default(['fitts', 'hick']),\n  severity: z.record(z.string(), z.enum(['error', 'warn', 'off'])).default({}),\n});\n\n// Extended typography tokens\nconst TypographyTokensSchema = z.object({\n  fontFamilies: z.record(z.string(), z.string()).optional(),\n  fontSizes: z.record(z.string(), z.number()).optional(),\n  fontWeights: z.record(z.string(), z.number()).optional(),\n  lineHeights: z.record(z.string(), z.number()).optional(),\n});\n\n// Full design system config\nexport const DesignSystemConfigSchema = z.object({\n  version: z.literal(1),\n  name: z.string(),\n  principles: z.object({\n    calmPrecision: CalmPrecisionConfigSchema.default({}),\n    custom: z.array(CustomPrincipleSchema).default([]),\n  }).default({}),\n  tokens: z.object({\n    colors: z.record(z.string(), z.string()).optional(),\n    typography: TypographyTokensSchema.optional(),\n    spacing: z.array(z.number()).optional(),\n    borderRadius: z.record(z.string(), z.number()).optional(),\n    shadows: z.record(z.string(), z.string()).optional(),\n    transitions: z.record(z.string(), z.string()).optional(),\n    touchTargets: z.object({ min: z.number() }).optional(),\n  }).default({}),\n});\n\nexport type DesignSystemConfig = z.infer<typeof DesignSystemConfigSchema>;\nexport type CustomPrinciple = z.infer<typeof CustomPrincipleSchema>;\nexport type CustomCheck = z.infer<typeof CustomCheckSchema>;\n\n/**\n * Load design system config from .ibr/design-system.json\n * Accepts either a project root (looks in projectDir/.ibr/) or an outputDir\n * that IS the .ibr/ directory (looks in outputDir/ directly).\n * Returns undefined if no config exists (backward compatible)\n */\nexport async function loadDesignSystemConfig(projectDir: string): Promise<DesignSystemConfig | undefined> {\n  // Try projectDir/.ibr/design-system.json first (project root)\n  let configPath = join(projectDir, '.ibr', 'design-system.json');\n\n  if (!existsSync(configPath)) {\n    // Try projectDir/design-system.json (outputDir IS the .ibr/ dir)\n    configPath = join(projectDir, 'design-system.json');\n    if (!existsSync(configPath)) {\n      return undefined;\n    }\n  }\n\n  const content = await readFile(configPath, 'utf-8');\n  const raw = JSON.parse(content);\n  return DesignSystemConfigSchema.parse(raw);\n}\n\n/**\n * Get default severity for a Calm Precision principle\n */\nexport function getDefaultSeverity(principleId: string, config: DesignSystemConfig): 'error' | 'warn' | 'off' {\n  // Check explicit override\n  const explicit = config.principles.calmPrecision.severity[principleId];\n  if (explicit) return explicit;\n\n  // Core principles default to error\n  if (config.principles.calmPrecision.core.includes(principleId)) return 'error';\n\n  // Stylistic default to warn\n  if (config.principles.calmPrecision.stylistic.includes(principleId)) return 'warn';\n\n  // Unknown principles default to warn\n  return 'warn';\n}\n","import { z } from 'zod';\n\n/**\n * Extended design token specification schema\n * Superset of the old DesignTokenSpec — adds typography sub-fields, spacing as array, shadows, transitions\n */\nexport const ExtendedTokenSpecSchema = z.object({\n  colors: z.record(z.string(), z.string()).optional(),\n  typography: z.object({\n    fontFamilies: z.record(z.string(), z.string()).optional(),\n    fontSizes: z.record(z.string(), z.number()).optional(),\n    fontWeights: z.record(z.string(), z.number()).optional(),\n    lineHeights: z.record(z.string(), z.number()).optional(),\n  }).optional(),\n  spacing: z.array(z.number()).optional(),\n  borderRadius: z.record(z.string(), z.number()).optional(),\n  shadows: z.record(z.string(), z.string()).optional(),\n  transitions: z.record(z.string(), z.string()).optional(),\n  touchTargets: z.object({ min: z.number() }).optional(),\n});\n\nexport type ExtendedTokenSpec = z.infer<typeof ExtendedTokenSpecSchema>;\n\n/**\n * Convert extended token spec to old DesignTokenSpec format for backward compatibility\n */\nexport function toDesignTokenSpec(extended: ExtendedTokenSpec, name: string) {\n  return {\n    name,\n    tokens: {\n      colors: extended.colors,\n      spacing: extended.spacing ?\n        Object.fromEntries(extended.spacing.map((v, i) => [`${i}`, v])) :\n        undefined,\n      fontSizes: extended.typography?.fontSizes,\n      touchTargets: extended.touchTargets,\n      cornerRadius: extended.borderRadius,\n    },\n  };\n}\n","/**\n * Design Token Validation\n *\n * Compares UI elements against a design token specification.\n * Checks touch targets, font sizes, colors, spacing, and corner radius.\n */\n\nimport { readFileSync, existsSync } from 'fs';\nimport type { EnhancedElement } from './schemas.js';\n\nexport interface DesignTokenSpec {\n  name: string;\n  tokens: {\n    colors?: Record<string, string>;       // tokenName → \"#hex\" or \"rgb(...)\"\n    spacing?: Record<string, number>;       // tokenName → px value\n    fontSizes?: Record<string, number>;     // tokenName → px value\n    touchTargets?: { min: number };         // minimum touch target size\n    cornerRadius?: Record<string, number>;  // tokenName → px value\n  };\n}\n\nexport interface TokenViolation {\n  element: string;       // selector or description\n  property: string;      // \"touch-target\" | \"font-size\" | \"color\" | \"spacing\" | \"corner-radius\"\n  expected: string | number;\n  actual: string | number;\n  severity: 'error' | 'warning';\n  message: string;\n}\n\ninterface TokenValidator {\n  name: string;\n  validate(elements: EnhancedElement[], spec: DesignTokenSpec): TokenViolation[];\n}\n\n/**\n * Load a design token spec from a JSON file\n */\nexport function loadTokenSpec(specPath: string): DesignTokenSpec {\n  if (!existsSync(specPath)) {\n    throw new Error(`Token spec not found: ${specPath}`);\n  }\n\n  let spec: DesignTokenSpec;\n  try {\n    const content = readFileSync(specPath, 'utf-8');\n    spec = JSON.parse(content);\n  } catch (err) {\n    throw new Error(`Failed to parse token spec: ${err instanceof Error ? err.message : 'Unknown error'}`);\n  }\n\n  // Validate that at least one token category exists\n  const { tokens } = spec;\n  const hasAnyTokens = tokens.colors || tokens.spacing || tokens.fontSizes || tokens.touchTargets || tokens.cornerRadius;\n\n  if (!hasAnyTokens) {\n    throw new Error('Token spec must define at least one token category (colors, spacing, fontSizes, touchTargets, or cornerRadius)');\n  }\n\n  return spec;\n}\n\n/**\n * Normalize color to lowercase hex format for comparison\n */\nexport function normalizeColor(color: string): string {\n  if (!color) return '';\n\n  // Already hex\n  if (color.startsWith('#')) {\n    return color.toLowerCase();\n  }\n\n  // Convert rgb/rgba to hex\n  const rgbMatch = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*[\\d.]+)?\\)/);\n  if (rgbMatch) {\n    const r = parseInt(rgbMatch[1], 10);\n    const g = parseInt(rgbMatch[2], 10);\n    const b = parseInt(rgbMatch[3], 10);\n    return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n  }\n\n  // Fallback: return as-is\n  return color.toLowerCase();\n}\n\n/**\n * Parse px value from a CSS string\n */\nexport function parsePx(value: string | undefined): number | null {\n  if (!value) return null;\n  const match = value.match(/^([\\d.]+)px$/);\n  return match ? parseFloat(match[1]) : null;\n}\n\n/**\n * Get a computed style value, checking both camelCase and kebab-case keys.\n * CDP returns camelCase (fontSize), but CSS convention is kebab-case (font-size).\n */\nexport function getStyle(styles: Record<string, string> | undefined, kebab: string): string | undefined {\n  if (!styles) return undefined;\n  // Try kebab-case first\n  const val = styles[kebab];\n  if (val !== undefined) return val;\n  // Try camelCase\n  const camel = kebab.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n  return styles[camel];\n}\n\n// ---------------------------------------------------------------------------\n// Individual validators\n// ---------------------------------------------------------------------------\n\nconst touchTargetValidator: TokenValidator = {\n  name: 'touchTargets',\n  validate(elements, spec) {\n    const violations: TokenViolation[] = [];\n    if (!spec.tokens.touchTargets) return violations;\n    const minSize = spec.tokens.touchTargets.min;\n\n    for (const element of elements) {\n      const selector = element.selector || element.tagName || 'unknown';\n      const isInteractive = element.interactive?.hasOnClick || element.interactive?.hasHref;\n      if (!isInteractive) continue;\n\n      const actualSize = Math.min(element.bounds.width, element.bounds.height);\n      if (actualSize < minSize) {\n        violations.push({\n          element: selector,\n          property: 'touch-target',\n          expected: minSize,\n          actual: actualSize,\n          severity: 'error',\n          message: `Touch target too small: ${actualSize}px < ${minSize}px (${selector})`,\n        });\n      }\n    }\n    return violations;\n  },\n};\n\nconst fontSizeValidator: TokenValidator = {\n  name: 'fontSizes',\n  validate(elements, spec) {\n    const violations: TokenViolation[] = [];\n    if (!spec.tokens.fontSizes) return violations;\n    const tokenValues = Object.values(spec.tokens.fontSizes);\n\n    for (const element of elements) {\n      const selector = element.selector || element.tagName || 'unknown';\n      if (!element.computedStyles) continue;\n\n      const fontSize = parsePx(getStyle(element.computedStyles, 'font-size'));\n      if (fontSize === null) continue;\n\n      if (!tokenValues.includes(fontSize)) {\n        violations.push({\n          element: selector,\n          property: 'font-size',\n          expected: `one of ${tokenValues.join(', ')}px`,\n          actual: fontSize,\n          severity: 'warning',\n          message: `Non-token font size: ${fontSize}px (expected one of ${tokenValues.join(', ')}px) (${selector})`,\n        });\n      }\n    }\n    return violations;\n  },\n};\n\nconst colorValidator: TokenValidator = {\n  name: 'colors',\n  validate(elements, spec) {\n    const violations: TokenViolation[] = [];\n    if (!spec.tokens.colors) return violations;\n\n    const tokenColors = new Set(\n      Object.values(spec.tokens.colors).map(normalizeColor)\n    );\n\n    for (const element of elements) {\n      const selector = element.selector || element.tagName || 'unknown';\n      if (!element.computedStyles) continue;\n\n      // Check text color\n      const textColor = getStyle(element.computedStyles, 'color');\n      if (textColor) {\n        const normalized = normalizeColor(textColor);\n        if (!tokenColors.has(normalized)) {\n          violations.push({\n            element: selector,\n            property: 'color',\n            expected: 'token color',\n            actual: textColor,\n            severity: 'warning',\n            message: `Non-token text color: ${textColor} (${selector})`,\n          });\n        }\n      }\n\n      // Check background color\n      const bgColor = getStyle(element.computedStyles, 'background-color');\n      if (bgColor && bgColor !== 'rgba(0, 0, 0, 0)' && bgColor !== 'transparent') {\n        const normalized = normalizeColor(bgColor);\n        if (!tokenColors.has(normalized)) {\n          violations.push({\n            element: selector,\n            property: 'color',\n            expected: 'token color',\n            actual: bgColor,\n            severity: 'warning',\n            message: `Non-token background color: ${bgColor} (${selector})`,\n          });\n        }\n      }\n    }\n    return violations;\n  },\n};\n\nconst cornerRadiusValidator: TokenValidator = {\n  name: 'cornerRadius',\n  validate(elements, spec) {\n    const violations: TokenViolation[] = [];\n    if (!spec.tokens.cornerRadius) return violations;\n    const tokenValues = Object.values(spec.tokens.cornerRadius);\n\n    for (const element of elements) {\n      const selector = element.selector || element.tagName || 'unknown';\n      if (!element.computedStyles) continue;\n\n      const borderRadius = parsePx(getStyle(element.computedStyles, 'border-radius'));\n      if (borderRadius === null || borderRadius === 0) continue;\n\n      if (!tokenValues.includes(borderRadius)) {\n        violations.push({\n          element: selector,\n          property: 'corner-radius',\n          expected: `one of ${tokenValues.join(', ')}px`,\n          actual: borderRadius,\n          severity: 'warning',\n          message: `Non-token border radius: ${borderRadius}px (expected one of ${tokenValues.join(', ')}px) (${selector})`,\n        });\n      }\n    }\n    return violations;\n  },\n};\n\nconst spacingValidator: TokenValidator = {\n  name: 'spacing',\n  validate(elements, spec) {\n    const violations: TokenViolation[] = [];\n    if (!spec.tokens.spacing) return violations;\n    const tokenValues = Object.values(spec.tokens.spacing);\n\n    for (const element of elements) {\n      const selector = element.selector || element.tagName || 'unknown';\n      if (!element.computedStyles) continue;\n\n      for (const prop of ['gap', 'padding', 'margin'] as const) {\n        const raw = element.computedStyles[prop];\n        const value = parsePx(raw);\n        if (value === null || value === 0) continue;\n\n        if (!tokenValues.includes(value)) {\n          violations.push({\n            element: selector,\n            property: 'spacing',\n            expected: `one of ${tokenValues.join(', ')}px`,\n            actual: value,\n            severity: 'warning',\n            message: `Non-token ${prop}: ${value}px (expected one of ${tokenValues.join(', ')}px) (${selector})`,\n          });\n        }\n      }\n    }\n    return violations;\n  },\n};\n\n// ---------------------------------------------------------------------------\n// Registry — exported so external design-system extensions can add validators\n// ---------------------------------------------------------------------------\n\nexport const tokenValidators: Map<string, TokenValidator> = new Map([\n  ['touchTargets', touchTargetValidator],\n  ['fontSizes', fontSizeValidator],\n  ['colors', colorValidator],\n  ['cornerRadius', cornerRadiusValidator],\n  ['spacing', spacingValidator],\n]);\n\nexport type { TokenValidator };\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Validate UI elements against a design token specification\n */\nexport function validateAgainstTokens(\n  elements: EnhancedElement[],\n  spec: DesignTokenSpec\n): TokenViolation[] {\n  const violations: TokenViolation[] = [];\n  for (const [key, validator] of tokenValidators) {\n    if (spec.tokens[key as keyof typeof spec.tokens]) {\n      violations.push(...validator.validate(elements, spec));\n    }\n  }\n  return violations;\n}\n","import type { EnhancedElement } from '../../schemas.js';\nimport type { TokenViolation } from '../../tokens.js';\nimport { validateAgainstTokens, parsePx, getStyle } from '../../tokens.js';\nimport type { ExtendedTokenSpec } from './schema.js';\nimport { toDesignTokenSpec } from './schema.js';\n\n/**\n * Validate font weights against token spec\n */\nfunction validateFontWeights(elements: EnhancedElement[], weights: Record<string, number>): TokenViolation[] {\n  const violations: TokenViolation[] = [];\n  const validWeights = new Set(Object.values(weights));\n\n  for (const element of elements) {\n    const style = element.computedStyles;\n    if (!style) continue;\n\n    const fw = getStyle(style, 'font-weight');\n    if (!fw) continue;\n\n    const weight = parseInt(fw, 10);\n    if (isNaN(weight)) continue;\n\n    if (!validWeights.has(weight)) {\n      violations.push({\n        element: element.selector || element.tagName || 'unknown',\n        property: 'font-weight',\n        expected: `one of ${Array.from(validWeights).join(', ')}`,\n        actual: weight,\n        severity: 'warning',\n        message: `Non-token font weight: ${weight} (expected one of ${Array.from(validWeights).join(', ')}) (${element.selector || element.tagName})`,\n      });\n    }\n  }\n  return violations;\n}\n\n/**\n * Validate line heights against token spec\n */\nfunction validateLineHeights(elements: EnhancedElement[], lineHeights: Record<string, number>): TokenViolation[] {\n  const violations: TokenViolation[] = [];\n  const validHeights = new Set(Object.values(lineHeights));\n\n  for (const element of elements) {\n    const style = element.computedStyles;\n    if (!style) continue;\n\n    const lh = getStyle(style, 'line-height');\n    if (!lh || lh === 'normal') continue;\n\n    // line-height can be px or unitless\n    let value: number;\n    const pxVal = parsePx(lh);\n    if (pxVal !== null) {\n      // Convert px to ratio using font-size\n      const fontSize = parsePx(getStyle(style, 'font-size'));\n      if (fontSize && fontSize > 0) {\n        value = Math.round((pxVal / fontSize) * 100) / 100;\n      } else {\n        continue;\n      }\n    } else {\n      value = parseFloat(lh);\n      if (isNaN(value)) continue;\n    }\n\n    // Check with tolerance (0.05)\n    const isValid = Array.from(validHeights).some(vh => Math.abs(vh - value) < 0.05);\n    if (!isValid) {\n      violations.push({\n        element: element.selector || element.tagName || 'unknown',\n        property: 'line-height',\n        expected: `one of ${Array.from(validHeights).join(', ')}`,\n        actual: value,\n        severity: 'warning',\n        message: `Non-token line height: ${value} (expected one of ${Array.from(validHeights).join(', ')}) (${element.selector || element.tagName})`,\n      });\n    }\n  }\n  return violations;\n}\n\n/**\n * Validate elements against the full extended token spec.\n * Uses the old validator registry for existing categories + new validators for extended categories.\n */\nexport function validateExtendedTokens(\n  elements: EnhancedElement[],\n  tokens: ExtendedTokenSpec,\n  systemName: string\n): TokenViolation[] {\n  const violations: TokenViolation[] = [];\n\n  // Use existing validators via the old format bridge\n  const oldSpec = toDesignTokenSpec(tokens, systemName);\n  violations.push(...validateAgainstTokens(elements, oldSpec));\n\n  // Run extended validators\n  if (tokens.typography?.fontWeights) {\n    violations.push(...validateFontWeights(elements, tokens.typography.fontWeights));\n  }\n\n  if (tokens.typography?.lineHeights) {\n    violations.push(...validateLineHeights(elements, tokens.typography.lineHeights));\n  }\n\n  return violations;\n}\n\n/**\n * Calculate compliance score (0-100).\n * Percentage of checked properties that match tokens.\n */\nexport function calculateComplianceScore(totalChecked: number, violationCount: number): number {\n  if (totalChecked === 0) return 100;\n  const passing = totalChecked - violationCount;\n  return Math.round((passing / totalChecked) * 100);\n}\n","export { ExtendedTokenSpecSchema, type ExtendedTokenSpec, toDesignTokenSpec } from './schema.js';\nexport { validateExtendedTokens, calculateComplianceScore } from './validator.js';\n","import type { Rule } from '../../rules/engine.js';\nimport type { EnhancedElement, Violation } from '../../schemas.js';\n\nexport const gestaltRules: Rule[] = [\n  {\n    id: 'calm-precision/gestalt-grouping',\n    name: 'Gestalt: Border Grouping',\n    description: 'Related items should be grouped with a single border, not individually bordered',\n    defaultSeverity: 'error',\n    check: (element: EnhancedElement, _context): Violation | null => {\n      const style = element.computedStyles;\n      if (!style) return null;\n\n      const hasBorder = style.border && style.border !== 'none' && style.border !== '0px';\n      const borderWidth = style['border-width'];\n      const hasBorderWidth = borderWidth && borderWidth !== '0px';\n\n      const isListItem = element.tagName === 'li' ||\n        (element.selector?.includes('item') && !element.selector?.includes('item-'));\n\n      if ((hasBorder || hasBorderWidth) && isListItem) {\n        return {\n          ruleId: 'calm-precision/gestalt-grouping',\n          ruleName: 'Gestalt: Border Grouping',\n          severity: 'error',\n          message: `List item \"${(element.text || '').slice(0, 40)}\" has individual border. Group related items with a single container border.`,\n          element: element.selector,\n          bounds: element.bounds,\n          fix: 'Use single border around the group container with dividers between items, not individual item borders.',\n        };\n      }\n      return null;\n    },\n  },\n];\n","import type { Rule } from '../../rules/engine.js';\nimport type { EnhancedElement, Violation } from '../../schemas.js';\n\nexport const signalNoiseRules: Rule[] = [\n  {\n    id: 'calm-precision/signal-noise-status',\n    name: 'Signal-to-Noise: Status Indication',\n    description: 'Status should use text color only, not background badges',\n    defaultSeverity: 'error',\n    check: (element: EnhancedElement, _context): Violation | null => {\n      const style = element.computedStyles;\n      if (!style) return null;\n\n      const text = (element.text || '').toLowerCase();\n      const isStatus = /\\b(success|error|warning|pending|active|inactive|status|failed|completed|approved|rejected)\\b/i.test(text);\n\n      if (!isStatus) return null;\n\n      const bg = style.backgroundColor || style['background-color'];\n      if (!bg || bg === 'transparent' || bg === 'rgba(0, 0, 0, 0)') return null;\n\n      // Allow very subtle backgrounds (opacity < 0.15)\n      const subtleMatch = bg.match(/rgba?\\([^)]*,\\s*(0\\.(?:0[0-9]|1[0-4]))\\)/);\n      if (subtleMatch) return null;\n\n      return {\n        ruleId: 'calm-precision/signal-noise-status',\n        ruleName: 'Signal-to-Noise: Status Indication',\n        severity: 'error',\n        message: `Status element \"${text.slice(0, 30)}\" has heavy background (${bg}). Use text color only for status.`,\n        element: element.selector,\n        bounds: element.bounds,\n        fix: 'Remove background color. Use text color (green for success, red for error, yellow for warning) instead of background badges.',\n      };\n    },\n  },\n];\n","import type { Rule } from '../../rules/engine.js';\nimport type { EnhancedElement, Violation } from '../../schemas.js';\n\nexport const fittsRules: Rule[] = [\n  {\n    id: 'calm-precision/fitts-button-sizing',\n    name: \"Fitts' Law: Button Sizing\",\n    description: 'Primary action buttons should be prominently sized',\n    defaultSeverity: 'warn',\n    check: (element: EnhancedElement, _context): Violation | null => {\n      if (element.tagName !== 'button' && element.a11y?.role !== 'button') return null;\n\n      const text = (element.text || '').toLowerCase();\n      const isPrimary = /\\b(submit|save|confirm|checkout|buy|sign.?up|log.?in|register|continue|create|publish|send)\\b/i.test(text);\n\n      if (!isPrimary) return null;\n\n      const width = element.bounds?.width || 0;\n      if (width > 0 && width < 120) {\n        return {\n          ruleId: 'calm-precision/fitts-button-sizing',\n          ruleName: \"Fitts' Law: Button Sizing\",\n          severity: 'warn',\n          message: `Primary action \"${text.slice(0, 30)}\" is ${width}px wide. Primary actions should be more prominent.`,\n          element: element.selector,\n          bounds: element.bounds,\n          fix: 'Increase button width. Primary actions should be the most prominent interactive element.',\n        };\n      }\n      return null;\n    },\n  },\n];\n","import type { Rule } from '../../rules/engine.js';\nimport type { EnhancedElement, Violation } from '../../schemas.js';\n\nexport const hickRules: Rule[] = [\n  {\n    id: 'calm-precision/hick-choice-count',\n    name: \"Hick's Law: Choice Count\",\n    description: 'Limit visible choices to reduce decision time',\n    defaultSeverity: 'warn',\n    check: (element: EnhancedElement, context): Violation | null => {\n      // Only check interactive elements\n      if (!element.interactive?.hasOnClick && !element.interactive?.hasHref) return null;\n\n      // Find interactive siblings at similar vertical position (within 20px band)\n      const y = element.bounds?.y || 0;\n      const siblings = context.allElements.filter(el => {\n        if (!el.interactive?.hasOnClick && !el.interactive?.hasHref) return false;\n        const elY = el.bounds?.y || 0;\n        return Math.abs(elY - y) < 20;\n      });\n\n      // Only flag if this is the first element in the group (avoid duplicate reports)\n      if (siblings.length > 7 && siblings[0]?.selector === element.selector) {\n        return {\n          ruleId: 'calm-precision/hick-choice-count',\n          ruleName: \"Hick's Law: Choice Count\",\n          severity: 'warn',\n          message: `${siblings.length} interactive elements in one visual row. Consider progressive disclosure (max 5-7 visible).`,\n          element: element.selector,\n          bounds: element.bounds,\n          fix: 'Group less-used options behind a \"More\" menu or overflow. Show max 5-7 choices at once.',\n        };\n      }\n      return null;\n    },\n  },\n];\n","import type { Rule } from '../../rules/engine.js';\nimport type { EnhancedElement, Violation } from '../../schemas.js';\n\nexport const contentChromeRules: Rule[] = [\n  {\n    id: 'calm-precision/content-chrome-ratio',\n    name: 'Content >= Chrome',\n    description: 'Content area should be at least 70% of the viewport',\n    defaultSeverity: 'warn',\n    check: (element: EnhancedElement, context): Violation | null => {\n      // Page-level check — only run once (first element)\n      if (context.allElements[0]?.selector !== element.selector) return null;\n\n      const viewportArea = context.viewportWidth * context.viewportHeight;\n      if (viewportArea === 0) return null;\n\n      // Estimate chrome area: nav, header, footer, sidebar elements\n      const chromeSelectors = /\\b(nav|header|footer|sidebar|toolbar|menu|breadcrumb|tabs)\\b/i;\n      let chromeArea = 0;\n\n      for (const el of context.allElements) {\n        const isChrome = chromeSelectors.test(el.tagName) ||\n          chromeSelectors.test(el.selector || '') ||\n          chromeSelectors.test(el.a11y?.role || '');\n\n        if (isChrome && el.bounds) {\n          chromeArea += el.bounds.width * el.bounds.height;\n        }\n      }\n\n      const chromePercent = (chromeArea / viewportArea) * 100;\n\n      if (chromePercent > 30) {\n        return {\n          ruleId: 'calm-precision/content-chrome-ratio',\n          ruleName: 'Content >= Chrome',\n          severity: 'warn',\n          message: `Chrome elements occupy ~${Math.round(chromePercent)}% of viewport. Content should be >= 70%.`,\n          fix: 'Reduce navigation/toolbar/sidebar chrome. Consider collapsible panels or minimized navigation.',\n        };\n      }\n      return null;\n    },\n  },\n];\n","import type { Rule } from '../../rules/engine.js';\nimport type { EnhancedElement, Violation } from '../../schemas.js';\n\nexport const cognitiveLoadRules: Rule[] = [\n  {\n    id: 'calm-precision/cognitive-load-elements',\n    name: 'Cognitive Load: Element Count',\n    description: 'Visual groups should have 5-7 items max to stay within working memory limits',\n    defaultSeverity: 'warn',\n    check: (element: EnhancedElement, context): Violation | null => {\n      // Only check container-like elements (not interactive ones)\n      if (element.interactive?.hasOnClick || element.interactive?.hasHref) return null;\n\n      // Check if this element contains many interactive children (by bounds containment)\n      if (!element.bounds) return null;\n      const { x, y, width, height } = element.bounds;\n\n      const children = context.allElements.filter(el => {\n        if (el.selector === element.selector) return false;\n        if (!el.interactive?.hasOnClick && !el.interactive?.hasHref) return false;\n        if (!el.bounds) return false;\n        return el.bounds.x >= x && el.bounds.y >= y &&\n               el.bounds.x + el.bounds.width <= x + width &&\n               el.bounds.y + el.bounds.height <= y + height;\n      });\n\n      if (children.length > 10) {\n        return {\n          ruleId: 'calm-precision/cognitive-load-elements',\n          ruleName: 'Cognitive Load: Element Count',\n          severity: 'warn',\n          message: `Container has ${children.length} interactive elements. Consider grouping or progressive disclosure (5-7 max per group).`,\n          element: element.selector,\n          bounds: element.bounds,\n          fix: 'Group related actions. Use sections, tabs, or \"Show more\" to reduce visible elements per group.',\n        };\n      }\n      return null;\n    },\n  },\n];\n","import { gestaltRules } from './gestalt.js';\nimport { signalNoiseRules } from './signal-noise.js';\nimport { fittsRules } from './fitts.js';\nimport { hickRules } from './hick.js';\nimport { contentChromeRules } from './content-chrome.js';\nimport { cognitiveLoadRules } from './cognitive-load.js';\nimport type { Rule } from '../../rules/engine.js';\n\n/** All Calm Precision rules */\nexport const allCalmPrecisionRules: Rule[] = [\n  ...gestaltRules,\n  ...signalNoiseRules,\n  ...fittsRules,\n  ...hickRules,\n  ...contentChromeRules,\n  ...cognitiveLoadRules,\n];\n\n/** Core principles — cognitive science fundamentals, default to error */\nexport const corePrincipleIds = ['gestalt', 'signal-noise', 'content-chrome', 'cognitive-load'];\n\n/** Stylistic principles — have valid exceptions, default to warn */\nexport const stylisticPrincipleIds = ['fitts', 'hick'];\n\n/** Map principle ID to rule IDs */\nexport const principleToRules: Record<string, string[]> = {\n  'gestalt': gestaltRules.map(r => r.id),\n  'signal-noise': signalNoiseRules.map(r => r.id),\n  'fitts': fittsRules.map(r => r.id),\n  'hick': hickRules.map(r => r.id),\n  'content-chrome': contentChromeRules.map(r => r.id),\n  'cognitive-load': cognitiveLoadRules.map(r => r.id),\n};\n","import { loadDesignSystemConfig, getDefaultSeverity } from './config.js';\nimport { validateExtendedTokens, calculateComplianceScore } from './tokens/index.js';\nimport { allCalmPrecisionRules, principleToRules } from './principles/calm-precision.js';\nimport type { EnhancedElement, DesignSystemResult } from '../schemas.js';\nimport type { RuleContext } from '../rules/engine.js';\n\nexport { loadDesignSystemConfig, type DesignSystemConfig } from './config.js';\n\n/**\n * Run all design system checks against extracted elements.\n * Returns undefined if no design system config exists (backward compatible).\n */\nexport async function runDesignSystemCheck(\n  elements: EnhancedElement[],\n  context: RuleContext,\n  projectDir: string\n): Promise<DesignSystemResult | undefined> {\n  const config = await loadDesignSystemConfig(projectDir);\n  if (!config) return undefined;\n\n  // Run Calm Precision principle rules\n  const principleViolations: DesignSystemResult['principleViolations'] = [];\n\n  for (const rule of allCalmPrecisionRules) {\n    // Find which principle this rule belongs to\n    const principleId = Object.entries(principleToRules).find(\n      ([, ruleIds]) => ruleIds.includes(rule.id)\n    )?.[0];\n\n    if (!principleId) continue;\n\n    const severity = getDefaultSeverity(principleId, config);\n    if (severity === 'off') continue;\n\n    for (const element of elements) {\n      const violation = rule.check(element, context);\n      if (violation) {\n        principleViolations.push({\n          principleId: rule.id,\n          principleName: rule.name,\n          severity: severity === 'error' ? 'error' : 'warn',\n          message: violation.message,\n          element: violation.element,\n          bounds: violation.bounds,\n          fix: violation.fix,\n        });\n      }\n    }\n  }\n\n  // Run custom principle checks\n  const customViolations: DesignSystemResult['customViolations'] = [];\n  for (const custom of config.principles.custom) {\n    if (custom.severity === 'off') continue;\n\n    for (const element of elements) {\n      for (const check of custom.checks) {\n        const style = element.computedStyles;\n        if (!style) continue;\n\n        const actual = style[check.property];\n        if (!actual) continue;\n\n        let violated = false;\n        switch (check.operator) {\n          case 'in-set':\n            violated = !check.values.map(String).includes(actual);\n            break;\n          case 'not-in-set':\n            violated = check.values.map(String).includes(actual);\n            break;\n          case 'equals':\n            violated = actual !== String(check.values[0]);\n            break;\n          case 'gte':\n            violated = parseFloat(actual) < Number(check.values[0]);\n            break;\n          case 'lte':\n            violated = parseFloat(actual) > Number(check.values[0]);\n            break;\n          case 'contains':\n            violated = !String(check.values[0]).split(',').some(v => actual.includes(v.trim()));\n            break;\n        }\n\n        if (violated) {\n          customViolations.push({\n            principleId: custom.id,\n            principleName: custom.name,\n            severity: custom.severity as 'error' | 'warn',\n            message: `${custom.name}: ${check.property} is \"${actual}\" (expected ${check.operator} ${check.values.join(', ')})`,\n            element: element.selector,\n            bounds: element.bounds,\n            fix: custom.description,\n          });\n        }\n      }\n    }\n  }\n\n  // Run token validation\n  const tokenViolations = config.tokens\n    ? validateExtendedTokens(elements, config.tokens, config.name)\n    : [];\n\n  // Calculate compliance score\n  // Total checkable = elements × active token categories\n  const tokenCategories = Object.keys(config.tokens).filter(\n    k => config.tokens[k as keyof typeof config.tokens] !== undefined\n  ).length;\n  const totalChecked = elements.length * Math.max(tokenCategories, 1);\n  const complianceScore = calculateComplianceScore(totalChecked, tokenViolations.length);\n\n  return {\n    configName: config.name,\n    principleViolations,\n    tokenViolations,\n    customViolations,\n    complianceScore,\n  };\n}\n","import type { EnhancedElement } from '../schemas.js';\nimport type { SensorContext, VisualPatternReport, VisualPatternGroup } from './types.js';\n\n/**\n * Build a style fingerprint from an element's key visual properties.\n * Elements with matching fingerprints = same visual pattern.\n */\nfunction styleFingerprint(el: EnhancedElement): Record<string, string> {\n  const s = el.computedStyles ?? {};\n  return {\n    backgroundColor: s.backgroundColor ?? '',\n    color: s.color ?? '',\n    borderRadius: s.borderRadius ?? '',\n    padding: s.padding ?? '',\n    fontSize: s.fontSize ?? '',\n    fontWeight: s.fontWeight ?? '',\n    borderWidth: s.borderWidth ?? '',\n    borderColor: s.borderColor ?? '',\n  };\n}\n\nfunction fingerprintKey(fp: Record<string, string>): string {\n  return Object.entries(fp).map(([k, v]) => `${k}=${v}`).join('|');\n}\n\nfunction categorize(el: EnhancedElement): VisualPatternReport['category'] | null {\n  const tag = el.tagName.toLowerCase();\n  const role = el.a11y.role ?? '';\n  if (tag === 'button' || role === 'button') return 'button';\n  if (tag === 'a' || role === 'link') return 'link';\n  if (\n    tag === 'input' || tag === 'textarea' || tag === 'select' ||\n    role === 'textbox' || role === 'combobox'\n  ) return 'input';\n  if (/^h[1-6]$/.test(tag) || role === 'heading') return 'heading';\n  return null;\n}\n\nexport function collectVisualPatterns(ctx: SensorContext): VisualPatternReport[] {\n  const byCategory = new Map<VisualPatternReport['category'], EnhancedElement[]>();\n\n  for (const el of ctx.elements) {\n    const cat = categorize(el);\n    if (!cat) continue;\n    if (!byCategory.has(cat)) byCategory.set(cat, []);\n    byCategory.get(cat)!.push(el);\n  }\n\n  const reports: VisualPatternReport[] = [];\n\n  for (const [category, els] of byCategory.entries()) {\n    const groupMap = new Map<string, VisualPatternGroup>();\n\n    for (const el of els) {\n      const fp = styleFingerprint(el);\n      const key = fingerprintKey(fp);\n      if (!groupMap.has(key)) {\n        groupMap.set(key, {\n          patternKey: key.slice(0, 80),\n          count: 0,\n          elements: [],\n          styleFingerprint: fp,\n        });\n      }\n      const g = groupMap.get(key)!;\n      g.count++;\n      if (g.elements.length < 5) {\n        g.elements.push({\n          selector: el.selector,\n          text: (el.text ?? '').slice(0, 40),\n        });\n      }\n    }\n\n    const groups = Array.from(groupMap.values()).sort((a, b) => b.count - a.count);\n    const total = els.length;\n    const dominant = groups[0] && groups[0].count / total > 0.8 ? groups[0] : undefined;\n\n    reports.push({\n      category,\n      totalElements: total,\n      distinctPatterns: groups.length,\n      groups,\n      dominant,\n    });\n  }\n\n  return reports;\n}\n","import type { SensorContext, ComponentCensus } from './types.js';\nimport type { EnhancedElement } from '../schemas.js';\n\n/**\n * Detect a React (or design-system) component name from available element data.\n *\n * Detection priority (fallback chain):\n * 1. data-component attribute (explicit annotation)\n * 2. data-testid via sourceHint.dataTestId (e.g. \"submit-button\" → \"SubmitButton\")\n * 3. PascalCase token inside className (CSS Modules convention)\n * 4. Returns null — caller falls back to tag name\n *\n * Note: `attributes` map is not in EnhancedElement schema (as of current engine).\n * When the engine captures it, detection priority 1 can be wired without changes here.\n */\nfunction detectComponentName(el: EnhancedElement): string | null {\n  // Priority 1: explicit data-component attribute via any future attributes map\n  const attrs = (el as unknown as { attributes?: Record<string, string> }).attributes;\n  if (attrs?.['data-component']) return attrs['data-component'];\n\n  // Priority 2: data-testid (already captured in sourceHint)\n  const testId = el.sourceHint?.dataTestId;\n  if (testId) {\n    // Convert \"submit-button\" or \"submit_button\" → \"SubmitButton\"\n    const name = testId\n      .split(/[-_]/)\n      .filter(Boolean)\n      .map(p => (p[0]?.toUpperCase() ?? '') + p.slice(1))\n      .join('');\n    if (name.length > 0) return name;\n  }\n\n  // Priority 3: PascalCase token in className (CSS Modules: \"Button_root__abc\")\n  const className = el.className ?? attrs?.['class'] ?? attrs?.['className'];\n  if (className) {\n    const match = className.match(/\\b([A-Z][a-zA-Z0-9]+)(?:_|$|\\s)/);\n    if (match) return match[1];\n  }\n\n  return null;\n}\n\nexport function collectComponentCensus(ctx: SensorContext): ComponentCensus {\n  const byTag: Record<string, number> = {};\n  const byRole: Record<string, number> = {};\n  let withHandlers = 0;\n  let withoutHandlers = 0;\n  const orphanInteractive: ComponentCensus['orphanInteractive'] = [];\n\n  // Component tracking: name → { count, selectors }\n  const componentMap = new Map<string, { count: number; selectors: string[] }>();\n\n  for (const el of ctx.elements) {\n    const tag = el.tagName.toLowerCase();\n    if (tag) byTag[tag] = (byTag[tag] ?? 0) + 1;\n\n    const role = el.a11y.role;\n    if (role) byRole[role] = (byRole[role] ?? 0) + 1;\n\n    const interactive = el.interactive;\n    const hasHandler = !!(\n      interactive.hasOnClick ||\n      interactive.hasHref ||\n      interactive.hasReactHandler ||\n      interactive.hasVueHandler ||\n      interactive.hasAngularHandler\n    );\n\n    if (hasHandler) {\n      withHandlers++;\n    } else {\n      withoutHandlers++;\n      // Detect orphans: looks clickable (cursor:pointer) but no handler\n      const cursor = el.computedStyles?.cursor;\n      if (cursor === 'pointer' && (el.text ?? '').trim().length > 0) {\n        if (orphanInteractive.length < 20) {\n          orphanInteractive.push({\n            selector: el.selector,\n            text: (el.text ?? '').slice(0, 60),\n            reason: 'cursor:pointer with no handler',\n          });\n        }\n      }\n    }\n\n    // Component name detection\n    const componentName = detectComponentName(el) ?? el.tagName.toLowerCase();\n    const existing = componentMap.get(componentName);\n    if (existing) {\n      existing.count++;\n      if (existing.selectors.length < 5) existing.selectors.push(el.selector);\n    } else {\n      componentMap.set(componentName, { count: 1, selectors: [el.selector] });\n    }\n  }\n\n  // Build byComponent and topComponents\n  const byComponent: Record<string, number> = {};\n  for (const [name, data] of componentMap) {\n    byComponent[name] = data.count;\n  }\n\n  const topComponents = Array.from(componentMap.entries())\n    .sort((a, b) => b[1].count - a[1].count)\n    .slice(0, 20)\n    .map(([name, data]) => ({ name, count: data.count, selectors: data.selectors }));\n\n  return {\n    byTag,\n    byRole,\n    withHandlers,\n    withoutHandlers,\n    orphanInteractive,\n    byComponent,\n    topComponents,\n  };\n}\n","import type { SensorContext, InteractionMap } from './types.js';\n\nexport function collectInteractionMap(ctx: SensorContext): InteractionMap {\n  const missingHandlers: InteractionMap['missingHandlers'] = [];\n  let total = 0;\n  let withHandlers = 0;\n  let withoutHandlers = 0;\n  let disabled = 0;\n  let formCount = 0;\n\n  for (const el of ctx.elements) {\n    const tag = el.tagName.toLowerCase();\n    const role = el.a11y.role ?? '';\n    const cursor = el.computedStyles?.cursor;\n\n    const looksInteractive =\n      tag === 'button' ||\n      tag === 'a' ||\n      role === 'button' ||\n      role === 'link' ||\n      cursor === 'pointer';\n\n    if (tag === 'form') formCount++;\n    if (!looksInteractive) continue;\n\n    total++;\n\n    const interactive = el.interactive;\n    const hasHandler = !!(\n      interactive.hasOnClick ||\n      interactive.hasHref ||\n      interactive.hasReactHandler ||\n      interactive.hasVueHandler ||\n      interactive.hasAngularHandler\n    );\n\n    if (hasHandler) {\n      withHandlers++;\n    } else {\n      withoutHandlers++;\n      if (missingHandlers.length < 25) {\n        missingHandlers.push({\n          selector: el.selector,\n          text: (el.text ?? '').slice(0, 60),\n          tagName: tag,\n          role: role || undefined,\n        });\n      }\n    }\n\n    if (interactive.isDisabled) disabled++;\n  }\n\n  return { total, withHandlers, withoutHandlers, missingHandlers, disabled, formCount };\n}\n","import type { SensorContext, ContrastReport, ContrastReportEntry } from './types.js';\n\n// ── Inline WCAG helpers (the preset versions are private to the rules engine) ──\n\ntype RGB = [number, number, number];\n\nfunction parseColor(color: string): RGB | null {\n  if (!color || color === 'transparent' || color === 'initial' || color === 'inherit' || color === 'unset') {\n    return null;\n  }\n  const rgbaMatch = color.match(/^rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})(?:\\s*,\\s*([\\d.]+))?\\s*\\)$/);\n  if (rgbaMatch) {\n    const alpha = rgbaMatch[4] !== undefined ? parseFloat(rgbaMatch[4]) : 1;\n    if (alpha === 0) return null;\n    return [parseInt(rgbaMatch[1], 10), parseInt(rgbaMatch[2], 10), parseInt(rgbaMatch[3], 10)];\n  }\n  const hex6 = color.match(/^#([0-9a-fA-F]{6})$/);\n  if (hex6) {\n    const n = parseInt(hex6[1], 16);\n    return [(n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff];\n  }\n  const hex3 = color.match(/^#([0-9a-fA-F]{3})$/);\n  if (hex3) {\n    return [\n      parseInt(hex3[1][0], 16) * 17,\n      parseInt(hex3[1][1], 16) * 17,\n      parseInt(hex3[1][2], 16) * 17,\n    ];\n  }\n  return null;\n}\n\nfunction linearize(c: number): number {\n  const n = c / 255;\n  return n <= 0.04045 ? n / 12.92 : Math.pow((n + 0.055) / 1.055, 2.4);\n}\n\nfunction luminance([r, g, b]: RGB): number {\n  return 0.2126 * linearize(r) + 0.7152 * linearize(g) + 0.0722 * linearize(b);\n}\n\nfunction contrastRatio(fg: RGB, bg: RGB): number {\n  const l1 = luminance(fg);\n  const l2 = luminance(bg);\n  const lighter = Math.max(l1, l2);\n  const darker = Math.min(l1, l2);\n  return (lighter + 0.05) / (darker + 0.05);\n}\n\nfunction isLargeText(styles: Record<string, string>): boolean {\n  const fontSize = parseFloat(styles.fontSize ?? '');\n  if (isNaN(fontSize)) return false;\n  const fw = styles.fontWeight ?? '400';\n  const isBold = fw === 'bold' || parseInt(fw, 10) >= 700;\n  return fontSize >= 18 || (isBold && fontSize >= 14);\n}\n\n// ── Sensor ──────────────────────────────────────────────────────────────────\n\nexport function collectContrastReport(ctx: SensorContext): ContrastReport {\n  let pass = 0;\n  let fail = 0;\n  let passAAA = 0;\n  const failing: ContrastReportEntry[] = [];\n  let minRatio: ContrastReportEntry | undefined;\n  let lightOnDark = 0;\n  let darkOnLight = 0;\n\n  for (const el of ctx.elements) {\n    const text = (el.text ?? '').trim();\n    if (!text) continue;\n\n    const styles = el.computedStyles;\n    if (!styles) continue;\n\n    const fg = parseColor(styles.color ?? '');\n    const bg = parseColor(styles.backgroundColor ?? '');\n    if (!fg || !bg) continue;\n\n    const large = isLargeText(styles);\n    const ratio = contrastRatio(fg, bg);\n    const aaThreshold = large ? 3 : 4.5;\n    const aaaThreshold = large ? 4.5 : 7;\n    const fontSize = parseFloat(styles.fontSize ?? '16') || 16;\n\n    const entry: ContrastReportEntry = {\n      selector: el.selector,\n      text: text.slice(0, 60),\n      ratio: Number(ratio.toFixed(2)),\n      pass: ratio >= aaaThreshold ? 'AAA' : ratio >= aaThreshold ? 'AA' : 'FAIL',\n      fontSize,\n      largeText: large,\n    };\n\n    if (ratio >= aaThreshold) {\n      pass++;\n    } else {\n      fail++;\n      if (failing.length < 50) failing.push(entry);\n    }\n    if (ratio >= aaaThreshold) passAAA++;\n\n    if (!minRatio || ratio < minRatio.ratio) minRatio = entry;\n\n    // Tone: average channel brightness to classify fg vs bg\n    const fgAvg = (fg[0] + fg[1] + fg[2]) / 3;\n    const bgAvg = (bg[0] + bg[1] + bg[2]) / 3;\n    if (fgAvg > bgAvg) lightOnDark++; else darkOnLight++;\n  }\n\n  return {\n    totalChecked: pass + fail,\n    pass,\n    fail,\n    passAAA,\n    failing,\n    minRatio,\n    byTone: { lightOnDark, darkOnLight },\n  };\n}\n","import type { SensorContext, NavigationMap, NavigationNode, NavigationRegion } from './types.js';\nimport type { EnhancedElement } from '../schemas.js';\n\n/**\n * Count the number of segments in a CSS selector path.\n * \"body > header > nav > ul > li > a\" → 6\n */\nfunction selectorDepth(selector: string): number {\n  return (selector || '').split(/\\s*>\\s*/).length;\n}\n\n/**\n * Returns true when childSelector is a descendant of ancestorSelector\n * based on CSS selector path prefix matching.\n */\nfunction isDescendantOf(childSelector: string, ancestorSelector: string): boolean {\n  if (!ancestorSelector || !childSelector) return false;\n  return (\n    childSelector.startsWith(ancestorSelector + ' ') ||\n    childSelector.startsWith(ancestorSelector + '>') ||\n    childSelector.startsWith(ancestorSelector + ' >') ||\n    childSelector === ancestorSelector\n  );\n}\n\n/**\n * Extract a display label from a link element.\n */\nfunction linkLabel(el: EnhancedElement): string {\n  return ((el.text ?? el.a11y.ariaLabel ?? '').trim()).slice(0, 60);\n}\n\n/**\n * Build a hierarchical tree of NavigationNodes from a flat list of link elements,\n * ordered by selector depth relative to a nav root.\n *\n * Algorithm: iterate links sorted by selector length (shallowest first).\n * For each link, find the most-recently-seen node with a shallower depth\n * that is also an ancestor (selector prefix). Attach as child of that node,\n * or as a root if none found.\n */\nfunction buildTree(\n  links: EnhancedElement[],\n  navSelector: string,\n): { roots: NavigationNode[]; maxDepth: number } {\n  const navDepth = selectorDepth(navSelector);\n\n  // Sort by selector length so parents are processed before children\n  const sorted = [...links].sort((a, b) => a.selector.length - b.selector.length);\n\n  const roots: NavigationNode[] = [];\n  // Stack of (node, absoluteDepth) for ancestor lookup\n  const stack: Array<{ node: NavigationNode; absDepth: number }> = [];\n\n  for (const el of sorted) {\n    const label = linkLabel(el);\n    if (!label) continue;\n\n    const absDepth = selectorDepth(el.selector);\n    const relDepth = absDepth - navDepth; // depth relative to the nav container\n\n    const node: NavigationNode = {\n      label,\n      selector: el.selector,\n      depth: relDepth,\n      children: [],\n    };\n\n    // Find nearest ancestor in the stack: same prefix and smaller depth\n    let parentEntry: { node: NavigationNode; absDepth: number } | undefined;\n    for (let i = stack.length - 1; i >= 0; i--) {\n      const candidate = stack[i];\n      if (\n        candidate.absDepth < absDepth &&\n        isDescendantOf(el.selector, candidate.node.selector)\n      ) {\n        parentEntry = candidate;\n        break;\n      }\n    }\n\n    if (parentEntry) {\n      parentEntry.node.children.push(node);\n    } else {\n      roots.push(node);\n    }\n\n    stack.push({ node, absDepth });\n  }\n\n  // Compute max depth\n  function maxD(nodes: NavigationNode[], current: number): number {\n    let m = current;\n    for (const n of nodes) m = Math.max(m, maxD(n.children, current + 1));\n    return m;\n  }\n  const maxDepth = roots.length > 0 ? maxD(roots, 1) : 0;\n\n  return { roots, maxDepth };\n}\n\n/**\n * Flatten a tree of NavigationNodes into a list (for byDepth counting).\n */\nfunction flattenTree(nodes: NavigationNode[], depth: number, counts: number[]): void {\n  for (const node of nodes) {\n    counts[depth] = (counts[depth] ?? 0) + 1;\n    flattenTree(node.children, depth + 1, counts);\n  }\n}\n\nexport function collectNavigationMap(ctx: SensorContext): NavigationMap | undefined {\n  const navElements = ctx.elements.filter(el => {\n    const role = el.a11y.role ?? '';\n    const tag = el.tagName.toLowerCase();\n    return role === 'navigation' || tag === 'nav';\n  });\n\n  const links = ctx.elements.filter(el => {\n    const role = el.a11y.role ?? '';\n    const tag = el.tagName.toLowerCase();\n    return role === 'link' || tag === 'a';\n  });\n\n  if (links.length === 0 && navElements.length === 0) return undefined;\n\n  // ── Hierarchical path (when nav containers are available) ──────────────────\n  if (navElements.length > 0) {\n    const navRegions: NavigationRegion[] = [];\n    const byDepth: number[] = [];\n\n    for (const nav of navElements) {\n      // Find all links whose selector descends from this nav's selector\n      const navLinks = links.filter(link =>\n        isDescendantOf(link.selector, nav.selector)\n      );\n\n      const { roots, maxDepth } = buildTree(navLinks, nav.selector);\n      flattenTree(roots, 0, byDepth);\n\n      navRegions.push({\n        rootSelector: nav.selector,\n        roots,\n        depth: maxDepth,\n      });\n    }\n\n    // Build legacy flat roots (top-level across all navs) for backward compat\n    const allRoots: NavigationNode[] = navRegions.flatMap(r => r.roots);\n    const overallMaxDepth = navRegions.reduce((m, r) => Math.max(m, r.depth), 0);\n\n    return {\n      navs: navRegions,\n      roots: allRoots.slice(0, 40),\n      depth: overallMaxDepth,\n      totalLinks: links.length,\n      byDepth,\n    };\n  }\n\n  // ── Fallback: no <nav> elements found — flat list (original behavior) ──────\n  const flatRoots: NavigationNode[] = [];\n  for (const link of links.slice(0, 60)) {\n    const label = linkLabel(link);\n    if (!label) continue;\n    flatRoots.push({\n      label,\n      selector: link.selector,\n      depth: 0,\n      children: [],\n    });\n  }\n\n  return {\n    navs: [],\n    roots: flatRoots.slice(0, 40),\n    depth: 1,\n    totalLinks: links.length,\n    byDepth: [flatRoots.length],\n  };\n}\n","import type { EnhancedElement } from '../schemas.js';\nimport type { SensorContext } from './types.js';\n\n/**\n * Typography sensor — fingerprints text-bearing elements by their declared\n * font-family + font-size + font-weight + line-height and aggregates identical\n * fingerprints into one row with a frequency count.\n *\n * Why this sensor exists: prior to this sensor, IBR's scan output included\n * `color` and `backgroundColor` on every element but did NOT bubble up the\n * font triplet to a per-rendition aggregation. The contrast sensor surfaced\n * `fontSize` only for failing contrast samples. See linear-app-20260527.md\n * §1 Typography — \"the data exists in DOM but isn't bubbled through the\n * typography-aggregation path.\"\n */\n\nexport interface TypographyRow {\n  /** Representative selector for this fingerprint (first observed). */\n  selector: string;\n  /** Full font-family chain as declared (or computed if no spec available). */\n  family: string;\n  /** Computed font-size in pixels. */\n  size_px: number;\n  /** Numeric font-weight (100..900). Keyword weights are resolved to numbers. */\n  weight: number;\n  /** Numeric line-height multiplier OR the sentinel string \"normal\" when unresolved. */\n  line_height: number | 'normal';\n  /** Number of elements sharing this exact fingerprint. */\n  count: number;\n  /** True when scan ran before document.fonts finished loading. */\n  font_loading_pending?: boolean;\n  /** Original spec value of font-size if available (e.g. \"1.25rem\"); resolved size is in size_px. */\n  size_spec?: string;\n}\n\nexport interface TypographyReport {\n  rows: TypographyRow[];\n  /** True when document.fonts.status was \"loading\" at scan time. */\n  font_loading_pending: boolean;\n  /** True when no text-bearing elements were found. */\n  data_unavailable?: boolean;\n}\n\nconst WEIGHT_KEYWORDS: Record<string, number> = {\n  normal: 400,\n  bold: 700,\n  lighter: 300,\n  bolder: 600,\n};\n\n/**\n * Resolve a font-weight value (numeric string or keyword) to a number.\n * Returns 400 for unparseable input.\n */\nfunction resolveWeight(raw: string | undefined): number {\n  if (!raw) return 400;\n  const trimmed = raw.trim().toLowerCase();\n  if (trimmed in WEIGHT_KEYWORDS) return WEIGHT_KEYWORDS[trimmed]!;\n  const n = parseInt(trimmed, 10);\n  return Number.isFinite(n) ? n : 400;\n}\n\n/**\n * Resolve a font-size value to pixels.\n * Handles px, rem, em (em treated as rem since per-element parent context\n * is not available in the sensor layer — computedStyles already resolved this).\n * Returns 16 for unparseable input (browser default).\n */\nfunction resolveFontSizePx(raw: string | undefined, rootPx: number): number {\n  if (!raw) return rootPx;\n  const trimmed = raw.trim();\n  // bare number (legacy fixture shape)\n  const bareNum = Number(trimmed);\n  if (Number.isFinite(bareNum) && bareNum > 0) return bareNum;\n  const m = trimmed.match(/^([\\d.]+)(px|rem|em)?$/i);\n  if (!m) return rootPx;\n  const value = parseFloat(m[1]!);\n  const unit = (m[2] || 'px').toLowerCase();\n  if (unit === 'px') return value;\n  if (unit === 'rem' || unit === 'em') return value * rootPx;\n  return value;\n}\n\n/**\n * Resolve line-height. Returns the sentinel string \"normal\" when the value\n * is the literal \"normal\" (so callers know the spec didn't pin a value).\n * Otherwise returns a numeric multiplier or px-divided-by-fontSize ratio.\n */\nfunction resolveLineHeight(raw: string | undefined, fontSizePx: number): number | 'normal' {\n  if (!raw) return 'normal';\n  const trimmed = raw.trim().toLowerCase();\n  if (trimmed === 'normal' || trimmed === '') return 'normal';\n  // pure number → multiplier (e.g. \"1.5\")\n  const bareNum = Number(trimmed);\n  if (Number.isFinite(bareNum) && bareNum > 0) return bareNum;\n  // px value → divide by fontSize for multiplier\n  const m = trimmed.match(/^([\\d.]+)(px|rem|em|%)?$/);\n  if (!m) return 'normal';\n  const value = parseFloat(m[1]!);\n  const unit = m[2] || '';\n  if (unit === 'px') return fontSizePx > 0 ? Number((value / fontSizePx).toFixed(2)) : 'normal';\n  if (unit === '%') return Number((value / 100).toFixed(2));\n  return value; // rem/em → multiplier directly (already resolved at extract layer)\n}\n\n/**\n * Build the fingerprint key for an element.\n * Distinct fingerprints become separate rows; matching fingerprints aggregate.\n */\nfunction fingerprintKey(family: string, sizePx: number, weight: number, lineHeight: number | 'normal'): string {\n  return `${family}|${sizePx}|${weight}|${lineHeight}`;\n}\n\nfunction isTextBearing(el: EnhancedElement): boolean {\n  const text = (el.text ?? '').trim();\n  if (text.length === 0) return false;\n  // Exclude script/style/meta tags\n  const tag = el.tagName.toLowerCase();\n  if (tag === 'script' || tag === 'style' || tag === 'meta' || tag === 'noscript') return false;\n  return true;\n}\n\nexport function collectTypography(ctx: SensorContext): TypographyReport {\n  const rootPx = ctx.documentMeta?.rootFontSizePx ?? 16;\n  const fontsStatus = ctx.documentMeta?.fontsStatus;\n  const fontLoadingPending = fontsStatus === 'loading';\n  const rawSpecValues = ctx.documentMeta?.rawSpecValues ?? {};\n\n  const textElements = ctx.elements.filter(isTextBearing);\n  if (textElements.length === 0) {\n    return { rows: [], font_loading_pending: fontLoadingPending, data_unavailable: true };\n  }\n\n  const groups = new Map<string, TypographyRow>();\n\n  for (const el of textElements) {\n    const styles = el.computedStyles ?? {};\n    const family = (styles.fontFamily ?? styles['font-family'] ?? '').trim() || '<unspecified>';\n    const sizeRaw = styles.fontSize ?? styles['font-size'];\n    const weightRaw = styles.fontWeight ?? styles['font-weight'];\n    const lineHeightRaw = styles.lineHeight ?? styles['line-height'];\n\n    const size_px = resolveFontSizePx(sizeRaw, rootPx);\n    const weight = resolveWeight(weightRaw);\n    const line_height = resolveLineHeight(lineHeightRaw, size_px);\n\n    // Pull raw spec values for this selector if the extract layer captured them\n    const rawForSel = rawSpecValues[el.selector] ?? {};\n    const size_spec = rawForSel['font-size'] ?? rawForSel.fontSize;\n\n    const key = fingerprintKey(family, size_px, weight, line_height);\n    let row = groups.get(key);\n    if (!row) {\n      row = {\n        selector: el.selector,\n        family,\n        size_px,\n        weight,\n        line_height,\n        count: 0,\n        ...(fontLoadingPending ? { font_loading_pending: true } : {}),\n        ...(size_spec ? { size_spec } : {}),\n      };\n      groups.set(key, row);\n    }\n    row.count++;\n  }\n\n  const rows = Array.from(groups.values()).sort((a, b) => b.count - a.count);\n\n  return {\n    rows,\n    font_loading_pending: fontLoadingPending,\n    ...(rows.length === 0 ? { data_unavailable: true } : {}),\n  };\n}\n","import type { SensorContext, ExtractedCSSRule } from './types.js';\n\n/**\n * Breakpoints sensor — enumerates declared @media and @container queries\n * from the page's stylesheets, de-dupes identical conditions across sheets,\n * and reports rule counts per breakpoint.\n *\n * Why this sensor exists: prior to this sensor, IBR's scan could not surface\n * responsive design intent without grepping raw HTML/CSS. See\n * linear-app-20260527.md §\"Schema / tooling gaps observed\" —\n * \"Breakpoints not extractable. No @media rule enumeration.\"\n */\n\nexport type BreakpointType =\n  | 'min-width'\n  | 'max-width'\n  | 'range'\n  | 'container-min-width'\n  | 'container-max-width'\n  | 'container-range'\n  | 'print'\n  | 'other';\n\nexport interface BreakpointEntry {\n  type: BreakpointType;\n  /** For min-width / max-width / container variants: the single bound in px. */\n  value_px?: number;\n  /** For range types: the min bound. */\n  min?: number;\n  /** For range types: the max bound. */\n  max?: number;\n  /** Total rule count under this condition (summed across stylesheets). */\n  rule_count: number;\n  /** For container queries: the named container, if specified. */\n  container_name?: string;\n  /** Raw conditionText for debugging/forward-compat (the literal media text). */\n  raw_condition: string;\n}\n\nconst MIN_WIDTH_RE = /\\(\\s*min-width\\s*:\\s*([\\d.]+)px\\s*\\)/i;\nconst MAX_WIDTH_RE = /\\(\\s*max-width\\s*:\\s*([\\d.]+)px\\s*\\)/i;\n\n/**\n * Recursively count style rules under a (possibly nested) rule.\n * Only `style` rules count toward rule_count; we don't double-count nested\n * at-rules (e.g. `@supports` inside `@media`).\n */\nfunction countStyleRules(rule: ExtractedCSSRule): number {\n  if (rule.kind === 'style') return 1;\n  if (rule.kind === 'media' || rule.kind === 'container' || rule.kind === 'supports') {\n    return rule.rules.reduce((acc, r) => acc + countStyleRules(r), 0);\n  }\n  return 0;\n}\n\nfunction classifyMediaCondition(text: string): {\n  type: BreakpointType;\n  value_px?: number;\n  min?: number;\n  max?: number;\n} {\n  const lower = text.toLowerCase().trim();\n\n  if (lower.includes('print')) {\n    return { type: 'print' };\n  }\n\n  const minMatch = lower.match(MIN_WIDTH_RE);\n  const maxMatch = lower.match(MAX_WIDTH_RE);\n\n  if (minMatch && maxMatch) {\n    return {\n      type: 'range',\n      min: parseFloat(minMatch[1]!),\n      max: parseFloat(maxMatch[1]!),\n    };\n  }\n  if (minMatch) {\n    return { type: 'min-width', value_px: parseFloat(minMatch[1]!) };\n  }\n  if (maxMatch) {\n    return { type: 'max-width', value_px: parseFloat(maxMatch[1]!) };\n  }\n\n  return { type: 'other' };\n}\n\nfunction classifyContainerCondition(\n  text: string,\n  containerName?: string,\n): { type: BreakpointType; value_px?: number; min?: number; max?: number; container_name?: string } {\n  const minMatch = text.match(MIN_WIDTH_RE);\n  const maxMatch = text.match(MAX_WIDTH_RE);\n  const base = containerName ? { container_name: containerName } : {};\n\n  if (minMatch && maxMatch) {\n    return { type: 'container-range', min: parseFloat(minMatch[1]!), max: parseFloat(maxMatch[1]!), ...base };\n  }\n  if (minMatch) {\n    return { type: 'container-min-width', value_px: parseFloat(minMatch[1]!), ...base };\n  }\n  if (maxMatch) {\n    return { type: 'container-max-width', value_px: parseFloat(maxMatch[1]!), ...base };\n  }\n  return { type: 'other', ...base };\n}\n\nfunction dedupKey(e: Pick<BreakpointEntry, 'type' | 'value_px' | 'min' | 'max' | 'container_name'>): string {\n  return `${e.type}|${e.value_px ?? ''}|${e.min ?? ''}|${e.max ?? ''}|${e.container_name ?? ''}`;\n}\n\nexport function collectBreakpoints(ctx: SensorContext): BreakpointEntry[] {\n  const rules = ctx.cssRules ?? [];\n  if (rules.length === 0) return [];\n\n  const byKey = new Map<string, BreakpointEntry>();\n\n  for (const rule of rules) {\n    if (rule.kind === 'media') {\n      const classified = classifyMediaCondition(rule.conditionText);\n      const ruleCount = rule.rules.reduce((acc, r) => acc + countStyleRules(r), 0);\n      const entry: BreakpointEntry = {\n        ...classified,\n        rule_count: ruleCount,\n        raw_condition: rule.conditionText,\n      };\n      const key = dedupKey(entry);\n      const existing = byKey.get(key);\n      if (existing) {\n        existing.rule_count += ruleCount;\n      } else {\n        byKey.set(key, entry);\n      }\n    } else if (rule.kind === 'container') {\n      const classified = classifyContainerCondition(rule.conditionText, rule.containerName);\n      const ruleCount = rule.rules.reduce((acc, r) => acc + countStyleRules(r), 0);\n      const entry: BreakpointEntry = {\n        ...classified,\n        rule_count: ruleCount,\n        raw_condition: rule.conditionText,\n      };\n      const key = dedupKey(entry);\n      const existing = byKey.get(key);\n      if (existing) {\n        existing.rule_count += ruleCount;\n      } else {\n        byKey.set(key, entry);\n      }\n    }\n  }\n\n  // Sort: viewport min-width ascending → range → max-width → container variants → print → other\n  const typeOrder: Record<BreakpointType, number> = {\n    'min-width': 0,\n    'range': 1,\n    'max-width': 2,\n    'container-min-width': 3,\n    'container-range': 4,\n    'container-max-width': 5,\n    'print': 6,\n    'other': 7,\n  };\n  return Array.from(byKey.values()).sort((a, b) => {\n    const t = typeOrder[a.type] - typeOrder[b.type];\n    if (t !== 0) return t;\n    return (a.value_px ?? a.min ?? 0) - (b.value_px ?? b.min ?? 0);\n  });\n}\n","import type { SensorContext, ExtractedCSSRule } from './types.js';\n\n/**\n * Motion sensor — extracts declared `transition` shorthand entries,\n * `@keyframes` definitions, and `prefers-reduced-motion` overrides from\n * the page's stylesheets. Reports them as separate fields so callers can\n * see what motion the page declares (independent of whether the scanner\n * happened to disable transitions for screenshot stability).\n *\n * Why this sensor exists: prior to this sensor, IBR's scan output had no\n * motion data at all. See linear-app-20260527.md §6 Motion & feedback —\n * every line marked \"(not detectable in ibr-scan)\".\n */\n\nexport interface TransitionEntry {\n  selector: string;\n  property: string;          // \"opacity\", \"transform\", \"all\", etc.\n  duration_ms: number;\n  easing: string;            // \"ease-out\", \"linear\", \"cubic-bezier(...)\", ...\n  delay_ms: number;\n}\n\nexport interface KeyframesEntry {\n  name: string;\n  step_count: number;\n  /** Selectors observed using this keyframes via `animation` / `animation-name`. */\n  used_by_selectors: string[];\n}\n\nexport interface ReducedMotionOverride {\n  selector: string;\n  /** Declarations that override animation/transition for this selector. */\n  overrides: string[];\n}\n\nexport interface MotionReport {\n  transitions: TransitionEntry[];\n  keyframes: KeyframesEntry[];\n  reduced_motion_overrides: ReducedMotionOverride[];\n}\n\n/**\n * Parse a CSS time value to milliseconds. \"200ms\" → 200; \"0.2s\" → 200.\n */\nfunction parseTimeMs(raw: string): number {\n  const trimmed = raw.trim().toLowerCase();\n  const m = trimmed.match(/^([\\d.]+)(ms|s)?$/);\n  if (!m) return 0;\n  const value = parseFloat(m[1]!);\n  const unit = m[2] || 's';\n  return unit === 'ms' ? value : value * 1000;\n}\n\n/**\n * Tokenize a transition shorthand value, respecting parentheses (for cubic-bezier).\n * \"opacity 200ms ease-out, transform 150ms\" → [\"opacity 200ms ease-out\", \"transform 150ms\"]\n */\nfunction splitTransitionValue(value: string): string[] {\n  const parts: string[] = [];\n  let depth = 0;\n  let buf = '';\n  for (const ch of value) {\n    if (ch === '(') depth++;\n    else if (ch === ')') depth--;\n    if (ch === ',' && depth === 0) {\n      if (buf.trim()) parts.push(buf.trim());\n      buf = '';\n    } else {\n      buf += ch;\n    }\n  }\n  if (buf.trim()) parts.push(buf.trim());\n  return parts;\n}\n\n/**\n * Tokenize a single transition entry, respecting parens.\n * \"opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 50ms\" → 4 tokens.\n */\nfunction tokenizeTransitionPart(part: string): string[] {\n  const tokens: string[] = [];\n  let depth = 0;\n  let buf = '';\n  for (const ch of part) {\n    if (ch === '(') depth++;\n    else if (ch === ')') depth--;\n    if (/\\s/.test(ch) && depth === 0) {\n      if (buf) tokens.push(buf);\n      buf = '';\n    } else {\n      buf += ch;\n    }\n  }\n  if (buf) tokens.push(buf);\n  return tokens;\n}\n\n/**\n * Parse a single transition entry. Per CSS spec, order is flexible:\n * property is the first non-time non-keyword token; first time is duration;\n * second time is delay; the rest is easing.\n */\nfunction parseTransitionEntry(part: string): { property: string; duration_ms: number; easing: string; delay_ms: number } {\n  const tokens = tokenizeTransitionPart(part);\n  let property = 'all';\n  let duration_ms = 0;\n  let delay_ms = 0;\n  let easing = 'ease';\n  let seenTime = 0;\n\n  for (const tok of tokens) {\n    const isTime = /^[\\d.]+(ms|s)$/i.test(tok);\n    if (isTime) {\n      if (seenTime === 0) duration_ms = parseTimeMs(tok);\n      else if (seenTime === 1) delay_ms = parseTimeMs(tok);\n      seenTime++;\n    } else if (/^(ease|ease-in|ease-out|ease-in-out|linear|step-start|step-end|cubic-bezier|steps)/i.test(tok)) {\n      easing = tok;\n    } else {\n      // first non-time, non-easing token is the property\n      if (property === 'all' || property === '') property = tok;\n    }\n  }\n\n  return { property, duration_ms, easing, delay_ms };\n}\n\n/**\n * Walk rules collecting transitions from style rules.\n * Inline rules (selector === '<inline>') are kept as-is so callers can trace.\n */\nfunction collectTransitionsFromStyle(rule: Extract<ExtractedCSSRule, { kind: 'style' }>): TransitionEntry[] {\n  const decls = rule.declarations;\n  const transitionValue = decls.transition ?? decls['transition'];\n  if (!transitionValue || transitionValue === 'none') return [];\n  const parts = splitTransitionValue(transitionValue);\n  return parts.map((p) => ({ selector: rule.selector, ...parseTransitionEntry(p) }));\n}\n\n/**\n * Walk rules collecting reduced-motion overrides.\n * A \"reduced-motion override\" is any style rule inside a @media (prefers-reduced-motion: reduce)\n * block that declares `transition: none` or `animation: none` (or sets these to short durations).\n */\nfunction isReducedMotionMedia(conditionText: string): boolean {\n  return /prefers-reduced-motion\\s*:\\s*reduce/i.test(conditionText);\n}\n\nfunction collectReducedMotionOverridesFromRule(\n  rule: Extract<ExtractedCSSRule, { kind: 'style' }>,\n): ReducedMotionOverride | null {\n  const decls = rule.declarations;\n  const overrides: string[] = [];\n  for (const [prop, value] of Object.entries(decls)) {\n    if (/^(transition|animation)/i.test(prop)) {\n      overrides.push(`${prop}: ${value}`);\n    }\n  }\n  if (overrides.length === 0) return null;\n  return { selector: rule.selector, overrides };\n}\n\n/**\n * Walk rules recursively, calling visitor on every style rule. Tracks whether\n * we are currently inside a prefers-reduced-motion media block.\n */\nfunction walkRules(\n  rules: ExtractedCSSRule[],\n  visit: (rule: Extract<ExtractedCSSRule, { kind: 'style' }>, insideReducedMotion: boolean) => void,\n  insideReducedMotion = false,\n): void {\n  for (const r of rules) {\n    if (r.kind === 'style') {\n      visit(r, insideReducedMotion);\n    } else if (r.kind === 'media') {\n      const nowInside = insideReducedMotion || isReducedMotionMedia(r.conditionText);\n      walkRules(r.rules, visit, nowInside);\n    } else if (r.kind === 'container' || r.kind === 'supports') {\n      walkRules(r.rules, visit, insideReducedMotion);\n    }\n    // keyframes handled separately\n  }\n}\n\n/**\n * Map keyframes → selectors that reference them via `animation` / `animation-name`.\n */\nfunction buildKeyframesUsage(rules: ExtractedCSSRule[]): Map<string, string[]> {\n  const usage = new Map<string, string[]>();\n  walkRules(rules, (style) => {\n    const animationName = style.declarations['animation-name'] ?? style.declarations.animationName;\n    const animationShorthand = style.declarations.animation ?? style.declarations['animation'];\n    const candidates: string[] = [];\n    if (animationName) candidates.push(...animationName.split(',').map((s) => s.trim()));\n    if (animationShorthand) {\n      // animation shorthand: name is usually the first non-time, non-keyword identifier\n      for (const part of splitTransitionValue(animationShorthand)) {\n        const tokens = tokenizeTransitionPart(part);\n        for (const tok of tokens) {\n          if (\n            !/^[\\d.]+(ms|s)$/i.test(tok) &&\n            !/^(ease|ease-in|ease-out|ease-in-out|linear|step-start|step-end|cubic-bezier|steps|infinite|alternate|reverse|alternate-reverse|forwards|backwards|both|none|normal|paused|running)/i.test(\n              tok,\n            ) &&\n            !/^\\d+$/.test(tok) // skip iteration counts\n          ) {\n            candidates.push(tok);\n            break; // only one name per shorthand entry\n          }\n        }\n      }\n    }\n    for (const name of candidates) {\n      const list = usage.get(name) ?? [];\n      if (!list.includes(style.selector)) list.push(style.selector);\n      usage.set(name, list);\n    }\n  });\n  return usage;\n}\n\nexport function collectMotion(ctx: SensorContext): MotionReport {\n  const rules = ctx.cssRules ?? [];\n  if (rules.length === 0) {\n    return { transitions: [], keyframes: [], reduced_motion_overrides: [] };\n  }\n\n  const transitions: TransitionEntry[] = [];\n  const reducedOverrides: ReducedMotionOverride[] = [];\n\n  walkRules(rules, (style, insideReducedMotion) => {\n    if (insideReducedMotion) {\n      const override = collectReducedMotionOverridesFromRule(style);\n      if (override) reducedOverrides.push(override);\n    } else {\n      transitions.push(...collectTransitionsFromStyle(style));\n    }\n  });\n\n  // Collect keyframes (top-level + recursively, though spec usually puts them top-level)\n  const keyframes: KeyframesEntry[] = [];\n  const usage = buildKeyframesUsage(rules);\n  function visitKeyframes(rs: ExtractedCSSRule[]): void {\n    for (const r of rs) {\n      if (r.kind === 'keyframes') {\n        keyframes.push({\n          name: r.name,\n          step_count: r.steps.length,\n          used_by_selectors: usage.get(r.name) ?? [],\n        });\n      } else if (r.kind === 'media' || r.kind === 'container' || r.kind === 'supports') {\n        visitKeyframes(r.rules);\n      }\n    }\n  }\n  visitKeyframes(rules);\n\n  return { transitions, keyframes, reduced_motion_overrides: reducedOverrides };\n}\n","import type { EnhancedElement } from '../schemas.js';\nimport type { SensorContext } from './types.js';\n\n/**\n * Hierarchy sensor — enumerates heading levels (h1–h6) and ARIA landmarks\n * from extracted elements, surfaces a11y findings (no-h1, multiple-h1,\n * heading-level-skips), and counts ARIA `role=\"heading\"` separately.\n *\n * Why this sensor exists: prior to this sensor, IBR's scan returned an\n * AX-tree node count but did not categorize by heading level. See\n * linear-app-20260527.md §2 Hierarchy — \"It did not enumerate headings\n * as a distinct sensor; hierarchy below is inferred from text-bearing\n * element bounds + ordering.\"\n */\n\nexport type HeadingFinding = 'no_h1_on_page' | 'multiple_h1s_on_page';\n\nexport interface HeadingLevelSummary {\n  count: number;\n  first_text?: string;\n  all_texts: string[];\n  finding?: HeadingFinding;\n}\n\nexport interface LandmarkCounts {\n  nav: number;\n  main: number;\n  aside: number;\n  header: number;\n  footer: number;\n  section: number;\n  form: number;\n}\n\nexport interface AriaHeading {\n  selector: string;\n  level: number;\n  text: string;\n}\n\nexport interface LevelSkip {\n  from: string;\n  to: string;\n  at_position: number;\n}\n\nexport interface HierarchyReport {\n  h1: HeadingLevelSummary;\n  h2: HeadingLevelSummary;\n  h3: HeadingLevelSummary;\n  h4: HeadingLevelSummary;\n  h5: HeadingLevelSummary;\n  h6: HeadingLevelSummary;\n  landmarks: LandmarkCounts;\n  aria_headings: AriaHeading[];\n  level_skips: LevelSkip[];\n}\n\nconst HEADING_TAGS = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] as const;\ntype HeadingTag = (typeof HEADING_TAGS)[number];\n\nfunction emptyLevel(): HeadingLevelSummary {\n  return { count: 0, all_texts: [] };\n}\n\nfunction emptyLandmarks(): LandmarkCounts {\n  return { nav: 0, main: 0, aside: 0, header: 0, footer: 0, section: 0, form: 0 };\n}\n\nfunction trimText(s: string | undefined): string {\n  return (s ?? '').trim();\n}\n\nexport function collectHierarchy(ctx: SensorContext): HierarchyReport {\n  const levels: Record<HeadingTag, HeadingLevelSummary> = {\n    h1: emptyLevel(),\n    h2: emptyLevel(),\n    h3: emptyLevel(),\n    h4: emptyLevel(),\n    h5: emptyLevel(),\n    h6: emptyLevel(),\n  };\n  const landmarks = emptyLandmarks();\n  const ariaHeadings: AriaHeading[] = [];\n  const seenLevelsInOrder: Array<{ level: number; selector: string }> = [];\n\n  for (const el of ctx.elements) {\n    const tag = el.tagName.toLowerCase();\n    const role = el.a11y?.role ?? '';\n\n    // Native h1-h6\n    if ((HEADING_TAGS as readonly string[]).includes(tag)) {\n      const summary = levels[tag as HeadingTag];\n      summary.count++;\n      const text = trimText(el.text);\n      if (text) {\n        summary.all_texts.push(text);\n        if (!summary.first_text) summary.first_text = text;\n      }\n      seenLevelsInOrder.push({ level: parseInt(tag.slice(1), 10), selector: el.selector });\n      continue;\n    }\n\n    // ARIA headings (role=\"heading\" + aria-level)\n    if (role === 'heading') {\n      // EnhancedElement.a11y may include aria-level via attribute extraction;\n      // schemas.ts doesn't pin it, so we look it up in a flexible way.\n      const ariaLevel = parseAriaLevel(el);\n      ariaHeadings.push({\n        selector: el.selector,\n        level: ariaLevel,\n        text: trimText(el.text),\n      });\n      seenLevelsInOrder.push({ level: ariaLevel, selector: el.selector });\n      continue;\n    }\n\n    // Landmarks (native tag or ARIA role)\n    if (tag === 'nav' || role === 'navigation') landmarks.nav++;\n    else if (tag === 'main' || role === 'main') landmarks.main++;\n    else if (tag === 'aside' || role === 'complementary') landmarks.aside++;\n    else if (tag === 'header' || role === 'banner') landmarks.header++;\n    else if (tag === 'footer' || role === 'contentinfo') landmarks.footer++;\n    else if (tag === 'section' || role === 'region') landmarks.section++;\n    else if (tag === 'form' || role === 'form') landmarks.form++;\n  }\n\n  // Findings on h1\n  if (levels.h1.count === 0) {\n    levels.h1.finding = 'no_h1_on_page';\n  } else if (levels.h1.count > 1) {\n    levels.h1.finding = 'multiple_h1s_on_page';\n  }\n\n  // Detect level skips (h1 → h3 with no h2 in between)\n  const level_skips: LevelSkip[] = [];\n  let prevLevel = 0;\n  for (let i = 0; i < seenLevelsInOrder.length; i++) {\n    const cur = seenLevelsInOrder[i]!.level;\n    if (prevLevel > 0 && cur > prevLevel + 1) {\n      level_skips.push({\n        from: `h${prevLevel}`,\n        to: `h${cur}`,\n        at_position: i,\n      });\n    }\n    prevLevel = cur;\n  }\n\n  return {\n    h1: levels.h1,\n    h2: levels.h2,\n    h3: levels.h3,\n    h4: levels.h4,\n    h5: levels.h5,\n    h6: levels.h6,\n    landmarks,\n    aria_headings: ariaHeadings,\n    level_skips,\n  };\n}\n\n/**\n * Parse aria-level from an element. Looks at the a11y bag and falls back\n * to className/selector hints. Returns 2 by default per ARIA spec\n * (role=\"heading\" without aria-level is treated as level 2).\n */\nfunction parseAriaLevel(el: EnhancedElement): number {\n  // Test fixtures may stash aria-level on a11y via cast; production extract.ts\n  // can be extended to populate this directly.\n  const a11y = el.a11y as unknown as Record<string, unknown>;\n  const raw = a11y['ariaLevel'] ?? a11y['aria-level'];\n  if (typeof raw === 'number' && Number.isFinite(raw)) return raw;\n  if (typeof raw === 'string') {\n    const n = parseInt(raw, 10);\n    if (Number.isFinite(n)) return n;\n  }\n  return 2;\n}\n","import type { SensorContext, ExtractedCSSRule } from './types.js';\n\n/**\n * Interaction-states sensor — enumerates declared `:hover`, `:focus`,\n * `:focus-visible`, `:active`, `:disabled` rules from the page's\n * stylesheets and flags missing focus indicators on interactive selectors.\n *\n * Why this sensor exists: prior to this sensor, IBR's single-capture scan\n * could not surface state-driven styling. See linear-app-20260527.md §3\n * Navigation — \"Hover / active / focus / disabled: not detectable in\n * single capture — IBR's scan did not enumerate state-specific CSS rules.\"\n */\n\nexport type InteractionState = 'hover' | 'focus' | 'focus-visible' | 'active' | 'disabled' | 'focus-within';\n\nexport interface StateRule {\n  selector: string;                   // base selector (without the pseudo)\n  state: InteractionState;\n  properties: Record<string, string>;\n  /** True when this rule is nested inside `@media (hover: hover)`. */\n  conditional_hover?: boolean;\n}\n\nexport interface StateFinding {\n  selector: string;\n  missing: 'focus_indicator';\n}\n\nexport interface InteractionStatesReport {\n  states: StateRule[];\n  findings: StateFinding[];\n}\n\n// Regex alternation matches left-to-right; longer alternatives MUST come first\n// so \":focus-visible\" matches \"focus-visible\" before \":focus\".\nconst STATE_RE = /:(focus-visible|focus-within|hover|focus|active|disabled)\\b/g;\n\n/**\n * Extract the base selector (everything left of the first pseudo-class).\n * \".btn:hover\" → \".btn\"\n * \"a.link:focus-visible\" → \"a.link\"\n * \".btn:hover, .alt:hover\" → splits and returns each base\n */\nfunction parseStateSelectors(\n  selectorText: string,\n): Array<{ base: string; state: InteractionState }> {\n  const out: Array<{ base: string; state: InteractionState }> = [];\n  const parts = selectorText.split(',').map((p) => p.trim());\n  for (const part of parts) {\n    STATE_RE.lastIndex = 0;\n    const matches: Array<{ index: number; state: InteractionState }> = [];\n    let m: RegExpExecArray | null;\n    while ((m = STATE_RE.exec(part)) !== null) {\n      matches.push({ index: m.index, state: m[1] as InteractionState });\n    }\n    if (matches.length === 0) continue;\n    // The base selector is everything before the FIRST pseudo\n    const base = part.slice(0, matches[0]!.index).trim();\n    for (const { state } of matches) {\n      // Avoid duplicate (base,state) within one selector segment\n      if (!out.some((e) => e.base === base && e.state === state)) {\n        out.push({ base, state });\n      }\n    }\n  }\n  return out;\n}\n\nfunction isHoverCapableMedia(conditionText: string): boolean {\n  return /\\(\\s*hover\\s*:\\s*hover\\s*\\)/i.test(conditionText);\n}\n\ninterface WalkContext {\n  insideHoverMedia: boolean;\n}\n\nfunction walkRules(\n  rules: ExtractedCSSRule[],\n  visit: (rule: Extract<ExtractedCSSRule, { kind: 'style' }>, ctx: WalkContext) => void,\n  ctx: WalkContext = { insideHoverMedia: false },\n): void {\n  for (const r of rules) {\n    if (r.kind === 'style') {\n      visit(r, ctx);\n    } else if (r.kind === 'media') {\n      const nowInside = ctx.insideHoverMedia || isHoverCapableMedia(r.conditionText);\n      walkRules(r.rules, visit, { insideHoverMedia: nowInside });\n    } else if (r.kind === 'container' || r.kind === 'supports') {\n      walkRules(r.rules, visit, ctx);\n    }\n  }\n}\n\n/**\n * From the elements list, return the set of base selectors that look\n * interactive — buttons, links, role=button/link, or anything with an\n * onClick/href handler. Used to flag missing :focus indicators.\n *\n * Strategy: derive a class-or-tag matcher from each element's selector\n * so we can compare against rule selectors that target classes (\".btn\")\n * or tags (\"button\", \"a\").\n */\nfunction interactiveBaseSelectors(ctx: SensorContext): Set<string> {\n  const out = new Set<string>();\n  for (const el of ctx.elements) {\n    const tag = el.tagName.toLowerCase();\n    const role = el.a11y?.role ?? '';\n    const isInteractive =\n      tag === 'button' ||\n      tag === 'a' ||\n      role === 'button' ||\n      role === 'link' ||\n      Boolean(el.interactive?.hasOnClick) ||\n      Boolean(el.interactive?.hasHref);\n    if (!isInteractive) continue;\n\n    // Add the raw selector (e.g. \".btn\", \"a.link\")\n    out.add(el.selector);\n    // Also add the tag name (\".btn:hover\" may target \"button\" rules)\n    out.add(tag);\n    // And the class portion if the selector starts with a class\n    const classMatch = el.selector.match(/^\\.[A-Za-z_][\\w-]*/);\n    if (classMatch) out.add(classMatch[0]);\n  }\n  return out;\n}\n\nexport function collectInteractionStates(ctx: SensorContext): InteractionStatesReport {\n  const rules = ctx.cssRules ?? [];\n  if (rules.length === 0) {\n    return { states: [], findings: [] };\n  }\n\n  const states: StateRule[] = [];\n  walkRules(rules, (style, walkCtx) => {\n    const parsed = parseStateSelectors(style.selector);\n    for (const { base, state } of parsed) {\n      const entry: StateRule = {\n        selector: base,\n        state,\n        properties: { ...style.declarations },\n        ...(walkCtx.insideHoverMedia ? { conditional_hover: true } : {}),\n      };\n      states.push(entry);\n    }\n  });\n\n  // Findings: any interactive base selector that has a :hover rule but\n  // NO :focus or :focus-visible rule is missing a focus indicator.\n  const interactiveBases = interactiveBaseSelectors(ctx);\n  const hasHover = new Map<string, boolean>();\n  const hasFocus = new Map<string, boolean>();\n  for (const s of states) {\n    if (s.state === 'hover') hasHover.set(s.selector, true);\n    if (s.state === 'focus' || s.state === 'focus-visible') hasFocus.set(s.selector, true);\n  }\n\n  const findings: StateFinding[] = [];\n  for (const sel of new Set([...hasHover.keys(), ...interactiveBases])) {\n    const interactive =\n      interactiveBases.has(sel) ||\n      // Also flag rule-derived selectors that look interactive\n      sel.includes('btn') ||\n      sel.includes('button') ||\n      sel.includes('link') ||\n      sel === 'a' ||\n      sel === 'button';\n    if (!interactive) continue;\n    if (!hasFocus.get(sel)) {\n      findings.push({ selector: sel, missing: 'focus_indicator' });\n    }\n  }\n\n  return { states, findings };\n}\n","import type { SensorContext, SensorReport } from './types.js';\nimport { collectVisualPatterns } from './visual-patterns.js';\nimport { collectComponentCensus } from './component-census.js';\nimport { collectInteractionMap } from './interaction-map.js';\nimport { collectContrastReport } from './contrast-report.js';\nimport { collectNavigationMap } from './navigation.js';\nimport { collectTypography } from './typography.js';\nimport { collectBreakpoints } from './breakpoints.js';\nimport { collectMotion } from './motion.js';\nimport { collectHierarchy } from './hierarchy.js';\nimport { collectInteractionStates } from './interaction-states.js';\n\nexport function runSensors(ctx: SensorContext): SensorReport {\n  const visualPatterns = collectVisualPatterns(ctx);\n  const componentCensus = collectComponentCensus(ctx);\n  const interactionMap = collectInteractionMap(ctx);\n  const contrast = collectContrastReport(ctx);\n  const navigation = collectNavigationMap(ctx);\n  const typography = collectTypography(ctx);\n  const breakpoints = collectBreakpoints(ctx);\n  const motion = collectMotion(ctx);\n  const hierarchy = collectHierarchy(ctx);\n  const interactionStates = collectInteractionStates(ctx);\n\n  const oneLiners: string[] = [];\n\n  for (const vp of visualPatterns) {\n    if (vp.distinctPatterns > 1) {\n      const dominantNote = vp.dominant\n        ? ` (${vp.dominant.count}/${vp.totalElements} share dominant pattern)`\n        : '';\n      oneLiners.push(\n        `${vp.category}: ${vp.totalElements} total, ${vp.distinctPatterns} distinct patterns${dominantNote}`\n      );\n    }\n  }\n\n  if (interactionMap.withoutHandlers > 0) {\n    oneLiners.push(\n      `${interactionMap.withoutHandlers}/${interactionMap.total} interactive-looking elements have no handler`\n    );\n  }\n\n  if (contrast.fail > 0) {\n    oneLiners.push(`Contrast: ${contrast.fail}/${contrast.totalChecked} text elements fail WCAG AA`);\n  }\n\n  if (componentCensus.orphanInteractive.length > 0) {\n    oneLiners.push(\n      `${componentCensus.orphanInteractive.length} cursor:pointer elements have no handler`\n    );\n  }\n\n  if (navigation) {\n    if (navigation.navs.length > 0) {\n      oneLiners.push(\n        `Nav: ${navigation.navs.length} nav region(s), max depth ${navigation.depth}, ${navigation.totalLinks} total links`\n      );\n    } else {\n      oneLiners.push(`Navigation: ${navigation.totalLinks} links, ${navigation.depth} level(s) deep`);\n    }\n  }\n\n  // Component census one-liner (only when meaningful component names were detected)\n  const namedComponents = componentCensus.topComponents.filter(\n    c => !/^[a-z]/.test(c.name) || c.name.includes('-') // PascalCase or testid-derived names\n  );\n  if (namedComponents.length > 0) {\n    const top3 = namedComponents.slice(0, 3).map(c => `${c.name}×${c.count}`).join(', ');\n    const totalNamed = namedComponents.length;\n    oneLiners.push(`Components: ${top3}${totalNamed > 3 ? ` (top 3 of ${totalNamed})` : ''}`);\n  }\n\n  // New sensor one-liners (only emit when there's something to say)\n  if (typography.rows.length > 0) {\n    const top = typography.rows[0]!;\n    oneLiners.push(\n      `Typography: ${typography.rows.length} distinct fingerprints, dominant ${top.size_px}px/${top.weight} (${top.count} elements)${typography.font_loading_pending ? ' [fonts pending]' : ''}`,\n    );\n  }\n  if (breakpoints.length > 0) {\n    const viewportBreaks = breakpoints.filter((b) => b.type !== 'print' && b.type !== 'other');\n    if (viewportBreaks.length > 0) {\n      const summary = viewportBreaks\n        .slice(0, 4)\n        .map((b) => (b.type === 'range' ? `${b.min}-${b.max}` : `${b.value_px}`))\n        .join('px, ');\n      oneLiners.push(\n        `Breakpoints: ${viewportBreaks.length} viewport breakpoints (${summary}px)`,\n      );\n    }\n  }\n  if (motion.transitions.length > 0 || motion.keyframes.length > 0) {\n    const reducedNote = motion.reduced_motion_overrides.length > 0\n      ? `, ${motion.reduced_motion_overrides.length} reduced-motion override(s)`\n      : '';\n    oneLiners.push(\n      `Motion: ${motion.transitions.length} transition(s), ${motion.keyframes.length} keyframe(s)${reducedNote}`,\n    );\n  }\n  if (\n    hierarchy.h1.count > 0 ||\n    hierarchy.h2.count > 0 ||\n    hierarchy.h3.count > 0\n  ) {\n    const findingNote = hierarchy.h1.finding ? ` [${hierarchy.h1.finding}]` : '';\n    const skipNote = hierarchy.level_skips.length > 0 ? `, ${hierarchy.level_skips.length} level skip(s)` : '';\n    oneLiners.push(\n      `Hierarchy: h1×${hierarchy.h1.count}, h2×${hierarchy.h2.count}, h3×${hierarchy.h3.count}${findingNote}${skipNote}`,\n    );\n  }\n  if (interactionStates.states.length > 0 || interactionStates.findings.length > 0) {\n    const findingNote = interactionStates.findings.length > 0\n      ? ` (${interactionStates.findings.length} missing focus indicator)`\n      : '';\n    oneLiners.push(\n      `Interaction states: ${interactionStates.states.length} declared${findingNote}`,\n    );\n  }\n\n  const report: SensorReport = {\n    visualPatterns,\n    navigation,\n    componentCensus,\n    interactionMap,\n    contrast,\n    typography,\n    breakpoints,\n    motion,\n    hierarchy,\n    interactionStates,\n    oneLiners,\n  };\n\n  // Wrap semantic result into the condensed semanticState shape\n  if (ctx.semantic) {\n    const sem = ctx.semantic;\n    const states: string[] = [];\n    if (sem.state.auth.authenticated === true) states.push('authenticated');\n    if (sem.state.auth.authenticated === false) states.push('not authenticated');\n    if (sem.state.loading.loading) states.push(`loading:${sem.state.loading.type}`);\n    if (sem.state.errors.hasErrors) {\n      for (const e of sem.state.errors.errors) states.push(`error:${e.type}`);\n    }\n\n    report.semanticState = {\n      pageIntent: sem.pageIntent.intent,\n      states,\n      availableActions: sem.availableActions.map(a => a.action),\n    };\n  }\n\n  return report;\n}\n\nexport type { SensorReport, SensorContext, ExtractedCSSRule, DocumentMeta } from './types.js';\nexport type {\n  VisualPatternReport,\n  VisualPatternGroup,\n  NavigationMap,\n  NavigationNode,\n  ComponentCensus,\n  InteractionMap,\n  ContrastReport,\n  ContrastReportEntry,\n} from './types.js';\nexport type { TypographyReport, TypographyRow } from './typography.js';\nexport type { BreakpointEntry, BreakpointType } from './breakpoints.js';\nexport type { MotionReport, TransitionEntry, KeyframesEntry, ReducedMotionOverride } from './motion.js';\nexport type {\n  HierarchyReport,\n  HeadingLevelSummary,\n  HeadingFinding,\n  LandmarkCounts,\n  AriaHeading,\n  LevelSkip,\n} from './hierarchy.js';\nexport type {\n  InteractionStatesReport,\n  StateRule,\n  StateFinding,\n  InteractionState,\n} from './interaction-states.js';\n","import type { PageLike } from '../engine/page-like.js';\nimport type { EnhancedElement } from '../schemas.js';\nimport type { ExtractedCSSRule, DocumentMeta } from './types.js';\n\n/**\n * Live-page extractor for CSS rules + document-level metadata used by the\n * typography, breakpoints, motion, hierarchy, and interaction-states sensors.\n *\n * Runs inside the browser via `page.evaluate(...)` so it can access\n * `document.styleSheets` and `document.fonts`. Same-origin sheets are\n * walked; cross-origin sheets throw on `.cssRules` access and are silently\n * skipped (the sensor layer treats missing rules as `data_unavailable`).\n *\n * Returned `cssRules` is the discriminated-union shape consumed by the\n * sensors directly (no further transformation needed downstream).\n */\nexport async function extractCssRulesAndMeta(\n  page: PageLike,\n): Promise<{\n  cssRules: ExtractedCSSRule[];\n  documentMeta: DocumentMeta;\n  structuralElements: EnhancedElement[];\n}> {\n  return page.evaluate(() => {\n    // ---- helpers run inside the browser context ----\n    interface InlineStyleRule {\n      kind: 'style';\n      selector: string;\n      declarations: Record<string, string>;\n      sourceUrl?: string;\n    }\n    interface InlineMediaRule {\n      kind: 'media';\n      conditionText: string;\n      rules: InlineExtractedRule[];\n      sourceUrl?: string;\n    }\n    interface InlineKeyframesRule {\n      kind: 'keyframes';\n      name: string;\n      steps: Array<{ keyText: string; declarations: Record<string, string> }>;\n      sourceUrl?: string;\n    }\n    interface InlineContainerRule {\n      kind: 'container';\n      conditionText: string;\n      containerName?: string;\n      rules: InlineExtractedRule[];\n      sourceUrl?: string;\n    }\n    interface InlineSupportsRule {\n      kind: 'supports';\n      conditionText: string;\n      rules: InlineExtractedRule[];\n      sourceUrl?: string;\n    }\n    type InlineExtractedRule =\n      | InlineStyleRule\n      | InlineMediaRule\n      | InlineKeyframesRule\n      | InlineContainerRule\n      | InlineSupportsRule;\n\n    function declarationsFromStyle(style: CSSStyleDeclaration): Record<string, string> {\n      const out: Record<string, string> = {};\n      for (let i = 0; i < style.length; i++) {\n        const prop = style.item(i);\n        if (!prop) continue;\n        const value = style.getPropertyValue(prop);\n        if (value) out[prop] = value.trim();\n      }\n      return out;\n    }\n\n    function convertRule(rule: CSSRule, sourceUrl?: string): InlineExtractedRule | null {\n      // CSSStyleRule\n      if (rule instanceof CSSStyleRule) {\n        return {\n          kind: 'style',\n          selector: rule.selectorText,\n          declarations: declarationsFromStyle(rule.style),\n          ...(sourceUrl ? { sourceUrl } : {}),\n        };\n      }\n      // CSSMediaRule\n      if (rule instanceof CSSMediaRule) {\n        const nested: InlineExtractedRule[] = [];\n        for (let i = 0; i < rule.cssRules.length; i++) {\n          const child = convertRule(rule.cssRules[i]!, sourceUrl);\n          if (child) nested.push(child);\n        }\n        return {\n          kind: 'media',\n          conditionText: rule.media.mediaText,\n          rules: nested,\n          ...(sourceUrl ? { sourceUrl } : {}),\n        };\n      }\n      // CSSKeyframesRule\n      if (rule instanceof CSSKeyframesRule) {\n        const steps: Array<{ keyText: string; declarations: Record<string, string> }> = [];\n        for (let i = 0; i < rule.cssRules.length; i++) {\n          const kf = rule.cssRules[i] as CSSKeyframeRule;\n          steps.push({ keyText: kf.keyText, declarations: declarationsFromStyle(kf.style) });\n        }\n        return {\n          kind: 'keyframes',\n          name: rule.name,\n          steps,\n          ...(sourceUrl ? { sourceUrl } : {}),\n        };\n      }\n      // CSSContainerRule (relatively new — check via constructor name for cross-browser safety)\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const ContainerCtor = (window as any).CSSContainerRule;\n      if (ContainerCtor && rule instanceof ContainerCtor) {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const cr = rule as any;\n        const nested: InlineExtractedRule[] = [];\n        for (let i = 0; i < cr.cssRules.length; i++) {\n          const child = convertRule(cr.cssRules[i], sourceUrl);\n          if (child) nested.push(child);\n        }\n        return {\n          kind: 'container',\n          conditionText: cr.containerQuery ?? cr.conditionText ?? '',\n          ...(cr.containerName ? { containerName: cr.containerName } : {}),\n          rules: nested,\n          ...(sourceUrl ? { sourceUrl } : {}),\n        };\n      }\n      // CSSSupportsRule\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const SupportsCtor = (window as any).CSSSupportsRule;\n      if (SupportsCtor && rule instanceof SupportsCtor) {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const sr = rule as any;\n        const nested: InlineExtractedRule[] = [];\n        for (let i = 0; i < sr.cssRules.length; i++) {\n          const child = convertRule(sr.cssRules[i], sourceUrl);\n          if (child) nested.push(child);\n        }\n        return {\n          kind: 'supports',\n          conditionText: sr.conditionText ?? '',\n          rules: nested,\n          ...(sourceUrl ? { sourceUrl } : {}),\n        };\n      }\n      return null;\n    }\n\n    // ---- walk all stylesheets ----\n    const sheets = Array.from(document.styleSheets);\n    const allRules: InlineExtractedRule[] = [];\n    for (const sheet of sheets) {\n      let rules: CSSRuleList | null = null;\n      try {\n        rules = sheet.cssRules;\n      } catch {\n        // cross-origin — skip\n        continue;\n      }\n      if (!rules) continue;\n      const sourceUrl = sheet.href ?? undefined;\n      for (let i = 0; i < rules.length; i++) {\n        const converted = convertRule(rules[i]!, sourceUrl);\n        if (converted) allRules.push(converted);\n      }\n    }\n\n    // ---- document meta ----\n    const rootFontSize = parseFloat(\n      window.getComputedStyle(document.documentElement).fontSize || '16',\n    );\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const fontsApi = (document as any).fonts;\n    let fontsStatus: 'loading' | 'loaded' | 'unsupported' = 'unsupported';\n    if (fontsApi && typeof fontsApi.status === 'string') {\n      fontsStatus = fontsApi.status === 'loading' ? 'loading' : 'loaded';\n    }\n\n    // ---- structural elements for typography + hierarchy sensors ----\n    // The main extractInteractiveElements() path is INTERACTIVE-focused and\n    // returns only buttons/links/inputs with cursor/color/backgroundColor.\n    // For sensors that need text-bearing typography and heading/landmark\n    // structure, we do a SEPARATE lightweight extraction here. Non-breaking:\n    // these elements are added to ctx.elements ONLY for sensor consumption,\n    // not bubbled up to scan.elements.all.\n    const STRUCTURAL_SELECTORS = [\n      'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n      'header', 'nav', 'main', 'aside', 'footer', 'section', 'form',\n      '[role=\"heading\"]',\n      '[role=\"navigation\"]',\n      '[role=\"main\"]',\n      '[role=\"complementary\"]',\n      '[role=\"banner\"]',\n      '[role=\"contentinfo\"]',\n      '[role=\"region\"]',\n      '[role=\"form\"]',\n      'p', 'span', 'li',  // typography: text-bearing content\n    ];\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    function buildStructuralSelector(el: Element): string {\n      const path: string[] = [];\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      let cur: any = el;\n      while (cur && cur !== document.body) {\n        let s = cur.tagName.toLowerCase();\n        if (cur.id) {\n          path.unshift(`#${cur.id}`);\n          break;\n        }\n        if (typeof cur.className === 'string' && cur.className.trim()) {\n          const c = cur.className.split(' ').filter((x: string) => x.trim() && !x.includes(':'))[0];\n          if (c) s += `.${c}`;\n        }\n        path.unshift(s);\n        cur = cur.parentElement;\n      }\n      return path.join(' > ').slice(0, 200);\n    }\n\n    const seenStructural = new Set<Element>();\n    const structuralElements: EnhancedElement[] = [];\n    for (const sel of STRUCTURAL_SELECTORS) {\n      let found: NodeListOf<Element>;\n      try {\n        found = document.querySelectorAll(sel);\n      } catch {\n        continue;\n      }\n      found.forEach((el) => {\n        if (seenStructural.has(el)) return;\n        seenStructural.add(el);\n        const htmlEl = el as HTMLElement;\n        const rect = htmlEl.getBoundingClientRect();\n        const computed = window.getComputedStyle(htmlEl);\n        const text = (htmlEl.textContent || '').trim().slice(0, 100) || '';\n\n        // For text-bearing tags (h1-6, p, span, li), capture typography fields.\n        // For landmark tags, only capture identity (no typography needed).\n        const tagLower = htmlEl.tagName.toLowerCase();\n        const isTextBearing =\n          /^h[1-6]$/.test(tagLower) || tagLower === 'p' || tagLower === 'span' || tagLower === 'li';\n\n        const styles: Record<string, string> = {\n          color: computed.color,\n          backgroundColor: computed.backgroundColor,\n        };\n        if (isTextBearing) {\n          // Bypass extract.ts line-198-style filtering — sensors need 'normal' too.\n          styles.fontFamily = computed.fontFamily;\n          styles.fontSize = computed.fontSize.replace(/px$/, ''); // strip px to match existing convention\n          styles.fontWeight = computed.fontWeight;\n          styles.lineHeight = computed.lineHeight;\n        }\n\n        const ariaLevel = htmlEl.getAttribute('aria-level');\n\n        structuralElements.push({\n          selector: buildStructuralSelector(htmlEl),\n          tagName: tagLower,\n          id: htmlEl.id || undefined,\n          className: typeof htmlEl.className === 'string' ? htmlEl.className : undefined,\n          text,\n          bounds: {\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          },\n          computedStyles: styles,\n          interactive: {\n            hasOnClick: false,\n            hasHref: false,\n            hasReactHandler: false,\n            hasVueHandler: false,\n            hasAngularHandler: false,\n            isDisabled: false,\n            tabIndex: -1,\n            cursor: computed.cursor,\n          },\n          a11y: {\n            role: htmlEl.getAttribute('role'),\n            ariaLabel: htmlEl.getAttribute('aria-label'),\n            ariaDescribedBy: htmlEl.getAttribute('aria-describedby'),\n            ...(ariaLevel !== null ? { ariaLevel: parseInt(ariaLevel, 10) } : {}),\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          } as any,\n        } as EnhancedElement);\n      });\n    }\n\n    return {\n      cssRules: allRules as unknown as ExtractedCSSRule[],\n      documentMeta: {\n        rootFontSizePx: Number.isFinite(rootFontSize) ? rootFontSize : 16,\n        fontsStatus,\n      } as DocumentMeta,\n      structuralElements,\n    };\n  });\n}\n","import type { Rule, RuleContext } from './engine.js';\nimport type { EnhancedElement, Violation } from '../schemas.js';\n\n/**\n * Parse a color string (hex, rgb, rgba) into [r, g, b] in 0–255 range.\n * Returns null if the string cannot be parsed or is transparent/unset.\n */\nfunction parseColor(color: string): [number, number, number] | null {\n  if (!color || color === 'transparent' || color === 'initial' || color === 'inherit' || color === 'unset') {\n    return null;\n  }\n\n  // rgba(r, g, b, a) — skip fully transparent\n  const rgbaMatch = color.match(/^rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})(?:\\s*,\\s*([\\d.]+))?\\s*\\)$/);\n  if (rgbaMatch) {\n    const alpha = rgbaMatch[4] !== undefined ? parseFloat(rgbaMatch[4]) : 1;\n    if (alpha === 0) return null;\n    return [parseInt(rgbaMatch[1], 10), parseInt(rgbaMatch[2], 10), parseInt(rgbaMatch[3], 10)];\n  }\n\n  // #rrggbb or #rgb\n  const hex6Match = color.match(/^#([0-9a-fA-F]{6})$/);\n  if (hex6Match) {\n    const n = parseInt(hex6Match[1], 16);\n    return [(n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff];\n  }\n\n  const hex3Match = color.match(/^#([0-9a-fA-F]{3})$/);\n  if (hex3Match) {\n    const r = parseInt(hex3Match[1][0], 16) * 17;\n    const g = parseInt(hex3Match[1][1], 16) * 17;\n    const b = parseInt(hex3Match[1][2], 16) * 17;\n    return [r, g, b];\n  }\n\n  return null;\n}\n\n/**\n * Linearize an sRGB channel value (0–255) per WCAG 2.1.\n */\nfunction linearize(channel: number): number {\n  const c = channel / 255;\n  return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n}\n\n/**\n * Calculate relative luminance per WCAG 2.1 formula.\n */\nfunction relativeLuminance(r: number, g: number, b: number): number {\n  return 0.2126 * linearize(r) + 0.7152 * linearize(g) + 0.0722 * linearize(b);\n}\n\n/**\n * Calculate WCAG contrast ratio between two luminance values.\n */\nfunction contrastRatio(l1: number, l2: number): number {\n  const lighter = Math.max(l1, l2);\n  const darker = Math.min(l1, l2);\n  return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * Determine if text qualifies as \"large text\" per WCAG 2.1:\n * >= 18px normal weight, or >= 14px bold.\n */\nfunction isLargeText(styles: Record<string, string>): boolean {\n  const fontSizeStr = styles.fontSize ?? '';\n  const fontWeightStr = styles.fontWeight ?? '';\n\n  const fontSize = parseFloat(fontSizeStr);\n  if (isNaN(fontSize)) return false;\n\n  const isBold = fontWeightStr === 'bold' || parseInt(fontWeightStr, 10) >= 700;\n\n  return fontSize >= 18 || (isBold && fontSize >= 14);\n}\n\nexport const wcagContrastRules: Rule[] = [\n  {\n    id: 'wcag/contrast',\n    name: 'WCAG 2.1: Color Contrast',\n    description: 'Text must meet WCAG 2.1 minimum contrast: 4.5:1 normal, 3:1 large text',\n    defaultSeverity: 'error',\n    check: (element: EnhancedElement, _context: RuleContext): Violation | null => {\n      const style = element.computedStyles;\n      if (!style) return null;\n\n      // Only check elements that render text\n      const hasText = element.text && element.text.trim().length > 0;\n      if (!hasText) return null;\n\n      const fgColor = parseColor(style.color ?? '');\n      const bgColor = parseColor(style.backgroundColor ?? '');\n\n      // Skip if either color is unresolvable (transparent bg = inherits, can't compute)\n      if (!fgColor || !bgColor) return null;\n\n      const fgL = relativeLuminance(...fgColor);\n      const bgL = relativeLuminance(...bgColor);\n      const ratio = contrastRatio(fgL, bgL);\n\n      const largeText = isLargeText(style);\n      const threshold = largeText ? 3.0 : 4.5;\n\n      if (ratio < threshold) {\n        const ratioStr = ratio.toFixed(2);\n        const textSnippet = (element.text ?? '').slice(0, 40);\n        return {\n          ruleId: 'wcag/contrast',\n          ruleName: 'WCAG 2.1: Color Contrast',\n          severity: 'error',\n          message: `\"${textSnippet}\" has contrast ratio ${ratioStr}:1 (required ${threshold}:1 for ${largeText ? 'large' : 'normal'} text)`,\n          element: element.selector,\n          bounds: element.bounds,\n          fix: `Increase contrast between foreground ${style.color ?? ''} and background ${style.backgroundColor ?? ''}`,\n        };\n      }\n\n      return null;\n    },\n  },\n];\n","import type { Rule, RuleContext } from './engine.js';\nimport type { EnhancedElement, Violation } from '../schemas.js';\n\n/**\n * ARIA roles that indicate an element is interactive.\n */\nconst INTERACTIVE_ROLES = new Set([\n  'button',\n  'link',\n  'textbox',\n  'checkbox',\n  'radio',\n  'combobox',\n  'listbox',\n  'menuitem',\n  'menuitemcheckbox',\n  'menuitemradio',\n  'option',\n  'searchbox',\n  'slider',\n  'spinbutton',\n  'switch',\n  'tab',\n  'treeitem',\n]);\n\n/**\n * HTML tags that are inherently interactive.\n */\nconst INTERACTIVE_TAGS = new Set(['button', 'a', 'input', 'select', 'textarea']);\n\nfunction isInteractiveElement(element: EnhancedElement): boolean {\n  if (INTERACTIVE_TAGS.has(element.tagName.toLowerCase())) return true;\n  const role = element.a11y?.role;\n  if (role && INTERACTIVE_ROLES.has(role)) return true;\n  return false;\n}\n\nexport const touchTargetRules: Rule[] = [\n  {\n    id: 'touch-targets/minimum-size',\n    name: 'Touch Target: Minimum Size',\n    description: 'Interactive elements must meet minimum touch target size (44x44px mobile, 24x24px desktop)',\n    defaultSeverity: 'warn',\n    check: (element: EnhancedElement, context: RuleContext, options?: Record<string, unknown>): Violation | null => {\n      if (!isInteractiveElement(element)) return null;\n\n      // Use viewport width to determine mobile vs desktop (< 768px = mobile)\n      const isMobile = context.isMobile || context.viewportWidth < 768;\n      const minSize = isMobile\n        ? (options?.mobileMinSize as number) ?? 44\n        : (options?.desktopMinSize as number) ?? 24;\n\n      const { width, height } = element.bounds;\n\n      // Skip zero-size elements (hidden / not rendered)\n      if (width === 0 && height === 0) return null;\n\n      if (width < minSize || height < minSize) {\n        const label = element.text || element.a11y?.ariaLabel || element.selector;\n        return {\n          ruleId: 'touch-targets/minimum-size',\n          ruleName: 'Touch Target: Minimum Size',\n          severity: 'warn',\n          message: `\"${label.slice(0, 40)}\" touch target is ${width}x${height}px (minimum ${minSize}x${minSize}px on ${isMobile ? 'mobile' : 'desktop'})`,\n          element: element.selector,\n          bounds: element.bounds,\n          fix: `Increase element size to at least ${minSize}x${minSize}px`,\n        };\n      }\n\n      return null;\n    },\n  },\n];\n","import type { Rule, RuleContext } from './engine.js';\nimport type { EnhancedElement, Violation } from '../schemas.js';\n\n/**\n * Hierarchy levels derived from tag/role semantics.\n */\ntype HierarchyLevel = 'title' | 'description' | 'metadata' | 'unknown';\n\nconst TITLE_TAGS = new Set(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']);\nconst DESCRIPTION_TAGS = new Set(['p', 'blockquote', 'figcaption', 'li']);\n\nfunction inferLevel(element: EnhancedElement): HierarchyLevel {\n  const tag = element.tagName.toLowerCase();\n  const role = element.a11y?.role ?? '';\n\n  if (TITLE_TAGS.has(tag) || role === 'heading') return 'title';\n  if (DESCRIPTION_TAGS.has(tag) || role === 'paragraph') return 'description';\n\n  // Span or small with very small font = metadata\n  if (tag === 'span' || tag === 'small' || tag === 'label') {\n    const size = parseFloat(element.computedStyles?.fontSize ?? '0');\n    if (size > 0 && size <= 12) return 'metadata';\n  }\n\n  return 'unknown';\n}\n\nfunction parseFontSize(element: EnhancedElement): number | null {\n  const raw = element.computedStyles?.fontSize;\n  if (!raw) return null;\n  const val = parseFloat(raw);\n  return isNaN(val) ? null : val;\n}\n\n/**\n * Text hierarchy rule — checks that title-level elements have larger font than\n * description-level elements co-located on the same page.\n *\n * Strategy: collect all title and description elements, find the minimum title\n * font size and maximum description font size, flag if description >= title.\n *\n * Because Rule.check is called per element, we attach page-level analysis on\n * the first title element encountered after scanning all elements. This\n * avoids duplicate violations by only firing once.\n */\nexport const textHierarchyRules: Rule[] = [\n  {\n    id: 'text-hierarchy/title-vs-description',\n    name: 'Text Hierarchy: Title vs Description Size',\n    description: 'Title-level elements must be visually larger than description-level elements',\n    defaultSeverity: 'warn',\n    check: (element: EnhancedElement, context: RuleContext): Violation | null => {\n      // Only fire on title elements (one violation at most per title, not per description)\n      if (inferLevel(element) !== 'title') return null;\n\n      const titleSize = parseFontSize(element);\n      if (titleSize === null) return null;\n\n      // Find description-level elements with larger font than this title\n      for (const other of context.allElements) {\n        if (inferLevel(other) !== 'description') continue;\n        const descSize = parseFontSize(other);\n        if (descSize === null) continue;\n\n        if (descSize >= titleSize) {\n          const titleLabel = element.text?.slice(0, 30) || element.selector;\n          const descLabel = other.text?.slice(0, 30) || other.selector;\n          return {\n            ruleId: 'text-hierarchy/title-vs-description',\n            ruleName: 'Text Hierarchy: Title vs Description Size',\n            severity: 'warn',\n            message: `Title \"${titleLabel}\" (${titleSize}px) is not larger than description \"${descLabel}\" (${descSize}px)`,\n            element: element.selector,\n            bounds: element.bounds,\n            fix: 'Ensure heading/title font sizes are larger than body/description text',\n          };\n        }\n      }\n\n      return null;\n    },\n  },\n];\n","import type { Rule, RuleContext } from './engine.js';\nimport type { EnhancedElement, Violation } from '../schemas.js';\n\n/**\n * Roles and tags that signal \"this should be interactive\".\n */\nconst VISUALLY_INTERACTIVE_ROLES = new Set(['button', 'link', 'menuitem', 'tab', 'option']);\nconst VISUALLY_INTERACTIVE_TAGS = new Set(['button', 'a']);\n\nfunction looksInteractive(element: EnhancedElement): boolean {\n  const tag = element.tagName.toLowerCase();\n  const role = element.a11y?.role ?? '';\n  const cursor = element.interactive?.cursor ?? '';\n\n  if (VISUALLY_INTERACTIVE_TAGS.has(tag)) return true;\n  if (VISUALLY_INTERACTIVE_ROLES.has(role)) return true;\n  if (cursor === 'pointer') return true;\n\n  return false;\n}\n\nfunction hasAnyHandler(element: EnhancedElement): boolean {\n  return !!(\n    element.interactive.hasOnClick ||\n    element.interactive.hasHref ||\n    element.interactive.hasReactHandler ||\n    element.interactive.hasVueHandler ||\n    element.interactive.hasAngularHandler\n  );\n}\n\n/**\n * Detect whether a disabled element has a visible disabled visual state.\n * Heuristic: opacity <= 0.7 OR a muted/gray-ish color.\n */\nfunction hasDisabledVisual(element: EnhancedElement): boolean {\n  const style = element.computedStyles;\n  if (!style) return false;\n\n  const opacity = parseFloat(style.opacity ?? '1');\n  if (!isNaN(opacity) && opacity <= 0.7) return true;\n\n  // Cursor: not-allowed is a common disabled signal\n  if (element.interactive.cursor === 'not-allowed') return true;\n\n  // Muted color: check for gray tones via background or text color\n  const bg = style.backgroundColor ?? '';\n  const color = style.color ?? '';\n\n  const grayPattern = /rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/;\n  for (const c of [bg, color]) {\n    const m = c.match(grayPattern);\n    if (m) {\n      const r = parseInt(m[1], 10);\n      const g = parseInt(m[2], 10);\n      const b = parseInt(m[3], 10);\n      // Gray: all channels close to each other and not pure black/white\n      const range = Math.max(r, g, b) - Math.min(r, g, b);\n      if (range < 30 && r > 100 && r < 220) return true;\n    }\n  }\n\n  return false;\n}\n\nexport const handlerIntegrityRules: Rule[] = [\n  {\n    id: 'handler-integrity/fake-interactive',\n    name: 'Handler Integrity: Fake Interactive Element',\n    description: 'Elements that look interactive must have actual handlers',\n    defaultSeverity: 'error',\n    check: (element: EnhancedElement, _context: RuleContext): Violation | null => {\n      if (!looksInteractive(element)) return null;\n      if (element.interactive.isDisabled) return null;\n      if (hasAnyHandler(element)) return null;\n\n      const label = element.text || element.a11y?.ariaLabel || element.selector;\n      return {\n        ruleId: 'handler-integrity/fake-interactive',\n        ruleName: 'Handler Integrity: Fake Interactive Element',\n        severity: 'error',\n        message: `\"${label.slice(0, 40)}\" looks interactive (role/tag/cursor) but has no handler`,\n        element: element.selector,\n        bounds: element.bounds,\n        fix: 'Add an onClick handler, href, or remove interactive appearance',\n      };\n    },\n  },\n\n  {\n    id: 'handler-integrity/disabled-no-visual',\n    name: 'Handler Integrity: Disabled Without Visual State',\n    description: 'Disabled elements must have a visible disabled appearance',\n    defaultSeverity: 'warn',\n    check: (element: EnhancedElement, _context: RuleContext): Violation | null => {\n      if (!element.interactive.isDisabled) return null;\n      if (hasDisabledVisual(element)) return null;\n\n      const label = element.text || element.a11y?.ariaLabel || element.selector;\n      return {\n        ruleId: 'handler-integrity/disabled-no-visual',\n        ruleName: 'Handler Integrity: Disabled Without Visual State',\n        severity: 'warn',\n        message: `\"${label.slice(0, 40)}\" is disabled but shows no visual disabled state`,\n        element: element.selector,\n        bounds: element.bounds,\n        fix: 'Apply opacity <= 0.7, cursor: not-allowed, or muted color to disabled elements',\n      };\n    },\n  },\n];\n","import type { Rule, RuleContext } from './engine.js';\nimport type { EnhancedElement, Violation } from '../schemas.js';\n\n/**\n * Spacing properties to check against the 8pt grid (4pt half-grid tolerance).\n */\nconst SPACING_PROPERTIES = [\n  'paddingTop',\n  'paddingRight',\n  'paddingBottom',\n  'paddingLeft',\n  'marginTop',\n  'marginRight',\n  'marginBottom',\n  'marginLeft',\n  // Shorthand forms that may appear in computedStyles\n  'padding',\n  'margin',\n  'gap',\n  'rowGap',\n  'columnGap',\n];\n\n/**\n * Parse a single px value string.\n * Returns null for auto, percentages, em/rem, or unparseable values.\n */\nfunction parsePxValue(value: string): number | null {\n  const trimmed = value.trim();\n  if (!trimmed || trimmed === 'auto' || trimmed === 'normal' || trimmed === 'initial' || trimmed === 'inherit') {\n    return null;\n  }\n  if (trimmed.endsWith('%')) return null;\n  if (trimmed.endsWith('em') || trimmed.endsWith('rem') || trimmed.endsWith('vw') || trimmed.endsWith('vh')) {\n    return null;\n  }\n  if (!trimmed.endsWith('px')) return null;\n\n  const n = parseFloat(trimmed);\n  return isNaN(n) ? null : n;\n}\n\n/**\n * Check whether a px value is a multiple of 4 (half 8pt grid).\n * Zero is always valid.\n */\nfunction isOnGrid(px: number): boolean {\n  if (px === 0) return true;\n  return Math.round(px) % 4 === 0;\n}\n\n/**\n * Extract shorthand spacing (e.g., \"16px 8px 16px 8px\") into individual values.\n * Returns array of px values found.\n */\nfunction parseSpacingShorthand(value: string): number[] {\n  const parts = value.trim().split(/\\s+/);\n  const results: number[] = [];\n  for (const part of parts) {\n    const px = parsePxValue(part);\n    if (px !== null) results.push(px);\n  }\n  return results;\n}\n\nexport const spacingGridRules: Rule[] = [\n  {\n    id: 'spacing-grid/off-grid',\n    name: 'Spacing Grid: Off 8pt Grid',\n    description: 'Padding and margin values should be multiples of 4px (half 8pt grid)',\n    defaultSeverity: 'warn',\n    check: (element: EnhancedElement, _context: RuleContext): Violation | null => {\n      const style = element.computedStyles;\n      if (!style) return null;\n\n      const offGridValues: Array<{ property: string; value: string }> = [];\n\n      for (const prop of SPACING_PROPERTIES) {\n        const raw = style[prop];\n        if (!raw) continue;\n\n        // Shorthand may contain multiple values\n        const isShorthand = prop === 'padding' || prop === 'margin';\n        if (isShorthand) {\n          const values = parseSpacingShorthand(raw);\n          for (const v of values) {\n            if (!isOnGrid(v)) {\n              offGridValues.push({ property: prop, value: raw });\n              break; // one violation per property is enough\n            }\n          }\n        } else {\n          const px = parsePxValue(raw);\n          if (px !== null && !isOnGrid(px)) {\n            offGridValues.push({ property: prop, value: raw });\n          }\n        }\n      }\n\n      if (offGridValues.length === 0) return null;\n\n      const detail = offGridValues.map(v => `${v.property}: ${v.value}`).join(', ');\n      const label = element.text?.slice(0, 30) || element.selector;\n\n      return {\n        ruleId: 'spacing-grid/off-grid',\n        ruleName: 'Spacing Grid: Off 8pt Grid',\n        severity: 'warn',\n        message: `\"${label}\" has off-grid spacing: ${detail}`,\n        element: element.selector,\n        bounds: element.bounds,\n        fix: 'Use spacing values that are multiples of 4px (e.g., 4, 8, 12, 16, 20, 24, 32px)',\n      };\n    },\n  },\n];\n","import type { EnhancedElement } from '../schemas.js';\nimport type { Rule, RuleContext } from './engine.js';\nimport { wcagContrastRules } from './wcag-contrast.js';\nimport { touchTargetRules } from './touch-targets.js';\nimport { textHierarchyRules } from './text-hierarchy.js';\nimport { handlerIntegrityRules } from './handler-integrity.js';\nimport { spacingGridRules } from './spacing-grid.js';\n\n// Re-export individual rule arrays\nexport { wcagContrastRules } from './wcag-contrast.js';\nexport { touchTargetRules } from './touch-targets.js';\nexport { textHierarchyRules } from './text-hierarchy.js';\nexport { handlerIntegrityRules } from './handler-integrity.js';\nexport { spacingGridRules } from './spacing-grid.js';\n\n/**\n * Combined array of all deterministic rules.\n */\nexport const allRules: Rule[] = [\n  ...wcagContrastRules,\n  ...touchTargetRules,\n  ...textHierarchyRules,\n  ...handlerIntegrityRules,\n  ...spacingGridRules,\n];\n\n/**\n * Structured result from the deterministic rule engine.\n */\nexport interface RuleEngineResult {\n  rule: string;\n  severity: 'error' | 'warning' | 'info';\n  element: string;\n  expected: string;\n  actual: string;\n  evidence: Record<string, unknown>;\n}\n\n/**\n * Run all deterministic rules against a set of elements.\n * Returns a flat list of RuleEngineResult — one entry per violation.\n */\nexport function runAllRules(\n  elements: EnhancedElement[],\n  context: RuleContext,\n): RuleEngineResult[] {\n  const results: RuleEngineResult[] = [];\n\n  for (const element of elements) {\n    for (const rule of allRules) {\n      const violation = rule.check(element, context);\n      if (!violation) continue;\n\n      // Map engine severity ('warn' | 'error') to result severity\n      const severity: RuleEngineResult['severity'] =\n        violation.severity === 'error' ? 'error' : 'warning';\n\n      results.push({\n        rule: violation.ruleId,\n        severity,\n        element: violation.element ?? element.selector,\n        expected: violation.fix ?? '',\n        actual: violation.message,\n        evidence: {\n          ruleName: violation.ruleName,\n          bounds: violation.bounds,\n          selector: element.selector,\n          tagName: element.tagName,\n          text: element.text,\n        },\n      });\n    }\n  }\n\n  return results;\n}\n","/**\n * Scan Summarization Layer\n *\n * Condenses raw EnhancedElement arrays into structured, token-efficient reports.\n * Pure deterministic algorithms — no LLM calls, no npm dependencies.\n */\n\nimport type { EnhancedElement } from './schemas.js';\n\n// ============================================================================\n// Public interfaces\n// ============================================================================\n\nexport interface VisualPatternGroup {\n  /** Hash of the style signature */\n  patternId: string;\n  /** The shared style properties */\n  styleSignature: {\n    fontSize: string;\n    fontWeight: string;\n    color: string;\n    backgroundColor: string;\n    borderRadius: string;\n    padding: string;\n  };\n  /** Number of elements that fully match this signature */\n  count: number;\n  /** Unique roles present in this group */\n  roles: string[];\n  /** Selectors of elements that almost match (5/6 properties match) */\n  outliers: string[];\n}\n\nexport interface ComponentCensusEntry {\n  /** Pattern name e.g. \"PageHeader\", \"Surface+Row\", \"raw-button\", \"raw-div\" */\n  pattern: string;\n  count: number;\n  /** Routes (URL pathnames) that contain this pattern */\n  pages: string[];\n  compliance: 'primitive' | 'raw' | 'mixed';\n}\n\nexport interface NavigationNode {\n  label: string;\n  role: string;\n  depth: number;\n  childCount?: number;\n  isActive?: boolean;\n}\n\nexport interface ContrastReportEntry {\n  status: 'pass' | 'fail' | 'unknown';\n  ratio: number;\n  foreground: string;\n  background: string;\n  /** Number of elements sharing this exact color pair */\n  elementCount: number;\n  /** Up to 3 representative element labels */\n  sampleElements: string[];\n}\n\nexport interface InteractionMapEntry {\n  category:\n    | 'has-handler'\n    | 'looks-interactive-no-handler'\n    | 'disabled-with-handler'\n    | 'properly-disabled';\n  count: number;\n  /** Element labels, max 5 */\n  elements: string[];\n}\n\nexport interface ScanSummary {\n  /** Visual pattern groups — elements clustered by their styling */\n  visualPatterns: VisualPatternGroup[];\n  /** Component census — how consistently primitives/patterns are used */\n  componentCensus: ComponentCensusEntry[];\n  /** Navigation map — page structure derived from headings + nav elements */\n  navigationMap: NavigationNode[];\n  /** Contrast report — pre-computed ratios grouped by pass/fail */\n  contrastReport: ContrastReportEntry[];\n  /** Interaction map — handler coverage stats */\n  interactionMap: InteractionMapEntry[];\n  /** Token efficiency — raw vs summary size comparison */\n  tokenEfficiency: {\n    rawTokenEstimate: number;\n    summaryTokenEstimate: number;\n    reductionPercent: number;\n  };\n}\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\n/** Style properties that form the visual signature */\nconst SIGNATURE_KEYS = [\n  'fontSize',\n  'fontWeight',\n  'color',\n  'backgroundColor',\n  'borderRadius',\n  'padding',\n] as const;\n\ntype SignatureKey = (typeof SIGNATURE_KEYS)[number];\n\ntype StyleSignature = Record<SignatureKey, string>;\n\n/** Extract a 6-property style signature from an element's computedStyles */\nfunction extractSignature(el: EnhancedElement): StyleSignature {\n  const s = el.computedStyles ?? {};\n  return {\n    fontSize: s['fontSize'] ?? '',\n    fontWeight: s['fontWeight'] ?? '',\n    color: s['color'] ?? '',\n    backgroundColor: s['backgroundColor'] ?? '',\n    borderRadius: s['borderRadius'] ?? '',\n    padding: s['padding'] ?? '',\n  };\n}\n\n/** Deterministic hash of a style signature for use as a group key */\nfunction hashSignature(sig: StyleSignature): string {\n  return SIGNATURE_KEYS.map((k) => `${k}:${sig[k]}`).join('|');\n}\n\n/** Count how many of 6 signature fields match between two signatures */\nfunction matchCount(a: StyleSignature, b: StyleSignature): number {\n  let count = 0;\n  for (const key of SIGNATURE_KEYS) {\n    if (a[key] === b[key]) count++;\n  }\n  return count;\n}\n\n/** Readable label for an element (text, ariaLabel, id, or selector fallback) */\nfunction elementLabel(el: EnhancedElement): string {\n  return (\n    el.text?.trim() ||\n    el.a11y?.ariaLabel ||\n    el.id ||\n    el.selector.slice(0, 60)\n  );\n}\n\n/** Resolve an element's effective role */\nfunction resolveRole(el: EnhancedElement): string {\n  return el.a11y?.role ?? el.tagName ?? 'unknown';\n}\n\n// ============================================================================\n// WCAG 2.1 contrast utilities (no external deps)\n// ============================================================================\n\ninterface RGB {\n  r: number;\n  g: number;\n  b: number;\n}\n\n/** Parse CSS color string → RGB (0–255), returns null on failure */\nfunction parseColor(color: string): RGB | null {\n  if (!color || color === 'transparent' || color === 'none') return null;\n\n  // rgb() / rgba()\n  const rgbMatch = color.match(/rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/i);\n  if (rgbMatch) {\n    return {\n      r: Number(rgbMatch[1]),\n      g: Number(rgbMatch[2]),\n      b: Number(rgbMatch[3]),\n    };\n  }\n\n  // hex #rrggbb or #rgb\n  const hexMatch = color.match(/^#([0-9a-f]{3,8})$/i);\n  if (hexMatch) {\n    const h = hexMatch[1];\n    if (h.length === 3) {\n      return {\n        r: parseInt(h[0] + h[0], 16),\n        g: parseInt(h[1] + h[1], 16),\n        b: parseInt(h[2] + h[2], 16),\n      };\n    }\n    if (h.length >= 6) {\n      return {\n        r: parseInt(h.slice(0, 2), 16),\n        g: parseInt(h.slice(2, 4), 16),\n        b: parseInt(h.slice(4, 6), 16),\n      };\n    }\n  }\n\n  // Named colors (minimal set)\n  const named: Record<string, RGB> = {\n    white: { r: 255, g: 255, b: 255 },\n    black: { r: 0, g: 0, b: 0 },\n    red: { r: 255, g: 0, b: 0 },\n    green: { r: 0, g: 128, b: 0 },\n    blue: { r: 0, g: 0, b: 255 },\n    gray: { r: 128, g: 128, b: 128 },\n    grey: { r: 128, g: 128, b: 128 },\n  };\n  return named[color.toLowerCase()] ?? null;\n}\n\n/** WCAG 2.1 relative luminance from 0–255 RGB */\nfunction relativeLuminance(r: number, g: number, b: number): number {\n  const lin = (c: number): number => {\n    const s = c / 255;\n    return s <= 0.04045 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n  };\n  return 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b);\n}\n\n/** WCAG contrast ratio between two luminance values */\nfunction contrastRatio(l1: number, l2: number): number {\n  const lighter = Math.max(l1, l2);\n  const darker = Math.min(l1, l2);\n  return (lighter + 0.05) / (darker + 0.05);\n}\n\n// ============================================================================\n// 1. Visual Pattern Groups\n// ============================================================================\n\nfunction buildVisualPatterns(elements: EnhancedElement[]): VisualPatternGroup[] {\n  if (elements.length === 0) return [];\n\n  // Group elements by exact style signature\n  const groups = new Map<\n    string,\n    { sig: StyleSignature; elements: EnhancedElement[] }\n  >();\n\n  for (const el of elements) {\n    const sig = extractSignature(el);\n    const key = hashSignature(sig);\n    const existing = groups.get(key);\n    if (existing) {\n      existing.elements.push(el);\n    } else {\n      groups.set(key, { sig, elements: [el] });\n    }\n  }\n\n  // Convert to VisualPatternGroup, then find outliers for each group\n  const groupList = Array.from(groups.entries()).map(([key, { sig, elements: els }]) => ({\n    patternId: key.slice(0, 32), // truncate for readability\n    styleSignature: sig,\n    count: els.length,\n    roles: [...new Set(els.map(resolveRole))],\n    memberElements: els,\n  }));\n\n  // Outlier detection: elements in smaller groups that match 5/6 of a larger group\n  const result: VisualPatternGroup[] = groupList.map((group) => {\n    const outliers: string[] = [];\n\n    for (const other of groupList) {\n      if (other.patternId === group.patternId) continue;\n      const matches = matchCount(group.styleSignature, other.styleSignature);\n      if (matches >= 5) {\n        // All elements from the smaller group are outliers of the larger\n        for (const el of other.memberElements) {\n          outliers.push(elementLabel(el));\n        }\n      }\n    }\n\n    return {\n      patternId: group.patternId,\n      styleSignature: group.styleSignature,\n      count: group.count,\n      roles: group.roles,\n      outliers: [...new Set(outliers)].slice(0, 10),\n    };\n  });\n\n  // Sort by count descending\n  return result.sort((a, b) => b.count - a.count);\n}\n\n// ============================================================================\n// 2. Component Census\n// ============================================================================\n\n/** Known primitive testId patterns → pattern name */\nconst PRIMITIVE_PATTERNS: Array<{ testIdIncludes: string; name: string }> = [\n  { testIdIncludes: 'page-header', name: 'PageHeader' },\n  { testIdIncludes: 'page-title', name: 'PageHeader' },\n  { testIdIncludes: 'surface', name: 'Surface+Row' },\n  { testIdIncludes: 'card', name: 'Surface+Row' },\n  { testIdIncludes: 'nav-item', name: 'NavItem' },\n  { testIdIncludes: 'tab', name: 'Tab' },\n  { testIdIncludes: 'modal', name: 'Modal' },\n  { testIdIncludes: 'dialog', name: 'Dialog' },\n  { testIdIncludes: 'toast', name: 'Toast' },\n  { testIdIncludes: 'badge', name: 'Badge' },\n  { testIdIncludes: 'avatar', name: 'Avatar' },\n  { testIdIncludes: 'input', name: 'Input' },\n  { testIdIncludes: 'btn', name: 'Button' },\n  { testIdIncludes: 'button', name: 'Button' },\n];\n\nfunction classifyElement(el: EnhancedElement): {\n  pattern: string;\n  compliance: 'primitive' | 'raw' | 'mixed';\n} {\n  const testId = el.sourceHint?.dataTestId?.toLowerCase() ?? '';\n\n  // Check for known primitive data-testid\n  for (const p of PRIMITIVE_PATTERNS) {\n    if (testId.includes(p.testIdIncludes)) {\n      return { pattern: p.name, compliance: 'primitive' };\n    }\n  }\n\n  // Raw button: <button> tag without a recognizable primitive testId\n  if (el.tagName === 'button') {\n    return { pattern: 'raw-button', compliance: 'raw' };\n  }\n\n  // Raw heading\n  if (['h1', 'h2', 'h3'].includes(el.tagName)) {\n    return { pattern: `raw-${el.tagName}`, compliance: 'raw' };\n  }\n\n  // Raw input\n  if (['input', 'select', 'textarea'].includes(el.tagName)) {\n    return { pattern: 'raw-input', compliance: 'raw' };\n  }\n\n  // Raw link\n  if (el.tagName === 'a') {\n    return { pattern: 'raw-link', compliance: 'raw' };\n  }\n\n  // Generic div/span\n  return { pattern: `raw-${el.tagName ?? 'unknown'}`, compliance: 'raw' };\n}\n\nfunction buildComponentCensus(\n  elements: EnhancedElement[],\n  url: string\n): ComponentCensusEntry[] {\n  if (elements.length === 0) return [];\n\n  let route = '/';\n  try {\n    route = new URL(url).pathname;\n  } catch {\n    route = url;\n  }\n\n  const map = new Map<\n    string,\n    { count: number; pages: Set<string>; complianceCounts: Record<string, number> }\n  >();\n\n  for (const el of elements) {\n    const { pattern, compliance } = classifyElement(el);\n    const existing = map.get(pattern);\n    if (existing) {\n      existing.count++;\n      existing.pages.add(route);\n      existing.complianceCounts[compliance] =\n        (existing.complianceCounts[compliance] ?? 0) + 1;\n    } else {\n      map.set(pattern, {\n        count: 1,\n        pages: new Set([route]),\n        complianceCounts: { [compliance]: 1 },\n      });\n    }\n  }\n\n  return Array.from(map.entries())\n    .map(([pattern, { count, pages, complianceCounts }]) => {\n      const primitiveCount = complianceCounts['primitive'] ?? 0;\n      const rawCount = complianceCounts['raw'] ?? 0;\n      let compliance: 'primitive' | 'raw' | 'mixed';\n      if (primitiveCount > 0 && rawCount > 0) {\n        compliance = 'mixed';\n      } else if (primitiveCount > 0) {\n        compliance = 'primitive';\n      } else {\n        compliance = 'raw';\n      }\n      return {\n        pattern,\n        count,\n        pages: [...pages],\n        compliance,\n      };\n    })\n    .sort((a, b) => b.count - a.count);\n}\n\n// ============================================================================\n// 3. Navigation Map\n// ============================================================================\n\nconst HEADING_DEPTH: Record<string, number> = {\n  h1: 1,\n  h2: 2,\n  h3: 3,\n  h4: 4,\n  h5: 5,\n  h6: 6,\n};\n\nconst NAV_ROLES = new Set(['navigation', 'link', 'tab', 'menuitem', 'option']);\n\nfunction buildNavigationMap(elements: EnhancedElement[]): NavigationNode[] {\n  if (elements.length === 0) return [];\n\n  const nodes: NavigationNode[] = [];\n\n  for (const el of elements) {\n    const role = resolveRole(el);\n    const tag = el.tagName ?? '';\n    const isHeading = tag in HEADING_DEPTH;\n    const isNavRole = NAV_ROLES.has(role);\n\n    if (!isHeading && !isNavRole) continue;\n\n    const label = elementLabel(el);\n    if (!label) continue;\n\n    const depth = isHeading ? (HEADING_DEPTH[tag] ?? 1) : 1;\n\n    // isActive: check aria-current or aria-selected\n    const styles = el.computedStyles ?? {};\n    const hasFontWeightBold =\n      styles['fontWeight'] === 'bold' ||\n      parseInt(styles['fontWeight'] ?? '0', 10) >= 700;\n    const isActive =\n      el.a11y?.role === 'tab'\n        ? hasFontWeightBold\n        : undefined;\n\n    nodes.push({\n      label,\n      role,\n      depth,\n      isActive,\n    });\n  }\n\n  // Annotate childCount: number of direct children (next nodes one level deeper)\n  for (let i = 0; i < nodes.length; i++) {\n    const node = nodes[i];\n    let children = 0;\n    for (let j = i + 1; j < nodes.length; j++) {\n      if (nodes[j].depth <= node.depth) break;\n      if (nodes[j].depth === node.depth + 1) children++;\n    }\n    if (children > 0) {\n      node.childCount = children;\n    }\n  }\n\n  return nodes;\n}\n\n// ============================================================================\n// 4. Contrast Report\n// ============================================================================\n\nfunction buildContrastReport(elements: EnhancedElement[]): ContrastReportEntry[] {\n  if (elements.length === 0) return [];\n\n  // Accumulate by color pair key\n  const pairMap = new Map<\n    string,\n    { fg: string; bg: string; elements: EnhancedElement[] }\n  >();\n\n  for (const el of elements) {\n    const styles = el.computedStyles ?? {};\n    const fg = styles['color'] ?? '';\n    const bg = styles['backgroundColor'] ?? '';\n\n    if (!fg && !bg) continue;\n\n    const key = `${fg}|${bg}`;\n    const existing = pairMap.get(key);\n    if (existing) {\n      existing.elements.push(el);\n    } else {\n      pairMap.set(key, { fg, bg, elements: [el] });\n    }\n  }\n\n  return Array.from(pairMap.values()).map(({ fg, bg, elements: els }) => {\n    const fgRgb = parseColor(fg);\n    const bgRgb = parseColor(bg);\n\n    let status: 'pass' | 'fail' | 'unknown' = 'unknown';\n    let ratio = 0;\n\n    if (fgRgb && bgRgb) {\n      const fgL = relativeLuminance(fgRgb.r, fgRgb.g, fgRgb.b);\n      const bgL = relativeLuminance(bgRgb.r, bgRgb.g, bgRgb.b);\n      ratio = contrastRatio(fgL, bgL);\n      // WCAG AA normal text threshold: 4.5\n      status = ratio >= 4.5 ? 'pass' : 'fail';\n    }\n\n    const sampleElements = els\n      .slice(0, 3)\n      .map(elementLabel)\n      .filter(Boolean);\n\n    return {\n      status,\n      ratio: Math.round(ratio * 100) / 100,\n      foreground: fg,\n      background: bg,\n      elementCount: els.length,\n      sampleElements,\n    };\n  });\n}\n\n// ============================================================================\n// 5. Interaction Map\n// ============================================================================\n\nconst INTERACTIVE_TAGS = new Set(['button', 'a', 'input', 'select', 'textarea']);\nconst INTERACTIVE_ROLES = new Set(['button', 'link', 'textbox', 'checkbox', 'radio', 'combobox', 'menuitem', 'option', 'tab']);\n\nfunction isLooksInteractive(el: EnhancedElement): boolean {\n  const tag = el.tagName ?? '';\n  const role = el.a11y?.role ?? '';\n  const cursor = el.interactive?.cursor ?? el.computedStyles?.['cursor'] ?? '';\n  return (\n    INTERACTIVE_TAGS.has(tag) ||\n    INTERACTIVE_ROLES.has(role) ||\n    cursor === 'pointer'\n  );\n}\n\nfunction buildInteractionMap(elements: EnhancedElement[]): InteractionMapEntry[] {\n  if (elements.length === 0) return [];\n\n  const buckets: Record<InteractionMapEntry['category'], EnhancedElement[]> = {\n    'has-handler': [],\n    'looks-interactive-no-handler': [],\n    'disabled-with-handler': [],\n    'properly-disabled': [],\n  };\n\n  for (const el of elements) {\n    const inter = el.interactive;\n    if (!inter) continue;\n\n    const hasHandler =\n      inter.hasOnClick || inter.hasHref || !!inter.hasReactHandler;\n    const isDisabled = inter.isDisabled ?? false;\n    const looksInteractive = isLooksInteractive(el);\n\n    if (isDisabled && hasHandler) {\n      buckets['disabled-with-handler'].push(el);\n    } else if (isDisabled && !hasHandler) {\n      buckets['properly-disabled'].push(el);\n    } else if (hasHandler) {\n      buckets['has-handler'].push(el);\n    } else if (looksInteractive) {\n      buckets['looks-interactive-no-handler'].push(el);\n    }\n  }\n\n  return (\n    Object.entries(buckets) as Array<\n      [InteractionMapEntry['category'], EnhancedElement[]]\n    >\n  )\n    .filter(([, els]) => els.length > 0)\n    .map(([category, els]) => ({\n      category,\n      count: els.length,\n      elements: els.slice(0, 5).map(elementLabel),\n    }));\n}\n\n// ============================================================================\n// 6. Token Efficiency\n// ============================================================================\n\nfunction estimateTokens(data: unknown): number {\n  return Math.ceil(JSON.stringify(data).length / 4);\n}\n\n// ============================================================================\n// Main export\n// ============================================================================\n\n/**\n * Summarize raw element scan data into a structured, token-efficient report.\n *\n * @param elements - Raw EnhancedElement array from a scan\n * @param url - The page URL (used for route extraction in component census)\n * @returns ScanSummary with visual patterns, component census, navigation map,\n *          contrast report, interaction map, and token efficiency metrics\n */\nexport function summarizeScan(\n  elements: EnhancedElement[],\n  url: string\n): ScanSummary {\n  const safeElements = elements ?? [];\n\n  const visualPatterns = buildVisualPatterns(safeElements);\n  const componentCensus = buildComponentCensus(safeElements, url);\n  const navigationMap = buildNavigationMap(safeElements);\n  const contrastReport = buildContrastReport(safeElements);\n  const interactionMap = buildInteractionMap(safeElements);\n\n  const summary: Omit<ScanSummary, 'tokenEfficiency'> = {\n    visualPatterns,\n    componentCensus,\n    navigationMap,\n    contrastReport,\n    interactionMap,\n  };\n\n  const rawTokenEstimate = estimateTokens(safeElements);\n  const summaryTokenEstimate = estimateTokens(summary);\n  const reductionPercent =\n    rawTokenEstimate > 0\n      ? Math.round(\n          ((rawTokenEstimate - summaryTokenEstimate) / rawTokenEstimate) * 100\n        )\n      : 0;\n\n  return {\n    ...summary,\n    tokenEfficiency: {\n      rawTokenEstimate,\n      summaryTokenEstimate,\n      reductionPercent,\n    },\n  };\n}\n","import { registerPreset, type Rule, type RuleContext, type RulePreset } from '../engine.js';\nimport type { EnhancedElement, Violation } from '../../schemas.js';\n\n/**\n * An element is treated as \"not present to the user\" when its layout box has\n * collapsed to zero. This catches the most common false-positive class for the\n * minimal preset: responsive toggles (`.show-mobile` / `.hidden-mobile`) that\n * keep the element in the DOM but hide it via `display:none` in the off-active\n * viewport, which produces a {0,0,0,0} bounding box. Such elements are not\n * tappable, not visible, and shouldn't be graded against handler / touch-target\n * / a11y-label rules in the active viewport.\n *\n * `visibility:hidden` and `opacity:0` deliberately are NOT filtered here —\n * those preserve layout, the element is still in the tab order, and the rule\n * should fire (the author probably forgot to remove it).\n */\nexport function isLayoutCollapsed(element: EnhancedElement): boolean {\n  return element.bounds.width === 0 && element.bounds.height === 0;\n}\n\n/**\n * `aria-haspopup` (any of `menu | listbox | tree | grid | dialog | true`)\n * indicates the element opens a popup. Headless component libraries\n * (Radix, Headless UI, Reach UI, Ariakit) wire the click via portal /\n * event delegation rather than a direct `onClick` prop, which the\n * `no-handler` heuristic doesn't see. Treating any element with a\n * non-null aria-haspopup as \"wired by intent\" stops the rule from\n * flagging library-managed popup triggers as orphans.\n *\n * Conservative: aria-haspopup=\"false\" is treated as no popup (per spec)\n * and the rule still grades the element normally.\n */\nexport function hasPopupTrigger(element: EnhancedElement): boolean {\n  const v = element.a11y.ariaHaspopup;\n  if (!v) return false;\n  return v !== 'false';\n}\n\n/**\n * A `<button>` inside a `<form>` defaults to `type=\"submit\"` and submits the\n * form on click — the form's onSubmit handler is the wired path, not the\n * button's onClick. Treat such buttons as wired-by-form unless their type is\n * explicitly `\"button\"` (which opts out of the submit pipeline and so does\n * need its own onClick).\n *\n * Buttons OUTSIDE a form are still graded normally — there's no form pipeline\n * to wire them.\n */\nexport function isFormSubmitButton(element: EnhancedElement): boolean {\n  if (element.tagName !== 'button') return false;\n  if (!element.inForm) return false;\n  // Default type for a <button> in a <form> is \"submit\".\n  // Only opt-out when type is explicitly \"button\" (or \"reset\").\n  const t = element.buttonType;\n  return t == null || t === 'submit' || t === '';\n}\n\n/**\n * Rule: Buttons must have click handlers\n */\nconst noHandlerRule: Rule = {\n  id: 'no-handler',\n  name: 'No Click Handler',\n  description: 'Interactive elements like buttons must have click handlers',\n  defaultSeverity: 'error',\n  check: (element: EnhancedElement, _context: RuleContext): Violation | null => {\n    if (isLayoutCollapsed(element)) return null;\n    if (hasPopupTrigger(element)) return null;\n    if (isFormSubmitButton(element)) return null;\n    const isButton = element.tagName === 'button' || element.a11y.role === 'button';\n    const isDisabled = element.interactive.isDisabled;\n    const hasHandler = element.interactive.hasOnClick;\n\n    if (isButton && !isDisabled && !hasHandler) {\n      return {\n        ruleId: 'no-handler',\n        ruleName: 'No Click Handler',\n        severity: 'error',\n        message: `Button \"${element.text || element.selector}\" has no click handler`,\n        element: element.selector,\n        bounds: element.bounds,\n        fix: 'Add an onClick handler or make the button disabled',\n      };\n    }\n\n    return null;\n  },\n};\n\n/**\n * Rule: Links must have valid hrefs or handlers\n */\nconst placeholderLinkRule: Rule = {\n  id: 'placeholder-link',\n  name: 'Placeholder Link',\n  description: 'Links must have valid hrefs or click handlers',\n  defaultSeverity: 'error',\n  check: (element: EnhancedElement, _context: RuleContext): Violation | null => {\n    if (isLayoutCollapsed(element)) return null;\n    const isLink = element.tagName === 'a';\n    const hasValidHref = element.interactive.hasHref;\n    const hasHandler = element.interactive.hasOnClick;\n\n    if (isLink && !hasValidHref && !hasHandler) {\n      return {\n        ruleId: 'placeholder-link',\n        ruleName: 'Placeholder Link',\n        severity: 'error',\n        message: `Link \"${element.text || element.selector}\" has placeholder href and no handler`,\n        element: element.selector,\n        bounds: element.bounds,\n        fix: 'Add a valid href or onClick handler',\n      };\n    }\n\n    return null;\n  },\n};\n\n/**\n * Rule: Touch targets must be minimum size\n */\nconst touchTargetRule: Rule = {\n  id: 'touch-target-small',\n  name: 'Touch Target Too Small',\n  description: 'Interactive elements must meet minimum touch target size',\n  defaultSeverity: 'warn',\n  check: (element: EnhancedElement, context: RuleContext, options?: Record<string, unknown>): Violation | null => {\n    if (isLayoutCollapsed(element)) return null;\n    const isInteractive = element.interactive.hasOnClick || element.interactive.hasHref;\n    if (!isInteractive) return null;\n\n    const minSize = context.isMobile\n      ? (options?.mobileMinSize as number) ?? 44\n      : (options?.desktopMinSize as number) ?? 24;\n\n    const { width, height } = element.bounds;\n\n    if (width < minSize || height < minSize) {\n      return {\n        ruleId: 'touch-target-small',\n        ruleName: 'Touch Target Too Small',\n        severity: 'warn',\n        message: `\"${element.text || element.selector}\" touch target is ${width}x${height}px (min: ${minSize}px)`,\n        element: element.selector,\n        bounds: element.bounds,\n        fix: `Increase element size to at least ${minSize}x${minSize}px`,\n      };\n    }\n\n    return null;\n  },\n};\n\n/**\n * Rule: Interactive elements need accessible labels\n */\nconst missingAriaLabelRule: Rule = {\n  id: 'missing-aria-label',\n  name: 'Missing Accessible Label',\n  description: 'Interactive elements without text need aria-label',\n  defaultSeverity: 'warn',\n  check: (element: EnhancedElement, _context: RuleContext): Violation | null => {\n    if (isLayoutCollapsed(element)) return null;\n    const isInteractive = element.interactive.hasOnClick || element.interactive.hasHref;\n    if (!isInteractive) return null;\n\n    const hasText = element.text && element.text.trim().length > 0;\n    const hasAriaLabel = element.a11y.ariaLabel && element.a11y.ariaLabel.trim().length > 0;\n\n    if (!hasText && !hasAriaLabel) {\n      return {\n        ruleId: 'missing-aria-label',\n        ruleName: 'Missing Accessible Label',\n        severity: 'warn',\n        message: `\"${element.selector}\" is interactive but has no text or aria-label`,\n        element: element.selector,\n        bounds: element.bounds,\n        fix: 'Add visible text or aria-label attribute',\n      };\n    }\n\n    return null;\n  },\n};\n\n/**\n * Rule: Disabled elements should look disabled\n */\nconst disabledNoVisualRule: Rule = {\n  id: 'disabled-no-visual',\n  name: 'Disabled Without Visual',\n  description: 'Disabled elements should have visual indication',\n  defaultSeverity: 'warn',\n  check: (element: EnhancedElement, _context: RuleContext): Violation | null => {\n    if (!element.interactive.isDisabled) return null;\n\n    const cursor = element.interactive.cursor;\n    const hasDisabledCursor = cursor === 'not-allowed' || cursor === 'default';\n\n    // Check for visual indication via computed styles\n    const bgColor = element.computedStyles?.backgroundColor as string | undefined;\n    const hasGrayedBg = bgColor?.includes('gray') || bgColor?.includes('rgb(200') || bgColor?.includes('rgb(220');\n\n    if (!hasDisabledCursor && !hasGrayedBg) {\n      return {\n        ruleId: 'disabled-no-visual',\n        ruleName: 'Disabled Without Visual',\n        severity: 'warn',\n        message: `\"${element.text || element.selector}\" is disabled but has no visual indication`,\n        element: element.selector,\n        bounds: element.bounds,\n        fix: 'Add cursor: not-allowed and/or gray background to disabled state',\n      };\n    }\n\n    return null;\n  },\n};\n\n/**\n * Minimal preset - basic interactivity checks\n */\nconst minimalPreset: RulePreset = {\n  name: 'minimal',\n  description: 'Basic interactivity and accessibility checks',\n  rules: [\n    noHandlerRule,\n    placeholderLinkRule,\n    touchTargetRule,\n    missingAriaLabelRule,\n    disabledNoVisualRule,\n  ],\n  defaults: {\n    'no-handler': 'error',\n    'placeholder-link': 'error',\n    'touch-target-small': 'warn',\n    'missing-aria-label': 'warn',\n    'disabled-no-visual': 'warn',\n  },\n};\n\n/**\n * Register the minimal preset\n */\nexport function register(): void {\n  registerPreset(minimalPreset);\n}\n\n// Export rules for testing\nexport const rules = {\n  noHandlerRule,\n  placeholderLinkRule,\n  touchTargetRule,\n  missingAriaLabelRule,\n  disabledNoVisualRule,\n};\n","import { registerPreset } from '../engine.js';\nimport { allCalmPrecisionRules, corePrincipleIds, principleToRules } from '../../design-system/principles/calm-precision.js';\nimport type { RuleSetting } from '../../schemas.js';\n\n/**\n * Register the calm-precision preset\n */\nexport function register(): void {\n  const defaults: Record<string, RuleSetting> = {};\n\n  for (const rule of allCalmPrecisionRules) {\n    // Determine if this rule belongs to a core or stylistic principle\n    const isCore = corePrincipleIds.some(pid =>\n      principleToRules[pid]?.includes(rule.id)\n    );\n    defaults[rule.id] = isCore ? 'error' : 'warn';\n  }\n\n  registerPreset({\n    name: 'calm-precision',\n    description: 'Calm Precision design principles — Gestalt, Signal-to-Noise, Fitts, Hick, Content-Chrome, Cognitive Load',\n    rules: allCalmPrecisionRules,\n    defaults,\n  });\n}\n","import { registerPreset, type Rule, type RuleContext } from '../engine.js';\nimport type { EnhancedElement, Violation, RuleSetting } from '../../schemas.js';\n\n/**\n * Parse a color string (hex, rgb, rgba) into [r, g, b] in 0–255 range.\n * Returns null if the string cannot be parsed, is transparent, or has zero alpha.\n */\nfunction parseColor(color: string): [number, number, number] | null {\n  if (!color || color === 'transparent' || color === 'initial' || color === 'inherit' || color === 'unset') {\n    return null;\n  }\n\n  // rgba(r, g, b, a) — skip fully transparent\n  const rgbaMatch = color.match(/^rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})(?:\\s*,\\s*([\\d.]+))?\\s*\\)$/);\n  if (rgbaMatch) {\n    const alpha = rgbaMatch[4] !== undefined ? parseFloat(rgbaMatch[4]) : 1;\n    if (alpha === 0) return null;\n    return [parseInt(rgbaMatch[1], 10), parseInt(rgbaMatch[2], 10), parseInt(rgbaMatch[3], 10)];\n  }\n\n  // #rrggbb\n  const hex6Match = color.match(/^#([0-9a-fA-F]{6})$/);\n  if (hex6Match) {\n    const n = parseInt(hex6Match[1], 16);\n    return [(n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff];\n  }\n\n  // #rgb\n  const hex3Match = color.match(/^#([0-9a-fA-F]{3})$/);\n  if (hex3Match) {\n    const r = parseInt(hex3Match[1][0], 16) * 17;\n    const g = parseInt(hex3Match[1][1], 16) * 17;\n    const b = parseInt(hex3Match[1][2], 16) * 17;\n    return [r, g, b];\n  }\n\n  return null;\n}\n\n/**\n * Linearize an sRGB channel value (0–255) per WCAG 2.1.\n */\nfunction linearize(channel: number): number {\n  const c = channel / 255;\n  return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n}\n\n/**\n * Calculate relative luminance per WCAG 2.1 formula.\n */\nfunction relativeLuminance(r: number, g: number, b: number): number {\n  return 0.2126 * linearize(r) + 0.7152 * linearize(g) + 0.0722 * linearize(b);\n}\n\n/**\n * Calculate WCAG contrast ratio between two RGB triplets.\n */\nfunction contrastRatio(fg: [number, number, number], bg: [number, number, number]): number {\n  const l1 = relativeLuminance(...fg);\n  const l2 = relativeLuminance(...bg);\n  const lighter = Math.max(l1, l2);\n  const darker = Math.min(l1, l2);\n  return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * Classify text as \"large\" per WCAG 2.1:\n * - >= 18px normal weight\n * - >= 14px bold (fontWeight >= 700)\n */\nfunction isLargeText(styles: Record<string, string>): boolean {\n  const fontSizeStr = styles.fontSize ?? '';\n  const fontWeightStr = styles.fontWeight ?? '';\n\n  const fontSize = parseFloat(fontSizeStr);\n  if (isNaN(fontSize)) return false;\n\n  const isBold = fontWeightStr === 'bold' || parseInt(fontWeightStr, 10) >= 700;\n  return fontSize >= 18 || (isBold && fontSize >= 14);\n}\n\n// ============================================\n// Rules\n// ============================================\n\nconst wcagAAContrastRule: Rule = {\n  id: 'wcag-aa-contrast',\n  name: 'WCAG 2.1 AA Contrast',\n  description: 'Text must meet WCAG 2.1 AA contrast ratio: 4.5:1 normal text, 3:1 large text',\n  defaultSeverity: 'error',\n  check(element: EnhancedElement, _context: RuleContext): Violation | null {\n    const style = element.computedStyles;\n    if (!style) return null;\n\n    const hasText = element.text && element.text.trim().length > 0;\n    if (!hasText) return null;\n\n    const fg = parseColor(style.color ?? '');\n    const bg = parseColor(style.backgroundColor ?? '');\n    if (!fg || !bg) return null;\n\n    const ratio = contrastRatio(fg, bg);\n    const large = isLargeText(style);\n    const required = large ? 3.0 : 4.5;\n\n    if (ratio < required) {\n      const ratioStr = ratio.toFixed(2);\n      const textSnippet = (element.text ?? '').slice(0, 40);\n      return {\n        ruleId: 'wcag-aa-contrast',\n        ruleName: 'WCAG 2.1 AA Contrast',\n        severity: 'error',\n        message: `\"${textSnippet}\" contrast ratio ${ratioStr}:1 fails WCAG 2.1 AA (requires ${required}:1 for ${large ? 'large' : 'normal'} text)`,\n        element: element.selector,\n        bounds: element.bounds,\n        fix: `Increase contrast between foreground ${style.color ?? ''} and background ${style.backgroundColor ?? ''}`,\n      };\n    }\n\n    return null;\n  },\n};\n\nconst wcagAAAContrastRule: Rule = {\n  id: 'wcag-aaa-contrast',\n  name: 'WCAG 2.1 AAA Contrast',\n  description: 'Text should meet WCAG 2.1 AAA contrast ratio: 7:1 normal text, 4.5:1 large text',\n  defaultSeverity: 'warn',\n  check(element: EnhancedElement, _context: RuleContext): Violation | null {\n    const style = element.computedStyles;\n    if (!style) return null;\n\n    const hasText = element.text && element.text.trim().length > 0;\n    if (!hasText) return null;\n\n    const fg = parseColor(style.color ?? '');\n    const bg = parseColor(style.backgroundColor ?? '');\n    if (!fg || !bg) return null;\n\n    const ratio = contrastRatio(fg, bg);\n    const large = isLargeText(style);\n    const required = large ? 4.5 : 7.0;\n\n    if (ratio < required) {\n      const ratioStr = ratio.toFixed(2);\n      const textSnippet = (element.text ?? '').slice(0, 40);\n      return {\n        ruleId: 'wcag-aaa-contrast',\n        ruleName: 'WCAG 2.1 AAA Contrast',\n        severity: 'warn',\n        message: `\"${textSnippet}\" contrast ratio ${ratioStr}:1 below WCAG 2.1 AAA (${required}:1 for ${large ? 'large' : 'normal'} text)`,\n        element: element.selector,\n        bounds: element.bounds,\n        fix: `Increase contrast between foreground ${style.color ?? ''} and background ${style.backgroundColor ?? ''} to ${required}:1`,\n      };\n    }\n\n    return null;\n  },\n};\n\n// ============================================\n// Preset\n// ============================================\n\nexport const wcagContrastPresetRules: Rule[] = [wcagAAContrastRule, wcagAAAContrastRule];\n\nexport function register(): void {\n  const defaults: Record<string, RuleSetting> = {\n    'wcag-aa-contrast': 'error',\n    'wcag-aaa-contrast': 'warn',\n  };\n  registerPreset({\n    name: 'wcag-contrast',\n    description: 'WCAG 2.1 contrast ratio checks — AA (4.5:1 / 3:1) and AAA (7:1 / 4.5:1)',\n    rules: wcagContrastPresetRules,\n    defaults,\n  });\n}\n","import { registerPreset, type Rule, type RuleContext } from '../engine.js';\nimport type { EnhancedElement, Violation, RuleSetting } from '../../schemas.js';\n\n/**\n * Determine whether an element is likely interactive (tappable/clickable).\n * Checks ARIA role, tag name, and framework handler detection.\n */\nfunction isInteractive(el: EnhancedElement): boolean {\n  const role = el.a11y.role ?? '';\n  const tag = (el.tagName ?? '').toLowerCase();\n\n  const interactiveRoles = new Set([\n    'button', 'link', 'menuitem', 'tab', 'checkbox',\n    'radio', 'switch', 'textbox', 'combobox', 'slider',\n  ]);\n  if (interactiveRoles.has(role)) return true;\n\n  if (['a', 'button', 'input', 'select', 'textarea'].includes(tag)) return true;\n\n  if (\n    el.interactive.hasOnClick ||\n    el.interactive.hasHref ||\n    el.interactive.hasReactHandler === true ||\n    el.interactive.hasVueHandler === true ||\n    el.interactive.hasAngularHandler === true\n  ) {\n    return true;\n  }\n\n  return false;\n}\n\n// ============================================\n// Rules\n// ============================================\n\nconst mobileTouchTargetRule: Rule = {\n  id: 'touch-target-mobile',\n  name: 'Mobile Touch Target Size',\n  description: 'Interactive elements must be at least 44x44px on mobile viewports (WCAG 2.5.5 AAA / Apple HIG)',\n  defaultSeverity: 'error',\n  check(element: EnhancedElement, context: RuleContext): Violation | null {\n    if (!context.isMobile) return null;\n    if (!isInteractive(element)) return null;\n\n    const { width, height } = element.bounds;\n    if (width === 0 || height === 0) return null;\n\n    const MIN = 44;\n    if (width < MIN || height < MIN) {\n      return {\n        ruleId: 'touch-target-mobile',\n        ruleName: 'Mobile Touch Target Size',\n        severity: 'error',\n        message: `\"${element.text || element.selector}\" touch target is ${width}x${height}px (minimum ${MIN}x${MIN}px)`,\n        element: element.selector,\n        bounds: element.bounds,\n        fix: `Increase element size to at least ${MIN}x${MIN}px (WCAG 2.5.5 / Apple HIG)`,\n      };\n    }\n\n    return null;\n  },\n};\n\nconst desktopPointerTargetRule: Rule = {\n  id: 'touch-target-desktop',\n  name: 'Desktop Pointer Target Size',\n  description: 'Interactive elements should be at least 24x24px on desktop viewports (WCAG 2.5.8 AA)',\n  defaultSeverity: 'warn',\n  check(element: EnhancedElement, context: RuleContext): Violation | null {\n    if (context.isMobile) return null;\n    if (!isInteractive(element)) return null;\n\n    const { width, height } = element.bounds;\n    if (width === 0 || height === 0) return null;\n\n    const MIN = 24;\n    if (width < MIN || height < MIN) {\n      return {\n        ruleId: 'touch-target-desktop',\n        ruleName: 'Desktop Pointer Target Size',\n        severity: 'warn',\n        message: `\"${element.text || element.selector}\" pointer target is ${width}x${height}px (minimum ${MIN}x${MIN}px per WCAG 2.5.8)`,\n        element: element.selector,\n        bounds: element.bounds,\n        fix: `Increase element size to at least ${MIN}x${MIN}px (WCAG 2.5.8)`,\n      };\n    }\n\n    return null;\n  },\n};\n\n// ============================================\n// Preset\n// ============================================\n\nexport const touchTargetPresetRules: Rule[] = [mobileTouchTargetRule, desktopPointerTargetRule];\n\nexport function register(): void {\n  const defaults: Record<string, RuleSetting> = {\n    'touch-target-mobile': 'error',\n    'touch-target-desktop': 'warn',\n  };\n  registerPreset({\n    name: 'touch-targets',\n    description: 'Minimum touch and pointer target sizes — WCAG 2.5.5 (mobile 44px) and WCAG 2.5.8 (desktop 24px)',\n    rules: touchTargetPresetRules,\n    defaults,\n  });\n}\n","import { readFile } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport type {\n  EnhancedElement,\n  RulesConfig,\n  RuleSetting,\n  Violation,\n  RuleAuditResult,\n} from '../schemas.js';\n\n/**\n * Rule context passed to each rule check\n */\nexport interface RuleContext {\n  isMobile: boolean;\n  viewportWidth: number;\n  viewportHeight: number;\n  url: string;\n  allElements: EnhancedElement[];\n}\n\n/**\n * Rule definition\n */\nexport interface Rule {\n  id: string;\n  name: string;\n  description: string;\n  defaultSeverity: 'warn' | 'error';\n  check: (element: EnhancedElement, context: RuleContext, options?: Record<string, unknown>) => Violation | null;\n}\n\n/**\n * Rule preset - collection of rules with default settings\n */\nexport interface RulePreset {\n  name: string;\n  description: string;\n  rules: Rule[];\n  defaults: Record<string, RuleSetting>;\n}\n\n// Registered presets\nconst presets: Map<string, RulePreset> = new Map();\n\n/**\n * Register a rule preset\n */\nexport function registerPreset(preset: RulePreset): void {\n  presets.set(preset.name, preset);\n}\n\n/**\n * Get a registered preset by name\n */\nexport function getPreset(name: string): RulePreset | undefined {\n  return presets.get(name);\n}\n\n/**\n * List all registered presets\n */\nexport function listPresets(): string[] {\n  return Array.from(presets.keys());\n}\n\n/**\n * Load rules configuration from .ibr/rules.json\n *\n * By default, NO rules are enforced - rules must be explicitly configured by user.\n * Users can:\n * - Create .ibr/rules.json to define rules\n * - Pass --rules flag to CLI to use optional presets\n * - Define custom rules in the config\n */\nexport async function loadRulesConfig(projectDir: string): Promise<RulesConfig> {\n  const configPath = join(projectDir, '.ibr', 'rules.json');\n\n  if (!existsSync(configPath)) {\n    // Return empty config - no rules by default\n    // Users must explicitly configure rules\n    return { extends: [], rules: {} };\n  }\n\n  try {\n    const content = await readFile(configPath, 'utf-8');\n    return JSON.parse(content) as RulesConfig;\n  } catch (error) {\n    console.warn(`Failed to parse rules.json: ${error}`);\n    // Return empty config on error - don't force any rules\n    return { extends: [], rules: {} };\n  }\n}\n\n/**\n * Merge rule settings from presets and user config\n */\nfunction mergeRuleSettings(\n  presetNames: string[],\n  userRules: Record<string, RuleSetting> = {}\n): { rules: Rule[]; settings: Map<string, { severity: 'warn' | 'error' | 'off'; options?: Record<string, unknown> }> } {\n  const allRules: Rule[] = [];\n  const settings = new Map<string, { severity: 'warn' | 'error' | 'off'; options?: Record<string, unknown> }>();\n  const seenRuleIds = new Set<string>();\n\n  // Load rules from presets\n  for (const presetName of presetNames) {\n    const preset = presets.get(presetName);\n    if (!preset) {\n      console.warn(`Unknown preset: ${presetName}`);\n      continue;\n    }\n\n    for (const rule of preset.rules) {\n      if (!seenRuleIds.has(rule.id)) {\n        allRules.push(rule);\n        seenRuleIds.add(rule.id);\n\n        // Apply preset defaults\n        const defaultSetting = preset.defaults[rule.id] ?? rule.defaultSeverity;\n        if (typeof defaultSetting === 'string') {\n          settings.set(rule.id, { severity: defaultSetting as 'warn' | 'error' | 'off' });\n        } else {\n          settings.set(rule.id, { severity: defaultSetting[0] as 'warn' | 'error' | 'off', options: defaultSetting[1] as Record<string, unknown> });\n        }\n      }\n    }\n  }\n\n  // Apply user overrides\n  for (const [ruleId, setting] of Object.entries(userRules)) {\n    if (typeof setting === 'string') {\n      settings.set(ruleId, { severity: setting as 'warn' | 'error' | 'off' });\n    } else {\n      settings.set(ruleId, { severity: setting[0] as 'warn' | 'error' | 'off', options: setting[1] as Record<string, unknown> });\n    }\n  }\n\n  return { rules: allRules, settings };\n}\n\n/**\n * Run rules against elements\n */\nexport function runRules(\n  elements: EnhancedElement[],\n  context: RuleContext,\n  config: RulesConfig\n): Violation[] {\n  // No rules by default - user must configure in .ibr/rules.json or pass --rules flag\n  const { rules, settings } = mergeRuleSettings(config.extends ?? [], config.rules as Record<string, RuleSetting> | undefined);\n  const violations: Violation[] = [];\n\n  for (const element of elements) {\n    for (const rule of rules) {\n      const setting = settings.get(rule.id);\n\n      // Skip if rule is off\n      if (!setting || setting.severity === 'off') {\n        continue;\n      }\n\n      const violation = rule.check(element, context, setting.options);\n\n      if (violation) {\n        // Override severity from settings\n        violations.push({\n          ...violation,\n          severity: setting.severity as 'warn' | 'error',\n        });\n      }\n    }\n  }\n\n  return violations;\n}\n\n/**\n * Create full audit result\n */\nexport function createAuditResult(\n  url: string,\n  elements: EnhancedElement[],\n  violations: Violation[]\n): RuleAuditResult {\n  const errors = violations.filter(v => v.severity === 'error').length;\n  const warnings = violations.filter(v => v.severity === 'warn').length;\n\n  return {\n    url,\n    timestamp: new Date().toISOString(),\n    elementsScanned: elements.length,\n    violations,\n    summary: {\n      errors,\n      warnings,\n      passed: elements.length - errors - warnings,\n    },\n  };\n}\n\n/**\n * Format audit result for CLI output\n */\nexport function formatAuditResult(result: RuleAuditResult): string {\n  const lines: string[] = [];\n\n  lines.push(`IBR Audit: ${result.url}`);\n  lines.push(`Scanned: ${result.elementsScanned} elements`);\n  lines.push('');\n\n  if (result.violations.length === 0) {\n    lines.push('No violations found.');\n  } else {\n    lines.push(`Found ${result.summary.errors} errors, ${result.summary.warnings} warnings:`);\n    lines.push('');\n\n    for (const v of result.violations) {\n      const icon = v.severity === 'error' ? '✗' : '!';\n      lines.push(`  ${icon} [${v.ruleId}] ${v.message}`);\n      if (v.element) {\n        lines.push(`    Element: ${v.element.slice(0, 60)}${v.element.length > 60 ? '...' : ''}`);\n      }\n      if (v.fix) {\n        lines.push(`    Fix: ${v.fix}`);\n      }\n    }\n  }\n\n  lines.push('');\n  lines.push(`Summary: ${result.summary.errors} errors, ${result.summary.warnings} warnings, ${result.summary.passed} passed`);\n\n  return lines.join('\\n');\n}\n\n/**\n * Load and register memory preferences as a rule preset\n */\nexport async function loadMemoryPreset(outputDir: string): Promise<void> {\n  try {\n    const { loadSummary, createMemoryPreset } = await import('../memory.js');\n    const summary = await loadSummary(outputDir);\n\n    if (summary.activePreferences.length > 0) {\n      const preset = createMemoryPreset(summary.activePreferences);\n      registerPreset(preset);\n    }\n  } catch {\n    // Memory not available - not an error\n  }\n}\n\n// Auto-register presets on import\nimport('./presets/minimal.js').then(m => m.register()).catch(() => {});\nimport('./presets/calm-precision.js').then(m => m.register()).catch(() => {});\nimport('./presets/wcag-contrast.js').then(m => m.register()).catch(() => {});\nimport('./presets/touch-targets.js').then(m => m.register()).catch(() => {});\n","import type { PageLike } from './engine/page-like.js';\nimport { EngineDriver, type CoverageReport } from './engine/driver.js';\nimport type { SetCookieParams } from './engine/cdp/network.js';\nimport { CompatPage } from './engine/compat.js';\nimport type { EnhancedElement, AuditResult, Viewport } from './schemas.js';\nimport { VIEWPORTS } from './schemas.js';\nimport { extractInteractiveElements, analyzeElements } from './extract.js';\nimport { testInteractivity, type InteractivityResult } from './interactivity.js';\nimport { getSemanticOutput, type SemanticResult } from './semantic/index.js';\nimport { detectLayoutCollisions, type LayoutCollisionResult } from './layout-collision.js';\nimport { analyzeThemeConsistency, type ThemeAnalysis } from './consistency.js';\nimport { runDesignSystemCheck } from './design-system/index.js';\nimport type { DesignSystemResult } from './schemas.js';\nimport type { BrowserLaunchOptions } from './types.js'\nimport { waitForHydration } from './engine/cdp/wait.js';\nimport { runSensors, type SensorReport } from './sensors/index.js';\nimport { extractCssRulesAndMeta } from './sensors/css-extract.js';\nimport { runAllRules, type RuleEngineResult } from './rules/index.js';\nimport { summarizeScan, type ScanSummary } from './summarize.js';\nimport { runRules, type RuleContext as PresetRuleContext } from './rules/engine.js';\nimport type { RulesConfig } from './schemas.js';\n\n\n/**\n * Comprehensive UI scan result combining all IBR analysis capabilities\n */\nexport interface ScanResult {\n  url: string;\n  route: string;\n  timestamp: string;\n  viewport: Viewport;\n\n  /** Element extraction: all interactive elements with computed styles */\n  elements: {\n    all: EnhancedElement[];\n    audit: AuditResult;\n  };\n\n  /** Interactivity analysis: buttons, links, forms with handler detection */\n  interactivity: InteractivityResult;\n\n  /** Semantic understanding: page intent, auth/loading/error states */\n  semantic: SemanticResult;\n\n  /** Console output captured during page load */\n  console: {\n    errors: string[];\n    warnings: string[];\n  };\n\n  /** AX tree coverage report — gaps like canvas, iframes, shadow DOM */\n  coverage?: CoverageReport;\n\n  /** Layout collision detection — overlapping text elements */\n  layoutCollisions?: LayoutCollisionResult;\n\n  /** Theme consistency — detects light content on dark page (and vice versa) */\n  themeAnalysis?: ThemeAnalysis;\n\n  /** Design system check results — principle violations, token compliance */\n  designSystem?: DesignSystemResult;\n\n  /** Hydration wait result — present when SPA hydration detection ran */\n  hydration?: {\n    timedOut: boolean;\n    reason: string;\n  };\n\n  /** Pre-processed sensor summaries — condensed patterns for model consumption */\n  sensors?: SensorReport;\n\n  /** Deterministic rule engine results — no LLM needed */\n  ruleEngine?: RuleEngineResult[];\n\n  /** Condensed summaries for model-assisted review */\n  summaries?: ScanSummary;\n\n  /** Overall scan verdict */\n  verdict: 'PASS' | 'ISSUES' | 'FAIL' | 'PARTIAL';\n  /** If verdict is PARTIAL, explains why the scan is incomplete */\n  partialReason?: string;\n  issues: ScanIssue[];\n  summary: string;\n}\n\n/**\n * Individual issue found during scan\n */\nexport interface ScanIssue {\n  category: 'interactivity' | 'accessibility' | 'semantic' | 'console' | 'structure' | 'design-system';\n  severity: 'error' | 'warning' | 'info';\n  element?: string;\n  description: string;\n  fix?: string;\n}\n\n/**\n * Collects and deduplicates scan issues from multiple analysis sources.\n * Use directly when composing issues incrementally (e.g. design system checks).\n * The legacy aggregateIssues() function wraps this for backward compatibility.\n */\nexport class IssueCollector {\n  private issues: ScanIssue[] = [];\n\n  add(issue: ScanIssue): void {\n    this.issues.push(issue);\n  }\n\n  /**\n   * Add issues from a source array with varying shapes.\n   * Handles the different field names used across audit, interactivity, and semantic results.\n   */\n  addFrom(\n    category: ScanIssue['category'],\n    items: Array<{\n      severity?: string;\n      message?: string;\n      description?: string;\n      problem?: string;\n      element?: string;\n      type?: string;\n      fix?: string;\n    }>,\n    overrideCategory?: (item: { type?: string }) => ScanIssue['category']\n  ): void {\n    for (const item of items) {\n      const description = item.message ?? item.description ?? item.problem ?? '';\n      const severity = (item.severity ?? 'info') as ScanIssue['severity'];\n      const resolvedCategory = overrideCategory ? overrideCategory(item) : category;\n      this.issues.push({\n        category: resolvedCategory,\n        severity,\n        element: item.element,\n        description,\n        fix: item.fix,\n      });\n    }\n  }\n\n  /**\n   * Add console errors, skipping favicon/manifest noise.\n   */\n  addConsoleErrors(errors: string[]): void {\n    for (const error of errors) {\n      if (error.includes('favicon') || error.includes('manifest')) continue;\n      this.issues.push({\n        category: 'console',\n        severity: 'error',\n        description: `Console error: ${error.slice(0, 200)}`,\n      });\n    }\n  }\n\n  /**\n   * Add theme mismatch issue if present.\n   */\n  addThemeAnalysis(analysis?: ThemeAnalysis): void {\n    if (analysis?.themeMismatch) {\n      this.issues.push({\n        category: 'semantic',\n        severity: 'warning',\n        description: analysis.mismatchDetails ?? 'Content card has different theme than page background',\n        fix: 'Ensure content containers match the page theme (dark/light)',\n      });\n    }\n  }\n\n  /**\n   * Remove issues with identical descriptions, preserving first occurrence.\n   */\n  deduplicate(): void {\n    const seen = new Set<string>();\n    this.issues = this.issues.filter(issue => {\n      if (seen.has(issue.description)) return false;\n      seen.add(issue.description);\n      return true;\n    });\n  }\n\n  getIssues(): ScanIssue[] {\n    return [...this.issues];\n  }\n}\n\n/**\n * Options for running a scan\n */\nexport interface ScanOptions extends BrowserLaunchOptions {\n  /** Viewport to use (default: desktop) */\n  viewport?: keyof typeof VIEWPORTS | Viewport;\n  /** Timeout for page load in ms (default: 30000) */\n  timeout?: number;\n  /** Wait for this selector before scanning */\n  waitFor?: string;\n  /** Show a visible browser window instead of headless mode */\n  headed?: boolean;\n  /** IBR output directory for auth state */\n  outputDir?: string;\n  /** Whether to capture a screenshot */\n  screenshot?: {\n    path: string;\n    fullPage?: boolean;\n  };\n  /** Network idle timeout in ms (default: 10000). Set higher for slow async pages */\n  networkIdleTimeout?: number;\n  /** Patience mode: extends all wait timeouts. Use for AI search / LLM result pages */\n  patience?: number;\n  /** How to handle SPA hydration. 'auto' detects framework, 'stable' always waits, 'none' skips. Default: 'auto' */\n  hydrationStrategy?: 'auto' | 'stable' | 'none';\n  /** Rule preset names to enable for this scan (e.g. ['wcag-contrast', 'touch-targets']) */\n  rules?: string[];\n  /**\n   * R3: cookies to set BEFORE navigate. When the caller has an authenticated\n   * session, threading the auth cookies into a fresh scan lets the scan see\n   * gated routes (dashboard, settings) instead of bouncing to a login page.\n   * Without this, plain `scan()` opens a clean browser and reports\n   * \"Auth: Not authenticated\" for every protected route — the largest source\n   * of false-FAIL verdicts in the transcript audit.\n   */\n  cookies?: SetCookieParams[];\n  /**\n   * Optional warm-browser pool. When supplied, scan() reuses the pool's\n   * EngineDriver instead of launching a fresh browser. Drops first-finding\n   * latency dramatically for the second-and-onwards call in the same process\n   * (e.g. an MCP server fielding multiple `ask` calls). The pool's lifecycle\n   * is the caller's responsibility — scan() does not close it.\n   *\n   * Caveat: per-scan viewport is NOT re-applied on a pooled driver — the\n   * pool's launch viewport is sticky for the process. Callers that need a\n   * different viewport mid-process should construct a dedicated pool or\n   * omit `pool` so scan() launches with the full device profile.\n   */\n  pool?: import('./engine/browser-pool.js').BrowserPool;\n}\n\n/**\n * Initialize the cookie jar for a scan, closing the cross-scan leak that\n * arises when a warm BrowserPool reuses an EngineDriver.\n *\n * Contract:\n * - Pool path (`ownDriver === false`): UNCONDITIONALLY clear the jar before\n *   applying any new cookies. This is the security boundary — guarding the\n *   clear behind `cookies?.length > 0` would re-open the leak case (\"scan B\n *   passes no cookies and inherits scan A's session\").\n * - Fresh-driver path (`ownDriver === true`): the jar is empty by\n *   construction, so we skip `clearCookies()` to save a CDP round-trip.\n * - `setCookies` runs only when caller supplied cookies, on both paths.\n *\n * Failures from `clearCookies` and `setCookies` are non-fatal — the scan\n * continues; if residue persists or auth fails, the scan output will\n * reflect the resulting state and the caller can detect it.\n *\n * Exported for direct unit testing of the cookie-leak regression\n * (browser-pool.test.ts).\n */\nexport async function initScanCookies(\n  driver: Pick<EngineDriver, 'clearCookies' | 'setCookies'>,\n  ownDriver: boolean,\n  cookies: SetCookieParams[] | undefined,\n): Promise<void> {\n  if (!ownDriver) {\n    try {\n      await driver.clearCookies();\n    } catch {\n      // Non-fatal: see contract above.\n    }\n  }\n  if (cookies && cookies.length > 0) {\n    try {\n      await driver.setCookies(cookies);\n    } catch {\n      // Non-fatal: see contract above.\n    }\n  }\n}\n\n/**\n * Run a comprehensive UI scan on a URL.\n *\n * Combines all IBR analysis capabilities into a single scan:\n * 1. Element extraction (computed styles, bounds, handlers)\n * 2. Interactivity testing (buttons, links, forms)\n * 3. Semantic analysis (page intent, auth/loading/error states)\n * 4. Console error capture\n * 5. Issue aggregation with verdict\n */\nexport async function scan(url: string, options: ScanOptions = {}): Promise<ScanResult> {\n  const {\n    viewport: viewportOpt = 'desktop',\n    timeout = 30000,\n    waitFor,\n    screenshot,\n    networkIdleTimeout,\n    patience,\n    headed = false,\n    browserMode,\n    cdpUrl,\n    wsEndpoint,\n    chromePath,\n    hydrationStrategy = 'auto',\n    rules: rulePresets,\n    cookies,\n  } = options;\n\n  const resolvedViewport: Viewport = typeof viewportOpt === 'string'\n    ? VIEWPORTS[viewportOpt] || VIEWPORTS.desktop\n    : viewportOpt;\n\n  // Launch browser — or acquire one from the pool when supplied.\n  //\n  // Pool path: reuses the pool's EngineDriver. Per-scan viewport is NOT\n  // re-applied (emulation is sticky on the pooled driver). Callers that\n  // need a different viewport mid-process should construct a dedicated\n  // pool or omit `pool` for viewport-sensitive scans.\n  //\n  // Fresh-launch path: passes the FULL resolved viewport (including\n  // deviceScaleFactor, mobile, userAgent, hasTouch) so EngineDriver.launch\n  // can apply the full device profile via CDP Emulation BEFORE navigate.\n  // Passing only {width, height} was the source of the \"--viewport mobile\n  // is silently ignored\" bug (pre-1.1.0); preserving it here is required.\n  const ownDriver = !options.pool;\n  let driver: EngineDriver;\n  if (options.pool) {\n    driver = await options.pool.acquire();\n  } else {\n    driver = new EngineDriver();\n    await driver.launch({\n      headless: !headed,\n      viewport: {\n        width: resolvedViewport.width,\n        height: resolvedViewport.height,\n        deviceScaleFactor: resolvedViewport.deviceScaleFactor,\n        mobile: resolvedViewport.mobile,\n        userAgent: resolvedViewport.userAgent,\n        hasTouch: resolvedViewport.hasTouch,\n      },\n      mode: browserMode,\n      cdpUrl,\n      wsEndpoint,\n      chromePath,\n    });\n  }\n  const page: PageLike = new CompatPage(driver);\n\n  // Capture console output\n  const consoleErrors: string[] = [];\n  const consoleWarnings: string[] = [];\n  page.on?.('console', (msg: { type(): string; text(): string }) => {\n    if (msg.type() === 'error') {\n      consoleErrors.push(msg.text());\n    } else if (msg.type() === 'warning') {\n      consoleWarnings.push(msg.text());\n    }\n  });\n\n  try {\n    // SECURITY: normalize the cookie jar BEFORE applying per-scan cookies.\n    // The warm BrowserPool reuses the EngineDriver across scan() calls;\n    // without an explicit clear on the pool path, scan A's auth cookies\n    // would leak into scan B (whether or not scan B passes its own\n    // cookies — the leak case is \"B inherits A's by passing none\"). The\n    // helper enforces the contract; see `initScanCookies`.\n    await initScanCookies(driver, ownDriver, cookies);\n\n    // Navigate\n    await page.goto(url, {\n      waitUntil: 'domcontentloaded',\n      timeout,\n    });\n\n    // Wait for network idle\n    let networkIdleTimedOut = false;\n    await page.waitForLoadState?.('networkidle', { timeout: patience ?? networkIdleTimeout ?? 10000 }).catch(() => { networkIdleTimedOut = true; });\n\n    // Wait for specific selector if provided\n    let waitForTimedOut = false;\n    if (waitFor) {\n      await page.waitForSelector(waitFor, { timeout: patience ?? networkIdleTimeout ?? 10000 }).catch(() => { waitForTimedOut = true; });\n    }\n\n    // Wait for SPA hydration (React/Next.js/Vue). Prevents \"0 elements\" on unhydrated shells.\n    // Uses marker detection + AX tree stability polling.\n    let hydrationTimedOut = false;\n    let hydrationReason = 'skipped';\n    if (hydrationStrategy !== 'none') {\n      const shouldWaitForHydration = hydrationStrategy === 'stable' || await detectSPAFramework(driver);\n      if (shouldWaitForHydration) {\n        const hydrationResult = await waitForHydration(\n          driver.connection,\n          () => driver.getSnapshot(),\n          (expr: string) => driver.evaluate(expr),\n          {\n            timeout: patience ?? 8000,\n            stableTime: 500,\n            minElements: 1,\n            settleTime: 200,\n          },\n        );\n        hydrationTimedOut = hydrationResult.timedOut;\n        hydrationReason = hydrationResult.reason;\n      }\n    }\n\n    // Run all analyses in parallel where possible\n    const [elements, interactivity, semantic, coverage, themeAnalysis] = await Promise.all([\n      extractAndAudit(page, resolvedViewport),\n      testInteractivity(page),\n      getSemanticOutput(page),\n      driver.getCoverage().catch(() => undefined),\n      analyzeThemeConsistency(page).catch(() => undefined),\n    ]);\n\n    // Capture screenshot if requested\n    if (screenshot) {\n      await page.screenshot({\n        path: screenshot.path,\n        fullPage: screenshot.fullPage ?? true,\n      });\n    }\n\n    // Extract route from URL\n    let route: string;\n    try {\n      route = new URL(url).pathname;\n    } catch {\n      route = url;\n    }\n\n    // Detect layout collisions in extracted elements\n    const layoutCollisions = detectLayoutCollisions(elements.all);\n\n    // Aggregate issues\n    const issues = aggregateIssues(elements.audit, interactivity, semantic, consoleErrors, themeAnalysis);\n\n    // Run design system check and inject violations into issues\n    const designSystem = await applyDesignSystemCheck(\n      elements.all,\n      issues,\n      resolvedViewport,\n      url,\n      options.outputDir || process.cwd()\n    );\n\n    const verdict = determineVerdict(issues);\n    const summary = generateSummary(elements, interactivity, semantic, issues, consoleErrors);\n\n    // Extract live CSS rules + document meta for the typography, breakpoints,\n    // motion, hierarchy, and interaction-states sensors. Best-effort — on\n    // failure (e.g. browser detach), sensors degrade to empty results.\n    let cssExtract: Awaited<ReturnType<typeof extractCssRulesAndMeta>> | undefined;\n    try {\n      cssExtract = await extractCssRulesAndMeta(page);\n    } catch {\n      cssExtract = undefined;\n    }\n\n    // Run sensor layer — condense raw elements into model-friendly summaries.\n    // Merge structuralElements (headings/landmarks/text-bearing tags with\n    // typography fields) into the sensor input WITHOUT touching elements.all\n    // or scan.elements — those remain the existing interactive-only payload.\n    const sensorElements = cssExtract\n      ? [...elements.all, ...cssExtract.structuralElements]\n      : elements.all;\n    const sensors = runSensors({\n      elements: sensorElements,\n      interactivity,\n      semantic,\n      url,\n      viewport: resolvedViewport,\n      ...(cssExtract ? { cssRules: cssExtract.cssRules, documentMeta: cssExtract.documentMeta } : {}),\n    });\n\n    // Run deterministic rule engine\n    const ruleContext = {\n      isMobile: resolvedViewport.width < 768,\n      viewportWidth: resolvedViewport.width,\n      viewportHeight: resolvedViewport.height,\n      url,\n      allElements: elements.all,\n    };\n    const ruleEngine = runAllRules(elements.all, ruleContext);\n\n    // Run preset rule engine if --rules flag was provided\n    if (rulePresets && rulePresets.length > 0) {\n      // Build in-memory config equivalent to .ibr/rules.json { extends: [...], rules: {} }\n      const presetConfig: RulesConfig = { extends: rulePresets, rules: {} };\n      const presetViolations = runRules(elements.all, ruleContext as PresetRuleContext, presetConfig);\n      // Inject preset violations into issues so they appear in the standard output\n      for (const v of presetViolations) {\n        issues.push({\n          category: 'interactivity' as const,\n          severity: v.severity === 'error' ? 'error' : 'warning',\n          element: v.element,\n          description: `[${v.ruleId}] ${v.message}`,\n          fix: v.fix,\n        });\n      }\n    }\n\n    // Generate condensed summaries\n    const summaries = summarizeScan(elements.all, url);\n\n    const baseResult = {\n      url,\n      route,\n      timestamp: new Date().toISOString(),\n      viewport: resolvedViewport,\n      elements,\n      interactivity,\n      semantic,\n      sensors,\n      ruleEngine,\n      summaries,\n      console: {\n        errors: consoleErrors,\n        warnings: consoleWarnings,\n      },\n      coverage,\n      layoutCollisions,\n      themeAnalysis,\n      designSystem,\n      hydration: hydrationReason !== 'skipped'\n        ? { timedOut: hydrationTimedOut, reason: hydrationReason }\n        : undefined,\n      verdict,\n      issues,\n      summary,\n    };\n\n    if (patience && (networkIdleTimedOut || waitForTimedOut)) {\n      return {\n        ...baseResult,\n        verdict: 'PARTIAL' as const,\n        partialReason: `Page still loading after ${patience}ms — ${networkIdleTimedOut ? 'network still active' : 'selector not found'}. Re-scan when content has loaded.`,\n      };\n    }\n\n    return baseResult;\n  } finally {\n    if (ownDriver) {\n      await driver.close();\n    } else if (options.pool) {\n      options.pool.release();\n    }\n  }\n}\n\n/**\n * Detect if the page is running a known SPA framework (React, Next.js, Vue, Nuxt).\n * Used by the 'auto' hydration strategy to skip the stability wait on static pages.\n * Returns false on evaluation error — non-SPA behavior preserved.\n */\nasync function detectSPAFramework(driver: EngineDriver): Promise<boolean> {\n  try {\n    const result = await driver.evaluate(`\n      !!(window.__NEXT_DATA__ || window.__REACT_DEVTOOLS_GLOBAL_HOOK__ ||\n         window.__NUXT__ || window.__VUE_DEVTOOLS_GLOBAL_HOOK__ ||\n         document.querySelector('[data-reactroot]') ||\n         document.querySelector('#__next'))\n    `);\n    return result === true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Extract elements and run audit.\n * Exported for use by LiveSession.scanPage() — runs against any Playwright page.\n */\nexport async function extractAndAudit(\n  page: PageLike,\n  viewport: Viewport\n): Promise<{ all: EnhancedElement[]; audit: AuditResult }> {\n  const isMobile = viewport.width < 768;\n  const elements = await extractInteractiveElements(page);\n  const audit = analyzeElements(elements, isMobile);\n  return { all: elements, audit };\n}\n\n/**\n * Aggregate issues from all analysis sources into a unified list.\n * Exported for use by LiveSession.scanPage().\n */\nexport function aggregateIssues(\n  audit: AuditResult,\n  interactivity: InteractivityResult,\n  semantic: SemanticResult,\n  consoleErrors: string[],\n  themeAnalysis?: ThemeAnalysis\n): ScanIssue[] {\n  const collector = new IssueCollector();\n\n  // Element audit issues\n  collector.addFrom('interactivity', audit.issues.map(i => ({\n    severity: i.severity,\n    message: i.message,\n    type: i.type,\n  })), item => item.type === 'MISSING_ARIA_LABEL' ? 'accessibility' : 'interactivity');\n\n  // Interactivity issues (deduplicate with audit)\n  const auditMessages = new Set(audit.issues.map(i => i.message));\n  const interactivityFiltered = interactivity.issues.filter(i => !auditMessages.has(i.description));\n  collector.addFrom('interactivity', interactivityFiltered.map(i => ({\n    severity: i.severity,\n    description: i.description,\n    element: i.element,\n    type: i.type,\n    fix: getFixSuggestion(i.type),\n  })), item => item.type === 'MISSING_LABEL' ? 'accessibility' : 'interactivity');\n\n  // Semantic issues\n  collector.addFrom('semantic', semantic.issues.map(i => ({\n    severity: i.severity,\n    problem: i.problem,\n  })));\n\n  // Theme mismatch\n  collector.addThemeAnalysis(themeAnalysis);\n\n  // Console errors\n  collector.addConsoleErrors(consoleErrors);\n\n  return collector.getIssues();\n}\n\n/**\n * Run design system checks and inject violations into the issues array.\n * Reusable across all scan paths (main scan, live session, browser server, native).\n * Returns DesignSystemResult or undefined if no config exists.\n * Mutates the issues array by pushing design-system category issues.\n */\nexport async function applyDesignSystemCheck(\n  elements: EnhancedElement[],\n  issues: ScanIssue[],\n  viewport: Viewport,\n  url: string,\n  outputDir: string\n): Promise<DesignSystemResult | undefined> {\n  const designSystem = await runDesignSystemCheck(\n    elements,\n    {\n      isMobile: viewport.width < 768,\n      viewportWidth: viewport.width,\n      viewportHeight: viewport.height,\n      url,\n      allElements: elements,\n    },\n    outputDir\n  ).catch(() => undefined);\n\n  if (designSystem) {\n    for (const v of designSystem.principleViolations) {\n      issues.push({\n        category: 'design-system' as const,\n        severity: v.severity === 'error' ? 'error' as const : 'warning' as const,\n        element: v.element,\n        description: v.message,\n        fix: v.fix,\n      });\n    }\n    for (const v of designSystem.tokenViolations) {\n      issues.push({\n        category: 'design-system' as const,\n        severity: v.severity === 'error' ? 'error' as const : 'warning' as const,\n        element: v.element,\n        description: v.message,\n      });\n    }\n    for (const v of designSystem.customViolations) {\n      issues.push({\n        category: 'design-system' as const,\n        severity: v.severity === 'error' ? 'error' as const : 'warning' as const,\n        element: v.element,\n        description: v.message,\n        fix: v.fix,\n      });\n    }\n  }\n\n  return designSystem;\n}\n\n/**\n * Determine overall verdict from issues.\n * Exported for use by LiveSession.scanPage().\n */\nexport function determineVerdict(issues: ScanIssue[]): 'PASS' | 'ISSUES' | 'FAIL' {\n  const errorCount = issues.filter(i => i.severity === 'error').length;\n  const warningCount = issues.filter(i => i.severity === 'warning').length;\n\n  if (errorCount >= 3) return 'FAIL';\n  if (errorCount > 0 || warningCount >= 5) return 'ISSUES';\n  return 'PASS';\n}\n\n/**\n * Generate human-readable summary.\n * Exported for use by LiveSession.scanPage().\n */\nexport function generateSummary(\n  elements: { all: EnhancedElement[]; audit: AuditResult },\n  interactivity: InteractivityResult,\n  semantic: SemanticResult,\n  issues: ScanIssue[],\n  consoleErrors: string[]\n): string {\n  const parts: string[] = [];\n\n  // Page type\n  parts.push(`${semantic.pageIntent.intent} page`);\n\n  // Element counts\n  parts.push(`${elements.audit.totalElements} elements (${elements.audit.interactiveCount} interactive)`);\n\n  // Interactivity\n  const { buttons, links, forms } = interactivity;\n  const interactiveParts: string[] = [];\n  if (buttons.length > 0) interactiveParts.push(`${buttons.length} buttons`);\n  if (links.length > 0) interactiveParts.push(`${links.length} links`);\n  if (forms.length > 0) interactiveParts.push(`${forms.length} forms`);\n  if (interactiveParts.length > 0) {\n    parts.push(interactiveParts.join(', '));\n  }\n\n  // Handler coverage\n  if (interactivity.summary.withoutHandlers > 0) {\n    parts.push(`${interactivity.summary.withoutHandlers} elements without handlers`);\n  }\n\n  // Auth state\n  if (semantic.state.auth.authenticated) {\n    parts.push('authenticated');\n  }\n\n  // Loading\n  if (semantic.state.loading.loading) {\n    parts.push(`loading (${semantic.state.loading.type})`);\n  }\n\n  // Errors\n  if (semantic.state.errors.hasErrors) {\n    parts.push(`${semantic.state.errors.errors.length} page errors`);\n  }\n\n  // Console errors\n  if (consoleErrors.length > 0) {\n    parts.push(`${consoleErrors.length} console errors`);\n  }\n\n  // Issues summary\n  const errorCount = issues.filter(i => i.severity === 'error').length;\n  const warningCount = issues.filter(i => i.severity === 'warning').length;\n  if (errorCount > 0 || warningCount > 0) {\n    const issueParts = [];\n    if (errorCount > 0) issueParts.push(`${errorCount} errors`);\n    if (warningCount > 0) issueParts.push(`${warningCount} warnings`);\n    parts.push(issueParts.join(', '));\n  }\n\n  return parts.join(', ');\n}\n\n/**\n * Get fix suggestion for common issue types\n */\nfunction getFixSuggestion(type: string): string | undefined {\n  switch (type) {\n    case 'NO_HANDLER':\n      return 'Add an onClick handler or remove the interactive appearance';\n    case 'PLACEHOLDER_LINK':\n      return 'Add a real href or an onClick handler';\n    case 'MISSING_LABEL':\n      return 'Add aria-label or visible text content';\n    case 'FORM_NO_SUBMIT':\n      return 'Add a submit handler or action attribute to the form';\n    case 'ORPHAN_SUBMIT':\n      return 'Ensure the submit button is inside a form';\n    case 'SMALL_TOUCH_TARGET':\n      return 'Increase element size to at least 44x44px for touch targets';\n    default:\n      return undefined;\n  }\n}\n\n/**\n * R3: suppress \"Page intent: unknown (< 30% confidence)\" noise.\n * The condition was duplicated in scan.ts and tools.ts; single source here.\n * Returns true when the intent line carries zero information.\n */\nexport function isIntentNoise(intent: string, confidence: number): boolean {\n  return intent === 'unknown' && confidence < 0.3;\n}\n\n/**\n * Format scan result for console output\n */\nexport function formatScanResult(result: ScanResult): string {\n  const lines: string[] = [];\n\n  const verdictIcon = result.verdict === 'PASS' ? '\\x1b[32m✓\\x1b[0m' :\n                      result.verdict === 'ISSUES' ? '\\x1b[33m!\\x1b[0m' :\n                      result.verdict === 'PARTIAL' ? '\\x1b[33m~\\x1b[0m' :\n                      '\\x1b[31m✗\\x1b[0m';\n\n  lines.push('═══════════════════════════════════════════════════════');\n  lines.push('  IBR UI SCAN');\n  lines.push('═══════════════════════════════════════════════════════');\n  lines.push('');\n  lines.push(`  URL:      ${result.url}`);\n  lines.push(`  Route:    ${result.route}`);\n  lines.push(`  Viewport: ${result.viewport.name} (${result.viewport.width}x${result.viewport.height})`);\n  lines.push(`  Verdict:  ${verdictIcon} ${result.verdict}`);\n  lines.push('');\n\n  // Summary line\n  lines.push(`  ${result.summary}`);\n  lines.push('');\n\n  // Semantic\n  lines.push('  PAGE UNDERSTANDING');\n  lines.push('  ─────────────────');\n  // R3: suppress the \"Intent: unknown (0% confidence)\" line that pervades\n  // localhost scans. It carries zero information when the classifier\n  // couldn't decide AND its score is near floor. Other intents — even\n  // medium-confidence ones — still surface.\n  const intent = result.semantic.pageIntent.intent;\n  const intentConfidence = result.semantic.confidence;\n  if (!isIntentNoise(intent, intentConfidence)) {\n    lines.push(`  Intent:   ${intent} (${(intentConfidence * 100).toFixed(0)}% confidence)`);\n  }\n  lines.push(`  Auth:     ${result.semantic.state.auth.authenticated ? 'Authenticated' : 'Not authenticated'}`);\n  lines.push(`  Loading:  ${result.semantic.state.loading.loading ? result.semantic.state.loading.type : 'Complete'}`);\n  lines.push(`  Errors:   ${result.semantic.state.errors.hasErrors ? result.semantic.state.errors.errors.map(e => e.message).join(', ') : 'None'}`);\n  lines.push('');\n\n  // Elements\n  lines.push('  ELEMENTS');\n  lines.push('  ────────');\n  lines.push(`  Total:              ${result.elements.audit.totalElements}`);\n  lines.push(`  Interactive:        ${result.elements.audit.interactiveCount}`);\n  lines.push(`  With handlers:      ${result.elements.audit.withHandlers}`);\n  lines.push(`  Without handlers:   ${result.elements.audit.withoutHandlers}`);\n  lines.push('');\n\n  // Interactivity breakdown\n  const { buttons, links, forms } = result.interactivity;\n  lines.push('  INTERACTIVITY');\n  lines.push('  ─────────────');\n  lines.push(`  Buttons: ${buttons.length}  Links: ${links.length}  Forms: ${forms.length}`);\n\n  if (forms.length > 0) {\n    for (const form of forms) {\n      const icon = form.hasSubmitHandler ? '✓' : '✗';\n      lines.push(`    ${icon} Form ${form.selector}: ${form.fields.length} fields${form.hasValidation ? ', validated' : ''}`);\n    }\n  }\n  lines.push('');\n\n  // Console\n  if (result.console.errors.length > 0 || result.console.warnings.length > 0) {\n    lines.push('  CONSOLE');\n    lines.push('  ───────');\n    if (result.console.errors.length > 0) {\n      lines.push(`  Errors: ${result.console.errors.length}`);\n      for (const err of result.console.errors.slice(0, 3)) {\n        lines.push(`    ✗ ${err.slice(0, 100)}`);\n      }\n    }\n    if (result.console.warnings.length > 0) {\n      lines.push(`  Warnings: ${result.console.warnings.length}`);\n    }\n    lines.push('');\n  }\n\n  // Layout collisions\n  if (result.layoutCollisions?.hasCollisions) {\n    const { collisions } = result.layoutCollisions;\n    lines.push('  LAYOUT');\n    lines.push('  ──────');\n    lines.push(`  Collisions: ${collisions.length}`);\n    for (const c of collisions) {\n      const overlapPx = Math.round(Math.sqrt(c.overlapArea));\n      const pct = Math.round(c.overlapPercent);\n      const t1 = c.element1.text.slice(0, 30);\n      const t2 = c.element2.text.slice(0, 30);\n      lines.push(`    \\x1b[31m✗\\x1b[0m \"${t1}\" overlaps \"${t2}\" by ${pct}% (${overlapPx}px overlap)`);\n    }\n    lines.push('');\n  }\n\n  // Issues\n  if (result.issues.length > 0) {\n    lines.push('  ISSUES');\n    lines.push('  ──────');\n    for (const issue of result.issues) {\n      const icon = issue.severity === 'error' ? '\\x1b[31m✗\\x1b[0m' :\n                   issue.severity === 'warning' ? '\\x1b[33m!\\x1b[0m' : 'ℹ';\n      lines.push(`  ${icon} [${issue.category}] ${issue.description}`);\n      if (issue.fix) {\n        lines.push(`    → ${issue.fix}`);\n      }\n    }\n  } else {\n    lines.push('  No issues detected.');\n  }\n\n  if (result.verdict === 'PARTIAL' && result.partialReason) {\n    lines.push('');\n    lines.push('  PARTIAL SCAN');\n    lines.push('  ────────────');\n    lines.push(`  \\x1b[33m!\\x1b[0m ${result.partialReason}`);\n    lines.push('  Re-scan when the page has finished loading.');\n  }\n\n  lines.push('');\n  lines.push('═══════════════════════════════════════════════════════');\n\n  return lines.join('\\n');\n}\n","import { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport type { SimulatorDevice } from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Parse runtime string to platform\n * e.g., \"com.apple.CoreSimulator.SimRuntime.iOS-18-0\" → \"ios\"\n *       \"com.apple.CoreSimulator.SimRuntime.watchOS-11-0\" → \"watchos\"\n */\nfunction parseRuntime(runtime: string): 'ios' | 'watchos' {\n  if (/watchOS/i.test(runtime)) return 'watchos';\n  return 'ios';\n}\n\n/**\n * List all available simulator devices\n */\nexport async function listDevices(): Promise<SimulatorDevice[]> {\n  const { stdout } = await execFileAsync('xcrun', ['simctl', 'list', 'devices', '--json']);\n  const data = JSON.parse(stdout);\n  const devices: SimulatorDevice[] = [];\n\n  for (const [runtime, deviceList] of Object.entries(data.devices)) {\n    if (!Array.isArray(deviceList)) continue;\n    for (const dev of deviceList as Array<Record<string, unknown>>) {\n      devices.push({\n        udid: dev.udid as string,\n        name: dev.name as string,\n        state: dev.state as SimulatorDevice['state'],\n        runtime,\n        platform: parseRuntime(runtime),\n        isAvailable: dev.isAvailable as boolean,\n      });\n    }\n  }\n\n  return devices;\n}\n\n/**\n * Find a device by name fragment or exact UDID\n * Prioritizes booted devices, then available ones\n */\nexport async function findDevice(nameOrUdid: string): Promise<SimulatorDevice | null> {\n  const devices = await listDevices();\n  const search = nameOrUdid.toLowerCase();\n\n  // Exact UDID match\n  const byUdid = devices.find(d => d.udid.toLowerCase() === search);\n  if (byUdid) return byUdid;\n\n  // Name fragment match — prioritize booted, then available\n  const matches = devices\n    .filter(d => d.name.toLowerCase().includes(search) && d.isAvailable)\n    .sort((a, b) => {\n      // Booted first\n      if (a.state === 'Booted' && b.state !== 'Booted') return -1;\n      if (b.state === 'Booted' && a.state !== 'Booted') return 1;\n      return 0;\n    });\n\n  return matches[0] || null;\n}\n\n/**\n * Get all currently booted simulator devices\n */\nexport async function getBootedDevices(): Promise<SimulatorDevice[]> {\n  const devices = await listDevices();\n  return devices.filter(d => d.state === 'Booted');\n}\n\n/**\n * Boot a simulator device if not already running\n */\nexport async function bootDevice(udid: string): Promise<void> {\n  const devices = await listDevices();\n  const device = devices.find(d => d.udid === udid);\n\n  if (!device) {\n    throw new Error(`Device not found: ${udid}`);\n  }\n\n  if (device.state === 'Booted') {\n    return; // Already running\n  }\n\n  await execFileAsync('xcrun', ['simctl', 'boot', udid]);\n\n  // Wait briefly for boot to register\n  await new Promise(resolve => setTimeout(resolve, 2000));\n}\n\n/**\n * Format device info for display\n */\nexport function formatDevice(device: SimulatorDevice): string {\n  const runtimeVersion = device.runtime\n    .replace(/^.*SimRuntime\\./, '')\n    .replace(/-/g, '.');\n  const stateIcon = device.state === 'Booted' ? '\\x1b[32m●\\x1b[0m' : '\\x1b[90m○\\x1b[0m';\n  return `${stateIcon} ${device.name} (${runtimeVersion}) [${device.udid.slice(0, 8)}...]`;\n}\n","import type { Viewport } from '../schemas.js';\nimport type { SimulatorDevice } from './types.js';\n\n/**\n * Native device viewport dimensions in points\n * These match the logical (non-Retina) dimensions used by simulators\n */\nexport const NATIVE_VIEWPORTS: Record<string, Viewport> = {\n  // iPhone 16 series\n  'iphone-16': { name: 'iphone-16', width: 393, height: 852 },\n  'iphone-16-plus': { name: 'iphone-16-plus', width: 430, height: 932 },\n  'iphone-16-pro': { name: 'iphone-16-pro', width: 402, height: 874 },\n  'iphone-16-pro-max': { name: 'iphone-16-pro-max', width: 440, height: 956 },\n\n  // Apple Watch Series 10\n  'watch-series-10-42mm': { name: 'watch-series-10-42mm', width: 176, height: 215 },\n  'watch-series-10-46mm': { name: 'watch-series-10-46mm', width: 198, height: 242 },\n\n  // Apple Watch Ultra 2\n  'watch-ultra-2-49mm': { name: 'watch-ultra-2-49mm', width: 205, height: 251 },\n} as const;\n\n/**\n * Map of device name patterns to viewport keys\n */\nconst DEVICE_NAME_PATTERNS: Array<[RegExp, string]> = [\n  [/iPhone 16 Pro Max/i, 'iphone-16-pro-max'],\n  [/iPhone 16 Pro/i, 'iphone-16-pro'],\n  [/iPhone 16 Plus/i, 'iphone-16-plus'],\n  [/iPhone 16/i, 'iphone-16'],\n  [/Apple Watch.*Ultra.*49/i, 'watch-ultra-2-49mm'],\n  [/Apple Watch.*46/i, 'watch-series-10-46mm'],\n  [/Apple Watch.*42/i, 'watch-series-10-42mm'],\n  // Fallbacks for generic watch/phone\n  [/Apple Watch Ultra/i, 'watch-ultra-2-49mm'],\n  [/Apple Watch/i, 'watch-series-10-42mm'],\n  [/iPhone/i, 'iphone-16-pro'],\n];\n\n/**\n * Get the viewport dimensions for a simulator device\n * Falls back to reasonable defaults based on platform\n */\nexport function getDeviceViewport(device: SimulatorDevice): Viewport {\n  // Try to match by device name\n  for (const [pattern, key] of DEVICE_NAME_PATTERNS) {\n    if (pattern.test(device.name)) {\n      return NATIVE_VIEWPORTS[key];\n    }\n  }\n\n  // Fallback by platform\n  if (device.platform === 'watchos') {\n    return NATIVE_VIEWPORTS['watch-series-10-42mm'];\n  }\n\n  return NATIVE_VIEWPORTS['iphone-16-pro'];\n}\n","import { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport { mkdir } from 'fs/promises';\nimport { dirname } from 'path';\nimport type { NativeCaptureOptions, NativeCaptureResult } from './types.js';\nimport { getDeviceViewport } from './viewports.js';\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Capture a screenshot from a running simulator\n *\n * Uses `xcrun simctl io <udid> screenshot` to capture the current screen.\n * For watchOS devices, applies --mask=black by default to handle round displays.\n */\nexport async function captureNativeScreenshot(\n  options: NativeCaptureOptions\n): Promise<NativeCaptureResult> {\n  const { device, outputPath, mask } = options;\n  const start = Date.now();\n\n  try {\n    // Ensure output directory exists\n    await mkdir(dirname(outputPath), { recursive: true });\n\n    // Build command args\n    const args = ['simctl', 'io', device.udid, 'screenshot', '--type=png'];\n\n    // Apply mask for watchOS (round display) or if explicitly requested\n    const effectiveMask = mask ?? (device.platform === 'watchos' ? 'black' : undefined);\n    if (effectiveMask) {\n      args.push(`--mask=${effectiveMask}`);\n    }\n\n    args.push(outputPath);\n\n    await execFileAsync('xcrun', args, { timeout: 15000 });\n\n    const viewport = getDeviceViewport(device);\n\n    return {\n      success: true,\n      outputPath,\n      device,\n      viewport,\n      timing: Date.now() - start,\n    };\n  } catch (err) {\n    return {\n      success: false,\n      device,\n      viewport: getDeviceViewport(device),\n      timing: Date.now() - start,\n      error: err instanceof Error ? err.message : 'Screenshot capture failed',\n    };\n  }\n}\n","/**\n * Shared AX role mapping utilities for native element extraction.\n *\n * Used by both simulator (extract.ts) and macOS (macos.ts) pipelines.\n */\n\nconst TAG_MAP: Record<string, string> = {\n  'AXButton': 'button',\n  'AXLink': 'a',\n  'AXTextField': 'input',\n  'AXTextArea': 'textarea',\n  'AXSecureTextField': 'input',\n  'AXStaticText': 'span',\n  'AXImage': 'img',\n  'AXGroup': 'div',\n  'AXSplitGroup': 'div',\n  'AXList': 'ul',\n  'AXCell': 'li',\n  'AXTable': 'table',\n  'AXScrollArea': 'div',\n  'AXToolbar': 'nav',\n  'AXMenuBar': 'nav',\n  'AXMenu': 'nav',\n  'AXMenuItem': 'li',\n  'AXCheckBox': 'input',\n  'AXRadioButton': 'input',\n  'AXSlider': 'input',\n  'AXSwitch': 'input',\n  'AXPopUpButton': 'select',\n  'AXComboBox': 'select',\n  'AXTabGroup': 'div',\n  'AXTab': 'button',\n  'AXNavigationBar': 'nav',\n  'AXHeader': 'header',\n  'AXWindow': 'main',\n};\n\nconst ARIA_MAP: Record<string, string> = {\n  'AXButton': 'button',\n  'AXLink': 'link',\n  'AXTextField': 'textbox',\n  'AXTextArea': 'textbox',\n  'AXSecureTextField': 'textbox',\n  'AXStaticText': 'text',\n  'AXImage': 'img',\n  'AXGroup': 'group',\n  'AXList': 'list',\n  'AXCell': 'listitem',\n  'AXTable': 'table',\n  'AXCheckBox': 'checkbox',\n  'AXRadioButton': 'radio',\n  'AXSlider': 'slider',\n  'AXSwitch': 'switch',\n  'AXTab': 'tab',\n  'AXTabGroup': 'tablist',\n  'AXNavigationBar': 'navigation',\n  'AXToolbar': 'toolbar',\n  'AXMenuItem': 'menuitem',\n  'AXMenu': 'menu',\n  'AXScrollArea': 'scrollbar',\n  'AXWindow': 'main',\n};\n\nconst INTERACTIVE_ROLES = new Set([\n  'AXButton',\n  'AXLink',\n  'AXTextField',\n  'AXTextArea',\n  'AXSecureTextField',\n  'AXCheckBox',\n  'AXRadioButton',\n  'AXSlider',\n  'AXSwitch',\n  'AXPopUpButton',\n  'AXComboBox',\n  'AXMenuItem',\n  'AXTab',\n]);\n\n/** Map AX role to HTML-equivalent tag name */\nexport function mapRoleToTag(role: string): string {\n  return TAG_MAP[role] || role.replace(/^AX/, '').toLowerCase();\n}\n\n/** Map AX role to ARIA role */\nexport function mapRoleToAriaRole(role: string): string | null {\n  return ARIA_MAP[role] || null;\n}\n\n/** Check if an AX role represents an interactive element */\nexport function isInteractiveRole(role: string): boolean {\n  return INTERACTIVE_ROLES.has(role);\n}\n","import { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport { existsSync, statSync } from 'fs';\nimport { copyFile, chmod, mkdir } from 'fs/promises';\nimport { join } from 'path';\nimport type { NativeElement } from './types.js';\nimport type { SimulatorDevice } from './types.js';\nimport type { EnhancedElement } from '../schemas.js';\nimport { mapRoleToTag, mapRoleToAriaRole, isInteractiveRole } from './role-map.js';\n\nconst execFileAsync = promisify(execFile);\n\nconst EXTRACTOR_DIR = join(process.cwd(), '.ibr', 'bin');\nconst EXTRACTOR_PATH = join(EXTRACTOR_DIR, 'ibr-ax-extract');\n\n// Resolve Swift source dir: walk up from compiled output (dist/) or source (src/) to package root\n// __dirname works in CJS (which all 3 build targets produce)\nconst SWIFT_SOURCE_DIR = join(__dirname, '..', '..', 'src', 'native', 'swift', 'ibr-ax-extract');\nconst SWIFT_MAIN_PATH = join(SWIFT_SOURCE_DIR, 'Sources', 'main.swift');\nconst SWIFT_PACKAGE_PATH = join(SWIFT_SOURCE_DIR, 'Package.swift');\nconst SWIFT_BUILD_PATH = join(SWIFT_SOURCE_DIR, '.build', 'release', 'ibr-ax-extract');\n\n/**\n * Ensure the Swift AXUIElement extractor is compiled\n * Compiles on first use, then caches at .ibr/bin/ibr-ax-extract\n */\nexport async function ensureExtractor(): Promise<string> {\n  if (existsSync(EXTRACTOR_PATH) && isFileFresh(EXTRACTOR_PATH)) {\n    return EXTRACTOR_PATH;\n  }\n\n  await mkdir(EXTRACTOR_DIR, { recursive: true });\n\n  try {\n    if (!existsSync(SWIFT_BUILD_PATH) || !isFileFresh(SWIFT_BUILD_PATH)) {\n      await buildSwiftExtractor();\n    }\n\n    if (!existsSync(SWIFT_BUILD_PATH)) {\n      throw new Error('Swift build succeeded but binary not found at expected path');\n    }\n\n    await copyFile(SWIFT_BUILD_PATH, EXTRACTOR_PATH);\n    await chmod(EXTRACTOR_PATH, 0o755);\n\n    return EXTRACTOR_PATH;\n  } catch (err) {\n    throw new Error(\n      `Failed to compile Swift extractor: ${err instanceof Error ? err.message : 'Unknown error'}. ` +\n      'Ensure Xcode Command Line Tools are installed: xcode-select --install'\n    );\n  }\n}\n\nasync function buildSwiftExtractor(): Promise<void> {\n  try {\n    await execFileAsync('swift', ['build', '-c', 'release'], {\n      cwd: SWIFT_SOURCE_DIR,\n      timeout: 120000,\n    });\n  } catch {\n    await execFileAsync('swift', ['build', '-c', 'release', '--disable-sandbox'], {\n      cwd: SWIFT_SOURCE_DIR,\n      timeout: 120000,\n    });\n  }\n}\n\nfunction isFileFresh(path: string): boolean {\n  try {\n    const binaryMtime = statSync(path).mtimeMs;\n    const sourceMtime = Math.max(\n      statSync(SWIFT_MAIN_PATH).mtimeMs,\n      statSync(SWIFT_PACKAGE_PATH).mtimeMs\n    );\n    return binaryMtime >= sourceMtime;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Check if the Swift extractor is available (compiled or can be compiled)\n */\nexport function isExtractorAvailable(): boolean {\n  if (existsSync(EXTRACTOR_PATH)) return true;\n  // Check if Swift source exists for compilation\n  return existsSync(join(SWIFT_SOURCE_DIR, 'Package.swift'));\n}\n\n/**\n * Extract native accessibility elements from a running simulator\n *\n * Uses the compiled Swift CLI to walk the Simulator.app's accessibility tree\n * via AXUIElementCreateApplication.\n */\nexport async function extractNativeElements(\n  device: SimulatorDevice\n): Promise<NativeElement[]> {\n  const extractorPath = await ensureExtractor();\n\n  try {\n    const { stdout } = await execFileAsync(extractorPath, [\n      '--device-name', device.name,\n    ], {\n      timeout: 30000,\n    });\n\n    const elements: NativeElement[] = JSON.parse(stdout);\n    return elements;\n  } catch (err) {\n    // Graceful degradation — return empty if extraction fails\n    const message = err instanceof Error ? err.message : 'Unknown error';\n    if (message.includes('permission') || message.includes('accessibility')) {\n      throw new Error(\n        'Accessibility permission required. Grant Terminal/IDE access in ' +\n        'System Settings > Privacy & Security > Accessibility'\n      );\n    }\n    throw new Error(`Element extraction failed: ${message}`);\n  }\n}\n\n/**\n * Map native accessibility elements to IBR's EnhancedElement format\n *\n * This allows reuse of existing analyzeElements() from src/extract.ts.\n */\nexport function mapToEnhancedElements(nativeElements: NativeElement[]): EnhancedElement[] {\n  const enhanced: EnhancedElement[] = [];\n\n  function flatten(elements: NativeElement[], depth = 0): void {\n    for (const el of elements) {\n      // Map AX role to HTML-equivalent tag\n      const tagName = mapRoleToTag(el.role);\n\n      // Determine if the element is interactive\n      const isInteractive = isInteractiveRole(el.role) && el.isEnabled;\n\n      enhanced.push({\n        selector: el.identifier || `[role=\"${el.role}\"][label=\"${el.label}\"]`,\n        tagName,\n        text: el.label || undefined,\n        bounds: {\n          x: el.frame.x,\n          y: el.frame.y,\n          width: el.frame.width,\n          height: el.frame.height,\n        },\n        interactive: {\n          hasOnClick: isInteractive,\n          hasHref: false,\n          isDisabled: !el.isEnabled,\n          tabIndex: isInteractive ? 0 : -1,\n          cursor: isInteractive ? 'pointer' : 'default',\n        },\n        a11y: {\n          role: mapRoleToAriaRole(el.role),\n          ariaLabel: el.label || null,\n          ariaDescribedBy: null,\n        },\n      });\n\n      // Recurse into children\n      if (el.children.length > 0) {\n        flatten(el.children, depth + 1);\n      }\n    }\n  }\n\n  flatten(nativeElements);\n  return enhanced;\n}\n","import type { EnhancedElement, ElementIssue, Viewport } from '../schemas.js';\n\n/**\n * Run native-specific audit rules on extracted elements\n *\n * These rules supplement the standard web audit with platform-specific checks:\n * - watchOS: max 7 interactive elements per screen\n * - watchOS: no horizontal overflow beyond viewport width\n * - iOS/watchOS: 44pt minimum touch targets (always enforced, not just mobile)\n */\nexport function auditNativeElements(\n  elements: EnhancedElement[],\n  platform: 'ios' | 'watchos',\n  viewport: Viewport\n): ElementIssue[] {\n  const issues: ElementIssue[] = [];\n\n  // Get interactive elements\n  const interactive = elements.filter(\n    e => e.interactive.hasOnClick && !e.interactive.isDisabled\n  );\n\n  // --- watchOS: max 7 interactive elements per screen ---\n  if (platform === 'watchos' && interactive.length > 7) {\n    issues.push({\n      type: 'TOUCH_TARGET_SMALL', // Reuse closest existing type\n      severity: 'warning',\n      message: `watchOS screen has ${interactive.length} interactive elements (recommended max: 7). Reduce choices to avoid cognitive overload on small displays.`,\n    });\n  }\n\n  // --- iOS/watchOS: 44pt touch targets always enforced ---\n  for (const el of interactive) {\n    const minDimension = Math.min(el.bounds.width, el.bounds.height);\n    if (minDimension < 44) {\n      issues.push({\n        type: 'TOUCH_TARGET_SMALL',\n        severity: 'error',\n        message: `Touch target too small: \"${el.text || el.selector}\" is ${el.bounds.width}x${el.bounds.height}pt (minimum: 44x44pt)`,\n      });\n    }\n  }\n\n  // --- watchOS: no horizontal overflow ---\n  if (platform === 'watchos') {\n    for (const el of elements) {\n      const rightEdge = el.bounds.x + el.bounds.width;\n      if (rightEdge > viewport.width) {\n        issues.push({\n          type: 'TOUCH_TARGET_SMALL', // Closest existing type\n          severity: 'warning',\n          message: `Element \"${el.text || el.selector}\" overflows watchOS viewport (right edge: ${rightEdge}pt, viewport width: ${viewport.width}pt)`,\n        });\n      }\n    }\n  }\n\n  // --- Missing accessibility labels on interactive elements ---\n  for (const el of interactive) {\n    if (!el.text && !el.a11y.ariaLabel) {\n      issues.push({\n        type: 'MISSING_ARIA_LABEL',\n        severity: 'error',\n        message: `Interactive element \"${el.selector}\" has no accessibility label`,\n      });\n    }\n  }\n\n  return issues;\n}\n","import { execFile, exec } from 'child_process';\nimport { promisify } from 'util';\nimport { mkdir } from 'fs/promises';\nimport { dirname } from 'path';\nimport type { MacOSAXElement, MacOSWindowInfo } from './types.js';\nimport type { EnhancedElement } from '../schemas.js';\nimport { ensureExtractor } from './extract.js';\nimport { mapRoleToTag, mapRoleToAriaRole, isInteractiveRole } from './role-map.js';\n\nconst execFileAsync = promisify(execFile);\nconst execAsync = promisify(exec);\n\n/**\n * Find the PID of a running macOS app by name or bundle ID\n *\n * Strategy:\n * 1. Try lsappinfo for exact bundle ID match\n * 2. Fall back to the Swift helper's NSWorkspace app lookup\n * 3. Fall back to pgrep for process name match\n */\nexport async function findProcess(appNameOrBundleId: string): Promise<number> {\n  // Try lsappinfo for bundle ID\n  try {\n    const { stdout } = await execAsync(\n      `lsappinfo info -only pid \"${appNameOrBundleId}\" 2>/dev/null || true`\n    );\n    const pidMatch = stdout.match(/\"pid\"\\s*=\\s*(\\d+)/);\n    if (pidMatch) {\n      return parseInt(pidMatch[1], 10);\n    }\n  } catch {\n    // Not found via lsappinfo\n  }\n\n  // Try NSWorkspace via the Swift helper. This avoids pgrep/sysmond restrictions\n  // in sandboxed agent environments and matches the extractor's app lookup.\n  try {\n    const extractorPath = await ensureExtractor();\n    const { stdout } = await execFileAsync(extractorPath, ['--resolve-app', appNameOrBundleId], {\n      timeout: 10000,\n    });\n    const resolved = JSON.parse(stdout) as { pid?: number };\n    if (typeof resolved.pid === 'number' && resolved.pid > 0) {\n      return resolved.pid;\n    }\n  } catch {\n    // Not found via NSWorkspace\n  }\n\n  // Try pgrep for process name\n  try {\n    const { stdout } = await execAsync(\n      `pgrep -f \"${appNameOrBundleId}\" 2>/dev/null | head -1`\n    );\n    const pid = parseInt(stdout.trim(), 10);\n    if (!isNaN(pid) && pid > 0) {\n      return pid;\n    }\n  } catch {\n    // Not found via pgrep\n  }\n\n  throw new Error(\n    `No running process found for \"${appNameOrBundleId}\". ` +\n    'Ensure the app is running and try again.'\n  );\n}\n\n/**\n * Extract native AX elements from a running macOS app via the Swift CLI\n *\n * Returns the parsed elements and window metadata.\n */\nexport async function extractMacOSElements(options: {\n  pid?: number;\n  app?: string;\n}): Promise<{ elements: MacOSAXElement[]; window: MacOSWindowInfo }> {\n  const extractorPath = await ensureExtractor();\n\n  const args: string[] = [];\n  if (options.pid) {\n    args.push('--pid', String(options.pid));\n  } else if (options.app) {\n    args.push('--app', options.app);\n  } else {\n    throw new Error('Either pid or app must be provided');\n  }\n\n  try {\n    const { stdout, stderr } = await execFileAsync(extractorPath, args, {\n      timeout: 30000,\n    });\n\n    if (stderr && stderr.includes('Error:')) {\n      throw new Error(stderr.trim());\n    }\n\n    // Parse output: first line is WINDOW header, rest is JSON\n    const lines = stdout.split('\\n');\n    const headerLine = lines[0];\n    const jsonStr = lines.slice(1).join('\\n');\n\n    // Parse window header: WINDOW:<id>:<WxH>:<title>\n    let window: MacOSWindowInfo = { windowId: 0, width: 800, height: 600, title: 'Unknown' };\n    if (headerLine.startsWith('WINDOW:')) {\n      const parts = headerLine.slice(7).split(':');\n      const windowId = parseInt(parts[0], 10);\n      const dims = (parts[1] || '800x600').split('x');\n      const title = parts.slice(2).join(':'); // Title may contain colons\n      window = {\n        windowId,\n        width: parseInt(dims[0], 10) || 800,\n        height: parseInt(dims[1], 10) || 600,\n        title,\n      };\n    }\n\n    const elements: MacOSAXElement[] = JSON.parse(jsonStr);\n    return { elements, window };\n  } catch (err) {\n    const message = err instanceof Error ? err.message : 'Unknown error';\n    if (message.includes('Accessibility permission')) {\n      throw new Error(\n        'Accessibility permission required. Grant Terminal/IDE access in ' +\n        'System Settings > Privacy & Security > Accessibility'\n      );\n    }\n    if (message.includes('No running app')) {\n      throw err;\n    }\n    throw new Error(`macOS element extraction failed: ${message}`);\n  }\n}\n\n/**\n * Map macOS AX elements to IBR's EnhancedElement format\n *\n * Flattens the tree depth-first and generates unique selectors\n * from the tree path (e.g., \"AXWindow > AXGroup[0] > AXButton[1]\").\n */\nexport function mapMacOSToEnhancedElements(\n  nativeElements: MacOSAXElement[],\n  parentPath = ''\n): EnhancedElement[] {\n  const enhanced: EnhancedElement[] = [];\n\n  function flatten(elements: MacOSAXElement[], path: string, depth: number): void {\n    const roleCounts: Record<string, number> = {};\n\n    for (const el of elements) {\n      // Build unique path-based selector\n      const roleCount = roleCounts[el.role] || 0;\n      roleCounts[el.role] = roleCount + 1;\n      const currentPath = path\n        ? `${path} > ${el.role}[${roleCount}]`\n        : `${el.role}[${roleCount}]`;\n\n      const tagName = mapRoleToTag(el.role);\n      const isInteractive = isInteractiveRole(el.role) && el.enabled;\n      const hasPress = el.actions.includes('AXPress');\n      const text = el.title || el.description || el.value || undefined;\n\n      // Build bounds from position + size\n      const bounds = {\n        x: el.position?.x ?? 0,\n        y: el.position?.y ?? 0,\n        width: el.size?.width ?? 0,\n        height: el.size?.height ?? 0,\n      };\n\n      // Only include elements with some substance\n      if (bounds.width > 0 || bounds.height > 0 || text || isInteractive || depth <= 1) {\n        enhanced.push({\n          selector: el.identifier || currentPath,\n          tagName,\n          id: el.identifier || undefined,\n          text: text ? text.slice(0, 100) : undefined,\n          bounds,\n          interactive: {\n            hasOnClick: hasPress || isInteractive,\n            hasHref: el.role === 'AXLink',\n            isDisabled: !el.enabled,\n            tabIndex: (el.focused || isInteractive) ? 0 : -1,\n            cursor: isInteractive ? 'pointer' : 'default',\n          },\n          a11y: {\n            role: mapRoleToAriaRole(el.role),\n            ariaLabel: el.title || el.description || null,\n            ariaDescribedBy: null,\n          },\n          sourceHint: el.identifier ? { dataTestId: el.identifier } : undefined,\n        });\n      }\n\n      // Recurse into children\n      if (el.children.length > 0) {\n        flatten(el.children, currentPath, depth + 1);\n      }\n    }\n  }\n\n  flatten(nativeElements, parentPath, 0);\n  return enhanced;\n}\n\n/**\n * Capture a screenshot of a macOS window by its CGWindowID\n *\n * Uses the built-in `screencapture -l <windowID>` command.\n */\nexport async function captureMacOSScreenshot(\n  windowId: number,\n  outputPath: string\n): Promise<void> {\n  await mkdir(dirname(outputPath), { recursive: true });\n  await execFileAsync('screencapture', ['-l', String(windowId), '-x', outputPath], {\n    timeout: 10000,\n  });\n}\n","import type { EnhancedElement } from '../schemas.js';\nimport type {\n  InteractivityResult,\n  ButtonInfo,\n  LinkInfo,\n  FormInfo,\n  InteractivityIssue,\n} from '../interactivity.js';\n\n/**\n * Build an InteractivityResult from extracted native EnhancedElements\n *\n * Since we extract handler/action info from AX attributes (hasOnClick from AXPress),\n * we can build the same interactivity analysis without Playwright.\n */\nexport function buildNativeInteractivity(elements: EnhancedElement[]): InteractivityResult {\n  const buttons: ButtonInfo[] = [];\n  const links: LinkInfo[] = [];\n  const forms: FormInfo[] = [];\n  const issues: InteractivityIssue[] = [];\n\n  for (const el of elements) {\n    const isButton = el.tagName === 'button' || el.a11y.role === 'button';\n    const isLink = el.tagName === 'a' || el.a11y.role === 'link';\n    if (isButton) {\n      const btn: ButtonInfo = {\n        selector: el.selector,\n        tagName: el.tagName,\n        text: el.text,\n        hasHandler: el.interactive.hasOnClick,\n        isDisabled: el.interactive.isDisabled,\n        isVisible: el.bounds.width > 0 && el.bounds.height > 0,\n        a11y: {\n          role: el.a11y.role || undefined,\n          ariaLabel: el.a11y.ariaLabel || undefined,\n          tabIndex: el.interactive.tabIndex,\n        },\n        buttonType: 'button',\n      };\n      buttons.push(btn);\n\n      // Check for issues\n      if (!btn.hasHandler && !btn.isDisabled) {\n        issues.push({\n          type: 'NO_HANDLER',\n          element: el.selector,\n          severity: 'warning',\n          description: `Button \"${el.text || el.selector}\" has no press action`,\n        });\n      }\n\n      if (!el.text && !el.a11y.ariaLabel) {\n        issues.push({\n          type: 'MISSING_LABEL',\n          element: el.selector,\n          severity: 'error',\n          description: `Button has no accessible label (no text or accessibility label)`,\n        });\n      }\n    }\n\n    if (isLink) {\n      const link: LinkInfo = {\n        selector: el.selector,\n        tagName: el.tagName,\n        text: el.text,\n        hasHandler: el.interactive.hasOnClick || el.interactive.hasHref,\n        isDisabled: el.interactive.isDisabled,\n        isVisible: el.bounds.width > 0 && el.bounds.height > 0,\n        a11y: {\n          role: el.a11y.role || undefined,\n          ariaLabel: el.a11y.ariaLabel || undefined,\n          tabIndex: el.interactive.tabIndex,\n        },\n        href: '', // Native links don't have traditional hrefs\n        isPlaceholder: false,\n        opensNewTab: false,\n        isExternal: false,\n      };\n      links.push(link);\n\n      if (!el.text && !el.a11y.ariaLabel) {\n        issues.push({\n          type: 'MISSING_LABEL',\n          element: el.selector,\n          severity: 'error',\n          description: `Link has no accessible label (no text or accessibility label)`,\n        });\n      }\n    }\n\n    // Detect form-like groups: look for clusters of inputs near a button\n    // This is handled below after collecting all elements\n  }\n\n  // Detect form-like patterns: group of inputs followed by a submit-like button\n  const inputs = elements.filter(e =>\n    ['input', 'textarea', 'select'].includes(e.tagName) ||\n    e.a11y.role === 'textbox'\n  );\n\n  if (inputs.length > 0) {\n    // Find the nearest button (likely submit)\n    const submitButton = buttons.find(b =>\n      b.text?.toLowerCase().includes('submit') ||\n      b.text?.toLowerCase().includes('save') ||\n      b.text?.toLowerCase().includes('login') ||\n      b.text?.toLowerCase().includes('sign') ||\n      b.text?.toLowerCase().includes('unlock') ||\n      b.text?.toLowerCase().includes('confirm')\n    );\n\n    if (inputs.length >= 1) {\n      forms.push({\n        selector: 'native-form',\n        hasSubmitHandler: !!submitButton,\n        fields: inputs.map(inp => ({\n          selector: inp.selector,\n          name: inp.id || undefined,\n          type: inp.a11y.role === 'textbox' ? 'text' : inp.tagName,\n          label: inp.a11y.ariaLabel || inp.text || undefined,\n          required: false,\n          hasValidation: false,\n        })),\n        hasValidation: false,\n        submitButton: submitButton,\n      });\n    }\n  }\n\n  // Calculate summary\n  const allInteractive = [...buttons, ...links];\n  const withHandlers = allInteractive.filter(e => e.hasHandler).length;\n\n  return {\n    buttons,\n    links,\n    forms,\n    issues,\n    summary: {\n      totalInteractive: allInteractive.length,\n      withHandlers,\n      withoutHandlers: allInteractive.length - withHandlers,\n      issueCount: {\n        error: issues.filter(i => i.severity === 'error').length,\n        warning: issues.filter(i => i.severity === 'warning').length,\n        info: issues.filter(i => i.severity === 'info').length,\n      },\n    },\n  };\n}\n","import type { EnhancedElement } from '../schemas.js';\nimport type { MacOSWindowInfo } from './types.js';\nimport type { SemanticResult, SemanticVerdict, SemanticIssue } from '../semantic/output.js';\nimport type { PageIntentResult } from '../semantic/page-intent.js';\n\n/**\n * Build a minimal SemanticResult from native app element composition\n *\n * Since we can't run Playwright page.evaluate(), we derive semantic\n * understanding from the extracted elements and window metadata.\n */\nexport function buildNativeSemantic(\n  elements: EnhancedElement[],\n  window: MacOSWindowInfo\n): SemanticResult {\n  const intent = classifyNativeIntent(elements, window.title);\n  const issues: SemanticIssue[] = [];\n\n  // Detect auth state from element composition\n  const hasPasswordField = elements.some(e =>\n    e.a11y.role === 'textbox' && (\n      e.text?.toLowerCase().includes('password') ||\n      e.a11y.ariaLabel?.toLowerCase().includes('password') ||\n      e.selector.toLowerCase().includes('secure')\n    )\n  );\n  const hasLockIcon = elements.some(e =>\n    e.text?.toLowerCase().includes('lock') ||\n    e.a11y.ariaLabel?.toLowerCase().includes('lock')\n  );\n  const hasUnlockButton = elements.some(e =>\n    (e.tagName === 'button' || e.a11y.role === 'button') && (\n      e.text?.toLowerCase().includes('unlock') ||\n      e.text?.toLowerCase().includes('sign in') ||\n      e.text?.toLowerCase().includes('log in')\n    )\n  );\n\n  const isAuthScreen = hasPasswordField || (hasLockIcon && hasUnlockButton);\n\n  // Check for error indicators\n  const errorElements = elements.filter(e =>\n    e.text?.toLowerCase().includes('error') ||\n    e.text?.toLowerCase().includes('failed') ||\n    e.a11y.ariaLabel?.toLowerCase().includes('error')\n  );\n  const hasErrors = errorElements.length > 0;\n\n  if (hasErrors) {\n    for (const el of errorElements.slice(0, 3)) {\n      issues.push({\n        severity: 'major',\n        type: 'error-indicator',\n        problem: `Error detected: \"${el.text || el.a11y.ariaLabel}\"`,\n        fix: 'Investigate the error state in the native app',\n      });\n    }\n  }\n\n  // Determine verdict\n  const verdict: SemanticVerdict = hasErrors ? 'FAIL' : 'PASS';\n\n  // Build available actions from interactive elements\n  const availableActions = elements\n    .filter(e => e.interactive.hasOnClick && !e.interactive.isDisabled && e.text)\n    .slice(0, 10)\n    .map(e => ({\n      action: e.text!.toLowerCase().replace(/\\s+/g, '-'),\n      selector: e.selector,\n      description: e.text!,\n    }));\n\n  // Generate summary\n  const interactive = elements.filter(e => e.interactive.hasOnClick).length;\n  const authSignals: string[] = [];\n  if (hasPasswordField) authSignals.push('password-field');\n  if (hasLockIcon) authSignals.push('lock-icon');\n  if (hasUnlockButton) authSignals.push('unlock-button');\n\n  const summaryParts = [\n    `${intent.intent} window`,\n    `${elements.length} elements (${interactive} interactive)`,\n    isAuthScreen ? 'auth required' : 'ready',\n  ];\n\n  return {\n    verdict,\n    confidence: intent.confidence,\n    pageIntent: intent,\n    state: {\n      auth: {\n        authenticated: isAuthScreen ? false : null,\n        confidence: isAuthScreen ? 0.8 : 0.3,\n        signals: authSignals,\n        socialLoginProviders: [],\n        hasForgotPassword: false,\n        hasSignupLink: false,\n        hasPasswordToggle: false,\n      },\n      loading: {\n        loading: false,\n        type: 'none',\n        elements: 0,\n      },\n      errors: {\n        hasErrors,\n        errors: errorElements.map(e => ({\n          type: 'unknown' as const,\n          message: e.text || 'Error',\n        })),\n        severity: hasErrors ? 'error' as const : 'none' as const,\n      },\n      ready: !hasErrors,\n    },\n    availableActions,\n    issues,\n    summary: summaryParts.join(', '),\n    url: `macos://${window.title}`,\n    title: window.title,\n    timestamp: new Date().toISOString(),\n  };\n}\n\n/**\n * Classify native app intent from element composition\n */\nfunction classifyNativeIntent(\n  elements: EnhancedElement[],\n  windowTitle: string\n): PageIntentResult {\n  const titleLower = windowTitle.toLowerCase();\n\n  // Auth detection\n  const hasPasswordInput = elements.some(e =>\n    e.selector.toLowerCase().includes('secure') ||\n    e.text?.toLowerCase().includes('password')\n  );\n  const hasLoginButton = elements.some(e =>\n    e.tagName === 'button' && (\n      e.text?.toLowerCase().includes('login') ||\n      e.text?.toLowerCase().includes('sign in') ||\n      e.text?.toLowerCase().includes('unlock')\n    )\n  );\n  if (hasPasswordInput || hasLoginButton) {\n    return { intent: 'auth', confidence: 0.9, signals: ['password-field', 'login-button'] };\n  }\n\n  // Settings/preferences → maps to 'form' (closest PageIntent)\n  if (titleLower.includes('settings') || titleLower.includes('preferences')) {\n    return { intent: 'form', confidence: 0.85, signals: ['title-settings'] };\n  }\n\n  // List/table detection\n  const listElements = elements.filter(e =>\n    e.a11y.role === 'list' || e.a11y.role === 'listitem' ||\n    e.tagName === 'ul' || e.tagName === 'li'\n  );\n  if (listElements.length > 3) {\n    return { intent: 'listing', confidence: 0.75, signals: ['list-elements'] };\n  }\n\n  // Form detection\n  const inputElements = elements.filter(e =>\n    e.tagName === 'input' || e.tagName === 'textarea' ||\n    e.a11y.role === 'textbox'\n  );\n  if (inputElements.length >= 2) {\n    return { intent: 'form', confidence: 0.7, signals: ['multiple-inputs'] };\n  }\n\n  // Dashboard detection (many interactive elements, varied types)\n  const interactive = elements.filter(e => e.interactive.hasOnClick).length;\n  if (interactive > 5) {\n    return { intent: 'dashboard', confidence: 0.6, signals: ['many-interactive'] };\n  }\n\n  // Default: detail view (closest PageIntent for general content display)\n  return { intent: 'detail', confidence: 0.5, signals: ['default'] };\n}\n","/**\n * Native layout-fill / gap analyzer.\n *\n * Catches the bug class: a content element rendered narrow and CENTERED inside\n * its container, leaving large empty gutters — invisible to a screenshot, but\n * obvious from element frames. The Swift extractor already captures position +\n * size for every element; this pure function reads that tree and reports, per\n * container, the largest empty horizontal and vertical band as both pixels and\n * % of the container's extent on that axis, plus each element's % of the window.\n *\n * Why TS-side (not Swift-side):\n *   - The Swift extractor's JSON IS the input. The analyzer is unit-testable\n *     against a fixture tree without a live AX subsystem (AX/AppleEvent is\n *     wedged system-wide on this machine as of 2026-06-06; the bug missed by\n *     screenshot-only checks would also be missed if the test had to scan a\n *     live app).\n *   - Convention: IBR's native audit layer (rules.ts, semantic.ts) already\n *     analyzes extracted elements TS-side.\n *\n * Algorithm (per axis, per container):\n *   1. Take laid-out children (width AND height > 1px, both dimensions).\n *   2. Sort by minX (or minY) and merge overlapping spans.\n *   3. Measure the leading gap (container.minX → first span), each between-sibling\n *      gap, and the trailing gap (last span → container.maxX).\n *   4. Take the LARGEST single band (not the sum). Emit a finding when\n *      largest / container.dim >= threshold (default 0.12).\n *\n * The \"largest single band\" choice matters: two ~30% gutters around a centered\n * narrow element sum to ~60% empty, but each band individually is what the\n * design intended to fill OR not. Reporting the largest band is what makes the\n * finding actionable (\"fix the leading band → the centering layout collapses\").\n *\n * Backward-compatible: this is a pure additive module. No existing call sites\n * change shape; scan.ts opts in by calling analyzeLayoutFill().\n */\n\nimport type { MacOSAXElement } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface LayoutFillFinding {\n  /** AX role of the container (e.g. \"AXGroup\", \"AXSplitGroup\") */\n  containerRole: string;\n  /** Best human-readable identifier — title || description || identifier || \"\" */\n  containerLabel: string;\n  axis: 'horizontal' | 'vertical';\n  /** Largest single empty band in points */\n  emptyPx: number;\n  /** Largest single empty band as fraction of container extent on this axis (0..1) */\n  emptyPct: number;\n  /** Where the empty band sits relative to laid-out children */\n  position: 'leading' | 'between' | 'trailing';\n  containerWidth: number;\n  containerHeight: number;\n  /** Pre-formatted message suitable for surfacing as a ScanIssue.description */\n  detail: string;\n}\n\nexport interface LayoutFillOptions {\n  /** Empty band must be ≥ this fraction of container width/height to emit. Default 0.12 */\n  threshold?: number;\n  /** Window bounds for relative-size reporting (optional) */\n  window?: { width: number; height: number };\n  /** Skip containers smaller than this (in points) on the analyzed axis */\n  minContainerPx?: number;\n  /** Maximum recursion depth (defensive) */\n  maxDepth?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\ninterface Rect {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n}\n\nfunction rectOf(el: MacOSAXElement): Rect | null {\n  if (!el.position || !el.size) return null;\n  if (el.size.width <= 0 || el.size.height <= 0) return null;\n  return {\n    x: el.position.x,\n    y: el.position.y,\n    width: el.size.width,\n    height: el.size.height,\n  };\n}\n\nfunction labelOf(el: MacOSAXElement): string {\n  const candidates = [el.title, el.description, el.identifier, el.value];\n  for (const c of candidates) {\n    if (c && c.trim().length > 0) {\n      const trimmed = c.trim();\n      return trimmed.length > 40 ? trimmed.slice(0, 40) + '…' : trimmed;\n    }\n  }\n  return '';\n}\n\n/**\n * Merge overlapping/touching 1-D spans. Input is sorted by .min ascending.\n */\nfunction mergeSpans(spans: Array<[number, number]>): Array<[number, number]> {\n  if (spans.length === 0) return [];\n  const sorted = [...spans].sort((a, b) => a[0] - b[0]);\n  const merged: Array<[number, number]> = [sorted[0]];\n  for (let i = 1; i < sorted.length; i++) {\n    const last = merged[merged.length - 1];\n    const cur = sorted[i];\n    if (cur[0] <= last[1]) {\n      last[1] = Math.max(last[1], cur[1]);\n    } else {\n      merged.push([cur[0], cur[1]]);\n    }\n  }\n  return merged;\n}\n\n/**\n * Find the largest single empty band along an axis given:\n *   container extent [min, max]\n *   laid-out children spans [[min,max], ...] (will be merged internally)\n * Returns the band size in points + its position relative to children.\n * Returns null when there are no children (no gap to report).\n */\nfunction largestEmptyBand(\n  min: number,\n  max: number,\n  spans: Array<[number, number]>\n): { px: number; position: 'leading' | 'between' | 'trailing' } | null {\n  if (spans.length === 0) return null;\n  const merged = mergeSpans(spans);\n  let best: { px: number; position: 'leading' | 'between' | 'trailing' } = {\n    px: 0,\n    position: 'leading',\n  };\n\n  // Leading: container.min → first span.min\n  const leading = merged[0][0] - min;\n  if (leading > best.px) best = { px: leading, position: 'leading' };\n\n  // Between siblings\n  for (let i = 1; i < merged.length; i++) {\n    const gap = merged[i][0] - merged[i - 1][1];\n    if (gap > best.px) best = { px: gap, position: 'between' };\n  }\n\n  // Trailing: last span.max → container.max\n  const lastMax = merged[merged.length - 1][1];\n  const trailing = max - lastMax;\n  if (trailing > best.px) best = { px: trailing, position: 'trailing' };\n\n  return best;\n}\n\nfunction formatDetail(\n  containerRole: string,\n  containerLabel: string,\n  axis: 'horizontal' | 'vertical',\n  position: 'leading' | 'between' | 'trailing',\n  emptyPx: number,\n  emptyPct: number,\n  containerDim: number\n): string {\n  const lbl = containerLabel ? ` [${containerLabel}]` : '';\n  const dimName = axis === 'horizontal' ? 'width' : 'height';\n  return (\n    `${containerRole}${lbl}: ${position} empty band ` +\n    `${Math.round(emptyPx)}px = ${Math.round(emptyPct * 100)}% of ` +\n    `container ${dimName} ${Math.round(containerDim)}px ` +\n    `(${axis})`\n  );\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Analyze an AX element tree for fill / gap violations.\n *\n * Walks the entire tree (depth-first). For every container with laid-out\n * children, emits a LayoutFillFinding for each axis whose largest single empty\n * band ≥ threshold. Containers with no children, zero-size containers, and\n * containers below `minContainerPx` are skipped.\n *\n * Pure function — no I/O, no AX dependency. Testable against a fixture tree.\n */\nexport function analyzeLayoutFill(\n  roots: MacOSAXElement[],\n  options: LayoutFillOptions = {}\n): LayoutFillFinding[] {\n  const threshold = options.threshold ?? 0.12;\n  const minContainerPx = options.minContainerPx ?? 50;\n  const maxDepth = options.maxDepth ?? 20;\n  const findings: LayoutFillFinding[] = [];\n\n  function visit(el: MacOSAXElement, depth: number): void {\n    if (depth >= maxDepth) return;\n\n    const r = rectOf(el);\n    if (r) {\n      // Only consider children with frames (laid-out elements).\n      const laidOutKids = el.children.filter((k) => rectOf(k) !== null);\n\n      if (laidOutKids.length >= 1) {\n        // --- Horizontal axis ---\n        if (r.width >= minContainerPx) {\n          const xSpans: Array<[number, number]> = laidOutKids.map((k) => {\n            const kr = rectOf(k)!;\n            return [kr.x, kr.x + kr.width];\n          });\n          const band = largestEmptyBand(r.x, r.x + r.width, xSpans);\n          if (band && band.px / r.width >= threshold) {\n            const pct = band.px / r.width;\n            findings.push({\n              containerRole: el.role,\n              containerLabel: labelOf(el),\n              axis: 'horizontal',\n              emptyPx: band.px,\n              emptyPct: pct,\n              position: band.position,\n              containerWidth: r.width,\n              containerHeight: r.height,\n              detail: formatDetail(\n                el.role,\n                labelOf(el),\n                'horizontal',\n                band.position,\n                band.px,\n                pct,\n                r.width\n              ),\n            });\n          }\n        }\n\n        // --- Vertical axis ---\n        if (r.height >= minContainerPx) {\n          const ySpans: Array<[number, number]> = laidOutKids.map((k) => {\n            const kr = rectOf(k)!;\n            return [kr.y, kr.y + kr.height];\n          });\n          const band = largestEmptyBand(r.y, r.y + r.height, ySpans);\n          if (band && band.px / r.height >= threshold) {\n            const pct = band.px / r.height;\n            findings.push({\n              containerRole: el.role,\n              containerLabel: labelOf(el),\n              axis: 'vertical',\n              emptyPx: band.px,\n              emptyPct: pct,\n              position: band.position,\n              containerWidth: r.width,\n              containerHeight: r.height,\n              detail: formatDetail(\n                el.role,\n                labelOf(el),\n                'vertical',\n                band.position,\n                band.px,\n                pct,\n                r.height\n              ),\n            });\n          }\n        }\n      }\n    }\n\n    for (const c of el.children) visit(c, depth + 1);\n  }\n\n  for (const root of roots) visit(root, 0);\n\n  // Highest-impact first.\n  findings.sort((a, b) => b.emptyPct - a.emptyPct);\n  return findings;\n}\n\n// ---------------------------------------------------------------------------\n// Relative-size reporting\n// ---------------------------------------------------------------------------\n\nexport interface ElementSizeReport {\n  role: string;\n  label: string;\n  width: number;\n  height: number;\n  /** width / window.width (0..1) or null if window absent */\n  widthPctOfWindow: number | null;\n  /** height / window.height (0..1) or null if window absent */\n  heightPctOfWindow: number | null;\n  /** Index path inside the tree, e.g. [0, 2, 1] */\n  path: number[];\n}\n\n/**\n * Flatten the AX tree into per-element size reports with % of window.\n * Useful as a secondary signal alongside layout-fill findings.\n */\nexport function reportElementSizes(\n  roots: MacOSAXElement[],\n  window?: { width: number; height: number }\n): ElementSizeReport[] {\n  const out: ElementSizeReport[] = [];\n\n  function visit(el: MacOSAXElement): void {\n    const r = rectOf(el);\n    if (r) {\n      out.push({\n        role: el.role,\n        label: labelOf(el),\n        width: r.width,\n        height: r.height,\n        widthPctOfWindow:\n          window && window.width > 0 ? r.width / window.width : null,\n        heightPctOfWindow:\n          window && window.height > 0 ? r.height / window.height : null,\n        path: el.path,\n      });\n    }\n    for (const c of el.children) visit(c);\n  }\n\n  for (const root of roots) visit(root);\n  return out;\n}\n","import { join } from 'path';\nimport type { NativeScanOptions, NativeScanResult, MacOSScanOptions, MacOSScanResult } from './types.js';\nimport type { ScanIssue } from '../scan.js';\nimport { aggregateIssues, determineVerdict, generateSummary, applyDesignSystemCheck } from '../scan.js';\nimport { analyzeElements } from '../extract.js';\nimport { findDevice, getBootedDevices, bootDevice } from './simulator.js';\nimport { captureNativeScreenshot } from './capture.js';\nimport { getDeviceViewport } from './viewports.js';\nimport { extractNativeElements, mapToEnhancedElements, isExtractorAvailable } from './extract.js';\nimport { auditNativeElements } from './rules.js';\nimport { findProcess, extractMacOSElements, mapMacOSToEnhancedElements, captureMacOSScreenshot } from './macos.js';\nimport { buildNativeInteractivity } from './interactivity.js';\nimport { buildNativeSemantic } from './semantic.js';\nimport { analyzeLayoutFill, type LayoutFillFinding } from './layout-fill.js';\nimport type { AuditResult, EnhancedElement } from '../schemas.js';\n\n/**\n * Run a comprehensive native simulator scan\n *\n * Orchestrates: device resolution → boot → screenshot → element extraction → audit → verdict\n *\n * Falls back to screenshot-only mode if the Swift AXUIElement extractor is unavailable.\n */\nexport async function scanNative(options: NativeScanOptions = {}): Promise<NativeScanResult> {\n  const { device: deviceQuery, screenshot = true, outputDir = '.ibr' } = options;\n\n  // --- Resolve device ---\n  let device;\n  if (deviceQuery) {\n    device = await findDevice(deviceQuery);\n    if (!device) {\n      throw new Error(\n        `No simulator found matching \"${deviceQuery}\". ` +\n        'Run `xcrun simctl list devices available` to see available simulators.'\n      );\n    }\n  } else {\n    // Use first booted device\n    const booted = await getBootedDevices();\n    if (booted.length === 0) {\n      throw new Error(\n        'No booted simulators found. Boot one with: xcrun simctl boot <device-name>'\n      );\n    }\n    device = booted[0];\n  }\n\n  // --- Boot if needed ---\n  if (device.state !== 'Booted') {\n    await bootDevice(device.udid);\n    // Refresh device state\n    const refreshed = await findDevice(device.udid);\n    if (refreshed) device = refreshed;\n  }\n\n  const viewport = getDeviceViewport(device);\n  const url = `simulator://${device.name}/${options.bundleId || 'current'}`;\n\n  // --- Capture screenshot ---\n  let screenshotPath: string | undefined;\n  if (screenshot) {\n    const timestamp = Date.now();\n    const ssPath = join(outputDir, 'native', `${device.udid.slice(0, 8)}-${timestamp}.png`);\n    const captureResult = await captureNativeScreenshot({\n      device,\n      outputPath: ssPath,\n    });\n    if (captureResult.success) {\n      screenshotPath = captureResult.outputPath;\n    }\n  }\n\n  // --- Extract elements ---\n  let elements: EnhancedElement[] = [];\n  let audit: AuditResult = {\n    totalElements: 0,\n    interactiveCount: 0,\n    withHandlers: 0,\n    withoutHandlers: 0,\n    issues: [],\n  };\n  let extractionSucceeded = false;\n\n  // On modern Xcode (12+), iOS guest accessibility is no longer bridged into\n  // the macOS host process — only Simulator.app's chrome is visible. Filter\n  // out the chrome roles below so verdicts don't rate menu bar items as SUT\n  // content. The native AX→tagName mapping yields these for host chrome:\n  //   AXApplication → application\n  //   AXMenuBar / AXMenu → nav\n  //   AXMenuBarItem / AXMenuItem → menubaritem / li\n  const HOST_CHROME_TAGS = new Set([\n    'application',\n    'menubaritem',\n    'nav',\n  ]);\n\n  let iosGuestUnreachable = false;\n\n  if (isExtractorAvailable()) {\n    try {\n      const nativeElements = await extractNativeElements(device);\n      const allMapped = mapToEnhancedElements(nativeElements);\n      // Drop host-chrome roles for iOS targets. On macOS targets the same\n      // filter is a no-op because the AX root is the app itself, not the host.\n      const filtered =\n        device.platform === 'ios'\n          ? allMapped.filter((e) => !HOST_CHROME_TAGS.has((e.tagName || '').toLowerCase()))\n          : allMapped;\n      elements = filtered;\n      // If we got results from the AX query but everything was host chrome,\n      // the iOS guest tree is unreachable from this process. Surface it.\n      if (device.platform === 'ios' && allMapped.length > 0 && filtered.length === 0) {\n        iosGuestUnreachable = true;\n      }\n      audit = analyzeElements(elements, true); // Always treat as mobile-sized targets\n      extractionSucceeded = !iosGuestUnreachable;\n    } catch {\n      // Graceful fallback to screenshot-only mode\n    }\n  }\n\n  // --- Native audit rules ---\n  const nativeIssues = extractionSucceeded\n    ? auditNativeElements(elements, device.platform, viewport)\n    : [];\n\n  // --- Aggregate issues ---\n  // Build ScanIssue array from audit issues and native-specific issues\n  const issues: ScanIssue[] = [];\n\n  // Standard audit issues\n  for (const issue of audit.issues) {\n    issues.push({\n      category: issue.type === 'MISSING_ARIA_LABEL' ? 'accessibility' : 'interactivity',\n      severity: issue.severity,\n      description: issue.message,\n    });\n  }\n\n  // Native-specific issues\n  for (const issue of nativeIssues) {\n    issues.push({\n      category: issue.type === 'MISSING_ARIA_LABEL' ? 'accessibility' : 'structure',\n      severity: issue.severity,\n      description: issue.message,\n    });\n  }\n\n  // Honest signal: iOS guest accessibility tree is not reachable from the\n  // macOS host process on modern Xcode. The scan returned host chrome only.\n  if (iosGuestUnreachable) {\n    issues.push({\n      category: 'structure',\n      severity: 'error',\n      description:\n        'iOS guest accessibility tree is unreachable from this process. ' +\n        'native:scan can only see Simulator.app chrome on Xcode 12+. ' +\n        'Use a screenshot-driven workflow, or install IDB and route through ' +\n        '`idb accessibility info` (planned: XCUITest bundle, see NATIVE_SUPPORT_PROPOSAL.md Phase 2).',\n    });\n  }\n\n  // --- Design system check (only when explicitly provided, not the default '.ibr') ---\n  const designSystem = options.outputDir ? await applyDesignSystemCheck(\n    elements, issues, viewport, url, options.outputDir\n  ) : undefined;\n\n  // --- Verdict ---\n  const verdict = determineVerdict(issues);\n\n  // --- Summary ---\n  const summary = generateNativeSummary(device, elements, issues, extractionSucceeded);\n\n  return {\n    url,\n    route: `/${device.name}`,\n    timestamp: new Date().toISOString(),\n    viewport,\n    platform: device.platform,\n    device: {\n      name: device.name,\n      udid: device.udid,\n      runtime: device.runtime,\n    },\n    elements: { all: elements, audit },\n    nativeIssues,\n    screenshotPath,\n    designSystem,\n    verdict,\n    issues,\n    summary,\n  };\n}\n\n/**\n * Generate human-readable summary for native scan\n */\nfunction generateNativeSummary(\n  device: { name: string; platform: string },\n  elements: EnhancedElement[],\n  issues: ScanIssue[],\n  extractionSucceeded: boolean\n): string {\n  const parts: string[] = [];\n\n  parts.push(`${device.platform} simulator (${device.name})`);\n\n  if (extractionSucceeded) {\n    const interactive = elements.filter(e => e.interactive.hasOnClick).length;\n    parts.push(`${elements.length} elements (${interactive} interactive)`);\n  } else {\n    parts.push('screenshot-only mode (element extraction unavailable)');\n  }\n\n  const errorCount = issues.filter(i => i.severity === 'error').length;\n  const warningCount = issues.filter(i => i.severity === 'warning').length;\n  if (errorCount > 0 || warningCount > 0) {\n    const issueParts = [];\n    if (errorCount > 0) issueParts.push(`${errorCount} errors`);\n    if (warningCount > 0) issueParts.push(`${warningCount} warnings`);\n    parts.push(issueParts.join(', '));\n  }\n\n  return parts.join(', ');\n}\n\n// ============================================================================\n// macOS Native App Scanning\n// ============================================================================\n\n/**\n * Run a comprehensive scan of a running macOS native app\n *\n * Uses the Accessibility API (AXUIElement) to extract the full view hierarchy,\n * then runs the same analysis pipeline as web scans.\n *\n * Produces a MacOSScanResult with the same shape as web ScanResult.\n */\nexport async function scanMacOS(options: MacOSScanOptions): Promise<MacOSScanResult> {\n  if (process.platform !== 'darwin') {\n    throw new Error('macOS native scanning is only available on macOS');\n  }\n\n  const { app, bundleId, pid: directPid, screenshot } = options;\n\n  if (!app && !bundleId && !directPid) {\n    throw new Error('Provide --app, --bundle-id, or --pid to identify the target app');\n  }\n\n  // --- Resolve PID ---\n  let pid: number;\n  if (directPid) {\n    pid = directPid;\n  } else {\n    pid = await findProcess(app || bundleId!);\n  }\n\n  // --- Extract elements via Swift CLI ---\n  const { elements: nativeElements, window } = await extractMacOSElements({\n    pid,\n    app: app || bundleId,\n  });\n\n  // --- Map to EnhancedElement[] ---\n  const elements = mapMacOSToEnhancedElements(nativeElements);\n\n  // --- Analyze elements (reuse from extract.ts) ---\n  const audit = analyzeElements(elements, false); // desktop-sized targets\n\n  // --- Build interactivity result from AX data ---\n  const interactivity = buildNativeInteractivity(elements);\n\n  // --- Build semantic result from element composition ---\n  const semantic = buildNativeSemantic(elements, window);\n\n  // --- Layout-fill / gap analysis ---\n  // Reads the raw AX tree (NOT the flattened EnhancedElement list) so it sees\n  // the parent → child structure required to compute per-container gaps.\n  // Catches centered-narrow-content bugs that pass screenshot/a11y checks.\n  let layoutFill: LayoutFillFinding[] | undefined;\n  if (options.layoutFill !== false) {\n    const lfOpts = typeof options.layoutFill === 'object' ? options.layoutFill : {};\n    layoutFill = analyzeLayoutFill(nativeElements, {\n      threshold: lfOpts.threshold,\n      minContainerPx: lfOpts.minContainerPx,\n      window: { width: window.width, height: window.height },\n    });\n  }\n\n  // --- Capture screenshot if requested ---\n  if (screenshot && window.windowId > 0) {\n    await captureMacOSScreenshot(window.windowId, screenshot.path);\n  }\n\n  // --- Build URL ---\n  const url = `macos://${app || bundleId || `pid-${pid}`}/${window.title}`;\n  const route = `/${window.title}`;\n\n  // --- Build viewport from window dimensions ---\n  const viewport = {\n    name: 'native',\n    width: window.width,\n    height: window.height,\n  };\n\n  // --- Aggregate issues (reuse from scan.ts) ---\n  const issues = aggregateIssues(audit, interactivity, semantic, []);\n\n  // --- Surface layout-fill findings as WARNING issues ---\n  // Same shape as touch-target warnings so consumers (CLI, MCP, dashboard)\n  // handle them uniformly. Category \"layout\" is the right home (not\n  // \"accessibility\" — the band is a layout signal, not an a11y one).\n  if (layoutFill) {\n    for (const f of layoutFill) {\n      issues.push({\n        category: 'structure',\n        severity: 'warning',\n        description: `layout-fill: ${f.detail}`,\n      });\n    }\n  }\n\n  // --- Design system check ---\n  const designSystem = options.outputDir ? await applyDesignSystemCheck(\n    elements, issues, viewport, url, options.outputDir\n  ) : undefined;\n\n  // --- Verdict ---\n  const verdict = determineVerdict(issues);\n\n  // --- Generate summary (reuse from scan.ts) ---\n  const summary = generateSummary(\n    { all: elements, audit },\n    interactivity,\n    semantic,\n    issues,\n    []\n  );\n\n  return {\n    url,\n    route,\n    timestamp: new Date().toISOString(),\n    viewport,\n    elements: { all: elements, audit },\n    interactivity,\n    semantic,\n    console: { errors: [], warnings: [] },\n    designSystem,\n    verdict,\n    issues,\n    summary,\n    layoutFill,\n  };\n}\n\n// --- Shared formatter helpers ---\n\nfunction verdictIcon(verdict: string): string {\n  return verdict === 'PASS' ? '\\x1b[32m✓\\x1b[0m' :\n         verdict === 'ISSUES' ? '\\x1b[33m!\\x1b[0m' :\n         '\\x1b[31m✗\\x1b[0m';\n}\n\nfunction formatElementsSection(audit: AuditResult): string[] {\n  return [\n    '  ELEMENTS',\n    '  ────────',\n    `  Total:              ${audit.totalElements}`,\n    `  Interactive:        ${audit.interactiveCount}`,\n    `  With handlers:      ${audit.withHandlers}`,\n    `  Without handlers:   ${audit.withoutHandlers}`,\n    '',\n  ];\n}\n\nfunction formatIssuesSection(issues: ScanIssue[]): string[] {\n  if (issues.length === 0) return ['  No issues detected.'];\n  const lines = ['  ISSUES', '  ──────'];\n  for (const issue of issues) {\n    const icon = issue.severity === 'error' ? '\\x1b[31m✗\\x1b[0m' :\n                 issue.severity === 'warning' ? '\\x1b[33m!\\x1b[0m' : 'ℹ';\n    lines.push(`  ${icon} [${issue.category}] ${issue.description}`);\n    if (issue.fix) lines.push(`    → ${issue.fix}`);\n  }\n  return lines;\n}\n\n/**\n * Format macOS scan result for console output\n */\nexport function formatMacOSScanResult(result: MacOSScanResult): string {\n  const lines: string[] = [\n    '═══════════════════════════════════════════════════════',\n    '  IBR NATIVE macOS SCAN',\n    '═══════════════════════════════════════════════════════',\n    '',\n    `  App:      ${result.url}`,\n    `  Window:   ${result.route.slice(1)}`,\n    `  Viewport: ${result.viewport.width}x${result.viewport.height}`,\n    `  Verdict:  ${verdictIcon(result.verdict)} ${result.verdict}`,\n    '',\n    `  ${result.summary}`,\n    '',\n    '  PAGE UNDERSTANDING',\n    '  ─────────────────',\n    `  Intent:   ${result.semantic.pageIntent.intent} (${Math.round(result.semantic.confidence * 100)}% confidence)`,\n    `  Auth:     ${result.semantic.state.auth.authenticated === false ? 'Not authenticated' : result.semantic.state.auth.authenticated ? 'Authenticated' : 'Unknown'}`,\n    '',\n    ...formatElementsSection(result.elements.audit),\n  ];\n\n  const { buttons, links, forms } = result.interactivity;\n  lines.push('  INTERACTIVITY', '  ─────────────');\n  lines.push(`  Buttons: ${buttons.length}  Links: ${links.length}  Forms: ${forms.length}`, '');\n  lines.push(...formatIssuesSection(result.issues));\n  lines.push('', '═══════════════════════════════════════════════════════');\n\n  return lines.join('\\n');\n}\n\n/**\n * Format native scan result for console output\n */\nexport function formatNativeScanResult(result: NativeScanResult): string {\n  const lines: string[] = [\n    '═══════════════════════════════════════════════════════',\n    '  IBR NATIVE SCAN',\n    '═══════════════════════════════════════════════════════',\n    '',\n    `  Device:   ${result.device.name}`,\n    `  Platform: ${result.platform}`,\n    `  Runtime:  ${result.device.runtime.replace(/^.*SimRuntime\\./, '').replace(/-/g, '.')}`,\n    `  Viewport: ${result.viewport.name} (${result.viewport.width}x${result.viewport.height})`,\n    `  Verdict:  ${verdictIcon(result.verdict)} ${result.verdict}`,\n    '',\n    `  ${result.summary}`,\n    '',\n    ...formatElementsSection(result.elements.audit),\n  ];\n\n  if (result.screenshotPath) {\n    lines.push(`  Screenshot: ${result.screenshotPath}`, '');\n  }\n\n  lines.push(...formatIssuesSection(result.issues));\n  lines.push('', '═══════════════════════════════════════════════════════');\n\n  return lines.join('\\n');\n}\n","/**\n * PNG cropping helper. Uses the existing `pngjs` dependency — no native\n * tools, no shelling out, runs identically on macOS / Linux / Windows.\n *\n * Used by ask() / askStream() to attach per-finding cropped evidence to the\n * AskResponse. Token-economic: the agent gets the rectangle that matters,\n * not the whole page.\n */\n\nimport { createReadStream, createWriteStream } from 'fs'\nimport { mkdir } from 'fs/promises'\nimport { dirname } from 'path'\nimport { PNG } from 'pngjs'\n\nexport interface CropBounds {\n  x: number\n  y: number\n  width: number\n  height: number\n}\n\nexport interface CropOptions {\n  /** Pixel padding added on every edge to give the agent context. Default 16. */\n  padding?: number\n  /**\n   * Scale factor between logical bounds (CSS px) and screenshot pixels.\n   * Default 1 (Playwright captures at 1:1 with viewport unless overridden).\n   * iOS native screenshots are at native resolution — caller passes 3 for\n   * iPhone Pro models, etc.\n   */\n  scale?: number\n}\n\n/** Read a PNG file into memory. */\nfunction loadPng(path: string): Promise<PNG> {\n  return new Promise((resolve, reject) => {\n    const png = new PNG()\n    createReadStream(path)\n      .pipe(png)\n      .on('parsed', () => resolve(png))\n      .on('error', reject)\n  })\n}\n\n/** Write a PNG buffer back to disk. */\nfunction writePng(png: PNG, path: string): Promise<void> {\n  return new Promise((resolve, reject) => {\n    png.pack().pipe(createWriteStream(path)).on('finish', resolve).on('error', reject)\n  })\n}\n\nfunction clamp(v: number, lo: number, hi: number): number {\n  return Math.min(Math.max(v, lo), hi)\n}\n\n/**\n * Crop `srcPath` to the given bounds (in logical CSS pixels). Pads, scales,\n * clamps to image dims, writes to `destPath`, and returns the destination\n * path. Returns null if bounds resolve to a zero-area rectangle.\n */\nexport async function cropPng(\n  srcPath: string,\n  bounds: CropBounds,\n  destPath: string,\n  opts: CropOptions = {},\n): Promise<string | null> {\n  const padding = opts.padding ?? 16\n  const scale = opts.scale ?? 1\n\n  const src = await loadPng(srcPath)\n\n  // Convert logical → image pixels, then pad and clamp to the image.\n  const x0 = Math.floor(clamp((bounds.x - padding) * scale, 0, src.width))\n  const y0 = Math.floor(clamp((bounds.y - padding) * scale, 0, src.height))\n  const x1 = Math.ceil(clamp((bounds.x + bounds.width + padding) * scale, 0, src.width))\n  const y1 = Math.ceil(clamp((bounds.y + bounds.height + padding) * scale, 0, src.height))\n  const cropW = x1 - x0\n  const cropH = y1 - y0\n  if (cropW <= 0 || cropH <= 0) return null\n\n  const out = new PNG({ width: cropW, height: cropH })\n  // pngjs.bitblt copies pixel rectangles between PNGs.\n  src.bitblt(out, x0, y0, cropW, cropH, 0, 0)\n\n  await mkdir(dirname(destPath), { recursive: true })\n  await writePng(out, destPath)\n  return destPath\n}\n","import { ConfigSchema, VIEWPORTS, type Config, type Session, type SessionQuery, type ComparisonReport, type Viewport } from './schemas.js';\nimport { viewportToConfig } from './devices.js';\nimport { captureScreenshot, captureWithLandmarks, closeBrowser } from './capture.js';\nimport { compareImages, analyzeComparison } from './compare.js';\nimport {\n  createSession,\n  getSession,\n  updateSession,\n  markSessionCompared,\n  listSessions,\n  getMostRecentSession,\n  deleteSession,\n  cleanSessions,\n  getSessionPaths,\n  findSessions,\n  getTimeline,\n  getSessionsByRoute,\n  getSessionStats,\n} from './session.js';\nimport { generateReport } from './report.js';\nimport type { BrowserLaunchOptions, StartSessionOptions, StartSessionResult, CleanOptions } from './types.js';\nimport { getSemanticOutput, formatSemanticText, type SemanticResult } from './semantic/index.js';\nimport { loginFlow, searchFlow, formFlow, type FlowLoginOptions, type FlowSearchOptions, type FlowFormOptions } from './flows/index.js';\nimport { EngineDriver } from './engine/driver.js';\nimport { CompatPage } from './engine/compat.js';\nimport { mkdir, access } from 'fs/promises';\nimport { join, dirname } from 'path';\nimport { tmpdir } from 'os';\nimport { maybeAutoClean } from './cleanup.js';\n\n// ============================================================================\n// STANDALONE PROGRAMMATIC API\n// These functions provide first-class programmatic comparison without\n// requiring session management or CLI wrappers.\n// ============================================================================\n\n/**\n * Options for standalone compare function\n */\nexport interface CompareInput extends BrowserLaunchOptions {\n  /** URL to capture and compare (will auto-capture current state) */\n  url?: string;\n  /** Path to baseline image (required if no url) */\n  baselinePath?: string;\n  /** Path to current image (auto-captured if url provided) */\n  currentPath?: string;\n  /** Pixel difference threshold (0-100, default 1.0) */\n  threshold?: number;\n  /** Output directory for diff and temp files */\n  outputDir?: string;\n  /** Viewport configuration */\n  viewport?: 'desktop' | 'mobile' | 'tablet' | Viewport;\n  /** Capture full page */\n  fullPage?: boolean;\n  /** Wait for network idle before capture */\n  waitForNetworkIdle?: boolean;\n  /** Capture timeout in ms */\n  timeout?: number;\n  /** Show a visible browser window instead of headless mode */\n  headed?: boolean;\n}\n\n/**\n * Result from standalone compare function\n */\nexport interface CompareResult {\n  /** Whether images match within threshold */\n  match: boolean;\n  /** Percentage of pixels that differ */\n  diffPercent: number;\n  /** Number of differing pixels */\n  diffPixels: number;\n  /** Total pixels compared */\n  totalPixels: number;\n  /** Analysis verdict: MATCH, EXPECTED_CHANGE, UNEXPECTED_CHANGE, LAYOUT_BROKEN */\n  verdict: string;\n  /** Human-readable summary */\n  summary: string;\n  /** Regions with changes */\n  changedRegions: Array<{\n    location: string;\n    description: string;\n    severity: 'expected' | 'unexpected' | 'critical';\n  }>;\n  /** Recommendation for fixing issues */\n  recommendation: string | null;\n  /** Path to diff image (if generated) */\n  diffPath?: string;\n  /** Path to baseline used */\n  baselinePath: string;\n  /** Path to current image used */\n  currentPath: string;\n}\n\n/**\n * Standalone compare function - compare images without session management\n *\n * @example\n * ```typescript\n * // Compare by URL (auto-captures current state)\n * const result = await compare({\n *   url: 'http://localhost:3000',\n *   baselinePath: './baseline.png'\n * });\n *\n * // Compare two existing images\n * const result = await compare({\n *   baselinePath: './baseline.png',\n *   currentPath: './current.png'\n * });\n *\n * // Compare URL with auto threshold\n * const result = await compare({\n *   url: 'http://localhost:3000',\n *   baselinePath: './baseline.png',\n *   threshold: 0.5  // 0.5% difference allowed\n * });\n * ```\n */\nexport async function compare(options: CompareInput): Promise<CompareResult> {\n  const {\n    url,\n    baselinePath,\n    currentPath,\n    threshold = 1.0,\n    outputDir = join(tmpdir(), 'ibr-compare'),\n    viewport = 'desktop',\n    fullPage = true,\n    waitForNetworkIdle = true,\n    timeout = 30000,\n    headed = false,\n    browserMode,\n    cdpUrl,\n    wsEndpoint,\n    chromePath,\n  } = options;\n\n  // Validate inputs\n  if (!baselinePath && !url) {\n    throw new Error('Either baselinePath or url must be provided');\n  }\n\n  // Resolve viewport\n  const resolvedViewport: Viewport = typeof viewport === 'string'\n    ? VIEWPORTS[viewport] || VIEWPORTS.desktop\n    : viewport;\n\n  // Create output directory\n  await mkdir(outputDir, { recursive: true });\n\n  // Determine paths\n  const timestamp = Date.now();\n  const actualBaselinePath = baselinePath || join(outputDir, `baseline-${timestamp}.png`);\n  let actualCurrentPath = currentPath || join(outputDir, `current-${timestamp}.png`);\n  const diffPath = join(outputDir, `diff-${timestamp}.png`);\n\n  // If URL provided but no baseline, capture baseline first\n  if (url && !baselinePath) {\n    await captureScreenshot({\n      url,\n      outputPath: actualBaselinePath,\n      viewport: resolvedViewport,\n      fullPage,\n      headed,\n      waitForNetworkIdle,\n      timeout,\n      browserMode,\n      cdpUrl,\n      wsEndpoint,\n      chromePath,\n    });\n  }\n\n  // If URL provided, capture current state\n  if (url && !currentPath) {\n    await captureScreenshot({\n      url,\n      outputPath: actualCurrentPath,\n      viewport: resolvedViewport,\n      fullPage,\n      headed,\n      waitForNetworkIdle,\n      timeout,\n      browserMode,\n      cdpUrl,\n      wsEndpoint,\n      chromePath,\n    });\n  }\n\n  // Verify files exist\n  try {\n    await access(actualBaselinePath);\n  } catch {\n    throw new Error(`Baseline image not found: ${actualBaselinePath}`);\n  }\n  try {\n    await access(actualCurrentPath);\n  } catch {\n    throw new Error(`Current image not found: ${actualCurrentPath}`);\n  }\n\n  // Compare images\n  const comparison = await compareImages({\n    baselinePath: actualBaselinePath,\n    currentPath: actualCurrentPath,\n    diffPath,\n    threshold: threshold / 100, // Convert percentage to 0-1 for pixelmatch\n  });\n\n  // Analyze results\n  const analysis = analyzeComparison(comparison, threshold);\n\n  // Close browser if we opened one\n  await closeBrowser();\n\n  return {\n    match: comparison.match,\n    diffPercent: comparison.diffPercent,\n    diffPixels: comparison.diffPixels,\n    totalPixels: comparison.totalPixels,\n    verdict: analysis.verdict,\n    summary: analysis.summary,\n    changedRegions: analysis.changedRegions.map(r => ({\n      location: r.location,\n      description: r.description,\n      severity: r.severity,\n    })),\n    recommendation: analysis.recommendation,\n    diffPath: comparison.match ? undefined : diffPath,\n    baselinePath: actualBaselinePath,\n    currentPath: actualCurrentPath,\n  };\n}\n\n/**\n * Options for batch comparison\n */\nexport interface CompareAllInput {\n  /** Session ID to compare (uses most recent if not provided) */\n  sessionId?: string;\n  /** Output directory (defaults to .ibr) */\n  outputDir?: string;\n  /** Only compare sessions matching this URL pattern */\n  urlPattern?: string | RegExp;\n  /** Only compare sessions with these statuses */\n  statuses?: Array<'baseline' | 'compared' | 'pending'>;\n  /** Maximum number of sessions to compare */\n  limit?: number;\n}\n\n/**\n * Batch compare all sessions or a filtered subset\n *\n * @example\n * ```typescript\n * // Compare all sessions\n * const results = await compareAll();\n *\n * // Compare sessions matching URL\n * const results = await compareAll({\n *   urlPattern: /\\/dashboard/\n * });\n *\n * // Compare specific session\n * const results = await compareAll({\n *   sessionId: 'sess_abc123'\n * });\n * ```\n */\nexport async function compareAll(options: CompareAllInput = {}): Promise<CompareResult[]> {\n  const {\n    sessionId,\n    outputDir = './.ibr',\n    urlPattern,\n    statuses = ['baseline'],\n    limit = 50,\n  } = options;\n\n  const results: CompareResult[] = [];\n\n  if (sessionId) {\n    // Compare single session\n    const session = await getSession(outputDir, sessionId);\n    if (!session) {\n      throw new Error(`Session not found: ${sessionId}`);\n    }\n    const paths = getSessionPaths(outputDir, session.id);\n\n    const result = await compare({\n      url: session.url,\n      baselinePath: paths.baseline,\n      outputDir: dirname(paths.diff),\n      viewport: session.viewport,\n    });\n\n    results.push(result);\n  } else {\n    // Get all matching sessions\n    let sessions = await listSessions(outputDir);\n\n    // Filter by status\n    sessions = sessions.filter(s => statuses.includes(s.status as 'baseline' | 'compared' | 'pending'));\n\n    // Filter by URL pattern\n    if (urlPattern) {\n      const pattern = typeof urlPattern === 'string' ? new RegExp(urlPattern) : urlPattern;\n      sessions = sessions.filter(s => pattern.test(s.url));\n    }\n\n    // Apply limit\n    sessions = sessions.slice(0, limit);\n\n    // Compare each session\n    for (const session of sessions) {\n      try {\n        const paths = getSessionPaths(outputDir, session.id);\n        const result = await compare({\n          url: session.url,\n          baselinePath: paths.baseline,\n          outputDir: dirname(paths.diff),\n          viewport: session.viewport,\n        });\n        results.push(result);\n      } catch (err) {\n        // Continue on individual session failures\n        console.warn(`Failed to compare session ${session.id}: ${err}`);\n      }\n    }\n  }\n\n  // Close browser after all comparisons\n  await closeBrowser();\n\n  return results;\n}\n\n// ============================================================================\n// CLASS-BASED API (Original)\n// ============================================================================\n\nexport class InterfaceBuiltRight {\n  private config: Config;\n\n  constructor(options: Partial<Config> = {}) {\n    // Validate and merge with defaults\n    this.config = ConfigSchema.parse(options);\n  }\n\n  /**\n   * Start a visual session by capturing a baseline screenshot\n   */\n  async startSession(path: string, options: StartSessionOptions = {}): Promise<StartSessionResult> {\n    const {\n      name = this.generateSessionName(path),\n      viewport = this.config.viewport,\n      fullPage = this.config.fullPage,\n      selector,\n      waitFor,\n      headed = false,\n      browserMode = this.config.browserMode,\n      cdpUrl = this.config.cdpUrl,\n      wsEndpoint = this.config.wsEndpoint,\n      chromePath = this.config.chromePath,\n    } = options;\n\n    const url = this.resolveUrl(path);\n\n    // Create session\n    const session = await createSession(this.config.outputDir, url, name, viewport);\n    const paths = getSessionPaths(this.config.outputDir, session.id);\n\n    // Capture baseline with landmark detection (outputDir enables auth state loading)\n    const captureResult = await captureWithLandmarks({\n      url,\n      outputPath: paths.baseline,\n      viewport,\n      fullPage,\n      headed,\n      waitForNetworkIdle: this.config.waitForNetworkIdle,\n      timeout: this.config.timeout,\n      outputDir: this.config.outputDir,\n      selector,\n      waitFor,\n      browserMode,\n      cdpUrl,\n      wsEndpoint,\n      chromePath,\n    });\n\n    // Update session with detected landmarks and page intent\n    const updatedSession = await updateSession(this.config.outputDir, session.id, {\n      landmarkElements: captureResult.landmarkElements,\n      pageIntent: captureResult.pageIntent,\n    });\n\n    // Run auto-cleanup if enabled in retention config\n    await maybeAutoClean(this.config.outputDir);\n\n    return {\n      sessionId: session.id,\n      baseline: paths.baseline,\n      session: updatedSession,\n    };\n  }\n\n  /**\n   * Check current state against baseline\n   */\n  async check(sessionId?: string): Promise<ComparisonReport> {\n    // Get session\n    const session = sessionId\n      ? await getSession(this.config.outputDir, sessionId)\n      : await getMostRecentSession(this.config.outputDir);\n\n    if (!session) {\n      throw new Error(sessionId\n        ? `Session not found: ${sessionId}`\n        : 'No sessions found. Run startSession first.');\n    }\n\n    const paths = getSessionPaths(this.config.outputDir, session.id);\n\n    // Capture current screenshot (outputDir enables auth state loading)\n    await captureScreenshot({\n      url: session.url,\n      outputPath: paths.current,\n      viewport: session.viewport,\n      fullPage: this.config.fullPage,\n      waitForNetworkIdle: this.config.waitForNetworkIdle,\n      timeout: this.config.timeout,\n      outputDir: this.config.outputDir,\n      browserMode: this.config.browserMode,\n      cdpUrl: this.config.cdpUrl,\n      wsEndpoint: this.config.wsEndpoint,\n      chromePath: this.config.chromePath,\n    });\n\n    // Compare images\n    const comparison = await compareImages({\n      baselinePath: paths.baseline,\n      currentPath: paths.current,\n      diffPath: paths.diff,\n      threshold: this.config.threshold / 100, // Convert percentage to 0-1 range for pixelmatch\n    });\n\n    // Analyze results\n    const analysis = analyzeComparison(comparison, this.config.threshold);\n\n    // Update session\n    await markSessionCompared(this.config.outputDir, session.id, comparison, analysis);\n\n    // Generate report\n    return generateReport(session, comparison, analysis, this.config.outputDir);\n  }\n\n  /**\n   * Get a session by ID\n   */\n  async getSession(sessionId: string): Promise<Session | null> {\n    return getSession(this.config.outputDir, sessionId);\n  }\n\n  /**\n   * Get the most recent session\n   */\n  async getMostRecentSession(): Promise<Session | null> {\n    return getMostRecentSession(this.config.outputDir);\n  }\n\n  /**\n   * List all sessions\n   */\n  async listSessions(): Promise<Session[]> {\n    return listSessions(this.config.outputDir);\n  }\n\n  /**\n   * Delete a session\n   */\n  async deleteSession(sessionId: string): Promise<boolean> {\n    return deleteSession(this.config.outputDir, sessionId);\n  }\n\n  /**\n   * Clean old sessions\n   */\n  async clean(options: CleanOptions = {}): Promise<{ deleted: string[]; kept: string[] }> {\n    return cleanSessions(this.config.outputDir, options);\n  }\n\n  /**\n   * Find sessions matching query criteria\n   */\n  async find(query: Partial<SessionQuery> = {}): Promise<Session[]> {\n    return findSessions(this.config.outputDir, query);\n  }\n\n  /**\n   * Get timeline of sessions for a specific route\n   * Returns sessions in chronological order (oldest first)\n   */\n  async getTimeline(route: string, limit: number = 10): Promise<Session[]> {\n    return getTimeline(this.config.outputDir, route, limit);\n  }\n\n  /**\n   * Get sessions grouped by route\n   */\n  async getSessionsByRoute(): Promise<Record<string, Session[]>> {\n    return getSessionsByRoute(this.config.outputDir);\n  }\n\n  /**\n   * Get session statistics\n   */\n  async getStats(): Promise<{\n    total: number;\n    byStatus: Record<string, number>;\n    byViewport: Record<string, number>;\n    byVerdict: Record<string, number>;\n  }> {\n    return getSessionStats(this.config.outputDir);\n  }\n\n  /**\n   * Update baseline with current screenshot\n   */\n  async updateBaseline(sessionId?: string): Promise<Session> {\n    const session = sessionId\n      ? await getSession(this.config.outputDir, sessionId)\n      : await getMostRecentSession(this.config.outputDir);\n\n    if (!session) {\n      throw new Error(sessionId\n        ? `Session not found: ${sessionId}`\n        : 'No sessions found.');\n    }\n\n    const paths = getSessionPaths(this.config.outputDir, session.id);\n\n    // Capture new baseline (outputDir enables auth state loading)\n    await captureScreenshot({\n      url: session.url,\n      outputPath: paths.baseline,\n      viewport: session.viewport,\n      fullPage: this.config.fullPage,\n      waitForNetworkIdle: this.config.waitForNetworkIdle,\n      timeout: this.config.timeout,\n      outputDir: this.config.outputDir,\n      browserMode: this.config.browserMode,\n      cdpUrl: this.config.cdpUrl,\n      wsEndpoint: this.config.wsEndpoint,\n      chromePath: this.config.chromePath,\n    });\n\n    // Reset session status\n    return updateSession(this.config.outputDir, session.id, {\n      status: 'baseline',\n      comparison: undefined,\n      analysis: undefined,\n    });\n  }\n\n  /**\n   * Start a simplified session with semantic understanding\n   *\n   * This is the new simpler API - one line to start:\n   * ```typescript\n   * const session = await ibr.start('http://localhost:3000');\n   * const understanding = await session.understand();\n   * ```\n   */\n  async start(url: string, options: {\n    viewport?: 'desktop' | 'mobile' | 'tablet';\n    waitFor?: string;\n    timeout?: number;\n    headed?: boolean;\n  } = {}): Promise<IBRSession> {\n    const fullUrl = this.resolveUrl(url);\n    const viewportName = options.viewport || 'desktop';\n    const viewport = VIEWPORTS[viewportName];\n\n    // Launch browser via engine\n    const driver = new EngineDriver();\n    await driver.launch({\n      headless: !options.headed,\n      viewport: viewportToConfig(viewport),\n      mode: this.config.browserMode,\n      cdpUrl: this.config.cdpUrl,\n      wsEndpoint: this.config.wsEndpoint,\n      chromePath: this.config.chromePath,\n    });\n    const page = new CompatPage(driver);\n\n    // Navigate\n    await page.goto(fullUrl, {\n      waitUntil: 'domcontentloaded',\n      timeout: options.timeout || this.config.timeout,\n    });\n\n    // Wait for network idle\n    if (this.config.waitForNetworkIdle) {\n      await page.waitForLoadState('networkidle', { timeout: 10000 }).catch(() => {});\n    }\n\n    // Wait for specific selector if provided\n    if (options.waitFor) {\n      await page.waitForSelector(options.waitFor, { timeout: 10000 }).catch(() => {});\n    }\n\n    return new IBRSession(page, driver, this.config);\n  }\n\n  /**\n   * Close the browser instance\n   */\n  async close(): Promise<void> {\n    await closeBrowser();\n  }\n\n  /**\n   * Get configuration\n   */\n  getConfig(): Config {\n    return { ...this.config };\n  }\n\n  /**\n   * Resolve a path to full URL\n   */\n  private resolveUrl(path: string): string {\n    if (path.startsWith('http://') || path.startsWith('https://')) {\n      return path;\n    }\n    return `${this.config.baseUrl}${path.startsWith('/') ? path : `/${path}`}`;\n  }\n\n  /**\n   * Generate a session name from path\n   */\n  private generateSessionName(path: string): string {\n    // Remove leading slash and replace remaining slashes with dashes\n    return path\n      .replace(/^\\/+/, '')\n      .replace(/\\//g, '-')\n      .replace(/[^a-zA-Z0-9-_]/g, '')\n      || 'homepage';\n  }\n}\n\n/**\n * IBRSession - Simplified session with semantic understanding\n *\n * Provides a cleaner API for interacting with pages and getting\n * AI-friendly semantic output.\n */\nexport class IBRSession {\n  /** Page interface for browser interaction */\n  readonly page: CompatPage;\n\n  private driver: EngineDriver;\n  private config: Config;\n\n  constructor(page: CompatPage, driver: EngineDriver, config: Config) {\n    this.page = page;\n    this.driver = driver;\n    this.config = config;\n  }\n\n  /**\n   * Get semantic understanding of the current page\n   */\n  async understand(): Promise<SemanticResult> {\n    return getSemanticOutput(this.page);\n  }\n\n  /**\n   * Get semantic understanding as formatted text\n   */\n  async understandText(): Promise<string> {\n    const result = await getSemanticOutput(this.page);\n    return formatSemanticText(result);\n  }\n\n  /**\n   * Click an element by selector\n   */\n  async click(selector: string): Promise<void> {\n    await this.page.click(selector);\n  }\n\n  /**\n   * Type text into an element\n   */\n  async type(selector: string, text: string): Promise<void> {\n    await this.page.fill(selector, text);\n  }\n\n  /**\n   * Navigate to a new URL\n   */\n  async goto(url: string): Promise<void> {\n    await this.page.goto(url, {\n      waitUntil: 'domcontentloaded',\n      timeout: this.config.timeout,\n    });\n  }\n\n  /**\n   * Wait for a selector to appear\n   */\n  async waitFor(selector: string, timeout = 10000): Promise<void> {\n    await this.page.waitForSelector(selector, { timeout });\n  }\n\n  /**\n   * Take a screenshot\n   */\n  async screenshot(path?: string): Promise<Buffer> {\n    return this.page.screenshot({\n      path,\n      fullPage: this.config.fullPage,\n    });\n  }\n\n  /**\n   * Mock a network request.\n   * NOTE: Network mocking requires CDP Fetch domain support (not yet implemented).\n   * This is a placeholder that throws until CDP Fetch is added to the engine.\n   */\n  async mock(_pattern: string | RegExp, _response: {\n    status?: number;\n    body?: string | object;\n    headers?: Record<string, string>;\n  }): Promise<void> {\n    throw new Error(\n      'Network mocking not yet supported by CDP engine. ' +\n      'This requires the CDP Fetch domain which is planned for a future update.'\n    );\n  }\n\n  /**\n   * Built-in flows for common automation patterns\n   */\n  readonly flow = {\n    /**\n     * Login with email/password\n     * @example\n     * const result = await session.flow.login({ email: 'test@test.com', password: 'secret' });\n     */\n    login: (options: Omit<FlowLoginOptions, 'timeout'>) =>\n      loginFlow(this.page, { ...options, timeout: this.config.timeout }),\n\n    /**\n     * Search for content\n     * @example\n     * const result = await session.flow.search({ query: 'test' });\n     */\n    search: (options: Omit<FlowSearchOptions, 'timeout'>) =>\n      searchFlow(this.page, { ...options, timeout: this.config.timeout }),\n\n    /**\n     * Fill and submit a form\n     * @example\n     * const result = await session.flow.form({\n     *   fields: [{ name: 'email', value: 'test@test.com' }]\n     * });\n     */\n    form: (options: Omit<FlowFormOptions, 'timeout'>) =>\n      formFlow(this.page, { ...options, timeout: this.config.timeout }),\n  };\n\n  /**\n   * Measure Web Vitals performance metrics\n   * @example\n   * const result = await session.measurePerformance();\n   * console.log(result.ratings.LCP); // { value: 1200, rating: 'good' }\n   */\n  async measurePerformance() {\n    const { measurePerformance: mp } = await import('./performance.js');\n    return mp(this.page);\n  }\n\n  /**\n   * Test interactivity of buttons, links, and forms\n   * @example\n   * const result = await session.testInteractivity();\n   * console.log(result.issues); // List of issues with buttons/links\n   */\n  async testInteractivity() {\n    const { testInteractivity: ti } = await import('./interactivity.js');\n    return ti(this.page);\n  }\n\n  /**\n   * Start tracking API request timing\n   * Call before actions, then call stop() to get results\n   * @example\n   * const tracker = session.trackApiTiming({ filter: /\\/api\\// });\n   * tracker.start();\n   * await session.click('button');\n   * const result = tracker.stop();\n   */\n  trackApiTiming(options?: { filter?: RegExp; includeStatic?: boolean; minDuration?: number }) {\n    // Import synchronously for tracker creation\n    const createTracker = async () => {\n      const { createApiTracker } = await import('./api-timing.js');\n      return createApiTracker(this.page, options);\n    };\n    // Return a promise that resolves to the tracker\n    return createTracker();\n  }\n\n  /**\n   * Close the session and browser\n   */\n  async close(): Promise<void> {\n    await this.driver.close();\n  }\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\n// Standalone programmatic API (recommended for most users)\n// compare() and compareAll() are exported inline above\n// Types re-exported for convenience\n\n// Export everything for programmatic use\nexport * from './schemas.js';\nexport * from './types.js';\nexport { DEFAULT_DYNAMIC_SELECTORS } from './types.js';\nexport type { MaskOptions } from './types.js';\nexport { captureScreenshot, closeBrowser, getViewport, captureWithDiagnostics } from './capture.js';\nexport type { CaptureResult } from './capture.js';\nexport { checkConsistency, formatConsistencyReport } from './consistency.js';\nexport type { ConsistencyOptions, ConsistencyResult, PageMetrics, Inconsistency } from './consistency.js';\nexport { compareImages, analyzeComparison, getVerdictDescription, detectChangedRegions } from './compare.js';\nexport type { ExtendedComparisonResult } from './compare.js';\nexport { discoverPages, getNavigationLinks } from './crawl.js';\nexport type { CrawlOptions, CrawlResult, DiscoveredPage } from './crawl.js';\nexport {\n  createSession,\n  getSession,\n  updateSession,\n  markSessionCompared,\n  listSessions,\n  getMostRecentSession,\n  deleteSession,\n  cleanSessions,\n  getSessionPaths,\n  generateSessionId,\n  findSessions,\n  getTimeline,\n  getSessionsByRoute,\n  getSessionStats,\n} from './session.js';\nexport { generateReport, formatReportText, formatReportJson, formatReportMinimal, formatSessionSummary } from './report.js';\nexport {\n  extractApiCalls,\n  scanDirectoryForApiCalls,\n  discoverApiRoutes,\n  filePathToRoute,\n  findOrphanEndpoints,\n  groupByEndpoint,\n  groupByFile,\n  filterByMethod,\n  filterByEndpoint,\n} from './integration.js';\nexport type { ApiCall, ApiRoute } from './integration.js';\nexport { VIEWPORTS };\nexport {\n  registerOperation,\n  completeOperation,\n  getPendingOperations,\n  waitForCompletion,\n  formatPendingOperations,\n  withOperationTracking,\n} from './operation-tracker.js';\nexport type { PendingOperation, OperationState, OperationType } from './operation-tracker.js';\n\n// Semantic layer exports\nexport * from './semantic/index.js';\n\n// Flows exports\nexport * from './flows/index.js';\n\n// Cleanup and retention exports\nexport {\n  enforceRetentionPolicy,\n  maybeAutoClean,\n  getRetentionStatus,\n  formatRetentionStatus,\n  loadRetentionConfig,\n  DEFAULT_RETENTION,\n} from './cleanup.js';\nexport type { RetentionConfig, RetentionResult } from './cleanup.js';\n\n// Performance testing exports\nexport {\n  measureWebVitals,\n  measurePerformance,\n  formatPerformanceResult,\n  PERFORMANCE_THRESHOLDS,\n} from './performance.js';\nexport type {\n  WebVitals,\n  PerformanceResult,\n  PerformanceRating,\n  RatedMetric,\n} from './performance.js';\n\n// Interactivity testing exports\nexport {\n  testInteractivity,\n  formatInteractivityResult,\n} from './interactivity.js';\nexport type {\n  InteractivityResult,\n  InteractiveElement,\n  ButtonInfo,\n  LinkInfo,\n  FormInfo,\n  FormFieldInfo,\n  InteractivityIssue,\n} from './interactivity.js';\n\n// API timing exports\nexport {\n  measureApiTiming,\n  createApiTracker,\n  formatApiTimingResult,\n} from './api-timing.js';\nexport type {\n  ApiTimingResult,\n  ApiRequestTiming,\n  ApiTimingOptions,\n} from './api-timing.js';\n\n// Responsive testing exports\nexport {\n  testResponsive,\n  formatResponsiveResult,\n} from './responsive.js';\nexport type {\n  ResponsiveResult,\n  ViewportResult,\n  LayoutIssue,\n  TouchTargetIssue,\n  TextIssue,\n  ResponsiveTestOptions,\n} from './responsive.js';\n\n// Memory system exports\nexport {\n  initMemory,\n  loadSummary,\n  saveSummary,\n  addPreference,\n  getPreference,\n  removePreference,\n  listPreferences,\n  learnFromSession,\n  listLearned,\n  promoteToPreference,\n  rebuildSummary,\n  archiveSummary,\n  queryMemory,\n  preferencesToRules,\n  createMemoryPreset,\n  formatMemorySummary,\n  formatPreference,\n} from './memory.js';\n\n// Decision context system exports\nexport {\n  recordDecision,\n  getDecisionsByRoute,\n  queryDecisions,\n  getDecision,\n  getTrackedRoutes,\n  getDecisionStats,\n  getDecisionsSize,\n} from './decision-tracker.js';\nexport type { RecordDecisionOptions, QueryDecisionsOptions } from './decision-tracker.js';\n\nexport {\n  loadCompactContext,\n  saveCompactContext,\n  updateCompactContext,\n  compactContext,\n  setActiveRoute,\n  addKnownIssue,\n  isCompactContextOversize,\n} from './context/compact.js';\n\nexport * from './context/types.js';\n\n// Comprehensive scan exports\nexport { scan, formatScanResult, applyDesignSystemCheck } from './scan.js';\nexport type { ScanResult, ScanIssue, ScanOptions } from './scan.js';\n\n// Verdict-engine surface (v3 thesis M1 + B1 streaming)\nexport { ask, askStream } from './ask.js';\nexport type { AskResponse, AskOptions, Finding, Verdict, AskStreamEvent } from './ask.js';\n\n// Browser pool — keeps a warm browser across multiple scan/ask calls in the\n// same process. Drops first-finding latency for the second-and-onwards call\n// by ~600-800ms (the cold-launch share). See src/engine/browser-pool.ts.\nexport { BrowserPool } from './engine/browser-pool.js';\nexport type { BrowserPoolOptions } from './engine/browser-pool.js';\n\n// Rule engine exports\nexport { runAllRules } from './rules/index.js';\nexport type { RuleEngineResult } from './rules/index.js';\n\n// Scan summarization exports\nexport { summarizeScan } from './summarize.js';\nexport type { ScanSummary } from './summarize.js';\n\n// Design token validation exports\nexport { loadTokenSpec, validateAgainstTokens, normalizeColor } from './tokens.js';\nexport type { DesignTokenSpec, TokenViolation } from './tokens.js';\n\n// Design system exports\nexport { loadDesignSystemConfig, runDesignSystemCheck } from './design-system/index.js';\nexport type { DesignSystemConfig } from './design-system/config.js';\nexport type { DesignSystemResult, DesignSystemViolation } from './schemas.js';\nexport { validateExtendedTokens, calculateComplianceScore } from './design-system/tokens/index.js';\nexport { allCalmPrecisionRules, corePrincipleIds, stylisticPrincipleIds } from './design-system/principles/index.js';\n\n// Global memory exports\nexport { promoteToGlobal, seedFromGlobal, listGlobalPreferences, removeGlobalPreference, formatGlobalMemory } from './memory.js';\n\n// Native iOS/watchOS simulator support\nexport * from './native/index.js';\n\n// Browser transport exports\nexport type { BrowserMode, BrowserConnectionOptions, BrowserOptions } from './engine/cdp/browser.js';\nexport type { BrowserLaunchOptions } from './types.js';\n\n// Device emulation exports (CDP-direct, no Playwright dependency)\nexport {\n  DEVICES,\n  DEVICE_NAMES,\n  resolveDevice,\n  deviceToViewport,\n  viewportToConfig,\n  MOBILE_SAFARI_UA,\n  TABLET_SAFARI_UA,\n  ANDROID_CHROME_UA,\n} from './devices.js';\nexport type { DeviceProfile, DeviceName } from './devices.js';\nexport type { ViewportConfig } from './engine/cdp/emulation.js';\n","import { EngineDriver } from './engine/driver.js';\nimport { CompatPage } from './engine/compat.js';\nimport type { PageLike } from './engine/page-like.js';\nimport { mkdir } from 'fs/promises';\nimport { dirname } from 'path';\nimport { VIEWPORTS, type Viewport, type LandmarkElement } from './schemas.js';\nimport { viewportToConfig } from './devices.js';\nimport type { CaptureOptions, MaskOptions } from './types.js';\nimport { DEFAULT_DYNAMIC_SELECTORS } from './types.js';\nimport { loadAuthState, isDeployedEnvironment } from './auth.js';\nimport { detectLandmarks } from './semantic/landmarks.js';\nimport { classifyPageIntent, type PageIntent } from './semantic/page-intent.js';\n\n/**\n * Apply dynamic content masking to a page before screenshot\n */\nasync function applyMasking(page: PageLike, mask?: MaskOptions): Promise<void> {\n  // Default: always disable animations\n  const hideAnimations = mask?.hideAnimations !== false;\n\n  // Build list of selectors to hide\n  const selectorsToHide: string[] = [];\n\n  // Add user-specified selectors\n  if (mask?.selectors) {\n    selectorsToHide.push(...mask.selectors);\n  }\n\n  // Add default dynamic selectors if enabled\n  if (mask?.hideDynamicContent) {\n    selectorsToHide.push(...DEFAULT_DYNAMIC_SELECTORS);\n  }\n\n  // Build CSS rules\n  const cssRules: string[] = [];\n\n  // Animation/transition disabling\n  if (hideAnimations) {\n    cssRules.push(`\n      *, *::before, *::after {\n        animation-duration: 0s !important;\n        animation-delay: 0s !important;\n        transition-duration: 0s !important;\n        transition-delay: 0s !important;\n        scroll-behavior: auto !important;\n      }\n      @keyframes none { }\n    `);\n  }\n\n  // Hide specified elements\n  if (selectorsToHide.length > 0) {\n    const selectorList = selectorsToHide.join(',\\n');\n    cssRules.push(`\n      ${selectorList} {\n        visibility: hidden !important;\n        opacity: 0 !important;\n      }\n    `);\n  }\n\n  // Inject CSS\n  if (cssRules.length > 0) {\n    await page.addStyleTag({\n      content: cssRules.join('\\n'),\n    });\n  }\n\n  // Apply text pattern masking via JavaScript\n  if (mask?.textPatterns && mask.textPatterns.length > 0) {\n    const placeholder = mask.placeholder || '███';\n    const patterns = mask.textPatterns.map(p =>\n      typeof p === 'string' ? p : p.source\n    );\n\n    await page.evaluate(({ patterns, placeholder }: { patterns: string[]; placeholder: string }) => {\n      const walker = document.createTreeWalker(\n        document.body,\n        NodeFilter.SHOW_TEXT,\n        null\n      );\n\n      const textNodes: Text[] = [];\n      let node: Text | null;\n      while ((node = walker.nextNode() as Text | null)) {\n        textNodes.push(node);\n      }\n\n      for (const textNode of textNodes) {\n        let text = textNode.textContent || '';\n        for (const pattern of patterns) {\n          const regex = new RegExp(pattern, 'gi');\n          text = text.replace(regex, placeholder);\n        }\n        if (text !== textNode.textContent) {\n          textNode.textContent = text;\n        }\n      }\n    }, { patterns, placeholder });\n  }\n}\n\n/**\n * Capture result with timing and diagnostic info\n */\nexport interface CaptureResult {\n  success: boolean;\n  outputPath?: string;\n  timing: {\n    navigationMs: number;\n    renderMs: number;\n    totalMs: number;\n  };\n  diagnostics: {\n    httpStatus?: number;\n    consoleErrors: string[];\n    networkErrors: string[];\n    suggestions: string[];\n  };\n  error?: {\n    type: 'timeout' | 'navigation' | 'screenshot' | 'unknown';\n    message: string;\n    suggestion: string;\n  };\n}\n\n\n\nlet driver: EngineDriver | null = null;\n\n/**\n * Close the browser instance\n */\nexport async function closeBrowser(): Promise<void> {\n  if (driver) {\n    await driver.close();\n    driver = null;\n  }\n}\n\n/**\n * Capture a screenshot of a URL\n */\nexport async function captureScreenshot(\n  options: CaptureOptions & { outputDir?: string }\n): Promise<string> {\n  const {\n    url,\n    outputPath,\n    viewport = VIEWPORTS.desktop,\n    fullPage = true,\n    headed = false,\n    waitForNetworkIdle = true,\n    timeout = 30000,\n    outputDir,\n    selector,\n    waitFor,\n    delay,\n    browserMode,\n    cdpUrl,\n    wsEndpoint,\n    chromePath,\n  } = options;\n\n  // Ensure output directory exists\n  await mkdir(dirname(outputPath), { recursive: true });\n\n  // Load auth state if available (handles validation, expiration, user isolation)\n  if (outputDir && !isDeployedEnvironment()) {\n    const authState = await loadAuthState(outputDir);\n    if (authState) {\n      console.log('🔐 Using saved authentication state');\n    }\n  }\n\n  const driverInstance = new EngineDriver();\n  await driverInstance.launch({\n    headless: !headed,\n    viewport: viewportToConfig(viewport),\n    mode: browserMode,\n    cdpUrl,\n    wsEndpoint,\n    chromePath,\n  });\n  const page = new CompatPage(driverInstance);\n\n  try {\n    // Navigate to URL\n    await page.goto(url, {\n      waitUntil: waitForNetworkIdle ? 'networkidle' : 'load',\n      timeout,\n    });\n\n    // Wait for specific selector if provided (for dynamic content)\n    if (waitFor) {\n      await page.waitForSelector(waitFor, { timeout });\n    }\n\n    // Wait for any remaining animations to settle (or custom delay for JS-heavy pages)\n    await page.waitForTimeout(delay ?? 500);\n\n    // Apply dynamic content masking (includes animation disabling)\n    await applyMasking(page, options.mask);\n\n    // Take screenshot - element or full page\n    if (selector) {\n      // Wait for element and capture just that element\n      const element = await page.waitForSelector(selector, { timeout: 5000 });\n      if (!element) {\n        throw new Error(`Element not found: ${selector}`);\n      }\n      await element.screenshot({\n        path: outputPath,\n        type: 'png',\n      });\n    } else {\n      await page.screenshot({\n        path: outputPath,\n        fullPage,\n        type: 'png',\n      });\n    }\n\n    return outputPath;\n  } finally {\n    await driverInstance.close();\n  }\n}\n\n/**\n * Capture result with landmark detection\n */\nexport interface CaptureWithLandmarksResult {\n  outputPath: string;\n  landmarkElements: LandmarkElement[];\n  pageIntent: PageIntent;\n}\n\n/**\n * Capture a screenshot and detect landmark elements\n * Used during baseline capture to store expected elements\n */\nexport async function captureWithLandmarks(\n  options: CaptureOptions & { outputDir?: string }\n): Promise<CaptureWithLandmarksResult> {\n  const {\n    url,\n    outputPath,\n    viewport = VIEWPORTS.desktop,\n    fullPage = true,\n    headed = false,\n    waitForNetworkIdle = true,\n    timeout = 30000,\n    outputDir,\n    selector,\n    waitFor,\n    browserMode,\n    cdpUrl,\n    wsEndpoint,\n    chromePath,\n  } = options;\n\n  // Ensure output directory exists\n  await mkdir(dirname(outputPath), { recursive: true });\n\n  // Load auth state if available\n  if (outputDir && !isDeployedEnvironment()) {\n    const authState = await loadAuthState(outputDir);\n    if (authState) {\n      console.log('🔐 Using saved authentication state');\n    }\n  }\n\n  const driverInstance = new EngineDriver();\n  await driverInstance.launch({\n    headless: !headed,\n    viewport: viewportToConfig(viewport),\n    mode: browserMode,\n    cdpUrl,\n    wsEndpoint,\n    chromePath,\n  });\n  const page = new CompatPage(driverInstance);\n\n  try {\n    // Navigate to URL\n    await page.goto(url, {\n      waitUntil: waitForNetworkIdle ? 'networkidle' : 'load',\n      timeout,\n    });\n\n    // Wait for specific selector if provided\n    if (waitFor) {\n      await page.waitForSelector(waitFor, { timeout });\n    }\n\n    // Wait for animations to settle\n    await page.waitForTimeout(500);\n\n    // Detect page intent and landmarks while page is still open\n    const intentResult = await classifyPageIntent(page);\n    const landmarkElements = await detectLandmarks(page);\n\n    // Apply dynamic content masking (includes animation disabling)\n    await applyMasking(page, options.mask);\n\n    // Take screenshot\n    if (selector) {\n      const element = await page.waitForSelector(selector, { timeout: 5000 });\n      if (!element) {\n        throw new Error(`Element not found: ${selector}`);\n      }\n      await element.screenshot({\n        path: outputPath,\n        type: 'png',\n      });\n    } else {\n      await page.screenshot({\n        path: outputPath,\n        fullPage,\n        type: 'png',\n      });\n    }\n\n    return {\n      outputPath,\n      landmarkElements,\n      pageIntent: intentResult.intent,\n    };\n  } finally {\n    await driverInstance.close();\n  }\n}\n\n/**\n * Get viewport dimensions by name\n */\nexport function getViewport(name: 'desktop' | 'mobile' | 'tablet'): Viewport {\n  return VIEWPORTS[name];\n}\n\n/**\n * Capture multiple viewports\n */\nexport async function captureMultipleViewports(\n  url: string,\n  outputDir: string,\n  viewports: Array<'desktop' | 'mobile' | 'tablet'> = ['desktop'],\n  options: Omit<CaptureOptions, 'url' | 'outputPath' | 'viewport'> = {}\n): Promise<Record<string, string>> {\n  const results: Record<string, string> = {};\n\n  for (const viewportName of viewports) {\n    const viewport = getViewport(viewportName);\n    const outputPath = `${outputDir}/${viewportName}.png`;\n\n    await captureScreenshot({\n      url,\n      outputPath,\n      viewport,\n      ...options,\n    });\n\n    results[viewportName] = outputPath;\n  }\n\n  return results;\n}\n\n/**\n * Enhanced capture with detailed timing and diagnostics\n * Returns actionable info for debugging slow loads or errors\n */\nexport async function captureWithDiagnostics(\n  options: CaptureOptions & { outputDir?: string }\n): Promise<CaptureResult> {\n  const {\n    url,\n    outputPath,\n    viewport = VIEWPORTS.desktop,\n    fullPage = true,\n    headed = false,\n    waitForNetworkIdle = true,\n    timeout = 30000,\n    outputDir,\n    selector,\n    browserMode,\n    cdpUrl,\n    wsEndpoint,\n    chromePath,\n  } = options;\n\n  const startTime = Date.now();\n  let navigationTime = 0;\n  let renderTime = 0;\n\n  const consoleErrors: string[] = [];\n  const networkErrors: string[] = [];\n  const suggestions: string[] = [];\n  let httpStatus: number | undefined;\n\n  try {\n    // Ensure output directory exists\n    await mkdir(dirname(outputPath), { recursive: true });\n\n    // Load auth state if available\n    if (outputDir && !isDeployedEnvironment()) {\n      await loadAuthState(outputDir);\n    }\n\n    const driverInstance = new EngineDriver();\n    await driverInstance.launch({\n      headless: !headed,\n      viewport: viewportToConfig(viewport),\n      mode: browserMode,\n      cdpUrl,\n      wsEndpoint,\n      chromePath,\n    });\n    const page = new CompatPage(driverInstance);\n\n    // Collect console errors\n    page.on('console', msg => {\n      if (msg.type() === 'error') {\n        consoleErrors.push(msg.text());\n      }\n    });\n\n    // Collect network errors\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    page.on?.('requestfailed', ((request: { failure(): { errorText?: string } | null; url(): string }) => {\n      const failure = request.failure();\n      networkErrors.push(`${request.url()}: ${failure?.errorText || 'failed'}`);\n    }) as any);\n\n    // Track HTTP status\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    page.on?.('response', ((response: { url(): string; status(): number }) => {\n      if (response.url() === url || response.url() === url + '/') {\n        httpStatus = response.status();\n      }\n    }) as any);\n\n    try {\n      const navStart = Date.now();\n      await page.goto(url, {\n        waitUntil: waitForNetworkIdle ? 'networkidle' : 'load',\n        timeout,\n      });\n      navigationTime = Date.now() - navStart;\n    } catch (navError) {\n      await driverInstance.close();\n\n      const errorMsg = navError instanceof Error ? navError.message : String(navError);\n      const isTimeout = errorMsg.includes('Timeout');\n\n      // Generate helpful suggestions\n      if (isTimeout) {\n        suggestions.push(`Page took longer than ${timeout}ms to load`);\n        suggestions.push('Try increasing timeout: --timeout 60000');\n        if (waitForNetworkIdle) {\n          suggestions.push('Try disabling network idle wait: use \"load\" instead of \"networkidle\"');\n        }\n      }\n      if (networkErrors.length > 0) {\n        suggestions.push(`${networkErrors.length} network request(s) failed`);\n      }\n      if (httpStatus && httpStatus >= 400) {\n        suggestions.push(`Server returned HTTP ${httpStatus}`);\n      }\n\n      return {\n        success: false,\n        timing: {\n          navigationMs: Date.now() - startTime,\n          renderMs: 0,\n          totalMs: Date.now() - startTime,\n        },\n        diagnostics: {\n          httpStatus,\n          consoleErrors,\n          networkErrors,\n          suggestions,\n        },\n        error: {\n          type: isTimeout ? 'timeout' : 'navigation',\n          message: errorMsg,\n          suggestion: isTimeout\n            ? `Increase timeout or check if ${url} is responding`\n            : `Check if the server is running at ${url}`,\n        },\n      };\n    }\n\n    // Wait for animations to settle\n    await page.waitForTimeout(500);\n\n    // Apply dynamic content masking (includes animation disabling)\n    await applyMasking(page, options.mask);\n\n    // Take screenshot - element or full page\n    const renderStart = Date.now();\n    if (selector) {\n      const element = await page.waitForSelector(selector, { timeout: 5000 });\n      if (!element) {\n        throw new Error(`Element not found: ${selector}`);\n      }\n      await element.screenshot({\n        path: outputPath,\n        type: 'png',\n      });\n    } else {\n      await page.screenshot({\n        path: outputPath,\n        fullPage,\n        type: 'png',\n      });\n    }\n    renderTime = Date.now() - renderStart;\n\n    await driverInstance.close();\n\n    // Generate performance suggestions\n    if (navigationTime > 5000) {\n      suggestions.push(`Slow page load: ${(navigationTime / 1000).toFixed(1)}s`);\n    }\n    if (consoleErrors.length > 0) {\n      suggestions.push(`${consoleErrors.length} JavaScript error(s) detected`);\n    }\n\n    return {\n      success: true,\n      outputPath,\n      timing: {\n        navigationMs: navigationTime,\n        renderMs: renderTime,\n        totalMs: Date.now() - startTime,\n      },\n      diagnostics: {\n        httpStatus,\n        consoleErrors,\n        networkErrors,\n        suggestions,\n      },\n    };\n  } catch (error) {\n    const errorMsg = error instanceof Error ? error.message : String(error);\n\n    return {\n      success: false,\n      timing: {\n        navigationMs: navigationTime,\n        renderMs: renderTime,\n        totalMs: Date.now() - startTime,\n      },\n      diagnostics: {\n        httpStatus,\n        consoleErrors,\n        networkErrors,\n        suggestions,\n      },\n      error: {\n        type: 'unknown',\n        message: errorMsg,\n        suggestion: 'Check that Chrome is installed and accessible. IBR uses a direct CDP connection — ensure Chrome is available on your PATH or at the default install location.',\n      },\n    };\n  }\n}\n","import type {\n  Config,\n  Session,\n  ComparisonResult,\n  ComparisonReport,\n  Viewport,\n  Analysis,\n} from './schemas.js';\nimport type { BrowserMode } from './engine/cdp/browser.js';\n\nexport interface BrowserLaunchOptions {\n  browserMode?: BrowserMode;\n  cdpUrl?: string;\n  wsEndpoint?: string;\n  chromePath?: string;\n}\n\n/**\n * Options for starting a visual session\n */\nexport interface StartSessionOptions extends BrowserLaunchOptions {\n  name?: string;\n  viewport?: Viewport;\n  fullPage?: boolean;\n  /** CSS selector to capture specific element instead of full page */\n  selector?: string;\n  /** CSS selector to wait for before capturing screenshot */\n  waitFor?: string;\n  /** Show a visible browser window instead of headless mode */\n  headed?: boolean;\n}\n\n/**\n * Result from starting a session\n */\nexport interface StartSessionResult {\n  sessionId: string;\n  baseline: string;\n  session: Session;\n}\n\n/**\n * Options for masking dynamic content during capture\n */\nexport interface MaskOptions {\n  /** CSS selectors of elements to hide (set visibility: hidden) */\n  selectors?: string[];\n  /** Text patterns to mask (replaced with placeholder) */\n  textPatterns?: Array<string | RegExp>;\n  /** Hide common dynamic elements automatically (timestamps, spinners, etc.) */\n  hideDynamicContent?: boolean;\n  /** Disable all animations and transitions (default: true) */\n  hideAnimations?: boolean;\n  /** Replace masked text with this placeholder (default: '███') */\n  placeholder?: string;\n}\n\n/**\n * Default selectors for common dynamic content\n */\nexport const DEFAULT_DYNAMIC_SELECTORS = [\n  // Timestamps and dates\n  '[data-testid*=\"timestamp\"]',\n  '[data-testid*=\"date\"]',\n  '[data-testid*=\"time\"]',\n  '[class*=\"timestamp\"]',\n  '[class*=\"relative-time\"]',\n  '[class*=\"timeago\"]',\n  'time[datetime]',\n  // Loading indicators\n  '[class*=\"loading\"]',\n  '[class*=\"spinner\"]',\n  '[class*=\"skeleton\"]',\n  '[class*=\"shimmer\"]',\n  '[role=\"progressbar\"]',\n  // Live counters\n  '[class*=\"live-count\"]',\n  '[class*=\"viewer-count\"]',\n  '[class*=\"online-count\"]',\n  // Avatars with random colors\n  '[class*=\"avatar\"][style*=\"background\"]',\n  // Random IDs displayed\n  '[data-testid*=\"session-id\"]',\n  '[class*=\"request-id\"]',\n];\n\n/**\n * Options for capturing a screenshot\n */\nexport interface CaptureOptions extends BrowserLaunchOptions {\n  url: string;\n  outputPath: string;\n  viewport?: Viewport;\n  fullPage?: boolean;\n  headed?: boolean;\n  waitForNetworkIdle?: boolean;\n  timeout?: number;\n  /** CSS selector to capture specific element instead of full page */\n  selector?: string;\n  /** CSS selector to wait for before capturing screenshot */\n  waitFor?: string;\n  /** Extra ms to wait after page load and before screenshot (for JS-heavy pages) */\n  delay?: number;\n  /** Options for masking dynamic content */\n  mask?: MaskOptions;\n}\n\n/**\n * Options for comparing images\n */\nexport interface CompareOptions {\n  baselinePath: string;\n  currentPath: string;\n  diffPath: string;\n  threshold?: number;\n}\n\n/**\n * Session file paths\n */\nexport interface SessionPaths {\n  root: string;\n  sessionJson: string;\n  baseline: string;\n  current: string;\n  diff: string;\n}\n\n/**\n * CLI output format\n */\nexport type OutputFormat = 'json' | 'text' | 'minimal';\n\n/**\n * Session list item for display\n */\nexport interface SessionListItem {\n  id: string;\n  name: string;\n  url: string;\n  status: string;\n  createdAt: string;\n  viewport: string;\n}\n\n/**\n * Clean options\n */\nexport interface CleanOptions {\n  olderThan?: string; // e.g., '7d', '24h'\n  keepLast?: number;\n  dryRun?: boolean;\n}\n\n/**\n * Serve options\n */\nexport interface ServeOptions {\n  port?: number;\n  open?: boolean;\n}\n\n/**\n * Authentication options for capture\n */\nexport interface AuthOptions {\n  storageStatePath?: string;\n}\n\n/**\n * Login options\n */\nexport interface LoginOptions {\n  url: string;\n  outputDir: string;\n  timeout?: number;\n  headed?: boolean;\n  browserMode?: BrowserMode;\n  cdpUrl?: string;\n  wsEndpoint?: string;\n  chromePath?: string;\n}\n\n// Re-export schema types for convenience\nexport type {\n  Config,\n  Session,\n  ComparisonResult,\n  ComparisonReport,\n  Viewport,\n  Analysis,\n};\n","import { EngineDriver } from './engine/driver.js';\nimport { CompatPage } from './engine/compat.js';\nimport { mkdir, access, readFile, writeFile, unlink, chmod, stat } from 'fs/promises';\nimport { join, resolve } from 'path';\nimport { existsSync, readFileSync } from 'fs';\nimport { userInfo, homedir } from 'os';\nimport { createHash, randomBytes } from 'crypto';\nimport type { LoginOptions } from './types.js';\n\n// Auth state file name (reserved for future use)\n// const AUTH_STATE_FILE = 'auth.json';\n\n/**\n * Auth state with metadata for security\n */\ninterface StoredAuthState {\n  state: object; // Playwright storage state\n  metadata: {\n    createdAt: number;\n    expiresAt: number;\n    username: string;\n    projectPath: string;\n  };\n}\n\n/**\n * Check if running in a CI/CD or deployed environment\n * Auth operations should be blocked in these environments\n */\nexport function isDeployedEnvironment(): boolean {\n  return !!(\n    process.env.VERCEL ||\n    process.env.NETLIFY ||\n    process.env.CI ||\n    process.env.GITHUB_ACTIONS ||\n    process.env.GITLAB_CI ||\n    process.env.CIRCLECI ||\n    process.env.JENKINS_URL ||\n    process.env.TRAVIS ||\n    process.env.HEROKU ||\n    process.env.AWS_LAMBDA_FUNCTION_NAME ||\n    process.env.AZURE_FUNCTIONS_ENVIRONMENT\n  );\n}\n\n/**\n * Get the path to the auth state file\n * Uses per-user isolation to prevent credential sharing\n */\nexport function getAuthStatePath(outputDir: string): string {\n  const username = userInfo().username;\n  // Include username in filename for user isolation\n  return join(outputDir, `auth.${username}.json`);\n}\n\n/**\n * Get a secure auth path in user's home directory (alternative)\n * This keeps auth completely outside the project directory\n */\nexport function getSecureAuthPath(projectPath: string): string {\n  const username = userInfo().username;\n  // Hash project path to create unique identifier\n  const projectHash = createHash('sha256')\n    .update(resolve(projectPath))\n    .digest('hex')\n    .substring(0, 16);\n\n  return join(\n    homedir(),\n    '.config',\n    'ibr',\n    'auth',\n    `${projectHash}.${username}.json`\n  );\n}\n\n/**\n * Check if .gitignore properly excludes .ibr directory\n */\nfunction validateGitignore(projectDir: string): void {\n  const gitignorePath = join(projectDir, '.gitignore');\n\n  if (existsSync(gitignorePath)) {\n    const gitignore = readFileSync(gitignorePath, 'utf-8');\n    const lines = gitignore.split('\\n').map(l => l.trim());\n\n    const hasIbrIgnore = lines.some(line =>\n      line === '.ibr/' ||\n      line === '.ibr' ||\n      line === '**/.ibr/' ||\n      line === '**/.ibr'\n    );\n\n    if (!hasIbrIgnore) {\n      console.warn('\\n⚠️  WARNING: .ibr/ is not in .gitignore!');\n      console.warn('   Add \".ibr/\" to .gitignore to prevent credential leaks.\\n');\n    }\n  } else {\n    console.warn('\\n⚠️  No .gitignore found. Create one with \".ibr/\" entry.\\n');\n  }\n}\n\n/**\n * Check if auth state exists\n */\nexport async function hasAuthState(outputDir: string): Promise<boolean> {\n  try {\n    await access(getAuthStatePath(outputDir));\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Load auth state if it exists and is valid\n */\nexport async function loadAuthState(outputDir: string): Promise<object | null> {\n  // Block in deployed environments\n  if (isDeployedEnvironment()) {\n    console.warn('⚠️  Deployed environment detected. Auth state not available.');\n    return null;\n  }\n\n  try {\n    const authPath = getAuthStatePath(outputDir);\n    const content = await readFile(authPath, 'utf-8');\n    const stored: StoredAuthState = JSON.parse(content);\n\n    // Validate metadata exists\n    if (!stored.metadata) {\n      console.warn('⚠️  Legacy auth format detected. Please re-authenticate with `ibr login`.');\n      return null;\n    }\n\n    // Check user matches\n    const currentUser = userInfo().username;\n    if (stored.metadata.username !== currentUser) {\n      console.warn(`⚠️  Auth state belongs to different user (${stored.metadata.username}).`);\n      return null;\n    }\n\n    // Check expiration\n    if (Date.now() > stored.metadata.expiresAt) {\n      console.warn('⚠️  Auth state expired. Please re-authenticate with `ibr login`.');\n      await clearAuthState(outputDir);\n      return null;\n    }\n\n    // Warn if auth is getting old (> 24 hours)\n    const ageHours = (Date.now() - stored.metadata.createdAt) / (1000 * 60 * 60);\n    if (ageHours > 24) {\n      console.warn(`⚠️  Auth state is ${Math.floor(ageHours)} hours old. Consider re-authenticating.`);\n    }\n\n    return stored.state;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Open a browser for manual login and save the state\n *\n * This opens a visible browser window where the user can:\n * 1. Navigate to login page\n * 2. Enter credentials\n * 3. Complete any 2FA or other auth steps\n *\n * When done, close the browser or press Ctrl+C to save the state.\n */\nexport async function performLogin(options: LoginOptions): Promise<string> {\n  const {\n    url,\n    outputDir,\n    timeout = 300000,\n    headed = true,\n    browserMode,\n    cdpUrl,\n    wsEndpoint,\n    chromePath,\n  } = options; // 5 min default timeout\n\n  // Block in deployed environments\n  if (isDeployedEnvironment()) {\n    throw new Error(\n      'Authentication cannot be performed in deployed environments.\\n' +\n      'Run `ibr login` locally on your development machine.'\n    );\n  }\n\n  // Validate .gitignore before storing credentials\n  validateGitignore(process.cwd());\n\n  // Ensure output directory exists with restricted permissions\n  await mkdir(outputDir, { recursive: true, mode: 0o700 }); // rwx------\n\n  // Fix permissions on existing directory\n  try {\n    await chmod(outputDir, 0o700);\n  } catch {\n    // Ignore if chmod fails (e.g., on Windows)\n  }\n\n  const authStatePath = getAuthStatePath(outputDir);\n  const currentUser = userInfo().username;\n\n  console.log('\\n🔐 Opening browser for login...');\n  console.log(`   User: ${currentUser}`);\n  console.log('   Navigate to your login page and complete authentication.');\n  console.log('   When finished, close the browser window to save your session.\\n');\n\n  const driver = new EngineDriver();\n  await driver.launch({\n    headless: !headed,\n    viewport: { width: 1280, height: 800 },\n    mode: browserMode,\n    cdpUrl,\n    wsEndpoint,\n    chromePath,\n  });\n  const page = new CompatPage(driver);\n\n  try {\n    // Navigate to the provided URL\n    await page.goto(url, {\n      waitUntil: 'domcontentloaded',\n      timeout: 30000,\n    });\n\n    // Wait for the timeout duration — user performs login in the visible browser\n    await Promise.race([\n      new Promise<void>((_, reject) => {\n        setTimeout(() => reject(new Error('Login timeout exceeded')), timeout);\n      }),\n    ]);\n\n  } catch (error) {\n    // If driver is still running, save state before closing\n    if (driver.isLaunched) {\n      await saveAuthState(driver, authStatePath, outputDir);\n      await driver.close();\n    }\n\n    // Check if it was a timeout or browser close\n    if (error instanceof Error && error.message.includes('timeout')) {\n      throw error;\n    }\n  }\n\n  // Save state and close\n  if (driver.isLaunched) {\n    await saveAuthState(driver, authStatePath, outputDir);\n    await driver.close();\n  }\n\n  console.log(`\\n✅ Auth state saved for user: ${currentUser}`);\n  console.log(`   Location: ${authStatePath}`);\n  console.log('   Expires: 7 days from now');\n  console.log('   Future captures will use this authentication.\\n');\n\n  return authStatePath;\n}\n\n/**\n * Save auth state with metadata and secure permissions\n */\nasync function saveAuthState(\n  driver: EngineDriver,\n  authStatePath: string,\n  _outputDir: string\n): Promise<void> {\n  const cookies = await driver.getCookies();\n  const state = { cookies, origins: [] };\n  const currentUser = userInfo().username;\n\n  const storedState: StoredAuthState = {\n    state,\n    metadata: {\n      createdAt: Date.now(),\n      expiresAt: Date.now() + (7 * 24 * 60 * 60 * 1000), // 7 days\n      username: currentUser,\n      projectPath: resolve(process.cwd()),\n    }\n  };\n\n  // Write with restricted permissions (owner read/write only)\n  await writeFile(\n    authStatePath,\n    JSON.stringify(storedState, null, 2),\n    { mode: 0o600 } // rw-------\n  );\n\n  // Ensure permissions are correct (in case file existed)\n  try {\n    await chmod(authStatePath, 0o600);\n  } catch {\n    // Ignore if chmod fails (e.g., on Windows)\n  }\n}\n\n/**\n * Clear saved auth state with secure deletion\n */\nexport async function clearAuthState(outputDir: string): Promise<void> {\n  const authPath = getAuthStatePath(outputDir);\n\n  try {\n    // Get file stats for size\n    const stats = await stat(authPath);\n\n    // Overwrite with random data before deletion (secure delete)\n    const randomData = randomBytes(stats.size);\n    await writeFile(authPath, randomData, { mode: 0o600 });\n\n    // Now delete the file\n    await unlink(authPath);\n\n    console.log('✅ Auth state securely cleared');\n  } catch {\n    console.log('ℹ️  No auth state to clear');\n  }\n}\n\n/**\n * Get auth state info without loading the full state\n */\nexport async function getAuthStateInfo(outputDir: string): Promise<{\n  exists: boolean;\n  username?: string;\n  createdAt?: Date;\n  expiresAt?: Date;\n  expired?: boolean;\n} | null> {\n  try {\n    const authPath = getAuthStatePath(outputDir);\n    const content = await readFile(authPath, 'utf-8');\n    const stored: StoredAuthState = JSON.parse(content);\n\n    if (!stored.metadata) {\n      return { exists: true };\n    }\n\n    return {\n      exists: true,\n      username: stored.metadata.username,\n      createdAt: new Date(stored.metadata.createdAt),\n      expiresAt: new Date(stored.metadata.expiresAt),\n      expired: Date.now() > stored.metadata.expiresAt,\n    };\n  } catch {\n    return null;\n  }\n}\n","import pixelmatch from 'pixelmatch';\nimport { PNG } from 'pngjs';\nimport { readFile, writeFile, mkdir } from 'fs/promises';\nimport { dirname } from 'path';\nimport type { CompareOptions } from './types.js';\nimport type { ComparisonResult, Analysis, ChangedRegion, Verdict } from './schemas.js';\n\n/**\n * Region detection configuration\n * Divides page into semantic regions based on common layout patterns\n */\ninterface RegionConfig {\n  name: string;\n  location: 'top' | 'bottom' | 'left' | 'right' | 'center' | 'full';\n  // Percentages of page dimensions\n  xStart: number;  // 0-1\n  xEnd: number;    // 0-1\n  yStart: number;  // 0-1\n  yEnd: number;    // 0-1\n}\n\n/**\n * Default regions based on common web layouts\n * Header (top 10%), Footer (bottom 10%), Left sidebar (left 20%), Content (center)\n */\nconst DEFAULT_REGIONS: RegionConfig[] = [\n  { name: 'header', location: 'top', xStart: 0, xEnd: 1, yStart: 0, yEnd: 0.1 },\n  { name: 'navigation', location: 'left', xStart: 0, xEnd: 0.2, yStart: 0.1, yEnd: 0.9 },\n  { name: 'content', location: 'center', xStart: 0.2, xEnd: 1, yStart: 0.1, yEnd: 0.9 },\n  { name: 'footer', location: 'bottom', xStart: 0, xEnd: 1, yStart: 0.9, yEnd: 1 },\n];\n\n/**\n * Analyze diff image to detect which regions have changes\n */\nexport function detectChangedRegions(\n  diffData: Uint8Array,\n  width: number,\n  height: number,\n  regions: RegionConfig[] = DEFAULT_REGIONS\n): ChangedRegion[] {\n  const changedRegions: ChangedRegion[] = [];\n\n  for (const region of regions) {\n    // Calculate pixel bounds\n    const xStart = Math.floor(region.xStart * width);\n    const xEnd = Math.floor(region.xEnd * width);\n    const yStart = Math.floor(region.yStart * height);\n    const yEnd = Math.floor(region.yEnd * height);\n\n    const regionWidth = xEnd - xStart;\n    const regionHeight = yEnd - yStart;\n    const regionPixels = regionWidth * regionHeight;\n\n    if (regionPixels === 0) continue;\n\n    // Count red pixels (diff color) in this region\n    let diffPixels = 0;\n\n    for (let y = yStart; y < yEnd; y++) {\n      for (let x = xStart; x < xEnd; x++) {\n        const idx = (y * width + x) * 4;\n        // Check if pixel is red (diff marker from pixelmatch)\n        // pixelmatch uses [255, 0, 0] for differences\n        if (diffData[idx] === 255 && diffData[idx + 1] === 0 && diffData[idx + 2] === 0) {\n          diffPixels++;\n        }\n      }\n    }\n\n    const diffPercent = (diffPixels / regionPixels) * 100;\n\n    // Only report regions with >0.1% changes\n    if (diffPercent > 0.1) {\n      const severity = diffPercent > 30 ? 'critical' :\n                       diffPercent > 10 ? 'unexpected' : 'expected';\n\n      changedRegions.push({\n        location: region.location,\n        bounds: {\n          x: xStart,\n          y: yStart,\n          width: regionWidth,\n          height: regionHeight,\n        },\n        description: `${region.name}: ${diffPercent.toFixed(1)}% changed`,\n        severity,\n      });\n    }\n  }\n\n  // Sort by severity (critical first) then by diff percentage\n  return changedRegions.sort((a, b) => {\n    const severityOrder = { critical: 0, unexpected: 1, expected: 2 };\n    const aSev = severityOrder[a.severity];\n    const bSev = severityOrder[b.severity];\n    if (aSev !== bSev) return aSev - bSev;\n\n    // Parse percentage from description for secondary sort\n    const aPercent = parseFloat(a.description.match(/(\\d+\\.?\\d*)%/)?.[1] || '0');\n    const bPercent = parseFloat(b.description.match(/(\\d+\\.?\\d*)%/)?.[1] || '0');\n    return bPercent - aPercent;\n  });\n}\n\n/**\n * Extended comparison result with diff image data for regional analysis\n */\nexport interface ExtendedComparisonResult extends ComparisonResult {\n  diffData?: Uint8Array;\n  width?: number;\n  height?: number;\n}\n\n/**\n * Compare two images using pixelmatch\n */\nexport async function compareImages(options: CompareOptions): Promise<ExtendedComparisonResult> {\n  const {\n    baselinePath,\n    currentPath,\n    diffPath,\n    threshold = 0.1, // pixelmatch threshold (0-1), lower = stricter\n  } = options;\n\n  // Read images\n  const [baselineBuffer, currentBuffer] = await Promise.all([\n    readFile(baselinePath),\n    readFile(currentPath),\n  ]);\n\n  const baseline = PNG.sync.read(baselineBuffer);\n  const current = PNG.sync.read(currentBuffer);\n\n  // Ensure images have same dimensions\n  if (baseline.width !== current.width || baseline.height !== current.height) {\n    throw new Error(\n      `Image dimensions mismatch: baseline (${baseline.width}x${baseline.height}) vs current (${current.width}x${current.height})`\n    );\n  }\n\n  const { width, height } = baseline;\n  const diff = new PNG({ width, height });\n  const totalPixels = width * height;\n\n  // Run pixelmatch\n  const diffPixels = pixelmatch(\n    baseline.data,\n    current.data,\n    diff.data,\n    width,\n    height,\n    {\n      threshold,\n      includeAA: false, // Ignore anti-aliasing differences\n      alpha: 0.1,\n      diffColor: [255, 0, 0], // Red for differences\n      diffColorAlt: [0, 255, 0], // Green for anti-aliased differences\n    }\n  );\n\n  // Ensure output directory exists\n  await mkdir(dirname(diffPath), { recursive: true });\n\n  // Write diff image\n  await writeFile(diffPath, PNG.sync.write(diff));\n\n  const diffPercent = (diffPixels / totalPixels) * 100;\n\n  return {\n    match: diffPixels === 0,\n    diffPercent: Math.round(diffPercent * 100) / 100, // Round to 2 decimal places\n    diffPixels,\n    totalPixels,\n    threshold,\n    // Include diff data for regional analysis\n    diffData: diff.data,\n    width,\n    height,\n  };\n}\n\n/**\n * Analyze comparison result and generate verdict with regional analysis\n */\nexport function analyzeComparison(\n  result: ExtendedComparisonResult,\n  thresholdPercent: number = 1.0\n): Analysis {\n  const { match, diffPercent, diffData, width, height } = result;\n\n  // Detect changed regions if diff data is available\n  let detectedRegions: ChangedRegion[] = [];\n  if (diffData && width && height && !match) {\n    detectedRegions = detectChangedRegions(diffData, width, height);\n  }\n\n  // Analyze regions for verdict determination\n  const criticalRegions = detectedRegions.filter(r => r.severity === 'critical');\n  const unexpectedRegions = detectedRegions.filter(r => r.severity === 'unexpected');\n  const hasNavigationChanges = detectedRegions.some(r =>\n    r.description.toLowerCase().includes('navigation') ||\n    r.description.toLowerCase().includes('header')\n  );\n\n  // Determine verdict based on regions and overall diff\n  let verdict: Verdict;\n  let summary: string;\n  let recommendation: string | null = null;\n\n  if (match || diffPercent === 0) {\n    verdict = 'MATCH';\n    summary = 'No visual changes detected. Screenshots are identical.';\n  } else if (criticalRegions.length > 0) {\n    verdict = 'LAYOUT_BROKEN';\n    const regionNames = criticalRegions.map(r =>\n      r.description.split(':')[0]\n    ).join(', ');\n    summary = `Critical changes in: ${regionNames}. Layout may be broken.`;\n    recommendation = `Major changes detected in ${regionNames}. Check for missing elements, broken layout, or loading errors.`;\n  } else if (unexpectedRegions.length > 0 || diffPercent > 20) {\n    verdict = 'UNEXPECTED_CHANGE';\n    const regionNames = unexpectedRegions.length > 0\n      ? unexpectedRegions.map(r => r.description.split(':')[0]).join(', ')\n      : 'multiple areas';\n    summary = `Significant changes in: ${regionNames} (${diffPercent}% overall).`;\n    recommendation = hasNavigationChanges\n      ? 'Navigation area changed - verify menu items and links are correct.'\n      : 'Review changes carefully - some may be unintentional.';\n  } else if (diffPercent <= thresholdPercent) {\n    verdict = 'EXPECTED_CHANGE';\n    summary = `Minor changes detected (${diffPercent}%). Within acceptable threshold.`;\n  } else {\n    verdict = 'EXPECTED_CHANGE';\n    const regionNames = detectedRegions.length > 0\n      ? detectedRegions.map(r => r.description.split(':')[0]).join(', ')\n      : 'content area';\n    summary = `Changes in: ${regionNames} (${diffPercent}% overall). Changes appear intentional.`;\n  }\n\n  // Separate expected vs unexpected changes\n  const changedRegions = detectedRegions.filter(r => r.severity === 'expected');\n  const unexpectedChanges = detectedRegions.filter(r =>\n    r.severity === 'unexpected' || r.severity === 'critical'\n  );\n\n  // If no regions detected but there are changes, create a fallback region\n  if (detectedRegions.length === 0 && !match) {\n    const fallbackRegion: ChangedRegion = {\n      location: diffPercent > 50 ? 'full' : 'center',\n      bounds: { x: 0, y: 0, width: width || 0, height: height || 0 },\n      description: `overall: ${diffPercent}% changed`,\n      severity: verdict === 'LAYOUT_BROKEN' ? 'critical' :\n                verdict === 'UNEXPECTED_CHANGE' ? 'unexpected' : 'expected',\n    };\n\n    if (verdict === 'UNEXPECTED_CHANGE' || verdict === 'LAYOUT_BROKEN') {\n      unexpectedChanges.push(fallbackRegion);\n    } else {\n      changedRegions.push(fallbackRegion);\n    }\n  }\n\n  return {\n    verdict,\n    summary,\n    changedRegions,\n    unexpectedChanges,\n    recommendation,\n  };\n}\n\n/**\n * Get a human-readable verdict description\n */\nexport function getVerdictDescription(verdict: Verdict): string {\n  switch (verdict) {\n    case 'MATCH':\n      return 'No changes - screenshots match';\n    case 'EXPECTED_CHANGE':\n      return 'Changes detected - appear intentional';\n    case 'UNEXPECTED_CHANGE':\n      return 'Unexpected changes - review required';\n    case 'LAYOUT_BROKEN':\n      return 'Layout broken - significant issues detected';\n    default:\n      return 'Unknown verdict';\n  }\n}\n","import { nanoid } from 'nanoid';\nimport { mkdir, readFile, writeFile, readdir, rm } from 'fs/promises';\nimport { join } from 'path';\nimport { SessionSchema, SessionQuerySchema, type Session, type SessionQuery, type Viewport, type ComparisonResult, type Analysis } from './schemas.js';\nimport type { SessionPaths, CleanOptions } from './types.js';\nimport { getAppContext, getSessionBasePath, type AppContext } from './git-context.js';\n\nconst SESSION_PREFIX = 'sess_';\n\n/**\n * Generate a unique session ID\n */\nexport function generateSessionId(): string {\n  return `${SESSION_PREFIX}${nanoid(10)}`;\n}\n\n/**\n * Get paths for a session (legacy flat structure)\n */\nexport function getSessionPaths(outputDir: string, sessionId: string): SessionPaths {\n  const root = join(outputDir, 'sessions', sessionId);\n  return {\n    root,\n    sessionJson: join(root, 'session.json'),\n    baseline: join(root, 'baseline.png'),\n    current: join(root, 'current.png'),\n    diff: join(root, 'diff.png'),\n  };\n}\n\n/**\n * Get paths for a session with git context awareness\n * Uses: .ibr/apps/{appName}/{branch}/sessions/{sessionId}/\n * Falls back to flat structure for non-git projects\n */\nexport function getSessionPathsWithContext(\n  outputDir: string,\n  sessionId: string,\n  context: AppContext | null\n): SessionPaths {\n  const basePath = context\n    ? getSessionBasePath(outputDir, context)\n    : join(outputDir, 'sessions');\n\n  const root = join(basePath, sessionId);\n  return {\n    root,\n    sessionJson: join(root, 'session.json'),\n    baseline: join(root, 'baseline.png'),\n    current: join(root, 'current.png'),\n    diff: join(root, 'diff.png'),\n  };\n}\n\n// Cached app context to avoid repeated git lookups\nlet cachedContext: AppContext | null = null;\nlet contextCacheDir: string | null = null;\n\n/**\n * Get cached app context for current directory\n */\nexport async function getCachedAppContext(projectDir: string): Promise<AppContext | null> {\n  if (contextCacheDir === projectDir && cachedContext !== null) {\n    return cachedContext;\n  }\n\n  try {\n    cachedContext = await getAppContext(projectDir);\n    contextCacheDir = projectDir;\n    return cachedContext;\n  } catch {\n    cachedContext = null;\n    contextCacheDir = projectDir;\n    return null;\n  }\n}\n\n/**\n * Create a new session\n */\nexport async function createSession(\n  outputDir: string,\n  url: string,\n  name: string,\n  viewport: Viewport,\n  platform?: 'web' | 'ios' | 'watchos'\n): Promise<Session> {\n  const sessionId = generateSessionId();\n  const paths = getSessionPaths(outputDir, sessionId);\n  const now = new Date().toISOString();\n\n  const session: Session = {\n    id: sessionId,\n    name,\n    url,\n    viewport,\n    status: 'baseline',\n    ...(platform ? { platform } : {}),\n    createdAt: now,\n    updatedAt: now,\n  };\n\n  // Create session directory\n  await mkdir(paths.root, { recursive: true });\n\n  // Write session file\n  await writeFile(paths.sessionJson, JSON.stringify(session, null, 2));\n\n  return session;\n}\n\n/**\n * Get a session by ID\n */\nexport async function getSession(outputDir: string, sessionId: string): Promise<Session | null> {\n  const paths = getSessionPaths(outputDir, sessionId);\n\n  try {\n    const content = await readFile(paths.sessionJson, 'utf-8');\n    const data = JSON.parse(content);\n    return SessionSchema.parse(data);\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Update a session\n */\nexport async function updateSession(\n  outputDir: string,\n  sessionId: string,\n  updates: Partial<Omit<Session, 'id' | 'createdAt'>>\n): Promise<Session> {\n  const session = await getSession(outputDir, sessionId);\n  if (!session) {\n    throw new Error(`Session not found: ${sessionId}`);\n  }\n\n  const updated: Session = {\n    ...session,\n    ...updates,\n    updatedAt: new Date().toISOString(),\n  };\n\n  const paths = getSessionPaths(outputDir, sessionId);\n  await writeFile(paths.sessionJson, JSON.stringify(updated, null, 2));\n\n  return updated;\n}\n\n/**\n * Mark session as compared with results\n */\nexport async function markSessionCompared(\n  outputDir: string,\n  sessionId: string,\n  comparison: ComparisonResult,\n  analysis: Analysis\n): Promise<Session> {\n  return updateSession(outputDir, sessionId, {\n    status: 'compared',\n    comparison,\n    analysis,\n  });\n}\n\n/**\n * List all sessions\n */\nexport async function listSessions(outputDir: string): Promise<Session[]> {\n  const sessionsDir = join(outputDir, 'sessions');\n\n  try {\n    const entries = await readdir(sessionsDir, { withFileTypes: true });\n    const sessions: Session[] = [];\n\n    for (const entry of entries) {\n      if (entry.isDirectory() && entry.name.startsWith(SESSION_PREFIX)) {\n        const session = await getSession(outputDir, entry.name);\n        if (session) {\n          sessions.push(session);\n        }\n      }\n    }\n\n    // Sort by creation date, newest first\n    return sessions.sort((a, b) =>\n      new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n    );\n  } catch {\n    return [];\n  }\n}\n\n/**\n * Get the most recent session\n */\nexport async function getMostRecentSession(outputDir: string): Promise<Session | null> {\n  const sessions = await listSessions(outputDir);\n  return sessions[0] || null;\n}\n\n/**\n * Delete a session\n */\nexport async function deleteSession(outputDir: string, sessionId: string): Promise<boolean> {\n  const paths = getSessionPaths(outputDir, sessionId);\n\n  try {\n    await rm(paths.root, { recursive: true, force: true });\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Parse duration string to milliseconds\n */\nfunction parseDuration(duration: string): number {\n  const match = duration.match(/^(\\d+)(d|h|m|s)$/);\n  if (!match) {\n    throw new Error(`Invalid duration format: ${duration}. Use format like '7d', '24h', '30m', '60s'`);\n  }\n\n  const value = parseInt(match[1], 10);\n  const unit = match[2];\n\n  switch (unit) {\n    case 'd': return value * 24 * 60 * 60 * 1000;\n    case 'h': return value * 60 * 60 * 1000;\n    case 'm': return value * 60 * 1000;\n    case 's': return value * 1000;\n    default: return value * 1000;\n  }\n}\n\n/**\n * Clean old sessions\n */\nexport async function cleanSessions(\n  outputDir: string,\n  options: CleanOptions = {}\n): Promise<{ deleted: string[]; kept: string[] }> {\n  const { olderThan, keepLast = 0, dryRun = false } = options;\n  const sessions = await listSessions(outputDir);\n\n  const deleted: string[] = [];\n  const kept: string[] = [];\n\n  // Sessions to keep based on keepLast\n  const keepIds = new Set(sessions.slice(0, keepLast).map(s => s.id));\n\n  // Calculate cutoff time if olderThan is specified\n  const cutoffTime = olderThan\n    ? Date.now() - parseDuration(olderThan)\n    : 0;\n\n  for (const session of sessions) {\n    const sessionTime = new Date(session.createdAt).getTime();\n    const shouldDelete = !keepIds.has(session.id) &&\n      (olderThan ? sessionTime < cutoffTime : true);\n\n    if (shouldDelete && !keepIds.has(session.id)) {\n      if (!dryRun) {\n        await deleteSession(outputDir, session.id);\n      }\n      deleted.push(session.id);\n    } else {\n      kept.push(session.id);\n    }\n  }\n\n  return { deleted, kept };\n}\n\n/**\n * Find sessions matching query criteria\n */\nexport async function findSessions(\n  outputDir: string,\n  query: Partial<SessionQuery> = {}\n): Promise<Session[]> {\n  // Validate query with defaults\n  const validatedQuery = SessionQuerySchema.parse({\n    limit: 50,\n    ...query,\n  });\n\n  const allSessions = await listSessions(outputDir);\n  let filtered = allSessions;\n\n  // Filter by route (extract path from URL)\n  if (validatedQuery.route) {\n    const routePattern = validatedQuery.route.toLowerCase();\n    filtered = filtered.filter(s => {\n      try {\n        const urlPath = new URL(s.url).pathname.toLowerCase();\n        return urlPath.includes(routePattern) || urlPath === routePattern;\n      } catch {\n        return s.url.toLowerCase().includes(routePattern);\n      }\n    });\n  }\n\n  // Filter by URL (exact or partial match)\n  if (validatedQuery.url) {\n    const urlPattern = validatedQuery.url.toLowerCase();\n    filtered = filtered.filter(s => s.url.toLowerCase().includes(urlPattern));\n  }\n\n  // Filter by status\n  if (validatedQuery.status) {\n    filtered = filtered.filter(s => s.status === validatedQuery.status);\n  }\n\n  // Filter by name\n  if (validatedQuery.name) {\n    const namePattern = validatedQuery.name.toLowerCase();\n    filtered = filtered.filter(s => s.name.toLowerCase().includes(namePattern));\n  }\n\n  // Filter by viewport\n  if (validatedQuery.viewport) {\n    const viewportPattern = validatedQuery.viewport.toLowerCase();\n    filtered = filtered.filter(s => s.viewport.name.toLowerCase() === viewportPattern);\n  }\n\n  // Filter by date range\n  if (validatedQuery.createdAfter) {\n    const afterTime = validatedQuery.createdAfter.getTime();\n    filtered = filtered.filter(s => new Date(s.createdAt).getTime() >= afterTime);\n  }\n\n  if (validatedQuery.createdBefore) {\n    const beforeTime = validatedQuery.createdBefore.getTime();\n    filtered = filtered.filter(s => new Date(s.createdAt).getTime() <= beforeTime);\n  }\n\n  // Apply limit\n  return filtered.slice(0, validatedQuery.limit);\n}\n\n/**\n * Get timeline of sessions for a specific route/URL\n * Returns sessions in chronological order (oldest first) for tracking changes over time\n */\nexport async function getTimeline(\n  outputDir: string,\n  route: string,\n  limit: number = 10\n): Promise<Session[]> {\n  const sessions = await findSessions(outputDir, { route, limit });\n  // Reverse to get chronological order (oldest first)\n  return sessions.reverse();\n}\n\n/**\n * Get sessions grouped by route\n */\nexport async function getSessionsByRoute(\n  outputDir: string\n): Promise<Record<string, Session[]>> {\n  const allSessions = await listSessions(outputDir);\n  const byRoute: Record<string, Session[]> = {};\n\n  for (const session of allSessions) {\n    let route: string;\n    try {\n      route = new URL(session.url).pathname;\n    } catch {\n      route = session.url;\n    }\n\n    if (!byRoute[route]) {\n      byRoute[route] = [];\n    }\n    byRoute[route].push(session);\n  }\n\n  return byRoute;\n}\n\n/**\n * Get session statistics\n */\nexport async function getSessionStats(outputDir: string): Promise<{\n  total: number;\n  byStatus: Record<string, number>;\n  byViewport: Record<string, number>;\n  byVerdict: Record<string, number>;\n}> {\n  const sessions = await listSessions(outputDir);\n\n  const byStatus: Record<string, number> = {};\n  const byViewport: Record<string, number> = {};\n  const byVerdict: Record<string, number> = {};\n\n  for (const session of sessions) {\n    // Count by status\n    byStatus[session.status] = (byStatus[session.status] || 0) + 1;\n\n    // Count by viewport\n    const viewportName = session.viewport.name;\n    byViewport[viewportName] = (byViewport[viewportName] || 0) + 1;\n\n    // Count by verdict\n    if (session.analysis?.verdict) {\n      byVerdict[session.analysis.verdict] = (byVerdict[session.analysis.verdict] || 0) + 1;\n    }\n  }\n\n  return {\n    total: sessions.length,\n    byStatus,\n    byViewport,\n    byVerdict,\n  };\n}\n","import type { Session, ComparisonResult, Analysis, ComparisonReport } from './schemas.js';\nimport { getSessionPaths } from './session.js';\n\n/**\n * Generate a full comparison report\n */\nexport function generateReport(\n  session: Session,\n  comparison: ComparisonResult,\n  analysis: Analysis,\n  outputDir: string,\n  webViewPort?: number\n): ComparisonReport {\n  const paths = getSessionPaths(outputDir, session.id);\n\n  const report: ComparisonReport = {\n    sessionId: session.id,\n    sessionName: session.name,\n    url: session.url,\n    timestamp: new Date().toISOString(),\n    viewport: session.viewport,\n    comparison,\n    analysis,\n    files: {\n      baseline: paths.baseline,\n      current: paths.current,\n      diff: paths.diff,\n    },\n  };\n\n  if (webViewPort) {\n    report.webViewUrl = `http://localhost:${webViewPort}/sessions/${session.id}`;\n  }\n\n  return report;\n}\n\n/**\n * Get verdict indicator (text-based, no emojis)\n */\nfunction getVerdictIndicator(verdict: string): { symbol: string; label: string } {\n  switch (verdict) {\n    case 'MATCH':\n      return { symbol: '[PASS]', label: 'No visual changes detected' };\n    case 'EXPECTED_CHANGE':\n      return { symbol: '[OK]  ', label: 'Changes detected, appear intentional' };\n    case 'UNEXPECTED_CHANGE':\n      return { symbol: '[WARN]', label: 'Unexpected changes - investigate' };\n    case 'LAYOUT_BROKEN':\n      return { symbol: '[FAIL]', label: 'Layout broken - fix required' };\n    default:\n      return { symbol: '[????]', label: 'Unknown verdict' };\n  }\n}\n\n/**\n * Format report as human-readable text\n */\nexport function formatReportText(report: ComparisonReport): string {\n  const lines: string[] = [];\n  const { symbol, label } = getVerdictIndicator(report.analysis.verdict);\n\n  // Verdict first - most important info\n  lines.push('');\n  lines.push(`${symbol} ${report.analysis.verdict} - ${label}`);\n  lines.push('');\n  lines.push(`Diff: ${report.comparison.diffPercent}% (${report.comparison.diffPixels.toLocaleString()} pixels)`);\n  lines.push('');\n  lines.push('---');\n  lines.push('');\n  lines.push(`Session: ${report.sessionName} (${report.sessionId})`);\n  lines.push(`URL: ${report.url}`);\n  lines.push(`Viewport: ${report.viewport.name} (${report.viewport.width}x${report.viewport.height})`);\n  lines.push('');\n  lines.push(`Summary: ${report.analysis.summary}`);\n\n  if (report.analysis.recommendation) {\n    lines.push('');\n    lines.push(`Recommendation: ${report.analysis.recommendation}`);\n  }\n\n  if (report.analysis.unexpectedChanges.length > 0) {\n    lines.push('');\n    lines.push('Unexpected Changes:');\n    for (const change of report.analysis.unexpectedChanges) {\n      lines.push(`  - ${change.location}: ${change.description}`);\n    }\n  }\n\n  lines.push('');\n  lines.push('Files:');\n  lines.push(`  Baseline: ${report.files.baseline}`);\n  lines.push(`  Current: ${report.files.current}`);\n  lines.push(`  Diff: ${report.files.diff}`);\n\n  if (report.webViewUrl) {\n    lines.push('');\n    lines.push(`View in browser: ${report.webViewUrl}`);\n  }\n\n  return lines.join('\\n');\n}\n\n/**\n * Format report as minimal output (for scripts)\n */\nexport function formatReportMinimal(report: ComparisonReport): string {\n  const status = report.comparison.match ? 'PASS' : 'FAIL';\n  return `${status} ${report.sessionId} ${report.analysis.verdict} ${report.comparison.diffPercent}%`;\n}\n\n/**\n * Format report as JSON\n */\nexport function formatReportJson(report: ComparisonReport): string {\n  return JSON.stringify(report, null, 2);\n}\n\n/**\n * Generate a summary line for session listing\n */\nexport function formatSessionSummary(session: Session): string {\n  const status = session.status.padEnd(8);\n  const viewport = `${session.viewport.name}`.padEnd(8);\n  const date = new Date(session.createdAt).toLocaleDateString();\n\n  let diffInfo = '';\n  if (session.comparison) {\n    diffInfo = session.comparison.match\n      ? ' (no diff)'\n      : ` (${session.comparison.diffPercent}% diff)`;\n  }\n\n  return `${session.id}  ${status}  ${viewport}  ${date}  ${session.name}${diffInfo}`;\n}\n","/**\n * Login Flow\n *\n * Handles common login patterns with semantic field detection.\n */\n\nimport type { PageLike as Page } from '../engine/page-like.js';\nimport { findFieldByLabel, findButton, waitForNavigation, type FlowResult, type FlowStep, type FlowOptions } from './types.js';\nimport { detectAuthState } from '../semantic/state-detector.js';\n\nexport interface FlowLoginOptions extends FlowOptions {\n  /** Email or username */\n  email: string;\n  /** Password */\n  password: string;\n  /** What indicates successful login (intent like 'dashboard' or selector) */\n  successIndicator?: string;\n  /** Whether to check \"remember me\" if present */\n  rememberMe?: boolean;\n}\n\nexport interface LoginResult extends FlowResult {\n  /** Whether user is now authenticated */\n  authenticated: boolean;\n  /** Detected username after login */\n  username?: string;\n}\n\n/**\n * Execute login flow\n */\nexport async function loginFlow(\n  page: Page,\n  options: FlowLoginOptions\n): Promise<LoginResult> {\n  const startTime = Date.now();\n  const steps: FlowStep[] = [];\n  const timeout = options.timeout || 30000;\n\n  try {\n    // Step 1: Find email/username field\n    const emailField = await findFieldByLabel(page, [\n      'email',\n      'username',\n      'login',\n      'user',\n      'mail',\n    ]);\n\n    if (!emailField) {\n      return {\n        success: false,\n        authenticated: false,\n        steps,\n        error: 'Could not find email/username field',\n        duration: Date.now() - startTime,\n      };\n    }\n\n    await emailField.fill?.(options.email);\n    steps.push({ action: 'fill email/username', success: true });\n\n    // Step 2: Find password field\n    const passwordField = await page.$('input[type=\"password\"]');\n\n    if (!passwordField) {\n      return {\n        success: false,\n        authenticated: false,\n        steps,\n        error: 'Could not find password field',\n        duration: Date.now() - startTime,\n      };\n    }\n\n    await passwordField.fill?.(options.password);\n    steps.push({ action: 'fill password', success: true });\n\n    // Step 3: Handle remember me (optional)\n    if (options.rememberMe) {\n      // First try the valid-CSS forms.\n      let rememberCheckbox = await page.$(\n        'input[type=\"checkbox\"][name*=\"remember\"], ' +\n        'input[type=\"checkbox\"][id*=\"remember\"]'\n      );\n      if (!rememberCheckbox) {\n        // Walk labels for \"remember\" and grab the associated checkbox.\n        // Replaces `label:has-text(\"remember\") input[type=\"checkbox\"]`,\n        // which was Playwright-only and crashed native querySelector.\n        const path = await page.evaluate(`(function() {\n          function buildSelectorPath(el) {\n            if (!(el instanceof Element)) return null;\n            const path = [];\n            let cur = el;\n            while (cur && cur.nodeType === 1 && cur !== document.body) {\n              let sel = cur.nodeName.toLowerCase();\n              if (cur.id) {\n                const safeId = cur.id.replace(/([\"\\\\\\\\])/g, '\\\\\\\\$1');\n                path.unshift(sel + '[id=\"' + safeId + '\"]');\n                break;\n              }\n              const parent = cur.parentElement;\n              if (parent) {\n                const sibs = Array.from(parent.children).filter(c => c.nodeName === cur.nodeName);\n                if (sibs.length > 1) sel += ':nth-of-type(' + (sibs.indexOf(cur) + 1) + ')';\n              }\n              path.unshift(sel);\n              cur = cur.parentElement;\n            }\n            return path.length ? path.join(' > ') : null;\n          }\n          for (const label of document.querySelectorAll('label')) {\n            if (!(label.textContent || '').toLowerCase().includes('remember')) continue;\n            const inside = label.querySelector('input[type=\"checkbox\"]');\n            if (inside) return buildSelectorPath(inside);\n            const forId = label.getAttribute('for');\n            if (forId) {\n              const direct = document.getElementById(forId);\n              if (direct && direct.tagName === 'INPUT') return buildSelectorPath(direct);\n            }\n          }\n          return null;\n        })()`);\n        if (typeof path === 'string' && path) {\n          rememberCheckbox = await page.$(path);\n        }\n      }\n      if (rememberCheckbox) {\n        await rememberCheckbox.check?.();\n        steps.push({ action: 'check remember me', success: true });\n      }\n    }\n\n    // Step 4: Find and click submit button\n    const submitButton = await findButton(page, [\n      'login',\n      'sign in',\n      'log in',\n      'submit',\n      'continue',\n    ]);\n\n    if (!submitButton) {\n      return {\n        success: false,\n        authenticated: false,\n        steps,\n        error: 'Could not find submit button',\n        duration: Date.now() - startTime,\n      };\n    }\n\n    await submitButton.click?.();\n    steps.push({ action: 'click submit', success: true });\n\n    // Step 5: Wait for navigation/response\n    await waitForNavigation(page, timeout);\n    steps.push({ action: 'wait for response', success: true });\n\n    // Step 6: Verify authentication\n    const authState = await detectAuthState(page);\n    const authenticated = authState.authenticated === true;\n\n    // Check for success indicator if provided\n    let successVerified = authenticated;\n    if (options.successIndicator && authenticated) {\n      // Check if it's a selector or an intent\n      if (options.successIndicator.startsWith('.') ||\n          options.successIndicator.startsWith('#') ||\n          options.successIndicator.startsWith('[')) {\n        // It's a selector\n        const indicator = await page.$(options.successIndicator);\n        successVerified = !!indicator;\n      }\n      // For intents, we'd need to check page intent - simplified for now\n    }\n\n    steps.push({\n      action: 'verify authentication',\n      success: successVerified,\n    });\n\n    return {\n      success: successVerified,\n      authenticated: successVerified,\n      username: authState.username,\n      steps,\n      duration: Date.now() - startTime,\n    };\n\n  } catch (error) {\n    return {\n      success: false,\n      authenticated: false,\n      steps,\n      error: error instanceof Error ? error.message : 'Unknown error',\n      duration: Date.now() - startTime,\n    };\n  }\n}\n","/**\n * Search Flow\n *\n * Handles common search patterns with result detection.\n * Includes AI-powered search testing with step screenshots and content extraction.\n */\n\nimport type { PageLike as Page } from '../engine/page-like.js';\nimport { writeFile, mkdir } from 'fs/promises';\nimport { join } from 'path';\nimport {\n  findFieldByLabel,\n  waitForNavigation,\n  type FlowResult,\n  type FlowStep,\n  type FlowOptions,\n  type AISearchOptions,\n  type AISearchResult,\n  type StepScreenshot,\n  type ExtractedResult,\n  type SearchTiming,\n} from './types.js';\n\nexport interface FlowSearchOptions extends FlowOptions {\n  /** Search query */\n  query: string;\n  /** Selector for search results container */\n  resultsSelector?: string;\n  /** Whether to submit the form or just type (for autocomplete) */\n  submit?: boolean;\n}\n\nexport interface SearchResult extends FlowResult {\n  /** Number of results found */\n  resultCount: number;\n  /** Whether results were found */\n  hasResults: boolean;\n}\n\n/**\n * Execute search flow\n */\nexport async function searchFlow(\n  page: Page,\n  options: FlowSearchOptions\n): Promise<SearchResult> {\n  const startTime = Date.now();\n  const steps: FlowStep[] = [];\n  const timeout = options.timeout || 10000;\n\n  try {\n    // Step 1: Find search input\n    const searchInput = await findFieldByLabel(page, [\n      'search',\n      'query',\n      'q',\n      'find',\n    ]);\n\n    // Also try common search input patterns\n    const searchField = searchInput || await page.$(\n      'input[type=\"search\"], ' +\n      'input[name=\"q\"], ' +\n      'input[name=\"query\"], ' +\n      'input[placeholder*=\"search\" i], ' +\n      '[role=\"searchbox\"]'\n    );\n\n    if (!searchField) {\n      return {\n        success: false,\n        resultCount: 0,\n        hasResults: false,\n        steps,\n        error: 'Could not find search input',\n        duration: Date.now() - startTime,\n      };\n    }\n\n    // Clear existing content and type query\n    await searchField.fill?.('');\n    await searchField.fill?.(options.query);\n    steps.push({ action: `type \"${options.query}\"`, success: true });\n\n    // Step 2: Submit if requested (default true)\n    if (options.submit !== false) {\n      // Try pressing Enter first\n      await searchField.press?.('Enter');\n      steps.push({ action: 'submit search', success: true });\n\n      // Wait for results\n      await waitForNavigation(page, timeout);\n      steps.push({ action: 'wait for results', success: true });\n    } else {\n      // Just wait for autocomplete\n      await page.waitForTimeout(500);\n      steps.push({ action: 'wait for autocomplete', success: true });\n    }\n\n    // Step 3: Count results\n    const resultsSelector = options.resultsSelector ||\n      '[class*=\"result\"], [class*=\"item\"], [class*=\"card\"], ' +\n      '[data-testid*=\"result\"], li[class*=\"search\"]';\n\n    const results = await page.$$(resultsSelector);\n    const resultCount = results.length;\n    const hasResults = resultCount > 0;\n\n    // Check for empty state. Combines a valid-CSS round\n    // ([class*=\"no-results\"], [class*=\"empty\"]) with an in-page text walk\n    // for \"no results\" / \"nothing found\" — the prior `:has-text(...)`\n    // form was Playwright-only syntax and crashed native querySelector.\n    const { combinedTextOrCssQuery } = await import('./types.js');\n    const emptyStatePath = await combinedTextOrCssQuery(page, {\n      cssSelectors: ['[class*=\"no-results\"]', '[class*=\"empty\"]'],\n      tags: ['div', 'p', 'span', 'section'],\n      textNeedles: ['no results', 'nothing found'],\n    });\n    const emptyState = emptyStatePath ? await page.$(emptyStatePath) : null;\n\n    steps.push({\n      action: `found ${resultCount} results`,\n      success: hasResults || !!emptyState,\n    });\n\n    return {\n      success: true,\n      resultCount,\n      hasResults,\n      steps,\n      duration: Date.now() - startTime,\n    };\n\n  } catch (error) {\n    return {\n      success: false,\n      resultCount: 0,\n      hasResults: false,\n      steps,\n      error: error instanceof Error ? error.message : 'Unknown error',\n      duration: Date.now() - startTime,\n    };\n  }\n}\n\n// =============================================================================\n// AI Search Flow - Enhanced search with screenshots, timing, and content extraction\n// =============================================================================\n\n/**\n * Capture a screenshot at a specific step\n */\nasync function captureStepScreenshot(\n  page: Page,\n  step: StepScreenshot['step'],\n  artifactDir: string,\n  startTime: number\n): Promise<StepScreenshot> {\n  const timestamp = new Date().toISOString();\n  const timing = Date.now() - startTime;\n  const stepNum = { before: '01', 'after-query': '02', loading: '03', results: '04' }[step];\n  const filename = `${stepNum}-${step}.png`;\n  const path = join(artifactDir, filename);\n\n  // Disable animations before screenshot\n  await page.addStyleTag({\n    content: `\n      *, *::before, *::after {\n        animation-duration: 0s !important;\n        animation-delay: 0s !important;\n        transition-duration: 0s !important;\n        transition-delay: 0s !important;\n      }\n    `,\n  });\n\n  await page.screenshot({\n    path,\n    fullPage: false,\n    type: 'png',\n  });\n\n  return { step, path, timestamp, timing };\n}\n\n/**\n * Extract content from search result elements\n */\nasync function extractResultContent(\n  page: Page,\n  resultsSelector: string\n): Promise<ExtractedResult[]> {\n  return page.evaluate((selector: string) => {\n    const elements = document.querySelectorAll(selector);\n    const results: ExtractedResult[] = [];\n\n    elements.forEach((el, index) => {\n      const htmlEl = el as HTMLElement;\n      const rect = htmlEl.getBoundingClientRect();\n\n      // Try to identify title (usually in h1-h6, strong, or first bold text)\n      const titleEl = htmlEl.querySelector('h1, h2, h3, h4, h5, h6, strong, b, [class*=\"title\"]');\n      const title = titleEl?.textContent?.trim();\n\n      // Try to identify snippet/description\n      const snippetEl = htmlEl.querySelector('p, [class*=\"snippet\"], [class*=\"description\"], [class*=\"summary\"]');\n      const snippet = snippetEl?.textContent?.trim();\n\n      // Get full text content\n      const fullText = htmlEl.textContent?.trim() || '';\n\n      // Generate a unique selector for this element\n      let selector = el.tagName.toLowerCase();\n      if (el.id) {\n        selector = `#${el.id}`;\n      } else if (el.className && typeof el.className === 'string') {\n        const classes = el.className.split(' ').filter((c: string) => c.trim())[0];\n        if (classes) selector += `.${classes}`;\n        selector += `:nth-of-type(${index + 1})`;\n      }\n\n      results.push({\n        index,\n        title: title || undefined,\n        snippet: snippet || undefined,\n        fullText: fullText.slice(0, 500), // Limit length\n        selector,\n        visible: rect.top >= 0 && rect.top < window.innerHeight,\n      });\n    });\n\n    return results;\n  }, resultsSelector);\n}\n\n/**\n * Execute AI-enhanced search flow with screenshots and content extraction\n *\n * This function extends the basic search flow with:\n * - Step-by-step screenshots (before, after-query, results)\n * - Detailed timing breakdown\n * - Extraction of result content for AI validation\n * - User intent tracking for relevance checking\n */\nexport async function aiSearchFlow(\n  page: Page,\n  options: AISearchOptions\n): Promise<AISearchResult> {\n  const startTime = Date.now();\n  const steps: FlowStep[] = [];\n  const screenshots: StepScreenshot[] = [];\n  const timeout = options.timeout || 10000;\n  const captureSteps = options.captureSteps !== false;\n  const extractContent = options.extractContent !== false;\n\n  // Timing breakdown\n  const timing: SearchTiming = {\n    total: 0,\n    typing: 0,\n    waiting: 0,\n    rendering: 0,\n  };\n\n  // Create artifact directory if capturing screenshots\n  let artifactDir: string | undefined;\n  if (captureSteps && options.sessionDir) {\n    artifactDir = join(options.sessionDir, `search-${Date.now()}`);\n    await mkdir(artifactDir, { recursive: true });\n  }\n\n  try {\n    // Step 1: Capture \"before\" screenshot\n    if (captureSteps && artifactDir) {\n      const shot = await captureStepScreenshot(page, 'before', artifactDir, startTime);\n      screenshots.push(shot);\n      steps.push({ action: 'capture before screenshot', success: true, duration: shot.timing });\n    }\n\n    // Step 2: Find search input\n    const searchInput = await findFieldByLabel(page, ['search', 'query', 'q', 'find']);\n    const searchField = searchInput || await page.$(\n      'input[type=\"search\"], ' +\n      'input[name=\"q\"], ' +\n      'input[name=\"query\"], ' +\n      'input[placeholder*=\"search\" i], ' +\n      '[role=\"searchbox\"]'\n    );\n\n    if (!searchField) {\n      return {\n        success: false,\n        query: options.query,\n        userIntent: options.userIntent,\n        resultCount: 0,\n        hasResults: false,\n        steps,\n        screenshots,\n        extractedResults: [],\n        timing: { ...timing, total: Date.now() - startTime },\n        error: 'Could not find search input',\n        duration: Date.now() - startTime,\n        artifactDir,\n      };\n    }\n\n    // Step 3: Type query with timing\n    const typingStart = Date.now();\n    await searchField.fill?.('');\n    await searchField.fill?.(options.query);\n    timing.typing = Date.now() - typingStart;\n    steps.push({ action: `type \"${options.query}\"`, success: true, duration: timing.typing });\n\n    // Step 4: Capture \"after-query\" screenshot (for autocomplete testing)\n    if (captureSteps && artifactDir) {\n      const shot = await captureStepScreenshot(page, 'after-query', artifactDir, startTime);\n      screenshots.push(shot);\n      steps.push({ action: 'capture after-query screenshot', success: true });\n    }\n\n    // Step 5: Submit if requested (default true)\n    const waitingStart = Date.now();\n    if (options.submit !== false) {\n      await searchField.press?.('Enter');\n      steps.push({ action: 'submit search', success: true });\n\n      // Wait for results\n      await waitForNavigation(page, timeout);\n      steps.push({ action: 'wait for results', success: true });\n    } else {\n      // Just wait for autocomplete\n      await page.waitForTimeout(500);\n      steps.push({ action: 'wait for autocomplete', success: true });\n    }\n    timing.waiting = Date.now() - waitingStart;\n\n    // Step 6: Capture \"results\" screenshot\n    const renderingStart = Date.now();\n    if (captureSteps && artifactDir) {\n      const shot = await captureStepScreenshot(page, 'results', artifactDir, startTime);\n      screenshots.push(shot);\n      steps.push({ action: 'capture results screenshot', success: true });\n    }\n\n    // Step 7: Count and extract results\n    const resultsSelector = options.resultsSelector ||\n      '[class*=\"result\"], [class*=\"item\"], [class*=\"card\"], ' +\n      '[data-testid*=\"result\"], li[class*=\"search\"]';\n\n    const resultElements = await page.$$(resultsSelector);\n    const resultCount = resultElements.length;\n    const hasResults = resultCount > 0;\n\n    // Extract content if enabled\n    let extractedResults: ExtractedResult[] = [];\n    if (extractContent && hasResults) {\n      extractedResults = await extractResultContent(page, resultsSelector);\n      steps.push({ action: `extracted ${extractedResults.length} results`, success: true });\n    }\n\n    timing.rendering = Date.now() - renderingStart;\n    timing.total = Date.now() - startTime;\n\n    // Save results.json if we have an artifact directory\n    if (artifactDir) {\n      const resultsData = {\n        query: options.query,\n        userIntent: options.userIntent,\n        timestamp: new Date().toISOString(),\n        resultCount,\n        hasResults,\n        timing,\n        extractedResults,\n      };\n      await writeFile(\n        join(artifactDir, 'results.json'),\n        JSON.stringify(resultsData, null, 2)\n      );\n    }\n\n    steps.push({\n      action: `found ${resultCount} results`,\n      success: hasResults,\n    });\n\n    return {\n      success: true,\n      query: options.query,\n      userIntent: options.userIntent,\n      resultCount,\n      hasResults,\n      steps,\n      screenshots,\n      extractedResults,\n      timing,\n      duration: timing.total,\n      artifactDir,\n    };\n\n  } catch (error) {\n    timing.total = Date.now() - startTime;\n    return {\n      success: false,\n      query: options.query,\n      userIntent: options.userIntent,\n      resultCount: 0,\n      hasResults: false,\n      steps,\n      screenshots,\n      extractedResults: [],\n      timing,\n      error: error instanceof Error ? error.message : 'Unknown error',\n      duration: timing.total,\n      artifactDir,\n    };\n  }\n}\n","/**\n * Form Submit Flow\n *\n * Handles generic form submission with field detection.\n */\n\nimport type { PageLike as Page } from '../engine/page-like.js';\nimport { findFieldByLabel, findButton, waitForNavigation, type FlowResult, type FlowStep, type FlowOptions } from './types.js';\n\nexport interface FormField {\n  /** Field name or label to search for */\n  name: string;\n  /** Value to fill */\n  value: string;\n  /** Field type (defaults to 'text') */\n  type?: 'text' | 'select' | 'checkbox' | 'radio' | 'textarea';\n}\n\nexport interface FlowFormOptions extends FlowOptions {\n  /** Fields to fill */\n  fields: FormField[];\n  /** Button text to click (defaults to 'submit') */\n  submitButton?: string;\n  /** Selector for success message */\n  successSelector?: string;\n}\n\nexport interface FormResult extends FlowResult {\n  /** Which fields were successfully filled */\n  filledFields: string[];\n  /** Which fields failed */\n  failedFields: string[];\n}\n\n/**\n * Execute form submission flow\n */\nexport async function formFlow(\n  page: Page,\n  options: FlowFormOptions\n): Promise<FormResult> {\n  const startTime = Date.now();\n  const steps: FlowStep[] = [];\n  const filledFields: string[] = [];\n  const failedFields: string[] = [];\n  const timeout = options.timeout || 10000;\n\n  try {\n    // Step 1: Fill each field\n    for (const field of options.fields) {\n      const fieldType = field.type || 'text';\n\n      let element;\n\n      if (fieldType === 'textarea') {\n        element = await page.$(`textarea[name*=\"${field.name}\" i], textarea[id*=\"${field.name}\" i]`);\n      } else if (fieldType === 'select') {\n        element = await page.$(`select[name*=\"${field.name}\" i], select[id*=\"${field.name}\" i]`);\n      } else if (fieldType === 'checkbox' || fieldType === 'radio') {\n        element = await page.$(\n          `input[type=\"${fieldType}\"][name*=\"${field.name}\" i], ` +\n          `input[type=\"${fieldType}\"][id*=\"${field.name}\" i]`\n        );\n      } else {\n        element = await findFieldByLabel(page, [field.name]);\n      }\n\n      if (element) {\n        try {\n          if (fieldType === 'select') {\n            await element.selectOption?.(field.value);\n          } else if (fieldType === 'checkbox') {\n            if (field.value === 'true' || field.value === '1') {\n              await element.check?.();\n            } else {\n              await element.uncheck?.();\n            }\n          } else if (fieldType === 'radio') {\n            await element.check?.();\n          } else {\n            await element.fill?.(field.value);\n          }\n          filledFields.push(field.name);\n          steps.push({ action: `fill ${field.name}`, success: true });\n        } catch (err) {\n          failedFields.push(field.name);\n          steps.push({\n            action: `fill ${field.name}`,\n            success: false,\n            error: err instanceof Error ? err.message : 'Unknown error',\n          });\n        }\n      } else {\n        failedFields.push(field.name);\n        steps.push({\n          action: `fill ${field.name}`,\n          success: false,\n          error: 'Field not found',\n        });\n      }\n    }\n\n    // Step 2: Submit the form\n    const submitPatterns = options.submitButton\n      ? [options.submitButton]\n      : ['submit', 'save', 'send', 'continue', 'confirm'];\n\n    const submitButton = await findButton(page, submitPatterns);\n\n    if (!submitButton) {\n      return {\n        success: false,\n        filledFields,\n        failedFields,\n        steps,\n        error: 'Could not find submit button',\n        duration: Date.now() - startTime,\n      };\n    }\n\n    await submitButton.click?.();\n    steps.push({ action: 'click submit', success: true });\n\n    // Step 3: Wait for response\n    await waitForNavigation(page, timeout);\n    steps.push({ action: 'wait for response', success: true });\n\n    // Step 4: Check for success indicator\n    let success = true;\n    if (options.successSelector) {\n      const successElement = await page.$(options.successSelector);\n      success = !!successElement;\n      steps.push({\n        action: 'verify success',\n        success,\n      });\n    }\n\n    // Also check for error indicators\n    const errorElement = await page.$(\n      '[class*=\"error\"]:not([class*=\"error-boundary\"]), ' +\n      '[role=\"alert\"][class*=\"error\"], ' +\n      '.form-error, .validation-error'\n    );\n\n    if (errorElement) {\n      const errorText = await errorElement.textContent();\n      success = false;\n      steps.push({\n        action: 'check for errors',\n        success: false,\n        error: errorText?.trim() || 'Form has errors',\n      });\n    }\n\n    return {\n      success: success && failedFields.length === 0,\n      filledFields,\n      failedFields,\n      steps,\n      duration: Date.now() - startTime,\n    };\n\n  } catch (error) {\n    return {\n      success: false,\n      filledFields,\n      failedFields,\n      steps,\n      error: error instanceof Error ? error.message : 'Unknown error',\n      duration: Date.now() - startTime,\n    };\n  }\n}\n","/**\n * IBR Built-in Flows\n *\n * Common automation patterns as single commands:\n * - login: Authenticate with email/password\n * - search: Search and verify results\n * - form: Fill and submit forms\n */\n\nexport {\n  loginFlow,\n  type FlowLoginOptions,\n  type LoginResult,\n} from './login.js';\n\nexport {\n  searchFlow,\n  aiSearchFlow,\n  type FlowSearchOptions,\n  type SearchResult,\n} from './search.js';\n\nexport {\n  formFlow,\n  type FlowFormOptions,\n  type FormField,\n  type FormResult,\n} from './form.js';\n\nexport {\n  findFieldByLabel,\n  findButton,\n  waitForNavigation,\n  type FlowResult,\n  type FlowStep,\n  type FlowOptions,\n  type AISearchOptions,\n  type AISearchResult,\n  type StepScreenshot,\n  type ExtractedResult,\n  type SearchTiming,\n} from './types.js';\n\nexport {\n  generateValidationContext,\n  generateValidationPrompt,\n  generateQuickSummary,\n  analyzeForObviousIssues,\n  formatValidationResult,\n  generateDevModePrompt,\n  type ValidationContext,\n  type ValidationResult,\n  type ValidationIssue,\n} from './search-validation.js';\n\n// Flow registry for dynamic access\nimport { loginFlow } from './login.js';\nimport { searchFlow, aiSearchFlow } from './search.js';\nimport { formFlow } from './form.js';\n\nexport const flows = {\n  login: loginFlow,\n  search: searchFlow,\n  aiSearch: aiSearchFlow,\n  form: formFlow,\n} as const;\n\nexport type FlowName = keyof typeof flows;\n","/**\n * Search Validation\n *\n * Generates structured output for Claude Code to analyze search results.\n * Provides context for AI-powered relevance checking.\n */\n\nimport type { AISearchResult, ExtractedResult, SearchTiming } from './types.js';\n\n/**\n * Context for AI validation of search results\n */\nexport interface ValidationContext {\n  /** The search query executed */\n  query: string;\n  /** What the user expected to find */\n  userIntent: string;\n  /** Extracted results for analysis */\n  results: ExtractedResult[];\n  /** Paths to screenshots for visual inspection */\n  screenshotPaths: string[];\n  /** Timing metrics */\n  timing: SearchTiming;\n  /** Timestamp of the search */\n  timestamp: string;\n  /** Whether any results were found */\n  hasResults: boolean;\n  /** Total result count */\n  resultCount: number;\n}\n\n/**\n * Result from AI validation\n */\nexport interface ValidationResult {\n  /** Whether results are relevant to user intent */\n  relevant: boolean;\n  /** Confidence in the assessment (0-1) */\n  confidence: number;\n  /** Explanation of the assessment */\n  reasoning: string;\n  /** Suggestions for improvement or next steps */\n  suggestions?: string[];\n  /** Specific issues found */\n  issues?: ValidationIssue[];\n}\n\n/**\n * Specific issue found during validation\n */\nexport interface ValidationIssue {\n  /** Type of issue */\n  type: 'irrelevant' | 'partial' | 'empty' | 'error' | 'slow';\n  /** Which result index (if applicable) */\n  resultIndex?: number;\n  /** Description of the issue */\n  description: string;\n  /** Severity: low, medium, high */\n  severity: 'low' | 'medium' | 'high';\n}\n\n/**\n * Generate validation context from AI search result\n */\nexport function generateValidationContext(result: AISearchResult): ValidationContext {\n  return {\n    query: result.query,\n    userIntent: result.userIntent || `Find results related to: ${result.query}`,\n    results: result.extractedResults,\n    screenshotPaths: result.screenshots.map(s => s.path),\n    timing: result.timing,\n    timestamp: new Date().toISOString(),\n    hasResults: result.hasResults,\n    resultCount: result.resultCount,\n  };\n}\n\n/**\n * Generate a structured prompt for Claude Code to analyze search results\n *\n * This prompt provides all necessary context for AI-powered validation:\n * - The query and user intent\n * - Extracted result content\n * - Screenshots for visual inspection\n * - Timing metrics\n */\nexport function generateValidationPrompt(context: ValidationContext): string {\n  const lines: string[] = [];\n\n  lines.push('# Search Result Validation Request');\n  lines.push('');\n  lines.push('Please analyze the following search results and determine if they are relevant to the user\\'s intent.');\n  lines.push('');\n\n  // Query and Intent\n  lines.push('## Search Details');\n  lines.push(`- **Query:** \"${context.query}\"`);\n  lines.push(`- **User Intent:** ${context.userIntent}`);\n  lines.push(`- **Results Found:** ${context.resultCount}`);\n  lines.push(`- **Total Time:** ${context.timing.total}ms`);\n  lines.push('');\n\n  // Screenshots\n  if (context.screenshotPaths.length > 0) {\n    lines.push('## Screenshots');\n    lines.push('The following screenshots capture the search interaction:');\n    for (const path of context.screenshotPaths) {\n      lines.push(`- ${path}`);\n    }\n    lines.push('');\n    lines.push('*Please view these screenshots using the Read tool to see the visual state.*');\n    lines.push('');\n  }\n\n  // Extracted Results\n  if (context.results.length > 0) {\n    lines.push('## Extracted Results');\n    lines.push('');\n    for (const result of context.results.slice(0, 10)) { // Limit to first 10\n      lines.push(`### Result ${result.index + 1}`);\n      if (result.title) {\n        lines.push(`**Title:** ${result.title}`);\n      }\n      if (result.snippet) {\n        lines.push(`**Snippet:** ${result.snippet}`);\n      }\n      lines.push(`**Full Text:** ${result.fullText.slice(0, 200)}${result.fullText.length > 200 ? '...' : ''}`);\n      lines.push(`**Visible:** ${result.visible ? 'Yes' : 'No'}`);\n      lines.push('');\n    }\n\n    if (context.results.length > 10) {\n      lines.push(`*...and ${context.results.length - 10} more results*`);\n      lines.push('');\n    }\n  } else {\n    lines.push('## No Results');\n    lines.push('The search returned no results. This may indicate:');\n    lines.push('- The search query is too specific');\n    lines.push('- No matching content exists');\n    lines.push('- A bug in the search functionality');\n    lines.push('');\n  }\n\n  // Validation Questions\n  lines.push('## Validation Questions');\n  lines.push('');\n  lines.push('1. **Relevance:** Do the results match the user\\'s intent?');\n  lines.push('2. **Quality:** Are the results useful and informative?');\n  lines.push('3. **Issues:** Are there any obvious problems (e.g., unrelated content)?');\n  lines.push('4. **Suggestions:** What could improve the search experience?');\n  lines.push('');\n\n  // Response Format\n  lines.push('## Expected Response');\n  lines.push('');\n  lines.push('Please respond with:');\n  lines.push('- `relevant`: true/false - whether results match user intent');\n  lines.push('- `confidence`: 0-1 - how confident you are in the assessment');\n  lines.push('- `reasoning`: brief explanation of your assessment');\n  lines.push('- `suggestions`: (optional) array of improvement suggestions');\n  lines.push('- `issues`: (optional) array of specific issues found');\n\n  return lines.join('\\n');\n}\n\n/**\n * Generate a concise summary for quick validation\n */\nexport function generateQuickSummary(context: ValidationContext): string {\n  const lines: string[] = [];\n\n  lines.push(`Search: \"${context.query}\"`);\n  lines.push(`Intent: ${context.userIntent}`);\n  lines.push(`Results: ${context.resultCount} found in ${context.timing.total}ms`);\n\n  if (context.results.length > 0) {\n    lines.push('');\n    lines.push('Top results:');\n    for (const result of context.results.slice(0, 3)) {\n      const title = result.title || result.fullText.slice(0, 50);\n      lines.push(`  ${result.index + 1}. ${title}`);\n    }\n  }\n\n  return lines.join('\\n');\n}\n\n/**\n * Analyze results for obvious issues (pre-AI check)\n *\n * Performs quick heuristic checks before involving AI:\n * - Empty results\n * - Very slow response\n * - Results with no text content\n */\nexport function analyzeForObviousIssues(context: ValidationContext): ValidationIssue[] {\n  const issues: ValidationIssue[] = [];\n\n  // Check for empty results\n  if (!context.hasResults) {\n    issues.push({\n      type: 'empty',\n      description: 'Search returned no results',\n      severity: 'high',\n    });\n  }\n\n  // Check for slow response (>5 seconds is concerning)\n  if (context.timing.total > 5000) {\n    issues.push({\n      type: 'slow',\n      description: `Search took ${context.timing.total}ms (>5s)`,\n      severity: context.timing.total > 10000 ? 'high' : 'medium',\n    });\n  }\n\n  // Check for results with no meaningful content\n  for (const result of context.results) {\n    if (!result.fullText || result.fullText.trim().length < 10) {\n      issues.push({\n        type: 'error',\n        resultIndex: result.index,\n        description: `Result ${result.index + 1} has no meaningful content`,\n        severity: 'medium',\n      });\n    }\n  }\n\n  // Check for query terms in results (basic relevance)\n  const queryTerms = context.query.toLowerCase().split(/\\s+/).filter(t => t.length > 2);\n  for (const result of context.results) {\n    const textLower = result.fullText.toLowerCase();\n    const matchCount = queryTerms.filter(term => textLower.includes(term)).length;\n    const matchRatio = matchCount / queryTerms.length;\n\n    if (matchRatio < 0.2 && queryTerms.length > 1) {\n      issues.push({\n        type: 'irrelevant',\n        resultIndex: result.index,\n        description: `Result ${result.index + 1} may not match query (low keyword overlap)`,\n        severity: 'low',\n      });\n    }\n  }\n\n  return issues;\n}\n\n/**\n * Format validation result for display\n */\nexport function formatValidationResult(result: ValidationResult): string {\n  const lines: string[] = [];\n\n  const status = result.relevant ? 'PASS' : 'FAIL';\n  const confidence = Math.round(result.confidence * 100);\n\n  lines.push(`## Validation: ${status} (${confidence}% confidence)`);\n  lines.push('');\n  lines.push(`**Assessment:** ${result.reasoning}`);\n\n  if (result.issues && result.issues.length > 0) {\n    lines.push('');\n    lines.push('**Issues Found:**');\n    for (const issue of result.issues) {\n      const severity = issue.severity.toUpperCase();\n      lines.push(`- [${severity}] ${issue.description}`);\n    }\n  }\n\n  if (result.suggestions && result.suggestions.length > 0) {\n    lines.push('');\n    lines.push('**Suggestions:**');\n    for (const suggestion of result.suggestions) {\n      lines.push(`- ${suggestion}`);\n    }\n  }\n\n  return lines.join('\\n');\n}\n\n/**\n * Create a dev-mode prompt for user feedback\n *\n * Used when results seem questionable and user input is needed.\n */\nexport function generateDevModePrompt(\n  context: ValidationContext,\n  issues: ValidationIssue[]\n): string {\n  const lines: string[] = [];\n\n  lines.push('## Search Results Review');\n  lines.push('');\n  lines.push(`Query: \"${context.query}\"`);\n  lines.push(`Intent: ${context.userIntent}`);\n  lines.push('');\n\n  if (issues.length > 0) {\n    lines.push('**Potential issues detected:**');\n    for (const issue of issues) {\n      lines.push(`- ${issue.description}`);\n    }\n    lines.push('');\n  }\n\n  // Show sample results\n  if (context.results.length > 0) {\n    lines.push('**Sample results:**');\n    for (const result of context.results.slice(0, 3)) {\n      const title = result.title || result.fullText.slice(0, 40);\n      lines.push(`  ${result.index + 1}. ${title}`);\n    }\n    lines.push('');\n  }\n\n  lines.push('**What would you like to do?**');\n  lines.push('1. Accept results as expected');\n  lines.push('2. Refine the search query');\n  lines.push('3. Report as bug');\n  lines.push('4. Skip this test');\n\n  return lines.join('\\n');\n}\n","import { readFile, access } from 'fs/promises';\nimport { join } from 'path';\nimport { listSessions, deleteSession } from './session.js';\nimport type { Session } from './schemas.js';\n\n/**\n * Retention policy configuration\n * Add to .ibrrc.json to enable auto-cleanup\n */\nexport interface RetentionConfig {\n  /** Maximum number of sessions to keep (default: no limit) */\n  maxSessions?: number;\n  /** Maximum age of sessions in days (default: no limit) */\n  maxAgeDays?: number;\n  /** Keep sessions that have failed comparisons (default: true) */\n  keepFailed?: boolean;\n  /** Enable automatic cleanup on session creation (default: false) */\n  autoClean?: boolean;\n}\n\n/**\n * Default retention configuration\n */\nexport const DEFAULT_RETENTION: RetentionConfig = {\n  maxSessions: undefined,\n  maxAgeDays: undefined,\n  keepFailed: true,\n  autoClean: false,\n};\n\n/**\n * Result of retention policy enforcement\n */\nexport interface RetentionResult {\n  /** Sessions that were deleted */\n  deleted: string[];\n  /** Sessions that were kept */\n  kept: string[];\n  /** Sessions kept because they failed (if keepFailed is true) */\n  keptFailed: string[];\n  /** Total sessions before cleanup */\n  totalBefore: number;\n  /** Total sessions after cleanup */\n  totalAfter: number;\n}\n\n/**\n * Load retention config from .ibrrc.json\n */\nexport async function loadRetentionConfig(outputDir: string): Promise<RetentionConfig> {\n  const configPath = join(outputDir, '..', '.ibrrc.json');\n\n  try {\n    await access(configPath);\n    const content = await readFile(configPath, 'utf-8');\n    const config = JSON.parse(content);\n    return {\n      ...DEFAULT_RETENTION,\n      ...config.retention,\n    };\n  } catch {\n    return DEFAULT_RETENTION;\n  }\n}\n\n/**\n * Check if a session should be kept due to failed status\n */\nfunction isFailedSession(session: Session): boolean {\n  return session.analysis?.verdict === 'LAYOUT_BROKEN' ||\n         session.analysis?.verdict === 'UNEXPECTED_CHANGE';\n}\n\n/**\n * Enforce retention policy on sessions\n *\n * @example\n * ```typescript\n * // Enforce with config from .ibrrc.json\n * const result = await enforceRetentionPolicy('./.ibr');\n * console.log(`Deleted ${result.deleted.length} sessions`);\n *\n * // Enforce with explicit config\n * const result = await enforceRetentionPolicy('./.ibr', {\n *   maxSessions: 20,\n *   maxAgeDays: 7,\n *   keepFailed: true\n * });\n * ```\n */\nexport async function enforceRetentionPolicy(\n  outputDir: string,\n  config?: RetentionConfig\n): Promise<RetentionResult> {\n  // Load config if not provided\n  const retentionConfig = config || await loadRetentionConfig(outputDir);\n\n  // If no retention limits set, nothing to do\n  if (!retentionConfig.maxSessions && !retentionConfig.maxAgeDays) {\n    const sessions = await listSessions(outputDir);\n    return {\n      deleted: [],\n      kept: sessions.map(s => s.id),\n      keptFailed: [],\n      totalBefore: sessions.length,\n      totalAfter: sessions.length,\n    };\n  }\n\n  // Get all sessions sorted by creation date (newest first)\n  const sessions = await listSessions(outputDir);\n  const totalBefore = sessions.length;\n\n  const deleted: string[] = [];\n  const kept: string[] = [];\n  const keptFailed: string[] = [];\n\n  // Calculate cutoff time if maxAgeDays is set\n  const cutoffTime = retentionConfig.maxAgeDays\n    ? Date.now() - (retentionConfig.maxAgeDays * 24 * 60 * 60 * 1000)\n    : 0;\n\n  // Track how many non-failed sessions we've kept\n  let keptCount = 0;\n\n  for (const session of sessions) {\n    const sessionTime = new Date(session.createdAt).getTime();\n    const isTooOld = retentionConfig.maxAgeDays && sessionTime < cutoffTime;\n    const isOverLimit = retentionConfig.maxSessions && keptCount >= retentionConfig.maxSessions;\n    const isFailed = isFailedSession(session);\n\n    // Keep failed sessions if configured\n    if (isFailed && retentionConfig.keepFailed) {\n      kept.push(session.id);\n      keptFailed.push(session.id);\n      continue;\n    }\n\n    // Check if session should be deleted\n    if (isTooOld || isOverLimit) {\n      await deleteSession(outputDir, session.id);\n      deleted.push(session.id);\n    } else {\n      kept.push(session.id);\n      keptCount++;\n    }\n  }\n\n  return {\n    deleted,\n    kept,\n    keptFailed,\n    totalBefore,\n    totalAfter: kept.length,\n  };\n}\n\n/**\n * Run auto-cleanup if enabled in config\n * Call this after creating new sessions\n */\nexport async function maybeAutoClean(outputDir: string): Promise<RetentionResult | null> {\n  const config = await loadRetentionConfig(outputDir);\n\n  if (!config.autoClean) {\n    return null;\n  }\n\n  return enforceRetentionPolicy(outputDir, config);\n}\n\n/**\n * Get retention status summary\n */\nexport async function getRetentionStatus(outputDir: string): Promise<{\n  config: RetentionConfig;\n  currentSessions: number;\n  oldestSession: Date | null;\n  newestSession: Date | null;\n  wouldDelete: number;\n}> {\n  const config = await loadRetentionConfig(outputDir);\n  const sessions = await listSessions(outputDir);\n\n  // Calculate how many would be deleted\n  let wouldDelete = 0;\n  const cutoffTime = config.maxAgeDays\n    ? Date.now() - (config.maxAgeDays * 24 * 60 * 60 * 1000)\n    : 0;\n\n  let keptCount = 0;\n  for (const session of sessions) {\n    const sessionTime = new Date(session.createdAt).getTime();\n    const isTooOld = config.maxAgeDays && sessionTime < cutoffTime;\n    const isOverLimit = config.maxSessions && keptCount >= config.maxSessions;\n    const isFailed = isFailedSession(session);\n\n    if (isFailed && config.keepFailed) {\n      continue;\n    }\n\n    if (isTooOld || isOverLimit) {\n      wouldDelete++;\n    } else {\n      keptCount++;\n    }\n  }\n\n  return {\n    config,\n    currentSessions: sessions.length,\n    oldestSession: sessions.length > 0\n      ? new Date(sessions[sessions.length - 1].createdAt)\n      : null,\n    newestSession: sessions.length > 0\n      ? new Date(sessions[0].createdAt)\n      : null,\n    wouldDelete,\n  };\n}\n\n/**\n * Format retention status for display\n */\nexport function formatRetentionStatus(status: Awaited<ReturnType<typeof getRetentionStatus>>): string {\n  const lines: string[] = [];\n\n  lines.push('Session Retention Status');\n  lines.push('========================');\n  lines.push('');\n  lines.push(`Current sessions: ${status.currentSessions}`);\n\n  if (status.oldestSession) {\n    lines.push(`Oldest: ${status.oldestSession.toISOString()}`);\n  }\n  if (status.newestSession) {\n    lines.push(`Newest: ${status.newestSession.toISOString()}`);\n  }\n\n  lines.push('');\n  lines.push('Retention Policy:');\n\n  if (status.config.maxSessions) {\n    lines.push(`  Max sessions: ${status.config.maxSessions}`);\n  } else {\n    lines.push('  Max sessions: unlimited');\n  }\n\n  if (status.config.maxAgeDays) {\n    lines.push(`  Max age: ${status.config.maxAgeDays} days`);\n  } else {\n    lines.push('  Max age: unlimited');\n  }\n\n  lines.push(`  Keep failed: ${status.config.keepFailed ? 'yes' : 'no'}`);\n  lines.push(`  Auto-clean: ${status.config.autoClean ? 'enabled' : 'disabled'}`);\n\n  if (status.wouldDelete > 0) {\n    lines.push('');\n    lines.push(`⚠️  ${status.wouldDelete} session(s) would be deleted if cleanup runs`);\n  } else {\n    lines.push('');\n    lines.push('✓ All sessions within retention policy');\n  }\n\n  return lines.join('\\n');\n}\n","import { EngineDriver } from './engine/driver.js';\nimport { CompatPage } from './engine/compat.js';\nimport { URL } from 'url';\n\nexport interface CrawlOptions {\n  /** Starting URL */\n  url: string;\n  /** Maximum number of pages to discover (default: 5) */\n  maxPages?: number;\n  /** Only crawl pages under this path prefix */\n  pathPrefix?: string;\n  /** Timeout per page in ms (default: 10000) */\n  timeout?: number;\n  /** Include external links (default: false) */\n  includeExternal?: boolean;\n}\n\nexport interface DiscoveredPage {\n  url: string;\n  path: string;\n  title: string;\n  linkText?: string;\n  depth: number;\n}\n\nexport interface CrawlResult {\n  baseUrl: string;\n  pages: DiscoveredPage[];\n  totalLinks: number;\n  crawlTime: number;\n}\n\n/**\n * Discover pages on a website by crawling from the starting URL\n * Returns up to maxPages unique pages within the same origin\n */\nexport async function discoverPages(options: CrawlOptions): Promise<CrawlResult> {\n  const {\n    url,\n    maxPages = 5,\n    pathPrefix,\n    timeout = 10000,\n    includeExternal = false,\n  } = options;\n\n  const startTime = Date.now();\n  const startUrl = new URL(url);\n  const origin = startUrl.origin;\n\n  const discovered: Map<string, DiscoveredPage> = new Map();\n  const visited: Set<string> = new Set();\n  const queue: { url: string; depth: number; linkText?: string }[] = [\n    { url: url, depth: 0 }\n  ];\n\n  let driver: EngineDriver | null = null;\n  let totalLinks = 0;\n\n  try {\n    driver = new EngineDriver();\n    await driver.launch({ headless: true });\n    const page = new CompatPage(driver);\n\n    while (queue.length > 0 && discovered.size < maxPages) {\n      const current = queue.shift();\n      if (!current) break;\n\n      const currentUrl = normalizeUrl(current.url);\n      if (visited.has(currentUrl)) continue;\n      visited.add(currentUrl);\n\n      try {\n        // Navigate to page\n        await page.goto(current.url, {\n          waitUntil: 'domcontentloaded',\n          timeout,\n        });\n\n        // Get page title\n        const title = await page.title();\n\n        // Add to discovered pages\n        const parsedUrl = new URL(current.url);\n        discovered.set(currentUrl, {\n          url: current.url,\n          path: parsedUrl.pathname,\n          title: title || parsedUrl.pathname,\n          linkText: current.linkText,\n          depth: current.depth,\n        });\n\n        // Only continue crawling if we haven't reached max\n        if (discovered.size >= maxPages) break;\n\n        // Find all links on the page\n        const links = await page.evaluate((): { href: string; text: string }[] => {\n          const anchors = Array.from(document.querySelectorAll('a[href]'));\n          return anchors.map((a: Element) => ({\n            href: (a as HTMLAnchorElement).getAttribute('href') || '',\n            text: a.textContent?.trim() || '',\n          }));\n        });\n\n        totalLinks += links.length;\n\n        // Process links\n        for (const link of links) {\n          if (discovered.size >= maxPages) break;\n\n          try {\n            const absoluteUrl = new URL(link.href, current.url);\n            const normalizedUrl = normalizeUrl(absoluteUrl.href);\n\n            // Skip if already visited or queued\n            if (visited.has(normalizedUrl)) continue;\n\n            // Check if same origin\n            if (!includeExternal && absoluteUrl.origin !== origin) continue;\n\n            // Check path prefix if specified\n            if (pathPrefix && !absoluteUrl.pathname.startsWith(pathPrefix)) continue;\n\n            // Skip common non-page URLs\n            if (shouldSkipUrl(absoluteUrl)) continue;\n\n            // Add to queue\n            queue.push({\n              url: absoluteUrl.href,\n              depth: current.depth + 1,\n              linkText: link.text,\n            });\n          } catch {\n            // Invalid URL, skip\n          }\n        }\n      } catch (error) {\n        // Page failed to load, continue with next\n        console.error(`Failed to load ${current.url}:`, error instanceof Error ? error.message : error);\n      }\n    }\n\n    await driver.close();\n  } catch (error) {\n    if (driver) await driver.close();\n    throw error;\n  }\n\n  const crawlTime = Date.now() - startTime;\n\n  return {\n    baseUrl: origin,\n    pages: Array.from(discovered.values()).sort((a, b) => {\n      // Sort by depth first, then by path\n      if (a.depth !== b.depth) return a.depth - b.depth;\n      return a.path.localeCompare(b.path);\n    }),\n    totalLinks,\n    crawlTime,\n  };\n}\n\n/**\n * Normalize URL for comparison (remove trailing slash, hash, query params)\n */\nfunction normalizeUrl(url: string): string {\n  try {\n    const parsed = new URL(url);\n    // Remove hash and query, normalize trailing slash\n    let normalized = `${parsed.origin}${parsed.pathname}`;\n    if (normalized.endsWith('/') && normalized.length > 1) {\n      normalized = normalized.slice(0, -1);\n    }\n    return normalized;\n  } catch {\n    return url;\n  }\n}\n\n/**\n * Check if URL should be skipped (non-page resources)\n */\nfunction shouldSkipUrl(url: URL): boolean {\n  const path = url.pathname.toLowerCase();\n  const skipExtensions = [\n    '.pdf', '.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp',\n    '.css', '.js', '.json', '.xml', '.ico', '.woff', '.woff2',\n    '.mp3', '.mp4', '.webm', '.zip', '.tar', '.gz',\n  ];\n\n  if (skipExtensions.some(ext => path.endsWith(ext))) return true;\n\n  // Skip common non-content paths\n  const skipPaths = [\n    '/api/', '/static/', '/assets/', '/_next/', '/fonts/',\n    '/images/', '/img/', '/cdn/', '/admin/', '/auth/',\n  ];\n\n  if (skipPaths.some(p => path.includes(p))) return true;\n\n  // Skip hash-only links\n  if (url.hash && url.pathname === '/') return true;\n\n  return false;\n}\n\n/**\n * Quick scan to get navigation links from a page\n * Useful for finding main pages without full crawl\n */\nexport async function getNavigationLinks(url: string): Promise<DiscoveredPage[]> {\n  let driver: EngineDriver | null = null;\n\n  try {\n    driver = new EngineDriver();\n    await driver.launch({ headless: true });\n    const page = new CompatPage(driver);\n\n    await page.goto(url, {\n      waitUntil: 'domcontentloaded',\n      timeout: 15000,\n    });\n\n    const origin = new URL(url).origin;\n\n    // Find links in navigation elements\n    const navLinks = await page.evaluate((): { href: string; text: string }[] => {\n      const selectors = [\n        'nav a[href]',\n        'header a[href]',\n        '[role=\"navigation\"] a[href]',\n        '.nav a[href]',\n        '.navbar a[href]',\n        '.sidebar a[href]',\n        '.menu a[href]',\n      ];\n\n      const links: { href: string; text: string }[] = [];\n      const seen = new Set<string>();\n\n      for (const selector of selectors) {\n        const anchors = Array.from(document.querySelectorAll(selector));\n        for (const a of anchors) {\n          const href = (a as HTMLAnchorElement).getAttribute('href');\n          const text = a.textContent?.trim();\n          if (href && text && !seen.has(href)) {\n            seen.add(href);\n            links.push({ href, text });\n          }\n        }\n      }\n\n      return links;\n    });\n\n    await driver.close();\n\n    // Convert to DiscoveredPage format\n    const pages: DiscoveredPage[] = [];\n\n    for (const link of navLinks) {\n      try {\n        const absoluteUrl = new URL(link.href, url);\n\n        // Only include same-origin links\n        if (absoluteUrl.origin !== origin) continue;\n\n        // Skip resources\n        if (shouldSkipUrl(absoluteUrl)) continue;\n\n        pages.push({\n          url: absoluteUrl.href,\n          path: absoluteUrl.pathname,\n          title: link.text,\n          linkText: link.text,\n          depth: 1,\n        });\n      } catch {\n        // Invalid URL\n      }\n    }\n\n    // Remove duplicates by path\n    const uniquePages = new Map<string, DiscoveredPage>();\n    for (const page of pages) {\n      if (!uniquePages.has(page.path)) {\n        uniquePages.set(page.path, page);\n      }\n    }\n\n    return Array.from(uniquePages.values());\n  } catch (error) {\n    if (driver) await driver.close();\n    throw error;\n  }\n}\n","/**\n * integration.ts\n * Extract API calls from TypeScript/React component files\n *\n * Detects:\n * - fetch() calls\n * - axios methods (get, post, put, delete, patch, etc.)\n * - Template literals and variable URLs\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\nexport interface ApiCall {\n  endpoint: string;       // \"/api/users\" or \"https://...\" or \"${dynamic}\"\n  method: string;         // GET, POST, PUT, DELETE, PATCH, etc.\n  sourceFile: string;     // File where call was found\n  lineNumber?: number;    // Line number in source\n  callerContext?: string; // Function/component name containing the call\n  isDynamic?: boolean;    // True if endpoint uses template literals or variables\n}\n\n/**\n * Represents an API route discovered in the project\n */\nexport interface ApiRoute {\n  route: string;          // \"/api/users\", \"/api/posts/[id]\"\n  method: string[];       // [\"GET\", \"POST\"] based on exports\n  sourceFile: string;     // \"app/api/users/route.ts\"\n  isDynamic: boolean;     // Has [param] segments\n}\n\n/**\n * Extract the function/component context around a line number\n */\nfunction extractCallerContext(content: string, targetLine: number): string | undefined {\n  const lines = content.split('\\n');\n\n  // Search backwards from target line to find function/component declaration\n  for (let i = targetLine - 1; i >= Math.max(0, targetLine - 30); i--) {\n    const line = lines[i];\n\n    // Match function declarations, arrow functions, and React components\n    const functionMatch = line.match(/(?:export\\s+)?(?:async\\s+)?function\\s+(\\w+)/);\n    const arrowMatch = line.match(/(?:export\\s+)?const\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\(/);\n    const componentMatch = line.match(/(?:export\\s+)?(?:const|function)\\s+([A-Z]\\w+)/);\n\n    if (functionMatch) return functionMatch[1];\n    if (arrowMatch) return arrowMatch[1];\n    if (componentMatch) return componentMatch[1];\n  }\n\n  return undefined;\n}\n\n/**\n * Parse endpoint string, detecting dynamic parts\n */\nfunction parseEndpoint(rawEndpoint: string): { endpoint: string; isDynamic: boolean } {\n  // Check for template literal patterns\n  const hasTemplateLiteral = rawEndpoint.includes('${') || rawEndpoint.includes('`');\n\n  // Check for concatenation patterns\n  const hasConcatenation = /['\"].*\\+|^\\w+$/.test(rawEndpoint);\n\n  if (hasTemplateLiteral || hasConcatenation) {\n    return {\n      endpoint: rawEndpoint.replace(/`/g, '').replace(/\\$\\{[^}]+\\}/g, '{dynamic}'),\n      isDynamic: true\n    };\n  }\n\n  // Clean up quotes\n  return {\n    endpoint: rawEndpoint.replace(/['\"]/g, ''),\n    isDynamic: false\n  };\n}\n\n/**\n * Extract API calls from file content\n */\nfunction extractFromContent(content: string, sourceFile: string): ApiCall[] {\n  const calls: ApiCall[] = [];\n  const lines = content.split('\\n');\n\n  // Pattern 1: fetch() calls\n  // Matches: fetch('/api/users'), fetch(\"/api/users\"), fetch(`/api/${id}`)\n  const fetchPattern = /fetch\\s*\\(\\s*(['\"`])([^'\"`]+)\\1/g;\n  const fetchWithOptionsPattern = /fetch\\s*\\(\\s*(['\"`])([^'\"`]+)\\1\\s*,\\s*\\{[^}]*method\\s*:\\s*['\"](\\w+)['\"]/g;\n\n  // Pattern 2: axios method calls\n  // Matches: axios.get('/api/users'), axios.post('/api/users', data)\n  const axiosPattern = /axios\\.(get|post|put|delete|patch|head|options)\\s*\\(\\s*(['\"`])([^'\"`]+)\\2/g;\n\n  // Pattern 3: axios with method in config\n  // Matches: axios({ url: '/api/users', method: 'POST' })\n  const axiosConfigPattern = /axios\\s*\\(\\s*\\{[^}]*url\\s*:\\s*(['\"`])([^'\"`]+)\\1[^}]*method\\s*:\\s*['\"](\\w+)['\"]/g;\n\n  // Pattern 4: Template literals (more complex)\n  const templateLiteralPattern = /(?:fetch|axios(?:\\.\\w+)?)\\s*\\(\\s*`([^`]+)`/g;\n\n  // Pattern 5: Variable URLs\n  const urlVariablePattern = /const\\s+(\\w*[Uu]rl\\w*)\\s*=\\s*(['\"`])([^'\"`]+)\\2/g;\n  const urlUsagePattern = /(?:fetch|axios(?:\\.\\w+)?)\\s*\\(\\s*(\\w+)/g;\n\n  // Track URL variables\n  const urlVariables = new Map<string, { endpoint: string; lineNumber: number }>();\n\n  // First pass: collect URL variables\n  lines.forEach((line, index) => {\n    let match;\n    const urlVarRegex = new RegExp(urlVariablePattern.source, 'g');\n    while ((match = urlVarRegex.exec(line)) !== null) {\n      urlVariables.set(match[1], {\n        endpoint: match[3],\n        lineNumber: index + 1\n      });\n    }\n  });\n\n  // Second pass: extract API calls\n  lines.forEach((line, index) => {\n    const lineNumber = index + 1;\n\n    // Match fetch with explicit method\n    let match;\n    const fetchOptsRegex = new RegExp(fetchWithOptionsPattern.source, 'g');\n    while ((match = fetchOptsRegex.exec(line)) !== null) {\n      const { endpoint, isDynamic } = parseEndpoint(match[2]);\n      calls.push({\n        endpoint,\n        method: match[3].toUpperCase(),\n        sourceFile,\n        lineNumber,\n        callerContext: extractCallerContext(content, lineNumber),\n        isDynamic\n      });\n    }\n\n    // Match basic fetch (default GET)\n    const fetchRegex = new RegExp(fetchPattern.source, 'g');\n    while ((match = fetchRegex.exec(line)) !== null) {\n      // Skip if already matched with options\n      if (!line.includes('method:')) {\n        const { endpoint, isDynamic } = parseEndpoint(match[2]);\n        calls.push({\n          endpoint,\n          method: 'GET',\n          sourceFile,\n          lineNumber,\n          callerContext: extractCallerContext(content, lineNumber),\n          isDynamic\n        });\n      }\n    }\n\n    // Match axios method calls\n    const axiosRegex = new RegExp(axiosPattern.source, 'g');\n    while ((match = axiosRegex.exec(line)) !== null) {\n      const { endpoint, isDynamic } = parseEndpoint(match[3]);\n      calls.push({\n        endpoint,\n        method: match[1].toUpperCase(),\n        sourceFile,\n        lineNumber,\n        callerContext: extractCallerContext(content, lineNumber),\n        isDynamic\n      });\n    }\n\n    // Match axios config object\n    const axiosConfigRegex = new RegExp(axiosConfigPattern.source, 'g');\n    while ((match = axiosConfigRegex.exec(line)) !== null) {\n      const { endpoint, isDynamic } = parseEndpoint(match[2]);\n      calls.push({\n        endpoint,\n        method: match[3].toUpperCase(),\n        sourceFile,\n        lineNumber,\n        callerContext: extractCallerContext(content, lineNumber),\n        isDynamic\n      });\n    }\n\n    // Match template literals\n    const templateRegex = new RegExp(templateLiteralPattern.source, 'g');\n    while ((match = templateRegex.exec(line)) !== null) {\n      const { endpoint } = parseEndpoint(match[1]);\n\n      // Try to determine method\n      let method = 'GET';\n      const methodMatch = line.match(/method\\s*:\\s*['\"](\\w+)['\"]/);\n      if (methodMatch) {\n        method = methodMatch[1].toUpperCase();\n      }\n\n      calls.push({\n        endpoint,\n        method,\n        sourceFile,\n        lineNumber,\n        callerContext: extractCallerContext(content, lineNumber),\n        isDynamic: true // Template literals are always dynamic\n      });\n    }\n\n    // Match variable usage\n    const urlUsageRegex = new RegExp(urlUsagePattern.source, 'g');\n    while ((match = urlUsageRegex.exec(line)) !== null) {\n      const varName = match[1];\n      if (urlVariables.has(varName)) {\n        const urlInfo = urlVariables.get(varName)!;\n        const { endpoint, isDynamic } = parseEndpoint(urlInfo.endpoint);\n\n        // Try to determine method\n        let method = 'GET';\n        const methodMatch = line.match(/method\\s*:\\s*['\"](\\w+)['\"]/);\n        if (methodMatch) {\n          method = methodMatch[1].toUpperCase();\n        }\n\n        calls.push({\n          endpoint,\n          method,\n          sourceFile,\n          lineNumber,\n          callerContext: extractCallerContext(content, lineNumber),\n          isDynamic\n        });\n      }\n    }\n  });\n\n  // Deduplicate calls (same endpoint, method, and line)\n  const uniqueCalls = calls.filter((call, index, self) =>\n    index === self.findIndex((c) =>\n      c.endpoint === call.endpoint &&\n      c.method === call.method &&\n      c.lineNumber === call.lineNumber\n    )\n  );\n\n  return uniqueCalls;\n}\n\n/**\n * Parse a single file for fetch/axios calls\n *\n * @param filePath - Absolute path to TypeScript/React file\n * @returns Array of API calls found in the file\n */\nexport async function extractApiCalls(filePath: string): Promise<ApiCall[]> {\n  try {\n    const content = await fs.readFile(filePath, 'utf-8');\n    return extractFromContent(content, filePath);\n  } catch (error) {\n    console.error(`Error reading file ${filePath}:`, error);\n    return [];\n  }\n}\n\n/**\n * Recursively scan directory for TypeScript/React files and extract API calls\n *\n * @param dir - Directory to scan\n * @param pattern - File pattern to match (default: TypeScript/React files)\n * @returns Array of all API calls found\n */\nexport async function scanDirectoryForApiCalls(\n  dir: string,\n  _pattern: string = '**/*.{ts,tsx,js,jsx}'\n): Promise<ApiCall[]> {\n  const allCalls: ApiCall[] = [];\n\n  async function scanDir(currentDir: string): Promise<void> {\n    try {\n      const entries = await fs.readdir(currentDir, { withFileTypes: true });\n\n      for (const entry of entries) {\n        const fullPath = path.join(currentDir, entry.name);\n\n        if (entry.isDirectory()) {\n          // Skip node_modules, dist, build, .next, etc.\n          const skipDirs = ['node_modules', 'dist', 'build', '.git', 'coverage', '.next', '__tests__', '__mocks__'];\n          if (!skipDirs.includes(entry.name)) {\n            await scanDir(fullPath);\n          }\n        } else if (entry.isFile()) {\n          // Check if file matches pattern\n          const ext = path.extname(entry.name);\n          if (['.ts', '.tsx', '.js', '.jsx'].includes(ext)) {\n            // Skip test files, spec files, and files with example patterns\n            const isTestFile = entry.name.includes('.test.') ||\n                              entry.name.includes('.spec.') ||\n                              entry.name.includes('.mock.') ||\n                              entry.name === 'integration.ts'; // Skip self (contains example patterns)\n            if (!isTestFile) {\n              const calls = await extractApiCalls(fullPath);\n              allCalls.push(...calls);\n            }\n          }\n        }\n      }\n    } catch (error) {\n      console.error(`Error scanning directory ${currentDir}:`, error);\n    }\n  }\n\n  await scanDir(dir);\n  return allCalls;\n}\n\n/**\n * Group API calls by endpoint\n */\nexport function groupByEndpoint(calls: ApiCall[]): Map<string, ApiCall[]> {\n  const grouped = new Map<string, ApiCall[]>();\n\n  for (const call of calls) {\n    const key = call.endpoint;\n    if (!grouped.has(key)) {\n      grouped.set(key, []);\n    }\n    grouped.get(key)!.push(call);\n  }\n\n  return grouped;\n}\n\n/**\n * Group API calls by source file\n */\nexport function groupByFile(calls: ApiCall[]): Map<string, ApiCall[]> {\n  const grouped = new Map<string, ApiCall[]>();\n\n  for (const call of calls) {\n    const key = call.sourceFile;\n    if (!grouped.has(key)) {\n      grouped.set(key, []);\n    }\n    grouped.get(key)!.push(call);\n  }\n\n  return grouped;\n}\n\n/**\n * Filter calls to only include specific HTTP methods\n */\nexport function filterByMethod(calls: ApiCall[], methods: string[]): ApiCall[] {\n  const upperMethods = methods.map(m => m.toUpperCase());\n  return calls.filter(call => upperMethods.includes(call.method));\n}\n\n/**\n * Filter calls to only include specific endpoints (supports wildcards)\n */\nexport function filterByEndpoint(calls: ApiCall[], endpointPattern: string): ApiCall[] {\n  const regex = new RegExp(\n    '^' + endpointPattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$'\n  );\n  return calls.filter(call => regex.test(call.endpoint));\n}\n\n/**\n * Discover API routes from Next.js/Remix file structure\n * Supports Next.js App Router (app/api) and Pages Router (pages/api)\n * Also searches subdirectories (like web-ui/) for nested Next.js apps\n */\nexport async function discoverApiRoutes(projectDir: string): Promise<ApiRoute[]> {\n  const routes: ApiRoute[] = [];\n\n  // Discover routes in a specific directory\n  async function discoverInDir(dir: string): Promise<void> {\n    // Check for Next.js App Router (app/api/**/route.ts)\n    const appApiDir = path.join(dir, 'app', 'api');\n    if (await directoryExists(appApiDir)) {\n      const appRoutes = await discoverAppRouterRoutes(appApiDir, dir);\n      routes.push(...appRoutes);\n    }\n\n    // Check for Next.js Pages Router (pages/api/**/*.ts)\n    const pagesApiDir = path.join(dir, 'pages', 'api');\n    if (await directoryExists(pagesApiDir)) {\n      const pagesRoutes = await discoverPagesRouterRoutes(pagesApiDir, dir);\n      routes.push(...pagesRoutes);\n    }\n\n    // Check for src directory variants\n    const srcAppApiDir = path.join(dir, 'src', 'app', 'api');\n    if (await directoryExists(srcAppApiDir)) {\n      const srcAppRoutes = await discoverAppRouterRoutes(srcAppApiDir, dir);\n      routes.push(...srcAppRoutes);\n    }\n\n    const srcPagesApiDir = path.join(dir, 'src', 'pages', 'api');\n    if (await directoryExists(srcPagesApiDir)) {\n      const srcPagesRoutes = await discoverPagesRouterRoutes(srcPagesApiDir, dir);\n      routes.push(...srcPagesRoutes);\n    }\n  }\n\n  // Discover in project root\n  await discoverInDir(projectDir);\n\n  // Also check subdirectories for nested apps (e.g., web-ui/, frontend/, client/)\n  try {\n    const entries = await fs.readdir(projectDir, { withFileTypes: true });\n    const skipDirs = ['node_modules', 'dist', 'build', '.git', 'coverage', '.next'];\n\n    for (const entry of entries) {\n      if (entry.isDirectory() && !skipDirs.includes(entry.name)) {\n        const subDir = path.join(projectDir, entry.name);\n\n        // Check if this subdir has a package.json (indicating it's a sub-project)\n        const hasPackageJson = await fileExists(path.join(subDir, 'package.json'));\n        if (hasPackageJson) {\n          await discoverInDir(subDir);\n        }\n      }\n    }\n  } catch {\n    // Ignore errors reading directory\n  }\n\n  return routes;\n}\n\n/**\n * Check if a file exists\n */\nasync function fileExists(filePath: string): Promise<boolean> {\n  try {\n    const stat = await fs.stat(filePath);\n    return stat.isFile();\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Convert file path to API route\n * Examples:\n * - app/api/users/route.ts -> /api/users\n * - app/api/users/[id]/route.ts -> /api/users/[id]\n * - pages/api/users.ts -> /api/users\n * - pages/api/users/[id].ts -> /api/users/[id]\n */\nexport function filePathToRoute(filePath: string, projectDir: string): string {\n  // Normalize paths\n  const normalizedFilePath = path.normalize(filePath);\n  const normalizedProjectDir = path.normalize(projectDir);\n\n  // Get relative path from project root\n  const relativePath = path.relative(normalizedProjectDir, normalizedFilePath);\n\n  // Remove file extension\n  let routePath = relativePath.replace(/\\.(ts|tsx|js|jsx)$/, '');\n\n  // Handle App Router (remove 'route' filename)\n  routePath = routePath.replace(/\\/route$/, '');\n  routePath = routePath.replace(/\\\\route$/, ''); // Windows paths\n\n  // Extract the API portion\n  let apiPath = '';\n\n  if (routePath.includes('app/api/') || routePath.includes('app\\\\api\\\\')) {\n    apiPath = routePath.split(/app[/\\\\]api[/\\\\]/)[1] || '';\n  } else if (routePath.includes('src/app/api/') || routePath.includes('src\\\\app\\\\api\\\\')) {\n    apiPath = routePath.split(/src[/\\\\]app[/\\\\]api[/\\\\]/)[1] || '';\n  } else if (routePath.includes('pages/api/') || routePath.includes('pages\\\\api\\\\')) {\n    apiPath = routePath.split(/pages[/\\\\]api[/\\\\]/)[1] || '';\n  } else if (routePath.includes('src/pages/api/') || routePath.includes('src\\\\pages\\\\api\\\\')) {\n    apiPath = routePath.split(/src[/\\\\]pages[/\\\\]api[/\\\\]/)[1] || '';\n  }\n\n  // Convert to route format (normalize path separators)\n  const route = '/api/' + (apiPath ? apiPath.replace(/\\\\/g, '/') : '');\n\n  return route;\n}\n\n/**\n * Cross-reference API calls against routes, return orphans\n */\nexport function findOrphanEndpoints(\n  apiCalls: ApiCall[],\n  apiRoutes: ApiRoute[]\n): { call: ApiCall; searchedLocations: string[] }[] {\n  const orphans: { call: ApiCall; searchedLocations: string[] }[] = [];\n\n  for (const call of apiCalls) {\n    const endpoint = call.endpoint;\n\n    // Skip non-API endpoints (external URLs, relative paths without /api)\n    if (!endpoint.startsWith('/api') && !endpoint.includes('/api/')) {\n      continue;\n    }\n\n    // Skip dynamic endpoints that are just placeholders\n    if (endpoint.includes('{dynamic}')) {\n      continue;\n    }\n\n    // Extract the API path\n    let apiPath = endpoint;\n    if (endpoint.includes('/api/')) {\n      apiPath = '/api/' + endpoint.split('/api/')[1].split('?')[0]; // Remove query params\n    }\n\n    // Try to match against routes\n    const matchedRoute = apiRoutes.find(route => {\n      // Check if methods match\n      const methodMatches = route.method.includes(call.method) ||\n                           route.method.includes('ALL');\n      if (!methodMatches) {\n        return false;\n      }\n      // Check if route pattern matches endpoint\n      return routeMatchesEndpoint(route.route, apiPath);\n    });\n\n    if (!matchedRoute) {\n      // Generate possible file locations\n      const searchedLocations = generatePossibleRouteFiles(apiPath);\n\n      orphans.push({\n        call,\n        searchedLocations\n      });\n    }\n  }\n\n  return orphans;\n}\n\n/**\n * Check if a route pattern matches an endpoint\n * Handles dynamic segments like [id], [slug], etc.\n */\nfunction routeMatchesEndpoint(routePattern: string, endpoint: string): boolean {\n  const routeParts = routePattern.split('/').filter(Boolean);\n  const endpointParts = endpoint.split('/').filter(Boolean);\n\n  if (routeParts.length !== endpointParts.length) {\n    return false;\n  }\n\n  for (let i = 0; i < routeParts.length; i++) {\n    const routePart = routeParts[i];\n    const endpointPart = endpointParts[i];\n\n    // Dynamic segment matches anything\n    if (routePart.startsWith('[') && routePart.endsWith(']')) {\n      continue;\n    }\n\n    // Static segment must match exactly\n    if (routePart !== endpointPart) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n/**\n * Generate possible file locations for an API endpoint\n */\nfunction generatePossibleRouteFiles(apiPath: string): string[] {\n  const pathWithoutApi = apiPath.replace(/^\\/api\\//, '');\n  const locations: string[] = [];\n\n  // Next.js App Router possibilities\n  locations.push(`app/api/${pathWithoutApi}/route.ts`);\n  locations.push(`app/api/${pathWithoutApi}/route.js`);\n  locations.push(`src/app/api/${pathWithoutApi}/route.ts`);\n  locations.push(`src/app/api/${pathWithoutApi}/route.js`);\n\n  // Next.js Pages Router possibilities\n  locations.push(`pages/api/${pathWithoutApi}.ts`);\n  locations.push(`pages/api/${pathWithoutApi}.js`);\n  locations.push(`src/pages/api/${pathWithoutApi}.ts`);\n  locations.push(`src/pages/api/${pathWithoutApi}.js`);\n\n  return locations;\n}\n\n/**\n * Discover routes in Next.js App Router format\n */\nasync function discoverAppRouterRoutes(\n  apiDir: string,\n  projectDir: string\n): Promise<ApiRoute[]> {\n  const routes: ApiRoute[] = [];\n\n  try {\n    const files = await findRouteFiles(apiDir, 'route');\n\n    for (const file of files) {\n      const content = await fs.readFile(file, 'utf-8');\n      const methods = extractHttpMethods(content);\n      const route = filePathToRoute(file, projectDir);\n      const isDynamic = route.includes('[') && route.includes(']');\n\n      if (methods.length > 0) {\n        routes.push({\n          route,\n          method: methods,\n          sourceFile: file,\n          isDynamic\n        });\n      }\n    }\n  } catch (error) {\n    // Directory doesn't exist or not accessible\n  }\n\n  return routes;\n}\n\n/**\n * Discover routes in Next.js Pages Router format\n */\nasync function discoverPagesRouterRoutes(\n  apiDir: string,\n  projectDir: string\n): Promise<ApiRoute[]> {\n  const routes: ApiRoute[] = [];\n\n  try {\n    const files = await findRouteFiles(apiDir);\n\n    for (const file of files) {\n      const content = await fs.readFile(file, 'utf-8');\n      const methods = extractHttpMethods(content);\n      const route = filePathToRoute(file, projectDir);\n      const isDynamic = route.includes('[') && route.includes(']');\n\n      // Pages Router typically uses default export with req.method check\n      // If we find method checks or it has a default export, include it\n      if (methods.length > 0 || content.includes('export default')) {\n        routes.push({\n          route,\n          method: methods.length > 0 ? methods : ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'],\n          sourceFile: file,\n          isDynamic\n        });\n      }\n    }\n  } catch (error) {\n    // Directory doesn't exist or not accessible\n  }\n\n  return routes;\n}\n\n/**\n * Find all route files in a directory recursively\n */\nasync function findRouteFiles(\n  dir: string,\n  filename?: string\n): Promise<string[]> {\n  const files: string[] = [];\n\n  try {\n    const entries = await fs.readdir(dir, { withFileTypes: true });\n\n    for (const entry of entries) {\n      const fullPath = path.join(dir, entry.name);\n\n      if (entry.isDirectory()) {\n        const subFiles = await findRouteFiles(fullPath, filename);\n        files.push(...subFiles);\n      } else if (entry.isFile()) {\n        const ext = path.extname(entry.name);\n        const baseName = path.basename(entry.name, ext);\n\n        if (['.ts', '.tsx', '.js', '.jsx'].includes(ext)) {\n          if (filename) {\n            // Looking for specific filename (e.g., 'route.ts')\n            if (baseName === filename) {\n              files.push(fullPath);\n            }\n          } else {\n            // Include all TypeScript/JavaScript files\n            files.push(fullPath);\n          }\n        }\n      }\n    }\n  } catch (error) {\n    // Directory doesn't exist or not accessible\n  }\n\n  return files;\n}\n\n/**\n * Extract HTTP method exports from file content\n */\nfunction extractHttpMethods(content: string): string[] {\n  const methods: string[] = [];\n  const httpMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'];\n\n  for (const method of httpMethods) {\n    // Look for exported functions: export async function GET\n    const exportPattern = new RegExp(`export\\\\s+(?:async\\\\s+)?function\\\\s+${method}\\\\s*\\\\(`, 'g');\n    if (exportPattern.test(content)) {\n      methods.push(method);\n    }\n  }\n\n  return methods;\n}\n\n/**\n * Check if a directory exists\n */\nasync function directoryExists(dir: string): Promise<boolean> {\n  try {\n    const stat = await fs.stat(dir);\n    return stat.isDirectory();\n  } catch {\n    return false;\n  }\n}\n\n// TODO: Iteration 3 - Add matching between frontend API calls and backend routes (DONE via findOrphanEndpoints)\n// TODO: Iteration 4 - Add OpenAPI/Swagger schema generation from discovered routes\n","import { nanoid } from 'nanoid';\nimport { readFile, writeFile, mkdir } from 'fs/promises';\nimport { join, dirname } from 'path';\n\nconst OPERATION_PREFIX = 'op_';\n\n/**\n * Pending operation types\n */\nexport type OperationType = 'screenshot' | 'type' | 'click' | 'navigate' | 'evaluate' | 'fill' | 'hover' | 'wait';\n\n/**\n * A pending operation that's currently running\n */\nexport interface PendingOperation {\n  id: string;\n  type: OperationType;\n  sessionId: string;\n  startedAt: string;\n  pid: number;\n  command?: string;\n}\n\n/**\n * State file structure\n */\nexport interface OperationState {\n  pending: PendingOperation[];\n  lastUpdated: string;\n}\n\n/**\n * Get the path to the operations state file\n */\nfunction getOperationsPath(outputDir: string): string {\n  return join(outputDir, 'operations.json');\n}\n\n/**\n * Read the current operation state\n */\nasync function readState(outputDir: string): Promise<OperationState> {\n  const path = getOperationsPath(outputDir);\n  try {\n    const content = await readFile(path, 'utf-8');\n    return JSON.parse(content) as OperationState;\n  } catch {\n    return { pending: [], lastUpdated: new Date().toISOString() };\n  }\n}\n\n/**\n * Write the operation state\n */\nasync function writeState(outputDir: string, state: OperationState): Promise<void> {\n  const path = getOperationsPath(outputDir);\n  await mkdir(dirname(path), { recursive: true });\n  state.lastUpdated = new Date().toISOString();\n  await writeFile(path, JSON.stringify(state, null, 2));\n}\n\n/**\n * Register a new pending operation\n * Returns the operation ID\n */\nexport async function registerOperation(\n  outputDir: string,\n  options: {\n    type: OperationType;\n    sessionId: string;\n    command?: string;\n  }\n): Promise<string> {\n  const state = await readState(outputDir);\n\n  // Clean up stale operations from dead processes\n  state.pending = await cleanupStaleOperations(state.pending);\n\n  const operation: PendingOperation = {\n    id: `${OPERATION_PREFIX}${nanoid(8)}`,\n    type: options.type,\n    sessionId: options.sessionId,\n    startedAt: new Date().toISOString(),\n    pid: process.pid,\n    command: options.command,\n  };\n\n  state.pending.push(operation);\n  await writeState(outputDir, state);\n\n  return operation.id;\n}\n\n/**\n * Mark an operation as complete (remove from pending)\n */\nexport async function completeOperation(\n  outputDir: string,\n  operationId: string\n): Promise<void> {\n  const state = await readState(outputDir);\n  state.pending = state.pending.filter(op => op.id !== operationId);\n  await writeState(outputDir, state);\n}\n\n/**\n * Get all pending operations\n */\nexport async function getPendingOperations(\n  outputDir: string\n): Promise<PendingOperation[]> {\n  const state = await readState(outputDir);\n  // Clean up stale operations before returning\n  const activeOps = await cleanupStaleOperations(state.pending);\n\n  // Update state if we cleaned up anything\n  if (activeOps.length !== state.pending.length) {\n    state.pending = activeOps;\n    await writeState(outputDir, state);\n  }\n\n  return activeOps;\n}\n\n/**\n * Check if a process is still running\n */\nfunction isProcessAlive(pid: number): boolean {\n  try {\n    process.kill(pid, 0);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Remove operations from dead processes\n */\nasync function cleanupStaleOperations(\n  operations: PendingOperation[]\n): Promise<PendingOperation[]> {\n  return operations.filter(op => isProcessAlive(op.pid));\n}\n\n/**\n * Wait for all pending operations to complete\n * Returns true if all completed, false if timeout reached\n */\nexport async function waitForCompletion(\n  outputDir: string,\n  options: {\n    timeout?: number;\n    pollInterval?: number;\n    onProgress?: (remaining: number) => void;\n  } = {}\n): Promise<boolean> {\n  const timeout = options.timeout ?? 30000;\n  const pollInterval = options.pollInterval ?? 500;\n  const startTime = Date.now();\n\n  while (Date.now() - startTime < timeout) {\n    const pending = await getPendingOperations(outputDir);\n\n    if (pending.length === 0) {\n      return true;\n    }\n\n    if (options.onProgress) {\n      options.onProgress(pending.length);\n    }\n\n    await new Promise(resolve => setTimeout(resolve, pollInterval));\n  }\n\n  return false;\n}\n\n/**\n * Format pending operations for display\n */\nexport function formatPendingOperations(operations: PendingOperation[]): string {\n  if (operations.length === 0) {\n    return 'No pending operations';\n  }\n\n  const lines = operations.map(op => {\n    const age = Math.round((Date.now() - new Date(op.startedAt).getTime()) / 1000);\n    return `  ${op.id.slice(0, 11)} | ${op.type.padEnd(10)} | ${op.sessionId.slice(0, 12)} | ${age}s`;\n  });\n\n  return [\n    '  ID          | Type       | Session      | Age',\n    '  ----------- | ---------- | ------------ | ---',\n    ...lines,\n  ].join('\\n');\n}\n\n/**\n * Higher-order function to wrap an async operation with tracking\n */\nexport function withOperationTracking<T>(\n  outputDir: string,\n  options: {\n    type: OperationType;\n    sessionId: string;\n    command?: string;\n  }\n) {\n  return async (fn: () => Promise<T>): Promise<T> => {\n    const opId = await registerOperation(outputDir, options);\n    try {\n      return await fn();\n    } finally {\n      await completeOperation(outputDir, opId);\n    }\n  };\n}\n","import { EngineDriver } from './engine/driver.js';\nimport { CompatPage } from './engine/compat.js';\nimport type { PageLike } from './engine/page-like.js';\nimport { VIEWPORTS, type Viewport } from './schemas.js';\nimport { viewportToConfig } from './devices.js';\n\n/**\n * Layout issue detected during responsive testing\n */\nexport interface LayoutIssue {\n  element: string;\n  issue: 'overflow' | 'hidden' | 'truncated' | 'overlap' | 'too-small' | 'off-screen';\n  description: string;\n  bounds: { x: number; y: number; width: number; height: number };\n}\n\n/**\n * Touch target analysis\n */\nexport interface TouchTargetIssue {\n  element: string;\n  selector: string;\n  size: { width: number; height: number };\n  minimumSize: number;\n  isTooSmall: boolean;\n}\n\n/**\n * Text readability issue\n */\nexport interface TextIssue {\n  element: string;\n  issue: 'too-small' | 'low-contrast';\n  fontSize?: number;\n  contrastRatio?: number;\n}\n\n/**\n * Single viewport test result\n */\nexport interface ViewportResult {\n  viewport: Viewport;\n  viewportName: string;\n  layoutIssues: LayoutIssue[];\n  touchTargets: TouchTargetIssue[];\n  textIssues: TextIssue[];\n  screenshot?: string;\n}\n\n/**\n * Full responsive test result\n */\nexport interface ResponsiveResult {\n  url: string;\n  results: ViewportResult[];\n  summary: {\n    totalIssues: number;\n    viewportsWithIssues: number;\n    criticalIssues: number;\n  };\n}\n\n/**\n * Responsive test options\n */\nexport interface ResponsiveTestOptions {\n  /** Viewports to test. Defaults to desktop, tablet, mobile */\n  viewports?: Array<'desktop' | 'tablet' | 'mobile' | Viewport>;\n  /** Capture screenshots for each viewport */\n  captureScreenshots?: boolean;\n  /** Output directory for screenshots */\n  outputDir?: string;\n  /** Minimum touch target size (default: 44px per WCAG) */\n  minTouchTarget?: number;\n  /** Minimum font size (default: 12px) */\n  minFontSize?: number;\n  /** Timeout for page load */\n  timeout?: number;\n}\n\n/**\n * Test responsive behavior across multiple viewports\n */\nexport async function testResponsive(\n  url: string,\n  options: ResponsiveTestOptions = {}\n): Promise<ResponsiveResult> {\n  const {\n    viewports = ['desktop', 'tablet', 'mobile'],\n    captureScreenshots = false,\n    outputDir = './.ibr/responsive',\n    minTouchTarget = 44,\n    minFontSize = 12,\n    timeout = 30000,\n  } = options;\n\n  const results: ViewportResult[] = [];\n\n  for (const viewportSpec of viewports) {\n    // Resolve viewport\n    let viewport: Viewport;\n    let viewportName: string;\n\n    if (typeof viewportSpec === 'string') {\n      viewport = VIEWPORTS[viewportSpec];\n      viewportName = viewportSpec;\n    } else {\n      viewport = viewportSpec;\n      viewportName = `${viewportSpec.width}x${viewportSpec.height}`;\n    }\n\n    const driver = new EngineDriver();\n    await driver.launch({\n      headless: true,\n      viewport: viewportToConfig(viewport),\n    });\n    const page = new CompatPage(driver);\n\n    try {\n      await page.goto(url, {\n        waitUntil: 'networkidle',\n        timeout,\n      });\n\n      // Wait for animations\n      await page.waitForTimeout(500);\n\n      // Run viewport-specific tests\n      const result = await analyzeViewport(page, viewport, viewportName, {\n        minTouchTarget,\n        minFontSize,\n      });\n\n      // Capture screenshot if requested\n      if (captureScreenshots) {\n        const { mkdir } = await import('fs/promises');\n        await mkdir(outputDir, { recursive: true });\n        const screenshotPath = `${outputDir}/${viewportName}.png`;\n        await page.screenshot({ path: screenshotPath, fullPage: true });\n        result.screenshot = screenshotPath;\n      }\n\n      results.push(result);\n    } finally {\n      await driver.close();\n    }\n  }\n\n  // Calculate summary\n  const totalIssues = results.reduce(\n    (sum, r) => sum + r.layoutIssues.length + r.touchTargets.filter(t => t.isTooSmall).length + r.textIssues.length,\n    0\n  );\n  const viewportsWithIssues = results.filter(\n    r => r.layoutIssues.length > 0 || r.touchTargets.some(t => t.isTooSmall) || r.textIssues.length > 0\n  ).length;\n  const criticalIssues = results.reduce(\n    (sum, r) => sum + r.layoutIssues.filter(i => i.issue === 'overflow' || i.issue === 'hidden').length,\n    0\n  );\n\n  return {\n    url,\n    results,\n    summary: {\n      totalIssues,\n      viewportsWithIssues,\n      criticalIssues,\n    },\n  };\n}\n\n/**\n * Analyze a single viewport for responsive issues\n */\nasync function analyzeViewport(\n  page: PageLike,\n  viewport: Viewport,\n  viewportName: string,\n  options: { minTouchTarget: number; minFontSize: number }\n): Promise<ViewportResult> {\n  const isMobile = viewport.width < 768;\n\n  const analysisResult = await page.evaluate(({ viewportWidth, minTouchTarget, minFontSize, isMobile }: { viewportWidth: number; minTouchTarget: number; minFontSize: number; isMobile: boolean }) => {\n    const layoutIssues: LayoutIssue[] = [];\n    const touchTargets: TouchTargetIssue[] = [];\n    const textIssues: TextIssue[] = [];\n\n    // Helper to get unique selector\n    function getSelector(el: Element): string {\n      if ((el as HTMLElement).id) return `#${(el as HTMLElement).id}`;\n      const classes = Array.from(el.classList).slice(0, 2).join('.');\n      const tag = el.tagName.toLowerCase();\n      if (classes) return `${tag}.${classes}`;\n      return tag;\n    }\n\n    // Check for horizontal overflow\n    const bodyWidth = document.body.scrollWidth;\n    if (bodyWidth > viewportWidth) {\n      layoutIssues.push({\n        element: 'body',\n        issue: 'overflow',\n        description: `Page has horizontal overflow (${bodyWidth}px > ${viewportWidth}px viewport)`,\n        bounds: { x: 0, y: 0, width: bodyWidth, height: document.body.scrollHeight },\n      });\n    }\n\n    // Check all elements for layout issues\n    const allElements = Array.from(document.querySelectorAll('*'));\n    for (const el of allElements) {\n      const rect = el.getBoundingClientRect();\n      const style = window.getComputedStyle(el);\n\n      // Skip invisible elements\n      if (style.display === 'none' || style.visibility === 'hidden' || rect.width === 0 || rect.height === 0) {\n        continue;\n      }\n\n      // Check for elements extending beyond viewport\n      if (rect.right > viewportWidth + 10) { // 10px tolerance\n        layoutIssues.push({\n          element: getSelector(el),\n          issue: 'overflow',\n          description: `Element extends ${Math.round(rect.right - viewportWidth)}px beyond viewport`,\n          bounds: { x: rect.x, y: rect.y, width: rect.width, height: rect.height },\n        });\n      }\n\n      // Check for truncated text (text-overflow: ellipsis with overflow)\n      if (style.textOverflow === 'ellipsis' && style.overflow === 'hidden') {\n        const scrollWidth = (el as HTMLElement).scrollWidth;\n        const clientWidth = (el as HTMLElement).clientWidth;\n        if (scrollWidth > clientWidth) {\n          layoutIssues.push({\n            element: getSelector(el),\n            issue: 'truncated',\n            description: 'Text is truncated with ellipsis',\n            bounds: { x: rect.x, y: rect.y, width: rect.width, height: rect.height },\n          });\n        }\n      }\n    }\n\n    // Check touch targets (only on mobile-sized viewports)\n    if (isMobile) {\n      const interactiveElements = Array.from(document.querySelectorAll(\n        'a, button, [role=\"button\"], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n      ));\n\n      for (const el of interactiveElements) {\n        const rect = el.getBoundingClientRect();\n        const style = window.getComputedStyle(el);\n\n        if (style.display === 'none' || style.visibility === 'hidden') {\n          continue;\n        }\n\n        const width = rect.width;\n        const height = rect.height;\n        const isTooSmall = width < minTouchTarget || height < minTouchTarget;\n\n        touchTargets.push({\n          element: el.textContent?.trim().slice(0, 30) || getSelector(el),\n          selector: getSelector(el),\n          size: { width: Math.round(width), height: Math.round(height) },\n          minimumSize: minTouchTarget,\n          isTooSmall,\n        });\n      }\n    }\n\n    // Check text sizes\n    const textElements = Array.from(document.querySelectorAll('p, span, a, li, td, th, label, h1, h2, h3, h4, h5, h6'));\n    for (const el of textElements) {\n      const style = window.getComputedStyle(el);\n      const fontSize = parseFloat(style.fontSize);\n\n      if (fontSize < minFontSize && el.textContent?.trim()) {\n        textIssues.push({\n          element: getSelector(el),\n          issue: 'too-small',\n          fontSize: Math.round(fontSize),\n        });\n      }\n    }\n\n    return { layoutIssues, touchTargets, textIssues };\n  }, {\n    viewportWidth: viewport.width,\n    minTouchTarget: options.minTouchTarget,\n    minFontSize: options.minFontSize,\n    isMobile,\n  });\n\n  return {\n    viewport,\n    viewportName,\n    ...analysisResult,\n  };\n}\n\n/**\n * Format responsive test result for console output\n */\nexport function formatResponsiveResult(result: ResponsiveResult): string {\n  const lines: string[] = [];\n\n  lines.push('Responsive Test Results');\n  lines.push('=======================');\n  lines.push('');\n  lines.push(`URL: ${result.url}`);\n  lines.push(`Viewports tested: ${result.results.length}`);\n  lines.push('');\n\n  // Summary\n  const icon = result.summary.criticalIssues > 0 ? '\\x1b[31m✗\\x1b[0m' :\n               result.summary.totalIssues > 0 ? '\\x1b[33m!\\x1b[0m' : '\\x1b[32m✓\\x1b[0m';\n  lines.push(`${icon} Total issues: ${result.summary.totalIssues}`);\n  lines.push(`   Critical: ${result.summary.criticalIssues}`);\n  lines.push(`   Viewports with issues: ${result.summary.viewportsWithIssues}/${result.results.length}`);\n  lines.push('');\n\n  // Per-viewport results\n  for (const vr of result.results) {\n    const issueCount = vr.layoutIssues.length +\n                       vr.touchTargets.filter(t => t.isTooSmall).length +\n                       vr.textIssues.length;\n\n    const vpIcon = issueCount === 0 ? '\\x1b[32m✓\\x1b[0m' : '\\x1b[33m!\\x1b[0m';\n    lines.push(`${vpIcon} ${vr.viewportName} (${vr.viewport.width}x${vr.viewport.height})`);\n\n    if (issueCount === 0) {\n      lines.push('   No issues detected');\n    } else {\n      // Layout issues\n      if (vr.layoutIssues.length > 0) {\n        lines.push('   Layout issues:');\n        for (const issue of vr.layoutIssues.slice(0, 5)) {\n          lines.push(`     ! ${issue.issue}: ${issue.description}`);\n        }\n        if (vr.layoutIssues.length > 5) {\n          lines.push(`     ... and ${vr.layoutIssues.length - 5} more`);\n        }\n      }\n\n      // Touch targets\n      const smallTargets = vr.touchTargets.filter(t => t.isTooSmall);\n      if (smallTargets.length > 0) {\n        lines.push('   Small touch targets:');\n        for (const target of smallTargets.slice(0, 5)) {\n          lines.push(`     ! \"${target.element}\" is ${target.size.width}x${target.size.height}px (min: ${target.minimumSize}px)`);\n        }\n        if (smallTargets.length > 5) {\n          lines.push(`     ... and ${smallTargets.length - 5} more`);\n        }\n      }\n\n      // Text issues\n      if (vr.textIssues.length > 0) {\n        lines.push('   Text issues:');\n        for (const issue of vr.textIssues.slice(0, 5)) {\n          lines.push(`     ! ${issue.element}: ${issue.issue} (${issue.fontSize}px)`);\n        }\n        if (vr.textIssues.length > 5) {\n          lines.push(`     ... and ${vr.textIssues.length - 5} more`);\n        }\n      }\n    }\n\n    if (vr.screenshot) {\n      lines.push(`   Screenshot: ${vr.screenshot}`);\n    }\n\n    lines.push('');\n  }\n\n  return lines.join('\\n');\n}\n","import { z } from 'zod';\n\n/**\n * Types of UI decisions that can be tracked\n */\nexport const DecisionTypeSchema = z.enum([\n  'css_change',\n  'layout_change',\n  'color_change',\n  'spacing_change',\n  'component_add',\n  'component_remove',\n  'component_modify',\n  'content_change',\n]);\n\n/**\n * Before/after state snapshot for a decision\n */\nexport const DecisionStateSchema = z.object({\n  css: z.record(z.string(), z.string()).optional(),\n  html_snippet: z.string().optional(),\n  screenshot_ref: z.string().optional(),\n});\n\n/**\n * A single UI decision entry stored in JSONL logs\n */\nexport const DecisionEntrySchema = z.object({\n  id: z.string(),\n  timestamp: z.string().datetime(),\n  route: z.string(),\n  component: z.string().optional(),\n  type: DecisionTypeSchema,\n  description: z.string(),\n  rationale: z.string().optional(),\n  before: DecisionStateSchema.optional(),\n  after: DecisionStateSchema.optional(),\n  files_changed: z.array(z.string()),\n  session_id: z.string().optional(),\n});\n\n/**\n * Route-level decision summary for compact context\n */\nexport const DecisionSummarySchema = z.object({\n  route: z.string(),\n  component: z.string().optional(),\n  latest_change: z.string(),\n  decision_count: z.number(),\n  full_log_ref: z.string(),\n});\n\n/**\n * Current UI state tracking in compact context\n */\nexport const CurrentUIStateSchema = z.object({\n  last_snapshot_ref: z.string().optional(),\n  pending_verifications: z.number(),\n  known_issues: z.array(z.string()),\n});\n\n/**\n * Compact context — always-loaded LLM-friendly summary (<4KB target)\n */\nexport const CompactContextSchema = z.object({\n  version: z.literal(1),\n  session_id: z.string(),\n  updated_at: z.string().datetime(),\n  active_route: z.string().optional(),\n  decisions_summary: z.array(DecisionSummarySchema),\n  current_ui_state: CurrentUIStateSchema,\n  preferences_active: z.number(),\n});\n\n/**\n * Request to compact current context\n */\nexport const CompactionRequestSchema = z.object({\n  reason: z.enum(['session_ending', 'context_limit', 'manual']),\n  preserve_decisions: z.array(z.string()).optional(),\n});\n\n/**\n * Result of context compaction\n */\nexport const CompactionResultSchema = z.object({\n  compact_context: CompactContextSchema,\n  archived_to: z.string(),\n  decisions_compacted: z.number(),\n  decisions_preserved: z.number(),\n});\n\n// ─── Design Change Capture ───────────────────────────────────\n\n/**\n * Operators for comparing CSS/semantic property values\n */\nexport const DesignCheckOperatorSchema = z.enum([\n  'eq',       // exact equality\n  'gt',       // numeric greater-than\n  'lt',       // numeric less-than\n  'contains', // substring or token match\n  'not',      // negation\n  'exists',   // element is present in AX tree\n  'truthy',   // value is non-empty / non-zero\n]);\n\n/**\n * A single verifiable check against a CSS property or semantic state\n */\nexport const DesignCheckSchema = z.object({\n  property: z.string(),\n  operator: DesignCheckOperatorSchema,\n  value: z.union([z.string(), z.number()]),\n  confidence: z.number().min(0).max(1),\n});\n\n/**\n * A structured UI change description captured at write-time (~95% accuracy)\n */\nexport const DesignChangeSchema = z.object({\n  description: z.string(),\n  element: z.string(),\n  checks: z.array(DesignCheckSchema),\n  source: z.enum(['structured', 'parsed']),\n  platform: z.enum(['web', 'ios', 'macos']).optional(),\n  timestamp: z.string(),\n});\n\n/**\n * Extended DecisionEntry with optional design checks attached\n */\nexport const DecisionEntryWithChecksSchema = DecisionEntrySchema.extend({\n  checks: z.array(DesignCheckSchema).optional(),\n});\n\n// Type exports\nexport type DecisionType = z.infer<typeof DecisionTypeSchema>;\nexport type DecisionState = z.infer<typeof DecisionStateSchema>;\nexport type DecisionEntry = z.infer<typeof DecisionEntrySchema>;\nexport type DecisionEntryWithChecks = z.infer<typeof DecisionEntryWithChecksSchema>;\nexport type DecisionSummary = z.infer<typeof DecisionSummarySchema>;\nexport type CurrentUIState = z.infer<typeof CurrentUIStateSchema>;\nexport type CompactContext = z.infer<typeof CompactContextSchema>;\nexport type CompactionRequest = z.infer<typeof CompactionRequestSchema>;\nexport type CompactionResult = z.infer<typeof CompactionResultSchema>;\nexport type DesignCheckOperator = z.infer<typeof DesignCheckOperatorSchema>;\nexport type DesignCheck = z.infer<typeof DesignCheckSchema>;\nexport type DesignChange = z.infer<typeof DesignChangeSchema>;\n","import { nanoid } from 'nanoid';\nimport { mkdir, readFile, appendFile, readdir, stat } from 'fs/promises';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport {\n  DecisionEntrySchema,\n  type DecisionEntry,\n  type DecisionType,\n  type DecisionState,\n} from './context/types.js';\n\nconst CONTEXT_DIR = 'context';\nconst DECISIONS_DIR = 'decisions';\n\n/**\n * Options for recording a UI decision\n */\nexport interface RecordDecisionOptions {\n  route: string;\n  type: DecisionType;\n  description: string;\n  component?: string;\n  rationale?: string;\n  before?: DecisionState;\n  after?: DecisionState;\n  files_changed: string[];\n  session_id?: string;\n}\n\n/**\n * Options for querying decisions\n */\nexport interface QueryDecisionsOptions {\n  route?: string;\n  component?: string;\n  type?: DecisionType;\n  since?: string; // ISO 8601 timestamp\n  limit?: number;\n}\n\n/**\n * Get the decisions directory path\n */\nfunction getDecisionsDir(outputDir: string): string {\n  return join(outputDir, CONTEXT_DIR, DECISIONS_DIR);\n}\n\n/**\n * Sanitize a route path into a safe filename\n */\nfunction routeToFilename(route: string): string {\n  return route\n    .replace(/^\\/+/, '')\n    .replace(/\\//g, '_')\n    .replace(/[^a-zA-Z0-9_-]/g, '')\n    || '_root';\n}\n\n/**\n * Get the JSONL file path for a route\n */\nfunction getRouteLogPath(outputDir: string, route: string): string {\n  const filename = `${routeToFilename(route)}.jsonl`;\n  return join(getDecisionsDir(outputDir), filename);\n}\n\n/**\n * Ensure the context directories exist\n */\nasync function ensureContextDirs(outputDir: string): Promise<void> {\n  await mkdir(getDecisionsDir(outputDir), { recursive: true });\n}\n\n/**\n * Record a UI decision to the JSONL log for its route\n */\nexport async function recordDecision(\n  outputDir: string,\n  options: RecordDecisionOptions\n): Promise<DecisionEntry> {\n  await ensureContextDirs(outputDir);\n\n  const entry: DecisionEntry = {\n    id: `dec_${nanoid(10)}`,\n    timestamp: new Date().toISOString(),\n    route: options.route,\n    component: options.component,\n    type: options.type,\n    description: options.description,\n    rationale: options.rationale,\n    before: options.before,\n    after: options.after,\n    files_changed: options.files_changed,\n    session_id: options.session_id,\n  };\n\n  // Validate the entry\n  DecisionEntrySchema.parse(entry);\n\n  // Append to route-specific JSONL file\n  const logPath = getRouteLogPath(outputDir, options.route);\n  await appendFile(logPath, JSON.stringify(entry) + '\\n');\n\n  return entry;\n}\n\n/**\n * Read all decisions from a route's JSONL log\n */\nexport async function getDecisionsByRoute(\n  outputDir: string,\n  route: string\n): Promise<DecisionEntry[]> {\n  const logPath = getRouteLogPath(outputDir, route);\n\n  if (!existsSync(logPath)) {\n    return [];\n  }\n\n  const content = await readFile(logPath, 'utf-8');\n  const lines = content.trim().split('\\n').filter(Boolean);\n\n  return lines.map(line => DecisionEntrySchema.parse(JSON.parse(line)));\n}\n\n/**\n * Query decisions across all routes with filtering\n */\nexport async function queryDecisions(\n  outputDir: string,\n  options: QueryDecisionsOptions = {}\n): Promise<DecisionEntry[]> {\n  const { route, component, type, since, limit = 50 } = options;\n\n  let decisions: DecisionEntry[] = [];\n\n  if (route) {\n    // Query specific route\n    decisions = await getDecisionsByRoute(outputDir, route);\n  } else {\n    // Query all routes\n    const decisionsDir = getDecisionsDir(outputDir);\n    if (!existsSync(decisionsDir)) {\n      return [];\n    }\n\n    const files = await readdir(decisionsDir);\n    for (const file of files) {\n      if (!file.endsWith('.jsonl')) continue;\n\n      const filePath = join(decisionsDir, file);\n      const content = await readFile(filePath, 'utf-8');\n      const lines = content.trim().split('\\n').filter(Boolean);\n\n      for (const line of lines) {\n        decisions.push(DecisionEntrySchema.parse(JSON.parse(line)));\n      }\n    }\n  }\n\n  // Apply filters\n  if (component) {\n    decisions = decisions.filter(d => d.component === component);\n  }\n  if (type) {\n    decisions = decisions.filter(d => d.type === type);\n  }\n  if (since) {\n    const sinceTime = new Date(since).getTime();\n    decisions = decisions.filter(d => new Date(d.timestamp).getTime() >= sinceTime);\n  }\n\n  // Sort by timestamp descending (newest first)\n  decisions.sort((a, b) =>\n    new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n  );\n\n  return decisions.slice(0, limit);\n}\n\n/**\n * Get a single decision by ID (searches all route logs)\n */\nexport async function getDecision(\n  outputDir: string,\n  decisionId: string\n): Promise<DecisionEntry | null> {\n  const decisionsDir = getDecisionsDir(outputDir);\n  if (!existsSync(decisionsDir)) {\n    return null;\n  }\n\n  const files = await readdir(decisionsDir);\n  for (const file of files) {\n    if (!file.endsWith('.jsonl')) continue;\n\n    const filePath = join(decisionsDir, file);\n    const content = await readFile(filePath, 'utf-8');\n    const lines = content.trim().split('\\n').filter(Boolean);\n\n    for (const line of lines) {\n      const entry = DecisionEntrySchema.parse(JSON.parse(line));\n      if (entry.id === decisionId) {\n        return entry;\n      }\n    }\n  }\n\n  return null;\n}\n\n/**\n * Get list of routes that have decision logs\n */\nexport async function getTrackedRoutes(outputDir: string): Promise<string[]> {\n  const decisionsDir = getDecisionsDir(outputDir);\n  if (!existsSync(decisionsDir)) {\n    return [];\n  }\n\n  const files = await readdir(decisionsDir);\n  return files\n    .filter(f => f.endsWith('.jsonl'))\n    .map(f => f.replace('.jsonl', '').replace(/_/g, '/').replace(/^\\/?/, '/'));\n}\n\n/**\n * Get decision counts by route\n */\nexport async function getDecisionStats(outputDir: string): Promise<{\n  total: number;\n  byRoute: Record<string, number>;\n  byType: Record<string, number>;\n}> {\n  const all = await queryDecisions(outputDir, { limit: 10000 });\n\n  const byRoute: Record<string, number> = {};\n  const byType: Record<string, number> = {};\n\n  for (const d of all) {\n    byRoute[d.route] = (byRoute[d.route] || 0) + 1;\n    byType[d.type] = (byType[d.type] || 0) + 1;\n  }\n\n  return { total: all.length, byRoute, byType };\n}\n\n/**\n * Get the size of the decisions directory in bytes\n */\nexport async function getDecisionsSize(outputDir: string): Promise<number> {\n  const decisionsDir = getDecisionsDir(outputDir);\n  if (!existsSync(decisionsDir)) {\n    return 0;\n  }\n\n  const files = await readdir(decisionsDir);\n  let total = 0;\n\n  for (const file of files) {\n    if (!file.endsWith('.jsonl')) continue;\n    const s = await stat(join(decisionsDir, file));\n    total += s.size;\n  }\n\n  return total;\n}\n","import { mkdir, readFile, writeFile } from 'fs/promises';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport { nanoid } from 'nanoid';\nimport {\n  CompactContextSchema,\n  type CompactContext,\n  type CompactionRequest,\n  type CompactionResult,\n  type DecisionSummary,\n} from './types.js';\nimport { queryDecisions, getTrackedRoutes } from '../decision-tracker.js';\n\nconst CONTEXT_DIR = 'context';\nconst COMPACT_FILE = 'compact.json';\nconst ARCHIVE_DIR = 'archive';\n\n/**\n * Get path to compact context file\n */\nfunction getCompactPath(outputDir: string): string {\n  return join(outputDir, CONTEXT_DIR, COMPACT_FILE);\n}\n\n/**\n * Get path to archive directory\n */\nfunction getArchiveDir(outputDir: string): string {\n  return join(outputDir, CONTEXT_DIR, ARCHIVE_DIR);\n}\n\n/**\n * Load the current compact context, or create a default one\n */\nexport async function loadCompactContext(\n  outputDir: string,\n  sessionId?: string\n): Promise<CompactContext> {\n  const compactPath = getCompactPath(outputDir);\n\n  if (existsSync(compactPath)) {\n    const content = await readFile(compactPath, 'utf-8');\n    return CompactContextSchema.parse(JSON.parse(content));\n  }\n\n  // Return empty default\n  return {\n    version: 1,\n    session_id: sessionId || `ctx_${nanoid(8)}`,\n    updated_at: new Date().toISOString(),\n    active_route: undefined,\n    decisions_summary: [],\n    current_ui_state: {\n      last_snapshot_ref: undefined,\n      pending_verifications: 0,\n      known_issues: [],\n    },\n    preferences_active: 0,\n  };\n}\n\n/**\n * Save compact context to disk\n */\nexport async function saveCompactContext(\n  outputDir: string,\n  context: CompactContext\n): Promise<void> {\n  const contextDir = join(outputDir, CONTEXT_DIR);\n  await mkdir(contextDir, { recursive: true });\n\n  const compactPath = getCompactPath(outputDir);\n  await writeFile(compactPath, JSON.stringify(context, null, 2));\n}\n\n/**\n * Update compact context with latest decisions from logs\n * Rebuilds the decisions_summary from the JSONL decision logs\n */\nexport async function updateCompactContext(\n  outputDir: string,\n  sessionId?: string\n): Promise<CompactContext> {\n  const current = await loadCompactContext(outputDir, sessionId);\n  const routes = await getTrackedRoutes(outputDir);\n\n  const summaries: DecisionSummary[] = [];\n\n  for (const route of routes) {\n    const decisions = await queryDecisions(outputDir, { route, limit: 100 });\n\n    if (decisions.length === 0) continue;\n\n    // Group by component\n    const byComponent = new Map<string, typeof decisions>();\n    for (const d of decisions) {\n      const key = d.component || '_page';\n      if (!byComponent.has(key)) {\n        byComponent.set(key, []);\n      }\n      byComponent.get(key)!.push(d);\n    }\n\n    for (const [component, componentDecisions] of byComponent) {\n      const latest = componentDecisions[0]; // Already sorted newest first\n      const routeFilename = route\n        .replace(/^\\/+/, '')\n        .replace(/\\//g, '_')\n        .replace(/[^a-zA-Z0-9_-]/g, '')\n        || '_root';\n\n      summaries.push({\n        route,\n        component: component === '_page' ? undefined : component,\n        latest_change: latest.description,\n        decision_count: componentDecisions.length,\n        full_log_ref: `.ibr/context/decisions/${routeFilename}.jsonl`,\n      });\n    }\n  }\n\n  const updated: CompactContext = {\n    ...current,\n    session_id: sessionId || current.session_id,\n    updated_at: new Date().toISOString(),\n    decisions_summary: summaries,\n  };\n\n  await saveCompactContext(outputDir, updated);\n  return updated;\n}\n\n/**\n * Compact and archive current context\n */\nexport async function compactContext(\n  outputDir: string,\n  request: CompactionRequest\n): Promise<CompactionResult> {\n  const current = await loadCompactContext(outputDir);\n  const archiveDir = getArchiveDir(outputDir);\n  await mkdir(archiveDir, { recursive: true });\n\n  // Archive current compact context\n  const archiveFilename = `compact_${Date.now()}.json`;\n  const archivePath = join(archiveDir, archiveFilename);\n  await writeFile(archivePath, JSON.stringify(current, null, 2));\n\n  // Count decisions being compacted\n  const decisionsCompacted = current.decisions_summary.reduce(\n    (sum, s) => sum + s.decision_count,\n    0\n  );\n\n  // Rebuild compact context (preserving route summaries when preserve list is provided)\n  const hasPreserves = (request.preserve_decisions || []).length > 0;\n  const preserved = hasPreserves ? current.decisions_summary : [];\n\n  const newContext: CompactContext = {\n    version: 1,\n    session_id: current.session_id,\n    updated_at: new Date().toISOString(),\n    active_route: current.active_route,\n    decisions_summary: preserved,\n    current_ui_state: {\n      last_snapshot_ref: current.current_ui_state.last_snapshot_ref,\n      pending_verifications: 0,\n      known_issues: [],\n    },\n    preferences_active: current.preferences_active,\n  };\n\n  await saveCompactContext(outputDir, newContext);\n\n  return {\n    compact_context: newContext,\n    archived_to: archivePath,\n    decisions_compacted: decisionsCompacted,\n    decisions_preserved: preserved.length,\n  };\n}\n\n/**\n * Set the active route being worked on\n */\nexport async function setActiveRoute(\n  outputDir: string,\n  route: string\n): Promise<CompactContext> {\n  const current = await loadCompactContext(outputDir);\n  const updated: CompactContext = {\n    ...current,\n    active_route: route,\n    updated_at: new Date().toISOString(),\n  };\n  await saveCompactContext(outputDir, updated);\n  return updated;\n}\n\n/**\n * Add a known issue to the UI state\n */\nexport async function addKnownIssue(\n  outputDir: string,\n  issue: string\n): Promise<CompactContext> {\n  const current = await loadCompactContext(outputDir);\n  const issues = [...current.current_ui_state.known_issues, issue];\n  const updated: CompactContext = {\n    ...current,\n    current_ui_state: {\n      ...current.current_ui_state,\n      known_issues: issues,\n    },\n    updated_at: new Date().toISOString(),\n  };\n  await saveCompactContext(outputDir, updated);\n  return updated;\n}\n\n/**\n * Check if compact context exceeds the 4KB target\n */\nexport async function isCompactContextOversize(\n  outputDir: string\n): Promise<boolean> {\n  const compactPath = getCompactPath(outputDir);\n  if (!existsSync(compactPath)) return false;\n\n  const content = await readFile(compactPath, 'utf-8');\n  return Buffer.byteLength(content, 'utf-8') > 4096;\n}\n","/**\n * `ibr ask` — verdict-engine surface (v3 thesis Milestone 1).\n *\n * Maps a fixed-vocabulary question to a focused subset of rules, runs them\n * over a scanned page, and returns a token-minimal `AskResponse`. The agent\n * never sees raw element JSON — only a verdict plus minimal evidence per\n * finding.\n *\n * See: docs/strategy/v3-thesis.md\n *\n * M1 scope: three questions, three rule families. Closed vocabulary.\n */\n\nimport { scan } from './scan.js'\nimport type { SetCookieParams } from './engine/cdp/network.js'\nimport type { RuleContext } from './rules/engine.js'\nimport { touchTargetRules } from './rules/touch-targets.js'\nimport { signalNoiseRules } from './design-system/principles/signal-noise.js'\nimport { loadDesignSystemConfig } from './design-system/index.js'\nimport { validateExtendedTokens } from './design-system/tokens/validator.js'\nimport type { EnhancedElement, Violation } from './schemas.js'\nimport type { TokenViolation } from './tokens.js'\n\n// ── Public types ───────────────────────────────────────────────────────────────\n\n/**\n * Verdict ladder:\n *   PASS       — no findings; the question is answered cleanly\n *   WARN       — findings exist at warning severity\n *   FAIL       — findings exist at error severity\n *   PARTIAL    — engine has *visual* evidence but couldn't run the rule\n *                deterministically (e.g. iOS guest where AX tree is\n *                unreachable). Vision-capable consumer should inspect the\n *                screenshot.\n *   UNCERTAIN  — engine couldn't answer. The agent should not act on this\n *                as if it were PASS.\n */\nexport type Verdict = 'PASS' | 'FAIL' | 'WARN' | 'UNCERTAIN' | 'PARTIAL'\n\nexport interface Finding {\n  verdict: Verdict\n  rule: string\n  summary: string\n  element?: string\n  evidence?: Record<string, unknown>\n  fix?: string\n  confidence?: number\n}\n\nexport interface AskResponse {\n  question: string\n  verdict: Verdict\n  findings: Finding[]\n  truncated?: boolean\n  meta: {\n    engineVersion: string\n    durationMs: number\n    elementsScanned: number\n    rulesRun: string[]\n    /** When verdict is UNCERTAIN, list of supported question phrasings. */\n    supportedQuestions?: string[]\n    /**\n     * Path to a captured screenshot, when `screenshot` was requested and\n     * a scan was actually performed (not bypassed via preScannedElements).\n     * Vision-capable agents can fuse the screenshot with the verdict.\n     */\n    screenshotPath?: string\n  }\n}\n\n// ── Question vocabulary ────────────────────────────────────────────────────────\n//\n// Closed vocabulary by design. Each entry is a canonical question plus the\n// rule subset it dispatches to. Aliases let the agent phrase the same intent\n// differently. Unknown questions return UNCERTAIN with this list — never a\n// best-effort guess that pretends to answer.\n\ntype QuestionKind = 'touch-target' | 'signal-noise' | 'token-compliance'\n\ninterface QuestionDef {\n  kind: QuestionKind\n  canonical: string\n  aliases: RegExp[]\n  severity: 'warn' | 'error'\n}\n\nconst QUESTIONS: QuestionDef[] = [\n  {\n    kind: 'touch-target',\n    canonical: 'is the touch-target compliant',\n    aliases: [\n      /touch[- ]?target/i,\n      /minimum\\s+(tap|button|target)\\s+size/i,\n      /\\b44\\s*px|\\b24\\s*px|\\btap target\\b/i,\n    ],\n    severity: 'warn',\n  },\n  {\n    kind: 'signal-noise',\n    canonical: 'do status indicators follow signal-to-noise',\n    aliases: [\n      /signal[- ]?(to[- ]?)?noise/i,\n      /(status|badge|pill).*(background|color|noise)/i,\n      /are status (badges|pills) okay/i,\n      /do badges follow calm[- ]?precision/i,\n    ],\n    severity: 'error',\n  },\n  {\n    kind: 'token-compliance',\n    canonical: 'is design-system token compliance okay',\n    aliases: [\n      /design[- ]?system\\s+token/i,\n      /token\\s+compliance/i,\n      /off[- ]?(system|token)/i,\n      /design tokens?\\b/i,\n    ],\n    severity: 'warn',\n  },\n]\n\nconst SUPPORTED_QUESTIONS = QUESTIONS.map((q) => q.canonical)\n\nfunction matchQuestion(input: string): QuestionDef | null {\n  const normalised = input.trim()\n  for (const def of QUESTIONS) {\n    if (def.canonical === normalised) return def\n    if (def.aliases.some((re) => re.test(normalised))) return def\n  }\n  return null\n}\n\n// ── Verdict aggregation ────────────────────────────────────────────────────────\n\nfunction aggregateVerdict(findings: Finding[]): Verdict {\n  if (findings.length === 0) return 'PASS'\n  if (findings.some((f) => f.verdict === 'FAIL')) return 'FAIL'\n  if (findings.some((f) => f.verdict === 'WARN')) return 'WARN'\n  if (findings.some((f) => f.verdict === 'PARTIAL')) return 'PARTIAL'\n  if (findings.some((f) => f.verdict === 'UNCERTAIN')) return 'UNCERTAIN'\n  return 'PASS'\n}\n\nfunction violationToFinding(v: Violation, kindSeverity: 'warn' | 'error'): Finding {\n  // Trim evidence to keep the response token-minimal. We carry only the\n  // fields an agent needs to drill in: bounds and the canonical severity.\n  const evidence: Record<string, unknown> = {}\n  if (v.bounds) evidence.bounds = v.bounds\n  return {\n    verdict: kindSeverity === 'error' ? 'FAIL' : 'WARN',\n    rule: v.ruleId,\n    summary: v.message,\n    element: v.element,\n    evidence: Object.keys(evidence).length ? evidence : undefined,\n    fix: v.fix,\n  }\n}\n\nfunction tokenViolationToFinding(t: TokenViolation): Finding {\n  return {\n    verdict: t.severity === 'error' ? 'FAIL' : 'WARN',\n    rule: `tokens/${t.property}`,\n    summary: t.message,\n    element: t.element,\n    evidence: { expected: t.expected, actual: t.actual, property: t.property },\n  }\n}\n\n// ── ask() — the engine entrypoint ──────────────────────────────────────────────\n\nexport interface AskOptions {\n  /** CDP scan options. Forwarded to scan(url, ...). */\n  viewport?: 'desktop' | 'mobile' | 'tablet'\n  timeout?: number\n  /** Cap findings to keep responses tight. Default 25. */\n  maxFindings?: number\n  /** Pre-scanned elements (skip CDP). Test/host-friendly. */\n  preScannedElements?: EnhancedElement[]\n  /** Override viewport metrics when supplying preScannedElements. */\n  viewportMetrics?: { width: number; height: number }\n  /** Project dir for design-system config lookup. Defaults to cwd. */\n  projectDir?: string\n  /** Abort the rule loop (and any in-flight scan) when this signal fires. */\n  signal?: AbortSignal\n  /**\n   * Capture a screenshot during the scan and surface its path on the\n   * response. Useful for vision-required verdicts (Gap 3 from\n   * `docs/strategy/v3-m1-eval.md`): the agent can reason over pixels +\n   * structure together.\n   *   - `true`  — auto path under `.ibr/ask-screenshots/<timestamp>.png`\n   *   - string  — explicit path\n   *   - omitted — no screenshot (default; preserves token-minimality)\n   */\n  screenshot?: boolean | string\n  /**\n   * Pre-existing screenshot path to attach to the response when\n   * `preScannedElements` is supplied. Lets test fixtures and native iOS\n   * scans (where scan() can't run) still attach evidence.\n   */\n  screenshotPath?: string\n  /**\n   * Warm-browser pool forwarded to scan(). When set, the second-and-onwards\n   * ask() call in the same process avoids a fresh browser launch — drops\n   * first-finding latency by ~600-800ms (the browser-launch share).\n   */\n  pool?: import('./engine/browser-pool.js').BrowserPool\n  /**\n   * Cookies to inject before the scan navigates. Forwarded verbatim into\n   * scan() so `ask` can reach authenticated routes (dashboards, settings,\n   * any gated page) instead of silently scanning the login redirect. Mirrors\n   * ScanOptions['cookies']. CLI surface: `--cookie` / `--cookie-jar`. MCP\n   * surface: `sessionId` (cookies are resolved from the live session).\n   */\n  cookies?: SetCookieParams[]\n}\n\nconst ENGINE_VERSION = '0.1.0-m1'\n\n// ── Streaming protocol (B1 / v3 thesis Shift 3) ───────────────────────────────\n//\n// askStream yields three event kinds in order:\n//   { type: 'start',  question, engineVersion, supportedQuestions? }\n//   { type: 'finding', ... } — repeated, one per finding, as the rule loop\n//                              produces them. Agents can act / cancel mid-stream.\n//   { type: 'end',     verdict, totalFindings, durationMs, truncated, rulesRun, elementsScanned }\n//\n// Wire-format on stdout (CLI --stream): NDJSON. One JSON object per line.\n\nexport type AskStreamEvent =\n  | { type: 'start'; question: string; engineVersion: string; supportedQuestions?: string[]; screenshotPath?: string }\n  | ({ type: 'finding' } & Finding)\n  | {\n      type: 'end'\n      verdict: Verdict\n      totalFindings: number\n      durationMs: number\n      truncated: boolean\n      rulesRun: string[]\n      elementsScanned: number\n      screenshotPath?: string\n      /** Set when the rule loop halted because options.signal fired. */\n      aborted?: boolean\n    }\n\nexport async function* askStream(\n  url: string,\n  question: string,\n  options: AskOptions = {},\n): AsyncGenerator<AskStreamEvent, void, void> {\n  const start = Date.now()\n  const def = matchQuestion(question)\n\n  if (!def) {\n    yield {\n      type: 'start',\n      question,\n      engineVersion: ENGINE_VERSION,\n      supportedQuestions: SUPPORTED_QUESTIONS,\n    }\n    yield {\n      type: 'finding',\n      verdict: 'UNCERTAIN',\n      rule: 'ask/unsupported-question',\n      summary: `Question is not in the supported vocabulary. Use one of: ${SUPPORTED_QUESTIONS.join('; ')}`,\n    }\n    yield {\n      type: 'end',\n      verdict: 'UNCERTAIN',\n      totalFindings: 1,\n      durationMs: Date.now() - start,\n      truncated: false,\n      rulesRun: [],\n      elementsScanned: 0,\n    }\n    return\n  }\n\n  // Resolve screenshot intent before yielding `start` so consumers see the path early.\n  let screenshotPath: string | undefined\n  if (typeof options.screenshot === 'string') {\n    screenshotPath = options.screenshot\n  } else if (options.screenshot === true) {\n    const ts = Date.now()\n    const safe = url.replace(/[^a-z0-9]/gi, '_').slice(0, 60)\n    screenshotPath = `.ibr/ask-screenshots/${safe}-${ts}.png`\n  } else if (options.screenshotPath) {\n    screenshotPath = options.screenshotPath\n  }\n\n  // iOS-guest path: when the URL is `simulator://<device>/...`, route through\n  // native:scan to get a screenshot. The iOS guest AX tree is not reachable\n  // from the macOS host on Xcode 12+, so the deterministic rule loop can't run.\n  // Emit a single PARTIAL finding pointing at the screenshot so a vision-capable\n  // agent can verify visually. (Gap 3 Step 2.)\n  const isIosGuest = /^simulator:\\/\\//i.test(url)\n\n  yield {\n    type: 'start',\n    question,\n    engineVersion: ENGINE_VERSION,\n    ...(screenshotPath ? { screenshotPath } : {}),\n  }\n\n  if (isIosGuest) {\n    const startMs = Date.now()\n    let nativeScreenshot: string | undefined = screenshotPath\n    try {\n      // Lazy import — avoids dragging native modules into web-only callers.\n      const { scanNative } = await import('./native/scan.js')\n      // Parse `simulator://<device>/<bundleOrCurrent>` — preserve the device\n      // identifier the caller used (name, UDID, or fragment).\n      const match = url.match(/^simulator:\\/\\/([^/]+)(?:\\/(.+))?/i)\n      const device = match?.[1] ? decodeURIComponent(match[1]) : undefined\n      const result = await scanNative({\n        device,\n        screenshot: true,\n      })\n      if (result.screenshotPath) nativeScreenshot = result.screenshotPath\n    } catch (err) {\n      // Even if the native scan fails entirely, emit a useful PARTIAL so the\n      // caller knows what happened.\n      const finding: Finding = {\n        verdict: 'PARTIAL',\n        rule: 'ask/ios-guest-scan-failed',\n        summary:\n          'iOS guest scan failed; AX tree is unreachable from the host process on Xcode 12+. ' +\n          `Underlying error: ${err instanceof Error ? err.message : 'unknown'}.`,\n      }\n      yield { type: 'finding', ...finding }\n      yield {\n        type: 'end',\n        verdict: 'PARTIAL',\n        totalFindings: 1,\n        durationMs: Date.now() - startMs,\n        truncated: false,\n        rulesRun: [],\n        elementsScanned: 0,\n        ...(nativeScreenshot ? { screenshotPath: nativeScreenshot } : {}),\n      }\n      return\n    }\n\n    const finding: Finding = {\n      verdict: 'PARTIAL',\n      rule: 'ask/ios-guest-vision-required',\n      summary:\n        'iOS guest accessibility tree is unreachable from the macOS host (Xcode 12+). ' +\n        'Returned the screenshot as evidence — verify visually whether the answer to ' +\n        `\"${question}\" is satisfied. ` +\n        'Path forward for deterministic rules: XCUITest bundle (NATIVE_SUPPORT_PROPOSAL.md Phase 2).',\n      ...(nativeScreenshot ? { evidence: { screenshotPath: nativeScreenshot } } : {}),\n    }\n    yield { type: 'finding', ...finding }\n    yield {\n      type: 'end',\n      verdict: 'PARTIAL',\n      totalFindings: 1,\n      durationMs: Date.now() - startMs,\n      truncated: false,\n      rulesRun: [],\n      elementsScanned: 0,\n      ...(nativeScreenshot ? { screenshotPath: nativeScreenshot } : {}),\n    }\n    return\n  }\n\n  // Get elements: either supplied for tests, or via a fresh scan.\n  let elements: EnhancedElement[]\n  let viewportWidth: number\n  let viewportHeight: number\n\n  if (options.preScannedElements) {\n    elements = options.preScannedElements\n    viewportWidth = options.viewportMetrics?.width ?? 1280\n    viewportHeight = options.viewportMetrics?.height ?? 800\n  } else {\n    // Auto-create the screenshot dir before passing to scan.\n    if (typeof options.screenshot === 'string' || options.screenshot === true) {\n      const { mkdir } = await import('fs/promises')\n      const { dirname } = await import('path')\n      if (screenshotPath) await mkdir(dirname(screenshotPath), { recursive: true })\n    }\n    const result = await scan(url, {\n      viewport: options.viewport ?? 'desktop',\n      timeout: options.timeout,\n      ...(options.pool ? { pool: options.pool } : {}),\n      ...(options.cookies && options.cookies.length > 0\n        ? { cookies: options.cookies }\n        : {}),\n      ...(options.screenshot && screenshotPath\n        ? { screenshot: { path: screenshotPath } }\n        : {}),\n    })\n    elements = result.elements.all\n    viewportWidth = result.viewport.width\n    viewportHeight = result.viewport.height\n  }\n\n  const context: RuleContext = {\n    isMobile: viewportWidth < 768,\n    viewportWidth,\n    viewportHeight,\n    url,\n    allElements: elements,\n  }\n\n  const maxFindings = options.maxFindings ?? 25\n  const rulesRun: string[] = []\n  let emitted = 0\n  let totalProduced = 0\n  let aggregate: Verdict = 'PASS'\n\n  function bumpVerdict(next: Verdict): void {\n    if (aggregate === 'FAIL') return\n    if (next === 'FAIL') aggregate = 'FAIL'\n    else if (next === 'WARN') aggregate = 'WARN'\n    else if (next === 'UNCERTAIN' && aggregate === 'PASS') aggregate = 'UNCERTAIN'\n  }\n\n  const signal = options.signal\n  let aborted = false\n\n  // Per-finding cropping: when a screenshot was captured, attach a cropped\n  // region to each finding's evidence. Token-economic: the agent gets the\n  // rectangle that matters instead of the whole page. Lazy-loaded so non-\n  // screenshot calls don't pay the import cost.\n  type CropFn = (\n    src: string,\n    bounds: { x: number; y: number; width: number; height: number },\n    dest: string,\n  ) => Promise<string | null>\n  let cropFn: CropFn | null = null\n  async function maybeCrop(b: Finding['evidence']): Promise<string | null> {\n    if (!screenshotPath) return null\n    if (!b || typeof b !== 'object') return null\n    const bounds = (b as { bounds?: { x: number; y: number; width: number; height: number } }).bounds\n    if (!bounds) return null\n    if (!cropFn) {\n      const m = await import('./utils/crop.js')\n      cropFn = m.cropPng\n    }\n    const idx = emitted // emitted is incremented after this call site\n    const dest = screenshotPath.replace(/\\.png$/i, `.crop-${idx}.png`)\n    try {\n      return await cropFn(screenshotPath, bounds, dest)\n    } catch {\n      return null // Don't fail the whole call if cropping fails.\n    }\n  }\n\n  if (def.kind === 'touch-target' || def.kind === 'signal-noise') {\n    const targetRules = def.kind === 'touch-target' ? touchTargetRules : signalNoiseRules\n    for (const r of targetRules) rulesRun.push(r.id)\n\n    outer: for (const element of elements) {\n      // Check before each element so cancellation halts within one element's worth of work.\n      if (signal?.aborted) {\n        aborted = true\n        break\n      }\n      for (const rule of targetRules) {\n        const v = rule.check(element, context)\n        if (!v) continue\n        totalProduced++\n        if (emitted < maxFindings) {\n          const finding = violationToFinding({ ...v, severity: def.severity }, def.severity)\n          // Attach a cropped per-finding screenshot when one was captured.\n          const cropped = await maybeCrop(finding.evidence)\n          if (cropped) {\n            finding.evidence = { ...(finding.evidence ?? {}), screenshot: cropped }\n          }\n          bumpVerdict(finding.verdict)\n          emitted++\n          yield { type: 'finding', ...finding }\n          // Streaming consumers can stop iteration to cancel further work.\n          // We continue producing until maxFindings or all elements are exhausted.\n        } else {\n          // Past the cap: keep counting for `truncated` accuracy but stop yielding.\n          break outer\n        }\n      }\n    }\n  } else if (def.kind === 'token-compliance') {\n    const projectDir = options.projectDir ?? process.cwd()\n    const config = await loadDesignSystemConfig(projectDir)\n    if (!config) {\n      const f: Finding = {\n        verdict: 'UNCERTAIN',\n        rule: 'tokens/no-config',\n        summary:\n          'No design-system config found. Initialise with `ibr design-system init` ' +\n          'to define tokens, or skip this question.',\n      }\n      bumpVerdict(f.verdict)\n      emitted++\n      totalProduced++\n      yield { type: 'finding', ...f }\n    } else {\n      rulesRun.push('tokens/extended')\n      const tokens = config.tokens\n      if (!tokens) {\n        const f: Finding = {\n          verdict: 'UNCERTAIN',\n          rule: 'tokens/no-tokens',\n          summary: 'Design-system config exists but has no `tokens` defined.',\n        }\n        bumpVerdict(f.verdict)\n        emitted++\n        totalProduced++\n        yield { type: 'finding', ...f }\n      } else {\n        const tokenViolations = validateExtendedTokens(elements, tokens, config.name ?? 'project')\n        for (const t of tokenViolations) {\n          totalProduced++\n          if (emitted >= maxFindings) continue\n          const finding = tokenViolationToFinding(t)\n          bumpVerdict(finding.verdict)\n          emitted++\n          yield { type: 'finding', ...finding }\n        }\n      }\n    }\n  }\n\n  yield {\n    type: 'end',\n    verdict: aborted ? 'UNCERTAIN' : aggregate,\n    totalFindings: emitted,\n    durationMs: Date.now() - start,\n    truncated: totalProduced > emitted,\n    rulesRun,\n    elementsScanned: elements.length,\n    ...(screenshotPath ? { screenshotPath } : {}),\n    ...(aborted ? { aborted: true } : {}),\n  }\n}\n\n// ── Blocking wrapper: consumes the stream into a single AskResponse. ─────────\n// Existing callers continue to work without changes.\n\nexport async function ask(\n  url: string,\n  question: string,\n  options: AskOptions = {},\n): Promise<AskResponse> {\n  const findings: Finding[] = []\n  let endEvent:\n    | Extract<AskStreamEvent, { type: 'end' }>\n    | undefined\n  let supportedQuestions: string[] | undefined\n\n  for await (const event of askStream(url, question, options)) {\n    if (event.type === 'finding') {\n      const { type: _t, ...rest } = event\n      findings.push(rest)\n    } else if (event.type === 'start') {\n      supportedQuestions = event.supportedQuestions\n    } else if (event.type === 'end') {\n      endEvent = event\n    }\n  }\n\n  if (!endEvent) {\n    // Defensive: should never happen — askStream always emits an `end` event.\n    throw new Error('askStream did not emit an end event')\n  }\n\n  return {\n    question,\n    verdict: endEvent.verdict,\n    findings,\n    truncated: endEvent.truncated || undefined,\n    meta: {\n      engineVersion: ENGINE_VERSION,\n      durationMs: endEvent.durationMs,\n      elementsScanned: endEvent.elementsScanned,\n      rulesRun: endEvent.rulesRun,\n      ...(supportedQuestions ? { supportedQuestions } : {}),\n      ...(endEvent.screenshotPath ? { screenshotPath: endEvent.screenshotPath } : {}),\n    },\n  }\n}\n\n// ── exports for tests / other modules ─────────────────────────────────────────\n\nexport const _internal = {\n  matchQuestion,\n  aggregateVerdict,\n  violationToFinding,\n  tokenViolationToFinding,\n  SUPPORTED_QUESTIONS,\n}\n","/**\n * BrowserPool — keeps a single warm EngineDriver alive across multiple scans\n * in the same process.\n *\n * Cold launch is the single largest contributor to scan() latency (~600-800ms\n * out of ~1.4s total measured against example.com). For long-running consumers\n * — most importantly the MCP server, where every tool call shares a process —\n * launching once and reusing for subsequent scans drops first-finding latency\n * to roughly the cost of `goto` + extraction (~400-600ms total).\n *\n * Concurrency: the pool serialises scans through a simple async mutex. Two\n * `scan()` calls against the same pool will not race on the shared page; the\n * second call waits for the first to release. Concurrent scans are out of\n * scope for this iteration; if we need them later, the pool can be extended\n * with a max-pages knob and on-demand target.createPage().\n *\n * Lifecycle: pool.close() must be called by the host (e.g. on SIGTERM in the\n * MCP server) to release the underlying browser process. The pool does not\n * register exit handlers automatically — explicit lifecycle keeps test\n * isolation clean.\n */\n\nimport { EngineDriver, type LaunchOptions } from './driver.js'\n\nexport interface BrowserPoolOptions {\n  /** Launch options applied on the first acquire. Subsequent acquires reuse. */\n  launchOptions?: LaunchOptions\n}\n\nexport class BrowserPool {\n  private driver: EngineDriver | null = null\n  private launchOptions: LaunchOptions\n  private inUse = false\n  private waiters: Array<() => void> = []\n  private closed = false\n\n  constructor(options: BrowserPoolOptions = {}) {\n    this.launchOptions = options.launchOptions ?? {}\n  }\n\n  /**\n   * Acquire the warm driver. Launches on first call. Awaits if another\n   * caller currently holds the driver.\n   *\n   * Ticket-lock pattern: when a waiter wakes, the lock is *theirs* — no\n   * re-check loop. release() hands ownership directly so the queue is\n   * strictly FIFO and a fresh caller cannot jump in between release() and\n   * the woken waiter's continuation.\n   */\n  async acquire(): Promise<EngineDriver> {\n    if (this.closed) throw new Error('BrowserPool is closed')\n    if (this.inUse) {\n      await new Promise<void>((resolve) => this.waiters.push(resolve))\n      // Re-check closed after wake — close() may have just resolved us.\n      if (this.closed) throw new Error('BrowserPool is closed')\n      // We were promised the lock by release(); inUse stays true.\n    } else {\n      this.inUse = true\n    }\n    if (!this.driver) {\n      this.driver = new EngineDriver()\n      try {\n        await this.driver.launch(this.launchOptions)\n      } catch (err) {\n        // Reset state on launch failure so the next acquire can retry.\n        // Hand off to the next waiter (or release the lock entirely if none).\n        this.driver = null\n        const next = this.waiters.shift()\n        if (next) {\n          next() // waiter is now owner; inUse stays true\n        } else {\n          this.inUse = false\n        }\n        throw err\n      }\n    }\n    return this.driver\n  }\n\n  /**\n   * Release the driver back to the pool. Hands off ownership to the next\n   * waiter directly (without resetting inUse) so the queue stays FIFO.\n   */\n  release(): void {\n    const next = this.waiters.shift()\n    if (next) {\n      next() // waiter is now owner; inUse stays true\n    } else {\n      this.inUse = false\n    }\n  }\n\n  /**\n   * Close the underlying browser. Future acquire() calls throw. Already-\n   * waiting callers wake and observe `closed`, so no one hangs.\n   *\n   * Note: a current holder is *not* forcibly evicted. Their next release()\n   * is still valid (it just falls through the no-waiters branch).\n   */\n  async close(): Promise<void> {\n    this.closed = true\n    if (this.driver) {\n      const d = this.driver\n      this.driver = null\n      try {\n        await d.close()\n      } catch {\n        // Best-effort close; never throw from cleanup.\n      }\n    }\n    // Wake any pending waiters so they observe the closed state and throw.\n    while (this.waiters.length) {\n      const w = this.waiters.shift()\n      if (w) w()\n    }\n  }\n\n  /** True if the pool has a live driver. Useful for diagnostics. */\n  hasWarmDriver(): boolean {\n    return this.driver !== null\n  }\n}\n","export { allCalmPrecisionRules, corePrincipleIds, stylisticPrincipleIds, principleToRules } from './calm-precision.js';\nexport { gestaltRules } from './gestalt.js';\nexport { signalNoiseRules } from './signal-noise.js';\nexport { fittsRules } from './fitts.js';\nexport { hickRules } from './hick.js';\nexport { contentChromeRules } from './content-chrome.js';\nexport { cognitiveLoadRules } from './cognitive-load.js';\n","// Native iOS/watchOS simulator support\n\nexport type {\n  SimulatorDevice,\n  NativeCaptureOptions,\n  NativeCaptureResult,\n  NativeScanOptions,\n  NativeScanResult,\n  NativeElement,\n  // macOS native app types\n  MacOSAXElement,\n  MacOSWindowInfo,\n  MacOSScanOptions,\n  MacOSScanResult,\n} from './types.js';\n\nexport { NATIVE_VIEWPORTS, getDeviceViewport } from './viewports.js';\nexport { listDevices, findDevice, getBootedDevices, bootDevice, formatDevice } from './simulator.js';\nexport { captureNativeScreenshot } from './capture.js';\nexport { extractNativeElements, mapToEnhancedElements, isExtractorAvailable, ensureExtractor } from './extract.js';\nexport { auditNativeElements } from './rules.js';\nexport { scanNative, formatNativeScanResult, scanMacOS, formatMacOSScanResult } from './scan.js';\nexport {\n  getSimulatorInteractionDriverStatus,\n  formatSimulatorDriver,\n  SIMULATOR_DRIVER_ENV,\n} from './idb.js';\nexport type {\n  SimulatorInteractionDriver,\n  SimulatorDriverPreference,\n  SimulatorInteractionDriverStatus,\n} from './idb.js';\n\n// macOS native app scanning\nexport { findProcess, extractMacOSElements, mapMacOSToEnhancedElements, captureMacOSScreenshot } from './macos.js';\nexport { buildNativeInteractivity } from './interactivity.js';\nexport { buildNativeSemantic } from './semantic.js';\nexport { annotateScreenshot } from './annotate.js';\nexport { generateFixGuide } from './fix-guide.js';\nexport type { FixGuide, FixableIssue } from './fix-guide.js';\n\n// Layout-fill / gap analysis (catches centered-narrow-content bugs that pass\n// screenshot/a11y checks)\nexport { analyzeLayoutFill, reportElementSizes } from './layout-fill.js';\nexport type {\n  LayoutFillFinding,\n  LayoutFillOptions,\n  ElementSizeReport,\n} from './layout-fill.js';\n","/**\n * ibr-sim-driver - TypeScript wrapper around the bundled native-window driver.\n *\n * The native binary lives at `mobile-ui/sim-driver/` (Swift Package). It uses\n * Apple's public CGEvent API to post mouse and keyboard events at the\n * Simulator.app window's host-screen position. This is useful as a low-friction\n * fallback when IDB is not installed, but it is not headless HID injection and\n * should not be treated as IDB-equivalent.\n *\n * Constraints:\n *   - macOS only.\n *   - Requires Accessibility permission for the calling process (System\n *     Settings > Privacy & Security > Accessibility).\n *   - Requires a visible Simulator.app window for the target UDID. The driver\n *     activates Simulator.app and locates the window by device name.\n *\n * Build: compiled on first call via `swift build -c release`, cached at\n * `.ibr/bin/ibr-sim-driver`. The optional `scripts/build-sim-driver.js`\n * postinstall script can pre-build into `dist/bin/` for shipped npm installs.\n */\n\nimport { execFile } from 'child_process'\nimport { existsSync } from 'fs'\nimport { chmod, copyFile, mkdir } from 'fs/promises'\nimport { join } from 'path'\nimport { promisify } from 'util'\nimport type { IdbActionResult } from './idb.js'\n\nconst execFileAsync = promisify(execFile)\n\nconst DRIVER_NAME = 'ibr-sim-driver'\nconst CACHE_DIR = join(process.cwd(), '.ibr', 'bin')\nconst CACHE_PATH = join(CACHE_DIR, DRIVER_NAME)\n\nlet cachedPath: string | null | undefined\nlet buildError: string | null = null\n\nfunction existingBinaryCandidates(): string[] {\n  return [\n    join(__dirname, '..', 'bin', DRIVER_NAME),\n    join(__dirname, 'bin', DRIVER_NAME),\n    join(__dirname, '..', '..', 'dist', 'bin', DRIVER_NAME),\n    CACHE_PATH,\n  ]\n}\n\nfunction sourceDirCandidates(): string[] {\n  return [\n    join(__dirname, '..', '..', 'mobile-ui', 'sim-driver'),\n    join(__dirname, '..', 'mobile-ui', 'sim-driver'),\n  ]\n}\n\nfunction findExistingBinary(): string | null {\n  return existingBinaryCandidates().find((p) => existsSync(p)) ?? null\n}\n\nfunction findSourceDir(): string | null {\n  return sourceDirCandidates().find((p) => existsSync(join(p, 'Package.swift'))) ?? null\n}\n\nfunction errorMessage(err: unknown): string {\n  if (err && typeof err === 'object') {\n    const e = err as { stderr?: string; stdout?: string; message?: string }\n    const stderr = e.stderr?.trim()\n    if (stderr) return stderr\n    const stdout = e.stdout?.trim()\n    if (stdout) return stdout\n    if (e.message) return e.message\n  }\n  return String(err)\n}\n\n/**\n * Whether the native-window driver is reachable on this platform.\n *\n * Returns true if either the prebuilt binary is present or the Swift source\n * is available for on-demand compilation. The first failed build is cached so\n * we don't retry indefinitely.\n */\nexport function isSimDriverAvailable(): boolean {\n  if (process.platform !== 'darwin') return false\n  if (cachedPath) return true\n  if (findExistingBinary()) return true\n  if (buildError) return false\n  return findSourceDir() !== null\n}\n\nexport async function ensureSimDriver(): Promise<string> {\n  if (cachedPath) return cachedPath\n\n  const existing = findExistingBinary()\n  if (existing) {\n    cachedPath = existing\n    return existing\n  }\n\n  if (process.platform !== 'darwin') {\n    throw new Error('ibr-sim-driver is only available on macOS')\n  }\n\n  const sourceDir = findSourceDir()\n  if (!sourceDir) {\n    throw new Error('ibr-sim-driver Swift package not found')\n  }\n\n  if (buildError) throw new Error(buildError)\n\n  try {\n    await execFileAsync('swift', ['build', '--package-path', sourceDir, '-c', 'release'], {\n      timeout: 120_000,\n    })\n    const builtPath = join(sourceDir, '.build', 'release', DRIVER_NAME)\n    if (!existsSync(builtPath)) {\n      throw new Error('Swift build succeeded but binary was not created')\n    }\n    await mkdir(CACHE_DIR, { recursive: true })\n    await copyFile(builtPath, CACHE_PATH)\n    await chmod(CACHE_PATH, 0o755)\n    cachedPath = CACHE_PATH\n    return CACHE_PATH\n  } catch (err) {\n    buildError = `Failed to build ibr-sim-driver: ${errorMessage(err)}`\n    throw new Error(buildError)\n  }\n}\n\nasync function runSimDriver(args: string[], action: string): Promise<IdbActionResult> {\n  try {\n    const driverPath = await ensureSimDriver()\n    await execFileAsync(driverPath, args, { timeout: 15_000 })\n    return { success: true, action }\n  } catch (err) {\n    return { success: false, action, error: errorMessage(err) }\n  }\n}\n\nexport type SimDriverCoords = 'ios' | 'host' | 'window'\n\nexport interface SimDriverPointOptions {\n  /** Coordinate mode. Default `ios` (logical iOS points). */\n  coords?: SimDriverCoords\n  /** Chrome offset in points. Default 52 (modern Simulator on Xcode 14+). */\n  chromeOffset?: number\n}\n\nfunction coordFlags(opts?: SimDriverPointOptions): string[] {\n  const out: string[] = []\n  if (opts?.coords) out.push('--coords', opts.coords)\n  if (opts?.chromeOffset !== undefined) out.push('--chrome-offset', String(opts.chromeOffset))\n  return out\n}\n\nexport function simDriverTap(\n  udid: string,\n  x: number,\n  y: number,\n  opts?: SimDriverPointOptions,\n): Promise<IdbActionResult> {\n  return runSimDriver(\n    ['tap', '--udid', udid, ...coordFlags(opts), String(x), String(y)],\n    'tap',\n  )\n}\n\nexport function simDriverType(udid: string, text: string): Promise<IdbActionResult> {\n  return runSimDriver(['type', '--udid', udid, text], 'type')\n}\n\nexport function simDriverSwipe(\n  udid: string,\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n  duration?: number,\n  opts?: SimDriverPointOptions,\n): Promise<IdbActionResult> {\n  const args = [\n    'swipe',\n    '--udid',\n    udid,\n    ...coordFlags(opts),\n    String(x1),\n    String(y1),\n    String(x2),\n    String(y2),\n  ]\n  if (duration) args.push('--duration', String(duration))\n  return runSimDriver(args, 'swipe')\n}\n\n// Test-only - reset the memoized state.\nexport function _resetSimDriverForTests(): void {\n  cachedPath = undefined\n  buildError = null\n}\n","import { execFile } from 'child_process'\nimport { promisify } from 'util'\nimport {\n  isSimDriverAvailable,\n  simDriverTap,\n  simDriverSwipe,\n  simDriverType,\n} from './sim-driver.js'\n\nconst execFileAsync = promisify(execFile)\n\nexport const SIMULATOR_DRIVER_ENV = 'IBR_SIMULATOR_DRIVER'\n\nconst INSTALL_HINT =\n  'Install IDB: brew tap facebook/fb && brew install idb-companion && pipx install fb-idb. ' +\n  'IBR also ships a bundled native-window fallback (requires Accessibility permission and a visible Simulator window).'\n\nexport type SimulatorInteractionDriver = 'native-hid' | 'native-window' | 'idb' | 'simctl'\nexport type SimulatorDriverPreference = 'auto' | SimulatorInteractionDriver\n\nexport interface SimulatorInteractionDriverStatus {\n  driver: SimulatorInteractionDriver\n  label: string\n  available: boolean\n  headless: boolean\n  bundled: boolean\n  actions: Array<'tap' | 'type' | 'swipe' | 'button' | 'openUrl' | 'accessibility'>\n  constraints: string[]\n  reason?: string\n  selected: boolean\n}\n\nconst DRIVER_LABELS: Record<SimulatorInteractionDriver, string> = {\n  'native-hid': 'IBR native HID',\n  'native-window': 'IBR native-window',\n  idb: 'Meta IDB',\n  simctl: 'simctl',\n}\n\nfunction configuredDriverPreference(): SimulatorDriverPreference {\n  const raw = process.env[SIMULATOR_DRIVER_ENV]?.trim()\n  if (!raw) return 'auto'\n\n  const allowed: SimulatorDriverPreference[] = ['auto', 'native-hid', 'native-window', 'idb', 'simctl']\n  return allowed.includes(raw as SimulatorDriverPreference) ? raw as SimulatorDriverPreference : 'auto'\n}\n\nfunction shouldTryDriver(driver: SimulatorInteractionDriver, preference: SimulatorDriverPreference): boolean {\n  return preference === 'auto' || preference === driver\n}\n\nfunction forcedDriverFailure(\n  action: string,\n  driver: SimulatorInteractionDriver,\n  message: string,\n): IdbActionResult {\n  return {\n    success: false,\n    action,\n    driver,\n    error: `${SIMULATOR_DRIVER_ENV}=${driver}: ${message}`,\n  }\n}\n\nfunction nativeHidUnavailable(action: string): IdbActionResult {\n  return forcedDriverFailure(\n    action,\n    'native-hid',\n    'headless CoreSimulator/SimulatorKit HID injection is the IDB-parity target, but it is not implemented in this build.',\n  )\n}\n\nfunction simDriverSuffix(error?: string): string {\n  return error ? ` native-window: ${error}` : ''\n}\n\nexport function formatSimulatorDriver(driver?: SimulatorInteractionDriver): string {\n  return driver ? DRIVER_LABELS[driver] : 'unknown driver'\n}\n\n// ── Capability checks ──────────────────────────────────────────────────────────\n\n\n/**\n * Check if IDB companion is available\n */\nexport async function isIdbAvailable(): Promise<boolean> {\n  try {\n    await execFileAsync('which', ['idb_companion'])\n    return true\n  } catch {\n    return false\n  }\n}\n\n/**\n * Check if idb CLI is available (Python client)\n */\nexport async function isIdbCliAvailable(): Promise<boolean> {\n  try {\n    await execFileAsync('which', ['idb'])\n    return true\n  } catch {\n    return false\n  }\n}\n\nexport interface IdbActionResult {\n  success: boolean\n  action: string\n  error?: string\n  driver?: SimulatorInteractionDriver\n}\n\nexport async function isSimctlAvailable(): Promise<boolean> {\n  try {\n    await execFileAsync('which', ['xcrun'])\n    return true\n  } catch {\n    return false\n  }\n}\n\nexport async function getSimulatorInteractionDriverStatus(): Promise<SimulatorInteractionDriverStatus[]> {\n  const preference = configuredDriverPreference()\n  const nativeWindowAvailable = isSimDriverAvailable()\n  const idbAvailable = await isIdbCliAvailable()\n  const simctlAvailable = await isSimctlAvailable()\n\n  return [\n    {\n      driver: 'native-hid',\n      label: DRIVER_LABELS['native-hid'],\n      available: false,\n      headless: true,\n      bundled: true,\n      actions: ['tap', 'type', 'swipe', 'button', 'accessibility'],\n      constraints: [\n        'Not implemented in this build.',\n        'Target backend uses CoreSimulator/SimulatorKit HID injection, matching IDB-class headless input.',\n      ],\n      reason: 'pending private-framework HID backend',\n      selected: preference === 'native-hid',\n    },\n    {\n      driver: 'native-window',\n      label: DRIVER_LABELS['native-window'],\n      available: nativeWindowAvailable,\n      headless: false,\n      bundled: true,\n      actions: ['tap', 'type', 'swipe'],\n      constraints: [\n        'Requires macOS Accessibility permission.',\n        'Requires a visible Simulator.app window.',\n        'Uses host CGEvent mouse/keyboard events; not IDB-equivalent HID injection.',\n      ],\n      reason: nativeWindowAvailable ? undefined : 'Swift driver binary/source unavailable on this platform',\n      selected: preference === 'auto' || preference === 'native-window',\n    },\n    {\n      driver: 'idb',\n      label: DRIVER_LABELS.idb,\n      available: idbAvailable,\n      headless: true,\n      bundled: false,\n      actions: ['tap', 'type', 'swipe', 'button', 'accessibility'],\n      constraints: [\n        'Requires idb_companion and fb-idb to be installed outside IBR.',\n      ],\n      reason: idbAvailable ? undefined : 'idb CLI not found on PATH',\n      selected: preference === 'auto' || preference === 'idb',\n    },\n    {\n      driver: 'simctl',\n      label: DRIVER_LABELS.simctl,\n      available: simctlAvailable,\n      headless: true,\n      bundled: false,\n      actions: ['openUrl', 'button'],\n      constraints: [\n        'Can open URLs and capture screenshots.',\n        'HOME has a SpringBoard restart fallback.',\n        'Does not support tap or swipe input through simctl io.',\n      ],\n      reason: simctlAvailable ? undefined : 'xcrun not found on PATH',\n      selected: preference === 'simctl',\n    },\n  ]\n}\n\n// ── Tap ────────────────────────────────────────────────────────────────────────\n\n/**\n * Tap at coordinates in the simulator\n *\n * Driver chain:\n *   1. native-window — bundled CGEvent fallback. Requires Accessibility\n *      permission for the host process and a visible Simulator window. Posts\n *      mouse events directly; coordinates are translated to the Simulator\n *      window's host-screen position.\n *   2. idb ui tap (requires `brew install idb-companion`)\n *   3. Fail with install hint\n *\n * Set IBR_SIMULATOR_DRIVER=idb to skip the visible-window fallback in CI.\n *\n * Note: previous versions tried `xcrun simctl io <udid> tap` as a fallback.\n * That subcommand has never existed and the call always failed silently.\n * Removed.\n */\nexport async function idbTap(udid: string, x: number, y: number): Promise<IdbActionResult> {\n  const preference = configuredDriverPreference()\n  let simDriverError: string | undefined\n\n  if (preference === 'native-hid') {\n    return nativeHidUnavailable('tap')\n  }\n\n  if (shouldTryDriver('native-window', preference)) {\n    if (!isSimDriverAvailable()) {\n      if (preference === 'native-window') {\n        return forcedDriverFailure('tap', 'native-window', 'native-window driver is not available.')\n      }\n    } else {\n      const r = await simDriverTap(udid, x, y)\n      if (r.success) return { ...r, driver: 'native-window' }\n      simDriverError = r.error\n      if (preference === 'native-window') {\n        return { success: false, action: 'tap', error: r.error, driver: 'native-window' }\n      }\n    }\n  }\n\n  if (shouldTryDriver('idb', preference)) {\n    if (!(await isIdbCliAvailable())) {\n      if (preference === 'idb') {\n        return forcedDriverFailure('tap', 'idb', 'idb CLI not found on PATH.')\n      }\n    } else {\n      try {\n        await execFileAsync('idb', ['ui', 'tap', String(x), String(y), '--udid', udid], { timeout: 10000 })\n        return { success: true, action: 'tap', driver: 'idb' }\n      } catch (err: any) {\n        return { success: false, action: 'tap', error: err.message, driver: 'idb' }\n      }\n    }\n  }\n\n  return {\n    success: false,\n    action: 'tap',\n    error: `No simulator tap driver available. ${INSTALL_HINT}${simDriverSuffix(simDriverError)}`,\n  }\n}\n\n// ── Type ───────────────────────────────────────────────────────────────────────\n\n/**\n * Type text into the focused field\n *\n * Driver chain:\n *   1. native-window keyboard injection (pasteboard + CGEvent)\n *   2. idb ui text\n *   3. Fail with install hint\n */\nexport async function idbType(udid: string, text: string): Promise<IdbActionResult> {\n  const preference = configuredDriverPreference()\n  let simDriverError: string | undefined\n\n  if (preference === 'native-hid') {\n    return nativeHidUnavailable('type')\n  }\n\n  if (shouldTryDriver('native-window', preference)) {\n    if (!isSimDriverAvailable()) {\n      if (preference === 'native-window') {\n        return forcedDriverFailure('type', 'native-window', 'native-window driver is not available.')\n      }\n    } else {\n      const r = await simDriverType(udid, text)\n      if (r.success) return { ...r, driver: 'native-window' }\n      simDriverError = r.error\n      if (preference === 'native-window') {\n        return { success: false, action: 'type', error: r.error, driver: 'native-window' }\n      }\n    }\n  }\n\n  if (shouldTryDriver('idb', preference)) {\n    if (!(await isIdbCliAvailable())) {\n      if (preference === 'idb') {\n        return forcedDriverFailure('type', 'idb', 'idb CLI not found on PATH.')\n      }\n    } else {\n      try {\n        await execFileAsync('idb', ['ui', 'text', text, '--udid', udid], { timeout: 10000 })\n        return { success: true, action: 'type', driver: 'idb' }\n      } catch (err: any) {\n        return { success: false, action: 'type', error: err.message, driver: 'idb' }\n      }\n    }\n  }\n\n  return {\n    success: false,\n    action: 'type',\n    error: `No simulator type driver available. ${INSTALL_HINT}${simDriverSuffix(simDriverError)}`,\n  }\n}\n\n// ── Swipe ──────────────────────────────────────────────────────────────────────\n\n/**\n * Swipe from one point to another (for scrolling)\n *\n * Driver chain:\n *   1. native-window (CGEvent drag sequence)\n *   2. idb ui swipe\n *   3. Fail with install hint\n *\n * Note: `xcrun simctl io <udid> swipe` is intentionally not used. `simctl io`\n * supports screenshots and video capture, not touch injection.\n */\nexport async function idbSwipe(\n  udid: string,\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n  duration?: number,\n): Promise<IdbActionResult> {\n  const preference = configuredDriverPreference()\n  let simDriverError: string | undefined\n\n  if (preference === 'native-hid') {\n    return nativeHidUnavailable('swipe')\n  }\n\n  if (shouldTryDriver('native-window', preference)) {\n    if (!isSimDriverAvailable()) {\n      if (preference === 'native-window') {\n        return forcedDriverFailure('swipe', 'native-window', 'native-window driver is not available.')\n      }\n    } else {\n      const r = await simDriverSwipe(udid, x1, y1, x2, y2, duration)\n      if (r.success) return { ...r, driver: 'native-window' }\n      simDriverError = r.error\n      if (preference === 'native-window') {\n        return { success: false, action: 'swipe', error: r.error, driver: 'native-window' }\n      }\n    }\n  }\n\n  if (shouldTryDriver('idb', preference)) {\n    if (!(await isIdbCliAvailable())) {\n      if (preference === 'idb') {\n        return forcedDriverFailure('swipe', 'idb', 'idb CLI not found on PATH.')\n      }\n    } else {\n      try {\n        const args = ['ui', 'swipe', String(x1), String(y1), String(x2), String(y2), '--udid', udid]\n        if (duration) args.push('--duration', String(duration))\n        await execFileAsync('idb', args, { timeout: 10000 })\n        return { success: true, action: 'swipe', driver: 'idb' }\n      } catch (err: any) {\n        return { success: false, action: 'swipe', error: err.message, driver: 'idb' }\n      }\n    }\n  }\n\n  return {\n    success: false,\n    action: 'swipe',\n    error: `No simulator swipe driver available. ${INSTALL_HINT}${simDriverSuffix(simDriverError)}`,\n  }\n}\n\n// ── Hardware buttons ───────────────────────────────────────────────────────────\n\n/**\n * Press a hardware button\n *\n * native-window does not currently expose hardware buttons. HOME has a\n * simctl-based fallback (force-stop SpringBoard). Other buttons require IDB.\n */\nexport async function idbButton(\n  udid: string,\n  button: 'HOME' | 'LOCK' | 'SIRI' | 'APPLE_PAY',\n): Promise<IdbActionResult> {\n  const preference = configuredDriverPreference()\n  const action = `button:${button}`\n\n  if (preference === 'native-hid') {\n    return nativeHidUnavailable(action)\n  }\n\n  if (preference === 'native-window') {\n    return forcedDriverFailure(action, 'native-window', 'native-window does not support hardware buttons.')\n  }\n\n  if (shouldTryDriver('idb', preference)) {\n    if (!(await isIdbCliAvailable())) {\n      if (preference === 'idb') {\n        return forcedDriverFailure(action, 'idb', 'idb CLI not found on PATH.')\n      }\n    } else {\n      try {\n        await execFileAsync('idb', ['ui', 'button', button, '--udid', udid], { timeout: 10000 })\n        return { success: true, action, driver: 'idb' }\n      } catch (err: any) {\n        return { success: false, action, error: err.message, driver: 'idb' }\n      }\n    }\n  }\n\n  if (button === 'HOME' && shouldTryDriver('simctl', preference)) {\n    try {\n      await execFileAsync(\n        'xcrun',\n        ['simctl', 'spawn', udid, 'launchctl', 'stop', 'com.apple.SpringBoard'],\n        { timeout: 10000 },\n      )\n      return { success: true, action, driver: 'simctl' }\n    } catch (err: any) {\n      return { success: false, action, error: err.message, driver: 'simctl' }\n    }\n  }\n\n  if (preference === 'simctl') {\n    return forcedDriverFailure(action, 'simctl', `simctl fallback supports HOME only, not ${button}.`)\n  }\n\n  return {\n    success: false,\n    action,\n    error: `No driver available for ${button}. ${INSTALL_HINT}`,\n  }\n}\n\n// ── IDB-only features ──────────────────────────────────────────────────────────\n\n/**\n * Get accessibility info from the simulator (IDB-specific)\n * Returns the iOS app's accessibility tree — much richer than simctl\n */\nexport async function idbAccessibilityInfo(\n  udid: string,\n  point?: { x: number; y: number },\n): Promise<{ elements?: any[]; error?: string }> {\n  try {\n    if (!(await isIdbCliAvailable())) {\n      return { error: 'IDB not available' }\n    }\n    const args = ['accessibility', 'info', '--udid', udid]\n    if (point) {\n      args.push('--point', String(point.x), String(point.y))\n    }\n    const { stdout } = await execFileAsync('idb', args, { timeout: 15000 })\n    return { elements: JSON.parse(stdout) }\n  } catch {\n    return { error: 'Accessibility info not available' }\n  }\n}\n\n/**\n * Open a URL in the simulator (works with deep links)\n */\nexport async function idbOpenUrl(udid: string, url: string): Promise<IdbActionResult> {\n  try {\n    await execFileAsync('xcrun', ['simctl', 'openurl', udid, url], { timeout: 10000 })\n    return { success: true, action: 'openUrl', driver: 'simctl' }\n  } catch (err: any) {\n    return { success: false, action: 'openUrl', error: err.message, driver: 'simctl' }\n  }\n}\n\n// ── High-level dispatcher ──────────────────────────────────────────────────────\n\n/**\n * Perform a high-level simulator action\n * Resolves element by label from the extracted AX tree, then taps at its center coordinates\n */\nexport async function simulatorAction(options: {\n  udid: string\n  action: 'tap' | 'type' | 'swipe' | 'scroll'\n  x?: number\n  y?: number\n  text?: string\n  direction?: 'up' | 'down' | 'left' | 'right'\n}): Promise<IdbActionResult> {\n  const { udid, action } = options\n\n  switch (action) {\n    case 'tap':\n      if (options.x === undefined || options.y === undefined) {\n        return { success: false, action: 'tap', error: 'x and y coordinates required for tap' }\n      }\n      return idbTap(udid, options.x, options.y)\n\n    case 'type':\n      if (!options.text) {\n        return { success: false, action: 'type', error: 'text required for type action' }\n      }\n      return idbType(udid, options.text)\n\n    case 'swipe':\n    case 'scroll': {\n      const cx = options.x ?? 187\n      const cy = options.y ?? 400\n      const distance = 300\n      let x2 = cx, y2 = cy\n      switch (options.direction ?? 'down') {\n        case 'up': y2 = cy + distance; break\n        case 'down': y2 = cy - distance; break\n        case 'left': x2 = cx + distance; break\n        case 'right': x2 = cx - distance; break\n      }\n      return idbSwipe(udid, cx, cy, x2, y2, 0.5)\n    }\n\n    default:\n      return { success: false, action, error: `Unknown action: ${action}` }\n  }\n}\n","import { PNG } from 'pngjs';\nimport { readFileSync, writeFileSync } from 'fs';\n\nexport interface AnnotationTarget {\n  id: number;\n  bounds: { x: number; y: number; width: number; height: number };\n}\n\n// 5x7 bitmap font for digits 0-9\nconst DIGITS: number[][] = [\n  [0x1F,0x11,0x11,0x11,0x11,0x11,0x1F], // 0\n  [0x04,0x06,0x04,0x04,0x04,0x04,0x0E], // 1\n  [0x1F,0x10,0x10,0x1F,0x01,0x01,0x1F], // 2\n  [0x1F,0x10,0x10,0x1F,0x10,0x10,0x1F], // 3\n  [0x11,0x11,0x11,0x1F,0x10,0x10,0x10], // 4\n  [0x1F,0x01,0x01,0x1F,0x10,0x10,0x1F], // 5\n  [0x1F,0x01,0x01,0x1F,0x11,0x11,0x1F], // 6\n  [0x1F,0x10,0x10,0x08,0x04,0x04,0x04], // 7\n  [0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F], // 8\n  [0x1F,0x11,0x11,0x1F,0x10,0x10,0x1F], // 9\n];\n\nfunction setPixel(png: PNG, x: number, y: number, r: number, g: number, b: number, a = 255) {\n  if (x < 0 || y < 0 || x >= png.width || y >= png.height) return;\n  const idx = (y * png.width + x) * 4;\n  png.data[idx] = r; png.data[idx+1] = g; png.data[idx+2] = b; png.data[idx+3] = a;\n}\n\nfunction drawRect(png: PNG, x: number, y: number, w: number, h: number, r: number, g: number, b: number, thickness = 2) {\n  for (let t = 0; t < thickness; t++) {\n    for (let i = x; i < x + w; i++) { setPixel(png, i, y + t, r, g, b); setPixel(png, i, y + h - 1 - t, r, g, b); }\n    for (let j = y; j < y + h; j++) { setPixel(png, x + t, j, r, g, b); setPixel(png, x + w - 1 - t, j, r, g, b); }\n  }\n}\n\nfunction drawFilledCircle(png: PNG, cx: number, cy: number, radius: number, r: number, g: number, b: number) {\n  for (let dy = -radius; dy <= radius; dy++) {\n    for (let dx = -radius; dx <= radius; dx++) {\n      if (dx * dx + dy * dy <= radius * radius) setPixel(png, cx + dx, cy + dy, r, g, b);\n    }\n  }\n}\n\nfunction drawDigit(png: PNG, cx: number, cy: number, digit: number, r: number, g: number, b: number) {\n  const rows = DIGITS[digit] ?? DIGITS[0];\n  const scale = 2;\n  const offX = cx - Math.floor((5 * scale) / 2);\n  const offY = cy - Math.floor((7 * scale) / 2);\n  for (let row = 0; row < 7; row++) {\n    for (let col = 0; col < 5; col++) {\n      if (rows[row] & (0x10 >> col)) {\n        for (let sy = 0; sy < scale; sy++)\n          for (let sx = 0; sx < scale; sx++)\n            setPixel(png, offX + col * scale + sx, offY + row * scale + sy, r, g, b);\n      }\n    }\n  }\n}\n\nfunction drawLabel(png: PNG, cx: number, cy: number, id: number) {\n  drawFilledCircle(png, cx, cy, 10, 220, 30, 30);\n  const tens = Math.floor(id / 10);\n  const ones = id % 10;\n  if (tens > 0) {\n    drawDigit(png, cx - 5, cy, tens, 255, 255, 255);\n    drawDigit(png, cx + 5, cy, ones, 255, 255, 255);\n  } else {\n    drawDigit(png, cx, cy, ones, 255, 255, 255);\n  }\n}\n\nexport async function annotateScreenshot(\n  screenshotPath: string,\n  issues: AnnotationTarget[]\n): Promise<string | null> {\n  let png: PNG;\n  try {\n    const buf = readFileSync(screenshotPath);\n    png = PNG.sync.read(buf);\n  } catch {\n    return null;\n  }\n\n  for (const issue of issues) {\n    const { x, y, width: w, height: h } = issue.bounds;\n    drawRect(png, x, y, w, h, 220, 30, 30, 2);\n    drawLabel(png, x, y, issue.id);\n  }\n\n  const outPath = screenshotPath.replace(/\\.png$/i, '-annotated.png');\n  try {\n    writeFileSync(outPath, PNG.sync.write(png));\n  } catch {\n    return null;\n  }\n  return outPath;\n}\n","/**\n * Fix Guide Generator\n *\n * Takes scan results + source correlations and produces structured fix\n * instructions that Claude Code can act on.\n */\n\nimport type { NativeScanResult } from './types.js';\nimport type { BridgeResult, SourceCorrelation } from './bridge.js';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface FixableIssue {\n  id: number;\n  category: string;           // 'touch-target' | 'accessibility' | 'contrast'\n  severity: 'error' | 'warning';\n  what: string;\n  where: {\n    element: string;          // AX selector\n    bounds: { x: number; y: number; width: number; height: number };\n    screenRegion: string;     // \"top-left\" through \"bottom-right\" (3x3 grid)\n  };\n  current: string;\n  required: string;\n  source?: {\n    file: string;\n    line?: number;\n    confidence: number;\n    matchedOn: string;\n    searchPattern: string;\n  };\n  suggestedFix: string;\n}\n\nexport interface FixGuide {\n  screenshot: string;\n  screenshotRaw: string;\n  issues: FixableIssue[];\n  summary: string;\n}\n\n// =============================================================================\n// SIMULATOR CHROME FILTER\n// =============================================================================\n\nconst SIMULATOR_CHROME_PATTERNS = [\n  'Save Screen', 'Rotate', 'Sheet Grabber', 'Home Indicator',\n  'Status Bar', 'Side Button', 'Volume', 'Mute Switch',\n];\n\nfunction isSimulatorChrome(selector: string, label: string): boolean {\n  const text = `${selector} ${label}`.toLowerCase();\n  return SIMULATOR_CHROME_PATTERNS.some(p => text.includes(p.toLowerCase()));\n}\n\n// =============================================================================\n// SCREEN REGION\n// =============================================================================\n\nfunction computeScreenRegion(\n  bounds: { x: number; y: number; width: number; height: number },\n  viewport: { width: number; height: number }\n): string {\n  const cx = bounds.x + bounds.width / 2;\n  const cy = bounds.y + bounds.height / 2;\n\n  const col = cx < viewport.width / 3 ? 'left'\n    : cx < (viewport.width * 2) / 3 ? 'center'\n    : 'right';\n\n  const row = cy < viewport.height / 3 ? 'top'\n    : cy < (viewport.height * 2) / 3 ? 'middle'\n    : 'bottom';\n\n  return `${row}-${col}`;\n}\n\n// =============================================================================\n// SUGGESTED FIXES\n// =============================================================================\n\nfunction buildSuggestedFix(issueType: string, elementLabel: string): string {\n  switch (issueType) {\n    case 'TOUCH_TARGET_SMALL':\n      return '.frame(minWidth: 44, minHeight: 44) or wrap in a larger tap area with .contentShape(Rectangle())';\n    case 'MISSING_ARIA_LABEL': {\n      // Don't use raw selector as label — provide a meaningful placeholder\n      const desc = elementLabel && elementLabel.length > 0 && !elementLabel.startsWith('[role')\n        ? elementLabel\n        : 'descriptive text for this control';\n      return `Add .accessibilityLabel(\"${desc}\")`;\n    }\n    case 'NO_HANDLER':\n      return 'Add tap action or remove interactive appearance';\n    case 'PLACEHOLDER_LINK':\n      return 'Replace href=\"#\" with a real destination or add an onTapGesture handler';\n    case 'DISABLED_NO_VISUAL':\n      return 'Add .opacity(0.5) or .foregroundColor(.gray) to visually indicate disabled state';\n    default:\n      return 'Review and fix accessibility issue';\n  }\n}\n\nfunction issueTypeToCategory(issueType: string): string {\n  if (issueType === 'TOUCH_TARGET_SMALL') return 'touch-target';\n  if (issueType === 'MISSING_ARIA_LABEL' || issueType === 'DISABLED_NO_VISUAL') return 'accessibility';\n  if (issueType === 'NO_HANDLER' || issueType === 'PLACEHOLDER_LINK') return 'accessibility';\n  return 'accessibility';\n}\n\nfunction buildSearchPattern(\n  correlation: SourceCorrelation | undefined,\n  elementSelector: string,\n  elementLabel: string\n): string {\n  if (!correlation) {\n    if (elementLabel) {\n      const escaped = elementLabel.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n      return `Button.*${escaped}|Text.*${escaped}`;\n    }\n    return elementSelector;\n  }\n\n  switch (correlation.matchType) {\n    case 'identifier':\n      return correlation.elementSelector;\n    case 'label':\n      return `.accessibilityLabel(\"${correlation.elementLabel}\")`;\n    case 'view-name':\n      return `struct ${correlation.viewName}: View`;\n    case 'text': {\n      const label = correlation.elementLabel || elementLabel;\n      if (label) {\n        const escaped = label.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n        return `Button.*${escaped}|Image.*${escaped}`;\n      }\n      return elementSelector;\n    }\n    default:\n      return elementSelector;\n  }\n}\n\n// =============================================================================\n// MAIN EXPORT\n// =============================================================================\n\nexport function generateFixGuide(\n  scanResult: NativeScanResult,\n  bridgeResult: BridgeResult | null,\n  annotatedScreenshot: string | null\n): FixGuide {\n  const viewport = scanResult.viewport;\n\n  // Build lookups for source correlation\n  const correlationMap = new Map<string, SourceCorrelation>();\n  if (bridgeResult) {\n    for (const c of bridgeResult.correlations) {\n      correlationMap.set(c.elementSelector.toLowerCase(), c);\n      if (c.elementLabel) {\n        correlationMap.set(c.elementLabel.toLowerCase(), c);\n      }\n    }\n  }\n\n  // Build lookup: element label/selector → EnhancedElement bounds\n  // Multiple keys per element for flexible matching\n  const boundsMap = new Map<string, { x: number; y: number; width: number; height: number }>();\n  // Also track elements by role+label pattern for unlabeled elements\n  const unlabeledButtons: Array<{ x: number; y: number; width: number; height: number }> = [];\n  for (const el of scanResult.elements.all) {\n    const bounds = { x: el.bounds.x, y: el.bounds.y, width: el.bounds.width, height: el.bounds.height };\n    if (el.selector) boundsMap.set(el.selector.toLowerCase(), bounds);\n    if (el.a11y?.ariaLabel) boundsMap.set(el.a11y.ariaLabel.toLowerCase(), bounds);\n    if (el.text) boundsMap.set(el.text.toLowerCase(), bounds);\n    // Track unlabeled interactive elements for fallback matching\n    if (el.interactive?.hasOnClick && (!el.a11y?.ariaLabel || el.a11y.ariaLabel === '') && (!el.text || el.text === '')) {\n      unlabeledButtons.push(bounds);\n    }\n  }\n  // For issues about unlabeled buttons, use first available unlabeled element bounds\n  let unlabeledIdx = 0;\n\n  // Extract label from issue description text (e.g., '\"Save Screen\"' or '\"Play\"')\n  function extractLabel(text: string): string {\n    const m = text.match(/\"([^\"]+)\"/);\n    return m ? m[1] : '';\n  }\n\n  // Dedup key: normalized issue signature to avoid duplicates from audit + native rules\n  const seen = new Set<string>();\n  function dedupKey(label: string, issueType: string): string {\n    return `${label.toLowerCase()}:${issueType}`;\n  }\n\n  const fixableIssues: FixableIssue[] = [];\n  let idCounter = 1;\n\n  // Process nativeIssues first (more specific, from platform rules)\n  for (const issue of scanResult.nativeIssues) {\n    const elementLabel = extractLabel(issue.message);\n    const elementSelector = elementLabel || issue.type;\n\n    // Filter simulator chrome from BOTH selector and full message text\n    if (isSimulatorChrome(elementSelector, issue.message)) continue;\n\n    const key = dedupKey(elementLabel || elementSelector, issue.type);\n    if (seen.has(key)) continue;\n    seen.add(key);\n\n    let bounds = boundsMap.get(elementLabel.toLowerCase())\n      ?? boundsMap.get(elementSelector.toLowerCase())\n      ?? null;\n    // Fallback: for unlabeled elements, use next available unlabeled bounds\n    if (!bounds && elementLabel === '' && unlabeledIdx < unlabeledButtons.length) {\n      bounds = unlabeledButtons[unlabeledIdx++];\n    }\n    bounds = bounds ?? { x: 0, y: 0, width: 0, height: 0 };\n    const region = bounds.x > 0 || bounds.y > 0\n      ? computeScreenRegion(bounds, viewport)\n      : 'unknown';\n    const correlation = correlationMap.get(elementLabel.toLowerCase())\n      ?? correlationMap.get(elementSelector.toLowerCase());\n\n    fixableIssues.push({\n      id: idCounter++,\n      category: issueTypeToCategory(issue.type),\n      severity: issue.severity === 'info' ? 'warning' : issue.severity,\n      what: issue.message,\n      where: { element: elementSelector, bounds, screenRegion: region },\n      current: issue.message,\n      required: buildSuggestedFix(issue.type, elementLabel),\n      source: correlation ? {\n        file: correlation.sourceFile,\n        line: correlation.sourceLine,\n        confidence: correlation.confidence,\n        matchedOn: correlation.matchType,\n        searchPattern: buildSearchPattern(correlation, elementSelector, elementLabel),\n      } : undefined,\n      suggestedFix: buildSuggestedFix(issue.type, elementLabel),\n    });\n  }\n\n  // Process ScanIssues — skip duplicates already covered by nativeIssues\n  for (const issue of scanResult.issues) {\n    if (issue.severity === 'info') continue;\n\n    const elementLabel = extractLabel(issue.description);\n    const elementSelector = issue.element ?? elementLabel;\n\n    // Filter simulator chrome from description text\n    if (isSimulatorChrome(elementSelector, issue.description)) continue;\n\n    // Determine issue type from description for dedup\n    const issueType = issue.description.includes('touch target') || issue.description.includes('Touch target')\n      ? 'TOUCH_TARGET_SMALL'\n      : issue.description.includes('accessibility label') || issue.description.includes('aria-label')\n      ? 'MISSING_ARIA_LABEL'\n      : issue.category;\n\n    const key = dedupKey(elementLabel || elementSelector, issueType);\n    if (seen.has(key)) continue;\n    seen.add(key);\n\n    const bounds = boundsMap.get(elementLabel.toLowerCase())\n      ?? boundsMap.get(elementSelector.toLowerCase())\n      ?? { x: 0, y: 0, width: 0, height: 0 };\n    const region = bounds.x > 0 || bounds.y > 0\n      ? computeScreenRegion(bounds, viewport)\n      : 'unknown';\n    const correlation = correlationMap.get(elementLabel.toLowerCase())\n      ?? correlationMap.get(elementSelector.toLowerCase());\n\n    fixableIssues.push({\n      id: idCounter++,\n      category: issue.category === 'interactivity' ? 'touch-target' : issue.category,\n      severity: issue.severity,\n      what: issue.description,\n      where: { element: elementSelector, bounds, screenRegion: region },\n      current: issue.description,\n      required: issue.fix ?? buildSuggestedFix(issueType, elementLabel),\n      source: correlation ? {\n        file: correlation.sourceFile,\n        line: correlation.sourceLine,\n        confidence: correlation.confidence,\n        matchedOn: correlation.matchType,\n        searchPattern: buildSearchPattern(correlation, elementSelector, elementLabel),\n      } : undefined,\n      suggestedFix: issue.fix ?? buildSuggestedFix(issueType, elementLabel),\n    });\n  }\n\n  // Build summary\n  const uniqueFiles = new Set(\n    fixableIssues.filter(i => i.source).map(i => i.source!.file)\n  );\n  const fileCount = uniqueFiles.size;\n  const issueCount = fixableIssues.length;\n  const summary = issueCount === 0\n    ? 'No issues found'\n    : fileCount > 0\n    ? `${issueCount} issue${issueCount !== 1 ? 's' : ''} in ${fileCount} file${fileCount !== 1 ? 's' : ''}`\n    : `${issueCount} issue${issueCount !== 1 ? 's' : ''}`;\n\n  return {\n    screenshot: annotatedScreenshot ?? scanResult.screenshotPath ?? '',\n    screenshotRaw: scanResult.screenshotPath ?? '',\n    issues: fixableIssues,\n    summary,\n  };\n}\n"]}