{"version":3,"file":"adapters/remote-execution.mjs","sources":["../../../src/adapters/remote-execution.ts"],"sourcesContent":["import type {\n  ConnectivityTestResult,\n  DeviceAction,\n  ExecutionDump,\n} from '@midscene/core';\nimport type { TModelConfig } from '@midscene/shared/env';\nimport { parseStructuredParams } from '../common';\nimport type {\n  PlaygroundRecorderCapabilitiesResult,\n  PlaygroundRecorderDescribeResult,\n  PlaygroundRecorderEvent,\n  PlaygroundRecorderEventsResult,\n  PlaygroundRecorderSourceKind,\n  PlaygroundRecorderStartResult,\n  PlaygroundSessionSetup,\n  PlaygroundSessionState,\n  PlaygroundSessionTarget,\n} from '../platform';\nimport type { PlaygroundRuntimeInfo } from '../runtime-metadata';\nimport type {\n  ExecutionOptions,\n  FormValue,\n  PlaygroundReportRef,\n  ValidationResult,\n} from '../types';\nimport { BasePlaygroundAdapter } from './base';\n\nexport class RemoteExecutionAdapter extends BasePlaygroundAdapter {\n  private serverUrl?: string;\n  private _id?: string;\n  private dumpUpdateCallback?: (\n    dump: string,\n    executionDump?: ExecutionDump,\n  ) => void;\n  private pollingIntervalId?: ReturnType<typeof setInterval>;\n\n  private resolveReportUrl(report: PlaygroundReportRef | null | undefined) {\n    if (!report || !this.serverUrl) return report;\n    const resolved = {\n      ...report,\n      url: new URL(report.url, this.serverUrl).toString(),\n    };\n    if (report.replayUrl) {\n      resolved.replayUrl = new URL(report.replayUrl, this.serverUrl).toString();\n    }\n    return resolved;\n  }\n\n  constructor(serverUrl: string) {\n    super();\n    this.serverUrl = serverUrl;\n  }\n\n  // Set dump update callback\n  onDumpUpdate(\n    callback: (dump: string, executionDump?: ExecutionDump) => void,\n  ): void {\n    this.dumpUpdateCallback = undefined;\n    this.dumpUpdateCallback = callback;\n  }\n\n  // Get adapter ID (cached after first status check for remote)\n  get id(): string | undefined {\n    return this._id;\n  }\n\n  // Override validateParams for remote execution\n  // Since schemas from server are JSON-serialized and lack .parse() method\n  validateParams(\n    value: FormValue,\n    action: DeviceAction<unknown> | undefined,\n  ): ValidationResult {\n    if (!action?.paramSchema) {\n      return { valid: true };\n    }\n\n    const needsStructuredParams = this.actionNeedsStructuredParams(action);\n\n    if (!needsStructuredParams) {\n      return { valid: true };\n    }\n\n    if (!value.params) {\n      return { valid: false, errorMessage: 'Parameters are required' };\n    }\n\n    // For remote execution, perform basic validation without .parse()\n    // Check if required fields are present\n    if (action.paramSchema && typeof action.paramSchema === 'object') {\n      const schema = action.paramSchema as any;\n      if (schema.shape || schema.type === 'ZodObject') {\n        const shape = schema.shape || {};\n        const missingFields = Object.keys(shape).filter((key) => {\n          const fieldDef = shape[key];\n          // Check if field is required (not optional)\n          const isOptional =\n            fieldDef?.isOptional ||\n            fieldDef?._def?.innerType || // ZodOptional\n            fieldDef?._def?.typeName === 'ZodOptional';\n          return (\n            !isOptional &&\n            (value.params![key] === undefined || value.params![key] === '')\n          );\n        });\n\n        if (missingFields.length > 0) {\n          return {\n            valid: false,\n            errorMessage: `Missing required parameters: ${missingFields.join(', ')}`,\n          };\n        }\n      }\n    }\n\n    return { valid: true };\n  }\n\n  async parseStructuredParams(\n    action: DeviceAction<unknown>,\n    params: Record<string, unknown>,\n    options: ExecutionOptions,\n  ): Promise<unknown[]> {\n    // Use shared implementation from common.ts\n    return await parseStructuredParams(action, params, options);\n  }\n\n  formatErrorMessage(error: any): string {\n    const message = error?.message || '';\n\n    // Handle Android-specific errors\n    const androidErrors = [\n      {\n        keyword: 'adb',\n        message:\n          'ADB connection error. Please ensure device is connected and USB debugging is enabled.',\n      },\n      {\n        keyword: 'UIAutomator',\n        message:\n          'UIAutomator error. Please ensure the UIAutomator server is running on the device.',\n      },\n    ];\n\n    const androidError = androidErrors.find(({ keyword }) =>\n      message.includes(keyword),\n    );\n    if (androidError) {\n      return androidError.message;\n    }\n\n    return this.formatBasicErrorMessage(error);\n  }\n\n  // Remote execution adapter - simplified interface\n  async executeAction(\n    actionType: string,\n    value: FormValue,\n    options: ExecutionOptions,\n  ): Promise<unknown> {\n    // If serverUrl is provided, use server-side execution\n    if (this.serverUrl && typeof window !== 'undefined') {\n      return this.executeViaServer(actionType, value, options);\n    }\n\n    throw new Error(\n      'Remote execution adapter requires server URL for execution',\n    );\n  }\n\n  // Remote execution via server - uses same endpoint as requestPlaygroundServer\n  private async executeViaServer(\n    actionType: string,\n    value: FormValue,\n    options: ExecutionOptions,\n  ): Promise<unknown> {\n    const payload: Record<string, unknown> = {\n      type: actionType,\n      prompt: value.prompt,\n      ...this.buildOptionalPayloadParams(options, value),\n    };\n\n    // Add context only if it exists (server can handle single agent case without context)\n    if (options.context) {\n      payload.context = options.context;\n    }\n\n    // Start polling if requestId is provided and dumpUpdateCallback is set\n    if (options.requestId && this.dumpUpdateCallback) {\n      this.startProgressPolling(options.requestId);\n    }\n\n    try {\n      const response = await fetch(`${this.serverUrl}/execute`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify(payload),\n      });\n\n      if (!response.ok) {\n        const errorText = await response.text().catch(() => 'Unknown error');\n        throw new Error(\n          `Server request failed (${response.status}): ${errorText}`,\n        );\n      }\n\n      const result = await response.json();\n      if (result?.report) {\n        result.report = this.resolveReportUrl(result.report);\n      }\n\n      return result;\n    } catch (error) {\n      console.error('Execute via server failed:', error);\n      throw error;\n    } finally {\n      // Stop polling when execution completes (success or error)\n      this.stopProgressPolling();\n    }\n  }\n\n  // Helper method to build optional payload parameters\n  private buildOptionalPayloadParams(\n    options: ExecutionOptions,\n    value: FormValue,\n  ): Record<string, unknown> {\n    const optionalParams: Record<string, unknown> = {};\n\n    // Add optional parameters only if they have meaningful values\n    const optionalFields = [\n      { key: 'requestId', value: options.requestId },\n      { key: 'deepLocate', value: options.deepLocate },\n      { key: 'deepThink', value: options.deepThink },\n      { key: 'screenshotIncluded', value: options.screenshotIncluded },\n      { key: 'domIncluded', value: options.domIncluded },\n      { key: 'deviceOptions', value: options.deviceOptions },\n      { key: 'reportDisplay', value: options.reportDisplay },\n      { key: 'params', value: value.params },\n    ] as const;\n\n    optionalFields.forEach(({ key, value }) => {\n      if (value !== undefined && value !== null && value !== '') {\n        optionalParams[key] = value;\n      }\n    });\n\n    return optionalParams;\n  }\n\n  // Get action space from server with fallback\n  async getActionSpace(context?: unknown): Promise<DeviceAction<unknown>[]> {\n    // Try server first if available\n    if (this.serverUrl && typeof window !== 'undefined') {\n      try {\n        const response = await fetch(`${this.serverUrl}/action-space`, {\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n          },\n          body: JSON.stringify({ context }),\n        });\n\n        if (!response.ok) {\n          throw new Error(`Failed to get action space: ${response.statusText}`);\n        }\n\n        const result = await response.json();\n        return Array.isArray(result) ? result : [];\n      } catch (error) {\n        console.error('Failed to get action space from server:', error);\n        // Fall through to context fallback\n      }\n    }\n\n    // Fallback: try context.actionSpace if available\n    if (context && typeof context === 'object' && 'actionSpace' in context) {\n      try {\n        const actionSpaceMethod = (\n          context as {\n            actionSpace: () =>\n              | DeviceAction<unknown>[]\n              | Promise<DeviceAction<unknown>[]>;\n          }\n        ).actionSpace;\n        const result = await actionSpaceMethod();\n        return Array.isArray(result) ? result : [];\n      } catch (error) {\n        console.error('Failed to get action space from context:', error);\n      }\n    }\n\n    return [];\n  }\n\n  // Uses base implementation for validateParams and createDisplayContent\n\n  // Server communication methods\n  async checkStatus(): Promise<boolean> {\n    if (!this.serverUrl) {\n      return false;\n    }\n\n    try {\n      const res = await fetch(`${this.serverUrl}/status`);\n      if (res.status === 200) {\n        // Try to extract id from response\n        try {\n          const data = await res.json();\n          if (data.id && typeof data.id === 'string') {\n            this._id = data.id;\n          }\n        } catch (jsonError) {\n          // If JSON parsing fails, id remains undefined but status is still OK\n          console.debug('Failed to parse status response:', jsonError);\n        }\n        return true;\n      }\n      return false;\n    } catch (error) {\n      console.warn('Server status check failed:', error);\n      return false;\n    }\n  }\n\n  async overrideConfig(aiConfig: Record<string, unknown>): Promise<void> {\n    if (!this.serverUrl) {\n      throw new Error('Server URL not configured');\n    }\n\n    try {\n      const response = await fetch(`${this.serverUrl}/config`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify({ aiConfig }),\n      });\n\n      if (!response.ok) {\n        const body = await response.json().catch(() => null);\n        const detail = body?.error || response.statusText;\n        throw new Error(detail);\n      }\n    } catch (error) {\n      console.error('Failed to override server config:', error);\n      throw error;\n    }\n  }\n\n  async runConnectivityTest(\n    aiConfig: TModelConfig,\n  ): Promise<ConnectivityTestResult> {\n    if (!this.serverUrl) {\n      throw new Error('Server URL not configured');\n    }\n\n    const response = await fetch(`${this.serverUrl}/connectivity-test`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ config: aiConfig }),\n    });\n\n    if (!response.ok) {\n      const body = await response.json().catch(() => null);\n      const detail = body?.error || response.statusText;\n      throw new Error(detail);\n    }\n\n    return response.json();\n  }\n\n  async getTaskProgress(requestId: string): Promise<{\n    executionDump?: ExecutionDump;\n  }> {\n    if (!this.serverUrl) {\n      return {};\n    }\n\n    if (!requestId?.trim()) {\n      console.warn('Invalid requestId provided for task progress');\n      return {};\n    }\n\n    try {\n      const response = await fetch(\n        `${this.serverUrl}/task-progress/${encodeURIComponent(requestId)}`,\n      );\n\n      if (!response.ok) {\n        console.warn(`Task progress request failed: ${response.statusText}`);\n        return {};\n      }\n\n      return await response.json();\n    } catch (error) {\n      console.error('Failed to poll task progress:', error);\n      return {};\n    }\n  }\n\n  /**\n   * Start polling for task progress and invoke dump update callback\n   */\n  private startProgressPolling(requestId: string): void {\n    // Clear any existing polling\n    this.stopProgressPolling();\n\n    // Poll every 500ms for progress updates\n    this.pollingIntervalId = setInterval(async () => {\n      try {\n        const progressData = await this.getTaskProgress(requestId);\n\n        if (progressData.executionDump) {\n          // Invoke dump update callback if set\n          if (this.dumpUpdateCallback) {\n            this.dumpUpdateCallback('', progressData.executionDump);\n          }\n        }\n      } catch (error) {\n        console.error('Error polling task progress:', error);\n      }\n    }, 500); // Poll every 500ms\n  }\n\n  /**\n   * Stop polling for task progress\n   */\n  private stopProgressPolling(): void {\n    if (this.pollingIntervalId) {\n      clearInterval(this.pollingIntervalId);\n      this.pollingIntervalId = undefined;\n    }\n  }\n\n  // Cancel task\n  async cancelTask(\n    requestId: string,\n  ): Promise<{ error?: string; success?: boolean }> {\n    if (!this.serverUrl) {\n      return { error: 'No server URL configured' };\n    }\n\n    if (!requestId?.trim()) {\n      return { error: 'Invalid request ID' };\n    }\n\n    try {\n      const res = await fetch(\n        `${this.serverUrl}/cancel/${encodeURIComponent(requestId)}`,\n        {\n          method: 'POST',\n        },\n      );\n\n      if (!res.ok) {\n        return { error: `Cancel request failed: ${res.statusText}` };\n      }\n\n      const result = await res.json();\n      if (result?.report) {\n        result.report = this.resolveReportUrl(result.report);\n      }\n      return { success: true, ...result };\n    } catch (error) {\n      console.error('Failed to cancel task:', error);\n      return { error: 'Failed to cancel task' };\n    }\n  }\n\n  // Get screenshot from server\n  async getScreenshot(): Promise<{\n    screenshot: string;\n    timestamp: number;\n  } | null> {\n    if (!this.serverUrl) {\n      return null;\n    }\n\n    try {\n      const response = await fetch(`${this.serverUrl}/screenshot`);\n\n      if (!response.ok) {\n        if (response.status !== 409) {\n          console.warn(`Screenshot request failed: ${response.statusText}`);\n        }\n        return null;\n      }\n\n      return await response.json();\n    } catch (error) {\n      console.error('Failed to get screenshot:', error);\n      return null;\n    }\n  }\n\n  // Direct device manipulation – invokes a named action on the connected\n  // device without going through AI planning.\n  async interact(\n    payload: { actionType: string } & Record<string, unknown>,\n  ): Promise<{ ok: boolean; error?: string }> {\n    if (!this.serverUrl) {\n      return { ok: false, error: 'No server URL configured' };\n    }\n\n    try {\n      const response = await fetch(`${this.serverUrl}/interact`, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify(payload),\n      });\n\n      const data = (await response.json().catch(() => null)) as {\n        error?: string;\n      } | null;\n\n      if (!response.ok) {\n        return {\n          ok: false,\n          error: data?.error || `Interact request failed (${response.status})`,\n        };\n      }\n\n      return { ok: true };\n    } catch (error) {\n      return {\n        ok: false,\n        error: error instanceof Error ? error.message : 'Unknown error',\n      };\n    }\n  }\n\n  async startRecorderSession(\n    sessionId: string,\n  ): Promise<PlaygroundRecorderStartResult> {\n    if (!this.serverUrl) {\n      return { ok: false, supported: false, error: 'No server URL configured' };\n    }\n\n    try {\n      const response = await fetch(`${this.serverUrl}/recorder/start`, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({\n          sessionId,\n        }),\n      });\n      const data = (await response.json().catch(() => null)) as {\n        ok?: boolean;\n        supported?: boolean;\n        source?: PlaygroundRecorderSourceKind;\n        platformId?: string;\n        error?: string;\n      } | null;\n\n      if (!response.ok) {\n        return {\n          ok: false,\n          supported: data?.supported ?? false,\n          source: data?.source,\n          platformId: data?.platformId,\n          error:\n            data?.error || `Recorder start request failed (${response.status})`,\n        };\n      }\n\n      return {\n        ok: data?.ok ?? true,\n        supported: data?.supported ?? true,\n        source: data?.source,\n        platformId: data?.platformId,\n        error: data?.error,\n      };\n    } catch (error) {\n      return {\n        ok: false,\n        supported: false,\n        error: error instanceof Error ? error.message : 'Unknown error',\n      };\n    }\n  }\n\n  async getRecorderCapabilities(): Promise<PlaygroundRecorderCapabilitiesResult> {\n    if (!this.serverUrl) {\n      return {\n        supported: false,\n        source: 'unsupported',\n        error: 'No server URL configured',\n      };\n    }\n\n    try {\n      const response = await fetch(`${this.serverUrl}/recorder/capabilities`);\n      const data = (await response.json().catch(() => null)) as {\n        supported?: boolean;\n        source?: PlaygroundRecorderSourceKind;\n        platformId?: string;\n        error?: string;\n      } | null;\n      if (!response.ok) {\n        return {\n          supported: false,\n          source: 'unsupported',\n          error:\n            data?.error ||\n            `Recorder capabilities request failed (${response.status})`,\n        };\n      }\n      return {\n        supported: data?.supported === true,\n        source: data?.source || 'unsupported',\n        platformId: data?.platformId,\n        error: data?.error,\n      };\n    } catch (error) {\n      return {\n        supported: false,\n        source: 'unsupported',\n        error: error instanceof Error ? error.message : 'Unknown error',\n      };\n    }\n  }\n\n  async stopRecorderSession(): Promise<{ ok: boolean; error?: string }> {\n    if (!this.serverUrl) {\n      return { ok: false, error: 'No server URL configured' };\n    }\n\n    try {\n      const response = await fetch(`${this.serverUrl}/recorder/stop`, {\n        method: 'POST',\n      });\n      if (!response.ok) {\n        return {\n          ok: false,\n          error: `Recorder stop request failed (${response.status})`,\n        };\n      }\n      return { ok: true };\n    } catch (error) {\n      return {\n        ok: false,\n        error: error instanceof Error ? error.message : 'Unknown error',\n      };\n    }\n  }\n\n  async getRecorderEvents(since = 0): Promise<PlaygroundRecorderEventsResult> {\n    if (!this.serverUrl) {\n      return { events: [], nextIndex: since };\n    }\n\n    try {\n      const response = await fetch(\n        `${this.serverUrl}/recorder/events?since=${encodeURIComponent(String(since))}&flushPending=false`,\n      );\n      if (!response.ok) {\n        return { events: [], nextIndex: since };\n      }\n      const data = (await response.json().catch(() => null)) as {\n        events?: unknown;\n        nextIndex?: unknown;\n      } | null;\n      return {\n        events: Array.isArray(data?.events) ? data.events : [],\n        nextIndex:\n          typeof data?.nextIndex === 'number' && Number.isFinite(data.nextIndex)\n            ? data.nextIndex\n            : since,\n      };\n    } catch (error) {\n      console.error('Failed to poll recorder events:', error);\n      return { events: [], nextIndex: since };\n    }\n  }\n\n  async describeRecorderEventAtPoint(\n    event: PlaygroundRecorderEvent,\n  ): Promise<PlaygroundRecorderDescribeResult> {\n    if (!this.serverUrl) {\n      return { ok: false, error: 'No server URL configured' };\n    }\n\n    try {\n      const response = await fetch(\n        `${this.serverUrl}/recorder/describe-event`,\n        {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({ event }),\n        },\n      );\n      const data = (await response\n        .json()\n        .catch(() => null)) as PlaygroundRecorderDescribeResult | null;\n      if (!response.ok) {\n        return {\n          ok: false,\n          error:\n            data?.error ||\n            `Recorder describe request failed (${response.status})`,\n        };\n      }\n      return data || { ok: false, error: 'Empty recorder describe response' };\n    } catch (error) {\n      return {\n        ok: false,\n        error:\n          error instanceof Error\n            ? error.message\n            : 'Failed to describe recorder event',\n      };\n    }\n  }\n\n  async getRecorderScreenshotAsset(assetId: string): Promise<string | null> {\n    if (!this.serverUrl || !assetId) {\n      return null;\n    }\n    try {\n      const response = await fetch(\n        `${this.serverUrl}/recorder/assets/${encodeURIComponent(assetId)}`,\n      );\n      if (!response.ok) {\n        return null;\n      }\n      const blob = await response.blob();\n      return await new Promise<string | null>((resolve, reject) => {\n        const reader = new FileReader();\n        reader.onload = () =>\n          resolve(typeof reader.result === 'string' ? reader.result : null);\n        reader.onerror = () => reject(reader.error);\n        reader.readAsDataURL(blob);\n      });\n    } catch (error) {\n      console.error('Failed to fetch recorder screenshot asset:', error);\n      return null;\n    }\n  }\n\n  getRecorderScreenshotAssetUrl(assetId: string): string | null {\n    if (!this.serverUrl || !/^[a-zA-Z0-9_-]+$/.test(assetId)) {\n      return null;\n    }\n    return `${this.serverUrl}/recorder/assets/${encodeURIComponent(assetId)}`;\n  }\n\n  async clearRecorderScreenshotAssets(sessionId: string): Promise<void> {\n    if (!this.serverUrl || !sessionId) {\n      return;\n    }\n    const response = await fetch(\n      `${this.serverUrl}/recorder/assets/session/${encodeURIComponent(sessionId)}`,\n      { method: 'DELETE' },\n    );\n    if (!response.ok) {\n      throw new Error(\n        `Recorder screenshot cleanup request failed (${response.status})`,\n      );\n    }\n  }\n\n  async pruneRecorderScreenshotAssets(\n    sessionId: string,\n    assetIds: string[],\n  ): Promise<void> {\n    if (!this.serverUrl || !sessionId) {\n      return;\n    }\n    const response = await fetch(\n      `${this.serverUrl}/recorder/assets/session/${encodeURIComponent(sessionId)}/prune`,\n      {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ assetIds }),\n      },\n    );\n    if (!response.ok) {\n      throw new Error(\n        `Recorder screenshot prune request failed (${response.status})`,\n      );\n    }\n  }\n\n  // Get interface information from server\n  async getInterfaceInfo(): Promise<{\n    type: string;\n    description?: string;\n    size?: { width: number; height: number };\n    navigationState?: { isLoading: boolean };\n    actionTypes?: string[];\n  } | null> {\n    if (!this.serverUrl) {\n      return null;\n    }\n\n    try {\n      const response = await fetch(`${this.serverUrl}/interface-info`);\n\n      if (!response.ok) {\n        console.warn(`Interface info request failed: ${response.statusText}`);\n        return null;\n      }\n\n      return await response.json();\n    } catch (error) {\n      console.error('Failed to get interface info:', error);\n      return null;\n    }\n  }\n\n  async getRuntimeInfo(): Promise<PlaygroundRuntimeInfo | null> {\n    if (!this.serverUrl) {\n      return null;\n    }\n\n    try {\n      const response = await fetch(`${this.serverUrl}/runtime-info`);\n\n      if (!response.ok) {\n        console.warn(`Runtime info request failed: ${response.statusText}`);\n        return null;\n      }\n\n      return await response.json();\n    } catch (error) {\n      console.error('Failed to get runtime info:', error);\n      return null;\n    }\n  }\n\n  async getSessionInfo(): Promise<PlaygroundSessionState | null> {\n    if (!this.serverUrl) {\n      return null;\n    }\n\n    try {\n      const response = await fetch(`${this.serverUrl}/session`);\n      if (!response.ok) {\n        console.warn(`Session info request failed: ${response.statusText}`);\n        return null;\n      }\n\n      return await response.json();\n    } catch (error) {\n      console.error('Failed to get session info:', error);\n      return null;\n    }\n  }\n\n  async getSessionSetup(\n    input?: Record<string, unknown>,\n  ): Promise<PlaygroundSessionSetup | null> {\n    if (!this.serverUrl) {\n      return null;\n    }\n\n    try {\n      const searchParams = new URLSearchParams();\n      Object.entries(input || {}).forEach(([key, value]) => {\n        if (\n          typeof value === 'string' ||\n          typeof value === 'number' ||\n          typeof value === 'boolean'\n        ) {\n          searchParams.set(key, String(value));\n        }\n      });\n      const suffix = searchParams.size > 0 ? `?${searchParams.toString()}` : '';\n      const response = await fetch(`${this.serverUrl}/session/setup${suffix}`);\n      if (!response.ok) {\n        const body = await response.json().catch(() => null);\n        throw new Error(\n          body?.error || response.statusText || 'Failed to load session setup',\n        );\n      }\n\n      return await response.json();\n    } catch (error) {\n      console.error('Failed to get session setup:', error);\n      throw error;\n    }\n  }\n\n  async listSessionTargets(): Promise<PlaygroundSessionTarget[]> {\n    if (!this.serverUrl) {\n      return [];\n    }\n\n    try {\n      const response = await fetch(`${this.serverUrl}/session/targets`);\n      if (!response.ok) {\n        const body = await response.json().catch(() => null);\n        throw new Error(\n          body?.error ||\n            response.statusText ||\n            'Failed to load session targets',\n        );\n      }\n\n      const result = await response.json();\n      return Array.isArray(result) ? result : [];\n    } catch (error) {\n      console.error('Failed to get session targets:', error);\n      throw error;\n    }\n  }\n\n  async createSession(input?: Record<string, unknown>): Promise<{\n    session: PlaygroundSessionState;\n    runtimeInfo: PlaygroundRuntimeInfo;\n  }> {\n    if (!this.serverUrl) {\n      throw new Error('Server URL not configured');\n    }\n\n    const response = await fetch(`${this.serverUrl}/session`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify(input || {}),\n    });\n\n    if (!response.ok) {\n      const body = await response.json().catch(() => null);\n      throw new Error(body?.error || response.statusText);\n    }\n\n    return await response.json();\n  }\n\n  async destroySession(): Promise<{\n    session: PlaygroundSessionState;\n    runtimeInfo: PlaygroundRuntimeInfo;\n  }> {\n    if (!this.serverUrl) {\n      throw new Error('Server URL not configured');\n    }\n\n    const response = await fetch(`${this.serverUrl}/session`, {\n      method: 'DELETE',\n    });\n\n    if (!response.ok) {\n      const body = await response.json().catch(() => null);\n      throw new Error(body?.error || response.statusText);\n    }\n\n    return await response.json();\n  }\n}\n"],"names":["RemoteExecutionAdapter","BasePlaygroundAdapter","report","resolved","URL","callback","undefined","value","action","needsStructuredParams","schema","shape","missingFields","Object","key","fieldDef","isOptional","params","options","parseStructuredParams","error","message","androidErrors","androidError","keyword","actionType","window","Error","payload","response","fetch","JSON","errorText","result","console","optionalParams","optionalFields","context","Array","actionSpaceMethod","res","data","jsonError","aiConfig","body","detail","requestId","encodeURIComponent","setInterval","progressData","clearInterval","sessionId","since","String","Number","event","assetId","blob","Promise","resolve","reject","reader","FileReader","assetIds","input","searchParams","URLSearchParams","suffix","serverUrl"],"mappings":"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"}