{"version":3,"file":"automation-listener-DwmwxTwV.cjs","sources":["../../lib/vowel/components/shaders/MeshGradient.tsx","../../lib/vowel/components/ControlledBanner.tsx","../../lib/vowel/platforms/generic/sitemap.ts","../../lib/vowel/platforms/generic/routes.ts","../../lib/vowel/components/web-components/ControlledBannerWebComponent.tsx","../../lib/vowel/components/web-components/FloatingMicButtonWebComponent.tsx","../../lib/vowel/platforms/generic/navigation-listener.ts","../../lib/vowel/platforms/generic/automation-listener.ts"],"sourcesContent":["/**\n * MeshGradient Component\n * \n * Extracted from @paper-design/shaders-react v0.0.61\n * License: https://github.com/paper-design/shaders/blob/main/LICENSE\n * \n * This is a self-contained implementation to avoid the 1MB+ dependency.\n * Only includes the MeshGradient shader that we actually use.\n */\n\nimport { useEffect, useRef, forwardRef, useState, memo, type CSSProperties } from 'react';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface MeshGradientProps {\n  // Shader-specific props\n  speed?: number;\n  frame?: number;\n  colors?: string[];\n  distortion?: number;\n  swirl?: number;\n  grainMixer?: number;\n  grainOverlay?: number;\n  \n  // Sizing props\n  fit?: 'cover' | 'contain' | 'fill' | 'none';\n  rotation?: number;\n  scale?: number;\n  originX?: number;\n  originY?: number;\n  offsetX?: number;\n  offsetY?: number;\n  worldWidth?: number;\n  worldHeight?: number;\n  \n  // HTML div props\n  style?: CSSProperties;\n  className?: string;\n  minPixelRatio?: number;\n  maxPixelCount?: number;\n}\n\ntype ShaderColor = [number, number, number, number];\n\nconst ShaderFitOptions = {\n  cover: 0,\n  contain: 1,\n  fill: 2,\n  none: 3\n};\n\n// ============================================================================\n// Shader Code\n// ============================================================================\n\nconst meshGradientFragmentShader = `#version 300 es\nprecision mediump float;\n\nuniform float u_time;\nuniform vec4 u_colors[10];\nuniform float u_colorsCount;\nuniform float u_distortion;\nuniform float u_swirl;\nuniform float u_grainMixer;\nuniform float u_grainOverlay;\n\n// Sizing uniforms\nuniform int u_fit;\nuniform float u_rotation;\nuniform float u_scale;\nuniform float u_offsetX;\nuniform float u_offsetY;\nuniform float u_originX;\nuniform float u_originY;\nuniform float u_worldWidth;\nuniform float u_worldHeight;\n\n// Sizing variables (calculated in vertex shader)\nin vec2 v_objectUV;\nin vec2 v_objectBoxSize;\n\nout vec4 fragColor;\n\n#define PI 3.14159265358979323846\n\nmat2 rotate(vec2 v, float a) {\n  float s = sin(a);\n  float c = cos(a);\n  mat2 m = mat2(c, -s, s, c);\n  return m;\n}\n\nfloat hash21(vec2 p) {\n  p = fract(p * vec2(234.34, 435.345));\n  p += dot(p, p + 34.23);\n  return fract(p.x * p.y);\n}\n\nfloat valueNoise(vec2 st) {\n  vec2 i = floor(st);\n  vec2 f = fract(st);\n  float a = hash21(i);\n  float b = hash21(i + vec2(1.0, 0.0));\n  float c = hash21(i + vec2(0.0, 1.0));\n  float d = hash21(i + vec2(1.0, 1.0));\n  vec2 u = f * f * (3.0 - 2.0 * f);\n  float x1 = mix(a, b, u.x);\n  float x2 = mix(c, d, u.x);\n  return mix(x1, x2, u.y);\n}\n\nfloat noise(vec2 n, vec2 seedOffset) {\n  return valueNoise(n + seedOffset);\n}\n\nvec2 getPosition(int i, float t) {\n  float a = float(i) * .37;\n  float b = .6 + fract(float(i) / 3.) * .9;\n  float c = .8 + fract(float(i + 1) / 4.);\n  float x = sin(t * b + a);\n  float y = cos(t * c + a * 1.5);\n  return .5 + .5 * vec2(x, y);\n}\n\nvoid main() {\n  vec2 shape_uv = v_objectUV;\n  shape_uv += .5;\n\n  vec2 grainUV = v_objectUV;\n  float grainUVRot = u_rotation * PI / 180.;\n  mat2 graphicRotation = mat2(cos(grainUVRot), sin(grainUVRot), -sin(grainUVRot), cos(grainUVRot));\n  vec2 graphicOffset = vec2(-u_offsetX, u_offsetY);\n  grainUV = transpose(graphicRotation) * grainUV;\n  grainUV *= u_scale;\n  grainUV *= .7;\n  grainUV -= graphicOffset;\n  grainUV *= v_objectBoxSize;\n  \n  float grain = noise(grainUV, vec2(0.));\n  float mixerGrain = .4 * u_grainMixer * (grain - .5);\n\n  const float firstFrameOffset = 41.5;\n  float t = .5 * (u_time + firstFrameOffset);\n\n  float radius = smoothstep(0., 1., length(shape_uv - .5));\n  float center = 1. - radius;\n  for (float i = 1.; i <= 2.; i++) {\n    shape_uv.x += u_distortion * center / i * sin(t + i * .4 * smoothstep(.0, 1., shape_uv.y)) * cos(.2 * t + i * 2.4 * smoothstep(.0, 1., shape_uv.y));\n    shape_uv.y += u_distortion * center / i * cos(t + i * 2. * smoothstep(.0, 1., shape_uv.x));\n  }\n\n  vec2 uvRotated = shape_uv;\n  uvRotated -= vec2(.5);\n  float angle = 3. * u_swirl * radius;\n  uvRotated = rotate(uvRotated, -angle);\n  uvRotated += vec2(.5);\n\n  vec3 color = vec3(0.);\n  float opacity = 0.;\n  float totalWeight = 0.;\n\n  for (int i = 0; i < 10; i++) {\n    if (i >= int(u_colorsCount)) break;\n    vec2 pos = getPosition(i, t) + mixerGrain;\n    vec3 colorFraction = u_colors[i].rgb * u_colors[i].a;\n    float opacityFraction = u_colors[i].a;\n    float dist = length(uvRotated - pos);\n    dist = pow(dist, 3.5);\n    float weight = 1. / (dist + 1e-3);\n    color += colorFraction * weight;\n    opacity += opacityFraction * weight;\n    totalWeight += weight;\n  }\n\n  color /= max(1e-4, totalWeight);\n  opacity /= max(1e-4, totalWeight);\n\n  float rr = noise(rotate(grainUV, 1.), vec2(3.));\n  float gg = noise(rotate(grainUV, 2.) + 10., vec2(-1.));\n  float bb = noise(grainUV - 2., vec2(5.));\n  vec3 grainColor = vec3(rr, gg, bb);\n  color = mix(color, grainColor, .01 + .3 * u_grainOverlay);\n  \n  fragColor = vec4(color, opacity);\n}\n`;\n\nconst vertexShader = `#version 300 es\nprecision mediump float;\n\nin vec2 position;\n\n// Sizing uniforms\nuniform int u_fit;\nuniform float u_rotation;\nuniform float u_scale;\nuniform float u_offsetX;\nuniform float u_offsetY;\nuniform float u_originX;\nuniform float u_originY;\nuniform float u_worldWidth;\nuniform float u_worldHeight;\nuniform vec2 u_resolution;\n\n// Output to fragment shader\nout vec2 v_objectUV;\nout vec2 v_objectBoxSize;\n\nvoid main() {\n  gl_Position = vec4(position, 0.0, 1.0);\n  \n  // Calculate aspect ratios\n  float canvasAspect = u_resolution.x / u_resolution.y;\n  float worldAspect = u_worldWidth / u_worldHeight;\n  \n  vec2 scale = vec2(1.0);\n  if (u_fit == 0) { // cover\n    scale = canvasAspect > worldAspect \n      ? vec2(1.0, worldAspect / canvasAspect)\n      : vec2(canvasAspect / worldAspect, 1.0);\n  } else if (u_fit == 1) { // contain\n    scale = canvasAspect > worldAspect\n      ? vec2(canvasAspect / worldAspect, 1.0)\n      : vec2(1.0, worldAspect / canvasAspect);\n  }\n  \n  // Apply transformations\n  vec2 uv = position;\n  uv *= scale * u_scale;\n  \n  // Apply rotation\n  float rot = u_rotation * 3.14159265 / 180.0;\n  mat2 rotMat = mat2(cos(rot), sin(rot), -sin(rot), cos(rot));\n  uv = rotMat * uv;\n  \n  // Apply offset\n  uv += vec2(u_offsetX, -u_offsetY);\n  \n  v_objectUV = uv;\n  v_objectBoxSize = u_resolution / vec2(u_worldWidth, u_worldHeight);\n}\n`;\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction getShaderColorFromString(colorString: string): ShaderColor {\n  // Parse hex color to RGBA\n  const hex = colorString.replace('#', '');\n  const r = parseInt(hex.substring(0, 2), 16) / 255;\n  const g = parseInt(hex.substring(2, 4), 16) / 255;\n  const b = parseInt(hex.substring(4, 6), 16) / 255;\n  const a = hex.length === 8 ? parseInt(hex.substring(6, 8), 16) / 255 : 1;\n  return [r, g, b, a];\n}\n\n// ============================================================================\n// WebGL Shader Mount\n// ============================================================================\n\nclass ShaderMountVanilla {\n  private canvas: HTMLCanvasElement;\n  private gl: WebGL2RenderingContext;\n  private program: WebGLProgram;\n  private uniformLocations: Map<string, WebGLUniformLocation> = new Map();\n  private startTime: number = Date.now();\n  private animationId: number | null = null;\n  private uniforms: Record<string, any>;\n  private speed: number;\n  private frame: number;\n\n  constructor(\n    container: HTMLElement,\n    fragmentShader: string,\n    uniforms: Record<string, any>,\n    speed: number = 0,\n    frame: number = 0\n  ) {\n    this.canvas = document.createElement('canvas');\n    this.canvas.style.width = '100%';\n    this.canvas.style.height = '100%';\n    this.canvas.style.display = 'block';\n    container.appendChild(this.canvas);\n\n    const gl = this.canvas.getContext('webgl2', {\n      alpha: true,\n      premultipliedAlpha: true,\n    });\n    \n    if (!gl) throw new Error('WebGL2 not supported');\n    this.gl = gl;\n\n    this.uniforms = uniforms;\n    this.speed = speed;\n    this.frame = frame;\n\n    // Compile shaders\n    const program = this.createProgram(vertexShader, fragmentShader);\n    if (!program) throw new Error('Failed to create shader program');\n    this.program = program;\n\n    // Setup geometry\n    this.setupGeometry();\n    \n    // Start render loop\n    this.resize();\n    this.render();\n    \n    // Handle resize\n    window.addEventListener('resize', () => this.resize());\n  }\n\n  private createShader(type: number, source: string): WebGLShader | null {\n    const shader = this.gl.createShader(type);\n    if (!shader) return null;\n    \n    this.gl.shaderSource(shader, source);\n    this.gl.compileShader(shader);\n    \n    if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) {\n      console.error('Shader compile error:', this.gl.getShaderInfoLog(shader));\n      this.gl.deleteShader(shader);\n      return null;\n    }\n    \n    return shader;\n  }\n\n  private createProgram(vertSource: string, fragSource: string): WebGLProgram | null {\n    const vertShader = this.createShader(this.gl.VERTEX_SHADER, vertSource);\n    const fragShader = this.createShader(this.gl.FRAGMENT_SHADER, fragSource);\n    \n    if (!vertShader || !fragShader) return null;\n    \n    const program = this.gl.createProgram();\n    if (!program) return null;\n    \n    this.gl.attachShader(program, vertShader);\n    this.gl.attachShader(program, fragShader);\n    this.gl.linkProgram(program);\n    \n    if (!this.gl.getProgramParameter(program, this.gl.LINK_STATUS)) {\n      console.error('Program link error:', this.gl.getProgramInfoLog(program));\n      return null;\n    }\n    \n    return program;\n  }\n\n  private setupGeometry() {\n    const positions = new Float32Array([\n      -1, -1,\n       1, -1,\n      -1,  1,\n       1,  1,\n    ]);\n    \n    const buffer = this.gl.createBuffer();\n    this.gl.bindBuffer(this.gl.ARRAY_BUFFER, buffer);\n    this.gl.bufferData(this.gl.ARRAY_BUFFER, positions, this.gl.STATIC_DRAW);\n    \n    const positionLoc = this.gl.getAttribLocation(this.program, 'position');\n    this.gl.enableVertexAttribArray(positionLoc);\n    this.gl.vertexAttribPointer(positionLoc, 2, this.gl.FLOAT, false, 0, 0);\n  }\n\n  private getUniformLocation(name: string): WebGLUniformLocation | null {\n    if (this.uniformLocations.has(name)) {\n      return this.uniformLocations.get(name)!;\n    }\n    const loc = this.gl.getUniformLocation(this.program, name);\n    if (loc) {\n      this.uniformLocations.set(name, loc);\n    }\n    return loc;\n  }\n\n  private resize() {\n    const dpr = window.devicePixelRatio || 1;\n    const rect = this.canvas.getBoundingClientRect();\n    this.canvas.width = rect.width * dpr;\n    this.canvas.height = rect.height * dpr;\n    this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n  }\n\n  private render = () => {\n    const time = this.frame + (this.speed * (Date.now() - this.startTime) / 1000);\n    \n    this.gl.useProgram(this.program);\n    \n    // Set time uniform\n    const timeLoc = this.getUniformLocation('u_time');\n    if (timeLoc) this.gl.uniform1f(timeLoc, time);\n    \n    // Set resolution uniform\n    const resLoc = this.getUniformLocation('u_resolution');\n    if (resLoc) this.gl.uniform2f(resLoc, this.canvas.width, this.canvas.height);\n    \n    // Set custom uniforms\n    for (const [name, value] of Object.entries(this.uniforms)) {\n      const loc = this.getUniformLocation(name);\n      if (!loc) continue;\n      \n      if (Array.isArray(value)) {\n        if (Array.isArray(value[0])) {\n          // Array of vec4\n          const flat = value.flat();\n          this.gl.uniform4fv(loc, flat);\n        } else {\n          this.gl.uniform4fv(loc, value);\n        }\n      } else if (typeof value === 'number') {\n        this.gl.uniform1f(loc, value);\n      }\n    }\n    \n    // Draw\n    this.gl.clearColor(0, 0, 0, 0);\n    this.gl.clear(this.gl.COLOR_BUFFER_BIT);\n    this.gl.drawArrays(this.gl.TRIANGLE_STRIP, 0, 4);\n    \n    this.animationId = requestAnimationFrame(this.render);\n  };\n\n  public destroy() {\n    if (this.animationId) {\n      cancelAnimationFrame(this.animationId);\n    }\n    this.gl.deleteProgram(this.program);\n    this.canvas.remove();\n  }\n\n  public setUniforms(uniforms: Record<string, any>) {\n    this.uniforms = uniforms;\n  }\n}\n\n// ============================================================================\n// React Component\n// ============================================================================\n\nconst MeshGradientImpl = forwardRef<HTMLDivElement, MeshGradientProps>(\n  function MeshGradientComponent({\n    // Shader props\n    speed = 1,\n    frame = 0,\n    colors = [\"#e0eaff\", \"#241d9a\", \"#f75092\", \"#9f50d3\"],\n    distortion = 0.8,\n    swirl = 0.1,\n    grainMixer = 0,\n    grainOverlay = 0,\n    \n    // Sizing props\n    fit = 'cover',\n    rotation = 0,\n    scale = 1,\n    originX = 0.5,\n    originY = 0.5,\n    offsetX = 0,\n    offsetY = 0,\n    worldWidth = 1920,\n    worldHeight = 1080,\n    \n    // HTML props\n    style,\n    className,\n    ...props\n  }, ref) {\n    const divRef = useRef<HTMLDivElement>(null);\n    const shaderMountRef = useRef<ShaderMountVanilla | null>(null);\n    const [isInitialized, setIsInitialized] = useState(false);\n\n    useEffect(() => {\n      if (!divRef.current || shaderMountRef.current) return;\n\n      const uniforms = {\n        u_colors: colors.map(getShaderColorFromString),\n        u_colorsCount: colors.length,\n        u_distortion: distortion,\n        u_swirl: swirl,\n        u_grainMixer: grainMixer,\n        u_grainOverlay: grainOverlay,\n        u_fit: ShaderFitOptions[fit],\n        u_rotation: rotation,\n        u_scale: scale,\n        u_offsetX: offsetX,\n        u_offsetY: offsetY,\n        u_originX: originX,\n        u_originY: originY,\n        u_worldWidth: worldWidth,\n        u_worldHeight: worldHeight,\n      };\n\n      shaderMountRef.current = new ShaderMountVanilla(\n        divRef.current,\n        meshGradientFragmentShader,\n        uniforms,\n        speed,\n        frame\n      );\n      setIsInitialized(true);\n\n      return () => {\n        shaderMountRef.current?.destroy();\n        shaderMountRef.current = null;\n      };\n    }, []);\n\n    // Update uniforms when props change\n    useEffect(() => {\n      if (!isInitialized || !shaderMountRef.current) return;\n\n      const uniforms = {\n        u_colors: colors.map(getShaderColorFromString),\n        u_colorsCount: colors.length,\n        u_distortion: distortion,\n        u_swirl: swirl,\n        u_grainMixer: grainMixer,\n        u_grainOverlay: grainOverlay,\n        u_fit: ShaderFitOptions[fit],\n        u_rotation: rotation,\n        u_scale: scale,\n        u_offsetX: offsetX,\n        u_offsetY: offsetY,\n        u_originX: originX,\n        u_originY: originY,\n        u_worldWidth: worldWidth,\n        u_worldHeight: worldHeight,\n      };\n\n      shaderMountRef.current.setUniforms(uniforms);\n    }, [isInitialized, colors, distortion, swirl, grainMixer, grainOverlay, fit, rotation, scale, offsetX, offsetY, originX, originY, worldWidth, worldHeight]);\n\n    return (\n      <div\n        ref={(node) => {\n          (divRef as any).current = node;\n          if (typeof ref === 'function') ref(node);\n          else if (ref) ref.current = node;\n        }}\n        style={{\n          position: 'absolute',\n          inset: 0,\n          overflow: 'hidden',\n          ...style,\n        }}\n        className={className}\n        {...props}\n      />\n    );\n  }\n);\n\n// Memoize to prevent unnecessary re-renders\nexport const MeshGradient = memo(MeshGradientImpl, (prevProps, nextProps) => {\n  // Custom comparison for color arrays\n  if (prevProps.colors && nextProps.colors) {\n    if (prevProps.colors.length !== nextProps.colors.length) return false;\n    if (prevProps.colors.some((c, i) => c !== nextProps.colors![i])) return false;\n  }\n  \n  // Compare other props\n  return (\n    prevProps.speed === nextProps.speed &&\n    prevProps.frame === nextProps.frame &&\n    prevProps.distortion === nextProps.distortion &&\n    prevProps.swirl === nextProps.swirl &&\n    prevProps.grainMixer === nextProps.grainMixer &&\n    prevProps.grainOverlay === nextProps.grainOverlay &&\n    prevProps.fit === nextProps.fit &&\n    prevProps.rotation === nextProps.rotation &&\n    prevProps.scale === nextProps.scale\n  );\n});\n\nMeshGradient.displayName = 'MeshGradient';\n\n","/**\n * @fileoverview Controlled Banner Component\n * \n * A banner displayed at the top of controlled tabs to indicate they are being\n * controlled by the Vowel voice agent. Features Paper Design mesh gradient background.\n * \n * @module @vowel.to/client/components\n * @author vowel.to\n * @license Proprietary\n */\n\nimport { useEffect, useState } from 'react';\nimport { MeshGradient } from './shaders/MeshGradient';\n\n/**\n * Voice session state (for color changes)\n */\nexport interface VoiceSessionState {\n  /** Whether voice session is connected */\n  isConnected?: boolean;\n  \n  /** Whether voice session is connecting */\n  isConnecting?: boolean;\n  \n  /** Whether user is speaking */\n  isUserSpeaking?: boolean;\n  \n  /** Whether AI is speaking */\n  isAiSpeaking?: boolean;\n  \n  /** Whether AI is thinking */\n  isAiThinking?: boolean;\n  \n  /** Whether AI is executing a tool */\n  isToolExecuting?: boolean;\n  \n  /** Whether session is resuming */\n  isResuming?: boolean;\n}\n\n/**\n * ControlledBanner component props\n */\nexport interface ControlledBannerProps extends VoiceSessionState {\n  /** Custom className */\n  className?: string;\n  \n  /** Z-index for positioning */\n  zIndex?: number;\n  \n  /** Whether to add body padding (to prevent content from being hidden behind banner) */\n  addBodyPadding?: boolean;\n  \n  /** Mesh gradient colors (optional override - auto-selected based on state if not provided) */\n  gradientColors?: string[];\n  \n  /** Gradient distortion (default: 0.8) */\n  distortion?: number;\n  \n  /** Gradient swirl effect (default: 0.1) */\n  swirl?: number;\n  \n  /** Animation speed (default: 1) */\n  speed?: number;\n  \n  /** Banner height (default: \"48px\") */\n  height?: string;\n}\n\n/**\n * ControlledBanner Component\n * \n * Displays a banner at the top of the page to indicate it's controlled by Vowel.\n * Uses Paper Design mesh gradient for the background.\n * \n * @example\n * ```tsx\n * <ControlledBanner />\n * ```\n */\nexport function ControlledBanner({\n  isConnected = false,\n  isConnecting = false,\n  isUserSpeaking = false,\n  isAiSpeaking = false,\n  isAiThinking = false,\n  isToolExecuting = false,\n  isResuming = false,\n  className = '',\n  zIndex = 999999,\n  addBodyPadding = true,\n  gradientColors,\n  distortion = 0.8,\n  swirl = 0.1,\n  speed = 1,\n  height = '48px',\n}: ControlledBannerProps) {\n  // Determine banner state (same priority as button)\n  const getBannerState = () => {\n    if (isResuming) return 'resuming';\n    if (isConnecting) return 'connecting';\n    if (isAiSpeaking) return 'ai-speaking';\n    if (isToolExecuting) return 'tool-executing';\n    if (isAiThinking) return 'ai-thinking';\n    if (isUserSpeaking) return 'user-speaking';\n    if (isConnected) return 'connected';\n    return 'disconnected';\n  };\n\n  const bannerState = getBannerState();\n\n  // Get gradient colors based on state (slightly different from button colors)\n  const getStateColors = (): string[] => {\n    // If colors explicitly provided, use those\n    if (gradientColors) return gradientColors;\n    \n    switch (bannerState) {\n      case 'resuming':\n        return ['#14b8a6', '#06b6d4', '#3b82f6', '#8b5cf6']; // teal-cyan-blue-violet\n      case 'connecting':\n        return ['#f59e0b', '#eab308', '#fbbf24', '#fcd34d']; // amber-yellow spectrum\n      case 'user-speaking':\n        return ['#0ea5e9', '#38bdf8', '#7dd3fc', '#bae6fd']; // sky-blue lighter\n      case 'ai-thinking':\n        return ['#f97316', '#fb923c', '#fdba74', '#fed7aa']; // orange-amber warm\n      case 'ai-speaking':\n        return ['#8b5cf6', '#a78bfa', '#c084fc', '#d8b4fe']; // violet-purple softer\n      case 'connected':\n        return ['#10b981', '#14b8a6', '#06b6d4', '#22d3ee']; // emerald-teal-cyan\n      default:\n        return ['#64748b', '#6366f1', '#8b5cf6', '#a78bfa']; // slate-indigo\n    }\n  };\n\n  const activeColors = getStateColors();\n  // Track window dimensions for MeshGradient\n  const [dimensions, setDimensions] = useState({\n    width: typeof window !== 'undefined' ? window.innerWidth : 1920,\n    height: 48, // Banner height in pixels\n  });\n  \n  // Update dimensions on window resize\n  useEffect(() => {\n    if (typeof window === 'undefined') return;\n    \n    const handleResize = () => {\n      setDimensions({\n        width: window.innerWidth,\n        height: 48,\n      });\n    };\n    \n    window.addEventListener('resize', handleResize);\n    return () => window.removeEventListener('resize', handleResize);\n  }, []);\n  \n  return (\n    <>\n      {/* Add custom styles for body padding */}\n      {addBodyPadding && (\n        <style>\n          {`body { padding-top: ${height} !important; }`}\n        </style>\n      )}\n      \n      <div\n        className={className}\n        style={{\n          position: 'fixed',\n          top: 0,\n          left: 0,\n          right: 0,\n          height,\n          zIndex,\n          overflow: 'hidden',\n        }}\n      >\n        {/* Mesh Gradient Background */}\n        <div\n          style={{\n            position: 'absolute',\n            top: 0,\n            left: 0,\n            width: '100%',\n            height: '100%',\n            zIndex: 0,\n          }}\n        >\n          <MeshGradient\n            // @ts-ignore - MeshGradient is not typed correctly\n            width={dimensions.width}\n            height={dimensions.height}\n            colors={activeColors}\n            distortion={distortion}\n            swirl={swirl}\n            grainMixer={0}\n            grainOverlay={0}\n            speed={speed}\n          />\n        </div>\n        \n        {/* Banner Text */}\n        <div\n          style={{\n            position: 'relative',\n            zIndex: 1,\n            height: '100%',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n            color: 'rgba(255, 255, 255, 0.95)',\n            textShadow: '0 2px 4px rgba(0, 0, 0, 0.3)',\n            fontFamily: 'system-ui, -apple-system, sans-serif',\n            fontSize: '0.875rem',\n            letterSpacing: '0.02em',\n          }}\n        >\n          <span style={{ fontWeight: 400 }}>controlled by </span>\n          <span style={{ fontWeight: 700, marginLeft: '0.3em' }}>vowel</span>\n        </div>\n      </div>\n    </>\n  );\n}\n\n","/**\n * Shopify Sitemap Parser\n * Client-side sitemap.xml parser for discovering store routes\n * Handles both sitemap indexes and direct URL sets\n */\n\n/**\n * Sitemap data structure\n */\nexport interface SitemapData {\n  type: \"index\" | \"urlset\";\n  sitemaps?: SitemapEntry[];\n  urls?: UrlEntry[];\n}\n\n/**\n * Sitemap entry (for indexes)\n */\nexport interface SitemapEntry {\n  url: string;\n  lastModified?: Date;\n  type: \"sitemap\";\n}\n\n/**\n * URL entry (for URL sets)\n */\nexport interface UrlEntry {\n  url: string;\n  lastModified?: Date;\n  priority?: number;\n}\n\n/**\n * Cache entry structure\n */\ninterface CacheEntry {\n  data: SitemapData;\n  timestamp: number;\n}\n\n/**\n * Sitemap parser for Shopify stores\n * Parses sitemap.xml to discover all public routes\n * \n * @example\n * ```ts\n * const parser = new SitemapParser();\n * const sitemapData = await parser.parseSitemap('https://mystore.com');\n * console.log('Found URLs:', sitemapData.urls);\n * ```\n */\nexport class SitemapParser {\n  private cache: Map<string, CacheEntry>;\n  private readonly CACHE_DURATION = 15 * 60 * 1000; // 15 minutes\n\n  constructor() {\n    this.cache = new Map();\n  }\n\n  /**\n   * Parse sitemap for a given store\n   * Automatically handles sitemap indexes and URL sets\n   * Results are cached for 15 minutes\n   * \n   * @param urlOrBaseUrl - Complete sitemap URL or store base URL (e.g., \"https://store.com/sitemap.xml\" or \"https://store.com\")\n   * @returns Parsed sitemap data\n   */\n  async parseSitemap(urlOrBaseUrl: string): Promise<SitemapData> {\n    // Determine if this is a complete sitemap URL or just a base URL\n    const sitemapUrl = this.normalizeSitemapUrl(urlOrBaseUrl);\n    const cacheKey = sitemapUrl;\n\n    // Check cache first\n    const cached = this.cache.get(cacheKey);\n    if (cached && Date.now() - cached.timestamp < this.CACHE_DURATION) {\n      console.log(\"📋 Using cached sitemap data\");\n      return cached.data;\n    }\n\n    try {\n      console.log(\"🔍 Fetching sitemap from:\", sitemapUrl);\n      const response = await fetch(sitemapUrl, {\n        method: \"GET\",\n        headers: {\n          Accept: \"application/xml, text/xml, */*\",\n        },\n      });\n\n      if (!response.ok) {\n        throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n      }\n\n      const xmlText = await response.text();\n      const sitemapData = this.parseXML(xmlText);\n\n      // Cache successful result\n      this.cache.set(cacheKey, {\n        data: sitemapData,\n        timestamp: Date.now(),\n      });\n\n      console.log(\"✅ Sitemap parsed successfully\");\n      return sitemapData;\n    } catch (error) {\n      console.error(\"❌ Sitemap parsing failed:\", error);\n      throw new Error(\n        `Sitemap fetch failed: ${error instanceof Error ? error.message : String(error)}`\n      );\n    }\n  }\n\n  /**\n   * Normalize sitemap URL - handles both complete URLs and base URLs\n   * \n   * @param urlOrBaseUrl - Complete sitemap URL or store base URL\n   * @returns Normalized sitemap URL\n   */\n  private normalizeSitemapUrl(urlOrBaseUrl: string): string {\n    try {\n      const url = new URL(urlOrBaseUrl);\n      \n      // If the URL already points to an XML file, use it as-is\n      // This handles child sitemaps like /sitemap_products_1.xml?from=...&to=...\n      if (url.pathname.endsWith('.xml')) {\n        return urlOrBaseUrl;\n      }\n      \n      // Otherwise, append /sitemap.xml to the base URL\n      // Remove trailing slash if present\n      const baseUrl = urlOrBaseUrl.replace(/\\/$/, '');\n      return `${baseUrl}/sitemap.xml`;\n    } catch {\n      // If URL parsing fails, assume it's a base URL and append /sitemap.xml\n      const baseUrl = urlOrBaseUrl.replace(/\\/$/, '');\n      return `${baseUrl}/sitemap.xml`;\n    }\n  }\n\n  /**\n   * Parse XML text into structured data\n   * Handles both sitemap indexes and URL sets\n   * \n   * @param xmlText - Raw XML content\n   * @returns Parsed sitemap data\n   */\n  private parseXML(xmlText: string): SitemapData {\n    const parser = new DOMParser();\n    const xmlDoc = parser.parseFromString(xmlText, \"text/xml\");\n\n    // Check for parsing errors\n    const parserError = xmlDoc.querySelector(\"parsererror\");\n    if (parserError) {\n      throw new Error(`XML parsing error: ${parserError.textContent}`);\n    }\n\n    const root = xmlDoc.documentElement;\n\n    if (root.tagName === \"sitemapindex\") {\n      return this.parseSitemapIndex(xmlDoc);\n    } else if (root.tagName === \"urlset\") {\n      return this.parseUrlset(xmlDoc);\n    } else {\n      throw new Error(`Unexpected root element: ${root.tagName}`);\n    }\n  }\n\n  /**\n   * Parse sitemap index (contains links to child sitemaps)\n   * \n   * @param xmlDoc - Parsed XML document\n   * @returns Index data with child sitemap references\n   */\n  private parseSitemapIndex(xmlDoc: Document): SitemapData {\n    const sitemaps: SitemapEntry[] = [];\n    const sitemapElements = xmlDoc.querySelectorAll(\"sitemap\");\n\n    sitemapElements.forEach((sitemap) => {\n      const loc = sitemap.querySelector(\"loc\")?.textContent;\n      const lastmod = sitemap.querySelector(\"lastmod\")?.textContent;\n\n      if (loc) {\n        // DOMParser automatically decodes HTML entities (&amp; -> &)\n        // but we'll trim whitespace to be safe\n        sitemaps.push({\n          url: loc.trim(),\n          lastModified: lastmod ? new Date(lastmod) : undefined,\n          type: \"sitemap\",\n        });\n      }\n    });\n\n    return { type: \"index\", sitemaps };\n  }\n\n  /**\n   * Parse URL set (direct list of URLs)\n   * \n   * @param xmlDoc - Parsed XML document\n   * @returns URL set data with all URLs\n   */\n  private parseUrlset(xmlDoc: Document): SitemapData {\n    const urls: UrlEntry[] = [];\n    const urlElements = xmlDoc.querySelectorAll(\"url\");\n\n    urlElements.forEach((url) => {\n      const loc = url.querySelector(\"loc\")?.textContent;\n      const lastmod = url.querySelector(\"lastmod\")?.textContent;\n      const priority = url.querySelector(\"priority\")?.textContent;\n\n      if (loc) {\n        // DOMParser automatically decodes HTML entities (&amp; -> &)\n        // but we'll trim whitespace to be safe\n        urls.push({\n          url: loc.trim(),\n          lastModified: lastmod ? new Date(lastmod) : undefined,\n          priority: priority ? parseFloat(priority) : undefined,\n        });\n      }\n    });\n\n    return { type: \"urlset\", urls };\n  }\n\n  /**\n   * Get cache statistics for debugging\n   * \n   * @returns Cache statistics\n   */\n  getCacheStats(): { size: number; entries: string[] } {\n    return {\n      size: this.cache.size,\n      entries: Array.from(this.cache.keys()),\n    };\n  }\n\n  /**\n   * Clear the sitemap cache\n   * Useful for forcing a refresh of sitemap data\n   */\n  clearCache(): void {\n    this.cache.clear();\n    console.log(\"🧹 Sitemap cache cleared\");\n  }\n}\n\n","/**\n * Generic Route Generator\n * Generates voice-friendly routes from sitemap data\n * Platform-agnostic base that can be extended for specific platforms\n */\n\nimport type { VowelRoute } from \"../../types\";\nimport { SitemapParser, type SitemapData, type UrlEntry } from \"./sitemap\";\n\n/**\n * URL category information\n */\nexport interface UrlCategory {\n  type: string;\n  category: string;\n  description: string;\n  priority: string;\n}\n\n/**\n * URL categorizer interface\n * Implement this to provide platform-specific URL categorization\n */\nexport interface IUrlCategorizer {\n  categorizeUrl(url: string): UrlCategory;\n}\n\n/**\n * Generic route generator\n * Converts sitemap data into voice-navigable routes with natural language descriptions\n * \n * @example\n * ```ts\n * const generator = new GenericRouteGenerator();\n * const routes = await generator.generateRoutes('https://example.com');\n * console.log(`Generated ${routes.length} routes`);\n * ```\n */\nexport class GenericRouteGenerator {\n  protected parser: SitemapParser;\n  protected categorizer: IUrlCategorizer;\n\n  constructor(categorizer?: IUrlCategorizer) {\n    this.parser = new SitemapParser();\n    this.categorizer = categorizer || new GenericUrlCategorizer();\n  }\n\n  /**\n   * Generate routes from sitemap\n   * Automatically discovers, categorizes, and prioritizes routes\n   * \n   * @param baseUrl - Base URL (e.g., \"https://example.com\")\n   * @returns Array of voice-friendly routes\n   */\n  async generateRoutes(baseUrl: string): Promise<VowelRoute[]> {\n    // Get hardcoded routes (can be overridden by subclasses)\n    const hardcodedRoutes = this.getHardcodedRoutes();\n    \n    try {\n      const sitemapData = await this.parser.parseSitemap(baseUrl);\n      const discoveredRoutes = await this.processSitemapData(sitemapData, baseUrl);\n      \n      // Combine hardcoded routes with discovered routes\n      return [...hardcodedRoutes, ...discoveredRoutes];\n    } catch (error) {\n      console.error(\"Route generation failed:\", error);\n      \n      // Return hardcoded + fallback routes\n      return [...hardcodedRoutes, ...this.getFallbackRoutes()];\n    }\n  }\n\n  /**\n   * Process sitemap data into routes\n   * Handles both sitemap indexes and direct URL sets\n   * Fault-tolerant: continues processing even if individual child sitemaps fail\n   * \n   * @param sitemapData - Parsed sitemap data\n   * @param baseUrl - Base URL\n   * @returns Generated routes\n   */\n  protected async processSitemapData(\n    sitemapData: SitemapData,\n    baseUrl: string\n  ): Promise<VowelRoute[]> {\n    const routes: VowelRoute[] = [];\n\n    if (sitemapData.type === \"index\") {\n      // Process sitemap index - fetch child sitemaps\n      if (sitemapData.sitemaps && sitemapData.sitemaps.length > 0) {\n        console.log(`📚 Processing ${sitemapData.sitemaps.length} child sitemaps...`);\n        \n        let successCount = 0;\n        let failCount = 0;\n\n        for (const sitemap of sitemapData.sitemaps) {\n          try {\n            console.log(`🔗 Fetching child sitemap: ${sitemap.url}`);\n            const childSitemapData = await this.parser.parseSitemap(\n              sitemap.url\n            );\n            if (childSitemapData.type === \"urlset\" && childSitemapData.urls) {\n              const childRoutes = this.processUrlset(\n                childSitemapData.urls,\n                baseUrl\n              );\n              routes.push(...childRoutes);\n              successCount++;\n              console.log(`✅ Processed ${childRoutes.length} routes from ${sitemap.url}`);\n            } else {\n              console.warn(`⚠️ Unexpected sitemap type for ${sitemap.url}: ${childSitemapData.type}`);\n            }\n          } catch (error) {\n            failCount++;\n            console.warn(\n              `⚠️ Failed to process child sitemap ${sitemap.url}:`,\n              error instanceof Error ? error.message : String(error)\n            );\n            // Continue processing other sitemaps - fault-tolerant behavior\n          }\n        }\n\n        console.log(\n          `📊 Sitemap processing complete: ${successCount} succeeded, ${failCount} failed, ${routes.length} total routes`\n        );\n      }\n    } else if (sitemapData.type === \"urlset\" && sitemapData.urls) {\n      // Process direct URL set\n      try {\n        const urlsetRoutes = this.processUrlset(sitemapData.urls, baseUrl);\n        routes.push(...urlsetRoutes);\n        console.log(`✅ Processed ${urlsetRoutes.length} routes from direct URL set`);\n      } catch (error) {\n        console.error(\"❌ Failed to process URL set:\", error);\n        // Don't throw - return empty routes and let fallback handle it\n      }\n    }\n\n    // If no routes were found, log a warning\n    if (routes.length === 0) {\n      console.warn(\"⚠️ No routes were extracted from sitemap data\");\n    }\n\n    // Sort by priority and limit results for performance\n    return routes\n      .sort((a, b) => this.comparePriority(a, b))\n      .slice(0, 200); // Limit to prevent performance issues\n  }\n\n  /**\n   * Process URL set into categorized routes\n   * Converts raw URLs into voice-friendly routes with descriptions\n   * Fault-tolerant: skips malformed URLs and continues processing\n   * \n   * @param urls - URLs from sitemap\n   * @param baseUrl - Base URL\n   * @returns Categorized routes\n   */\n  protected processUrlset(urls: UrlEntry[], baseUrl: string): VowelRoute[] {\n    const routes: VowelRoute[] = [];\n    \n    for (const url of urls) {\n      try {\n        const category = this.categorizer.categorizeUrl(url.url);\n        const relativePath = this.getRelativePath(url.url, baseUrl);\n\n        // Build metadata object with only defined values\n        const metadata: Record<string, any> = {\n          type: category.type,\n          category: category.category,\n          priority: category.priority,\n          originalUrl: url.url,\n        };\n        \n        // Only include optional fields if they have values\n        if (url.priority !== undefined) {\n          metadata.sitemapPriority = url.priority;\n        }\n\n        routes.push({\n          path: relativePath,\n          description: category.description,\n          metadata,\n        });\n      } catch (error) {\n        console.warn(\n          `⚠️ Failed to process URL ${url.url}:`,\n          error instanceof Error ? error.message : String(error)\n        );\n        // Skip this URL and continue with others - fault-tolerant behavior\n      }\n    }\n    \n    return routes;\n  }\n\n  /**\n   * Convert absolute URL to relative path\n   * \n   * @param absoluteUrl - Absolute URL\n   * @param baseUrl - Base URL to remove\n   * @returns Relative path\n   */\n  protected getRelativePath(absoluteUrl: string, baseUrl: string): string {\n    try {\n      return new URL(absoluteUrl).pathname;\n    } catch {\n      return absoluteUrl.replace(baseUrl, \"\");\n    }\n  }\n\n  /**\n   * Compare route priorities for sorting\n   * \n   * @param a - First route\n   * @param b - Second route\n   * @returns Comparison result\n   */\n  protected comparePriority(a: VowelRoute, b: VowelRoute): number {\n    const priorityOrder: Record<string, number> = {\n      highest: 4,\n      high: 3,\n      medium: 2,\n      low: 1,\n    };\n    const aPriority = priorityOrder[a.metadata?.priority || \"low\"] || 0;\n    const bPriority = priorityOrder[b.metadata?.priority || \"low\"] || 0;\n    return bPriority - aPriority;\n  }\n\n  /**\n   * Get hardcoded routes that should always be available\n   * Override in subclasses to provide platform-specific hardcoded routes\n   * \n   * @returns Hardcoded routes\n   */\n  protected getHardcodedRoutes(): VowelRoute[] {\n    return [];\n  }\n\n  /**\n   * Get fallback routes when sitemap parsing fails\n   * Override in subclasses to provide platform-specific fallback routes\n   * \n   * @returns Basic fallback routes\n   */\n  protected getFallbackRoutes(): VowelRoute[] {\n    return [\n      {\n        path: \"/\",\n        description: \"Homepage\",\n        metadata: { type: \"home\", priority: \"highest\" },\n      },\n    ];\n  }\n}\n\n/**\n * Generic URL categorizer\n * Provides basic categorization for common URL patterns\n * Extend this class to add platform-specific categorization\n */\nexport class GenericUrlCategorizer implements IUrlCategorizer {\n  /**\n   * Categorize a URL based on its path pattern\n   * Recognizes common URL patterns and generates natural descriptions\n   * Fault-tolerant: handles malformed URLs gracefully\n   * \n   * @param url - URL to categorize\n   * @returns Category information with type, description, and priority\n   */\n  categorizeUrl(url: string): UrlCategory {\n    let pathname: string;\n    \n    try {\n      pathname = new URL(url).pathname;\n    } catch (error) {\n      console.warn(`⚠️ Failed to parse URL ${url}, treating as pathname`);\n      // If URL parsing fails, treat the input as a pathname directly\n      pathname = url.startsWith('/') ? url : `/${url}`;\n    }\n\n    // Common pages that exist on most websites\n    const commonPages = this.getCommonPages();\n    if (commonPages[pathname]) {\n      return {\n        type: commonPages[pathname].type,\n        category: commonPages[pathname].type,\n        description: commonPages[pathname].description,\n        priority: commonPages[pathname].priority,\n      };\n    }\n\n    // Blog patterns\n    if (pathname.match(/^\\/blog\\/?/) || pathname.match(/^\\/posts?\\//)) {\n      return {\n        type: \"blog\",\n        category: \"content\",\n        description: this.extractBlogDescription(pathname),\n        priority: \"medium\",\n      };\n    }\n\n    // About/Contact/Static pages\n    if (pathname.match(/^\\/(about|contact|privacy|terms|faq)/)) {\n      return {\n        type: \"page\",\n        category: \"info\",\n        description: this.extractPageDescription(pathname),\n        priority: \"medium\",\n      };\n    }\n\n    // Default categorization\n    return {\n      type: \"other\",\n      category: \"other\",\n      description: `Navigate to ${pathname}`,\n      priority: \"low\",\n    };\n  }\n\n  /**\n   * Get common pages mapping\n   * Override in subclasses to add platform-specific pages\n   * \n   * @returns Common pages mapping\n   */\n  protected getCommonPages(): Record<string, { type: string; description: string; priority: string }> {\n    return {\n      \"/\": { type: \"home\", description: \"Homepage\", priority: \"highest\" },\n      \"/about\": { type: \"about\", description: \"About page\", priority: \"medium\" },\n      \"/contact\": { type: \"contact\", description: \"Contact page\", priority: \"medium\" },\n      \"/blog\": { type: \"blog\", description: \"Blog\", priority: \"high\" },\n      \"/search\": { type: \"search\", description: \"Search\", priority: \"medium\" },\n    };\n  }\n\n  /**\n   * Extract page description from URL path\n   * Converts path to human-readable format\n   * \n   * @param pathname - URL path\n   * @returns Human-readable description\n   */\n  protected extractPageDescription(pathname: string): string {\n    const parts = pathname.split(\"/\").filter(Boolean);\n    const lastPart = parts[parts.length - 1] || \"page\";\n    return `${lastPart.replace(/-/g, \" \")} page`;\n  }\n\n  /**\n   * Extract blog description from URL path\n   * Converts path to human-readable format\n   * \n   * @param pathname - URL path\n   * @returns Human-readable description\n   */\n  protected extractBlogDescription(pathname: string): string {\n    const parts = pathname.split(\"/\").filter(Boolean);\n    if (parts.length > 1) {\n      const postSlug = parts[parts.length - 1];\n      return `${postSlug.replace(/-/g, \" \")} blog post`;\n    }\n    return \"Blog\";\n  }\n}\n\n","/**\n * @fileoverview ControlledBanner Web Component Wrapper\n * \n * Exports the ControlledBanner as a web component using r2wc.\n * Registers as <vowel-controlled-banner> custom element.\n * \n * Displays a top banner with mesh gradient background.\n * \n * @module @vowel.to/client/components/web-components\n * @author vowel.to\n * @license Proprietary\n */\n\nimport { ControlledBanner } from \"../ControlledBanner\";\n\nlet ControlledBannerWebComponent: CustomElementConstructor | undefined;\n\nasync function getControlledBannerWebComponent(): Promise<CustomElementConstructor> {\n  if (!ControlledBannerWebComponent) {\n    const { default: r2wc } = await import(\"@r2wc/react-to-web-component\");\n    ControlledBannerWebComponent = r2wc(ControlledBanner, {\n      props: {\n        isConnected: \"boolean\",\n        isConnecting: \"boolean\",\n        isUserSpeaking: \"boolean\",\n        isAiSpeaking: \"boolean\",\n        isAiThinking: \"boolean\",\n        isToolExecuting: \"boolean\",\n        isResuming: \"boolean\",\n        className: \"string\",\n        zIndex: \"number\",\n        addBodyPadding: \"boolean\",\n        gradientColors: \"json\",\n        distortion: \"number\",\n        swirl: \"number\",\n        speed: \"number\",\n        height: \"string\",\n      },\n    });\n  }\n  return ControlledBannerWebComponent;\n}\n\nexport function registerControlledBannerWebComponent() {\n  if (typeof window === \"undefined\" || !window.customElements) {\n    console.warn(\n      \"⚠️ [ControlledBannerWebComponent] Window or customElements not available\"\n    );\n    return;\n  }\n\n  if (!window.customElements.get(\"vowel-controlled-banner\")) {\n    console.log(\"🎨 [ControlledBannerWebComponent] Registering custom element...\");\n    getControlledBannerWebComponent().then((wc) => {\n      window.customElements.define(\"vowel-controlled-banner\", wc);\n      console.log(\"✅ [ControlledBannerWebComponent] Custom element registered\");\n    });\n  } else {\n    console.log(\"⏭️ [ControlledBannerWebComponent] Already registered\");\n  }\n}\n\nif (typeof window !== \"undefined\") {\n  registerControlledBannerWebComponent();\n}\n","/**\n * @fileoverview FloatingMicButton Web Component Wrapper\n * \n * Exports the FloatingMicButton as a web component using r2wc.\n * Registers as <vowel-floating-mic-button> custom element.\n * \n * @module @vowel.to/client/components/web-components\n * @author vowel.to\n * @license Proprietary\n */\n\nimport { FloatingMicButton } from \"../FloatingMicButton\";\n\nlet FloatingMicButtonWebComponent: CustomElementConstructor | undefined;\n\nasync function getFloatingMicButtonWebComponent(): Promise<CustomElementConstructor> {\n  if (!FloatingMicButtonWebComponent) {\n    const { default: r2wc } = await import(\"@r2wc/react-to-web-component\");\n    FloatingMicButtonWebComponent = r2wc(FloatingMicButton, {\n      props: {\n        isConnected: \"boolean\",\n        isConnecting: \"boolean\",\n        isDisconnecting: \"boolean\",\n        isUserSpeaking: \"boolean\",\n        isAiSpeaking: \"boolean\",\n        isAiThinking: \"boolean\",\n        isToolExecuting: \"boolean\",\n        isResuming: \"boolean\",\n        className: \"string\",\n        position: \"string\",\n        zIndex: \"number\",\n        title: \"string\",\n        inline: \"boolean\",\n        showActionIcon: \"boolean\",\n      },\n    });\n  }\n  return FloatingMicButtonWebComponent;\n}\n\nexport function registerFloatingMicButtonWebComponent() {\n  if (typeof window === \"undefined\" || !window.customElements) {\n    console.warn(\n      \"⚠️ [FloatingMicButtonWebComponent] Window or customElements not available\"\n    );\n    return;\n  }\n\n  if (!window.customElements.get(\"vowel-floating-mic-button\")) {\n    console.log(\"🎤 [FloatingMicButtonWebComponent] Registering custom element...\");\n    getFloatingMicButtonWebComponent().then((wc) => {\n      window.customElements.define(\"vowel-floating-mic-button\", wc);\n      console.log(\"✅ [FloatingMicButtonWebComponent] Custom element registered\");\n    });\n  } else {\n    console.log(\"⏭️ [FloatingMicButtonWebComponent] Already registered\");\n  }\n}\n\nif (typeof window !== \"undefined\") {\n  registerFloatingMicButtonWebComponent();\n}\n","/**\n * Vowel Navigation Tab Listener\n * This script should be included in Shopify theme to handle cross-tab messages\n * Listens for messages from the main tab (with voice agent) and performs actions\n * \n * Includes DOM snapshot and manipulation capabilities for AI-driven interactions\n * \n * Usage in Shopify theme.liquid:\n * ```html\n * <script src=\"https://assets.codetek.us/apps/vowel/vowel-navigation-listener.js\"></script>\n * ```\n */\n\nimport { DOMManipulator } from './dom-tools';\nimport { FuzzyDOMSearcher } from './dom-search';\nimport { registerControlledBannerWebComponent } from '../../components/web-components/ControlledBannerWebComponent';\nimport { registerFloatingMicButtonWebComponent } from '../../components/web-components/FloatingMicButtonWebComponent';\n\n\n/**\n * Current voice session state (updated via messages from main tab)\n */\nlet currentVoiceState = {\n  isConnected: false,\n  isConnecting: false,\n  isUserSpeaking: false,\n  isAISpeaking: false,\n  isAIThinking: false,\n  isResuming: false\n};\n\n/**\n * Create and show the \"Controlled by Vowel\" banner\n * Called when ping is received (confirms this tab is controlled)\n */\nfunction showControlledBanner(): void {\n  console.log('🎨 [NavigationListener] Showing controlled banner...');\n  \n  // Check if banner already exists\n  if (document.getElementById('vowel-control-banner')) {\n    console.log('   ℹ️  Banner already exists, skipping');\n    return;\n  }\n\n  // Ensure web component is registered\n  registerControlledBannerWebComponent();\n\n  // Create the banner web component\n  const banner = document.createElement('vowel-controlled-banner') as HTMLElement;\n  banner.id = 'vowel-control-banner';\n  \n  // Set initial state - use kebab-case for HTML attributes\n  banner.setAttribute('is-connected', String(currentVoiceState.isConnected));\n  banner.setAttribute('is-connecting', String(currentVoiceState.isConnecting));\n  banner.setAttribute('is-user-speaking', String(currentVoiceState.isUserSpeaking));\n  banner.setAttribute('is-ai-speaking', String(currentVoiceState.isAISpeaking));\n  banner.setAttribute('is-ai-thinking', String(currentVoiceState.isAIThinking));\n  banner.setAttribute('is-resuming', String(currentVoiceState.isResuming));\n\n  // Insert banner at top of body\n  if (document.body) {\n    document.body.insertBefore(banner, document.body.firstChild);\n    console.log('✅ [NavigationListener] Vowel control banner displayed (web component)');\n  } else {\n    console.warn('⚠️ [NavigationListener] document.body not ready, deferring banner');\n    // Wait for DOM to be ready\n    document.addEventListener('DOMContentLoaded', () => {\n      if (document.body && !document.getElementById('vowel-control-banner')) {\n        document.body.insertBefore(banner, document.body.firstChild);\n        console.log('✅ [NavigationListener] Vowel control banner displayed (deferred, web component)');\n      }\n    });\n  }\n}\n\n/**\n * Create and show the floating microphone button (mimics main tab's floating button)\n */\nfunction showFloatingMicButton(): void {\n  console.log('🎤 [NavigationListener] Creating floating microphone button...');\n  \n  // Check if button already exists\n  if (document.getElementById('vowel-floating-mic')) {\n    console.log('   ℹ️  Floating mic button already exists, skipping');\n    return;\n  }\n\n  // Ensure web component is registered\n  registerFloatingMicButtonWebComponent();\n\n  // Create the floating mic button web component\n  const floatingButton = document.createElement('vowel-floating-mic-button') as HTMLElement;\n  floatingButton.id = 'vowel-floating-mic';\n  \n  // Set initial state - use kebab-case for HTML attributes\n  floatingButton.setAttribute('is-connected', String(currentVoiceState.isConnected));\n  floatingButton.setAttribute('is-connecting', String(currentVoiceState.isConnecting));\n  floatingButton.setAttribute('is-user-speaking', String(currentVoiceState.isUserSpeaking));\n  floatingButton.setAttribute('is-ai-speaking', String(currentVoiceState.isAISpeaking));\n  floatingButton.setAttribute('is-ai-thinking', String(currentVoiceState.isAIThinking));\n  floatingButton.setAttribute('is-resuming', String(currentVoiceState.isResuming));\n\n  // Insert floating button\n  if (document.body) {\n    document.body.appendChild(floatingButton);\n    console.log('✅ [NavigationListener] Floating microphone button displayed (web component)');\n    \n    // Setup button click handler\n    setupMicrophoneButton();\n  } else {\n    console.warn('⚠️ [NavigationListener] document.body not ready, deferring floating button');\n    // Wait for DOM to be ready\n    document.addEventListener('DOMContentLoaded', () => {\n      if (document.body && !document.getElementById('vowel-floating-mic')) {\n        document.body.appendChild(floatingButton);\n        console.log('✅ [NavigationListener] Floating microphone button displayed (deferred, web component)');\n        setupMicrophoneButton();\n      }\n    });\n  }\n}\n\n/**\n * Setup microphone button click handler and request initial state\n */\nfunction setupMicrophoneButton(): void {\n  const floatingButton = document.getElementById('vowel-floating-mic');\n  if (!floatingButton) return;\n  \n  floatingButton.addEventListener('click', () => {\n    console.log('🎤 [NavigationListener] Microphone button clicked - stopping voice session and closing tab');\n    \n    // Send message to main tab to stop voice session\n    const channel = new BroadcastChannel('vowel-navigation');\n    channel.postMessage({\n      type: 'stopVoiceSession',\n      timestamp: Date.now()\n    });\n    \n    console.log('✅ [NavigationListener] Stop voice session message sent to main tab');\n    console.log('🚪 [NavigationListener] Closing controlled tab...');\n    \n    // Close this tab after a short delay to ensure message is sent\n    setTimeout(() => {\n      window.close();\n    }, 100);\n  });\n  \n  // Request current voice state from main tab\n  console.log('🎤 [NavigationListener] Requesting current voice state from main tab...');\n  const channel = new BroadcastChannel('vowel-navigation');\n  channel.postMessage({\n    type: 'requestVoiceState',\n    timestamp: Date.now()\n  });\n  \n  console.log('✅ [NavigationListener] Microphone button setup complete');\n}\n\n/**\n * Update microphone button and banner visual state\n */\nfunction updateMicrophoneButtonState(state: typeof currentVoiceState): void {\n  const floatingButton = document.getElementById('vowel-floating-mic');\n  const banner = document.getElementById('vowel-control-banner');\n  \n  if (!floatingButton) {\n    console.warn('⚠️ [NavigationListener] Button element not found - cannot update state');\n    return;\n  }\n  \n  // Update global state\n  currentVoiceState = { ...state };\n  \n  // Update floating button web component attributes\n  // IMPORTANT: Use kebab-case for HTML attributes - r2wc converts them to camelCase props\n  floatingButton.setAttribute('is-connected', String(state.isConnected));\n  floatingButton.setAttribute('is-connecting', String(state.isConnecting));\n  floatingButton.setAttribute('is-user-speaking', String(state.isUserSpeaking));\n  floatingButton.setAttribute('is-ai-speaking', String(state.isAISpeaking));\n  floatingButton.setAttribute('is-ai-thinking', String(state.isAIThinking));\n  floatingButton.setAttribute('is-resuming', String(state.isResuming));\n  \n  // Update banner web component attributes (if it exists)\n  if (banner) {\n    banner.setAttribute('is-connected', String(state.isConnected));\n    banner.setAttribute('is-connecting', String(state.isConnecting));\n    banner.setAttribute('is-user-speaking', String(state.isUserSpeaking));\n    banner.setAttribute('is-ai-speaking', String(state.isAISpeaking));\n    banner.setAttribute('is-ai-thinking', String(state.isAIThinking));\n    banner.setAttribute('is-resuming', String(state.isResuming));\n  }\n  \n  // Log the actual attribute values set on the elements\n  console.log('🎨 [NavigationListener] Microphone button and banner state updated:', {\n    state: {\n      isConnected: state.isConnected,\n      isConnecting: state.isConnecting,\n      isUserSpeaking: state.isUserSpeaking,\n      isAISpeaking: state.isAISpeaking,\n      isAIThinking: state.isAIThinking,\n      isResuming: state.isResuming\n    },\n    actualAttributes: {\n      'is-connected': floatingButton.getAttribute('is-connected'),\n      'is-connecting': floatingButton.getAttribute('is-connecting'),\n      'is-user-speaking': floatingButton.getAttribute('is-user-speaking'),\n      'is-ai-speaking': floatingButton.getAttribute('is-ai-speaking'),\n      'is-ai-thinking': floatingButton.getAttribute('is-ai-thinking'),\n      'is-resuming': floatingButton.getAttribute('is-resuming')\n    }\n  });\n  \n  // Highlight when AI starts speaking\n  if (state.isAISpeaking) {\n    console.log('🔊 [NavigationListener] AI IS SPEAKING - button should show purple!');\n  }\n}\n\n// Guard against double initialization\nlet isInitialized = false;\n\n// DOM tools instances (created once per page load)\nlet fuzzySearcher: FuzzyDOMSearcher | null = null;\nlet domManipulator: DOMManipulator | null = null;\n\n/**\n * Initialize navigation tab listener\n * Sets up BroadcastChannel to receive messages from main tab\n * Banner is shown when ping/ack handshake occurs\n * \n * NOTE: This listener is initialized on EVERY page load, even after navigation\n * because location.href causes a full page reload\n */\nexport function initializeNavigationListener(): void {\n  // Prevent double initialization\n  if (isInitialized) {\n    console.log('⚠️ [NavigationListener] Already initialized, skipping...');\n    return;\n  }\n  \n  console.log('🚀 [NavigationListener] Initializing...');\n  \n  if (typeof window === 'undefined' || !window.BroadcastChannel) {\n    console.error('❌ [NavigationListener] BroadcastChannel not supported - cross-tab features unavailable');\n    return;\n  }\n\n  isInitialized = true;\n  const channel = new BroadcastChannel('vowel-navigation');\n  \n  // Initialize DOM tools with new spoken ID system\n  fuzzySearcher = new FuzzyDOMSearcher();\n  domManipulator = new DOMManipulator({\n    getElementById: (id: string) => fuzzySearcher?.getElementById(id) || null\n  });\n  \n  console.log('✅ [NavigationListener] BroadcastChannel connected on channel \"vowel-navigation\"');\n  console.log('   👂 Listening for messages from main tab...');\n  console.log('   🔄 Listener will reinitialize on each page navigation');\n  console.log('   🔍 Smart DOM search initialized with spoken-word IDs (e.g., \"apple_banana\")');\n\n  // Check if this is a controlled tab (opened by Vowel)\n  // Controlled tabs have the query parameter 'vowel_controlled=true'\n  const urlParams = new URLSearchParams(window.location.search);\n  const hasControlledParam = urlParams.get('vowel_controlled') === 'true';\n  const hasControlledWindowName = typeof window !== 'undefined' && \n                       window.name && \n                       window.name.startsWith('vowel-content-');\n  \n  console.log('🔍 [NavigationListener] Checking if tab is controlled...');\n  console.log('   🔖 Query param vowel_controlled:', hasControlledParam ? '✅ true' : '❌ not set');\n  console.log('   📛 Window name:', window.name || '(not set)');\n  console.log('   🎯 Window name matches:', hasControlledWindowName ? '✅ yes' : '❌ no');\n  \n  // Consider it controlled if either the query param is set OR the window name matches\n  const isControlled = hasControlledParam || hasControlledWindowName;\n  \n  if (isControlled) {\n    console.log('✅ [NavigationListener] This IS a Vowel-controlled tab');\n    console.log('   🔑 Detected via:', hasControlledParam ? 'query parameter' : 'window name');\n    console.log('   📍 Current URL:', window.location.href);\n    \n    // Mark as controlled in sessionStorage for other scripts\n    sessionStorage.setItem('vowel-controlled', 'true');\n    console.log('   💾 Saved to sessionStorage: vowel-controlled=true');\n    \n    // Send init message to main tab to announce ourselves\n    console.log('   📤 Preparing to send init message to main tab...');\n    const initTimestamp = Date.now();\n    const initMessage = {\n      type: 'init',\n      windowName: window.name || 'unknown',\n      url: window.location.href,\n      timestamp: initTimestamp,\n      requestTimestamp: initTimestamp,\n      detectedVia: hasControlledParam ? 'query_param' : 'window_name'\n    };\n    \n    console.log('   📦 Init message payload:', JSON.stringify(initMessage, null, 2));\n    channel.postMessage(initMessage);\n    console.log('   ✅ Init message sent successfully');\n    console.log('   ⏳ Waiting for config response from main tab...');\n  } else {\n    console.log('ℹ️ [NavigationListener] NOT a controlled tab (normal browsing)');\n    console.log('   💡 To make this a controlled tab, add query param: ?vowel_controlled=true');\n  }\n\n  // Check if a voice agent tab is active\n  let hasVoiceAgent = false;\n  \n  window.addEventListener('load', () => {\n    // Broadcast to check if voice agent exists\n    channel.postMessage({ \n      type: 'check-agent',\n      timestamp: Date.now()\n    });\n    \n    // Wait for response\n    const checkHandler = (event: MessageEvent) => {\n      if (event.data.type === 'agent-exists') {\n        hasVoiceAgent = true;\n        console.log('✅ Voice agent tab is active');\n      }\n    };\n    \n    channel.addEventListener('message', checkHandler);\n    \n    // After timeout, check results\n    setTimeout(() => {\n      channel.removeEventListener('message', checkHandler);\n      if (!hasVoiceAgent && !isControlled) {\n        console.log('ℹ️ No voice agent detected - normal browsing mode');\n      }\n    }, 1000);\n  });\n\n  channel.onmessage = async (event: MessageEvent<any>) => {\n    const message = event.data;\n    console.log('📨 [NavigationListener] Received message from main tab:', message.type);\n\n    try {\n      // Handle config message from main tab\n      if (message.type === 'config') {\n        console.log('📦 [NavigationListener] Config message received from main tab');\n        console.log('   ⏱️  Request timestamp:', message.requestTimestamp);\n        console.log('   ⏱️  Response timestamp:', message.timestamp);\n        console.log('   ⚙️  Config version:', message.config?.version);\n        console.log('   ⚙️  Config features:', message.config?.features?.join(', '));\n        console.log('   📊 Full config:', JSON.stringify(message.config, null, 2));\n        \n        // Show \"Controlled by Vowel\" banner when we receive config\n        console.log('   🎨 Showing controlled banner...');\n        showControlledBanner();\n        \n        // Show floating microphone button\n        console.log('   🎤 Showing floating microphone button...');\n        showFloatingMicButton();\n        \n        // Send ack back to confirm we received the config\n        const ackMessage = {\n          type: 'ack',\n          originalType: 'config',\n          timestamp: Date.now(),\n          requestTimestamp: message.requestTimestamp || message.timestamp\n        };\n        \n        console.log('   📤 Preparing ack response...');\n        console.log('   📦 Ack payload:', JSON.stringify(ackMessage, null, 2));\n        channel.postMessage(ackMessage);\n        \n        console.log('✅ [NavigationListener] Ack sent successfully');\n        console.log('   🎨 Controlled banner should now be visible');\n        console.log('   🎤 Floating microphone button should now be visible');\n        console.log('   ✅ Handshake complete from controlled tab side');\n        console.log('   🎯 Tab is now fully configured and listening for commands');\n        return;\n      }\n      \n      // Handle voice state update from main tab\n      if (message.type === 'voiceStateUpdate') {\n        console.log('🎤 [NavigationListener] Voice state update received from main tab');\n        console.log('   📊 State:', JSON.stringify(message.state, null, 2));\n        \n        // Update the microphone button to mirror main tab state\n        updateMicrophoneButtonState(message.state);\n        return;\n      }\n\n      // Handle navigate messages with simplified format (from router.navigate())\n      if (message.type === 'navigate' && message.url) {\n        console.log('🧭 [NavigationListener] Navigation command received');\n        console.log('   📍 Target URL:', message.url);\n        console.log('   📍 Path:', message.path);\n        console.log('   ⏱️  Timestamp:', new Date(message.timestamp).toISOString());\n        \n        // Add vowel_controlled=true query param to preserve controlled status\n        const targetUrl = new URL(message.url);\n        if (!targetUrl.searchParams.has('vowel_controlled')) {\n          console.log('   🔖 Adding vowel_controlled=true query param to preserve controlled status');\n          targetUrl.searchParams.set('vowel_controlled', 'true');\n        } else {\n          console.log('   🔖 Query param vowel_controlled already present');\n        }\n        \n        const finalUrl = targetUrl.toString();\n        console.log('   🔗 Final URL with query param:', finalUrl);\n        console.log('   🔄 Executing navigation via location.href (page will reload)...');\n        \n        // Use location.href to navigate - this will cause a full page reload\n        // The navigation-listener will be re-initialized on the new page\n        window.location.href = finalUrl;\n        \n        console.log('✅ [NavigationListener] Navigation initiated');\n        return;\n      }\n\n      // Handle DOM search tool\n      if (message.type === 'searchElements') {\n        await handleSearchElements(message.payload, channel);\n        return;\n      }\n      \n      if (message.type === 'getPageSnapshot') {\n        await handleGetPageSnapshot(message.payload, channel);\n        return;\n      }\n      \n      if (message.type === 'clickElement') {\n        await handleClickElement(message.payload, channel);\n        return;\n      }\n      \n      if (message.type === 'typeIntoElement') {\n        await handleTypeIntoElement(message.payload, channel);\n        return;\n      }\n      \n      if (message.type === 'pressKey') {\n        await handlePressKey(message.payload, channel);\n        return;\n      }\n      \n      if (message.type === 'focusElement') {\n        await handleFocusElement(message.payload, channel);\n        return;\n      }\n      \n      if (message.type === 'scrollToElement') {\n        await handleScrollToElement(message.payload, channel);\n        return;\n      }\n\n      // Handle CrossTabMessage format (from CrossTabManager)\n      const payload = message.payload;\n      switch (message.type) {\n        case 'addToCart':\n          await handleAddToCart(payload);\n          break;\n        \n        case 'removeFromCart':\n          await handleRemoveFromCart(payload);\n          break;\n        \n        case 'updateQuantity':\n          await handleUpdateQuantity(payload);\n          break;\n        \n        case 'getContext':\n          await handleGetContext(payload, channel);\n          break;\n        \n        default:\n          console.log('ℹ️ Unhandled message type:', message.type);\n      }\n    } catch (error) {\n      console.error('❌ Error handling message:', error);\n    }\n  };\n}\n\n/**\n * Handle add to cart message\n */\nasync function handleAddToCart(payload: { productId: string; quantity: number }): Promise<void> {\n  const { productId, quantity } = payload;\n  console.log('🛒 Adding to cart:', productId, 'x', quantity);\n\n  try {\n    const response = await fetch('/cart/add.js', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({\n        id: productId,\n        quantity: quantity,\n      }),\n    });\n\n    if (!response.ok) {\n      throw new Error(`Failed to add to cart: ${response.statusText}`);\n    }\n\n    const result = await response.json();\n    console.log('✅ Added to cart successfully:', result);\n\n    // Update cart UI if available\n    updateCartIndicator();\n  } catch (error) {\n    console.error('❌ Failed to add to cart:', error);\n  }\n}\n\n/**\n * Handle remove from cart message\n */\nasync function handleRemoveFromCart(payload: { lineItemKey: string }): Promise<void> {\n  const { lineItemKey } = payload;\n  console.log('🗑️ Removing from cart:', lineItemKey);\n\n  try {\n    const response = await fetch('/cart/change.js', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({\n        id: lineItemKey,\n        quantity: 0,\n      }),\n    });\n\n    if (!response.ok) {\n      throw new Error(`Failed to remove from cart: ${response.statusText}`);\n    }\n\n    console.log('✅ Removed from cart successfully');\n    updateCartIndicator();\n  } catch (error) {\n    console.error('❌ Failed to remove from cart:', error);\n  }\n}\n\n/**\n * Handle update quantity message\n */\nasync function handleUpdateQuantity(payload: { lineItemKey: string; quantity: number }): Promise<void> {\n  const { lineItemKey, quantity } = payload;\n  console.log('🔢 Updating quantity:', lineItemKey, 'to', quantity);\n\n  try {\n    const response = await fetch('/cart/change.js', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({\n        id: lineItemKey,\n        quantity: quantity,\n      }),\n    });\n\n    if (!response.ok) {\n      throw new Error(`Failed to update quantity: ${response.statusText}`);\n    }\n\n    console.log('✅ Updated quantity successfully');\n    updateCartIndicator();\n  } catch (error) {\n    console.error('❌ Failed to update quantity:', error);\n  }\n}\n\n\n/**\n * Handle get context message (send back page context to main tab)\n */\nasync function handleGetContext(payload: any, channel: BroadcastChannel): Promise<void> {\n  console.log('📄 [NavigationListener] Getting page context');\n  console.log('   📦 Request payload:', payload);\n\n  try {\n    const pageType = getPageType();\n    console.log('   📄 Page type:', pageType);\n    \n    // Extract page context\n    const products = extractProducts();\n    const collections = extractCollections();\n    \n    const context = {\n      url: window.location.href,\n      pathname: window.location.pathname,\n      title: document.title,\n      type: pageType,\n      products: products,\n      collections: collections,\n    };\n\n    console.log('   📊 Context extracted:');\n    console.log('      - URL:', context.url);\n    console.log('      - Page type:', context.type);\n    console.log('      - Products found:', context.products.length);\n    console.log('      - Collections found:', context.collections.length);\n\n    // Send response back\n    const response = {\n      type: 'contextResponse',\n      payload: context,\n      timestamp: Date.now(),\n      messageId: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n    };\n\n    channel.postMessage(response);\n\n    console.log('✅ [NavigationListener] Sent context response with', products.length, 'products');\n  } catch (error) {\n    console.error('❌ [NavigationListener] Failed to get context:', error);\n  }\n}\n\n/**\n * Determine page type based on URL and content\n */\nfunction getPageType(): string {\n  const pathname = window.location.pathname;\n  \n  if (pathname === '/' || pathname === '/index') {\n    return 'home';\n  } else if (pathname.startsWith('/products/')) {\n    return 'product';\n  } else if (pathname.startsWith('/collections/')) {\n    return 'collection';\n  } else if (pathname.startsWith('/cart')) {\n    return 'cart';\n  } else if (pathname.startsWith('/pages/')) {\n    return 'page';\n  } else {\n    return 'other';\n  }\n}\n\n/**\n * Extract product information from page\n * Enhanced to extract product handles and URLs for navigation\n */\nfunction extractProducts(): Array<{ id: string; title: string; price?: string; handle?: string; url?: string; image?: string }> {\n  const products: Array<{ id: string; title: string; price?: string; handle?: string; url?: string; image?: string }> = [];\n  console.log('🔍 [NavigationListener] Extracting products from page...');\n  \n  // Try various selectors for product cards/links\n  const selectors = [\n    'a[href*=\"/products/\"]', // Links to product pages\n    '[data-product-id]',\n    '.product-card',\n    '.product-item',\n    '.product',\n    '[data-product]'\n  ];\n  \n  const processedUrls = new Set<string>();\n  \n  for (const selector of selectors) {\n    const elements = document.querySelectorAll(selector);\n    console.log(`   🔎 Trying selector \"${selector}\": found ${elements.length} elements`);\n    \n    elements.forEach(element => {\n      try {\n        // Extract product URL and handle\n        let url = '';\n        let handle = '';\n        \n        if (element.tagName === 'A') {\n          url = element.getAttribute('href') || '';\n        } else {\n          const link = element.querySelector('a[href*=\"/products/\"]');\n          url = link?.getAttribute('href') || '';\n        }\n        \n        // Skip if we already processed this URL\n        if (url && processedUrls.has(url)) {\n          return;\n        }\n        \n        // Extract handle from URL\n        const handleMatch = url.match(/\\/products\\/([^?#]+)/);\n        if (handleMatch) {\n          handle = handleMatch[1];\n        }\n        \n        // Extract other product info\n      const id = element.getAttribute('data-product-id') || \n                  element.querySelector('[data-product-id]')?.getAttribute('data-product-id') ||\n                  handle;\n        \n        const title = element.querySelector('h1, h2, h3, h4, .product-title, [data-product-title], .title')?.textContent?.trim() ||\n                     element.querySelector('[class*=\"title\"]')?.textContent?.trim() ||\n                     element.textContent?.trim().split('\\n')[0]?.trim();\n        \n        const price = element.querySelector('.price, [data-price], [class*=\"price\"]')?.textContent?.trim();\n        \n        const img = element.querySelector('img');\n        const image = img?.src || img?.getAttribute('data-src') || undefined;\n        \n        if (id && title && handle) {\n          products.push({ \n            id, \n            title, \n            price,\n            handle,\n            url: url.startsWith('http') ? url : window.location.origin + url,\n            image\n          });\n          if (url) processedUrls.add(url);\n        }\n      } catch (error) {\n        console.warn('Failed to extract product from element:', error);\n      }\n    });\n    \n    if (products.length > 0) {\n      console.log(`   ✅ Extracted ${products.length} products`);\n      break;\n    }\n  }\n  \n  if (products.length === 0) {\n    console.warn('   ⚠️ No products found on page');\n  }\n  \n  return products;\n}\n\n/**\n * Extract collection information from page\n */\nfunction extractCollections(): Array<{ handle: string; title: string }> {\n  const collections: Array<{ handle: string; title: string }> = [];\n  \n  // Try to extract from collection links\n  const links = document.querySelectorAll('a[href*=\"/collections/\"]');\n  links.forEach(link => {\n    const href = link.getAttribute('href');\n    if (href) {\n      const match = href.match(/\\/collections\\/([^/?#]+)/);\n      if (match) {\n        const handle = match[1];\n        const title = link.textContent?.trim() || handle;\n        if (!collections.find(c => c.handle === handle)) {\n          collections.push({ handle, title });\n        }\n      }\n    }\n  });\n  \n  return collections;\n}\n\n/**\n * Update cart indicator (count bubble, etc.)\n */\nfunction updateCartIndicator(): void {\n  // Fetch current cart state\n  fetch('/cart.js')\n    .then(response => response.json())\n    .then(cart => {\n      const count = cart.item_count;\n      console.log('🛒 Cart count:', count);\n      \n      // Update cart count indicators (common selectors)\n      const indicators = document.querySelectorAll(\n        '.cart-count, [data-cart-count], #cart-count, .cart-item-count'\n      );\n      \n      indicators.forEach(indicator => {\n        indicator.textContent = String(count);\n        \n        // Show/hide based on count\n        if (count === 0) {\n          indicator.classList.add('hidden');\n        } else {\n          indicator.classList.remove('hidden');\n        }\n      });\n    })\n    .catch(error => {\n      console.error('❌ Failed to update cart indicator:', error);\n    });\n}\n\n/**\n * DOM Search Tool Handler - Smart Levenshtein search with spoken IDs\n */\n\n/**\n * Handle search elements by term\n * Uses Levenshtein distance to search across all element properties\n * Returns results with spoken-word IDs (e.g., \"apple_banana\")\n */\nasync function handleSearchElements(payload: any, channel: BroadcastChannel): Promise<void> {\n  console.log('🔍 [NavigationListener] Searching for elements');\n  console.log('   📦 Query:', payload.query);\n  console.log('   📦 Options:', payload.options);\n\n  try {\n    if (!fuzzySearcher) {\n      throw new Error('Fuzzy DOM searcher not initialized');\n    }\n\n    const results = fuzzySearcher.search(payload.query, payload.options || {});\n\n    // Log what we're sending back (first result)\n    if (results.elements.length > 0) {\n      console.log('   📤 Sending back first result:');\n      console.log('      ID:', results.elements[0].id);\n      console.log('      Tag:', results.elements[0].tag);\n      console.log('      Similarity:', results.elements[0].matchScore.toFixed(2));\n      console.log('      Matched:', `${results.elements[0].matchedField}=\"${results.elements[0].matchedValue}\"`);\n    }\n\n    // Send response back\n    channel.postMessage({\n      type: 'searchElementsResponse',\n      payload: results,\n      timestamp: Date.now(),\n      messageId: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n    });\n\n    console.log(`✅ [NavigationListener] Found ${results.elements.length} elements matching \"${payload.query}\"`);\n  } catch (error) {\n    console.error('❌ [NavigationListener] Failed to search elements:', error);\n    channel.postMessage({\n      type: 'searchElementsResponse',\n      payload: { error: error instanceof Error ? error.message : String(error) },\n      timestamp: Date.now(),\n    });\n  }\n}\n\n/**\n * Handle get page snapshot request\n * Returns compressed view of all interactive/visible elements\n */\nasync function handleGetPageSnapshot(_payload: any, channel: BroadcastChannel): Promise<void> {\n  console.log('📸 [NavigationListener] Get page snapshot request');\n\n  try {\n    if (!fuzzySearcher) {\n      throw new Error('Fuzzy DOM searcher not initialized');\n    }\n\n    const snapshot = fuzzySearcher.getCompressedPageSnapshot();\n    \n    // Count elements in snapshot (lines - header)\n    const lines = snapshot.split('\\n');\n    const elementCount = Math.max(0, lines.length - 1);\n\n    console.log(`✅ [NavigationListener] Generated snapshot with ${elementCount} elements`);\n\n    // Send response back\n    channel.postMessage({\n      type: 'pageSnapshotResponse',\n      payload: {\n        snapshot,\n        elementCount,\n        timestamp: Date.now()\n      },\n      timestamp: Date.now(),\n      messageId: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n    });\n\n    console.log('   📤 Snapshot sent to main tab');\n  } catch (error) {\n    console.error('❌ [NavigationListener] Failed to get page snapshot:', error);\n    channel.postMessage({\n      type: 'pageSnapshotResponse',\n      payload: { error: error instanceof Error ? error.message : String(error) },\n      timestamp: Date.now(),\n    });\n  }\n}\n\n/**\n * Handle click element request (by spoken ID)\n */\nasync function handleClickElement(payload: any, channel: BroadcastChannel): Promise<void> {\n  console.log('🖱️ [NavigationListener] Click element request:', payload.id);\n\n  try {\n    if (!domManipulator) {\n      throw new Error('DOM manipulator not initialized');\n    }\n\n    const result = await domManipulator.clickElement(payload);\n\n    channel.postMessage({\n      type: 'domActionResponse',\n      payload: result,\n      timestamp: Date.now(),\n    });\n\n    console.log('✅ [NavigationListener] Click result:', result.success);\n  } catch (error) {\n    console.error('❌ [NavigationListener] Click failed:', error);\n    channel.postMessage({\n      type: 'domActionResponse',\n      payload: { success: false, error: error instanceof Error ? error.message : String(error) },\n      timestamp: Date.now(),\n    });\n  }\n}\n\n/**\n * Handle type into element request (by spoken ID)\n */\nasync function handleTypeIntoElement(payload: any, channel: BroadcastChannel): Promise<void> {\n  console.log('⌨️ [NavigationListener] Type into element request:', payload.id);\n\n  try {\n    if (!domManipulator) {\n      throw new Error('DOM manipulator not initialized');\n    }\n\n    const result = await domManipulator.typeIntoElement(payload);\n\n    channel.postMessage({\n      type: 'domActionResponse',\n      payload: result,\n      timestamp: Date.now(),\n    });\n\n    console.log('✅ [NavigationListener] Type result:', result.success);\n  } catch (error) {\n    console.error('❌ [NavigationListener] Type failed:', error);\n    channel.postMessage({\n      type: 'domActionResponse',\n      payload: { success: false, error: error instanceof Error ? error.message : String(error) },\n      timestamp: Date.now(),\n    });\n  }\n}\n\n/**\n * Handle press key request\n */\nasync function handlePressKey(payload: any, channel: BroadcastChannel): Promise<void> {\n  console.log('⌨️ [NavigationListener] Press key request:', payload.key);\n\n  try {\n    if (!domManipulator) {\n      throw new Error('DOM manipulator not initialized');\n    }\n\n    const result = await domManipulator.pressKey(payload);\n\n    channel.postMessage({\n      type: 'domActionResponse',\n      payload: result,\n      timestamp: Date.now(),\n    });\n\n    console.log('✅ [NavigationListener] Press key result:', result.success);\n  } catch (error) {\n    console.error('❌ [NavigationListener] Press key failed:', error);\n    channel.postMessage({\n      type: 'domActionResponse',\n      payload: { success: false, error: error instanceof Error ? error.message : String(error) },\n      timestamp: Date.now(),\n    });\n  }\n}\n\n/**\n * Handle focus element request (by spoken ID)\n */\nasync function handleFocusElement(payload: any, channel: BroadcastChannel): Promise<void> {\n  console.log('🎯 [NavigationListener] Focus element request:', payload.id);\n\n  try {\n    if (!domManipulator) {\n      throw new Error('DOM manipulator not initialized');\n    }\n\n    const result = await domManipulator.focusElement(payload);\n\n    channel.postMessage({\n      type: 'domActionResponse',\n      payload: result,\n      timestamp: Date.now(),\n    });\n\n    console.log('✅ [NavigationListener] Focus result:', result.success);\n  } catch (error) {\n    console.error('❌ [NavigationListener] Focus failed:', error);\n    channel.postMessage({\n      type: 'domActionResponse',\n      payload: { success: false, error: error instanceof Error ? error.message : String(error) },\n      timestamp: Date.now(),\n    });\n  }\n}\n\n/**\n * Handle scroll to element request (by spoken ID)\n */\nasync function handleScrollToElement(payload: any, channel: BroadcastChannel): Promise<void> {\n  console.log('📜 [NavigationListener] Scroll to element request:', payload.id);\n\n  try {\n    if (!domManipulator) {\n      throw new Error('DOM manipulator not initialized');\n    }\n\n    const result = await domManipulator.scrollToElement(payload);\n\n    channel.postMessage({\n      type: 'domActionResponse',\n      payload: result,\n      timestamp: Date.now(),\n    });\n\n    console.log('✅ [NavigationListener] Scroll result:', result.success);\n  } catch (error) {\n    console.error('❌ [NavigationListener] Scroll failed:', error);\n    channel.postMessage({\n      type: 'domActionResponse',\n      payload: { success: false, error: error instanceof Error ? error.message : String(error) },\n      timestamp: Date.now(),\n    });\n  }\n}\n\n// Note: Auto-initialization removed. \n// The navigation listener is now explicitly initialized by VowelWebComponentWrapper\n// when it detects the tab is controlled (has ?vowel_controlled=true query param).\n// \n// For standalone usage (e.g., in Shopify themes without web component),\n// you must manually call initializeNavigationListener() in your theme code.\n\n","/**\n * @fileoverview Automation Listener for Controlled Tabs\n * \n * This listener runs in controlled tabs (e.g., product pages opened by voice agent)\n * and handles automation commands sent via BroadcastChannel.\n * \n * @module @vowel.to/client/platforms/generic/automation-listener\n * @author vowel.to\n * @license Proprietary\n */\n\nimport { createControlledAutomationListener } from '../../adapters/automation/controlled-automation-adapter';\n\n/**\n * Global flag to prevent duplicate initialization\n */\nlet isAutomationListenerInitialized = false;\n\n/**\n * Cleanup function for the automation listener\n */\nlet automationListenerCleanup: (() => void) | null = null;\n\n/**\n * Set the floating cursor manager for the automation listener\n * This should be called before initializing the listener.\n * Sets the manager on the window object so the listener can access it.\n */\nexport function setAutomationListenerCursorManager(manager: any): void {\n  (window as any).__vowelFloatingCursorManager = manager;\n  console.log('🎯 [AutomationListener] Floating cursor manager set on window');\n}\n\n/**\n * Initialize the automation listener for controlled tabs\n * \n * This function should be called automatically when a controlled tab is detected.\n * It sets up the automation listener to receive and execute DOM automation commands.\n * \n * @param channelName - Optional custom channel name (default: 'vowel-automation')\n * @returns Cleanup function to remove the listener\n * \n * @example\n * ```ts\n * // Automatically called when tab is detected as controlled\n * initializeAutomationListener();\n * \n * // Or with custom channel\n * initializeAutomationListener('vowel-shopify-automation');\n * ```\n */\nexport function initializeAutomationListener(channelName: string = 'vowel-automation'): () => void {\n  // Prevent duplicate initialization\n  if (isAutomationListenerInitialized) {\n    console.log('📡 [AutomationListener] Already initialized, skipping...');\n    return automationListenerCleanup || (() => {});\n  }\n\n  console.log('📡 [AutomationListener] Initializing for controlled tab...');\n  console.log(`   Channel: ${channelName}`);\n\n  try {\n    // Create the automation listener\n    const cleanup = createControlledAutomationListener(channelName);\n    \n    // Store cleanup function and set flag\n    automationListenerCleanup = cleanup;\n    isAutomationListenerInitialized = true;\n\n    console.log('✅ [AutomationListener] Automation listener ready');\n    console.log('   This tab can now receive automation commands');\n    \n    // Return cleanup function\n    return () => {\n      if (cleanup) {\n        cleanup();\n        isAutomationListenerInitialized = false;\n        automationListenerCleanup = null;\n        console.log('🧹 [AutomationListener] Cleaned up');\n      }\n    };\n  } catch (error) {\n    console.error('❌ [AutomationListener] Failed to initialize:', error);\n    return () => {};\n  }\n}\n\n/**\n * Check if this tab is controlled by a voice agent\n * \n * A controlled tab is one that was opened by the voice agent and should\n * listen for automation commands.\n * \n * Detection methods:\n * 1. URL parameter: ?vowel_controlled=true\n * 2. Session storage: vowel-controlled=true\n * 3. Window name: vowel-content-*\n * \n * @returns True if this tab is controlled\n */\nexport function isControlledTab(): boolean {\n  if (typeof window === 'undefined') {\n    return false;\n  }\n\n  // Check URL parameters\n  const urlParams = new URLSearchParams(window.location.search);\n  const hasControlledParam = urlParams.get('vowel_controlled') === 'true';\n\n  // Check session storage\n  const hasControlledSession = sessionStorage.getItem('vowel-controlled') === 'true';\n\n  // Check window name\n  const hasControlledWindowName = !!(window.name && window.name.startsWith('vowel-content-'));\n\n  return hasControlledParam || hasControlledSession || hasControlledWindowName;\n}\n\n/**\n * Auto-initialize automation listener if this is a controlled tab\n * \n * This function is called automatically when the module loads.\n * It detects if the current tab is controlled and initializes the listener.\n * \n * @param channelName - Optional custom channel name\n */\nexport function autoInitializeAutomationListener(channelName?: string): void {\n  if (typeof window === 'undefined') {\n    return;\n  }\n\n  // Wait for DOM to be ready\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', () => {\n      autoInitializeAutomationListener(channelName);\n    });\n    return;\n  }\n\n  // Check if this is a controlled tab\n  if (isControlledTab()) {\n    console.log('🎯 [AutomationListener] Controlled tab detected');\n    initializeAutomationListener(channelName);\n  }\n}\n\n// Auto-initialize when module loads (for automatic setup in controlled tabs)\nif (typeof window !== 'undefined') {\n  // Use setTimeout to ensure this runs after other initializations\n  setTimeout(() => {\n    autoInitializeAutomationListener();\n  }, 100);\n}\n\n"],"names":["forwardRef","useRef","useState","useEffect","jsx","memo","jsxs","Fragment","FloatingMicButton","channel","FuzzyDOMSearcher","DOMManipulator","createControlledAutomationListener"],"mappings":"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"}