{"version":3,"file":"ExtensionAutomationAdapter-BAIOMN6v.cjs","sources":["../../lib/vowel/platforms/extension/adapters/ExtensionAutomationAdapter.ts"],"sourcesContent":["/**\n * Extension Automation Adapter\n * \n * Implements AutomationAdapter for extension platform.\n * Handles DOM automation by communicating with content scripts.\n * \n * @packageDocumentation\n */\n\nimport type {\n  AutomationAdapter,\n  AutomationSearchOptions,\n  AutomationSearchResults,\n  AutomationActionResult,\n} from '../../../types';\n\n/**\n * Automation adapter for extension platform\n * \n * Handles DOM automation in extension context by:\n * - Sending automation commands to content script\n * - Querying page structure via content script\n * - Coordinating element interactions\n * \n * @example\n * ```typescript\n * const adapter = new ExtensionAutomationAdapter();\n * const results = await adapter.searchElements('search input');\n * await adapter.clickElement('element-123');\n * ```\n */\nexport class ExtensionAutomationAdapter implements AutomationAdapter {\n  /**\n   * Search for elements in active tab\n   * \n   * @param query - Search query (natural language)\n   * @param options - Search options\n   * @returns Search results with matching elements\n   */\n  async searchElements(query: string, options?: AutomationSearchOptions): Promise<AutomationSearchResults> {\n    const tab = await this.getActiveTab();\n    \n    if (!tab.id) {\n      throw new Error('No active tab found');\n    }\n\n    try {\n      const response = await chrome.tabs.sendMessage(tab.id, {\n        type: 'SEARCH_ELEMENTS',\n        payload: { query, options },\n      });\n\n      // Content script returns { success: true, result: {...} } for search\n      return response.result || response || { elements: [], error: 'No results found' };\n    } catch (error) {\n      console.error('Failed to search elements:', error);\n      //@ts-ignore - error is not defined in the type AutomationSearchResults\n      return { elements: [], error: `Error: ${String(error)}` };\n    }\n  }\n\n  /**\n   * Get page snapshot from active tab\n   * \n   * @returns Page snapshot as ARIA tree text\n   */\n  async getPageSnapshot(): Promise<string> {\n    const tab = await this.getActiveTab();\n    \n    if (!tab.id) {\n      throw new Error('No active tab found');\n    }\n\n    try {\n      const response = await chrome.tabs.sendMessage(tab.id, {\n        type: 'GET_PAGE_SNAPSHOT',\n      });\n\n      console.log('📨 [ExtensionAutomationAdapter] Received snapshot response:', {\n        hasResponse: !!response,\n        hasSnapshot: !!response?.snapshot,\n        snapshotLength: response?.snapshot?.length || 0,\n        responseKeys: response ? Object.keys(response) : []\n      });\n\n      return response.snapshot || '';\n    } catch (error) {\n      console.error('Failed to get page snapshot:', error);\n      return '';\n    }\n  }\n\n  /**\n   * Click an element in active tab\n   * \n   * @param id - Element identifier from search results\n   * @param reason - Optional reason for clicking\n   * @returns Action result with success status\n   */\n  async clickElement(id: string, reason?: string): Promise<AutomationActionResult> {\n    const tab = await this.getActiveTab();\n    \n    if (!tab.id) {\n      throw new Error('No active tab found');\n    }\n\n    try {\n      const response = await chrome.tabs.sendMessage(tab.id, {\n        type: 'CLICK_ELEMENT',\n        payload: { id, reason },\n      });\n\n      return response || { success: false, error: 'No response from content script' };\n    } catch (error) {\n      console.error('Failed to click element:', error);\n      return { success: false, error: String(error) };\n    }\n  }\n\n  /**\n   * Type into an element in active tab\n   * \n   * @param id - Element identifier from search results\n   * @param text - Text to type\n   * @param reason - Optional reason for typing\n   * @returns Action result with success status\n   */\n  async typeIntoElement(id: string, text: string, reason?: string): Promise<AutomationActionResult> {\n    const tab = await this.getActiveTab();\n    \n    if (!tab.id) {\n      throw new Error('No active tab found');\n    }\n\n    try {\n      const response = await chrome.tabs.sendMessage(tab.id, {\n        type: 'TYPE_INTO_ELEMENT',\n        payload: { id, text, reason },\n      });\n\n      return response || { success: false, error: 'No response from content script' };\n    } catch (error) {\n      console.error('Failed to type into element:', error);\n      return { success: false, error: String(error) };\n    }\n  }\n\n  /**\n   * Focus an element in active tab\n   * \n   * @param id - Element identifier from search results\n   * @param reason - Optional reason for focusing\n   * @returns Action result with success status\n   */\n  async focusElement(id: string, reason?: string): Promise<AutomationActionResult> {\n    const tab = await this.getActiveTab();\n    \n    if (!tab.id) {\n      throw new Error('No active tab found');\n    }\n\n    try {\n      const response = await chrome.tabs.sendMessage(tab.id, {\n        type: 'FOCUS_ELEMENT',\n        payload: { id, reason },\n      });\n\n      return response || { success: false, error: 'No response from content script' };\n    } catch (error) {\n      console.error('Failed to focus element:', error);\n      return { success: false, error: String(error) };\n    }\n  }\n\n  /**\n   * Scroll to an element in active tab\n   * \n   * @param id - Element identifier from search results\n   * @param reason - Optional reason for scrolling\n   * @returns Action result with success status\n   */\n  async scrollToElement(id: string, reason?: string): Promise<AutomationActionResult> {\n    const tab = await this.getActiveTab();\n    \n    if (!tab.id) {\n      throw new Error('No active tab found');\n    }\n\n    try {\n      const response = await chrome.tabs.sendMessage(tab.id, {\n        type: 'SCROLL_TO_ELEMENT',\n        payload: { id, reason },\n      });\n\n      return response || { success: false, error: 'No response from content script' };\n    } catch (error) {\n      console.error('Failed to scroll to element:', error);\n      return { success: false, error: String(error) };\n    }\n  }\n\n  /**\n   * Press a key in active tab\n   * \n   * @param key - Key name (e.g., 'Enter', 'Escape')\n   * @param reason - Optional reason for pressing the key\n   * @returns Action result with success status\n   */\n  async pressKey(key: string, reason?: string): Promise<AutomationActionResult> {\n    const tab = await this.getActiveTab();\n    \n    if (!tab.id) {\n      throw new Error('No active tab found');\n    }\n\n    try {\n      const response = await chrome.tabs.sendMessage(tab.id, {\n        type: 'PRESS_KEY',\n        payload: { key, reason },\n      });\n\n      return response || { success: false, error: 'No response from content script' };\n    } catch (error) {\n      console.error('Failed to press key:', error);\n      return { success: false, error: String(error) };\n    }\n  }\n\n  /**\n   * Get the active browser tab\n   */\n  private async getActiveTab(): Promise<chrome.tabs.Tab> {\n    if (typeof chrome === 'undefined' || !chrome.tabs) {\n      throw new Error('Chrome tabs API not available');\n    }\n\n    const tabs = await chrome.tabs.query({ active: true, currentWindow: true });\n    \n    if (tabs.length === 0) {\n      throw new Error('No active tab found');\n    }\n\n    return tabs[0];\n  }\n}\n\n"],"names":[],"mappings":"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"}