{"version":3,"file":"controlled-automation-adapter-CH3rqZ44.cjs","sources":["../../lib/vowel/adapters/automation/controlled-automation-adapter.ts"],"sourcesContent":["/**\n * Controlled Automation Adapter\n * \n * For cross-tab DOM interaction in traditional sites (Shopify, WordPress, etc.)\n * Uses BroadcastChannel to communicate automation commands to controlled tabs.\n * \n * Architecture:\n * - Tab A (Voice Agent): Sends automation commands\n * - Tab B (Controlled): Receives commands and performs DOM actions\n * \n * @example\n * ```ts\n * // Voice agent tab\n * import { ControlledAutomationAdapter } from '@vowel.to/client/adapters/automation';\n * \n * const automationAdapter = new ControlledAutomationAdapter('vowel-automation');\n * \n * // Controlled tab (receives automation commands)\n * import { createControlledAutomationListener } from '@vowel.to/client/adapters/automation';\n * \n * createControlledAutomationListener('vowel-automation');\n * ```\n */\n\nimport type {\n  AutomationAdapter,\n  AutomationSearchOptions,\n  AutomationSearchResults,\n  AutomationActionResult\n} from '../../types';\nimport type { FloatingCursorManager } from '../../managers/FloatingCursorManager';\n\n/**\n * Automation command message types\n */\ntype AutomationMessageType =\n  | 'searchElements'\n  | 'getPageSnapshot'\n  | 'clickElement'\n  | 'typeIntoElement'\n  | 'focusElement'\n  | 'scrollToElement'\n  | 'pressKey';\n\n/**\n * Automation command message\n */\ninterface AutomationMessage {\n  type: AutomationMessageType;\n  payload: any;\n  messageId: string;\n  timestamp: number;\n}\n\n/**\n * Automation response message\n */\ninterface AutomationResponse {\n  type: string;\n  payload: any;\n  messageId: string;\n  timestamp: number;\n}\n\n/**\n * Pending request tracker\n */\ninterface PendingRequest {\n  resolve: (value: any) => void;\n  reject: (error: any) => void;\n  timeout: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Controlled Automation Adapter\n * \n * Handles cross-tab DOM interaction for traditional sites with page reloads.\n * Perfect for Shopify, WordPress, and other server-rendered platforms.\n */\nexport class ControlledAutomationAdapter implements AutomationAdapter {\n  private channel: BroadcastChannel;\n  private channelName: string;\n  private pendingRequests: Map<string, PendingRequest> = new Map();\n  private readonly REQUEST_TIMEOUT = 5000; // 5 seconds\n  // Note: Cursor manager is stored but not used in cross-tab automation\n  // It's here for API consistency with DirectAutomationAdapter\n  // @ts-ignore - Unused in cross-tab mode but kept for API consistency\n  private cursorManager?: FloatingCursorManager;\n\n  constructor(channelName: string = 'vowel-automation') {\n    this.channelName = channelName;\n    this.channel = new BroadcastChannel(channelName);\n\n    // Listen for responses\n    this.channel.onmessage = (event: MessageEvent<AutomationResponse>) => {\n      this.handleResponse(event.data);\n    };\n\n    console.log(`🤖 [ControlledAutomationAdapter] Initialized on channel: ${channelName}`);\n    console.log(`   Mode: Cross-tab automation (controlled tab mode)`);\n  }\n\n  /**\n   * Set floating cursor manager for visual feedback\n   * Note: Cursor feedback works in the same tab, not across tabs\n   */\n  public setFloatingCursorManager(manager: FloatingCursorManager): void {\n    this.cursorManager = manager;\n    console.log('🤖 [ControlledAutomationAdapter] Floating cursor manager attached');\n    console.log('   ⚠️  Note: Cursor feedback only works in this tab, not in controlled tabs');\n  }\n\n  /**\n   * Handle response from controlled tab\n   */\n  private handleResponse(response: AutomationResponse): void {\n    const { messageId, type, payload } = response;\n\n    if (!type.endsWith('Response')) {\n      return; // Not a response message\n    }\n\n    const pending = this.pendingRequests.get(messageId);\n    if (pending) {\n      clearTimeout(pending.timeout);\n      pending.resolve(payload);\n      this.pendingRequests.delete(messageId);\n    }\n  }\n\n  /**\n   * Send command to controlled tab and wait for response\n   */\n  private async sendCommand<T>(type: AutomationMessageType, payload: any): Promise<T> {\n    const messageId = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n    return new Promise((resolve, reject) => {\n      // Set timeout\n      const timeout = setTimeout(() => {\n        this.pendingRequests.delete(messageId);\n        reject(new Error(`Command timeout: ${type}`));\n      }, this.REQUEST_TIMEOUT);\n\n      // Store pending request\n      this.pendingRequests.set(messageId, { resolve, reject, timeout });\n\n      // Send message\n      const message: AutomationMessage = {\n        type,\n        payload,\n        messageId,\n        timestamp: Date.now()\n      };\n\n      this.channel.postMessage(message);\n\n      console.log(`🤖 [ControlledAutomationAdapter] Sent command: ${type} (${messageId})`);\n    });\n  }\n\n  /**\n   * Search for elements on the page\n   */\n  async searchElements(\n    query: string,\n    options?: AutomationSearchOptions\n  ): Promise<AutomationSearchResults> {\n    console.log(`🤖 [ControlledAutomationAdapter] Searching for: \"${query}\"`);\n    \n    try {\n      const results = await this.sendCommand<AutomationSearchResults>('searchElements', {\n        query,\n        options\n      });\n      \n      console.log(`   ✅ Found ${results.elements.length} elements`);\n      \n      return results;\n    } catch (error) {\n      console.error(`   ❌ Search failed:`, error);\n      throw error;\n    }\n  }\n\n  /**\n   * Get page snapshot\n   */\n  async getPageSnapshot(): Promise<string> {\n    console.log(`🤖 [ControlledAutomationAdapter] Getting page snapshot`);\n    \n    try {\n      const response = await this.sendCommand<{ snapshot: string }>('getPageSnapshot', {});\n      \n      console.log(`   ✅ Snapshot received`);\n      \n      return response.snapshot;\n    } catch (error) {\n      console.error(`   ❌ Snapshot failed:`, error);\n      throw error;\n    }\n  }\n\n  /**\n   * Click an element\n   */\n  async clickElement(id: string, reason?: string): Promise<AutomationActionResult> {\n    console.log(`🤖 [ControlledAutomationAdapter] Clicking element: ${id}`);\n    if (reason) {\n      console.log(`   📝 Reason: ${reason}`);\n    }\n    \n    try {\n      const result = await this.sendCommand<AutomationActionResult>('clickElement', { id, reason });\n      \n      if (result.success) {\n        console.log(`   ✅ Click successful`);\n      } else {\n        console.error(`   ❌ Click failed: ${result.error}`);\n      }\n      \n      return result;\n    } catch (error) {\n      console.error(`   ❌ Click error:`, error);\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : String(error)\n      };\n    }\n  }\n\n  /**\n   * Type text into an element\n   */\n  async typeIntoElement(id: string, text: string, reason?: string): Promise<AutomationActionResult> {\n    console.log(`🤖 [ControlledAutomationAdapter] Typing into element: ${id}`);\n    if (reason) {\n      console.log(`   📝 Reason: ${reason}`);\n    }\n    \n    try {\n      const result = await this.sendCommand<AutomationActionResult>('typeIntoElement', {\n        id,\n        text,\n        reason\n      });\n      \n      if (result.success) {\n        console.log(`   ✅ Type successful`);\n      } else {\n        console.error(`   ❌ Type failed: ${result.error}`);\n      }\n      \n      return result;\n    } catch (error) {\n      console.error(`   ❌ Type error:`, error);\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : String(error)\n      };\n    }\n  }\n\n  /**\n   * Focus an element\n   */\n  async focusElement(id: string, reason?: string): Promise<AutomationActionResult> {\n    console.log(`🤖 [ControlledAutomationAdapter] Focusing element: ${id}`);\n    if (reason) {\n      console.log(`   📝 Reason: ${reason}`);\n    }\n    \n    try {\n      const result = await this.sendCommand<AutomationActionResult>('focusElement', { id, reason });\n      \n      if (result.success) {\n        console.log(`   ✅ Focus successful`);\n      } else {\n        console.error(`   ❌ Focus failed: ${result.error}`);\n      }\n      \n      return result;\n    } catch (error) {\n      console.error(`   ❌ Focus error:`, error);\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : String(error)\n      };\n    }\n  }\n\n  /**\n   * Scroll to an element\n   */\n  async scrollToElement(id: string, reason?: string): Promise<AutomationActionResult> {\n    console.log(`🤖 [ControlledAutomationAdapter] Scrolling to element: ${id}`);\n    if (reason) {\n      console.log(`   📝 Reason: ${reason}`);\n    }\n    \n    try {\n      const result = await this.sendCommand<AutomationActionResult>('scrollToElement', { id, reason });\n      \n      if (result.success) {\n        console.log(`   ✅ Scroll successful`);\n      } else {\n        console.error(`   ❌ Scroll failed: ${result.error}`);\n      }\n      \n      return result;\n    } catch (error) {\n      console.error(`   ❌ Scroll error:`, error);\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : String(error)\n      };\n    }\n  }\n\n  /**\n   * Press a key\n   */\n  async pressKey(key: string, reason?: string): Promise<AutomationActionResult> {\n    console.log(`🤖 [ControlledAutomationAdapter] Pressing key: ${key}`);\n    if (reason) {\n      console.log(`   📝 Reason: ${reason}`);\n    }\n    \n    try {\n      const result = await this.sendCommand<AutomationActionResult>('pressKey', { key, reason });\n      \n      if (result.success) {\n        console.log(`   ✅ Key press successful`);\n      } else {\n        console.error(`   ❌ Key press failed: ${result.error}`);\n      }\n      \n      return result;\n    } catch (error) {\n      console.error(`   ❌ Key press error:`, error);\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : String(error)\n      };\n    }\n  }\n\n  /**\n   * Cleanup\n   */\n  cleanup(): void {\n    // Clear all pending requests\n    for (const [, pending] of this.pendingRequests.entries()) {\n      clearTimeout(pending.timeout);\n      pending.reject(new Error('Adapter cleanup'));\n    }\n    this.pendingRequests.clear();\n\n    // Close channel\n    this.channel.close();\n    \n    console.log(`🤖 [ControlledAutomationAdapter] Channel closed: ${this.channelName}`);\n  }\n}\n\n/**\n * Create listener for controlled tab\n * \n * Call this in the controlled tab to receive and execute automation commands.\n * \n * @param channelName - BroadcastChannel name (must match adapter)\n * \n * @example\n * ```ts\n * // In controlled tab (e.g., Shopify theme)\n * import { createControlledAutomationListener } from '@vowel.to/client/adapters/automation';\n * \n * createControlledAutomationListener('vowel-automation');\n * ```\n */\nexport function createControlledAutomationListener(channelName: string = 'vowel-automation'): () => void {\n  const channel = new BroadcastChannel(channelName);\n  \n  // Import automation tools lazily\n  let searcher: any;\n  let manipulator: any;\n  \n  const initTools = async () => {\n    if (!searcher) {\n      const { FuzzyDOMSearcher } = await import('../../platforms/generic/dom-search');\n      const { DOMManipulator } = await import('../../platforms/generic/dom-tools');\n      \n      searcher = new FuzzyDOMSearcher();\n      manipulator = new DOMManipulator({\n        getElementById: (id: string) => searcher.getElementById(id)\n      });\n    }\n  };\n\n  channel.onmessage = async (event: MessageEvent<AutomationMessage>) => {\n    const { type, payload, messageId } = event.data;\n    \n    console.log(`🤖 [ControlledAutomationListener] Received command: ${type} (${messageId})`);\n    \n    try {\n      await initTools();\n      \n      let result: any;\n      \n      // Get global cursor manager (set by controlled tab initialization)\n      const cursorManager = (window as any).__vowelFloatingCursorManager;\n      console.log(`🎯 [ControlledAutomationListener] Cursor manager available:`, !!cursorManager);\n      if (cursorManager) {\n        console.log(`🎯 [ControlledAutomationListener] Cursor manager isActive:`, cursorManager.isActive?.());\n      }\n      \n      switch (type) {\n        case 'searchElements':\n          // Show searching cursor at center\n          if (cursorManager?.isActive?.()) {\n            console.log(`🎯 [ControlledAutomationListener] Showing searching cursor for: ${payload.query}`);\n            cursorManager.showAt({ x: 50, y: 50, text: `Searching: ${payload.query}`, isIdle: false });\n          }\n          \n          result = searcher.search(payload.query, payload.options);\n          \n          // Show cursor at first result if available\n          if (cursorManager?.isActive?.() && result.elements?.length > 0) {\n            const firstResult = result.elements[0];\n            console.log(`🎯 [ControlledAutomationListener] Showing cursor at first result: ${firstResult.id}`);\n            const element = searcher.getElementById(firstResult.id);\n            if (element) {\n              const rect = element.getBoundingClientRect();\n              const x = ((rect.left + rect.width / 2) / window.innerWidth) * 100;\n              const y = ((rect.top + rect.height / 2) / window.innerHeight) * 100;\n              cursorManager.showAt({ \n                x, \n                y, \n                text: `Found: ${firstResult.text || firstResult.ariaLabel || 'element'}`, \n                isIdle: true \n              });\n            }\n          }\n          break;\n          \n        case 'getPageSnapshot':\n          result = { snapshot: searcher.getCompressedPageSnapshot() };\n          break;\n          \n        case 'clickElement':\n          // Get element and show cursor at its position with AI's message\n          if (cursorManager?.isActive?.()) {\n            console.log(`🎯 [ControlledAutomationListener] Showing cursor at element for click: ${payload.id}`);\n            const element = searcher.getElementById(payload.id);\n            if (element) {\n              const rect = element.getBoundingClientRect();\n              const x = ((rect.left + rect.width / 2) / window.innerWidth) * 100;\n              const y = ((rect.top + rect.height / 2) / window.innerHeight) * 100;\n              // Use AI's reason if provided, otherwise default message\n              const text = payload.reason || 'Clicked element';\n              console.log(`🎯 [ControlledAutomationListener] Cursor text: \"${text}\"`);\n              // Show with isIdle=true so it stays at element with bounce animation\n              cursorManager.showAt({ x, y, text, isIdle: true });\n            }\n          }\n          \n          result = await manipulator.clickElement(payload);\n          break;\n          \n        case 'typeIntoElement':\n          // Show cursor at element with AI's message\n          if (cursorManager?.isActive?.()) {\n            const element = searcher.getElementById(payload.id);\n            if (element) {\n              const rect = element.getBoundingClientRect();\n              const x = ((rect.left + rect.width / 2) / window.innerWidth) * 100;\n              const y = ((rect.top + rect.height / 2) / window.innerHeight) * 100;\n              // Use AI's reason if provided, otherwise show truncated text\n              const text = payload.reason || `Typed: \"${payload.text.substring(0, 20)}${payload.text.length > 20 ? '...' : ''}\"`;\n              console.log(`🎯 [ControlledAutomationListener] Cursor text: \"${text}\"`);\n              // Show with isIdle=true so it stays at element with bounce animation\n              cursorManager.showAt({ x, y, text, isIdle: true });\n            }\n          }\n          \n          result = await manipulator.typeIntoElement(payload);\n          break;\n          \n        case 'focusElement':\n          // Show cursor at element with AI's message\n          if (cursorManager?.isActive?.()) {\n            const element = searcher.getElementById(payload.id);\n            if (element) {\n              const rect = element.getBoundingClientRect();\n              const x = ((rect.left + rect.width / 2) / window.innerWidth) * 100;\n              const y = ((rect.top + rect.height / 2) / window.innerHeight) * 100;\n              // Use AI's reason if provided, otherwise default message\n              const text = payload.reason || 'Focused element';\n              console.log(`🎯 [ControlledAutomationListener] Cursor text: \"${text}\"`);\n              // Show with isIdle=true so it stays at element with bounce animation\n              cursorManager.showAt({ x, y, text, isIdle: true });\n            }\n          }\n          \n          result = await manipulator.focusElement(payload);\n          break;\n          \n        case 'scrollToElement':\n          // Show cursor at element with AI's message\n          if (cursorManager?.isActive?.()) {\n            const element = searcher.getElementById(payload.id);\n            if (element) {\n              const rect = element.getBoundingClientRect();\n              const x = ((rect.left + rect.width / 2) / window.innerWidth) * 100;\n              const y = ((rect.top + rect.height / 2) / window.innerHeight) * 100;\n              // Use AI's reason if provided, otherwise default message\n              const text = payload.reason || 'Scrolled to element';\n              console.log(`🎯 [ControlledAutomationListener] Cursor text: \"${text}\"`);\n              // Show with isIdle=true so it stays at element with bounce animation\n              cursorManager.showAt({ x, y, text, isIdle: true });\n            }\n          }\n          \n          result = await manipulator.scrollToElement(payload);\n          break;\n          \n        case 'pressKey':\n          result = await manipulator.pressKey(payload);\n          break;\n          \n        default:\n          throw new Error(`Unknown command type: ${type}`);\n      }\n      \n      // Send response\n      const response: AutomationResponse = {\n        type: `${type}Response`,\n        payload: result,\n        messageId,\n        timestamp: Date.now()\n      };\n      \n      channel.postMessage(response);\n      \n      console.log(`   ✅ Command executed: ${type}`);\n    } catch (error) {\n      console.error(`   ❌ Command failed: ${type}`, error);\n      \n      // Send error response\n      const response: AutomationResponse = {\n        type: `${type}Response`,\n        payload: {\n          success: false,\n          error: error instanceof Error ? error.message : String(error)\n        },\n        messageId,\n        timestamp: Date.now()\n      };\n      \n      channel.postMessage(response);\n    }\n  };\n  \n  console.log(`🤖 [ControlledAutomationListener] Listening on channel: ${channelName}`);\n  \n  // Return cleanup function\n  return () => {\n    channel.close();\n    console.log(`🤖 [ControlledAutomationListener] Channel closed: ${channelName}`);\n  };\n}\n\n"],"names":[],"mappings":"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"}